}
 }
 
+/**
+ * ice_dcb_bwchk - check if ETS bandwidth input parameters are correct
+ * @pf: pointer to the PF struct
+ * @dcbcfg: pointer to DCB config structure
+ */
+int ice_dcb_bwchk(struct ice_pf *pf, struct ice_dcbx_cfg *dcbcfg)
+{
+       struct ice_dcb_ets_cfg *etscfg = &dcbcfg->etscfg;
+       u8 num_tc, total_bw = 0;
+       int i;
+
+       /* returns number of contigous TCs and 1 TC for non-contigous TCs,
+        * since at least 1 TC has to be configured
+        */
+       num_tc = ice_dcb_get_num_tc(dcbcfg);
+
+       /* no bandwidth checks required if there's only one TC, so assign
+        * all bandwidth to TC0 and return
+        */
+       if (num_tc == 1) {
+               etscfg->tcbwtable[0] = ICE_TC_MAX_BW;
+               return 0;
+       }
+
+       for (i = 0; i < num_tc; i++)
+               total_bw += etscfg->tcbwtable[i];
+
+       if (!total_bw) {
+               etscfg->tcbwtable[0] = ICE_TC_MAX_BW;
+       } else if (total_bw != ICE_TC_MAX_BW) {
+               dev_err(ice_pf_to_dev(pf), "Invalid config, total bandwidth must equal 100\n");
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
 /**
  * ice_pf_dcb_cfg - Apply new DCB configuration
  * @pf: pointer to the PF struct
                return ret;
        }
 
+       if (ice_dcb_bwchk(pf, new_cfg))
+               return -EINVAL;
+
        /* Store old config in case FW config fails */
        old_cfg = kmemdup(curr_cfg, sizeof(*old_cfg), GFP_KERNEL);
        if (!old_cfg)
 
 u8 ice_dcb_get_tc(struct ice_vsi *vsi, int queue_index);
 int
 ice_pf_dcb_cfg(struct ice_pf *pf, struct ice_dcbx_cfg *new_cfg, bool locked);
+int ice_dcb_bwchk(struct ice_pf *pf, struct ice_dcbx_cfg *dcbcfg);
 void ice_pf_dcb_recfg(struct ice_pf *pf);
 void ice_vsi_cfg_dcb_rings(struct ice_vsi *vsi);
 int ice_init_pf_dcb(struct ice_pf *pf, bool locked);
 
                new_cfg->etsrec.prio_table[i] = ets->reco_prio_tc[i];
        }
 
+       if (ice_dcb_bwchk(pf, new_cfg)) {
+               err = -EINVAL;
+               goto ets_out;
+       }
+
        /* max_tc is a 1-8 value count of number of TC's, not a 0-7 value
         * for the TC's index number.  Add one to value if not zero, and
         * for zero set it to the FW's default value
        if (err == ICE_DCB_NO_HW_CHG)
                err = ICE_DCB_HW_CHG_RST;
 
+ets_out:
        mutex_unlock(&pf->tc_mutex);
        return err;
 }