When configuring LRO/GRO/HDS, a new set of RX Aggregation rings may be required. It is possible that the FW cannot grant the desired number of Agg rings, causing the driver to reduce the number of ethtool channels to adjust. This means that the number of IRQs/NAPIs may change and we must set irq_re_init to true to make that work. Without this patch, when the driver is eventually shutdown, some memory for the unused NAPIs may never be freed properly if the rings have shrunk. Fixes: 87c8f8496a05 ("bnxt_en: add support for tcp-data-split ethtool command") Fixes: c0c050c58d84 ("bnxt_en: New Broadcom ethernet driver.") Reviewed-by: Andy Gospodarek Signed-off-by: Michael Chan --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 11 ++++++++--- drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 10 ++++++++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index aa40d5fd05da..bf902da945cb 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -14116,10 +14116,11 @@ static int bnxt_set_features(struct net_device *dev, netdev_features_t features) { bool update_tpa = false, update_ntuple = false; struct bnxt *bp = netdev_priv(dev); + bool irq_re_init = false; u32 flags = bp->flags; + bool re_init = false; u32 changes; int rc = 0; - bool re_init = false; bp->tx_wake_thresh = max_t(int, bp->tx_ring_size / 2, bnxt_min_tx_desc_cnt(bp, features)); @@ -14146,8 +14147,12 @@ static int bnxt_set_features(struct net_device *dev, netdev_features_t features) update_tpa = true; if ((bp->flags & BNXT_FLAG_TPA) == 0 || (flags & BNXT_FLAG_TPA) == 0 || - (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)) + (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)) { re_init = true; + if (!(bp->flags & BNXT_FLAG_AGG_RINGS) && + (flags & BNXT_FLAG_AGG_RINGS)) + irq_re_init = true; + } } if (changes & ~BNXT_FLAG_TPA) @@ -14170,7 +14175,7 @@ static int bnxt_set_features(struct net_device *dev, netdev_features_t features) return bnxt_reinit_features(bp, true, false, flags, update_tpa); if (re_init) - return bnxt_reinit_features(bp, false, false, flags, update_tpa); + return bnxt_reinit_features(bp, irq_re_init, false, flags, update_tpa); if (update_tpa) { bp->flags = flags; diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c index 622e89587e5d..5c9e770960e6 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c @@ -853,6 +853,7 @@ static int bnxt_set_ringparam(struct net_device *dev, { u8 tcp_data_split = kernel_ering->tcp_data_split; struct bnxt *bp = netdev_priv(dev); + bool irq_re_init = false; u8 hds_config_mod; int rc; @@ -876,8 +877,13 @@ static int bnxt_set_ringparam(struct net_device *dev, return -EINVAL; } + if (hds_config_mod && + tcp_data_split == ETHTOOL_TCP_DATA_SPLIT_ENABLED && + !(bp->flags & BNXT_FLAG_AGG_RINGS)) + irq_re_init = true; + if (netif_running(dev)) - bnxt_close_nic(bp, false, false); + bnxt_close_nic(bp, irq_re_init, false); if (hds_config_mod) { if (tcp_data_split == ETHTOOL_TCP_DATA_SPLIT_ENABLED) @@ -891,7 +897,7 @@ static int bnxt_set_ringparam(struct net_device *dev, bnxt_set_ring_params(bp); if (netif_running(dev)) { - rc = bnxt_open_nic(bp, false, false); + rc = bnxt_open_nic(bp, irq_re_init, false); if (rc) return rc; } -- 2.51.0