summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDennis Jeon <dennis.jeon@broadcom.corp-partner.google.com>2023-04-11 20:54:37 +0900
committerIsaac Chiou <isaacchiou@google.com>2023-05-15 12:14:00 +0000
commit1da246746d8bf61a5d10a71f5769f0e6a7f8f137 (patch)
tree7ac1f7a6819238607aa219f1fc0c1ff5d26ef2fc
parent875d2d33365613c5ac0ca9ecaed42a58517beac0 (diff)
downloadbcm4389-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.c33
-rw-r--r--dhd_rtt.h17
-rwxr-xr-xwl_cfgvendor.c13
-rw-r--r--wl_cfgvendor.h2
4 files changed, 65 insertions, 0 deletions
diff --git a/dhd_rtt.c b/dhd_rtt.c
index 6c6ba2a..cb5b3e6 100644
--- a/dhd_rtt.c
+++ b/dhd_rtt.c
@@ -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) {
diff --git a/dhd_rtt.h b/dhd_rtt.h
index 6fb3500..86535c1 100644
--- a/dhd_rtt.h
+++ b/dhd_rtt.h
@@ -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
};