kern/59917: ata reset update in ATAng
Bruce Evans
bde at zeta.org.au
Sat Dec 6 15:36:23 PST 2003
On Wed, 3 Dec 2003, Divacky Roman wrote:
> >Description:
>
> I have PIIX4 ata controller has very slow ata-reset under ATAng
How slow? The patch seesm to mainly just increase the resolution of
the polling so that you have to wait up to 99 msec less.
> >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++) {
I use similar changes (this and the corresponding decreased delay) for
unrelated reasons (to monitor the status in closer to real time).
> 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;
I use similar changes to avoid spec violations. Unfortunately sos doesn't
like them. The strange order is a hack which is claimed to help for some
out-of spec drives. It only breaks in-spec drives sometimes (if a race is
lost). On many systems the order makes no difference because we waited
a long time before beginning the loop, so all drives are already unbusy.
Bruce
More information about the freebsd-bugs
mailing list