Some of you may have seen the iwn(4) diff before, but I tweaked it a
bit to minimize the diff. Tested iwn(4) and wpi(4) myself. Further
tests and/or ok's are welcome.
Index: if_ipw.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_ipw.c,v
retrieving revision 1.107
diff -u -p -r1.107 if_ipw.c
--- if_ipw.c 10 Feb 2015 23:25:46 -0000 1.107
+++ if_ipw.c 26 May 2015 20:52:22 -0000
@@ -1143,7 +1143,6 @@ ipw_tx_start(struct ifnet *ifp, struct m
struct ieee80211com *ic = &sc->sc_ic;
struct ieee80211_frame *wh;
struct ieee80211_key *k;
- struct mbuf *m1;
struct ipw_soft_bd *sbd;
struct ipw_soft_hdr *shdr;
struct ipw_soft_buf *sbuf;
@@ -1208,24 +1207,10 @@ ipw_tx_start(struct ifnet *ifp, struct m
}
if (error != 0) {
/* too many fragments, linearize */
- MGETHDR(m1, M_DONTWAIT, MT_DATA);
- if (m1 == NULL) {
+ if (m_defrag(m, M_DONTWAIT)) {
m_freem(m);
return ENOBUFS;
}
- if (m->m_pkthdr.len > MHLEN) {
- MCLGET(m1, M_DONTWAIT);
- if (!(m1->m_flags & M_EXT)) {
- m_freem(m);
- m_freem(m1);
- return ENOBUFS;
- }
- }
- m_copydata(m, 0, m->m_pkthdr.len, mtod(m1, caddr_t));
- m1->m_pkthdr.len = m1->m_len = m->m_pkthdr.len;
- m_freem(m);
- m = m1;
-
error = bus_dmamap_load_mbuf(sc->sc_dmat, sbuf->map, m,
BUS_DMA_NOWAIT);
if (error != 0) {
Index: if_iwi.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_iwi.c,v
retrieving revision 1.124
diff -u -p -r1.124 if_iwi.c
--- if_iwi.c 14 Mar 2015 03:38:48 -0000 1.124
+++ if_iwi.c 26 May 2015 20:52:22 -0000
@@ -1250,7 +1250,6 @@ iwi_tx_start(struct ifnet *ifp, struct m
struct ieee80211com *ic = &sc->sc_ic;
struct ieee80211_frame *wh;
struct ieee80211_key *k;
- struct mbuf *m1;
struct iwi_tx_data *data;
struct iwi_tx_desc *desc;
struct iwi_tx_ring *txq = &sc->txq[0];
@@ -1317,24 +1316,10 @@ iwi_tx_start(struct ifnet *ifp, struct m
}
if (error != 0) {
/* too many fragments, linearize */
- MGETHDR(m1, M_DONTWAIT, MT_DATA);
- if (m1 == NULL) {
+ if (m_defrag(m0, M_DONTWAIT)) {
m_freem(m0);
return ENOBUFS;
}
- if (m0->m_pkthdr.len > MHLEN) {
- MCLGET(m1, M_DONTWAIT);
- if (!(m1->m_flags & M_EXT)) {
- m_freem(m0);
- m_freem(m1);
- return ENOBUFS;
- }
- }
- m_copydata(m0, 0, m0->m_pkthdr.len, mtod(m1, caddr_t));
- m1->m_pkthdr.len = m1->m_len = m0->m_pkthdr.len;
- m_freem(m0);
- m0 = m1;
-
error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m0,
BUS_DMA_NOWAIT);
if (error != 0) {
Index: if_iwn.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_iwn.c,v
retrieving revision 1.142
diff -u -p -r1.142 if_iwn.c
--- if_iwn.c 8 Apr 2015 09:29:49 -0000 1.142
+++ if_iwn.c 26 May 2015 20:52:22 -0000
@@ -2750,7 +2750,6 @@ iwn_tx(struct iwn_softc *sc, struct mbuf
const struct iwn_rate *rinfo;
struct ieee80211_frame *wh;
struct ieee80211_key *k = NULL;
- struct mbuf *m1;
enum ieee80211_edca_ac ac;
uint32_t flags;
uint16_t qos;
@@ -2962,32 +2961,18 @@ iwn_tx(struct iwn_softc *sc, struct mbuf
error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m,
BUS_DMA_NOWAIT | BUS_DMA_WRITE);
+ if (error != 0 && error != EFBIG) {
+ printf("%s: can't map mbuf (error %d)\n",
+ sc->sc_dev.dv_xname, error);
+ m_freem(m);
+ return error;
+ }
if (error != 0) {
- if (error != EFBIG) {
- printf("%s: can't map mbuf (error %d)\n",
- sc->sc_dev.dv_xname, error);
- m_freem(m);
- return error;
- }
/* Too many DMA segments, linearize mbuf. */
- MGETHDR(m1, M_DONTWAIT, MT_DATA);
- if (m1 == NULL) {
+ if (m_defrag(m, M_DONTWAIT)) {
m_freem(m);
return ENOBUFS;
}
- if (m->m_pkthdr.len > MHLEN) {
- MCLGET(m1, M_DONTWAIT);
- if (!(m1->m_flags & M_EXT)) {
- m_freem(m);
- m_freem(m1);
- return ENOBUFS;
- }
- }
- m_copydata(m, 0, m->m_pkthdr.len, mtod(m1, caddr_t));
- m1->m_pkthdr.len = m1->m_len = m->m_pkthdr.len;
- m_freem(m);
- m = m1;
-
error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m,
BUS_DMA_NOWAIT | BUS_DMA_WRITE);
if (error != 0) {
Index: if_wpi.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_wpi.c,v
retrieving revision 1.126
diff -u -p -r1.126 if_wpi.c
--- if_wpi.c 16 Mar 2015 04:09:53 -0000 1.126
+++ if_wpi.c 26 May 2015 20:52:22 -0000
@@ -1655,7 +1655,6 @@ wpi_tx(struct wpi_softc *sc, struct mbuf
const struct wpi_rate *rinfo;
struct ieee80211_frame *wh;
struct ieee80211_key *k = NULL;
- struct mbuf *m1;
enum ieee80211_edca_ac ac;
uint32_t flags;
uint16_t qos;
@@ -1833,24 +1832,10 @@ wpi_tx(struct wpi_softc *sc, struct mbuf
}
if (error != 0) {
/* Too many DMA segments, linearize mbuf. */
- MGETHDR(m1, M_DONTWAIT, MT_DATA);
- if (m1 == NULL) {
+ if (m_defrag(m, M_DONTWAIT)) {
m_freem(m);
return ENOBUFS;
}
- if (m->m_pkthdr.len > MHLEN) {
- MCLGET(m1, M_DONTWAIT);
- if (!(m1->m_flags & M_EXT)) {
- m_freem(m);
- m_freem(m1);
- return ENOBUFS;
- }
- }
- m_copydata(m, 0, m->m_pkthdr.len, mtod(m1, caddr_t));
- m1->m_pkthdr.len = m1->m_len = m->m_pkthdr.len;
- m_freem(m);
- m = m1;
-
error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m,
BUS_DMA_NOWAIT | BUS_DMA_WRITE);
if (error != 0) {