Commit ab2ed5d7 authored by Dave Ertman's avatar Dave Ertman Committed by Tony Nguyen
Browse files

ice: enforce no DCB config changing when in bond



To support SRIOV LAG, the driver cannot allow changes to an interface's DCB
configuration when in a bond.  This would break the ability to modify
interfaces Tx scheduling for fail-over interfaces.

Block kernel generated DCB config events when in a bond.

Reviewed-by: default avatarDaniel Machon <daniel.machon@microchip.com>
Signed-off-by: default avatarDave Ertman <david.m.ertman@intel.com>
Tested-by: default avatarSujai Buvaneswaran <sujai.buvaneswaran@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent bf65da2e
Loading
Loading
Loading
Loading
+50 −0
Original line number Diff line number Diff line
@@ -70,6 +70,11 @@ static int ice_dcbnl_setets(struct net_device *netdev, struct ieee_ets *ets)
	    !(pf->dcbx_cap & DCB_CAP_DCBX_VER_IEEE))
		return -EINVAL;

	if (pf->lag && pf->lag->bonded) {
		netdev_err(netdev, "DCB changes not allowed when in a bond\n");
		return -EINVAL;
	}

	new_cfg = &pf->hw.port_info->qos_cfg.desired_dcbx_cfg;

	mutex_lock(&pf->tc_mutex);
@@ -170,6 +175,11 @@ static u8 ice_dcbnl_setdcbx(struct net_device *netdev, u8 mode)
	if (mode == pf->dcbx_cap)
		return ICE_DCB_NO_HW_CHG;

	if (pf->lag && pf->lag->bonded) {
		netdev_err(netdev, "DCB changes not allowed when in a bond\n");
		return ICE_DCB_NO_HW_CHG;
	}

	qos_cfg = &pf->hw.port_info->qos_cfg;

	/* DSCP configuration is not DCBx negotiated */
@@ -261,6 +271,11 @@ static int ice_dcbnl_setpfc(struct net_device *netdev, struct ieee_pfc *pfc)
	    !(pf->dcbx_cap & DCB_CAP_DCBX_VER_IEEE))
		return -EINVAL;

	if (pf->lag && pf->lag->bonded) {
		netdev_err(netdev, "DCB changes not allowed when in a bond\n");
		return -EINVAL;
	}

	mutex_lock(&pf->tc_mutex);

	new_cfg = &pf->hw.port_info->qos_cfg.desired_dcbx_cfg;
@@ -323,6 +338,11 @@ static void ice_dcbnl_set_pfc_cfg(struct net_device *netdev, int prio, u8 set)
	if (prio >= ICE_MAX_USER_PRIORITY)
		return;

	if (pf->lag && pf->lag->bonded) {
		netdev_err(netdev, "DCB changes not allowed when in a bond\n");
		return;
	}

	new_cfg = &pf->hw.port_info->qos_cfg.desired_dcbx_cfg;

	new_cfg->pfc.pfccap = pf->hw.func_caps.common_cap.maxtc;
@@ -379,6 +399,11 @@ static u8 ice_dcbnl_setstate(struct net_device *netdev, u8 state)
	    !(pf->dcbx_cap & DCB_CAP_DCBX_VER_CEE))
		return ICE_DCB_NO_HW_CHG;

	if (pf->lag && pf->lag->bonded) {
		netdev_err(netdev, "DCB changes not allowed when in a bond\n");
		return ICE_DCB_NO_HW_CHG;
	}

	/* Nothing to do */
	if (!!state == test_bit(ICE_FLAG_DCB_ENA, pf->flags))
		return ICE_DCB_NO_HW_CHG;
@@ -451,6 +476,11 @@ ice_dcbnl_set_pg_tc_cfg_tx(struct net_device *netdev, int tc,
	if (tc >= ICE_MAX_TRAFFIC_CLASS)
		return;

	if (pf->lag && pf->lag->bonded) {
		netdev_err(netdev, "DCB changes not allowed when in a bond\n");
		return;
	}

	new_cfg = &pf->hw.port_info->qos_cfg.desired_dcbx_cfg;

	/* prio_type, bwg_id and bw_pct per UP are not supported */
@@ -505,6 +535,11 @@ ice_dcbnl_set_pg_bwg_cfg_tx(struct net_device *netdev, int pgid, u8 bw_pct)
	if (pgid >= ICE_MAX_TRAFFIC_CLASS)
		return;

	if (pf->lag && pf->lag->bonded) {
		netdev_err(netdev, "DCB changes not allowed when in a bond\n");
		return;
	}

	new_cfg = &pf->hw.port_info->qos_cfg.desired_dcbx_cfg;

	new_cfg->etscfg.tcbwtable[pgid] = bw_pct;
@@ -725,6 +760,11 @@ static int ice_dcbnl_setapp(struct net_device *netdev, struct dcb_app *app)
		return -EINVAL;
	}

	if (pf->lag && pf->lag->bonded) {
		netdev_err(netdev, "DCB changes not allowed when in a bond\n");
		return -EINVAL;
	}

	max_tc = pf->hw.func_caps.common_cap.maxtc;
	if (app->priority >= max_tc) {
		netdev_err(netdev, "TC %d out of range, max TC %d\n",
@@ -836,6 +876,11 @@ static int ice_dcbnl_delapp(struct net_device *netdev, struct dcb_app *app)
		return -EINVAL;
	}

	if (pf->lag && pf->lag->bonded) {
		netdev_err(netdev, "DCB changes not allowed when in a bond\n");
		return -EINVAL;
	}

	mutex_lock(&pf->tc_mutex);
	old_cfg = &pf->hw.port_info->qos_cfg.local_dcbx_cfg;

@@ -937,6 +982,11 @@ static u8 ice_dcbnl_cee_set_all(struct net_device *netdev)
	    !(pf->dcbx_cap & DCB_CAP_DCBX_VER_CEE))
		return ICE_DCB_NO_HW_CHG;

	if (pf->lag && pf->lag->bonded) {
		netdev_err(netdev, "DCB changes not allowed when in a bond\n");
		return ICE_DCB_NO_HW_CHG;
	}

	new_cfg = &pf->hw.port_info->qos_cfg.desired_dcbx_cfg;

	mutex_lock(&pf->tc_mutex);