Changeset View
Changeset View
Standalone View
Standalone View
sys/net/iflib.c
Show First 20 Lines • Show All 2,874 Lines • ▼ Show 20 Lines | |||||
static int | static int | ||||
iflib_busdma_load_mbuf_sg(iflib_txq_t txq, bus_dma_tag_t tag, bus_dmamap_t map, | iflib_busdma_load_mbuf_sg(iflib_txq_t txq, bus_dma_tag_t tag, bus_dmamap_t map, | ||||
struct mbuf **m0, bus_dma_segment_t *segs, int *nsegs, | struct mbuf **m0, bus_dma_segment_t *segs, int *nsegs, | ||||
int max_segs, int flags) | int max_segs, int flags) | ||||
{ | { | ||||
if_ctx_t ctx; | if_ctx_t ctx; | ||||
if_shared_ctx_t sctx; | if_shared_ctx_t sctx; | ||||
if_softc_ctx_t scctx; | if_softc_ctx_t scctx; | ||||
int i, next, pidx, err, maxsegsz, ntxd, count; | int i, next, pidx, err, ntxd, count; | ||||
struct mbuf *m, *tmp, **ifsd_m; | struct mbuf *m, *tmp, **ifsd_m; | ||||
m = *m0; | m = *m0; | ||||
/* | /* | ||||
* Please don't ever do this | * Please don't ever do this | ||||
*/ | */ | ||||
if (__predict_false(m->m_len == 0)) | if (__predict_false(m->m_len == 0)) | ||||
Show All 26 Lines | do { | ||||
next = (pidx + count) & (ntxd-1); | next = (pidx + count) & (ntxd-1); | ||||
MPASS(ifsd_m[next] == NULL); | MPASS(ifsd_m[next] == NULL); | ||||
ifsd_m[next] = m; | ifsd_m[next] = m; | ||||
count++; | count++; | ||||
tmp = m; | tmp = m; | ||||
m = m->m_next; | m = m->m_next; | ||||
} while (m != NULL); | } while (m != NULL); | ||||
} else { | } else { | ||||
int buflen, sgsize, max_sgsize; | int buflen, sgsize, maxsegsz, max_sgsize; | ||||
vm_offset_t vaddr; | vm_offset_t vaddr; | ||||
vm_paddr_t curaddr; | vm_paddr_t curaddr; | ||||
count = i = 0; | count = i = 0; | ||||
maxsegsz = sctx->isc_tx_maxsize; | |||||
m = *m0; | m = *m0; | ||||
if (m->m_pkthdr.csum_flags & CSUM_TSO) | |||||
maxsegsz = ssctx->isc_tx_tso_segsize_max; | |||||
else | |||||
maxsegsz = sctx->isc_tx_maxsegsize; | |||||
do { | do { | ||||
if (__predict_false(m->m_len <= 0)) { | if (__predict_false(m->m_len <= 0)) { | ||||
tmp = m; | tmp = m; | ||||
m = m->m_next; | m = m->m_next; | ||||
tmp->m_next = NULL; | tmp->m_next = NULL; | ||||
m_free(tmp); | m_free(tmp); | ||||
continue; | continue; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 2,686 Lines • Show Last 20 Lines |