diff options
-rw-r--r-- | drivers/ata/ahci.c | 11 | ||||
-rw-r--r-- | drivers/ata/libata-sff.c | 161 | ||||
-rw-r--r-- | drivers/ata/pata_scc.c | 91 | ||||
-rw-r--r-- | drivers/ata/sata_inic162x.c | 6 | ||||
-rw-r--r-- | drivers/ata/sata_via.c | 2 | ||||
-rw-r--r-- | include/linux/libata.h | 18 |
6 files changed, 139 insertions, 150 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 939dc1d4e50d..45a67a9ad8ab 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
@@ -1302,10 +1302,8 @@ static int ahci_do_softreset(struct ata_link *link, unsigned int *class, | |||
1302 | tf.ctl &= ~ATA_SRST; | 1302 | tf.ctl &= ~ATA_SRST; |
1303 | ahci_exec_polled_cmd(ap, pmp, &tf, 0, 0, 0); | 1303 | ahci_exec_polled_cmd(ap, pmp, &tf, 0, 0, 0); |
1304 | 1304 | ||
1305 | /* wait a while before checking status */ | 1305 | /* wait for link to become ready */ |
1306 | ata_sff_wait_after_reset(ap, deadline); | 1306 | rc = ata_sff_wait_after_reset(link, 1, deadline); |
1307 | |||
1308 | rc = ata_sff_wait_ready(ap, deadline); | ||
1309 | /* link occupied, -ENODEV too is an error */ | 1307 | /* link occupied, -ENODEV too is an error */ |
1310 | if (rc) { | 1308 | if (rc) { |
1311 | reason = "device not ready"; | 1309 | reason = "device not ready"; |
@@ -1415,9 +1413,6 @@ static int ahci_p5wdh_hardreset(struct ata_link *link, unsigned int *class, | |||
1415 | if (rc || ata_link_offline(link)) | 1413 | if (rc || ata_link_offline(link)) |
1416 | return rc; | 1414 | return rc; |
1417 | 1415 | ||
1418 | /* spec mandates ">= 2ms" before checking status */ | ||
1419 | msleep(150); | ||
1420 | |||
1421 | /* The pseudo configuration device on SIMG4726 attached to | 1416 | /* The pseudo configuration device on SIMG4726 attached to |
1422 | * ASUS P5W-DH Deluxe doesn't send signature FIS after | 1417 | * ASUS P5W-DH Deluxe doesn't send signature FIS after |
1423 | * hardreset if no device is attached to the first downstream | 1418 | * hardreset if no device is attached to the first downstream |
@@ -1431,7 +1426,7 @@ static int ahci_p5wdh_hardreset(struct ata_link *link, unsigned int *class, | |||
1431 | * have to be reset again. For most cases, this should | 1426 | * have to be reset again. For most cases, this should |
1432 | * suffice while making probing snappish enough. | 1427 | * suffice while making probing snappish enough. |
1433 | */ | 1428 | */ |
1434 | rc = ata_sff_wait_ready(ap, jiffies + 2 * HZ); | 1429 | rc = ata_sff_wait_after_reset(link, 1, jiffies + 2 * HZ); |
1435 | if (rc) | 1430 | if (rc) |
1436 | ahci_kick_engine(ap, 0); | 1431 | ahci_kick_engine(ap, 0); |
1437 | 1432 | ||
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index e530baccc9cb..6e8de3c1595e 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c | |||
@@ -310,7 +310,7 @@ int ata_sff_busy_sleep(struct ata_port *ap, | |||
310 | 310 | ||
311 | /** | 311 | /** |
312 | * ata_sff_wait_ready - sleep until BSY clears, or timeout | 312 | * ata_sff_wait_ready - sleep until BSY clears, or timeout |
313 | * @ap: port containing status register to be polled | 313 | * @link: SFF link to wait ready status for |
314 | * @deadline: deadline jiffies for the operation | 314 | * @deadline: deadline jiffies for the operation |
315 | * | 315 | * |
316 | * Sleep until ATA Status register bit BSY clears, or timeout | 316 | * Sleep until ATA Status register bit BSY clears, or timeout |
@@ -322,26 +322,52 @@ int ata_sff_busy_sleep(struct ata_port *ap, | |||
322 | * RETURNS: | 322 | * RETURNS: |
323 | * 0 on success, -errno otherwise. | 323 | * 0 on success, -errno otherwise. |
324 | */ | 324 | */ |
325 | int ata_sff_wait_ready(struct ata_port *ap, unsigned long deadline) | 325 | int ata_sff_wait_ready(struct ata_link *link, unsigned long deadline) |
326 | { | 326 | { |
327 | struct ata_port *ap = link->ap; | ||
327 | unsigned long start = jiffies; | 328 | unsigned long start = jiffies; |
329 | unsigned long nodev_deadline = start + ATA_TMOUT_FF_WAIT; | ||
328 | int warned = 0; | 330 | int warned = 0; |
329 | 331 | ||
332 | if (time_after(nodev_deadline, deadline)) | ||
333 | nodev_deadline = deadline; | ||
334 | |||
330 | while (1) { | 335 | while (1) { |
331 | u8 status = ap->ops->sff_check_status(ap); | 336 | u8 status = ap->ops->sff_check_status(ap); |
332 | unsigned long now = jiffies; | 337 | unsigned long now = jiffies; |
333 | 338 | ||
334 | if (!(status & ATA_BUSY)) | 339 | if (!(status & ATA_BUSY)) |
335 | return 0; | 340 | return 0; |
336 | if (!ata_link_online(&ap->link) && status == 0xff) | 341 | |
337 | return -ENODEV; | 342 | /* No device status could be transient. Ignore it if |
343 | * link is online. Also, some SATA devices take a | ||
344 | * long time to clear 0xff after reset. For example, | ||
345 | * HHD424020F7SV00 iVDR needs >= 800ms while Quantum | ||
346 | * GoVault needs even more than that. Wait for | ||
347 | * ATA_TMOUT_FF_WAIT on -ENODEV if link isn't offline. | ||
348 | * | ||
349 | * Note that some PATA controllers (pata_ali) explode | ||
350 | * if status register is read more than once when | ||
351 | * there's no device attached. | ||
352 | */ | ||
353 | if (status == 0xff) { | ||
354 | if (ata_link_online(link)) | ||
355 | status = ATA_BUSY; | ||
356 | else if ((link->ap->flags & ATA_FLAG_SATA) && | ||
357 | !ata_link_offline(link) && | ||
358 | time_before(now, nodev_deadline)) | ||
359 | status = ATA_BUSY; | ||
360 | if (status == 0xff) | ||
361 | return -ENODEV; | ||
362 | } | ||
363 | |||
338 | if (time_after(now, deadline)) | 364 | if (time_after(now, deadline)) |
339 | return -EBUSY; | 365 | return -EBUSY; |
340 | 366 | ||
341 | if (!warned && time_after(now, start + 5 * HZ) && | 367 | if (!warned && time_after(now, start + 5 * HZ) && |
342 | (deadline - now > 3 * HZ)) { | 368 | (deadline - now > 3 * HZ)) { |
343 | ata_port_printk(ap, KERN_WARNING, | 369 | ata_link_printk(link, KERN_WARNING, |
344 | "port is slow to respond, please be patient " | 370 | "link is slow to respond, please be patient " |
345 | "(Status 0x%x)\n", status); | 371 | "(Status 0x%x)\n", status); |
346 | warned = 1; | 372 | warned = 1; |
347 | } | 373 | } |
@@ -1625,7 +1651,6 @@ void ata_sff_thaw(struct ata_port *ap) | |||
1625 | */ | 1651 | */ |
1626 | int ata_sff_prereset(struct ata_link *link, unsigned long deadline) | 1652 | int ata_sff_prereset(struct ata_link *link, unsigned long deadline) |
1627 | { | 1653 | { |
1628 | struct ata_port *ap = link->ap; | ||
1629 | struct ata_eh_context *ehc = &link->eh_context; | 1654 | struct ata_eh_context *ehc = &link->eh_context; |
1630 | int rc; | 1655 | int rc; |
1631 | 1656 | ||
@@ -1639,7 +1664,7 @@ int ata_sff_prereset(struct ata_link *link, unsigned long deadline) | |||
1639 | 1664 | ||
1640 | /* wait for !BSY if we don't know that no device is attached */ | 1665 | /* wait for !BSY if we don't know that no device is attached */ |
1641 | if (!ata_link_offline(link)) { | 1666 | if (!ata_link_offline(link)) { |
1642 | rc = ata_sff_wait_ready(ap, deadline); | 1667 | rc = ata_sff_wait_ready(link, deadline); |
1643 | if (rc && rc != -ENODEV) { | 1668 | if (rc && rc != -ENODEV) { |
1644 | ata_link_printk(link, KERN_WARNING, "device not ready " | 1669 | ata_link_printk(link, KERN_WARNING, "device not ready " |
1645 | "(errno=%d), forcing hardreset\n", rc); | 1670 | "(errno=%d), forcing hardreset\n", rc); |
@@ -1762,25 +1787,41 @@ unsigned int ata_sff_dev_classify(struct ata_device *dev, int present, | |||
1762 | return class; | 1787 | return class; |
1763 | } | 1788 | } |
1764 | 1789 | ||
1765 | static int ata_bus_post_reset(struct ata_port *ap, unsigned int devmask, | 1790 | /** |
1766 | unsigned long deadline) | 1791 | * ata_sff_wait_after_reset - wait for devices to become ready after reset |
1792 | * @link: SFF link which is just reset | ||
1793 | * @devmask: mask of present devices | ||
1794 | * @deadline: deadline jiffies for the operation | ||
1795 | * | ||
1796 | * Wait devices attached to SFF @link to become ready after | ||
1797 | * reset. It contains preceding 150ms wait to avoid accessing TF | ||
1798 | * status register too early. | ||
1799 | * | ||
1800 | * LOCKING: | ||
1801 | * Kernel thread context (may sleep). | ||
1802 | * | ||
1803 | * RETURNS: | ||
1804 | * 0 on success, -ENODEV if some or all of devices in @devmask | ||
1805 | * don't seem to exist. -errno on other errors. | ||
1806 | */ | ||
1807 | int ata_sff_wait_after_reset(struct ata_link *link, unsigned int devmask, | ||
1808 | unsigned long deadline) | ||
1767 | { | 1809 | { |
1810 | struct ata_port *ap = link->ap; | ||
1768 | struct ata_ioports *ioaddr = &ap->ioaddr; | 1811 | struct ata_ioports *ioaddr = &ap->ioaddr; |
1769 | unsigned int dev0 = devmask & (1 << 0); | 1812 | unsigned int dev0 = devmask & (1 << 0); |
1770 | unsigned int dev1 = devmask & (1 << 1); | 1813 | unsigned int dev1 = devmask & (1 << 1); |
1771 | int rc, ret = 0; | 1814 | int rc, ret = 0; |
1772 | 1815 | ||
1773 | /* if device 0 was found in ata_devchk, wait for its | 1816 | msleep(ATA_WAIT_AFTER_RESET_MSECS); |
1774 | * BSY bit to clear | 1817 | |
1818 | /* always check readiness of the master device */ | ||
1819 | rc = ata_sff_wait_ready(link, deadline); | ||
1820 | /* -ENODEV means the odd clown forgot the D7 pulldown resistor | ||
1821 | * and TF status is 0xff, bail out on it too. | ||
1775 | */ | 1822 | */ |
1776 | if (dev0) { | 1823 | if (rc) |
1777 | rc = ata_sff_wait_ready(ap, deadline); | 1824 | return rc; |
1778 | if (rc) { | ||
1779 | if (rc != -ENODEV) | ||
1780 | return rc; | ||
1781 | ret = rc; | ||
1782 | } | ||
1783 | } | ||
1784 | 1825 | ||
1785 | /* if device 1 was found in ata_devchk, wait for register | 1826 | /* if device 1 was found in ata_devchk, wait for register |
1786 | * access briefly, then wait for BSY to clear. | 1827 | * access briefly, then wait for BSY to clear. |
@@ -1804,7 +1845,7 @@ static int ata_bus_post_reset(struct ata_port *ap, unsigned int devmask, | |||
1804 | msleep(50); /* give drive a breather */ | 1845 | msleep(50); /* give drive a breather */ |
1805 | } | 1846 | } |
1806 | 1847 | ||
1807 | rc = ata_sff_wait_ready(ap, deadline); | 1848 | rc = ata_sff_wait_ready(link, deadline); |
1808 | if (rc) { | 1849 | if (rc) { |
1809 | if (rc != -ENODEV) | 1850 | if (rc != -ENODEV) |
1810 | return rc; | 1851 | return rc; |
@@ -1822,61 +1863,6 @@ static int ata_bus_post_reset(struct ata_port *ap, unsigned int devmask, | |||
1822 | return ret; | 1863 | return ret; |
1823 | } | 1864 | } |
1824 | 1865 | ||
1825 | /** | ||
1826 | * ata_sff_wait_after_reset - wait before checking status after reset | ||
1827 | * @ap: port containing status register to be polled | ||
1828 | * @deadline: deadline jiffies for the operation | ||
1829 | * | ||
1830 | * After reset, we need to pause a while before reading status. | ||
1831 | * Also, certain combination of controller and device report 0xff | ||
1832 | * for some duration (e.g. until SATA PHY is up and running) | ||
1833 | * which is interpreted as empty port in ATA world. This | ||
1834 | * function also waits for such devices to get out of 0xff | ||
1835 | * status. | ||
1836 | * | ||
1837 | * LOCKING: | ||
1838 | * Kernel thread context (may sleep). | ||
1839 | */ | ||
1840 | void ata_sff_wait_after_reset(struct ata_port *ap, unsigned long deadline) | ||
1841 | { | ||
1842 | unsigned long until = jiffies + ATA_TMOUT_FF_WAIT; | ||
1843 | |||
1844 | if (time_before(until, deadline)) | ||
1845 | deadline = until; | ||
1846 | |||
1847 | /* Spec mandates ">= 2ms" before checking status. We wait | ||
1848 | * 150ms, because that was the magic delay used for ATAPI | ||
1849 | * devices in Hale Landis's ATADRVR, for the period of time | ||
1850 | * between when the ATA command register is written, and then | ||
1851 | * status is checked. Because waiting for "a while" before | ||
1852 | * checking status is fine, post SRST, we perform this magic | ||
1853 | * delay here as well. | ||
1854 | * | ||
1855 | * Old drivers/ide uses the 2mS rule and then waits for ready. | ||
1856 | */ | ||
1857 | msleep(150); | ||
1858 | |||
1859 | /* Wait for 0xff to clear. Some SATA devices take a long time | ||
1860 | * to clear 0xff after reset. For example, HHD424020F7SV00 | ||
1861 | * iVDR needs >= 800ms while. Quantum GoVault needs even more | ||
1862 | * than that. | ||
1863 | * | ||
1864 | * Note that some PATA controllers (pata_ali) explode if | ||
1865 | * status register is read more than once when there's no | ||
1866 | * device attached. | ||
1867 | */ | ||
1868 | if (ap->flags & ATA_FLAG_SATA) { | ||
1869 | while (1) { | ||
1870 | u8 status = ap->ops->sff_check_status(ap); | ||
1871 | |||
1872 | if (status != 0xff || time_after(jiffies, deadline)) | ||
1873 | return; | ||
1874 | |||
1875 | msleep(50); | ||
1876 | } | ||
1877 | } | ||
1878 | } | ||
1879 | |||
1880 | static int ata_bus_softreset(struct ata_port *ap, unsigned int devmask, | 1866 | static int ata_bus_softreset(struct ata_port *ap, unsigned int devmask, |
1881 | unsigned long deadline) | 1867 | unsigned long deadline) |
1882 | { | 1868 | { |
@@ -1891,17 +1877,8 @@ static int ata_bus_softreset(struct ata_port *ap, unsigned int devmask, | |||
1891 | udelay(20); /* FIXME: flush */ | 1877 | udelay(20); /* FIXME: flush */ |
1892 | iowrite8(ap->ctl, ioaddr->ctl_addr); | 1878 | iowrite8(ap->ctl, ioaddr->ctl_addr); |
1893 | 1879 | ||
1894 | /* wait a while before checking status */ | 1880 | /* wait the port to become ready */ |
1895 | ata_sff_wait_after_reset(ap, deadline); | 1881 | return ata_sff_wait_after_reset(&ap->link, devmask, deadline); |
1896 | |||
1897 | /* Before we perform post reset processing we want to see if | ||
1898 | * the bus shows 0xFF because the odd clown forgets the D7 | ||
1899 | * pulldown resistor. | ||
1900 | */ | ||
1901 | if (ap->ops->sff_check_status(ap) == 0xFF) | ||
1902 | return -ENODEV; | ||
1903 | |||
1904 | return ata_bus_post_reset(ap, devmask, deadline); | ||
1905 | } | 1882 | } |
1906 | 1883 | ||
1907 | /** | 1884 | /** |
@@ -2003,20 +1980,18 @@ int sata_sff_hardreset(struct ata_link *link, unsigned int *class, | |||
2003 | return 0; | 1980 | return 0; |
2004 | } | 1981 | } |
2005 | 1982 | ||
2006 | /* wait a while before checking status */ | ||
2007 | ata_sff_wait_after_reset(ap, deadline); | ||
2008 | |||
2009 | /* If PMP is supported, we have to do follow-up SRST. Note | 1983 | /* If PMP is supported, we have to do follow-up SRST. Note |
2010 | * that some PMPs don't send D2H Reg FIS after hardreset at | 1984 | * that some PMPs don't send D2H Reg FIS after hardreset at |
2011 | * all if the first port is empty. Wait for it just for a | 1985 | * all if the first port is empty. Wait for it just for a |
2012 | * second and request follow-up SRST. | 1986 | * second and request follow-up SRST. |
2013 | */ | 1987 | */ |
2014 | if (ap->flags & ATA_FLAG_PMP) { | 1988 | if (ap->flags & ATA_FLAG_PMP) { |
2015 | ata_sff_wait_ready(ap, jiffies + HZ); | 1989 | ata_sff_wait_after_reset(link, 1, jiffies + HZ); |
2016 | return -EAGAIN; | 1990 | return -EAGAIN; |
2017 | } | 1991 | } |
2018 | 1992 | ||
2019 | rc = ata_sff_wait_ready(ap, deadline); | 1993 | /* wait for the link to become online */ |
1994 | rc = ata_sff_wait_after_reset(link, 1, deadline); | ||
2020 | /* link occupied, -ENODEV too is an error */ | 1995 | /* link occupied, -ENODEV too is an error */ |
2021 | if (rc) { | 1996 | if (rc) { |
2022 | ata_link_printk(link, KERN_ERR, | 1997 | ata_link_printk(link, KERN_ERR, |
@@ -2024,8 +1999,6 @@ int sata_sff_hardreset(struct ata_link *link, unsigned int *class, | |||
2024 | return rc; | 1999 | return rc; |
2025 | } | 2000 | } |
2026 | 2001 | ||
2027 | ap->ops->sff_dev_select(ap, 0); /* probably unnecessary */ | ||
2028 | |||
2029 | *class = ata_sff_dev_classify(link->device, 1, NULL); | 2002 | *class = ata_sff_dev_classify(link->device, 1, NULL); |
2030 | 2003 | ||
2031 | DPRINTK("EXIT, class=%u\n", *class); | 2004 | DPRINTK("EXIT, class=%u\n", *class); |
diff --git a/drivers/ata/pata_scc.c b/drivers/ata/pata_scc.c index 2b9da715c704..accc275e74cc 100644 --- a/drivers/ata/pata_scc.c +++ b/drivers/ata/pata_scc.c | |||
@@ -497,47 +497,68 @@ static unsigned int scc_devchk (struct ata_port *ap, | |||
497 | } | 497 | } |
498 | 498 | ||
499 | /** | 499 | /** |
500 | * scc_bus_post_reset - PATA device post reset | 500 | * scc_wait_after_reset - wait for devices to become ready after reset |
501 | * | 501 | * |
502 | * Note: Original code is ata_bus_post_reset(). | 502 | * Note: Original code is ata_sff_wait_after_reset |
503 | */ | 503 | */ |
504 | 504 | ||
505 | static int scc_bus_post_reset(struct ata_port *ap, unsigned int devmask, | 505 | int scc_wait_after_reset(struct ata_link *link, unsigned int devmask, |
506 | unsigned long deadline) | 506 | unsigned long deadline) |
507 | { | 507 | { |
508 | struct ata_port *ap = link->ap; | ||
508 | struct ata_ioports *ioaddr = &ap->ioaddr; | 509 | struct ata_ioports *ioaddr = &ap->ioaddr; |
509 | unsigned int dev0 = devmask & (1 << 0); | 510 | unsigned int dev0 = devmask & (1 << 0); |
510 | unsigned int dev1 = devmask & (1 << 1); | 511 | unsigned int dev1 = devmask & (1 << 1); |
511 | int rc; | 512 | int rc, ret = 0; |
513 | |||
514 | /* Spec mandates ">= 2ms" before checking status. We wait | ||
515 | * 150ms, because that was the magic delay used for ATAPI | ||
516 | * devices in Hale Landis's ATADRVR, for the period of time | ||
517 | * between when the ATA command register is written, and then | ||
518 | * status is checked. Because waiting for "a while" before | ||
519 | * checking status is fine, post SRST, we perform this magic | ||
520 | * delay here as well. | ||
521 | * | ||
522 | * Old drivers/ide uses the 2mS rule and then waits for ready. | ||
523 | */ | ||
524 | msleep(150); | ||
512 | 525 | ||
513 | /* if device 0 was found in ata_devchk, wait for its | 526 | /* always check readiness of the master device */ |
514 | * BSY bit to clear | 527 | rc = ata_sff_wait_ready(link, deadline); |
528 | /* -ENODEV means the odd clown forgot the D7 pulldown resistor | ||
529 | * and TF status is 0xff, bail out on it too. | ||
515 | */ | 530 | */ |
516 | if (dev0) { | 531 | if (rc) |
517 | rc = ata_sff_wait_ready(ap, deadline); | 532 | return rc; |
518 | if (rc && rc != -ENODEV) | ||
519 | return rc; | ||
520 | } | ||
521 | 533 | ||
522 | /* if device 1 was found in ata_devchk, wait for | 534 | /* if device 1 was found in ata_devchk, wait for register |
523 | * register access, then wait for BSY to clear | 535 | * access briefly, then wait for BSY to clear. |
524 | */ | 536 | */ |
525 | while (dev1) { | 537 | if (dev1) { |
526 | u8 nsect, lbal; | 538 | int i; |
527 | 539 | ||
528 | ap->ops->sff_dev_select(ap, 1); | 540 | ap->ops->sff_dev_select(ap, 1); |
529 | nsect = in_be32(ioaddr->nsect_addr); | 541 | |
530 | lbal = in_be32(ioaddr->lbal_addr); | 542 | /* Wait for register access. Some ATAPI devices fail |
531 | if ((nsect == 1) && (lbal == 1)) | 543 | * to set nsect/lbal after reset, so don't waste too |
532 | break; | 544 | * much time on it. We're gonna wait for !BSY anyway. |
533 | if (time_after(jiffies, deadline)) | 545 | */ |
534 | return -EBUSY; | 546 | for (i = 0; i < 2; i++) { |
535 | msleep(50); /* give drive a breather */ | 547 | u8 nsect, lbal; |
536 | } | 548 | |
537 | if (dev1) { | 549 | nsect = in_be32(ioaddr->nsect_addr); |
538 | rc = ata_sff_wait_ready(ap, deadline); | 550 | lbal = in_be32(ioaddr->lbal_addr); |
539 | if (rc && rc != -ENODEV) | 551 | if ((nsect == 1) && (lbal == 1)) |
540 | return rc; | 552 | break; |
553 | msleep(50); /* give drive a breather */ | ||
554 | } | ||
555 | |||
556 | rc = ata_sff_wait_ready(link, deadline); | ||
557 | if (rc) { | ||
558 | if (rc != -ENODEV) | ||
559 | return rc; | ||
560 | ret = rc; | ||
561 | } | ||
541 | } | 562 | } |
542 | 563 | ||
543 | /* is all this really necessary? */ | 564 | /* is all this really necessary? */ |
@@ -547,7 +568,7 @@ static int scc_bus_post_reset(struct ata_port *ap, unsigned int devmask, | |||
547 | if (dev0) | 568 | if (dev0) |
548 | ap->ops->sff_dev_select(ap, 0); | 569 | ap->ops->sff_dev_select(ap, 0); |
549 | 570 | ||
550 | return 0; | 571 | return ret; |
551 | } | 572 | } |
552 | 573 | ||
553 | /** | 574 | /** |
@@ -570,17 +591,7 @@ static unsigned int scc_bus_softreset(struct ata_port *ap, unsigned int devmask, | |||
570 | udelay(20); | 591 | udelay(20); |
571 | out_be32(ioaddr->ctl_addr, ap->ctl); | 592 | out_be32(ioaddr->ctl_addr, ap->ctl); |
572 | 593 | ||
573 | /* wait a while before checking status */ | 594 | scc_wait_after_reset(&ap->link, devmask, deadlien); |
574 | ata_sff_wait_after_reset(ap, deadline); | ||
575 | |||
576 | /* Before we perform post reset processing we want to see if | ||
577 | * the bus shows 0xFF because the odd clown forgets the D7 | ||
578 | * pulldown resistor. | ||
579 | */ | ||
580 | if (scc_check_status(ap) == 0xFF) | ||
581 | return 0; | ||
582 | |||
583 | scc_bus_post_reset(ap, devmask, deadline); | ||
584 | 595 | ||
585 | return 0; | 596 | return 0; |
586 | } | 597 | } |
diff --git a/drivers/ata/sata_inic162x.c b/drivers/ata/sata_inic162x.c index 0b5a736a45e3..9f47d0022453 100644 --- a/drivers/ata/sata_inic162x.c +++ b/drivers/ata/sata_inic162x.c | |||
@@ -417,10 +417,8 @@ static int inic_hardreset(struct ata_link *link, unsigned int *class, | |||
417 | if (ata_link_online(link)) { | 417 | if (ata_link_online(link)) { |
418 | struct ata_taskfile tf; | 418 | struct ata_taskfile tf; |
419 | 419 | ||
420 | /* wait a while before checking status */ | 420 | /* wait for link to become ready */ |
421 | ata_sff_wait_after_reset(ap, deadline); | 421 | rc = ata_sff_wait_after_reset(link, 1, deadline); |
422 | |||
423 | rc = ata_sff_wait_ready(ap, deadline); | ||
424 | /* link occupied, -ENODEV too is an error */ | 422 | /* link occupied, -ENODEV too is an error */ |
425 | if (rc) { | 423 | if (rc) { |
426 | ata_link_printk(link, KERN_WARNING, "device not ready " | 424 | ata_link_printk(link, KERN_WARNING, "device not ready " |
diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c index e5df37689740..96deeb354e16 100644 --- a/drivers/ata/sata_via.c +++ b/drivers/ata/sata_via.c | |||
@@ -242,7 +242,7 @@ static int vt6420_prereset(struct ata_link *link, unsigned long deadline) | |||
242 | 242 | ||
243 | skip_scr: | 243 | skip_scr: |
244 | /* wait for !BSY */ | 244 | /* wait for !BSY */ |
245 | ata_sff_wait_ready(ap, deadline); | 245 | ata_sff_wait_ready(link, deadline); |
246 | 246 | ||
247 | return 0; | 247 | return 0; |
248 | } | 248 | } |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 6e14c27319d5..da5560244787 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -249,6 +249,18 @@ enum { | |||
249 | */ | 249 | */ |
250 | ATA_TMOUT_FF_WAIT = 4 * HZ / 5, | 250 | ATA_TMOUT_FF_WAIT = 4 * HZ / 5, |
251 | 251 | ||
252 | /* Spec mandates to wait for ">= 2ms" before checking status | ||
253 | * after reset. We wait 150ms, because that was the magic | ||
254 | * delay used for ATAPI devices in Hale Landis's ATADRVR, for | ||
255 | * the period of time between when the ATA command register is | ||
256 | * written, and then status is checked. Because waiting for | ||
257 | * "a while" before checking status is fine, post SRST, we | ||
258 | * perform this magic delay here as well. | ||
259 | * | ||
260 | * Old drivers/ide uses the 2mS rule and then waits for ready. | ||
261 | */ | ||
262 | ATA_WAIT_AFTER_RESET_MSECS = 150, | ||
263 | |||
252 | /* ATA bus states */ | 264 | /* ATA bus states */ |
253 | BUS_UNKNOWN = 0, | 265 | BUS_UNKNOWN = 0, |
254 | BUS_DMA = 1, | 266 | BUS_DMA = 1, |
@@ -1351,7 +1363,7 @@ extern u8 ata_sff_check_status(struct ata_port *ap); | |||
1351 | extern u8 ata_sff_altstatus(struct ata_port *ap); | 1363 | extern u8 ata_sff_altstatus(struct ata_port *ap); |
1352 | extern int ata_sff_busy_sleep(struct ata_port *ap, | 1364 | extern int ata_sff_busy_sleep(struct ata_port *ap, |
1353 | unsigned long timeout_pat, unsigned long timeout); | 1365 | unsigned long timeout_pat, unsigned long timeout); |
1354 | extern int ata_sff_wait_ready(struct ata_port *ap, unsigned long deadline); | 1366 | extern int ata_sff_wait_ready(struct ata_link *link, unsigned long deadline); |
1355 | extern void ata_sff_tf_load(struct ata_port *ap, const struct ata_taskfile *tf); | 1367 | extern void ata_sff_tf_load(struct ata_port *ap, const struct ata_taskfile *tf); |
1356 | extern void ata_sff_tf_read(struct ata_port *ap, struct ata_taskfile *tf); | 1368 | extern void ata_sff_tf_read(struct ata_port *ap, struct ata_taskfile *tf); |
1357 | extern void ata_sff_exec_command(struct ata_port *ap, | 1369 | extern void ata_sff_exec_command(struct ata_port *ap, |
@@ -1373,8 +1385,8 @@ extern void ata_sff_thaw(struct ata_port *ap); | |||
1373 | extern int ata_sff_prereset(struct ata_link *link, unsigned long deadline); | 1385 | extern int ata_sff_prereset(struct ata_link *link, unsigned long deadline); |
1374 | extern unsigned int ata_sff_dev_classify(struct ata_device *dev, int present, | 1386 | extern unsigned int ata_sff_dev_classify(struct ata_device *dev, int present, |
1375 | u8 *r_err); | 1387 | u8 *r_err); |
1376 | extern void ata_sff_wait_after_reset(struct ata_port *ap, | 1388 | extern int ata_sff_wait_after_reset(struct ata_link *link, unsigned int devmask, |
1377 | unsigned long deadline); | 1389 | unsigned long deadline); |
1378 | extern int ata_sff_softreset(struct ata_link *link, unsigned int *classes, | 1390 | extern int ata_sff_softreset(struct ata_link *link, unsigned int *classes, |
1379 | unsigned long deadline); | 1391 | unsigned long deadline); |
1380 | extern int sata_sff_hardreset(struct ata_link *link, unsigned int *class, | 1392 | extern int sata_sff_hardreset(struct ata_link *link, unsigned int *class, |