diff options
Diffstat (limited to 'package/kernel/mac80211/patches')
20 files changed, 1616 insertions, 4 deletions
diff --git a/package/kernel/mac80211/patches/ath11k/0019-wifi-ath11k-update-hw-params-for-IPQ5018.patch b/package/kernel/mac80211/patches/ath11k/0019-wifi-ath11k-update-hw-params-for-IPQ5018.patch new file mode 100644 index 0000000000..25d39ddb0d --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0019-wifi-ath11k-update-hw-params-for-IPQ5018.patch @@ -0,0 +1,125 @@ +From 8dfe875aa24aec68baf6702018633c84c2c1feca Mon Sep 17 00:00:00 2001 +From: Sriram R <quic_srirrama@quicinc.com> +Date: Fri, 2 Dec 2022 23:37:13 +0200 +Subject: [PATCH] wifi: ath11k: update hw params for IPQ5018 + +Add new compatible string for IPQ5018 and add +required hw params for IPQ5018. The hw descriptors size and +datapath ops are similar to QCN9074, hence reuse the same. + +Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Sriram R <quic_srirrama@quicinc.com> +Co-developed-by: Karthikeyan Kathirvel <quic_kathirve@quicinc.com> +Signed-off-by: Karthikeyan Kathirvel <quic_kathirve@quicinc.com> +Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> +Link: https://lore.kernel.org/r/20221122132152.17771-3-quic_kathirve@quicinc.com +--- + drivers/net/wireless/ath/ath11k/core.c | 71 ++++++++++++++++++++++++++ + drivers/net/wireless/ath/ath11k/core.h | 8 +++ + 2 files changed, 79 insertions(+) + +--- a/drivers/net/wireless/ath/ath11k/core.c ++++ b/drivers/net/wireless/ath/ath11k/core.c +@@ -604,6 +604,77 @@ static const struct ath11k_hw_params ath + .smp2p_wow_exit = true, + .support_fw_mac_sequence = true, + }, ++ { ++ .hw_rev = ATH11K_HW_IPQ5018_HW10, ++ .name = "ipq5018 hw1.0", ++ .fw = { ++ .dir = "IPQ5018/hw1.0", ++ .board_size = 256 * 1024, ++ .cal_offset = 128 * 1024, ++ }, ++ .max_radios = MAX_RADIOS_5018, ++ .bdf_addr = 0x4BA00000, ++ /* hal_desc_sz and hw ops are similar to qcn9074 */ ++ .hal_desc_sz = sizeof(struct hal_rx_desc_qcn9074), ++ .qmi_service_ins_id = ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_IPQ8074, ++ .ring_mask = &ath11k_hw_ring_mask_ipq8074, ++ .credit_flow = false, ++ .max_tx_ring = 1, ++ .spectral = { ++ .fft_sz = 2, ++ .fft_pad_sz = 0, ++ .summary_pad_sz = 16, ++ .fft_hdr_len = 24, ++ .max_fft_bins = 1024, ++ }, ++ .internal_sleep_clock = false, ++ .host_ce_config = ath11k_host_ce_config_qcn9074, ++ .ce_count = CE_CNT_5018, ++ .rxdma1_enable = true, ++ .num_rxmda_per_pdev = RXDMA_PER_PDEV_5018, ++ .rx_mac_buf_ring = false, ++ .vdev_start_delay = false, ++ .htt_peer_map_v2 = true, ++ .interface_modes = BIT(NL80211_IFTYPE_STATION) | ++ BIT(NL80211_IFTYPE_AP) | ++ BIT(NL80211_IFTYPE_MESH_POINT), ++ .supports_monitor = false, ++ .supports_sta_ps = false, ++ .supports_shadow_regs = false, ++ .fw_mem_mode = 0, ++ .num_vdevs = 16 + 1, ++ .num_peers = 512, ++ .supports_regdb = false, ++ .idle_ps = false, ++ .supports_suspend = false, ++ .hal_params = &ath11k_hw_hal_params_ipq8074, ++ .single_pdev_only = false, ++ .cold_boot_calib = true, ++ .fix_l1ss = true, ++ .supports_dynamic_smps_6ghz = false, ++ .alloc_cacheable_memory = true, ++ .supports_rssi_stats = false, ++ .fw_wmi_diag_event = false, ++ .current_cc_support = false, ++ .dbr_debug_support = true, ++ .global_reset = false, ++ .bios_sar_capa = NULL, ++ .m3_fw_support = false, ++ .fixed_bdf_addr = true, ++ .fixed_mem_region = true, ++ .static_window_map = false, ++ .hybrid_bus_type = false, ++ .fixed_fw_mem = false, ++ .support_off_channel_tx = false, ++ .supports_multi_bssid = false, ++ ++ .sram_dump = {}, ++ ++ .tcl_ring_retry = true, ++ .tx_ring_size = DP_TCL_DATA_RING_SIZE, ++ .smp2p_wow_exit = false, ++ .support_fw_mac_sequence = false, ++ }, + }; + + static inline struct ath11k_pdev *ath11k_core_get_single_pdev(struct ath11k_base *ab) +--- a/drivers/net/wireless/ath/ath11k/core.h ++++ b/drivers/net/wireless/ath/ath11k/core.h +@@ -142,6 +142,7 @@ enum ath11k_hw_rev { + ATH11K_HW_WCN6855_HW20, + ATH11K_HW_WCN6855_HW21, + ATH11K_HW_WCN6750_HW10, ++ ATH11K_HW_IPQ5018_HW10, + }; + + enum ath11k_firmware_mode { +@@ -230,6 +231,13 @@ struct ath11k_he { + + #define MAX_RADIOS 3 + ++/* ipq5018 hw param macros */ ++#define MAX_RADIOS_5018 1 ++#define CE_CNT_5018 6 ++#define TARGET_CE_CNT_5018 9 ++#define SVC_CE_MAP_LEN_5018 17 ++#define RXDMA_PER_PDEV_5018 1 ++ + enum { + WMI_HOST_TP_SCALE_MAX = 0, + WMI_HOST_TP_SCALE_50 = 1, diff --git a/package/kernel/mac80211/patches/ath11k/0020-wifi-ath11k-update-ce-configurations-for-IPQ5018.patch b/package/kernel/mac80211/patches/ath11k/0020-wifi-ath11k-update-ce-configurations-for-IPQ5018.patch new file mode 100644 index 0000000000..9a16349b28 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0020-wifi-ath11k-update-ce-configurations-for-IPQ5018.patch @@ -0,0 +1,246 @@ +From 26af7aabd2d8225c6b2056234626ba5099610871 Mon Sep 17 00:00:00 2001 +From: Sriram R <quic_srirrama@quicinc.com> +Date: Fri, 2 Dec 2022 23:37:14 +0200 +Subject: [PATCH] wifi: ath11k: update ce configurations for IPQ5018 + +IPQ5018 is a single pdev device. Update host +and target CE configurations accordingly. + +Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Sriram R <quic_srirrama@quicinc.com> +Co-developed-by: Karthikeyan Kathirvel <quic_kathirve@quicinc.com> +Signed-off-by: Karthikeyan Kathirvel <quic_kathirve@quicinc.com> +Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> +Link: https://lore.kernel.org/r/20221122132152.17771-4-quic_kathirve@quicinc.com +--- + drivers/net/wireless/ath/ath11k/core.c | 4 + + drivers/net/wireless/ath/ath11k/core.h | 3 + + drivers/net/wireless/ath/ath11k/hw.c | 191 +++++++++++++++++++++++++ + 3 files changed, 198 insertions(+) + +--- a/drivers/net/wireless/ath/ath11k/core.c ++++ b/drivers/net/wireless/ath/ath11k/core.c +@@ -630,6 +630,10 @@ static const struct ath11k_hw_params ath + .internal_sleep_clock = false, + .host_ce_config = ath11k_host_ce_config_qcn9074, + .ce_count = CE_CNT_5018, ++ .target_ce_config = ath11k_target_ce_config_wlan_ipq5018, ++ .target_ce_count = TARGET_CE_CNT_5018, ++ .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_ipq5018, ++ .svc_to_ce_map_len = SVC_CE_MAP_LEN_5018, + .rxdma1_enable = true, + .num_rxmda_per_pdev = RXDMA_PER_PDEV_5018, + .rx_mac_buf_ring = false, +--- a/drivers/net/wireless/ath/ath11k/core.h ++++ b/drivers/net/wireless/ath/ath11k/core.h +@@ -1146,6 +1146,9 @@ extern const struct service_to_pipe ath1 + extern const struct ce_pipe_config ath11k_target_ce_config_wlan_qca6390[]; + extern const struct service_to_pipe ath11k_target_service_to_ce_map_wlan_qca6390[]; + ++extern const struct ce_pipe_config ath11k_target_ce_config_wlan_ipq5018[]; ++extern const struct service_to_pipe ath11k_target_service_to_ce_map_wlan_ipq5018[]; ++ + extern const struct ce_pipe_config ath11k_target_ce_config_wlan_qcn9074[]; + extern const struct service_to_pipe ath11k_target_service_to_ce_map_wlan_qcn9074[]; + int ath11k_core_qmi_firmware_ready(struct ath11k_base *ab); +--- a/drivers/net/wireless/ath/ath11k/hw.c ++++ b/drivers/net/wireless/ath/ath11k/hw.c +@@ -1972,6 +1972,197 @@ const struct ath11k_hw_ring_mask ath11k_ + }, + }; + ++/* Target firmware's Copy Engine configuration for IPQ5018 */ ++const struct ce_pipe_config ath11k_target_ce_config_wlan_ipq5018[] = { ++ /* CE0: host->target HTC control and raw streams */ ++ { ++ .pipenum = __cpu_to_le32(0), ++ .pipedir = __cpu_to_le32(PIPEDIR_OUT), ++ .nentries = __cpu_to_le32(32), ++ .nbytes_max = __cpu_to_le32(2048), ++ .flags = __cpu_to_le32(CE_ATTR_FLAGS), ++ .reserved = __cpu_to_le32(0), ++ }, ++ ++ /* CE1: target->host HTT + HTC control */ ++ { ++ .pipenum = __cpu_to_le32(1), ++ .pipedir = __cpu_to_le32(PIPEDIR_IN), ++ .nentries = __cpu_to_le32(32), ++ .nbytes_max = __cpu_to_le32(2048), ++ .flags = __cpu_to_le32(CE_ATTR_FLAGS), ++ .reserved = __cpu_to_le32(0), ++ }, ++ ++ /* CE2: target->host WMI */ ++ { ++ .pipenum = __cpu_to_le32(2), ++ .pipedir = __cpu_to_le32(PIPEDIR_IN), ++ .nentries = __cpu_to_le32(32), ++ .nbytes_max = __cpu_to_le32(2048), ++ .flags = __cpu_to_le32(CE_ATTR_FLAGS), ++ .reserved = __cpu_to_le32(0), ++ }, ++ ++ /* CE3: host->target WMI */ ++ { ++ .pipenum = __cpu_to_le32(3), ++ .pipedir = __cpu_to_le32(PIPEDIR_OUT), ++ .nentries = __cpu_to_le32(32), ++ .nbytes_max = __cpu_to_le32(2048), ++ .flags = __cpu_to_le32(CE_ATTR_FLAGS), ++ .reserved = __cpu_to_le32(0), ++ }, ++ ++ /* CE4: host->target HTT */ ++ { ++ .pipenum = __cpu_to_le32(4), ++ .pipedir = __cpu_to_le32(PIPEDIR_OUT), ++ .nentries = __cpu_to_le32(256), ++ .nbytes_max = __cpu_to_le32(256), ++ .flags = __cpu_to_le32(CE_ATTR_FLAGS | CE_ATTR_DIS_INTR), ++ .reserved = __cpu_to_le32(0), ++ }, ++ ++ /* CE5: target->host Pktlog */ ++ { ++ .pipenum = __cpu_to_le32(5), ++ .pipedir = __cpu_to_le32(PIPEDIR_IN), ++ .nentries = __cpu_to_le32(32), ++ .nbytes_max = __cpu_to_le32(2048), ++ .flags = __cpu_to_le32(CE_ATTR_FLAGS), ++ .reserved = __cpu_to_le32(0), ++ }, ++ ++ /* CE6: Reserved for target autonomous hif_memcpy */ ++ { ++ .pipenum = __cpu_to_le32(6), ++ .pipedir = __cpu_to_le32(PIPEDIR_INOUT), ++ .nentries = __cpu_to_le32(32), ++ .nbytes_max = __cpu_to_le32(16384), ++ .flags = __cpu_to_le32(CE_ATTR_FLAGS), ++ .reserved = __cpu_to_le32(0), ++ }, ++ ++ /* CE7 used only by Host */ ++ { ++ .pipenum = __cpu_to_le32(7), ++ .pipedir = __cpu_to_le32(PIPEDIR_OUT), ++ .nentries = __cpu_to_le32(32), ++ .nbytes_max = __cpu_to_le32(2048), ++ .flags = __cpu_to_le32(0x2000), ++ .reserved = __cpu_to_le32(0), ++ }, ++ ++ /* CE8 target->host used only by IPA */ ++ { ++ .pipenum = __cpu_to_le32(8), ++ .pipedir = __cpu_to_le32(PIPEDIR_INOUT), ++ .nentries = __cpu_to_le32(32), ++ .nbytes_max = __cpu_to_le32(16384), ++ .flags = __cpu_to_le32(CE_ATTR_FLAGS), ++ .reserved = __cpu_to_le32(0), ++ }, ++}; ++ ++/* Map from service/endpoint to Copy Engine for IPQ5018. ++ * This table is derived from the CE TABLE, above. ++ * It is passed to the Target at startup for use by firmware. ++ */ ++const struct service_to_pipe ath11k_target_service_to_ce_map_wlan_ipq5018[] = { ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VO), ++ .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ ++ .pipenum = __cpu_to_le32(3), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VO), ++ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ ++ .pipenum = __cpu_to_le32(2), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BK), ++ .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ ++ .pipenum = __cpu_to_le32(3), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BK), ++ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ ++ .pipenum = __cpu_to_le32(2), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BE), ++ .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ ++ .pipenum = __cpu_to_le32(3), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BE), ++ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ ++ .pipenum = __cpu_to_le32(2), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VI), ++ .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ ++ .pipenum = __cpu_to_le32(3), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VI), ++ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ ++ .pipenum = __cpu_to_le32(2), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL), ++ .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ ++ .pipenum = __cpu_to_le32(3), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL), ++ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ ++ .pipenum = __cpu_to_le32(2), ++ }, ++ ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_RSVD_CTRL), ++ .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ ++ .pipenum = __cpu_to_le32(0), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_RSVD_CTRL), ++ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ ++ .pipenum = __cpu_to_le32(1), ++ }, ++ ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_TEST_RAW_STREAMS), ++ .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ ++ .pipenum = __cpu_to_le32(0), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_TEST_RAW_STREAMS), ++ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ ++ .pipenum = __cpu_to_le32(1), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_HTT_DATA_MSG), ++ .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ ++ .pipenum = __cpu_to_le32(4), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_HTT_DATA_MSG), ++ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ ++ .pipenum = __cpu_to_le32(1), ++ }, ++ { ++ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_PKT_LOG), ++ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ ++ .pipenum = __cpu_to_le32(5), ++ }, ++ ++ /* (Additions here) */ ++ ++ { /* terminator entry */ } ++}; ++ + const struct ath11k_hw_regs ipq8074_regs = { + /* SW2TCL(x) R0 ring configuration address */ + .hal_tcl1_ring_base_lsb = 0x00000510, diff --git a/package/kernel/mac80211/patches/ath11k/0021-wifi-ath11k-remap-ce-register-space-for-IPQ5018.patch b/package/kernel/mac80211/patches/ath11k/0021-wifi-ath11k-remap-ce-register-space-for-IPQ5018.patch new file mode 100644 index 0000000000..d07a258ac2 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0021-wifi-ath11k-remap-ce-register-space-for-IPQ5018.patch @@ -0,0 +1,351 @@ +From b42b3678c91f3ca6e0888bf5a15c1e8678fd5f2d Mon Sep 17 00:00:00 2001 +From: Sriram R <quic_srirrama@quicinc.com> +Date: Fri, 2 Dec 2022 23:37:14 +0200 +Subject: [PATCH] wifi: ath11k: remap ce register space for IPQ5018 + +In IPQ5018 ce register space is moved out of wcss unlike +ipq8074 or ipq6018 and the space is not contiguous, +hence remap the CE registers to a new space to access them. + +Register read/write is modified to check if the register to be written +falls in the CE register space and corresponding register is written. +Also adjust the interrupt register address to ce irq enable/disable. + +Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Sriram R <quic_srirrama@quicinc.com> +Co-developed-by: Karthikeyan Kathirvel <quic_kathirve@quicinc.com> +Signed-off-by: Karthikeyan Kathirvel <quic_kathirve@quicinc.com> +Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> +Link: https://lore.kernel.org/r/20221122132152.17771-5-quic_kathirve@quicinc.com +--- + drivers/net/wireless/ath/ath11k/ahb.c | 44 ++++++++++++++++++++++---- + drivers/net/wireless/ath/ath11k/ce.h | 16 ++++++++++ + drivers/net/wireless/ath/ath11k/core.c | 8 +++++ + drivers/net/wireless/ath/ath11k/core.h | 1 + + drivers/net/wireless/ath/ath11k/hal.c | 17 ++++++---- + drivers/net/wireless/ath/ath11k/hal.h | 5 +++ + drivers/net/wireless/ath/ath11k/hw.c | 17 ++++++++++ + drivers/net/wireless/ath/ath11k/hw.h | 9 ++++++ + drivers/net/wireless/ath/ath11k/pci.c | 2 ++ + 9 files changed, 107 insertions(+), 12 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/ahb.c ++++ b/drivers/net/wireless/ath/ath11k/ahb.c +@@ -267,30 +267,42 @@ static void ath11k_ahb_clearbit32(struct + static void ath11k_ahb_ce_irq_enable(struct ath11k_base *ab, u16 ce_id) + { + const struct ce_attr *ce_attr; ++ const struct ce_ie_addr *ce_ie_addr = ab->hw_params.ce_ie_addr; ++ u32 ie1_reg_addr, ie2_reg_addr, ie3_reg_addr; ++ ++ ie1_reg_addr = ce_ie_addr->ie1_reg_addr + ATH11K_CE_OFFSET(ab); ++ ie2_reg_addr = ce_ie_addr->ie2_reg_addr + ATH11K_CE_OFFSET(ab); ++ ie3_reg_addr = ce_ie_addr->ie3_reg_addr + ATH11K_CE_OFFSET(ab); + + ce_attr = &ab->hw_params.host_ce_config[ce_id]; + if (ce_attr->src_nentries) +- ath11k_ahb_setbit32(ab, ce_id, CE_HOST_IE_ADDRESS); ++ ath11k_ahb_setbit32(ab, ce_id, ie1_reg_addr); + + if (ce_attr->dest_nentries) { +- ath11k_ahb_setbit32(ab, ce_id, CE_HOST_IE_2_ADDRESS); ++ ath11k_ahb_setbit32(ab, ce_id, ie2_reg_addr); + ath11k_ahb_setbit32(ab, ce_id + CE_HOST_IE_3_SHIFT, +- CE_HOST_IE_3_ADDRESS); ++ ie3_reg_addr); + } + } + + static void ath11k_ahb_ce_irq_disable(struct ath11k_base *ab, u16 ce_id) + { + const struct ce_attr *ce_attr; ++ const struct ce_ie_addr *ce_ie_addr = ab->hw_params.ce_ie_addr; ++ u32 ie1_reg_addr, ie2_reg_addr, ie3_reg_addr; ++ ++ ie1_reg_addr = ce_ie_addr->ie1_reg_addr + ATH11K_CE_OFFSET(ab); ++ ie2_reg_addr = ce_ie_addr->ie2_reg_addr + ATH11K_CE_OFFSET(ab); ++ ie3_reg_addr = ce_ie_addr->ie3_reg_addr + ATH11K_CE_OFFSET(ab); + + ce_attr = &ab->hw_params.host_ce_config[ce_id]; + if (ce_attr->src_nentries) +- ath11k_ahb_clearbit32(ab, ce_id, CE_HOST_IE_ADDRESS); ++ ath11k_ahb_clearbit32(ab, ce_id, ie1_reg_addr); + + if (ce_attr->dest_nentries) { +- ath11k_ahb_clearbit32(ab, ce_id, CE_HOST_IE_2_ADDRESS); ++ ath11k_ahb_clearbit32(ab, ce_id, ie2_reg_addr); + ath11k_ahb_clearbit32(ab, ce_id + CE_HOST_IE_3_SHIFT, +- CE_HOST_IE_3_ADDRESS); ++ ie3_reg_addr); + } + } + +@@ -1142,10 +1154,26 @@ static int ath11k_ahb_probe(struct platf + goto err_core_free; + } + ++ ab->mem_ce = ab->mem; ++ + ret = ath11k_core_pre_init(ab); + if (ret) + goto err_core_free; + ++ if (ab->hw_params.ce_remap) { ++ const struct ce_remap *ce_remap = ab->hw_params.ce_remap; ++ /* ce register space is moved out of wcss unlike ipq8074 or ipq6018 ++ * and the space is not contiguous, hence remapping the CE registers ++ * to a new space for accessing them. ++ */ ++ ab->mem_ce = ioremap(ce_remap->base, ce_remap->size); ++ if (IS_ERR(ab->mem_ce)) { ++ dev_err(&pdev->dev, "ce ioremap error\n"); ++ ret = -ENOMEM; ++ goto err_core_free; ++ } ++ } ++ + ret = ath11k_ahb_setup_resources(ab); + if (ret) + goto err_core_free; +@@ -1236,6 +1264,10 @@ static void ath11k_ahb_free_resources(st + ath11k_ahb_release_smp2p_handle(ab); + ath11k_ahb_fw_resource_deinit(ab); + ath11k_ce_free_pipes(ab); ++ ++ if (ab->hw_params.ce_remap) ++ iounmap(ab->mem_ce); ++ + ath11k_core_free(ab); + platform_set_drvdata(pdev, NULL); + } +--- a/drivers/net/wireless/ath/ath11k/ce.h ++++ b/drivers/net/wireless/ath/ath11k/ce.h +@@ -49,6 +49,11 @@ void ath11k_ce_byte_swap(void *mem, u32 + #define CE_HOST_IE_2_ADDRESS 0x00A18040 + #define CE_HOST_IE_3_ADDRESS CE_HOST_IE_ADDRESS + ++/* CE IE registers are different for IPQ5018 */ ++#define CE_HOST_IPQ5018_IE_ADDRESS 0x0841804C ++#define CE_HOST_IPQ5018_IE_2_ADDRESS 0x08418050 ++#define CE_HOST_IPQ5018_IE_3_ADDRESS CE_HOST_IPQ5018_IE_ADDRESS ++ + #define CE_HOST_IE_3_SHIFT 0xC + + #define CE_RING_IDX_INCR(nentries_mask, idx) (((idx) + 1) & (nentries_mask)) +@@ -84,6 +89,17 @@ struct ce_pipe_config { + __le32 reserved; + }; + ++struct ce_ie_addr { ++ u32 ie1_reg_addr; ++ u32 ie2_reg_addr; ++ u32 ie3_reg_addr; ++}; ++ ++struct ce_remap { ++ u32 base; ++ u32 size; ++}; ++ + struct ce_attr { + /* CE_ATTR_* values */ + unsigned int flags; +--- a/drivers/net/wireless/ath/ath11k/core.c ++++ b/drivers/net/wireless/ath/ath11k/core.c +@@ -54,6 +54,7 @@ static const struct ath11k_hw_params ath + .target_ce_count = 11, + .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_ipq8074, + .svc_to_ce_map_len = 21, ++ .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074, + .single_pdev_only = false, + .rxdma1_enable = true, + .num_rxmda_per_pdev = 1, +@@ -137,6 +138,7 @@ static const struct ath11k_hw_params ath + .target_ce_count = 11, + .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_ipq6018, + .svc_to_ce_map_len = 19, ++ .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074, + .single_pdev_only = false, + .rxdma1_enable = true, + .num_rxmda_per_pdev = 1, +@@ -218,6 +220,7 @@ static const struct ath11k_hw_params ath + .target_ce_count = 9, + .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_qca6390, + .svc_to_ce_map_len = 14, ++ .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074, + .single_pdev_only = true, + .rxdma1_enable = false, + .num_rxmda_per_pdev = 2, +@@ -301,6 +304,7 @@ static const struct ath11k_hw_params ath + .target_ce_count = 9, + .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_qcn9074, + .svc_to_ce_map_len = 18, ++ .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074, + .rxdma1_enable = true, + .num_rxmda_per_pdev = 1, + .rx_mac_buf_ring = false, +@@ -381,6 +385,7 @@ static const struct ath11k_hw_params ath + .target_ce_count = 9, + .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_qca6390, + .svc_to_ce_map_len = 14, ++ .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074, + .single_pdev_only = true, + .rxdma1_enable = false, + .num_rxmda_per_pdev = 2, +@@ -546,6 +551,7 @@ static const struct ath11k_hw_params ath + .target_ce_count = 9, + .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_qca6390, + .svc_to_ce_map_len = 14, ++ .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074, + .single_pdev_only = true, + .rxdma1_enable = false, + .num_rxmda_per_pdev = 1, +@@ -634,6 +640,8 @@ static const struct ath11k_hw_params ath + .target_ce_count = TARGET_CE_CNT_5018, + .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_ipq5018, + .svc_to_ce_map_len = SVC_CE_MAP_LEN_5018, ++ .ce_ie_addr = &ath11k_ce_ie_addr_ipq5018, ++ .ce_remap = &ath11k_ce_remap_ipq5018, + .rxdma1_enable = true, + .num_rxmda_per_pdev = RXDMA_PER_PDEV_5018, + .rx_mac_buf_ring = false, +--- a/drivers/net/wireless/ath/ath11k/core.h ++++ b/drivers/net/wireless/ath/ath11k/core.h +@@ -851,6 +851,7 @@ struct ath11k_base { + struct ath11k_dp dp; + + void __iomem *mem; ++ void __iomem *mem_ce; + unsigned long mem_len; + + struct { +--- a/drivers/net/wireless/ath/ath11k/hal.c ++++ b/drivers/net/wireless/ath/ath11k/hal.c +@@ -1220,16 +1220,20 @@ static int ath11k_hal_srng_create_config + s->reg_start[1] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_STATUS_RING_HP; + + s = &hal->srng_config[HAL_CE_SRC]; +- s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab) + HAL_CE_DST_RING_BASE_LSB; +- s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab) + HAL_CE_DST_RING_HP; ++ s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab) + HAL_CE_DST_RING_BASE_LSB + ++ ATH11K_CE_OFFSET(ab); ++ s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab) + HAL_CE_DST_RING_HP + ++ ATH11K_CE_OFFSET(ab); + s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_SRC_REG(ab) - + HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab); + s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_SRC_REG(ab) - + HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab); + + s = &hal->srng_config[HAL_CE_DST]; +- s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_RING_BASE_LSB; +- s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_RING_HP; ++ s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_RING_BASE_LSB + ++ ATH11K_CE_OFFSET(ab); ++ s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_RING_HP + ++ ATH11K_CE_OFFSET(ab); + s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) - + HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab); + s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) - +@@ -1237,8 +1241,9 @@ static int ath11k_hal_srng_create_config + + s = &hal->srng_config[HAL_CE_DST_STATUS]; + s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + +- HAL_CE_DST_STATUS_RING_BASE_LSB; +- s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_STATUS_RING_HP; ++ HAL_CE_DST_STATUS_RING_BASE_LSB + ATH11K_CE_OFFSET(ab); ++ s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_STATUS_RING_HP + ++ ATH11K_CE_OFFSET(ab); + s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) - + HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab); + s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) - +--- a/drivers/net/wireless/ath/ath11k/hal.h ++++ b/drivers/net/wireless/ath/ath11k/hal.h +@@ -321,6 +321,10 @@ struct ath11k_base; + #define HAL_WBM2SW_RELEASE_RING_BASE_MSB_RING_SIZE 0x000fffff + #define HAL_RXDMA_RING_MAX_SIZE 0x0000ffff + ++/* IPQ5018 ce registers */ ++#define HAL_IPQ5018_CE_WFSS_REG_BASE 0x08400000 ++#define HAL_IPQ5018_CE_SIZE 0x200000 ++ + /* Add any other errors here and return them in + * ath11k_hal_rx_desc_get_err(). + */ +@@ -519,6 +523,7 @@ enum hal_srng_dir { + #define HAL_SRNG_FLAGS_MSI_INTR 0x00020000 + #define HAL_SRNG_FLAGS_CACHED 0x20000000 + #define HAL_SRNG_FLAGS_LMAC_RING 0x80000000 ++#define HAL_SRNG_FLAGS_REMAP_CE_RING 0x10000000 + + #define HAL_SRNG_TLV_HDR_TAG GENMASK(9, 1) + #define HAL_SRNG_TLV_HDR_LEN GENMASK(25, 10) +--- a/drivers/net/wireless/ath/ath11k/hw.c ++++ b/drivers/net/wireless/ath/ath11k/hw.c +@@ -2163,6 +2163,23 @@ const struct service_to_pipe ath11k_targ + { /* terminator entry */ } + }; + ++const struct ce_ie_addr ath11k_ce_ie_addr_ipq8074 = { ++ .ie1_reg_addr = CE_HOST_IE_ADDRESS, ++ .ie2_reg_addr = CE_HOST_IE_2_ADDRESS, ++ .ie3_reg_addr = CE_HOST_IE_3_ADDRESS, ++}; ++ ++const struct ce_ie_addr ath11k_ce_ie_addr_ipq5018 = { ++ .ie1_reg_addr = CE_HOST_IPQ5018_IE_ADDRESS - HAL_IPQ5018_CE_WFSS_REG_BASE, ++ .ie2_reg_addr = CE_HOST_IPQ5018_IE_2_ADDRESS - HAL_IPQ5018_CE_WFSS_REG_BASE, ++ .ie3_reg_addr = CE_HOST_IPQ5018_IE_3_ADDRESS - HAL_IPQ5018_CE_WFSS_REG_BASE, ++}; ++ ++const struct ce_remap ath11k_ce_remap_ipq5018 = { ++ .base = HAL_IPQ5018_CE_WFSS_REG_BASE, ++ .size = HAL_IPQ5018_CE_SIZE, ++}; ++ + const struct ath11k_hw_regs ipq8074_regs = { + /* SW2TCL(x) R0 ring configuration address */ + .hal_tcl1_ring_base_lsb = 0x00000510, +--- a/drivers/net/wireless/ath/ath11k/hw.h ++++ b/drivers/net/wireless/ath/ath11k/hw.h +@@ -80,6 +80,8 @@ + #define ATH11K_M3_FILE "m3.bin" + #define ATH11K_REGDB_FILE_NAME "regdb.bin" + ++#define ATH11K_CE_OFFSET(ab) (ab->mem_ce - ab->mem) ++ + enum ath11k_hw_rate_cck { + ATH11K_HW_RATE_CCK_LP_11M = 0, + ATH11K_HW_RATE_CCK_LP_5_5M, +@@ -158,6 +160,8 @@ struct ath11k_hw_params { + u32 target_ce_count; + const struct service_to_pipe *svc_to_ce_map; + u32 svc_to_ce_map_len; ++ const struct ce_ie_addr *ce_ie_addr; ++ const struct ce_remap *ce_remap; + + bool single_pdev_only; + +@@ -277,6 +281,11 @@ extern const struct ath11k_hw_ring_mask + extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_qcn9074; + extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_wcn6750; + ++extern const struct ce_ie_addr ath11k_ce_ie_addr_ipq8074; ++extern const struct ce_ie_addr ath11k_ce_ie_addr_ipq5018; ++ ++extern const struct ce_remap ath11k_ce_remap_ipq5018; ++ + extern const struct ath11k_hw_hal_params ath11k_hw_hal_params_ipq8074; + extern const struct ath11k_hw_hal_params ath11k_hw_hal_params_qca6390; + extern const struct ath11k_hw_hal_params ath11k_hw_hal_params_wcn6750; +--- a/drivers/net/wireless/ath/ath11k/pci.c ++++ b/drivers/net/wireless/ath/ath11k/pci.c +@@ -543,6 +543,8 @@ static int ath11k_pci_claim(struct ath11 + goto clear_master; + } + ++ ab->mem_ce = ab->mem; ++ + ath11k_dbg(ab, ATH11K_DBG_BOOT, "boot pci_mem 0x%pK\n", ab->mem); + return 0; + diff --git a/package/kernel/mac80211/patches/ath11k/0022-wifi-ath11k-update-hal-srng-regs-for-IPQ5018.patch b/package/kernel/mac80211/patches/ath11k/0022-wifi-ath11k-update-hal-srng-regs-for-IPQ5018.patch new file mode 100644 index 0000000000..35ea20a3c4 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0022-wifi-ath11k-update-hal-srng-regs-for-IPQ5018.patch @@ -0,0 +1,130 @@ +From 711b80acbdfb9667a9cf8374e13320a6e624ce73 Mon Sep 17 00:00:00 2001 +From: Sriram R <quic_srirrama@quicinc.com> +Date: Fri, 2 Dec 2022 23:37:14 +0200 +Subject: [PATCH] wifi: ath11k: update hal srng regs for IPQ5018 + +IPQ5018 hal srng register address & offsets are not +similar to IPQ8074/IPQ6018/QCN9074, hence define a +new set of srng register group data for IPQ5018. + +Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Sriram R <quic_srirrama@quicinc.com> +Co-developed-by: Karthikeyan Kathirvel <quic_kathirve@quicinc.com> +Signed-off-by: Karthikeyan Kathirvel <quic_kathirve@quicinc.com> +Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> +Link: https://lore.kernel.org/r/20221122132152.17771-6-quic_kathirve@quicinc.com +--- + drivers/net/wireless/ath/ath11k/core.c | 1 + + drivers/net/wireless/ath/ath11k/hw.c | 79 ++++++++++++++++++++++++++ + drivers/net/wireless/ath/ath11k/hw.h | 1 + + 3 files changed, 81 insertions(+) + +--- a/drivers/net/wireless/ath/ath11k/core.c ++++ b/drivers/net/wireless/ath/ath11k/core.c +@@ -634,6 +634,7 @@ static const struct ath11k_hw_params ath + .max_fft_bins = 1024, + }, + .internal_sleep_clock = false, ++ .regs = &ipq5018_regs, + .host_ce_config = ath11k_host_ce_config_qcn9074, + .ce_count = CE_CNT_5018, + .target_ce_config = ath11k_target_ce_config_wlan_ipq5018, +--- a/drivers/net/wireless/ath/ath11k/hw.c ++++ b/drivers/net/wireless/ath/ath11k/hw.c +@@ -2645,6 +2645,85 @@ static const struct ath11k_hw_tcl2wbm_rb + }, + }; + ++const struct ath11k_hw_regs ipq5018_regs = { ++ /* SW2TCL(x) R0 ring configuration address */ ++ .hal_tcl1_ring_base_lsb = 0x00000694, ++ .hal_tcl1_ring_base_msb = 0x00000698, ++ .hal_tcl1_ring_id = 0x0000069c, ++ .hal_tcl1_ring_misc = 0x000006a4, ++ .hal_tcl1_ring_tp_addr_lsb = 0x000006b0, ++ .hal_tcl1_ring_tp_addr_msb = 0x000006b4, ++ .hal_tcl1_ring_consumer_int_setup_ix0 = 0x000006c4, ++ .hal_tcl1_ring_consumer_int_setup_ix1 = 0x000006c8, ++ .hal_tcl1_ring_msi1_base_lsb = 0x000006dc, ++ .hal_tcl1_ring_msi1_base_msb = 0x000006e0, ++ .hal_tcl1_ring_msi1_data = 0x000006e4, ++ .hal_tcl2_ring_base_lsb = 0x000006ec, ++ .hal_tcl_ring_base_lsb = 0x0000079c, ++ ++ /* TCL STATUS ring address */ ++ .hal_tcl_status_ring_base_lsb = 0x000008a4, ++ ++ /* REO2SW(x) R0 ring configuration address */ ++ .hal_reo1_ring_base_lsb = 0x000001ec, ++ .hal_reo1_ring_base_msb = 0x000001f0, ++ .hal_reo1_ring_id = 0x000001f4, ++ .hal_reo1_ring_misc = 0x000001fc, ++ .hal_reo1_ring_hp_addr_lsb = 0x00000200, ++ .hal_reo1_ring_hp_addr_msb = 0x00000204, ++ .hal_reo1_ring_producer_int_setup = 0x00000210, ++ .hal_reo1_ring_msi1_base_lsb = 0x00000234, ++ .hal_reo1_ring_msi1_base_msb = 0x00000238, ++ .hal_reo1_ring_msi1_data = 0x0000023c, ++ .hal_reo2_ring_base_lsb = 0x00000244, ++ .hal_reo1_aging_thresh_ix_0 = 0x00000564, ++ .hal_reo1_aging_thresh_ix_1 = 0x00000568, ++ .hal_reo1_aging_thresh_ix_2 = 0x0000056c, ++ .hal_reo1_aging_thresh_ix_3 = 0x00000570, ++ ++ /* REO2SW(x) R2 ring pointers (head/tail) address */ ++ .hal_reo1_ring_hp = 0x00003028, ++ .hal_reo1_ring_tp = 0x0000302c, ++ .hal_reo2_ring_hp = 0x00003030, ++ ++ /* REO2TCL R0 ring configuration address */ ++ .hal_reo_tcl_ring_base_lsb = 0x000003fc, ++ .hal_reo_tcl_ring_hp = 0x00003058, ++ ++ /* SW2REO ring address */ ++ .hal_sw2reo_ring_base_lsb = 0x0000013c, ++ .hal_sw2reo_ring_hp = 0x00003018, ++ ++ /* REO CMD ring address */ ++ .hal_reo_cmd_ring_base_lsb = 0x000000e4, ++ .hal_reo_cmd_ring_hp = 0x00003010, ++ ++ /* REO status address */ ++ .hal_reo_status_ring_base_lsb = 0x00000504, ++ .hal_reo_status_hp = 0x00003070, ++ ++ /* WCSS relative address */ ++ .hal_seq_wcss_umac_ce0_src_reg = 0x08400000 ++ - HAL_IPQ5018_CE_WFSS_REG_BASE, ++ .hal_seq_wcss_umac_ce0_dst_reg = 0x08401000 ++ - HAL_IPQ5018_CE_WFSS_REG_BASE, ++ .hal_seq_wcss_umac_ce1_src_reg = 0x08402000 ++ - HAL_IPQ5018_CE_WFSS_REG_BASE, ++ .hal_seq_wcss_umac_ce1_dst_reg = 0x08403000 ++ - HAL_IPQ5018_CE_WFSS_REG_BASE, ++ ++ /* WBM Idle address */ ++ .hal_wbm_idle_link_ring_base_lsb = 0x00000874, ++ .hal_wbm_idle_link_ring_misc = 0x00000884, ++ ++ /* SW2WBM release address */ ++ .hal_wbm_release_ring_base_lsb = 0x000001ec, ++ ++ /* WBM2SW release address */ ++ .hal_wbm0_release_ring_base_lsb = 0x00000924, ++ .hal_wbm1_release_ring_base_lsb = 0x0000097c, ++}; ++ + const struct ath11k_hw_hal_params ath11k_hw_hal_params_ipq8074 = { + .rx_buf_rbm = HAL_RX_BUF_RBM_SW3_BM, + .tcl2wbm_rbm_map = ath11k_hw_tcl2wbm_rbm_map_ipq8074, +--- a/drivers/net/wireless/ath/ath11k/hw.h ++++ b/drivers/net/wireless/ath/ath11k/hw.h +@@ -415,6 +415,7 @@ extern const struct ath11k_hw_regs qca63 + extern const struct ath11k_hw_regs qcn9074_regs; + extern const struct ath11k_hw_regs wcn6855_regs; + extern const struct ath11k_hw_regs wcn6750_regs; ++extern const struct ath11k_hw_regs ipq5018_regs; + + static inline const char *ath11k_bd_ie_type_str(enum ath11k_bd_ie_type type) + { diff --git a/package/kernel/mac80211/patches/ath11k/0023-wifi-ath11k-initialize-hw_ops-for-IPQ5018.patch b/package/kernel/mac80211/patches/ath11k/0023-wifi-ath11k-initialize-hw_ops-for-IPQ5018.patch new file mode 100644 index 0000000000..5ef701a445 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0023-wifi-ath11k-initialize-hw_ops-for-IPQ5018.patch @@ -0,0 +1,90 @@ +From ba60f2793d3a37a00da14bb56a26558a902d2831 Mon Sep 17 00:00:00 2001 +From: Sriram R <quic_srirrama@quicinc.com> +Date: Fri, 2 Dec 2022 23:37:14 +0200 +Subject: [PATCH] wifi: ath11k: initialize hw_ops for IPQ5018 + +The ipq5018_ops is initialized for IPQ5018. This is different from +other platforms. + +Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Sriram R <quic_srirrama@quicinc.com> +Co-developed-by: Karthikeyan Kathirvel <quic_kathirve@quicinc.com> +Signed-off-by: Karthikeyan Kathirvel <quic_kathirve@quicinc.com> +Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> +Link: https://lore.kernel.org/r/20221122132152.17771-7-quic_kathirve@quicinc.com +--- + drivers/net/wireless/ath/ath11k/core.c | 1 + + drivers/net/wireless/ath/ath11k/hw.c | 40 ++++++++++++++++++++++++++ + drivers/net/wireless/ath/ath11k/hw.h | 1 + + 3 files changed, 42 insertions(+) + +--- a/drivers/net/wireless/ath/ath11k/core.c ++++ b/drivers/net/wireless/ath/ath11k/core.c +@@ -635,6 +635,7 @@ static const struct ath11k_hw_params ath + }, + .internal_sleep_clock = false, + .regs = &ipq5018_regs, ++ .hw_ops = &ipq5018_ops, + .host_ce_config = ath11k_host_ce_config_qcn9074, + .ce_count = CE_CNT_5018, + .target_ce_config = ath11k_target_ce_config_wlan_ipq5018, +--- a/drivers/net/wireless/ath/ath11k/hw.c ++++ b/drivers/net/wireless/ath/ath11k/hw.c +@@ -1084,6 +1084,46 @@ const struct ath11k_hw_ops wcn6750_ops = + .get_ring_selector = ath11k_hw_wcn6750_get_tcl_ring_selector, + }; + ++/* IPQ5018 hw ops is similar to QCN9074 except for the dest ring remap */ ++const struct ath11k_hw_ops ipq5018_ops = { ++ .get_hw_mac_from_pdev_id = ath11k_hw_ipq6018_mac_from_pdev_id, ++ .wmi_init_config = ath11k_init_wmi_config_ipq8074, ++ .mac_id_to_pdev_id = ath11k_hw_mac_id_to_pdev_id_ipq8074, ++ .mac_id_to_srng_id = ath11k_hw_mac_id_to_srng_id_ipq8074, ++ .tx_mesh_enable = ath11k_hw_qcn9074_tx_mesh_enable, ++ .rx_desc_get_first_msdu = ath11k_hw_qcn9074_rx_desc_get_first_msdu, ++ .rx_desc_get_last_msdu = ath11k_hw_qcn9074_rx_desc_get_last_msdu, ++ .rx_desc_get_l3_pad_bytes = ath11k_hw_qcn9074_rx_desc_get_l3_pad_bytes, ++ .rx_desc_get_hdr_status = ath11k_hw_qcn9074_rx_desc_get_hdr_status, ++ .rx_desc_encrypt_valid = ath11k_hw_qcn9074_rx_desc_encrypt_valid, ++ .rx_desc_get_encrypt_type = ath11k_hw_qcn9074_rx_desc_get_encrypt_type, ++ .rx_desc_get_decap_type = ath11k_hw_qcn9074_rx_desc_get_decap_type, ++ .rx_desc_get_mesh_ctl = ath11k_hw_qcn9074_rx_desc_get_mesh_ctl, ++ .rx_desc_get_ldpc_support = ath11k_hw_qcn9074_rx_desc_get_ldpc_support, ++ .rx_desc_get_mpdu_seq_ctl_vld = ath11k_hw_qcn9074_rx_desc_get_mpdu_seq_ctl_vld, ++ .rx_desc_get_mpdu_fc_valid = ath11k_hw_qcn9074_rx_desc_get_mpdu_fc_valid, ++ .rx_desc_get_mpdu_start_seq_no = ath11k_hw_qcn9074_rx_desc_get_mpdu_start_seq_no, ++ .rx_desc_get_msdu_len = ath11k_hw_qcn9074_rx_desc_get_msdu_len, ++ .rx_desc_get_msdu_sgi = ath11k_hw_qcn9074_rx_desc_get_msdu_sgi, ++ .rx_desc_get_msdu_rate_mcs = ath11k_hw_qcn9074_rx_desc_get_msdu_rate_mcs, ++ .rx_desc_get_msdu_rx_bw = ath11k_hw_qcn9074_rx_desc_get_msdu_rx_bw, ++ .rx_desc_get_msdu_freq = ath11k_hw_qcn9074_rx_desc_get_msdu_freq, ++ .rx_desc_get_msdu_pkt_type = ath11k_hw_qcn9074_rx_desc_get_msdu_pkt_type, ++ .rx_desc_get_msdu_nss = ath11k_hw_qcn9074_rx_desc_get_msdu_nss, ++ .rx_desc_get_mpdu_tid = ath11k_hw_qcn9074_rx_desc_get_mpdu_tid, ++ .rx_desc_get_mpdu_peer_id = ath11k_hw_qcn9074_rx_desc_get_mpdu_peer_id, ++ .rx_desc_copy_attn_end_tlv = ath11k_hw_qcn9074_rx_desc_copy_attn_end, ++ .rx_desc_get_mpdu_start_tag = ath11k_hw_qcn9074_rx_desc_get_mpdu_start_tag, ++ .rx_desc_get_mpdu_ppdu_id = ath11k_hw_qcn9074_rx_desc_get_mpdu_ppdu_id, ++ .rx_desc_set_msdu_len = ath11k_hw_qcn9074_rx_desc_set_msdu_len, ++ .rx_desc_get_attention = ath11k_hw_qcn9074_rx_desc_get_attention, ++ .rx_desc_get_msdu_payload = ath11k_hw_qcn9074_rx_desc_get_msdu_payload, ++ .mpdu_info_get_peerid = ath11k_hw_ipq8074_mpdu_info_get_peerid, ++ .rx_desc_mac_addr2_valid = ath11k_hw_ipq9074_rx_desc_mac_addr2_valid, ++ .rx_desc_mpdu_start_addr2 = ath11k_hw_ipq9074_rx_desc_mpdu_start_addr2, ++ ++}; ++ + #define ATH11K_TX_RING_MASK_0 BIT(0) + #define ATH11K_TX_RING_MASK_1 BIT(1) + #define ATH11K_TX_RING_MASK_2 BIT(2) +--- a/drivers/net/wireless/ath/ath11k/hw.h ++++ b/drivers/net/wireless/ath/ath11k/hw.h +@@ -275,6 +275,7 @@ extern const struct ath11k_hw_ops qca639 + extern const struct ath11k_hw_ops qcn9074_ops; + extern const struct ath11k_hw_ops wcn6855_ops; + extern const struct ath11k_hw_ops wcn6750_ops; ++extern const struct ath11k_hw_ops ipq5018_ops; + + extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_ipq8074; + extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_qca6390; diff --git a/package/kernel/mac80211/patches/ath11k/0024-wifi-ath11k-add-new-hw-ops-for-IPQ5018-to-get-rx-des.patch b/package/kernel/mac80211/patches/ath11k/0024-wifi-ath11k-add-new-hw-ops-for-IPQ5018-to-get-rx-des.patch new file mode 100644 index 0000000000..64531f13f8 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0024-wifi-ath11k-add-new-hw-ops-for-IPQ5018-to-get-rx-des.patch @@ -0,0 +1,84 @@ +From 69968f88f1770d61cae0febef805fd00d66cf6a1 Mon Sep 17 00:00:00 2001 +From: Sriram R <quic_srirrama@quicinc.com> +Date: Fri, 2 Dec 2022 23:37:15 +0200 +Subject: [PATCH] wifi: ath11k: add new hw ops for IPQ5018 to get rx dest ring + hashmap + +The Destination ring control register is different +for IPQ5018 when compared to IPQ8074/IPQ6018/QCN9074. +Hence create a new hw ops to fetch the hash ring map +for different device variants. ipq5018 hw ops +is similar to qcn9074 except for this change, so reuse +all the qcn9074 ops for ipq5018. + +Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Sriram R <quic_srirrama@quicinc.com> +Co-developed-by: Karthikeyan Kathirvel <quic_kathirve@quicinc.com> +Signed-off-by: Karthikeyan Kathirvel <quic_kathirve@quicinc.com> +Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> +Link: https://lore.kernel.org/r/20221122132152.17771-8-quic_kathirve@quicinc.com +--- + drivers/net/wireless/ath/ath11k/hw.c | 44 ++++++++++++++++++++++++++++ + 1 file changed, 44 insertions(+) + +--- a/drivers/net/wireless/ath/ath11k/hw.c ++++ b/drivers/net/wireless/ath/ath11k/hw.c +@@ -791,6 +791,49 @@ static void ath11k_hw_wcn6855_reo_setup( + ring_hash_map); + } + ++static void ath11k_hw_ipq5018_reo_setup(struct ath11k_base *ab) ++{ ++ u32 reo_base = HAL_SEQ_WCSS_UMAC_REO_REG; ++ u32 val; ++ ++ /* Each hash entry uses three bits to map to a particular ring. */ ++ u32 ring_hash_map = HAL_HASH_ROUTING_RING_SW1 << 0 | ++ HAL_HASH_ROUTING_RING_SW2 << 4 | ++ HAL_HASH_ROUTING_RING_SW3 << 8 | ++ HAL_HASH_ROUTING_RING_SW4 << 12 | ++ HAL_HASH_ROUTING_RING_SW1 << 16 | ++ HAL_HASH_ROUTING_RING_SW2 << 20 | ++ HAL_HASH_ROUTING_RING_SW3 << 24 | ++ HAL_HASH_ROUTING_RING_SW4 << 28; ++ ++ val = ath11k_hif_read32(ab, reo_base + HAL_REO1_GEN_ENABLE); ++ ++ val &= ~HAL_REO1_GEN_ENABLE_FRAG_DST_RING; ++ val |= FIELD_PREP(HAL_REO1_GEN_ENABLE_FRAG_DST_RING, ++ HAL_SRNG_RING_ID_REO2SW1) | ++ FIELD_PREP(HAL_REO1_GEN_ENABLE_AGING_LIST_ENABLE, 1) | ++ FIELD_PREP(HAL_REO1_GEN_ENABLE_AGING_FLUSH_ENABLE, 1); ++ ath11k_hif_write32(ab, reo_base + HAL_REO1_GEN_ENABLE, val); ++ ++ ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_0(ab), ++ HAL_DEFAULT_REO_TIMEOUT_USEC); ++ ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_1(ab), ++ HAL_DEFAULT_REO_TIMEOUT_USEC); ++ ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_2(ab), ++ HAL_DEFAULT_REO_TIMEOUT_USEC); ++ ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_3(ab), ++ HAL_DEFAULT_REO_TIMEOUT_USEC); ++ ++ ath11k_hif_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_0, ++ ring_hash_map); ++ ath11k_hif_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_1, ++ ring_hash_map); ++ ath11k_hif_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_2, ++ ring_hash_map); ++ ath11k_hif_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_3, ++ ring_hash_map); ++} ++ + static u16 ath11k_hw_ipq8074_mpdu_info_get_peerid(u8 *tlv_data) + { + u16 peer_id = 0; +@@ -1117,6 +1160,7 @@ const struct ath11k_hw_ops ipq5018_ops = + .rx_desc_get_mpdu_ppdu_id = ath11k_hw_qcn9074_rx_desc_get_mpdu_ppdu_id, + .rx_desc_set_msdu_len = ath11k_hw_qcn9074_rx_desc_set_msdu_len, + .rx_desc_get_attention = ath11k_hw_qcn9074_rx_desc_get_attention, ++ .reo_setup = ath11k_hw_ipq5018_reo_setup, + .rx_desc_get_msdu_payload = ath11k_hw_qcn9074_rx_desc_get_msdu_payload, + .mpdu_info_get_peerid = ath11k_hw_ipq8074_mpdu_info_get_peerid, + .rx_desc_mac_addr2_valid = ath11k_hw_ipq9074_rx_desc_mac_addr2_valid, diff --git a/package/kernel/mac80211/patches/ath11k/0025-wifi-ath11k-add-ipq5018-device-support.patch b/package/kernel/mac80211/patches/ath11k/0025-wifi-ath11k-add-ipq5018-device-support.patch new file mode 100644 index 0000000000..5b930e8d4f --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0025-wifi-ath11k-add-ipq5018-device-support.patch @@ -0,0 +1,31 @@ +From 25edca7bb18a2a40cc7e54c6f522e9b3c917e2c5 Mon Sep 17 00:00:00 2001 +From: Sriram R <quic_srirrama@quicinc.com> +Date: Fri, 2 Dec 2022 23:37:15 +0200 +Subject: [PATCH] wifi: ath11k: add ipq5018 device support + +ipq5018 is a ahb 2ghz device, enable the compatible support for +ipq5018 in ahb. + +Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Sriram R <quic_srirrama@quicinc.com> +Co-developed-by: Karthikeyan Kathirvel <quic_kathirve@quicinc.com> +Signed-off-by: Karthikeyan Kathirvel <quic_kathirve@quicinc.com> +Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> +Link: https://lore.kernel.org/r/20221122132152.17771-9-quic_kathirve@quicinc.com +--- + drivers/net/wireless/ath/ath11k/ahb.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/net/wireless/ath/ath11k/ahb.c ++++ b/drivers/net/wireless/ath/ath11k/ahb.c +@@ -32,6 +32,9 @@ static const struct of_device_id ath11k_ + { .compatible = "qcom,wcn6750-wifi", + .data = (void *)ATH11K_HW_WCN6750_HW10, + }, ++ { .compatible = "qcom,ipq5018-wifi", ++ .data = (void *)ATH11K_HW_IPQ5018_HW10, ++ }, + { } + }; + diff --git a/package/kernel/mac80211/patches/ath11k/0019-wifi-ath11k-Fix-scan-request-param-frame-size-warnin.patch b/package/kernel/mac80211/patches/ath11k/0026-wifi-ath11k-Fix-scan-request-param-frame-size-warnin.patch index 50c14e7b98..50c14e7b98 100644 --- a/package/kernel/mac80211/patches/ath11k/0019-wifi-ath11k-Fix-scan-request-param-frame-size-warnin.patch +++ b/package/kernel/mac80211/patches/ath11k/0026-wifi-ath11k-Fix-scan-request-param-frame-size-warnin.patch diff --git a/package/kernel/mac80211/patches/ath11k/0020-wifi-ath11k-fix-monitor-mode-bringup-crash.patch b/package/kernel/mac80211/patches/ath11k/0027-wifi-ath11k-fix-monitor-mode-bringup-crash.patch index 62397de726..62397de726 100644 --- a/package/kernel/mac80211/patches/ath11k/0020-wifi-ath11k-fix-monitor-mode-bringup-crash.patch +++ b/package/kernel/mac80211/patches/ath11k/0027-wifi-ath11k-fix-monitor-mode-bringup-crash.patch diff --git a/package/kernel/mac80211/patches/ath11k/0021-wifi-ath11k-debugfs-fix-to-work-with-multiple-PCI-de.patch b/package/kernel/mac80211/patches/ath11k/0028-wifi-ath11k-debugfs-fix-to-work-with-multiple-PCI-de.patch index bd72b6314b..225c4b4316 100644 --- a/package/kernel/mac80211/patches/ath11k/0021-wifi-ath11k-debugfs-fix-to-work-with-multiple-PCI-de.patch +++ b/package/kernel/mac80211/patches/ath11k/0028-wifi-ath11k-debugfs-fix-to-work-with-multiple-PCI-de.patch @@ -60,7 +60,7 @@ Link: https://lore.kernel.org/r/20221220121231.20120-1-kvalo@kernel.org --- a/drivers/net/wireless/ath/ath11k/core.h +++ b/drivers/net/wireless/ath/ath11k/core.h -@@ -912,7 +912,6 @@ struct ath11k_base { +@@ -921,7 +921,6 @@ struct ath11k_base { enum ath11k_dfs_region dfs_region; #ifdef CPTCFG_ATH11K_DEBUGFS struct dentry *debugfs_soc; diff --git a/package/kernel/mac80211/patches/ath11k/0029-wifi-ath11k-Add-support-to-configure-FTM-responder-r.patch b/package/kernel/mac80211/patches/ath11k/0029-wifi-ath11k-Add-support-to-configure-FTM-responder-r.patch new file mode 100644 index 0000000000..f652d689b5 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0029-wifi-ath11k-Add-support-to-configure-FTM-responder-r.patch @@ -0,0 +1,169 @@ +From a27c6a5853eb9d4f293b99be73a6891fe88263c7 Mon Sep 17 00:00:00 2001 +From: Sowmiya Sree Elavalagan <quic_ssreeela@quicinc.com> +Date: Tue, 10 Jan 2023 15:30:57 +0200 +Subject: [PATCH] wifi: ath11k: Add support to configure FTM responder role + +Fine Timing Measurement(FTM) support is used to measure round trip +time between two nodes. + +Enable FTM responder feature using hw_params on supported device. +Since FTM functionality is offloaded to firmware, adding the +interface allows user space to enable or disable FTM responder. +Also add support for advertising the same in extended capabilities. + +QCA6390, WCN6855 and WCN6750 do not support this feature. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 +Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Sowmiya Sree Elavalagan <quic_ssreeela@quicinc.com> +Signed-off-by: Raj Kumar Bhagat <quic_rajkbhag@quicinc.com> +Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> +Link: https://lore.kernel.org/r/20221220044435.10506-1-quic_rajkbhag@quicinc.com +--- + drivers/net/wireless/ath/ath11k/core.c | 8 ++++++++ + drivers/net/wireless/ath/ath11k/core.h | 1 + + drivers/net/wireless/ath/ath11k/hw.h | 1 + + drivers/net/wireless/ath/ath11k/mac.c | 20 +++++++++++++++++++- + drivers/net/wireless/ath/ath11k/wmi.h | 1 + + 5 files changed, 30 insertions(+), 1 deletion(-) + +--- a/drivers/net/wireless/ath/ath11k/core.c ++++ b/drivers/net/wireless/ath/ath11k/core.c +@@ -116,6 +116,7 @@ static const struct ath11k_hw_params ath + .tcl_ring_retry = true, + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, ++ .ftm_responder = true, + }, + { + .hw_rev = ATH11K_HW_IPQ6018_HW10, +@@ -198,6 +199,7 @@ static const struct ath11k_hw_params ath + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, + .support_fw_mac_sequence = false, ++ .ftm_responder = true, + }, + { + .name = "qca6390 hw2.0", +@@ -282,6 +284,7 @@ static const struct ath11k_hw_params ath + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, + .support_fw_mac_sequence = true, ++ .ftm_responder = false, + }, + { + .name = "qcn9074 hw1.0", +@@ -363,6 +366,7 @@ static const struct ath11k_hw_params ath + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, + .support_fw_mac_sequence = false, ++ .ftm_responder = true, + }, + { + .name = "wcn6855 hw2.0", +@@ -447,6 +451,7 @@ static const struct ath11k_hw_params ath + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, + .support_fw_mac_sequence = true, ++ .ftm_responder = false, + }, + { + .name = "wcn6855 hw2.1", +@@ -529,6 +534,7 @@ static const struct ath11k_hw_params ath + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, + .support_fw_mac_sequence = true, ++ .ftm_responder = false, + }, + { + .name = "wcn6750 hw1.0", +@@ -609,6 +615,7 @@ static const struct ath11k_hw_params ath + .tx_ring_size = DP_TCL_DATA_RING_SIZE_WCN6750, + .smp2p_wow_exit = true, + .support_fw_mac_sequence = true, ++ .ftm_responder = false, + }, + { + .hw_rev = ATH11K_HW_IPQ5018_HW10, +@@ -688,6 +695,7 @@ static const struct ath11k_hw_params ath + .tx_ring_size = DP_TCL_DATA_RING_SIZE, + .smp2p_wow_exit = false, + .support_fw_mac_sequence = false, ++ .ftm_responder = true, + }, + }; + +--- a/drivers/net/wireless/ath/ath11k/core.h ++++ b/drivers/net/wireless/ath/ath11k/core.h +@@ -346,6 +346,7 @@ struct ath11k_vif { + + bool is_started; + bool is_up; ++ bool ftm_responder; + bool spectral_enabled; + bool ps; + u32 aid; +--- a/drivers/net/wireless/ath/ath11k/hw.h ++++ b/drivers/net/wireless/ath/ath11k/hw.h +@@ -224,6 +224,7 @@ struct ath11k_hw_params { + u32 tx_ring_size; + bool smp2p_wow_exit; + bool support_fw_mac_sequence; ++ bool ftm_responder; + }; + + struct ath11k_hw_ops { +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -3110,7 +3110,7 @@ static void ath11k_mac_op_bss_info_chang + u16 bitrate; + int ret = 0; + u8 rateidx; +- u32 rate; ++ u32 rate, param; + u32 ipv4_cnt; + + mutex_lock(&ar->conf_mutex); +@@ -3412,6 +3412,20 @@ static void ath11k_mac_op_bss_info_chang + } + } + ++ if (changed & BSS_CHANGED_FTM_RESPONDER && ++ arvif->ftm_responder != info->ftm_responder && ++ ar->ab->hw_params.ftm_responder && ++ (vif->type == NL80211_IFTYPE_AP || ++ vif->type == NL80211_IFTYPE_MESH_POINT)) { ++ arvif->ftm_responder = info->ftm_responder; ++ param = WMI_VDEV_PARAM_ENABLE_DISABLE_RTT_RESPONDER_ROLE; ++ ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, ++ arvif->ftm_responder); ++ if (ret) ++ ath11k_warn(ar->ab, "Failed to set ftm responder %i: %d\n", ++ arvif->vdev_id, ret); ++ } ++ + if (changed & BSS_CHANGED_FILS_DISCOVERY || + changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP) + ath11k_mac_fils_discovery(arvif, info); +@@ -9113,6 +9127,10 @@ static int __ath11k_mac_register(struct + wiphy_ext_feature_set(ar->hw->wiphy, + NL80211_EXT_FEATURE_SET_SCAN_DWELL); + ++ if (ab->hw_params.ftm_responder) ++ wiphy_ext_feature_set(ar->hw->wiphy, ++ NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER); ++ + ath11k_reg_init(ar); + + if (!test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) { +--- a/drivers/net/wireless/ath/ath11k/wmi.h ++++ b/drivers/net/wireless/ath/ath11k/wmi.h +@@ -1073,6 +1073,7 @@ enum wmi_tlv_vdev_param { + WMI_VDEV_PARAM_ENABLE_BCAST_PROBE_RESPONSE, + WMI_VDEV_PARAM_FILS_MAX_CHANNEL_GUARD_TIME, + WMI_VDEV_PARAM_HE_LTF = 0x74, ++ WMI_VDEV_PARAM_ENABLE_DISABLE_RTT_RESPONDER_ROLE = 0x7d, + WMI_VDEV_PARAM_BA_MODE = 0x7e, + WMI_VDEV_PARAM_AUTORATE_MISC_CFG = 0x80, + WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE = 0x87, diff --git a/package/kernel/mac80211/patches/ath11k/0030-wifi-ath11k-add-channel-177-into-5-GHz-channel-list.patch b/package/kernel/mac80211/patches/ath11k/0030-wifi-ath11k-add-channel-177-into-5-GHz-channel-list.patch new file mode 100644 index 0000000000..d0ed9c54b8 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0030-wifi-ath11k-add-channel-177-into-5-GHz-channel-list.patch @@ -0,0 +1,41 @@ +From e5e94d10c85653609a2893c8d0ef24a27471b68f Mon Sep 17 00:00:00 2001 +From: Wen Gong <quic_wgong@quicinc.com> +Date: Tue, 10 Jan 2023 15:30:58 +0200 +Subject: [PATCH] wifi: ath11k: add channel 177 into 5 GHz channel list + +Add support for the 5 GHz channel 177 with center frequency 5885 MHz and +operating class 125 per IEEE Std 802.11ax-2021, Table E-4. + +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/20221220101912.30816-1-quic_wgong@quicinc.com +--- + drivers/net/wireless/ath/ath11k/core.h | 4 ++-- + drivers/net/wireless/ath/ath11k/mac.c | 1 + + 2 files changed, 3 insertions(+), 2 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/core.h ++++ b/drivers/net/wireless/ath/ath11k/core.h +@@ -521,8 +521,8 @@ struct ath11k_sta { + #define ATH11K_MIN_5G_FREQ 4150 + #define ATH11K_MIN_6G_FREQ 5925 + #define ATH11K_MAX_6G_FREQ 7115 +-#define ATH11K_NUM_CHANS 101 +-#define ATH11K_MAX_5G_CHAN 173 ++#define ATH11K_NUM_CHANS 102 ++#define ATH11K_MAX_5G_CHAN 177 + + enum ath11k_state { + ATH11K_STATE_OFF, +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -96,6 +96,7 @@ static const struct ieee80211_channel at + CHAN5G(165, 5825, 0), + CHAN5G(169, 5845, 0), + CHAN5G(173, 5865, 0), ++ CHAN5G(177, 5885, 0), + }; + + static const struct ieee80211_channel ath11k_6ghz_channels[] = { diff --git a/package/kernel/mac80211/patches/ath11k/0031-wifi-ath11k-fix-ce-memory-mapping-for-ahb-devices.patch b/package/kernel/mac80211/patches/ath11k/0031-wifi-ath11k-fix-ce-memory-mapping-for-ahb-devices.patch new file mode 100644 index 0000000000..2786799972 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0031-wifi-ath11k-fix-ce-memory-mapping-for-ahb-devices.patch @@ -0,0 +1,114 @@ +From 53a998c4d7284debd77734d01e1466e59a1d03b2 Mon Sep 17 00:00:00 2001 +From: Raj Kumar Bhagat <quic_rajkbhag@quicinc.com> +Date: Fri, 13 Jan 2023 12:02:09 +0530 +Subject: [PATCH] wifi: ath11k: fix ce memory mapping for ahb devices + +Currently ath11k_ahb module is not loaded successfully and the wifi +interface is not created. Kernel trace is seen while loading the +ath11k_ahb module. The issue is seen in all ath11k AHB devices except +in IPQ5018. + +This happens because in ath11k_ahb_probe(), ab->mem_ce is initialized +with the value of ab->mem. However, at this instant ab->mem is not +yet set. + +Later, during write to a particular memory via ath11k_ahb_write32() +this ab->mem_ce is used with particular offset. Since ab->mem_ce is +not set properly this possibly leads to memory conflict to handle +kernel paging request and the below trace is seen. + +[ 93.035047] Unable to handle kernel paging request at virtual address ffff800100a00000 +[ 93.035083] Mem abort info: +[ 93.041869] ESR = 0x0000000096000045 +[ 93.044561] EC = 0x25: DABT (current EL), IL = 32 bits +[ 93.048377] SET = 0, FnV = 0 +[ 93.053840] EA = 0, S1PTW = 0 +[ 93.056704] FSC = 0x05: level 1 translation fault +[ 93.059745] Data abort info: +[ 93.064603] ISV = 0, ISS = 0x00000045 +[ 93.067729] CM = 0, WnR = 1 +[ 93.071287] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000042219000 +[ 93.074409] [ffff800100a00000] pgd=100000007ffff003, p4d=100000007ffff003, pud=0000000000000000 +[ 93.081195] Internal error: Oops: 0000000096000045 [#1] PREEMPT SMP +[ 93.089598] Modules linked in: ath11k_ahb ath11k_pci ath11k qmi_helpers +[ 93.095851] CPU: 2 PID: 66 Comm: kworker/u8:3 Not tainted 6.1.0-rc8-wt-ath-658126-g58e4b9df840c-dirty #2 +[ 93.102454] Hardware name: Qualcomm Technologies, Inc. IPQ8074/AP-HK14 (DT) +[ 93.112171] Workqueue: ath11k_qmi_driver_event ath11k_qmi_driver_event_work [ath11k] +[ 93.118856] pstate: 40000005 (nZcv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) +[ 93.126838] pc : ath11k_ahb_write32+0xc/0x18 [ath11k_ahb] +[ 93.133520] lr : ath11k_hal_srng_setup+0x860/0x8f0 [ath11k] +[ 93.139075] sp : ffff80000aaebb70 +[ 93.144452] x29: ffff80000aaebb70 x28: 0000000000000020 x27: ffff80000aaebc50 +[ 93.147934] x26: ffff000004923750 x25: ffff000004921200 x24: ffff000004928000 +[ 93.155051] x23: 0000000000000020 x22: ffff000004930000 x21: ffff000004923200 +[ 93.162170] x20: ffff000004920000 x19: 00000000eea00000 x18: ffff0000049200f0 +[ 93.169288] x17: 0000000000000000 x16: 0000000000000000 x15: 000000000000025e +[ 93.176405] x14: ffff000003c414f0 x13: 0000000000000000 x12: 0000000000000008 +[ 93.183524] x11: ffff000003c41488 x10: 0000000000000040 x9 : 0000000000000000 +[ 93.190641] x8 : ffff80000a9dd100 x7 : 0000000000000000 x6 : 000000000000003f +[ 93.197759] x5 : ffff800100a00400 x4 : ffff8000031f4018 x3 : 0000000000000004 +[ 93.204877] x2 : 0000000047b62000 x1 : ffff800100a00000 x0 : ffff800012000000 +[ 93.211996] Call trace: +[ 93.219104] ath11k_ahb_write32+0xc/0x18 [ath11k_ahb] +[ 93.221366] ath11k_ce_init_ring+0x184/0x278 [ath11k] +[ 93.226576] ath11k_ce_init_pipes+0x4c/0x1a0 [ath11k] +[ 93.231610] ath11k_core_qmi_firmware_ready+0x3c/0x568 [ath11k] +[ 93.236646] ath11k_qmi_driver_event_work+0x168/0x4f8 [ath11k] +[ 93.242376] process_one_work+0x144/0x350 +[ 93.248275] worker_thread+0x120/0x430 +[ 93.252352] kthread+0xf4/0x110 +[ 93.255997] ret_from_fork+0x10/0x20 +[ 93.259043] Code: d503201f f94e1c00 8b214001 d50332bf (b9000022) +[ 93.262863] ---[ end trace 0000000000000000 ]--- + +However, for the device IPQ5018 ath11k_hw_params .ce_remap is +defined. This parameter is used to recalculate ab->mem_ce and hence, +this issue is not seen in IPQ5018. + +Hence, fix this by initializing ab->mem_ce after ab->mem is set. +ab->mem is set inside the ath11k_ahb_setup_resources() therefore +initialize ab->mem_ce after ath11k_ahb_setup_resources(). + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Fixes: b42b3678c91f ("wifi: ath11k: remap ce register space for IPQ5018") + +Signed-off-by: Raj Kumar Bhagat <quic_rajkbhag@quicinc.com> +Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> +Link: https://lore.kernel.org/r/20230113063209.7256-1-quic_rajkbhag@quicinc.com +--- + drivers/net/wireless/ath/ath11k/ahb.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/ahb.c ++++ b/drivers/net/wireless/ath/ath11k/ahb.c +@@ -1157,12 +1157,16 @@ static int ath11k_ahb_probe(struct platf + goto err_core_free; + } + +- ab->mem_ce = ab->mem; +- + ret = ath11k_core_pre_init(ab); + if (ret) + goto err_core_free; + ++ ret = ath11k_ahb_setup_resources(ab); ++ if (ret) ++ goto err_core_free; ++ ++ ab->mem_ce = ab->mem; ++ + if (ab->hw_params.ce_remap) { + const struct ce_remap *ce_remap = ab->hw_params.ce_remap; + /* ce register space is moved out of wcss unlike ipq8074 or ipq6018 +@@ -1177,10 +1181,6 @@ static int ath11k_ahb_probe(struct platf + } + } + +- ret = ath11k_ahb_setup_resources(ab); +- if (ret) +- goto err_core_free; +- + ret = ath11k_ahb_fw_resources_init(ab); + if (ret) + goto err_core_free; diff --git a/package/kernel/mac80211/patches/ath11k/0032-wifi-ath11k-Fix-memory-leak-in-ath11k_peer_rx_frag_s.patch b/package/kernel/mac80211/patches/ath11k/0032-wifi-ath11k-Fix-memory-leak-in-ath11k_peer_rx_frag_s.patch new file mode 100644 index 0000000000..40b0630af8 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0032-wifi-ath11k-Fix-memory-leak-in-ath11k_peer_rx_frag_s.patch @@ -0,0 +1,28 @@ +From ed3f83b3459a67a3ab9d806490ac304b567b1c2d Mon Sep 17 00:00:00 2001 +From: Miaoqian Lin <linmq006@gmail.com> +Date: Mon, 2 Jan 2023 12:11:42 +0400 +Subject: [PATCH] wifi: ath11k: Fix memory leak in ath11k_peer_rx_frag_setup + +crypto_alloc_shash() allocates resources, which should be released by +crypto_free_shash(). When ath11k_peer_find() fails, there has memory +leak. Add missing crypto_free_shash() to fix this. + +Fixes: 243874c64c81 ("ath11k: handle RX fragments") +Signed-off-by: Miaoqian Lin <linmq006@gmail.com> +Reviewed-by: Leon Romanovsky <leonro@nvidia.com> +Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> +Link: https://lore.kernel.org/r/20230102081142.3937570-1-linmq006@gmail.com +--- + drivers/net/wireless/ath/ath11k/dp_rx.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/net/wireless/ath/ath11k/dp_rx.c ++++ b/drivers/net/wireless/ath/ath11k/dp_rx.c +@@ -3126,6 +3126,7 @@ int ath11k_peer_rx_frag_setup(struct ath + if (!peer) { + ath11k_warn(ab, "failed to find the peer to set up fragment info\n"); + spin_unlock_bh(&ab->base_lock); ++ crypto_free_shash(tfm); + return -ENOENT; + } + diff --git a/package/kernel/mac80211/patches/ath11k/0033-wifi-ath11k-Set-ext-passive-scan-flag-to-adjust-pass.patch b/package/kernel/mac80211/patches/ath11k/0033-wifi-ath11k-Set-ext-passive-scan-flag-to-adjust-pass.patch new file mode 100644 index 0000000000..79b79e1053 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0033-wifi-ath11k-Set-ext-passive-scan-flag-to-adjust-pass.patch @@ -0,0 +1,73 @@ +From cf8f3d4deb02a8fdc806c46d4112b69868544697 Mon Sep 17 00:00:00 2001 +From: Tamizh Chelvam Raja <quic_tamizhr@quicinc.com> +Date: Wed, 15 Feb 2023 20:31:36 +0200 +Subject: [PATCH] wifi: ath11k: Set ext passive scan flag to adjust passive + scan start time + +Set the WMI_SCAN_FLAG_EXT_PASSIVE_SCAN_START_TIME_ENHANCE flag +while sending the scan command. If this flag is enabled when the +incoming scan request comes with a strict start time and its duration +overlaps with next TBTT, then target adjust the start time accordingly +for passive scan. Target supporting this feature will advertise +WMI_TLV_SERVICE_PASSIVE_SCAN_START_TIME_ENHANCE. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-01467-QCAHKSWPL_SILICONZ-1 + +Signed-off-by: Tamizh Chelvam Raja <quic_tamizhr@quicinc.com> +Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> +Link: https://lore.kernel.org/r/20221222131720.11368-1-quic_tamizhr@quicinc.com +--- + drivers/net/wireless/ath/ath11k/wmi.c | 8 ++++++++ + drivers/net/wireless/ath/ath11k/wmi.h | 3 +++ + 2 files changed, 11 insertions(+) + +--- a/drivers/net/wireless/ath/ath11k/wmi.c ++++ b/drivers/net/wireless/ath/ath11k/wmi.c +@@ -2068,6 +2068,12 @@ void ath11k_wmi_start_scan_init(struct a + WMI_SCAN_EVENT_FOREIGN_CHAN | + WMI_SCAN_EVENT_DEQUEUED; + arg->scan_flags |= WMI_SCAN_CHAN_STAT_EVENT; ++ ++ if (test_bit(WMI_TLV_SERVICE_PASSIVE_SCAN_START_TIME_ENHANCE, ++ ar->ab->wmi_ab.svc_map)) ++ arg->scan_ctrl_flags_ext |= ++ WMI_SCAN_FLAG_EXT_PASSIVE_SCAN_START_TIME_ENHANCE; ++ + arg->num_bssid = 1; + + /* fill bssid_list[0] with 0xff, otherwise bssid and RA will be +@@ -2149,6 +2155,8 @@ ath11k_wmi_copy_scan_event_cntrl_flags(s + /* for adaptive scan mode using 3 bits (21 - 23 bits) */ + WMI_SCAN_SET_DWELL_MODE(cmd->scan_ctrl_flags, + param->adaptive_dwell_time_mode); ++ ++ cmd->scan_ctrl_flags_ext = param->scan_ctrl_flags_ext; + } + + int ath11k_wmi_send_scan_start_cmd(struct ath11k *ar, +--- a/drivers/net/wireless/ath/ath11k/wmi.h ++++ b/drivers/net/wireless/ath/ath11k/wmi.h +@@ -2093,6 +2093,7 @@ enum wmi_tlv_service { + WMI_TLV_SERVICE_EXT2_MSG = 220, + WMI_TLV_SERVICE_PEER_POWER_SAVE_DURATION_SUPPORT = 246, + WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT = 249, ++ WMI_TLV_SERVICE_PASSIVE_SCAN_START_TIME_ENHANCE = 263, + + /* The second 128 bits */ + WMI_MAX_EXT_SERVICE = 256, +@@ -3223,6 +3224,7 @@ struct wmi_start_scan_cmd { + + #define WMI_SCAN_DWELL_MODE_MASK 0x00E00000 + #define WMI_SCAN_DWELL_MODE_SHIFT 21 ++#define WMI_SCAN_FLAG_EXT_PASSIVE_SCAN_START_TIME_ENHANCE 0x00000800 + + enum { + WMI_SCAN_DWELL_MODE_DEFAULT = 0, +@@ -3270,6 +3272,7 @@ struct scan_req_params { + }; + u32 scan_events; + }; ++ u32 scan_ctrl_flags_ext; + u32 dwell_time_active; + u32 dwell_time_active_2g; + u32 dwell_time_passive; diff --git a/package/kernel/mac80211/patches/ath11k/0034-wifi-ath11k-fix-return-value-check-in-ath11k_ahb_pro.patch b/package/kernel/mac80211/patches/ath11k/0034-wifi-ath11k-fix-return-value-check-in-ath11k_ahb_pro.patch new file mode 100644 index 0000000000..59132913bd --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0034-wifi-ath11k-fix-return-value-check-in-ath11k_ahb_pro.patch @@ -0,0 +1,27 @@ +From 342fcde9d91460f01f65707e16368a1571271a3a Mon Sep 17 00:00:00 2001 +From: Yang Yingliang <yangyingliang@huawei.com> +Date: Fri, 17 Feb 2023 11:00:31 +0800 +Subject: [PATCH] wifi: ath11k: fix return value check in ath11k_ahb_probe() + +ioremap() returns NULL pointer not PTR_ERR() when it fails, +so replace the IS_ERR() check with NULL pointer check. + +Fixes: b42b3678c91f ("wifi: ath11k: remap ce register space for IPQ5018") +Signed-off-by: Yang Yingliang <yangyingliang@huawei.com> +Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> +Link: https://lore.kernel.org/r/20230217030031.4021289-1-yangyingliang@huawei.com +--- + drivers/net/wireless/ath/ath11k/ahb.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/wireless/ath/ath11k/ahb.c ++++ b/drivers/net/wireless/ath/ath11k/ahb.c +@@ -1174,7 +1174,7 @@ static int ath11k_ahb_probe(struct platf + * to a new space for accessing them. + */ + ab->mem_ce = ioremap(ce_remap->base, ce_remap->size); +- if (IS_ERR(ab->mem_ce)) { ++ if (!ab->mem_ce) { + dev_err(&pdev->dev, "ce ioremap error\n"); + ret = -ENOMEM; + goto err_core_free; diff --git a/package/kernel/mac80211/patches/ath11k/0035-wifi-ath11k-Use-platform_get_irq-to-get-the-interrup.patch b/package/kernel/mac80211/patches/ath11k/0035-wifi-ath11k-Use-platform_get_irq-to-get-the-interrup.patch new file mode 100644 index 0000000000..93a9da8fc2 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0035-wifi-ath11k-Use-platform_get_irq-to-get-the-interrup.patch @@ -0,0 +1,50 @@ +From f117276638b7600b981b3fe28550823cfbe1ef23 Mon Sep 17 00:00:00 2001 +From: Douglas Anderson <dianders@chromium.org> +Date: Wed, 1 Feb 2023 08:54:42 -0800 +Subject: [PATCH] wifi: ath11k: Use platform_get_irq() to get the interrupt + +As of commit a1a2b7125e10 ("of/platform: Drop static setup of IRQ +resource from DT core"), we need to use platform_get_irq() instead of +platform_get_resource() to get our IRQs because +platform_get_resource() simply won't get them anymore. + +This was already fixed in several other Atheros WiFi drivers, +apparently in response to Zeal Robot reports. An example of another +fix is commit 9503a1fc123d ("ath9k: Use platform_get_irq() to get the +interrupt"). ath11k seems to have been missed in this effort, though. + +Without this change, WiFi wasn't coming up on my Qualcomm sc7280-based +hardware. Specifically, "platform_get_resource(pdev, IORESOURCE_IRQ, +i)" was failing even for i=0. + +Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-00887-QCAMSLSWPLZ-1 + +Fixes: a1a2b7125e10 ("of/platform: Drop static setup of IRQ resource from DT core") +Fixes: 00402f49d26f ("ath11k: Add support for WCN6750 device") +Signed-off-by: Douglas Anderson <dianders@chromium.org> +Tested-by: Jun Yu <junyuu@chromium.org> +Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com> +Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> +Link: https://lore.kernel.org/r/20230201084131.v2.1.I69cf3d56c97098287fe3a70084ee515098390b70@changeid +--- + drivers/net/wireless/ath/ath11k/ahb.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/ahb.c ++++ b/drivers/net/wireless/ath/ath11k/ahb.c +@@ -874,11 +874,11 @@ static int ath11k_ahb_setup_msi_resource + ab->pci.msi.ep_base_data = int_prop + 32; + + for (i = 0; i < ab->pci.msi.config->total_vectors; i++) { +- res = platform_get_resource(pdev, IORESOURCE_IRQ, i); +- if (!res) +- return -ENODEV; ++ ret = platform_get_irq(pdev, i); ++ if (ret < 0) ++ return ret; + +- ab->pci.msi.irqs[i] = res->start; ++ ab->pci.msi.irqs[i] = ret; + } + + set_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags); diff --git a/package/kernel/mac80211/patches/ath11k/0036-wifi-ath11k-fix-SAC-bug-on-peer-addition-with-sta-ba.patch b/package/kernel/mac80211/patches/ath11k/0036-wifi-ath11k-fix-SAC-bug-on-peer-addition-with-sta-ba.patch new file mode 100644 index 0000000000..b37f070ba6 --- /dev/null +++ b/package/kernel/mac80211/patches/ath11k/0036-wifi-ath11k-fix-SAC-bug-on-peer-addition-with-sta-ba.patch @@ -0,0 +1,53 @@ +From 60b7d62ba8cdbd073997bff0f1cdae8d844002c0 Mon Sep 17 00:00:00 2001 +From: Christian Marangi <ansuelsmth@gmail.com> +Date: Thu, 9 Feb 2023 23:26:22 +0100 +Subject: [PATCH] wifi: ath11k: fix SAC bug on peer addition with sta band + migration + +Fix sleep in atomic context warning detected by Smatch static checker +analyzer. + +Following the locking pattern for peer_rhash_add lock tbl_mtx_lock mutex +always even if sta is not transitioning to another band. +This is peer_add function and a more secure locking should not cause +performance regression. + +Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.5.0.1-01208-QCAHKSWPL_SILICONZ-1 + +Fixes: d673cb6fe6c0 ("wifi: ath11k: fix peer addition/deletion error on sta band migration") +Reported-by: Dan Carpenter <error27@gmail.com> +Signed-off-by: Christian Marangi <ansuelsmth@gmail.com> +Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> +Link: https://lore.kernel.org/r/20230209222622.1751-1-ansuelsmth@gmail.com +--- + drivers/net/wireless/ath/ath11k/peer.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/peer.c ++++ b/drivers/net/wireless/ath/ath11k/peer.c +@@ -382,22 +382,23 @@ int ath11k_peer_create(struct ath11k *ar + return -ENOBUFS; + } + ++ mutex_lock(&ar->ab->tbl_mtx_lock); + spin_lock_bh(&ar->ab->base_lock); + peer = ath11k_peer_find_by_addr(ar->ab, param->peer_addr); + if (peer) { + if (peer->vdev_id == param->vdev_id) { + spin_unlock_bh(&ar->ab->base_lock); ++ mutex_unlock(&ar->ab->tbl_mtx_lock); + return -EINVAL; + } + + /* Assume sta is transitioning to another band. + * Remove here the peer from rhash. + */ +- mutex_lock(&ar->ab->tbl_mtx_lock); + ath11k_peer_rhash_delete(ar->ab, peer); +- mutex_unlock(&ar->ab->tbl_mtx_lock); + } + spin_unlock_bh(&ar->ab->base_lock); ++ mutex_unlock(&ar->ab->tbl_mtx_lock); + + ret = ath11k_wmi_send_peer_create_cmd(ar, param); + if (ret) { diff --git a/package/kernel/mac80211/patches/ath11k/902-ath11k-Disable-coldboot-calibration-for-IPQ8074.patch b/package/kernel/mac80211/patches/ath11k/902-ath11k-Disable-coldboot-calibration-for-IPQ8074.patch index bf51c01cb2..01f2bb4848 100644 --- a/package/kernel/mac80211/patches/ath11k/902-ath11k-Disable-coldboot-calibration-for-IPQ8074.patch +++ b/package/kernel/mac80211/patches/ath11k/902-ath11k-Disable-coldboot-calibration-for-IPQ8074.patch @@ -13,7 +13,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com> --- a/drivers/net/wireless/ath/ath11k/core.c +++ b/drivers/net/wireless/ath/ath11k/core.c -@@ -81,7 +81,7 @@ static const struct ath11k_hw_params ath +@@ -82,7 +82,7 @@ static const struct ath11k_hw_params ath .supports_shadow_regs = false, .idle_ps = false, .supports_sta_ps = false, diff --git a/package/kernel/mac80211/patches/ath11k/903-ath11k-support-setting-FW-memory-mode-via-DT.patch b/package/kernel/mac80211/patches/ath11k/903-ath11k-support-setting-FW-memory-mode-via-DT.patch index c854de586a..87cbcbe315 100644 --- a/package/kernel/mac80211/patches/ath11k/903-ath11k-support-setting-FW-memory-mode-via-DT.patch +++ b/package/kernel/mac80211/patches/ath11k/903-ath11k-support-setting-FW-memory-mode-via-DT.patch @@ -31,7 +31,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com> { .hw_rev = ATH11K_HW_IPQ8074, .name = "ipq8074 hw2.0", -@@ -1826,7 +1826,8 @@ static void ath11k_core_reset(struct wor +@@ -1919,7 +1919,8 @@ static void ath11k_core_reset(struct wor static int ath11k_init_hw_params(struct ath11k_base *ab) { const struct ath11k_hw_params *hw_params = NULL; @@ -41,7 +41,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com> for (i = 0; i < ARRAY_SIZE(ath11k_hw_params); i++) { hw_params = &ath11k_hw_params[i]; -@@ -1842,7 +1843,30 @@ static int ath11k_init_hw_params(struct +@@ -1935,7 +1936,30 @@ static int ath11k_init_hw_params(struct ab->hw_params = *hw_params; |