svn commit: r218583 - head/sys/dev/e1000
Jack F Vogel
jfv at FreeBSD.org
Fri Feb 11 19:49:07 UTC 2011
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;
More information about the svn-src-head
mailing list