hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/net/ethernet/broadcom/bnxt/bnxt.c
....@@ -219,12 +219,12 @@
219219 { PCI_VDEVICE(BROADCOM, 0x1750), .driver_data = BCM57508 },
220220 { PCI_VDEVICE(BROADCOM, 0x1751), .driver_data = BCM57504 },
221221 { PCI_VDEVICE(BROADCOM, 0x1752), .driver_data = BCM57502 },
222
- { PCI_VDEVICE(BROADCOM, 0x1800), .driver_data = BCM57508_NPAR },
222
+ { PCI_VDEVICE(BROADCOM, 0x1800), .driver_data = BCM57502_NPAR },
223223 { PCI_VDEVICE(BROADCOM, 0x1801), .driver_data = BCM57504_NPAR },
224
- { PCI_VDEVICE(BROADCOM, 0x1802), .driver_data = BCM57502_NPAR },
225
- { PCI_VDEVICE(BROADCOM, 0x1803), .driver_data = BCM57508_NPAR },
224
+ { PCI_VDEVICE(BROADCOM, 0x1802), .driver_data = BCM57508_NPAR },
225
+ { PCI_VDEVICE(BROADCOM, 0x1803), .driver_data = BCM57502_NPAR },
226226 { PCI_VDEVICE(BROADCOM, 0x1804), .driver_data = BCM57504_NPAR },
227
- { PCI_VDEVICE(BROADCOM, 0x1805), .driver_data = BCM57502_NPAR },
227
+ { PCI_VDEVICE(BROADCOM, 0x1805), .driver_data = BCM57508_NPAR },
228228 { PCI_VDEVICE(BROADCOM, 0xd802), .driver_data = BCM58802 },
229229 { PCI_VDEVICE(BROADCOM, 0xd804), .driver_data = BCM58804 },
230230 #ifdef CONFIG_BNXT_SRIOV
....@@ -2404,6 +2404,7 @@
24042404 struct rx_cmp_ext *rxcmp1;
24052405 u32 cp_cons, tmp_raw_cons;
24062406 u32 raw_cons = cpr->cp_raw_cons;
2407
+ bool flush_xdp = false;
24072408 u32 rx_pkts = 0;
24082409 u8 event = 0;
24092410
....@@ -2438,6 +2439,8 @@
24382439 rx_pkts++;
24392440 else if (rc == -EBUSY) /* partial completion */
24402441 break;
2442
+ if (event & BNXT_REDIRECT_EVENT)
2443
+ flush_xdp = true;
24412444 } else if (unlikely(TX_CMP_TYPE(txcmp) ==
24422445 CMPL_BASE_TYPE_HWRM_DONE)) {
24432446 bnxt_hwrm_handler(bp, txcmp);
....@@ -2457,6 +2460,8 @@
24572460
24582461 if (event & BNXT_AGG_EVENT)
24592462 bnxt_db_write(bp, &rxr->rx_agg_db, rxr->rx_agg_prod);
2463
+ if (flush_xdp)
2464
+ xdp_do_flush();
24602465
24612466 if (!bnxt_has_work(bp, cpr) && rx_pkts < budget) {
24622467 napi_complete_done(napi, rx_pkts);
....@@ -2854,7 +2859,7 @@
28542859
28552860 static void bnxt_free_tpa_info(struct bnxt *bp)
28562861 {
2857
- int i;
2862
+ int i, j;
28582863
28592864 for (i = 0; i < bp->rx_nr_rings; i++) {
28602865 struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i];
....@@ -2862,8 +2867,10 @@
28622867 kfree(rxr->rx_tpa_idx_map);
28632868 rxr->rx_tpa_idx_map = NULL;
28642869 if (rxr->rx_tpa) {
2865
- kfree(rxr->rx_tpa[0].agg_arr);
2866
- rxr->rx_tpa[0].agg_arr = NULL;
2870
+ for (j = 0; j < bp->max_tpa; j++) {
2871
+ kfree(rxr->rx_tpa[j].agg_arr);
2872
+ rxr->rx_tpa[j].agg_arr = NULL;
2873
+ }
28672874 }
28682875 kfree(rxr->rx_tpa);
28692876 rxr->rx_tpa = NULL;
....@@ -2872,14 +2879,13 @@
28722879
28732880 static int bnxt_alloc_tpa_info(struct bnxt *bp)
28742881 {
2875
- int i, j, total_aggs = 0;
2882
+ int i, j;
28762883
28772884 bp->max_tpa = MAX_TPA;
28782885 if (bp->flags & BNXT_FLAG_CHIP_P5) {
28792886 if (!bp->max_tpa_v2)
28802887 return 0;
28812888 bp->max_tpa = max_t(u16, bp->max_tpa_v2, MAX_TPA_P5);
2882
- total_aggs = bp->max_tpa * MAX_SKB_FRAGS;
28832889 }
28842890
28852891 for (i = 0; i < bp->rx_nr_rings; i++) {
....@@ -2893,12 +2899,12 @@
28932899
28942900 if (!(bp->flags & BNXT_FLAG_CHIP_P5))
28952901 continue;
2896
- agg = kcalloc(total_aggs, sizeof(*agg), GFP_KERNEL);
2897
- rxr->rx_tpa[0].agg_arr = agg;
2898
- if (!agg)
2899
- return -ENOMEM;
2900
- for (j = 1; j < bp->max_tpa; j++)
2901
- rxr->rx_tpa[j].agg_arr = agg + j * MAX_SKB_FRAGS;
2902
+ for (j = 0; j < bp->max_tpa; j++) {
2903
+ agg = kcalloc(MAX_SKB_FRAGS, sizeof(*agg), GFP_KERNEL);
2904
+ if (!agg)
2905
+ return -ENOMEM;
2906
+ rxr->rx_tpa[j].agg_arr = agg;
2907
+ }
29022908 rxr->rx_tpa_idx_map = kzalloc(sizeof(*rxr->rx_tpa_idx_map),
29032909 GFP_KERNEL);
29042910 if (!rxr->rx_tpa_idx_map)
....@@ -8336,6 +8342,9 @@
83368342 goto err_out;
83378343 }
83388344
8345
+ if (BNXT_VF(bp))
8346
+ bnxt_hwrm_func_qcfg(bp);
8347
+
83398348 rc = bnxt_setup_vnic(bp, 0);
83408349 if (rc)
83418350 goto err_out;
....@@ -8761,10 +8770,14 @@
87618770 netdev_err(bp->dev, "ring reservation/IRQ init failure rc: %d\n", rc);
87628771 return rc;
87638772 }
8764
- if (tcs && (bp->tx_nr_rings_per_tc * tcs != bp->tx_nr_rings)) {
8773
+ if (tcs && (bp->tx_nr_rings_per_tc * tcs !=
8774
+ bp->tx_nr_rings - bp->tx_nr_rings_xdp)) {
87658775 netdev_err(bp->dev, "tx ring reservation failure\n");
87668776 netdev_reset_tc(bp->dev);
8767
- bp->tx_nr_rings_per_tc = bp->tx_nr_rings;
8777
+ if (bp->tx_nr_rings_xdp)
8778
+ bp->tx_nr_rings_per_tc = bp->tx_nr_rings_xdp;
8779
+ else
8780
+ bp->tx_nr_rings_per_tc = bp->tx_nr_rings;
87688781 return -ENOMEM;
87698782 }
87708783 return 0;
....@@ -12096,26 +12109,37 @@
1209612109
1209712110 #endif /* CONFIG_RFS_ACCEL */
1209812111
12099
-static int bnxt_udp_tunnel_sync(struct net_device *netdev, unsigned int table)
12112
+static int bnxt_udp_tunnel_set_port(struct net_device *netdev, unsigned int table,
12113
+ unsigned int entry, struct udp_tunnel_info *ti)
1210012114 {
1210112115 struct bnxt *bp = netdev_priv(netdev);
12102
- struct udp_tunnel_info ti;
1210312116 unsigned int cmd;
1210412117
12105
- udp_tunnel_nic_get_port(netdev, table, 0, &ti);
12106
- if (ti.type == UDP_TUNNEL_TYPE_VXLAN)
12118
+ if (ti->type == UDP_TUNNEL_TYPE_VXLAN)
1210712119 cmd = TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN;
1210812120 else
1210912121 cmd = TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_GENEVE;
1211012122
12111
- if (ti.port)
12112
- return bnxt_hwrm_tunnel_dst_port_alloc(bp, ti.port, cmd);
12123
+ return bnxt_hwrm_tunnel_dst_port_alloc(bp, ti->port, cmd);
12124
+}
12125
+
12126
+static int bnxt_udp_tunnel_unset_port(struct net_device *netdev, unsigned int table,
12127
+ unsigned int entry, struct udp_tunnel_info *ti)
12128
+{
12129
+ struct bnxt *bp = netdev_priv(netdev);
12130
+ unsigned int cmd;
12131
+
12132
+ if (ti->type == UDP_TUNNEL_TYPE_VXLAN)
12133
+ cmd = TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN;
12134
+ else
12135
+ cmd = TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_GENEVE;
1211312136
1211412137 return bnxt_hwrm_tunnel_dst_port_free(bp, cmd);
1211512138 }
1211612139
1211712140 static const struct udp_tunnel_nic_info bnxt_udp_tunnels = {
12118
- .sync_table = bnxt_udp_tunnel_sync,
12141
+ .set_port = bnxt_udp_tunnel_set_port,
12142
+ .unset_port = bnxt_udp_tunnel_unset_port,
1211912143 .flags = UDP_TUNNEL_NIC_INFO_MAY_SLEEP |
1212012144 UDP_TUNNEL_NIC_INFO_OPEN_ONLY,
1212112145 .tables = {