OSDN Git Service

bnxt_en: Set TPA GRO mode flags on 57500 chips properly.
authorMichael Chan <michael.chan@broadcom.com>
Mon, 29 Jul 2019 10:10:24 +0000 (06:10 -0400)
committerDavid S. Miller <davem@davemloft.net>
Mon, 29 Jul 2019 21:19:09 +0000 (14:19 -0700)
On 57500 chips, hardware GRO mode cannot be determined from the TPA
end, so we need to check bp->flags to determine if we are in hardware
GRO mode or not.  Modify bnxt_set_features so that the TPA flags
in bp->flags don't change until the device is closed.  This will ensure
that the fast path can safely rely on bp->flags to determine the
TPA mode.

Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnxt/bnxt.c

index 4a3f4ab..ef0d2c0 100644 (file)
@@ -9345,7 +9345,8 @@ static int bnxt_set_features(struct net_device *dev, netdev_features_t features)
        if (changes & BNXT_FLAG_TPA) {
                update_tpa = true;
                if ((bp->flags & BNXT_FLAG_TPA) == 0 ||
-                   (flags & BNXT_FLAG_TPA) == 0)
+                   (flags & BNXT_FLAG_TPA) == 0 ||
+                   (bp->flags & BNXT_FLAG_CHIP_P5))
                        re_init = true;
        }
 
@@ -9355,9 +9356,8 @@ static int bnxt_set_features(struct net_device *dev, netdev_features_t features)
        if (flags != bp->flags) {
                u32 old_flags = bp->flags;
 
-               bp->flags = flags;
-
                if (!test_bit(BNXT_STATE_OPEN, &bp->state)) {
+                       bp->flags = flags;
                        if (update_tpa)
                                bnxt_set_ring_params(bp);
                        return rc;
@@ -9365,12 +9365,14 @@ static int bnxt_set_features(struct net_device *dev, netdev_features_t features)
 
                if (re_init) {
                        bnxt_close_nic(bp, false, false);
+                       bp->flags = flags;
                        if (update_tpa)
                                bnxt_set_ring_params(bp);
 
                        return bnxt_open_nic(bp, false, false);
                }
                if (update_tpa) {
+                       bp->flags = flags;
                        rc = bnxt_set_tpa(bp,
                                          (flags & BNXT_FLAG_TPA) ?
                                          true : false);