ice: enforce no DCB config changing when in bond
authorDave Ertman <david.m.ertman@intel.com>
Tue, 20 Jun 2023 22:18:53 +0000 (15:18 -0700)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Thu, 27 Jul 2023 17:56:32 +0000 (10:56 -0700)
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: 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>
drivers/net/ethernet/intel/ice/ice_dcb_nl.c

index 3eb0173..e1fbc6d 100644 (file)
@@ -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);