iwlwifi: mvm: pass station to mac80211 RX where known
authorJohannes Berg <johannes.berg@intel.com>
Thu, 10 Mar 2016 10:55:44 +0000 (11:55 +0100)
committerLuca Coelho <luciano.coelho@intel.com>
Tue, 10 May 2016 19:14:50 +0000 (22:14 +0300)
When we've already looked up the transmitter station, we can just
pass it to mac80211 using the new ieee80211_rx_napi(). This saves
the overhead of looking it up in mac80211 again.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/rx.c
drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c

index 263e8a8576b73268e064be161f7784fbd646010d..58e7e4feed3a4a4a96a625900ac38913e0b396a8 100644 (file)
@@ -97,6 +97,7 @@ void iwl_mvm_rx_rx_phy_cmd(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb)
  * Adds the rxb to a new skb and give it to mac80211
  */
 static void iwl_mvm_pass_packet_to_mac80211(struct iwl_mvm *mvm,
+                                           struct ieee80211_sta *sta,
                                            struct napi_struct *napi,
                                            struct sk_buff *skb,
                                            struct ieee80211_hdr *hdr, u16 len,
@@ -131,7 +132,7 @@ static void iwl_mvm_pass_packet_to_mac80211(struct iwl_mvm *mvm,
                                fraglen, rxb->truesize);
        }
 
-       ieee80211_rx_napi(mvm->hw, NULL, skb, napi);
+       ieee80211_rx_napi(mvm->hw, sta, skb, napi);
 }
 
 /*
@@ -453,8 +454,12 @@ void iwl_mvm_rx_rx_mpdu(struct iwl_mvm *mvm, struct napi_struct *napi,
                     mvm->sched_scan_pass_all == SCHED_SCAN_PASS_ALL_ENABLED))
                mvm->sched_scan_pass_all = SCHED_SCAN_PASS_ALL_FOUND;
 
-       iwl_mvm_pass_packet_to_mac80211(mvm, napi, skb, hdr, len, ampdu_status,
-                                       crypt_len, rxb);
+       if (unlikely(ieee80211_is_beacon(hdr->frame_control) ||
+                    ieee80211_is_probe_resp(hdr->frame_control)))
+               rx_status->boottime_ns = ktime_get_boot_ns();
+
+       iwl_mvm_pass_packet_to_mac80211(mvm, sta, napi, skb, hdr, len,
+                                       ampdu_status, crypt_len, rxb);
 }
 
 static void iwl_mvm_update_rx_statistics(struct iwl_mvm *mvm,
index 0da93b57d620b793a022417ae00d899ce8e2d038..5fe7a0e16b428c555379330b04e5602bca9ecbdb 100644 (file)
@@ -210,7 +210,7 @@ static void iwl_mvm_pass_packet_to_mac80211(struct iwl_mvm *mvm,
        if (iwl_mvm_check_pn(mvm, skb, queue, sta))
                kfree_skb(skb);
        else
-               ieee80211_rx_napi(mvm->hw, NULL, skb, napi);
+               ieee80211_rx_napi(mvm->hw, sta, skb, napi);
 }
 
 static void iwl_mvm_get_signal_strength(struct iwl_mvm *mvm,