aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNavdeep Parhar <np@FreeBSD.org>2024-01-05 01:39:31 +0000
committerNavdeep Parhar <np@FreeBSD.org>2024-01-11 05:22:31 +0000
commitc4bac077581ee38a3c64cd3a76cb9dd974dd749b (patch)
tree48b093c05dc8f8e3422daf363dda6ee6b504c69e
parentc2628605787d3436d61503babb6aeb5f53751ea2 (diff)
downloadsrc-c4bac077581ee38a3c64cd3a76cb9dd974dd749b.tar.gz
src-c4bac077581ee38a3c64cd3a76cb9dd974dd749b.zip
cxgbe(4): Add support for netmap offsets.
PR: 253069 Sponsored by: Chelsio Communications (cherry picked from commit df8a58b17a1907ed3b4597475d1cb8eacc9636de)
-rw-r--r--sys/dev/cxgbe/t4_netmap.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/sys/dev/cxgbe/t4_netmap.c b/sys/dev/cxgbe/t4_netmap.c
index 64fba4410364..0377f65acc3e 100644
--- a/sys/dev/cxgbe/t4_netmap.c
+++ b/sys/dev/cxgbe/t4_netmap.c
@@ -1003,7 +1003,7 @@ cxgbe_nm_tx(struct adapter *sc, struct sge_nm_txq *nm_txq,
usgl->cmd_nsge = htobe32(V_ULPTX_CMD(ULP_TX_SC_DSGL) |
V_ULPTX_NSGE(1));
usgl->len0 = htobe32(slot->len);
- usgl->addr0 = htobe64(ba);
+ usgl->addr0 = htobe64(ba + nm_get_offset(kring, slot));
slot->flags &= ~(NS_REPORT | NS_BUF_CHANGED);
cpl = (void *)(usgl + 1);
@@ -1269,7 +1269,7 @@ cxgbe_nm_attach(struct vi_info *vi)
bzero(&na, sizeof(na));
na.ifp = vi->ifp;
- na.na_flags = NAF_BDG_MAYSLEEP;
+ na.na_flags = NAF_BDG_MAYSLEEP | NAF_OFFSETS;
/* Netmap doesn't know about the space reserved for the status page. */
na.num_tx_desc = vi->qsize_txq - sc->params.sge.spg_len / EQ_ESIZE;
@@ -1286,7 +1286,7 @@ cxgbe_nm_attach(struct vi_info *vi)
na.nm_register = cxgbe_netmap_reg;
na.num_tx_rings = vi->nnmtxq;
na.num_rx_rings = vi->nnmrxq;
- na.rx_buf_maxsize = MAX_MTU;
+ na.rx_buf_maxsize = MAX_MTU + sc->params.sge.fl_pktshift;
netmap_attach(&na); /* This adds IFCAP_NETMAP to if_capabilities */
}
@@ -1368,6 +1368,14 @@ service_nm_rxq(struct sge_nm_rxq *nm_rxq)
handle_nm_sge_egr_update(sc, ifp, cpl);
break;
case CPL_RX_PKT:
+ /*
+ * Note that the application must have netmap
+ * offsets (NETMAP_REQ_OPT_OFFSETS) enabled on
+ * the ring or its rx will not work correctly
+ * when fl_pktshift > 0.
+ */
+ nm_write_offset(kring, &ring->slot[fl_cidx],
+ sc->params.sge.fl_pktshift);
ring->slot[fl_cidx].len = G_RSPD_LEN(lq) -
sc->params.sge.fl_pktshift;
ring->slot[fl_cidx].flags = 0;