svn commit: r206403 - head/sys/dev/e1000
Jack F Vogel
jfv at FreeBSD.org
Thu Apr 8 19:13:42 UTC 2010
Author: jfv
Date: Thu Apr 8 19:13:42 2010
New Revision: 206403
URL: http://svn.freebsd.org/changeset/base/206403
Log:
Three changes:
- add CRC stripping to the RX side, this was handled
by some obscure code in rxeof previously, its easier
to simply have the hardware strip it now.
- Add back an ALTQ change that slipped between the cracks
- Add an update to the watchdog_time in the xmit code, not
doing this in ixgbe caused problems, think its needed here
as well.
Modified:
head/sys/dev/e1000/if_em.c
Modified: head/sys/dev/e1000/if_em.c
==============================================================================
--- head/sys/dev/e1000/if_em.c Thu Apr 8 18:38:50 2010 (r206402)
+++ head/sys/dev/e1000/if_em.c Thu Apr 8 19:13:42 2010 (r206403)
@@ -93,7 +93,7 @@ int em_display_debug_stats = 0;
/*********************************************************************
* Driver version:
*********************************************************************/
-char em_driver_version[] = "7.0.1";
+char em_driver_version[] = "7.0.2";
/*********************************************************************
@@ -813,9 +813,13 @@ em_mq_start_locked(struct ifnet *ifp, st
}
enq = 0;
- if (m == NULL)
+ if (m == NULL) {
next = drbr_dequeue(ifp, txr->br);
- else
+ } else if (drbr_needs_enqueue(ifp, txr->br)) {
+ if ((err = drbr_enqueue(ifp, txr->br, m)) != 0)
+ return (err);
+ next = drbr_dequeue(ifp, txr->br);
+ } else
next = m;
/* Process the queue */
@@ -1720,13 +1724,6 @@ em_xmit(struct tx_ring *txr, struct mbuf
txd_upper = txd_lower = txd_used = txd_saved = 0;
do_tso = ((m_head->m_pkthdr.csum_flags & CSUM_TSO) != 0);
- /*
- * Force a cleanup if number of TX descriptors
- * available hits the threshold
- */
- if (txr->tx_avail <= EM_TX_CLEANUP_THRESHOLD)
- em_txeof(txr);
-
/*
* TSO workaround:
* If an mbuf is only header we need
@@ -1915,6 +1912,11 @@ em_xmit(struct tx_ring *txr, struct mbuf
bus_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map,
BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
E1000_WRITE_REG(&adapter->hw, E1000_TDT(txr->me), i);
+ txr->watchdog_time = ticks;
+
+ /* Call cleanup if number of TX descriptors low */
+ if (txr->tx_avail <= EM_TX_CLEANUP_THRESHOLD)
+ em_txeof(txr);
return (0);
}
@@ -3706,6 +3708,8 @@ em_refresh_mbufs(struct rx_ring *rxr, in
rxr->next_to_refresh = i;
}
update:
+ bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map,
+ BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
if (cleaned != -1) /* Update tail index */
E1000_WRITE_REG(&adapter->hw,
E1000_RDT(rxr->me), cleaned);
@@ -4040,6 +4044,9 @@ em_initialize_receive_unit(struct adapte
E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF |
(hw->mac.mc_filter_type << E1000_RCTL_MO_SHIFT);
+ /* Strip the CRC */
+ rctl |= E1000_RCTL_SECRC;
+
/* Make sure VLAN Filters are off */
rctl &= ~E1000_RCTL_VFE;
rctl &= ~E1000_RCTL_SBP;
More information about the svn-src-head
mailing list