lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20250716075100.1447352-7-alexander.wilhelm@westermo.com>
Date: Wed, 16 Jul 2025 09:50:55 +0200
From: Alexander Wilhelm <alexander.wilhelm@...termo.com>
To: Jeff Johnson <jjohnson@...nel.org>, Bjorn Andersson <andersson@...nel.org>,
        Konrad Dybcio <konradybcio@...nel.org>
Cc: linux-wireless@...r.kernel.org, ath12k@...ts.infradead.org,
        linux-kernel@...r.kernel.org, linux-arm-msm@...r.kernel.org
Subject: [PATCH 06/11] wifi: ath12k: fix endianness handling in QMI firmware capabilities

Ensure proper endianness support for big-endian platforms by correcting
data types in the QMI firmware capabilities response message and its
associated structures as well. Add missing byte swaps wherever these
structures are accessed or modified.

Fixes: d889913205cf ("wifi: ath12k: driver for Qualcomm Wi-Fi 7 devices")
Signed-off-by: Alexander Wilhelm <alexander.wilhelm@...termo.com>
---
 drivers/net/wireless/ath/ath12k/qmi.c | 16 ++++++++--------
 drivers/net/wireless/ath/ath12k/qmi.h | 26 +++++++++++++-------------
 2 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/drivers/net/wireless/ath/ath12k/qmi.c b/drivers/net/wireless/ath/ath12k/qmi.c
index 2d00ea54e478..0bcfb9281d01 100644
--- a/drivers/net/wireless/ath/ath12k/qmi.c
+++ b/drivers/net/wireless/ath/ath12k/qmi.c
@@ -2850,20 +2850,20 @@ int ath12k_qmi_request_target_cap(struct ath12k_base *ab)
 	}
 
 	if (resp.chip_info_valid) {
-		ab->qmi.target.chip_id = resp.chip_info.chip_id;
-		ab->qmi.target.chip_family = resp.chip_info.chip_family;
+		ab->qmi.target.chip_id = le32_to_cpu(resp.chip_info.chip_id);
+		ab->qmi.target.chip_family = le32_to_cpu(resp.chip_info.chip_family);
 	}
 
 	if (resp.board_info_valid)
-		ab->qmi.target.board_id = resp.board_info.board_id;
+		ab->qmi.target.board_id = le32_to_cpu(resp.board_info.board_id);
 	else
 		ab->qmi.target.board_id = board_id;
 
 	if (resp.soc_info_valid)
-		ab->qmi.target.soc_id = resp.soc_info.soc_id;
+		ab->qmi.target.soc_id = le32_to_cpu(resp.soc_info.soc_id);
 
 	if (resp.fw_version_info_valid) {
-		ab->qmi.target.fw_version = resp.fw_version_info.fw_version;
+		ab->qmi.target.fw_version = le32_to_cpu(resp.fw_version_info.fw_version);
 		strscpy(ab->qmi.target.fw_build_timestamp,
 			resp.fw_version_info.fw_build_timestamp,
 			sizeof(ab->qmi.target.fw_build_timestamp));
@@ -2876,9 +2876,9 @@ int ath12k_qmi_request_target_cap(struct ath12k_base *ab)
 	if (resp.dev_mem_info_valid) {
 		for (i = 0; i < ATH12K_QMI_WLFW_MAX_DEV_MEM_NUM_V01; i++) {
 			ab->qmi.dev_mem[i].start =
-				resp.dev_mem[i].start;
+				le64_to_cpu(resp.dev_mem[i].start);
 			ab->qmi.dev_mem[i].size =
-				resp.dev_mem[i].size;
+				le64_to_cpu(resp.dev_mem[i].size);
 			ath12k_dbg(ab, ATH12K_DBG_QMI,
 				   "devmem [%d] start 0x%llx size %llu\n", i,
 				   ab->qmi.dev_mem[i].start,
@@ -2887,7 +2887,7 @@ int ath12k_qmi_request_target_cap(struct ath12k_base *ab)
 	}
 
 	if (resp.eeprom_caldata_read_timeout_valid) {
-		ab->qmi.target.eeprom_caldata = resp.eeprom_caldata_read_timeout;
+		ab->qmi.target.eeprom_caldata = le32_to_cpu(resp.eeprom_caldata_read_timeout);
 		ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi cal data supported from eeprom\n");
 	}
 
diff --git a/drivers/net/wireless/ath/ath12k/qmi.h b/drivers/net/wireless/ath/ath12k/qmi.h
index bd715bca8f23..114324157e84 100644
--- a/drivers/net/wireless/ath/ath12k/qmi.h
+++ b/drivers/net/wireless/ath/ath12k/qmi.h
@@ -421,26 +421,26 @@ struct qmi_wlanfw_memory_region_info_s_v01 {
 };
 
 struct qmi_wlanfw_rf_chip_info_s_v01 {
-	u32 chip_id;
-	u32 chip_family;
+	__le32 chip_id;
+	__le32 chip_family;
 };
 
 struct qmi_wlanfw_rf_board_info_s_v01 {
-	u32 board_id;
+	__le32 board_id;
 };
 
 struct qmi_wlanfw_soc_info_s_v01 {
-	u32 soc_id;
+	__le32 soc_id;
 };
 
 struct qmi_wlanfw_fw_version_info_s_v01 {
-	u32 fw_version;
+	__le32 fw_version;
 	char fw_build_timestamp[ATH12K_QMI_WLANFW_MAX_TIMESTAMP_LEN_V01 + 1];
 };
 
 struct qmi_wlanfw_dev_mem_info_s_v01 {
-	u64 start;
-	u64 size;
+	__le64 start;
+	__le64 size;
 };
 
 enum qmi_wlanfw_cal_temp_id_enum_v01 {
@@ -475,17 +475,17 @@ struct qmi_wlanfw_cap_resp_msg_v01 {
 	u8 num_macs_valid;
 	u8 num_macs;
 	u8 voltage_mv_valid;
-	u32 voltage_mv;
+	__le32 voltage_mv;
 	u8 time_freq_hz_valid;
-	u32 time_freq_hz;
+	__le32 time_freq_hz;
 	u8 otp_version_valid;
-	u32 otp_version;
+	__le32 otp_version;
 	u8 eeprom_caldata_read_timeout_valid;
-	u32 eeprom_caldata_read_timeout;
+	__le32 eeprom_caldata_read_timeout;
 	u8 fw_caps_valid;
-	u64 fw_caps;
+	__le64 fw_caps;
 	u8 rd_card_chain_cap_valid;
-	enum qmi_wlanfw_rd_card_chain_cap_v01 rd_card_chain_cap;
+	__le32 rd_card_chain_cap;
 	u8 dev_mem_info_valid;
 	struct qmi_wlanfw_dev_mem_info_s_v01 dev_mem[ATH12K_QMI_WLFW_MAX_DEV_MEM_NUM_V01];
 };
-- 
2.34.1


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ