aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/mvm/ops.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/iwlwifi/mvm/ops.c')
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/ops.c41
1 files changed, 36 insertions, 5 deletions
diff --git a/drivers/net/wireless/iwlwifi/mvm/ops.c b/drivers/net/wireless/iwlwifi/mvm/ops.c
index 75fbc4054173..87c32e80904c 100644
--- a/drivers/net/wireless/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/iwlwifi/mvm/ops.c
@@ -850,6 +850,33 @@ static void iwl_mvm_enter_d0i3_iterator(void *_data, u8 *mac,
850 data->vif_count++; 850 data->vif_count++;
851} 851}
852 852
853static void iwl_mvm_set_wowlan_data(struct iwl_mvm *mvm,
854 struct iwl_wowlan_config_cmd_v3 *cmd,
855 struct iwl_d0i3_iter_data *iter_data)
856{
857 struct ieee80211_sta *ap_sta;
858 struct iwl_mvm_sta *mvm_ap_sta;
859
860 if (iter_data->ap_sta_id == IWL_MVM_STATION_COUNT)
861 return;
862
863 rcu_read_lock();
864
865 ap_sta = rcu_dereference(mvm->fw_id_to_mac_id[iter_data->ap_sta_id]);
866 if (IS_ERR_OR_NULL(ap_sta))
867 goto out;
868
869 mvm_ap_sta = iwl_mvm_sta_from_mac80211(ap_sta);
870 cmd->common.is_11n_connection = ap_sta->ht_cap.ht_supported;
871
872 /*
873 * The d0i3 uCode takes care of the nonqos counters,
874 * so configure only the qos seq ones.
875 */
876 iwl_mvm_set_wowlan_qos_seq(mvm_ap_sta, &cmd->common);
877out:
878 rcu_read_unlock();
879}
853static int iwl_mvm_enter_d0i3(struct iwl_op_mode *op_mode) 880static int iwl_mvm_enter_d0i3(struct iwl_op_mode *op_mode)
854{ 881{
855 struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode); 882 struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode);
@@ -858,11 +885,14 @@ static int iwl_mvm_enter_d0i3(struct iwl_op_mode *op_mode)
858 struct iwl_d0i3_iter_data d0i3_iter_data = { 885 struct iwl_d0i3_iter_data d0i3_iter_data = {
859 .mvm = mvm, 886 .mvm = mvm,
860 }; 887 };
861 struct iwl_wowlan_config_cmd wowlan_config_cmd = { 888 struct iwl_wowlan_config_cmd_v3 wowlan_config_cmd = {
862 .wakeup_filter = cpu_to_le32(IWL_WOWLAN_WAKEUP_RX_FRAME | 889 .common = {
863 IWL_WOWLAN_WAKEUP_BEACON_MISS | 890 .wakeup_filter =
864 IWL_WOWLAN_WAKEUP_LINK_CHANGE | 891 cpu_to_le32(IWL_WOWLAN_WAKEUP_RX_FRAME |
865 IWL_WOWLAN_WAKEUP_BCN_FILTERING), 892 IWL_WOWLAN_WAKEUP_BEACON_MISS |
893 IWL_WOWLAN_WAKEUP_LINK_CHANGE |
894 IWL_WOWLAN_WAKEUP_BCN_FILTERING),
895 },
866 }; 896 };
867 struct iwl_d3_manager_config d3_cfg_cmd = { 897 struct iwl_d3_manager_config d3_cfg_cmd = {
868 .min_sleep_time = cpu_to_le32(1000), 898 .min_sleep_time = cpu_to_le32(1000),
@@ -881,6 +911,7 @@ static int iwl_mvm_enter_d0i3(struct iwl_op_mode *op_mode)
881 mvm->d0i3_ap_sta_id = IWL_MVM_STATION_COUNT; 911 mvm->d0i3_ap_sta_id = IWL_MVM_STATION_COUNT;
882 } 912 }
883 913
914 iwl_mvm_set_wowlan_data(mvm, &wowlan_config_cmd, &d0i3_iter_data);
884 ret = iwl_mvm_send_cmd_pdu(mvm, WOWLAN_CONFIGURATION, flags, 915 ret = iwl_mvm_send_cmd_pdu(mvm, WOWLAN_CONFIGURATION, flags,
885 sizeof(wowlan_config_cmd), 916 sizeof(wowlan_config_cmd),
886 &wowlan_config_cmd); 917 &wowlan_config_cmd);