diff options
Diffstat (limited to 'net/mac80211/rx.c')
-rw-r--r-- | net/mac80211/rx.c | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 0e8a371496b3..48574f6c0e74 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -596,19 +596,20 @@ static int ap_sta_ps_end(struct net_device *dev, struct sta_info *sta) | |||
596 | DECLARE_MAC_BUF(mac); | 596 | DECLARE_MAC_BUF(mac); |
597 | 597 | ||
598 | sdata = IEEE80211_DEV_TO_SUB_IF(sta->dev); | 598 | sdata = IEEE80211_DEV_TO_SUB_IF(sta->dev); |
599 | |||
599 | if (sdata->bss) | 600 | if (sdata->bss) |
600 | atomic_dec(&sdata->bss->num_sta_ps); | 601 | atomic_dec(&sdata->bss->num_sta_ps); |
602 | |||
601 | sta->flags &= ~(WLAN_STA_PS | WLAN_STA_PSPOLL); | 603 | sta->flags &= ~(WLAN_STA_PS | WLAN_STA_PSPOLL); |
602 | if (!skb_queue_empty(&sta->ps_tx_buf)) { | 604 | |
603 | if (sdata->bss) | 605 | if (!skb_queue_empty(&sta->ps_tx_buf)) |
604 | bss_tim_clear(local, sdata->bss, sta->aid); | 606 | sta_info_clear_tim_bit(sta); |
605 | if (local->ops->set_tim) | 607 | |
606 | local->ops->set_tim(local_to_hw(local), sta->aid, 0); | ||
607 | } | ||
608 | #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG | 608 | #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG |
609 | printk(KERN_DEBUG "%s: STA %s aid %d exits power save mode\n", | 609 | printk(KERN_DEBUG "%s: STA %s aid %d exits power save mode\n", |
610 | dev->name, print_mac(mac, sta->addr), sta->aid); | 610 | dev->name, print_mac(mac, sta->addr), sta->aid); |
611 | #endif /* CONFIG_MAC80211_VERBOSE_PS_DEBUG */ | 611 | #endif /* CONFIG_MAC80211_VERBOSE_PS_DEBUG */ |
612 | |||
612 | /* Send all buffered frames to the station */ | 613 | /* Send all buffered frames to the station */ |
613 | while ((skb = skb_dequeue(&sta->tx_filtered)) != NULL) { | 614 | while ((skb = skb_dequeue(&sta->tx_filtered)) != NULL) { |
614 | pkt_data = (struct ieee80211_tx_packet_data *) skb->cb; | 615 | pkt_data = (struct ieee80211_tx_packet_data *) skb->cb; |
@@ -945,20 +946,20 @@ ieee80211_rx_h_ps_poll(struct ieee80211_txrx_data *rx) | |||
945 | 946 | ||
946 | dev_queue_xmit(skb); | 947 | dev_queue_xmit(skb); |
947 | 948 | ||
948 | if (no_pending_pkts) { | 949 | if (no_pending_pkts) |
949 | if (rx->sdata->bss) | 950 | sta_info_clear_tim_bit(rx->sta); |
950 | bss_tim_clear(rx->local, rx->sdata->bss, rx->sta->aid); | ||
951 | if (rx->local->ops->set_tim) | ||
952 | rx->local->ops->set_tim(local_to_hw(rx->local), | ||
953 | rx->sta->aid, 0); | ||
954 | } | ||
955 | #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG | 951 | #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG |
956 | } else if (!rx->u.rx.sent_ps_buffered) { | 952 | } else if (!rx->u.rx.sent_ps_buffered) { |
953 | /* | ||
954 | * FIXME: This can be the result of a race condition between | ||
955 | * us expiring a frame and the station polling for it. | ||
956 | * Should we send it a null-func frame indicating we | ||
957 | * have nothing buffered for it? | ||
958 | */ | ||
957 | printk(KERN_DEBUG "%s: STA %s sent PS Poll even " | 959 | printk(KERN_DEBUG "%s: STA %s sent PS Poll even " |
958 | "though there is no buffered frames for it\n", | 960 | "though there is no buffered frames for it\n", |
959 | rx->dev->name, print_mac(mac, rx->sta->addr)); | 961 | rx->dev->name, print_mac(mac, rx->sta->addr)); |
960 | #endif /* CONFIG_MAC80211_VERBOSE_PS_DEBUG */ | 962 | #endif /* CONFIG_MAC80211_VERBOSE_PS_DEBUG */ |
961 | |||
962 | } | 963 | } |
963 | 964 | ||
964 | /* Free PS Poll skb here instead of returning RX_DROP that would | 965 | /* Free PS Poll skb here instead of returning RX_DROP that would |