return ret;
 }
 
+/**
+ * ice_cfg_etsrec_defaults - Set default ETS recommended DCB config
+ * @pi: port information structure
+ */
+static void ice_cfg_etsrec_defaults(struct ice_port_info *pi)
+{
+       struct ice_dcbx_cfg *dcbcfg = &pi->local_dcbx_cfg;
+       u8 i;
+
+       /* Ensure ETS recommended DCB configuration is not already set */
+       if (dcbcfg->etsrec.maxtcs)
+               return;
+
+       /* In CEE mode, set the default to 1 TC */
+       dcbcfg->etsrec.maxtcs = 1;
+       for (i = 0; i < ICE_MAX_TRAFFIC_CLASS; i++) {
+               dcbcfg->etsrec.tcbwtable[i] = i ? 0 : 100;
+               dcbcfg->etsrec.tsatable[i] = i ? ICE_IEEE_TSA_STRICT :
+                                                ICE_IEEE_TSA_ETS;
+       }
+}
+
+/**
+ * ice_dcb_need_recfg - Check if DCB needs reconfig
+ * @pf: board private structure
+ * @old_cfg: current DCB config
+ * @new_cfg: new DCB config
+ */
+static bool
+ice_dcb_need_recfg(struct ice_pf *pf, struct ice_dcbx_cfg *old_cfg,
+                  struct ice_dcbx_cfg *new_cfg)
+{
+       bool need_reconfig = false;
+
+       /* Check if ETS configuration has changed */
+       if (memcmp(&new_cfg->etscfg, &old_cfg->etscfg,
+                  sizeof(new_cfg->etscfg))) {
+               /* If Priority Table has changed reconfig is needed */
+               if (memcmp(&new_cfg->etscfg.prio_table,
+                          &old_cfg->etscfg.prio_table,
+                          sizeof(new_cfg->etscfg.prio_table))) {
+                       need_reconfig = true;
+                       dev_dbg(&pf->pdev->dev, "ETS UP2TC changed.\n");
+               }
+
+               if (memcmp(&new_cfg->etscfg.tcbwtable,
+                          &old_cfg->etscfg.tcbwtable,
+                          sizeof(new_cfg->etscfg.tcbwtable)))
+                       dev_dbg(&pf->pdev->dev, "ETS TC BW Table changed.\n");
+
+               if (memcmp(&new_cfg->etscfg.tsatable,
+                          &old_cfg->etscfg.tsatable,
+                          sizeof(new_cfg->etscfg.tsatable)))
+                       dev_dbg(&pf->pdev->dev, "ETS TSA Table changed.\n");
+       }
+
+       /* Check if PFC configuration has changed */
+       if (memcmp(&new_cfg->pfc, &old_cfg->pfc, sizeof(new_cfg->pfc))) {
+               need_reconfig = true;
+               dev_dbg(&pf->pdev->dev, "PFC config change detected.\n");
+       }
+
+       /* Check if APP Table has changed */
+       if (memcmp(&new_cfg->app, &old_cfg->app, sizeof(new_cfg->app))) {
+               need_reconfig = true;
+               dev_dbg(&pf->pdev->dev, "APP Table change detected.\n");
+       }
+
+       dev_dbg(&pf->pdev->dev, "dcb need_reconfig=%d\n", need_reconfig);
+       return need_reconfig;
+}
+
 /**
  * ice_dcb_rebuild - rebuild DCB post reset
  * @pf: physical function instance
  */
 void ice_dcb_rebuild(struct ice_pf *pf)
 {
+       struct ice_dcbx_cfg *local_dcbx_cfg, *desired_dcbx_cfg, *prev_cfg;
        struct ice_aqc_port_ets_elem buf = { 0 };
-       struct ice_dcbx_cfg *prev_cfg;
        enum ice_status ret;
-       u8 willing;
 
        ret = ice_query_port_ets(pf->hw.port_info, &buf, sizeof(buf), NULL);
        if (ret) {
        if (!test_bit(ICE_FLAG_DCB_ENA, pf->flags))
                return;
 
+       local_dcbx_cfg = &pf->hw.port_info->local_dcbx_cfg;
+       desired_dcbx_cfg = &pf->hw.port_info->desired_dcbx_cfg;
+
        /* Save current willing state and force FW to unwilling */
-       willing = pf->hw.port_info->local_dcbx_cfg.etscfg.willing;
-       pf->hw.port_info->local_dcbx_cfg.etscfg.willing = 0x0;
+       local_dcbx_cfg->etscfg.willing = 0x0;
+       local_dcbx_cfg->pfc.willing = 0x0;
+       local_dcbx_cfg->app_mode = ICE_DCBX_APPS_NON_WILLING;
+
+       ice_cfg_etsrec_defaults(pf->hw.port_info);
        ret = ice_set_dcb_cfg(pf->hw.port_info);
        if (ret) {
                dev_err(&pf->pdev->dev, "Failed to set DCB to unwilling\n");
        }
 
        /* Retrieve DCB config and ensure same as current in SW */
-       prev_cfg = devm_kmemdup(&pf->pdev->dev,
-                               &pf->hw.port_info->local_dcbx_cfg,
+       prev_cfg = devm_kmemdup(&pf->pdev->dev, local_dcbx_cfg,
                                sizeof(*prev_cfg), GFP_KERNEL);
        if (!prev_cfg) {
                dev_err(&pf->pdev->dev, "Failed to alloc space for DCB cfg\n");
        }
 
        ice_init_dcb(&pf->hw);
-       if (memcmp(prev_cfg, &pf->hw.port_info->local_dcbx_cfg,
-                  sizeof(*prev_cfg))) {
+       if (ice_dcb_need_recfg(pf, prev_cfg, local_dcbx_cfg)) {
                /* difference in cfg detected - disable DCB till next MIB */
                dev_err(&pf->pdev->dev, "Set local MIB not accurate\n");
-               devm_kfree(&pf->pdev->dev, prev_cfg);
                goto dcb_error;
        }
 
        /* fetched config congruent to previous configuration */
        devm_kfree(&pf->pdev->dev, prev_cfg);
 
-       /* Configuration replayed - reset willing state to previous */
-       pf->hw.port_info->local_dcbx_cfg.etscfg.willing = willing;
+       /* Set the local desired config */
+       memset(&pf->hw.port_info->local_dcbx_cfg, 0, sizeof(*local_dcbx_cfg));
+       memcpy(local_dcbx_cfg, desired_dcbx_cfg, sizeof(*local_dcbx_cfg));
+       ice_cfg_etsrec_defaults(pf->hw.port_info);
        ret = ice_set_dcb_cfg(pf->hw.port_info);
        if (ret) {
-               dev_err(&pf->pdev->dev, "Fail restoring prev willing state\n");
+               dev_err(&pf->pdev->dev, "Failed to set desired config\n");
                goto dcb_error;
        }
        dev_info(&pf->pdev->dev, "DCB restored after reset\n");
        return 0;
 }
 
-/**
- * ice_dcb_need_recfg - Check if DCB needs reconfig
- * @pf: board private structure
- * @old_cfg: current DCB config
- * @new_cfg: new DCB config
- */
-static bool ice_dcb_need_recfg(struct ice_pf *pf, struct ice_dcbx_cfg *old_cfg,
-                              struct ice_dcbx_cfg *new_cfg)
-{
-       bool need_reconfig = false;
-
-       /* Check if ETS configuration has changed */
-       if (memcmp(&new_cfg->etscfg, &old_cfg->etscfg,
-                  sizeof(new_cfg->etscfg))) {
-               /* If Priority Table has changed reconfig is needed */
-               if (memcmp(&new_cfg->etscfg.prio_table,
-                          &old_cfg->etscfg.prio_table,
-                          sizeof(new_cfg->etscfg.prio_table))) {
-                       need_reconfig = true;
-                       dev_dbg(&pf->pdev->dev, "ETS UP2TC changed.\n");
-               }
-
-               if (memcmp(&new_cfg->etscfg.tcbwtable,
-                          &old_cfg->etscfg.tcbwtable,
-                          sizeof(new_cfg->etscfg.tcbwtable)))
-                       dev_dbg(&pf->pdev->dev, "ETS TC BW Table changed.\n");
-
-               if (memcmp(&new_cfg->etscfg.tsatable,
-                          &old_cfg->etscfg.tsatable,
-                          sizeof(new_cfg->etscfg.tsatable)))
-                       dev_dbg(&pf->pdev->dev, "ETS TSA Table changed.\n");
-       }
-
-       /* Check if PFC configuration has changed */
-       if (memcmp(&new_cfg->pfc, &old_cfg->pfc, sizeof(new_cfg->pfc))) {
-               need_reconfig = true;
-               dev_dbg(&pf->pdev->dev, "PFC config change detected.\n");
-       }
-
-       /* Check if APP Table has changed */
-       if (memcmp(&new_cfg->app, &old_cfg->app, sizeof(new_cfg->app))) {
-               need_reconfig = true;
-               dev_dbg(&pf->pdev->dev, "APP Table change detected.\n");
-       }
-
-       dev_dbg(&pf->pdev->dev, "dcb need_reconfig=%d\n", need_reconfig);
-       return need_reconfig;
-}
-
 /**
  * ice_dcb_process_lldp_set_mib_change - Process MIB change
  * @pf: ptr to ice_pf