Skip to content

Commit 8ac718c

Browse files
committed
Merge branch 'bnxt_en-fixes'
Michael Chan says: ==================== bnxt_en: Bug fixes This series fixes a devlink bug and several XDP related bugs. The devlink bug causes a kernel crash on VF devices. The XDP driver patches fix and clean up the RX XDP path and re-enable header-data split that was disabled by mistake when adding the XDP multi-buffer support. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 3ec3ebe + a056ebc commit 8ac718c

File tree

4 files changed

+39
-29
lines changed

4 files changed

+39
-29
lines changed

drivers/net/ethernet/broadcom/bnxt/bnxt.c

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -991,8 +991,7 @@ static struct sk_buff *bnxt_rx_multi_page_skb(struct bnxt *bp,
991991
dma_addr -= bp->rx_dma_offset;
992992
dma_unmap_page_attrs(&bp->pdev->dev, dma_addr, PAGE_SIZE, bp->rx_dir,
993993
DMA_ATTR_WEAK_ORDERING);
994-
skb = build_skb(page_address(page), BNXT_PAGE_MODE_BUF_SIZE +
995-
bp->rx_dma_offset);
994+
skb = build_skb(page_address(page), PAGE_SIZE);
996995
if (!skb) {
997996
__free_page(page);
998997
return NULL;
@@ -1925,7 +1924,7 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
19251924
dma_addr = rx_buf->mapping;
19261925

19271926
if (bnxt_xdp_attached(bp, rxr)) {
1928-
bnxt_xdp_buff_init(bp, rxr, cons, &data_ptr, &len, &xdp);
1927+
bnxt_xdp_buff_init(bp, rxr, cons, data_ptr, len, &xdp);
19291928
if (agg_bufs) {
19301929
u32 frag_len = bnxt_rx_agg_pages_xdp(bp, cpr, &xdp,
19311930
cp_cons, agg_bufs,
@@ -1940,7 +1939,7 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
19401939
}
19411940

19421941
if (xdp_active) {
1943-
if (bnxt_rx_xdp(bp, rxr, cons, xdp, data, &len, event)) {
1942+
if (bnxt_rx_xdp(bp, rxr, cons, xdp, data, &data_ptr, &len, event)) {
19441943
rc = 1;
19451944
goto next_rx;
19461945
}
@@ -3969,8 +3968,10 @@ void bnxt_set_ring_params(struct bnxt *bp)
39693968
bp->rx_agg_ring_mask = (bp->rx_agg_nr_pages * RX_DESC_CNT) - 1;
39703969

39713970
if (BNXT_RX_PAGE_MODE(bp)) {
3972-
rx_space = BNXT_PAGE_MODE_BUF_SIZE;
3973-
rx_size = BNXT_MAX_PAGE_MODE_MTU;
3971+
rx_space = PAGE_SIZE;
3972+
rx_size = PAGE_SIZE -
3973+
ALIGN(max(NET_SKB_PAD, XDP_PACKET_HEADROOM), 8) -
3974+
SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
39743975
} else {
39753976
rx_size = SKB_DATA_ALIGN(BNXT_RX_COPY_THRESH + NET_IP_ALIGN);
39763977
rx_space = rx_size + NET_SKB_PAD +
@@ -5398,15 +5399,16 @@ static int bnxt_hwrm_vnic_set_hds(struct bnxt *bp, u16 vnic_id)
53985399
req->flags = cpu_to_le32(VNIC_PLCMODES_CFG_REQ_FLAGS_JUMBO_PLACEMENT);
53995400
req->enables = cpu_to_le32(VNIC_PLCMODES_CFG_REQ_ENABLES_JUMBO_THRESH_VALID);
54005401

5401-
if (BNXT_RX_PAGE_MODE(bp) && !BNXT_RX_JUMBO_MODE(bp)) {
5402+
if (BNXT_RX_PAGE_MODE(bp)) {
5403+
req->jumbo_thresh = cpu_to_le16(bp->rx_buf_use_size);
5404+
} else {
54025405
req->flags |= cpu_to_le32(VNIC_PLCMODES_CFG_REQ_FLAGS_HDS_IPV4 |
54035406
VNIC_PLCMODES_CFG_REQ_FLAGS_HDS_IPV6);
54045407
req->enables |=
54055408
cpu_to_le32(VNIC_PLCMODES_CFG_REQ_ENABLES_HDS_THRESHOLD_VALID);
5409+
req->jumbo_thresh = cpu_to_le16(bp->rx_copy_thresh);
5410+
req->hds_threshold = cpu_to_le16(bp->rx_copy_thresh);
54065411
}
5407-
/* thresholds not implemented in firmware yet */
5408-
req->jumbo_thresh = cpu_to_le16(bp->rx_copy_thresh);
5409-
req->hds_threshold = cpu_to_le16(bp->rx_copy_thresh);
54105412
req->vnic_id = cpu_to_le32(vnic->fw_vnic_id);
54115413
return hwrm_req_send(bp, req);
54125414
}
@@ -13591,14 +13593,17 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
1359113593
return -ENOMEM;
1359213594

1359313595
bp = netdev_priv(dev);
13594-
SET_NETDEV_DEVLINK_PORT(dev, &bp->dl_port);
1359513596
bp->board_idx = ent->driver_data;
1359613597
bp->msg_enable = BNXT_DEF_MSG_ENABLE;
1359713598
bnxt_set_max_func_irqs(bp, max_irqs);
1359813599

1359913600
if (bnxt_vf_pciid(bp->board_idx))
1360013601
bp->flags |= BNXT_FLAG_VF;
1360113602

13603+
/* No devlink port registration in case of a VF */
13604+
if (BNXT_PF(bp))
13605+
SET_NETDEV_DEVLINK_PORT(dev, &bp->dl_port);
13606+
1360213607
if (pdev->msix_cap)
1360313608
bp->flags |= BNXT_FLAG_MSIX_CAP;
1360413609

drivers/net/ethernet/broadcom/bnxt/bnxt.h

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -591,12 +591,20 @@ struct nqe_cn {
591591
#define BNXT_RX_PAGE_SIZE (1 << BNXT_RX_PAGE_SHIFT)
592592

593593
#define BNXT_MAX_MTU 9500
594-
#define BNXT_PAGE_MODE_BUF_SIZE \
594+
595+
/* First RX buffer page in XDP multi-buf mode
596+
*
597+
* +-------------------------------------------------------------------------+
598+
* | XDP_PACKET_HEADROOM | bp->rx_buf_use_size | skb_shared_info|
599+
* | (bp->rx_dma_offset) | | |
600+
* +-------------------------------------------------------------------------+
601+
*/
602+
#define BNXT_MAX_PAGE_MODE_MTU_SBUF \
595603
((unsigned int)PAGE_SIZE - VLAN_ETH_HLEN - NET_IP_ALIGN - \
596604
XDP_PACKET_HEADROOM)
597605
#define BNXT_MAX_PAGE_MODE_MTU \
598-
BNXT_PAGE_MODE_BUF_SIZE - \
599-
SKB_DATA_ALIGN((unsigned int)sizeof(struct skb_shared_info))
606+
(BNXT_MAX_PAGE_MODE_MTU_SBUF - \
607+
SKB_DATA_ALIGN((unsigned int)sizeof(struct skb_shared_info)))
600608

601609
#define BNXT_MIN_PKT_SIZE 52
602610

@@ -2134,7 +2142,6 @@ struct bnxt {
21342142
#define BNXT_DUMP_CRASH 1
21352143

21362144
struct bpf_prog *xdp_prog;
2137-
u8 xdp_has_frags;
21382145

21392146
struct bnxt_ptp_cfg *ptp_cfg;
21402147
u8 ptp_all_rx_tstamp;

drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ bool bnxt_xdp_attached(struct bnxt *bp, struct bnxt_rx_ring_info *rxr)
177177
}
178178

179179
void bnxt_xdp_buff_init(struct bnxt *bp, struct bnxt_rx_ring_info *rxr,
180-
u16 cons, u8 **data_ptr, unsigned int *len,
180+
u16 cons, u8 *data_ptr, unsigned int len,
181181
struct xdp_buff *xdp)
182182
{
183183
struct bnxt_sw_rx_bd *rx_buf;
@@ -191,13 +191,10 @@ void bnxt_xdp_buff_init(struct bnxt *bp, struct bnxt_rx_ring_info *rxr,
191191
offset = bp->rx_offset;
192192

193193
mapping = rx_buf->mapping - bp->rx_dma_offset;
194-
dma_sync_single_for_cpu(&pdev->dev, mapping + offset, *len, bp->rx_dir);
195-
196-
if (bp->xdp_has_frags)
197-
buflen = BNXT_PAGE_MODE_BUF_SIZE + offset;
194+
dma_sync_single_for_cpu(&pdev->dev, mapping + offset, len, bp->rx_dir);
198195

199196
xdp_init_buff(xdp, buflen, &rxr->xdp_rxq);
200-
xdp_prepare_buff(xdp, *data_ptr - offset, offset, *len, false);
197+
xdp_prepare_buff(xdp, data_ptr - offset, offset, len, false);
201198
}
202199

203200
void bnxt_xdp_buff_frags_free(struct bnxt_rx_ring_info *rxr,
@@ -222,7 +219,8 @@ void bnxt_xdp_buff_frags_free(struct bnxt_rx_ring_info *rxr,
222219
* false - packet should be passed to the stack.
223220
*/
224221
bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons,
225-
struct xdp_buff xdp, struct page *page, unsigned int *len, u8 *event)
222+
struct xdp_buff xdp, struct page *page, u8 **data_ptr,
223+
unsigned int *len, u8 *event)
226224
{
227225
struct bpf_prog *xdp_prog = READ_ONCE(rxr->xdp_prog);
228226
struct bnxt_tx_ring_info *txr;
@@ -255,8 +253,10 @@ bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons,
255253
*event &= ~BNXT_RX_EVENT;
256254

257255
*len = xdp.data_end - xdp.data;
258-
if (orig_data != xdp.data)
256+
if (orig_data != xdp.data) {
259257
offset = xdp.data - xdp.data_hard_start;
258+
*data_ptr = xdp.data_hard_start + offset;
259+
}
260260

261261
switch (act) {
262262
case XDP_PASS:
@@ -401,10 +401,8 @@ static int bnxt_xdp_set(struct bnxt *bp, struct bpf_prog *prog)
401401
netdev_warn(dev, "ethtool rx/tx channels must be combined to support XDP.\n");
402402
return -EOPNOTSUPP;
403403
}
404-
if (prog) {
404+
if (prog)
405405
tx_xdp = bp->rx_nr_rings;
406-
bp->xdp_has_frags = prog->aux->xdp_has_frags;
407-
}
408406

409407
tc = netdev_get_num_tc(dev);
410408
if (!tc)

drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,16 @@ struct bnxt_sw_tx_bd *bnxt_xmit_bd(struct bnxt *bp,
1818
struct xdp_buff *xdp);
1919
void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int nr_pkts);
2020
bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons,
21-
struct xdp_buff xdp, struct page *page, unsigned int *len,
22-
u8 *event);
21+
struct xdp_buff xdp, struct page *page, u8 **data_ptr,
22+
unsigned int *len, u8 *event);
2323
int bnxt_xdp(struct net_device *dev, struct netdev_bpf *xdp);
2424
int bnxt_xdp_xmit(struct net_device *dev, int num_frames,
2525
struct xdp_frame **frames, u32 flags);
2626

2727
bool bnxt_xdp_attached(struct bnxt *bp, struct bnxt_rx_ring_info *rxr);
2828

2929
void bnxt_xdp_buff_init(struct bnxt *bp, struct bnxt_rx_ring_info *rxr,
30-
u16 cons, u8 **data_ptr, unsigned int *len,
30+
u16 cons, u8 *data_ptr, unsigned int len,
3131
struct xdp_buff *xdp);
3232
void bnxt_xdp_buff_frags_free(struct bnxt_rx_ring_info *rxr,
3333
struct xdp_buff *xdp);

0 commit comments

Comments
 (0)