]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
bnxt_en: Workaround Nitro A0 hardware RX bug (part 2).
authorPrashant Sreedharan <prashant.sreedharan@broadcom.com>
Mon, 18 Jul 2016 11:15:22 +0000 (07:15 -0400)
committerDhaval Giani <dhaval.giani@oracle.com>
Fri, 20 Jan 2017 17:58:01 +0000 (12:58 -0500)
Orabug: 24567991

The hardware is unable to drop rx packets not matching the RX filters.  To
workaround it, we create a special VNIC and configure the hardware to
direct all packets not matching the filters to it.  We then setup the
driver to drop packets received on this VNIC.

This patch creates the infrastructure for this VNIC, reserves a
completion ring, and rx rings.  Only shared completion ring mode is
supported.  The next 2 patches add a NAPI to handle packets from this
VNIC and the setup of the VNIC.

Signed-off-by: Prashant Sreedharan <prashant.sreedharan@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 765951938e2fe2e30571ef4a7de6a46659ce4c68)
Signed-off-by: Brian Maly <brian.maly@oracle.com>
Signed-off-by: Dhaval Giani <dhaval.giani@oracle.com>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

index 20501c65b6ea72da659062eb100d6e9eede6053e..82c8780f188c0eec3f581d36515b9be37dea7b5c 100644 (file)
@@ -3451,6 +3451,8 @@ static int bnxt_hwrm_vnic_cfg(struct bnxt *bp, u16 vnic_id)
                ring = 0;
        else if (vnic->flags & BNXT_VNIC_RFS_FLAG)
                ring = vnic_id - 1;
+       else if ((vnic_id == 1) && BNXT_CHIP_TYPE_NITRO_A0(bp))
+               ring = bp->rx_nr_rings - 1;
 
        grp_idx = bp->rx_ring[ring].bnapi->index;
        req.vnic_id = cpu_to_le16(vnic->fw_vnic_id);
@@ -4383,6 +4385,7 @@ static int bnxt_init_chip(struct bnxt *bp, bool irq_re_init)
 {
        struct bnxt_vnic_info *vnic = &bp->vnic_info[0];
        int rc = 0;
+       unsigned int rx_nr_rings = bp->rx_nr_rings;
 
        if (irq_re_init) {
                rc = bnxt_hwrm_stat_ctx_alloc(bp);
@@ -4405,8 +4408,11 @@ static int bnxt_init_chip(struct bnxt *bp, bool irq_re_init)
                goto err_out;
        }
 
+       if (BNXT_CHIP_TYPE_NITRO_A0(bp))
+               rx_nr_rings--;
+
        /* default vnic 0 */
-       rc = bnxt_hwrm_vnic_alloc(bp, 0, 0, bp->rx_nr_rings);
+       rc = bnxt_hwrm_vnic_alloc(bp, 0, 0, rx_nr_rings);
        if (rc) {
                netdev_err(bp->dev, "hwrm vnic alloc failure rc: %x\n", rc);
                goto err_out;
@@ -6564,7 +6570,10 @@ static void _bnxt_get_max_rings(struct bnxt *bp, int *max_rx, int *max_tx,
                *max_cp = min_t(int, *max_cp, bp->pf.max_stat_ctxs);
                max_ring_grps = bp->pf.max_hw_ring_grps;
        }
-
+       if (BNXT_CHIP_TYPE_NITRO_A0(bp) && BNXT_PF(bp)) {
+               *max_cp -= 1;
+               *max_rx -= 2;
+       }
        if (bp->flags & BNXT_FLAG_AGG_RINGS)
                *max_rx >>= 1;
        *max_rx = min_t(int, *max_rx, max_ring_grps);
@@ -6600,6 +6609,10 @@ static int bnxt_set_dflt_rings(struct bnxt *bp)
        bp->cp_nr_rings = sh ? max_t(int, bp->tx_nr_rings, bp->rx_nr_rings) :
                               bp->tx_nr_rings + bp->rx_nr_rings;
        bp->num_stat_ctxs = bp->cp_nr_rings;
+       if (BNXT_CHIP_TYPE_NITRO_A0(bp)) {
+               bp->rx_nr_rings++;
+               bp->cp_nr_rings++;
+       }
        return rc;
 }
 
index 32cf1bc71e1014766d0f91dc80e397c485cfa2c8..a23747117ab5dd517af3c2e6bb96c6e938dc605c 100644 (file)
@@ -367,9 +367,13 @@ static void bnxt_get_channels(struct net_device *dev,
        channel->max_other = 0;
        if (bp->flags & BNXT_FLAG_SHARED_RINGS) {
                channel->combined_count = bp->rx_nr_rings;
+               if (BNXT_CHIP_TYPE_NITRO_A0(bp))
+                       channel->combined_count--;
        } else {
-               channel->rx_count = bp->rx_nr_rings;
-               channel->tx_count = bp->tx_nr_rings_per_tc;
+               if (!BNXT_CHIP_TYPE_NITRO_A0(bp)) {
+                       channel->rx_count = bp->rx_nr_rings;
+                       channel->tx_count = bp->tx_nr_rings_per_tc;
+               }
        }
 }
 
@@ -392,6 +396,10 @@ static int bnxt_set_channels(struct net_device *dev,
            (channel->rx_count || channel->tx_count))
                return -EINVAL;
 
+       if (BNXT_CHIP_TYPE_NITRO_A0(bp) && (channel->rx_count ||
+                                           channel->tx_count))
+               return -EINVAL;
+
        if (channel->combined_count)
                sh = true;