aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlegacy
diff options
context:
space:
mode:
authorStanislaw Gruszka <sgruszka@redhat.com>2013-06-12 10:44:50 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-06-12 15:06:57 -0400
commitc72456c75ae48d4d747c2ad4f7fe82601484a949 (patch)
treeac35b016794f4f43a173b63a1a5d7522eed5cf3e /drivers/net/wireless/iwlegacy
parent8cdbab7f07e82f26c48adcc761391c1c7ff339ff (diff)
iwl3945: workaround for firmware frame tx rejection
Firmware can reject to transmit frame on passive channel, when it did not yet received any frame with valid CRC on that channel. Workaround this problem in the driver. Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
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");