Date: Wed, 3 Dec 2003 09:16:52 +0100 (CET) From: Divacky Roman <xdivac02@stud.fit.vutbr.cz> To: FreeBSD-gnats-submit@FreeBSD.org Subject: kern/59917: ata reset update in ATAng Message-ID: <200312030816.hB38Gqpb002759@eva.fit.vutbr.cz> Resent-Message-ID: <200312030820.hB38KIR8034707@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>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:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200312030816.hB38Gqpb002759>