|
@@ -4554,23 +4554,38 @@ static u8 i40e_get_iscsi_tc_map(struct i40e_pf *pf)
|
|
|
**/
|
|
|
static u8 i40e_dcb_get_num_tc(struct i40e_dcbx_config *dcbcfg)
|
|
|
{
|
|
|
+ int i, tc_unused = 0;
|
|
|
u8 num_tc = 0;
|
|
|
- int i;
|
|
|
+ u8 ret = 0;
|
|
|
|
|
|
/* Scan the ETS Config Priority Table to find
|
|
|
* traffic class enabled for a given priority
|
|
|
- * and use the traffic class index to get the
|
|
|
- * number of traffic classes enabled
|
|
|
+ * and create a bitmask of enabled TCs
|
|
|
*/
|
|
|
- for (i = 0; i < I40E_MAX_USER_PRIORITY; i++) {
|
|
|
- if (dcbcfg->etscfg.prioritytable[i] > num_tc)
|
|
|
- num_tc = dcbcfg->etscfg.prioritytable[i];
|
|
|
- }
|
|
|
+ for (i = 0; i < I40E_MAX_USER_PRIORITY; i++)
|
|
|
+ num_tc |= BIT(dcbcfg->etscfg.prioritytable[i]);
|
|
|
|
|
|
- /* Traffic class index starts from zero so
|
|
|
- * increment to return the actual count
|
|
|
+ /* Now scan the bitmask to check for
|
|
|
+ * contiguous TCs starting with TC0
|
|
|
*/
|
|
|
- return num_tc + 1;
|
|
|
+ for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
|
|
|
+ if (num_tc & BIT(i)) {
|
|
|
+ if (!tc_unused) {
|
|
|
+ ret++;
|
|
|
+ } else {
|
|
|
+ pr_err("Non-contiguous TC - Disabling DCB\n");
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ tc_unused = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /* There is always at least TC0 */
|
|
|
+ if (!ret)
|
|
|
+ ret = 1;
|
|
|
+
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
/**
|