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) {

Reply via email to