summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorDavid Gwynne <dlg@cvs.openbsd.org>2014-07-18 07:11:05 +0000
committerDavid Gwynne <dlg@cvs.openbsd.org>2014-07-18 07:11:05 +0000
commit48e19b4ede8c18739b75ff3d89815d2a1e416d50 (patch)
treed3ee64bd7d30c146fe2b9cb11e9420a17af7609a /sys/dev
parent20912370bbeb299194c5ffa99d789be88872a3eb (diff)
implement EFBIG handling for heavily fragmented packets on the tx path.
ok claudio@
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/pci/if_bnx.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/sys/dev/pci/if_bnx.c b/sys/dev/pci/if_bnx.c
index 0ed224d8de8..ce035556ef4 100644
--- a/sys/dev/pci/if_bnx.c
+++ b/sys/dev/pci/if_bnx.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_bnx.c,v 1.106 2014/07/12 18:48:51 tedu Exp $ */
+/* $OpenBSD: if_bnx.c,v 1.107 2014/07/18 07:11:04 dlg Exp $ */
/*-
* Copyright (c) 2006 Broadcom Corporation
@@ -4882,9 +4882,18 @@ bnx_tx_encap(struct bnx_softc *sc, struct mbuf *m)
/* Map the mbuf into our DMA address space. */
error = bus_dmamap_load_mbuf(sc->bnx_dmatag, map, m,
BUS_DMA_NOWAIT);
- if (error != 0) {
- printf("%s: Error mapping mbuf into TX chain!\n",
- sc->bnx_dev.dv_xname);
+ switch (error) {
+ case 0:
+ break;
+
+ case EFBIG:
+ if ((error = m_defrag(m, M_DONTWAIT)) == 0 &&
+ (error = bus_dmamap_load_mbuf(sc->bnx_dmatag, map, m,
+ BUS_DMA_NOWAIT)) == 0)
+ break;
+
+ /* FALLTHROUGH */
+ default:
sc->tx_dma_map_failures++;
goto maperr;
}