aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlegacy
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/iwlegacy')
-rw-r--r--drivers/net/wireless/iwlegacy/3945.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwlegacy/3945.c b/drivers/net/wireless/iwlegacy/3945.c
index dc1e6da9976a..c092033945cc 100644
--- a/drivers/net/wireless/iwlegacy/3945.c
+++ b/drivers/net/wireless/iwlegacy/3945.c
@@ -331,6 +331,19 @@ il3945_hdl_tx(struct il_priv *il, struct il_rx_buf *rxb)
331 return; 331 return;
332 } 332 }
333 333
334 /*
335 * Firmware will not transmit frame on passive channel, if it not yet
336 * received some valid frame on that channel. When this error happen
337 * we have to wait until firmware will unblock itself i.e. when we
338 * note received beacon or other frame. We unblock queues in
339 * il3945_pass_packet_to_mac80211 or in il_mac_bss_info_changed.
340 */
341 if (unlikely((status & TX_STATUS_MSK) == TX_STATUS_FAIL_PASSIVE_NO_RX) &&
342 il->iw_mode == NL80211_IFTYPE_STATION) {
343 il_stop_queues_by_reason(il, IL_STOP_REASON_PASSIVE);
344 D_INFO("Stopped queues - RX waiting on passive channel\n");
345 }
346
334 txq->time_stamp = jiffies; 347 txq->time_stamp = jiffies;
335 info = IEEE80211_SKB_CB(txq->skbs[txq->q.read_ptr]); 348 info = IEEE80211_SKB_CB(txq->skbs[txq->q.read_ptr]);
336 ieee80211_tx_info_clear_status(info); 349 ieee80211_tx_info_clear_status(info);
@@ -488,6 +501,11 @@ il3945_pass_packet_to_mac80211(struct il_priv *il, struct il_rx_buf *rxb,
488 return; 501 return;
489 } 502 }
490 503
504 if (unlikely(test_bit(IL_STOP_REASON_PASSIVE, &il->stop_reason))) {
505 il_wake_queues_by_reason(il, IL_STOP_REASON_PASSIVE);
506 D_INFO("Woke queues - frame received on passive channel\n");
507 }
508
491 skb = dev_alloc_skb(128); 509 skb = dev_alloc_skb(128);
492 if (!skb) { 510 if (!skb) {
493 IL_ERR("dev_alloc_skb failed\n"); 511 IL_ERR("dev_alloc_skb failed\n");