|
@@ -588,6 +588,11 @@ il4965_pass_packet_to_mac80211(struct il_priv *il, struct ieee80211_hdr *hdr,
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ if (unlikely(test_bit(IL_STOP_REASON_PASSIVE, &il->stop_reason))) {
|
|
|
+ il_wake_queues_by_reason(il, IL_STOP_REASON_PASSIVE);
|
|
|
+ D_INFO("Woke queues - frame received on passive channel\n");
|
|
|
+ }
|
|
|
+
|
|
|
/* In case of HW accelerated crypto and bad decryption, drop */
|
|
|
if (!il->cfg->mod_params->sw_crypto &&
|
|
|
il_set_decrypted_flag(il, hdr, ampdu_status, stats))
|
|
@@ -2806,6 +2811,19 @@ il4965_hdl_tx(struct il_priv *il, struct il_rx_buf *rxb)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * Firmware will not transmit frame on passive channel, if it not yet
|
|
|
+ * received some valid frame on that channel. When this error happen
|
|
|
+ * we have to wait until firmware will unblock itself i.e. when we
|
|
|
+ * note received beacon or other frame. We unblock queues in
|
|
|
+ * il4965_pass_packet_to_mac80211 or in il_mac_bss_info_changed.
|
|
|
+ */
|
|
|
+ if (unlikely((status & TX_STATUS_MSK) == TX_STATUS_FAIL_PASSIVE_NO_RX) &&
|
|
|
+ il->iw_mode == NL80211_IFTYPE_STATION) {
|
|
|
+ il_stop_queues_by_reason(il, IL_STOP_REASON_PASSIVE);
|
|
|
+ D_INFO("Stopped queues - RX waiting on passive channel\n");
|
|
|
+ }
|
|
|
+
|
|
|
spin_lock_irqsave(&il->sta_lock, flags);
|
|
|
if (txq->sched_retry) {
|
|
|
const u32 scd_ssn = il4965_get_scd_ssn(tx_resp);
|