diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-10 10:46:45 -0400 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-10 10:46:45 -0400 | 
| commit | 82219fceeb654789a9dd7cd3c6cce12dbf659342 (patch) | |
| tree | d00570c185471efd2c53ceae5d6e509db0603cf8 | |
| parent | 3fa8749e584b55f1180411ab1b51117190bac1e5 (diff) | |
| parent | 0395e61babd59c749fb5efe112affbfaa7d50eb7 (diff) | |
Merge branch 'upstream-2.6.28' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev
* 'upstream-2.6.28' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev:
  ata_piix: IDE Mode SATA patch for Intel Ibex Peak DeviceIDs
  libata-eh: clear UNIT ATTENTION after reset
  ata_piix: add Hercules EC-900 mini-notebook to ich_laptop short cable list
  libata: reorder ata_device to remove 8 bytes of padding on 64 bits
  [libata] pata_bf54x: Add proper PM operation
  pata_sil680: convert CONFIG_PPC_MERGE to CONFIG_PPC
  libata: Implement disk shock protection support
  [libata] Introduce ata_id_has_unload()
  PATA: RPC now selects HAVE_PATA_PLATFORM for pata platform driver
  ata_piix: drop merged SCR access and use slave_link instead
  libata: implement slave_link
  libata: misc updates to prepare for slave link
  libata: reimplement link iterator
  libata: make SCR access ops per-link
| -rw-r--r-- | drivers/ata/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/ata/ahci.c | 25 | ||||
| -rw-r--r-- | drivers/ata/ata_piix.c | 184 | ||||
| -rw-r--r-- | drivers/ata/libata-core.c | 252 | ||||
| -rw-r--r-- | drivers/ata/libata-eh.c | 362 | ||||
| -rw-r--r-- | drivers/ata/libata-scsi.c | 108 | ||||
| -rw-r--r-- | drivers/ata/libata.h | 3 | ||||
| -rw-r--r-- | drivers/ata/pata_bf54x.c | 34 | ||||
| -rw-r--r-- | drivers/ata/pata_sil680.c | 2 | ||||
| -rw-r--r-- | drivers/ata/sata_fsl.c | 26 | ||||
| -rw-r--r-- | drivers/ata/sata_inic162x.c | 8 | ||||
| -rw-r--r-- | drivers/ata/sata_mv.c | 28 | ||||
| -rw-r--r-- | drivers/ata/sata_nv.c | 16 | ||||
| -rw-r--r-- | drivers/ata/sata_promise.c | 16 | ||||
| -rw-r--r-- | drivers/ata/sata_qstor.c | 12 | ||||
| -rw-r--r-- | drivers/ata/sata_sil.c | 16 | ||||
| -rw-r--r-- | drivers/ata/sata_sil24.c | 12 | ||||
| -rw-r--r-- | drivers/ata/sata_sis.c | 28 | ||||
| -rw-r--r-- | drivers/ata/sata_svw.c | 10 | ||||
| -rw-r--r-- | drivers/ata/sata_uli.c | 24 | ||||
| -rw-r--r-- | drivers/ata/sata_via.c | 24 | ||||
| -rw-r--r-- | drivers/ata/sata_vsc.c | 10 | ||||
| -rw-r--r-- | drivers/scsi/libsas/sas_ata.c | 8 | ||||
| -rw-r--r-- | include/linux/ata.h | 9 | ||||
| -rw-r--r-- | include/linux/libata.h | 66 | 
25 files changed, 923 insertions, 362 deletions
| diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig index 11c8c19f0fb7..f17cd4b572f8 100644 --- a/drivers/ata/Kconfig +++ b/drivers/ata/Kconfig | |||
| @@ -663,7 +663,7 @@ config HAVE_PATA_PLATFORM | |||
| 663 | 663 | ||
| 664 | config PATA_PLATFORM | 664 | config PATA_PLATFORM | 
| 665 | tristate "Generic platform device PATA support" | 665 | tristate "Generic platform device PATA support" | 
| 666 | depends on EMBEDDED || ARCH_RPC || PPC || HAVE_PATA_PLATFORM | 666 | depends on EMBEDDED || PPC || HAVE_PATA_PLATFORM | 
| 667 | help | 667 | help | 
| 668 | This option enables support for generic directly connected ATA | 668 | This option enables support for generic directly connected ATA | 
| 669 | devices commonly found on embedded systems. | 669 | devices commonly found on embedded systems. | 
| diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 2e1a7cb2ed5f..aeadd00411a1 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
| @@ -267,8 +267,8 @@ struct ahci_port_priv { | |||
| 267 | * per PM slot */ | 267 | * per PM slot */ | 
| 268 | }; | 268 | }; | 
| 269 | 269 | ||
| 270 | static int ahci_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val); | 270 | static int ahci_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val); | 
| 271 | static int ahci_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val); | 271 | static int ahci_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val); | 
| 272 | static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); | 272 | static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); | 
| 273 | static unsigned int ahci_qc_issue(struct ata_queued_cmd *qc); | 273 | static unsigned int ahci_qc_issue(struct ata_queued_cmd *qc); | 
| 274 | static bool ahci_qc_fill_rtf(struct ata_queued_cmd *qc); | 274 | static bool ahci_qc_fill_rtf(struct ata_queued_cmd *qc); | 
| @@ -316,6 +316,7 @@ static struct device_attribute *ahci_shost_attrs[] = { | |||
| 316 | 316 | ||
| 317 | static struct device_attribute *ahci_sdev_attrs[] = { | 317 | static struct device_attribute *ahci_sdev_attrs[] = { | 
| 318 | &dev_attr_sw_activity, | 318 | &dev_attr_sw_activity, | 
| 319 | &dev_attr_unload_heads, | ||
| 319 | NULL | 320 | NULL | 
| 320 | }; | 321 | }; | 
| 321 | 322 | ||
| @@ -820,10 +821,10 @@ static unsigned ahci_scr_offset(struct ata_port *ap, unsigned int sc_reg) | |||
| 820 | return 0; | 821 | return 0; | 
| 821 | } | 822 | } | 
| 822 | 823 | ||
| 823 | static int ahci_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) | 824 | static int ahci_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val) | 
| 824 | { | 825 | { | 
| 825 | void __iomem *port_mmio = ahci_port_base(ap); | 826 | void __iomem *port_mmio = ahci_port_base(link->ap); | 
| 826 | int offset = ahci_scr_offset(ap, sc_reg); | 827 | int offset = ahci_scr_offset(link->ap, sc_reg); | 
| 827 | 828 | ||
| 828 | if (offset) { | 829 | if (offset) { | 
| 829 | *val = readl(port_mmio + offset); | 830 | *val = readl(port_mmio + offset); | 
| @@ -832,10 +833,10 @@ static int ahci_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) | |||
| 832 | return -EINVAL; | 833 | return -EINVAL; | 
| 833 | } | 834 | } | 
| 834 | 835 | ||
| 835 | static int ahci_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val) | 836 | static int ahci_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val) | 
| 836 | { | 837 | { | 
| 837 | void __iomem *port_mmio = ahci_port_base(ap); | 838 | void __iomem *port_mmio = ahci_port_base(link->ap); | 
| 838 | int offset = ahci_scr_offset(ap, sc_reg); | 839 | int offset = ahci_scr_offset(link->ap, sc_reg); | 
| 839 | 840 | ||
| 840 | if (offset) { | 841 | if (offset) { | 
| 841 | writel(val, port_mmio + offset); | 842 | writel(val, port_mmio + offset); | 
| @@ -973,7 +974,7 @@ static void ahci_disable_alpm(struct ata_port *ap) | |||
| 973 | writel(PORT_IRQ_PHYRDY, port_mmio + PORT_IRQ_STAT); | 974 | writel(PORT_IRQ_PHYRDY, port_mmio + PORT_IRQ_STAT); | 
| 974 | 975 | ||
| 975 | /* go ahead and clean out PhyRdy Change from Serror too */ | 976 | /* go ahead and clean out PhyRdy Change from Serror too */ | 
| 976 | ahci_scr_write(ap, SCR_ERROR, ((1 << 16) | (1 << 18))); | 977 | ahci_scr_write(&ap->link, SCR_ERROR, ((1 << 16) | (1 << 18))); | 
| 977 | 978 | ||
| 978 | /* | 979 | /* | 
| 979 | * Clear flag to indicate that we should ignore all PhyRdy | 980 | * Clear flag to indicate that we should ignore all PhyRdy | 
| @@ -1937,8 +1938,8 @@ static void ahci_error_intr(struct ata_port *ap, u32 irq_stat) | |||
| 1937 | ata_ehi_push_desc(host_ehi, "irq_stat 0x%08x", irq_stat); | 1938 | ata_ehi_push_desc(host_ehi, "irq_stat 0x%08x", irq_stat); | 
| 1938 | 1939 | ||
| 1939 | /* AHCI needs SError cleared; otherwise, it might lock up */ | 1940 | /* AHCI needs SError cleared; otherwise, it might lock up */ | 
| 1940 | ahci_scr_read(ap, SCR_ERROR, &serror); | 1941 | ahci_scr_read(&ap->link, SCR_ERROR, &serror); | 
| 1941 | ahci_scr_write(ap, SCR_ERROR, serror); | 1942 | ahci_scr_write(&ap->link, SCR_ERROR, serror); | 
| 1942 | host_ehi->serror |= serror; | 1943 | host_ehi->serror |= serror; | 
| 1943 | 1944 | ||
| 1944 | /* some controllers set IRQ_IF_ERR on device errors, ignore it */ | 1945 | /* some controllers set IRQ_IF_ERR on device errors, ignore it */ | 
| @@ -2027,7 +2028,7 @@ static void ahci_port_intr(struct ata_port *ap) | |||
| 2027 | if ((hpriv->flags & AHCI_HFLAG_NO_HOTPLUG) && | 2028 | if ((hpriv->flags & AHCI_HFLAG_NO_HOTPLUG) && | 
| 2028 | (status & PORT_IRQ_PHYRDY)) { | 2029 | (status & PORT_IRQ_PHYRDY)) { | 
| 2029 | status &= ~PORT_IRQ_PHYRDY; | 2030 | status &= ~PORT_IRQ_PHYRDY; | 
| 2030 | ahci_scr_write(ap, SCR_ERROR, ((1 << 16) | (1 << 18))); | 2031 | ahci_scr_write(&ap->link, SCR_ERROR, ((1 << 16) | (1 << 18))); | 
| 2031 | } | 2032 | } | 
| 2032 | 2033 | ||
| 2033 | if (unlikely(status & PORT_IRQ_ERROR)) { | 2034 | if (unlikely(status & PORT_IRQ_ERROR)) { | 
| diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index e6b4606e36b6..e9e32ed6b1a3 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c | |||
| @@ -165,8 +165,10 @@ static void piix_set_dmamode(struct ata_port *ap, struct ata_device *adev); | |||
| 165 | static void ich_set_dmamode(struct ata_port *ap, struct ata_device *adev); | 165 | static void ich_set_dmamode(struct ata_port *ap, struct ata_device *adev); | 
| 166 | static int ich_pata_cable_detect(struct ata_port *ap); | 166 | static int ich_pata_cable_detect(struct ata_port *ap); | 
| 167 | static u8 piix_vmw_bmdma_status(struct ata_port *ap); | 167 | static u8 piix_vmw_bmdma_status(struct ata_port *ap); | 
| 168 | static int piix_sidpr_scr_read(struct ata_port *ap, unsigned int reg, u32 *val); | 168 | static int piix_sidpr_scr_read(struct ata_link *link, | 
| 169 | static int piix_sidpr_scr_write(struct ata_port *ap, unsigned int reg, u32 val); | 169 | unsigned int reg, u32 *val); | 
| 170 | static int piix_sidpr_scr_write(struct ata_link *link, | ||
| 171 | unsigned int reg, u32 val); | ||
| 170 | #ifdef CONFIG_PM | 172 | #ifdef CONFIG_PM | 
| 171 | static int piix_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg); | 173 | static int piix_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg); | 
| 172 | static int piix_pci_device_resume(struct pci_dev *pdev); | 174 | static int piix_pci_device_resume(struct pci_dev *pdev); | 
| @@ -278,12 +280,15 @@ static const struct pci_device_id piix_pci_tbl[] = { | |||
| 278 | /* SATA Controller IDE (PCH) */ | 280 | /* SATA Controller IDE (PCH) */ | 
| 279 | { 0x8086, 0x3b20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | 281 | { 0x8086, 0x3b20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | 
| 280 | /* SATA Controller IDE (PCH) */ | 282 | /* SATA Controller IDE (PCH) */ | 
| 283 | { 0x8086, 0x3b21, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | ||
| 284 | /* SATA Controller IDE (PCH) */ | ||
| 281 | { 0x8086, 0x3b26, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | 285 | { 0x8086, 0x3b26, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | 
| 282 | /* SATA Controller IDE (PCH) */ | 286 | /* SATA Controller IDE (PCH) */ | 
| 287 | { 0x8086, 0x3b28, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | ||
| 288 | /* SATA Controller IDE (PCH) */ | ||
| 283 | { 0x8086, 0x3b2d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | 289 | { 0x8086, 0x3b2d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | 
| 284 | /* SATA Controller IDE (PCH) */ | 290 | /* SATA Controller IDE (PCH) */ | 
| 285 | { 0x8086, 0x3b2e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | 291 | { 0x8086, 0x3b2e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | 
| 286 | |||
| 287 | { } /* terminate list */ | 292 | { } /* terminate list */ | 
| 288 | }; | 293 | }; | 
| 289 | 294 | ||
| @@ -582,6 +587,7 @@ static const struct ich_laptop ich_laptop[] = { | |||
| 582 | { 0x27DF, 0x1025, 0x0110 }, /* ICH7 on Acer 3682WLMi */ | 587 | { 0x27DF, 0x1025, 0x0110 }, /* ICH7 on Acer 3682WLMi */ | 
| 583 | { 0x27DF, 0x1043, 0x1267 }, /* ICH7 on Asus W5F */ | 588 | { 0x27DF, 0x1043, 0x1267 }, /* ICH7 on Asus W5F */ | 
| 584 | { 0x27DF, 0x103C, 0x30A1 }, /* ICH7 on HP Compaq nc2400 */ | 589 | { 0x27DF, 0x103C, 0x30A1 }, /* ICH7 on HP Compaq nc2400 */ | 
| 590 | { 0x27DF, 0x1071, 0xD221 }, /* ICH7 on Hercules EC-900 */ | ||
| 585 | { 0x24CA, 0x1025, 0x0061 }, /* ICH4 on ACER Aspire 2023WLMi */ | 591 | { 0x24CA, 0x1025, 0x0061 }, /* ICH4 on ACER Aspire 2023WLMi */ | 
| 586 | { 0x24CA, 0x1025, 0x003d }, /* ICH4 on ACER TM290 */ | 592 | { 0x24CA, 0x1025, 0x003d }, /* ICH4 on ACER TM290 */ | 
| 587 | { 0x266F, 0x1025, 0x0066 }, /* ICH6 on ACER Aspire 1694WLMi */ | 593 | { 0x266F, 0x1025, 0x0066 }, /* ICH6 on ACER Aspire 1694WLMi */ | 
| @@ -885,23 +891,9 @@ static void ich_set_dmamode(struct ata_port *ap, struct ata_device *adev) | |||
| 885 | * Serial ATA Index/Data Pair Superset Registers access | 891 | * Serial ATA Index/Data Pair Superset Registers access | 
| 886 | * | 892 | * | 
| 887 | * Beginning from ICH8, there's a sane way to access SCRs using index | 893 | * Beginning from ICH8, there's a sane way to access SCRs using index | 
| 888 | * and data register pair located at BAR5. This creates an | 894 | * and data register pair located at BAR5 which means that we have | 
| 889 | * interesting problem of mapping two SCRs to one port. | 895 | * separate SCRs for master and slave. This is handled using libata | 
| 890 | * | 896 | * slave_link facility. | 
| 891 | * Although they have separate SCRs, the master and slave aren't | ||
| 892 | * independent enough to be treated as separate links - e.g. softreset | ||
| 893 | * resets both. Also, there's no protocol defined for hard resetting | ||
| 894 | * singled device sharing the virtual port (no defined way to acquire | ||
| 895 | * device signature). This is worked around by merging the SCR values | ||
| 896 | * into one sensible value and requesting follow-up SRST after | ||
| 897 | * hardreset. | ||
| 898 | * | ||
| 899 | * SCR merging is perfomed in nibbles which is the unit contents in | ||
| 900 | * SCRs are organized. If two values are equal, the value is used. | ||
| 901 | * When they differ, merge table which lists precedence of possible | ||
| 902 | * values is consulted and the first match or the last entry when | ||
| 903 | * nothing matches is used. When there's no merge table for the | ||
| 904 | * specific nibble, value from the first port is used. | ||
| 905 | */ | 897 | */ | 
| 906 | static const int piix_sidx_map[] = { | 898 | static const int piix_sidx_map[] = { | 
| 907 | [SCR_STATUS] = 0, | 899 | [SCR_STATUS] = 0, | 
| @@ -909,120 +901,38 @@ static const int piix_sidx_map[] = { | |||
| 909 | [SCR_CONTROL] = 1, | 901 | [SCR_CONTROL] = 1, | 
| 910 | }; | 902 | }; | 
| 911 | 903 | ||
| 912 | static void piix_sidpr_sel(struct ata_device *dev, unsigned int reg) | 904 | static void piix_sidpr_sel(struct ata_link *link, unsigned int reg) | 
| 913 | { | 905 | { | 
| 914 | struct ata_port *ap = dev->link->ap; | 906 | struct ata_port *ap = link->ap; | 
| 915 | struct piix_host_priv *hpriv = ap->host->private_data; | 907 | struct piix_host_priv *hpriv = ap->host->private_data; | 
| 916 | 908 | ||
| 917 | iowrite32(((ap->port_no * 2 + dev->devno) << 8) | piix_sidx_map[reg], | 909 | iowrite32(((ap->port_no * 2 + link->pmp) << 8) | piix_sidx_map[reg], | 
| 918 | hpriv->sidpr + PIIX_SIDPR_IDX); | 910 | hpriv->sidpr + PIIX_SIDPR_IDX); | 
| 919 | } | 911 | } | 
| 920 | 912 | ||
| 921 | static int piix_sidpr_read(struct ata_device *dev, unsigned int reg) | 913 | static int piix_sidpr_scr_read(struct ata_link *link, | 
| 922 | { | 914 | unsigned int reg, u32 *val) | 
| 923 | struct piix_host_priv *hpriv = dev->link->ap->host->private_data; | ||
| 924 | |||
| 925 | piix_sidpr_sel(dev, reg); | ||
| 926 | return ioread32(hpriv->sidpr + PIIX_SIDPR_DATA); | ||
| 927 | } | ||
| 928 | |||
| 929 | static void piix_sidpr_write(struct ata_device *dev, unsigned int reg, u32 val) | ||
| 930 | { | ||
| 931 | struct piix_host_priv *hpriv = dev->link->ap->host->private_data; | ||
| 932 | |||
| 933 | piix_sidpr_sel(dev, reg); | ||
| 934 | iowrite32(val, hpriv->sidpr + PIIX_SIDPR_DATA); | ||
| 935 | } | ||
| 936 | |||
| 937 | static u32 piix_merge_scr(u32 val0, u32 val1, const int * const *merge_tbl) | ||
| 938 | { | ||
| 939 | u32 val = 0; | ||
| 940 | int i, mi; | ||
| 941 | |||
| 942 | for (i = 0, mi = 0; i < 32 / 4; i++) { | ||
| 943 | u8 c0 = (val0 >> (i * 4)) & 0xf; | ||
| 944 | u8 c1 = (val1 >> (i * 4)) & 0xf; | ||
| 945 | u8 merged = c0; | ||
| 946 | const int *cur; | ||
| 947 | |||
| 948 | /* if no merge preference, assume the first value */ | ||
| 949 | cur = merge_tbl[mi]; | ||
| 950 | if (!cur) | ||
| 951 | goto done; | ||
| 952 | mi++; | ||
| 953 | |||
| 954 | /* if two values equal, use it */ | ||
| 955 | if (c0 == c1) | ||
| 956 | goto done; | ||
| 957 | |||
| 958 | /* choose the first match or the last from the merge table */ | ||
| 959 | while (*cur != -1) { | ||
| 960 | if (c0 == *cur || c1 == *cur) | ||
| 961 | break; | ||
| 962 | cur++; | ||
| 963 | } | ||
| 964 | if (*cur == -1) | ||
| 965 | cur--; | ||
| 966 | merged = *cur; | ||
| 967 | done: | ||
| 968 | val |= merged << (i * 4); | ||
| 969 | } | ||
| 970 | |||
| 971 | return val; | ||
| 972 | } | ||
| 973 | |||
| 974 | static int piix_sidpr_scr_read(struct ata_port *ap, unsigned int reg, u32 *val) | ||
| 975 | { | 915 | { | 
| 976 | const int * const sstatus_merge_tbl[] = { | 916 | struct piix_host_priv *hpriv = link->ap->host->private_data; | 
| 977 | /* DET */ (const int []){ 1, 3, 0, 4, 3, -1 }, | ||
| 978 | /* SPD */ (const int []){ 2, 1, 0, -1 }, | ||
| 979 | /* IPM */ (const int []){ 6, 2, 1, 0, -1 }, | ||
| 980 | NULL, | ||
| 981 | }; | ||
| 982 | const int * const scontrol_merge_tbl[] = { | ||
| 983 | /* DET */ (const int []){ 1, 0, 4, 0, -1 }, | ||
| 984 | /* SPD */ (const int []){ 0, 2, 1, 0, -1 }, | ||
| 985 | /* IPM */ (const int []){ 0, 1, 2, 3, 0, -1 }, | ||
| 986 | NULL, | ||
| 987 | }; | ||
| 988 | u32 v0, v1; | ||
| 989 | 917 | ||
| 990 | if (reg >= ARRAY_SIZE(piix_sidx_map)) | 918 | if (reg >= ARRAY_SIZE(piix_sidx_map)) | 
| 991 | return -EINVAL; | 919 | return -EINVAL; | 
| 992 | 920 | ||
| 993 | if (!(ap->flags & ATA_FLAG_SLAVE_POSS)) { | 921 | piix_sidpr_sel(link, reg); | 
| 994 | *val = piix_sidpr_read(&ap->link.device[0], reg); | 922 | *val = ioread32(hpriv->sidpr + PIIX_SIDPR_DATA); | 
| 995 | return 0; | ||
| 996 | } | ||
| 997 | |||
| 998 | v0 = piix_sidpr_read(&ap->link.device[0], reg); | ||
| 999 | v1 = piix_sidpr_read(&ap->link.device[1], reg); | ||
| 1000 | |||
| 1001 | switch (reg) { | ||
| 1002 | case SCR_STATUS: | ||
| 1003 | *val = piix_merge_scr(v0, v1, sstatus_merge_tbl); | ||
| 1004 | break; | ||
| 1005 | case SCR_ERROR: | ||
| 1006 | *val = v0 | v1; | ||
| 1007 | break; | ||
| 1008 | case SCR_CONTROL: | ||
| 1009 | *val = piix_merge_scr(v0, v1, scontrol_merge_tbl); | ||
| 1010 | break; | ||
| 1011 | } | ||
| 1012 | |||
| 1013 | return 0; | 923 | return 0; | 
| 1014 | } | 924 | } | 
| 1015 | 925 | ||
| 1016 | static int piix_sidpr_scr_write(struct ata_port *ap, unsigned int reg, u32 val) | 926 | static int piix_sidpr_scr_write(struct ata_link *link, | 
| 927 | unsigned int reg, u32 val) | ||
| 1017 | { | 928 | { | 
| 929 | struct piix_host_priv *hpriv = link->ap->host->private_data; | ||
| 930 | |||
| 1018 | if (reg >= ARRAY_SIZE(piix_sidx_map)) | 931 | if (reg >= ARRAY_SIZE(piix_sidx_map)) | 
| 1019 | return -EINVAL; | 932 | return -EINVAL; | 
| 1020 | 933 | ||
| 1021 | piix_sidpr_write(&ap->link.device[0], reg, val); | 934 | piix_sidpr_sel(link, reg); | 
| 1022 | 935 | iowrite32(val, hpriv->sidpr + PIIX_SIDPR_DATA); | |
| 1023 | if (ap->flags & ATA_FLAG_SLAVE_POSS) | ||
| 1024 | piix_sidpr_write(&ap->link.device[1], reg, val); | ||
| 1025 | |||
| 1026 | return 0; | 936 | return 0; | 
| 1027 | } | 937 | } | 
| 1028 | 938 | ||
| @@ -1363,28 +1273,28 @@ static const int *__devinit piix_init_sata_map(struct pci_dev *pdev, | |||
| 1363 | return map; | 1273 | return map; | 
| 1364 | } | 1274 | } | 
| 1365 | 1275 | ||
| 1366 | static void __devinit piix_init_sidpr(struct ata_host *host) | 1276 | static int __devinit piix_init_sidpr(struct ata_host *host) | 
| 1367 | { | 1277 | { | 
| 1368 | struct pci_dev *pdev = to_pci_dev(host->dev); | 1278 | struct pci_dev *pdev = to_pci_dev(host->dev); | 
| 1369 | struct piix_host_priv *hpriv = host->private_data; | 1279 | struct piix_host_priv *hpriv = host->private_data; | 
| 1370 | struct ata_device *dev0 = &host->ports[0]->link.device[0]; | 1280 | struct ata_link *link0 = &host->ports[0]->link; | 
| 1371 | u32 scontrol; | 1281 | u32 scontrol; | 
| 1372 | int i; | 1282 | int i, rc; | 
| 1373 | 1283 | ||
| 1374 | /* check for availability */ | 1284 | /* check for availability */ | 
| 1375 | for (i = 0; i < 4; i++) | 1285 | for (i = 0; i < 4; i++) | 
| 1376 | if (hpriv->map[i] == IDE) | 1286 | if (hpriv->map[i] == IDE) | 
| 1377 | return; | 1287 | return 0; | 
| 1378 | 1288 | ||
| 1379 | if (!(host->ports[0]->flags & PIIX_FLAG_SIDPR)) | 1289 | if (!(host->ports[0]->flags & PIIX_FLAG_SIDPR)) | 
| 1380 | return; | 1290 | return 0; | 
| 1381 | 1291 | ||
| 1382 | if (pci_resource_start(pdev, PIIX_SIDPR_BAR) == 0 || | 1292 | if (pci_resource_start(pdev, PIIX_SIDPR_BAR) == 0 || | 
| 1383 | pci_resource_len(pdev, PIIX_SIDPR_BAR) != PIIX_SIDPR_LEN) | 1293 | pci_resource_len(pdev, PIIX_SIDPR_BAR) != PIIX_SIDPR_LEN) | 
| 1384 | return; | 1294 | return 0; | 
| 1385 | 1295 | ||
| 1386 | if (pcim_iomap_regions(pdev, 1 << PIIX_SIDPR_BAR, DRV_NAME)) | 1296 | if (pcim_iomap_regions(pdev, 1 << PIIX_SIDPR_BAR, DRV_NAME)) | 
| 1387 | return; | 1297 | return 0; | 
| 1388 | 1298 | ||
| 1389 | hpriv->sidpr = pcim_iomap_table(pdev)[PIIX_SIDPR_BAR]; | 1299 | hpriv->sidpr = pcim_iomap_table(pdev)[PIIX_SIDPR_BAR]; | 
| 1390 | 1300 | ||
| @@ -1392,7 +1302,7 @@ static void __devinit piix_init_sidpr(struct ata_host *host) | |||
| 1392 | * Give it a test drive by inhibiting power save modes which | 1302 | * Give it a test drive by inhibiting power save modes which | 
| 1393 | * we'll do anyway. | 1303 | * we'll do anyway. | 
| 1394 | */ | 1304 | */ | 
| 1395 | scontrol = piix_sidpr_read(dev0, SCR_CONTROL); | 1305 | piix_sidpr_scr_read(link0, SCR_CONTROL, &scontrol); | 
| 1396 | 1306 | ||
| 1397 | /* if IPM is already 3, SCR access is probably working. Don't | 1307 | /* if IPM is already 3, SCR access is probably working. Don't | 
| 1398 | * un-inhibit power save modes as BIOS might have inhibited | 1308 | * un-inhibit power save modes as BIOS might have inhibited | 
| @@ -1400,18 +1310,30 @@ static void __devinit piix_init_sidpr(struct ata_host *host) | |||
| 1400 | */ | 1310 | */ | 
| 1401 | if ((scontrol & 0xf00) != 0x300) { | 1311 | if ((scontrol & 0xf00) != 0x300) { | 
| 1402 | scontrol |= 0x300; | 1312 | scontrol |= 0x300; | 
| 1403 | piix_sidpr_write(dev0, SCR_CONTROL, scontrol); | 1313 | piix_sidpr_scr_write(link0, SCR_CONTROL, scontrol); | 
| 1404 | scontrol = piix_sidpr_read(dev0, SCR_CONTROL); | 1314 | piix_sidpr_scr_read(link0, SCR_CONTROL, &scontrol); | 
| 1405 | 1315 | ||
| 1406 | if ((scontrol & 0xf00) != 0x300) { | 1316 | if ((scontrol & 0xf00) != 0x300) { | 
| 1407 | dev_printk(KERN_INFO, host->dev, "SCR access via " | 1317 | dev_printk(KERN_INFO, host->dev, "SCR access via " | 
| 1408 | "SIDPR is available but doesn't work\n"); | 1318 | "SIDPR is available but doesn't work\n"); | 
| 1409 | return; | 1319 | return 0; | 
| 1410 | } | 1320 | } | 
| 1411 | } | 1321 | } | 
| 1412 | 1322 | ||
| 1413 | host->ports[0]->ops = &piix_sidpr_sata_ops; | 1323 | /* okay, SCRs available, set ops and ask libata for slave_link */ | 
| 1414 | host->ports[1]->ops = &piix_sidpr_sata_ops; | 1324 | for (i = 0; i < 2; i++) { | 
| 1325 | struct ata_port *ap = host->ports[i]; | ||
| 1326 | |||
| 1327 | ap->ops = &piix_sidpr_sata_ops; | ||
| 1328 | |||
| 1329 | if (ap->flags & ATA_FLAG_SLAVE_POSS) { | ||
| 1330 | rc = ata_slave_link_init(ap); | ||
| 1331 | if (rc) | ||
| 1332 | return rc; | ||
| 1333 | } | ||
| 1334 | } | ||
| 1335 | |||
| 1336 | return 0; | ||
| 1415 | } | 1337 | } | 
| 1416 | 1338 | ||
| 1417 | static void piix_iocfg_bit18_quirk(struct pci_dev *pdev) | 1339 | static void piix_iocfg_bit18_quirk(struct pci_dev *pdev) | 
| @@ -1521,7 +1443,9 @@ static int __devinit piix_init_one(struct pci_dev *pdev, | |||
| 1521 | /* initialize controller */ | 1443 | /* initialize controller */ | 
| 1522 | if (port_flags & ATA_FLAG_SATA) { | 1444 | if (port_flags & ATA_FLAG_SATA) { | 
| 1523 | piix_init_pcs(host, piix_map_db_table[ent->driver_data]); | 1445 | piix_init_pcs(host, piix_map_db_table[ent->driver_data]); | 
| 1524 | piix_init_sidpr(host); | 1446 | rc = piix_init_sidpr(host); | 
| 1447 | if (rc) | ||
| 1448 | return rc; | ||
| 1525 | } | 1449 | } | 
| 1526 | 1450 | ||
| 1527 | /* apply IOCFG bit18 quirk */ | 1451 | /* apply IOCFG bit18 quirk */ | 
| diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 79e3a8e7a84a..1ee9499bd343 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
| @@ -163,6 +163,67 @@ MODULE_LICENSE("GPL"); | |||
| 163 | MODULE_VERSION(DRV_VERSION); | 163 | MODULE_VERSION(DRV_VERSION); | 
| 164 | 164 | ||
| 165 | 165 | ||
| 166 | /* | ||
| 167 | * Iterator helpers. Don't use directly. | ||
| 168 | * | ||
| 169 | * LOCKING: | ||
| 170 | * Host lock or EH context. | ||
| 171 | */ | ||
| 172 | struct ata_link *__ata_port_next_link(struct ata_port *ap, | ||
| 173 | struct ata_link *link, bool dev_only) | ||
| 174 | { | ||
| 175 | /* NULL link indicates start of iteration */ | ||
| 176 | if (!link) { | ||
| 177 | if (dev_only && sata_pmp_attached(ap)) | ||
| 178 | return ap->pmp_link; | ||
| 179 | return &ap->link; | ||
| 180 | } | ||
| 181 | |||
| 182 | /* we just iterated over the host master link, what's next? */ | ||
| 183 | if (link == &ap->link) { | ||
| 184 | if (!sata_pmp_attached(ap)) { | ||
| 185 | if (unlikely(ap->slave_link) && !dev_only) | ||
| 186 | return ap->slave_link; | ||
| 187 | return NULL; | ||
| 188 | } | ||
| 189 | return ap->pmp_link; | ||
| 190 | } | ||
| 191 | |||
| 192 | /* slave_link excludes PMP */ | ||
| 193 | if (unlikely(link == ap->slave_link)) | ||
| 194 | return NULL; | ||
| 195 | |||
| 196 | /* iterate to the next PMP link */ | ||
| 197 | if (++link < ap->pmp_link + ap->nr_pmp_links) | ||
| 198 | return link; | ||
| 199 | return NULL; | ||
| 200 | } | ||
| 201 | |||
| 202 | /** | ||
| 203 | * ata_dev_phys_link - find physical link for a device | ||
| 204 | * @dev: ATA device to look up physical link for | ||
| 205 | * | ||
| 206 | * Look up physical link which @dev is attached to. Note that | ||
| 207 | * this is different from @dev->link only when @dev is on slave | ||
| 208 | * link. For all other cases, it's the same as @dev->link. | ||
| 209 | * | ||
| 210 | * LOCKING: | ||
| 211 | * Don't care. | ||
| 212 | * | ||
| 213 | * RETURNS: | ||
| 214 | * Pointer to the found physical link. | ||
| 215 | */ | ||
| 216 | struct ata_link *ata_dev_phys_link(struct ata_device *dev) | ||
| 217 | { | ||
| 218 | struct ata_port *ap = dev->link->ap; | ||
| 219 | |||
| 220 | if (!ap->slave_link) | ||
| 221 | return dev->link; | ||
| 222 | if (!dev->devno) | ||
| 223 | return &ap->link; | ||
| 224 | return ap->slave_link; | ||
| 225 | } | ||
| 226 | |||
| 166 | /** | 227 | /** | 
| 167 | * ata_force_cbl - force cable type according to libata.force | 228 | * ata_force_cbl - force cable type according to libata.force | 
| 168 | * @ap: ATA port of interest | 229 | * @ap: ATA port of interest | 
| @@ -206,7 +267,8 @@ void ata_force_cbl(struct ata_port *ap) | |||
| 206 | * the host link and all fan-out ports connected via PMP. If the | 267 | * the host link and all fan-out ports connected via PMP. If the | 
| 207 | * device part is specified as 0 (e.g. 1.00:), it specifies the | 268 | * device part is specified as 0 (e.g. 1.00:), it specifies the | 
| 208 | * first fan-out link not the host link. Device number 15 always | 269 | * first fan-out link not the host link. Device number 15 always | 
| 209 | * points to the host link whether PMP is attached or not. | 270 | * points to the host link whether PMP is attached or not. If the | 
| 271 | * controller has slave link, device number 16 points to it. | ||
| 210 | * | 272 | * | 
| 211 | * LOCKING: | 273 | * LOCKING: | 
| 212 | * EH context. | 274 | * EH context. | 
| @@ -214,12 +276,11 @@ void ata_force_cbl(struct ata_port *ap) | |||
| 214 | static void ata_force_link_limits(struct ata_link *link) | 276 | static void ata_force_link_limits(struct ata_link *link) | 
| 215 | { | 277 | { | 
| 216 | bool did_spd = false; | 278 | bool did_spd = false; | 
| 217 | int linkno, i; | 279 | int linkno = link->pmp; | 
| 280 | int i; | ||
| 218 | 281 | ||
| 219 | if (ata_is_host_link(link)) | 282 | if (ata_is_host_link(link)) | 
| 220 | linkno = 15; | 283 | linkno += 15; | 
| 221 | else | ||
| 222 | linkno = link->pmp; | ||
| 223 | 284 | ||
| 224 | for (i = ata_force_tbl_size - 1; i >= 0; i--) { | 285 | for (i = ata_force_tbl_size - 1; i >= 0; i--) { | 
| 225 | const struct ata_force_ent *fe = &ata_force_tbl[i]; | 286 | const struct ata_force_ent *fe = &ata_force_tbl[i]; | 
| @@ -266,9 +327,9 @@ static void ata_force_xfermask(struct ata_device *dev) | |||
| 266 | int alt_devno = devno; | 327 | int alt_devno = devno; | 
| 267 | int i; | 328 | int i; | 
| 268 | 329 | ||
| 269 | /* allow n.15 for the first device attached to host port */ | 330 | /* allow n.15/16 for devices attached to host port */ | 
| 270 | if (ata_is_host_link(dev->link) && devno == 0) | 331 | if (ata_is_host_link(dev->link)) | 
| 271 | alt_devno = 15; | 332 | alt_devno += 15; | 
| 272 | 333 | ||
| 273 | for (i = ata_force_tbl_size - 1; i >= 0; i--) { | 334 | for (i = ata_force_tbl_size - 1; i >= 0; i--) { | 
| 274 | const struct ata_force_ent *fe = &ata_force_tbl[i]; | 335 | const struct ata_force_ent *fe = &ata_force_tbl[i]; | 
| @@ -320,9 +381,9 @@ static void ata_force_horkage(struct ata_device *dev) | |||
| 320 | int alt_devno = devno; | 381 | int alt_devno = devno; | 
| 321 | int i; | 382 | int i; | 
| 322 | 383 | ||
| 323 | /* allow n.15 for the first device attached to host port */ | 384 | /* allow n.15/16 for devices attached to host port */ | 
| 324 | if (ata_is_host_link(dev->link) && devno == 0) | 385 | if (ata_is_host_link(dev->link)) | 
| 325 | alt_devno = 15; | 386 | alt_devno += 15; | 
| 326 | 387 | ||
| 327 | for (i = 0; i < ata_force_tbl_size; i++) { | 388 | for (i = 0; i < ata_force_tbl_size; i++) { | 
| 328 | const struct ata_force_ent *fe = &ata_force_tbl[i]; | 389 | const struct ata_force_ent *fe = &ata_force_tbl[i]; | 
| @@ -2681,7 +2742,7 @@ static void sata_print_link_status(struct ata_link *link) | |||
| 2681 | return; | 2742 | return; | 
| 2682 | sata_scr_read(link, SCR_CONTROL, &scontrol); | 2743 | sata_scr_read(link, SCR_CONTROL, &scontrol); | 
| 2683 | 2744 | ||
| 2684 | if (ata_link_online(link)) { | 2745 | if (ata_phys_link_online(link)) { | 
| 2685 | tmp = (sstatus >> 4) & 0xf; | 2746 | tmp = (sstatus >> 4) & 0xf; | 
| 2686 | ata_link_printk(link, KERN_INFO, | 2747 | ata_link_printk(link, KERN_INFO, | 
| 2687 | "SATA link up %s (SStatus %X SControl %X)\n", | 2748 | "SATA link up %s (SStatus %X SControl %X)\n", | 
| @@ -3372,6 +3433,12 @@ int ata_wait_ready(struct ata_link *link, unsigned long deadline, | |||
| 3372 | unsigned long nodev_deadline = ata_deadline(start, ATA_TMOUT_FF_WAIT); | 3433 | unsigned long nodev_deadline = ata_deadline(start, ATA_TMOUT_FF_WAIT); | 
| 3373 | int warned = 0; | 3434 | int warned = 0; | 
| 3374 | 3435 | ||
| 3436 | /* Slave readiness can't be tested separately from master. On | ||
| 3437 | * M/S emulation configuration, this function should be called | ||
| 3438 | * only on the master and it will handle both master and slave. | ||
| 3439 | */ | ||
| 3440 | WARN_ON(link == link->ap->slave_link); | ||
| 3441 | |||
| 3375 | if (time_after(nodev_deadline, deadline)) | 3442 | if (time_after(nodev_deadline, deadline)) | 
| 3376 | nodev_deadline = deadline; | 3443 | nodev_deadline = deadline; | 
| 3377 | 3444 | ||
| @@ -3593,7 +3660,7 @@ int ata_std_prereset(struct ata_link *link, unsigned long deadline) | |||
| 3593 | } | 3660 | } | 
| 3594 | 3661 | ||
| 3595 | /* no point in trying softreset on offline link */ | 3662 | /* no point in trying softreset on offline link */ | 
| 3596 | if (ata_link_offline(link)) | 3663 | if (ata_phys_link_offline(link)) | 
| 3597 | ehc->i.action &= ~ATA_EH_SOFTRESET; | 3664 | ehc->i.action &= ~ATA_EH_SOFTRESET; | 
| 3598 | 3665 | ||
| 3599 | return 0; | 3666 | return 0; | 
| @@ -3671,7 +3738,7 @@ int sata_link_hardreset(struct ata_link *link, const unsigned long *timing, | |||
| 3671 | if (rc) | 3738 | if (rc) | 
| 3672 | goto out; | 3739 | goto out; | 
| 3673 | /* if link is offline nothing more to do */ | 3740 | /* if link is offline nothing more to do */ | 
| 3674 | if (ata_link_offline(link)) | 3741 | if (ata_phys_link_offline(link)) | 
| 3675 | goto out; | 3742 | goto out; | 
| 3676 | 3743 | ||
| 3677 | /* Link is online. From this point, -ENODEV too is an error. */ | 3744 | /* Link is online. From this point, -ENODEV too is an error. */ | 
| @@ -4868,10 +4935,8 @@ int sata_scr_valid(struct ata_link *link) | |||
| 4868 | int sata_scr_read(struct ata_link *link, int reg, u32 *val) | 4935 | int sata_scr_read(struct ata_link *link, int reg, u32 *val) | 
| 4869 | { | 4936 | { | 
| 4870 | if (ata_is_host_link(link)) { | 4937 | if (ata_is_host_link(link)) { | 
| 4871 | struct ata_port *ap = link->ap; | ||
| 4872 | |||
| 4873 | if (sata_scr_valid(link)) | 4938 | if (sata_scr_valid(link)) | 
| 4874 | return ap->ops->scr_read(ap, reg, val); | 4939 | return link->ap->ops->scr_read(link, reg, val); | 
| 4875 | return -EOPNOTSUPP; | 4940 | return -EOPNOTSUPP; | 
| 4876 | } | 4941 | } | 
| 4877 | 4942 | ||
| @@ -4897,10 +4962,8 @@ int sata_scr_read(struct ata_link *link, int reg, u32 *val) | |||
| 4897 | int sata_scr_write(struct ata_link *link, int reg, u32 val) | 4962 | int sata_scr_write(struct ata_link *link, int reg, u32 val) | 
| 4898 | { | 4963 | { | 
| 4899 | if (ata_is_host_link(link)) { | 4964 | if (ata_is_host_link(link)) { | 
| 4900 | struct ata_port *ap = link->ap; | ||
| 4901 | |||
| 4902 | if (sata_scr_valid(link)) | 4965 | if (sata_scr_valid(link)) | 
| 4903 | return ap->ops->scr_write(ap, reg, val); | 4966 | return link->ap->ops->scr_write(link, reg, val); | 
| 4904 | return -EOPNOTSUPP; | 4967 | return -EOPNOTSUPP; | 
| 4905 | } | 4968 | } | 
| 4906 | 4969 | ||
| @@ -4925,13 +4988,12 @@ int sata_scr_write(struct ata_link *link, int reg, u32 val) | |||
| 4925 | int sata_scr_write_flush(struct ata_link *link, int reg, u32 val) | 4988 | int sata_scr_write_flush(struct ata_link *link, int reg, u32 val) | 
| 4926 | { | 4989 | { | 
| 4927 | if (ata_is_host_link(link)) { | 4990 | if (ata_is_host_link(link)) { | 
| 4928 | struct ata_port *ap = link->ap; | ||
| 4929 | int rc; | 4991 | int rc; | 
| 4930 | 4992 | ||
| 4931 | if (sata_scr_valid(link)) { | 4993 | if (sata_scr_valid(link)) { | 
| 4932 | rc = ap->ops->scr_write(ap, reg, val); | 4994 | rc = link->ap->ops->scr_write(link, reg, val); | 
| 4933 | if (rc == 0) | 4995 | if (rc == 0) | 
| 4934 | rc = ap->ops->scr_read(ap, reg, &val); | 4996 | rc = link->ap->ops->scr_read(link, reg, &val); | 
| 4935 | return rc; | 4997 | return rc; | 
| 4936 | } | 4998 | } | 
| 4937 | return -EOPNOTSUPP; | 4999 | return -EOPNOTSUPP; | 
| @@ -4941,7 +5003,7 @@ int sata_scr_write_flush(struct ata_link *link, int reg, u32 val) | |||
| 4941 | } | 5003 | } | 
| 4942 | 5004 | ||
| 4943 | /** | 5005 | /** | 
| 4944 | * ata_link_online - test whether the given link is online | 5006 | * ata_phys_link_online - test whether the given link is online | 
| 4945 | * @link: ATA link to test | 5007 | * @link: ATA link to test | 
| 4946 | * | 5008 | * | 
| 4947 | * Test whether @link is online. Note that this function returns | 5009 | * Test whether @link is online. Note that this function returns | 
| @@ -4952,20 +5014,20 @@ int sata_scr_write_flush(struct ata_link *link, int reg, u32 val) | |||
| 4952 | * None. | 5014 | * None. | 
| 4953 | * | 5015 | * | 
| 4954 | * RETURNS: | 5016 | * RETURNS: | 
| 4955 | * 1 if the port online status is available and online. | 5017 | * True if the port online status is available and online. | 
| 4956 | */ | 5018 | */ | 
| 4957 | int ata_link_online(struct ata_link *link) | 5019 | bool ata_phys_link_online(struct ata_link *link) | 
| 4958 | { | 5020 | { | 
| 4959 | u32 sstatus; | 5021 | u32 sstatus; | 
| 4960 | 5022 | ||
| 4961 | if (sata_scr_read(link, SCR_STATUS, &sstatus) == 0 && | 5023 | if (sata_scr_read(link, SCR_STATUS, &sstatus) == 0 && | 
| 4962 | (sstatus & 0xf) == 0x3) | 5024 | (sstatus & 0xf) == 0x3) | 
| 4963 | return 1; | 5025 | return true; | 
| 4964 | return 0; | 5026 | return false; | 
| 4965 | } | 5027 | } | 
| 4966 | 5028 | ||
| 4967 | /** | 5029 | /** | 
| 4968 | * ata_link_offline - test whether the given link is offline | 5030 | * ata_phys_link_offline - test whether the given link is offline | 
| 4969 | * @link: ATA link to test | 5031 | * @link: ATA link to test | 
| 4970 | * | 5032 | * | 
| 4971 | * Test whether @link is offline. Note that this function | 5033 | * Test whether @link is offline. Note that this function | 
| @@ -4976,16 +5038,68 @@ int ata_link_online(struct ata_link *link) | |||
| 4976 | * None. | 5038 | * None. | 
| 4977 | * | 5039 | * | 
| 4978 | * RETURNS: | 5040 | * RETURNS: | 
| 4979 | * 1 if the port offline status is available and offline. | 5041 | * True if the port offline status is available and offline. | 
| 4980 | */ | 5042 | */ | 
| 4981 | int ata_link_offline(struct ata_link *link) | 5043 | bool ata_phys_link_offline(struct ata_link *link) | 
| 4982 | { | 5044 | { | 
| 4983 | u32 sstatus; | 5045 | u32 sstatus; | 
| 4984 | 5046 | ||
| 4985 | if (sata_scr_read(link, SCR_STATUS, &sstatus) == 0 && | 5047 | if (sata_scr_read(link, SCR_STATUS, &sstatus) == 0 && | 
| 4986 | (sstatus & 0xf) != 0x3) | 5048 | (sstatus & 0xf) != 0x3) | 
| 4987 | return 1; | 5049 | return true; | 
| 4988 | return 0; | 5050 | return false; | 
| 5051 | } | ||
| 5052 | |||
| 5053 | /** | ||
| 5054 | * ata_link_online - test whether the given link is online | ||
| 5055 | * @link: ATA link to test | ||
| 5056 | * | ||
| 5057 | * Test whether @link is online. This is identical to | ||
| 5058 | * ata_phys_link_online() when there's no slave link. When | ||
| 5059 | * there's a slave link, this function should only be called on | ||
| 5060 | * the master link and will return true if any of M/S links is | ||
| 5061 | * online. | ||
| 5062 | * | ||
| 5063 | * LOCKING: | ||
| 5064 | * None. | ||
| 5065 | * | ||
| 5066 | * RETURNS: | ||
| 5067 | * True if the port online status is available and online. | ||
| 5068 | */ | ||
| 5069 | bool ata_link_online(struct ata_link *link) | ||
| 5070 | { | ||
| 5071 | struct ata_link *slave = link->ap->slave_link; | ||
| 5072 | |||
| 5073 | WARN_ON(link == slave); /* shouldn't be called on slave link */ | ||
| 5074 | |||
| 5075 | return ata_phys_link_online(link) || | ||
| 5076 | (slave && ata_phys_link_online(slave)); | ||
| 5077 | } | ||
| 5078 | |||
| 5079 | /** | ||
| 5080 | * ata_link_offline - test whether the given link is offline | ||
| 5081 | * @link: ATA link to test | ||
| 5082 | * | ||
| 5083 | * Test whether @link is offline. This is identical to | ||
| 5084 | * ata_phys_link_offline() when there's no slave link. When | ||
| 5085 | * there's a slave link, this function should only be called on | ||
| 5086 | * the master link and will return true if both M/S links are | ||
| 5087 | * offline. | ||
| 5088 | * | ||
| 5089 | * LOCKING: | ||
| 5090 | * None. | ||
| 5091 | * | ||
| 5092 | * RETURNS: | ||
| 5093 | * True if the port offline status is available and offline. | ||
| 5094 | */ | ||
| 5095 | bool ata_link_offline(struct ata_link *link) | ||
| 5096 | { | ||
| 5097 | struct ata_link *slave = link->ap->slave_link; | ||
| 5098 | |||
| 5099 | WARN_ON(link == slave); /* shouldn't be called on slave link */ | ||
| 5100 | |||
| 5101 | return ata_phys_link_offline(link) && | ||
| 5102 | (!slave || ata_phys_link_offline(slave)); | ||
| 4989 | } | 5103 | } | 
| 4990 | 5104 | ||
| 4991 | #ifdef CONFIG_PM | 5105 | #ifdef CONFIG_PM | 
| @@ -5127,11 +5241,11 @@ int ata_port_start(struct ata_port *ap) | |||
| 5127 | */ | 5241 | */ | 
| 5128 | void ata_dev_init(struct ata_device *dev) | 5242 | void ata_dev_init(struct ata_device *dev) | 
| 5129 | { | 5243 | { | 
| 5130 | struct ata_link *link = dev->link; | 5244 | struct ata_link *link = ata_dev_phys_link(dev); | 
| 5131 | struct ata_port *ap = link->ap; | 5245 | struct ata_port *ap = link->ap; | 
| 5132 | unsigned long flags; | 5246 | unsigned long flags; | 
| 5133 | 5247 | ||
| 5134 | /* SATA spd limit is bound to the first device */ | 5248 | /* SATA spd limit is bound to the attached device, reset together */ | 
| 5135 | link->sata_spd_limit = link->hw_sata_spd_limit; | 5249 | link->sata_spd_limit = link->hw_sata_spd_limit; | 
| 5136 | link->sata_spd = 0; | 5250 | link->sata_spd = 0; | 
| 5137 | 5251 | ||
| @@ -5264,6 +5378,7 @@ struct ata_port *ata_port_alloc(struct ata_host *host) | |||
| 5264 | INIT_WORK(&ap->scsi_rescan_task, ata_scsi_dev_rescan); | 5378 | INIT_WORK(&ap->scsi_rescan_task, ata_scsi_dev_rescan); | 
| 5265 | INIT_LIST_HEAD(&ap->eh_done_q); | 5379 | INIT_LIST_HEAD(&ap->eh_done_q); | 
| 5266 | init_waitqueue_head(&ap->eh_wait_q); | 5380 | init_waitqueue_head(&ap->eh_wait_q); | 
| 5381 | init_completion(&ap->park_req_pending); | ||
| 5267 | init_timer_deferrable(&ap->fastdrain_timer); | 5382 | init_timer_deferrable(&ap->fastdrain_timer); | 
| 5268 | ap->fastdrain_timer.function = ata_eh_fastdrain_timerfn; | 5383 | ap->fastdrain_timer.function = ata_eh_fastdrain_timerfn; | 
| 5269 | ap->fastdrain_timer.data = (unsigned long)ap; | 5384 | ap->fastdrain_timer.data = (unsigned long)ap; | 
| @@ -5294,6 +5409,7 @@ static void ata_host_release(struct device *gendev, void *res) | |||
| 5294 | scsi_host_put(ap->scsi_host); | 5409 | scsi_host_put(ap->scsi_host); | 
| 5295 | 5410 | ||
| 5296 | kfree(ap->pmp_link); | 5411 | kfree(ap->pmp_link); | 
| 5412 | kfree(ap->slave_link); | ||
| 5297 | kfree(ap); | 5413 | kfree(ap); | 
| 5298 | host->ports[i] = NULL; | 5414 | host->ports[i] = NULL; | 
| 5299 | } | 5415 | } | 
| @@ -5414,6 +5530,68 @@ struct ata_host *ata_host_alloc_pinfo(struct device *dev, | |||
| 5414 | return host; | 5530 | return host; | 
| 5415 | } | 5531 | } | 
| 5416 | 5532 | ||
| 5533 | /** | ||
| 5534 | * ata_slave_link_init - initialize slave link | ||
| 5535 | * @ap: port to initialize slave link for | ||
| 5536 | * | ||
| 5537 | * Create and initialize slave link for @ap. This enables slave | ||
| 5538 | * link handling on the port. | ||
| 5539 | * | ||
| 5540 | * In libata, a port contains links and a link contains devices. | ||
| 5541 | * There is single host link but if a PMP is attached to it, | ||
| 5542 | * there can be multiple fan-out links. On SATA, there's usually | ||
| 5543 | * a single device connected to a link but PATA and SATA | ||
| 5544 | * controllers emulating TF based interface can have two - master | ||
| 5545 | * and slave. | ||
| 5546 | * | ||
| 5547 | * However, there are a few controllers which don't fit into this | ||
| 5548 | * abstraction too well - SATA controllers which emulate TF | ||
| 5549 | * interface with both master and slave devices but also have | ||
| 5550 | * separate SCR register sets for each device. These controllers | ||
| 5551 | * need separate links for physical link handling | ||
| 5552 | * (e.g. onlineness, link speed) but should be treated like a | ||
| 5553 | * traditional M/S controller for everything else (e.g. command | ||
| 5554 | * issue, softreset). | ||
| 5555 | * | ||
| 5556 | * slave_link is libata's way of handling this class of | ||
| 5557 | * controllers without impacting core layer too much. For | ||
| 5558 | * anything other than physical link handling, the default host | ||
| 5559 | * link is used for both master and slave. For physical link | ||
| 5560 | * handling, separate @ap->slave_link is used. All dirty details | ||
| 5561 | * are implemented inside libata core layer. From LLD's POV, the | ||
| 5562 | * only difference is that prereset, hardreset and postreset are | ||
| 5563 | * called once more for the slave link, so the reset sequence | ||
| 5564 | * looks like the following. | ||
| 5565 | * | ||
| 5566 | * prereset(M) -> prereset(S) -> hardreset(M) -> hardreset(S) -> | ||
| 5567 | * softreset(M) -> postreset(M) -> postreset(S) | ||
| 5568 | * | ||
| 5569 | * Note that softreset is called only for the master. Softreset | ||
| 5570 | * resets both M/S by definition, so SRST on master should handle | ||
| 5571 | * both (the standard method will work just fine). | ||
| 5572 | * | ||
| 5573 | * LOCKING: | ||
| 5574 | * Should be called before host is registered. | ||
| 5575 | * | ||
| 5576 | * RETURNS: | ||
| 5577 | * 0 on success, -errno on failure. | ||
| 5578 | */ | ||
| 5579 | int ata_slave_link_init(struct ata_port *ap) | ||
| 5580 | { | ||
| 5581 | struct ata_link *link; | ||
| 5582 | |||
| 5583 | WARN_ON(ap->slave_link); | ||
| 5584 | WARN_ON(ap->flags & ATA_FLAG_PMP); | ||
| 5585 | |||
| 5586 | link = kzalloc(sizeof(*link), GFP_KERNEL); | ||
| 5587 | if (!link) | ||
| 5588 | return -ENOMEM; | ||
| 5589 | |||
| 5590 | ata_link_init(ap, link, 1); | ||
| 5591 | ap->slave_link = link; | ||
| 5592 | return 0; | ||
| 5593 | } | ||
| 5594 | |||
| 5417 | static void ata_host_stop(struct device *gendev, void *res) | 5595 | static void ata_host_stop(struct device *gendev, void *res) | 
| 5418 | { | 5596 | { | 
| 5419 | struct ata_host *host = dev_get_drvdata(gendev); | 5597 | struct ata_host *host = dev_get_drvdata(gendev); | 
| @@ -5640,6 +5818,8 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht) | |||
| 5640 | 5818 | ||
| 5641 | /* init sata_spd_limit to the current value */ | 5819 | /* init sata_spd_limit to the current value */ | 
| 5642 | sata_link_init_spd(&ap->link); | 5820 | sata_link_init_spd(&ap->link); | 
| 5821 | if (ap->slave_link) | ||
| 5822 | sata_link_init_spd(ap->slave_link); | ||
| 5643 | 5823 | ||
| 5644 | /* print per-port info to dmesg */ | 5824 | /* print per-port info to dmesg */ | 
| 5645 | xfer_mask = ata_pack_xfermask(ap->pio_mask, ap->mwdma_mask, | 5825 | xfer_mask = ata_pack_xfermask(ap->pio_mask, ap->mwdma_mask, | 
| @@ -6260,10 +6440,12 @@ EXPORT_SYMBOL_GPL(ata_base_port_ops); | |||
| 6260 | EXPORT_SYMBOL_GPL(sata_port_ops); | 6440 | EXPORT_SYMBOL_GPL(sata_port_ops); | 
| 6261 | EXPORT_SYMBOL_GPL(ata_dummy_port_ops); | 6441 | EXPORT_SYMBOL_GPL(ata_dummy_port_ops); | 
| 6262 | EXPORT_SYMBOL_GPL(ata_dummy_port_info); | 6442 | EXPORT_SYMBOL_GPL(ata_dummy_port_info); | 
| 6443 | EXPORT_SYMBOL_GPL(__ata_port_next_link); | ||
| 6263 | EXPORT_SYMBOL_GPL(ata_std_bios_param); | 6444 | EXPORT_SYMBOL_GPL(ata_std_bios_param); | 
| 6264 | EXPORT_SYMBOL_GPL(ata_host_init); | 6445 | EXPORT_SYMBOL_GPL(ata_host_init); | 
| 6265 | EXPORT_SYMBOL_GPL(ata_host_alloc); | 6446 | EXPORT_SYMBOL_GPL(ata_host_alloc); | 
| 6266 | EXPORT_SYMBOL_GPL(ata_host_alloc_pinfo); | 6447 | EXPORT_SYMBOL_GPL(ata_host_alloc_pinfo); | 
| 6448 | EXPORT_SYMBOL_GPL(ata_slave_link_init); | ||
| 6267 | EXPORT_SYMBOL_GPL(ata_host_start); | 6449 | EXPORT_SYMBOL_GPL(ata_host_start); | 
| 6268 | EXPORT_SYMBOL_GPL(ata_host_register); | 6450 | EXPORT_SYMBOL_GPL(ata_host_register); | 
| 6269 | EXPORT_SYMBOL_GPL(ata_host_activate); | 6451 | EXPORT_SYMBOL_GPL(ata_host_activate); | 
| diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index c1db2f234d2e..f2dd99122bd6 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
| @@ -79,6 +79,8 @@ enum { | |||
| 79 | */ | 79 | */ | 
| 80 | ATA_EH_PRERESET_TIMEOUT = 10000, | 80 | ATA_EH_PRERESET_TIMEOUT = 10000, | 
| 81 | ATA_EH_FASTDRAIN_INTERVAL = 3000, | 81 | ATA_EH_FASTDRAIN_INTERVAL = 3000, | 
| 82 | |||
| 83 | ATA_EH_UA_TRIES = 5, | ||
| 82 | }; | 84 | }; | 
| 83 | 85 | ||
| 84 | /* The following table determines how we sequence resets. Each entry | 86 | /* The following table determines how we sequence resets. Each entry | 
| @@ -1357,6 +1359,37 @@ static int ata_eh_read_log_10h(struct ata_device *dev, | |||
| 1357 | } | 1359 | } | 
| 1358 | 1360 | ||
| 1359 | /** | 1361 | /** | 
| 1362 | * atapi_eh_tur - perform ATAPI TEST_UNIT_READY | ||
| 1363 | * @dev: target ATAPI device | ||
| 1364 | * @r_sense_key: out parameter for sense_key | ||
| 1365 | * | ||
| 1366 | * Perform ATAPI TEST_UNIT_READY. | ||
| 1367 | * | ||
| 1368 | * LOCKING: | ||
| 1369 | * EH context (may sleep). | ||
| 1370 | * | ||
| 1371 | * RETURNS: | ||
| 1372 | * 0 on success, AC_ERR_* mask on failure. | ||
| 1373 | */ | ||
| 1374 | static unsigned int atapi_eh_tur(struct ata_device *dev, u8 *r_sense_key) | ||
| 1375 | { | ||
| 1376 | u8 cdb[ATAPI_CDB_LEN] = { TEST_UNIT_READY, 0, 0, 0, 0, 0 }; | ||
| 1377 | struct ata_taskfile tf; | ||
| 1378 | unsigned int err_mask; | ||
| 1379 | |||
| 1380 | ata_tf_init(dev, &tf); | ||
| 1381 | |||
| 1382 | tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE; | ||
| 1383 | tf.command = ATA_CMD_PACKET; | ||
| 1384 | tf.protocol = ATAPI_PROT_NODATA; | ||
| 1385 | |||
| 1386 | err_mask = ata_exec_internal(dev, &tf, cdb, DMA_NONE, NULL, 0, 0); | ||
| 1387 | if (err_mask == AC_ERR_DEV) | ||
| 1388 | *r_sense_key = tf.feature >> 4; | ||
| 1389 | return err_mask; | ||
| 1390 | } | ||
| 1391 | |||
| 1392 | /** | ||
| 1360 | * atapi_eh_request_sense - perform ATAPI REQUEST_SENSE | 1393 | * atapi_eh_request_sense - perform ATAPI REQUEST_SENSE | 
| 1361 | * @dev: device to perform REQUEST_SENSE to | 1394 | * @dev: device to perform REQUEST_SENSE to | 
| 1362 | * @sense_buf: result sense data buffer (SCSI_SENSE_BUFFERSIZE bytes long) | 1395 | * @sense_buf: result sense data buffer (SCSI_SENSE_BUFFERSIZE bytes long) | 
| @@ -1756,7 +1789,7 @@ static unsigned int ata_eh_speed_down_verdict(struct ata_device *dev) | |||
| 1756 | static unsigned int ata_eh_speed_down(struct ata_device *dev, | 1789 | static unsigned int ata_eh_speed_down(struct ata_device *dev, | 
| 1757 | unsigned int eflags, unsigned int err_mask) | 1790 | unsigned int eflags, unsigned int err_mask) | 
| 1758 | { | 1791 | { | 
| 1759 | struct ata_link *link = dev->link; | 1792 | struct ata_link *link = ata_dev_phys_link(dev); | 
| 1760 | int xfer_ok = 0; | 1793 | int xfer_ok = 0; | 
| 1761 | unsigned int verdict; | 1794 | unsigned int verdict; | 
| 1762 | unsigned int action = 0; | 1795 | unsigned int action = 0; | 
| @@ -1880,7 +1913,8 @@ static void ata_eh_link_autopsy(struct ata_link *link) | |||
| 1880 | for (tag = 0; tag < ATA_MAX_QUEUE; tag++) { | 1913 | for (tag = 0; tag < ATA_MAX_QUEUE; tag++) { | 
| 1881 | struct ata_queued_cmd *qc = __ata_qc_from_tag(ap, tag); | 1914 | struct ata_queued_cmd *qc = __ata_qc_from_tag(ap, tag); | 
| 1882 | 1915 | ||
| 1883 | if (!(qc->flags & ATA_QCFLAG_FAILED) || qc->dev->link != link) | 1916 | if (!(qc->flags & ATA_QCFLAG_FAILED) || | 
| 1917 | ata_dev_phys_link(qc->dev) != link) | ||
| 1884 | continue; | 1918 | continue; | 
| 1885 | 1919 | ||
| 1886 | /* inherit upper level err_mask */ | 1920 | /* inherit upper level err_mask */ | 
| @@ -1967,6 +2001,23 @@ void ata_eh_autopsy(struct ata_port *ap) | |||
| 1967 | ata_port_for_each_link(link, ap) | 2001 | ata_port_for_each_link(link, ap) | 
| 1968 | ata_eh_link_autopsy(link); | 2002 | ata_eh_link_autopsy(link); | 
| 1969 | 2003 | ||
| 2004 | /* Handle the frigging slave link. Autopsy is done similarly | ||
| 2005 | * but actions and flags are transferred over to the master | ||
| 2006 | * link and handled from there. | ||
| 2007 | */ | ||
| 2008 | if (ap->slave_link) { | ||
| 2009 | struct ata_eh_context *mehc = &ap->link.eh_context; | ||
| 2010 | struct ata_eh_context *sehc = &ap->slave_link->eh_context; | ||
| 2011 | |||
| 2012 | ata_eh_link_autopsy(ap->slave_link); | ||
| 2013 | |||
| 2014 | ata_eh_about_to_do(ap->slave_link, NULL, ATA_EH_ALL_ACTIONS); | ||
| 2015 | mehc->i.action |= sehc->i.action; | ||
| 2016 | mehc->i.dev_action[1] |= sehc->i.dev_action[1]; | ||
| 2017 | mehc->i.flags |= sehc->i.flags; | ||
| 2018 | ata_eh_done(ap->slave_link, NULL, ATA_EH_ALL_ACTIONS); | ||
| 2019 | } | ||
| 2020 | |||
| 1970 | /* Autopsy of fanout ports can affect host link autopsy. | 2021 | /* Autopsy of fanout ports can affect host link autopsy. | 
| 1971 | * Perform host link autopsy last. | 2022 | * Perform host link autopsy last. | 
| 1972 | */ | 2023 | */ | 
| @@ -2001,7 +2052,8 @@ static void ata_eh_link_report(struct ata_link *link) | |||
| 2001 | for (tag = 0; tag < ATA_MAX_QUEUE; tag++) { | 2052 | for (tag = 0; tag < ATA_MAX_QUEUE; tag++) { | 
| 2002 | struct ata_queued_cmd *qc = __ata_qc_from_tag(ap, tag); | 2053 | struct ata_queued_cmd *qc = __ata_qc_from_tag(ap, tag); | 
| 2003 | 2054 | ||
| 2004 | if (!(qc->flags & ATA_QCFLAG_FAILED) || qc->dev->link != link || | 2055 | if (!(qc->flags & ATA_QCFLAG_FAILED) || | 
| 2056 | ata_dev_phys_link(qc->dev) != link || | ||
| 2005 | ((qc->flags & ATA_QCFLAG_QUIET) && | 2057 | ((qc->flags & ATA_QCFLAG_QUIET) && | 
| 2006 | qc->err_mask == AC_ERR_DEV)) | 2058 | qc->err_mask == AC_ERR_DEV)) | 
| 2007 | continue; | 2059 | continue; | 
| @@ -2068,7 +2120,7 @@ static void ata_eh_link_report(struct ata_link *link) | |||
| 2068 | char cdb_buf[70] = ""; | 2120 | char cdb_buf[70] = ""; | 
| 2069 | 2121 | ||
| 2070 | if (!(qc->flags & ATA_QCFLAG_FAILED) || | 2122 | if (!(qc->flags & ATA_QCFLAG_FAILED) || | 
| 2071 | qc->dev->link != link || !qc->err_mask) | 2123 | ata_dev_phys_link(qc->dev) != link || !qc->err_mask) | 
| 2072 | continue; | 2124 | continue; | 
| 2073 | 2125 | ||
| 2074 | if (qc->dma_dir != DMA_NONE) { | 2126 | if (qc->dma_dir != DMA_NONE) { | 
| @@ -2160,12 +2212,14 @@ void ata_eh_report(struct ata_port *ap) | |||
| 2160 | } | 2212 | } | 
| 2161 | 2213 | ||
| 2162 | static int ata_do_reset(struct ata_link *link, ata_reset_fn_t reset, | 2214 | static int ata_do_reset(struct ata_link *link, ata_reset_fn_t reset, | 
| 2163 | unsigned int *classes, unsigned long deadline) | 2215 | unsigned int *classes, unsigned long deadline, | 
| 2216 | bool clear_classes) | ||
| 2164 | { | 2217 | { | 
| 2165 | struct ata_device *dev; | 2218 | struct ata_device *dev; | 
| 2166 | 2219 | ||
| 2167 | ata_link_for_each_dev(dev, link) | 2220 | if (clear_classes) | 
| 2168 | classes[dev->devno] = ATA_DEV_UNKNOWN; | 2221 | ata_link_for_each_dev(dev, link) | 
| 2222 | classes[dev->devno] = ATA_DEV_UNKNOWN; | ||
| 2169 | 2223 | ||
| 2170 | return reset(link, classes, deadline); | 2224 | return reset(link, classes, deadline); | 
| 2171 | } | 2225 | } | 
| @@ -2187,17 +2241,20 @@ int ata_eh_reset(struct ata_link *link, int classify, | |||
| 2187 | ata_reset_fn_t hardreset, ata_postreset_fn_t postreset) | 2241 | ata_reset_fn_t hardreset, ata_postreset_fn_t postreset) | 
| 2188 | { | 2242 | { | 
| 2189 | struct ata_port *ap = link->ap; | 2243 | struct ata_port *ap = link->ap; | 
| 2244 | struct ata_link *slave = ap->slave_link; | ||
| 2190 | struct ata_eh_context *ehc = &link->eh_context; | 2245 | struct ata_eh_context *ehc = &link->eh_context; | 
| 2246 | struct ata_eh_context *sehc = &slave->eh_context; | ||
| 2191 | unsigned int *classes = ehc->classes; | 2247 | unsigned int *classes = ehc->classes; | 
| 2192 | unsigned int lflags = link->flags; | 2248 | unsigned int lflags = link->flags; | 
| 2193 | int verbose = !(ehc->i.flags & ATA_EHI_QUIET); | 2249 | int verbose = !(ehc->i.flags & ATA_EHI_QUIET); | 
| 2194 | int max_tries = 0, try = 0; | 2250 | int max_tries = 0, try = 0; | 
| 2251 | struct ata_link *failed_link; | ||
| 2195 | struct ata_device *dev; | 2252 | struct ata_device *dev; | 
| 2196 | unsigned long deadline, now; | 2253 | unsigned long deadline, now; | 
| 2197 | ata_reset_fn_t reset; | 2254 | ata_reset_fn_t reset; | 
| 2198 | unsigned long flags; | 2255 | unsigned long flags; | 
| 2199 | u32 sstatus; | 2256 | u32 sstatus; | 
| 2200 | int nr_known, rc; | 2257 | int nr_unknown, rc; | 
| 2201 | 2258 | ||
| 2202 | /* | 2259 | /* | 
| 2203 | * Prepare to reset | 2260 | * Prepare to reset | 
| @@ -2252,8 +2309,30 @@ int ata_eh_reset(struct ata_link *link, int classify, | |||
| 2252 | } | 2309 | } | 
| 2253 | 2310 | ||
| 2254 | if (prereset) { | 2311 | if (prereset) { | 
| 2255 | rc = prereset(link, | 2312 | unsigned long deadline = ata_deadline(jiffies, | 
| 2256 | ata_deadline(jiffies, ATA_EH_PRERESET_TIMEOUT)); | 2313 | ATA_EH_PRERESET_TIMEOUT); | 
| 2314 | |||
| 2315 | if (slave) { | ||
| 2316 | sehc->i.action &= ~ATA_EH_RESET; | ||
| 2317 | sehc->i.action |= ehc->i.action; | ||
| 2318 | } | ||
| 2319 | |||
| 2320 | rc = prereset(link, deadline); | ||
| 2321 | |||
| 2322 | /* If present, do prereset on slave link too. Reset | ||
| 2323 | * is skipped iff both master and slave links report | ||
| 2324 | * -ENOENT or clear ATA_EH_RESET. | ||
| 2325 | */ | ||
| 2326 | if (slave && (rc == 0 || rc == -ENOENT)) { | ||
| 2327 | int tmp; | ||
| 2328 | |||
| 2329 | tmp = prereset(slave, deadline); | ||
| 2330 | if (tmp != -ENOENT) | ||
| 2331 | rc = tmp; | ||
| 2332 | |||
| 2333 | ehc->i.action |= sehc->i.action; | ||
| 2334 | } | ||
| 2335 | |||
| 2257 | if (rc) { | 2336 | if (rc) { | 
| 2258 | if (rc == -ENOENT) { | 2337 | if (rc == -ENOENT) { | 
| 2259 | ata_link_printk(link, KERN_DEBUG, | 2338 | ata_link_printk(link, KERN_DEBUG, | 
| @@ -2302,25 +2381,51 @@ int ata_eh_reset(struct ata_link *link, int classify, | |||
| 2302 | else | 2381 | else | 
| 2303 | ehc->i.flags |= ATA_EHI_DID_SOFTRESET; | 2382 | ehc->i.flags |= ATA_EHI_DID_SOFTRESET; | 
| 2304 | 2383 | ||
| 2305 | rc = ata_do_reset(link, reset, classes, deadline); | 2384 | rc = ata_do_reset(link, reset, classes, deadline, true); | 
| 2306 | if (rc && rc != -EAGAIN) | 2385 | if (rc && rc != -EAGAIN) { | 
| 2386 | failed_link = link; | ||
| 2307 | goto fail; | 2387 | goto fail; | 
| 2388 | } | ||
| 2389 | |||
| 2390 | /* hardreset slave link if existent */ | ||
| 2391 | if (slave && reset == hardreset) { | ||
| 2392 | int tmp; | ||
| 2393 | |||
| 2394 | if (verbose) | ||
| 2395 | ata_link_printk(slave, KERN_INFO, | ||
| 2396 | "hard resetting link\n"); | ||
| 2308 | 2397 | ||
| 2398 | ata_eh_about_to_do(slave, NULL, ATA_EH_RESET); | ||
| 2399 | tmp = ata_do_reset(slave, reset, classes, deadline, | ||
| 2400 | false); | ||
| 2401 | switch (tmp) { | ||
| 2402 | case -EAGAIN: | ||
| 2403 | rc = -EAGAIN; | ||
| 2404 | case 0: | ||
| 2405 | break; | ||
| 2406 | default: | ||
| 2407 | failed_link = slave; | ||
| 2408 | rc = tmp; | ||
| 2409 | goto fail; | ||
| 2410 | } | ||
| 2411 | } | ||
| 2412 | |||
| 2413 | /* perform follow-up SRST if necessary */ | ||
| 2309 | if (reset == hardreset && | 2414 | if (reset == hardreset && | 
| 2310 | ata_eh_followup_srst_needed(link, rc, classes)) { | 2415 | ata_eh_followup_srst_needed(link, rc, classes)) { | 
| 2311 | /* okay, let's do follow-up softreset */ | ||
| 2312 | reset = softreset; | 2416 | reset = softreset; | 
| 2313 | 2417 | ||
| 2314 | if (!reset) { | 2418 | if (!reset) { | 
| 2315 | ata_link_printk(link, KERN_ERR, | 2419 | ata_link_printk(link, KERN_ERR, | 
| 2316 | "follow-up softreset required " | 2420 | "follow-up softreset required " | 
| 2317 | "but no softreset avaliable\n"); | 2421 | "but no softreset avaliable\n"); | 
| 2422 | failed_link = link; | ||
| 2318 | rc = -EINVAL; | 2423 | rc = -EINVAL; | 
| 2319 | goto fail; | 2424 | goto fail; | 
| 2320 | } | 2425 | } | 
| 2321 | 2426 | ||
| 2322 | ata_eh_about_to_do(link, NULL, ATA_EH_RESET); | 2427 | ata_eh_about_to_do(link, NULL, ATA_EH_RESET); | 
| 2323 | rc = ata_do_reset(link, reset, classes, deadline); | 2428 | rc = ata_do_reset(link, reset, classes, deadline, true); | 
| 2324 | } | 2429 | } | 
| 2325 | } else { | 2430 | } else { | 
| 2326 | if (verbose) | 2431 | if (verbose) | 
| @@ -2341,7 +2446,7 @@ int ata_eh_reset(struct ata_link *link, int classify, | |||
| 2341 | dev->pio_mode = XFER_PIO_0; | 2446 | dev->pio_mode = XFER_PIO_0; | 
| 2342 | dev->flags &= ~ATA_DFLAG_SLEEPING; | 2447 | dev->flags &= ~ATA_DFLAG_SLEEPING; | 
| 2343 | 2448 | ||
| 2344 | if (ata_link_offline(link)) | 2449 | if (ata_phys_link_offline(ata_dev_phys_link(dev))) | 
| 2345 | continue; | 2450 | continue; | 
| 2346 | 2451 | ||
| 2347 | /* apply class override */ | 2452 | /* apply class override */ | 
| @@ -2354,6 +2459,8 @@ int ata_eh_reset(struct ata_link *link, int classify, | |||
| 2354 | /* record current link speed */ | 2459 | /* record current link speed */ | 
| 2355 | if (sata_scr_read(link, SCR_STATUS, &sstatus) == 0) | 2460 | if (sata_scr_read(link, SCR_STATUS, &sstatus) == 0) | 
| 2356 | link->sata_spd = (sstatus >> 4) & 0xf; | 2461 | link->sata_spd = (sstatus >> 4) & 0xf; | 
| 2462 | if (slave && sata_scr_read(slave, SCR_STATUS, &sstatus) == 0) | ||
| 2463 | slave->sata_spd = (sstatus >> 4) & 0xf; | ||
| 2357 | 2464 | ||
| 2358 | /* thaw the port */ | 2465 | /* thaw the port */ | 
| 2359 | if (ata_is_host_link(link)) | 2466 | if (ata_is_host_link(link)) | 
| @@ -2366,12 +2473,17 @@ int ata_eh_reset(struct ata_link *link, int classify, | |||
| 2366 | * reset and here. This race is mediated by cross checking | 2473 | * reset and here. This race is mediated by cross checking | 
| 2367 | * link onlineness and classification result later. | 2474 | * link onlineness and classification result later. | 
| 2368 | */ | 2475 | */ | 
| 2369 | if (postreset) | 2476 | if (postreset) { | 
| 2370 | postreset(link, classes); | 2477 | postreset(link, classes); | 
| 2478 | if (slave) | ||
| 2479 | postreset(slave, classes); | ||
| 2480 | } | ||
| 2371 | 2481 | ||
| 2372 | /* clear cached SError */ | 2482 | /* clear cached SError */ | 
| 2373 | spin_lock_irqsave(link->ap->lock, flags); | 2483 | spin_lock_irqsave(link->ap->lock, flags); | 
| 2374 | link->eh_info.serror = 0; | 2484 | link->eh_info.serror = 0; | 
| 2485 | if (slave) | ||
| 2486 | slave->eh_info.serror = 0; | ||
| 2375 | spin_unlock_irqrestore(link->ap->lock, flags); | 2487 | spin_unlock_irqrestore(link->ap->lock, flags); | 
| 2376 | 2488 | ||
| 2377 | /* Make sure onlineness and classification result correspond. | 2489 | /* Make sure onlineness and classification result correspond. | 
| @@ -2381,19 +2493,21 @@ int ata_eh_reset(struct ata_link *link, int classify, | |||
| 2381 | * link onlineness and classification result, those conditions | 2493 | * link onlineness and classification result, those conditions | 
| 2382 | * can be reliably detected and retried. | 2494 | * can be reliably detected and retried. | 
| 2383 | */ | 2495 | */ | 
| 2384 | nr_known = 0; | 2496 | nr_unknown = 0; | 
| 2385 | ata_link_for_each_dev(dev, link) { | 2497 | ata_link_for_each_dev(dev, link) { | 
| 2386 | /* convert all ATA_DEV_UNKNOWN to ATA_DEV_NONE */ | 2498 | /* convert all ATA_DEV_UNKNOWN to ATA_DEV_NONE */ | 
| 2387 | if (classes[dev->devno] == ATA_DEV_UNKNOWN) | 2499 | if (classes[dev->devno] == ATA_DEV_UNKNOWN) { | 
| 2388 | classes[dev->devno] = ATA_DEV_NONE; | 2500 | classes[dev->devno] = ATA_DEV_NONE; | 
| 2389 | else | 2501 | if (ata_phys_link_online(ata_dev_phys_link(dev))) | 
| 2390 | nr_known++; | 2502 | nr_unknown++; | 
| 2503 | } | ||
| 2391 | } | 2504 | } | 
| 2392 | 2505 | ||
| 2393 | if (classify && !nr_known && ata_link_online(link)) { | 2506 | if (classify && nr_unknown) { | 
| 2394 | if (try < max_tries) { | 2507 | if (try < max_tries) { | 
| 2395 | ata_link_printk(link, KERN_WARNING, "link online but " | 2508 | ata_link_printk(link, KERN_WARNING, "link online but " | 
| 2396 | "device misclassified, retrying\n"); | 2509 | "device misclassified, retrying\n"); | 
| 2510 | failed_link = link; | ||
| 2397 | rc = -EAGAIN; | 2511 | rc = -EAGAIN; | 
| 2398 | goto fail; | 2512 | goto fail; | 
| 2399 | } | 2513 | } | 
| @@ -2404,6 +2518,8 @@ int ata_eh_reset(struct ata_link *link, int classify, | |||
| 2404 | 2518 | ||
| 2405 | /* reset successful, schedule revalidation */ | 2519 | /* reset successful, schedule revalidation */ | 
| 2406 | ata_eh_done(link, NULL, ATA_EH_RESET); | 2520 | ata_eh_done(link, NULL, ATA_EH_RESET); | 
| 2521 | if (slave) | ||
| 2522 | ata_eh_done(slave, NULL, ATA_EH_RESET); | ||
| 2407 | ehc->last_reset = jiffies; | 2523 | ehc->last_reset = jiffies; | 
| 2408 | ehc->i.action |= ATA_EH_REVALIDATE; | 2524 | ehc->i.action |= ATA_EH_REVALIDATE; | 
| 2409 | 2525 | ||
| @@ -2411,6 +2527,8 @@ int ata_eh_reset(struct ata_link *link, int classify, | |||
| 2411 | out: | 2527 | out: | 
| 2412 | /* clear hotplug flag */ | 2528 | /* clear hotplug flag */ | 
| 2413 | ehc->i.flags &= ~ATA_EHI_HOTPLUGGED; | 2529 | ehc->i.flags &= ~ATA_EHI_HOTPLUGGED; | 
| 2530 | if (slave) | ||
| 2531 | sehc->i.flags &= ~ATA_EHI_HOTPLUGGED; | ||
| 2414 | 2532 | ||
| 2415 | spin_lock_irqsave(ap->lock, flags); | 2533 | spin_lock_irqsave(ap->lock, flags); | 
| 2416 | ap->pflags &= ~ATA_PFLAG_RESETTING; | 2534 | ap->pflags &= ~ATA_PFLAG_RESETTING; | 
| @@ -2431,7 +2549,7 @@ int ata_eh_reset(struct ata_link *link, int classify, | |||
| 2431 | if (time_before(now, deadline)) { | 2549 | if (time_before(now, deadline)) { | 
| 2432 | unsigned long delta = deadline - now; | 2550 | unsigned long delta = deadline - now; | 
| 2433 | 2551 | ||
| 2434 | ata_link_printk(link, KERN_WARNING, | 2552 | ata_link_printk(failed_link, KERN_WARNING, | 
| 2435 | "reset failed (errno=%d), retrying in %u secs\n", | 2553 | "reset failed (errno=%d), retrying in %u secs\n", | 
| 2436 | rc, DIV_ROUND_UP(jiffies_to_msecs(delta), 1000)); | 2554 | rc, DIV_ROUND_UP(jiffies_to_msecs(delta), 1000)); | 
| 2437 | 2555 | ||
| @@ -2439,13 +2557,92 @@ int ata_eh_reset(struct ata_link *link, int classify, | |||
| 2439 | delta = schedule_timeout_uninterruptible(delta); | 2557 | delta = schedule_timeout_uninterruptible(delta); | 
| 2440 | } | 2558 | } | 
| 2441 | 2559 | ||
| 2442 | if (rc == -EPIPE || try == max_tries - 1) | 2560 | if (try == max_tries - 1) { | 
| 2443 | sata_down_spd_limit(link); | 2561 | sata_down_spd_limit(link); | 
| 2562 | if (slave) | ||
| 2563 | sata_down_spd_limit(slave); | ||
| 2564 | } else if (rc == -EPIPE) | ||
| 2565 | sata_down_spd_limit(failed_link); | ||
| 2566 | |||
| 2444 | if (hardreset) | 2567 | if (hardreset) | 
| 2445 | reset = hardreset; | 2568 | reset = hardreset; | 
| 2446 | goto retry; | 2569 | goto retry; | 
| 2447 | } | 2570 | } | 
| 2448 | 2571 | ||
| 2572 | static inline void ata_eh_pull_park_action(struct ata_port *ap) | ||
| 2573 | { | ||
| 2574 | struct ata_link *link; | ||
| 2575 | struct ata_device *dev; | ||
| 2576 | unsigned long flags; | ||
| 2577 | |||
| 2578 | /* | ||
| 2579 | * This function can be thought of as an extended version of | ||
| 2580 | * ata_eh_about_to_do() specially crafted to accommodate the | ||
| 2581 | * requirements of ATA_EH_PARK handling. Since the EH thread | ||
| 2582 | * does not leave the do {} while () loop in ata_eh_recover as | ||
| 2583 | * long as the timeout for a park request to *one* device on | ||
| 2584 | * the port has not expired, and since we still want to pick | ||
| 2585 | * up park requests to other devices on the same port or | ||
| 2586 | * timeout updates for the same device, we have to pull | ||
| 2587 | * ATA_EH_PARK actions from eh_info into eh_context.i | ||
| 2588 | * ourselves at the beginning of each pass over the loop. | ||
| 2589 | * | ||
| 2590 | * Additionally, all write accesses to &ap->park_req_pending | ||
| 2591 | * through INIT_COMPLETION() (see below) or complete_all() | ||
| 2592 | * (see ata_scsi_park_store()) are protected by the host lock. | ||
| 2593 | * As a result we have that park_req_pending.done is zero on | ||
| 2594 | * exit from this function, i.e. when ATA_EH_PARK actions for | ||
| 2595 | * *all* devices on port ap have been pulled into the | ||
| 2596 | * respective eh_context structs. If, and only if, | ||
| 2597 | * park_req_pending.done is non-zero by the time we reach | ||
| 2598 | * wait_for_completion_timeout(), another ATA_EH_PARK action | ||
| 2599 | * has been scheduled for at least one of the devices on port | ||
| 2600 | * ap and we have to cycle over the do {} while () loop in | ||
| 2601 | * ata_eh_recover() again. | ||
| 2602 | */ | ||
| 2603 | |||
| 2604 | spin_lock_irqsave(ap->lock, flags); | ||
| 2605 | INIT_COMPLETION(ap->park_req_pending); | ||
| 2606 | ata_port_for_each_link(link, ap) { | ||
| 2607 | ata_link_for_each_dev(dev, link) { | ||
| 2608 | struct ata_eh_info *ehi = &link->eh_info; | ||
| 2609 | |||
| 2610 | link->eh_context.i.dev_action[dev->devno] |= | ||
| 2611 | ehi->dev_action[dev->devno] & ATA_EH_PARK; | ||
| 2612 | ata_eh_clear_action(link, dev, ehi, ATA_EH_PARK); | ||
| 2613 | } | ||
| 2614 | } | ||
| 2615 | spin_unlock_irqrestore(ap->lock, flags); | ||
| 2616 | } | ||
| 2617 | |||
| 2618 | static void ata_eh_park_issue_cmd(struct ata_device *dev, int park) | ||
| 2619 | { | ||
| 2620 | struct ata_eh_context *ehc = &dev->link->eh_context; | ||
| 2621 | struct ata_taskfile tf; | ||
| 2622 | unsigned int err_mask; | ||
| 2623 | |||
| 2624 | ata_tf_init(dev, &tf); | ||
| 2625 | if (park) { | ||
| 2626 | ehc->unloaded_mask |= 1 << dev->devno; | ||
| 2627 | tf.command = ATA_CMD_IDLEIMMEDIATE; | ||
| 2628 | tf.feature = 0x44; | ||
| 2629 | tf.lbal = 0x4c; | ||
| 2630 | tf.lbam = 0x4e; | ||
| 2631 | tf.lbah = 0x55; | ||
| 2632 | } else { | ||
| 2633 | ehc->unloaded_mask &= ~(1 << dev->devno); | ||
| 2634 | tf.command = ATA_CMD_CHK_POWER; | ||
| 2635 | } | ||
| 2636 | |||
| 2637 | tf.flags |= ATA_TFLAG_DEVICE | ATA_TFLAG_ISADDR; | ||
| 2638 | tf.protocol |= ATA_PROT_NODATA; | ||
| 2639 | err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0, 0); | ||
| 2640 | if (park && (err_mask || tf.lbal != 0xc4)) { | ||
| 2641 | ata_dev_printk(dev, KERN_ERR, "head unload failed!\n"); | ||
| 2642 | ehc->unloaded_mask &= ~(1 << dev->devno); | ||
| 2643 | } | ||
| 2644 | } | ||
| 2645 | |||
| 2449 | static int ata_eh_revalidate_and_attach(struct ata_link *link, | 2646 | static int ata_eh_revalidate_and_attach(struct ata_link *link, | 
| 2450 | struct ata_device **r_failed_dev) | 2647 | struct ata_device **r_failed_dev) | 
| 2451 | { | 2648 | { | 
| @@ -2472,7 +2669,7 @@ static int ata_eh_revalidate_and_attach(struct ata_link *link, | |||
| 2472 | if ((action & ATA_EH_REVALIDATE) && ata_dev_enabled(dev)) { | 2669 | if ((action & ATA_EH_REVALIDATE) && ata_dev_enabled(dev)) { | 
| 2473 | WARN_ON(dev->class == ATA_DEV_PMP); | 2670 | WARN_ON(dev->class == ATA_DEV_PMP); | 
| 2474 | 2671 | ||
| 2475 | if (ata_link_offline(link)) { | 2672 | if (ata_phys_link_offline(ata_dev_phys_link(dev))) { | 
| 2476 | rc = -EIO; | 2673 | rc = -EIO; | 
| 2477 | goto err; | 2674 | goto err; | 
| 2478 | } | 2675 | } | 
| @@ -2610,6 +2807,53 @@ int ata_set_mode(struct ata_link *link, struct ata_device **r_failed_dev) | |||
| 2610 | return rc; | 2807 | return rc; | 
| 2611 | } | 2808 | } | 
| 2612 | 2809 | ||
| 2810 | /** | ||
| 2811 | * atapi_eh_clear_ua - Clear ATAPI UNIT ATTENTION after reset | ||
| 2812 | * @dev: ATAPI device to clear UA for | ||
| 2813 | * | ||
| 2814 | * Resets and other operations can make an ATAPI device raise | ||
| 2815 | * UNIT ATTENTION which causes the next operation to fail. This | ||
| 2816 | * function clears UA. | ||
| 2817 | * | ||
| 2818 | * LOCKING: | ||
| 2819 | * EH context (may sleep). | ||
| 2820 | * | ||
| 2821 | * RETURNS: | ||
| 2822 | * 0 on success, -errno on failure. | ||
| 2823 | */ | ||
| 2824 | static int atapi_eh_clear_ua(struct ata_device *dev) | ||
| 2825 | { | ||
| 2826 | int i; | ||
| 2827 | |||
| 2828 | for (i = 0; i < ATA_EH_UA_TRIES; i++) { | ||
| 2829 | u8 sense_buffer[SCSI_SENSE_BUFFERSIZE]; | ||
| 2830 | u8 sense_key = 0; | ||
| 2831 | unsigned int err_mask; | ||
| 2832 | |||
| 2833 | err_mask = atapi_eh_tur(dev, &sense_key); | ||
| 2834 | if (err_mask != 0 && err_mask != AC_ERR_DEV) { | ||
| 2835 | ata_dev_printk(dev, KERN_WARNING, "TEST_UNIT_READY " | ||
| 2836 | "failed (err_mask=0x%x)\n", err_mask); | ||
| 2837 | return -EIO; | ||
| 2838 | } | ||
| 2839 | |||
| 2840 | if (!err_mask || sense_key != UNIT_ATTENTION) | ||
| 2841 | return 0; | ||
| 2842 | |||
| 2843 | err_mask = atapi_eh_request_sense(dev, sense_buffer, sense_key); | ||
| 2844 | if (err_mask) { | ||
| 2845 | ata_dev_printk(dev, KERN_WARNING, "failed to clear " | ||
| 2846 | "UNIT ATTENTION (err_mask=0x%x)\n", err_mask); | ||
| 2847 | return -EIO; | ||
| 2848 | } | ||
| 2849 | } | ||
| 2850 | |||
| 2851 | ata_dev_printk(dev, KERN_WARNING, | ||
| 2852 | "UNIT ATTENTION persists after %d tries\n", ATA_EH_UA_TRIES); | ||
| 2853 | |||
| 2854 | return 0; | ||
| 2855 | } | ||
| 2856 | |||
| 2613 | static int ata_link_nr_enabled(struct ata_link *link) | 2857 | static int ata_link_nr_enabled(struct ata_link *link) | 
| 2614 | { | 2858 | { | 
| 2615 | struct ata_device *dev; | 2859 | struct ata_device *dev; | 
| @@ -2697,7 +2941,7 @@ static int ata_eh_handle_dev_fail(struct ata_device *dev, int err) | |||
| 2697 | /* This is the last chance, better to slow | 2941 | /* This is the last chance, better to slow | 
| 2698 | * down than lose it. | 2942 | * down than lose it. | 
| 2699 | */ | 2943 | */ | 
| 2700 | sata_down_spd_limit(dev->link); | 2944 | sata_down_spd_limit(ata_dev_phys_link(dev)); | 
| 2701 | ata_down_xfermask_limit(dev, ATA_DNXFER_PIO); | 2945 | ata_down_xfermask_limit(dev, ATA_DNXFER_PIO); | 
| 2702 | } | 2946 | } | 
| 2703 | } | 2947 | } | 
| @@ -2707,7 +2951,7 @@ static int ata_eh_handle_dev_fail(struct ata_device *dev, int err) | |||
| 2707 | ata_dev_disable(dev); | 2951 | ata_dev_disable(dev); | 
| 2708 | 2952 | ||
| 2709 | /* detach if offline */ | 2953 | /* detach if offline */ | 
| 2710 | if (ata_link_offline(dev->link)) | 2954 | if (ata_phys_link_offline(ata_dev_phys_link(dev))) | 
| 2711 | ata_eh_detach_dev(dev); | 2955 | ata_eh_detach_dev(dev); | 
| 2712 | 2956 | ||
| 2713 | /* schedule probe if necessary */ | 2957 | /* schedule probe if necessary */ | 
| @@ -2755,7 +2999,7 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset, | |||
| 2755 | struct ata_device *dev; | 2999 | struct ata_device *dev; | 
| 2756 | int nr_failed_devs; | 3000 | int nr_failed_devs; | 
| 2757 | int rc; | 3001 | int rc; | 
| 2758 | unsigned long flags; | 3002 | unsigned long flags, deadline; | 
| 2759 | 3003 | ||
| 2760 | DPRINTK("ENTER\n"); | 3004 | DPRINTK("ENTER\n"); | 
| 2761 | 3005 | ||
| @@ -2829,6 +3073,56 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset, | |||
| 2829 | } | 3073 | } | 
| 2830 | } | 3074 | } | 
| 2831 | 3075 | ||
| 3076 | do { | ||
| 3077 | unsigned long now; | ||
| 3078 | |||
| 3079 | /* | ||
| 3080 | * clears ATA_EH_PARK in eh_info and resets | ||
| 3081 | * ap->park_req_pending | ||
| 3082 | */ | ||
| 3083 | ata_eh_pull_park_action(ap); | ||
| 3084 | |||
| 3085 | deadline = jiffies; | ||
| 3086 | ata_port_for_each_link(link, ap) { | ||
| 3087 | ata_link_for_each_dev(dev, link) { | ||
| 3088 | struct ata_eh_context *ehc = &link->eh_context; | ||
| 3089 | unsigned long tmp; | ||
| 3090 | |||
| 3091 | if (dev->class != ATA_DEV_ATA) | ||
| 3092 | continue; | ||
| 3093 | if (!(ehc->i.dev_action[dev->devno] & | ||
| 3094 | ATA_EH_PARK)) | ||
| 3095 | continue; | ||
| 3096 | tmp = dev->unpark_deadline; | ||
| 3097 | if (time_before(deadline, tmp)) | ||
| 3098 | deadline = tmp; | ||
| 3099 | else if (time_before_eq(tmp, jiffies)) | ||
| 3100 | continue; | ||
| 3101 | if (ehc->unloaded_mask & (1 << dev->devno)) | ||
| 3102 | continue; | ||
| 3103 | |||
| 3104 | ata_eh_park_issue_cmd(dev, 1); | ||
| 3105 | } | ||
| 3106 | } | ||
| 3107 | |||
| 3108 | now = jiffies; | ||
| 3109 | if (time_before_eq(deadline, now)) | ||
| 3110 | break; | ||
| 3111 | |||
| 3112 | deadline = wait_for_completion_timeout(&ap->park_req_pending, | ||
| 3113 | deadline - now); | ||
| 3114 | } while (deadline); | ||
| 3115 | ata_port_for_each_link(link, ap) { | ||
| 3116 | ata_link_for_each_dev(dev, link) { | ||
| 3117 | if (!(link->eh_context.unloaded_mask & | ||
| 3118 | (1 << dev->devno))) | ||
| 3119 | continue; | ||
| 3120 | |||
| 3121 | ata_eh_park_issue_cmd(dev, 0); | ||
| 3122 | ata_eh_done(link, dev, ATA_EH_PARK); | ||
| 3123 | } | ||
| 3124 | } | ||
| 3125 | |||
| 2832 | /* the rest */ | 3126 | /* the rest */ | 
| 2833 | ata_port_for_each_link(link, ap) { | 3127 | ata_port_for_each_link(link, ap) { | 
| 2834 | struct ata_eh_context *ehc = &link->eh_context; | 3128 | struct ata_eh_context *ehc = &link->eh_context; | 
| @@ -2852,6 +3146,20 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset, | |||
| 2852 | ehc->i.flags &= ~ATA_EHI_SETMODE; | 3146 | ehc->i.flags &= ~ATA_EHI_SETMODE; | 
| 2853 | } | 3147 | } | 
| 2854 | 3148 | ||
| 3149 | /* If reset has been issued, clear UA to avoid | ||
| 3150 | * disrupting the current users of the device. | ||
| 3151 | */ | ||
| 3152 | if (ehc->i.flags & ATA_EHI_DID_RESET) { | ||
| 3153 | ata_link_for_each_dev(dev, link) { | ||
| 3154 | if (dev->class != ATA_DEV_ATAPI) | ||
| 3155 | continue; | ||
| 3156 | rc = atapi_eh_clear_ua(dev); | ||
| 3157 | if (rc) | ||
| 3158 | goto dev_fail; | ||
| 3159 | } | ||
| 3160 | } | ||
| 3161 | |||
| 3162 | /* configure link power saving */ | ||
| 2855 | if (ehc->i.action & ATA_EH_LPM) | 3163 | if (ehc->i.action & ATA_EH_LPM) | 
| 2856 | ata_link_for_each_dev(dev, link) | 3164 | ata_link_for_each_dev(dev, link) | 
| 2857 | ata_dev_enable_pm(dev, ap->pm_policy); | 3165 | ata_dev_enable_pm(dev, ap->pm_policy); | 
| diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index b9d3ba423cb2..fccd5e496c62 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
| @@ -183,6 +183,105 @@ DEVICE_ATTR(link_power_management_policy, S_IRUGO | S_IWUSR, | |||
| 183 | ata_scsi_lpm_show, ata_scsi_lpm_put); | 183 | ata_scsi_lpm_show, ata_scsi_lpm_put); | 
| 184 | EXPORT_SYMBOL_GPL(dev_attr_link_power_management_policy); | 184 | EXPORT_SYMBOL_GPL(dev_attr_link_power_management_policy); | 
| 185 | 185 | ||
| 186 | static ssize_t ata_scsi_park_show(struct device *device, | ||
| 187 | struct device_attribute *attr, char *buf) | ||
| 188 | { | ||
| 189 | struct scsi_device *sdev = to_scsi_device(device); | ||
| 190 | struct ata_port *ap; | ||
| 191 | struct ata_link *link; | ||
| 192 | struct ata_device *dev; | ||
| 193 | unsigned long flags; | ||
| 194 | unsigned int uninitialized_var(msecs); | ||
| 195 | int rc = 0; | ||
| 196 | |||
| 197 | ap = ata_shost_to_port(sdev->host); | ||
| 198 | |||
| 199 | spin_lock_irqsave(ap->lock, flags); | ||
| 200 | dev = ata_scsi_find_dev(ap, sdev); | ||
| 201 | if (!dev) { | ||
| 202 | rc = -ENODEV; | ||
| 203 | goto unlock; | ||
| 204 | } | ||
| 205 | if (dev->flags & ATA_DFLAG_NO_UNLOAD) { | ||
| 206 | rc = -EOPNOTSUPP; | ||
| 207 | goto unlock; | ||
| 208 | } | ||
| 209 | |||
| 210 | link = dev->link; | ||
| 211 | if (ap->pflags & ATA_PFLAG_EH_IN_PROGRESS && | ||
| 212 | link->eh_context.unloaded_mask & (1 << dev->devno) && | ||
| 213 | time_after(dev->unpark_deadline, jiffies)) | ||
| 214 | msecs = jiffies_to_msecs(dev->unpark_deadline - jiffies); | ||
| 215 | else | ||
| 216 | msecs = 0; | ||
| 217 | |||
| 218 | unlock: | ||
| 219 | spin_unlock_irq(ap->lock); | ||
| 220 | |||
| 221 | return rc ? rc : snprintf(buf, 20, "%u\n", msecs); | ||
| 222 | } | ||
| 223 | |||
| 224 | static ssize_t ata_scsi_park_store(struct device *device, | ||
| 225 | struct device_attribute *attr, | ||
| 226 | const char *buf, size_t len) | ||
| 227 | { | ||
| 228 | struct scsi_device *sdev = to_scsi_device(device); | ||
| 229 | struct ata_port *ap; | ||
| 230 | struct ata_device *dev; | ||
| 231 | long int input; | ||
| 232 | unsigned long flags; | ||
| 233 | int rc; | ||
| 234 | |||
| 235 | rc = strict_strtol(buf, 10, &input); | ||
| 236 | if (rc || input < -2) | ||
| 237 | return -EINVAL; | ||
| 238 | if (input > ATA_TMOUT_MAX_PARK) { | ||
| 239 | rc = -EOVERFLOW; | ||
| 240 | input = ATA_TMOUT_MAX_PARK; | ||
| 241 | } | ||
| 242 | |||
| 243 | ap = ata_shost_to_port(sdev->host); | ||
| 244 | |||
| 245 | spin_lock_irqsave(ap->lock, flags); | ||
| 246 | dev = ata_scsi_find_dev(ap, sdev); | ||
| 247 | if (unlikely(!dev)) { | ||
| 248 | rc = -ENODEV; | ||
| 249 | goto unlock; | ||
| 250 | } | ||
| 251 | if (dev->class != ATA_DEV_ATA) { | ||
| 252 | rc = -EOPNOTSUPP; | ||
| 253 | goto unlock; | ||
| 254 | } | ||
| 255 | |||
| 256 | if (input >= 0) { | ||
| 257 | if (dev->flags & ATA_DFLAG_NO_UNLOAD) { | ||
| 258 | rc = -EOPNOTSUPP; | ||
| 259 | goto unlock; | ||
| 260 | } | ||
| 261 | |||
| 262 | dev->unpark_deadline = ata_deadline(jiffies, input); | ||
| 263 | dev->link->eh_info.dev_action[dev->devno] |= ATA_EH_PARK; | ||
| 264 | ata_port_schedule_eh(ap); | ||
| 265 | complete(&ap->park_req_pending); | ||
| 266 | } else { | ||
| 267 | switch (input) { | ||
| 268 | case -1: | ||
| 269 | dev->flags &= ~ATA_DFLAG_NO_UNLOAD; | ||
| 270 | break; | ||
| 271 | case -2: | ||
| 272 | dev->flags |= ATA_DFLAG_NO_UNLOAD; | ||
| 273 | break; | ||
| 274 | } | ||
| 275 | } | ||
| 276 | unlock: | ||
| 277 | spin_unlock_irqrestore(ap->lock, flags); | ||
| 278 | |||
| 279 | return rc ? rc : len; | ||
| 280 | } | ||
| 281 | DEVICE_ATTR(unload_heads, S_IRUGO | S_IWUSR, | ||
| 282 | ata_scsi_park_show, ata_scsi_park_store); | ||
| 283 | EXPORT_SYMBOL_GPL(dev_attr_unload_heads); | ||
| 284 | |||
| 186 | static void ata_scsi_set_sense(struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq) | 285 | static void ata_scsi_set_sense(struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq) | 
| 187 | { | 286 | { | 
| 188 | cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION; | 287 | cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION; | 
| @@ -269,6 +368,12 @@ DEVICE_ATTR(sw_activity, S_IWUGO | S_IRUGO, ata_scsi_activity_show, | |||
| 269 | ata_scsi_activity_store); | 368 | ata_scsi_activity_store); | 
| 270 | EXPORT_SYMBOL_GPL(dev_attr_sw_activity); | 369 | EXPORT_SYMBOL_GPL(dev_attr_sw_activity); | 
| 271 | 370 | ||
| 371 | struct device_attribute *ata_common_sdev_attrs[] = { | ||
| 372 | &dev_attr_unload_heads, | ||
| 373 | NULL | ||
| 374 | }; | ||
| 375 | EXPORT_SYMBOL_GPL(ata_common_sdev_attrs); | ||
| 376 | |||
| 272 | static void ata_scsi_invalid_field(struct scsi_cmnd *cmd, | 377 | static void ata_scsi_invalid_field(struct scsi_cmnd *cmd, | 
| 273 | void (*done)(struct scsi_cmnd *)) | 378 | void (*done)(struct scsi_cmnd *)) | 
| 274 | { | 379 | { | 
| @@ -954,6 +1059,9 @@ static int atapi_drain_needed(struct request *rq) | |||
| 954 | static int ata_scsi_dev_config(struct scsi_device *sdev, | 1059 | static int ata_scsi_dev_config(struct scsi_device *sdev, | 
| 955 | struct ata_device *dev) | 1060 | struct ata_device *dev) | 
| 956 | { | 1061 | { | 
| 1062 | if (!ata_id_has_unload(dev->id)) | ||
| 1063 | dev->flags |= ATA_DFLAG_NO_UNLOAD; | ||
| 1064 | |||
| 957 | /* configure max sectors */ | 1065 | /* configure max sectors */ | 
| 958 | blk_queue_max_sectors(sdev->request_queue, dev->max_sectors); | 1066 | blk_queue_max_sectors(sdev->request_queue, dev->max_sectors); | 
| 959 | 1067 | ||
| diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h index ade5c75b6144..e96de96e3020 100644 --- a/drivers/ata/libata.h +++ b/drivers/ata/libata.h | |||
| @@ -70,6 +70,7 @@ extern int atapi_passthru16; | |||
| 70 | extern int libata_fua; | 70 | extern int libata_fua; | 
| 71 | extern int libata_noacpi; | 71 | extern int libata_noacpi; | 
| 72 | extern int libata_allow_tpm; | 72 | extern int libata_allow_tpm; | 
| 73 | extern struct ata_link *ata_dev_phys_link(struct ata_device *dev); | ||
| 73 | extern void ata_force_cbl(struct ata_port *ap); | 74 | extern void ata_force_cbl(struct ata_port *ap); | 
| 74 | extern u64 ata_tf_to_lba(const struct ata_taskfile *tf); | 75 | extern u64 ata_tf_to_lba(const struct ata_taskfile *tf); | 
| 75 | extern u64 ata_tf_to_lba48(const struct ata_taskfile *tf); | 76 | extern u64 ata_tf_to_lba48(const struct ata_taskfile *tf); | 
| @@ -107,6 +108,8 @@ extern void ata_qc_issue(struct ata_queued_cmd *qc); | |||
| 107 | extern void __ata_qc_complete(struct ata_queued_cmd *qc); | 108 | extern void __ata_qc_complete(struct ata_queued_cmd *qc); | 
| 108 | extern int atapi_check_dma(struct ata_queued_cmd *qc); | 109 | extern int atapi_check_dma(struct ata_queued_cmd *qc); | 
| 109 | extern void swap_buf_le16(u16 *buf, unsigned int buf_words); | 110 | extern void swap_buf_le16(u16 *buf, unsigned int buf_words); | 
| 111 | extern bool ata_phys_link_online(struct ata_link *link); | ||
| 112 | extern bool ata_phys_link_offline(struct ata_link *link); | ||
| 110 | extern void ata_dev_init(struct ata_device *dev); | 113 | extern void ata_dev_init(struct ata_device *dev); | 
| 111 | extern void ata_link_init(struct ata_port *ap, struct ata_link *link, int pmp); | 114 | extern void ata_link_init(struct ata_port *ap, struct ata_link *link, int pmp); | 
| 112 | extern int sata_link_init_spd(struct ata_link *link); | 115 | extern int sata_link_init_spd(struct ata_link *link); | 
| diff --git a/drivers/ata/pata_bf54x.c b/drivers/ata/pata_bf54x.c index d3932901a3b3..1266924c11f9 100644 --- a/drivers/ata/pata_bf54x.c +++ b/drivers/ata/pata_bf54x.c | |||
| @@ -1632,6 +1632,8 @@ static int __devinit bfin_atapi_probe(struct platform_device *pdev) | |||
| 1632 | return -ENODEV; | 1632 | return -ENODEV; | 
| 1633 | } | 1633 | } | 
| 1634 | 1634 | ||
| 1635 | dev_set_drvdata(&pdev->dev, host); | ||
| 1636 | |||
| 1635 | return 0; | 1637 | return 0; | 
| 1636 | } | 1638 | } | 
| 1637 | 1639 | ||
| @@ -1648,6 +1650,7 @@ static int __devexit bfin_atapi_remove(struct platform_device *pdev) | |||
| 1648 | struct ata_host *host = dev_get_drvdata(dev); | 1650 | struct ata_host *host = dev_get_drvdata(dev); | 
| 1649 | 1651 | ||
| 1650 | ata_host_detach(host); | 1652 | ata_host_detach(host); | 
| 1653 | dev_set_drvdata(&pdev->dev, NULL); | ||
| 1651 | 1654 | ||
| 1652 | peripheral_free_list(atapi_io_port); | 1655 | peripheral_free_list(atapi_io_port); | 
| 1653 | 1656 | ||
| @@ -1655,27 +1658,44 @@ static int __devexit bfin_atapi_remove(struct platform_device *pdev) | |||
| 1655 | } | 1658 | } | 
| 1656 | 1659 | ||
| 1657 | #ifdef CONFIG_PM | 1660 | #ifdef CONFIG_PM | 
| 1658 | int bfin_atapi_suspend(struct platform_device *pdev, pm_message_t state) | 1661 | static int bfin_atapi_suspend(struct platform_device *pdev, pm_message_t state) | 
| 1659 | { | 1662 | { | 
| 1660 | return 0; | 1663 | struct ata_host *host = dev_get_drvdata(&pdev->dev); | 
| 1664 | if (host) | ||
| 1665 | return ata_host_suspend(host, state); | ||
| 1666 | else | ||
| 1667 | return 0; | ||
| 1661 | } | 1668 | } | 
| 1662 | 1669 | ||
| 1663 | int bfin_atapi_resume(struct platform_device *pdev) | 1670 | static int bfin_atapi_resume(struct platform_device *pdev) | 
| 1664 | { | 1671 | { | 
| 1672 | struct ata_host *host = dev_get_drvdata(&pdev->dev); | ||
| 1673 | int ret; | ||
| 1674 | |||
| 1675 | if (host) { | ||
| 1676 | ret = bfin_reset_controller(host); | ||
| 1677 | if (ret) { | ||
| 1678 | printk(KERN_ERR DRV_NAME ": Error during HW init\n"); | ||
| 1679 | return ret; | ||
| 1680 | } | ||
| 1681 | ata_host_resume(host); | ||
| 1682 | } | ||
| 1683 | |||
| 1665 | return 0; | 1684 | return 0; | 
| 1666 | } | 1685 | } | 
| 1686 | #else | ||
| 1687 | #define bfin_atapi_suspend NULL | ||
| 1688 | #define bfin_atapi_resume NULL | ||
| 1667 | #endif | 1689 | #endif | 
| 1668 | 1690 | ||
| 1669 | static struct platform_driver bfin_atapi_driver = { | 1691 | static struct platform_driver bfin_atapi_driver = { | 
| 1670 | .probe = bfin_atapi_probe, | 1692 | .probe = bfin_atapi_probe, | 
| 1671 | .remove = __devexit_p(bfin_atapi_remove), | 1693 | .remove = __devexit_p(bfin_atapi_remove), | 
| 1694 | .suspend = bfin_atapi_suspend, | ||
| 1695 | .resume = bfin_atapi_resume, | ||
| 1672 | .driver = { | 1696 | .driver = { | 
| 1673 | .name = DRV_NAME, | 1697 | .name = DRV_NAME, | 
| 1674 | .owner = THIS_MODULE, | 1698 | .owner = THIS_MODULE, | 
| 1675 | #ifdef CONFIG_PM | ||
| 1676 | .suspend = bfin_atapi_suspend, | ||
| 1677 | .resume = bfin_atapi_resume, | ||
| 1678 | #endif | ||
| 1679 | }, | 1699 | }, | 
| 1680 | }; | 1700 | }; | 
| 1681 | 1701 | ||
| diff --git a/drivers/ata/pata_sil680.c b/drivers/ata/pata_sil680.c index e970b227fbce..a598bb36aafc 100644 --- a/drivers/ata/pata_sil680.c +++ b/drivers/ata/pata_sil680.c | |||
| @@ -230,7 +230,7 @@ static u8 sil680_init_chip(struct pci_dev *pdev, int *try_mmio) | |||
| 230 | tmpbyte & 1, tmpbyte & 0x30); | 230 | tmpbyte & 1, tmpbyte & 0x30); | 
| 231 | 231 | ||
| 232 | *try_mmio = 0; | 232 | *try_mmio = 0; | 
| 233 | #ifdef CONFIG_PPC_MERGE | 233 | #ifdef CONFIG_PPC | 
| 234 | if (machine_is(cell)) | 234 | if (machine_is(cell)) | 
| 235 | *try_mmio = (tmpbyte & 1) || pci_resource_start(pdev, 5); | 235 | *try_mmio = (tmpbyte & 1) || pci_resource_start(pdev, 5); | 
| 236 | #endif | 236 | #endif | 
| diff --git a/drivers/ata/sata_fsl.c b/drivers/ata/sata_fsl.c index 3924e7209a44..1a56db92ff7a 100644 --- a/drivers/ata/sata_fsl.c +++ b/drivers/ata/sata_fsl.c | |||
| @@ -469,10 +469,10 @@ static bool sata_fsl_qc_fill_rtf(struct ata_queued_cmd *qc) | |||
| 469 | return true; | 469 | return true; | 
| 470 | } | 470 | } | 
| 471 | 471 | ||
| 472 | static int sata_fsl_scr_write(struct ata_port *ap, unsigned int sc_reg_in, | 472 | static int sata_fsl_scr_write(struct ata_link *link, | 
| 473 | u32 val) | 473 | unsigned int sc_reg_in, u32 val) | 
| 474 | { | 474 | { | 
| 475 | struct sata_fsl_host_priv *host_priv = ap->host->private_data; | 475 | struct sata_fsl_host_priv *host_priv = link->ap->host->private_data; | 
| 476 | void __iomem *ssr_base = host_priv->ssr_base; | 476 | void __iomem *ssr_base = host_priv->ssr_base; | 
| 477 | unsigned int sc_reg; | 477 | unsigned int sc_reg; | 
| 478 | 478 | ||
| @@ -493,10 +493,10 @@ static int sata_fsl_scr_write(struct ata_port *ap, unsigned int sc_reg_in, | |||
| 493 | return 0; | 493 | return 0; | 
| 494 | } | 494 | } | 
| 495 | 495 | ||
| 496 | static int sata_fsl_scr_read(struct ata_port *ap, unsigned int sc_reg_in, | 496 | static int sata_fsl_scr_read(struct ata_link *link, | 
| 497 | u32 *val) | 497 | unsigned int sc_reg_in, u32 *val) | 
| 498 | { | 498 | { | 
| 499 | struct sata_fsl_host_priv *host_priv = ap->host->private_data; | 499 | struct sata_fsl_host_priv *host_priv = link->ap->host->private_data; | 
| 500 | void __iomem *ssr_base = host_priv->ssr_base; | 500 | void __iomem *ssr_base = host_priv->ssr_base; | 
| 501 | unsigned int sc_reg; | 501 | unsigned int sc_reg; | 
| 502 | 502 | ||
| @@ -645,12 +645,12 @@ static int sata_fsl_port_start(struct ata_port *ap) | |||
| 645 | * Workaround for 8315DS board 3gbps link-up issue, | 645 | * Workaround for 8315DS board 3gbps link-up issue, | 
| 646 | * currently limit SATA port to GEN1 speed | 646 | * currently limit SATA port to GEN1 speed | 
| 647 | */ | 647 | */ | 
| 648 | sata_fsl_scr_read(ap, SCR_CONTROL, &temp); | 648 | sata_fsl_scr_read(&ap->link, SCR_CONTROL, &temp); | 
| 649 | temp &= ~(0xF << 4); | 649 | temp &= ~(0xF << 4); | 
| 650 | temp |= (0x1 << 4); | 650 | temp |= (0x1 << 4); | 
| 651 | sata_fsl_scr_write(ap, SCR_CONTROL, temp); | 651 | sata_fsl_scr_write(&ap->link, SCR_CONTROL, temp); | 
| 652 | 652 | ||
| 653 | sata_fsl_scr_read(ap, SCR_CONTROL, &temp); | 653 | sata_fsl_scr_read(&ap->link, SCR_CONTROL, &temp); | 
| 654 | dev_printk(KERN_WARNING, dev, "scr_control, speed limited to %x\n", | 654 | dev_printk(KERN_WARNING, dev, "scr_control, speed limited to %x\n", | 
| 655 | temp); | 655 | temp); | 
| 656 | #endif | 656 | #endif | 
| @@ -868,7 +868,7 @@ issue_srst: | |||
| 868 | ioread32(CQ + hcr_base), | 868 | ioread32(CQ + hcr_base), | 
| 869 | ioread32(CA + hcr_base), ioread32(CC + hcr_base)); | 869 | ioread32(CA + hcr_base), ioread32(CC + hcr_base)); | 
| 870 | 870 | ||
| 871 | sata_fsl_scr_read(ap, SCR_ERROR, &Serror); | 871 | sata_fsl_scr_read(&ap->link, SCR_ERROR, &Serror); | 
| 872 | 872 | ||
| 873 | DPRINTK("HStatus = 0x%x\n", ioread32(hcr_base + HSTATUS)); | 873 | DPRINTK("HStatus = 0x%x\n", ioread32(hcr_base + HSTATUS)); | 
| 874 | DPRINTK("HControl = 0x%x\n", ioread32(hcr_base + HCONTROL)); | 874 | DPRINTK("HControl = 0x%x\n", ioread32(hcr_base + HCONTROL)); | 
| @@ -972,9 +972,9 @@ static void sata_fsl_error_intr(struct ata_port *ap) | |||
| 972 | * Handle & Clear SError | 972 | * Handle & Clear SError | 
| 973 | */ | 973 | */ | 
| 974 | 974 | ||
| 975 | sata_fsl_scr_read(ap, SCR_ERROR, &SError); | 975 | sata_fsl_scr_read(&ap->link, SCR_ERROR, &SError); | 
| 976 | if (unlikely(SError & 0xFFFF0000)) { | 976 | if (unlikely(SError & 0xFFFF0000)) { | 
| 977 | sata_fsl_scr_write(ap, SCR_ERROR, SError); | 977 | sata_fsl_scr_write(&ap->link, SCR_ERROR, SError); | 
| 978 | } | 978 | } | 
| 979 | 979 | ||
| 980 | DPRINTK("error_intr,hStat=0x%x,CE=0x%x,DE =0x%x,SErr=0x%x\n", | 980 | DPRINTK("error_intr,hStat=0x%x,CE=0x%x,DE =0x%x,SErr=0x%x\n", | 
| @@ -1091,7 +1091,7 @@ static void sata_fsl_host_intr(struct ata_port *ap) | |||
| 1091 | 1091 | ||
| 1092 | hstatus = ioread32(hcr_base + HSTATUS); | 1092 | hstatus = ioread32(hcr_base + HSTATUS); | 
| 1093 | 1093 | ||
| 1094 | sata_fsl_scr_read(ap, SCR_ERROR, &SError); | 1094 | sata_fsl_scr_read(&ap->link, SCR_ERROR, &SError); | 
| 1095 | 1095 | ||
| 1096 | if (unlikely(SError & 0xFFFF0000)) { | 1096 | if (unlikely(SError & 0xFFFF0000)) { | 
| 1097 | DPRINTK("serror @host_intr : 0x%x\n", SError); | 1097 | DPRINTK("serror @host_intr : 0x%x\n", SError); | 
| diff --git a/drivers/ata/sata_inic162x.c b/drivers/ata/sata_inic162x.c index 5032c32fa505..fbbd87c96f10 100644 --- a/drivers/ata/sata_inic162x.c +++ b/drivers/ata/sata_inic162x.c | |||
| @@ -269,9 +269,9 @@ static void inic_reset_port(void __iomem *port_base) | |||
| 269 | writeb(0xff, port_base + PORT_IRQ_STAT); | 269 | writeb(0xff, port_base + PORT_IRQ_STAT); | 
| 270 | } | 270 | } | 
| 271 | 271 | ||
| 272 | static int inic_scr_read(struct ata_port *ap, unsigned sc_reg, u32 *val) | 272 | static int inic_scr_read(struct ata_link *link, unsigned sc_reg, u32 *val) | 
| 273 | { | 273 | { | 
| 274 | void __iomem *scr_addr = inic_port_base(ap) + PORT_SCR; | 274 | void __iomem *scr_addr = inic_port_base(link->ap) + PORT_SCR; | 
| 275 | void __iomem *addr; | 275 | void __iomem *addr; | 
| 276 | 276 | ||
| 277 | if (unlikely(sc_reg >= ARRAY_SIZE(scr_map))) | 277 | if (unlikely(sc_reg >= ARRAY_SIZE(scr_map))) | 
| @@ -286,9 +286,9 @@ static int inic_scr_read(struct ata_port *ap, unsigned sc_reg, u32 *val) | |||
| 286 | return 0; | 286 | return 0; | 
| 287 | } | 287 | } | 
| 288 | 288 | ||
| 289 | static int inic_scr_write(struct ata_port *ap, unsigned sc_reg, u32 val) | 289 | static int inic_scr_write(struct ata_link *link, unsigned sc_reg, u32 val) | 
| 290 | { | 290 | { | 
| 291 | void __iomem *scr_addr = inic_port_base(ap) + PORT_SCR; | 291 | void __iomem *scr_addr = inic_port_base(link->ap) + PORT_SCR; | 
| 292 | 292 | ||
| 293 | if (unlikely(sc_reg >= ARRAY_SIZE(scr_map))) | 293 | if (unlikely(sc_reg >= ARRAY_SIZE(scr_map))) | 
| 294 | return -EINVAL; | 294 | return -EINVAL; | 
| diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c index c815f8ecf6e6..2b24ae58b52e 100644 --- a/drivers/ata/sata_mv.c +++ b/drivers/ata/sata_mv.c | |||
| @@ -493,10 +493,10 @@ struct mv_hw_ops { | |||
| 493 | void (*reset_bus)(struct ata_host *host, void __iomem *mmio); | 493 | void (*reset_bus)(struct ata_host *host, void __iomem *mmio); | 
| 494 | }; | 494 | }; | 
| 495 | 495 | ||
| 496 | static int mv_scr_read(struct ata_port *ap, unsigned int sc_reg_in, u32 *val); | 496 | static int mv_scr_read(struct ata_link *link, unsigned int sc_reg_in, u32 *val); | 
| 497 | static int mv_scr_write(struct ata_port *ap, unsigned int sc_reg_in, u32 val); | 497 | static int mv_scr_write(struct ata_link *link, unsigned int sc_reg_in, u32 val); | 
| 498 | static int mv5_scr_read(struct ata_port *ap, unsigned int sc_reg_in, u32 *val); | 498 | static int mv5_scr_read(struct ata_link *link, unsigned int sc_reg_in, u32 *val); | 
| 499 | static int mv5_scr_write(struct ata_port *ap, unsigned int sc_reg_in, u32 val); | 499 | static int mv5_scr_write(struct ata_link *link, unsigned int sc_reg_in, u32 val); | 
| 500 | static int mv_port_start(struct ata_port *ap); | 500 | static int mv_port_start(struct ata_port *ap); | 
| 501 | static void mv_port_stop(struct ata_port *ap); | 501 | static void mv_port_stop(struct ata_port *ap); | 
| 502 | static int mv_qc_defer(struct ata_queued_cmd *qc); | 502 | static int mv_qc_defer(struct ata_queued_cmd *qc); | 
| @@ -1070,23 +1070,23 @@ static unsigned int mv_scr_offset(unsigned int sc_reg_in) | |||
| 1070 | return ofs; | 1070 | return ofs; | 
| 1071 | } | 1071 | } | 
| 1072 | 1072 | ||
| 1073 | static int mv_scr_read(struct ata_port *ap, unsigned int sc_reg_in, u32 *val) | 1073 | static int mv_scr_read(struct ata_link *link, unsigned int sc_reg_in, u32 *val) | 
| 1074 | { | 1074 | { | 
| 1075 | unsigned int ofs = mv_scr_offset(sc_reg_in); | 1075 | unsigned int ofs = mv_scr_offset(sc_reg_in); | 
| 1076 | 1076 | ||
| 1077 | if (ofs != 0xffffffffU) { | 1077 | if (ofs != 0xffffffffU) { | 
| 1078 | *val = readl(mv_ap_base(ap) + ofs); | 1078 | *val = readl(mv_ap_base(link->ap) + ofs); | 
| 1079 | return 0; | 1079 | return 0; | 
| 1080 | } else | 1080 | } else | 
| 1081 | return -EINVAL; | 1081 | return -EINVAL; | 
| 1082 | } | 1082 | } | 
| 1083 | 1083 | ||
| 1084 | static int mv_scr_write(struct ata_port *ap, unsigned int sc_reg_in, u32 val) | 1084 | static int mv_scr_write(struct ata_link *link, unsigned int sc_reg_in, u32 val) | 
| 1085 | { | 1085 | { | 
| 1086 | unsigned int ofs = mv_scr_offset(sc_reg_in); | 1086 | unsigned int ofs = mv_scr_offset(sc_reg_in); | 
| 1087 | 1087 | ||
| 1088 | if (ofs != 0xffffffffU) { | 1088 | if (ofs != 0xffffffffU) { | 
| 1089 | writelfl(val, mv_ap_base(ap) + ofs); | 1089 | writelfl(val, mv_ap_base(link->ap) + ofs); | 
| 1090 | return 0; | 1090 | return 0; | 
| 1091 | } else | 1091 | } else | 
| 1092 | return -EINVAL; | 1092 | return -EINVAL; | 
| @@ -2251,11 +2251,11 @@ static unsigned int mv5_scr_offset(unsigned int sc_reg_in) | |||
| 2251 | return ofs; | 2251 | return ofs; | 
| 2252 | } | 2252 | } | 
| 2253 | 2253 | ||
| 2254 | static int mv5_scr_read(struct ata_port *ap, unsigned int sc_reg_in, u32 *val) | 2254 | static int mv5_scr_read(struct ata_link *link, unsigned int sc_reg_in, u32 *val) | 
| 2255 | { | 2255 | { | 
| 2256 | struct mv_host_priv *hpriv = ap->host->private_data; | 2256 | struct mv_host_priv *hpriv = link->ap->host->private_data; | 
| 2257 | void __iomem *mmio = hpriv->base; | 2257 | void __iomem *mmio = hpriv->base; | 
| 2258 | void __iomem *addr = mv5_phy_base(mmio, ap->port_no); | 2258 | void __iomem *addr = mv5_phy_base(mmio, link->ap->port_no); | 
| 2259 | unsigned int ofs = mv5_scr_offset(sc_reg_in); | 2259 | unsigned int ofs = mv5_scr_offset(sc_reg_in); | 
| 2260 | 2260 | ||
| 2261 | if (ofs != 0xffffffffU) { | 2261 | if (ofs != 0xffffffffU) { | 
| @@ -2265,11 +2265,11 @@ static int mv5_scr_read(struct ata_port *ap, unsigned int sc_reg_in, u32 *val) | |||
| 2265 | return -EINVAL; | 2265 | return -EINVAL; | 
| 2266 | } | 2266 | } | 
| 2267 | 2267 | ||
| 2268 | static int mv5_scr_write(struct ata_port *ap, unsigned int sc_reg_in, u32 val) | 2268 | static int mv5_scr_write(struct ata_link *link, unsigned int sc_reg_in, u32 val) | 
| 2269 | { | 2269 | { | 
| 2270 | struct mv_host_priv *hpriv = ap->host->private_data; | 2270 | struct mv_host_priv *hpriv = link->ap->host->private_data; | 
| 2271 | void __iomem *mmio = hpriv->base; | 2271 | void __iomem *mmio = hpriv->base; | 
| 2272 | void __iomem *addr = mv5_phy_base(mmio, ap->port_no); | 2272 | void __iomem *addr = mv5_phy_base(mmio, link->ap->port_no); | 
| 2273 | unsigned int ofs = mv5_scr_offset(sc_reg_in); | 2273 | unsigned int ofs = mv5_scr_offset(sc_reg_in); | 
| 2274 | 2274 | ||
| 2275 | if (ofs != 0xffffffffU) { | 2275 | if (ofs != 0xffffffffU) { | 
| diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c index 14601dc05e41..fae3841de0d8 100644 --- a/drivers/ata/sata_nv.c +++ b/drivers/ata/sata_nv.c | |||
| @@ -302,8 +302,8 @@ static void nv_ck804_host_stop(struct ata_host *host); | |||
| 302 | static irqreturn_t nv_generic_interrupt(int irq, void *dev_instance); | 302 | static irqreturn_t nv_generic_interrupt(int irq, void *dev_instance); | 
| 303 | static irqreturn_t nv_nf2_interrupt(int irq, void *dev_instance); | 303 | static irqreturn_t nv_nf2_interrupt(int irq, void *dev_instance); | 
| 304 | static irqreturn_t nv_ck804_interrupt(int irq, void *dev_instance); | 304 | static irqreturn_t nv_ck804_interrupt(int irq, void *dev_instance); | 
| 305 | static int nv_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val); | 305 | static int nv_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val); | 
| 306 | static int nv_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val); | 306 | static int nv_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val); | 
| 307 | 307 | ||
| 308 | static void nv_nf2_freeze(struct ata_port *ap); | 308 | static void nv_nf2_freeze(struct ata_port *ap); | 
| 309 | static void nv_nf2_thaw(struct ata_port *ap); | 309 | static void nv_nf2_thaw(struct ata_port *ap); | 
| @@ -1511,21 +1511,21 @@ static irqreturn_t nv_ck804_interrupt(int irq, void *dev_instance) | |||
| 1511 | return ret; | 1511 | return ret; | 
| 1512 | } | 1512 | } | 
| 1513 | 1513 | ||
| 1514 | static int nv_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) | 1514 | static int nv_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val) | 
| 1515 | { | 1515 | { | 
| 1516 | if (sc_reg > SCR_CONTROL) | 1516 | if (sc_reg > SCR_CONTROL) | 
| 1517 | return -EINVAL; | 1517 | return -EINVAL; | 
| 1518 | 1518 | ||
| 1519 | *val = ioread32(ap->ioaddr.scr_addr + (sc_reg * 4)); | 1519 | *val = ioread32(link->ap->ioaddr.scr_addr + (sc_reg * 4)); | 
| 1520 | return 0; | 1520 | return 0; | 
| 1521 | } | 1521 | } | 
| 1522 | 1522 | ||
| 1523 | static int nv_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val) | 1523 | static int nv_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val) | 
| 1524 | { | 1524 | { | 
| 1525 | if (sc_reg > SCR_CONTROL) | 1525 | if (sc_reg > SCR_CONTROL) | 
| 1526 | return -EINVAL; | 1526 | return -EINVAL; | 
| 1527 | 1527 | ||
| 1528 | iowrite32(val, ap->ioaddr.scr_addr + (sc_reg * 4)); | 1528 | iowrite32(val, link->ap->ioaddr.scr_addr + (sc_reg * 4)); | 
| 1529 | return 0; | 1529 | return 0; | 
| 1530 | } | 1530 | } | 
| 1531 | 1531 | ||
| @@ -2218,9 +2218,9 @@ static void nv_swncq_host_interrupt(struct ata_port *ap, u16 fis) | |||
| 2218 | if (!pp->qc_active) | 2218 | if (!pp->qc_active) | 
| 2219 | return; | 2219 | return; | 
| 2220 | 2220 | ||
| 2221 | if (ap->ops->scr_read(ap, SCR_ERROR, &serror)) | 2221 | if (ap->ops->scr_read(&ap->link, SCR_ERROR, &serror)) | 
| 2222 | return; | 2222 | return; | 
| 2223 | ap->ops->scr_write(ap, SCR_ERROR, serror); | 2223 | ap->ops->scr_write(&ap->link, SCR_ERROR, serror); | 
| 2224 | 2224 | ||
| 2225 | if (ata_stat & ATA_ERR) { | 2225 | if (ata_stat & ATA_ERR) { | 
| 2226 | ata_ehi_clear_desc(ehi); | 2226 | ata_ehi_clear_desc(ehi); | 
| diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c index 030665ba76b7..750d8cdc00cd 100644 --- a/drivers/ata/sata_promise.c +++ b/drivers/ata/sata_promise.c | |||
| @@ -137,8 +137,8 @@ struct pdc_port_priv { | |||
| 137 | dma_addr_t pkt_dma; | 137 | dma_addr_t pkt_dma; | 
| 138 | }; | 138 | }; | 
| 139 | 139 | ||
| 140 | static int pdc_sata_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val); | 140 | static int pdc_sata_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val); | 
| 141 | static int pdc_sata_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val); | 141 | static int pdc_sata_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val); | 
| 142 | static int pdc_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); | 142 | static int pdc_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); | 
| 143 | static int pdc_common_port_start(struct ata_port *ap); | 143 | static int pdc_common_port_start(struct ata_port *ap); | 
| 144 | static int pdc_sata_port_start(struct ata_port *ap); | 144 | static int pdc_sata_port_start(struct ata_port *ap); | 
| @@ -386,19 +386,21 @@ static int pdc_sata_cable_detect(struct ata_port *ap) | |||
| 386 | return ATA_CBL_SATA; | 386 | return ATA_CBL_SATA; | 
| 387 | } | 387 | } | 
| 388 | 388 | ||
| 389 | static int pdc_sata_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) | 389 | static int pdc_sata_scr_read(struct ata_link *link, | 
| 390 | unsigned int sc_reg, u32 *val) | ||
| 390 | { | 391 | { | 
| 391 | if (sc_reg > SCR_CONTROL) | 392 | if (sc_reg > SCR_CONTROL) | 
| 392 | return -EINVAL; | 393 | return -EINVAL; | 
| 393 | *val = readl(ap->ioaddr.scr_addr + (sc_reg * 4)); | 394 | *val = readl(link->ap->ioaddr.scr_addr + (sc_reg * 4)); | 
| 394 | return 0; | 395 | return 0; | 
| 395 | } | 396 | } | 
| 396 | 397 | ||
| 397 | static int pdc_sata_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val) | 398 | static int pdc_sata_scr_write(struct ata_link *link, | 
| 399 | unsigned int sc_reg, u32 val) | ||
| 398 | { | 400 | { | 
| 399 | if (sc_reg > SCR_CONTROL) | 401 | if (sc_reg > SCR_CONTROL) | 
| 400 | return -EINVAL; | 402 | return -EINVAL; | 
| 401 | writel(val, ap->ioaddr.scr_addr + (sc_reg * 4)); | 403 | writel(val, link->ap->ioaddr.scr_addr + (sc_reg * 4)); | 
| 402 | return 0; | 404 | return 0; | 
| 403 | } | 405 | } | 
| 404 | 406 | ||
| @@ -731,7 +733,7 @@ static void pdc_error_intr(struct ata_port *ap, struct ata_queued_cmd *qc, | |||
| 731 | if (sata_scr_valid(&ap->link)) { | 733 | if (sata_scr_valid(&ap->link)) { | 
| 732 | u32 serror; | 734 | u32 serror; | 
| 733 | 735 | ||
| 734 | pdc_sata_scr_read(ap, SCR_ERROR, &serror); | 736 | pdc_sata_scr_read(&ap->link, SCR_ERROR, &serror); | 
| 735 | ehi->serror |= serror; | 737 | ehi->serror |= serror; | 
| 736 | } | 738 | } | 
| 737 | 739 | ||
| diff --git a/drivers/ata/sata_qstor.c b/drivers/ata/sata_qstor.c index 1600107047cf..a000c86ac859 100644 --- a/drivers/ata/sata_qstor.c +++ b/drivers/ata/sata_qstor.c | |||
| @@ -111,8 +111,8 @@ struct qs_port_priv { | |||
| 111 | qs_state_t state; | 111 | qs_state_t state; | 
| 112 | }; | 112 | }; | 
| 113 | 113 | ||
| 114 | static int qs_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val); | 114 | static int qs_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val); | 
| 115 | static int qs_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val); | 115 | static int qs_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val); | 
| 116 | static int qs_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); | 116 | static int qs_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); | 
| 117 | static int qs_port_start(struct ata_port *ap); | 117 | static int qs_port_start(struct ata_port *ap); | 
| 118 | static void qs_host_stop(struct ata_host *host); | 118 | static void qs_host_stop(struct ata_host *host); | 
| @@ -242,11 +242,11 @@ static int qs_prereset(struct ata_link *link, unsigned long deadline) | |||
| 242 | return ata_sff_prereset(link, deadline); | 242 | return ata_sff_prereset(link, deadline); | 
| 243 | } | 243 | } | 
| 244 | 244 | ||
| 245 | static int qs_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) | 245 | static int qs_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val) | 
| 246 | { | 246 | { | 
| 247 | if (sc_reg > SCR_CONTROL) | 247 | if (sc_reg > SCR_CONTROL) | 
| 248 | return -EINVAL; | 248 | return -EINVAL; | 
| 249 | *val = readl(ap->ioaddr.scr_addr + (sc_reg * 8)); | 249 | *val = readl(link->ap->ioaddr.scr_addr + (sc_reg * 8)); | 
| 250 | return 0; | 250 | return 0; | 
| 251 | } | 251 | } | 
| 252 | 252 | ||
| @@ -256,11 +256,11 @@ static void qs_error_handler(struct ata_port *ap) | |||
| 256 | ata_std_error_handler(ap); | 256 | ata_std_error_handler(ap); | 
| 257 | } | 257 | } | 
| 258 | 258 | ||
| 259 | static int qs_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val) | 259 | static int qs_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val) | 
| 260 | { | 260 | { | 
| 261 | if (sc_reg > SCR_CONTROL) | 261 | if (sc_reg > SCR_CONTROL) | 
| 262 | return -EINVAL; | 262 | return -EINVAL; | 
| 263 | writel(val, ap->ioaddr.scr_addr + (sc_reg * 8)); | 263 | writel(val, link->ap->ioaddr.scr_addr + (sc_reg * 8)); | 
| 264 | return 0; | 264 | return 0; | 
| 265 | } | 265 | } | 
| 266 | 266 | ||
| diff --git a/drivers/ata/sata_sil.c b/drivers/ata/sata_sil.c index 88bf4212590f..031d7b7dee34 100644 --- a/drivers/ata/sata_sil.c +++ b/drivers/ata/sata_sil.c | |||
| @@ -115,8 +115,8 @@ static int sil_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); | |||
| 115 | static int sil_pci_device_resume(struct pci_dev *pdev); | 115 | static int sil_pci_device_resume(struct pci_dev *pdev); | 
| 116 | #endif | 116 | #endif | 
| 117 | static void sil_dev_config(struct ata_device *dev); | 117 | static void sil_dev_config(struct ata_device *dev); | 
| 118 | static int sil_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val); | 118 | static int sil_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val); | 
| 119 | static int sil_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val); | 119 | static int sil_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val); | 
| 120 | static int sil_set_mode(struct ata_link *link, struct ata_device **r_failed); | 120 | static int sil_set_mode(struct ata_link *link, struct ata_device **r_failed); | 
| 121 | static void sil_freeze(struct ata_port *ap); | 121 | static void sil_freeze(struct ata_port *ap); | 
| 122 | static void sil_thaw(struct ata_port *ap); | 122 | static void sil_thaw(struct ata_port *ap); | 
| @@ -317,9 +317,9 @@ static inline void __iomem *sil_scr_addr(struct ata_port *ap, | |||
| 317 | return NULL; | 317 | return NULL; | 
| 318 | } | 318 | } | 
| 319 | 319 | ||
| 320 | static int sil_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) | 320 | static int sil_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val) | 
| 321 | { | 321 | { | 
| 322 | void __iomem *mmio = sil_scr_addr(ap, sc_reg); | 322 | void __iomem *mmio = sil_scr_addr(link->ap, sc_reg); | 
| 323 | 323 | ||
| 324 | if (mmio) { | 324 | if (mmio) { | 
| 325 | *val = readl(mmio); | 325 | *val = readl(mmio); | 
| @@ -328,9 +328,9 @@ static int sil_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) | |||
| 328 | return -EINVAL; | 328 | return -EINVAL; | 
| 329 | } | 329 | } | 
| 330 | 330 | ||
| 331 | static int sil_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val) | 331 | static int sil_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val) | 
| 332 | { | 332 | { | 
| 333 | void __iomem *mmio = sil_scr_addr(ap, sc_reg); | 333 | void __iomem *mmio = sil_scr_addr(link->ap, sc_reg); | 
| 334 | 334 | ||
| 335 | if (mmio) { | 335 | if (mmio) { | 
| 336 | writel(val, mmio); | 336 | writel(val, mmio); | 
| @@ -352,8 +352,8 @@ static void sil_host_intr(struct ata_port *ap, u32 bmdma2) | |||
| 352 | * controllers continue to assert IRQ as long as | 352 | * controllers continue to assert IRQ as long as | 
| 353 | * SError bits are pending. Clear SError immediately. | 353 | * SError bits are pending. Clear SError immediately. | 
| 354 | */ | 354 | */ | 
| 355 | sil_scr_read(ap, SCR_ERROR, &serror); | 355 | sil_scr_read(&ap->link, SCR_ERROR, &serror); | 
| 356 | sil_scr_write(ap, SCR_ERROR, serror); | 356 | sil_scr_write(&ap->link, SCR_ERROR, serror); | 
| 357 | 357 | ||
| 358 | /* Sometimes spurious interrupts occur, double check | 358 | /* Sometimes spurious interrupts occur, double check | 
| 359 | * it's PHYRDY CHG. | 359 | * it's PHYRDY CHG. | 
| diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c index 84ffcc26a74b..4621807a1a6a 100644 --- a/drivers/ata/sata_sil24.c +++ b/drivers/ata/sata_sil24.c | |||
| @@ -340,8 +340,8 @@ struct sil24_port_priv { | |||
| 340 | }; | 340 | }; | 
| 341 | 341 | ||
| 342 | static void sil24_dev_config(struct ata_device *dev); | 342 | static void sil24_dev_config(struct ata_device *dev); | 
| 343 | static int sil24_scr_read(struct ata_port *ap, unsigned sc_reg, u32 *val); | 343 | static int sil24_scr_read(struct ata_link *link, unsigned sc_reg, u32 *val); | 
| 344 | static int sil24_scr_write(struct ata_port *ap, unsigned sc_reg, u32 val); | 344 | static int sil24_scr_write(struct ata_link *link, unsigned sc_reg, u32 val); | 
| 345 | static int sil24_qc_defer(struct ata_queued_cmd *qc); | 345 | static int sil24_qc_defer(struct ata_queued_cmd *qc); | 
| 346 | static void sil24_qc_prep(struct ata_queued_cmd *qc); | 346 | static void sil24_qc_prep(struct ata_queued_cmd *qc); | 
| 347 | static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc); | 347 | static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc); | 
| @@ -504,9 +504,9 @@ static int sil24_scr_map[] = { | |||
| 504 | [SCR_ACTIVE] = 3, | 504 | [SCR_ACTIVE] = 3, | 
| 505 | }; | 505 | }; | 
| 506 | 506 | ||
| 507 | static int sil24_scr_read(struct ata_port *ap, unsigned sc_reg, u32 *val) | 507 | static int sil24_scr_read(struct ata_link *link, unsigned sc_reg, u32 *val) | 
| 508 | { | 508 | { | 
| 509 | void __iomem *scr_addr = sil24_port_base(ap) + PORT_SCONTROL; | 509 | void __iomem *scr_addr = sil24_port_base(link->ap) + PORT_SCONTROL; | 
| 510 | 510 | ||
| 511 | if (sc_reg < ARRAY_SIZE(sil24_scr_map)) { | 511 | if (sc_reg < ARRAY_SIZE(sil24_scr_map)) { | 
| 512 | void __iomem *addr; | 512 | void __iomem *addr; | 
| @@ -517,9 +517,9 @@ static int sil24_scr_read(struct ata_port *ap, unsigned sc_reg, u32 *val) | |||
| 517 | return -EINVAL; | 517 | return -EINVAL; | 
| 518 | } | 518 | } | 
| 519 | 519 | ||
| 520 | static int sil24_scr_write(struct ata_port *ap, unsigned sc_reg, u32 val) | 520 | static int sil24_scr_write(struct ata_link *link, unsigned sc_reg, u32 val) | 
| 521 | { | 521 | { | 
| 522 | void __iomem *scr_addr = sil24_port_base(ap) + PORT_SCONTROL; | 522 | void __iomem *scr_addr = sil24_port_base(link->ap) + PORT_SCONTROL; | 
| 523 | 523 | ||
| 524 | if (sc_reg < ARRAY_SIZE(sil24_scr_map)) { | 524 | if (sc_reg < ARRAY_SIZE(sil24_scr_map)) { | 
| 525 | void __iomem *addr; | 525 | void __iomem *addr; | 
| diff --git a/drivers/ata/sata_sis.c b/drivers/ata/sata_sis.c index 1010b3069bd5..9c43b4e7c4a6 100644 --- a/drivers/ata/sata_sis.c +++ b/drivers/ata/sata_sis.c | |||
| @@ -64,8 +64,8 @@ enum { | |||
| 64 | }; | 64 | }; | 
| 65 | 65 | ||
| 66 | static int sis_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); | 66 | static int sis_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); | 
| 67 | static int sis_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val); | 67 | static int sis_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val); | 
| 68 | static int sis_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val); | 68 | static int sis_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val); | 
| 69 | 69 | ||
| 70 | static const struct pci_device_id sis_pci_tbl[] = { | 70 | static const struct pci_device_id sis_pci_tbl[] = { | 
| 71 | { PCI_VDEVICE(SI, 0x0180), sis_180 }, /* SiS 964/180 */ | 71 | { PCI_VDEVICE(SI, 0x0180), sis_180 }, /* SiS 964/180 */ | 
| @@ -134,10 +134,11 @@ static unsigned int get_scr_cfg_addr(struct ata_port *ap, unsigned int sc_reg) | |||
| 134 | return addr; | 134 | return addr; | 
| 135 | } | 135 | } | 
| 136 | 136 | ||
| 137 | static u32 sis_scr_cfg_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) | 137 | static u32 sis_scr_cfg_read(struct ata_link *link, | 
| 138 | unsigned int sc_reg, u32 *val) | ||
| 138 | { | 139 | { | 
| 139 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 140 | struct pci_dev *pdev = to_pci_dev(link->ap->host->dev); | 
| 140 | unsigned int cfg_addr = get_scr_cfg_addr(ap, sc_reg); | 141 | unsigned int cfg_addr = get_scr_cfg_addr(link->ap, sc_reg); | 
| 141 | u32 val2 = 0; | 142 | u32 val2 = 0; | 
| 142 | u8 pmr; | 143 | u8 pmr; | 
| 143 | 144 | ||
| @@ -158,10 +159,11 @@ static u32 sis_scr_cfg_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) | |||
| 158 | return 0; | 159 | return 0; | 
| 159 | } | 160 | } | 
| 160 | 161 | ||
| 161 | static int sis_scr_cfg_write(struct ata_port *ap, unsigned int sc_reg, u32 val) | 162 | static int sis_scr_cfg_write(struct ata_link *link, | 
| 163 | unsigned int sc_reg, u32 val) | ||
| 162 | { | 164 | { | 
| 163 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 165 | struct pci_dev *pdev = to_pci_dev(link->ap->host->dev); | 
| 164 | unsigned int cfg_addr = get_scr_cfg_addr(ap, sc_reg); | 166 | unsigned int cfg_addr = get_scr_cfg_addr(link->ap, sc_reg); | 
| 165 | u8 pmr; | 167 | u8 pmr; | 
| 166 | 168 | ||
| 167 | if (sc_reg == SCR_ERROR) /* doesn't exist in PCI cfg space */ | 169 | if (sc_reg == SCR_ERROR) /* doesn't exist in PCI cfg space */ | 
| @@ -178,8 +180,9 @@ static int sis_scr_cfg_write(struct ata_port *ap, unsigned int sc_reg, u32 val) | |||
| 178 | return 0; | 180 | return 0; | 
| 179 | } | 181 | } | 
| 180 | 182 | ||
| 181 | static int sis_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) | 183 | static int sis_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val) | 
| 182 | { | 184 | { | 
| 185 | struct ata_port *ap = link->ap; | ||
| 183 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 186 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 
| 184 | u8 pmr; | 187 | u8 pmr; | 
| 185 | 188 | ||
| @@ -187,7 +190,7 @@ static int sis_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) | |||
| 187 | return -EINVAL; | 190 | return -EINVAL; | 
| 188 | 191 | ||
| 189 | if (ap->flags & SIS_FLAG_CFGSCR) | 192 | if (ap->flags & SIS_FLAG_CFGSCR) | 
| 190 | return sis_scr_cfg_read(ap, sc_reg, val); | 193 | return sis_scr_cfg_read(link, sc_reg, val); | 
| 191 | 194 | ||
| 192 | pci_read_config_byte(pdev, SIS_PMR, &pmr); | 195 | pci_read_config_byte(pdev, SIS_PMR, &pmr); | 
| 193 | 196 | ||
| @@ -202,8 +205,9 @@ static int sis_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) | |||
| 202 | return 0; | 205 | return 0; | 
| 203 | } | 206 | } | 
| 204 | 207 | ||
| 205 | static int sis_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val) | 208 | static int sis_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val) | 
| 206 | { | 209 | { | 
| 210 | struct ata_port *ap = link->ap; | ||
| 207 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 211 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 
| 208 | u8 pmr; | 212 | u8 pmr; | 
| 209 | 213 | ||
| @@ -213,7 +217,7 @@ static int sis_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val) | |||
| 213 | pci_read_config_byte(pdev, SIS_PMR, &pmr); | 217 | pci_read_config_byte(pdev, SIS_PMR, &pmr); | 
| 214 | 218 | ||
| 215 | if (ap->flags & SIS_FLAG_CFGSCR) | 219 | if (ap->flags & SIS_FLAG_CFGSCR) | 
| 216 | return sis_scr_cfg_write(ap, sc_reg, val); | 220 | return sis_scr_cfg_write(link, sc_reg, val); | 
| 217 | else { | 221 | else { | 
| 218 | iowrite32(val, ap->ioaddr.scr_addr + (sc_reg * 4)); | 222 | iowrite32(val, ap->ioaddr.scr_addr + (sc_reg * 4)); | 
| 219 | if ((pdev->device == 0x0182) || (pdev->device == 0x0183) || | 223 | if ((pdev->device == 0x0182) || (pdev->device == 0x0183) || | 
| diff --git a/drivers/ata/sata_svw.c b/drivers/ata/sata_svw.c index fb13b82aacba..609d147813ae 100644 --- a/drivers/ata/sata_svw.c +++ b/drivers/ata/sata_svw.c | |||
| @@ -123,20 +123,22 @@ static int k2_sata_check_atapi_dma(struct ata_queued_cmd *qc) | |||
| 123 | } | 123 | } | 
| 124 | } | 124 | } | 
| 125 | 125 | ||
| 126 | static int k2_sata_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) | 126 | static int k2_sata_scr_read(struct ata_link *link, | 
| 127 | unsigned int sc_reg, u32 *val) | ||
| 127 | { | 128 | { | 
| 128 | if (sc_reg > SCR_CONTROL) | 129 | if (sc_reg > SCR_CONTROL) | 
| 129 | return -EINVAL; | 130 | return -EINVAL; | 
| 130 | *val = readl(ap->ioaddr.scr_addr + (sc_reg * 4)); | 131 | *val = readl(link->ap->ioaddr.scr_addr + (sc_reg * 4)); | 
| 131 | return 0; | 132 | return 0; | 
| 132 | } | 133 | } | 
| 133 | 134 | ||
| 134 | 135 | ||
| 135 | static int k2_sata_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val) | 136 | static int k2_sata_scr_write(struct ata_link *link, | 
| 137 | unsigned int sc_reg, u32 val) | ||
| 136 | { | 138 | { | 
| 137 | if (sc_reg > SCR_CONTROL) | 139 | if (sc_reg > SCR_CONTROL) | 
| 138 | return -EINVAL; | 140 | return -EINVAL; | 
| 139 | writel(val, ap->ioaddr.scr_addr + (sc_reg * 4)); | 141 | writel(val, link->ap->ioaddr.scr_addr + (sc_reg * 4)); | 
| 140 | return 0; | 142 | return 0; | 
| 141 | } | 143 | } | 
| 142 | 144 | ||
| diff --git a/drivers/ata/sata_uli.c b/drivers/ata/sata_uli.c index db529b849948..019575bb3e08 100644 --- a/drivers/ata/sata_uli.c +++ b/drivers/ata/sata_uli.c | |||
| @@ -57,8 +57,8 @@ struct uli_priv { | |||
| 57 | }; | 57 | }; | 
| 58 | 58 | ||
| 59 | static int uli_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); | 59 | static int uli_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); | 
| 60 | static int uli_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val); | 60 | static int uli_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val); | 
| 61 | static int uli_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val); | 61 | static int uli_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val); | 
| 62 | 62 | ||
| 63 | static const struct pci_device_id uli_pci_tbl[] = { | 63 | static const struct pci_device_id uli_pci_tbl[] = { | 
| 64 | { PCI_VDEVICE(AL, 0x5289), uli_5289 }, | 64 | { PCI_VDEVICE(AL, 0x5289), uli_5289 }, | 
| @@ -107,39 +107,39 @@ static unsigned int get_scr_cfg_addr(struct ata_port *ap, unsigned int sc_reg) | |||
| 107 | return hpriv->scr_cfg_addr[ap->port_no] + (4 * sc_reg); | 107 | return hpriv->scr_cfg_addr[ap->port_no] + (4 * sc_reg); | 
| 108 | } | 108 | } | 
| 109 | 109 | ||
| 110 | static u32 uli_scr_cfg_read(struct ata_port *ap, unsigned int sc_reg) | 110 | static u32 uli_scr_cfg_read(struct ata_link *link, unsigned int sc_reg) | 
| 111 | { | 111 | { | 
| 112 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 112 | struct pci_dev *pdev = to_pci_dev(link->ap->host->dev); | 
| 113 | unsigned int cfg_addr = get_scr_cfg_addr(ap, sc_reg); | 113 | unsigned int cfg_addr = get_scr_cfg_addr(link->ap, sc_reg); | 
| 114 | u32 val; | 114 | u32 val; | 
| 115 | 115 | ||
| 116 | pci_read_config_dword(pdev, cfg_addr, &val); | 116 | pci_read_config_dword(pdev, cfg_addr, &val); | 
| 117 | return val; | 117 | return val; | 
| 118 | } | 118 | } | 
| 119 | 119 | ||
| 120 | static void uli_scr_cfg_write(struct ata_port *ap, unsigned int scr, u32 val) | 120 | static void uli_scr_cfg_write(struct ata_link *link, unsigned int scr, u32 val) | 
| 121 | { | 121 | { | 
| 122 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 122 | struct pci_dev *pdev = to_pci_dev(link->ap->host->dev); | 
| 123 | unsigned int cfg_addr = get_scr_cfg_addr(ap, scr); | 123 | unsigned int cfg_addr = get_scr_cfg_addr(link->ap, scr); | 
| 124 | 124 | ||
| 125 | pci_write_config_dword(pdev, cfg_addr, val); | 125 | pci_write_config_dword(pdev, cfg_addr, val); | 
| 126 | } | 126 | } | 
| 127 | 127 | ||
| 128 | static int uli_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) | 128 | static int uli_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val) | 
| 129 | { | 129 | { | 
| 130 | if (sc_reg > SCR_CONTROL) | 130 | if (sc_reg > SCR_CONTROL) | 
| 131 | return -EINVAL; | 131 | return -EINVAL; | 
| 132 | 132 | ||
| 133 | *val = uli_scr_cfg_read(ap, sc_reg); | 133 | *val = uli_scr_cfg_read(link, sc_reg); | 
| 134 | return 0; | 134 | return 0; | 
| 135 | } | 135 | } | 
| 136 | 136 | ||
| 137 | static int uli_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val) | 137 | static int uli_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val) | 
| 138 | { | 138 | { | 
| 139 | if (sc_reg > SCR_CONTROL) //SCR_CONTROL=2, SCR_ERROR=1, SCR_STATUS=0 | 139 | if (sc_reg > SCR_CONTROL) //SCR_CONTROL=2, SCR_ERROR=1, SCR_STATUS=0 | 
| 140 | return -EINVAL; | 140 | return -EINVAL; | 
| 141 | 141 | ||
| 142 | uli_scr_cfg_write(ap, sc_reg, val); | 142 | uli_scr_cfg_write(link, sc_reg, val); | 
| 143 | return 0; | 143 | return 0; | 
| 144 | } | 144 | } | 
| 145 | 145 | ||
| diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c index 96deeb354e16..1cfa74535d91 100644 --- a/drivers/ata/sata_via.c +++ b/drivers/ata/sata_via.c | |||
| @@ -68,8 +68,8 @@ enum { | |||
| 68 | }; | 68 | }; | 
| 69 | 69 | ||
| 70 | static int svia_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); | 70 | static int svia_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); | 
| 71 | static int svia_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val); | 71 | static int svia_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val); | 
| 72 | static int svia_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val); | 72 | static int svia_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val); | 
| 73 | static void svia_noop_freeze(struct ata_port *ap); | 73 | static void svia_noop_freeze(struct ata_port *ap); | 
| 74 | static int vt6420_prereset(struct ata_link *link, unsigned long deadline); | 74 | static int vt6420_prereset(struct ata_link *link, unsigned long deadline); | 
| 75 | static int vt6421_pata_cable_detect(struct ata_port *ap); | 75 | static int vt6421_pata_cable_detect(struct ata_port *ap); | 
| @@ -152,19 +152,19 @@ MODULE_LICENSE("GPL"); | |||
| 152 | MODULE_DEVICE_TABLE(pci, svia_pci_tbl); | 152 | MODULE_DEVICE_TABLE(pci, svia_pci_tbl); | 
| 153 | MODULE_VERSION(DRV_VERSION); | 153 | MODULE_VERSION(DRV_VERSION); | 
| 154 | 154 | ||
| 155 | static int svia_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) | 155 | static int svia_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val) | 
| 156 | { | 156 | { | 
| 157 | if (sc_reg > SCR_CONTROL) | 157 | if (sc_reg > SCR_CONTROL) | 
| 158 | return -EINVAL; | 158 | return -EINVAL; | 
| 159 | *val = ioread32(ap->ioaddr.scr_addr + (4 * sc_reg)); | 159 | *val = ioread32(link->ap->ioaddr.scr_addr + (4 * sc_reg)); | 
| 160 | return 0; | 160 | return 0; | 
| 161 | } | 161 | } | 
| 162 | 162 | ||
| 163 | static int svia_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val) | 163 | static int svia_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val) | 
| 164 | { | 164 | { | 
| 165 | if (sc_reg > SCR_CONTROL) | 165 | if (sc_reg > SCR_CONTROL) | 
| 166 | return -EINVAL; | 166 | return -EINVAL; | 
| 167 | iowrite32(val, ap->ioaddr.scr_addr + (4 * sc_reg)); | 167 | iowrite32(val, link->ap->ioaddr.scr_addr + (4 * sc_reg)); | 
| 168 | return 0; | 168 | return 0; | 
| 169 | } | 169 | } | 
| 170 | 170 | ||
| @@ -210,20 +210,20 @@ static int vt6420_prereset(struct ata_link *link, unsigned long deadline) | |||
| 210 | goto skip_scr; | 210 | goto skip_scr; | 
| 211 | 211 | ||
| 212 | /* Resume phy. This is the old SATA resume sequence */ | 212 | /* Resume phy. This is the old SATA resume sequence */ | 
| 213 | svia_scr_write(ap, SCR_CONTROL, 0x300); | 213 | svia_scr_write(link, SCR_CONTROL, 0x300); | 
| 214 | svia_scr_read(ap, SCR_CONTROL, &scontrol); /* flush */ | 214 | svia_scr_read(link, SCR_CONTROL, &scontrol); /* flush */ | 
| 215 | 215 | ||
| 216 | /* wait for phy to become ready, if necessary */ | 216 | /* wait for phy to become ready, if necessary */ | 
| 217 | do { | 217 | do { | 
| 218 | msleep(200); | 218 | msleep(200); | 
| 219 | svia_scr_read(ap, SCR_STATUS, &sstatus); | 219 | svia_scr_read(link, SCR_STATUS, &sstatus); | 
| 220 | if ((sstatus & 0xf) != 1) | 220 | if ((sstatus & 0xf) != 1) | 
| 221 | break; | 221 | break; | 
| 222 | } while (time_before(jiffies, timeout)); | 222 | } while (time_before(jiffies, timeout)); | 
| 223 | 223 | ||
| 224 | /* open code sata_print_link_status() */ | 224 | /* open code sata_print_link_status() */ | 
| 225 | svia_scr_read(ap, SCR_STATUS, &sstatus); | 225 | svia_scr_read(link, SCR_STATUS, &sstatus); | 
| 226 | svia_scr_read(ap, SCR_CONTROL, &scontrol); | 226 | svia_scr_read(link, SCR_CONTROL, &scontrol); | 
| 227 | 227 | ||
| 228 | online = (sstatus & 0xf) == 0x3; | 228 | online = (sstatus & 0xf) == 0x3; | 
| 229 | 229 | ||
| @@ -232,7 +232,7 @@ static int vt6420_prereset(struct ata_link *link, unsigned long deadline) | |||
| 232 | online ? "up" : "down", sstatus, scontrol); | 232 | online ? "up" : "down", sstatus, scontrol); | 
| 233 | 233 | ||
| 234 | /* SStatus is read one more time */ | 234 | /* SStatus is read one more time */ | 
| 235 | svia_scr_read(ap, SCR_STATUS, &sstatus); | 235 | svia_scr_read(link, SCR_STATUS, &sstatus); | 
| 236 | 236 | ||
| 237 | if (!online) { | 237 | if (!online) { | 
| 238 | /* tell EH to bail */ | 238 | /* tell EH to bail */ | 
| diff --git a/drivers/ata/sata_vsc.c b/drivers/ata/sata_vsc.c index f3d635c0a2e9..c57cdff9e6bd 100644 --- a/drivers/ata/sata_vsc.c +++ b/drivers/ata/sata_vsc.c | |||
| @@ -98,20 +98,22 @@ enum { | |||
| 98 | VSC_SATA_INT_PHY_CHANGE), | 98 | VSC_SATA_INT_PHY_CHANGE), | 
| 99 | }; | 99 | }; | 
| 100 | 100 | ||
| 101 | static int vsc_sata_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) | 101 | static int vsc_sata_scr_read(struct ata_link *link, | 
| 102 | unsigned int sc_reg, u32 *val) | ||
| 102 | { | 103 | { | 
| 103 | if (sc_reg > SCR_CONTROL) | 104 | if (sc_reg > SCR_CONTROL) | 
| 104 | return -EINVAL; | 105 | return -EINVAL; | 
| 105 | *val = readl(ap->ioaddr.scr_addr + (sc_reg * 4)); | 106 | *val = readl(link->ap->ioaddr.scr_addr + (sc_reg * 4)); | 
| 106 | return 0; | 107 | return 0; | 
| 107 | } | 108 | } | 
| 108 | 109 | ||
| 109 | 110 | ||
| 110 | static int vsc_sata_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val) | 111 | static int vsc_sata_scr_write(struct ata_link *link, | 
| 112 | unsigned int sc_reg, u32 val) | ||
| 111 | { | 113 | { | 
| 112 | if (sc_reg > SCR_CONTROL) | 114 | if (sc_reg > SCR_CONTROL) | 
| 113 | return -EINVAL; | 115 | return -EINVAL; | 
| 114 | writel(val, ap->ioaddr.scr_addr + (sc_reg * 4)); | 116 | writel(val, link->ap->ioaddr.scr_addr + (sc_reg * 4)); | 
| 115 | return 0; | 117 | return 0; | 
| 116 | } | 118 | } | 
| 117 | 119 | ||
| diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c index 48ee8c7f5bdd..e1872989710a 100644 --- a/drivers/scsi/libsas/sas_ata.c +++ b/drivers/scsi/libsas/sas_ata.c | |||
| @@ -294,10 +294,10 @@ static void sas_ata_post_internal(struct ata_queued_cmd *qc) | |||
| 294 | } | 294 | } | 
| 295 | } | 295 | } | 
| 296 | 296 | ||
| 297 | static int sas_ata_scr_write(struct ata_port *ap, unsigned int sc_reg_in, | 297 | static int sas_ata_scr_write(struct ata_link *link, unsigned int sc_reg_in, | 
| 298 | u32 val) | 298 | u32 val) | 
| 299 | { | 299 | { | 
| 300 | struct domain_device *dev = ap->private_data; | 300 | struct domain_device *dev = link->ap->private_data; | 
| 301 | 301 | ||
| 302 | SAS_DPRINTK("STUB %s\n", __func__); | 302 | SAS_DPRINTK("STUB %s\n", __func__); | 
| 303 | switch (sc_reg_in) { | 303 | switch (sc_reg_in) { | 
| @@ -319,10 +319,10 @@ static int sas_ata_scr_write(struct ata_port *ap, unsigned int sc_reg_in, | |||
| 319 | return 0; | 319 | return 0; | 
| 320 | } | 320 | } | 
| 321 | 321 | ||
| 322 | static int sas_ata_scr_read(struct ata_port *ap, unsigned int sc_reg_in, | 322 | static int sas_ata_scr_read(struct ata_link *link, unsigned int sc_reg_in, | 
| 323 | u32 *val) | 323 | u32 *val) | 
| 324 | { | 324 | { | 
| 325 | struct domain_device *dev = ap->private_data; | 325 | struct domain_device *dev = link->ap->private_data; | 
| 326 | 326 | ||
| 327 | SAS_DPRINTK("STUB %s\n", __func__); | 327 | SAS_DPRINTK("STUB %s\n", __func__); | 
| 328 | switch (sc_reg_in) { | 328 | switch (sc_reg_in) { | 
| diff --git a/include/linux/ata.h b/include/linux/ata.h index 8a12d718c169..a26ebd25bac1 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h | |||
| @@ -667,6 +667,15 @@ static inline int ata_id_has_dword_io(const u16 *id) | |||
| 667 | return 0; | 667 | return 0; | 
| 668 | } | 668 | } | 
| 669 | 669 | ||
| 670 | static inline int ata_id_has_unload(const u16 *id) | ||
| 671 | { | ||
| 672 | if (ata_id_major_version(id) >= 7 && | ||
| 673 | (id[ATA_ID_CFSSE] & 0xC000) == 0x4000 && | ||
| 674 | id[ATA_ID_CFSSE] & (1 << 13)) | ||
| 675 | return 1; | ||
| 676 | return 0; | ||
| 677 | } | ||
| 678 | |||
| 670 | static inline int ata_id_current_chs_valid(const u16 *id) | 679 | static inline int ata_id_current_chs_valid(const u16 *id) | 
| 671 | { | 680 | { | 
| 672 | /* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command | 681 | /* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command | 
| diff --git a/include/linux/libata.h b/include/linux/libata.h index 225bfc5bd9ec..947cf84e555d 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
| @@ -146,6 +146,7 @@ enum { | |||
| 146 | ATA_DFLAG_SPUNDOWN = (1 << 14), /* XXX: for spindown_compat */ | 146 | ATA_DFLAG_SPUNDOWN = (1 << 14), /* XXX: for spindown_compat */ | 
| 147 | ATA_DFLAG_SLEEPING = (1 << 15), /* device is sleeping */ | 147 | ATA_DFLAG_SLEEPING = (1 << 15), /* device is sleeping */ | 
| 148 | ATA_DFLAG_DUBIOUS_XFER = (1 << 16), /* data transfer not verified */ | 148 | ATA_DFLAG_DUBIOUS_XFER = (1 << 16), /* data transfer not verified */ | 
| 149 | ATA_DFLAG_NO_UNLOAD = (1 << 17), /* device doesn't support unload */ | ||
| 149 | ATA_DFLAG_INIT_MASK = (1 << 24) - 1, | 150 | ATA_DFLAG_INIT_MASK = (1 << 24) - 1, | 
| 150 | 151 | ||
| 151 | ATA_DFLAG_DETACH = (1 << 24), | 152 | ATA_DFLAG_DETACH = (1 << 24), | 
| @@ -244,6 +245,7 @@ enum { | |||
| 244 | ATA_TMOUT_BOOT = 30000, /* heuristic */ | 245 | ATA_TMOUT_BOOT = 30000, /* heuristic */ | 
| 245 | ATA_TMOUT_BOOT_QUICK = 7000, /* heuristic */ | 246 | ATA_TMOUT_BOOT_QUICK = 7000, /* heuristic */ | 
| 246 | ATA_TMOUT_INTERNAL_QUICK = 5000, | 247 | ATA_TMOUT_INTERNAL_QUICK = 5000, | 
| 248 | ATA_TMOUT_MAX_PARK = 30000, | ||
| 247 | 249 | ||
| 248 | /* FIXME: GoVault needs 2s but we can't afford that without | 250 | /* FIXME: GoVault needs 2s but we can't afford that without | 
| 249 | * parallel probing. 800ms is enough for iVDR disk | 251 | * parallel probing. 800ms is enough for iVDR disk | 
| @@ -319,8 +321,11 @@ enum { | |||
| 319 | ATA_EH_RESET = ATA_EH_SOFTRESET | ATA_EH_HARDRESET, | 321 | ATA_EH_RESET = ATA_EH_SOFTRESET | ATA_EH_HARDRESET, | 
| 320 | ATA_EH_ENABLE_LINK = (1 << 3), | 322 | ATA_EH_ENABLE_LINK = (1 << 3), | 
| 321 | ATA_EH_LPM = (1 << 4), /* link power management action */ | 323 | ATA_EH_LPM = (1 << 4), /* link power management action */ | 
| 324 | ATA_EH_PARK = (1 << 5), /* unload heads and stop I/O */ | ||
| 322 | 325 | ||
| 323 | ATA_EH_PERDEV_MASK = ATA_EH_REVALIDATE, | 326 | ATA_EH_PERDEV_MASK = ATA_EH_REVALIDATE | ATA_EH_PARK, | 
| 327 | ATA_EH_ALL_ACTIONS = ATA_EH_REVALIDATE | ATA_EH_RESET | | ||
| 328 | ATA_EH_ENABLE_LINK | ATA_EH_LPM, | ||
| 324 | 329 | ||
| 325 | /* ata_eh_info->flags */ | 330 | /* ata_eh_info->flags */ | 
| 326 | ATA_EHI_HOTPLUGGED = (1 << 0), /* could have been hotplugged */ | 331 | ATA_EHI_HOTPLUGGED = (1 << 0), /* could have been hotplugged */ | 
| @@ -452,6 +457,7 @@ enum link_pm { | |||
| 452 | MEDIUM_POWER, | 457 | MEDIUM_POWER, | 
| 453 | }; | 458 | }; | 
| 454 | extern struct device_attribute dev_attr_link_power_management_policy; | 459 | extern struct device_attribute dev_attr_link_power_management_policy; | 
| 460 | extern struct device_attribute dev_attr_unload_heads; | ||
| 455 | extern struct device_attribute dev_attr_em_message_type; | 461 | extern struct device_attribute dev_attr_em_message_type; | 
| 456 | extern struct device_attribute dev_attr_em_message; | 462 | extern struct device_attribute dev_attr_em_message; | 
| 457 | extern struct device_attribute dev_attr_sw_activity; | 463 | extern struct device_attribute dev_attr_sw_activity; | 
| @@ -554,8 +560,8 @@ struct ata_ering { | |||
| 554 | struct ata_device { | 560 | struct ata_device { | 
| 555 | struct ata_link *link; | 561 | struct ata_link *link; | 
| 556 | unsigned int devno; /* 0 or 1 */ | 562 | unsigned int devno; /* 0 or 1 */ | 
| 557 | unsigned long flags; /* ATA_DFLAG_xxx */ | ||
| 558 | unsigned int horkage; /* List of broken features */ | 563 | unsigned int horkage; /* List of broken features */ | 
| 564 | unsigned long flags; /* ATA_DFLAG_xxx */ | ||
| 559 | struct scsi_device *sdev; /* attached SCSI device */ | 565 | struct scsi_device *sdev; /* attached SCSI device */ | 
| 560 | #ifdef CONFIG_ATA_ACPI | 566 | #ifdef CONFIG_ATA_ACPI | 
| 561 | acpi_handle acpi_handle; | 567 | acpi_handle acpi_handle; | 
| @@ -564,6 +570,7 @@ struct ata_device { | |||
| 564 | /* n_sector is used as CLEAR_OFFSET, read comment above CLEAR_OFFSET */ | 570 | /* n_sector is used as CLEAR_OFFSET, read comment above CLEAR_OFFSET */ | 
| 565 | u64 n_sectors; /* size of device, if ATA */ | 571 | u64 n_sectors; /* size of device, if ATA */ | 
| 566 | unsigned int class; /* ATA_DEV_xxx */ | 572 | unsigned int class; /* ATA_DEV_xxx */ | 
| 573 | unsigned long unpark_deadline; | ||
| 567 | 574 | ||
| 568 | u8 pio_mode; | 575 | u8 pio_mode; | 
| 569 | u8 dma_mode; | 576 | u8 dma_mode; | 
| @@ -621,6 +628,7 @@ struct ata_eh_context { | |||
| 621 | [ATA_EH_CMD_TIMEOUT_TABLE_SIZE]; | 628 | [ATA_EH_CMD_TIMEOUT_TABLE_SIZE]; | 
| 622 | unsigned int classes[ATA_MAX_DEVICES]; | 629 | unsigned int classes[ATA_MAX_DEVICES]; | 
| 623 | unsigned int did_probe_mask; | 630 | unsigned int did_probe_mask; | 
| 631 | unsigned int unloaded_mask; | ||
| 624 | unsigned int saved_ncq_enabled; | 632 | unsigned int saved_ncq_enabled; | 
| 625 | u8 saved_xfer_mode[ATA_MAX_DEVICES]; | 633 | u8 saved_xfer_mode[ATA_MAX_DEVICES]; | 
| 626 | /* timestamp for the last reset attempt or success */ | 634 | /* timestamp for the last reset attempt or success */ | 
| @@ -688,7 +696,8 @@ struct ata_port { | |||
| 688 | unsigned int qc_active; | 696 | unsigned int qc_active; | 
| 689 | int nr_active_links; /* #links with active qcs */ | 697 | int nr_active_links; /* #links with active qcs */ | 
| 690 | 698 | ||
| 691 | struct ata_link link; /* host default link */ | 699 | struct ata_link link; /* host default link */ | 
| 700 | struct ata_link *slave_link; /* see ata_slave_link_init() */ | ||
| 692 | 701 | ||
| 693 | int nr_pmp_links; /* nr of available PMP links */ | 702 | int nr_pmp_links; /* nr of available PMP links */ | 
| 694 | struct ata_link *pmp_link; /* array of PMP links */ | 703 | struct ata_link *pmp_link; /* array of PMP links */ | 
| @@ -709,6 +718,7 @@ struct ata_port { | |||
| 709 | struct list_head eh_done_q; | 718 | struct list_head eh_done_q; | 
| 710 | wait_queue_head_t eh_wait_q; | 719 | wait_queue_head_t eh_wait_q; | 
| 711 | int eh_tries; | 720 | int eh_tries; | 
| 721 | struct completion park_req_pending; | ||
| 712 | 722 | ||
| 713 | pm_message_t pm_mesg; | 723 | pm_message_t pm_mesg; | 
| 714 | int *pm_result; | 724 | int *pm_result; | 
| @@ -772,8 +782,8 @@ struct ata_port_operations { | |||
| 772 | /* | 782 | /* | 
| 773 | * Optional features | 783 | * Optional features | 
| 774 | */ | 784 | */ | 
| 775 | int (*scr_read)(struct ata_port *ap, unsigned int sc_reg, u32 *val); | 785 | int (*scr_read)(struct ata_link *link, unsigned int sc_reg, u32 *val); | 
| 776 | int (*scr_write)(struct ata_port *ap, unsigned int sc_reg, u32 val); | 786 | int (*scr_write)(struct ata_link *link, unsigned int sc_reg, u32 val); | 
| 777 | void (*pmp_attach)(struct ata_port *ap); | 787 | void (*pmp_attach)(struct ata_port *ap); | 
| 778 | void (*pmp_detach)(struct ata_port *ap); | 788 | void (*pmp_detach)(struct ata_port *ap); | 
| 779 | int (*enable_pm)(struct ata_port *ap, enum link_pm policy); | 789 | int (*enable_pm)(struct ata_port *ap, enum link_pm policy); | 
| @@ -895,6 +905,7 @@ extern void ata_port_disable(struct ata_port *); | |||
| 895 | extern struct ata_host *ata_host_alloc(struct device *dev, int max_ports); | 905 | extern struct ata_host *ata_host_alloc(struct device *dev, int max_ports); | 
| 896 | extern struct ata_host *ata_host_alloc_pinfo(struct device *dev, | 906 | extern struct ata_host *ata_host_alloc_pinfo(struct device *dev, | 
| 897 | const struct ata_port_info * const * ppi, int n_ports); | 907 | const struct ata_port_info * const * ppi, int n_ports); | 
| 908 | extern int ata_slave_link_init(struct ata_port *ap); | ||
| 898 | extern int ata_host_start(struct ata_host *host); | 909 | extern int ata_host_start(struct ata_host *host); | 
| 899 | extern int ata_host_register(struct ata_host *host, | 910 | extern int ata_host_register(struct ata_host *host, | 
| 900 | struct scsi_host_template *sht); | 911 | struct scsi_host_template *sht); | 
| @@ -920,8 +931,8 @@ extern int sata_scr_valid(struct ata_link *link); | |||
| 920 | extern int sata_scr_read(struct ata_link *link, int reg, u32 *val); | 931 | extern int sata_scr_read(struct ata_link *link, int reg, u32 *val); | 
| 921 | extern int sata_scr_write(struct ata_link *link, int reg, u32 val); | 932 | extern int sata_scr_write(struct ata_link *link, int reg, u32 val); | 
| 922 | extern int sata_scr_write_flush(struct ata_link *link, int reg, u32 val); | 933 | extern int sata_scr_write_flush(struct ata_link *link, int reg, u32 val); | 
| 923 | extern int ata_link_online(struct ata_link *link); | 934 | extern bool ata_link_online(struct ata_link *link); | 
| 924 | extern int ata_link_offline(struct ata_link *link); | 935 | extern bool ata_link_offline(struct ata_link *link); | 
| 925 | #ifdef CONFIG_PM | 936 | #ifdef CONFIG_PM | 
| 926 | extern int ata_host_suspend(struct ata_host *host, pm_message_t mesg); | 937 | extern int ata_host_suspend(struct ata_host *host, pm_message_t mesg); | 
| 927 | extern void ata_host_resume(struct ata_host *host); | 938 | extern void ata_host_resume(struct ata_host *host); | 
| @@ -1098,6 +1109,7 @@ extern void ata_std_error_handler(struct ata_port *ap); | |||
| 1098 | */ | 1109 | */ | 
| 1099 | extern const struct ata_port_operations ata_base_port_ops; | 1110 | extern const struct ata_port_operations ata_base_port_ops; | 
| 1100 | extern const struct ata_port_operations sata_port_ops; | 1111 | extern const struct ata_port_operations sata_port_ops; | 
| 1112 | extern struct device_attribute *ata_common_sdev_attrs[]; | ||
| 1101 | 1113 | ||
| 1102 | #define ATA_BASE_SHT(drv_name) \ | 1114 | #define ATA_BASE_SHT(drv_name) \ | 
| 1103 | .module = THIS_MODULE, \ | 1115 | .module = THIS_MODULE, \ | 
| @@ -1112,7 +1124,8 @@ extern const struct ata_port_operations sata_port_ops; | |||
| 1112 | .proc_name = drv_name, \ | 1124 | .proc_name = drv_name, \ | 
| 1113 | .slave_configure = ata_scsi_slave_config, \ | 1125 | .slave_configure = ata_scsi_slave_config, \ | 
| 1114 | .slave_destroy = ata_scsi_slave_destroy, \ | 1126 | .slave_destroy = ata_scsi_slave_destroy, \ | 
| 1115 | .bios_param = ata_std_bios_param | 1127 | .bios_param = ata_std_bios_param, \ | 
| 1128 | .sdev_attrs = ata_common_sdev_attrs | ||
| 1116 | 1129 | ||
| 1117 | #define ATA_NCQ_SHT(drv_name) \ | 1130 | #define ATA_NCQ_SHT(drv_name) \ | 
| 1118 | ATA_BASE_SHT(drv_name), \ | 1131 | ATA_BASE_SHT(drv_name), \ | 
| @@ -1134,7 +1147,7 @@ static inline bool sata_pmp_attached(struct ata_port *ap) | |||
| 1134 | 1147 | ||
| 1135 | static inline int ata_is_host_link(const struct ata_link *link) | 1148 | static inline int ata_is_host_link(const struct ata_link *link) | 
| 1136 | { | 1149 | { | 
| 1137 | return link == &link->ap->link; | 1150 | return link == &link->ap->link || link == link->ap->slave_link; | 
| 1138 | } | 1151 | } | 
| 1139 | #else /* CONFIG_SATA_PMP */ | 1152 | #else /* CONFIG_SATA_PMP */ | 
| 1140 | static inline bool sata_pmp_supported(struct ata_port *ap) | 1153 | static inline bool sata_pmp_supported(struct ata_port *ap) | 
| @@ -1167,7 +1180,7 @@ static inline int sata_srst_pmp(struct ata_link *link) | |||
| 1167 | printk("%sata%u: "fmt, lv, (ap)->print_id , ##args) | 1180 | printk("%sata%u: "fmt, lv, (ap)->print_id , ##args) | 
| 1168 | 1181 | ||
| 1169 | #define ata_link_printk(link, lv, fmt, args...) do { \ | 1182 | #define ata_link_printk(link, lv, fmt, args...) do { \ | 
| 1170 | if (sata_pmp_attached((link)->ap)) \ | 1183 | if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link) \ | 
| 1171 | printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id, \ | 1184 | printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id, \ | 
| 1172 | (link)->pmp , ##args); \ | 1185 | (link)->pmp , ##args); \ | 
| 1173 | else \ | 1186 | else \ | 
| @@ -1265,34 +1278,17 @@ static inline int ata_link_active(struct ata_link *link) | |||
| 1265 | return ata_tag_valid(link->active_tag) || link->sactive; | 1278 | return ata_tag_valid(link->active_tag) || link->sactive; | 
| 1266 | } | 1279 | } | 
| 1267 | 1280 | ||
| 1268 | static inline struct ata_link *ata_port_first_link(struct ata_port *ap) | 1281 | extern struct ata_link *__ata_port_next_link(struct ata_port *ap, | 
| 1269 | { | 1282 | struct ata_link *link, | 
| 1270 | if (sata_pmp_attached(ap)) | 1283 | bool dev_only); | 
| 1271 | return ap->pmp_link; | ||
| 1272 | return &ap->link; | ||
| 1273 | } | ||
| 1274 | |||
| 1275 | static inline struct ata_link *ata_port_next_link(struct ata_link *link) | ||
| 1276 | { | ||
| 1277 | struct ata_port *ap = link->ap; | ||
| 1278 | |||
| 1279 | if (ata_is_host_link(link)) { | ||
| 1280 | if (!sata_pmp_attached(ap)) | ||
| 1281 | return NULL; | ||
| 1282 | return ap->pmp_link; | ||
| 1283 | } | ||
| 1284 | |||
| 1285 | if (++link < ap->nr_pmp_links + ap->pmp_link) | ||
| 1286 | return link; | ||
| 1287 | return NULL; | ||
| 1288 | } | ||
| 1289 | 1284 | ||
| 1290 | #define __ata_port_for_each_link(lk, ap) \ | 1285 | #define __ata_port_for_each_link(link, ap) \ | 
| 1291 | for ((lk) = &(ap)->link; (lk); (lk) = ata_port_next_link(lk)) | 1286 | for ((link) = __ata_port_next_link((ap), NULL, false); (link); \ | 
| 1287 | (link) = __ata_port_next_link((ap), (link), false)) | ||
| 1292 | 1288 | ||
| 1293 | #define ata_port_for_each_link(link, ap) \ | 1289 | #define ata_port_for_each_link(link, ap) \ | 
| 1294 | for ((link) = ata_port_first_link(ap); (link); \ | 1290 | for ((link) = __ata_port_next_link((ap), NULL, true); (link); \ | 
| 1295 | (link) = ata_port_next_link(link)) | 1291 | (link) = __ata_port_next_link((ap), (link), true)) | 
| 1296 | 1292 | ||
| 1297 | #define ata_link_for_each_dev(dev, link) \ | 1293 | #define ata_link_for_each_dev(dev, link) \ | 
| 1298 | for ((dev) = (link)->device; \ | 1294 | for ((dev) = (link)->device; \ | 
