diff --git a/sys/dev/cxgb/cxgb_sge.c b/sys/dev/cxgb/cxgb_sge.c --- a/sys/dev/cxgb/cxgb_sge.c +++ b/sys/dev/cxgb/cxgb_sge.c @@ -322,7 +322,8 @@ int *nbytes = &ci->nbytes; if ((*nbytes == 0) || ((*nbytes + m->m_len <= 10500) && - (*count < 7) && (m->m_next == NULL))) { + (*count < 7) && (m->m_next == NULL) && + ((mtod(m, vm_offset_t) & PAGE_MASK) + m->m_len <= PAGE_SIZE))) { *count += 1; *nbytes += m->m_len; return (1); diff --git a/sys/dev/cxgb/sys/mvec.h b/sys/dev/cxgb/sys/mvec.h --- a/sys/dev/cxgb/sys/mvec.h +++ b/sys/dev/cxgb/sys/mvec.h @@ -33,20 +33,6 @@ #define _MVEC_H_ #include -static __inline void -busdma_map_mbuf_fast(bus_dma_tag_t tag, bus_dmamap_t map, - struct mbuf *m, bus_dma_segment_t *seg) -{ -#if defined(__i386__) || defined(__amd64__) - seg->ds_addr = pmap_kextract(mtod(m, vm_offset_t)); - seg->ds_len = m->m_len; -#else - int nsegstmp; - - bus_dmamap_load_mbuf_sg(tag, map, m, seg, &nsegstmp, 0); -#endif -} - int busdma_map_sg_collapse(bus_dma_tag_t tag, bus_dmamap_t map, struct mbuf **m, bus_dma_segment_t *segs, int *nsegs); void busdma_map_sg_vec(bus_dma_tag_t tag, bus_dmamap_t map, diff --git a/sys/dev/cxgb/sys/uipc_mvec.c b/sys/dev/cxgb/sys/uipc_mvec.c --- a/sys/dev/cxgb/sys/uipc_mvec.c +++ b/sys/dev/cxgb/sys/uipc_mvec.c @@ -65,26 +65,7 @@ retry: psegs = segs; seg_count = 0; - if (n->m_next == NULL) { - busdma_map_mbuf_fast(tag, map, n, segs); - *nsegs = 1; - return (0); - } -#if defined(__i386__) || defined(__amd64__) - while (n && seg_count < TX_MAX_SEGS) { - /* - * firmware doesn't like empty segments - */ - if (__predict_true(n->m_len != 0)) { - seg_count++; - busdma_map_mbuf_fast(tag, map, n, psegs); - psegs++; - } - n = n->m_next; - } -#else err = bus_dmamap_load_mbuf_sg(tag, map, *m, segs, &seg_count, 0); -#endif if (seg_count == 0) { if (cxgb_debug) printf("empty segment chain\n"); @@ -117,8 +98,9 @@ busdma_map_sg_vec(bus_dma_tag_t tag, bus_dmamap_t map, struct mbuf *m, bus_dma_segment_t *segs, int *nsegs) { + int n = 0; - for (*nsegs = 0; m != NULL ; segs++, *nsegs += 1, m = m->m_nextpkt) - busdma_map_mbuf_fast(tag, map, m, segs); + for (*nsegs = 0; m != NULL; segs += n, *nsegs += n, m = m->m_nextpkt) + bus_dmamap_load_mbuf_sg(tag, map, m, segs, &n, 0); }