]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: ath12k: fix endianness handling while accessing wmi service bit
authorTamizh Chelvam Raja <tamizh.raja@oss.qualcomm.com>
Thu, 17 Jul 2025 17:35:38 +0000 (23:05 +0530)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Fri, 18 Jul 2025 13:58:03 +0000 (06:58 -0700)
Currently there is no endian conversion in ath12k_wmi_tlv_services_parser()
so the service bit parsing will be incorrect on a big endian platform and
to fix this by using appropriate endian conversion.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00217-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3

Fixes: 342527f35338 ("wifi: ath12k: Add support to parse new WMI event for 6 GHz regulatory")
Signed-off-by: Tamizh Chelvam Raja <tamizh.raja@oss.qualcomm.com>
Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
Link: https://patch.msgid.link/20250717173539.2523396-2-tamizh.raja@oss.qualcomm.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath12k/wmi.c

index ed3c08dbd89934b4efaf7e439cebae02a2470364..535c9849b98c1f68454f137dadc2b3b4e97dc841 100644 (file)
@@ -7581,7 +7581,7 @@ static int ath12k_wmi_tlv_services_parser(struct ath12k_base *ab,
                                          void *data)
 {
        const struct wmi_service_available_event *ev;
-       u32 *wmi_ext2_service_bitmap;
+       __le32 *wmi_ext2_service_bitmap;
        int i, j;
        u16 expected_len;
 
@@ -7613,12 +7613,12 @@ static int ath12k_wmi_tlv_services_parser(struct ath12k_base *ab,
                           ev->wmi_service_segment_bitmap[3]);
                break;
        case WMI_TAG_ARRAY_UINT32:
-               wmi_ext2_service_bitmap = (u32 *)ptr;
+               wmi_ext2_service_bitmap = (__le32 *)ptr;
                for (i = 0, j = WMI_MAX_EXT_SERVICE;
                     i < WMI_SERVICE_SEGMENT_BM_SIZE32 && j < WMI_MAX_EXT2_SERVICE;
                     i++) {
                        do {
-                               if (wmi_ext2_service_bitmap[i] &
+                               if (__le32_to_cpu(wmi_ext2_service_bitmap[i]) &
                                    BIT(j % WMI_AVAIL_SERVICE_BITS_IN_SIZE32))
                                        set_bit(j, ab->wmi_ab.svc_map);
                        } while (++j % WMI_AVAIL_SERVICE_BITS_IN_SIZE32);
@@ -7626,8 +7626,10 @@ static int ath12k_wmi_tlv_services_parser(struct ath12k_base *ab,
 
                ath12k_dbg(ab, ATH12K_DBG_WMI,
                           "wmi_ext2_service_bitmap 0x%04x 0x%04x 0x%04x 0x%04x",
-                          wmi_ext2_service_bitmap[0], wmi_ext2_service_bitmap[1],
-                          wmi_ext2_service_bitmap[2], wmi_ext2_service_bitmap[3]);
+                          __le32_to_cpu(wmi_ext2_service_bitmap[0]),
+                          __le32_to_cpu(wmi_ext2_service_bitmap[1]),
+                          __le32_to_cpu(wmi_ext2_service_bitmap[2]),
+                          __le32_to_cpu(wmi_ext2_service_bitmap[3]));
                break;
        }
        return 0;