wifi: ath12k: enforce CPU endian format for all QMI data

Currently, the QMI interface only works on little endian systems due to how
it encodes and decodes data. Most QMI related data structures do not use
endian specific types and are already defined in CPU native order. The
ath12k specific QMI structs are an exception: they use partially endian
specific types, which prevents the QMI interface from being extended to
support big endian systems.

Update the two affected ath12k QMI structs to use CPU order types instead.
This is required because the QMI interface is being extended to support big
endian system, and that support depends on QMI data structures being
defined in CPU native order.

This change:
* preserves compatibility with existing kernels, which only support little
  endian system
* enables future support for big endian systems
* aligns ath12k QMI handling with the general QMI design

Signed-off-by: Alexander Wilhelm <alexander.wilhelm@westermo.com>
Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
Link: https://patch.msgid.link/20250922061607.11543-1-alexander.wilhelm@westermo.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
This commit is contained in:
Alexander Wilhelm 2025-09-22 08:16:06 +02:00 committed by Jeff Johnson
parent b706fb4e58
commit 9eb6f55302
2 changed files with 24 additions and 16 deletions

View File

@ -3307,20 +3307,28 @@ static int ath12k_qmi_wlanfw_wlan_cfg_send(struct ath12k_base *ab)
/* This is number of CE configs */
req->tgt_cfg_len = ab->qmi.ce_cfg.tgt_ce_len;
for (pipe_num = 0; pipe_num < req->tgt_cfg_len ; pipe_num++) {
req->tgt_cfg[pipe_num].pipe_num = ce_cfg[pipe_num].pipenum;
req->tgt_cfg[pipe_num].pipe_dir = ce_cfg[pipe_num].pipedir;
req->tgt_cfg[pipe_num].nentries = ce_cfg[pipe_num].nentries;
req->tgt_cfg[pipe_num].nbytes_max = ce_cfg[pipe_num].nbytes_max;
req->tgt_cfg[pipe_num].flags = ce_cfg[pipe_num].flags;
req->tgt_cfg[pipe_num].pipe_num =
__le32_to_cpu(ce_cfg[pipe_num].pipenum);
req->tgt_cfg[pipe_num].pipe_dir =
__le32_to_cpu(ce_cfg[pipe_num].pipedir);
req->tgt_cfg[pipe_num].nentries =
__le32_to_cpu(ce_cfg[pipe_num].nentries);
req->tgt_cfg[pipe_num].nbytes_max =
__le32_to_cpu(ce_cfg[pipe_num].nbytes_max);
req->tgt_cfg[pipe_num].flags =
__le32_to_cpu(ce_cfg[pipe_num].flags);
}
req->svc_cfg_valid = 1;
/* This is number of Service/CE configs */
req->svc_cfg_len = ab->qmi.ce_cfg.svc_to_ce_map_len;
for (pipe_num = 0; pipe_num < req->svc_cfg_len; pipe_num++) {
req->svc_cfg[pipe_num].service_id = svc_cfg[pipe_num].service_id;
req->svc_cfg[pipe_num].pipe_dir = svc_cfg[pipe_num].pipedir;
req->svc_cfg[pipe_num].pipe_num = svc_cfg[pipe_num].pipenum;
req->svc_cfg[pipe_num].service_id =
__le32_to_cpu(svc_cfg[pipe_num].service_id);
req->svc_cfg[pipe_num].pipe_dir =
__le32_to_cpu(svc_cfg[pipe_num].pipedir);
req->svc_cfg[pipe_num].pipe_num =
__le32_to_cpu(svc_cfg[pipe_num].pipenum);
}
/* set shadow v3 configuration */

View File

@ -392,17 +392,17 @@ enum qmi_wlanfw_pipedir_enum_v01 {
};
struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01 {
__le32 pipe_num;
__le32 pipe_dir;
__le32 nentries;
__le32 nbytes_max;
__le32 flags;
u32 pipe_num;
u32 pipe_dir;
u32 nentries;
u32 nbytes_max;
u32 flags;
};
struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01 {
__le32 service_id;
__le32 pipe_dir;
__le32 pipe_num;
u32 service_id;
u32 pipe_dir;
u32 pipe_num;
};
struct qmi_wlanfw_shadow_reg_cfg_s_v01 {