Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/netmap/if_em_netmap.h
Show First 20 Lines • Show All 142 Lines • ▼ Show 20 Lines | if (nm_i != head) { /* we have new packets to send */ | ||||
for (n = 0; nm_i != head; n++) { | for (n = 0; nm_i != head; n++) { | ||||
struct netmap_slot *slot = &ring->slot[nm_i]; | struct netmap_slot *slot = &ring->slot[nm_i]; | ||||
u_int len = slot->len; | u_int len = slot->len; | ||||
uint64_t paddr; | uint64_t paddr; | ||||
void *addr = PNMB(na, slot, &paddr); | void *addr = PNMB(na, slot, &paddr); | ||||
/* device-specific */ | /* device-specific */ | ||||
struct e1000_tx_desc *curr = &txr->tx_base[nic_i]; | struct e1000_tx_desc *curr = &txr->tx_base[nic_i]; | ||||
struct em_buffer *txbuf = &txr->tx_buffers[nic_i]; | struct em_txbuffer *txbuf = &txr->tx_buffers[nic_i]; | ||||
int flags = (slot->flags & NS_REPORT || | int flags = (slot->flags & NS_REPORT || | ||||
nic_i == 0 || nic_i == report_frequency) ? | nic_i == 0 || nic_i == report_frequency) ? | ||||
E1000_TXD_CMD_RS : 0; | E1000_TXD_CMD_RS : 0; | ||||
NM_CHECK_ADDR_LEN(na, addr, len); | NM_CHECK_ADDR_LEN(na, addr, len); | ||||
if (slot->flags & NS_BUF_CHANGED) { | if (slot->flags & NS_BUF_CHANGED) { | ||||
curr->buffer_addr = htole64(paddr); | curr->buffer_addr = htole64(paddr); | ||||
▲ Show 20 Lines • Show All 74 Lines • ▼ Show 20 Lines | em_netmap_rxsync(struct netmap_kring *kring, int flags) | ||||
*/ | */ | ||||
if (netmap_no_pendintr || force_update) { | if (netmap_no_pendintr || force_update) { | ||||
uint16_t slot_flags = kring->nkr_slot_flags; | uint16_t slot_flags = kring->nkr_slot_flags; | ||||
nic_i = rxr->next_to_check; | nic_i = rxr->next_to_check; | ||||
nm_i = netmap_idx_n2k(kring, nic_i); | nm_i = netmap_idx_n2k(kring, nic_i); | ||||
for (n = 0; ; n++) { // XXX no need to count | for (n = 0; ; n++) { // XXX no need to count | ||||
struct e1000_rx_desc *curr = &rxr->rx_base[nic_i]; | union e1000_rx_desc_extended *curr = &rxr->rx_base[nic_i]; | ||||
uint32_t staterr = le32toh(curr->status); | uint32_t staterr = le32toh(curr->wb.upper.status_error); | ||||
if ((staterr & E1000_RXD_STAT_DD) == 0) | if ((staterr & E1000_RXD_STAT_DD) == 0) | ||||
break; | break; | ||||
ring->slot[nm_i].len = le16toh(curr->length); | ring->slot[nm_i].len = le16toh(curr->wb.upper.length); | ||||
ring->slot[nm_i].flags = slot_flags; | ring->slot[nm_i].flags = slot_flags; | ||||
bus_dmamap_sync(rxr->rxtag, rxr->rx_buffers[nic_i].map, | bus_dmamap_sync(rxr->rxtag, rxr->rx_buffers[nic_i].map, | ||||
BUS_DMASYNC_POSTREAD); | BUS_DMASYNC_POSTREAD); | ||||
nm_i = nm_next(nm_i, lim); | nm_i = nm_next(nm_i, lim); | ||||
/* make sure next_to_refresh follows next_to_check */ | /* make sure next_to_refresh follows next_to_check */ | ||||
rxr->next_to_refresh = nic_i; // XXX | rxr->next_to_refresh = nic_i; // XXX | ||||
nic_i = nm_next(nic_i, lim); | nic_i = nm_next(nic_i, lim); | ||||
} | } | ||||
Show All 10 Lines | em_netmap_rxsync(struct netmap_kring *kring, int flags) | ||||
nm_i = kring->nr_hwcur; | nm_i = kring->nr_hwcur; | ||||
if (nm_i != head) { | if (nm_i != head) { | ||||
nic_i = netmap_idx_k2n(kring, nm_i); | nic_i = netmap_idx_k2n(kring, nm_i); | ||||
for (n = 0; nm_i != head; n++) { | for (n = 0; nm_i != head; n++) { | ||||
struct netmap_slot *slot = &ring->slot[nm_i]; | struct netmap_slot *slot = &ring->slot[nm_i]; | ||||
uint64_t paddr; | uint64_t paddr; | ||||
void *addr = PNMB(na, slot, &paddr); | void *addr = PNMB(na, slot, &paddr); | ||||
struct e1000_rx_desc *curr = &rxr->rx_base[nic_i]; | union e1000_rx_desc_extended *curr = &rxr->rx_base[nic_i]; | ||||
struct em_buffer *rxbuf = &rxr->rx_buffers[nic_i]; | struct em_rxbuffer *rxbuf = &rxr->rx_buffers[nic_i]; | ||||
if (addr == NETMAP_BUF_BASE(na)) /* bad buf */ | if (addr == NETMAP_BUF_BASE(na)) /* bad buf */ | ||||
goto ring_reset; | goto ring_reset; | ||||
if (slot->flags & NS_BUF_CHANGED) { | if (slot->flags & NS_BUF_CHANGED) { | ||||
/* buffer has changed, reload map */ | /* buffer has changed, reload map */ | ||||
curr->buffer_addr = htole64(paddr); | curr->read.buffer_addr = htole64(paddr); | ||||
netmap_reload_map(na, rxr->rxtag, rxbuf->map, addr); | netmap_reload_map(na, rxr->rxtag, rxbuf->map, addr); | ||||
slot->flags &= ~NS_BUF_CHANGED; | slot->flags &= ~NS_BUF_CHANGED; | ||||
} | } | ||||
curr->status = 0; | curr->wb.upper.status_error = 0; | ||||
bus_dmamap_sync(rxr->rxtag, rxbuf->map, | bus_dmamap_sync(rxr->rxtag, rxbuf->map, | ||||
BUS_DMASYNC_PREREAD); | BUS_DMASYNC_PREREAD); | ||||
nm_i = nm_next(nm_i, lim); | nm_i = nm_next(nm_i, lim); | ||||
nic_i = nm_next(nic_i, lim); | nic_i = nm_next(nic_i, lim); | ||||
} | } | ||||
kring->nr_hwcur = head; | kring->nr_hwcur = head; | ||||
bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map, | bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map, | ||||
Show All 35 Lines |