summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorglebius <glebius@FreeBSD.org>2006-01-18 14:31:21 +0000
committerglebius <glebius@FreeBSD.org>2006-01-18 14:31:21 +0000
commit21685508caa8917ae676d3c8a18633535b47b033 (patch)
tree90619569474fbeb33ec65a27be84def1382f82f8
parenta08da7cd98bf2aff1c327d1becbb7614c27a40b4 (diff)
downloadFreeBSD-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.c34
-rw-r--r--sys/dev/bge/if_bgereg.h2
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
/*
OpenPOWER on IntegriCloud