]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
bnxt_en: Add new hardware RFS mode.
authorMichael Chan <michael.chan@broadcom.com>
Thu, 29 Dec 2016 17:13:38 +0000 (12:13 -0500)
committerChuck Anderson <chuck.anderson@oracle.com>
Mon, 6 Mar 2017 21:35:20 +0000 (13:35 -0800)
Orabug: 25645429

The existing hardware RFS mode uses one hardware RSS context block
per ring just to calculate the RSS hash.  This is very wasteful and
prevents VF functions from using it.  The new hardware mode shares
the same hardware RSS context for RSS placement and RFS steering.
This allows VFs to enable RFS.

Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit ae10ae740ad2befd92b6f5b2ab39220bce6e5da2)
Signed-off-by: Brian Maly <brian.maly@oracle.com>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h

index ff2a73c2c50ca20b3604d45ab3a4b5c73e77e627..e65d191ebc220ac50047937bbab9043448c07770 100644 (file)
@@ -2633,6 +2633,10 @@ static int bnxt_alloc_vnic_attributes(struct bnxt *bp)
                        goto out;
                }
 
+               if ((bp->flags & BNXT_FLAG_NEW_RSS_CAP) &&
+                   !(vnic->flags & BNXT_VNIC_RSS_FLAG))
+                       continue;
+
                /* Allocate rss table and hash key */
                vnic->rss_table = dma_alloc_coherent(&pdev->dev, PAGE_SIZE,
                                                     &vnic->rss_table_dma_addr,
@@ -3579,6 +3583,12 @@ int bnxt_hwrm_vnic_cfg(struct bnxt *bp, u16 vnic_id)
                req.rss_rule = cpu_to_le16(vnic->fw_rss_cos_lb_ctx[0]);
                req.enables |= cpu_to_le32(VNIC_CFG_REQ_ENABLES_RSS_RULE |
                                           VNIC_CFG_REQ_ENABLES_MRU);
+       } else if (vnic->flags & BNXT_VNIC_RFS_NEW_RSS_FLAG) {
+               req.rss_rule =
+                       cpu_to_le16(bp->vnic_info[0].fw_rss_cos_lb_ctx[0]);
+               req.enables |= cpu_to_le32(VNIC_CFG_REQ_ENABLES_RSS_RULE |
+                                          VNIC_CFG_REQ_ENABLES_MRU);
+               req.flags |= cpu_to_le32(VNIC_CFG_REQ_FLAGS_RSS_DFLT_CR_MODE);
        } else {
                req.rss_rule = cpu_to_le16(0xffff);
        }
@@ -4507,8 +4517,12 @@ static void bnxt_hwrm_resource_free(struct bnxt *bp, bool close_path,
 
 static int bnxt_setup_vnic(struct bnxt *bp, u16 vnic_id)
 {
+       struct bnxt_vnic_info *vnic = &bp->vnic_info[vnic_id];
        int rc;
 
+       if (vnic->flags & BNXT_VNIC_RFS_NEW_RSS_FLAG)
+               goto skip_rss_ctx;
+
        /* allocate context for vnic */
        rc = bnxt_hwrm_vnic_ctx_alloc(bp, vnic_id, 0);
        if (rc) {
@@ -4528,6 +4542,7 @@ static int bnxt_setup_vnic(struct bnxt *bp, u16 vnic_id)
                bp->rsscos_nr_ctxs++;
        }
 
+skip_rss_ctx:
        /* configure default vnic, ring grp */
        rc = bnxt_hwrm_vnic_cfg(bp, vnic_id);
        if (rc) {
@@ -4562,13 +4577,17 @@ static int bnxt_alloc_rfs_vnics(struct bnxt *bp)
        int i, rc = 0;
 
        for (i = 0; i < bp->rx_nr_rings; i++) {
+               struct bnxt_vnic_info *vnic;
                u16 vnic_id = i + 1;
                u16 ring_id = i;
 
                if (vnic_id >= bp->nr_vnics)
                        break;
 
-               bp->vnic_info[vnic_id].flags |= BNXT_VNIC_RFS_FLAG;
+               vnic = &bp->vnic_info[vnic_id];
+               vnic->flags |= BNXT_VNIC_RFS_FLAG;
+               if (bp->flags & BNXT_FLAG_NEW_RSS_CAP)
+                       vnic->flags |= BNXT_VNIC_RFS_NEW_RSS_FLAG;
                rc = bnxt_hwrm_vnic_alloc(bp, vnic_id, ring_id, 1);
                if (rc) {
                        netdev_err(bp->dev, "hwrm vnic %d alloc failure rc: %x\n",
@@ -6004,6 +6023,8 @@ static bool bnxt_rfs_supported(struct bnxt *bp)
 {
        if (BNXT_PF(bp) && !BNXT_CHIP_TYPE_NITRO_A0(bp))
                return true;
+       if (bp->flags & BNXT_FLAG_NEW_RSS_CAP)
+               return true;
        return false;
 }
 
@@ -6019,6 +6040,10 @@ static bool bnxt_rfs_capable(struct bnxt *bp)
        vnics = 1 + bp->rx_nr_rings;
        max_vnics = bnxt_get_max_func_vnics(bp);
        max_rss_ctxs = bnxt_get_max_func_rss_ctxs(bp);
+
+       /* RSS contexts not a limiting factor */
+       if (bp->flags & BNXT_FLAG_NEW_RSS_CAP)
+               max_rss_ctxs = max_vnics;
        if (vnics > max_vnics || vnics > max_rss_ctxs) {
                netdev_warn(bp->dev,
                            "Not enough resources to support NTUPLE filters, enough resources for up to %d rx rings\n",
index 80bf1ab7df8c321d9d4118b1c966e69c853f8393..75803e5f3bf5368964371a620b99b090e778cfb7 100644 (file)
@@ -708,6 +708,7 @@ struct bnxt_vnic_info {
 #define BNXT_VNIC_RFS_FLAG     2
 #define BNXT_VNIC_MCAST_FLAG   4
 #define BNXT_VNIC_UCAST_FLAG   8
+#define BNXT_VNIC_RFS_NEW_RSS_FLAG     0x10
 };
 
 #if defined(CONFIG_BNXT_SRIOV)