diff options
| author | Petr Mladek <[email protected]> | 2021-08-30 14:56:06 +0200 | 
|---|---|---|
| committer | Petr Mladek <[email protected]> | 2021-08-30 14:56:06 +0200 | 
| commit | 71af75b6929458d85f63c0649dc26d6f4c19729e (patch) | |
| tree | c05c57903424d8270f6b6f3ec3493791fdba4e5c /drivers/net/wireless/intel/iwlwifi/mvm/ops.c | |
| parent | fe8e3ee0d588566c1f44f28a555042ef50eba491 (diff) | |
| parent | bc17bed5fd73ef1a9aed39f3b0ea26936dad60b8 (diff) | |
Merge branch 'for-5.15-printk-index' into for-linus
Diffstat (limited to 'drivers/net/wireless/intel/iwlwifi/mvm/ops.c')
| -rw-r--r-- | drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 40 | 
1 files changed, 39 insertions, 1 deletions
| diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c index ebed82c590e5..20e8d343a950 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c @@ -210,6 +210,39 @@ static void iwl_mvm_rx_monitor_notif(struct iwl_mvm *mvm,  	ieee80211_disconnect(vif, true);  } +void iwl_mvm_apply_fw_smps_request(struct ieee80211_vif *vif) +{ +	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); +	struct iwl_mvm *mvm = mvmvif->mvm; + +	iwl_mvm_update_smps(mvm, vif, IWL_MVM_SMPS_REQ_FW, +			    mvm->fw_static_smps_request ? +				IEEE80211_SMPS_STATIC : +				IEEE80211_SMPS_AUTOMATIC); +} + +static void iwl_mvm_intf_dual_chain_req(void *data, u8 *mac, +					struct ieee80211_vif *vif) +{ +	iwl_mvm_apply_fw_smps_request(vif); +} + +static void iwl_mvm_rx_thermal_dual_chain_req(struct iwl_mvm *mvm, +					      struct iwl_rx_cmd_buffer *rxb) +{ +	struct iwl_rx_packet *pkt = rxb_addr(rxb); +	struct iwl_thermal_dual_chain_request *req = (void *)pkt->data; + +	/* +	 * We could pass it to the iterator data, but also need to remember +	 * it for new interfaces that are added while in this state. +	 */ +	mvm->fw_static_smps_request = +		req->event == cpu_to_le32(THERMAL_DUAL_CHAIN_REQ_DISABLE); +	ieee80211_iterate_interfaces(mvm->hw, IEEE80211_IFACE_ITER_NORMAL, +				     iwl_mvm_intf_dual_chain_req, NULL); +} +  /**   * enum iwl_rx_handler_context context for Rx handler   * @RX_HANDLER_SYNC : this means that it will be called in the Rx path @@ -358,6 +391,11 @@ static const struct iwl_rx_handlers iwl_mvm_rx_handlers[] = {  	RX_HANDLER_GRP(DATA_PATH_GROUP, MONITOR_NOTIF,  		       iwl_mvm_rx_monitor_notif, RX_HANDLER_ASYNC_LOCKED,  		       struct iwl_datapath_monitor_notif), + +	RX_HANDLER_GRP(DATA_PATH_GROUP, THERMAL_DUAL_CHAIN_REQUEST, +		       iwl_mvm_rx_thermal_dual_chain_req, +		       RX_HANDLER_ASYNC_LOCKED, +		       struct iwl_thermal_dual_chain_request),  };  #undef RX_HANDLER  #undef RX_HANDLER_GRP @@ -445,7 +483,6 @@ static const struct iwl_hcmd_names iwl_mvm_legacy_names[] = {  	HCMD_NAME(D3_CONFIG_CMD),  	HCMD_NAME(PROT_OFFLOAD_CONFIG_CMD),  	HCMD_NAME(OFFLOADS_QUERY_CMD), -	HCMD_NAME(REMOTE_WAKE_CONFIG_CMD),  	HCMD_NAME(MATCH_FOUND_NOTIFICATION),  	HCMD_NAME(DTS_MEASUREMENT_NOTIFICATION),  	HCMD_NAME(WOWLAN_PATTERNS), @@ -503,6 +540,7 @@ static const struct iwl_hcmd_names iwl_mvm_data_path_names[] = {  	HCMD_NAME(TLC_MNG_CONFIG_CMD),  	HCMD_NAME(CHEST_COLLECTOR_FILTER_CONFIG_CMD),  	HCMD_NAME(MONITOR_NOTIF), +	HCMD_NAME(THERMAL_DUAL_CHAIN_REQUEST),  	HCMD_NAME(STA_PM_NOTIF),  	HCMD_NAME(MU_GROUP_MGMT_NOTIF),  	HCMD_NAME(RX_QUEUES_NOTIFICATION), |