diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/mvm/ops.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/ops.c | 41 |
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 | ||
853 | static 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); | ||
877 | out: | ||
878 | rcu_read_unlock(); | ||
879 | } | ||
853 | static int iwl_mvm_enter_d0i3(struct iwl_op_mode *op_mode) | 880 | static 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); |