wifi: mwifiex: Fix RF calibration data download from file
authorJeff Chen <jeff.chen_1@nxp.com>
Tue, 18 Mar 2025 05:07:39 +0000 (13:07 +0800)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 18 Mar 2025 09:27:34 +0000 (10:27 +0100)
This patch resolves an issue where RF calibration data from a
file could not be downloaded to the firmware. The feature to
download calibration data from a file was broken by the commit:
d39fbc88956e.

The issue arose because the function `mwifiex_cmd_cfg_data()`
was modified in a way that prevented proper handling of
file-based calibration data. While this patch restores the ability
to download RF calibration data from a file, it may inadvertently
break the feature to download calibration data from the device
tree. This is because the function `mwifiex_dnld_dt_cfgdata()`,
which also relies on `mwifiex_cmd_cfg_data()`, is still used for
device tree-based calibration data downloads.

Fixes: d39fbc88956e ("mwifiex: remove cfg_data construction")
Signed-off-by: Jeff Chen <jeff.chen_1@nxp.com>
Link: https://patch.msgid.link/20250318050739.2239376-3-jeff.chen_1@nxp.com
[add newline for shorter lines]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/marvell/mwifiex/fw.h
drivers/net/wireless/marvell/mwifiex/sta_cmd.c

index 4a96281..91458f3 100644 (file)
@@ -454,6 +454,11 @@ enum mwifiex_channel_flags {
 #define HostCmd_RET_BIT                       0x8000
 #define HostCmd_ACT_GEN_GET                   0x0000
 #define HostCmd_ACT_GEN_SET                   0x0001
+#define HOST_CMD_ACT_GEN_SET                  0x0001
+/* Add this non-CamelCase-style macro to comply with checkpatch requirements.
+ *  This macro will eventually replace all existing CamelCase-style macros in
+ *  the future for consistency.
+ */
 #define HostCmd_ACT_GEN_REMOVE                0x0004
 #define HostCmd_ACT_BITWISE_SET               0x0002
 #define HostCmd_ACT_BITWISE_CLR               0x0003
@@ -2352,6 +2357,14 @@ struct host_cmd_ds_add_station {
        u8 tlv[];
 } __packed;
 
+#define MWIFIEX_CFG_TYPE_CAL 0x2
+
+struct host_cmd_ds_802_11_cfg_data {
+       __le16 action;
+       __le16 type;
+       __le16 data_len;
+} __packed;
+
 struct host_cmd_ds_command {
        __le16 command;
        __le16 size;
@@ -2431,6 +2444,7 @@ struct host_cmd_ds_command {
                struct host_cmd_ds_pkt_aggr_ctrl pkt_aggr_ctrl;
                struct host_cmd_ds_sta_configure sta_cfg;
                struct host_cmd_ds_add_station sta_info;
+               struct host_cmd_ds_802_11_cfg_data cfg_data;
        } params;
 } __packed;
 
index c0e6ce1..c4689f5 100644 (file)
@@ -1507,6 +1507,7 @@ static int mwifiex_cmd_cfg_data(struct mwifiex_private *priv,
        u32 len;
        u8 *data = (u8 *)cmd + S_DS_GEN;
        int ret;
+       struct host_cmd_ds_802_11_cfg_data *pcfg_data;
 
        if (prop) {
                len = prop->length;
@@ -1514,12 +1515,20 @@ static int mwifiex_cmd_cfg_data(struct mwifiex_private *priv,
                                                data, len);
                if (ret)
                        return ret;
+
+               cmd->size = cpu_to_le16(S_DS_GEN + len);
                mwifiex_dbg(adapter, INFO,
                            "download cfg_data from device tree: %s\n",
                            prop->name);
        } else if (adapter->cal_data->data && adapter->cal_data->size > 0) {
                len = mwifiex_parse_cal_cfg((u8 *)adapter->cal_data->data,
-                                           adapter->cal_data->size, data);
+                                           adapter->cal_data->size,
+                                           data + sizeof(*pcfg_data));
+               pcfg_data = &cmd->params.cfg_data;
+               pcfg_data->action = cpu_to_le16(HOST_CMD_ACT_GEN_SET);
+               pcfg_data->type = cpu_to_le16(MWIFIEX_CFG_TYPE_CAL);
+               pcfg_data->data_len = cpu_to_le16(len);
+               cmd->size = cpu_to_le16(S_DS_GEN + sizeof(*pcfg_data) + len);
                mwifiex_dbg(adapter, INFO,
                            "download cfg_data from config file\n");
        } else {
@@ -1527,7 +1536,6 @@ static int mwifiex_cmd_cfg_data(struct mwifiex_private *priv,
        }
 
        cmd->command = cpu_to_le16(HostCmd_CMD_CFG_DATA);
-       cmd->size = cpu_to_le16(S_DS_GEN + len);
 
        return 0;
 }