Author: jfv
Date: Fri Feb 11 19:49:07 2011
New Revision: 218583
URL: http://svn.freebsd.org/changeset/base/218583

Log:
  Somehow the RX ring depletion fix got partially removed,
  replace the missing pieces.

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

Modified: head/sys/dev/e1000/if_igb.c
==============================================================================
--- head/sys/dev/e1000/if_igb.c Fri Feb 11 19:03:00 2011        (r218582)
+++ head/sys/dev/e1000/if_igb.c Fri Feb 11 19:49:07 2011        (r218583)
@@ -1,6 +1,6 @@
 /******************************************************************************
 
-  Copyright (c) 2001-2010, Intel Corporation 
+  Copyright (c) 2001-2011, Intel Corporation 
   All rights reserved.
   
   Redistribution and use in source and binary forms, with or without 
@@ -99,7 +99,7 @@ int   igb_display_debug_stats = 0;
 /*********************************************************************
  *  Driver version:
  *********************************************************************/
-char igb_driver_version[] = "version - 2.1.3";
+char igb_driver_version[] = "version - 2.1.4";
 
 
 /*********************************************************************
@@ -1937,6 +1937,10 @@ igb_local_timer(void *arg)
                        goto timeout;
 out:
        callout_reset(&adapter->timer, hz, igb_local_timer, adapter);
+#ifndef DEVICE_POLLING
+       /* Fire off all queue interrupts - deadlock protection */
+       E1000_WRITE_REG(&adapter->hw, E1000_EICS, adapter->que_mask);
+#endif
        return;
 
 timeout:
@@ -3616,6 +3620,7 @@ igb_refresh_mbufs(struct rx_ring *rxr, i
        int                     i, nsegs, error, cleaned;
 
        i = rxr->next_to_refresh;
+       rxr->needs_refresh = FALSE;
        cleaned = -1; /* Signify no completions */
        while (i != limit) {
                rxbuf = &rxr->rx_buffers[i];
@@ -3624,8 +3629,10 @@ igb_refresh_mbufs(struct rx_ring *rxr, i
                        goto no_split;
                if (rxbuf->m_head == NULL) {
                        mh = m_gethdr(M_DONTWAIT, MT_DATA);
-                       if (mh == NULL)
+                       if (mh == NULL) {
+                               rxr->needs_refresh = TRUE;
                                goto update;
+                       }
                } else
                        mh = rxbuf->m_head;
 
@@ -3651,8 +3658,10 @@ no_split:
                if (rxbuf->m_pack == NULL) {
                        mp = m_getjcl(M_DONTWAIT, MT_DATA,
                            M_PKTHDR, adapter->rx_mbuf_sz);
-                       if (mp == NULL)
+                       if (mp == NULL) {
+                               rxr->needs_refresh = TRUE;
                                goto update;
+                       }
                } else
                        mp = rxbuf->m_pack;
 
@@ -4303,6 +4312,10 @@ igb_rxeof(struct igb_queue *que, int cou
        bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map,
            BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
 
+       /* Try outstanding refresh first */
+       if (rxr->needs_refresh == TRUE)
+               igb_refresh_mbufs(rxr, rxr->next_to_check);
+
        /* Main clean loop */
        for (i = rxr->next_to_check; count != 0;) {
                struct mbuf             *sendmp, *mh, *mp;
_______________________________________________
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