aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/netmap/ixgbe_netmap.h
diff options
context:
space:
mode:
authorLuigi Rizzo <luigi@FreeBSD.org>2012-02-17 14:09:04 +0000
committerLuigi Rizzo <luigi@FreeBSD.org>2012-02-17 14:09:04 +0000
commitbabc7c12587be4f23bd76e6072081d920ded1a47 (patch)
tree3eecd28ae799dff77143398e06b66ddee508858d /sys/dev/netmap/ixgbe_netmap.h
parentf6a92b88034b5633dce0691839ae5352761c81b5 (diff)
Notes
Diffstat (limited to 'sys/dev/netmap/ixgbe_netmap.h')
-rw-r--r--sys/dev/netmap/ixgbe_netmap.h66
1 files changed, 27 insertions, 39 deletions
diff --git a/sys/dev/netmap/ixgbe_netmap.h b/sys/dev/netmap/ixgbe_netmap.h
index 5f5a240b4921..b0a203ae94c1 100644
--- a/sys/dev/netmap/ixgbe_netmap.h
+++ b/sys/dev/netmap/ixgbe_netmap.h
@@ -242,8 +242,7 @@ ixgbe_netmap_txsync(struct ifnet *ifp, u_int ring_nr, int do_lock)
j = kring->nr_hwcur;
if (j != k) { /* we have new packets to send */
l = netmap_tidx_k2n(na, ring_nr, j); /* NIC index */
-
- while (j != k) {
+ for (n = 0; j != k; n++) {
/*
* Collect per-slot info.
* Note that txbuf and curr are indexed by l.
@@ -281,6 +280,11 @@ ring_reset:
}
slot->flags &= ~NS_REPORT;
+ if (slot->flags & NS_BUF_CHANGED) {
+ /* buffer has changed, unload and reload map */
+ netmap_reload_map(txr->txtag, txbuf->map, addr);
+ slot->flags &= ~NS_BUF_CHANGED;
+ }
/*
* Fill the slot in the NIC ring.
* In this driver we need to rewrite the buffer
@@ -295,25 +299,14 @@ ring_reset:
IXGBE_ADVTXD_DCMD_DEXT |
IXGBE_ADVTXD_DCMD_IFCS |
IXGBE_TXD_CMD_EOP | flags) );
- /* If the buffer has changed, unload and reload map
- * (and possibly the physical address in the NIC
- * slot, but we did it already).
- */
- if (slot->flags & NS_BUF_CHANGED) {
- /* buffer has changed, unload and reload map */
- netmap_reload_map(txr->txtag, txbuf->map, addr);
- slot->flags &= ~NS_BUF_CHANGED;
- }
/* make sure changes to the buffer are synced */
bus_dmamap_sync(txr->txtag, txbuf->map,
BUS_DMASYNC_PREWRITE);
j = (j == lim) ? 0 : j + 1;
l = (l == lim) ? 0 : l + 1;
- n++;
}
kring->nr_hwcur = k; /* the saved ring->cur */
-
/* decrease avail by number of sent packets */
kring->nr_hwavail -= n;
@@ -356,7 +349,7 @@ ring_reset:
j= (j < kring->nkr_num_slots / 4 || j >= kring->nkr_num_slots*3/4) ?
0 : report_frequency;
kring->nr_kflags = j; /* the slot to check */
- j = txd[j].upper.fields.status & IXGBE_TXD_STAT_DD;
+ j = txd[j].upper.fields.status & IXGBE_TXD_STAT_DD; // XXX cpu_to_le32 ?
}
if (j) {
int delta;
@@ -396,7 +389,6 @@ ring_reset:
if (do_lock)
IXGBE_TX_UNLOCK(txr);
return 0;
-
}
@@ -460,25 +452,25 @@ ixgbe_netmap_rxsync(struct ifnet *ifp, u_int ring_nr, int do_lock)
l = rxr->next_to_check;
j = netmap_ridx_n2k(na, ring_nr, l);
- if (netmap_no_pendintr || force_update) {
- for (n = 0; ; n++) {
- union ixgbe_adv_rx_desc *curr = &rxr->rx_base[l];
- uint32_t staterr = le32toh(curr->wb.upper.status_error);
+ if (netmap_no_pendintr || force_update) {
+ for (n = 0; ; n++) {
+ union ixgbe_adv_rx_desc *curr = &rxr->rx_base[l];
+ uint32_t staterr = le32toh(curr->wb.upper.status_error);
- if ((staterr & IXGBE_RXD_STAT_DD) == 0)
- break;
- ring->slot[j].len = le16toh(curr->wb.upper.length);
- bus_dmamap_sync(rxr->ptag,
- rxr->rx_buffers[l].pmap, BUS_DMASYNC_POSTREAD);
- j = (j == lim) ? 0 : j + 1;
- l = (l == lim) ? 0 : l + 1;
- }
- if (n) { /* update the state variables */
- rxr->next_to_check = l;
- kring->nr_hwavail += n;
+ if ((staterr & IXGBE_RXD_STAT_DD) == 0)
+ break;
+ ring->slot[j].len = le16toh(curr->wb.upper.length);
+ bus_dmamap_sync(rxr->ptag,
+ rxr->rx_buffers[l].pmap, BUS_DMASYNC_POSTREAD);
+ j = (j == lim) ? 0 : j + 1;
+ l = (l == lim) ? 0 : l + 1;
+ }
+ if (n) { /* update the state variables */
+ rxr->next_to_check = l;
+ kring->nr_hwavail += n;
+ }
+ kring->nr_kflags &= ~NKR_PENDINTR;
}
- kring->nr_kflags &= ~NKR_PENDINTR;
- }
/*
* Skip past packets that userspace has already processed
@@ -489,9 +481,8 @@ ixgbe_netmap_rxsync(struct ifnet *ifp, u_int ring_nr, int do_lock)
*/
j = kring->nr_hwcur;
if (j != k) { /* userspace has read some packets. */
- n = 0;
l = netmap_ridx_k2n(na, ring_nr, j);
- while (j != k) {
+ for (n = 0; j != k; n++) {
/* collect per-slot info, with similar validations
* and flag handling as in the txsync code.
*
@@ -509,19 +500,16 @@ ixgbe_netmap_rxsync(struct ifnet *ifp, u_int ring_nr, int do_lock)
if (addr == netmap_buffer_base) /* bad buf */
goto ring_reset;
- curr->wb.upper.status_error = 0;
- curr->read.pkt_addr = htole64(paddr);
if (slot->flags & NS_BUF_CHANGED) {
netmap_reload_map(rxr->ptag, rxbuf->pmap, addr);
slot->flags &= ~NS_BUF_CHANGED;
}
-
+ curr->wb.upper.status_error = 0;
+ curr->read.pkt_addr = htole64(paddr);
bus_dmamap_sync(rxr->ptag, rxbuf->pmap,
BUS_DMASYNC_PREREAD);
-
j = (j == lim) ? 0 : j + 1;
l = (l == lim) ? 0 : l + 1;
- n++;
}
kring->nr_hwavail -= n;
kring->nr_hwcur = k;