aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/ahci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ata/ahci.c')
-rw-r--r--drivers/ata/ahci.c125
1 files changed, 27 insertions, 98 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
index d72568392e6c..20ab3ffce559 100644
--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -45,7 +45,6 @@
45#include <scsi/scsi_host.h> 45#include <scsi/scsi_host.h>
46#include <scsi/scsi_cmnd.h> 46#include <scsi/scsi_cmnd.h>
47#include <linux/libata.h> 47#include <linux/libata.h>
48#include <asm/io.h>
49 48
50#define DRV_NAME "ahci" 49#define DRV_NAME "ahci"
51#define DRV_VERSION "2.0" 50#define DRV_VERSION "2.0"
@@ -166,9 +165,6 @@ enum {
166 PORT_CMD_ICC_PARTIAL = (0x2 << 28), /* Put i/f in partial state */ 165 PORT_CMD_ICC_PARTIAL = (0x2 << 28), /* Put i/f in partial state */
167 PORT_CMD_ICC_SLUMBER = (0x6 << 28), /* Put i/f in slumber state */ 166 PORT_CMD_ICC_SLUMBER = (0x6 << 28), /* Put i/f in slumber state */
168 167
169 /* hpriv->flags bits */
170 AHCI_FLAG_MSI = (1 << 0),
171
172 /* ap->flags bits */ 168 /* ap->flags bits */
173 AHCI_FLAG_NO_NCQ = (1 << 24), 169 AHCI_FLAG_NO_NCQ = (1 << 24),
174 AHCI_FLAG_IGN_IRQ_IF_ERR = (1 << 25), /* ignore IRQ_IF_ERR */ 170 AHCI_FLAG_IGN_IRQ_IF_ERR = (1 << 25), /* ignore IRQ_IF_ERR */
@@ -191,7 +187,6 @@ struct ahci_sg {
191}; 187};
192 188
193struct ahci_host_priv { 189struct ahci_host_priv {
194 unsigned long flags;
195 u32 cap; /* cache of HOST_CAP register */ 190 u32 cap; /* cache of HOST_CAP register */
196 u32 port_map; /* cache of HOST_PORTS_IMPL reg */ 191 u32 port_map; /* cache of HOST_PORTS_IMPL reg */
197}; 192};
@@ -229,7 +224,6 @@ static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg);
229static int ahci_port_resume(struct ata_port *ap); 224static int ahci_port_resume(struct ata_port *ap);
230static int ahci_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg); 225static int ahci_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg);
231static int ahci_pci_device_resume(struct pci_dev *pdev); 226static int ahci_pci_device_resume(struct pci_dev *pdev);
232static void ahci_remove_one (struct pci_dev *pdev);
233 227
234static struct scsi_host_template ahci_sht = { 228static struct scsi_host_template ahci_sht = {
235 .module = THIS_MODULE, 229 .module = THIS_MODULE,
@@ -441,9 +435,9 @@ static struct pci_driver ahci_pci_driver = {
441 .name = DRV_NAME, 435 .name = DRV_NAME,
442 .id_table = ahci_pci_tbl, 436 .id_table = ahci_pci_tbl,
443 .probe = ahci_init_one, 437 .probe = ahci_init_one,
438 .remove = ata_pci_remove_one,
444 .suspend = ahci_pci_device_suspend, 439 .suspend = ahci_pci_device_suspend,
445 .resume = ahci_pci_device_resume, 440 .resume = ahci_pci_device_resume,
446 .remove = ahci_remove_one,
447}; 441};
448 442
449 443
@@ -1426,23 +1420,18 @@ static int ahci_port_start(struct ata_port *ap)
1426 dma_addr_t mem_dma; 1420 dma_addr_t mem_dma;
1427 int rc; 1421 int rc;
1428 1422
1429 pp = kmalloc(sizeof(*pp), GFP_KERNEL); 1423 pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
1430 if (!pp) 1424 if (!pp)
1431 return -ENOMEM; 1425 return -ENOMEM;
1432 memset(pp, 0, sizeof(*pp));
1433 1426
1434 rc = ata_pad_alloc(ap, dev); 1427 rc = ata_pad_alloc(ap, dev);
1435 if (rc) { 1428 if (rc)
1436 kfree(pp);
1437 return rc; 1429 return rc;
1438 }
1439 1430
1440 mem = dma_alloc_coherent(dev, AHCI_PORT_PRIV_DMA_SZ, &mem_dma, GFP_KERNEL); 1431 mem = dmam_alloc_coherent(dev, AHCI_PORT_PRIV_DMA_SZ, &mem_dma,
1441 if (!mem) { 1432 GFP_KERNEL);
1442 ata_pad_free(ap, dev); 1433 if (!mem)
1443 kfree(pp);
1444 return -ENOMEM; 1434 return -ENOMEM;
1445 }
1446 memset(mem, 0, AHCI_PORT_PRIV_DMA_SZ); 1435 memset(mem, 0, AHCI_PORT_PRIV_DMA_SZ);
1447 1436
1448 /* 1437 /*
@@ -1484,9 +1473,7 @@ static int ahci_port_start(struct ata_port *ap)
1484 1473
1485static void ahci_port_stop(struct ata_port *ap) 1474static void ahci_port_stop(struct ata_port *ap)
1486{ 1475{
1487 struct device *dev = ap->host->dev;
1488 struct ahci_host_priv *hpriv = ap->host->private_data; 1476 struct ahci_host_priv *hpriv = ap->host->private_data;
1489 struct ahci_port_priv *pp = ap->private_data;
1490 void __iomem *mmio = ap->host->mmio_base; 1477 void __iomem *mmio = ap->host->mmio_base;
1491 void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no); 1478 void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
1492 const char *emsg = NULL; 1479 const char *emsg = NULL;
@@ -1496,12 +1483,6 @@ static void ahci_port_stop(struct ata_port *ap)
1496 rc = ahci_deinit_port(port_mmio, hpriv->cap, &emsg); 1483 rc = ahci_deinit_port(port_mmio, hpriv->cap, &emsg);
1497 if (rc) 1484 if (rc)
1498 ata_port_printk(ap, KERN_WARNING, "%s (%d)\n", emsg, rc); 1485 ata_port_printk(ap, KERN_WARNING, "%s (%d)\n", emsg, rc);
1499
1500 ap->private_data = NULL;
1501 dma_free_coherent(dev, AHCI_PORT_PRIV_DMA_SZ,
1502 pp->cmd_slot, pp->cmd_slot_dma);
1503 ata_pad_free(ap, dev);
1504 kfree(pp);
1505} 1486}
1506 1487
1507static void ahci_setup_port(struct ata_ioports *port, unsigned long base, 1488static void ahci_setup_port(struct ata_ioports *port, unsigned long base,
@@ -1669,15 +1650,15 @@ static void ahci_print_info(struct ata_probe_ent *probe_ent)
1669 ); 1650 );
1670} 1651}
1671 1652
1672static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) 1653static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
1673{ 1654{
1674 static int printed_version; 1655 static int printed_version;
1675 struct ata_probe_ent *probe_ent = NULL; 1656 unsigned int board_idx = (unsigned int) ent->driver_data;
1657 struct device *dev = &pdev->dev;
1658 struct ata_probe_ent *probe_ent;
1676 struct ahci_host_priv *hpriv; 1659 struct ahci_host_priv *hpriv;
1677 unsigned long base; 1660 unsigned long base;
1678 void __iomem *mmio_base; 1661 void __iomem *mmio_base;
1679 unsigned int board_idx = (unsigned int) ent->driver_data;
1680 int have_msi, pci_dev_busy = 0;
1681 int rc; 1662 int rc;
1682 1663
1683 VPRINTK("ENTER\n"); 1664 VPRINTK("ENTER\n");
@@ -1694,46 +1675,34 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
1694 return -ENODEV; 1675 return -ENODEV;
1695 } 1676 }
1696 1677
1697 rc = pci_enable_device(pdev); 1678 rc = pcim_enable_device(pdev);
1698 if (rc) 1679 if (rc)
1699 return rc; 1680 return rc;
1700 1681
1701 rc = pci_request_regions(pdev, DRV_NAME); 1682 rc = pci_request_regions(pdev, DRV_NAME);
1702 if (rc) { 1683 if (rc) {
1703 pci_dev_busy = 1; 1684 pcim_pin_device(pdev);
1704 goto err_out; 1685 return rc;
1705 } 1686 }
1706 1687
1707 if (pci_enable_msi(pdev) == 0) 1688 if (pci_enable_msi(pdev))
1708 have_msi = 1;
1709 else {
1710 pci_intx(pdev, 1); 1689 pci_intx(pdev, 1);
1711 have_msi = 0;
1712 }
1713 1690
1714 probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL); 1691 probe_ent = devm_kzalloc(dev, sizeof(*probe_ent), GFP_KERNEL);
1715 if (probe_ent == NULL) { 1692 if (probe_ent == NULL)
1716 rc = -ENOMEM; 1693 return -ENOMEM;
1717 goto err_out_msi;
1718 }
1719 1694
1720 memset(probe_ent, 0, sizeof(*probe_ent));
1721 probe_ent->dev = pci_dev_to_dev(pdev); 1695 probe_ent->dev = pci_dev_to_dev(pdev);
1722 INIT_LIST_HEAD(&probe_ent->node); 1696 INIT_LIST_HEAD(&probe_ent->node);
1723 1697
1724 mmio_base = pci_iomap(pdev, AHCI_PCI_BAR, 0); 1698 mmio_base = pcim_iomap(pdev, AHCI_PCI_BAR, 0);
1725 if (mmio_base == NULL) { 1699 if (mmio_base == NULL)
1726 rc = -ENOMEM; 1700 return -ENOMEM;
1727 goto err_out_free_ent;
1728 }
1729 base = (unsigned long) mmio_base; 1701 base = (unsigned long) mmio_base;
1730 1702
1731 hpriv = kmalloc(sizeof(*hpriv), GFP_KERNEL); 1703 hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
1732 if (!hpriv) { 1704 if (!hpriv)
1733 rc = -ENOMEM; 1705 return -ENOMEM;
1734 goto err_out_iounmap;
1735 }
1736 memset(hpriv, 0, sizeof(*hpriv));
1737 1706
1738 probe_ent->sht = ahci_port_info[board_idx].sht; 1707 probe_ent->sht = ahci_port_info[board_idx].sht;
1739 probe_ent->port_flags = ahci_port_info[board_idx].flags; 1708 probe_ent->port_flags = ahci_port_info[board_idx].flags;
@@ -1746,13 +1715,10 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
1746 probe_ent->mmio_base = mmio_base; 1715 probe_ent->mmio_base = mmio_base;
1747 probe_ent->private_data = hpriv; 1716 probe_ent->private_data = hpriv;
1748 1717
1749 if (have_msi)
1750 hpriv->flags |= AHCI_FLAG_MSI;
1751
1752 /* initialize adapter */ 1718 /* initialize adapter */
1753 rc = ahci_host_init(probe_ent); 1719 rc = ahci_host_init(probe_ent);
1754 if (rc) 1720 if (rc)
1755 goto err_out_hpriv; 1721 return rc;
1756 1722
1757 if (!(probe_ent->port_flags & AHCI_FLAG_NO_NCQ) && 1723 if (!(probe_ent->port_flags & AHCI_FLAG_NO_NCQ) &&
1758 (hpriv->cap & HOST_CAP_NCQ)) 1724 (hpriv->cap & HOST_CAP_NCQ))
@@ -1760,48 +1726,11 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
1760 1726
1761 ahci_print_info(probe_ent); 1727 ahci_print_info(probe_ent);
1762 1728
1763 /* FIXME: check ata_device_add return value */ 1729 if (!ata_device_add(probe_ent))
1764 ata_device_add(probe_ent); 1730 return -ENODEV;
1765 kfree(probe_ent);
1766 1731
1732 devm_kfree(dev, probe_ent);
1767 return 0; 1733 return 0;
1768
1769err_out_hpriv:
1770 kfree(hpriv);
1771err_out_iounmap:
1772 pci_iounmap(pdev, mmio_base);
1773err_out_free_ent:
1774 kfree(probe_ent);
1775err_out_msi:
1776 if (have_msi)
1777 pci_disable_msi(pdev);
1778 else
1779 pci_intx(pdev, 0);
1780 pci_release_regions(pdev);
1781err_out:
1782 if (!pci_dev_busy)
1783 pci_disable_device(pdev);
1784 return rc;
1785}
1786
1787static void ahci_remove_one(struct pci_dev *pdev)
1788{
1789 struct device *dev = pci_dev_to_dev(pdev);
1790 struct ata_host *host = dev_get_drvdata(dev);
1791 struct ahci_host_priv *hpriv = host->private_data;
1792
1793 ata_host_remove(host);
1794
1795 pci_iounmap(pdev, host->mmio_base);
1796
1797 if (hpriv->flags & AHCI_FLAG_MSI)
1798 pci_disable_msi(pdev);
1799 else
1800 pci_intx(pdev, 0);
1801 pci_release_regions(pdev);
1802 pci_disable_device(pdev);
1803 dev_set_drvdata(dev, NULL);
1804 kfree(hpriv);
1805} 1734}
1806 1735
1807static int __init ahci_init(void) 1736static int __init ahci_init(void)