aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211
diff options
context:
space:
mode:
Diffstat (limited to 'net/mac80211')
-rw-r--r--net/mac80211/debugfs_sta.c3
-rw-r--r--net/mac80211/rx.c7
-rw-r--r--net/mac80211/sta_info.c28
-rw-r--r--net/mac80211/sta_info.h14
-rw-r--r--net/mac80211/tx.c1
5 files changed, 28 insertions, 25 deletions
diff --git a/net/mac80211/debugfs_sta.c b/net/mac80211/debugfs_sta.c
index ac61353ae7ce..47db0d4aa433 100644
--- a/net/mac80211/debugfs_sta.c
+++ b/net/mac80211/debugfs_sta.c
@@ -74,11 +74,10 @@ static ssize_t sta_flags_read(struct file *file, char __user *userbuf,
74{ 74{
75 char buf[100]; 75 char buf[100];
76 struct sta_info *sta = file->private_data; 76 struct sta_info *sta = file->private_data;
77 int res = scnprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s%s", 77 int res = scnprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s",
78 sta->flags & WLAN_STA_AUTH ? "AUTH\n" : "", 78 sta->flags & WLAN_STA_AUTH ? "AUTH\n" : "",
79 sta->flags & WLAN_STA_ASSOC ? "ASSOC\n" : "", 79 sta->flags & WLAN_STA_ASSOC ? "ASSOC\n" : "",
80 sta->flags & WLAN_STA_PS ? "PS\n" : "", 80 sta->flags & WLAN_STA_PS ? "PS\n" : "",
81 sta->flags & WLAN_STA_TIM ? "TIM\n" : "",
82 sta->flags & WLAN_STA_AUTHORIZED ? "AUTHORIZED\n" : "", 81 sta->flags & WLAN_STA_AUTHORIZED ? "AUTHORIZED\n" : "",
83 sta->flags & WLAN_STA_SHORT_PREAMBLE ? "SHORT PREAMBLE\n" : "", 82 sta->flags & WLAN_STA_SHORT_PREAMBLE ? "SHORT PREAMBLE\n" : "",
84 sta->flags & WLAN_STA_WME ? "WME\n" : "", 83 sta->flags & WLAN_STA_WME ? "WME\n" : "",
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index af606f715016..0e8a371496b3 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -598,7 +598,7 @@ static int ap_sta_ps_end(struct net_device *dev, struct sta_info *sta)
598 sdata = IEEE80211_DEV_TO_SUB_IF(sta->dev); 598 sdata = IEEE80211_DEV_TO_SUB_IF(sta->dev);
599 if (sdata->bss) 599 if (sdata->bss)
600 atomic_dec(&sdata->bss->num_sta_ps); 600 atomic_dec(&sdata->bss->num_sta_ps);
601 sta->flags &= ~(WLAN_STA_PS | WLAN_STA_TIM | WLAN_STA_PSPOLL); 601 sta->flags &= ~(WLAN_STA_PS | WLAN_STA_PSPOLL);
602 if (!skb_queue_empty(&sta->ps_tx_buf)) { 602 if (!skb_queue_empty(&sta->ps_tx_buf)) {
603 if (sdata->bss) 603 if (sdata->bss)
604 bss_tim_clear(local, sdata->bss, sta->aid); 604 bss_tim_clear(local, sdata->bss, sta->aid);
@@ -938,10 +938,9 @@ ieee80211_rx_h_ps_poll(struct ieee80211_txrx_data *rx)
938 938
939 /* Use MoreData flag to indicate whether there are more 939 /* Use MoreData flag to indicate whether there are more
940 * buffered frames for this STA */ 940 * buffered frames for this STA */
941 if (no_pending_pkts) { 941 if (no_pending_pkts)
942 hdr->frame_control &= cpu_to_le16(~IEEE80211_FCTL_MOREDATA); 942 hdr->frame_control &= cpu_to_le16(~IEEE80211_FCTL_MOREDATA);
943 rx->sta->flags &= ~WLAN_STA_TIM; 943 else
944 } else
945 hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_MOREDATA); 944 hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_MOREDATA);
946 945
947 dev_queue_xmit(skb); 946 dev_queue_xmit(skb);
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
index cbe00979e444..a843bb7dd2d3 100644
--- a/net/mac80211/sta_info.c
+++ b/net/mac80211/sta_info.c
@@ -286,6 +286,7 @@ static void sta_info_cleanup_expire_buffered(struct ieee80211_local *local,
286{ 286{
287 unsigned long flags; 287 unsigned long flags;
288 struct sk_buff *skb; 288 struct sk_buff *skb;
289 struct ieee80211_sub_if_data *sdata;
289 DECLARE_MAC_BUF(mac); 290 DECLARE_MAC_BUF(mac);
290 291
291 if (skb_queue_empty(&sta->ps_tx_buf)) 292 if (skb_queue_empty(&sta->ps_tx_buf))
@@ -294,21 +295,28 @@ static void sta_info_cleanup_expire_buffered(struct ieee80211_local *local,
294 for (;;) { 295 for (;;) {
295 spin_lock_irqsave(&sta->ps_tx_buf.lock, flags); 296 spin_lock_irqsave(&sta->ps_tx_buf.lock, flags);
296 skb = skb_peek(&sta->ps_tx_buf); 297 skb = skb_peek(&sta->ps_tx_buf);
297 if (sta_info_buffer_expired(local, sta, skb)) { 298 if (sta_info_buffer_expired(local, sta, skb))
298 skb = __skb_dequeue(&sta->ps_tx_buf); 299 skb = __skb_dequeue(&sta->ps_tx_buf);
299 if (skb_queue_empty(&sta->ps_tx_buf)) 300 else
300 sta->flags &= ~WLAN_STA_TIM;
301 } else
302 skb = NULL; 301 skb = NULL;
303 spin_unlock_irqrestore(&sta->ps_tx_buf.lock, flags); 302 spin_unlock_irqrestore(&sta->ps_tx_buf.lock, flags);
304 303
305 if (skb) { 304 if (!skb)
306 local->total_ps_buffered--;
307 printk(KERN_DEBUG "Buffered frame expired (STA "
308 "%s)\n", print_mac(mac, sta->addr));
309 dev_kfree_skb(skb);
310 } else
311 break; 305 break;
306
307 sdata = IEEE80211_DEV_TO_SUB_IF(sta->dev);
308 local->total_ps_buffered--;
309 printk(KERN_DEBUG "Buffered frame expired (STA "
310 "%s)\n", print_mac(mac, sta->addr));
311 dev_kfree_skb(skb);
312
313 if (skb_queue_empty(&sta->ps_tx_buf)) {
314 if (sdata->bss)
315 bss_tim_set(sta->local, sdata->bss, sta->aid);
316 if (sta->local->ops->set_tim)
317 sta->local->ops->set_tim(local_to_hw(sta->local),
318 sta->aid, 0);
319 }
312 } 320 }
313} 321}
314 322
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
index ca51d29b7008..f3d9f872db4a 100644
--- a/net/mac80211/sta_info.h
+++ b/net/mac80211/sta_info.h
@@ -23,7 +23,6 @@
23 * @WLAN_STA_AUTH: Station is authenticated. 23 * @WLAN_STA_AUTH: Station is authenticated.
24 * @WLAN_STA_ASSOC: Station is associated. 24 * @WLAN_STA_ASSOC: Station is associated.
25 * @WLAN_STA_PS: Station is in power-save mode 25 * @WLAN_STA_PS: Station is in power-save mode
26 * @WLAN_STA_TIM: TIM bit is on for this PS station (traffic buffered)
27 * @WLAN_STA_AUTHORIZED: Station is authorized to send/receive traffic. 26 * @WLAN_STA_AUTHORIZED: Station is authorized to send/receive traffic.
28 * This bit is always checked so needs to be enabled for all stations 27 * This bit is always checked so needs to be enabled for all stations
29 * when virtual port control is not in use. 28 * when virtual port control is not in use.
@@ -38,13 +37,12 @@ enum ieee80211_sta_info_flags {
38 WLAN_STA_AUTH = 1<<0, 37 WLAN_STA_AUTH = 1<<0,
39 WLAN_STA_ASSOC = 1<<1, 38 WLAN_STA_ASSOC = 1<<1,
40 WLAN_STA_PS = 1<<2, 39 WLAN_STA_PS = 1<<2,
41 WLAN_STA_TIM = 1<<3, 40 WLAN_STA_AUTHORIZED = 1<<3,
42 WLAN_STA_AUTHORIZED = 1<<4, 41 WLAN_STA_SHORT_PREAMBLE = 1<<4,
43 WLAN_STA_SHORT_PREAMBLE = 1<<5, 42 WLAN_STA_ASSOC_AP = 1<<5,
44 WLAN_STA_ASSOC_AP = 1<<6, 43 WLAN_STA_WME = 1<<6,
45 WLAN_STA_WME = 1<<7, 44 WLAN_STA_WDS = 1<<7,
46 WLAN_STA_WDS = 1<<8, 45 WLAN_STA_PSPOLL = 1<<8,
47 WLAN_STA_PSPOLL = 1<<9,
48}; 46};
49 47
50#define STA_TID_NUM 16 48#define STA_TID_NUM 16
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index 82474a8f251b..db6a871b51ed 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -404,7 +404,6 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_txrx_data *tx)
404 print_mac(mac, sta->addr), sta->aid, 404 print_mac(mac, sta->addr), sta->aid,
405 skb_queue_len(&sta->ps_tx_buf)); 405 skb_queue_len(&sta->ps_tx_buf));
406#endif /* CONFIG_MAC80211_VERBOSE_PS_DEBUG */ 406#endif /* CONFIG_MAC80211_VERBOSE_PS_DEBUG */
407 sta->flags |= WLAN_STA_TIM;
408 if (tx->local->total_ps_buffered >= TOTAL_MAX_TX_BUFFER) 407 if (tx->local->total_ps_buffered >= TOTAL_MAX_TX_BUFFER)
409 purge_old_ps_buffers(tx->local); 408 purge_old_ps_buffers(tx->local);
410 if (skb_queue_len(&sta->ps_tx_buf) >= STA_MAX_TX_BUFFER) { 409 if (skb_queue_len(&sta->ps_tx_buf) >= STA_MAX_TX_BUFFER) {