Skip to content

Commit

Permalink
ice: support non-standard teardown of bond interface
Browse files Browse the repository at this point in the history
Code for supporting removal of the PF driver (NETDEV_UNREGISTER) events for
both when the bond has the primary interface as active and when failed over
to thew secondary interface.

Reviewed-by: Daniel Machon <daniel.machon@microchip.com>
Signed-off-by: Dave Ertman <david.m.ertman@intel.com>
Tested-by: Sujai Buvaneswaran <sujai.buvaneswaran@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
  • Loading branch information
Dave Ertman authored and Tony Nguyen committed Jul 27, 2023
1 parent 1e0f988 commit ba789fb
Showing 1 changed file with 40 additions and 7 deletions.
47 changes: 40 additions & 7 deletions drivers/net/ethernet/intel/ice/ice_lag.c
Original file line number Diff line number Diff line change
Expand Up @@ -1190,15 +1190,16 @@ static void ice_lag_changeupper_event(struct ice_lag *lag, void *ptr)
if (!primary_lag && lag->primary)
primary_lag = lag;

if (primary_lag) {
if (!lag->primary) {
ice_lag_set_swid(0, lag, false);
} else {
if (!lag->primary) {
ice_lag_set_swid(0, lag, false);
} else {
if (primary_lag && lag->primary) {
ice_lag_primary_swid(lag, false);
ice_lag_del_prune_list(primary_lag, lag->pf);
}
ice_lag_cfg_cp_fltr(lag, false);
}
/* remove filter for control packets */
ice_lag_cfg_cp_fltr(lag, false);
}
}

Expand Down Expand Up @@ -1401,6 +1402,38 @@ ice_lag_chk_comp(struct ice_lag *lag, void *ptr)
static void
ice_lag_unregister(struct ice_lag *lag, struct net_device *event_netdev)
{
struct ice_netdev_priv *np;
struct ice_pf *event_pf;
struct ice_lag *p_lag;

p_lag = ice_lag_find_primary(lag);
np = netdev_priv(event_netdev);
event_pf = np->vsi->back;

if (p_lag) {
if (p_lag->active_port != p_lag->pf->hw.port_info->lport &&
p_lag->active_port != ICE_LAG_INVALID_PORT) {
struct ice_hw *active_hw;

active_hw = ice_lag_find_hw_by_lport(lag,
p_lag->active_port);
if (active_hw)
ice_lag_reclaim_vf_nodes(p_lag, active_hw);
lag->active_port = ICE_LAG_INVALID_PORT;
}
}

/* primary processing for primary */
if (lag->primary && lag->netdev == event_netdev)
ice_lag_primary_swid(lag, false);

/* primary processing for secondary */
if (lag->primary && lag->netdev != event_netdev)
ice_lag_del_prune_list(lag, event_pf);

/* secondary processing for secondary */
if (!lag->primary && lag->netdev == event_netdev)
ice_lag_set_swid(0, lag, false);
}

/**
Expand Down Expand Up @@ -1470,8 +1503,8 @@ static void ice_lag_process_event(struct work_struct *work)
case NETDEV_UNREGISTER:
if (ice_is_feature_supported(pf, ICE_F_SRIOV_LAG)) {
netdev = lag_work->info.bonding_info.info.dev;
if (netdev == lag_work->lag->netdev &&
lag_work->lag->bonded)
if ((netdev == lag_work->lag->netdev ||
lag_work->lag->primary) && lag_work->lag->bonded)
ice_lag_unregister(lag_work->lag, netdev);
}
break;
Expand Down

0 comments on commit ba789fb

Please sign in to comment.