diff options
| author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-30 17:29:20 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-30 17:29:20 -0500 |
| commit | 256414dee44eaa0983f5ab1a71877de23c4e9ce7 (patch) | |
| tree | 770768cdd6ff6324f55fd305cb26109e89322fb0 | |
| parent | 63e8d9114dab88c101be2372cb1f83a4fe74d9c1 (diff) | |
| parent | 55d8ca4f8094246da6e71889a4e04bfafaa78b10 (diff) | |
Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev
* 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev:
[PATCH] sata_mv: three bug fixes
[PATCH] libata: ata_dev_init_params() fixes
[PATCH] libata: Fix interesting use of "extern" and also some bracketing
[PATCH] libata: Simplex and other mode filtering logic
[PATCH] libata - ATA is both ATA and CFA
[PATCH] libata: Add ->set_mode hook for odd drivers
[PATCH] libata: BMDMA handling updates
[PATCH] libata: kill trailing whitespace
[PATCH] libata: add FIXME above ata_dev_xfermask()
[PATCH] libata: cosmetic changes in ata_bus_softreset()
[PATCH] libata: kill E.D.D.
| -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, | |||
