diff options
| author | Jesper Dangaard Brouer <brouer@redhat.com> | 2018-01-03 05:25:44 -0500 |
|---|---|---|
| committer | Alexei Starovoitov <ast@kernel.org> | 2018-01-05 18:21:21 -0500 |
| commit | 96a8604f95fa216b9ddfd15c687eed42a2f56901 (patch) | |
| tree | fb35dbf93715186f052a7289ce694d16521d90c3 | |
| parent | ae75415de1110613aa437ddf1196af6d33f1c90a (diff) | |
bnxt_en: setup xdp_rxq_info
Driver hook points for xdp_rxq_info:
* reg : bnxt_alloc_rx_rings
* unreg: bnxt_free_rx_rings
This driver should be updated to re-register when changing
allocation mode of RX rings.
Tested on actual hardware.
Cc: Andy Gospodarek <andy@greyhouse.net>
Cc: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
| -rw-r--r-- | drivers/net/ethernet/broadcom/bnxt/bnxt.c | 10 | ||||
| -rw-r--r-- | drivers/net/ethernet/broadcom/bnxt/bnxt.h | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 1 |
3 files changed, 13 insertions, 0 deletions
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 9efbdc6f1fcb..89c3c8760a78 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c | |||
| @@ -2247,6 +2247,9 @@ static void bnxt_free_rx_rings(struct bnxt *bp) | |||
| 2247 | if (rxr->xdp_prog) | 2247 | if (rxr->xdp_prog) |
| 2248 | bpf_prog_put(rxr->xdp_prog); | 2248 | bpf_prog_put(rxr->xdp_prog); |
| 2249 | 2249 | ||
| 2250 | if (xdp_rxq_info_is_reg(&rxr->xdp_rxq)) | ||
| 2251 | xdp_rxq_info_unreg(&rxr->xdp_rxq); | ||
| 2252 | |||
| 2250 | kfree(rxr->rx_tpa); | 2253 | kfree(rxr->rx_tpa); |
| 2251 | rxr->rx_tpa = NULL; | 2254 | rxr->rx_tpa = NULL; |
| 2252 | 2255 | ||
| @@ -2280,6 +2283,10 @@ static int bnxt_alloc_rx_rings(struct bnxt *bp) | |||
| 2280 | 2283 | ||
| 2281 | ring = &rxr->rx_ring_struct; | 2284 | ring = &rxr->rx_ring_struct; |
| 2282 | 2285 | ||
| 2286 | rc = xdp_rxq_info_reg(&rxr->xdp_rxq, bp->dev, i); | ||
| 2287 | if (rc < 0) | ||
| 2288 | return rc; | ||
| 2289 | |||
| 2283 | rc = bnxt_alloc_ring(bp, ring); | 2290 | rc = bnxt_alloc_ring(bp, ring); |
| 2284 | if (rc) | 2291 | if (rc) |
| 2285 | return rc; | 2292 | return rc; |
| @@ -2834,6 +2841,9 @@ void bnxt_set_ring_params(struct bnxt *bp) | |||
| 2834 | bp->cp_ring_mask = bp->cp_bit - 1; | 2841 | bp->cp_ring_mask = bp->cp_bit - 1; |
| 2835 | } | 2842 | } |
| 2836 | 2843 | ||
| 2844 | /* Changing allocation mode of RX rings. | ||
| 2845 | * TODO: Update when extending xdp_rxq_info to support allocation modes. | ||
| 2846 | */ | ||
| 2837 | int bnxt_set_rx_skb_mode(struct bnxt *bp, bool page_mode) | 2847 | int bnxt_set_rx_skb_mode(struct bnxt *bp, bool page_mode) |
| 2838 | { | 2848 | { |
| 2839 | if (page_mode) { | 2849 | if (page_mode) { |
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h index 5359a1f0045f..2d268fc26f5e 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <net/devlink.h> | 23 | #include <net/devlink.h> |
| 24 | #include <net/dst_metadata.h> | 24 | #include <net/dst_metadata.h> |
| 25 | #include <net/switchdev.h> | 25 | #include <net/switchdev.h> |
| 26 | #include <net/xdp.h> | ||
| 26 | 27 | ||
| 27 | struct tx_bd { | 28 | struct tx_bd { |
| 28 | __le32 tx_bd_len_flags_type; | 29 | __le32 tx_bd_len_flags_type; |
| @@ -664,6 +665,7 @@ struct bnxt_rx_ring_info { | |||
| 664 | 665 | ||
| 665 | struct bnxt_ring_struct rx_ring_struct; | 666 | struct bnxt_ring_struct rx_ring_struct; |
| 666 | struct bnxt_ring_struct rx_agg_ring_struct; | 667 | struct bnxt_ring_struct rx_agg_ring_struct; |
| 668 | struct xdp_rxq_info xdp_rxq; | ||
| 667 | }; | 669 | }; |
| 668 | 670 | ||
| 669 | struct bnxt_cp_ring_info { | 671 | struct bnxt_cp_ring_info { |
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c index 261e5847557a..1389ab5e05df 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | |||
| @@ -96,6 +96,7 @@ bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons, | |||
| 96 | xdp.data = *data_ptr; | 96 | xdp.data = *data_ptr; |
| 97 | xdp_set_data_meta_invalid(&xdp); | 97 | xdp_set_data_meta_invalid(&xdp); |
| 98 | xdp.data_end = *data_ptr + *len; | 98 | xdp.data_end = *data_ptr + *len; |
| 99 | xdp.rxq = &rxr->xdp_rxq; | ||
| 99 | orig_data = xdp.data; | 100 | orig_data = xdp.data; |
| 100 | mapping = rx_buf->mapping - bp->rx_dma_offset; | 101 | mapping = rx_buf->mapping - bp->rx_dma_offset; |
| 101 | 102 | ||
