OSDN Git Service

pch_gbe: use managed functions pcim_* and devm_*
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Fri, 28 Jun 2013 11:02:54 +0000 (14:02 +0300)
committerDavid S. Miller <davem@davemloft.net>
Sat, 29 Jun 2013 04:37:48 +0000 (21:37 -0700)
This makes the error handling much more simpler than open-coding everything and
in addition makes the probe function smaller an tidier.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c

index 97db563..ab1039a 100644 (file)
@@ -636,15 +636,15 @@ static void pch_gbe_mac_set_pause_packet(struct pch_gbe_hw *hw)
  */
 static int pch_gbe_alloc_queues(struct pch_gbe_adapter *adapter)
 {
-       adapter->tx_ring = kzalloc(sizeof(*adapter->tx_ring), GFP_KERNEL);
+       adapter->tx_ring = devm_kzalloc(&adapter->pdev->dev,
+                                       sizeof(*adapter->tx_ring), GFP_KERNEL);
        if (!adapter->tx_ring)
                return -ENOMEM;
 
-       adapter->rx_ring = kzalloc(sizeof(*adapter->rx_ring), GFP_KERNEL);
-       if (!adapter->rx_ring) {
-               kfree(adapter->tx_ring);
+       adapter->rx_ring = devm_kzalloc(&adapter->pdev->dev,
+                                       sizeof(*adapter->rx_ring), GFP_KERNEL);
+       if (!adapter->rx_ring)
                return -ENOMEM;
-       }
        return 0;
 }
 
@@ -2588,13 +2588,7 @@ static void pch_gbe_remove(struct pci_dev *pdev)
 
        pch_gbe_hal_phy_hw_reset(&adapter->hw);
 
-       kfree(adapter->tx_ring);
-       kfree(adapter->rx_ring);
-
-       iounmap(adapter->hw.reg);
-       pci_release_regions(pdev);
        free_netdev(netdev);
-       pci_disable_device(pdev);
 }
 
 static int pch_gbe_probe(struct pci_dev *pdev,
@@ -2604,7 +2598,7 @@ static int pch_gbe_probe(struct pci_dev *pdev,
        struct pch_gbe_adapter *adapter;
        int ret;
 
-       ret = pci_enable_device(pdev);
+       ret = pcim_enable_device(pdev);
        if (ret)
                return ret;
 
@@ -2617,24 +2611,22 @@ static int pch_gbe_probe(struct pci_dev *pdev,
                        if (ret) {
                                dev_err(&pdev->dev, "ERR: No usable DMA "
                                        "configuration, aborting\n");
-                               goto err_disable_device;
+                               return ret;
                        }
                }
        }
 
-       ret = pci_request_regions(pdev, KBUILD_MODNAME);
+       ret = pcim_iomap_regions(pdev, 1 << PCH_GBE_PCI_BAR, pci_name(pdev));
        if (ret) {
                dev_err(&pdev->dev,
                        "ERR: Can't reserve PCI I/O and memory resources\n");
-               goto err_disable_device;
+               return ret;
        }
        pci_set_master(pdev);
 
        netdev = alloc_etherdev((int)sizeof(struct pch_gbe_adapter));
-       if (!netdev) {
-               ret = -ENOMEM;
-               goto err_release_pci;
-       }
+       if (!netdev)
+               return -ENOMEM;
        SET_NETDEV_DEV(netdev, &pdev->dev);
 
        pci_set_drvdata(pdev, netdev);
@@ -2642,18 +2634,14 @@ static int pch_gbe_probe(struct pci_dev *pdev,
        adapter->netdev = netdev;
        adapter->pdev = pdev;
        adapter->hw.back = adapter;
-       adapter->hw.reg = pci_iomap(pdev, PCH_GBE_PCI_BAR, 0);
-       if (!adapter->hw.reg) {
-               ret = -EIO;
-               dev_err(&pdev->dev, "Can't ioremap\n");
-               goto err_free_netdev;
-       }
+       adapter->hw.reg = pcim_iomap_table(pdev)[PCH_GBE_PCI_BAR];
 
        adapter->ptp_pdev = pci_get_bus_and_slot(adapter->pdev->bus->number,
                                               PCI_DEVFN(12, 4));
        if (ptp_filter_init(ptp_filter, ARRAY_SIZE(ptp_filter))) {
                dev_err(&pdev->dev, "Bad ptp filter\n");
-               return -EINVAL;
+               ret = -EINVAL;
+               goto err_free_netdev;
        }
 
        netdev->netdev_ops = &pch_gbe_netdev_ops;
@@ -2671,7 +2659,7 @@ static int pch_gbe_probe(struct pci_dev *pdev,
        /* setup the private structure */
        ret = pch_gbe_sw_init(adapter);
        if (ret)
-               goto err_iounmap;
+               goto err_free_netdev;
 
        /* Initialize PHY */
        ret = pch_gbe_init_phy(adapter);
@@ -2727,16 +2715,8 @@ static int pch_gbe_probe(struct pci_dev *pdev,
 
 err_free_adapter:
        pch_gbe_hal_phy_hw_reset(&adapter->hw);
-       kfree(adapter->tx_ring);
-       kfree(adapter->rx_ring);
-err_iounmap:
-       iounmap(adapter->hw.reg);
 err_free_netdev:
        free_netdev(netdev);
-err_release_pci:
-       pci_release_regions(pdev);
-err_disable_device:
-       pci_disable_device(pdev);
        return ret;
 }