aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath6kl/wmi.c
diff options
context:
space:
mode:
authorNaveen Gangadharan <ngangadh@qca.qualcomm.com>2012-02-08 20:51:36 -0500
committerKalle Valo <kvalo@qca.qualcomm.com>2012-02-27 08:49:06 -0500
commitd0ff7383a3164adff7072719717d574436ec1677 (patch)
tree82608cf36a386bf7874f6e4c8fd43397c2467dc8 /drivers/net/wireless/ath/ath6kl/wmi.c
parent3b96d49a79021ce4c1ca26aecd784d16aeb91a7c (diff)
ath6kl: Add unicast mgmt frame buffering
PS buffering of unicast Action frames that are sent in a context of a BSS. In AP mode when the recepient station goes to powersave and PS_POLL flag is not set, we would buffer the frames. Send out unicast mgmt bufferred frame when PS_POLL is received. This fixes a bug in P2P GO behavior when sending a GO Discoverability Request to a client that is in sleep mode. kvalo: indentation fixes Signed-off-by: Thirumalai Pachamuthu <tpachamu@qca.qualcomm.com> Signed-off-by: Naveen Gangadharan <ngangadh@qca.qualcomm.com> Signed-off-by: Aarthi Thiruvengadam <athiruve@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath6kl/wmi.c')
-rw-r--r--drivers/net/wireless/ath/ath6kl/wmi.c37
1 files changed, 32 insertions, 5 deletions
diff --git a/drivers/net/wireless/ath/ath6kl/wmi.c b/drivers/net/wireless/ath/ath6kl/wmi.c
index bbbe0a74d3c3..fce29f7f2e5c 100644
--- a/drivers/net/wireless/ath/ath6kl/wmi.c
+++ b/drivers/net/wireless/ath/ath6kl/wmi.c
@@ -3182,8 +3182,9 @@ int ath6kl_wmi_remain_on_chnl_cmd(struct wmi *wmi, u8 if_idx, u32 freq, u32 dur)
3182 * ath6kl_wmi_send_mgmt_cmd instead. The new function supports P2P 3182 * ath6kl_wmi_send_mgmt_cmd instead. The new function supports P2P
3183 * mgmt operations using station interface. 3183 * mgmt operations using station interface.
3184 */ 3184 */
3185int ath6kl_wmi_send_action_cmd(struct wmi *wmi, u8 if_idx, u32 id, u32 freq, 3185static int ath6kl_wmi_send_action_cmd(struct wmi *wmi, u8 if_idx, u32 id,
3186 u32 wait, const u8 *data, u16 data_len) 3186 u32 freq, u32 wait, const u8 *data,
3187 u16 data_len)
3187{ 3188{
3188 struct sk_buff *skb; 3189 struct sk_buff *skb;
3189 struct wmi_send_action_cmd *p; 3190 struct wmi_send_action_cmd *p;
@@ -3219,9 +3220,9 @@ int ath6kl_wmi_send_action_cmd(struct wmi *wmi, u8 if_idx, u32 id, u32 freq,
3219 NO_SYNC_WMIFLAG); 3220 NO_SYNC_WMIFLAG);
3220} 3221}
3221 3222
3222int ath6kl_wmi_send_mgmt_cmd(struct wmi *wmi, u8 if_idx, u32 id, u32 freq, 3223static int __ath6kl_wmi_send_mgmt_cmd(struct wmi *wmi, u8 if_idx, u32 id,
3223 u32 wait, const u8 *data, u16 data_len, 3224 u32 freq, u32 wait, const u8 *data,
3224 u32 no_cck) 3225 u16 data_len, u32 no_cck)
3225{ 3226{
3226 struct sk_buff *skb; 3227 struct sk_buff *skb;
3227 struct wmi_send_mgmt_cmd *p; 3228 struct wmi_send_mgmt_cmd *p;
@@ -3258,6 +3259,32 @@ int ath6kl_wmi_send_mgmt_cmd(struct wmi *wmi, u8 if_idx, u32 id, u32 freq,
3258 NO_SYNC_WMIFLAG); 3259 NO_SYNC_WMIFLAG);
3259} 3260}
3260 3261
3262int ath6kl_wmi_send_mgmt_cmd(struct wmi *wmi, u8 if_idx, u32 id, u32 freq,
3263 u32 wait, const u8 *data, u16 data_len,
3264 u32 no_cck)
3265{
3266 int status;
3267 struct ath6kl *ar = wmi->parent_dev;
3268
3269 if (test_bit(ATH6KL_FW_CAPABILITY_STA_P2PDEV_DUPLEX,
3270 ar->fw_capabilities)) {
3271 /*
3272 * If capable of doing P2P mgmt operations using
3273 * station interface, send additional information like
3274 * supported rates to advertise and xmit rates for
3275 * probe requests
3276 */
3277 status = __ath6kl_wmi_send_mgmt_cmd(ar->wmi, if_idx, id, freq,
3278 wait, data, data_len,
3279 no_cck);
3280 } else {
3281 status = ath6kl_wmi_send_action_cmd(ar->wmi, if_idx, id, freq,
3282 wait, data, data_len);
3283 }
3284
3285 return status;
3286}
3287
3261int ath6kl_wmi_send_probe_response_cmd(struct wmi *wmi, u8 if_idx, u32 freq, 3288int ath6kl_wmi_send_probe_response_cmd(struct wmi *wmi, u8 if_idx, u32 freq,
3262 const u8 *dst, const u8 *data, 3289 const u8 *dst, const u8 *data,
3263 u16 data_len) 3290 u16 data_len)