iwlwifi: mvm: use build-time assertion for fw trigger ID
authorJohannes Berg <johannes.berg@intel.com>
Tue, 22 Sep 2015 10:24:31 +0000 (12:24 +0200)
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Thu, 26 Nov 2015 14:38:50 +0000 (16:38 +0200)
The firmware debug trigger ID is always a compile-time constant,
so we can use a build-time assertion to validate that it is in
fact a valid constant.

To make that really guaranteed to work, convert this and the
inline function iwl_fw_dbg_trigger_simple_stop() to macros.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
drivers/net/wireless/intel/iwlwifi/iwl-fw.h
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h

index 84ec0cefb62a792cc2f341dadfdb1ebf41b11be7..c6946f1644fc5d0205281e74e05122a804a77d61 100644 (file)
@@ -311,12 +311,15 @@ iwl_fw_dbg_conf_usniffer(const struct iwl_fw *fw, u8 id)
 })
 
 static inline struct iwl_fw_dbg_trigger_tlv*
-iwl_fw_dbg_get_trigger(const struct iwl_fw *fw, u8 id)
+_iwl_fw_dbg_get_trigger(const struct iwl_fw *fw, enum iwl_fw_dbg_trigger id)
 {
-       if (WARN_ON(id >= ARRAY_SIZE(fw->dbg_trigger_tlv)))
-               return NULL;
-
        return fw->dbg_trigger_tlv[id];
 }
 
+#define iwl_fw_dbg_get_trigger(fw, id) ({                      \
+       BUILD_BUG_ON(!__builtin_constant_p(id));                \
+       BUILD_BUG_ON((id) >= FW_DBG_TRIGGER_MAX);               \
+       _iwl_fw_dbg_get_trigger((fw), (id));                    \
+})
+
 #endif  /* __iwl_fw_h__ */
index aff71d3005920e485defe1f7e4056b18354be222..347d953f5604f3bcbc689edaf1af30bbabda6fe9 100644 (file)
@@ -1524,20 +1524,21 @@ iwl_fw_dbg_trigger_check_stop(struct iwl_mvm *mvm,
 }
 
 static inline void
-iwl_fw_dbg_trigger_simple_stop(struct iwl_mvm *mvm,
-                              struct ieee80211_vif *vif,
-                              enum iwl_fw_dbg_trigger trig)
+_iwl_fw_dbg_trigger_simple_stop(struct iwl_mvm *mvm,
+                               struct ieee80211_vif *vif,
+                               struct iwl_fw_dbg_trigger_tlv *trigger)
 {
-       struct iwl_fw_dbg_trigger_tlv *trigger;
-
-       if (!iwl_fw_dbg_trigger_enabled(mvm->fw, trig))
+       if (!trigger)
                return;
 
-       trigger = iwl_fw_dbg_get_trigger(mvm->fw, trig);
        if (!iwl_fw_dbg_trigger_check_stop(mvm, vif, trigger))
                return;
 
        iwl_mvm_fw_dbg_collect_trig(mvm, trigger, NULL);
 }
+#define iwl_fw_dbg_trigger_simple_stop(mvm, vif, trig) \
+       _iwl_fw_dbg_trigger_simple_stop((mvm), (vif),   \
+                                       iwl_fw_dbg_get_trigger((mvm)->fw,\
+                                                              (trig)))
 
 #endif /* __IWL_MVM_H__ */