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>
This commit is contained in:
commit
16eab5598c
@ -73,19 +73,28 @@ enum board_idx {
|
||||
BCM57301,
|
||||
BCM57302,
|
||||
BCM57304,
|
||||
BCM57417_NPAR,
|
||||
BCM58700,
|
||||
BCM57311,
|
||||
BCM57312,
|
||||
BCM57402,
|
||||
BCM57404,
|
||||
BCM57406,
|
||||
BCM57404_NPAR,
|
||||
BCM57402_NPAR,
|
||||
BCM57407,
|
||||
BCM57412,
|
||||
BCM57414,
|
||||
BCM57416,
|
||||
BCM57417,
|
||||
BCM57414_NPAR,
|
||||
BCM57412_NPAR,
|
||||
BCM57314,
|
||||
BCM57417_SFP,
|
||||
BCM57416_SFP,
|
||||
BCM57404_NPAR,
|
||||
BCM57406_NPAR,
|
||||
BCM57407_SFP,
|
||||
BCM57414_NPAR,
|
||||
BCM57416_NPAR,
|
||||
BCM57304_VF,
|
||||
BCM57404_VF,
|
||||
BCM57414_VF,
|
||||
@ -99,19 +108,28 @@ static const struct {
|
||||
{ "Broadcom BCM57301 NetXtreme-C Single-port 10Gb Ethernet" },
|
||||
{ "Broadcom BCM57302 NetXtreme-C Dual-port 10Gb/25Gb Ethernet" },
|
||||
{ "Broadcom BCM57304 NetXtreme-C Dual-port 10Gb/25Gb/40Gb/50Gb Ethernet" },
|
||||
{ "Broadcom BCM57417 NetXtreme-E Ethernet Partition" },
|
||||
{ "Broadcom BCM58700 Nitro 4-port 1Gb/2.5Gb/10Gb Ethernet" },
|
||||
{ "Broadcom BCM57311 NetXtreme-C Single-port 10Gb Ethernet" },
|
||||
{ "Broadcom BCM57312 NetXtreme-C Dual-port 10Gb/25Gb Ethernet" },
|
||||
{ "Broadcom BCM57402 NetXtreme-E Dual-port 10Gb Ethernet" },
|
||||
{ "Broadcom BCM57404 NetXtreme-E Dual-port 10Gb/25Gb Ethernet" },
|
||||
{ "Broadcom BCM57406 NetXtreme-E Dual-port 10GBase-T Ethernet" },
|
||||
{ "Broadcom BCM57404 NetXtreme-E Ethernet Partition" },
|
||||
{ "Broadcom BCM57402 NetXtreme-E Ethernet Partition" },
|
||||
{ "Broadcom BCM57407 NetXtreme-E Dual-port 10GBase-T Ethernet" },
|
||||
{ "Broadcom BCM57412 NetXtreme-E Dual-port 10Gb Ethernet" },
|
||||
{ "Broadcom BCM57414 NetXtreme-E Dual-port 10Gb/25Gb Ethernet" },
|
||||
{ "Broadcom BCM57416 NetXtreme-E Dual-port 10GBase-T Ethernet" },
|
||||
{ "Broadcom BCM57417 NetXtreme-E Dual-port 10GBase-T Ethernet" },
|
||||
{ "Broadcom BCM57414 NetXtreme-E Ethernet Partition" },
|
||||
{ "Broadcom BCM57412 NetXtreme-E Ethernet Partition" },
|
||||
{ "Broadcom BCM57314 NetXtreme-C Dual-port 10Gb/25Gb/40Gb/50Gb Ethernet" },
|
||||
{ "Broadcom BCM57417 NetXtreme-E Dual-port 10Gb/25Gb Ethernet" },
|
||||
{ "Broadcom BCM57416 NetXtreme-E Dual-port 10Gb Ethernet" },
|
||||
{ "Broadcom BCM57404 NetXtreme-E Ethernet Partition" },
|
||||
{ "Broadcom BCM57406 NetXtreme-E Ethernet Partition" },
|
||||
{ "Broadcom BCM57407 NetXtreme-E Dual-port 25Gb Ethernet" },
|
||||
{ "Broadcom BCM57414 NetXtreme-E Ethernet Partition" },
|
||||
{ "Broadcom BCM57416 NetXtreme-E Ethernet Partition" },
|
||||
{ "Broadcom BCM57304 NetXtreme-C Ethernet Virtual Function" },
|
||||
{ "Broadcom BCM57404 NetXtreme-E Ethernet Virtual Function" },
|
||||
{ "Broadcom BCM57414 NetXtreme-E Ethernet Virtual Function" },
|
||||
@ -122,19 +140,28 @@ static const struct pci_device_id bnxt_pci_tbl[] = {
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16c8), .driver_data = BCM57301 },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16c9), .driver_data = BCM57302 },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16ca), .driver_data = BCM57304 },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16cc), .driver_data = BCM57417_NPAR },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16cd), .driver_data = BCM58700 },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16ce), .driver_data = BCM57311 },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16cf), .driver_data = BCM57312 },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16d0), .driver_data = BCM57402 },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16d1), .driver_data = BCM57404 },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16d2), .driver_data = BCM57406 },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16d4), .driver_data = BCM57404_NPAR },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16d4), .driver_data = BCM57402_NPAR },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16d5), .driver_data = BCM57407 },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16d6), .driver_data = BCM57412 },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16d7), .driver_data = BCM57414 },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16d8), .driver_data = BCM57416 },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16d9), .driver_data = BCM57417 },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16de), .driver_data = BCM57414_NPAR },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16de), .driver_data = BCM57412_NPAR },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16df), .driver_data = BCM57314 },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16e2), .driver_data = BCM57417_SFP },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16e3), .driver_data = BCM57416_SFP },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16e7), .driver_data = BCM57404_NPAR },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16e8), .driver_data = BCM57406_NPAR },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16e9), .driver_data = BCM57407_SFP },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16ec), .driver_data = BCM57414_NPAR },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16ee), .driver_data = BCM57416_NPAR },
|
||||
#ifdef CONFIG_BNXT_SRIOV
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16cb), .driver_data = BCM57304_VF },
|
||||
{ PCI_VDEVICE(BROADCOM, 0x16d3), .driver_data = BCM57404_VF },
|
||||
@ -3240,7 +3267,7 @@ static int bnxt_hwrm_cfa_ntuple_filter_alloc(struct bnxt *bp,
|
||||
struct bnxt_vnic_info *vnic = &bp->vnic_info[fltr->rxq + 1];
|
||||
|
||||
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_CFA_NTUPLE_FILTER_ALLOC, -1, -1);
|
||||
req.l2_filter_id = bp->vnic_info[0].fw_l2_filter_id[0];
|
||||
req.l2_filter_id = bp->vnic_info[0].fw_l2_filter_id[fltr->l2_fltr_idx];
|
||||
|
||||
req.enables = cpu_to_le32(BNXT_NTP_FLTR_FLAGS);
|
||||
|
||||
@ -5790,8 +5817,12 @@ static bool bnxt_rfs_capable(struct bnxt *bp)
|
||||
return false;
|
||||
|
||||
vnics = 1 + bp->rx_nr_rings;
|
||||
if (vnics > pf->max_rsscos_ctxs || vnics > pf->max_vnics)
|
||||
if (vnics > pf->max_rsscos_ctxs || vnics > pf->max_vnics) {
|
||||
netdev_warn(bp->dev,
|
||||
"Not enough resources to support NTUPLE filters, enough resources for up to %d rx rings\n",
|
||||
min(pf->max_rsscos_ctxs - 1, pf->max_vnics - 1));
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
#else
|
||||
@ -5804,7 +5835,7 @@ static netdev_features_t bnxt_fix_features(struct net_device *dev,
|
||||
{
|
||||
struct bnxt *bp = netdev_priv(dev);
|
||||
|
||||
if (!bnxt_rfs_capable(bp))
|
||||
if ((features & NETIF_F_NTUPLE) && !bnxt_rfs_capable(bp))
|
||||
features &= ~NETIF_F_NTUPLE;
|
||||
|
||||
/* 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,
|
||||
keys1->ports.ports == keys2->ports.ports &&
|
||||
keys1->basic.ip_proto == keys2->basic.ip_proto &&
|
||||
keys1->basic.n_proto == keys2->basic.n_proto &&
|
||||
ether_addr_equal(f1->src_mac_addr, f2->src_mac_addr))
|
||||
ether_addr_equal(f1->src_mac_addr, f2->src_mac_addr) &&
|
||||
ether_addr_equal(f1->dst_mac_addr, f2->dst_mac_addr))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
@ -6312,12 +6344,28 @@ static int bnxt_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb,
|
||||
struct bnxt_ntuple_filter *fltr, *new_fltr;
|
||||
struct flow_keys *fkeys;
|
||||
struct ethhdr *eth = (struct ethhdr *)skb_mac_header(skb);
|
||||
int rc = 0, idx, bit_id;
|
||||
int rc = 0, idx, bit_id, l2_idx = 0;
|
||||
struct hlist_head *head;
|
||||
|
||||
if (skb->encapsulation)
|
||||
return -EPROTONOSUPPORT;
|
||||
|
||||
if (!ether_addr_equal(dev->dev_addr, eth->h_dest)) {
|
||||
struct bnxt_vnic_info *vnic = &bp->vnic_info[0];
|
||||
int off = 0, j;
|
||||
|
||||
netif_addr_lock_bh(dev);
|
||||
for (j = 0; j < vnic->uc_filter_count; j++, off += ETH_ALEN) {
|
||||
if (ether_addr_equal(eth->h_dest,
|
||||
vnic->uc_list + off)) {
|
||||
l2_idx = j + 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
netif_addr_unlock_bh(dev);
|
||||
if (!l2_idx)
|
||||
return -EINVAL;
|
||||
}
|
||||
new_fltr = kzalloc(sizeof(*new_fltr), GFP_ATOMIC);
|
||||
if (!new_fltr)
|
||||
return -ENOMEM;
|
||||
@ -6335,6 +6383,7 @@ static int bnxt_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb,
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
memcpy(new_fltr->dst_mac_addr, eth->h_dest, ETH_ALEN);
|
||||
memcpy(new_fltr->src_mac_addr, eth->h_source, ETH_ALEN);
|
||||
|
||||
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,
|
||||
|
||||
new_fltr->sw_id = (u16)bit_id;
|
||||
new_fltr->flow_id = flow_id;
|
||||
new_fltr->l2_fltr_idx = l2_idx;
|
||||
new_fltr->rxq = rxq_index;
|
||||
hlist_add_head_rcu(&new_fltr->hash, head);
|
||||
bp->ntp_fltr_count++;
|
||||
|
@ -785,10 +785,12 @@ struct bnxt_pf_info {
|
||||
|
||||
struct bnxt_ntuple_filter {
|
||||
struct hlist_node hash;
|
||||
u8 dst_mac_addr[ETH_ALEN];
|
||||
u8 src_mac_addr[ETH_ALEN];
|
||||
struct flow_keys fkeys;
|
||||
__le64 filter_id;
|
||||
u16 sw_id;
|
||||
u8 l2_fltr_idx;
|
||||
u16 rxq;
|
||||
u32 flow_id;
|
||||
unsigned long state;
|
||||
|
Loading…
Reference in New Issue
Block a user