staging: octeon-ethernet: consolidate ndo_open functions
authorAaro Koskinen <aaro.koskinen@iki.fi>
Sat, 4 Apr 2015 19:51:02 +0000 (22:51 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 30 Apr 2015 14:59:23 +0000 (16:59 +0200)
ndo_open for rgmii, sgmii and xaui are almost identical. Put the common
code in a single function.

Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/octeon/ethernet-rgmii.c
drivers/staging/octeon/ethernet-sgmii.c
drivers/staging/octeon/ethernet-xaui.c
drivers/staging/octeon/ethernet.c
drivers/staging/octeon/octeon-ethernet.h

index e36f9bc695430bf89fefd00b9feba9fe37bcc698..88889d30cc0317d98d2080804a0cfa28aef46e4a 100644 (file)
@@ -298,37 +298,7 @@ static irqreturn_t cvm_oct_rgmii_rml_interrupt(int cpl, void *dev_id)
 
 int cvm_oct_rgmii_open(struct net_device *dev)
 {
-       union cvmx_gmxx_prtx_cfg gmx_cfg;
-       struct octeon_ethernet *priv = netdev_priv(dev);
-       int interface = INTERFACE(priv->port);
-       int index = INDEX(priv->port);
-       cvmx_helper_link_info_t link_info;
-       int rv;
-
-       rv = cvm_oct_phy_setup_device(dev);
-       if (rv)
-               return rv;
-
-       gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
-       gmx_cfg.s.en = 1;
-       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
-
-       if (!octeon_is_simulation()) {
-               if (priv->phydev) {
-                       int r = phy_read_status(priv->phydev);
-
-                       if (r == 0 && priv->phydev->link == 0)
-                               netif_carrier_off(dev);
-                       cvm_oct_adjust_link(dev);
-               } else {
-                       link_info = cvmx_helper_link_get(priv->port);
-                       if (!link_info.s.link_up)
-                               netif_carrier_off(dev);
-                       priv->poll = cvm_oct_rgmii_poll;
-               }
-       }
-
-       return 0;
+       return cvm_oct_common_open(dev, cvm_oct_rgmii_poll, false);
 }
 
 int cvm_oct_rgmii_stop(struct net_device *dev)
index 21a7a17acb79cafaae843ec623b1cbb13769d61b..a6a831510151bbd70ab5988933745ff667547669 100644 (file)
@@ -79,38 +79,7 @@ static void cvm_oct_sgmii_poll(struct net_device *dev)
 
 int cvm_oct_sgmii_open(struct net_device *dev)
 {
-       union cvmx_gmxx_prtx_cfg gmx_cfg;
-       struct octeon_ethernet *priv = netdev_priv(dev);
-       int interface = INTERFACE(priv->port);
-       int index = INDEX(priv->port);
-       cvmx_helper_link_info_t link_info;
-       int rv;
-
-       rv = cvm_oct_phy_setup_device(dev);
-       if (rv)
-               return rv;
-
-       gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
-       gmx_cfg.s.en = 1;
-       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
-
-       if (octeon_is_simulation())
-               return 0;
-
-       if (priv->phydev) {
-               int r = phy_read_status(priv->phydev);
-
-               if (r == 0 && priv->phydev->link == 0)
-                       netif_carrier_off(dev);
-               cvm_oct_adjust_link(dev);
-       } else {
-               link_info = cvmx_helper_link_get(priv->port);
-               if (!link_info.s.link_up)
-                       netif_carrier_off(dev);
-               priv->poll = cvm_oct_sgmii_poll;
-               cvm_oct_sgmii_poll(dev);
-       }
-       return 0;
+       return cvm_oct_common_open(dev, cvm_oct_sgmii_poll, true);
 }
 
 int cvm_oct_sgmii_stop(struct net_device *dev)
index fd9d103d8e56cc1f2fa9cca78dee5cf3ca704715..365b01a4df0dc7c8211137bbfaed6d8f13ff9759 100644 (file)
@@ -79,38 +79,7 @@ static void cvm_oct_xaui_poll(struct net_device *dev)
 
 int cvm_oct_xaui_open(struct net_device *dev)
 {
-       union cvmx_gmxx_prtx_cfg gmx_cfg;
-       struct octeon_ethernet *priv = netdev_priv(dev);
-       int interface = INTERFACE(priv->port);
-       int index = INDEX(priv->port);
-       cvmx_helper_link_info_t link_info;
-       int rv;
-
-       rv = cvm_oct_phy_setup_device(dev);
-       if (rv)
-               return rv;
-
-       gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
-       gmx_cfg.s.en = 1;
-       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
-
-       if (octeon_is_simulation())
-               return 0;
-
-       if (priv->phydev) {
-               int r = phy_read_status(priv->phydev);
-
-               if (r == 0 && priv->phydev->link == 0)
-                       netif_carrier_off(dev);
-               cvm_oct_adjust_link(dev);
-       } else {
-               link_info = cvmx_helper_link_get(priv->port);
-               if (!link_info.s.link_up)
-                       netif_carrier_off(dev);
-               priv->poll = cvm_oct_xaui_poll;
-               cvm_oct_xaui_poll(dev);
-       }
-       return 0;
+       return cvm_oct_common_open(dev, cvm_oct_xaui_poll, true);
 }
 
 int cvm_oct_xaui_stop(struct net_device *dev)
index fbbe866485c7c359eaae0d9631b21e9ac05b594f..3ca8b7a30d32737a73f6fc05110656bcd6dc4f97 100644 (file)
@@ -499,6 +499,45 @@ void cvm_oct_common_uninit(struct net_device *dev)
                phy_disconnect(priv->phydev);
 }
 
+int cvm_oct_common_open(struct net_device *dev,
+                       void (*link_poll)(struct net_device *), bool poll_now)
+{
+       union cvmx_gmxx_prtx_cfg gmx_cfg;
+       struct octeon_ethernet *priv = netdev_priv(dev);
+       int interface = INTERFACE(priv->port);
+       int index = INDEX(priv->port);
+       cvmx_helper_link_info_t link_info;
+       int rv;
+
+       rv = cvm_oct_phy_setup_device(dev);
+       if (rv)
+               return rv;
+
+       gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
+       gmx_cfg.s.en = 1;
+       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
+
+       if (octeon_is_simulation())
+               return 0;
+
+       if (priv->phydev) {
+               int r = phy_read_status(priv->phydev);
+
+               if (r == 0 && priv->phydev->link == 0)
+                       netif_carrier_off(dev);
+               cvm_oct_adjust_link(dev);
+       } else {
+               link_info = cvmx_helper_link_get(priv->port);
+               if (!link_info.s.link_up)
+                       netif_carrier_off(dev);
+               priv->poll = link_poll;
+               if (poll_now)
+                       link_poll(dev);
+       }
+
+       return 0;
+}
+
 static const struct net_device_ops cvm_oct_npi_netdev_ops = {
        .ndo_init               = cvm_oct_common_init,
        .ndo_uninit             = cvm_oct_common_uninit,
index f48dc766fadae3c76c1f6c5e92e985a0d7d06ecd..7818873536d8baae8dbd326305a29d91beb3789e 100644 (file)
@@ -89,6 +89,8 @@ extern int cvm_oct_common_init(struct net_device *dev);
 extern void cvm_oct_common_uninit(struct net_device *dev);
 void cvm_oct_adjust_link(struct net_device *dev);
 int cvm_oct_common_stop(struct net_device *dev);
+int cvm_oct_common_open(struct net_device *dev,
+                       void (*link_poll)(struct net_device *), bool poll_now);
 
 extern int always_use_pow;
 extern int pow_send_group;