aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/wl12xx/wl1251_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/wl12xx/wl1251_main.c')
-rw-r--r--drivers/net/wireless/wl12xx/wl1251_main.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/net/wireless/wl12xx/wl1251_main.c b/drivers/net/wireless/wl12xx/wl1251_main.c
index f17ce06b6c2..d469d3dcd05 100644
--- a/drivers/net/wireless/wl12xx/wl1251_main.c
+++ b/drivers/net/wireless/wl12xx/wl1251_main.c
@@ -563,6 +563,27 @@ static void wl1251_op_remove_interface(struct ieee80211_hw *hw,
563 mutex_unlock(&wl->mutex); 563 mutex_unlock(&wl->mutex);
564} 564}
565 565
566static int wl1251_build_qos_null_data(struct wl1251 *wl)
567{
568 struct ieee80211_qos_hdr template;
569
570 memset(&template, 0, sizeof(template));
571
572 memcpy(template.addr1, wl->bssid, ETH_ALEN);
573 memcpy(template.addr2, wl->mac_addr, ETH_ALEN);
574 memcpy(template.addr3, wl->bssid, ETH_ALEN);
575
576 template.frame_control = cpu_to_le16(IEEE80211_FTYPE_DATA |
577 IEEE80211_STYPE_QOS_NULLFUNC |
578 IEEE80211_FCTL_TODS);
579
580 /* FIXME: not sure what priority to use here */
581 template.qos_ctrl = cpu_to_le16(0);
582
583 return wl1251_cmd_template_set(wl, CMD_QOS_NULL_DATA, &template,
584 sizeof(template));
585}
586
566static int wl1251_op_config(struct ieee80211_hw *hw, u32 changed) 587static int wl1251_op_config(struct ieee80211_hw *hw, u32 changed)
567{ 588{
568 struct wl1251 *wl = hw->priv; 589 struct wl1251 *wl = hw->priv;
@@ -948,6 +969,10 @@ static void wl1251_op_bss_info_changed(struct ieee80211_hw *hw,
948 if (ret < 0) 969 if (ret < 0)
949 goto out_sleep; 970 goto out_sleep;
950 971
972 ret = wl1251_build_qos_null_data(wl);
973 if (ret < 0)
974 goto out;
975
951 if (wl->bss_type != BSS_TYPE_IBSS) { 976 if (wl->bss_type != BSS_TYPE_IBSS) {
952 ret = wl1251_join(wl, wl->bss_type, wl->channel, 977 ret = wl1251_join(wl, wl->bss_type, wl->channel,
953 wl->beacon_int, wl->dtim_period); 978 wl->beacon_int, wl->dtim_period);