ide: fix 40-wire cable detection for TSST SH-S202* ATAPI devices (v2)
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Fri, 22 May 2009 14:23:36 +0000 (16:23 +0200)
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Fri, 22 May 2009 14:23:36 +0000 (16:23 +0200)
Since 2.6.26 we support UDMA66 on ATAPI devices requiring IVB quirk:

  commit 8588a2b732928b343233af9b1855705b8286bed4
  ("ide: add SH-S202J to ivb_list[]")

We also later added support for more such devices in:

  commit e97564f362a93f8c248246c19828895950341252
  ("ide: More TSST drives with broken cable detection")

and in:

  commit 3ced5c49bd2d1f2c7f769e3a54385883de63a652
  ("ide: add TSSTcorp CDDVDW SH-S202H to ivb_list[]")

It turns out that such devices lack cable detection altogether
(which in turn results in incorrect detection of 40-wire cables
by our current cable detection strategy) so always handle them
by trusting host-side cable detection only.

v2:
Model detection fixup from Martin.

Reported-and-tested-by: Martin Lottermoser <Martin.Lottermoser@t-online.de>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
drivers/ide/ide-iops.c

index c19a221b1e183e9f9764d8b9ff70efc0c1499f94..06fe002116ecc733a1015216d7676e4b24439070 100644 (file)
@@ -206,8 +206,6 @@ EXPORT_SYMBOL_GPL(ide_in_drive_list);
 
 /*
  * Early UDMA66 devices don't set bit14 to 1, only bit13 is valid.
- * We list them here and depend on the device side cable detection for them.
- *
  * Some optical devices with the buggy firmwares have the same problem.
  */
 static const struct drive_list_entry ivb_list[] = {
@@ -251,10 +249,25 @@ u8 eighty_ninty_three(ide_drive_t *drive)
         * - force bit13 (80c cable present) check also for !ivb devices
         *   (unless the slave device is pre-ATA3)
         */
-       if ((id[ATA_ID_HW_CONFIG] & 0x4000) ||
-           (ivb && (id[ATA_ID_HW_CONFIG] & 0x2000)))
+       if (id[ATA_ID_HW_CONFIG] & 0x4000)
                return 1;
 
+       if (ivb) {
+               const char *model = (char *)&id[ATA_ID_PROD];
+
+               if (strstr(model, "TSSTcorp CDDVDW SH-S202")) {
+                       /*
+                        * These ATAPI devices always report 80c cable
+                        * so we have to depend on the host in this case.
+                        */
+                       if (hwif->cbl == ATA_CBL_PATA80)
+                               return 1;
+               } else {
+                       /* Depend on the device side cable detection. */
+                       if (id[ATA_ID_HW_CONFIG] & 0x2000)
+                               return 1;
+               }
+       }
 no_80w:
        if (drive->dev_flags & IDE_DFLAG_UDMA33_WARNED)
                return 0;