Lines Matching refs:mvm
77 static void iwl_mvm_ftm_reset(struct iwl_mvm *mvm) in iwl_mvm_ftm_reset() argument
81 mvm->ftm_initiator.req = NULL; in iwl_mvm_ftm_reset()
82 mvm->ftm_initiator.req_wdev = NULL; in iwl_mvm_ftm_reset()
83 memset(mvm->ftm_initiator.responses, 0, in iwl_mvm_ftm_reset()
84 sizeof(mvm->ftm_initiator.responses)); in iwl_mvm_ftm_reset()
85 list_for_each_entry_safe(e, t, &mvm->ftm_initiator.loc_list, list) { in iwl_mvm_ftm_reset()
91 void iwl_mvm_ftm_restart(struct iwl_mvm *mvm) in iwl_mvm_ftm_restart() argument
101 lockdep_assert_held(&mvm->mutex); in iwl_mvm_ftm_restart()
103 if (!mvm->ftm_initiator.req) in iwl_mvm_ftm_restart()
106 for (i = 0; i < mvm->ftm_initiator.req->n_peers; i++) { in iwl_mvm_ftm_restart()
107 memcpy(result.addr, mvm->ftm_initiator.req->peers[i].addr, in iwl_mvm_ftm_restart()
109 result.ftm.burst_index = mvm->ftm_initiator.responses[i]; in iwl_mvm_ftm_restart()
111 cfg80211_pmsr_report(mvm->ftm_initiator.req_wdev, in iwl_mvm_ftm_restart()
112 mvm->ftm_initiator.req, in iwl_mvm_ftm_restart()
116 cfg80211_pmsr_complete(mvm->ftm_initiator.req_wdev, in iwl_mvm_ftm_restart()
117 mvm->ftm_initiator.req, GFP_KERNEL); in iwl_mvm_ftm_restart()
118 iwl_mvm_ftm_reset(mvm); in iwl_mvm_ftm_restart()
135 static void iwl_mvm_ftm_cmd_v5(struct iwl_mvm *mvm, struct ieee80211_vif *vif, in iwl_mvm_ftm_cmd_v5() argument
165 static void iwl_mvm_ftm_cmd(struct iwl_mvm *mvm, struct ieee80211_vif *vif, in iwl_mvm_ftm_cmd() argument
211 static int iwl_mvm_ftm_target_chandef(struct iwl_mvm *mvm, in iwl_mvm_ftm_target_chandef() argument
234 IWL_ERR(mvm, "Unsupported BW in FTM request (%d)\n", in iwl_mvm_ftm_target_chandef()
246 iwl_mvm_ftm_put_target_v2(struct iwl_mvm *mvm, in iwl_mvm_ftm_put_target_v2() argument
252 ret = iwl_mvm_ftm_target_chandef(mvm, peer, &target->channel_num, in iwl_mvm_ftm_put_target_v2()
281 static int iwl_mvm_ftm_put_target(struct iwl_mvm *mvm, in iwl_mvm_ftm_put_target() argument
287 ret = iwl_mvm_ftm_target_chandef(mvm, peer, &target->channel_num, in iwl_mvm_ftm_put_target()
321 int iwl_mvm_ftm_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif, in iwl_mvm_ftm_start() argument
326 bool new_api = fw_has_api(&mvm->fw->ucode_capa, in iwl_mvm_ftm_start()
336 lockdep_assert_held(&mvm->mutex); in iwl_mvm_ftm_start()
338 if (mvm->ftm_initiator.req) in iwl_mvm_ftm_start()
342 iwl_mvm_ftm_cmd(mvm, vif, &cmd, req); in iwl_mvm_ftm_start()
347 iwl_mvm_ftm_cmd_v5(mvm, vif, &cmd_v5, req); in iwl_mvm_ftm_start()
357 err = iwl_mvm_ftm_put_target(mvm, peer, &cmd.ap[i]); in iwl_mvm_ftm_start()
359 err = iwl_mvm_ftm_put_target_v2(mvm, peer, in iwl_mvm_ftm_start()
366 err = iwl_mvm_send_cmd_status(mvm, &hcmd, &status); in iwl_mvm_ftm_start()
368 IWL_ERR(mvm, "FTM range request command failure, status: %u\n", in iwl_mvm_ftm_start()
374 mvm->ftm_initiator.req = req; in iwl_mvm_ftm_start()
375 mvm->ftm_initiator.req_wdev = ieee80211_vif_to_wdev(vif); in iwl_mvm_ftm_start()
381 void iwl_mvm_ftm_abort(struct iwl_mvm *mvm, struct cfg80211_pmsr_request *req) in iwl_mvm_ftm_abort() argument
387 lockdep_assert_held(&mvm->mutex); in iwl_mvm_ftm_abort()
389 if (req != mvm->ftm_initiator.req) in iwl_mvm_ftm_abort()
392 if (iwl_mvm_send_cmd_pdu(mvm, iwl_cmd_id(TOF_RANGE_ABORT_CMD, in iwl_mvm_ftm_abort()
395 IWL_ERR(mvm, "failed to abort FTM process\n"); in iwl_mvm_ftm_abort()
413 static u64 iwl_mvm_ftm_get_host_time(struct iwl_mvm *mvm, __le32 fw_gp2_ts) in iwl_mvm_ftm_get_host_time() argument
419 iwl_mvm_get_sync_time(mvm, &curr_gp2, &now_from_boot_ns); in iwl_mvm_ftm_get_host_time()
429 static void iwl_mvm_ftm_get_lci_civic(struct iwl_mvm *mvm, in iwl_mvm_ftm_get_lci_civic() argument
434 list_for_each_entry(entry, &mvm->ftm_initiator.loc_list, list) { in iwl_mvm_ftm_get_lci_civic()
453 static int iwl_mvm_ftm_range_resp_valid(struct iwl_mvm *mvm, u8 request_id, in iwl_mvm_ftm_range_resp_valid() argument
456 lockdep_assert_held(&mvm->mutex); in iwl_mvm_ftm_range_resp_valid()
458 if (request_id != (u8)mvm->ftm_initiator.req->cookie) { in iwl_mvm_ftm_range_resp_valid()
459 IWL_ERR(mvm, "Request ID mismatch, got %u, active %u\n", in iwl_mvm_ftm_range_resp_valid()
460 request_id, (u8)mvm->ftm_initiator.req->cookie); in iwl_mvm_ftm_range_resp_valid()
464 if (num_of_aps > mvm->ftm_initiator.req->n_peers) { in iwl_mvm_ftm_range_resp_valid()
465 IWL_ERR(mvm, "FTM range response invalid\n"); in iwl_mvm_ftm_range_resp_valid()
472 static void iwl_mvm_debug_range_resp(struct iwl_mvm *mvm, u8 index, in iwl_mvm_debug_range_resp() argument
477 IWL_DEBUG_INFO(mvm, "entry %d\n", index); in iwl_mvm_debug_range_resp()
478 IWL_DEBUG_INFO(mvm, "\tstatus: %d\n", res->status); in iwl_mvm_debug_range_resp()
479 IWL_DEBUG_INFO(mvm, "\tBSSID: %pM\n", res->addr); in iwl_mvm_debug_range_resp()
480 IWL_DEBUG_INFO(mvm, "\thost time: %llu\n", res->host_time); in iwl_mvm_debug_range_resp()
481 IWL_DEBUG_INFO(mvm, "\tburst index: %hhu\n", res->ftm.burst_index); in iwl_mvm_debug_range_resp()
482 IWL_DEBUG_INFO(mvm, "\tsuccess num: %u\n", res->ftm.num_ftmr_successes); in iwl_mvm_debug_range_resp()
483 IWL_DEBUG_INFO(mvm, "\trssi: %d\n", res->ftm.rssi_avg); in iwl_mvm_debug_range_resp()
484 IWL_DEBUG_INFO(mvm, "\trssi spread: %hhu\n", res->ftm.rssi_spread); in iwl_mvm_debug_range_resp()
485 IWL_DEBUG_INFO(mvm, "\trtt: %lld\n", res->ftm.rtt_avg); in iwl_mvm_debug_range_resp()
486 IWL_DEBUG_INFO(mvm, "\trtt var: %llu\n", res->ftm.rtt_variance); in iwl_mvm_debug_range_resp()
487 IWL_DEBUG_INFO(mvm, "\trtt spread: %llu\n", res->ftm.rtt_spread); in iwl_mvm_debug_range_resp()
488 IWL_DEBUG_INFO(mvm, "\tdistance: %lld\n", rtt_avg); in iwl_mvm_debug_range_resp()
491 void iwl_mvm_ftm_range_resp(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb) in iwl_mvm_ftm_range_resp() argument
498 bool new_api = fw_has_api(&mvm->fw->ucode_capa, in iwl_mvm_ftm_range_resp()
502 lockdep_assert_held(&mvm->mutex); in iwl_mvm_ftm_range_resp()
504 if (!mvm->ftm_initiator.req) { in iwl_mvm_ftm_range_resp()
505 IWL_ERR(mvm, "Got FTM response but have no request?\n"); in iwl_mvm_ftm_range_resp()
510 if (iwl_mvm_ftm_range_resp_valid(mvm, fw_resp->request_id, in iwl_mvm_ftm_range_resp()
517 if (iwl_mvm_ftm_range_resp_valid(mvm, fw_resp_v5->request_id, in iwl_mvm_ftm_range_resp()
525 IWL_DEBUG_INFO(mvm, "Range response received\n"); in iwl_mvm_ftm_range_resp()
526 IWL_DEBUG_INFO(mvm, "request id: %lld, num of entries: %hhu\n", in iwl_mvm_ftm_range_resp()
527 mvm->ftm_initiator.req->cookie, num_of_aps); in iwl_mvm_ftm_range_resp()
535 if (fw_has_api(&mvm->fw->ucode_capa, in iwl_mvm_ftm_range_resp()
555 peer_idx = iwl_mvm_ftm_find_peer(mvm->ftm_initiator.req, in iwl_mvm_ftm_range_resp()
558 IWL_WARN(mvm, in iwl_mvm_ftm_range_resp()
589 result.host_time = iwl_mvm_ftm_get_host_time(mvm, in iwl_mvm_ftm_range_resp()
592 result.ftm.burst_index = mvm->ftm_initiator.responses[peer_idx]; in iwl_mvm_ftm_range_resp()
593 mvm->ftm_initiator.responses[peer_idx]++; in iwl_mvm_ftm_range_resp()
605 iwl_mvm_ftm_get_lci_civic(mvm, &result); in iwl_mvm_ftm_range_resp()
607 cfg80211_pmsr_report(mvm->ftm_initiator.req_wdev, in iwl_mvm_ftm_range_resp()
608 mvm->ftm_initiator.req, in iwl_mvm_ftm_range_resp()
611 if (fw_has_api(&mvm->fw->ucode_capa, in iwl_mvm_ftm_range_resp()
613 IWL_DEBUG_INFO(mvm, "RTT confidence: %hhu\n", in iwl_mvm_ftm_range_resp()
616 iwl_mvm_debug_range_resp(mvm, i, &result); in iwl_mvm_ftm_range_resp()
620 cfg80211_pmsr_complete(mvm->ftm_initiator.req_wdev, in iwl_mvm_ftm_range_resp()
621 mvm->ftm_initiator.req, in iwl_mvm_ftm_range_resp()
623 iwl_mvm_ftm_reset(mvm); in iwl_mvm_ftm_range_resp()
627 void iwl_mvm_ftm_lc_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb) in iwl_mvm_ftm_lc_notif() argument
643 lockdep_assert_held(&mvm->mutex); in iwl_mvm_ftm_lc_notif()
676 list_add_tail(&entry->list, &mvm->ftm_initiator.loc_list); in iwl_mvm_ftm_lc_notif()