]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: iwlwifi: Transition to basic uAPSD with MAC_PM_POWER_TABLE API VER_3
authorAvinash Bhatt <avinash.bhatt@intel.com>
Tue, 12 May 2026 19:34:32 +0000 (22:34 +0300)
committerMiri Korenblit <miriam.rachel.korenblit@intel.com>
Tue, 26 May 2026 12:17:11 +0000 (15:17 +0300)
uAPSD is transitioning to a certification-only feature. The new
firmware API version 3 removes advanced uAPSD fields, keeping only
basic parameters needed for certification testing.

Support the new VER_3 API in the MLD driver while maintaining
backward compatibility with VER_1/2. The MVM driver continues
using VER_2 only. Remove the obsolete PSM_UAPSD_AP_MISBEHAVING_NOTIFICATION
notification from the MLD driver

Signed-off-by: Avinash Bhatt <avinash.bhatt@intel.com>
Link: https://patch.msgid.link/20260512222731.96b6f53c8708.I4f01b97b25d91ebb1561845d7925103e274574fa@changeid
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
drivers/net/wireless/intel/iwlwifi/fw/api/power.h
drivers/net/wireless/intel/iwlwifi/mld/iface.c
drivers/net/wireless/intel/iwlwifi/mld/iface.h
drivers/net/wireless/intel/iwlwifi/mld/mld.c
drivers/net/wireless/intel/iwlwifi/mld/notif.c
drivers/net/wireless/intel/iwlwifi/mld/power.c
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
drivers/net/wireless/intel/iwlwifi/mvm/power.c

index a3f916630df2bb03d4dd5ff906cd7c71dd6d66af..115e65ba19f8c4b7df1f8d6083b83ae8b100cc74 100644 (file)
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
 /*
- * Copyright (C) 2012-2014, 2018-2025 Intel Corporation
+ * Copyright (C) 2012-2014, 2018-2026 Intel Corporation
  * Copyright (C) 2013-2014 Intel Mobile Communications GmbH
  * Copyright (C) 2015-2017 Intel Deutschland GmbH
  */
@@ -85,12 +85,13 @@ struct iwl_ltr_config_cmd {
  *             '1' PM could sleep over DTIM till listen Interval.
  * @POWER_FLAGS_SNOOZE_ENA_MSK: Enable snoozing only if uAPSD is enabled and all
  *             access categories are both delivery and trigger enabled.
+ *             (Not supported since version 3)
  * @POWER_FLAGS_BT_SCO_ENA: Enable BT SCO coex only if uAPSD and
  *             PBW Snoozing enabled
  * @POWER_FLAGS_ADVANCE_PM_ENA_MSK: Advanced PM (uAPSD) enable mask
  * @POWER_FLAGS_LPRX_ENA_MSK: Low Power RX enable.
  * @POWER_FLAGS_UAPSD_MISBEHAVING_ENA_MSK: AP/GO's uAPSD misbehaving
- *             detection enablement
+ *             detection enablement (Not supported since version 3)
  * @POWER_FLAGS_ENABLE_SMPS_MSK: SMPS is allowed for this vif
 */
 enum iwl_power_flags {
@@ -175,9 +176,9 @@ struct iwl_device_power_cmd {
 } __packed;
 
 /**
- * struct iwl_mac_power_cmd - New power command containing uAPSD support
+ * struct iwl_mac_power_cmd_v2 - power command V2 containing uAPSD support
  * MAC_PM_POWER_TABLE = 0xA9 (command, has simple generic response)
- * @id_and_color:      MAC contex identifier, &enum iwl_ctxt_id_and_color
+ * @id_and_color:      MAC context identifier, &enum iwl_ctxt_id_and_color
  * @flags:             Power table command flags from POWER_FLAGS_*
  * @keep_alive_seconds:        Keep alive period in seconds. Default - 25 sec.
  *                     Minimum allowed:- 3 * DTIM. Keep alive period must be
@@ -216,7 +217,7 @@ struct iwl_device_power_cmd {
  * @limited_ps_threshold: (unused)
  * @reserved: reserved (padding)
  */
-struct iwl_mac_power_cmd {
+struct iwl_mac_power_cmd_v2 {
        /* CONTEXT_DESC_API_T_VER_1 */
        __le32 id_and_color;
 
@@ -242,6 +243,43 @@ struct iwl_mac_power_cmd {
        u8 reserved;
 } __packed; /* CLIENT_PM_POWER_TABLE_S_VER_1, VER_2 */
 
+/**
+ * struct iwl_mac_power_cmd - power command
+ * MAC_PM_POWER_TABLE = 0xA9 (command, has simple generic response)
+ * @id_and_color:      MAC context identifier, &enum iwl_ctxt_id_and_color
+ * @flags:             Power table command flags from POWER_FLAGS_*
+ * @keep_alive_seconds:        Keep alive period in seconds. Default - 25 sec.
+ *                     Minimum allowed:- 3 * DTIM. Keep alive period must be
+ *                     set regardless of power scheme or current power state.
+ *                     FW use this value also when PM is disabled.
+ * @rx_data_timeout:    Minimum time (usec) from last Rx packet for AM to
+ *                     PSM transition - legacy PM
+ * @tx_data_timeout:    Minimum time (usec) from last Tx packet for AM to
+ *                     PSM transition - legacy PM
+ * @lprx_rssi_threshold: Signal strength up to which LP RX can be enabled.
+ *                     Default: 80dbm
+ * @skip_dtim_periods: Number of DTIM periods to skip if Skip over DTIM flag
+ *                     is set. For example, if it is required to skip over
+ *                     one DTIM, this value need to be set to 2 (DTIM periods).
+ * @qndp_tid:          TID client shall use for uAPSD QNDP triggers
+ * @uapsd_ac_flags:    Set trigger-enabled and delivery-enabled indication for
+ *                     each corresponding AC.
+ *                     Use IEEE80211_WMM_IE_STA_QOSINFO_AC* for correct values.
+ */
+struct iwl_mac_power_cmd {
+       /* CONTEXT_DESC_API_T_VER_1 */
+       __le32 id_and_color;
+
+       __le16 flags;
+       __le16 keep_alive_seconds;
+       __le32 rx_data_timeout;
+       __le32 tx_data_timeout;
+       u8 lprx_rssi_threshold;
+       u8 skip_dtim_periods;
+       u8 qndp_tid;
+       u8 uapsd_ac_flags;
+} __packed; /* CLIENT_PM_POWER_TABLE_S_VER_3 */
+
 /*
  * struct iwl_uapsd_misbehaving_ap_notif - FW sends this notification when
  * associated AP is identified as improperly implementing uAPSD protocol.
index 5fc3f67294553c8dca55bf9014a559799993c6ed..4fe57d79daa6330040fb5580a3c6c491441eccd4 100644 (file)
@@ -739,24 +739,6 @@ void iwl_mld_handle_probe_resp_data_notif(struct iwl_mld *mld,
                kfree_rcu(old_data, rcu_head);
 }
 
-void iwl_mld_handle_uapsd_misbehaving_ap_notif(struct iwl_mld *mld,
-                                              struct iwl_rx_packet *pkt)
-{
-       struct iwl_uapsd_misbehaving_ap_notif *notif = (void *)pkt->data;
-       struct ieee80211_vif *vif;
-
-       if (IWL_FW_CHECK(mld, notif->mac_id >= ARRAY_SIZE(mld->fw_id_to_vif),
-                        "mac id is invalid: %d\n", notif->mac_id))
-               return;
-
-       vif = wiphy_dereference(mld->wiphy, mld->fw_id_to_vif[notif->mac_id]);
-
-       if (WARN_ON(!vif) || ieee80211_vif_is_mld(vif))
-               return;
-
-       IWL_WARN(mld, "uapsd misbehaving AP: %pM\n", vif->bss_conf.bssid);
-}
-
 void iwl_mld_handle_datapath_monitor_notif(struct iwl_mld *mld,
                                           struct iwl_rx_packet *pkt)
 {
index 71c794204475033c3f8681ce6e4294d074dc9657..d6fb58e785e5bb811124fb5fab45d14c0b3f04bc 100644 (file)
@@ -274,9 +274,6 @@ void iwl_mld_handle_probe_resp_data_notif(struct iwl_mld *mld,
 void iwl_mld_handle_datapath_monitor_notif(struct iwl_mld *mld,
                                           struct iwl_rx_packet *pkt);
 
-void iwl_mld_handle_uapsd_misbehaving_ap_notif(struct iwl_mld *mld,
-                                              struct iwl_rx_packet *pkt);
-
 void iwl_mld_reset_cca_40mhz_workaround(struct iwl_mld *mld,
                                        struct ieee80211_vif *vif);
 
index 9a3b768fce7ad89b2354f8741ee82993dc2b70bb..25bab6ab637554482796f7c1b74e5832a9e99059 100644 (file)
@@ -162,7 +162,6 @@ static const struct iwl_hcmd_names iwl_mld_legacy_names[] = {
        HCMD_NAME(PHY_CONFIGURATION_CMD),
        HCMD_NAME(SCAN_OFFLOAD_UPDATE_PROFILES_CMD),
        HCMD_NAME(POWER_TABLE_CMD),
-       HCMD_NAME(PSM_UAPSD_AP_MISBEHAVING_NOTIFICATION),
        HCMD_NAME(BEACON_NOTIFICATION),
        HCMD_NAME(BEACON_TEMPLATE_CMD),
        HCMD_NAME(TX_ANT_CONFIGURATION_CMD),
index 4e9f3768c3817332a5984982a223ceb0e75dbdef..1c81152042ab95eb1c80a2f5f4ce6a4666d18ef6 100644 (file)
@@ -339,8 +339,6 @@ CMD_VERSIONS(emlsr_mode_notif,
             CMD_VER_ENTRY(2, iwl_esr_mode_notif))
 CMD_VERSIONS(emlsr_trans_fail_notif,
             CMD_VER_ENTRY(1, iwl_esr_trans_fail_notif))
-CMD_VERSIONS(uapsd_misbehaving_ap_notif,
-            CMD_VER_ENTRY(1, iwl_uapsd_misbehaving_ap_notif))
 CMD_VERSIONS(time_msmt_notif,
             CMD_VER_ENTRY(1, iwl_time_msmt_notify))
 CMD_VERSIONS(time_sync_confirm_notif,
@@ -363,8 +361,6 @@ DEFINE_SIMPLE_CANCELLATION(scan_complete, iwl_umac_scan_complete, uid)
 DEFINE_SIMPLE_CANCELLATION(scan_start, iwl_umac_scan_start, uid)
 DEFINE_SIMPLE_CANCELLATION(probe_resp_data, iwl_probe_resp_data_notif,
                           mac_id)
-DEFINE_SIMPLE_CANCELLATION(uapsd_misbehaving_ap, iwl_uapsd_misbehaving_ap_notif,
-                          mac_id)
 DEFINE_SIMPLE_CANCELLATION(ftm_resp, iwl_tof_range_rsp_ntfy, request_id)
 DEFINE_SIMPLE_CANCELLATION(beacon_filter, iwl_beacon_filter_notif, link_id)
 
@@ -455,8 +451,6 @@ const struct iwl_rx_handler iwl_mld_rx_handlers[] = {
                             emlsr_mode_notif, RX_HANDLER_ASYNC)
        RX_HANDLER_NO_OBJECT(MAC_CONF_GROUP, EMLSR_TRANS_FAIL_NOTIF,
                             emlsr_trans_fail_notif, RX_HANDLER_ASYNC)
-       RX_HANDLER_OF_VIF(LEGACY_GROUP, PSM_UAPSD_AP_MISBEHAVING_NOTIFICATION,
-                         uapsd_misbehaving_ap_notif)
        RX_HANDLER_NO_OBJECT(LEGACY_GROUP,
                             WNM_80211V_TIMING_MEASUREMENT_NOTIFICATION,
                             time_msmt_notif, RX_HANDLER_SYNC)
index fe71da8b9c8925d315e48d1cf575660bf74e0728..da065a446f81582c07484bc2f89775e9826a34e1 100644 (file)
@@ -88,10 +88,10 @@ static bool iwl_mld_power_is_radar(struct iwl_mld *mld,
        return chanctx_conf->def.chan->flags & IEEE80211_CHAN_RADAR;
 }
 
-static void iwl_mld_power_configure_uapsd(struct iwl_mld *mld,
-                                         struct iwl_mld_link *link,
-                                         struct iwl_mac_power_cmd *cmd,
-                                         bool ps_poll)
+static void iwl_mld_power_configure_uapsd_v2(struct iwl_mld *mld,
+                                            struct iwl_mld_link *link,
+                                            struct iwl_mac_power_cmd_v2 *cmd,
+                                            bool ps_poll)
 {
        bool tid_found = false;
 
@@ -150,10 +150,54 @@ static void iwl_mld_power_configure_uapsd(struct iwl_mld *mld,
        cmd->uapsd_max_sp = mld->hw->uapsd_max_sp_len;
 }
 
+static void iwl_mld_power_configure_uapsd(struct iwl_mld *mld,
+                                         struct iwl_mld_link *link,
+                                         struct iwl_mac_power_cmd *cmd,
+                                         bool ps_poll)
+{
+       bool tid_found = false;
+
+       /* set advanced pm flag with no uapsd ACs to enable ps-poll */
+       if (ps_poll) {
+               cmd->flags |= cpu_to_le16(POWER_FLAGS_ADVANCE_PM_ENA_MSK);
+               return;
+       }
+
+       for (enum ieee80211_ac_numbers ac = IEEE80211_AC_VO;
+            ac <= IEEE80211_AC_BK;
+            ac++) {
+               if (!link->queue_params[ac].uapsd)
+                       continue;
+
+               cmd->flags |=
+                       cpu_to_le16(POWER_FLAGS_ADVANCE_PM_ENA_MSK);
+               cmd->uapsd_ac_flags |= BIT(ac);
+
+               /* QNDP TID - the highest TID with no admission control */
+               if (!tid_found && !link->queue_params[ac].acm) {
+                       tid_found = true;
+                       switch (ac) {
+                       case IEEE80211_AC_VO:
+                               cmd->qndp_tid = 6;
+                               break;
+                       case IEEE80211_AC_VI:
+                               cmd->qndp_tid = 5;
+                               break;
+                       case IEEE80211_AC_BE:
+                               cmd->qndp_tid = 0;
+                               break;
+                       case IEEE80211_AC_BK:
+                               cmd->qndp_tid = 1;
+                               break;
+                       }
+               }
+       }
+}
+
 static void
 iwl_mld_power_config_skip_dtim(struct iwl_mld *mld,
                               const struct ieee80211_bss_conf *link_conf,
-                              struct iwl_mac_power_cmd *cmd)
+                              u8 *skip_dtim_periods, __le16 *flags)
 {
        unsigned int dtimper_tu;
        unsigned int dtimper;
@@ -171,15 +215,15 @@ iwl_mld_power_config_skip_dtim(struct iwl_mld *mld,
        /* configure skip over dtim up to 900 TU DTIM interval */
        skip = max_t(int, 1, 900 / dtimper_tu);
 
-       cmd->skip_dtim_periods = skip;
-       cmd->flags |= cpu_to_le16(POWER_FLAGS_SKIP_OVER_DTIM_MSK);
+       *skip_dtim_periods = skip;
+       *flags |= cpu_to_le16(POWER_FLAGS_SKIP_OVER_DTIM_MSK);
 }
 
 #define POWER_KEEP_ALIVE_PERIOD_SEC    25
-static void iwl_mld_power_build_cmd(struct iwl_mld *mld,
-                                   struct ieee80211_vif *vif,
-                                   struct iwl_mac_power_cmd *cmd,
-                                   bool d3)
+static void iwl_mld_power_build_cmd_v2(struct iwl_mld *mld,
+                                      struct ieee80211_vif *vif,
+                                      struct iwl_mac_power_cmd_v2 *cmd,
+                                      bool d3)
 {
        int dtimper, bi;
        int keep_alive;
@@ -238,7 +282,9 @@ static void iwl_mld_power_build_cmd(struct iwl_mld *mld,
        }
 
        if (d3) {
-               iwl_mld_power_config_skip_dtim(mld, link_conf, cmd);
+               iwl_mld_power_config_skip_dtim(mld, link_conf,
+                                              &cmd->skip_dtim_periods,
+                                              &cmd->flags);
                cmd->rx_data_timeout =
                        cpu_to_le32(IWL_MLD_WOWLAN_PS_RX_DATA_TIMEOUT);
                cmd->tx_data_timeout =
@@ -259,6 +305,95 @@ static void iwl_mld_power_build_cmd(struct iwl_mld *mld,
         * mac80211 will allow uAPSD. Always call iwl_mld_power_configure_uapsd
         * which will look at what mac80211 is saying.
         */
+#ifdef CONFIG_IWLWIFI_DEBUGFS
+       ps_poll = mld_vif->use_ps_poll;
+#endif
+       iwl_mld_power_configure_uapsd_v2(mld, link, cmd, ps_poll);
+}
+
+static void iwl_mld_power_build_cmd(struct iwl_mld *mld,
+                                   struct ieee80211_vif *vif,
+                                   struct iwl_mac_power_cmd *cmd,
+                                   bool d3)
+{
+       int dtimper, bi;
+       int keep_alive;
+       struct iwl_mld_vif *mld_vif = iwl_mld_vif_from_mac80211(vif);
+       struct ieee80211_bss_conf *link_conf = &vif->bss_conf;
+       struct iwl_mld_link *link = &mld_vif->deflink;
+       bool ps_poll = false;
+       __le32 fw_id = cpu_to_le32(mld_vif->fw_id);
+
+       if (ieee80211_vif_is_mld(vif)) {
+               int link_id;
+
+               if (WARN_ON(!vif->active_links))
+                       return;
+
+               /* The firmware consumes one single configuration for the vif
+                * and can't differentiate between links, just pick the lowest
+                * link_id's configuration and use that.
+                */
+               link_id = __ffs(vif->active_links);
+               link_conf = link_conf_dereference_check(vif, link_id);
+               link = iwl_mld_link_dereference_check(mld_vif, link_id);
+
+               if (WARN_ON(!link_conf || !link))
+                       return;
+       }
+       dtimper = link_conf->dtim_period;
+       bi = link_conf->beacon_int;
+
+       /* Regardless of power management state the driver must set
+        * keep alive period. FW will use it for sending keep alive NDPs
+        * immediately after association. Check that keep alive period
+        * is at least 3 * DTIM
+        */
+       keep_alive = DIV_ROUND_UP(ieee80211_tu_to_usec(3 * dtimper * bi),
+                                 USEC_PER_SEC);
+       keep_alive = max(keep_alive, POWER_KEEP_ALIVE_PERIOD_SEC);
+
+       cmd->id_and_color = fw_id;
+       cmd->keep_alive_seconds = cpu_to_le16(keep_alive);
+
+       if (iwlmld_mod_params.power_scheme != IWL_POWER_SCHEME_CAM)
+               cmd->flags |= cpu_to_le16(POWER_FLAGS_POWER_SAVE_ENA_MSK);
+
+       if (vif->cfg.ps && iwl_mld_tdls_sta_count(mld) == 0) {
+               cmd->flags |= cpu_to_le16(POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK);
+               cmd->flags |= cpu_to_le16(POWER_FLAGS_ENABLE_SMPS_MSK);
+
+               /* firmware supports LPRX for beacons at rate 1 Mbps or
+                * 6 Mbps only
+                */
+               if (link_conf->beacon_rate &&
+                   (link_conf->beacon_rate->bitrate == 10 ||
+                    link_conf->beacon_rate->bitrate == 60)) {
+                       cmd->flags |= cpu_to_le16(POWER_FLAGS_LPRX_ENA_MSK);
+                       cmd->lprx_rssi_threshold = POWER_LPRX_RSSI_THRESHOLD;
+               }
+       }
+
+       if (d3) {
+               iwl_mld_power_config_skip_dtim(mld, link_conf,
+                                              &cmd->skip_dtim_periods,
+                                              &cmd->flags);
+               cmd->rx_data_timeout =
+                       cpu_to_le32(IWL_MLD_WOWLAN_PS_RX_DATA_TIMEOUT);
+               cmd->tx_data_timeout =
+                       cpu_to_le32(IWL_MLD_WOWLAN_PS_TX_DATA_TIMEOUT);
+       } else if (iwl_mld_vif_low_latency(mld_vif) && vif->p2p) {
+               cmd->tx_data_timeout =
+                       cpu_to_le32(IWL_MLD_SHORT_PS_TX_DATA_TIMEOUT);
+               cmd->rx_data_timeout =
+                       cpu_to_le32(IWL_MLD_SHORT_PS_RX_DATA_TIMEOUT);
+       } else {
+               cmd->rx_data_timeout =
+                       cpu_to_le32(IWL_MLD_DEFAULT_PS_RX_DATA_TIMEOUT);
+               cmd->tx_data_timeout =
+                       cpu_to_le32(IWL_MLD_DEFAULT_PS_TX_DATA_TIMEOUT);
+       }
+
 #ifdef CONFIG_IWLWIFI_DEBUGFS
        ps_poll = mld_vif->use_ps_poll;
 #endif
@@ -268,11 +403,23 @@ static void iwl_mld_power_build_cmd(struct iwl_mld *mld,
 int iwl_mld_update_mac_power(struct iwl_mld *mld, struct ieee80211_vif *vif,
                             bool d3)
 {
-       struct iwl_mac_power_cmd cmd = {};
+       int cmd_ver = iwl_fw_lookup_cmd_ver(mld->fw, MAC_PM_POWER_TABLE, 0);
 
-       iwl_mld_power_build_cmd(mld, vif, &cmd, d3);
+       if (cmd_ver >= 3) {
+               struct iwl_mac_power_cmd cmd = {};
 
-       return iwl_mld_send_cmd_pdu(mld, MAC_PM_POWER_TABLE, &cmd);
+               iwl_mld_power_build_cmd(mld, vif, &cmd, d3);
+               return iwl_mld_send_cmd_with_flags_pdu(mld,
+                                                      MAC_PM_POWER_TABLE, 0,
+                                                      &cmd, sizeof(cmd));
+       } else {
+               struct iwl_mac_power_cmd_v2 cmd = {};
+
+               iwl_mld_power_build_cmd_v2(mld, vif, &cmd, d3);
+               return iwl_mld_send_cmd_with_flags_pdu(mld,
+                                                      MAC_PM_POWER_TABLE, 0,
+                                                      &cmd, sizeof(cmd));
+       }
 }
 
 static void
index 402ba5dee8b2c438450651166568968fbfa31cf8..be89b84204fb3b578aa14260dd90aacdb445ee63 100644 (file)
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
 /*
- * Copyright (C) 2012-2014, 2018-2025 Intel Corporation
+ * Copyright (C) 2012-2014, 2018-2026 Intel Corporation
  * Copyright (C) 2013-2015 Intel Mobile Communications GmbH
  * Copyright (C) 2016-2017 Intel Deutschland GmbH
  */
@@ -469,7 +469,7 @@ struct iwl_mvm_vif {
        struct dentry *dbgfs_slink;
        struct iwl_dbgfs_pm dbgfs_pm;
        struct iwl_dbgfs_bf dbgfs_bf;
-       struct iwl_mac_power_cmd mac_pwr_cmd;
+       struct iwl_mac_power_cmd_v2 mac_pwr_cmd;
        int dbgfs_quota_min;
        bool ftm_unprotected;
 #endif
index 610de29b7be0d15638b845aedf8fc636d554e988..46792c50875329f2a73f6438b714d83289b63f76 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
 /*
- * Copyright (C) 2012-2014, 2018-2019, 2021-2025 Intel Corporation
+ * Copyright (C) 2012-2014, 2018-2019, 2021-2026 Intel Corporation
  * Copyright (C) 2013-2014 Intel Mobile Communications GmbH
  * Copyright (C) 2015-2017 Intel Deutschland GmbH
  */
@@ -83,7 +83,7 @@ void iwl_mvm_beacon_filter_set_cqm_params(struct iwl_mvm *mvm,
 }
 
 static void iwl_mvm_power_log(struct iwl_mvm *mvm,
-                             struct iwl_mac_power_cmd *cmd)
+                             struct iwl_mac_power_cmd_v2 *cmd)
 {
        IWL_DEBUG_POWER(mvm,
                        "Sending power table command on mac id 0x%X for power level %d, flags = 0x%X\n",
@@ -121,7 +121,7 @@ static void iwl_mvm_power_log(struct iwl_mvm *mvm,
 
 static void iwl_mvm_power_configure_uapsd(struct iwl_mvm *mvm,
                                          struct ieee80211_vif *vif,
-                                         struct iwl_mac_power_cmd *cmd)
+                                         struct iwl_mac_power_cmd_v2 *cmd)
 {
        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
        enum ieee80211_ac_numbers ac;
@@ -296,7 +296,7 @@ static bool iwl_mvm_power_is_radar(struct ieee80211_bss_conf *link_conf)
 
 static void iwl_mvm_power_config_skip_dtim(struct iwl_mvm *mvm,
                                           struct ieee80211_vif *vif,
-                                          struct iwl_mac_power_cmd *cmd)
+                                          struct iwl_mac_power_cmd_v2 *cmd)
 {
        struct ieee80211_bss_conf *link_conf;
        unsigned int min_link_skip = ~0;
@@ -344,7 +344,7 @@ static void iwl_mvm_power_config_skip_dtim(struct iwl_mvm *mvm,
 
 static void iwl_mvm_power_build_cmd(struct iwl_mvm *mvm,
                                    struct ieee80211_vif *vif,
-                                   struct iwl_mac_power_cmd *cmd)
+                                   struct iwl_mac_power_cmd_v2 *cmd)
 {
        int dtimper, bi;
        int keep_alive;
@@ -466,7 +466,7 @@ static void iwl_mvm_power_build_cmd(struct iwl_mvm *mvm,
 static int iwl_mvm_power_send_cmd(struct iwl_mvm *mvm,
                                         struct ieee80211_vif *vif)
 {
-       struct iwl_mac_power_cmd cmd = {};
+       struct iwl_mac_power_cmd_v2 cmd = {};
 
        iwl_mvm_power_build_cmd(mvm, vif, &cmd);
        iwl_mvm_power_log(mvm, &cmd);
@@ -717,7 +717,7 @@ int iwl_mvm_power_mac_dbgfs_read(struct iwl_mvm *mvm,
                                 int bufsz)
 {
        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
-       struct iwl_mac_power_cmd cmd = {};
+       struct iwl_mac_power_cmd_v2 cmd = {};
        int pos = 0;
 
        mutex_lock(&mvm->mutex);