Author: jmallett
Date: Tue Nov 30 07:14:05 2010
New Revision: 216071
URL: http://svn.freebsd.org/changeset/base/216071

Log:
  Run all poll requests through a single function that can either do the generic
  link state polling or media-specific ones, while avoidiing changing link state
  on interfaces that use miibus; this substantially speeds up link time on
  interface (re)initialization.

Modified:
  head/sys/mips/cavium/octe/ethernet-common.c
  head/sys/mips/cavium/octe/ethernet-common.h
  head/sys/mips/cavium/octe/ethernet-rgmii.c
  head/sys/mips/cavium/octe/ethernet-sgmii.c
  head/sys/mips/cavium/octe/ethernet-xaui.c
  head/sys/mips/cavium/octe/ethernet.c
  head/sys/mips/cavium/octe/octe.c

Modified: head/sys/mips/cavium/octe/ethernet-common.c
==============================================================================
--- head/sys/mips/cavium/octe/ethernet-common.c Tue Nov 30 05:54:21 2010        
(r216070)
+++ head/sys/mips/cavium/octe/ethernet-common.c Tue Nov 30 07:14:05 2010        
(r216071)
@@ -188,7 +188,10 @@ int cvm_oct_common_open(struct ifnet *if
        gmx_cfg.s.en = 1;
        cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
 
-        if (!octeon_is_simulation()) {
+       /*
+        * Set the link state unless we are using MII.
+        */
+        if (!octeon_is_simulation() && priv->miibus == NULL) {
              link_info = cvmx_helper_link_get(priv->port);
              if (!link_info.s.link_up)  
                if_link_state_change(ifp, LINK_STATE_DOWN);
@@ -224,6 +227,30 @@ void cvm_oct_common_poll(struct ifnet *i
        cvm_oct_private_t *priv = (cvm_oct_private_t *)ifp->if_softc;
        cvmx_helper_link_info_t link_info;
 
+       /*
+        * If this is a simulation, do nothing.
+        */
+       if (octeon_is_simulation())
+               return;
+
+       /*
+        * If there is a device-specific poll method, use it.
+        */
+       if (priv->poll != NULL) {
+               priv->poll(ifp);
+               return;
+       }
+
+       /*
+        * If an MII bus is attached, don't use the Simple Executive's link
+        * state routines.
+        */
+       if (priv->miibus != NULL)
+               return;
+
+       /*
+        * Use the Simple Executive's link state routines.
+        */
        link_info = cvmx_helper_link_get(priv->port);
        if (link_info.u64 == priv->link_info)
                return;

Modified: head/sys/mips/cavium/octe/ethernet-common.h
==============================================================================
--- head/sys/mips/cavium/octe/ethernet-common.h Tue Nov 30 05:54:21 2010        
(r216070)
+++ head/sys/mips/cavium/octe/ethernet-common.h Tue Nov 30 07:14:05 2010        
(r216071)
@@ -48,8 +48,6 @@ void cvm_oct_cleanup_module(void);
 int cvm_oct_rgmii_init(struct ifnet *ifp);
 void cvm_oct_rgmii_uninit(struct ifnet *ifp);
 int cvm_oct_sgmii_init(struct ifnet *ifp);
-void cvm_oct_sgmii_uninit(struct ifnet *ifp);
 int cvm_oct_spi_init(struct ifnet *ifp);
 void cvm_oct_spi_uninit(struct ifnet *ifp);
 int cvm_oct_xaui_init(struct ifnet *ifp);
-void cvm_oct_xaui_uninit(struct ifnet *ifp);

Modified: head/sys/mips/cavium/octe/ethernet-rgmii.c
==============================================================================
--- head/sys/mips/cavium/octe/ethernet-rgmii.c  Tue Nov 30 05:54:21 2010        
(r216070)
+++ head/sys/mips/cavium/octe/ethernet-rgmii.c  Tue Nov 30 07:14:05 2010        
(r216071)
@@ -134,9 +134,11 @@ static void cvm_oct_rgmii_poll(struct if
                cvmx_write_csr(CVMX_GMXX_RXX_INT_REG(index, interface), 
gmxx_rxx_int_reg.u64);
        }
 
-       link_info = cvmx_helper_link_autoconf(priv->port);
-       priv->link_info = link_info.u64;
-       priv->need_link_update = 1;
+       if (priv->miibus == NULL) {
+               link_info = cvmx_helper_link_autoconf(priv->port);
+               priv->link_info = link_info.u64;
+               priv->need_link_update = 1;
+       }
        mtx_unlock_spin(&global_register_lock);
 }
 
@@ -206,42 +208,6 @@ static int cvm_oct_rgmii_rml_interrupt(v
 }
 
 
-static int cvm_oct_rgmii_open(struct ifnet *ifp)
-{
-       cvmx_gmxx_prtx_cfg_t gmx_cfg;
-       cvm_oct_private_t *priv = (cvm_oct_private_t *)ifp->if_softc;
-       int interface = INTERFACE(priv->port);
-       int index = INDEX(priv->port);
-       cvmx_helper_link_info_t link_info;
-
-       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()) {
-             link_info = cvmx_helper_link_get(priv->port);
-             if (!link_info.s.link_up)
-               if_link_state_change(ifp, LINK_STATE_DOWN);
-            else
-               if_link_state_change(ifp, LINK_STATE_UP);
-        }
-
-       return 0;
-}
-
-static int cvm_oct_rgmii_stop(struct ifnet *ifp)
-{
-       cvmx_gmxx_prtx_cfg_t gmx_cfg;
-       cvm_oct_private_t *priv = (cvm_oct_private_t *)ifp->if_softc;
-       int interface = INTERFACE(priv->port);
-       int index = INDEX(priv->port);
-
-       gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
-       gmx_cfg.s.en = 0;
-       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
-       return 0;
-}
-
 int cvm_oct_rgmii_init(struct ifnet *ifp)
 {
        struct octebus_softc *sc;
@@ -250,8 +216,8 @@ int cvm_oct_rgmii_init(struct ifnet *ifp
        int rid;
 
        cvm_oct_common_init(ifp);
-       priv->open = cvm_oct_rgmii_open;
-       priv->stop = cvm_oct_rgmii_stop;
+       priv->open = cvm_oct_common_open;
+       priv->stop = cvm_oct_common_stop;
        priv->stop(ifp);
 
        /* Due to GMX errata in CN3XXX series chips, it is necessary to take the

Modified: head/sys/mips/cavium/octe/ethernet-sgmii.c
==============================================================================
--- head/sys/mips/cavium/octe/ethernet-sgmii.c  Tue Nov 30 05:54:21 2010        
(r216070)
+++ head/sys/mips/cavium/octe/ethernet-sgmii.c  Tue Nov 30 07:14:05 2010        
(r216071)
@@ -53,8 +53,6 @@ int cvm_oct_sgmii_init(struct ifnet *ifp
        priv->open = cvm_oct_common_open;
        priv->stop = cvm_oct_common_stop;
        priv->stop(ifp);
-       if (!octeon_is_simulation())
-               priv->poll = cvm_oct_common_poll;
 
        /* FIXME: Need autoneg logic */
        return 0;

Modified: head/sys/mips/cavium/octe/ethernet-xaui.c
==============================================================================
--- head/sys/mips/cavium/octe/ethernet-xaui.c   Tue Nov 30 05:54:21 2010        
(r216070)
+++ head/sys/mips/cavium/octe/ethernet-xaui.c   Tue Nov 30 07:14:05 2010        
(r216071)
@@ -53,8 +53,6 @@ int cvm_oct_xaui_init(struct ifnet *ifp)
        priv->open = cvm_oct_common_open;
        priv->stop = cvm_oct_common_stop;
        priv->stop(ifp);
-       if (!octeon_is_simulation())
-               priv->poll = cvm_oct_common_poll;
 
-    return 0;
+       return 0;
 }

Modified: head/sys/mips/cavium/octe/ethernet.c
==============================================================================
--- head/sys/mips/cavium/octe/ethernet.c        Tue Nov 30 05:54:21 2010        
(r216070)
+++ head/sys/mips/cavium/octe/ethernet.c        Tue Nov 30 07:14:05 2010        
(r216071)
@@ -136,18 +136,11 @@ static void cvm_do_timer(void *arg)
                        int queues_per_port;
                        int qos;
                        cvm_oct_private_t *priv = (cvm_oct_private_t 
*)cvm_oct_device[port]->if_softc;
-                       if (priv->poll) 
-                       {
-                               /* skip polling if we don't get the lock */
-                               if (MDIO_TRYLOCK()) {
-                                       priv->poll(cvm_oct_device[port]);
-                                       MDIO_UNLOCK();
-
-                                       if (priv->need_link_update) {
-                                               updated++;
-                                               
taskqueue_enqueue(cvm_oct_link_taskq, &priv->link_task);
-                                       }
-                               }
+
+                       cvm_oct_common_poll(priv->ifp);
+                       if (priv->need_link_update) {
+                               updated++;
+                               taskqueue_enqueue(cvm_oct_link_taskq, 
&priv->link_task);
                        }
 
                        queues_per_port = cvmx_pko_get_num_queues(port);

Modified: head/sys/mips/cavium/octe/octe.c
==============================================================================
--- head/sys/mips/cavium/octe/octe.c    Tue Nov 30 05:54:21 2010        
(r216070)
+++ head/sys/mips/cavium/octe/octe.c    Tue Nov 30 07:14:05 2010        
(r216071)
@@ -281,8 +281,8 @@ octe_init(void *arg)
 
        cvm_oct_common_set_mac_address(ifp, IF_LLADDR(ifp));
 
-       if (priv->poll != NULL)
-               priv->poll(ifp);
+       cvm_oct_common_poll(ifp);
+
        if (priv->miibus != NULL)
                mii_mediachg(device_get_softc(priv->miibus));
 
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to