mac80211: ath11k: sync with ath-next
[openwrt/openwrt.git] / package / kernel / mac80211 / patches / ath11k / 0080-wifi-ath11k-add-support-default-regdb-while-searchin.patch
diff --git a/package/kernel/mac80211/patches/ath11k/0080-wifi-ath11k-add-support-default-regdb-while-searchin.patch b/package/kernel/mac80211/patches/ath11k/0080-wifi-ath11k-add-support-default-regdb-while-searchin.patch
new file mode 100644 (file)
index 0000000..5ff40aa
--- /dev/null
@@ -0,0 +1,127 @@
+From 88ca89202f8e8afb5225eb5244d79cd67c15d744 Mon Sep 17 00:00:00 2001
+From: Wen Gong <quic_wgong@quicinc.com>
+Date: Fri, 26 May 2023 12:41:06 +0300
+Subject: [PATCH] wifi: ath11k: add support default regdb while searching
+ board-2.bin for WCN6855
+
+Sometimes board-2.bin does not have the regdb data which matched the
+parameters such as vendor, device, subsystem-vendor, subsystem-device
+and etc. Add default regdb data with 'bus=%s' into board-2.bin for
+WCN6855, then ath11k use 'bus=pci' to search regdb data in board-2.bin
+for WCN6855.
+
+kernel: [  122.515808] ath11k_pci 0000:03:00.0: boot using board name 'bus=pci,vendor=17cb,device=1103,subsystem-vendor=17cb,subsystem-device=3374,qmi-chip-id=2,qmi-board-id=262'
+kernel: [  122.517240] ath11k_pci 0000:03:00.0: boot firmware request ath11k/WCN6855/hw2.0/board-2.bin size 6179564
+kernel: [  122.517280] ath11k_pci 0000:03:00.0: failed to fetch regdb data for bus=pci,vendor=17cb,device=1103,subsystem-vendor=17cb,subsystem-device=3374,qmi-chip-id=2,qmi-board-id=262 from ath11k/WCN6855/hw2.0/board-2.bin
+kernel: [  122.517464] ath11k_pci 0000:03:00.0: boot using board name 'bus=pci'
+kernel: [  122.518901] ath11k_pci 0000:03:00.0: boot firmware request ath11k/WCN6855/hw2.0/board-2.bin size 6179564
+kernel: [  122.518915] ath11k_pci 0000:03:00.0: board name
+kernel: [  122.518917] ath11k_pci 0000:03:00.0: 00000000: 62 75 73 3d 70 63 69                             bus=pci
+kernel: [  122.518918] ath11k_pci 0000:03:00.0: boot found match regdb data for name 'bus=pci'
+kernel: [  122.518920] ath11k_pci 0000:03:00.0: boot found regdb data for 'bus=pci'
+kernel: [  122.518921] ath11k_pci 0000:03:00.0: fetched regdb
+
+Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3
+
+Signed-off-by: Wen Gong <quic_wgong@quicinc.com>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/20230517133959.8224-1-quic_wgong@quicinc.com
+---
+ drivers/net/wireless/ath/ath11k/core.c | 53 +++++++++++++++++++-------
+ 1 file changed, 40 insertions(+), 13 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath11k/core.c
++++ b/drivers/net/wireless/ath/ath11k/core.c
+@@ -961,7 +961,8 @@ int ath11k_core_check_dt(struct ath11k_b
+ }
+ static int __ath11k_core_create_board_name(struct ath11k_base *ab, char *name,
+-                                         size_t name_len, bool with_variant)
++                                         size_t name_len, bool with_variant,
++                                         bool bus_type_mode)
+ {
+       /* strlen(',variant=') + strlen(ab->qmi.target.bdf_ext) */
+       char variant[9 + ATH11K_QMI_BDF_EXT_STR_LENGTH] = { 0 };
+@@ -972,15 +973,20 @@ static int __ath11k_core_create_board_na
+       switch (ab->id.bdf_search) {
+       case ATH11K_BDF_SEARCH_BUS_AND_BOARD:
+-              scnprintf(name, name_len,
+-                        "bus=%s,vendor=%04x,device=%04x,subsystem-vendor=%04x,subsystem-device=%04x,qmi-chip-id=%d,qmi-board-id=%d%s",
+-                        ath11k_bus_str(ab->hif.bus),
+-                        ab->id.vendor, ab->id.device,
+-                        ab->id.subsystem_vendor,
+-                        ab->id.subsystem_device,
+-                        ab->qmi.target.chip_id,
+-                        ab->qmi.target.board_id,
+-                        variant);
++              if (bus_type_mode)
++                      scnprintf(name, name_len,
++                                "bus=%s",
++                                ath11k_bus_str(ab->hif.bus));
++              else
++                      scnprintf(name, name_len,
++                                "bus=%s,vendor=%04x,device=%04x,subsystem-vendor=%04x,subsystem-device=%04x,qmi-chip-id=%d,qmi-board-id=%d%s",
++                                ath11k_bus_str(ab->hif.bus),
++                                ab->id.vendor, ab->id.device,
++                                ab->id.subsystem_vendor,
++                                ab->id.subsystem_device,
++                                ab->qmi.target.chip_id,
++                                ab->qmi.target.board_id,
++                                variant);
+               break;
+       default:
+               scnprintf(name, name_len,
+@@ -999,13 +1005,19 @@ static int __ath11k_core_create_board_na
+ static int ath11k_core_create_board_name(struct ath11k_base *ab, char *name,
+                                        size_t name_len)
+ {
+-      return __ath11k_core_create_board_name(ab, name, name_len, true);
++      return __ath11k_core_create_board_name(ab, name, name_len, true, false);
+ }
+ static int ath11k_core_create_fallback_board_name(struct ath11k_base *ab, char *name,
+                                                 size_t name_len)
+ {
+-      return __ath11k_core_create_board_name(ab, name, name_len, false);
++      return __ath11k_core_create_board_name(ab, name, name_len, false, false);
++}
++
++static int ath11k_core_create_bus_type_board_name(struct ath11k_base *ab, char *name,
++                                                size_t name_len)
++{
++      return __ath11k_core_create_board_name(ab, name, name_len, false, true);
+ }
+ const struct firmware *ath11k_core_firmware_request(struct ath11k_base *ab,
+@@ -1309,7 +1321,7 @@ success:
+ int ath11k_core_fetch_regdb(struct ath11k_base *ab, struct ath11k_board_data *bd)
+ {
+-      char boardname[BOARD_NAME_SIZE];
++      char boardname[BOARD_NAME_SIZE], default_boardname[BOARD_NAME_SIZE];
+       int ret;
+       ret = ath11k_core_create_board_name(ab, boardname, BOARD_NAME_SIZE);
+@@ -1323,6 +1335,21 @@ int ath11k_core_fetch_regdb(struct ath11
+                                                ATH11K_BD_IE_REGDB,
+                                                ATH11K_BD_IE_REGDB_NAME,
+                                                ATH11K_BD_IE_REGDB_DATA);
++      if (!ret)
++              goto exit;
++
++      ret = ath11k_core_create_bus_type_board_name(ab, default_boardname,
++                                                   BOARD_NAME_SIZE);
++      if (ret) {
++              ath11k_dbg(ab, ATH11K_DBG_BOOT,
++                         "failed to create default board name for regdb: %d", ret);
++              goto exit;
++      }
++
++      ret = ath11k_core_fetch_board_data_api_n(ab, bd, default_boardname,
++                                               ATH11K_BD_IE_REGDB,
++                                               ATH11K_BD_IE_REGDB_NAME,
++                                               ATH11K_BD_IE_REGDB_DATA);
+       if (!ret)
+               goto exit;