// SPDX-License-Identifier: BSD-3-Clause-Clear /* * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. * Copyright (c) 2023-2025 Qualcomm Innovation Center, Inc. All rights reserved.
*/
for (i = 0; i < ab->num_radios; i++) {
pdev = &ab->pdevs[i];
ar = pdev->ar;
if (ar && ar->state == ATH11K_STATE_FTM) break;
}
return ar;
}
/* This function handles unsegmented events. Data in various events are aggregated * in application layer, this event is unsegmented from host perspective.
*/ staticvoid ath11k_tm_wmi_event_unsegmented(struct ath11k_base *ab, u32 cmd_id, struct sk_buff *skb)
{ struct sk_buff *nl_skb; struct ath11k *ar;
out:
spin_unlock_bh(&ar->data_lock);
ath11k_warn(ab, "Failed to send testmode event to higher layers\n");
}
/* This function handles segmented events. Data of various events received * from firmware is aggregated and sent to application layer
*/ staticint ath11k_tm_process_event(struct ath11k_base *ab, u32 cmd_id, conststruct wmi_ftm_event_msg *ftm_msg,
u16 length)
{ struct sk_buff *nl_skb; int ret = 0; struct ath11k *ar;
u8 const *buf_pos;
u16 datalen;
u8 total_segments, current_seq;
u32 data_pos;
u32 pdev_id;
if (!tb[ATH_TM_ATTR_DATA]) {
ret = -EINVAL; goto out;
}
if (!tb[ATH_TM_ATTR_WMI_CMDID]) {
ret = -EINVAL; goto out;
}
buf = nla_data(tb[ATH_TM_ATTR_DATA]);
buf_len = nla_len(tb[ATH_TM_ATTR_DATA]); if (!buf_len) {
ath11k_warn(ar->ab, "No data present in testmode wmi command\n");
ret = -EINVAL; goto out;
}
cmd_id = nla_get_u32(tb[ATH_TM_ATTR_WMI_CMDID]);
/* Make sure that the buffer length is long enough to * hold TLV and pdev/vdev id.
*/ if (buf_len < sizeof(struct wmi_tlv) + sizeof(u32)) {
ret = -EINVAL; goto out;
}
ptr = buf;
tag = FIELD_GET(WMI_TLV_TAG, *ptr);
/* pdev/vdev id start after TLV header */
ptr++;
if (tag == WMI_TAG_PDEV_SET_PARAM_CMD)
*ptr = ar->pdev->pdev_id;
if (ar->ab->fw_mode != ATH11K_FIRMWARE_MODE_FTM &&
(tag == WMI_TAG_VDEV_SET_PARAM_CMD || tag == WMI_TAG_UNIT_TEST_CMD)) { if (vif) {
arvif = ath11k_vif_to_arvif(vif);
*ptr = arvif->vdev_id;
} else {
ret = -EINVAL; goto out;
}
}
ret = ath11k_wmi_cmd_send(wmi, skb, cmd_id); if (ret) {
ath11k_warn(ar->ab, "failed to send wmi ftm command: %d\n", ret); goto out;
}
buf_len -= chunk_len;
bufpos += chunk_len;
}
ar->ftm_msgref++;
ret = 0;
out:
mutex_unlock(&ar->conf_mutex); return ret;
}
int ath11k_tm_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif, void *data, int len)
{ struct ath11k *ar = hw->priv; struct nlattr *tb[ATH_TM_ATTR_MAX + 1]; int ret;
ret = nla_parse(tb, ATH_TM_ATTR_MAX, data, len, ath11k_tm_policy,
NULL); if (ret) return ret;
if (!tb[ATH_TM_ATTR_CMD]) return -EINVAL;
switch (nla_get_u32(tb[ATH_TM_ATTR_CMD])) { case ATH_TM_CMD_GET_VERSION: return ath11k_tm_cmd_get_version(ar, tb); case ATH_TM_CMD_WMI: return ath11k_tm_cmd_wmi(ar, tb, vif); case ATH_TM_CMD_TESTMODE_START: return ath11k_tm_cmd_testmode_start(ar, tb); case ATH_TM_CMD_WMI_FTM: return ath11k_tm_cmd_wmi_ftm(ar, tb); default: return -EOPNOTSUPP;
}
}
Messung V0.5 in Prozent
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.12Angebot
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-06-07)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.