libata: allow LLDs w/o any reset method
authorTejun Heo <htejun@gmail.com>
Thu, 6 Mar 2008 04:09:34 +0000 (13:09 +0900)
committerJeff Garzik <jeff@garzik.org>
Tue, 11 Mar 2008 00:50:34 +0000 (20:50 -0400)
Some old SFF controllers don't have any way to reset the channel.
Currently, this isn't supported and libata EH causes an oops.  Allow
LLDs w/o any reset method and just assume ATA class in such cases.

Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
drivers/ata/libata-eh.c

index 698ce2c..681252f 100644 (file)
@@ -2150,6 +2150,15 @@ int ata_eh_reset(struct ata_link *link, int classify,
                        ap->ops->set_piomode(ap, dev);
        }
 
+       if (!softreset && !hardreset) {
+               if (verbose)
+                       ata_link_printk(link, KERN_INFO, "no reset method "
+                                       "available, skipping reset\n");
+               if (!(lflags & ATA_LFLAG_ASSUME_CLASS))
+                       lflags |= ATA_LFLAG_ASSUME_ATA;
+               goto done;
+       }
+
        /* Determine which reset to use and record in ehc->i.action.
         * prereset() may examine and modify it.
         */
@@ -2254,6 +2263,7 @@ int ata_eh_reset(struct ata_link *link, int classify,
                lflags |= ATA_LFLAG_ASSUME_ATA;
        }
 
+ done:
        ata_link_for_each_dev(dev, link) {
                /* After the reset, the device state is PIO 0 and the
                 * controller state is undefined.  Reset also wakes up