Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ee241836 authored by Lior David's avatar Lior David
Browse files

wil6210: support AOA in FTM session



Add support for running AOA measurement as part of an
FTM session.
In order to simplify the implementation both in the driver
and FW, AOA measurement is reported using the same vendor
event and not using QCA_WLAN_VENDOR_ATTR_FTM_PEER_RES_AOA_MEAS.
This way we can also report the antenna array mask which was
missing from the vendor commands API for AOA inside FTM session.

Change-Id: I3962487b2e6fd8e56e6e3953c86fd95abe6a9aa0
Signed-off-by: default avatarLior David <liord@codeaurora.org>
Signed-off-by: default avatarAlexei Avshalom Lazar <ailizaro@codeaurora.org>
[liord@codeaurora.org: fix merge conflicts]
Signed-off-by: default avatarLior David <liord@codeaurora.org>
parent d09caf95
Loading
Loading
Loading
Loading
+33 −4
Original line number Diff line number Diff line
@@ -25,6 +25,9 @@
/* initial token to use on non-secure FTM measurement */
#define WIL_TOF_FTM_DEFAULT_INITIAL_TOKEN	2

/* maximum AOA burst period, limited by FW */
#define WIL_AOA_MAX_BURST_PERIOD	255

#define WIL_TOF_FTM_MAX_LCI_LENGTH		(240)
#define WIL_TOF_FTM_MAX_LCR_LENGTH		(240)

@@ -53,6 +56,7 @@ nla_policy wil_nl80211_ftm_peer_policy[QCA_ATTR_FTM_PEER_MAX + 1] = {
	[QCA_ATTR_FTM_PEER_MEAS_FLAGS] = { .type = NLA_U32 },
	[QCA_ATTR_FTM_PEER_MEAS_PARAMS] = { .type = NLA_NESTED },
	[QCA_ATTR_FTM_PEER_SEC_TOK_ID] = { .type = NLA_U8 },
	[QCA_ATTR_FTM_PEER_AOA_BURST_PERIOD] = { .type = NLA_U16 },
	[QCA_ATTR_FTM_PEER_FREQ] = { .type = NLA_U32 },
};

@@ -351,6 +355,7 @@ wil_ftm_cfg80211_start_session(struct wil6210_vif *vif,
	}

	cmd->session_id = cpu_to_le32(WIL_FTM_FW_SESSION_ID);
	cmd->aoa_type = request->aoa_type;
	cmd->num_of_dest = cpu_to_le16(request->n_peers);
	for (i = 0; i < request->n_peers; i++) {
		ether_addr_copy(cmd->ftm_dest_info[i].dst_mac,
@@ -393,6 +398,8 @@ wil_ftm_cfg80211_start_session(struct wil6210_vif *vif,
			request->peers[i].params.burst_duration;
		cmd->ftm_dest_info[i].burst_period =
			cpu_to_le16(request->peers[i].params.burst_period);
		cmd->ftm_dest_info[i].num_burst_per_aoa_meas =
			request->peers[i].aoa_burst_period;
	}

	rc = wmi_send(wil, WMI_TOF_SESSION_START_CMDID, vif->mid,
@@ -482,8 +489,8 @@ wil_aoa_cfg80211_start_measurement(struct wil6210_vif *vif,

	mutex_lock(&vif->ftm.lock);

	if (vif->ftm.aoa_started) {
		wil_err(wil, "AOA measurement already running\n");
	if (vif->ftm.aoa_started || vif->ftm.session_started) {
		wil_err(wil, "AOA or FTM measurement already running\n");
		rc = -EAGAIN;
		goto out;
	}
@@ -525,8 +532,8 @@ void wil_aoa_cfg80211_meas_result(struct wil6210_vif *vif,

	mutex_lock(&vif->ftm.lock);

	if (!vif->ftm.aoa_started) {
		wil_info(wil, "AOA not started, not sending result\n");
	if (!vif->ftm.aoa_started && !vif->ftm.session_started) {
		wil_info(wil, "AOA/FTM not started, not sending result\n");
		goto out;
	}

@@ -757,6 +764,7 @@ int wil_ftm_start_session(struct wiphy *wiphy, struct wireless_dev *wdev,
	struct nlattr *tb2[QCA_ATTR_FTM_PEER_MAX + 1];
	struct nlattr *peer;
	int rc, n_peers = 0, index = 0, tmp;
	u32 aoa_type = 0;

	if (!test_bit(WMI_FW_CAPABILITY_FTM, wil->fw_capabilities))
		return -ENOTSUPP;
@@ -778,6 +786,14 @@ int wil_ftm_start_session(struct wiphy *wiphy, struct wireless_dev *wdev,
		return -EINVAL;
	}

	if (tb[QCA_ATTR_AOA_TYPE]) {
		aoa_type = nla_get_u32(tb[QCA_ATTR_AOA_TYPE]);
		if (aoa_type >= QCA_ATTR_AOA_TYPE_MAX) {
			wil_err(wil, "invalid AOA type: %d\n", aoa_type);
			return -EINVAL;
		}
	}

	nla_for_each_nested(peer, tb[QCA_ATTR_FTM_MEAS_PEERS],
			    tmp)
		n_peers++;
@@ -801,6 +817,7 @@ int wil_ftm_start_session(struct wiphy *wiphy, struct wireless_dev *wdev,

	request->session_cookie =
		nla_get_u64(tb[QCA_ATTR_FTM_SESSION_COOKIE]);
	request->aoa_type = aoa_type;
	request->n_peers = n_peers;
	nla_for_each_nested(peer, tb[QCA_ATTR_FTM_MEAS_PEERS],
			    tmp) {
@@ -829,6 +846,18 @@ int wil_ftm_start_session(struct wiphy *wiphy, struct wireless_dev *wdev,
		if (tb2[QCA_ATTR_FTM_PEER_SEC_TOK_ID])
			request->peers[index].secure_token_id =
				nla_get_u8(tb2[QCA_ATTR_FTM_PEER_SEC_TOK_ID]);
		if (tb2[QCA_ATTR_FTM_PEER_AOA_BURST_PERIOD]) {
			request->peers[index].aoa_burst_period = nla_get_u16(
			    tb2[QCA_ATTR_FTM_PEER_AOA_BURST_PERIOD]);
			if (request->peers[index].aoa_burst_period >
			    WIL_AOA_MAX_BURST_PERIOD) {
				wil_err(wil, "Invalid AOA burst period at index: %d\n",
					index);
				rc = -EINVAL;
				goto out;
			}
		}

		rc = wil_ftm_parse_meas_params(
			wil, tb2[QCA_ATTR_FTM_PEER_MEAS_PARAMS],
			&request->peers[index].params);
+2 −0
Original line number Diff line number Diff line
@@ -421,12 +421,14 @@ struct wil_ftm_meas_peer_info {
	u32 flags; /* enum qca_attr_ftm_peer_meas_flags */
	struct wil_ftm_meas_params params;
	u8 secure_token_id;
	u16 aoa_burst_period; /* 0 if no AOA, >0 every <value> bursts */
};

/* session request, passed to wil_ftm_cfg80211_start_session */
struct wil_ftm_session_request {
	u64 session_cookie;
	u32 n_peers;
	u32 aoa_type; /* enum qca_wlan_vendor_attr_aoa_type */
	/* keep last, variable size according to n_peers */
	struct wil_ftm_meas_peer_info peers[0];
};