aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/wl12xx/wl1251_main.c58
1 files changed, 16 insertions, 42 deletions
diff --git a/drivers/net/wireless/wl12xx/wl1251_main.c b/drivers/net/wireless/wl12xx/wl1251_main.c
index 4e373f3dbc43..6cce86462fac 100644
--- a/drivers/net/wireless/wl12xx/wl1251_main.c
+++ b/drivers/net/wireless/wl12xx/wl1251_main.c
@@ -563,45 +563,6 @@ 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_null_data(struct wl1251 *wl)
567{
568 struct wl12xx_null_data_template template;
569
570 if (!is_zero_ether_addr(wl->bssid)) {
571 memcpy(template.header.da, wl->bssid, ETH_ALEN);
572 memcpy(template.header.bssid, wl->bssid, ETH_ALEN);
573 } else {
574 memset(template.header.da, 0xff, ETH_ALEN);
575 memset(template.header.bssid, 0xff, ETH_ALEN);
576 }
577
578 memcpy(template.header.sa, wl->mac_addr, ETH_ALEN);
579 template.header.frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA |
580 IEEE80211_STYPE_NULLFUNC |
581 IEEE80211_FCTL_TODS);
582
583 return wl1251_cmd_template_set(wl, CMD_NULL_DATA, &template,
584 sizeof(template));
585
586}
587
588static int wl1251_build_ps_poll(struct wl1251 *wl, u16 aid)
589{
590 struct wl12xx_ps_poll_template template;
591
592 memcpy(template.bssid, wl->bssid, ETH_ALEN);
593 memcpy(template.ta, wl->mac_addr, ETH_ALEN);
594
595 /* aid in PS-Poll has its two MSBs each set to 1 */
596 template.aid = cpu_to_le16(1 << 15 | 1 << 14 | aid);
597
598 template.fc = cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_PSPOLL);
599
600 return wl1251_cmd_template_set(wl, CMD_PS_POLL, &template,
601 sizeof(template));
602
603}
604
605static int wl1251_op_config(struct ieee80211_hw *hw, u32 changed) 566static int wl1251_op_config(struct ieee80211_hw *hw, u32 changed)
606{ 567{
607 struct wl1251 *wl = hw->priv; 568 struct wl1251 *wl = hw->priv;
@@ -1101,7 +1062,7 @@ static void wl1251_op_bss_info_changed(struct ieee80211_hw *hw,
1101{ 1062{
1102 enum wl1251_cmd_ps_mode mode; 1063 enum wl1251_cmd_ps_mode mode;
1103 struct wl1251 *wl = hw->priv; 1064 struct wl1251 *wl = hw->priv;
1104 struct sk_buff *beacon; 1065 struct sk_buff *beacon, *skb;
1105 int ret; 1066 int ret;
1106 1067
1107 wl1251_debug(DEBUG_MAC80211, "mac80211 bss info changed"); 1068 wl1251_debug(DEBUG_MAC80211, "mac80211 bss info changed");
@@ -1115,7 +1076,13 @@ static void wl1251_op_bss_info_changed(struct ieee80211_hw *hw,
1115 if (changed & BSS_CHANGED_BSSID) { 1076 if (changed & BSS_CHANGED_BSSID) {
1116 memcpy(wl->bssid, bss_conf->bssid, ETH_ALEN); 1077 memcpy(wl->bssid, bss_conf->bssid, ETH_ALEN);
1117 1078
1118 ret = wl1251_build_null_data(wl); 1079 skb = ieee80211_nullfunc_get(wl->hw, wl->vif);
1080 if (!skb)
1081 goto out_sleep;
1082
1083 ret = wl1251_cmd_template_set(wl, CMD_NULL_DATA,
1084 skb->data, skb->len);
1085 dev_kfree_skb(skb);
1119 if (ret < 0) 1086 if (ret < 0)
1120 goto out; 1087 goto out;
1121 1088
@@ -1136,7 +1103,14 @@ static void wl1251_op_bss_info_changed(struct ieee80211_hw *hw,
1136 wl->dtim_period); 1103 wl->dtim_period);
1137 wl->aid = bss_conf->aid; 1104 wl->aid = bss_conf->aid;
1138 1105
1139 ret = wl1251_build_ps_poll(wl, wl->aid); 1106 skb = ieee80211_pspoll_get(wl->hw, wl->vif);
1107 if (!skb)
1108 goto out_sleep;
1109
1110 ret = wl1251_cmd_template_set(wl, CMD_PS_POLL,
1111 skb->data,
1112 skb->len);
1113 dev_kfree_skb(skb);
1140 if (ret < 0) 1114 if (ret < 0)
1141 goto out_sleep; 1115 goto out_sleep;
1142 1116