Lines Matching refs:ar

41 bool ath10k_tm_event_wmi(struct ath10k *ar, u32 cmd_id, struct sk_buff *skb)  in ath10k_tm_event_wmi()  argument
47 ath10k_dbg(ar, ATH10K_DBG_TESTMODE, in ath10k_tm_event_wmi()
51 ath10k_dbg_dump(ar, ATH10K_DBG_TESTMODE, NULL, "", skb->data, skb->len); in ath10k_tm_event_wmi()
53 spin_lock_bh(&ar->data_lock); in ath10k_tm_event_wmi()
55 if (!ar->testmode.utf_monitor) { in ath10k_tm_event_wmi()
66 nl_skb = cfg80211_testmode_alloc_event_skb(ar->hw->wiphy, in ath10k_tm_event_wmi()
70 ath10k_warn(ar, in ath10k_tm_event_wmi()
77 ath10k_warn(ar, in ath10k_tm_event_wmi()
86 ath10k_warn(ar, in ath10k_tm_event_wmi()
95 ath10k_warn(ar, in ath10k_tm_event_wmi()
105 spin_unlock_bh(&ar->data_lock); in ath10k_tm_event_wmi()
110 static int ath10k_tm_cmd_get_version(struct ath10k *ar, struct nlattr *tb[]) in ath10k_tm_cmd_get_version() argument
115 ath10k_dbg(ar, ATH10K_DBG_TESTMODE, in ath10k_tm_cmd_get_version()
120 skb = cfg80211_testmode_alloc_reply_skb(ar->hw->wiphy, in ath10k_tm_cmd_get_version()
142 static int ath10k_tm_fetch_utf_firmware_api_2(struct ath10k *ar) in ath10k_tm_fetch_utf_firmware_api_2() argument
152 ar->hw_params.fw.dir, ATH10K_FW_UTF_API2_FILE); in ath10k_tm_fetch_utf_firmware_api_2()
155 ret = request_firmware(&ar->testmode.utf, filename, ar->dev); in ath10k_tm_fetch_utf_firmware_api_2()
157 ath10k_warn(ar, "failed to retrieve utf firmware '%s': %d\n", in ath10k_tm_fetch_utf_firmware_api_2()
162 data = ar->testmode.utf->data; in ath10k_tm_fetch_utf_firmware_api_2()
163 len = ar->testmode.utf->size; in ath10k_tm_fetch_utf_firmware_api_2()
171 ath10k_err(ar, "utf firmware file is too small to contain magic\n"); in ath10k_tm_fetch_utf_firmware_api_2()
177 ath10k_err(ar, "invalid firmware magic\n"); in ath10k_tm_fetch_utf_firmware_api_2()
199 ath10k_err(ar, "invalid length for FW IE %d (%zu < %zu)\n", in ath10k_tm_fetch_utf_firmware_api_2()
207 if (ie_len > sizeof(ar->testmode.utf_version) - 1) in ath10k_tm_fetch_utf_firmware_api_2()
210 memcpy(ar->testmode.utf_version, data, ie_len); in ath10k_tm_fetch_utf_firmware_api_2()
211 ar->testmode.utf_version[ie_len] = '\0'; in ath10k_tm_fetch_utf_firmware_api_2()
213 ath10k_dbg(ar, ATH10K_DBG_TESTMODE, in ath10k_tm_fetch_utf_firmware_api_2()
215 ar->testmode.utf_version); in ath10k_tm_fetch_utf_firmware_api_2()
221 ath10k_dbg(ar, ATH10K_DBG_TESTMODE, in ath10k_tm_fetch_utf_firmware_api_2()
225 ar->testmode.utf_firmware_data = data; in ath10k_tm_fetch_utf_firmware_api_2()
226 ar->testmode.utf_firmware_len = ie_len; in ath10k_tm_fetch_utf_firmware_api_2()
232 ar->testmode.op_version = le32_to_cpup(version); in ath10k_tm_fetch_utf_firmware_api_2()
233 ath10k_dbg(ar, ATH10K_DBG_TESTMODE, "testmode found fw ie wmi op version %d\n", in ath10k_tm_fetch_utf_firmware_api_2()
234 ar->testmode.op_version); in ath10k_tm_fetch_utf_firmware_api_2()
237 ath10k_warn(ar, "Unknown testmode FW IE: %u\n", in ath10k_tm_fetch_utf_firmware_api_2()
248 if (!ar->testmode.utf_firmware_data || !ar->testmode.utf_firmware_len) { in ath10k_tm_fetch_utf_firmware_api_2()
249 ath10k_err(ar, "No ATH10K_FW_IE_FW_IMAGE found\n"); in ath10k_tm_fetch_utf_firmware_api_2()
257 release_firmware(ar->testmode.utf); in ath10k_tm_fetch_utf_firmware_api_2()
262 static int ath10k_tm_fetch_utf_firmware_api_1(struct ath10k *ar) in ath10k_tm_fetch_utf_firmware_api_1() argument
268 ar->hw_params.fw.dir, ATH10K_FW_UTF_FILE); in ath10k_tm_fetch_utf_firmware_api_1()
271 ret = request_firmware(&ar->testmode.utf, filename, ar->dev); in ath10k_tm_fetch_utf_firmware_api_1()
273 ath10k_warn(ar, "failed to retrieve utf firmware '%s': %d\n", in ath10k_tm_fetch_utf_firmware_api_1()
284 ar->testmode.op_version = ATH10K_FW_WMI_OP_VERSION_10_1; in ath10k_tm_fetch_utf_firmware_api_1()
285 ar->testmode.utf_firmware_data = ar->testmode.utf->data; in ath10k_tm_fetch_utf_firmware_api_1()
286 ar->testmode.utf_firmware_len = ar->testmode.utf->size; in ath10k_tm_fetch_utf_firmware_api_1()
291 static int ath10k_tm_fetch_firmware(struct ath10k *ar) in ath10k_tm_fetch_firmware() argument
295 ret = ath10k_tm_fetch_utf_firmware_api_2(ar); in ath10k_tm_fetch_firmware()
297 ath10k_dbg(ar, ATH10K_DBG_TESTMODE, "testmode using fw utf api 2"); in ath10k_tm_fetch_firmware()
301 ret = ath10k_tm_fetch_utf_firmware_api_1(ar); in ath10k_tm_fetch_firmware()
303 ath10k_err(ar, "failed to fetch utf firmware binary: %d", ret); in ath10k_tm_fetch_firmware()
307 ath10k_dbg(ar, ATH10K_DBG_TESTMODE, "testmode using utf api 1"); in ath10k_tm_fetch_firmware()
312 static int ath10k_tm_cmd_utf_start(struct ath10k *ar, struct nlattr *tb[]) in ath10k_tm_cmd_utf_start() argument
317 ath10k_dbg(ar, ATH10K_DBG_TESTMODE, "testmode cmd utf start\n"); in ath10k_tm_cmd_utf_start()
319 mutex_lock(&ar->conf_mutex); in ath10k_tm_cmd_utf_start()
321 if (ar->state == ATH10K_STATE_UTF) { in ath10k_tm_cmd_utf_start()
327 if (ar->state != ATH10K_STATE_OFF) { in ath10k_tm_cmd_utf_start()
332 if (WARN_ON(ar->testmode.utf != NULL)) { in ath10k_tm_cmd_utf_start()
338 ret = ath10k_tm_fetch_firmware(ar); in ath10k_tm_cmd_utf_start()
340 ath10k_err(ar, "failed to fetch UTF firmware: %d", ret); in ath10k_tm_cmd_utf_start()
344 spin_lock_bh(&ar->data_lock); in ath10k_tm_cmd_utf_start()
345 ar->testmode.utf_monitor = true; in ath10k_tm_cmd_utf_start()
346 spin_unlock_bh(&ar->data_lock); in ath10k_tm_cmd_utf_start()
347 BUILD_BUG_ON(sizeof(ar->fw_features) != in ath10k_tm_cmd_utf_start()
348 sizeof(ar->testmode.orig_fw_features)); in ath10k_tm_cmd_utf_start()
350 memcpy(ar->testmode.orig_fw_features, ar->fw_features, in ath10k_tm_cmd_utf_start()
351 sizeof(ar->fw_features)); in ath10k_tm_cmd_utf_start()
352 ar->testmode.orig_wmi_op_version = ar->wmi.op_version; in ath10k_tm_cmd_utf_start()
353 memset(ar->fw_features, 0, sizeof(ar->fw_features)); in ath10k_tm_cmd_utf_start()
355 ar->wmi.op_version = ar->testmode.op_version; in ath10k_tm_cmd_utf_start()
357 ath10k_dbg(ar, ATH10K_DBG_TESTMODE, "testmode wmi version %d\n", in ath10k_tm_cmd_utf_start()
358 ar->wmi.op_version); in ath10k_tm_cmd_utf_start()
360 ret = ath10k_hif_power_up(ar); in ath10k_tm_cmd_utf_start()
362 ath10k_err(ar, "failed to power up hif (testmode): %d\n", ret); in ath10k_tm_cmd_utf_start()
363 ar->state = ATH10K_STATE_OFF; in ath10k_tm_cmd_utf_start()
367 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_UTF); in ath10k_tm_cmd_utf_start()
369 ath10k_err(ar, "failed to start core (testmode): %d\n", ret); in ath10k_tm_cmd_utf_start()
370 ar->state = ATH10K_STATE_OFF; in ath10k_tm_cmd_utf_start()
374 ar->state = ATH10K_STATE_UTF; in ath10k_tm_cmd_utf_start()
376 if (strlen(ar->testmode.utf_version) > 0) in ath10k_tm_cmd_utf_start()
377 ver = ar->testmode.utf_version; in ath10k_tm_cmd_utf_start()
381 ath10k_info(ar, "UTF firmware %s started\n", ver); in ath10k_tm_cmd_utf_start()
383 mutex_unlock(&ar->conf_mutex); in ath10k_tm_cmd_utf_start()
388 ath10k_hif_power_down(ar); in ath10k_tm_cmd_utf_start()
392 memcpy(ar->fw_features, ar->testmode.orig_fw_features, in ath10k_tm_cmd_utf_start()
393 sizeof(ar->fw_features)); in ath10k_tm_cmd_utf_start()
394 ar->wmi.op_version = ar->testmode.orig_wmi_op_version; in ath10k_tm_cmd_utf_start()
396 release_firmware(ar->testmode.utf); in ath10k_tm_cmd_utf_start()
397 ar->testmode.utf = NULL; in ath10k_tm_cmd_utf_start()
400 mutex_unlock(&ar->conf_mutex); in ath10k_tm_cmd_utf_start()
405 static void __ath10k_tm_cmd_utf_stop(struct ath10k *ar) in __ath10k_tm_cmd_utf_stop() argument
407 lockdep_assert_held(&ar->conf_mutex); in __ath10k_tm_cmd_utf_stop()
409 ath10k_core_stop(ar); in __ath10k_tm_cmd_utf_stop()
410 ath10k_hif_power_down(ar); in __ath10k_tm_cmd_utf_stop()
412 spin_lock_bh(&ar->data_lock); in __ath10k_tm_cmd_utf_stop()
414 ar->testmode.utf_monitor = false; in __ath10k_tm_cmd_utf_stop()
416 spin_unlock_bh(&ar->data_lock); in __ath10k_tm_cmd_utf_stop()
419 memcpy(ar->fw_features, ar->testmode.orig_fw_features, in __ath10k_tm_cmd_utf_stop()
420 sizeof(ar->fw_features)); in __ath10k_tm_cmd_utf_stop()
421 ar->wmi.op_version = ar->testmode.orig_wmi_op_version; in __ath10k_tm_cmd_utf_stop()
423 release_firmware(ar->testmode.utf); in __ath10k_tm_cmd_utf_stop()
424 ar->testmode.utf = NULL; in __ath10k_tm_cmd_utf_stop()
426 ar->state = ATH10K_STATE_OFF; in __ath10k_tm_cmd_utf_stop()
429 static int ath10k_tm_cmd_utf_stop(struct ath10k *ar, struct nlattr *tb[]) in ath10k_tm_cmd_utf_stop() argument
433 ath10k_dbg(ar, ATH10K_DBG_TESTMODE, "testmode cmd utf stop\n"); in ath10k_tm_cmd_utf_stop()
435 mutex_lock(&ar->conf_mutex); in ath10k_tm_cmd_utf_stop()
437 if (ar->state != ATH10K_STATE_UTF) { in ath10k_tm_cmd_utf_stop()
442 __ath10k_tm_cmd_utf_stop(ar); in ath10k_tm_cmd_utf_stop()
446 ath10k_info(ar, "UTF firmware stopped\n"); in ath10k_tm_cmd_utf_stop()
449 mutex_unlock(&ar->conf_mutex); in ath10k_tm_cmd_utf_stop()
453 static int ath10k_tm_cmd_wmi(struct ath10k *ar, struct nlattr *tb[]) in ath10k_tm_cmd_wmi() argument
460 mutex_lock(&ar->conf_mutex); in ath10k_tm_cmd_wmi()
462 if (ar->state != ATH10K_STATE_UTF) { in ath10k_tm_cmd_wmi()
481 ath10k_dbg(ar, ATH10K_DBG_TESTMODE, in ath10k_tm_cmd_wmi()
485 ath10k_dbg_dump(ar, ATH10K_DBG_TESTMODE, NULL, "", buf, buf_len); in ath10k_tm_cmd_wmi()
487 skb = ath10k_wmi_alloc_skb(ar, buf_len); in ath10k_tm_cmd_wmi()
495 ret = ath10k_wmi_cmd_send(ar, skb, cmd_id); in ath10k_tm_cmd_wmi()
497 ath10k_warn(ar, "failed to transmit wmi command (testmode): %d\n", in ath10k_tm_cmd_wmi()
505 mutex_unlock(&ar->conf_mutex); in ath10k_tm_cmd_wmi()
512 struct ath10k *ar = hw->priv; in ath10k_tm_cmd() local
526 return ath10k_tm_cmd_get_version(ar, tb); in ath10k_tm_cmd()
528 return ath10k_tm_cmd_utf_start(ar, tb); in ath10k_tm_cmd()
530 return ath10k_tm_cmd_utf_stop(ar, tb); in ath10k_tm_cmd()
532 return ath10k_tm_cmd_wmi(ar, tb); in ath10k_tm_cmd()
538 void ath10k_testmode_destroy(struct ath10k *ar) in ath10k_testmode_destroy() argument
540 mutex_lock(&ar->conf_mutex); in ath10k_testmode_destroy()
542 if (ar->state != ATH10K_STATE_UTF) { in ath10k_testmode_destroy()
547 __ath10k_tm_cmd_utf_stop(ar); in ath10k_testmode_destroy()
550 mutex_unlock(&ar->conf_mutex); in ath10k_testmode_destroy()