Author: jfv
Date: Mon Aug  6 20:44:05 2012
New Revision: 239105
URL: http://svn.freebsd.org/changeset/base/239105

Log:
  Correct the mq_start routine to avoid out-of-order
  packet delivery, always enqueue when possible. Also
  correct the DEPLETED test as multiple bits might be
  set.  Thanks to Randall Stewart for the changes!

Modified:
  head/sys/dev/e1000/if_igb.c

Modified: head/sys/dev/e1000/if_igb.c
==============================================================================
--- head/sys/dev/e1000/if_igb.c Mon Aug  6 20:01:32 2012        (r239104)
+++ head/sys/dev/e1000/if_igb.c Mon Aug  6 20:44:05 2012        (r239105)
@@ -100,7 +100,7 @@ int igb_display_debug_stats = 0;
 /*********************************************************************
  *  Driver version:
  *********************************************************************/
-char igb_driver_version[] = "version - 2.3.4";
+char igb_driver_version[] = "version - 2.3.5";
 
 
 /*********************************************************************
@@ -961,7 +961,15 @@ igb_mq_start(struct ifnet *ifp, struct m
        que = &adapter->queues[i];
        if (((txr->queue_status & IGB_QUEUE_DEPLETED) == 0) &&
            IGB_TX_TRYLOCK(txr)) {
-               err = igb_mq_start_locked(ifp, txr, m);
+               struct mbuf *pm = NULL;
+               /*
+               ** Try to queue first to avoid
+               ** out-of-order delivery, but 
+               ** settle for it if that fails
+               */
+               if (m && drbr_enqueue(ifp, txr->br, m))
+                       pm = m;
+               err = igb_mq_start_locked(ifp, txr, pm);
                IGB_TX_UNLOCK(txr);
        } else {
                err = drbr_enqueue(ifp, txr->br, m);
@@ -981,7 +989,7 @@ igb_mq_start_locked(struct ifnet *ifp, s
        IGB_TX_LOCK_ASSERT(txr);
 
        if (((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) ||
-           (txr->queue_status == IGB_QUEUE_DEPLETED) ||
+           (txr->queue_status & IGB_QUEUE_DEPLETED) ||
            adapter->link_active == 0) {
                if (m != NULL)
                        err = drbr_enqueue(ifp, txr->br, m);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to