diff options
author | Johannes Berg <johannes.berg@intel.com> | 2011-10-14 15:54:43 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-11-08 15:53:53 -0500 |
commit | 560124095f467c9920c25fa215ab1397dc37d0d6 (patch) | |
tree | a9581b4c69752611ffdf864f7aa9ffaae9821c3e /drivers | |
parent | 8b3408f8ee994973869d8ba32c5bf482bc4ddca4 (diff) |
iwlagn: update wowlan API
The WoWLAN API changed due to netdetect and
we now have a more generic "D3 configuration"
command that enables the sysassert & rfkill
wakeup triggers.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 13 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-commands.h | 27 |
2 files changed, 29 insertions, 11 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index ccba69b7f8a7..47dbcca56431 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -2028,6 +2028,7 @@ static int iwlagn_mac_suspend(struct ieee80211_hw *hw, | |||
2028 | .tkip = &tkip_cmd, | 2028 | .tkip = &tkip_cmd, |
2029 | .use_tkip = false, | 2029 | .use_tkip = false, |
2030 | }; | 2030 | }; |
2031 | struct iwlagn_d3_config_cmd d3_cfg_cmd = {}; | ||
2031 | int ret, i; | 2032 | int ret, i; |
2032 | u16 seq; | 2033 | u16 seq; |
2033 | 2034 | ||
@@ -2085,13 +2086,14 @@ static int iwlagn_mac_suspend(struct ieee80211_hw *hw, | |||
2085 | if (wowlan->four_way_handshake) | 2086 | if (wowlan->four_way_handshake) |
2086 | wakeup_filter_cmd.enabled |= | 2087 | wakeup_filter_cmd.enabled |= |
2087 | cpu_to_le32(IWLAGN_WOWLAN_WAKEUP_4WAY_HANDSHAKE); | 2088 | cpu_to_le32(IWLAGN_WOWLAN_WAKEUP_4WAY_HANDSHAKE); |
2088 | if (wowlan->rfkill_release) | ||
2089 | wakeup_filter_cmd.enabled |= | ||
2090 | cpu_to_le32(IWLAGN_WOWLAN_WAKEUP_RFKILL); | ||
2091 | if (wowlan->n_patterns) | 2089 | if (wowlan->n_patterns) |
2092 | wakeup_filter_cmd.enabled |= | 2090 | wakeup_filter_cmd.enabled |= |
2093 | cpu_to_le32(IWLAGN_WOWLAN_WAKEUP_PATTERN_MATCH); | 2091 | cpu_to_le32(IWLAGN_WOWLAN_WAKEUP_PATTERN_MATCH); |
2094 | 2092 | ||
2093 | if (wowlan->rfkill_release) | ||
2094 | d3_cfg_cmd.wakeup_flags |= | ||
2095 | cpu_to_le32(IWLAGN_D3_WAKEUP_RFKILL); | ||
2096 | |||
2095 | iwl_scan_cancel_timeout(priv, 200); | 2097 | iwl_scan_cancel_timeout(priv, 200); |
2096 | 2098 | ||
2097 | memcpy(&rxon, &ctx->active, sizeof(rxon)); | 2099 | memcpy(&rxon, &ctx->active, sizeof(rxon)); |
@@ -2179,6 +2181,11 @@ static int iwlagn_mac_suspend(struct ieee80211_hw *hw, | |||
2179 | } | 2181 | } |
2180 | } | 2182 | } |
2181 | 2183 | ||
2184 | ret = iwl_trans_send_cmd_pdu(trans(priv), REPLY_D3_CONFIG, CMD_SYNC, | ||
2185 | sizeof(d3_cfg_cmd), &d3_cfg_cmd); | ||
2186 | if (ret) | ||
2187 | goto error; | ||
2188 | |||
2182 | ret = iwl_trans_send_cmd_pdu(trans(priv), REPLY_WOWLAN_WAKEUP_FILTER, | 2189 | ret = iwl_trans_send_cmd_pdu(trans(priv), REPLY_WOWLAN_WAKEUP_FILTER, |
2183 | CMD_SYNC, sizeof(wakeup_filter_cmd), | 2190 | CMD_SYNC, sizeof(wakeup_filter_cmd), |
2184 | &wakeup_filter_cmd); | 2191 | &wakeup_filter_cmd); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h index 69d5f85d11e2..f4eccf583775 100644 --- a/drivers/net/wireless/iwlwifi/iwl-commands.h +++ b/drivers/net/wireless/iwlwifi/iwl-commands.h | |||
@@ -198,6 +198,7 @@ enum { | |||
198 | REPLY_WOWLAN_TKIP_PARAMS = 0xe3, | 198 | REPLY_WOWLAN_TKIP_PARAMS = 0xe3, |
199 | REPLY_WOWLAN_KEK_KCK_MATERIAL = 0xe4, | 199 | REPLY_WOWLAN_KEK_KCK_MATERIAL = 0xe4, |
200 | REPLY_WOWLAN_GET_STATUS = 0xe5, | 200 | REPLY_WOWLAN_GET_STATUS = 0xe5, |
201 | REPLY_D3_CONFIG = 0xd3, | ||
201 | 202 | ||
202 | REPLY_MAX = 0xff | 203 | REPLY_MAX = 0xff |
203 | }; | 204 | }; |
@@ -3801,6 +3802,19 @@ struct iwl_bt_coex_prot_env_cmd { | |||
3801 | } __attribute__((packed)); | 3802 | } __attribute__((packed)); |
3802 | 3803 | ||
3803 | /* | 3804 | /* |
3805 | * REPLY_D3_CONFIG | ||
3806 | */ | ||
3807 | enum iwlagn_d3_wakeup_filters { | ||
3808 | IWLAGN_D3_WAKEUP_RFKILL = BIT(0), | ||
3809 | IWLAGN_D3_WAKEUP_SYSASSERT = BIT(1), | ||
3810 | }; | ||
3811 | |||
3812 | struct iwlagn_d3_config_cmd { | ||
3813 | __le32 min_sleep_time; | ||
3814 | __le32 wakeup_flags; | ||
3815 | } __packed; | ||
3816 | |||
3817 | /* | ||
3804 | * REPLY_WOWLAN_PATTERNS | 3818 | * REPLY_WOWLAN_PATTERNS |
3805 | */ | 3819 | */ |
3806 | #define IWLAGN_WOWLAN_MIN_PATTERN_LEN 16 | 3820 | #define IWLAGN_WOWLAN_MIN_PATTERN_LEN 16 |
@@ -3830,19 +3844,16 @@ enum iwlagn_wowlan_wakeup_filters { | |||
3830 | IWLAGN_WOWLAN_WAKEUP_BEACON_MISS = BIT(2), | 3844 | IWLAGN_WOWLAN_WAKEUP_BEACON_MISS = BIT(2), |
3831 | IWLAGN_WOWLAN_WAKEUP_LINK_CHANGE = BIT(3), | 3845 | IWLAGN_WOWLAN_WAKEUP_LINK_CHANGE = BIT(3), |
3832 | IWLAGN_WOWLAN_WAKEUP_GTK_REKEY_FAIL = BIT(4), | 3846 | IWLAGN_WOWLAN_WAKEUP_GTK_REKEY_FAIL = BIT(4), |
3833 | IWLAGN_WOWLAN_WAKEUP_RFKILL = BIT(5), | 3847 | IWLAGN_WOWLAN_WAKEUP_EAP_IDENT_REQ = BIT(5), |
3834 | IWLAGN_WOWLAN_WAKEUP_UCODE_ERROR = BIT(6), | 3848 | IWLAGN_WOWLAN_WAKEUP_4WAY_HANDSHAKE = BIT(6), |
3835 | IWLAGN_WOWLAN_WAKEUP_EAP_IDENT_REQ = BIT(7), | 3849 | IWLAGN_WOWLAN_WAKEUP_ALWAYS = BIT(7), |
3836 | IWLAGN_WOWLAN_WAKEUP_4WAY_HANDSHAKE = BIT(8), | 3850 | IWLAGN_WOWLAN_WAKEUP_ENABLE_NET_DETECT = BIT(8), |
3837 | IWLAGN_WOWLAN_WAKEUP_ALWAYS = BIT(9), | ||
3838 | IWLAGN_WOWLAN_WAKEUP_ENABLE_NET_DETECT = BIT(10), | ||
3839 | }; | 3851 | }; |
3840 | 3852 | ||
3841 | struct iwlagn_wowlan_wakeup_filter_cmd { | 3853 | struct iwlagn_wowlan_wakeup_filter_cmd { |
3842 | __le32 enabled; | 3854 | __le32 enabled; |
3843 | __le16 non_qos_seq; | 3855 | __le16 non_qos_seq; |
3844 | u8 min_sleep_seconds; | 3856 | __le16 reserved; |
3845 | u8 reserved; | ||
3846 | __le16 qos_seq[8]; | 3857 | __le16 qos_seq[8]; |
3847 | }; | 3858 | }; |
3848 | 3859 | ||