From b3908e3b656783e49ef4fc7f64d024cd22576a8a Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Thu, 24 Jun 2021 12:20:23 +0800 Subject: [PATCH] mac80211: add ath11k support --- package/kernel/mac80211/ath.mk | 55 ++++++- ...-for-qcom-ath11k-calibration-variant.patch | 144 ++++++++++++++++++ ...appropriate-board-data-from-board-id.patch | 47 ++++++ ...or-channel-rx-tx-time-in-survey-dump.patch | 54 +++++++ 4 files changed, 292 insertions(+), 8 deletions(-) create mode 100644 package/kernel/mac80211/patches/ath11k/001-v5.11-ath11k-search-DT-for-qcom-ath11k-calibration-variant.patch create mode 100644 package/kernel/mac80211/patches/ath11k/100-ath11k-load-appropriate-board-data-from-board-id.patch create mode 100644 package/kernel/mac80211/patches/ath11k/101-ath11k-add-support-for-channel-rx-tx-time-in-survey-dump.patch diff --git a/package/kernel/mac80211/ath.mk b/package/kernel/mac80211/ath.mk index 9ce735eb0..626196a29 100644 --- a/package/kernel/mac80211/ath.mk +++ b/package/kernel/mac80211/ath.mk @@ -1,6 +1,6 @@ PKG_DRIVERS += \ ath ath5k ath6kl ath6kl-sdio ath6kl-usb ath9k ath9k-common ath9k-htc ath10k \ - ath11k carl9170 owl-loader ar5523 wil6210 + ath11k ath11k-ahb ath11k-pci carl9170 owl-loader ar5523 wil6210 PKG_CONFIG_DEPENDS += \ CONFIG_PACKAGE_ATH_DEBUG \ @@ -19,7 +19,7 @@ ifdef CONFIG_PACKAGE_MAC80211_DEBUGFS ATH9K_DEBUGFS \ ATH9K_HTC_DEBUGFS \ ATH10K_DEBUGFS \ - ATH11K_DEBUGFS \ + ATH11K_DEBUGFS \ CARL9170_DEBUGFS \ ATH5K_DEBUG \ ATH6KL_DEBUG \ @@ -29,7 +29,7 @@ endif ifdef CONFIG_PACKAGE_MAC80211_TRACING config-y += \ ATH10K_TRACING \ - ATH11K_TRACING \ + ATH11K_TRACING \ ATH6KL_TRACING \ ATH_TRACEPOINTS \ ATH5K_TRACER \ @@ -39,7 +39,7 @@ endif config-$(call config_package,ath) += ATH_CARDS ATH_COMMON config-$(CONFIG_PACKAGE_ATH_DEBUG) += ATH_DEBUG ATH10K_DEBUG ATH11K_DEBUG ATH9K_STATION_STATISTICS config-$(CONFIG_PACKAGE_ATH_DFS) += ATH9K_DFS_CERTIFIED ATH10K_DFS_CERTIFIED -config-$(CONFIG_PACKAGE_ATH_SPECTRAL) += ATH9K_COMMON_SPECTRAL ATH10K_SPECTRAL +config-$(CONFIG_PACKAGE_ATH_SPECTRAL) += ATH9K_COMMON_SPECTRAL ATH10K_SPECTRAL ATH11K_SPECTRAL config-$(CONFIG_PACKAGE_ATH_DYNACK) += ATH9K_DYNACK config-$(call config_package,ath9k) += ATH9K config-$(call config_package,ath9k-common) += ATH9K_COMMON @@ -58,6 +58,8 @@ config-$(CONFIG_ATH10K_THERMAL) += ATH10K_THERMAL config-$(call config_package,ath9k-htc) += ATH9K_HTC config-$(call config_package,ath10k) += ATH10K ATH10K_PCI config-$(call config_package,ath11k) += ATH11K +config-$(call config_package,ath11k-ahb) += ATH11K_AHB +config-$(call config_package,ath11k-pci) += ATH11K_PCI config-$(call config_package,ath5k) += ATH5K ifdef CONFIG_TARGET_ath25 @@ -280,16 +282,16 @@ define KernelPackage/ath10k/config config ATH10K_THERMAL bool "Enable thermal sensors and throttling support" - default y depends on PACKAGE_kmod-ath10k endef define KernelPackage/ath11k $(call KernelPackage/mac80211/Default) - TITLE:=Qualcomm 802.11ax wireless chipset support + TITLE:=Qualcomm 802.11ax wireless chipset support (common code) URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath11k - DEPENDS+= @TARGET_ipq807x +kmod-ath +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT +@DRIVER_11AX_SUPPORT +@DRIVER_11W_SUPPORT +kmod-crypto-michael-mic + DEPENDS+= +kmod-ath +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT +@DRIVER_11AX_SUPPORT \ + +kmod-crypto-michael-mic +ATH11K_THERMAL:kmod-hwmon-core +ATH11K_THERMAL:kmod-thermal FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath11k/ath11k.ko AUTOLOAD:=$(call AutoProbe,ath11k) endef @@ -299,6 +301,43 @@ This module adds support for Qualcomm Technologies 802.11ax family of chipsets. endef +define KernelPackage/ath11k/config + + config ATH11K_THERMAL + bool "Enable thermal sensors and throttling support" + depends on PACKAGE_kmod-ath11k + default y if TARGET_ipq807x + +endef + +define KernelPackage/ath11k-ahb + $(call KernelPackage/mac80211/Default) + TITLE:=Qualcomm 802.11ax AHB wireless chipset support + URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath11k + DEPENDS+= @TARGET_ipq807x +kmod-ath11k + FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath11k/ath11k_ahb.ko + AUTOLOAD:=$(call AutoProbe,ath11k_ahb) +endef + +define KernelPackage/ath11k-ahb/description +This module adds support for Qualcomm Technologies 802.11ax family of +chipsets with AHB bus. +endef + +define KernelPackage/ath11k-pci + $(call KernelPackage/mac80211/Default) + TITLE:=Qualcomm 802.11ax PCI wireless chipset support + URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath11k + DEPENDS+= @PCI_SUPPORT @TARGET_ipq807x +kmod-ath11k + FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath11k/ath11k_pci.ko + AUTOLOAD:=$(call AutoProbe,ath11k_pci) +endef + +define KernelPackage/ath11k-pci/description +This module adds support for Qualcomm Technologies 802.11ax family of +chipsets with PCI bus. +endef + define KernelPackage/carl9170 $(call KernelPackage/mac80211/Default) TITLE:=Driver for Atheros AR9170 USB sticks @@ -338,4 +377,4 @@ define KernelPackage/wil6210 DEPENDS+= @PCI_SUPPORT +kmod-mac80211 +wil6210-firmware FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/wil6210/wil6210.ko AUTOLOAD:=$(call AutoProbe,wil6210) -endef +endef \ No newline at end of file diff --git a/package/kernel/mac80211/patches/ath11k/001-v5.11-ath11k-search-DT-for-qcom-ath11k-calibration-variant.patch b/package/kernel/mac80211/patches/ath11k/001-v5.11-ath11k-search-DT-for-qcom-ath11k-calibration-variant.patch new file mode 100644 index 000000000..d71ba4049 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/001-v5.11-ath11k-search-DT-for-qcom-ath11k-calibration-variant.patch @@ -0,0 +1,144 @@ +From da4ccc477bb46cc518991828ae8ac79e856f92ab Mon Sep 17 00:00:00 2001 +From: Sven Eckelmann +Date: Thu, 15 Oct 2020 15:15:01 +0200 +Subject: [PATCH] ath11k: search DT for qcom,ath11k-calibration-variant + +Board Data File (BDF) is loaded upon driver boot-up procedure. The right +board data file is identified on IPQ6018 using bus, qmi-chip-id and +qmi-board-id. + +The problem, however, can occur when the (default) board data file cannot +fulfill with the vendor requirements and it is necessary to use a different +board data file. + +This problem was already solved on ath10k by adding a ",variant=.*" at the +end of the board name. The same functionality must also be provided for +ath11k. + +The device tree requires an additional string to define the variant name + + wifi@c000000 { + status = "okay"; + qcom,ath11k-calibration-variant = "Cigtech-WF-188"; + }; + +This would create the boarddata identifier for the board-2.bin search + + * bus=ahb,qmi-chip-id=0,qmi-board-id=18,variant=Cigtech-WF-188 + +Signed-off-by: Sven Eckelmann +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20201015131501.1939685-2-sven@narfation.org +--- + drivers/net/wireless/ath/ath11k/core.c | 35 ++++++++++++++++++++++++-- + drivers/net/wireless/ath/ath11k/core.h | 1 + + drivers/net/wireless/ath/ath11k/qmi.c | 5 ++++ + drivers/net/wireless/ath/ath11k/qmi.h | 2 ++ + 4 files changed, 41 insertions(+), 2 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/core.c ++++ b/drivers/net/wireless/ath/ath11k/core.c +@@ -7,6 +7,7 @@ + #include + #include + #include ++#include + #include "core.h" + #include "dp_tx.h" + #include "dp_rx.h" +@@ -141,14 +142,44 @@ static const struct ath11k_hw_params ath + }, + }; + ++int ath11k_core_check_dt(struct ath11k_base *ab) ++{ ++ size_t max_len = sizeof(ab->qmi.target.bdf_ext); ++ const char *variant = NULL; ++ struct device_node *node; ++ ++ node = ab->dev->of_node; ++ if (!node) ++ return -ENOENT; ++ ++ of_property_read_string(node, "qcom,ath11k-calibration-variant", ++ &variant); ++ if (!variant) ++ return -ENODATA; ++ ++ if (strscpy(ab->qmi.target.bdf_ext, variant, max_len) < 0) ++ ath11k_dbg(ab, ATH11K_DBG_BOOT, ++ "bdf variant string is longer than the buffer can accommodate (variant: %s)\n", ++ variant); ++ ++ return 0; ++} ++ + static int ath11k_core_create_board_name(struct ath11k_base *ab, char *name, + size_t name_len) + { ++ /* strlen(',variant=') + strlen(ab->qmi.target.bdf_ext) */ ++ char variant[9 + ATH11K_QMI_BDF_EXT_STR_LENGTH] = { 0 }; ++ ++ if (ab->qmi.target.bdf_ext[0] != '\0') ++ scnprintf(variant, sizeof(variant), ",variant=%s", ++ ab->qmi.target.bdf_ext); ++ + scnprintf(name, name_len, +- "bus=%s,qmi-chip-id=%d,qmi-board-id=%d", ++ "bus=%s,qmi-chip-id=%d,qmi-board-id=%d%s", + ath11k_bus_str(ab->hif.bus), + ab->qmi.target.chip_id, +- ab->qmi.target.board_id); ++ ab->qmi.target.board_id, variant); + + ath11k_dbg(ab, ATH11K_DBG_BOOT, "boot using board name '%s'\n", name); + +--- a/drivers/net/wireless/ath/ath11k/core.h ++++ b/drivers/net/wireless/ath/ath11k/core.h +@@ -886,6 +886,7 @@ void ath11k_core_free(struct ath11k_base + int ath11k_core_fetch_bdf(struct ath11k_base *ath11k, + struct ath11k_board_data *bd); + void ath11k_core_free_bdf(struct ath11k_base *ab, struct ath11k_board_data *bd); ++int ath11k_core_check_dt(struct ath11k_base *ath11k); + + void ath11k_core_halt(struct ath11k *ar); + +--- a/drivers/net/wireless/ath/ath11k/qmi.c ++++ b/drivers/net/wireless/ath/ath11k/qmi.c +@@ -1815,6 +1815,7 @@ static int ath11k_qmi_request_target_cap + struct qmi_wlanfw_cap_resp_msg_v01 resp; + struct qmi_txn txn = {}; + int ret = 0; ++ int r; + + memset(&req, 0, sizeof(req)); + memset(&resp, 0, sizeof(resp)); +@@ -1880,6 +1881,10 @@ static int ath11k_qmi_request_target_cap + ab->qmi.target.fw_build_timestamp, + ab->qmi.target.fw_build_id); + ++ r = ath11k_core_check_dt(ab); ++ if (r) ++ ath11k_dbg(ab, ATH11K_DBG_QMI, "DT bdf variant name not set.\n"); ++ + out: + return ret; + } +--- a/drivers/net/wireless/ath/ath11k/qmi.h ++++ b/drivers/net/wireless/ath/ath11k/qmi.h +@@ -24,6 +24,7 @@ + #define ATH11K_QMI_RESP_LEN_MAX 8192 + #define ATH11K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01 32 + #define ATH11K_QMI_CALDB_SIZE 0x480000 ++#define ATH11K_QMI_BDF_EXT_STR_LENGTH 0x20 + + #define QMI_WLFW_REQUEST_MEM_IND_V01 0x0035 + #define QMI_WLFW_FW_MEM_READY_IND_V01 0x0037 +@@ -101,6 +102,7 @@ struct target_info { + u32 fw_version; + char fw_build_timestamp[ATH11K_QMI_WLANFW_MAX_TIMESTAMP_LEN_V01 + 1]; + char fw_build_id[ATH11K_QMI_WLANFW_MAX_BUILD_ID_LEN_V01 + 1]; ++ char bdf_ext[ATH11K_QMI_BDF_EXT_STR_LENGTH]; + }; + + struct m3_mem_region { diff --git a/package/kernel/mac80211/patches/ath11k/100-ath11k-load-appropriate-board-data-from-board-id.patch b/package/kernel/mac80211/patches/ath11k/100-ath11k-load-appropriate-board-data-from-board-id.patch new file mode 100644 index 000000000..2ab24b053 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/100-ath11k-load-appropriate-board-data-from-board-id.patch @@ -0,0 +1,47 @@ +From 89aec0a67ee30cd11762aede86b3edfdb2433663 Mon Sep 17 00:00:00 2001 +From: Venkateswara Naralasetty +Date: Thu, 2 Jul 2020 12:04:34 +0530 +Subject: [PATCH] ath11k: load appropriate board data based on board id + +This patch adds support to read board id from dts and load +appropriate board data. + +Adding the patch which was removed as a part of commit id - +Ib950b3271fede9ccf7d53fe9629c38ee729a0ef5 + +Signed-off-by: Venkateswara Naralasetty +Signed-off-by: Lavanya Suresh +--- + drivers/net/wireless/ath/ath11k/qmi.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/qmi.c ++++ b/drivers/net/wireless/ath/ath11k/qmi.c +@@ -1811,9 +1811,11 @@ static int ath11k_qmi_assign_target_mem_ + + static int ath11k_qmi_request_target_cap(struct ath11k_base *ab) + { ++ struct device *dev = ab->dev; + struct qmi_wlanfw_cap_req_msg_v01 req; + struct qmi_wlanfw_cap_resp_msg_v01 resp; + struct qmi_txn txn = {}; ++ unsigned int board_id; + int ret = 0; + int r; + +@@ -1853,10 +1855,13 @@ static int ath11k_qmi_request_target_cap + ab->qmi.target.chip_family = resp.chip_info.chip_family; + } + +- if (resp.board_info_valid) ++ if (!of_property_read_u32(dev->of_node, "qcom,board_id", &board_id) && board_id != 0xFF) { ++ ab->qmi.target.board_id = board_id; ++ } else if (resp.board_info_valid) { + ab->qmi.target.board_id = resp.board_info.board_id; +- else ++ } else { + ab->qmi.target.board_id = 0xFF; ++ } + + if (resp.soc_info_valid) + ab->qmi.target.soc_id = resp.soc_info.soc_id; diff --git a/package/kernel/mac80211/patches/ath11k/101-ath11k-add-support-for-channel-rx-tx-time-in-survey-dump.patch b/package/kernel/mac80211/patches/ath11k/101-ath11k-add-support-for-channel-rx-tx-time-in-survey-dump.patch new file mode 100644 index 000000000..dfb00e1ed --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/101-ath11k-add-support-for-channel-rx-tx-time-in-survey-dump.patch @@ -0,0 +1,54 @@ +--- a/drivers/net/wireless/ath/ath11k/wmi.c ++++ b/drivers/net/wireless/ath/ath11k/wmi.c +@@ -1333,6 +1333,7 @@ int ath11k_wmi_pdev_bss_chan_info_reques + WMI_TAG_PDEV_BSS_CHAN_INFO_REQUEST) | + FIELD_PREP(WMI_TLV_LEN, sizeof(*cmd) - TLV_HDR_SIZE); + cmd->req_type = type; ++ cmd->pdev_id = ar->pdev->pdev_id; + + ath11k_dbg(ar->ab, ATH11K_DBG_WMI, + "WMI bss chan info req type %d\n", type); +@@ -3122,7 +3123,7 @@ ath11k_wmi_copy_resource_config(struct w + wmi_cfg->bpf_instruction_size = tg_cfg->bpf_instruction_size; + wmi_cfg->max_bssid_rx_filters = tg_cfg->max_bssid_rx_filters; + wmi_cfg->use_pdev_id = tg_cfg->use_pdev_id; +- wmi_cfg->flag1 = tg_cfg->atf_config; ++ wmi_cfg->flag1 |= WMI_RSRC_CFG_FLAG1_BSS_CHANNEL_INFO_64; + wmi_cfg->peer_map_unmap_v2_support = tg_cfg->peer_map_unmap_v2_support; + wmi_cfg->sched_params = tg_cfg->sched_params; + wmi_cfg->twt_ap_pdev_count = tg_cfg->twt_ap_pdev_count; +--- a/drivers/net/wireless/ath/ath11k/wmi.h ++++ b/drivers/net/wireless/ath/ath11k/wmi.h +@@ -2219,6 +2219,8 @@ struct wmi_init_cmd { + u32 num_host_mem_chunks; + } __packed; + ++#define WMI_RSRC_CFG_FLAG1_BSS_CHANNEL_INFO_64 BIT(5) ++ + struct wmi_resource_config { + u32 tlv_header; + u32 num_vdevs; +@@ -2935,6 +2937,7 @@ struct wmi_pdev_bss_chan_info_req_cmd { + u32 tlv_header; + /* ref wmi_bss_chan_info_req_type */ + u32 req_type; ++ u32 pdev_id; + } __packed; + + struct wmi_ap_ps_peer_cmd { +@@ -4028,7 +4031,6 @@ struct wmi_vdev_stopped_event { + } __packed; + + struct wmi_pdev_bss_chan_info_event { +- u32 pdev_id; + u32 freq; /* Units in MHz */ + u32 noise_floor; /* units are dBm */ + /* rx clear - how often the channel was unused */ +@@ -4046,6 +4048,7 @@ struct wmi_pdev_bss_chan_info_event { + /*rx_cycle cnt for my bss in 64bits format */ + u32 rx_bss_cycle_count_low; + u32 rx_bss_cycle_count_high; ++ u32 pdev_id; + } __packed; + + #define WMI_VDEV_INSTALL_KEY_COMPL_STATUS_SUCCESS 0