aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2016-07-26 00:43:31 -0400
committerDavid S. Miller <davem@davemloft.net>2016-07-26 00:43:31 -0400
commit16eab5598cd63c47692ab8d416ad956d53f511fa (patch)
tree3bd2ee02d36ab75b9ce9f2d6135037fa3dbc7d9a
parent59d3f1ceb69b54569685d0c34dff16a1e0816b19 (diff)
parent1f681688aaf1126df981615064a68a0dced458ef (diff)
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>
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt.c72
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt.h2
2 files changed, 63 insertions, 11 deletions
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 8a0165b0b684..2cf79100c9cb 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -73,19 +73,28 @@ enum board_idx {
73 BCM57301, 73 BCM57301,
74 BCM57302, 74 BCM57302,
75 BCM57304, 75 BCM57304,
76 BCM57417_NPAR,
76 BCM58700, 77 BCM58700,
77 BCM57311, 78 BCM57311,
78 BCM57312, 79 BCM57312,
79 BCM57402, 80 BCM57402,
80 BCM57404, 81 BCM57404,
81 BCM57406, 82 BCM57406,
82 BCM57404_NPAR, 83 BCM57402_NPAR,
84 BCM57407,
83 BCM57412, 85 BCM57412,
84 BCM57414, 86 BCM57414,
85 BCM57416, 87 BCM57416,
86 BCM57417, 88 BCM57417,
87 BCM57414_NPAR, 89 BCM57412_NPAR,
88 BCM57314, 90 BCM57314,
91 BCM57417_SFP,
92 BCM57416_SFP,
93 BCM57404_NPAR,
94 BCM57406_NPAR,
95 BCM57407_SFP,
96 BCM57414_NPAR,
97 BCM57416_NPAR,
89 BCM57304_VF, 98 BCM57304_VF,
90 BCM57404_VF, 99 BCM57404_VF,
91 BCM57414_VF, 100 BCM57414_VF,
@@ -99,19 +108,28 @@ static const struct {
99 { "Broadcom BCM57301 NetXtreme-C Single-port 10Gb Ethernet" }, 108 { "Broadcom BCM57301 NetXtreme-C Single-port 10Gb Ethernet" },
100 { "Broadcom BCM57302 NetXtreme-C Dual-port 10Gb/25Gb Ethernet" }, 109 { "Broadcom BCM57302 NetXtreme-C Dual-port 10Gb/25Gb Ethernet" },
101 { "Broadcom BCM57304 NetXtreme-C Dual-port 10Gb/25Gb/40Gb/50Gb Ethernet" }, 110 { "Broadcom BCM57304 NetXtreme-C Dual-port 10Gb/25Gb/40Gb/50Gb Ethernet" },
111 { "Broadcom BCM57417 NetXtreme-E Ethernet Partition" },
102 { "Broadcom BCM58700 Nitro 4-port 1Gb/2.5Gb/10Gb Ethernet" }, 112 { "Broadcom BCM58700 Nitro 4-port 1Gb/2.5Gb/10Gb Ethernet" },
103 { "Broadcom BCM57311 NetXtreme-C Single-port 10Gb Ethernet" }, 113 { "Broadcom BCM57311 NetXtreme-C Single-port 10Gb Ethernet" },
104 { "Broadcom BCM57312 NetXtreme-C Dual-port 10Gb/25Gb Ethernet" }, 114 { "Broadcom BCM57312 NetXtreme-C Dual-port 10Gb/25Gb Ethernet" },
105 { "Broadcom BCM57402 NetXtreme-E Dual-port 10Gb Ethernet" }, 115 { "Broadcom BCM57402 NetXtreme-E Dual-port 10Gb Ethernet" },
106 { "Broadcom BCM57404 NetXtreme-E Dual-port 10Gb/25Gb Ethernet" }, 116 { "Broadcom BCM57404 NetXtreme-E Dual-port 10Gb/25Gb Ethernet" },
107 { "Broadcom BCM57406 NetXtreme-E Dual-port 10GBase-T Ethernet" }, 117 { "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" },
109 { "Broadcom BCM57412 NetXtreme-E Dual-port 10Gb Ethernet" }, 120 { "Broadcom BCM57412 NetXtreme-E Dual-port 10Gb Ethernet" },
110 { "Broadcom BCM57414 NetXtreme-E Dual-port 10Gb/25Gb Ethernet" }, 121 { "Broadcom BCM57414 NetXtreme-E Dual-port 10Gb/25Gb Ethernet" },
111 { "Broadcom BCM57416 NetXtreme-E Dual-port 10GBase-T Ethernet" }, 122 { "Broadcom BCM57416 NetXtreme-E Dual-port 10GBase-T Ethernet" },
112 { "Broadcom BCM57417 NetXtreme-E Dual-port 10GBase-T Ethernet" }, 123 { "Broadcom BCM57417 NetXtreme-E Dual-port 10GBase-T Ethernet" },
113 { "Broadcom BCM57414 NetXtreme-E Ethernet Partition" }, 124 { "Broadcom BCM57412 NetXtreme-E Ethernet Partition" },
114 { "Broadcom BCM57314 NetXtreme-C Dual-port 10Gb/25Gb/40Gb/50Gb Ethernet" }, 125 { "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" },
115 { "Broadcom BCM57304 NetXtreme-C Ethernet Virtual Function" }, 133 { "Broadcom BCM57304 NetXtreme-C Ethernet Virtual Function" },
116 { "Broadcom BCM57404 NetXtreme-E Ethernet Virtual Function" }, 134 { "Broadcom BCM57404 NetXtreme-E Ethernet Virtual Function" },
117 { "Broadcom BCM57414 NetXtreme-E Ethernet Virtual Function" }, 135 { "Broadcom BCM57414 NetXtreme-E Ethernet Virtual Function" },
@@ -122,19 +140,28 @@ static const struct pci_device_id bnxt_pci_tbl[] = {
122 { PCI_VDEVICE(BROADCOM, 0x16c8), .driver_data = BCM57301 }, 140 { PCI_VDEVICE(BROADCOM, 0x16c8), .driver_data = BCM57301 },
123 { PCI_VDEVICE(BROADCOM, 0x16c9), .driver_data = BCM57302 }, 141 { PCI_VDEVICE(BROADCOM, 0x16c9), .driver_data = BCM57302 },
124 { PCI_VDEVICE(BROADCOM, 0x16ca), .driver_data = BCM57304 }, 142 { PCI_VDEVICE(BROADCOM, 0x16ca), .driver_data = BCM57304 },
143 { PCI_VDEVICE(BROADCOM, 0x16cc), .driver_data = BCM57417_NPAR },
125 { PCI_VDEVICE(BROADCOM, 0x16cd), .driver_data = BCM58700 }, 144 { PCI_VDEVICE(BROADCOM, 0x16cd), .driver_data = BCM58700 },
126 { PCI_VDEVICE(BROADCOM, 0x16ce), .driver_data = BCM57311 }, 145 { PCI_VDEVICE(BROADCOM, 0x16ce), .driver_data = BCM57311 },
127 { PCI_VDEVICE(BROADCOM, 0x16cf), .driver_data = BCM57312 }, 146 { PCI_VDEVICE(BROADCOM, 0x16cf), .driver_data = BCM57312 },
128 { PCI_VDEVICE(BROADCOM, 0x16d0), .driver_data = BCM57402 }, 147 { PCI_VDEVICE(BROADCOM, 0x16d0), .driver_data = BCM57402 },
129 { PCI_VDEVICE(BROADCOM, 0x16d1), .driver_data = BCM57404 }, 148 { PCI_VDEVICE(BROADCOM, 0x16d1), .driver_data = BCM57404 },
130 { PCI_VDEVICE(BROADCOM, 0x16d2), .driver_data = BCM57406 }, 149 { 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 },
132 { PCI_VDEVICE(BROADCOM, 0x16d6), .driver_data = BCM57412 }, 152 { PCI_VDEVICE(BROADCOM, 0x16d6), .driver_data = BCM57412 },
133 { PCI_VDEVICE(BROADCOM, 0x16d7), .driver_data = BCM57414 }, 153 { PCI_VDEVICE(BROADCOM, 0x16d7), .driver_data = BCM57414 },
134 { PCI_VDEVICE(BROADCOM, 0x16d8), .driver_data = BCM57416 }, 154 { PCI_VDEVICE(BROADCOM, 0x16d8), .driver_data = BCM57416 },
135 { PCI_VDEVICE(BROADCOM, 0x16d9), .driver_data = BCM57417 }, 155 { 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 },
137 { PCI_VDEVICE(BROADCOM, 0x16df), .driver_data = BCM57314 }, 157 { 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 },
138#ifdef CONFIG_BNXT_SRIOV 165#ifdef CONFIG_BNXT_SRIOV
139 { PCI_VDEVICE(BROADCOM, 0x16cb), .driver_data = BCM57304_VF }, 166 { PCI_VDEVICE(BROADCOM, 0x16cb), .driver_data = BCM57304_VF },
140 { PCI_VDEVICE(BROADCOM, 0x16d3), .driver_data = BCM57404_VF }, 167 { PCI_VDEVICE(BROADCOM, 0x16d3), .driver_data = BCM57404_VF },
@@ -3240,7 +3267,7 @@ static int bnxt_hwrm_cfa_ntuple_filter_alloc(struct bnxt *bp,
3240 struct bnxt_vnic_info *vnic = &bp->vnic_info[fltr->rxq + 1]; 3267 struct bnxt_vnic_info *vnic = &bp->vnic_info[fltr->rxq + 1];
3241 3268
3242 bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_CFA_NTUPLE_FILTER_ALLOC, -1, -1); 3269 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];
3244 3271
3245 req.enables = cpu_to_le32(BNXT_NTP_FLTR_FLAGS); 3272 req.enables = cpu_to_le32(BNXT_NTP_FLTR_FLAGS);
3246 3273
@@ -5790,8 +5817,12 @@ static bool bnxt_rfs_capable(struct bnxt *bp)
5790 return false; 5817 return false;
5791 5818
5792 vnics = 1 + bp->rx_nr_rings; 5819 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));
5794 return false; 5824 return false;
5825 }
5795 5826
5796 return true; 5827 return true;
5797#else 5828#else
@@ -5804,7 +5835,7 @@ static netdev_features_t bnxt_fix_features(struct net_device *dev,
5804{ 5835{
5805 struct bnxt *bp = netdev_priv(dev); 5836 struct bnxt *bp = netdev_priv(dev);
5806 5837
5807 if (!bnxt_rfs_capable(bp)) 5838 if ((features & NETIF_F_NTUPLE) && !bnxt_rfs_capable(bp))
5808 features &= ~NETIF_F_NTUPLE; 5839 features &= ~NETIF_F_NTUPLE;
5809 5840
5810 /* Both CTAG and STAG VLAN accelaration on the RX side have to be 5841 /* 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,
6299 keys1->ports.ports == keys2->ports.ports && 6330 keys1->ports.ports == keys2->ports.ports &&
6300 keys1->basic.ip_proto == keys2->basic.ip_proto && 6331 keys1->basic.ip_proto == keys2->basic.ip_proto &&
6301 keys1->basic.n_proto == keys2->basic.n_proto && 6332 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))
6303 return true; 6335 return true;
6304 6336
6305 return false; 6337 return false;
@@ -6312,12 +6344,28 @@ static int bnxt_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb,
6312 struct bnxt_ntuple_filter *fltr, *new_fltr; 6344 struct bnxt_ntuple_filter *fltr, *new_fltr;
6313 struct flow_keys *fkeys; 6345 struct flow_keys *fkeys;
6314 struct ethhdr *eth = (struct ethhdr *)skb_mac_header(skb); 6346 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;
6316 struct hlist_head *head; 6348 struct hlist_head *head;
6317 6349
6318 if (skb->encapsulation) 6350 if (skb->encapsulation)
6319 return -EPROTONOSUPPORT; 6351 return -EPROTONOSUPPORT;
6320 6352
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 }
6321 new_fltr = kzalloc(sizeof(*new_fltr), GFP_ATOMIC); 6369 new_fltr = kzalloc(sizeof(*new_fltr), GFP_ATOMIC);
6322 if (!new_fltr) 6370 if (!new_fltr)
6323 return -ENOMEM; 6371 return -ENOMEM;
@@ -6335,6 +6383,7 @@ static int bnxt_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb,
6335 goto err_free; 6383 goto err_free;
6336 } 6384 }
6337 6385
6386 memcpy(new_fltr->dst_mac_addr, eth->h_dest, ETH_ALEN);
6338 memcpy(new_fltr->src_mac_addr, eth->h_source, ETH_ALEN); 6387 memcpy(new_fltr->src_mac_addr, eth->h_source, ETH_ALEN);
6339 6388
6340 idx = skb_get_hash_raw(skb) & BNXT_NTP_FLTR_HASH_MASK; 6389 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,
6360 6409
6361 new_fltr->sw_id = (u16)bit_id; 6410 new_fltr->sw_id = (u16)bit_id;
6362 new_fltr->flow_id = flow_id; 6411 new_fltr->flow_id = flow_id;
6412 new_fltr->l2_fltr_idx = l2_idx;
6363 new_fltr->rxq = rxq_index; 6413 new_fltr->rxq = rxq_index;
6364 hlist_add_head_rcu(&new_fltr->hash, head); 6414 hlist_add_head_rcu(&new_fltr->hash, head);
6365 bp->ntp_fltr_count++; 6415 bp->ntp_fltr_count++;
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
index 5307a2ee6a05..23e04a6142fb 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
@@ -785,10 +785,12 @@ struct bnxt_pf_info {
785 785
786struct bnxt_ntuple_filter { 786struct bnxt_ntuple_filter {
787 struct hlist_node hash; 787 struct hlist_node hash;
788 u8 dst_mac_addr[ETH_ALEN];
788 u8 src_mac_addr[ETH_ALEN]; 789 u8 src_mac_addr[ETH_ALEN];
789 struct flow_keys fkeys; 790 struct flow_keys fkeys;
790 __le64 filter_id; 791 __le64 filter_id;
791 u16 sw_id; 792 u16 sw_id;
793 u8 l2_fltr_idx;
792 u16 rxq; 794 u16 rxq;
793 u32 flow_id; 795 u32 flow_id;
794 unsigned long state; 796 unsigned long state;