summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-05-23 21:05:36 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-05-23 21:05:36 +0000
commit598fefd779c9dbc6ce75cb06596bf009f2d8c017 (patch)
tree2fd253638511ca0361d1737371d61c4c239e4a06
parent41498b805697447ee880534f0537765a3354236a (diff)
parent6de007347797831b8ba00f6105d554347560f67f (diff)
downloadbcm4389-android-gs-tangorpro-5.10-u-beta5.2.tar.gz
Change-Id: Ic2e22df0446fac7631aa08783792ee37e9d31632
-rw-r--r--dhd_rtt.c33
-rw-r--r--dhd_rtt.h17
-rw-r--r--wl_cfgscan.c8
-rwxr-xr-xwl_cfgvendor.c13
-rw-r--r--wl_cfgvendor.h2
5 files changed, 73 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_cfgscan.c b/wl_cfgscan.c
index ec57136..6b84a00 100644
--- a/wl_cfgscan.c
+++ b/wl_cfgscan.c
@@ -2305,6 +2305,14 @@ wl_cfgscan_handle_scanbusy(struct bcm_cfg80211 *cfg, struct net_device *ndev, s3
busy_count = 0;
}
+ if ((IS_STA_IFACE(ndev_to_wdev(ndev))) &&
+ wl_get_drv_status(cfg, CONNECTED, ndev) &&
+ !wl_get_drv_status(cfg, AUTHORIZED, ndev)) {
+ WL_ERR(("Authorization is in progress,"
+ " so ignore this scan busy until it's completed.\n"));
+ busy_count = 0;
+ }
+
if (err == BCME_BUSY || err == BCME_NOTREADY) {
WL_ERR(("Scan err = (%d), busy?%d", err, -EBUSY));
scanbusy_err = -EBUSY;
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
};