Re: libata and legacy ide pcmcia failure

From: Tejun Heo
Date: Mon May 21 2007 - 07:51:23 EST


Robert de Rooy wrote:
> Thanks for looking into this!
>
> I tried the patches on 2.6.22rc1-git5. The second patch unfortunately
> did not resolve the issue, although it seems to get a bit further. Here
> are the logs.
>
> ** 2.6.22rc1-git5 + timing-debug.patch

Oh I see. The 2.6.22rc1-git5 has new reset sequencing which uses
deadline table so it takes 10sec to fail to first reset try while 2.6.21
needs 30secs. That's where the 20sec difference per each try comes
from, so newer version is better. Great.

> ** 2.6.22rc1-git5 + timing-debug.patch + disable-dev_init_params.patch
> May 20 23:02:26 localhost kernel: ata3.00: 253696 sectors, multi 0: LBA
> May 20 23:02:56 localhost kernel: ata3.00: qc timeout (cmd 0xef)
> May 20 23:02:56 localhost kernel: ata3.00: failed to set xfermode
> (err_mask=0x4)

Hmmm... It doesn't like SETXFERMASK either. Please try the attached patch.

--
tejun
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index d5939e6..ad5fd5b 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -1769,6 +1769,7 @@ int ata_dev_read_id(struct ata_device *d
goto retry;
}

+#if 0
if ((flags & ATA_READID_POSTRESET) && class == ATA_DEV_ATA) {
/*
* The exact sequence expected by certain pre-ATA4 drives is:
@@ -1793,6 +1794,7 @@ int ata_dev_read_id(struct ata_device *d
goto retry;
}
}
+#endif

*p_class = class;

@@ -2778,7 +2780,9 @@ static int ata_dev_set_mode(struct ata_d
if (dev->xfer_shift == ATA_SHIFT_PIO)
dev->flags |= ATA_DFLAG_PIO;

- err_mask = ata_dev_set_xfermode(dev);
+ err_mask = 0;
+ if (!(dev->xfer_shift == ATA_SHIFT_PIO && ata_id_is_cfa(dev->id)))
+ err_mask = ata_dev_set_xfermode(dev);
/* Old CFA may refuse this command, which is just fine */
if (dev->xfer_shift == ATA_SHIFT_PIO && ata_id_is_cfa(dev->id))
err_mask &= ~AC_ERR_DEV;