mac80211: improve ath9k AP A-MPDU PS buffering
SVN-Revision: 25779
This commit is contained in:
parent
e21f69d640
commit
1f08de0a7e
@ -1,6 +1,6 @@
|
|||||||
--- a/include/net/mac80211.h
|
--- a/include/net/mac80211.h
|
||||||
+++ b/include/net/mac80211.h
|
+++ b/include/net/mac80211.h
|
||||||
@@ -2209,6 +2209,20 @@ static inline int ieee80211_sta_ps_trans
|
@@ -2209,6 +2209,18 @@ static inline int ieee80211_sta_ps_trans
|
||||||
#define IEEE80211_TX_STATUS_HEADROOM 13
|
#define IEEE80211_TX_STATUS_HEADROOM 13
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -10,10 +10,8 @@
|
|||||||
+ * them back to mac80211 for retransmission, the station needs to be told
|
+ * them back to mac80211 for retransmission, the station needs to be told
|
||||||
+ * to wake up using the TIM bitmap in the beacon.
|
+ * to wake up using the TIM bitmap in the beacon.
|
||||||
+ *
|
+ *
|
||||||
+ * This function sets the station's TIM bit - it will be cleared automatically
|
+ * This function sets the station's TIM bit - it will be cleared when the
|
||||||
+ * either when the station wakes up (and mac80211 has flushed out its
|
+ * station wakes up.
|
||||||
+ * buffered frames), or if all remaining buffered frames in mac80211 have
|
|
||||||
+ * timed out.
|
|
||||||
+ */
|
+ */
|
||||||
+void ieee80211_sta_set_tim(struct ieee80211_sta *sta);
|
+void ieee80211_sta_set_tim(struct ieee80211_sta *sta);
|
||||||
+
|
+
|
||||||
@ -23,7 +21,25 @@
|
|||||||
* Call this function for all transmitted frames after they have been
|
* Call this function for all transmitted frames after they have been
|
||||||
--- a/net/mac80211/sta_info.c
|
--- a/net/mac80211/sta_info.c
|
||||||
+++ b/net/mac80211/sta_info.c
|
+++ b/net/mac80211/sta_info.c
|
||||||
@@ -991,3 +991,11 @@ void ieee80211_sta_block_awake(struct ie
|
@@ -608,7 +608,8 @@ static bool sta_info_cleanup_expire_buff
|
||||||
|
#endif
|
||||||
|
dev_kfree_skb(skb);
|
||||||
|
|
||||||
|
- if (skb_queue_empty(&sta->ps_tx_buf))
|
||||||
|
+ if (skb_queue_empty(&sta->ps_tx_buf) &&
|
||||||
|
+ !test_sta_flags(sta, WLAN_STA_PS_DRIVER_BUF))
|
||||||
|
sta_info_clear_tim_bit(sta);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -899,6 +900,7 @@ void ieee80211_sta_ps_deliver_wakeup(str
|
||||||
|
struct ieee80211_local *local = sdata->local;
|
||||||
|
int sent, buffered;
|
||||||
|
|
||||||
|
+ clear_sta_flags(sta, WLAN_STA_PS_DRIVER_BUF);
|
||||||
|
if (!(local->hw.flags & IEEE80211_HW_AP_LINK_PS))
|
||||||
|
drv_sta_notify(local, sdata, STA_NOTIFY_AWAKE, &sta->sta);
|
||||||
|
|
||||||
|
@@ -991,3 +993,12 @@ void ieee80211_sta_block_awake(struct ie
|
||||||
ieee80211_queue_work(hw, &sta->drv_unblock_wk);
|
ieee80211_queue_work(hw, &sta->drv_unblock_wk);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ieee80211_sta_block_awake);
|
EXPORT_SYMBOL(ieee80211_sta_block_awake);
|
||||||
@ -32,6 +48,26 @@
|
|||||||
+{
|
+{
|
||||||
+ struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
|
+ struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
|
||||||
+
|
+
|
||||||
|
+ set_sta_flags(sta, WLAN_STA_PS_DRIVER_BUF);
|
||||||
+ sta_info_set_tim_bit(sta);
|
+ sta_info_set_tim_bit(sta);
|
||||||
+}
|
+}
|
||||||
+EXPORT_SYMBOL(ieee80211_sta_set_tim);
|
+EXPORT_SYMBOL(ieee80211_sta_set_tim);
|
||||||
|
--- a/net/mac80211/sta_info.h
|
||||||
|
+++ b/net/mac80211/sta_info.h
|
||||||
|
@@ -43,6 +43,8 @@
|
||||||
|
* be in the queues
|
||||||
|
* @WLAN_STA_PSPOLL: Station sent PS-poll while driver was keeping
|
||||||
|
* station in power-save mode, reply when the driver unblocks.
|
||||||
|
+ * @WLAN_STA_PS_DRIVER_BUF: Station has frames pending in driver internal
|
||||||
|
+ * buffers. Automatically cleared on station wake-up.
|
||||||
|
*/
|
||||||
|
enum ieee80211_sta_info_flags {
|
||||||
|
WLAN_STA_AUTH = 1<<0,
|
||||||
|
@@ -58,6 +60,7 @@ enum ieee80211_sta_info_flags {
|
||||||
|
WLAN_STA_BLOCK_BA = 1<<11,
|
||||||
|
WLAN_STA_PS_DRIVER = 1<<12,
|
||||||
|
WLAN_STA_PSPOLL = 1<<13,
|
||||||
|
+ WLAN_STA_PS_DRIVER_BUF = 1<<14,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define STA_TID_NUM 16
|
||||||
|
@ -132,7 +132,7 @@
|
|||||||
NLA_PUT_U32(msg, NL80211_STA_INFO_RX_PACKETS,
|
NLA_PUT_U32(msg, NL80211_STA_INFO_RX_PACKETS,
|
||||||
--- a/net/mac80211/sta_info.h
|
--- a/net/mac80211/sta_info.h
|
||||||
+++ b/net/mac80211/sta_info.h
|
+++ b/net/mac80211/sta_info.h
|
||||||
@@ -209,6 +209,8 @@ enum plink_state {
|
@@ -212,6 +212,8 @@ enum plink_state {
|
||||||
* @rate_ctrl_priv: rate control private per-STA pointer
|
* @rate_ctrl_priv: rate control private per-STA pointer
|
||||||
* @last_tx_rate: rate used for last transmit, to report to userspace as
|
* @last_tx_rate: rate used for last transmit, to report to userspace as
|
||||||
* "the" transmit rate
|
* "the" transmit rate
|
||||||
@ -141,7 +141,7 @@
|
|||||||
* @lock: used for locking all fields that require locking, see comments
|
* @lock: used for locking all fields that require locking, see comments
|
||||||
* in the header file.
|
* in the header file.
|
||||||
* @flaglock: spinlock for flags accesses
|
* @flaglock: spinlock for flags accesses
|
||||||
@@ -311,6 +313,8 @@ struct sta_info {
|
@@ -314,6 +316,8 @@ struct sta_info {
|
||||||
unsigned long tx_bytes;
|
unsigned long tx_bytes;
|
||||||
unsigned long tx_fragments;
|
unsigned long tx_fragments;
|
||||||
struct ieee80211_tx_rate last_tx_rate;
|
struct ieee80211_tx_rate last_tx_rate;
|
||||||
|
Loading…
Reference in New Issue
Block a user