|
@@ -140,17 +140,30 @@ static void iwl_mvm_power_log(struct iwl_mvm *mvm,
|
|
|
IWL_DEBUG_POWER(mvm, "Keep alive = %u sec\n",
|
|
|
le16_to_cpu(cmd->keep_alive_seconds));
|
|
|
|
|
|
- if (cmd->flags & cpu_to_le16(POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK)) {
|
|
|
- IWL_DEBUG_POWER(mvm, "Rx timeout = %u usec\n",
|
|
|
- le32_to_cpu(cmd->rx_data_timeout));
|
|
|
- IWL_DEBUG_POWER(mvm, "Tx timeout = %u usec\n",
|
|
|
- le32_to_cpu(cmd->tx_data_timeout));
|
|
|
- if (cmd->flags & cpu_to_le16(POWER_FLAGS_SKIP_OVER_DTIM_MSK))
|
|
|
- IWL_DEBUG_POWER(mvm, "DTIM periods to skip = %u\n",
|
|
|
- cmd->skip_dtim_periods);
|
|
|
- if (cmd->flags & cpu_to_le16(POWER_FLAGS_LPRX_ENA_MSK))
|
|
|
- IWL_DEBUG_POWER(mvm, "LP RX RSSI threshold = %u\n",
|
|
|
- cmd->lprx_rssi_threshold);
|
|
|
+ if (!(cmd->flags & cpu_to_le16(POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK))) {
|
|
|
+ IWL_DEBUG_POWER(mvm, "Disable power management\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ IWL_DEBUG_POWER(mvm, "Rx timeout = %u usec\n",
|
|
|
+ le32_to_cpu(cmd->rx_data_timeout));
|
|
|
+ IWL_DEBUG_POWER(mvm, "Tx timeout = %u usec\n",
|
|
|
+ le32_to_cpu(cmd->tx_data_timeout));
|
|
|
+ if (cmd->flags & cpu_to_le16(POWER_FLAGS_SKIP_OVER_DTIM_MSK))
|
|
|
+ IWL_DEBUG_POWER(mvm, "DTIM periods to skip = %u\n",
|
|
|
+ cmd->skip_dtim_periods);
|
|
|
+ if (cmd->flags & cpu_to_le16(POWER_FLAGS_LPRX_ENA_MSK))
|
|
|
+ IWL_DEBUG_POWER(mvm, "LP RX RSSI threshold = %u\n",
|
|
|
+ cmd->lprx_rssi_threshold);
|
|
|
+ if (cmd->flags & cpu_to_le16(POWER_FLAGS_ADVANCE_PM_ENA_MSK)) {
|
|
|
+ IWL_DEBUG_POWER(mvm, "uAPSD enabled\n");
|
|
|
+ IWL_DEBUG_POWER(mvm, "Rx timeout (uAPSD) = %u usec\n",
|
|
|
+ le32_to_cpu(cmd->rx_data_timeout_uapsd));
|
|
|
+ IWL_DEBUG_POWER(mvm, "Tx timeout (uAPSD) = %u usec\n",
|
|
|
+ le32_to_cpu(cmd->tx_data_timeout_uapsd));
|
|
|
+ IWL_DEBUG_POWER(mvm, "QNDP TID = %d\n", cmd->qndp_tid);
|
|
|
+ IWL_DEBUG_POWER(mvm, "ACs flags = 0x%x\n", cmd->uapsd_ac_flags);
|
|
|
+ IWL_DEBUG_POWER(mvm, "Max SP = %d\n", cmd->uapsd_max_sp);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -166,6 +179,8 @@ static void iwl_mvm_power_build_cmd(struct iwl_mvm *mvm,
|
|
|
bool radar_detect = false;
|
|
|
struct iwl_mvm_vif *mvmvif __maybe_unused =
|
|
|
iwl_mvm_vif_from_mac80211(vif);
|
|
|
+ enum ieee80211_ac_numbers ac;
|
|
|
+ bool tid_found = false;
|
|
|
|
|
|
cmd->id_and_color = cpu_to_le32(FW_CMD_ID_AND_COLOR(mvmvif->id,
|
|
|
mvmvif->color));
|
|
@@ -235,6 +250,49 @@ static void iwl_mvm_power_build_cmd(struct iwl_mvm *mvm,
|
|
|
cpu_to_le32(IWL_MVM_WOWLAN_PS_TX_DATA_TIMEOUT);
|
|
|
}
|
|
|
|
|
|
+ for (ac = IEEE80211_AC_VO; ac <= IEEE80211_AC_BK; ac++) {
|
|
|
+ if (!mvmvif->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 && !mvmvif->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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (cmd->flags & cpu_to_le16(POWER_FLAGS_ADVANCE_PM_ENA_MSK)) {
|
|
|
+ cmd->rx_data_timeout_uapsd =
|
|
|
+ cpu_to_le32(IWL_MVM_UAPSD_RX_DATA_TIMEOUT);
|
|
|
+ cmd->tx_data_timeout_uapsd =
|
|
|
+ cpu_to_le32(IWL_MVM_UAPSD_TX_DATA_TIMEOUT);
|
|
|
+ cmd->uapsd_max_sp = IWL_UAPSD_MAX_SP;
|
|
|
+ cmd->heavy_tx_thld_packets =
|
|
|
+ IWL_MVM_PS_HEAVY_TX_THLD_PACKETS;
|
|
|
+ cmd->heavy_rx_thld_packets =
|
|
|
+ IWL_MVM_PS_HEAVY_RX_THLD_PACKETS;
|
|
|
+ cmd->heavy_tx_thld_percentage =
|
|
|
+ IWL_MVM_PS_HEAVY_TX_THLD_PERCENT;
|
|
|
+ cmd->heavy_rx_thld_percentage =
|
|
|
+ IWL_MVM_PS_HEAVY_RX_THLD_PERCENT;
|
|
|
+ }
|
|
|
+
|
|
|
#ifdef CONFIG_IWLWIFI_DEBUGFS
|
|
|
if (mvmvif->dbgfs_pm.mask & MVM_DEBUGFS_PM_KEEP_ALIVE)
|
|
|
cmd->keep_alive_seconds =
|
|
@@ -342,8 +400,6 @@ static int iwl_mvm_power_mac_dbgfs_read(struct iwl_mvm *mvm,
|
|
|
(cmd.flags &
|
|
|
cpu_to_le16(POWER_FLAGS_POWER_SAVE_ENA_MSK)) ?
|
|
|
0 : 1);
|
|
|
- pos += scnprintf(buf+pos, bufsz-pos, "skip_dtim_periods = %d\n",
|
|
|
- cmd.skip_dtim_periods);
|
|
|
pos += scnprintf(buf+pos, bufsz-pos, "power_scheme = %d\n",
|
|
|
iwlmvm_mod_params.power_scheme);
|
|
|
pos += scnprintf(buf+pos, bufsz-pos, "flags = 0x%x\n",
|
|
@@ -356,14 +412,51 @@ static int iwl_mvm_power_mac_dbgfs_read(struct iwl_mvm *mvm,
|
|
|
(cmd.flags &
|
|
|
cpu_to_le16(POWER_FLAGS_SKIP_OVER_DTIM_MSK)) ?
|
|
|
1 : 0);
|
|
|
- pos += scnprintf(buf+pos, bufsz-pos, "rx_data_timeout = %d\n",
|
|
|
- le32_to_cpu(cmd.rx_data_timeout));
|
|
|
- pos += scnprintf(buf+pos, bufsz-pos, "tx_data_timeout = %d\n",
|
|
|
- le32_to_cpu(cmd.tx_data_timeout));
|
|
|
+ pos += scnprintf(buf+pos, bufsz-pos, "skip_dtim_periods = %d\n",
|
|
|
+ cmd.skip_dtim_periods);
|
|
|
+ if (!(cmd.flags &
|
|
|
+ cpu_to_le16(POWER_FLAGS_ADVANCE_PM_ENA_MSK))) {
|
|
|
+ pos += scnprintf(buf+pos, bufsz-pos,
|
|
|
+ "rx_data_timeout = %d\n",
|
|
|
+ le32_to_cpu(cmd.rx_data_timeout));
|
|
|
+ pos += scnprintf(buf+pos, bufsz-pos,
|
|
|
+ "tx_data_timeout = %d\n",
|
|
|
+ le32_to_cpu(cmd.tx_data_timeout));
|
|
|
+ }
|
|
|
if (cmd.flags & cpu_to_le16(POWER_FLAGS_LPRX_ENA_MSK))
|
|
|
pos += scnprintf(buf+pos, bufsz-pos,
|
|
|
"lprx_rssi_threshold = %d\n",
|
|
|
cmd.lprx_rssi_threshold);
|
|
|
+ if (cmd.flags & cpu_to_le16(POWER_FLAGS_ADVANCE_PM_ENA_MSK)) {
|
|
|
+ pos +=
|
|
|
+ scnprintf(buf+pos, bufsz-pos,
|
|
|
+ "rx_data_timeout_uapsd = %d\n",
|
|
|
+ le32_to_cpu(cmd.rx_data_timeout_uapsd));
|
|
|
+ pos +=
|
|
|
+ scnprintf(buf+pos, bufsz-pos,
|
|
|
+ "tx_data_timeout_uapsd = %d\n",
|
|
|
+ le32_to_cpu(cmd.tx_data_timeout_uapsd));
|
|
|
+ pos += scnprintf(buf+pos, bufsz-pos, "qndp_tid = %d\n",
|
|
|
+ cmd.qndp_tid);
|
|
|
+ pos += scnprintf(buf+pos, bufsz-pos,
|
|
|
+ "uapsd_ac_flags = 0x%x\n",
|
|
|
+ cmd.uapsd_ac_flags);
|
|
|
+ pos += scnprintf(buf+pos, bufsz-pos,
|
|
|
+ "uapsd_max_sp = %d\n",
|
|
|
+ cmd.uapsd_max_sp);
|
|
|
+ pos += scnprintf(buf+pos, bufsz-pos,
|
|
|
+ "heavy_tx_thld_packets = %d\n",
|
|
|
+ cmd.heavy_tx_thld_packets);
|
|
|
+ pos += scnprintf(buf+pos, bufsz-pos,
|
|
|
+ "heavy_rx_thld_packets = %d\n",
|
|
|
+ cmd.heavy_rx_thld_packets);
|
|
|
+ pos += scnprintf(buf+pos, bufsz-pos,
|
|
|
+ "heavy_tx_thld_percentage = %d\n",
|
|
|
+ cmd.heavy_tx_thld_percentage);
|
|
|
+ pos += scnprintf(buf+pos, bufsz-pos,
|
|
|
+ "heavy_rx_thld_percentage = %d\n",
|
|
|
+ cmd.heavy_rx_thld_percentage);
|
|
|
+ }
|
|
|
}
|
|
|
return pos;
|
|
|
}
|