Lines Matching refs:ar
42 bool ath10k_tm_event_wmi(struct ath10k *ar, u32 cmd_id, struct sk_buff *skb) in ath10k_tm_event_wmi() argument
48 ath10k_dbg(ar, ATH10K_DBG_TESTMODE, in ath10k_tm_event_wmi()
52 ath10k_dbg_dump(ar, ATH10K_DBG_TESTMODE, NULL, "", skb->data, skb->len); in ath10k_tm_event_wmi()
54 spin_lock_bh(&ar->data_lock); in ath10k_tm_event_wmi()
56 if (!ar->testmode.utf_monitor) { in ath10k_tm_event_wmi()
67 nl_skb = cfg80211_testmode_alloc_event_skb(ar->hw->wiphy, in ath10k_tm_event_wmi()
71 ath10k_warn(ar, in ath10k_tm_event_wmi()
78 ath10k_warn(ar, in ath10k_tm_event_wmi()
87 ath10k_warn(ar, in ath10k_tm_event_wmi()
96 ath10k_warn(ar, in ath10k_tm_event_wmi()
106 spin_unlock_bh(&ar->data_lock); in ath10k_tm_event_wmi()
111 static int ath10k_tm_cmd_get_version(struct ath10k *ar, struct nlattr *tb[]) in ath10k_tm_cmd_get_version() argument
116 ath10k_dbg(ar, ATH10K_DBG_TESTMODE, in ath10k_tm_cmd_get_version()
121 skb = cfg80211_testmode_alloc_reply_skb(ar->hw->wiphy, in ath10k_tm_cmd_get_version()
141 ar->normal_mode_fw.fw_file.wmi_op_version); in ath10k_tm_cmd_get_version()
150 static int ath10k_tm_fetch_utf_firmware_api_1(struct ath10k *ar, in ath10k_tm_fetch_utf_firmware_api_1() argument
157 ar->hw_params.fw.dir, ATH10K_FW_UTF_FILE); in ath10k_tm_fetch_utf_firmware_api_1()
160 ret = firmware_request_nowarn(&fw_file->firmware, filename, ar->dev); in ath10k_tm_fetch_utf_firmware_api_1()
161 ath10k_dbg(ar, ATH10K_DBG_TESTMODE, "testmode fw request '%s': %d\n", in ath10k_tm_fetch_utf_firmware_api_1()
165 ath10k_warn(ar, "failed to retrieve utf firmware '%s': %d\n", in ath10k_tm_fetch_utf_firmware_api_1()
184 static int ath10k_tm_fetch_firmware(struct ath10k *ar) in ath10k_tm_fetch_firmware() argument
189 ret = ath10k_core_fetch_firmware_api_n(ar, ATH10K_FW_UTF_API2_FILE, in ath10k_tm_fetch_firmware()
190 &ar->testmode.utf_mode_fw.fw_file); in ath10k_tm_fetch_firmware()
192 ath10k_dbg(ar, ATH10K_DBG_TESTMODE, "testmode using fw utf api 2"); in ath10k_tm_fetch_firmware()
196 ret = ath10k_tm_fetch_utf_firmware_api_1(ar, &ar->testmode.utf_mode_fw.fw_file); in ath10k_tm_fetch_firmware()
198 ath10k_err(ar, "failed to fetch utf firmware binary: %d", ret); in ath10k_tm_fetch_firmware()
202 ath10k_dbg(ar, ATH10K_DBG_TESTMODE, "testmode using utf api 1"); in ath10k_tm_fetch_firmware()
205 utf_mode_fw = &ar->testmode.utf_mode_fw; in ath10k_tm_fetch_firmware()
210 utf_mode_fw->board_data = ar->normal_mode_fw.board_data; in ath10k_tm_fetch_firmware()
211 utf_mode_fw->board_len = ar->normal_mode_fw.board_len; in ath10k_tm_fetch_firmware()
214 ath10k_info(ar, "utf.bin didn't contain otp binary, taking it from the normal mode firmware"); in ath10k_tm_fetch_firmware()
215 utf_mode_fw->fw_file.otp_data = ar->normal_mode_fw.fw_file.otp_data; in ath10k_tm_fetch_firmware()
216 utf_mode_fw->fw_file.otp_len = ar->normal_mode_fw.fw_file.otp_len; in ath10k_tm_fetch_firmware()
222 static int ath10k_tm_cmd_utf_start(struct ath10k *ar, struct nlattr *tb[]) in ath10k_tm_cmd_utf_start() argument
227 ath10k_dbg(ar, ATH10K_DBG_TESTMODE, "testmode cmd utf start\n"); in ath10k_tm_cmd_utf_start()
229 mutex_lock(&ar->conf_mutex); in ath10k_tm_cmd_utf_start()
231 if (ar->state == ATH10K_STATE_UTF) { in ath10k_tm_cmd_utf_start()
237 if (ar->state != ATH10K_STATE_OFF) { in ath10k_tm_cmd_utf_start()
242 if (WARN_ON(ar->testmode.utf_mode_fw.fw_file.firmware != NULL)) { in ath10k_tm_cmd_utf_start()
248 ret = ath10k_tm_fetch_firmware(ar); in ath10k_tm_cmd_utf_start()
250 ath10k_err(ar, "failed to fetch UTF firmware: %d", ret); in ath10k_tm_cmd_utf_start()
254 if (ar->testmode.utf_mode_fw.fw_file.codeswap_data && in ath10k_tm_cmd_utf_start()
255 ar->testmode.utf_mode_fw.fw_file.codeswap_len) { in ath10k_tm_cmd_utf_start()
256 ret = ath10k_swap_code_seg_init(ar, in ath10k_tm_cmd_utf_start()
257 &ar->testmode.utf_mode_fw.fw_file); in ath10k_tm_cmd_utf_start()
259 ath10k_warn(ar, in ath10k_tm_cmd_utf_start()
266 spin_lock_bh(&ar->data_lock); in ath10k_tm_cmd_utf_start()
267 ar->testmode.utf_monitor = true; in ath10k_tm_cmd_utf_start()
268 spin_unlock_bh(&ar->data_lock); in ath10k_tm_cmd_utf_start()
270 ath10k_dbg(ar, ATH10K_DBG_TESTMODE, "testmode wmi version %d\n", in ath10k_tm_cmd_utf_start()
271 ar->testmode.utf_mode_fw.fw_file.wmi_op_version); in ath10k_tm_cmd_utf_start()
273 ret = ath10k_hif_power_up(ar); in ath10k_tm_cmd_utf_start()
275 ath10k_err(ar, "failed to power up hif (testmode): %d\n", ret); in ath10k_tm_cmd_utf_start()
276 ar->state = ATH10K_STATE_OFF; in ath10k_tm_cmd_utf_start()
280 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_UTF, in ath10k_tm_cmd_utf_start()
281 &ar->testmode.utf_mode_fw); in ath10k_tm_cmd_utf_start()
283 ath10k_err(ar, "failed to start core (testmode): %d\n", ret); in ath10k_tm_cmd_utf_start()
284 ar->state = ATH10K_STATE_OFF; in ath10k_tm_cmd_utf_start()
288 ar->state = ATH10K_STATE_UTF; in ath10k_tm_cmd_utf_start()
290 if (strlen(ar->testmode.utf_mode_fw.fw_file.fw_version) > 0) in ath10k_tm_cmd_utf_start()
291 ver = ar->testmode.utf_mode_fw.fw_file.fw_version; in ath10k_tm_cmd_utf_start()
295 ath10k_info(ar, "UTF firmware %s started\n", ver); in ath10k_tm_cmd_utf_start()
297 mutex_unlock(&ar->conf_mutex); in ath10k_tm_cmd_utf_start()
302 ath10k_hif_power_down(ar); in ath10k_tm_cmd_utf_start()
305 if (ar->testmode.utf_mode_fw.fw_file.codeswap_data && in ath10k_tm_cmd_utf_start()
306 ar->testmode.utf_mode_fw.fw_file.codeswap_len) in ath10k_tm_cmd_utf_start()
307 ath10k_swap_code_seg_release(ar, in ath10k_tm_cmd_utf_start()
308 &ar->testmode.utf_mode_fw.fw_file); in ath10k_tm_cmd_utf_start()
310 release_firmware(ar->testmode.utf_mode_fw.fw_file.firmware); in ath10k_tm_cmd_utf_start()
311 ar->testmode.utf_mode_fw.fw_file.firmware = NULL; in ath10k_tm_cmd_utf_start()
314 mutex_unlock(&ar->conf_mutex); in ath10k_tm_cmd_utf_start()
319 static void __ath10k_tm_cmd_utf_stop(struct ath10k *ar) in __ath10k_tm_cmd_utf_stop() argument
321 lockdep_assert_held(&ar->conf_mutex); in __ath10k_tm_cmd_utf_stop()
323 ath10k_core_stop(ar); in __ath10k_tm_cmd_utf_stop()
324 ath10k_hif_power_down(ar); in __ath10k_tm_cmd_utf_stop()
326 spin_lock_bh(&ar->data_lock); in __ath10k_tm_cmd_utf_stop()
328 ar->testmode.utf_monitor = false; in __ath10k_tm_cmd_utf_stop()
330 spin_unlock_bh(&ar->data_lock); in __ath10k_tm_cmd_utf_stop()
332 if (ar->testmode.utf_mode_fw.fw_file.codeswap_data && in __ath10k_tm_cmd_utf_stop()
333 ar->testmode.utf_mode_fw.fw_file.codeswap_len) in __ath10k_tm_cmd_utf_stop()
334 ath10k_swap_code_seg_release(ar, in __ath10k_tm_cmd_utf_stop()
335 &ar->testmode.utf_mode_fw.fw_file); in __ath10k_tm_cmd_utf_stop()
337 release_firmware(ar->testmode.utf_mode_fw.fw_file.firmware); in __ath10k_tm_cmd_utf_stop()
338 ar->testmode.utf_mode_fw.fw_file.firmware = NULL; in __ath10k_tm_cmd_utf_stop()
340 ar->state = ATH10K_STATE_OFF; in __ath10k_tm_cmd_utf_stop()
343 static int ath10k_tm_cmd_utf_stop(struct ath10k *ar, struct nlattr *tb[]) in ath10k_tm_cmd_utf_stop() argument
347 ath10k_dbg(ar, ATH10K_DBG_TESTMODE, "testmode cmd utf stop\n"); in ath10k_tm_cmd_utf_stop()
349 mutex_lock(&ar->conf_mutex); in ath10k_tm_cmd_utf_stop()
351 if (ar->state != ATH10K_STATE_UTF) { in ath10k_tm_cmd_utf_stop()
356 __ath10k_tm_cmd_utf_stop(ar); in ath10k_tm_cmd_utf_stop()
360 ath10k_info(ar, "UTF firmware stopped\n"); in ath10k_tm_cmd_utf_stop()
363 mutex_unlock(&ar->conf_mutex); in ath10k_tm_cmd_utf_stop()
367 static int ath10k_tm_cmd_wmi(struct ath10k *ar, struct nlattr *tb[]) in ath10k_tm_cmd_wmi() argument
374 mutex_lock(&ar->conf_mutex); in ath10k_tm_cmd_wmi()
376 if (ar->state != ATH10K_STATE_UTF) { in ath10k_tm_cmd_wmi()
395 ath10k_dbg(ar, ATH10K_DBG_TESTMODE, in ath10k_tm_cmd_wmi()
399 ath10k_dbg_dump(ar, ATH10K_DBG_TESTMODE, NULL, "", buf, buf_len); in ath10k_tm_cmd_wmi()
401 skb = ath10k_wmi_alloc_skb(ar, buf_len); in ath10k_tm_cmd_wmi()
409 ret = ath10k_wmi_cmd_send(ar, skb, cmd_id); in ath10k_tm_cmd_wmi()
411 ath10k_warn(ar, "failed to transmit wmi command (testmode): %d\n", in ath10k_tm_cmd_wmi()
419 mutex_unlock(&ar->conf_mutex); in ath10k_tm_cmd_wmi()
426 struct ath10k *ar = hw->priv; in ath10k_tm_cmd() local
440 return ath10k_tm_cmd_get_version(ar, tb); in ath10k_tm_cmd()
442 return ath10k_tm_cmd_utf_start(ar, tb); in ath10k_tm_cmd()
444 return ath10k_tm_cmd_utf_stop(ar, tb); in ath10k_tm_cmd()
446 return ath10k_tm_cmd_wmi(ar, tb); in ath10k_tm_cmd()
452 void ath10k_testmode_destroy(struct ath10k *ar) in ath10k_testmode_destroy() argument
454 mutex_lock(&ar->conf_mutex); in ath10k_testmode_destroy()
456 if (ar->state != ATH10K_STATE_UTF) { in ath10k_testmode_destroy()
461 __ath10k_tm_cmd_utf_stop(ar); in ath10k_testmode_destroy()
464 mutex_unlock(&ar->conf_mutex); in ath10k_testmode_destroy()