bnx2: Refine VPD logic.
[safe/jmp/linux-2.6] / drivers / net / bfin_mac.c
index f0f1eb9..8ffea39 100644 (file)
@@ -491,7 +491,7 @@ static void bfin_mac_ethtool_getdrvinfo(struct net_device *dev,
        strcpy(info->bus_info, dev_name(&dev->dev));
 }
 
-static struct ethtool_ops bfin_mac_ethtool_ops = {
+static const struct ethtool_ops bfin_mac_ethtool_ops = {
        .get_settings = bfin_mac_ethtool_getsettings,
        .set_settings = bfin_mac_ethtool_setsettings,
        .get_link = ethtool_op_get_link,
@@ -554,8 +554,8 @@ static void adjust_tx_list(void)
 {
        int timeout_cnt = MAX_TIMEOUT_CNT;
 
-       if (tx_list_head->status.status_word != 0
-           && current_tx_ptr != tx_list_head) {
+       if (tx_list_head->status.status_word != 0 &&
+           current_tx_ptr != tx_list_head) {
                goto adjust_head;       /* released something, just return; */
        }
 
@@ -567,8 +567,8 @@ static void adjust_tx_list(void)
        if (current_tx_ptr->next->next == tx_list_head) {
                while (tx_list_head->status.status_word == 0) {
                        udelay(10);
-                       if (tx_list_head->status.status_word != 0
-                           || !(bfin_read_DMA2_IRQ_STATUS() & DMA_RUN)) {
+                       if (tx_list_head->status.status_word != 0 ||
+                           !(bfin_read_DMA2_IRQ_STATUS() & DMA_RUN)) {
                                goto adjust_head;
                        }
                        if (timeout_cnt-- < 0) {
@@ -596,8 +596,8 @@ adjust_head:
                               ": no sk_buff in a transmitted frame!\n");
                }
                tx_list_head = tx_list_head->next;
-       } while (tx_list_head->status.status_word != 0
-                && current_tx_ptr != tx_list_head);
+       } while (tx_list_head->status.status_word != 0 &&
+                current_tx_ptr != tx_list_head);
        return;
 
 }
@@ -656,7 +656,7 @@ out:
        dev->trans_start = jiffies;
        dev->stats.tx_packets++;
        dev->stats.tx_bytes += (skb->len);
-       return 0;
+       return NETDEV_TX_OK;
 }
 
 static void bfin_mac_rx(struct net_device *dev)
@@ -927,22 +927,7 @@ static int bfin_mac_open(struct net_device *dev)
        return 0;
 }
 
-static const struct net_device_ops bfin_mac_netdev_ops = {
-       .ndo_open               = bfin_mac_open,
-       .ndo_stop               = bfin_mac_close,
-       .ndo_start_xmit         = bfin_mac_hard_start_xmit,
-       .ndo_set_mac_address    = bfin_mac_set_mac_address,
-       .ndo_tx_timeout         = bfin_mac_timeout,
-       .ndo_set_multicast_list = bfin_mac_set_multicast_list,
-       .ndo_validate_addr      = eth_validate_addr,
-       .ndo_change_mtu         = eth_change_mtu,
-#ifdef CONFIG_NET_POLL_CONTROLLER
-       .ndo_poll_controller    = bfin_mac_poll,
-#endif
-};
-
 /*
- *
  * this makes the board clean up everything that it can
  * and not talk to the outside world.   Caused by
  * an 'ifconfig ethX down'
@@ -967,11 +952,26 @@ static int bfin_mac_close(struct net_device *dev)
        return 0;
 }
 
+static const struct net_device_ops bfin_mac_netdev_ops = {
+       .ndo_open               = bfin_mac_open,
+       .ndo_stop               = bfin_mac_close,
+       .ndo_start_xmit         = bfin_mac_hard_start_xmit,
+       .ndo_set_mac_address    = bfin_mac_set_mac_address,
+       .ndo_tx_timeout         = bfin_mac_timeout,
+       .ndo_set_multicast_list = bfin_mac_set_multicast_list,
+       .ndo_validate_addr      = eth_validate_addr,
+       .ndo_change_mtu         = eth_change_mtu,
+#ifdef CONFIG_NET_POLL_CONTROLLER
+       .ndo_poll_controller    = bfin_mac_poll,
+#endif
+};
+
 static int __devinit bfin_mac_probe(struct platform_device *pdev)
 {
        struct net_device *ndev;
        struct bfin_mac_local *lp;
-       int rc, i;
+       struct platform_device *pd;
+       int rc;
 
        ndev = alloc_etherdev(sizeof(struct bfin_mac_local));
        if (!ndev) {
@@ -996,13 +996,6 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev)
                goto out_err_probe_mac;
        }
 
-       /* set the GPIO pins to Ethernet mode */
-       rc = peripheral_request_list(pin_req, DRV_NAME);
-       if (rc) {
-               dev_err(&pdev->dev, "Requesting peripherals failed!\n");
-               rc = -EFAULT;
-               goto out_err_setup_pin_mux;
-       }
 
        /*
         * Is it valid? (Did bootloader initialize it?)
@@ -1018,26 +1011,14 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev)
 
        setup_mac_addr(ndev->dev_addr);
 
-       /* MDIO bus initial */
-       lp->mii_bus = mdiobus_alloc();
-       if (lp->mii_bus == NULL)
-               goto out_err_mdiobus_alloc;
-
-       lp->mii_bus->priv = ndev;
-       lp->mii_bus->read = bfin_mdiobus_read;
-       lp->mii_bus->write = bfin_mdiobus_write;
-       lp->mii_bus->reset = bfin_mdiobus_reset;
-       lp->mii_bus->name = "bfin_mac_mdio";
-       snprintf(lp->mii_bus->id, MII_BUS_ID_SIZE, "0");
-       lp->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL);
-       for (i = 0; i < PHY_MAX_ADDR; ++i)
-               lp->mii_bus->irq[i] = PHY_POLL;
-
-       rc = mdiobus_register(lp->mii_bus);
-       if (rc) {
-               dev_err(&pdev->dev, "Cannot register MDIO bus!\n");
-               goto out_err_mdiobus_register;
+       if (!pdev->dev.platform_data) {
+               dev_err(&pdev->dev, "Cannot get platform device bfin_mii_bus!\n");
+               rc = -ENODEV;
+               goto out_err_probe_mac;
        }
+       pd = pdev->dev.platform_data;
+       lp->mii_bus = platform_get_drvdata(pd);
+       lp->mii_bus->priv = ndev;
 
        rc = mii_probe(ndev);
        if (rc) {
@@ -1079,11 +1060,8 @@ out_err_reg_ndev:
 out_err_request_irq:
 out_err_mii_probe:
        mdiobus_unregister(lp->mii_bus);
-out_err_mdiobus_register:
        mdiobus_free(lp->mii_bus);
-out_err_mdiobus_alloc:
        peripheral_free_list(pin_req);
-out_err_setup_pin_mux:
 out_err_probe_mac:
        platform_set_drvdata(pdev, NULL);
        free_netdev(ndev);
@@ -1098,8 +1076,7 @@ static int __devexit bfin_mac_remove(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, NULL);
 
-       mdiobus_unregister(lp->mii_bus);
-       mdiobus_free(lp->mii_bus);
+       lp->mii_bus->priv = NULL;
 
        unregister_netdev(ndev);
 
@@ -1137,6 +1114,74 @@ static int bfin_mac_resume(struct platform_device *pdev)
 #define bfin_mac_resume NULL
 #endif /* CONFIG_PM */
 
+static int __devinit bfin_mii_bus_probe(struct platform_device *pdev)
+{
+       struct mii_bus *miibus;
+       int rc, i;
+
+       /*
+        * We are setting up a network card,
+        * so set the GPIO pins to Ethernet mode
+        */
+       rc = peripheral_request_list(pin_req, DRV_NAME);
+       if (rc) {
+               dev_err(&pdev->dev, "Requesting peripherals failed!\n");
+               return rc;
+       }
+
+       rc = -ENOMEM;
+       miibus = mdiobus_alloc();
+       if (miibus == NULL)
+               goto out_err_alloc;
+       miibus->read = bfin_mdiobus_read;
+       miibus->write = bfin_mdiobus_write;
+       miibus->reset = bfin_mdiobus_reset;
+
+       miibus->parent = &pdev->dev;
+       miibus->name = "bfin_mii_bus";
+       snprintf(miibus->id, MII_BUS_ID_SIZE, "0");
+       miibus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL);
+       if (miibus->irq == NULL)
+               goto out_err_alloc;
+       for (i = 0; i < PHY_MAX_ADDR; ++i)
+               miibus->irq[i] = PHY_POLL;
+
+       rc = mdiobus_register(miibus);
+       if (rc) {
+               dev_err(&pdev->dev, "Cannot register MDIO bus!\n");
+               goto out_err_mdiobus_register;
+       }
+
+       platform_set_drvdata(pdev, miibus);
+       return 0;
+
+out_err_mdiobus_register:
+       mdiobus_free(miibus);
+out_err_alloc:
+       peripheral_free_list(pin_req);
+
+       return rc;
+}
+
+static int __devexit bfin_mii_bus_remove(struct platform_device *pdev)
+{
+       struct mii_bus *miibus = platform_get_drvdata(pdev);
+       platform_set_drvdata(pdev, NULL);
+       mdiobus_unregister(miibus);
+       mdiobus_free(miibus);
+       peripheral_free_list(pin_req);
+       return 0;
+}
+
+static struct platform_driver bfin_mii_bus_driver = {
+       .probe = bfin_mii_bus_probe,
+       .remove = __devexit_p(bfin_mii_bus_remove),
+       .driver = {
+               .name = "bfin_mii_bus",
+               .owner  = THIS_MODULE,
+       },
+};
+
 static struct platform_driver bfin_mac_driver = {
        .probe = bfin_mac_probe,
        .remove = __devexit_p(bfin_mac_remove),
@@ -1150,7 +1195,11 @@ static struct platform_driver bfin_mac_driver = {
 
 static int __init bfin_mac_init(void)
 {
-       return platform_driver_register(&bfin_mac_driver);
+       int ret;
+       ret = platform_driver_register(&bfin_mii_bus_driver);
+       if (!ret)
+               return platform_driver_register(&bfin_mac_driver);
+       return -ENODEV;
 }
 
 module_init(bfin_mac_init);
@@ -1158,6 +1207,7 @@ module_init(bfin_mac_init);
 static void __exit bfin_mac_cleanup(void)
 {
        platform_driver_unregister(&bfin_mac_driver);
+       platform_driver_unregister(&bfin_mii_bus_driver);
 }
 
 module_exit(bfin_mac_cleanup);