Page MenuHomeFreeBSD

D60705.id189746.diff
No OneTemporary

D60705.id189746.diff

diff --git a/sys/dev/mgb/if_mgb.h b/sys/dev/mgb/if_mgb.h
--- a/sys/dev/mgb/if_mgb.h
+++ b/sys/dev/mgb/if_mgb.h
@@ -173,6 +173,7 @@
#define MGB_DESC_CTL_BUFLEN_MASK (0x0000FFFF)
#define MGB_DESC_STS_BUFLEN_MASK (0x00003FFF)
#define MGB_DESC_FRAME_LEN_MASK (0x3FFF0000)
+#define MGB_DESC_FRAME_LEN_SHIFT 16
#define MGB_DESC_GET_FRAME_LEN(_desc) \
(((_desc)->ctl & MGB_DESC_FRAME_LEN_MASK) >> 16)
diff --git a/sys/dev/mgb/if_mgb.c b/sys/dev/mgb/if_mgb.c
--- a/sys/dev/mgb/if_mgb.c
+++ b/sys/dev/mgb/if_mgb.c
@@ -968,6 +968,7 @@
struct mgb_ring_desc *txd;
bus_dma_segment_t *segs;
qidx_t pidx, nsegs;
+ uint32_t ctl;
int i;
KASSERT(ipi->ipi_qsidx == 0,
@@ -981,23 +982,20 @@
/* For each seg, create a descriptor */
for (i = 0; i < nsegs; ++i) {
- KASSERT(nsegs == 1, ("Multisegment packet !!!!!\n"));
txd = &rdata->ring[pidx];
- txd->ctl = htole32(
- (segs[i].ds_len & MGB_DESC_CTL_BUFLEN_MASK ) |
- /*
- * XXX: This will be wrong in the multipacket case
- * I suspect FS should be for the first packet and
- * LS should be for the last packet
- */
- MGB_TX_DESC_CTL_FS | MGB_TX_DESC_CTL_LS |
- MGB_DESC_CTL_FCS);
+ ctl = (segs[i].ds_len & MGB_DESC_CTL_BUFLEN_MASK) |
+ MGB_DESC_CTL_FCS;
+ if (i == 0)
+ ctl |= MGB_TX_DESC_CTL_FS;
+ if (i == (nsegs - 1))
+ ctl |= MGB_TX_DESC_CTL_LS | MGB_DESC_CTL_IOC;
+ txd->ctl = htole32(ctl);
txd->addr.low = htole32(CSR_TRANSLATE_ADDR_LOW32(
segs[i].ds_addr));
txd->addr.high = htole32(CSR_TRANSLATE_ADDR_HIGH32(
segs[i].ds_addr));
- txd->sts = htole32(
- (segs[i].ds_len << 16) & MGB_DESC_FRAME_LEN_MASK);
+ txd->sts = htole32((ipi->ipi_len << MGB_DESC_FRAME_LEN_SHIFT) &
+ MGB_DESC_FRAME_LEN_MASK);
pidx = MGB_NEXT_RING_IDX(pidx);
}
ipi->ipi_new_pidx = pidx;

File Metadata

Mime Type
text/plain
Expires
Wed, Oct 14, 6:17 PM (11 h, 52 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
40807731
Default Alt Text
D60705.id189746.diff (1 KB)

Event Timeline