|
@@ -331,6 +331,19 @@ il3945_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
|
|
|
+ * il3945_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");
|
|
|
+ }
|
|
|
+
|
|
|
txq->time_stamp = jiffies;
|
|
|
info = IEEE80211_SKB_CB(txq->skbs[txq->q.read_ptr]);
|
|
|
ieee80211_tx_info_clear_status(info);
|
|
@@ -488,6 +501,11 @@ il3945_pass_packet_to_mac80211(struct il_priv *il, struct il_rx_buf *rxb,
|
|
|
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");
|
|
|
+ }
|
|
|
+
|
|
|
skb = dev_alloc_skb(128);
|
|
|
if (!skb) {
|
|
|
IL_ERR("dev_alloc_skb failed\n");
|