diff options
author | Dennis Jeon <dennis.jeon@broadcom.corp-partner.google.com> | 2023-04-11 20:54:37 +0900 |
---|---|---|
committer | Isaac Chiou <isaacchiou@google.com> | 2023-05-15 12:14:00 +0000 |
commit | 1da246746d8bf61a5d10a71f5769f0e6a7f8f137 (patch) | |
tree | 7ac1f7a6819238607aa219f1fc0c1ff5d26ef2fc | |
parent | 875d2d33365613c5ac0ca9ecaed42a58517beac0 (diff) | |
download | bcm4389-1da246746d8bf61a5d10a71f5769f0e6a7f8f137.tar.gz |
bcmdhd: Adding bw and chanspec as part of the rtt result
Bug: 263532487
Test: RTT aging test passed
Change-Id: Icd286a85c3f90caef46f7507cec5466a8a95a9da
Signed-off-by: Dennis Jeon <dennis.jeon@broadcom.corp-partner.google.com>
-rw-r--r-- | dhd_rtt.c | 33 | ||||
-rw-r--r-- | dhd_rtt.h | 17 | ||||
-rwxr-xr-x | wl_cfgvendor.c | 13 | ||||
-rw-r--r-- | wl_cfgvendor.h | 2 |
4 files changed, 65 insertions, 0 deletions
@@ -3698,6 +3698,7 @@ dhd_rtt_convert_results_to_host_v2(rtt_result_t *rtt_result, const uint8 *p_data uint8 num_ftm = 0; char *ftm_frame_types[] = FTM_FRAME_TYPES; rtt_report_t *rtt_report = &(rtt_result->report); + chanspec_bw_t chspec_bw = 0; BCM_REFERENCE(ftm_frame_types); BCM_REFERENCE(dist); @@ -3711,6 +3712,7 @@ dhd_rtt_convert_results_to_host_v2(rtt_result_t *rtt_result, const uint8 *p_data BCM_REFERENCE(chanspec); BCM_REFERENCE(session_state); BCM_REFERENCE(ftm_session_state_value_to_logstr); + BCM_REFERENCE(chspec_bw); NULL_CHECK(rtt_report, "rtt_report is NULL", err); NULL_CHECK(p_data, "p_data is NULL", err); @@ -3871,6 +3873,36 @@ dhd_rtt_convert_results_to_host_v2(rtt_result_t *rtt_result, const uint8 *p_data ftm_tmu_value_to_logstr(ltoh16_ua(&p_data_info->u.burst_duration.tmu)))); DHD_RTT(("rtt_report->burst_duration : %d\n", rtt_report->burst_duration)); } + + if (p_data_info->num_meas && p_sample_avg->chanspec) { + chanspec = ltoh32_ua(&p_sample_avg->chanspec); +#ifdef WL_CFG80211 + rtt_result->frequency = wl_channel_to_frequency(wf_chspec_ctlchan(chanspec), + CHSPEC_BAND(chanspec)); +#endif /* WL_CFG80211 */ + chspec_bw = CHSPEC_BW(chanspec); + } + + /* Map as per host enums */ + switch (chspec_bw) { + case WL_CHANSPEC_BW_20: + rtt_result->packet_bw = WIFI_RTT_BW_20; + break; + case WL_CHANSPEC_BW_40: + rtt_result->packet_bw = WIFI_RTT_BW_40; + break; + case WL_CHANSPEC_BW_80: + rtt_result->packet_bw = WIFI_RTT_BW_80; + break; + case WL_CHANSPEC_BW_160: + rtt_result->packet_bw = WIFI_RTT_BW_160; + break; + default: + rtt_result->packet_bw = WIFI_RTT_BW_UNSPECIFIED; + DHD_RTT_ERR(("%s Unspecified bw\n", __FUNCTION__)); + break; + } + /* display detail if available */ num_rtt = ltoh16_ua(&p_data_info->num_rtt); if (num_rtt > 0) { @@ -4127,6 +4159,7 @@ dhd_rtt_convert_results_to_host_v3(rtt_result_t *rtt_result, const uint8 *p_data ftm_tmu_value_to_logstr(ltoh16_ua(&p_data_info->u.burst_duration.tmu)))); DHD_RTT(("rtt_report->burst_duration : %d\n", rtt_report->burst_duration)); } + /* display detail if available */ num_rtt = ltoh16_ua(&p_data_info->num_rtt); if (num_rtt > 0) { @@ -159,6 +159,18 @@ enum rtt_rate_bw { RTT_RATE_160M }; +/* RTT Measurement Bandwidth */ +typedef enum wifi_rtt_bw { + WIFI_RTT_BW_UNSPECIFIED = 0x00, + WIFI_RTT_BW_5 = 0x01, + WIFI_RTT_BW_10 = 0x02, + WIFI_RTT_BW_20 = 0x04, + WIFI_RTT_BW_40 = 0x08, + WIFI_RTT_BW_80 = 0x10, + WIFI_RTT_BW_160 = 0x20, + WIFI_RTT_BW_320 = 0x40 +} wifi_rtt_bw_t; + typedef enum ranging_type { RTT_TYPE_INVALID = 0, RTT_TYPE_LEGACY = 1, @@ -392,6 +404,7 @@ typedef struct rtt_results_header { struct list_head list; struct list_head result_list; } rtt_results_header_t; + struct rtt_result_detail { uint8 num_ota_meas; uint32 result_flags; @@ -403,6 +416,10 @@ typedef struct rtt_result { int32 report_len; /* total length of rtt_report */ struct rtt_result_detail rtt_detail; int32 detail_len; + /* primary channel frequency (MHz) used for ranging measurements */ + wifi_channel frequency; + /* RTT packet bandwidth is an average BW of the BWs of RTT frames. */ + uint8 packet_bw; } rtt_result_t; /* RTT Capabilities */ diff --git a/wl_cfgvendor.c b/wl_cfgvendor.c index 4419ca3..cfe975f 100755 --- a/wl_cfgvendor.c +++ b/wl_cfgvendor.c @@ -2112,6 +2112,19 @@ wl_cfgvendor_rtt_evt(void *ctx, void *rtt_data) ret)); goto free_mem; } + ret = nla_put_u32(skb, RTT_ATTRIBUTE_RESULT_FREQ, + rtt_result->frequency); + if (ret < 0) { + WL_ERR(("Failed to put RTT_ATTRIBUTE_RESULT_FREQ, ret:%d\n", ret)); + goto free_mem; + } + + ret = nla_put_u32(skb, RTT_ATTRIBUTE_RESULT_BW, + rtt_result->packet_bw); + if (ret < 0) { + WL_ERR(("Failed to put RTT_ATTRIBUTE_RESULT_CNT, ret:%d\n", ret)); + goto free_mem; + } } nla_nest_end(skb, rtt_nl_hdr); cfg80211_vendor_event(skb, kflags); diff --git a/wl_cfgvendor.h b/wl_cfgvendor.h index c4bda43..112c766 100644 --- a/wl_cfgvendor.h +++ b/wl_cfgvendor.h @@ -466,6 +466,8 @@ enum rtt_attributes { RTT_ATTRIBUTE_RESULT_CNT = 32, RTT_ATTRIBUTE_RESULT = 33, RTT_ATTRIBUTE_RESULT_DETAIL = 34, + RTT_ATTRIBUTE_RESULT_FREQ = 35, + RTT_ATTRIBUTE_RESULT_BW = 36, /* Add any new RTT_ATTRIBUTE prior to RTT_ATTRIBUTE_MAX */ RTT_ATTRIBUTE_MAX }; |