aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEran Harary <eran.harary@intel.com>2014-12-01 10:40:37 -0500
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>2014-12-02 09:51:56 -0500
commit61df750cb00b69882ba3acbb82e9368d01119c93 (patch)
tree09b520e3053c82de3bf355402941043e2b22d234
parent99684ae3567fde6b0f651ed6400e5306562d366e (diff)
iwlwifi: mvm: Ability to work with packed usniffer image
The new ucode package format holds also the usniffer images (in addition to the operational images and the TLVs). The driver can load the usniffer image if debug configuration tells it to. Signed-off-by: Eran Harary <eran.harary@intel.com> Reviewed-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-drv.c17
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-fw-file.h1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-fw.h13
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/fw.c7
4 files changed, 37 insertions, 1 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-drv.c b/drivers/net/wireless/iwlwifi/iwl-drv.c
index a53b534aa232..38de1513e4de 100644
--- a/drivers/net/wireless/iwlwifi/iwl-drv.c
+++ b/drivers/net/wireless/iwlwifi/iwl-drv.c
@@ -591,6 +591,8 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
591 char buildstr[25]; 591 char buildstr[25];
592 u32 build; 592 u32 build;
593 int num_of_cpus; 593 int num_of_cpus;
594 bool usniffer_images = false;
595 bool usniffer_req = false;
594 596
595 if (len < sizeof(*ucode)) { 597 if (len < sizeof(*ucode)) {
596 IWL_ERR(drv, "uCode has invalid length: %zd\n", len); 598 IWL_ERR(drv, "uCode has invalid length: %zd\n", len);
@@ -908,6 +910,9 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
908 break; 910 break;
909 } 911 }
910 912
913 if (conf->usniffer)
914 usniffer_req = true;
915
911 IWL_INFO(drv, "Found debug configuration: %d\n", 916 IWL_INFO(drv, "Found debug configuration: %d\n",
912 conf->id); 917 conf->id);
913 918
@@ -915,12 +920,24 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
915 pieces->dbg_conf_tlv_len[conf->id] = tlv_len; 920 pieces->dbg_conf_tlv_len[conf->id] = tlv_len;
916 break; 921 break;
917 } 922 }
923 case IWL_UCODE_TLV_SEC_RT_USNIFFER:
924 usniffer_images = true;
925 iwl_store_ucode_sec(pieces, tlv_data,
926 IWL_UCODE_REGULAR_USNIFFER,
927 tlv_len);
928 break;
918 default: 929 default:
919 IWL_DEBUG_INFO(drv, "unknown TLV: %d\n", tlv_type); 930 IWL_DEBUG_INFO(drv, "unknown TLV: %d\n", tlv_type);
920 break; 931 break;
921 } 932 }
922 } 933 }
923 934
935 if (usniffer_req && !usniffer_images) {
936 IWL_ERR(drv,
937 "user selected to work with usniffer but usniffer image isn't available in ucode package\n");
938 return -EINVAL;
939 }
940
924 if (len) { 941 if (len) {
925 IWL_ERR(drv, "invalid TLV after parsing: %zd\n", len); 942 IWL_ERR(drv, "invalid TLV after parsing: %zd\n", len);
926 iwl_print_hex_dump(drv, IWL_DL_FW, (u8 *)data, len); 943 iwl_print_hex_dump(drv, IWL_DL_FW, (u8 *)data, len);
diff --git a/drivers/net/wireless/iwlwifi/iwl-fw-file.h b/drivers/net/wireless/iwlwifi/iwl-fw-file.h
index 9faad691c13c..f2a047f6bb3e 100644
--- a/drivers/net/wireless/iwlwifi/iwl-fw-file.h
+++ b/drivers/net/wireless/iwlwifi/iwl-fw-file.h
@@ -131,6 +131,7 @@ enum iwl_ucode_tlv_type {
131 IWL_UCODE_TLV_API_CHANGES_SET = 29, 131 IWL_UCODE_TLV_API_CHANGES_SET = 29,
132 IWL_UCODE_TLV_ENABLED_CAPABILITIES = 30, 132 IWL_UCODE_TLV_ENABLED_CAPABILITIES = 30,
133 IWL_UCODE_TLV_N_SCAN_CHANNELS = 31, 133 IWL_UCODE_TLV_N_SCAN_CHANNELS = 31,
134 IWL_UCODE_TLV_SEC_RT_USNIFFER = 34,
134 IWL_UCODE_TLV_FW_DBG_DEST = 38, 135 IWL_UCODE_TLV_FW_DBG_DEST = 38,
135 IWL_UCODE_TLV_FW_DBG_CONF = 39, 136 IWL_UCODE_TLV_FW_DBG_CONF = 39,
136}; 137};
diff --git a/drivers/net/wireless/iwlwifi/iwl-fw.h b/drivers/net/wireless/iwlwifi/iwl-fw.h
index 20d44ea315ea..e6dc3b870949 100644
--- a/drivers/net/wireless/iwlwifi/iwl-fw.h
+++ b/drivers/net/wireless/iwlwifi/iwl-fw.h
@@ -77,11 +77,13 @@
77 * @IWL_UCODE_REGULAR: Normal runtime ucode 77 * @IWL_UCODE_REGULAR: Normal runtime ucode
78 * @IWL_UCODE_INIT: Initial ucode 78 * @IWL_UCODE_INIT: Initial ucode
79 * @IWL_UCODE_WOWLAN: Wake on Wireless enabled ucode 79 * @IWL_UCODE_WOWLAN: Wake on Wireless enabled ucode
80 * @IWL_UCODE_REGULAR_USNIFFER: Normal runtime ucode when using usniffer image
80 */ 81 */
81enum iwl_ucode_type { 82enum iwl_ucode_type {
82 IWL_UCODE_REGULAR, 83 IWL_UCODE_REGULAR,
83 IWL_UCODE_INIT, 84 IWL_UCODE_INIT,
84 IWL_UCODE_WOWLAN, 85 IWL_UCODE_WOWLAN,
86 IWL_UCODE_REGULAR_USNIFFER,
85 IWL_UCODE_TYPE_MAX, 87 IWL_UCODE_TYPE_MAX,
86}; 88};
87 89
@@ -231,4 +233,15 @@ iwl_fw_dbg_conf_enabled(const struct iwl_fw *fw, u8 id)
231 return trigger->enabled; 233 return trigger->enabled;
232} 234}
233 235
236static inline bool
237iwl_fw_dbg_conf_usniffer(const struct iwl_fw *fw, u8 id)
238{
239 const struct iwl_fw_dbg_conf_tlv *conf_tlv = fw->dbg_conf_tlv[id];
240
241 if (!conf_tlv)
242 return false;
243
244 return conf_tlv->usniffer;
245}
246
234#endif /* __iwl_fw_h__ */ 247#endif /* __iwl_fw_h__ */
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw.c b/drivers/net/wireless/iwlwifi/mvm/fw.c
index 1f1337a72127..d0fa6e9ed590 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw.c
+++ b/drivers/net/wireless/iwlwifi/mvm/fw.c
@@ -186,7 +186,12 @@ static int iwl_mvm_load_ucode_wait_alive(struct iwl_mvm *mvm,
186 static const u8 alive_cmd[] = { MVM_ALIVE }; 186 static const u8 alive_cmd[] = { MVM_ALIVE };
187 struct iwl_sf_region st_fwrd_space; 187 struct iwl_sf_region st_fwrd_space;
188 188
189 fw = iwl_get_ucode_image(mvm, ucode_type); 189 if (ucode_type == IWL_UCODE_REGULAR &&
190 iwl_fw_dbg_conf_usniffer(mvm->fw, FW_DBG_CUSTOM) &&
191 iwl_fw_dbg_conf_enabled(mvm->fw, FW_DBG_CUSTOM))
192 fw = iwl_get_ucode_image(mvm, IWL_UCODE_REGULAR_USNIFFER);
193 else
194 fw = iwl_get_ucode_image(mvm, ucode_type);
190 if (WARN_ON(!fw)) 195 if (WARN_ON(!fw))
191 return -EINVAL; 196 return -EINVAL;
192 mvm->cur_ucode = ucode_type; 197 mvm->cur_ucode = ucode_type;