summaryrefslogtreecommitdiffstats
path: root/sys/dev
diff options
context:
space:
mode:
authordavidch <davidch@FreeBSD.org>2006-06-08 18:31:21 +0000
committerdavidch <davidch@FreeBSD.org>2006-06-08 18:31:21 +0000
commit003705e1878f14a6170f3ce7311ee8055bb53df5 (patch)
tree8acc13bbe4c61dafeb0cbe810c051653dfe8a4c1 /sys/dev
parentb8f1ff9a05a41d766e8d2514638d0f9cecd53602 (diff)
downloadFreeBSD-src-003705e1878f14a6170f3ce7311ee8055bb53df5.zip
FreeBSD-src-003705e1878f14a6170f3ce7311ee8055bb53df5.tar.gz
Log:
- Removed updates to if_ibytes, if_obytes, if_imcasts, and if_omcasts. These should not be handled by the driver. - Add code to handle excessively fragmented mbufs when mapping TX frames. Reviewed by: ps Approved by: ps (mentor) MFC after: 1 week
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/bce/if_bce.c40
1 files changed, 27 insertions, 13 deletions
diff --git a/sys/dev/bce/if_bce.c b/sys/dev/bce/if_bce.c
index 0af02d1..45b6c14 100644
--- a/sys/dev/bce/if_bce.c
+++ b/sys/dev/bce/if_bce.c
@@ -53,7 +53,7 @@ __FBSDID("$FreeBSD$");
/****************************************************************************/
/* BCE Driver Version */
/****************************************************************************/
-char bce_driver_version[] = "v0.9.5";
+char bce_driver_version[] = "v0.9.6";
/****************************************************************************/
@@ -4640,10 +4640,32 @@ bce_tx_encap(struct bce_softc *sc, struct mbuf *m_head, u16 *prod,
bce_dma_map_tx_desc, &map_arg, BUS_DMA_NOWAIT);
if (error || map_arg.maxsegs == 0) {
- BCE_PRINTF(sc, "%s(%d): Error mapping mbuf into TX chain!\n",
- __FILE__, __LINE__);
- rc = ENOBUFS;
- goto bce_tx_encap_exit;
+
+ /* Try to defrag the mbuf if there are too many segments. */
+ if (error == EFBIG && map_arg.maxsegs != 0) {
+ struct mbuf *m0;
+
+ DBPRINT(sc, BCE_WARN, "%s(): fragmented mbuf (%d pieces)\n",
+ __FUNCTION__, map_arg.maxsegs);
+
+ m0 = m_defrag(m_head, M_DONTWAIT);
+ if (m0 != NULL) {
+ m_head = m0;
+ error = bus_dmamap_load_mbuf(sc->tx_mbuf_tag,
+ map, m_head, bce_dma_map_tx_desc, &map_arg,
+ BUS_DMA_NOWAIT);
+ }
+ }
+
+ /* Still getting an error after a defrag. */
+ if (error) {
+ BCE_PRINTF(sc,
+ "%s(%d): Error mapping mbuf into TX chain!\n",
+ __FILE__, __LINE__);
+ rc = ENOBUFS;
+ goto bce_tx_encap_exit;
+ }
+
}
/*
@@ -5308,14 +5330,6 @@ bce_stats_update(struct bce_softc *sc)
*/
ifp->if_collisions = (u_long) stats->stat_EtherStatsCollisions;
- ifp->if_ibytes = BCE_STATS(IfHCInOctets);
-
- ifp->if_obytes = BCE_STATS(IfHCOutOctets);
-
- ifp->if_imcasts = BCE_STATS(IfHCInMulticastPkts);
-
- ifp->if_omcasts = BCE_STATS(IfHCOutMulticastPkts);
-
ifp->if_ierrors = (u_long) stats->stat_EtherStatsUndersizePkts +
(u_long) stats->stat_EtherStatsOverrsizePkts +
(u_long) stats->stat_IfInMBUFDiscards +
OpenPOWER on IntegriCloud