diff options
author | David S. Miller <davem@davemloft.net> | 2016-07-26 00:43:31 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-07-26 00:43:31 -0400 |
commit | 16eab5598cd63c47692ab8d416ad956d53f511fa (patch) | |
tree | 3bd2ee02d36ab75b9ce9f2d6135037fa3dbc7d9a | |
parent | 59d3f1ceb69b54569685d0c34dff16a1e0816b19 (diff) | |
parent | 1f681688aaf1126df981615064a68a0dced458ef (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.c | 72 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnxt/bnxt.h | 2 |
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 | ||
786 | struct bnxt_ntuple_filter { | 786 | struct 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; |