diff options
| -rw-r--r-- | drivers/ata/ahci.c | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 779a2b0aadda..b14e7ef343f3 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
| @@ -229,6 +229,9 @@ static void ahci_error_handler(struct ata_port *ap); | |||
| 229 | static void ahci_vt8251_error_handler(struct ata_port *ap); | 229 | static void ahci_vt8251_error_handler(struct ata_port *ap); |
| 230 | static void ahci_post_internal_cmd(struct ata_queued_cmd *qc); | 230 | static void ahci_post_internal_cmd(struct ata_queued_cmd *qc); |
| 231 | static int ahci_port_resume(struct ata_port *ap); | 231 | static int ahci_port_resume(struct ata_port *ap); |
| 232 | static unsigned int ahci_fill_sg(struct ata_queued_cmd *qc, void *cmd_tbl); | ||
| 233 | static void ahci_fill_cmd_slot(struct ahci_port_priv *pp, unsigned int tag, | ||
| 234 | u32 opts); | ||
| 232 | #ifdef CONFIG_PM | 235 | #ifdef CONFIG_PM |
| 233 | static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg); | 236 | static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg); |
| 234 | static int ahci_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg); | 237 | static int ahci_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg); |
| @@ -481,11 +484,17 @@ static inline int ahci_nr_ports(u32 cap) | |||
| 481 | return (cap & 0x1f) + 1; | 484 | return (cap & 0x1f) + 1; |
| 482 | } | 485 | } |
| 483 | 486 | ||
| 484 | static inline void __iomem *ahci_port_base(struct ata_port *ap) | 487 | static inline void __iomem *__ahci_port_base(struct ata_host *host, |
| 488 | unsigned int port_no) | ||
| 485 | { | 489 | { |
| 486 | void __iomem *mmio = ap->host->iomap[AHCI_PCI_BAR]; | 490 | void __iomem *mmio = host->iomap[AHCI_PCI_BAR]; |
| 487 | 491 | ||
| 488 | return mmio + 0x100 + (ap->port_no * 0x80); | 492 | return mmio + 0x100 + (port_no * 0x80); |
| 493 | } | ||
| 494 | |||
| 495 | static inline void __iomem *ahci_port_base(struct ata_port *ap) | ||
| 496 | { | ||
| 497 | return __ahci_port_base(ap->host, ap->port_no); | ||
| 489 | } | 498 | } |
| 490 | 499 | ||
| 491 | /** | 500 | /** |
| @@ -1750,14 +1759,18 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 1750 | host->private_data = hpriv; | 1759 | host->private_data = hpriv; |
| 1751 | 1760 | ||
| 1752 | for (i = 0; i < host->n_ports; i++) { | 1761 | for (i = 0; i < host->n_ports; i++) { |
| 1753 | if (hpriv->port_map & (1 << i)) { | 1762 | struct ata_port *ap = host->ports[i]; |
| 1754 | struct ata_port *ap = host->ports[i]; | 1763 | void __iomem *port_mmio = ahci_port_base(ap); |
| 1755 | void __iomem *port_mmio = ahci_port_base(ap); | ||
| 1756 | 1764 | ||
| 1765 | /* standard SATA port setup */ | ||
| 1766 | if (hpriv->port_map & (1 << i)) { | ||
| 1757 | ap->ioaddr.cmd_addr = port_mmio; | 1767 | ap->ioaddr.cmd_addr = port_mmio; |
| 1758 | ap->ioaddr.scr_addr = port_mmio + PORT_SCR; | 1768 | ap->ioaddr.scr_addr = port_mmio + PORT_SCR; |
| 1759 | } else | 1769 | } |
| 1760 | host->ports[i]->ops = &ata_dummy_port_ops; | 1770 | |
| 1771 | /* disabled/not-implemented port */ | ||
| 1772 | else | ||
| 1773 | ap->ops = &ata_dummy_port_ops; | ||
| 1761 | } | 1774 | } |
| 1762 | 1775 | ||
| 1763 | /* initialize adapter */ | 1776 | /* initialize adapter */ |
