@@ -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 ++ ;
0 commit comments