kern/59917: ata reset update in ATAng
Divacky Roman
xdivac02 at stud.fit.vutbr.cz
Wed Dec 3 00:20:24 PST 2003
>Number: 59917
>Category: kern
>Synopsis: ata reset update in ATAng
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: update
>Submitter-Id: current-users
>Arrival-Date: Wed Dec 03 00:20:17 PST 2003
>Closed-Date:
>Last-Modified:
>Originator: Divacky Roman
>Release: FreeBSD 5.2-BETA i386
>Organization:
home
>Environment:
FreeBSD 5.2-BETA
>Description:
I have PIIX4 ata controller has very slow ata-reset under ATAng
>How-To-Repeat:
this is default behaviour
>Fix:
this patch fixes it:
--- /tmp/ata-lowlevel.c Sat Nov 22 16:48:27 2003
+++ /sys/dev/ata/ata-lowlevel.c Sat Nov 22 17:06:45 2003
@@ -549,19 +549,22 @@
ATA_IDX_INB(ch, ATA_ERROR);
/* wait for BUSY to go inactive */
- for (timeout = 0; timeout < 310; timeout++) {
+ /* Hacked by neologism... too slow for me ;) */
+ for (timeout = 0; timeout < 31000; timeout++) {
if (stat0 & ATA_S_BUSY) {
ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_MASTER);
DELAY(10);
- err = ATA_IDX_INB(ch, ATA_ERROR);
- lsb = ATA_IDX_INB(ch, ATA_CYL_LSB);
- msb = ATA_IDX_INB(ch, ATA_CYL_MSB);
stat0 = ATA_IDX_INB(ch, ATA_STATUS);
- if (bootverbose)
- ata_printf(ch, ATA_MASTER,
- "stat=0x%02x err=0x%02x lsb=0x%02x msb=0x%02x\n",
- stat0, err, lsb, msb);
if (!(stat0 & ATA_S_BUSY)) {
+ /* this should be there because of that condition...
+ dont know why sos did this... */
+ err = ATA_IDX_INB(ch, ATA_ERROR);
+ lsb = ATA_IDX_INB(ch, ATA_CYL_LSB);
+ msb = ATA_IDX_INB(ch, ATA_CYL_MSB);
+ if (bootverbose)
+ ata_printf(ch, ATA_MASTER,
+ "stat=0x%02x err=0x%02x lsb=0x%02x msb=0x%02x\n",
+ stat0, err, lsb, msb);
if ((err & 0x7f) == ATA_E_ILI) {
if (lsb == ATAPI_MAGIC_LSB && msb == ATAPI_MAGIC_MSB) {
ch->devices |= ATA_ATAPI_MASTER;
@@ -578,15 +581,16 @@
if (stat1 & ATA_S_BUSY) {
ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_SLAVE);
DELAY(10);
- err = ATA_IDX_INB(ch, ATA_ERROR);
- lsb = ATA_IDX_INB(ch, ATA_CYL_LSB);
- msb = ATA_IDX_INB(ch, ATA_CYL_MSB);
stat1 = ATA_IDX_INB(ch, ATA_STATUS);
- if (bootverbose)
- ata_printf(ch, ATA_SLAVE,
- " stat=0x%02x err=0x%02x lsb=0x%02x msb=0x%02x\n",
- stat1, err, lsb, msb);
if (!(stat1 & ATA_S_BUSY)) {
+ /* Ditto */
+ err = ATA_IDX_INB(ch, ATA_ERROR);
+ lsb = ATA_IDX_INB(ch, ATA_CYL_LSB);
+ msb = ATA_IDX_INB(ch, ATA_CYL_MSB);
+ if (bootverbose)
+ ata_printf(ch, ATA_SLAVE,
+ " stat=0x%02x err=0x%02x lsb=0x%02x msb=0x%02x\n",
+ stat1, err, lsb, msb);
if ((err & 0x7f) == ATA_E_ILI) {
if (lsb == ATAPI_MAGIC_LSB && msb == ATAPI_MAGIC_MSB) {
ch->devices |= ATA_ATAPI_SLAVE;
@@ -610,7 +614,7 @@
if ((!(stat0 & ATA_S_BUSY) || (stat0 == 0xff && timeout > 20)) &&
(!(stat1 & ATA_S_BUSY) || (stat1 == 0xff && timeout > 20)))
break;
- DELAY(100000);
+ DELAY(1000);
}
if (stat0 & ATA_S_BUSY)
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list