Author: jmallett
Date: Wed Oct 13 21:45:56 2010
New Revision: 213807
URL: http://svn.freebsd.org/changeset/base/213807

Log:
  Keep polling at 50hz as long as link state is changing.

Modified:
  head/sys/mips/cavium/octe/ethernet.c

Modified: head/sys/mips/cavium/octe/ethernet.c
==============================================================================
--- head/sys/mips/cavium/octe/ethernet.c        Wed Oct 13 21:37:02 2010        
(r213806)
+++ head/sys/mips/cavium/octe/ethernet.c        Wed Oct 13 21:45:56 2010        
(r213807)
@@ -173,6 +173,7 @@ static void cvm_oct_update_link(void *co
 static void cvm_do_timer(void *arg)
 {
        static int port;
+       static int updated;
        if (port < CVMX_PIP_NUM_INPUT_PORTS) {
                if (cvm_oct_device[port]) {
                        int queues_per_port;
@@ -186,6 +187,7 @@ static void cvm_do_timer(void *arg)
                                        MDIO_UNLOCK();
 
                                        if (priv->need_link_update) {
+                                               updated++;
                                                
taskqueue_enqueue(cvm_oct_link_taskq, &priv->link_task);
                                        }
                                }
@@ -220,9 +222,19 @@ static void cvm_do_timer(void *arg)
                callout_reset(&cvm_oct_poll_timer, hz / 50, cvm_do_timer, NULL);
        } else {
                port = 0;
-               /* All ports have been polled. Start the next iteration through
-                  the ports in one second */
-               callout_reset(&cvm_oct_poll_timer, hz, cvm_do_timer, NULL);
+               /* If any updates were made in this run, continue iterating at
+                * 1/50th of a second, so that if a link has merely gone down
+                * temporarily (e.g. because of interface reinitialization) it
+                * will not be forced to stay down for an entire second.
+                */
+               if (updated > 0) {
+                       updated = 0;
+                       callout_reset(&cvm_oct_poll_timer, hz / 50, 
cvm_do_timer, NULL);
+               } else {
+                       /* All ports have been polled. Start the next iteration 
through
+                          the ports in one second */
+                       callout_reset(&cvm_oct_poll_timer, hz, cvm_do_timer, 
NULL);
+               }
        }
 }
 
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to