Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/ena/ena_netmap.c
Show First 20 Lines • Show All 200 Lines • ▼ Show 20 Lines | ena_netmap_free_rx_slot(struct ena_adapter *adapter, | ||||
if (kring->nr_mode != NKR_NETMAP_ON) | if (kring->nr_mode != NKR_NETMAP_ON) | ||||
return; | return; | ||||
bus_dmamap_sync(adapter->rx_buf_tag, rx_info->map, | bus_dmamap_sync(adapter->rx_buf_tag, rx_info->map, | ||||
BUS_DMASYNC_POSTREAD); | BUS_DMASYNC_POSTREAD); | ||||
netmap_unload_map(na, adapter->rx_buf_tag, rx_info->map); | netmap_unload_map(na, adapter->rx_buf_tag, rx_info->map); | ||||
KASSERT(kring->ring == NULL, ("Netmap Rx ring is NULL\n")); | |||||
slot = &kring->ring->slot[nm_i]; | slot = &kring->ring->slot[nm_i]; | ||||
ENA_ASSERT(slot->buf_idx == 0, "Overwrite slot buf\n"); | ENA_ASSERT(slot->buf_idx == 0, "Overwrite slot buf\n"); | ||||
slot->buf_idx = rx_info->netmap_buf_idx; | slot->buf_idx = rx_info->netmap_buf_idx; | ||||
slot->flags = NS_BUF_CHANGED; | slot->flags = NS_BUF_CHANGED; | ||||
rx_info->netmap_buf_idx = 0; | rx_info->netmap_buf_idx = 0; | ||||
kring->nr_hwcur = nm_i; | kring->nr_hwcur = nm_i; | ||||
} | } | ||||
static bool | |||||
ena_ring_in_netmap(struct ena_adapter *adapter, int qid, enum txrx x) | |||||
{ | |||||
struct netmap_adapter *na; | |||||
struct netmap_kring *kring; | |||||
if (adapter->ifp->if_capenable & IFCAP_NETMAP) { | |||||
na = NA(adapter->ifp); | |||||
kring = (x == NR_RX) ? na->rx_rings[qid] : na->tx_rings[qid]; | |||||
if (kring->nr_mode == NKR_NETMAP_ON) | |||||
return true; | |||||
} | |||||
return false; | |||||
} | |||||
bool | |||||
ena_tx_ring_in_netmap(struct ena_adapter *adapter, int qid) | |||||
{ | |||||
return ena_ring_in_netmap(adapter, qid, NR_TX); | |||||
} | |||||
bool | |||||
ena_rx_ring_in_netmap(struct ena_adapter *adapter, int qid) | |||||
{ | |||||
return ena_ring_in_netmap(adapter, qid, NR_RX); | |||||
} | |||||
static void | |||||
ena_netmap_reset_ring(struct ena_adapter *adapter, int qid, enum txrx x) | |||||
{ | |||||
if (!ena_ring_in_netmap(adapter, qid, x)) | |||||
return; | |||||
netmap_reset(NA(adapter->ifp), x, qid, 0); | |||||
ena_trace(ENA_NETMAP, "%s ring %d is in netmap mode\n", | |||||
(x == NR_TX) ? "Tx" : "Rx", qid); | |||||
} | |||||
void | void | ||||
ena_netmap_reset_rx_ring(struct ena_adapter *adapter, int qid) | ena_netmap_reset_rx_ring(struct ena_adapter *adapter, int qid) | ||||
{ | { | ||||
if (adapter->ifp->if_capenable & IFCAP_NETMAP) | ena_netmap_reset_ring(adapter, qid, NR_RX); | ||||
netmap_reset(NA(adapter->ifp), NR_RX, qid, 0); | |||||
} | } | ||||
void | void | ||||
ena_netmap_reset_tx_ring(struct ena_adapter *adapter, int qid) | ena_netmap_reset_tx_ring(struct ena_adapter *adapter, int qid) | ||||
{ | { | ||||
if (adapter->ifp->if_capenable & IFCAP_NETMAP) | ena_netmap_reset_ring(adapter, qid, NR_TX); | ||||
netmap_reset(NA(adapter->ifp), NR_TX, qid, 0); | |||||
} | } | ||||
static int | static int | ||||
ena_netmap_reg(struct netmap_adapter *na, int onoff) | ena_netmap_reg(struct netmap_adapter *na, int onoff) | ||||
{ | { | ||||
struct ifnet *ifp = na->ifp; | struct ifnet *ifp = na->ifp; | ||||
struct ena_adapter* adapter = ifp->if_softc; | struct ena_adapter* adapter = ifp->if_softc; | ||||
int rc; | struct netmap_kring *kring; | ||||
enum txrx t; | |||||
int rc, i; | |||||
sx_xlock(&adapter->ioctl_sx); | sx_xlock(&adapter->ioctl_sx); | ||||
ENA_FLAG_CLEAR_ATOMIC(ENA_FLAG_TRIGGER_RESET, adapter); | ENA_FLAG_CLEAR_ATOMIC(ENA_FLAG_TRIGGER_RESET, adapter); | ||||
ena_down(adapter); | ena_down(adapter); | ||||
if (onoff) { | if (onoff) { | ||||
ena_trace(ENA_NETMAP, "netmap on\n"); | ena_trace(ENA_NETMAP, "netmap on\n"); | ||||
for_rx_tx(t) { | |||||
for (i = 0; i <= nma_get_nrings(na, t); i++) { | |||||
kring = NMR(na, t)[i]; | |||||
if (nm_kring_pending_on(kring)) { | |||||
kring->nr_mode = NKR_NETMAP_ON; | |||||
} | |||||
} | |||||
} | |||||
nm_set_native_flags(na); | nm_set_native_flags(na); | ||||
} else { | } else { | ||||
ena_trace(ENA_NETMAP, "netmap off\n"); | ena_trace(ENA_NETMAP, "netmap off\n"); | ||||
nm_clear_native_flags(na); | nm_clear_native_flags(na); | ||||
for_rx_tx(t) { | |||||
for (i = 0; i <= nma_get_nrings(na, t); i++) { | |||||
kring = NMR(na, t)[i]; | |||||
if (nm_kring_pending_off(kring)) { | |||||
kring->nr_mode = NKR_NETMAP_OFF; | |||||
} | |||||
} | |||||
} | |||||
} | } | ||||
rc = ena_up(adapter); | rc = ena_up(adapter); | ||||
if (rc != 0) { | if (rc != 0) { | ||||
ena_trace(ENA_WARNING, "ena_up failed with rc=%d\n", rc); | ena_trace(ENA_WARNING, "ena_up failed with rc=%d\n", rc); | ||||
adapter->reset_reason = ENA_REGS_RESET_DRIVER_INVALID_STATE; | adapter->reset_reason = ENA_REGS_RESET_DRIVER_INVALID_STATE; | ||||
nm_clear_native_flags(na); | nm_clear_native_flags(na); | ||||
ena_destroy_device(adapter, false); | ena_destroy_device(adapter, false); | ||||
▲ Show 20 Lines • Show All 782 Lines • Show Last 20 Lines |