[PATCH 1/2] wifi: ath11k: factory test mode support
Kalle Valo
kvalo at kernel.org
Mon Mar 13 05:17:05 PDT 2023
Raj Kumar Bhagat <quic_rajkbhag at quicinc.com> writes:
> From: Govindaraj Saminathan <quic_gsaminat at quicinc.com>
>
> Add support to process factory test mode commands(FTM) for calibration.
> By default firmware start with NORMAL mode and to process the FTM commands
> firmware needs to be restarted in FTM mode using module parameter ftm_mode.
> The pre-request is all the radios should be down before starting the test.
>
> When start command ATH11K_TM_CMD_TESTMODE_START is received, ar state
> is set to Test Mode. If the FTM command or event length is greater
> than 256 bytes, it will be broken down into multiple segments and
> encoded with TLV header if it is segmented commands, else it is sent
> to firmware as it is.
>
> On receiving UTF event from firmware, if it is segmented event, the driver
> will wait until it receives all the segments and notify the complete
> data to user application. In case the segmented sequence are missed or
> lost from the firmware, driver will skip the already received partial data.
>
> In case of unsegmented UTF event from firmware, driver notifies the
> data to the user application as it comes. Applications handles
> the data further.
>
> Command to boot in ftm mode
> insmod ath11k ftm_mode=1
>
> Tested-on : IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1
>
> Signed-off-by: Govindaraj Saminathan <quic_gsaminat at quicinc.com>
> Co-developed-by: Sowmiya Sree Elavalagan <quic_ssreeela at quicinc.com>
> Signed-off-by: Sowmiya Sree Elavalagan <quic_ssreeela at quicinc.com>
> Signed-off-by: Raj Kumar Bhagat <quic_rajkbhag at quicinc.com>
[...]
> -bool ath11k_tm_event_wmi(struct ath11k *ar, u32 cmd_id, struct sk_buff *skb)
Please do removal of this ath11k_tm_event_wmi() in a separate patch,
then it's easier to read this patch.
> static int ath11k_tm_cmd_get_version(struct ath11k *ar, struct nlattr *tb[])
> {
> struct sk_buff *skb;
> - int ret;
>
> ath11k_dbg(ar->ab, ATH11K_DBG_TESTMODE,
> "testmode cmd get version_major %d version_minor %d\n",
> @@ -98,21 +205,50 @@ static int ath11k_tm_cmd_get_version(struct ath11k *ar, struct nlattr *tb[])
> if (!skb)
> return -ENOMEM;
>
> - ret = nla_put_u32(skb, ATH11K_TM_ATTR_VERSION_MAJOR,
> - ATH11K_TESTMODE_VERSION_MAJOR);
> - if (ret) {
> + if (nla_put_u32(skb, ATH11K_TM_ATTR_VERSION_MAJOR,
> + ATH11K_TESTMODE_VERSION_MAJOR) ||
> + nla_put_u32(skb, ATH11K_TM_ATTR_VERSION_MINOR,
> + ATH11K_TESTMODE_VERSION_MINOR)) {
> kfree_skb(skb);
> - return ret;
> + return -ENOBUFS;
> }
>
> - ret = nla_put_u32(skb, ATH11K_TM_ATTR_VERSION_MINOR,
> - ATH11K_TESTMODE_VERSION_MINOR);
> - if (ret) {
> - kfree_skb(skb);
> - return ret;
> + return cfg80211_testmode_reply(skb);
> +}
Please also do the changes in ath11k_tm_cmd_get_version() in a separate
patch.
> @@ -47,4 +49,21 @@ enum ath11k_tm_cmd {
> * ATH11K_TM_ATTR_DATA.
> */
> ATH11K_TM_CMD_WMI = 1,
> +
> + /* Boots the UTF firmware, the netdev interface must be down at the
> + * time.
> + */
> + ATH11K_TM_CMD_TESTMODE_START = 2,
> +
> + /* Shuts down the UTF firmware and puts the driver back into OFF
> + * state.
> + */
> + ATH11K_TM_CMD_TESTMODE_STOP = 3,
The documentation for for the STOP command is misleading, now ath11k
just ignores that command. So is there any point even to have the
command if it doesn't do anything?
> @@ -8096,6 +8128,12 @@ static void ath11k_wmi_tlv_op_rx(struct ath11k_base *ab, struct sk_buff *skb)
> case WMI_PDEV_CSA_SWITCH_COUNT_STATUS_EVENTID:
> ath11k_wmi_pdev_csa_switch_count_status_event(ab, skb);
> break;
> + case WMI_PDEV_UTF_EVENTID:
> + if (test_bit(ATH11K_FLAG_FTM_SEGMENTED, &ab->dev_flags))
> + ath11k_wmi_tm_event_segmented(ab, id, skb);
> + else
> + ath11k_tm_wmi_event_unsegmented(ab, id, skb);
> + break;
I didn't investigate this in detail, but I find the flag a bit
problematic as it alters the behaviour ATH11K_FLAG_FTM_SEGMENTED and the
behaviour difference it's not documented at all in enum ath11k_tm_cmd.
--
https://patchwork.kernel.org/project/linux-wireless/list/
https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
More information about the ath11k
mailing list