Skip to content

Commit 16eab55

Browse files
committed
Merge branch 'bnxt_en-improve-ntuple-and-new-IDs'
Michael Chan says: ==================== bnxt_en: Improve ntuple filters and add new IDs. Improve ntuple filters and add some new PCI device IDs. Please review for net-next. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents 59d3f1c + 1f68168 commit 16eab55

File tree

2 files changed

+63
-11
lines changed

2 files changed

+63
-11
lines changed

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

Lines changed: 61 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -73,19 +73,28 @@ enum board_idx {
7373
BCM57301,
7474
BCM57302,
7575
BCM57304,
76+
BCM57417_NPAR,
7677
BCM58700,
7778
BCM57311,
7879
BCM57312,
7980
BCM57402,
8081
BCM57404,
8182
BCM57406,
82-
BCM57404_NPAR,
83+
BCM57402_NPAR,
84+
BCM57407,
8385
BCM57412,
8486
BCM57414,
8587
BCM57416,
8688
BCM57417,
87-
BCM57414_NPAR,
89+
BCM57412_NPAR,
8890
BCM57314,
91+
BCM57417_SFP,
92+
BCM57416_SFP,
93+
BCM57404_NPAR,
94+
BCM57406_NPAR,
95+
BCM57407_SFP,
96+
BCM57414_NPAR,
97+
BCM57416_NPAR,
8998
BCM57304_VF,
9099
BCM57404_VF,
91100
BCM57414_VF,
@@ -99,19 +108,28 @@ static const struct {
99108
{ "Broadcom BCM57301 NetXtreme-C Single-port 10Gb Ethernet" },
100109
{ "Broadcom BCM57302 NetXtreme-C Dual-port 10Gb/25Gb Ethernet" },
101110
{ "Broadcom BCM57304 NetXtreme-C Dual-port 10Gb/25Gb/40Gb/50Gb Ethernet" },
111+
{ "Broadcom BCM57417 NetXtreme-E Ethernet Partition" },
102112
{ "Broadcom BCM58700 Nitro 4-port 1Gb/2.5Gb/10Gb Ethernet" },
103113
{ "Broadcom BCM57311 NetXtreme-C Single-port 10Gb Ethernet" },
104114
{ "Broadcom BCM57312 NetXtreme-C Dual-port 10Gb/25Gb Ethernet" },
105115
{ "Broadcom BCM57402 NetXtreme-E Dual-port 10Gb Ethernet" },
106116
{ "Broadcom BCM57404 NetXtreme-E Dual-port 10Gb/25Gb Ethernet" },
107117
{ "Broadcom BCM57406 NetXtreme-E Dual-port 10GBase-T Ethernet" },
108-
{ "Broadcom BCM57404 NetXtreme-E Ethernet Partition" },
118+
{ "Broadcom BCM57402 NetXtreme-E Ethernet Partition" },
119+
{ "Broadcom BCM57407 NetXtreme-E Dual-port 10GBase-T Ethernet" },
109120
{ "Broadcom BCM57412 NetXtreme-E Dual-port 10Gb Ethernet" },
110121
{ "Broadcom BCM57414 NetXtreme-E Dual-port 10Gb/25Gb Ethernet" },
111122
{ "Broadcom BCM57416 NetXtreme-E Dual-port 10GBase-T Ethernet" },
112123
{ "Broadcom BCM57417 NetXtreme-E Dual-port 10GBase-T Ethernet" },
113-
{ "Broadcom BCM57414 NetXtreme-E Ethernet Partition" },
124+
{ "Broadcom BCM57412 NetXtreme-E Ethernet Partition" },
114125
{ "Broadcom BCM57314 NetXtreme-C Dual-port 10Gb/25Gb/40Gb/50Gb Ethernet" },
126+
{ "Broadcom BCM57417 NetXtreme-E Dual-port 10Gb/25Gb Ethernet" },
127+
{ "Broadcom BCM57416 NetXtreme-E Dual-port 10Gb Ethernet" },
128+
{ "Broadcom BCM57404 NetXtreme-E Ethernet Partition" },
129+
{ "Broadcom BCM57406 NetXtreme-E Ethernet Partition" },
130+
{ "Broadcom BCM57407 NetXtreme-E Dual-port 25Gb Ethernet" },
131+
{ "Broadcom BCM57414 NetXtreme-E Ethernet Partition" },
132+
{ "Broadcom BCM57416 NetXtreme-E Ethernet Partition" },
115133
{ "Broadcom BCM57304 NetXtreme-C Ethernet Virtual Function" },
116134
{ "Broadcom BCM57404 NetXtreme-E Ethernet Virtual Function" },
117135
{ "Broadcom BCM57414 NetXtreme-E Ethernet Virtual Function" },
@@ -122,19 +140,28 @@ static const struct pci_device_id bnxt_pci_tbl[] = {
122140
{ PCI_VDEVICE(BROADCOM, 0x16c8), .driver_data = BCM57301 },
123141
{ PCI_VDEVICE(BROADCOM, 0x16c9), .driver_data = BCM57302 },
124142
{ PCI_VDEVICE(BROADCOM, 0x16ca), .driver_data = BCM57304 },
143+
{ PCI_VDEVICE(BROADCOM, 0x16cc), .driver_data = BCM57417_NPAR },
125144
{ PCI_VDEVICE(BROADCOM, 0x16cd), .driver_data = BCM58700 },
126145
{ PCI_VDEVICE(BROADCOM, 0x16ce), .driver_data = BCM57311 },
127146
{ PCI_VDEVICE(BROADCOM, 0x16cf), .driver_data = BCM57312 },
128147
{ PCI_VDEVICE(BROADCOM, 0x16d0), .driver_data = BCM57402 },
129148
{ PCI_VDEVICE(BROADCOM, 0x16d1), .driver_data = BCM57404 },
130149
{ PCI_VDEVICE(BROADCOM, 0x16d2), .driver_data = BCM57406 },
131-
{ PCI_VDEVICE(BROADCOM, 0x16d4), .driver_data = BCM57404_NPAR },
150+
{ PCI_VDEVICE(BROADCOM, 0x16d4), .driver_data = BCM57402_NPAR },
151+
{ PCI_VDEVICE(BROADCOM, 0x16d5), .driver_data = BCM57407 },
132152
{ PCI_VDEVICE(BROADCOM, 0x16d6), .driver_data = BCM57412 },
133153
{ PCI_VDEVICE(BROADCOM, 0x16d7), .driver_data = BCM57414 },
134154
{ PCI_VDEVICE(BROADCOM, 0x16d8), .driver_data = BCM57416 },
135155
{ PCI_VDEVICE(BROADCOM, 0x16d9), .driver_data = BCM57417 },
136-
{ PCI_VDEVICE(BROADCOM, 0x16de), .driver_data = BCM57414_NPAR },
156+
{ PCI_VDEVICE(BROADCOM, 0x16de), .driver_data = BCM57412_NPAR },
137157
{ PCI_VDEVICE(BROADCOM, 0x16df), .driver_data = BCM57314 },
158+
{ PCI_VDEVICE(BROADCOM, 0x16e2), .driver_data = BCM57417_SFP },
159+
{ PCI_VDEVICE(BROADCOM, 0x16e3), .driver_data = BCM57416_SFP },
160+
{ PCI_VDEVICE(BROADCOM, 0x16e7), .driver_data = BCM57404_NPAR },
161+
{ PCI_VDEVICE(BROADCOM, 0x16e8), .driver_data = BCM57406_NPAR },
162+
{ PCI_VDEVICE(BROADCOM, 0x16e9), .driver_data = BCM57407_SFP },
163+
{ PCI_VDEVICE(BROADCOM, 0x16ec), .driver_data = BCM57414_NPAR },
164+
{ PCI_VDEVICE(BROADCOM, 0x16ee), .driver_data = BCM57416_NPAR },
138165
#ifdef CONFIG_BNXT_SRIOV
139166
{ PCI_VDEVICE(BROADCOM, 0x16cb), .driver_data = BCM57304_VF },
140167
{ PCI_VDEVICE(BROADCOM, 0x16d3), .driver_data = BCM57404_VF },
@@ -3240,7 +3267,7 @@ static int bnxt_hwrm_cfa_ntuple_filter_alloc(struct bnxt *bp,
32403267
struct bnxt_vnic_info *vnic = &bp->vnic_info[fltr->rxq + 1];
32413268

32423269
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_CFA_NTUPLE_FILTER_ALLOC, -1, -1);
3243-
req.l2_filter_id = bp->vnic_info[0].fw_l2_filter_id[0];
3270+
req.l2_filter_id = bp->vnic_info[0].fw_l2_filter_id[fltr->l2_fltr_idx];
32443271

32453272
req.enables = cpu_to_le32(BNXT_NTP_FLTR_FLAGS);
32463273

@@ -5790,8 +5817,12 @@ static bool bnxt_rfs_capable(struct bnxt *bp)
57905817
return false;
57915818

57925819
vnics = 1 + bp->rx_nr_rings;
5793-
if (vnics > pf->max_rsscos_ctxs || vnics > pf->max_vnics)
5820+
if (vnics > pf->max_rsscos_ctxs || vnics > pf->max_vnics) {
5821+
netdev_warn(bp->dev,
5822+
"Not enough resources to support NTUPLE filters, enough resources for up to %d rx rings\n",
5823+
min(pf->max_rsscos_ctxs - 1, pf->max_vnics - 1));
57945824
return false;
5825+
}
57955826

57965827
return true;
57975828
#else
@@ -5804,7 +5835,7 @@ static netdev_features_t bnxt_fix_features(struct net_device *dev,
58045835
{
58055836
struct bnxt *bp = netdev_priv(dev);
58065837

5807-
if (!bnxt_rfs_capable(bp))
5838+
if ((features & NETIF_F_NTUPLE) && !bnxt_rfs_capable(bp))
58085839
features &= ~NETIF_F_NTUPLE;
58095840

58105841
/* Both CTAG and STAG VLAN accelaration on the RX side have to be
@@ -6299,7 +6330,8 @@ static bool bnxt_fltr_match(struct bnxt_ntuple_filter *f1,
62996330
keys1->ports.ports == keys2->ports.ports &&
63006331
keys1->basic.ip_proto == keys2->basic.ip_proto &&
63016332
keys1->basic.n_proto == keys2->basic.n_proto &&
6302-
ether_addr_equal(f1->src_mac_addr, f2->src_mac_addr))
6333+
ether_addr_equal(f1->src_mac_addr, f2->src_mac_addr) &&
6334+
ether_addr_equal(f1->dst_mac_addr, f2->dst_mac_addr))
63036335
return true;
63046336

63056337
return false;
@@ -6312,12 +6344,28 @@ static int bnxt_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb,
63126344
struct bnxt_ntuple_filter *fltr, *new_fltr;
63136345
struct flow_keys *fkeys;
63146346
struct ethhdr *eth = (struct ethhdr *)skb_mac_header(skb);
6315-
int rc = 0, idx, bit_id;
6347+
int rc = 0, idx, bit_id, l2_idx = 0;
63166348
struct hlist_head *head;
63176349

63186350
if (skb->encapsulation)
63196351
return -EPROTONOSUPPORT;
63206352

6353+
if (!ether_addr_equal(dev->dev_addr, eth->h_dest)) {
6354+
struct bnxt_vnic_info *vnic = &bp->vnic_info[0];
6355+
int off = 0, j;
6356+
6357+
netif_addr_lock_bh(dev);
6358+
for (j = 0; j < vnic->uc_filter_count; j++, off += ETH_ALEN) {
6359+
if (ether_addr_equal(eth->h_dest,
6360+
vnic->uc_list + off)) {
6361+
l2_idx = j + 1;
6362+
break;
6363+
}
6364+
}
6365+
netif_addr_unlock_bh(dev);
6366+
if (!l2_idx)
6367+
return -EINVAL;
6368+
}
63216369
new_fltr = kzalloc(sizeof(*new_fltr), GFP_ATOMIC);
63226370
if (!new_fltr)
63236371
return -ENOMEM;
@@ -6335,6 +6383,7 @@ static int bnxt_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb,
63356383
goto err_free;
63366384
}
63376385

6386+
memcpy(new_fltr->dst_mac_addr, eth->h_dest, ETH_ALEN);
63386387
memcpy(new_fltr->src_mac_addr, eth->h_source, ETH_ALEN);
63396388

63406389
idx = skb_get_hash_raw(skb) & BNXT_NTP_FLTR_HASH_MASK;
@@ -6360,6 +6409,7 @@ static int bnxt_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb,
63606409

63616410
new_fltr->sw_id = (u16)bit_id;
63626411
new_fltr->flow_id = flow_id;
6412+
new_fltr->l2_fltr_idx = l2_idx;
63636413
new_fltr->rxq = rxq_index;
63646414
hlist_add_head_rcu(&new_fltr->hash, head);
63656415
bp->ntp_fltr_count++;

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -785,10 +785,12 @@ struct bnxt_pf_info {
785785

786786
struct bnxt_ntuple_filter {
787787
struct hlist_node hash;
788+
u8 dst_mac_addr[ETH_ALEN];
788789
u8 src_mac_addr[ETH_ALEN];
789790
struct flow_keys fkeys;
790791
__le64 filter_id;
791792
u16 sw_id;
793+
u8 l2_fltr_idx;
792794
u16 rxq;
793795
u32 flow_id;
794796
unsigned long state;

0 commit comments

Comments
 (0)