ucc_geth: Factor out MAC initialization steps into a call
authorAnton Vorontsov <avorontsov@ru.mvista.com>
Thu, 27 Aug 2009 07:35:54 +0000 (07:35 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 31 Aug 2009 04:51:37 +0000 (21:51 -0700)
This patch factors out MAC initialization into ucc_geth_init_mac()
function that we'll use for suspend/resume.

Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ucc_geth.c

index 52a6750..e474e57 100644 (file)
@@ -3429,46 +3429,25 @@ static int ucc_geth_set_mac_addr(struct net_device *dev, void *p)
        return 0;
 }
 
-/* Called when something needs to use the ethernet device */
-/* Returns 0 for success. */
-static int ucc_geth_open(struct net_device *dev)
+static int ucc_geth_init_mac(struct ucc_geth_private *ugeth)
 {
-       struct ucc_geth_private *ugeth = netdev_priv(dev);
+       struct net_device *dev = ugeth->ndev;
        int err;
 
-       ugeth_vdbg("%s: IN", __func__);
-
-       /* Test station address */
-       if (dev->dev_addr[0] & ENET_GROUP_ADDR) {
-               if (netif_msg_ifup(ugeth))
-                       ugeth_err("%s: Multicast address used for station address"
-                                 " - is this what you wanted?", __func__);
-               return -EINVAL;
-       }
-
-       err = init_phy(dev);
-       if (err) {
-               if (netif_msg_ifup(ugeth))
-                       ugeth_err("%s: Cannot initialize PHY, aborting.",
-                                 dev->name);
-               return err;
-       }
-
        err = ucc_struct_init(ugeth);
        if (err) {
                if (netif_msg_ifup(ugeth))
-                       ugeth_err("%s: Cannot configure internal struct, aborting.", dev->name);
-               goto out_err_stop;
+                       ugeth_err("%s: Cannot configure internal struct, "
+                                 "aborting.", dev->name);
+               goto err;
        }
 
-       napi_enable(&ugeth->napi);
-
        err = ucc_geth_startup(ugeth);
        if (err) {
                if (netif_msg_ifup(ugeth))
                        ugeth_err("%s: Cannot configure net device, aborting.",
                                  dev->name);
-               goto out_err;
+               goto err;
        }
 
        err = adjust_enet_interface(ugeth);
@@ -3476,7 +3455,7 @@ static int ucc_geth_open(struct net_device *dev)
                if (netif_msg_ifup(ugeth))
                        ugeth_err("%s: Cannot configure net device, aborting.",
                                  dev->name);
-               goto out_err;
+               goto err;
        }
 
        /*       Set MACSTNADDR1, MACSTNADDR2                */
@@ -3490,13 +3469,51 @@ static int ucc_geth_open(struct net_device *dev)
                                   &ugeth->ug_regs->macstnaddr1,
                                   &ugeth->ug_regs->macstnaddr2);
 
-       phy_start(ugeth->phydev);
-
        err = ugeth_enable(ugeth, COMM_DIR_RX_AND_TX);
        if (err) {
                if (netif_msg_ifup(ugeth))
                        ugeth_err("%s: Cannot enable net device, aborting.", dev->name);
-               goto out_err;
+               goto err;
+       }
+
+       return 0;
+err:
+       ucc_geth_stop(ugeth);
+       return err;
+}
+
+/* Called when something needs to use the ethernet device */
+/* Returns 0 for success. */
+static int ucc_geth_open(struct net_device *dev)
+{
+       struct ucc_geth_private *ugeth = netdev_priv(dev);
+       int err;
+
+       ugeth_vdbg("%s: IN", __func__);
+
+       /* Test station address */
+       if (dev->dev_addr[0] & ENET_GROUP_ADDR) {
+               if (netif_msg_ifup(ugeth))
+                       ugeth_err("%s: Multicast address used for station "
+                                 "address - is this what you wanted?",
+                                 __func__);
+               return -EINVAL;
+       }
+
+       err = init_phy(dev);
+       if (err) {
+               if (netif_msg_ifup(ugeth))
+                       ugeth_err("%s: Cannot initialize PHY, aborting.",
+                                 dev->name);
+               return err;
+       }
+
+       err = ucc_geth_init_mac(ugeth);
+       if (err) {
+               if (netif_msg_ifup(ugeth))
+                       ugeth_err("%s: Cannot initialize MAC, aborting.",
+                                 dev->name);
+               goto err;
        }
 
        err = request_irq(ugeth->ug_info->uf_info.irq, ucc_geth_irq_handler,
@@ -3505,16 +3522,16 @@ static int ucc_geth_open(struct net_device *dev)
                if (netif_msg_ifup(ugeth))
                        ugeth_err("%s: Cannot get IRQ for net device, aborting.",
                                  dev->name);
-               goto out_err;
+               goto err;
        }
 
+       phy_start(ugeth->phydev);
+       napi_enable(&ugeth->napi);
        netif_start_queue(dev);
 
        return err;
 
-out_err:
-       napi_disable(&ugeth->napi);
-out_err_stop:
+err:
        ucc_geth_stop(ugeth);
        return err;
 }