|
@@ -1132,7 +1132,7 @@ static int ieee80211_tx(struct net_device *dev, struct sk_buff *skb,
|
|
ieee80211_tx_handler *handler;
|
|
ieee80211_tx_handler *handler;
|
|
struct ieee80211_tx_data tx;
|
|
struct ieee80211_tx_data tx;
|
|
ieee80211_tx_result res = TX_DROP, res_prepare;
|
|
ieee80211_tx_result res = TX_DROP, res_prepare;
|
|
- int ret, i;
|
|
|
|
|
|
+ int ret, i, retries = 0;
|
|
|
|
|
|
WARN_ON(__ieee80211_queue_pending(local, control->queue));
|
|
WARN_ON(__ieee80211_queue_pending(local, control->queue));
|
|
|
|
|
|
@@ -1216,6 +1216,13 @@ retry:
|
|
if (!__ieee80211_queue_stopped(local, control->queue)) {
|
|
if (!__ieee80211_queue_stopped(local, control->queue)) {
|
|
clear_bit(IEEE80211_LINK_STATE_PENDING,
|
|
clear_bit(IEEE80211_LINK_STATE_PENDING,
|
|
&local->state[control->queue]);
|
|
&local->state[control->queue]);
|
|
|
|
+ retries++;
|
|
|
|
+ /*
|
|
|
|
+ * Driver bug, it's rejecting packets but
|
|
|
|
+ * not stopping queues.
|
|
|
|
+ */
|
|
|
|
+ if (WARN_ON_ONCE(retries > 5))
|
|
|
|
+ goto drop;
|
|
goto retry;
|
|
goto retry;
|
|
}
|
|
}
|
|
memcpy(&store->control, control,
|
|
memcpy(&store->control, control,
|