iwlwifi: fix spelling errors
[linux-2.6-block.git] / drivers / net / wireless / iwlwifi / mvm / rx.c
index 2486931fd8614714771a2a45221c56da909c7e37..6177e24f4c016d09c8496186d65c394d05bb5eb3 100644 (file)
@@ -345,6 +345,25 @@ int iwl_mvm_rx_rx_mpdu(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
                struct iwl_mvm_sta *mvmsta;
                mvmsta = iwl_mvm_sta_from_mac80211(sta);
                rs_update_last_rssi(mvm, &mvmsta->lq_sta, rx_status);
+
+               if (iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_RSSI) &&
+                   ieee80211_is_beacon(hdr->frame_control)) {
+                       struct iwl_fw_dbg_trigger_tlv *trig;
+                       struct iwl_fw_dbg_trigger_low_rssi *rssi_trig;
+                       bool trig_check;
+                       s32 rssi;
+
+                       trig = iwl_fw_dbg_get_trigger(mvm->fw,
+                                                     FW_DBG_TRIGGER_RSSI);
+                       rssi_trig = (void *)trig->data;
+                       rssi = le32_to_cpu(rssi_trig->rssi);
+
+                       trig_check =
+                               iwl_fw_dbg_trigger_check_stop(mvm, mvmsta->vif,
+                                                             trig);
+                       if (trig_check && rx_status->signal < rssi)
+                               iwl_mvm_fw_dbg_collect_trig(mvm, trig, NULL, 0);
+               }
        }
 
        rcu_read_unlock();
@@ -427,6 +446,7 @@ struct iwl_mvm_stat_data {
        struct iwl_mvm *mvm;
        __le32 mac_id;
        __s8 beacon_filter_average_energy;
+       struct mvm_statistics_general_v8 *general;
 };
 
 static void iwl_mvm_stat_iterator(void *_data, u8 *mac,
@@ -441,6 +461,17 @@ static void iwl_mvm_stat_iterator(void *_data, u8 *mac,
        u16 id = le32_to_cpu(data->mac_id);
        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
 
+       /* This doesn't need the MAC ID check since it's not taking the
+        * data copied into the "data" struct, but rather the data from
+        * the notification directly.
+        */
+       if (data->general) {
+               mvmvif->beacon_stats.num_beacons =
+                       le32_to_cpu(data->general->beacon_counter[mvmvif->id]);
+               mvmvif->beacon_stats.avg_signal =
+                       -data->general->beacon_average_energy[mvmvif->id];
+       }
+
        if (mvmvif->id != id)
                return;
 
@@ -496,6 +527,34 @@ static void iwl_mvm_stat_iterator(void *_data, u8 *mac,
        }
 }
 
+static inline void
+iwl_mvm_rx_stats_check_trigger(struct iwl_mvm *mvm, struct iwl_rx_packet *pkt)
+{
+       struct iwl_fw_dbg_trigger_tlv *trig;
+       struct iwl_fw_dbg_trigger_stats *trig_stats;
+       u32 trig_offset, trig_thold;
+
+       if (!iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_STATS))
+               return;
+
+       trig = iwl_fw_dbg_get_trigger(mvm->fw, FW_DBG_TRIGGER_STATS);
+       trig_stats = (void *)trig->data;
+
+       if (!iwl_fw_dbg_trigger_check_stop(mvm, NULL, trig))
+               return;
+
+       trig_offset = le32_to_cpu(trig_stats->stop_offset);
+       trig_thold = le32_to_cpu(trig_stats->stop_threshold);
+
+       if (WARN_ON_ONCE(trig_offset >= iwl_rx_packet_payload_len(pkt)))
+               return;
+
+       if (le32_to_cpup((__le32 *) (pkt->data + trig_offset)) < trig_thold)
+               return;
+
+       iwl_mvm_fw_dbg_collect_trig(mvm, trig, NULL, 0);
+}
+
 void iwl_mvm_handle_rx_statistics(struct iwl_mvm *mvm,
                                  struct iwl_rx_packet *pkt)
 {
@@ -525,6 +584,8 @@ void iwl_mvm_handle_rx_statistics(struct iwl_mvm *mvm,
                        le64_to_cpu(stats->general.on_time_rf);
                mvm->radio_stats.on_time_scan =
                        le64_to_cpu(stats->general.on_time_scan);
+
+               data.general = &stats->general;
        } else {
                struct iwl_notif_statistics_v8 *stats = (void *)&pkt->data;
 
@@ -539,6 +600,8 @@ void iwl_mvm_handle_rx_statistics(struct iwl_mvm *mvm,
                iwl_mvm_update_rx_statistics(mvm, &stats->rx);
        }
 
+       iwl_mvm_rx_stats_check_trigger(mvm, pkt);
+
        /* Only handle rx statistics temperature changes if async temp
         * notifications are not supported
         */