diff options
Diffstat (limited to 'drivers/ata/ahci.c')
-rw-r--r-- | drivers/ata/ahci.c | 125 |
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 | ||
193 | struct ahci_host_priv { | 189 | struct 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); | |||
229 | static int ahci_port_resume(struct ata_port *ap); | 224 | static int ahci_port_resume(struct ata_port *ap); |
230 | static int ahci_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg); | 225 | static int ahci_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg); |
231 | static int ahci_pci_device_resume(struct pci_dev *pdev); | 226 | static int ahci_pci_device_resume(struct pci_dev *pdev); |
232 | static void ahci_remove_one (struct pci_dev *pdev); | ||
233 | 227 | ||
234 | static struct scsi_host_template ahci_sht = { | 228 | static 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 | ||
1485 | static void ahci_port_stop(struct ata_port *ap) | 1474 | static 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 | ||
1507 | static void ahci_setup_port(struct ata_ioports *port, unsigned long base, | 1488 | static 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 | ||
1672 | static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | 1653 | static 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 | |||
1769 | err_out_hpriv: | ||
1770 | kfree(hpriv); | ||
1771 | err_out_iounmap: | ||
1772 | pci_iounmap(pdev, mmio_base); | ||
1773 | err_out_free_ent: | ||
1774 | kfree(probe_ent); | ||
1775 | err_out_msi: | ||
1776 | if (have_msi) | ||
1777 | pci_disable_msi(pdev); | ||
1778 | else | ||
1779 | pci_intx(pdev, 0); | ||
1780 | pci_release_regions(pdev); | ||
1781 | err_out: | ||
1782 | if (!pci_dev_busy) | ||
1783 | pci_disable_device(pdev); | ||
1784 | return rc; | ||
1785 | } | ||
1786 | |||
1787 | static 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 | ||
1807 | static int __init ahci_init(void) | 1736 | static int __init ahci_init(void) |