aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/mwl8k.c
diff options
context:
space:
mode:
authorNishant Sarmukadam <nishants@marvell.com>2011-04-21 07:04:58 -0400
committerJohn W. Linville <linville@tuxdriver.com>2011-04-25 14:50:16 -0400
commit3a769888797b7117005e9c60d4cd73a2efc92f8d (patch)
tree10dac38b65dce2efe1a6849d96eeea5e7e07536d /drivers/net/wireless/mwl8k.c
parent566875db5058f582ea56da891f9c3cabc01efff5 (diff)
mwl8k: Reserve buffers for tx management frames
Since queues are not stopped anymore, management frames would be dropped if the corresponding tx queue is full. This can cause issues say when we want to setup an ampdu stream and action frames i.e addba requests keep getting dropped frequently. Fix this by reserving some buffers to allow management frames to go through in queue full conditions. Signed-off-by: Nishant Sarmukadam <nishants@marvell.com> Signed-off-by: Pradeep Nemavat <pnemavat@marvell.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/mwl8k.c')
-rw-r--r--drivers/net/wireless/mwl8k.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/drivers/net/wireless/mwl8k.c b/drivers/net/wireless/mwl8k.c
index 93fe1bd91c36..63ee8cfe322b 100644
--- a/drivers/net/wireless/mwl8k.c
+++ b/drivers/net/wireless/mwl8k.c
@@ -1818,6 +1818,7 @@ mwl8k_txq_xmit(struct ieee80211_hw *hw, int index, struct sk_buff *skb)
1818 u8 tid = 0; 1818 u8 tid = 0;
1819 struct mwl8k_ampdu_stream *stream = NULL; 1819 struct mwl8k_ampdu_stream *stream = NULL;
1820 bool start_ba_session = false; 1820 bool start_ba_session = false;
1821 bool mgmtframe = false;
1821 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data; 1822 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data;
1822 1823
1823 wh = (struct ieee80211_hdr *)skb->data; 1824 wh = (struct ieee80211_hdr *)skb->data;
@@ -1826,6 +1827,9 @@ mwl8k_txq_xmit(struct ieee80211_hw *hw, int index, struct sk_buff *skb)
1826 else 1827 else
1827 qos = 0; 1828 qos = 0;
1828 1829
1830 if (ieee80211_is_mgmt(wh->frame_control))
1831 mgmtframe = true;
1832
1829 if (priv->ap_fw) 1833 if (priv->ap_fw)
1830 mwl8k_encapsulate_tx_frame(skb); 1834 mwl8k_encapsulate_tx_frame(skb);
1831 else 1835 else
@@ -1955,15 +1959,26 @@ mwl8k_txq_xmit(struct ieee80211_hw *hw, int index, struct sk_buff *skb)
1955 1959
1956 txq = priv->txq + index; 1960 txq = priv->txq + index;
1957 1961
1958 if (txq->len >= MWL8K_TX_DESCS) { 1962 /* Mgmt frames that go out frequently are probe
1959 if (start_ba_session) { 1963 * responses. Other mgmt frames got out relatively
1960 spin_lock(&priv->stream_lock); 1964 * infrequently. Hence reserve 2 buffers so that
1961 mwl8k_remove_stream(hw, stream); 1965 * other mgmt frames do not get dropped due to an
1962 spin_unlock(&priv->stream_lock); 1966 * already queued probe response in one of the
1967 * reserved buffers.
1968 */
1969
1970 if (txq->len >= MWL8K_TX_DESCS - 2) {
1971 if (mgmtframe == false ||
1972 txq->len == MWL8K_TX_DESCS) {
1973 if (start_ba_session) {
1974 spin_lock(&priv->stream_lock);
1975 mwl8k_remove_stream(hw, stream);
1976 spin_unlock(&priv->stream_lock);
1977 }
1978 spin_unlock_bh(&priv->tx_lock);
1979 dev_kfree_skb(skb);
1980 return;
1963 } 1981 }
1964 spin_unlock_bh(&priv->tx_lock);
1965 dev_kfree_skb(skb);
1966 return;
1967 } 1982 }
1968 1983
1969 BUG_ON(txq->skb[txq->tail] != NULL); 1984 BUG_ON(txq->skb[txq->tail] != NULL);