Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/cxgbe/t4_netmap.c
Show First 20 Lines • Show All 119 Lines • ▼ Show 20 Lines | |||||
SYSCTL_INT(_hw_cxgbe, OID_AUTO, nm_txcsum, CTLFLAG_RWTUN, | SYSCTL_INT(_hw_cxgbe, OID_AUTO, nm_txcsum, CTLFLAG_RWTUN, | ||||
&nm_txcsum, 0, "Enable transmit checksum offloading."); | &nm_txcsum, 0, "Enable transmit checksum offloading."); | ||||
static int | static int | ||||
alloc_nm_rxq_hwq(struct vi_info *vi, struct sge_nm_rxq *nm_rxq, int cong) | alloc_nm_rxq_hwq(struct vi_info *vi, struct sge_nm_rxq *nm_rxq, int cong) | ||||
{ | { | ||||
int rc, cntxt_id, i; | int rc, cntxt_id, i; | ||||
__be32 v; | __be32 v; | ||||
struct adapter *sc = vi->pi->adapter; | struct adapter *sc = vi->adapter; | ||||
struct sge_params *sp = &sc->params.sge; | struct sge_params *sp = &sc->params.sge; | ||||
struct netmap_adapter *na = NA(vi->ifp); | struct netmap_adapter *na = NA(vi->ifp); | ||||
struct fw_iq_cmd c; | struct fw_iq_cmd c; | ||||
MPASS(na != NULL); | MPASS(na != NULL); | ||||
MPASS(nm_rxq->iq_desc != NULL); | MPASS(nm_rxq->iq_desc != NULL); | ||||
MPASS(nm_rxq->fl_desc != NULL); | MPASS(nm_rxq->fl_desc != NULL); | ||||
▲ Show 20 Lines • Show All 103 Lines • ▼ Show 20 Lines | t4_write_reg(sc, sc->sge_gts_reg, | ||||
V_SEINTARM(V_QINTR_TIMER_IDX(holdoff_tmr_idx))); | V_SEINTARM(V_QINTR_TIMER_IDX(holdoff_tmr_idx))); | ||||
return (rc); | return (rc); | ||||
} | } | ||||
static int | static int | ||||
free_nm_rxq_hwq(struct vi_info *vi, struct sge_nm_rxq *nm_rxq) | free_nm_rxq_hwq(struct vi_info *vi, struct sge_nm_rxq *nm_rxq) | ||||
{ | { | ||||
struct adapter *sc = vi->pi->adapter; | struct adapter *sc = vi->adapter; | ||||
int rc; | int rc; | ||||
rc = -t4_iq_free(sc, sc->mbox, sc->pf, 0, FW_IQ_TYPE_FL_INT_CAP, | rc = -t4_iq_free(sc, sc->mbox, sc->pf, 0, FW_IQ_TYPE_FL_INT_CAP, | ||||
nm_rxq->iq_cntxt_id, nm_rxq->fl_cntxt_id, 0xffff); | nm_rxq->iq_cntxt_id, nm_rxq->fl_cntxt_id, 0xffff); | ||||
if (rc != 0) | if (rc != 0) | ||||
device_printf(sc->dev, "%s: failed for iq %d, fl %d: %d\n", | device_printf(sc->dev, "%s: failed for iq %d, fl %d: %d\n", | ||||
__func__, nm_rxq->iq_cntxt_id, nm_rxq->fl_cntxt_id, rc); | __func__, nm_rxq->iq_cntxt_id, nm_rxq->fl_cntxt_id, rc); | ||||
nm_rxq->iq_cntxt_id = INVALID_NM_RXQ_CNTXT_ID; | nm_rxq->iq_cntxt_id = INVALID_NM_RXQ_CNTXT_ID; | ||||
return (rc); | return (rc); | ||||
} | } | ||||
static int | static int | ||||
alloc_nm_txq_hwq(struct vi_info *vi, struct sge_nm_txq *nm_txq) | alloc_nm_txq_hwq(struct vi_info *vi, struct sge_nm_txq *nm_txq) | ||||
{ | { | ||||
int rc, cntxt_id; | int rc, cntxt_id; | ||||
size_t len; | size_t len; | ||||
struct adapter *sc = vi->pi->adapter; | struct adapter *sc = vi->adapter; | ||||
struct netmap_adapter *na = NA(vi->ifp); | struct netmap_adapter *na = NA(vi->ifp); | ||||
struct fw_eq_eth_cmd c; | struct fw_eq_eth_cmd c; | ||||
MPASS(na != NULL); | MPASS(na != NULL); | ||||
MPASS(nm_txq->desc != NULL); | MPASS(nm_txq->desc != NULL); | ||||
len = na->num_tx_desc * EQ_ESIZE + sc->params.sge.spg_len; | len = na->num_tx_desc * EQ_ESIZE + sc->params.sge.spg_len; | ||||
bzero(nm_txq->desc, len); | bzero(nm_txq->desc, len); | ||||
▲ Show 20 Lines • Show All 56 Lines • ▼ Show 20 Lines | alloc_nm_txq_hwq(struct vi_info *vi, struct sge_nm_txq *nm_txq) | ||||
} | } | ||||
return (rc); | return (rc); | ||||
} | } | ||||
static int | static int | ||||
free_nm_txq_hwq(struct vi_info *vi, struct sge_nm_txq *nm_txq) | free_nm_txq_hwq(struct vi_info *vi, struct sge_nm_txq *nm_txq) | ||||
{ | { | ||||
struct adapter *sc = vi->pi->adapter; | struct adapter *sc = vi->adapter; | ||||
int rc; | int rc; | ||||
rc = -t4_eth_eq_free(sc, sc->mbox, sc->pf, 0, nm_txq->cntxt_id); | rc = -t4_eth_eq_free(sc, sc->mbox, sc->pf, 0, nm_txq->cntxt_id); | ||||
if (rc != 0) | if (rc != 0) | ||||
device_printf(sc->dev, "%s: failed for eq %d: %d\n", __func__, | device_printf(sc->dev, "%s: failed for eq %d: %d\n", __func__, | ||||
nm_txq->cntxt_id, rc); | nm_txq->cntxt_id, rc); | ||||
nm_txq->cntxt_id = INVALID_NM_TXQ_CNTXT_ID; | nm_txq->cntxt_id = INVALID_NM_TXQ_CNTXT_ID; | ||||
return (rc); | return (rc); | ||||
▲ Show 20 Lines • Show All 210 Lines • ▼ Show 20 Lines | cxgbe_netmap_off(struct adapter *sc, struct vi_info *vi, struct ifnet *ifp, | ||||
return (rc); | return (rc); | ||||
} | } | ||||
static int | static int | ||||
cxgbe_netmap_reg(struct netmap_adapter *na, int on) | cxgbe_netmap_reg(struct netmap_adapter *na, int on) | ||||
{ | { | ||||
struct ifnet *ifp = na->ifp; | struct ifnet *ifp = na->ifp; | ||||
struct vi_info *vi = ifp->if_softc; | struct vi_info *vi = ifp->if_softc; | ||||
struct adapter *sc = vi->pi->adapter; | struct adapter *sc = vi->adapter; | ||||
int rc; | int rc; | ||||
rc = begin_synchronized_op(sc, vi, SLEEP_OK | INTR_OK, "t4nmreg"); | rc = begin_synchronized_op(sc, vi, SLEEP_OK | INTR_OK, "t4nmreg"); | ||||
if (rc != 0) | if (rc != 0) | ||||
return (rc); | return (rc); | ||||
if (on) | if (on) | ||||
rc = cxgbe_netmap_on(sc, vi, ifp, na); | rc = cxgbe_netmap_on(sc, vi, ifp, na); | ||||
else | else | ||||
▲ Show 20 Lines • Show All 238 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
static int | static int | ||||
cxgbe_netmap_txsync(struct netmap_kring *kring, int flags) | cxgbe_netmap_txsync(struct netmap_kring *kring, int flags) | ||||
{ | { | ||||
struct netmap_adapter *na = kring->na; | struct netmap_adapter *na = kring->na; | ||||
struct ifnet *ifp = na->ifp; | struct ifnet *ifp = na->ifp; | ||||
struct vi_info *vi = ifp->if_softc; | struct vi_info *vi = ifp->if_softc; | ||||
struct adapter *sc = vi->pi->adapter; | struct adapter *sc = vi->adapter; | ||||
struct sge_nm_txq *nm_txq = &sc->sge.nm_txq[vi->first_nm_txq + kring->ring_id]; | struct sge_nm_txq *nm_txq = &sc->sge.nm_txq[vi->first_nm_txq + kring->ring_id]; | ||||
const u_int head = kring->rhead; | const u_int head = kring->rhead; | ||||
u_int reclaimed = 0; | u_int reclaimed = 0; | ||||
int n, d, npkt_remaining, ndesc_remaining; | int n, d, npkt_remaining, ndesc_remaining; | ||||
/* | /* | ||||
* Tx was at kring->nr_hwcur last time around and now we need to advance | * Tx was at kring->nr_hwcur last time around and now we need to advance | ||||
* to kring->rhead. Note that the driver's pidx moves independent of | * to kring->rhead. Note that the driver's pidx moves independent of | ||||
▲ Show 20 Lines • Show All 47 Lines • ▼ Show 20 Lines | |||||
static int | static int | ||||
cxgbe_netmap_rxsync(struct netmap_kring *kring, int flags) | cxgbe_netmap_rxsync(struct netmap_kring *kring, int flags) | ||||
{ | { | ||||
struct netmap_adapter *na = kring->na; | struct netmap_adapter *na = kring->na; | ||||
struct netmap_ring *ring = kring->ring; | struct netmap_ring *ring = kring->ring; | ||||
struct ifnet *ifp = na->ifp; | struct ifnet *ifp = na->ifp; | ||||
struct vi_info *vi = ifp->if_softc; | struct vi_info *vi = ifp->if_softc; | ||||
struct adapter *sc = vi->pi->adapter; | struct adapter *sc = vi->adapter; | ||||
struct sge_nm_rxq *nm_rxq = &sc->sge.nm_rxq[vi->first_nm_rxq + kring->ring_id]; | struct sge_nm_rxq *nm_rxq = &sc->sge.nm_rxq[vi->first_nm_rxq + kring->ring_id]; | ||||
u_int const head = kring->rhead; | u_int const head = kring->rhead; | ||||
u_int n; | u_int n; | ||||
int force_update = (flags & NAF_FORCE_READ) || kring->nr_kflags & NKR_PENDINTR; | int force_update = (flags & NAF_FORCE_READ) || kring->nr_kflags & NKR_PENDINTR; | ||||
if (black_hole) | if (black_hole) | ||||
return (0); /* No updates ever. */ | return (0); /* No updates ever. */ | ||||
▲ Show 20 Lines • Show All 140 Lines • ▼ Show 20 Lines | handle_nm_sge_egr_update(struct adapter *sc, struct ifnet *ifp, | ||||
netmap_tx_irq(ifp, nm_txq->nid); | netmap_tx_irq(ifp, nm_txq->nid); | ||||
} | } | ||||
void | void | ||||
service_nm_rxq(struct sge_nm_rxq *nm_rxq) | service_nm_rxq(struct sge_nm_rxq *nm_rxq) | ||||
{ | { | ||||
struct vi_info *vi = nm_rxq->vi; | struct vi_info *vi = nm_rxq->vi; | ||||
struct adapter *sc = vi->pi->adapter; | struct adapter *sc = vi->adapter; | ||||
struct ifnet *ifp = vi->ifp; | struct ifnet *ifp = vi->ifp; | ||||
struct netmap_adapter *na = NA(ifp); | struct netmap_adapter *na = NA(ifp); | ||||
struct netmap_kring *kring = na->rx_rings[nm_rxq->nid]; | struct netmap_kring *kring = na->rx_rings[nm_rxq->nid]; | ||||
struct netmap_ring *ring = kring->ring; | struct netmap_ring *ring = kring->ring; | ||||
struct iq_desc *d = &nm_rxq->iq_desc[nm_rxq->iq_cidx]; | struct iq_desc *d = &nm_rxq->iq_desc[nm_rxq->iq_cidx]; | ||||
const void *cpl; | const void *cpl; | ||||
uint32_t lq; | uint32_t lq; | ||||
u_int work = 0; | u_int work = 0; | ||||
▲ Show 20 Lines • Show All 103 Lines • Show Last 20 Lines |