|
@@ -272,6 +272,7 @@ void iwl_mvm_rx_rx_mpdu(struct iwl_mvm *mvm, struct napi_struct *napi,
|
|
|
u32 rate_n_flags;
|
|
|
u32 rx_pkt_status;
|
|
|
u8 crypt_len = 0;
|
|
|
+ bool take_ref;
|
|
|
|
|
|
phy_info = &mvm->last_phy_info;
|
|
|
rx_res = (struct iwl_rx_mpdu_res_start *)pkt->data;
|
|
@@ -458,8 +459,22 @@ void iwl_mvm_rx_rx_mpdu(struct iwl_mvm *mvm, struct napi_struct *napi,
|
|
|
ieee80211_is_probe_resp(hdr->frame_control)))
|
|
|
rx_status->boottime_ns = ktime_get_boot_ns();
|
|
|
|
|
|
+ /* Take a reference briefly to kick off a d0i3 entry delay so
|
|
|
+ * we can handle bursts of RX packets without toggling the
|
|
|
+ * state too often. But don't do this for beacons if we are
|
|
|
+ * going to idle because the beacon filtering changes we make
|
|
|
+ * cause the firmware to send us collateral beacons. */
|
|
|
+ take_ref = !(test_bit(STATUS_TRANS_GOING_IDLE, &mvm->trans->status) &&
|
|
|
+ ieee80211_is_beacon(hdr->frame_control));
|
|
|
+
|
|
|
+ if (take_ref)
|
|
|
+ iwl_mvm_ref(mvm, IWL_MVM_REF_RX);
|
|
|
+
|
|
|
iwl_mvm_pass_packet_to_mac80211(mvm, sta, napi, skb, hdr, len,
|
|
|
ampdu_status, crypt_len, rxb);
|
|
|
+
|
|
|
+ if (take_ref)
|
|
|
+ iwl_mvm_unref(mvm, IWL_MVM_REF_RX);
|
|
|
}
|
|
|
|
|
|
static void iwl_mvm_update_rx_statistics(struct iwl_mvm *mvm,
|