ndo_open for rgmii, sgmii and xaui are almost identical. Put the common
code in a single function.

Signed-off-by: Aaro Koskinen <aaro.koski...@iki.fi>
---
 drivers/staging/octeon/ethernet-rgmii.c  | 32 +-------------------------
 drivers/staging/octeon/ethernet-sgmii.c  | 33 +--------------------------
 drivers/staging/octeon/ethernet-xaui.c   | 33 +--------------------------
 drivers/staging/octeon/ethernet.c        | 39 ++++++++++++++++++++++++++++++++
 drivers/staging/octeon/octeon-ethernet.h |  2 ++
 5 files changed, 44 insertions(+), 95 deletions(-)

diff --git a/drivers/staging/octeon/ethernet-rgmii.c 
b/drivers/staging/octeon/ethernet-rgmii.c
index e36f9bc..88889d3 100644
--- a/drivers/staging/octeon/ethernet-rgmii.c
+++ b/drivers/staging/octeon/ethernet-rgmii.c
@@ -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)
diff --git a/drivers/staging/octeon/ethernet-sgmii.c 
b/drivers/staging/octeon/ethernet-sgmii.c
index 21a7a17..a6a8315 100644
--- a/drivers/staging/octeon/ethernet-sgmii.c
+++ b/drivers/staging/octeon/ethernet-sgmii.c
@@ -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)
diff --git a/drivers/staging/octeon/ethernet-xaui.c 
b/drivers/staging/octeon/ethernet-xaui.c
index fd9d103..365b01a 100644
--- a/drivers/staging/octeon/ethernet-xaui.c
+++ b/drivers/staging/octeon/ethernet-xaui.c
@@ -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)
diff --git a/drivers/staging/octeon/ethernet.c 
b/drivers/staging/octeon/ethernet.c
index f539d82..c80fb59 100644
--- a/drivers/staging/octeon/ethernet.c
+++ b/drivers/staging/octeon/ethernet.c
@@ -489,6 +489,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,
diff --git a/drivers/staging/octeon/octeon-ethernet.h 
b/drivers/staging/octeon/octeon-ethernet.h
index f48dc76..7818873 100644
--- a/drivers/staging/octeon/octeon-ethernet.h
+++ b/drivers/staging/octeon/octeon-ethernet.h
@@ -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;
-- 
2.3.3

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to