diff options
author | glebius <glebius@FreeBSD.org> | 2006-01-18 14:31:21 +0000 |
---|---|---|
committer | glebius <glebius@FreeBSD.org> | 2006-01-18 14:31:21 +0000 |
commit | 21685508caa8917ae676d3c8a18633535b47b033 (patch) | |
tree | 90619569474fbeb33ec65a27be84def1382f82f8 | |
parent | a08da7cd98bf2aff1c327d1becbb7614c27a40b4 (diff) | |
download | FreeBSD-src-21685508caa8917ae676d3c8a18633535b47b033.zip FreeBSD-src-21685508caa8917ae676d3c8a18633535b47b033.tar.gz |
Be ready to a case when not a constant number of segments is returned
by bus_dmamap_load_mbuf_sg() on jumbo buffer allocation.
Reviewed by: scottl, gallatin
-rw-r--r-- | sys/dev/bge/if_bge.c | 34 | ||||
-rw-r--r-- | sys/dev/bge/if_bgereg.h | 2 |
2 files changed, 23 insertions, 13 deletions
diff --git a/sys/dev/bge/if_bge.c b/sys/dev/bge/if_bge.c index d6b5d88..d68c535 100644 --- a/sys/dev/bge/if_bge.c +++ b/sys/dev/bge/if_bge.c @@ -785,26 +785,36 @@ bge_newbuf_jumbo(sc, i, m) m_freem(m_new); return(error); } - KASSERT(nsegs == BGE_NSEG_JUMBO, ("%s: %d segments", __func__, nsegs)); - sc->bge_cdata.bge_rx_jumbo_chain[i] = m_new; /* * Fill in the extended RX buffer descriptor. */ r = &sc->bge_ldata.bge_rx_jumbo_ring[i]; - r->bge_addr0.bge_addr_lo = BGE_ADDR_LO(segs[0].ds_addr); - r->bge_addr0.bge_addr_hi = BGE_ADDR_HI(segs[0].ds_addr); - r->bge_len0 = segs[0].ds_len; - r->bge_addr1.bge_addr_lo = BGE_ADDR_LO(segs[1].ds_addr); - r->bge_addr1.bge_addr_hi = BGE_ADDR_HI(segs[1].ds_addr); - r->bge_len1 = segs[1].ds_len; - r->bge_addr2.bge_addr_lo = BGE_ADDR_LO(segs[2].ds_addr); - r->bge_addr2.bge_addr_hi = BGE_ADDR_HI(segs[2].ds_addr); - r->bge_len2 = segs[2].ds_len; - r->bge_len3 = 0; r->bge_flags = BGE_RXBDFLAG_JUMBO_RING|BGE_RXBDFLAG_END; r->bge_idx = i; + r->bge_len3 = r->bge_len2 = r->bge_len1 = 0; + switch (nsegs) { + case 4: + r->bge_addr3.bge_addr_lo = BGE_ADDR_LO(segs[3].ds_addr); + r->bge_addr3.bge_addr_hi = BGE_ADDR_HI(segs[3].ds_addr); + r->bge_len3 = segs[3].ds_len; + case 3: + r->bge_addr2.bge_addr_lo = BGE_ADDR_LO(segs[2].ds_addr); + r->bge_addr2.bge_addr_hi = BGE_ADDR_HI(segs[2].ds_addr); + r->bge_len2 = segs[2].ds_len; + case 2: + r->bge_addr1.bge_addr_lo = BGE_ADDR_LO(segs[1].ds_addr); + r->bge_addr1.bge_addr_hi = BGE_ADDR_HI(segs[1].ds_addr); + r->bge_len1 = segs[1].ds_len; + case 1: + r->bge_addr0.bge_addr_lo = BGE_ADDR_LO(segs[0].ds_addr); + r->bge_addr0.bge_addr_hi = BGE_ADDR_HI(segs[0].ds_addr); + r->bge_len0 = segs[0].ds_len; + break; + default: + panic("%s: %d segments\n", __func__, nsegs); + } bus_dmamap_sync(sc->bge_cdata.bge_mtag, sc->bge_cdata.bge_rx_jumbo_dmamap[i], diff --git a/sys/dev/bge/if_bgereg.h b/sys/dev/bge/if_bgereg.h index d6d3153..2111458 100644 --- a/sys/dev/bge/if_bgereg.h +++ b/sys/dev/bge/if_bgereg.h @@ -2292,7 +2292,7 @@ struct vpd_key { #define BGE_RESID (BGE_JPAGESZ - (BGE_JLEN * BGE_JSLOTS) % BGE_JPAGESZ) #define BGE_JMEM ((BGE_JLEN * BGE_JSLOTS) + BGE_RESID) -#define BGE_NSEG_JUMBO 3 +#define BGE_NSEG_JUMBO 4 #define BGE_NSEG_NEW 32 /* |