]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/net/ethernet/broadcom/bgmac.c
Merge tag 'usb-4.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
[karo-tx-linux.git] / drivers / net / ethernet / broadcom / bgmac.c
index 0e066dc6b8cc32436f0a5bbcab0505d7af376c1a..415046750bb449853e794318c700d14f1a1de48d 100644 (file)
@@ -12,6 +12,8 @@
 #include <linux/bcma/bcma.h>
 #include <linux/etherdevice.h>
 #include <linux/bcm47xx_nvram.h>
+#include <linux/phy.h>
+#include <linux/phy_fixed.h>
 #include "bgmac.h"
 
 static bool bgmac_wait_value(struct bgmac *bgmac, u16 reg, u32 mask,
@@ -1148,7 +1150,7 @@ static int bgmac_poll(struct napi_struct *napi, int weight)
                return weight;
 
        if (handled < weight) {
-               napi_complete(napi);
+               napi_complete_done(napi, handled);
                bgmac_chip_intrs_on(bgmac);
        }
 
@@ -1446,33 +1448,42 @@ int bgmac_phy_connect_direct(struct bgmac *bgmac)
 }
 EXPORT_SYMBOL_GPL(bgmac_phy_connect_direct);
 
-int bgmac_enet_probe(struct bgmac *info)
+struct bgmac *bgmac_alloc(struct device *dev)
 {
        struct net_device *net_dev;
        struct bgmac *bgmac;
-       int err;
 
        /* Allocation and references */
-       net_dev = alloc_etherdev(sizeof(*bgmac));
+       net_dev = devm_alloc_etherdev(dev, sizeof(*bgmac));
        if (!net_dev)
-               return -ENOMEM;
+               return NULL;
 
        net_dev->netdev_ops = &bgmac_netdev_ops;
        net_dev->ethtool_ops = &bgmac_ethtool_ops;
+
        bgmac = netdev_priv(net_dev);
-       memcpy(bgmac, info, sizeof(*bgmac));
+       bgmac->dev = dev;
        bgmac->net_dev = net_dev;
+
+       return bgmac;
+}
+EXPORT_SYMBOL_GPL(bgmac_alloc);
+
+int bgmac_enet_probe(struct bgmac *bgmac)
+{
+       struct net_device *net_dev = bgmac->net_dev;
+       int err;
+
        net_dev->irq = bgmac->irq;
        SET_NETDEV_DEV(net_dev, bgmac->dev);
 
-       if (!is_valid_ether_addr(bgmac->mac_addr)) {
+       if (!is_valid_ether_addr(net_dev->dev_addr)) {
                dev_err(bgmac->dev, "Invalid MAC addr: %pM\n",
-                       bgmac->mac_addr);
-               eth_random_addr(bgmac->mac_addr);
+                       net_dev->dev_addr);
+               eth_hw_addr_random(net_dev);
                dev_warn(bgmac->dev, "Using random MAC: %pM\n",
-                        bgmac->mac_addr);
+                        net_dev->dev_addr);
        }
-       ether_addr_copy(net_dev->dev_addr, bgmac->mac_addr);
 
        /* This (reset &) enable is not preset in specs or reference driver but
         * Broadcom does it in arch PCI code when enabling fake PCI device.
@@ -1488,7 +1499,7 @@ int bgmac_enet_probe(struct bgmac *info)
        err = bgmac_dma_alloc(bgmac);
        if (err) {
                dev_err(bgmac->dev, "Unable to alloc memory for DMA\n");
-               goto err_netdev_free;
+               goto err_out;
        }
 
        bgmac->int_mask = BGMAC_IS_ERRMASK | BGMAC_IS_RX | BGMAC_IS_TX_MASK;
@@ -1521,8 +1532,7 @@ err_phy_disconnect:
        phy_disconnect(net_dev->phydev);
 err_dma_free:
        bgmac_dma_free(bgmac);
-err_netdev_free:
-       free_netdev(net_dev);
+err_out:
 
        return err;
 }