diff options
Diffstat (limited to 'drivers/net/wireless/iwlegacy')
-rw-r--r-- | drivers/net/wireless/iwlegacy/3945.c | 18 |
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"); |