diff options
| -rw-r--r-- | Documentation/DocBook/libata.tmpl | 47 | ||||
| -rw-r--r-- | drivers/scsi/libata-bmdma.c | 26 | ||||
| -rw-r--r-- | drivers/scsi/libata-core.c | 168 | ||||
| -rw-r--r-- | drivers/scsi/sata_mv.c | 42 | ||||
| -rw-r--r-- | include/linux/libata.h | 10 |
5 files changed, 164 insertions, 129 deletions
diff --git a/Documentation/DocBook/libata.tmpl b/Documentation/DocBook/libata.tmpl index d260d92089ad..5bcbb6ee3bc0 100644 --- a/Documentation/DocBook/libata.tmpl +++ b/Documentation/DocBook/libata.tmpl | |||
| @@ -120,14 +120,27 @@ void (*dev_config) (struct ata_port *, struct ata_device *); | |||
| 120 | <programlisting> | 120 | <programlisting> |
| 121 | void (*set_piomode) (struct ata_port *, struct ata_device *); | 121 | void (*set_piomode) (struct ata_port *, struct ata_device *); |
| 122 | void (*set_dmamode) (struct ata_port *, struct ata_device *); | 122 | void (*set_dmamode) (struct ata_port *, struct ata_device *); |
| 123 | void (*post_set_mode) (struct ata_port *ap); | 123 | void (*post_set_mode) (struct ata_port *); |
| 124 | unsigned int (*mode_filter) (struct ata_port *, struct ata_device *, unsigned int); | ||
| 124 | </programlisting> | 125 | </programlisting> |
| 125 | 126 | ||
| 126 | <para> | 127 | <para> |
| 127 | Hooks called prior to the issue of SET FEATURES - XFER MODE | 128 | Hooks called prior to the issue of SET FEATURES - XFER MODE |
| 128 | command. dev->pio_mode is guaranteed to be valid when | 129 | command. The optional ->mode_filter() hook is called when libata |
| 129 | ->set_piomode() is called, and dev->dma_mode is guaranteed to be | 130 | has built a mask of the possible modes. This is passed to the |
| 130 | valid when ->set_dmamode() is called. ->post_set_mode() is | 131 | ->mode_filter() function which should return a mask of valid modes |
| 132 | after filtering those unsuitable due to hardware limits. It is not | ||
| 133 | valid to use this interface to add modes. | ||
| 134 | </para> | ||
| 135 | <para> | ||
| 136 | dev->pio_mode and dev->dma_mode are guaranteed to be valid when | ||
| 137 | ->set_piomode() and when ->set_dmamode() is called. The timings for | ||
| 138 | any other drive sharing the cable will also be valid at this point. | ||
| 139 | That is the library records the decisions for the modes of each | ||
| 140 | drive on a channel before it attempts to set any of them. | ||
| 141 | </para> | ||
| 142 | <para> | ||
| 143 | ->post_set_mode() is | ||
| 131 | called unconditionally, after the SET FEATURES - XFER MODE | 144 | called unconditionally, after the SET FEATURES - XFER MODE |
| 132 | command completes successfully. | 145 | command completes successfully. |
| 133 | </para> | 146 | </para> |
| @@ -230,6 +243,32 @@ void (*dev_select)(struct ata_port *ap, unsigned int device); | |||
| 230 | 243 | ||
| 231 | </sect2> | 244 | </sect2> |
| 232 | 245 | ||
| 246 | <sect2><title>Private tuning method</title> | ||
| 247 | <programlisting> | ||
| 248 | void (*set_mode) (struct ata_port *ap); | ||
| 249 | </programlisting> | ||
| 250 | |||
| 251 | <para> | ||
| 252 | By default libata performs drive and controller tuning in | ||
| 253 | accordance with the ATA timing rules and also applies blacklists | ||
| 254 | and cable limits. Some controllers need special handling and have | ||
| 255 | custom tuning rules, typically raid controllers that use ATA | ||
| 256 | commands but do not actually do drive timing. | ||
| 257 | </para> | ||
| 258 | |||
| 259 | <warning> | ||
| 260 | <para> | ||
| 261 | This hook should not be used to replace the standard controller | ||
| 262 | tuning logic when a controller has quirks. Replacing the default | ||
| 263 | tuning logic in that case would bypass handling for drive and | ||
| 264 | bridge quirks that may be important to data reliability. If a | ||
| 265 | controller needs to filter the mode selection it should use the | ||
| 266 | mode_filter hook instead. | ||
| 267 | </para> | ||
| 268 | </warning> | ||
| 269 | |||
| 270 | </sect2> | ||
| 271 | |||
| 233 | <sect2><title>Reset ATA bus</title> | 272 | <sect2><title>Reset ATA bus</title> |
| 234 | <programlisting> | 273 | <programlisting> |
| 235 | void (*phy_reset) (struct ata_port *ap); | 274 | void (*phy_reset) (struct ata_port *ap); |
diff --git a/drivers/scsi/libata-bmdma.c b/drivers/scsi/libata-bmdma.c index 95d81d86d8b7..835dff0bafdc 100644 --- a/drivers/scsi/libata-bmdma.c +++ b/drivers/scsi/libata-bmdma.c | |||
| @@ -703,6 +703,7 @@ ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, int | |||
| 703 | struct ata_probe_ent *probe_ent = | 703 | struct ata_probe_ent *probe_ent = |
| 704 | ata_probe_ent_alloc(pci_dev_to_dev(pdev), port[0]); | 704 | ata_probe_ent_alloc(pci_dev_to_dev(pdev), port[0]); |
| 705 | int p = 0; | 705 | int p = 0; |
| 706 | unsigned long bmdma; | ||
| 706 | 707 | ||
| 707 | if (!probe_ent) | 708 | if (!probe_ent) |
| 708 | return NULL; | 709 | return NULL; |
| @@ -716,7 +717,12 @@ ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, int | |||
| 716 | probe_ent->port[p].altstatus_addr = | 717 | probe_ent->port[p].altstatus_addr = |
| 717 | probe_ent->port[p].ctl_addr = | 718 | probe_ent->port[p].ctl_addr = |
| 718 | pci_resource_start(pdev, 1) | ATA_PCI_CTL_OFS; | 719 | pci_resource_start(pdev, 1) | ATA_PCI_CTL_OFS; |
| 719 | probe_ent->port[p].bmdma_addr = pci_resource_start(pdev, 4); | 720 | bmdma = pci_resource_start(pdev, 4); |
| 721 | if (bmdma) { | ||
| 722 | if (inb(bmdma + 2) & 0x80) | ||
| 723 | probe_ent->host_set_flags |= ATA_HOST_SIMPLEX; | ||
| 724 | probe_ent->port[p].bmdma_addr = bmdma; | ||
| 725 | } | ||
| 720 | ata_std_ports(&probe_ent->port[p]); | 726 | ata_std_ports(&probe_ent->port[p]); |
| 721 | p++; | 727 | p++; |
| 722 | } | 728 | } |
| @@ -726,7 +732,13 @@ ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, int | |||
| 726 | probe_ent->port[p].altstatus_addr = | 732 | probe_ent->port[p].altstatus_addr = |
| 727 | probe_ent->port[p].ctl_addr = | 733 | probe_ent->port[p].ctl_addr = |
| 728 | pci_resource_start(pdev, 3) | ATA_PCI_CTL_OFS; | 734 | pci_resource_start(pdev, 3) | ATA_PCI_CTL_OFS; |
| 729 | probe_ent->port[p].bmdma_addr = pci_resource_start(pdev, 4) + 8; | 735 | bmdma = pci_resource_start(pdev, 4); |
| 736 | if (bmdma) { | ||
| 737 | bmdma += 8; | ||
| 738 | if(inb(bmdma + 2) & 0x80) | ||
| 739 | probe_ent->host_set_flags |= ATA_HOST_SIMPLEX; | ||
| 740 | probe_ent->port[p].bmdma_addr = bmdma; | ||
| 741 | } | ||
| 730 | ata_std_ports(&probe_ent->port[p]); | 742 | ata_std_ports(&probe_ent->port[p]); |
| 731 | p++; | 743 | p++; |
| 732 | } | 744 | } |
| @@ -740,6 +752,7 @@ static struct ata_probe_ent *ata_pci_init_legacy_port(struct pci_dev *pdev, | |||
| 740 | struct ata_port_info *port, int port_num) | 752 | struct ata_port_info *port, int port_num) |
| 741 | { | 753 | { |
| 742 | struct ata_probe_ent *probe_ent; | 754 | struct ata_probe_ent *probe_ent; |
| 755 | unsigned long bmdma; | ||
| 743 | 756 | ||
| 744 | probe_ent = ata_probe_ent_alloc(pci_dev_to_dev(pdev), port); | 757 | probe_ent = ata_probe_ent_alloc(pci_dev_to_dev(pdev), port); |
| 745 | if (!probe_ent) | 758 | if (!probe_ent) |
| @@ -766,8 +779,13 @@ static struct ata_probe_ent *ata_pci_init_legacy_port(struct pci_dev *pdev, | |||
| 766 | break; | 779 | break; |
| 767 | } | 780 | } |
| 768 | 781 | ||
| 769 | probe_ent->port[0].bmdma_addr = | 782 | bmdma = pci_resource_start(pdev, 4); |
| 770 | pci_resource_start(pdev, 4) + 8 * port_num; | 783 | if (bmdma != 0) { |
| 784 | bmdma += 8 * port_num; | ||
| 785 | probe_ent->port[0].bmdma_addr = bmdma; | ||
| 786 | if (inb(bmdma + 2) & 0x80) | ||
| 787 | probe_ent->host_set_flags |= ATA_HOST_SIMPLEX; | ||
| 788 | } | ||
| 771 | ata_std_ports(&probe_ent->port[0]); | 789 | ata_std_ports(&probe_ent->port[0]); |
| 772 | 790 | ||
| 773 | return probe_ent; | 791 | return probe_ent; |
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index d279666dcb38..21b0ed583b8a 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c | |||
| @@ -62,7 +62,9 @@ | |||
| 62 | #include "libata.h" | 62 | #include "libata.h" |
| 63 | 63 | ||
| 64 | static unsigned int ata_dev_init_params(struct ata_port *ap, | 64 | static unsigned int ata_dev_init_params(struct ata_port *ap, |
| 65 | struct ata_device *dev); | 65 | struct ata_device *dev, |
| 66 | u16 heads, | ||
| 67 | u16 sectors); | ||
| 66 | static void ata_set_mode(struct ata_port *ap); | 68 | static void ata_set_mode(struct ata_port *ap); |
| 67 | static unsigned int ata_dev_set_xfermode(struct ata_port *ap, | 69 | static unsigned int ata_dev_set_xfermode(struct ata_port *ap, |
| 68 | struct ata_device *dev); | 70 | struct ata_device *dev); |
| @@ -1081,9 +1083,8 @@ unsigned int ata_pio_need_iordy(const struct ata_device *adev) | |||
| 1081 | * | 1083 | * |
| 1082 | * Read ID data from the specified device. ATA_CMD_ID_ATA is | 1084 | * Read ID data from the specified device. ATA_CMD_ID_ATA is |
| 1083 | * performed on ATA devices and ATA_CMD_ID_ATAPI on ATAPI | 1085 | * performed on ATA devices and ATA_CMD_ID_ATAPI on ATAPI |
| 1084 | * devices. This function also takes care of EDD signature | 1086 | * devices. This function also issues ATA_CMD_INIT_DEV_PARAMS |
| 1085 | * misreporting (to be removed once EDD support is gone) and | 1087 | * for pre-ATA4 drives. |
| 1086 | * issues ATA_CMD_INIT_DEV_PARAMS for pre-ATA4 drives. | ||
| 1087 | * | 1088 | * |
| 1088 | * LOCKING: | 1089 | * LOCKING: |
| 1089 | * Kernel thread context (may sleep) | 1090 | * Kernel thread context (may sleep) |
| @@ -1095,7 +1096,6 @@ static int ata_dev_read_id(struct ata_port *ap, struct ata_device *dev, | |||
| 1095 | unsigned int *p_class, int post_reset, u16 **p_id) | 1096 | unsigned int *p_class, int post_reset, u16 **p_id) |
| 1096 | { | 1097 | { |
| 1097 | unsigned int class = *p_class; | 1098 | unsigned int class = *p_class; |
| 1098 | unsigned int using_edd; | ||
| 1099 | struct ata_taskfile tf; | 1099 | struct ata_taskfile tf; |
| 1100 | unsigned int err_mask = 0; | 1100 | unsigned int err_mask = 0; |
| 1101 | u16 *id; | 1101 | u16 *id; |
| @@ -1104,12 +1104,6 @@ static int ata_dev_read_id(struct ata_port *ap, struct ata_device *dev, | |||
| 1104 | 1104 | ||
| 1105 | DPRINTK("ENTER, host %u, dev %u\n", ap->id, dev->devno); | 1105 | DPRINTK("ENTER, host %u, dev %u\n", ap->id, dev->devno); |
| 1106 | 1106 | ||
| 1107 | if (ap->ops->probe_reset || | ||
| 1108 | ap->flags & (ATA_FLAG_SRST | ATA_FLAG_SATA_RESET)) | ||
| 1109 | using_edd = 0; | ||
| 1110 | else | ||
| 1111 | using_edd = 1; | ||
| 1112 | |||
| 1113 | ata_dev_select(ap, dev->devno, 1, 1); /* select device 0/1 */ | 1107 | ata_dev_select(ap, dev->devno, 1, 1); /* select device 0/1 */ |
| 1114 | 1108 | ||
| 1115 | id = kmalloc(sizeof(id[0]) * ATA_ID_WORDS, GFP_KERNEL); | 1109 | id = kmalloc(sizeof(id[0]) * ATA_ID_WORDS, GFP_KERNEL); |
| @@ -1139,39 +1133,16 @@ static int ata_dev_read_id(struct ata_port *ap, struct ata_device *dev, | |||
| 1139 | 1133 | ||
| 1140 | err_mask = ata_exec_internal(ap, dev, &tf, DMA_FROM_DEVICE, | 1134 | err_mask = ata_exec_internal(ap, dev, &tf, DMA_FROM_DEVICE, |
| 1141 | id, sizeof(id[0]) * ATA_ID_WORDS); | 1135 | id, sizeof(id[0]) * ATA_ID_WORDS); |
| 1142 | |||
| 1143 | if (err_mask) { | 1136 | if (err_mask) { |
| 1144 | rc = -EIO; | 1137 | rc = -EIO; |
| 1145 | reason = "I/O error"; | 1138 | reason = "I/O error"; |
| 1146 | |||
| 1147 | if (err_mask & ~AC_ERR_DEV) | ||
| 1148 | goto err_out; | ||
| 1149 | |||
| 1150 | /* | ||
| 1151 | * arg! EDD works for all test cases, but seems to return | ||
| 1152 | * the ATA signature for some ATAPI devices. Until the | ||
| 1153 | * reason for this is found and fixed, we fix up the mess | ||
| 1154 | * here. If IDENTIFY DEVICE returns command aborted | ||
| 1155 | * (as ATAPI devices do), then we issue an | ||
| 1156 | * IDENTIFY PACKET DEVICE. | ||
| 1157 | * | ||
| 1158 | * ATA software reset (SRST, the default) does not appear | ||
| 1159 | * to have this problem. | ||
| 1160 | */ | ||
| 1161 | if ((using_edd) && (class == ATA_DEV_ATA)) { | ||
| 1162 | u8 err = tf.feature; | ||
| 1163 | if (err & ATA_ABORTED) { | ||
| 1164 | class = ATA_DEV_ATAPI; | ||
| 1165 | goto retry; | ||
| 1166 | } | ||
| 1167 | } | ||
| 1168 | goto err_out; | 1139 | goto err_out; |
| 1169 | } | 1140 | } |
| 1170 | 1141 | ||
| 1171 | swap_buf_le16(id, ATA_ID_WORDS); | 1142 | swap_buf_le16(id, ATA_ID_WORDS); |
| 1172 | 1143 | ||
| 1173 | /* sanity check */ | 1144 | /* sanity check */ |
| 1174 | if ((class == ATA_DEV_ATA) != ata_id_is_ata(id)) { | 1145 | if ((class == ATA_DEV_ATA) != (ata_id_is_ata(id) | ata_id_is_cfa(id))) { |
| 1175 | rc = -EINVAL; | 1146 | rc = -EINVAL; |
| 1176 | reason = "device reports illegal type"; | 1147 | reason = "device reports illegal type"; |
| 1177 | goto err_out; | 1148 | goto err_out; |
| @@ -1187,7 +1158,7 @@ static int ata_dev_read_id(struct ata_port *ap, struct ata_device *dev, | |||
| 1187 | * Some drives were very specific about that exact sequence. | 1158 | * Some drives were very specific about that exact sequence. |
| 1188 | */ | 1159 | */ |
| 1189 | if (ata_id_major_version(id) < 4 || !ata_id_has_lba(id)) { | 1160 | if (ata_id_major_version(id) < 4 || !ata_id_has_lba(id)) { |
| 1190 | err_mask = ata_dev_init_params(ap, dev); | 1161 | err_mask = ata_dev_init_params(ap, dev, id[3], id[6]); |
| 1191 | if (err_mask) { | 1162 | if (err_mask) { |
| 1192 | rc = -EIO; | 1163 | rc = -EIO; |
| 1193 | reason = "INIT_DEV_PARAMS failed"; | 1164 | reason = "INIT_DEV_PARAMS failed"; |
| @@ -1440,7 +1411,11 @@ static int ata_bus_probe(struct ata_port *ap) | |||
| 1440 | if (!found) | 1411 | if (!found) |
| 1441 | goto err_out_disable; | 1412 | goto err_out_disable; |
| 1442 | 1413 | ||
| 1443 | ata_set_mode(ap); | 1414 | if (ap->ops->set_mode) |
| 1415 | ap->ops->set_mode(ap); | ||
| 1416 | else | ||
| 1417 | ata_set_mode(ap); | ||
| 1418 | |||
| 1444 | if (ap->flags & ATA_FLAG_PORT_DISABLED) | 1419 | if (ap->flags & ATA_FLAG_PORT_DISABLED) |
| 1445 | goto err_out_disable; | 1420 | goto err_out_disable; |
| 1446 | 1421 | ||
| @@ -1845,7 +1820,7 @@ static void ata_host_set_dma(struct ata_port *ap) | |||
| 1845 | */ | 1820 | */ |
| 1846 | static void ata_set_mode(struct ata_port *ap) | 1821 | static void ata_set_mode(struct ata_port *ap) |
| 1847 | { | 1822 | { |
| 1848 | int i, rc; | 1823 | int i, rc, used_dma = 0; |
| 1849 | 1824 | ||
| 1850 | /* step 1: calculate xfer_mask */ | 1825 | /* step 1: calculate xfer_mask */ |
| 1851 | for (i = 0; i < ATA_MAX_DEVICES; i++) { | 1826 | for (i = 0; i < ATA_MAX_DEVICES; i++) { |
| @@ -1863,6 +1838,9 @@ static void ata_set_mode(struct ata_port *ap) | |||
| 1863 | dma_mask = ata_pack_xfermask(0, dev->mwdma_mask, dev->udma_mask); | 1838 | dma_mask = ata_pack_xfermask(0, dev->mwdma_mask, dev->udma_mask); |
| 1864 | dev->pio_mode = ata_xfer_mask2mode(pio_mask); | 1839 | dev->pio_mode = ata_xfer_mask2mode(pio_mask); |
| 1865 | dev->dma_mode = ata_xfer_mask2mode(dma_mask); | 1840 | dev->dma_mode = ata_xfer_mask2mode(dma_mask); |
| 1841 | |||
| 1842 | if (dev->dma_mode) | ||
| 1843 | used_dma = 1; | ||
| 1866 | } | 1844 | } |
| 1867 | 1845 | ||
| 1868 | /* step 2: always set host PIO timings */ | 1846 | /* step 2: always set host PIO timings */ |
| @@ -1884,6 +1862,17 @@ static void ata_set_mode(struct ata_port *ap) | |||
| 1884 | goto err_out; | 1862 | goto err_out; |
| 1885 | } | 1863 | } |
| 1886 | 1864 | ||
| 1865 | /* | ||
| 1866 | * Record simplex status. If we selected DMA then the other | ||
| 1867 | * host channels are not permitted to do so. | ||
| 1868 | */ | ||
| 1869 | |||
| 1870 | if (used_dma && (ap->host_set->flags & ATA_HOST_SIMPLEX)) | ||
| 1871 | ap->host_set->simplex_claimed = 1; | ||
| 1872 | |||
| 1873 | /* | ||
| 1874 | * Chip specific finalisation | ||
| 1875 | */ | ||
| 1887 | if (ap->ops->post_set_mode) | 1876 | if (ap->ops->post_set_mode) |
| 1888 | ap->ops->post_set_mode(ap); | 1877 | ap->ops->post_set_mode(ap); |
| 1889 | 1878 | ||
| @@ -2005,45 +1994,6 @@ static void ata_bus_post_reset(struct ata_port *ap, unsigned int devmask) | |||
| 2005 | ap->ops->dev_select(ap, 0); | 1994 | ap->ops->dev_select(ap, 0); |
| 2006 | } | 1995 | } |
| 2007 | 1996 | ||
| 2008 | /** | ||
| 2009 | * ata_bus_edd - Issue EXECUTE DEVICE DIAGNOSTIC command. | ||
| 2010 | * @ap: Port to reset and probe | ||
| 2011 | * | ||
| 2012 | * Use the EXECUTE DEVICE DIAGNOSTIC command to reset and | ||
| 2013 | * probe the bus. Not often used these days. | ||
| 2014 | * | ||
| 2015 | * LOCKING: | ||
| 2016 | * PCI/etc. bus probe sem. | ||
| 2017 | * Obtains host_set lock. | ||
| 2018 | * | ||
| 2019 | */ | ||
| 2020 | |||
| 2021 | static unsigned int ata_bus_edd(struct ata_port *ap) | ||
| 2022 | { | ||
| 2023 | struct ata_taskfile tf; | ||
| 2024 | unsigned long flags; | ||
| 2025 | |||
| 2026 | /* set up execute-device-diag (bus reset) taskfile */ | ||
| 2027 | /* also, take interrupts to a known state (disabled) */ | ||
| 2028 | DPRINTK("execute-device-diag\n"); | ||
| 2029 | ata_tf_init(ap, &tf, 0); | ||
| 2030 | tf.ctl |= ATA_NIEN; | ||
| 2031 | tf.command = ATA_CMD_EDD; | ||
| 2032 | tf.protocol = ATA_PROT_NODATA; | ||
| 2033 | |||
| 2034 | /* do bus reset */ | ||
| 2035 | spin_lock_irqsave(&ap->host_set->lock, flags); | ||
| 2036 | ata_tf_to_host(ap, &tf); | ||
| 2037 | spin_unlock_irqrestore(&ap->host_set->lock, flags); | ||
| 2038 | |||
| 2039 | /* spec says at least 2ms. but who knows with those | ||
| 2040 | * crazy ATAPI devices... | ||
| 2041 | */ | ||
| 2042 | msleep(150); | ||
| 2043 | |||
| 2044 | return ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT); | ||
| 2045 | } | ||
| 2046 | |||
| 2047 | static unsigned int ata_bus_softreset(struct ata_port *ap, | 1997 | static unsigned int ata_bus_softreset(struct ata_port *ap, |
| 2048 | unsigned int devmask) | 1998 | unsigned int devmask) |
| 2049 | { | 1999 | { |
| @@ -2078,13 +2028,12 @@ static unsigned int ata_bus_softreset(struct ata_port *ap, | |||
| 2078 | */ | 2028 | */ |
| 2079 | msleep(150); | 2029 | msleep(150); |
| 2080 | 2030 | ||
| 2081 | |||
| 2082 | /* Before we perform post reset processing we want to see if | 2031 | /* Before we perform post reset processing we want to see if |
| 2083 | the bus shows 0xFF because the odd clown forgets the D7 pulldown | 2032 | * the bus shows 0xFF because the odd clown forgets the D7 |
| 2084 | resistor */ | 2033 | * pulldown resistor. |
| 2085 | 2034 | */ | |
| 2086 | if (ata_check_status(ap) == 0xFF) | 2035 | if (ata_check_status(ap) == 0xFF) |
| 2087 | return 1; /* Positive is failure for some reason */ | 2036 | return AC_ERR_OTHER; |
| 2088 | 2037 | ||
| 2089 | ata_bus_post_reset(ap, devmask); | 2038 | ata_bus_post_reset(ap, devmask); |
| 2090 | 2039 | ||
| @@ -2116,7 +2065,7 @@ void ata_bus_reset(struct ata_port *ap) | |||
| 2116 | struct ata_ioports *ioaddr = &ap->ioaddr; | 2065 | struct ata_ioports *ioaddr = &ap->ioaddr; |
| 2117 | unsigned int slave_possible = ap->flags & ATA_FLAG_SLAVE_POSS; | 2066 | unsigned int slave_possible = ap->flags & ATA_FLAG_SLAVE_POSS; |
| 2118 | u8 err; | 2067 | u8 err; |
| 2119 | unsigned int dev0, dev1 = 0, rc = 0, devmask = 0; | 2068 | unsigned int dev0, dev1 = 0, devmask = 0; |
| 2120 | 2069 | ||
| 2121 | DPRINTK("ENTER, host %u, port %u\n", ap->id, ap->port_no); | 2070 | DPRINTK("ENTER, host %u, port %u\n", ap->id, ap->port_no); |
| 2122 | 2071 | ||
| @@ -2139,18 +2088,8 @@ void ata_bus_reset(struct ata_port *ap) | |||
| 2139 | 2088 | ||
| 2140 | /* issue bus reset */ | 2089 | /* issue bus reset */ |
| 2141 | if (ap->flags & ATA_FLAG_SRST) | 2090 | if (ap->flags & ATA_FLAG_SRST) |
| 2142 | rc = ata_bus_softreset(ap, devmask); | 2091 | if (ata_bus_softreset(ap, devmask)) |
| 2143 | else if ((ap->flags & ATA_FLAG_SATA_RESET) == 0) { | 2092 | goto err_out; |
| 2144 | /* set up device control */ | ||
| 2145 | if (ap->flags & ATA_FLAG_MMIO) | ||
| 2146 | writeb(ap->ctl, (void __iomem *) ioaddr->ctl_addr); | ||
| 2147 | else | ||
| 2148 | outb(ap->ctl, ioaddr->ctl_addr); | ||
| 2149 | rc = ata_bus_edd(ap); | ||
| 2150 | } | ||
| 2151 | |||
| 2152 | if (rc) | ||
| 2153 | goto err_out; | ||
| 2154 | 2093 | ||
| 2155 | /* | 2094 | /* |
| 2156 | * determine by signature whether we have ATA or ATAPI devices | 2095 | * determine by signature whether we have ATA or ATAPI devices |
| @@ -2223,9 +2162,9 @@ static int sata_phy_resume(struct ata_port *ap) | |||
| 2223 | * so makes reset sequence different from the original | 2162 | * so makes reset sequence different from the original |
| 2224 | * ->phy_reset implementation and Jeff nervous. :-P | 2163 | * ->phy_reset implementation and Jeff nervous. :-P |
| 2225 | */ | 2164 | */ |
| 2226 | extern void ata_std_probeinit(struct ata_port *ap) | 2165 | void ata_std_probeinit(struct ata_port *ap) |
| 2227 | { | 2166 | { |
| 2228 | if (ap->flags & ATA_FLAG_SATA && ap->ops->scr_read) { | 2167 | if ((ap->flags & ATA_FLAG_SATA) && ap->ops->scr_read) { |
| 2229 | sata_phy_resume(ap); | 2168 | sata_phy_resume(ap); |
| 2230 | if (sata_dev_present(ap)) | 2169 | if (sata_dev_present(ap)) |
| 2231 | ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT); | 2170 | ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT); |
| @@ -2714,18 +2653,23 @@ static int ata_dma_blacklisted(const struct ata_device *dev) | |||
| 2714 | * known limits including host controller limits, device | 2653 | * known limits including host controller limits, device |
| 2715 | * blacklist, etc... | 2654 | * blacklist, etc... |
| 2716 | * | 2655 | * |
| 2656 | * FIXME: The current implementation limits all transfer modes to | ||
| 2657 | * the fastest of the lowested device on the port. This is not | ||
| 2658 | * required on most controllers. | ||
| 2659 | * | ||
| 2717 | * LOCKING: | 2660 | * LOCKING: |
| 2718 | * None. | 2661 | * None. |
| 2719 | */ | 2662 | */ |
| 2720 | static void ata_dev_xfermask(struct ata_port *ap, struct ata_device *dev) | 2663 | static void ata_dev_xfermask(struct ata_port *ap, struct ata_device *dev) |
| 2721 | { | 2664 | { |
| 2665 | struct ata_host_set *hs = ap->host_set; | ||
| 2722 | unsigned long xfer_mask; | 2666 | unsigned long xfer_mask; |
| 2723 | int i; | 2667 | int i; |
| 2724 | 2668 | ||
| 2725 | xfer_mask = ata_pack_xfermask(ap->pio_mask, ap->mwdma_mask, | 2669 | xfer_mask = ata_pack_xfermask(ap->pio_mask, ap->mwdma_mask, |
| 2726 | ap->udma_mask); | 2670 | ap->udma_mask); |
| 2727 | 2671 | ||
| 2728 | /* use port-wide xfermask for now */ | 2672 | /* FIXME: Use port-wide xfermask for now */ |
| 2729 | for (i = 0; i < ATA_MAX_DEVICES; i++) { | 2673 | for (i = 0; i < ATA_MAX_DEVICES; i++) { |
| 2730 | struct ata_device *d = &ap->device[i]; | 2674 | struct ata_device *d = &ap->device[i]; |
| 2731 | if (!ata_dev_present(d)) | 2675 | if (!ata_dev_present(d)) |
| @@ -2735,12 +2679,23 @@ static void ata_dev_xfermask(struct ata_port *ap, struct ata_device *dev) | |||
| 2735 | xfer_mask &= ata_id_xfermask(d->id); | 2679 | xfer_mask &= ata_id_xfermask(d->id); |
| 2736 | if (ata_dma_blacklisted(d)) | 2680 | if (ata_dma_blacklisted(d)) |
| 2737 | xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA); | 2681 | xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA); |
| 2682 | /* Apply cable rule here. Don't apply it early because when | ||
| 2683 | we handle hot plug the cable type can itself change */ | ||
| 2684 | if (ap->cbl == ATA_CBL_PATA40) | ||
| 2685 | xfer_mask &= ~(0xF8 << ATA_SHIFT_UDMA); | ||
| 2738 | } | 2686 | } |
| 2739 | 2687 | ||
| 2740 | if (ata_dma_blacklisted(dev)) | 2688 | if (ata_dma_blacklisted(dev)) |
| 2741 | printk(KERN_WARNING "ata%u: dev %u is on DMA blacklist, " | 2689 | printk(KERN_WARNING "ata%u: dev %u is on DMA blacklist, " |
| 2742 | "disabling DMA\n", ap->id, dev->devno); | 2690 | "disabling DMA\n", ap->id, dev->devno); |
| 2743 | 2691 | ||
| 2692 | if (hs->flags & ATA_HOST_SIMPLEX) { | ||
| 2693 | if (hs->simplex_claimed) | ||
| 2694 | xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA); | ||
| 2695 | } | ||
| 2696 | if (ap->ops->mode_filter) | ||
| 2697 | xfer_mask = ap->ops->mode_filter(ap, dev, xfer_mask); | ||
| 2698 | |||
| 2744 | ata_unpack_xfermask(xfer_mask, &dev->pio_mask, &dev->mwdma_mask, | 2699 | ata_unpack_xfermask(xfer_mask, &dev->pio_mask, &dev->mwdma_mask, |
| 2745 | &dev->udma_mask); | 2700 | &dev->udma_mask); |
| 2746 | } | 2701 | } |
| @@ -2795,16 +2750,16 @@ static unsigned int ata_dev_set_xfermode(struct ata_port *ap, | |||
| 2795 | */ | 2750 | */ |
| 2796 | 2751 | ||
| 2797 | static unsigned int ata_dev_init_params(struct ata_port *ap, | 2752 | static unsigned int ata_dev_init_params(struct ata_port *ap, |
| 2798 | struct ata_device *dev) | 2753 | struct ata_device *dev, |
| 2754 | u16 heads, | ||
| 2755 | u16 sectors) | ||
| 2799 | { | 2756 | { |
| 2800 | struct ata_taskfile tf; | 2757 | struct ata_taskfile tf; |
| 2801 | unsigned int err_mask; | 2758 | unsigned int err_mask; |
| 2802 | u16 sectors = dev->id[6]; | ||
| 2803 | u16 heads = dev->id[3]; | ||
| 2804 | 2759 | ||
| 2805 | /* Number of sectors per track 1-255. Number of heads 1-16 */ | 2760 | /* Number of sectors per track 1-255. Number of heads 1-16 */ |
| 2806 | if (sectors < 1 || sectors > 255 || heads < 1 || heads > 16) | 2761 | if (sectors < 1 || sectors > 255 || heads < 1 || heads > 16) |
| 2807 | return 0; | 2762 | return AC_ERR_INVALID; |
| 2808 | 2763 | ||
| 2809 | /* set up init dev params taskfile */ | 2764 | /* set up init dev params taskfile */ |
| 2810 | DPRINTK("init dev params \n"); | 2765 | DPRINTK("init dev params \n"); |
| @@ -4536,6 +4491,14 @@ static struct ata_port * ata_host_add(const struct ata_probe_ent *ent, | |||
| 4536 | int rc; | 4491 | int rc; |
| 4537 | 4492 | ||
| 4538 | DPRINTK("ENTER\n"); | 4493 | DPRINTK("ENTER\n"); |
| 4494 | |||
| 4495 | if (!ent->port_ops->probe_reset && | ||
| 4496 | !(ent->host_flags & (ATA_FLAG_SATA_RESET | ATA_FLAG_SRST))) { | ||
| 4497 | printk(KERN_ERR "ata%u: no reset mechanism available\n", | ||
| 4498 | port_no); | ||
| 4499 | return NULL; | ||
| 4500 | } | ||
| 4501 | |||
| 4539 | host = scsi_host_alloc(ent->sht, sizeof(struct ata_port)); | 4502 | host = scsi_host_alloc(ent->sht, sizeof(struct ata_port)); |
| 4540 | if (!host) | 4503 | if (!host) |
| 4541 | return NULL; | 4504 | return NULL; |
| @@ -4596,6 +4559,7 @@ int ata_device_add(const struct ata_probe_ent *ent) | |||
| 4596 | host_set->mmio_base = ent->mmio_base; | 4559 | host_set->mmio_base = ent->mmio_base; |
| 4597 | host_set->private_data = ent->private_data; | 4560 | host_set->private_data = ent->private_data; |
| 4598 | host_set->ops = ent->port_ops; | 4561 | host_set->ops = ent->port_ops; |
| 4562 | host_set->flags = ent->host_set_flags; | ||
| 4599 | 4563 | ||
| 4600 | /* register each port bound to this device */ | 4564 | /* register each port bound to this device */ |
| 4601 | for (i = 0; i < ent->n_ports; i++) { | 4565 | for (i = 0; i < ent->n_ports; i++) { |
diff --git a/drivers/scsi/sata_mv.c b/drivers/scsi/sata_mv.c index 275ed9bd898c..fa901fd65085 100644 --- a/drivers/scsi/sata_mv.c +++ b/drivers/scsi/sata_mv.c | |||
| @@ -1010,7 +1010,7 @@ static void mv_fill_sg(struct ata_queued_cmd *qc) | |||
| 1010 | 1010 | ||
| 1011 | pp->sg_tbl[i].addr = cpu_to_le32(addr & 0xffffffff); | 1011 | pp->sg_tbl[i].addr = cpu_to_le32(addr & 0xffffffff); |
| 1012 | pp->sg_tbl[i].addr_hi = cpu_to_le32((addr >> 16) >> 16); | 1012 | pp->sg_tbl[i].addr_hi = cpu_to_le32((addr >> 16) >> 16); |
| 1013 | pp->sg_tbl[i].flags_size = cpu_to_le32(len); | 1013 | pp->sg_tbl[i].flags_size = cpu_to_le32(len & 0xffff); |
| 1014 | 1014 | ||
| 1015 | sg_len -= len; | 1015 | sg_len -= len; |
| 1016 | addr += len; | 1016 | addr += len; |
| @@ -1350,7 +1350,6 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant, | |||
| 1350 | { | 1350 | { |
| 1351 | void __iomem *mmio = host_set->mmio_base; | 1351 | void __iomem *mmio = host_set->mmio_base; |
| 1352 | void __iomem *hc_mmio = mv_hc_base(mmio, hc); | 1352 | void __iomem *hc_mmio = mv_hc_base(mmio, hc); |
| 1353 | struct ata_port *ap; | ||
| 1354 | struct ata_queued_cmd *qc; | 1353 | struct ata_queued_cmd *qc; |
| 1355 | u32 hc_irq_cause; | 1354 | u32 hc_irq_cause; |
| 1356 | int shift, port, port0, hard_port, handled; | 1355 | int shift, port, port0, hard_port, handled; |
| @@ -1373,25 +1372,32 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant, | |||
| 1373 | 1372 | ||
| 1374 | for (port = port0; port < port0 + MV_PORTS_PER_HC; port++) { | 1373 | for (port = port0; port < port0 + MV_PORTS_PER_HC; port++) { |
| 1375 | u8 ata_status = 0; | 1374 | u8 ata_status = 0; |
| 1376 | ap = host_set->ports[port]; | 1375 | struct ata_port *ap = host_set->ports[port]; |
| 1376 | struct mv_port_priv *pp = ap->private_data; | ||
| 1377 | |||
| 1377 | hard_port = port & MV_PORT_MASK; /* range 0-3 */ | 1378 | hard_port = port & MV_PORT_MASK; /* range 0-3 */ |
| 1378 | handled = 0; /* ensure ata_status is set if handled++ */ | 1379 | handled = 0; /* ensure ata_status is set if handled++ */ |
| 1379 | 1380 | ||
| 1380 | if ((CRPB_DMA_DONE << hard_port) & hc_irq_cause) { | 1381 | /* Note that DEV_IRQ might happen spuriously during EDMA, |
| 1381 | /* new CRPB on the queue; just one at a time until NCQ | 1382 | * and should be ignored in such cases. We could mask it, |
| 1382 | */ | 1383 | * but it's pretty rare and may not be worth the overhead. |
| 1383 | ata_status = mv_get_crpb_status(ap); | 1384 | */ |
| 1384 | handled++; | 1385 | if (pp->pp_flags & MV_PP_FLAG_EDMA_EN) { |
| 1385 | } else if ((DEV_IRQ << hard_port) & hc_irq_cause) { | 1386 | /* EDMA: check for response queue interrupt */ |
| 1386 | /* received ATA IRQ; read the status reg to clear INTRQ | 1387 | if ((CRPB_DMA_DONE << hard_port) & hc_irq_cause) { |
| 1387 | */ | 1388 | ata_status = mv_get_crpb_status(ap); |
| 1388 | ata_status = readb((void __iomem *) | 1389 | handled = 1; |
| 1390 | } | ||
| 1391 | } else { | ||
| 1392 | /* PIO: check for device (drive) interrupt */ | ||
| 1393 | if ((DEV_IRQ << hard_port) & hc_irq_cause) { | ||
| 1394 | ata_status = readb((void __iomem *) | ||
| 1389 | ap->ioaddr.status_addr); | 1395 | ap->ioaddr.status_addr); |
| 1390 | handled++; | 1396 | handled = 1; |
| 1397 | } | ||
| 1391 | } | 1398 | } |
| 1392 | 1399 | ||
| 1393 | if (ap && | 1400 | if (ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR)) |
| 1394 | (ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR))) | ||
| 1395 | continue; | 1401 | continue; |
| 1396 | 1402 | ||
| 1397 | err_mask = ac_err_mask(ata_status); | 1403 | err_mask = ac_err_mask(ata_status); |
| @@ -1403,12 +1409,12 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant, | |||
| 1403 | if ((PORT0_ERR << shift) & relevant) { | 1409 | if ((PORT0_ERR << shift) & relevant) { |
| 1404 | mv_err_intr(ap); | 1410 | mv_err_intr(ap); |
| 1405 | err_mask |= AC_ERR_OTHER; | 1411 | err_mask |= AC_ERR_OTHER; |
| 1406 | handled++; | 1412 | handled = 1; |
| 1407 | } | 1413 | } |
| 1408 | 1414 | ||
| 1409 | if (handled && ap) { | 1415 | if (handled) { |
| 1410 | qc = ata_qc_from_tag(ap, ap->active_tag); | 1416 | qc = ata_qc_from_tag(ap, ap->active_tag); |
| 1411 | if (NULL != qc) { | 1417 | if (qc && (qc->flags & ATA_QCFLAG_ACTIVE)) { |
| 1412 | VPRINTK("port %u IRQ found for qc, " | 1418 | VPRINTK("port %u IRQ found for qc, " |
| 1413 | "ata_status 0x%x\n", port,ata_status); | 1419 | "ata_status 0x%x\n", port,ata_status); |
| 1414 | /* mark qc status appropriately */ | 1420 | /* mark qc status appropriately */ |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 047192253c3a..0d61357604d5 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
| @@ -160,8 +160,10 @@ enum { | |||
| 160 | ATA_QCFLAG_DMAMAP = ATA_QCFLAG_SG | ATA_QCFLAG_SINGLE, | 160 | ATA_QCFLAG_DMAMAP = ATA_QCFLAG_SG | ATA_QCFLAG_SINGLE, |
| 161 | ATA_QCFLAG_EH_SCHEDULED = (1 << 5), /* EH scheduled */ | 161 | ATA_QCFLAG_EH_SCHEDULED = (1 << 5), /* EH scheduled */ |
| 162 | 162 | ||
| 163 | /* host set flags */ | ||
| 164 | ATA_HOST_SIMPLEX = (1 << 0), /* Host is simplex, one DMA channel per host_set only */ | ||
| 165 | |||
| 163 | /* various lengths of time */ | 166 | /* various lengths of time */ |
| 164 | ATA_TMOUT_EDD = 5 * HZ, /* heuristic */ | ||
| 165 | ATA_TMOUT_PIO = 30 * HZ, | 167 | ATA_TMOUT_PIO = 30 * HZ, |
| 166 | ATA_TMOUT_BOOT = 30 * HZ, /* heuristic */ | 168 | ATA_TMOUT_BOOT = 30 * HZ, /* heuristic */ |
| 167 | ATA_TMOUT_BOOT_QUICK = 7 * HZ, /* heuristic */ | 169 | ATA_TMOUT_BOOT_QUICK = 7 * HZ, /* heuristic */ |
| @@ -279,6 +281,7 @@ struct ata_probe_ent { | |||
| 279 | unsigned long irq; | 281 | unsigned long irq; |
| 280 | unsigned int irq_flags; | 282 | unsigned int irq_flags; |
| 281 | unsigned long host_flags; | 283 | unsigned long host_flags; |
| 284 | unsigned long host_set_flags; | ||
| 282 | void __iomem *mmio_base; | 285 | void __iomem *mmio_base; |
| 283 | void *private_data; | 286 | void *private_data; |
| 284 | }; | 287 | }; |
| @@ -291,6 +294,9 @@ struct ata_host_set { | |||
| 291 | unsigned int n_ports; | 294 | unsigned int n_ports; |
| 292 | void *private_data; | 295 | void *private_data; |
| 293 | const struct ata_port_operations *ops; | 296 | const struct ata_port_operations *ops; |
| 297 | unsigned long flags; | ||
| 298 | int simplex_claimed; /* Keep seperate in case we | ||
| 299 | ever need to do this locked */ | ||
| 294 | struct ata_port * ports[0]; | 300 | struct ata_port * ports[0]; |
| 295 | }; | 301 | }; |
| 296 | 302 | ||
| @@ -420,6 +426,7 @@ struct ata_port_operations { | |||
| 420 | 426 | ||
| 421 | void (*set_piomode) (struct ata_port *, struct ata_device *); | 427 | void (*set_piomode) (struct ata_port *, struct ata_device *); |
| 422 | void (*set_dmamode) (struct ata_port *, struct ata_device *); | 428 | void (*set_dmamode) (struct ata_port *, struct ata_device *); |
| 429 | unsigned long (*mode_filter) (const struct ata_port *, struct ata_device *, unsigned long); | ||
| 423 | 430 | ||
| 424 | void (*tf_load) (struct ata_port *ap, const struct ata_taskfile *tf); | 431 | void (*tf_load) (struct ata_port *ap, const struct ata_taskfile *tf); |
| 425 | void (*tf_read) (struct ata_port *ap, struct ata_taskfile *tf); | 432 | void (*tf_read) (struct ata_port *ap, struct ata_taskfile *tf); |
| @@ -430,6 +437,7 @@ struct ata_port_operations { | |||
| 430 | void (*dev_select)(struct ata_port *ap, unsigned int device); | 437 | void (*dev_select)(struct ata_port *ap, unsigned int device); |
| 431 | 438 | ||
| 432 | void (*phy_reset) (struct ata_port *ap); /* obsolete */ | 439 | void (*phy_reset) (struct ata_port *ap); /* obsolete */ |
| 440 | void (*set_mode) (struct ata_port *ap); | ||
| 433 | int (*probe_reset) (struct ata_port *ap, unsigned int *classes); | 441 | int (*probe_reset) (struct ata_port *ap, unsigned int *classes); |
| 434 | 442 | ||
| 435 | void (*post_set_mode) (struct ata_port *ap); | 443 | void (*post_set_mode) (struct ata_port *ap); |
