static void iwl_mvm_parse_ppe(struct iwl_mvm *mvm,
                              struct iwl_he_pkt_ext_v2 *pkt_ext, u8 nss,
-                             u8 ru_index_bitmap, u8 *ppe, u8 ppe_pos_bit)
+                             u8 ru_index_bitmap, u8 *ppe, u8 ppe_pos_bit,
+                             bool inheritance)
 {
        int i;
 
                     bw++) {
                        ru_index_tmp >>= 1;
 
-                       if (!(ru_index_tmp & 1))
-                               continue;
+                       /*
+                       * According to the 11be spec, if for a specific BW the PPE Thresholds
+                       * isn't present - it should inherit the thresholds from the last
+                       * BW for which we had PPE Thresholds. In 11ax though, we don't have
+                       * this inheritance - continue in this case
+                       */
+                       if (!(ru_index_tmp & 1)) {
+                               if (inheritance)
+                                       goto set_thresholds;
+                               else
+                                       continue;
+                       }
 
                        high_th = iwl_mvm_he_get_ppe_val(ppe, ppe_pos_bit);
                        ppe_pos_bit += IEEE80211_PPE_THRES_INFO_PPET_SIZE;
                        low_th = iwl_mvm_he_get_ppe_val(ppe, ppe_pos_bit);
                        ppe_pos_bit += IEEE80211_PPE_THRES_INFO_PPET_SIZE;
 
+set_thresholds:
                        pkt_ext->pkt_ext_qam_th[i][bw][0] = low_th;
                        pkt_ext->pkt_ext_qam_th[i][bw][1] = high_th;
                }
 
 static void iwl_mvm_set_pkt_ext_from_he_ppe(struct iwl_mvm *mvm,
                                            struct ieee80211_sta *sta,
-                                           struct iwl_he_pkt_ext_v2 *pkt_ext)
+                                           struct iwl_he_pkt_ext_v2 *pkt_ext,
+                                           bool inheritance)
 {
        u8 nss = (sta->deflink.he_cap.ppe_thres[0] & IEEE80211_PPE_THRES_NSS_MASK) + 1;
        u8 *ppe = &sta->deflink.he_cap.ppe_thres[0];
        /* Starting after PPE header */
        u8 ppe_pos_bit = IEEE80211_HE_PPE_THRES_INFO_HEADER_SIZE;
 
-       iwl_mvm_parse_ppe(mvm, pkt_ext, nss, ru_index_bitmap, ppe, ppe_pos_bit);
+       iwl_mvm_parse_ppe(mvm, pkt_ext, nss, ru_index_bitmap, ppe, ppe_pos_bit,
+                         inheritance);
 }
 
 static void iwl_mvm_set_pkt_ext_from_nominal_padding(struct iwl_he_pkt_ext_v2 *pkt_ext,
        int high_th = -1;
        int i;
 
+       /* all the macros are the same for EHT and HE */
        switch (nominal_padding) {
-       case IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_0US:
+       case IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_0US:
                low_th = IWL_HE_PKT_EXT_NONE;
                high_th = IWL_HE_PKT_EXT_NONE;
                break;
-       case IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_8US:
+       case IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_8US:
                low_th = IWL_HE_PKT_EXT_BPSK;
                high_th = IWL_HE_PKT_EXT_NONE;
                break;
-       case IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_16US:
+       case IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_16US:
+       case IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_20US:
                low_th = IWL_HE_PKT_EXT_NONE;
                high_th = IWL_HE_PKT_EXT_BPSK;
                break;
        }
 }
 
+static void iwl_mvm_get_optimal_ppe_info(struct iwl_he_pkt_ext_v2 *pkt_ext,
+                                        u8 nominal_padding)
+{
+       int i;
+
+       for (i = 0; i < MAX_HE_SUPP_NSS; i++) {
+               u8 bw;
+
+               for (bw = 0; bw < ARRAY_SIZE(pkt_ext->pkt_ext_qam_th[i]);
+                    bw++) {
+                       u8 *qam_th = &pkt_ext->pkt_ext_qam_th[i][bw][0];
+
+                       if (nominal_padding >
+                           IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_8US &&
+                           qam_th[1] == IWL_HE_PKT_EXT_NONE)
+                               qam_th[1] = IWL_HE_PKT_EXT_4096QAM;
+                       else if (nominal_padding ==
+                                IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_8US &&
+                                qam_th[0] == IWL_HE_PKT_EXT_NONE &&
+                                qam_th[1] == IWL_HE_PKT_EXT_NONE)
+                               qam_th[0] = IWL_HE_PKT_EXT_4096QAM;
+               }
+       }
+}
+
 static void iwl_mvm_cfg_he_sta(struct iwl_mvm *mvm,
                               struct ieee80211_vif *vif, u8 sta_id)
 {
        struct ieee80211_chanctx_conf *chanctx_conf;
        const struct ieee80211_supported_band *sband;
        void *cmd;
+       u8 nominal_padding;
 
        if (!fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_MBSSID_HE))
                ver = 1;
        memset(&sta_ctxt_cmd.pkt_ext, IWL_HE_PKT_EXT_NONE,
               sizeof(sta_ctxt_cmd.pkt_ext));
 
-       /* If PPE Thresholds exist, parse them into a FW-familiar format. */
-       if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[6] &
-               IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
-               iwl_mvm_set_pkt_ext_from_he_ppe(mvm, sta,
-                                               &sta_ctxt_cmd.pkt_ext);
-               flags |= STA_CTXT_HE_PACKET_EXT;
-       /* PPE Thresholds doesn't exist - set the API PPE values
-       * according to Common Nominal Packet Padding fiels. */
-       } else {
-               u8 nominal_padding =
-                       u8_get_bits(sta->deflink.he_cap.he_cap_elem.phy_cap_info[9],
-                                   IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_MASK);
-               if (nominal_padding != IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_RESERVED)
+       if (sta->deflink.eht_cap.has_eht) {
+               nominal_padding =
+                       u8_get_bits(sta->deflink.eht_cap.eht_cap_elem.phy_cap_info[5],
+                                   IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_MASK);
+
+               /* If PPE Thresholds exists, parse them into a FW-familiar format. */
+               if (sta->deflink.eht_cap.eht_cap_elem.phy_cap_info[5] &
+                   IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT) {
+                       u8 nss = (sta->deflink.eht_cap.eht_ppe_thres[0] &
+                               IEEE80211_EHT_PPE_THRES_NSS_MASK) + 1;
+                       u8 *ppe = &sta->deflink.eht_cap.eht_ppe_thres[0];
+                       u8 ru_index_bitmap =
+                               u16_get_bits(*ppe,
+                                            IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
+                        /* Starting after PPE header */
+                       u8 ppe_pos_bit = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE;
+
+                       iwl_mvm_parse_ppe(mvm,
+                                         &sta_ctxt_cmd.pkt_ext,
+                                         nss, ru_index_bitmap, ppe,
+                                         ppe_pos_bit, true);
+                       flags |= STA_CTXT_HE_PACKET_EXT;
+               /* EHT PPE Thresholds doesn't exist - set the API according to HE PPE Tresholds*/
+               } else if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[6] &
+                          IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
+                       struct iwl_he_pkt_ext_v2 *pkt_ext =
+                               &sta_ctxt_cmd.pkt_ext;
+
+                       /*
+                       * Even though HE Capabilities IE doesn't contain PPE
+                       * Thresholds for BW 320Mhz, thresholds for this BW will
+                       * be filled in with the same values as 160Mhz, due to
+                       * the inheritance, as required.
+                       */
+                       iwl_mvm_set_pkt_ext_from_he_ppe(mvm, sta, pkt_ext,
+                                                       true);
+
+                       /*
+                       * According to the requirements, for MCSs 12-13 the maximum value between
+                       * HE PPE Threshold and Common Nominal Packet Padding needs to be taken
+                       */
+                       iwl_mvm_get_optimal_ppe_info(pkt_ext, nominal_padding);
+
+                       flags |= STA_CTXT_HE_PACKET_EXT;
+
+               /*
+               * if PPE Thresholds doesn't present in both EHT IE and HE IE -
+               * take the Thresholds from Common Nominal Packet Padding field
+               */
+               } else {
                        iwl_mvm_set_pkt_ext_from_nominal_padding(&sta_ctxt_cmd.pkt_ext,
                                                                 nominal_padding,
                                                                 &flags);
+               }
+       } else if (sta->deflink.he_cap.has_he) {
+               /* If PPE Thresholds exist, parse them into a FW-familiar format. */
+               if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[6] &
+                       IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
+                       iwl_mvm_set_pkt_ext_from_he_ppe(mvm, sta,
+                                                       &sta_ctxt_cmd.pkt_ext,
+                                                       false);
+                       flags |= STA_CTXT_HE_PACKET_EXT;
+               /*
+               * PPE Thresholds doesn't exist - set the API PPE values
+               * according to Common Nominal Packet Padding field.
+               */
+               } else {
+                       nominal_padding =
+                               u8_get_bits(sta->deflink.he_cap.he_cap_elem.phy_cap_info[9],
+                                           IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_MASK);
+                       if (nominal_padding != IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_RESERVED)
+                               iwl_mvm_set_pkt_ext_from_nominal_padding(&sta_ctxt_cmd.pkt_ext,
+                                                                        nominal_padding,
+                                                                        &flags);
+               }
+       }
+
+       for (i = 0; i < MAX_HE_SUPP_NSS; i++) {
+               int bw;
+
+               for (bw = 0;
+                    bw < ARRAY_SIZE(sta_ctxt_cmd.pkt_ext.pkt_ext_qam_th[i]);
+                    bw++) {
+                       u8 *qam_th =
+                               &sta_ctxt_cmd.pkt_ext.pkt_ext_qam_th[i][bw][0];
+
+                       IWL_DEBUG_HT(mvm,
+                                    "PPE table: nss[%d] bw[%d] PPET8 = %d, PPET16 = %d\n",
+                                    i, bw, qam_th[0], qam_th[1]);
+               }
        }
 
        if (sta->deflink.he_cap.he_cap_elem.mac_cap_info[2] &
         * interface was added.
         */
        if (changes & BSS_CHANGED_ASSOC && vif->cfg.assoc) {
-               if (vif->bss_conf.he_support &&
-                   !iwlwifi_mod_params.disable_11ax)
+               if ((vif->bss_conf.he_support &&
+                    !iwlwifi_mod_params.disable_11ax) ||
+                   (vif->bss_conf.eht_support &&
+                    !iwlwifi_mod_params.disable_11be))
                        iwl_mvm_cfg_he_sta(mvm, vif, mvmvif->ap_sta_id);
 
                iwl_mvm_mac_ctxt_recalc_tsf_id(mvm, vif);
 
        /* Update MU EDCA params */
        if (changes & BSS_CHANGED_QOS && mvmvif->associated &&
-           vif->cfg.assoc && vif->bss_conf.he_support &&
-           !iwlwifi_mod_params.disable_11ax)
+           vif->cfg.assoc &&
+           ((vif->bss_conf.he_support &&
+             !iwlwifi_mod_params.disable_11ax) ||
+            (vif->bss_conf.eht_support &&
+             !iwlwifi_mod_params.disable_11be)))
                iwl_mvm_cfg_he_sta(mvm, vif, mvmvif->ap_sta_id);
 
        /*
                        vif->bss_conf.he_support = sta->deflink.he_cap.has_he;
                        mvmvif->ap_assoc_sta_count++;
                        iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
-                       if (vif->bss_conf.he_support &&
-                           !iwlwifi_mod_params.disable_11ax)
+                       if ((vif->bss_conf.he_support &&
+                            !iwlwifi_mod_params.disable_11ax) ||
+                           (vif->bss_conf.eht_support &&
+                            !iwlwifi_mod_params.disable_11be))
                                iwl_mvm_cfg_he_sta(mvm, vif, mvm_sta->sta_id);
                } else if (vif->type == NL80211_IFTYPE_STATION) {
                        vif->bss_conf.he_support = sta->deflink.he_cap.has_he;