@@ -1174,7 +1174,7 @@ struct bnx2x {
#define USING_MSIX_FLAG (1 << 5)
#define USING_MSI_FLAG (1 << 6)
#define DISABLE_MSI_FLAG (1 << 7)
-#define TPA_ENABLE_FLAG (1 << 8)
+
#define NO_MCP_FLAG (1 << 9)
#define BP_NOMCP(bp) (bp->flags & NO_MCP_FLAG)
@@ -62,7 +62,7 @@ static inline void bnx2x_bz_fp(struct bnx2x *bp, int index)
* set the tpa flag for each queue. The tpa flag determines the queue
* minimal size so it must be set prior to queue memory allocation
*/
- fp->disable_tpa = ((bp->flags & TPA_ENABLE_FLAG) == 0);
+ fp->disable_tpa = !(bp->dev->features & NETIF_F_LRO);
#ifdef BCM_CNIC
/* We don't want TPA on an FCoE L2 ring */
@@ -3410,13 +3410,10 @@ u32 bnx2x_fix_features(struct net_device *dev, u32 features)
int bnx2x_set_features(struct net_device *dev, u32 features)
{
struct bnx2x *bp = netdev_priv(dev);
- u32 flags = bp->flags;
bool bnx2x_reload = false;
- if (features & NETIF_F_LRO)
- flags |= TPA_ENABLE_FLAG;
- else
- flags &= ~TPA_ENABLE_FLAG;
+ if ((features ^ dev->features) & NETIF_F_LRO)
+ bnx2x_reload = true;
if (features & NETIF_F_LOOPBACK) {
if (bp->link_params.loopback_mode != LOOPBACK_BMAC) {
@@ -3430,14 +3427,22 @@ int bnx2x_set_features(struct net_device *dev, u32 features)
}
}
- if (flags ^ bp->flags) {
- bp->flags = flags;
- bnx2x_reload = true;
- }
-
if (bnx2x_reload) {
- if (bp->recovery_state == BNX2X_RECOVERY_DONE)
- return bnx2x_reload_if_running(dev);
+ if (bp->recovery_state == BNX2X_RECOVERY_DONE) {
+ /*
+ * Cheat! Normally dev->features will be set after we
+ * return, but that's too late. We need to know how to
+ * configure the NIC when reloading it, so copy the
+ * features beforehand. Restore them after reload to
+ * avoid any possible confusion of the caller.
+ */
+ int ret;
+ u32 orig_features = dev->features;
+ dev->features = features;
+ ret = bnx2x_reload_if_running(dev);
+ dev->features = orig_features;
+ return ret;
+ }
/* else: bnx2x_nic_load() will be called at end of recovery */
}
@@ -9757,13 +9757,10 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp)
bp->multi_mode = multi_mode;
/* Set TPA flags */
- if (disable_tpa) {
- bp->flags &= ~TPA_ENABLE_FLAG;
+ if (disable_tpa)
bp->dev->features &= ~NETIF_F_LRO;
- } else {
- bp->flags |= TPA_ENABLE_FLAG;
+ else
bp->dev->features |= NETIF_F_LRO;
- }
bp->disable_tpa = disable_tpa;
if (CHIP_IS_E1(bp))