The branch stable/15 has been updated by bz:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=c439ae17b1b8dce71e36df45738c8430ec0c7a4e

commit c439ae17b1b8dce71e36df45738c8430ec0c7a4e
Author:     Bjoern A. Zeeb <[email protected]>
AuthorDate: 2025-12-06 10:16:36 +0000
Commit:     Bjoern A. Zeeb <[email protected]>
CommitDate: 2025-12-15 18:09:20 +0000

    ath11k: update Atheros/QCA's ath11k driver
    
    This version is based on
    git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
    7d0a66e4bb9081d75c82ec4957c50034cb0ea449 ( tag: v6.18 ).
    
    Merge commit '989a88787ef2c1a73f44b82031a6f4f4470e2676'
    
    Sponsored by:   The FreeBSD Foundation
    
    (cherry picked from commit c95ea407b322379bcb3c013a2dca9a18072c1df8)
---
 sys/contrib/dev/athk/ath11k/Kconfig             |    3 +-
 sys/contrib/dev/athk/ath11k/Makefile            |    5 +-
 sys/contrib/dev/athk/ath11k/ahb.c               |  149 +-
 sys/contrib/dev/athk/ath11k/ce.c                |   19 +-
 sys/contrib/dev/athk/ath11k/ce.h                |    8 +-
 sys/contrib/dev/athk/ath11k/core.c              |  817 +++++++--
 sys/contrib/dev/athk/ath11k/core.h              |  132 +-
 sys/contrib/dev/athk/ath11k/coredump.c          |   54 +
 sys/contrib/dev/athk/ath11k/coredump.h          |   79 +
 sys/contrib/dev/athk/ath11k/dbring.c            |    4 +-
 sys/contrib/dev/athk/ath11k/dbring.h            |    1 +
 sys/contrib/dev/athk/ath11k/debug.c             |    3 +
 sys/contrib/dev/athk/ath11k/debug.h             |    2 +-
 sys/contrib/dev/athk/ath11k/debugfs.c           |  228 +--
 sys/contrib/dev/athk/ath11k/debugfs.h           |   21 +-
 sys/contrib/dev/athk/ath11k/debugfs_htt_stats.c |   17 +-
 sys/contrib/dev/athk/ath11k/debugfs_htt_stats.h |    2 +-
 sys/contrib/dev/athk/ath11k/debugfs_sta.c       |   42 +-
 sys/contrib/dev/athk/ath11k/debugfs_sta.h       |    1 +
 sys/contrib/dev/athk/ath11k/dp.c                |   42 +-
 sys/contrib/dev/athk/ath11k/dp.h                |   32 +-
 sys/contrib/dev/athk/ath11k/dp_rx.c             |  335 ++--
 sys/contrib/dev/athk/ath11k/dp_rx.h             |    3 +
 sys/contrib/dev/athk/ath11k/dp_tx.c             |   59 +-
 sys/contrib/dev/athk/ath11k/dp_tx.h             |    3 +-
 sys/contrib/dev/athk/ath11k/fw.c                |  171 ++
 sys/contrib/dev/athk/ath11k/fw.h                |   27 +
 sys/contrib/dev/athk/ath11k/hal.c               |   99 +-
 sys/contrib/dev/athk/ath11k/hal.h               |   14 +-
 sys/contrib/dev/athk/ath11k/hal_desc.h          |    1 +
 sys/contrib/dev/athk/ath11k/hal_rx.c            |   37 +-
 sys/contrib/dev/athk/ath11k/hal_rx.h            |   19 +-
 sys/contrib/dev/athk/ath11k/hal_tx.c            |    2 +-
 sys/contrib/dev/athk/ath11k/hal_tx.h            |    4 +-
 sys/contrib/dev/athk/ath11k/hif.h               |   68 +-
 sys/contrib/dev/athk/ath11k/htc.c               |    3 +-
 sys/contrib/dev/athk/ath11k/htc.h               |   18 +-
 sys/contrib/dev/athk/ath11k/hw.c                |    4 +-
 sys/contrib/dev/athk/ath11k/hw.h                |    6 +-
 sys/contrib/dev/athk/ath11k/mac.c               | 2038 ++++++++++++++++-------
 sys/contrib/dev/athk/ath11k/mac.h               |    6 +
 sys/contrib/dev/athk/ath11k/mhi.c               |  129 +-
 sys/contrib/dev/athk/ath11k/mhi.h               |    4 +-
 sys/contrib/dev/athk/ath11k/p2p.c               |  149 ++
 sys/contrib/dev/athk/ath11k/p2p.h               |   22 +
 sys/contrib/dev/athk/ath11k/pci.c               |  311 +++-
 sys/contrib/dev/athk/ath11k/pci.h               |    4 +-
 sys/contrib/dev/athk/ath11k/pcic.c              |   70 +-
 sys/contrib/dev/athk/ath11k/peer.c              |    4 +-
 sys/contrib/dev/athk/ath11k/peer.h              |    2 +-
 sys/contrib/dev/athk/ath11k/qmi.c               |  142 +-
 sys/contrib/dev/athk/ath11k/qmi.h               |   12 +-
 sys/contrib/dev/athk/ath11k/reg.c               |  398 ++++-
 sys/contrib/dev/athk/ath11k/reg.h               |   16 +-
 sys/contrib/dev/athk/ath11k/rx_desc.h           |    1 +
 sys/contrib/dev/athk/ath11k/spectral.c          |   32 +-
 sys/contrib/dev/athk/ath11k/spectral.h          |    1 +
 sys/contrib/dev/athk/ath11k/testmode.c          |   86 +-
 sys/contrib/dev/athk/ath11k/testmode_i.h        |   66 -
 sys/contrib/dev/athk/ath11k/thermal.c           |   28 +-
 sys/contrib/dev/athk/ath11k/thermal.h           |    9 +-
 sys/contrib/dev/athk/ath11k/trace.c             |    2 +
 sys/contrib/dev/athk/ath11k/trace.h             |   45 +-
 sys/contrib/dev/athk/ath11k/wmi.c               |  554 +++---
 sys/contrib/dev/athk/ath11k/wmi.h               |  299 ++--
 sys/contrib/dev/athk/ath11k/wow.c               |   45 +-
 sys/contrib/dev/athk/ath11k/wow.h               |    1 +
 67 files changed, 4897 insertions(+), 2113 deletions(-)

diff --git a/sys/contrib/dev/athk/ath11k/Kconfig 
b/sys/contrib/dev/athk/ath11k/Kconfig
index ad5cc6cac05b..659ef134ef16 100644
--- a/sys/contrib/dev/athk/ath11k/Kconfig
+++ b/sys/contrib/dev/athk/ath11k/Kconfig
@@ -2,7 +2,7 @@
 config ATH11K
        tristate "Qualcomm Technologies 802.11ax chipset support"
        depends on MAC80211 && HAS_DMA
-       depends on CRYPTO_MICHAEL_MIC
+       select CRYPTO_MICHAEL_MIC
        select ATH_COMMON
        select QCOM_QMI_HELPERS
        help
@@ -24,6 +24,7 @@ config ATH11K_PCI
        select MHI_BUS
        select QRTR
        select QRTR_MHI
+       select PCI_PWRCTRL_PWRSEQ if HAVE_PWRCTRL
        help
          This module adds support for PCIE bus
 
diff --git a/sys/contrib/dev/athk/ath11k/Makefile 
b/sys/contrib/dev/athk/ath11k/Makefile
index cc47e0114595..d9092414b362 100644
--- a/sys/contrib/dev/athk/ath11k/Makefile
+++ b/sys/contrib/dev/athk/ath11k/Makefile
@@ -17,7 +17,9 @@ ath11k-y += core.o \
            peer.o \
            dbring.o \
            hw.o \
-           pcic.o
+           pcic.o \
+           fw.o \
+           p2p.o
 
 ath11k-$(CONFIG_ATH11K_DEBUGFS) += debugfs.o debugfs_htt_stats.o debugfs_sta.o
 ath11k-$(CONFIG_NL80211_TESTMODE) += testmode.o
@@ -25,6 +27,7 @@ ath11k-$(CONFIG_ATH11K_TRACING) += trace.o
 ath11k-$(CONFIG_THERMAL) += thermal.o
 ath11k-$(CONFIG_ATH11K_SPECTRAL) += spectral.o
 ath11k-$(CONFIG_PM) += wow.o
+ath11k-$(CONFIG_DEV_COREDUMP) += coredump.o
 
 obj-$(CONFIG_ATH11K_AHB) += ath11k_ahb.o
 ath11k_ahb-y += ahb.o
diff --git a/sys/contrib/dev/athk/ath11k/ahb.c 
b/sys/contrib/dev/athk/ath11k/ahb.c
index ceb3ccbb1827..8dfe9b40c126 100644
--- a/sys/contrib/dev/athk/ath11k/ahb.c
+++ b/sys/contrib/dev/athk/ath11k/ahb.c
@@ -1,15 +1,16 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
- * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights 
reserved.
+ * Copyright (c) 2022-2025 Qualcomm Innovation Center, Inc. All rights 
reserved.
  */
 
 #include <linux/module.h>
 #include <linux/platform_device.h>
+#include <linux/property.h>
 #include <linux/of_device.h>
 #include <linux/of.h>
+#include <linux/of_reserved_mem.h>
 #include <linux/dma-mapping.h>
-#include <linux/of_address.h>
 #include <linux/iommu.h>
 #include "ahb.h"
 #include "debug.h"
@@ -396,7 +397,7 @@ static void ath11k_ahb_stop(struct ath11k_base *ab)
                ath11k_ahb_ce_irqs_disable(ab);
        ath11k_ahb_sync_ce_irqs(ab);
        ath11k_ahb_kill_tasklets(ab);
-       del_timer_sync(&ab->rx_replenish_retry);
+       timer_delete_sync(&ab->rx_replenish_retry);
        ath11k_ce_cleanup_pipes(ab);
 }
 
@@ -412,7 +413,7 @@ static int ath11k_ahb_power_up(struct ath11k_base *ab)
        return ret;
 }
 
-static void ath11k_ahb_power_down(struct ath11k_base *ab)
+static void ath11k_ahb_power_down(struct ath11k_base *ab, bool is_suspend)
 {
        struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab);
 
@@ -441,6 +442,7 @@ static void ath11k_ahb_free_ext_irq(struct ath11k_base *ab)
                        free_irq(ab->irq_num[irq_grp->irqs[j]], irq_grp);
 
                netif_napi_del(&irq_grp->napi);
+               free_netdev(irq_grp->napi_ndev);
        }
 }
 
@@ -532,8 +534,12 @@ static int ath11k_ahb_config_ext_irq(struct ath11k_base 
*ab)
 
                irq_grp->ab = ab;
                irq_grp->grp_id = i;
-               init_dummy_netdev(&irq_grp->napi_ndev);
-               netif_napi_add(&irq_grp->napi_ndev, &irq_grp->napi,
+
+               irq_grp->napi_ndev = alloc_netdev_dummy(0);
+               if (!irq_grp->napi_ndev)
+                       return -ENOMEM;
+
+               netif_napi_add(irq_grp->napi_ndev, &irq_grp->napi,
                               ath11k_ahb_ext_grp_napi_poll);
 
                for (j = 0; j < ATH11K_EXT_IRQ_NUM_MAX; j++) {
@@ -802,8 +808,8 @@ static int ath11k_core_get_rproc(struct ath11k_base *ab)
 
        prproc = rproc_get_by_phandle(rproc_phandle);
        if (!prproc) {
-               ath11k_err(ab, "failed to get rproc\n");
-               return -EINVAL;
+               ath11k_dbg(ab, ATH11K_DBG_AHB, "failed to get rproc, 
deferring\n");
+               return -EPROBE_DEFER;
        }
        ab_ahb->tgt_rproc = prproc;
 
@@ -913,16 +919,10 @@ static int ath11k_ahb_setup_msa_resources(struct 
ath11k_base *ab)
 {
        struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab);
        struct device *dev = ab->dev;
-       struct device_node *node;
        struct resource r;
        int ret;
 
-       node = of_parse_phandle(dev->of_node, "memory-region", 0);
-       if (!node)
-               return -ENOENT;
-
-       ret = of_address_to_resource(node, 0, &r);
-       of_node_put(node);
+       ret = of_reserved_mem_region_to_resource(dev->of_node, 0, &r);
        if (ret) {
                dev_err(dev, "failed to resolve msa fixed region\n");
                return ret;
@@ -931,12 +931,7 @@ static int ath11k_ahb_setup_msa_resources(struct 
ath11k_base *ab)
        ab_ahb->fw.msa_paddr = r.start;
        ab_ahb->fw.msa_size = resource_size(&r);
 
-       node = of_parse_phandle(dev->of_node, "memory-region", 1);
-       if (!node)
-               return -ENOENT;
-
-       ret = of_address_to_resource(node, 0, &r);
-       of_node_put(node);
+       ret = of_reserved_mem_region_to_resource(dev->of_node, 1, &r);
        if (ret) {
                dev_err(dev, "failed to resolve ce fixed region\n");
                return ret;
@@ -948,11 +943,41 @@ static int ath11k_ahb_setup_msa_resources(struct 
ath11k_base *ab)
        return 0;
 }
 
+static int ath11k_ahb_ce_remap(struct ath11k_base *ab)
+{
+       const struct ce_remap *ce_remap = ab->hw_params.ce_remap;
+       struct platform_device *pdev = ab->pdev;
+
+       if (!ce_remap) {
+               /* no separate CE register space */
+               ab->mem_ce = ab->mem;
+               return 0;
+       }
+
+       /* 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 (!ab->mem_ce) {
+               dev_err(&pdev->dev, "ce ioremap error\n");
+               return -ENOMEM;
+       }
+
+       return 0;
+}
+
+static void ath11k_ahb_ce_unmap(struct ath11k_base *ab)
+{
+       if (ab->hw_params.ce_remap)
+               iounmap(ab->mem_ce);
+}
+
 static int ath11k_ahb_fw_resources_init(struct ath11k_base *ab)
 {
        struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab);
        struct device *host_dev = ab->dev;
-       struct platform_device_info info = {0};
+       struct platform_device_info info = {};
        struct iommu_domain *iommu_dom;
        struct platform_device *pdev;
        struct device_node *node;
@@ -964,18 +989,18 @@ static int ath11k_ahb_fw_resources_init(struct 
ath11k_base *ab)
        if (!ab->hw_params.fixed_fw_mem)
                return 0;
 
-       ret = ath11k_ahb_setup_msa_resources(ab);
-       if (ret) {
-               ath11k_err(ab, "failed to setup msa resources\n");
-               return ret;
-       }
-
        node = of_get_child_by_name(host_dev->of_node, "wifi-firmware");
        if (!node) {
                ab_ahb->fw.use_tz = true;
                return 0;
        }
 
+       ret = ath11k_ahb_setup_msa_resources(ab);
+       if (ret) {
+               ath11k_err(ab, "failed to setup msa resources\n");
+               return ret;
+       }
+
        info.fwnode = &node->fwnode;
        info.parent = host_dev;
        info.name = node->name;
@@ -995,10 +1020,10 @@ static int ath11k_ahb_fw_resources_init(struct 
ath11k_base *ab)
 
        ab_ahb->fw.dev = &pdev->dev;
 
-       iommu_dom = iommu_domain_alloc(&platform_bus_type);
-       if (!iommu_dom) {
+       iommu_dom = iommu_paging_domain_alloc(ab_ahb->fw.dev);
+       if (IS_ERR(iommu_dom)) {
                ath11k_err(ab, "failed to allocate iommu domain\n");
-               ret = -ENOMEM;
+               ret = PTR_ERR(iommu_dom);
                goto err_unregister;
        }
 
@@ -1084,19 +1109,12 @@ static int ath11k_ahb_fw_resource_deinit(struct 
ath11k_base *ab)
 static int ath11k_ahb_probe(struct platform_device *pdev)
 {
        struct ath11k_base *ab;
-       const struct of_device_id *of_id;
        const struct ath11k_hif_ops *hif_ops;
        const struct ath11k_pci_ops *pci_ops;
        enum ath11k_hw_rev hw_rev;
        int ret;
 
-       of_id = of_match_device(ath11k_ahb_of_match, &pdev->dev);
-       if (!of_id) {
-               dev_err(&pdev->dev, "failed to find matching device tree id\n");
-               return -EINVAL;
-       }
-
-       hw_rev = (enum ath11k_hw_rev)of_id->data;
+       hw_rev = (uintptr_t)device_get_match_data(&pdev->dev);
 
        switch (hw_rev) {
        case ATH11K_HW_IPQ8074:
@@ -1147,25 +1165,13 @@ static int ath11k_ahb_probe(struct platform_device 
*pdev)
        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
-                * 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 (!ab->mem_ce) {
-                       dev_err(&pdev->dev, "ce ioremap error\n");
-                       ret = -ENOMEM;
-                       goto err_core_free;
-               }
-       }
+       ret = ath11k_ahb_ce_remap(ab);
+       if (ret)
+               goto err_core_free;
 
        ret = ath11k_ahb_fw_resources_init(ab);
        if (ret)
-               goto err_core_free;
+               goto err_ce_unmap;
 
        ret = ath11k_ahb_setup_smp2p_handle(ab);
        if (ret)
@@ -1217,6 +1223,9 @@ err_release_smp2p_handle:
 err_fw_deinit:
        ath11k_ahb_fw_resource_deinit(ab);
 
+err_ce_unmap:
+       ath11k_ahb_ce_unmap(ab);
+
 err_core_free:
        ath11k_core_free(ab);
        platform_set_drvdata(pdev, NULL);
@@ -1249,20 +1258,18 @@ static void ath11k_ahb_free_resources(struct 
ath11k_base *ab)
        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_ahb_ce_unmap(ab);
 
        ath11k_core_free(ab);
        platform_set_drvdata(pdev, NULL);
 }
 
-static int ath11k_ahb_remove(struct platform_device *pdev)
+static void ath11k_ahb_remove(struct platform_device *pdev)
 {
        struct ath11k_base *ab = platform_get_drvdata(pdev);
 
        if (test_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags)) {
-               ath11k_ahb_power_down(ab);
+               ath11k_ahb_power_down(ab, false);
                ath11k_debugfs_soc_destroy(ab);
                ath11k_qmi_deinit_service(ab);
                goto qmi_fail;
@@ -1272,9 +1279,8 @@ static int ath11k_ahb_remove(struct platform_device *pdev)
        ath11k_core_deinit(ab);
 
 qmi_fail:
+       ath11k_fw_destroy(ab);
        ath11k_ahb_free_resources(ab);
-
-       return 0;
 }
 
 static void ath11k_ahb_shutdown(struct platform_device *pdev)
@@ -1293,30 +1299,21 @@ static void ath11k_ahb_shutdown(struct platform_device 
*pdev)
        ath11k_core_deinit(ab);
 
 free_resources:
+       ath11k_fw_destroy(ab);
        ath11k_ahb_free_resources(ab);
 }
 
 static struct platform_driver ath11k_ahb_driver = {
-       .driver         = {
-               .name   = "ath11k",
+       .driver = {
+               .name = "ath11k",
                .of_match_table = ath11k_ahb_of_match,
        },
-       .probe  = ath11k_ahb_probe,
+       .probe = ath11k_ahb_probe,
        .remove = ath11k_ahb_remove,
        .shutdown = ath11k_ahb_shutdown,
 };
 
-static int ath11k_ahb_init(void)
-{
-       return platform_driver_register(&ath11k_ahb_driver);
-}
-module_init(ath11k_ahb_init);
-
-static void ath11k_ahb_exit(void)
-{
-       platform_driver_unregister(&ath11k_ahb_driver);
-}
-module_exit(ath11k_ahb_exit);
+module_platform_driver(ath11k_ahb_driver);
 
 MODULE_DESCRIPTION("Driver support for Qualcomm Technologies 802.11ax WLAN AHB 
devices");
 MODULE_LICENSE("Dual BSD/GPL");
diff --git a/sys/contrib/dev/athk/ath11k/ce.c b/sys/contrib/dev/athk/ath11k/ce.c
index c6a20a635016..1c1bf303ad77 100644
--- a/sys/contrib/dev/athk/ath11k/ce.c
+++ b/sys/contrib/dev/athk/ath11k/ce.c
@@ -1,9 +1,11 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021, Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights 
reserved.
+ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
  */
 
+#include <linux/export.h>
 #include "dp_rx.h"
 #include "debug.h"
 #include "hif.h"
@@ -352,7 +354,8 @@ static int ath11k_ce_rx_post_pipe(struct ath11k_ce_pipe 
*pipe)
                ret = ath11k_ce_rx_buf_enqueue_pipe(pipe, skb, paddr);
 
                if (ret) {
-                       ath11k_warn(ab, "failed to enqueue rx buf: %d\n", ret);
+                       ath11k_dbg(ab, ATH11K_DBG_CE, "failed to enqueue rx 
buf: %d\n",
+                                  ret);
                        dma_unmap_single(ab->dev, paddr,
                                         skb->len + skb_tailroom(skb),
                                         DMA_FROM_DEVICE);
@@ -394,10 +397,6 @@ static int ath11k_ce_completed_recv_next(struct 
ath11k_ce_pipe *pipe,
        }
 
        *nbytes = ath11k_hal_ce_dst_status_get_length(desc);
-       if (*nbytes == 0) {
-               ret = -EIO;
-               goto err;
-       }
 
        *skb = pipe->dest_ring->skb[sw_index];
        pipe->dest_ring->skb[sw_index] = NULL;
@@ -430,8 +429,8 @@ static void ath11k_ce_recv_process_cb(struct ath11k_ce_pipe 
*pipe)
                dma_unmap_single(ab->dev, ATH11K_SKB_RXCB(skb)->paddr,
                                 max_nbytes, DMA_FROM_DEVICE);
 
-               if (unlikely(max_nbytes < nbytes)) {
-                       ath11k_warn(ab, "rxed more than expected (nbytes %d, 
max %d)",
+               if (unlikely(max_nbytes < nbytes || nbytes == 0)) {
+                       ath11k_warn(ab, "unexpected rx length (nbytes %d, max 
%d)",
                                    nbytes, max_nbytes);
                        dev_kfree_skb_any(skb);
                        continue;
@@ -556,7 +555,7 @@ static int ath11k_ce_init_ring(struct ath11k_base *ab,
                               struct ath11k_ce_ring *ce_ring,
                               int ce_id, enum hal_ring_type type)
 {
-       struct hal_srng_params params = { 0 };
+       struct hal_srng_params params = {};
        int ret;
 
        params.ring_base_paddr = ce_ring->base_addr_ce_space;
@@ -908,7 +907,7 @@ EXPORT_SYMBOL(ath11k_ce_rx_post_buf);
 
 void ath11k_ce_rx_replenish_retry(struct timer_list *t)
 {
-       struct ath11k_base *ab = from_timer(ab, t, rx_replenish_retry);
+       struct ath11k_base *ab = timer_container_of(ab, t, rx_replenish_retry);
 
        ath11k_ce_rx_post_buf(ab);
 }
diff --git a/sys/contrib/dev/athk/ath11k/ce.h b/sys/contrib/dev/athk/ath11k/ce.h
index 1fc6360e7f01..bcde2fcf02cf 100644
--- a/sys/contrib/dev/athk/ath11k/ce.h
+++ b/sys/contrib/dev/athk/ath11k/ce.h
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022, 2024 Qualcomm Innovation Center, Inc. All rights 
reserved.
  */
 
 #ifndef ATH11K_CE_H
@@ -145,7 +146,7 @@ struct ath11k_ce_ring {
        /* Host address space */
        void *base_addr_owner_space_unaligned;
        /* CE address space */
-       u32 base_addr_ce_space_unaligned;
+       dma_addr_t base_addr_ce_space_unaligned;
 
        /* Actual start of descriptors.
         * Aligned to descriptor-size boundary.
@@ -155,7 +156,7 @@ struct ath11k_ce_ring {
        void *base_addr_owner_space;
 
        /* CE address space */
-       u32 base_addr_ce_space;
+       dma_addr_t base_addr_ce_space;
 
        /* HAL ring id */
        u32 hal_ring_id;
@@ -203,9 +204,6 @@ int ath11k_ce_alloc_pipes(struct ath11k_base *ab);
 void ath11k_ce_free_pipes(struct ath11k_base *ab);
 int ath11k_ce_get_attr_flags(struct ath11k_base *ab, int ce_id);
 void ath11k_ce_poll_send_completed(struct ath11k_base *ab, u8 pipe_id);
-int ath11k_ce_map_service_to_pipe(struct ath11k_base *ab, u16 service_id,
-                                 u8 *ul_pipe, u8 *dl_pipe);
-int ath11k_ce_attr_attach(struct ath11k_base *ab);
 void ath11k_ce_get_shadow_config(struct ath11k_base *ab,
                                 u32 **shadow_cfg, u32 *shadow_cfg_len);
 void ath11k_ce_stop_shadow_timers(struct ath11k_base *ab);
diff --git a/sys/contrib/dev/athk/ath11k/core.c 
b/sys/contrib/dev/athk/ath11k/core.c
index 74585169a215..cda61c23fb68 100644
--- a/sys/contrib/dev/athk/ath11k/core.c
+++ b/sys/contrib/dev/athk/ath11k/core.c
@@ -1,13 +1,15 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights 
reserved.
+ * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights 
reserved.
+ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
  */
 
 #if defined(__FreeBSD__)
 #define        LINUXKPI_PARAM_PREFIX   ath11k_core_
 #endif
 
+#include <linux/export.h>
 #include <linux/module.h>
 #include <linux/slab.h>
 #include <linux/remoteproc.h>
@@ -25,6 +27,7 @@
 #include "debug.h"
 #include "hif.h"
 #include "wow.h"
+#include "fw.h"
 
 unsigned int ath11k_debug_mask;
 EXPORT_SYMBOL(ath11k_debug_mask);
@@ -70,7 +73,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074,
                .single_pdev_only = false,
                .rxdma1_enable = true,
-               .num_rxmda_per_pdev = 1,
+               .num_rxdma_per_pdev = 1,
                .rx_mac_buf_ring = false,
                .vdev_start_delay = false,
                .htt_peer_map_v2 = true,
@@ -130,6 +133,8 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                .tcl_ring_retry = true,
                .tx_ring_size = DP_TCL_DATA_RING_SIZE,
                .smp2p_wow_exit = false,
+               .support_dual_stations = false,
+               .pdev_suspend = false,
        },
        {
                .hw_rev = ATH11K_HW_IPQ6018_HW10,
@@ -155,7 +160,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074,
                .single_pdev_only = false,
                .rxdma1_enable = true,
-               .num_rxmda_per_pdev = 1,
+               .num_rxdma_per_pdev = 1,
                .rx_mac_buf_ring = false,
                .vdev_start_delay = false,
                .htt_peer_map_v2 = true,
@@ -213,6 +218,8 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                .tx_ring_size = DP_TCL_DATA_RING_SIZE,
                .smp2p_wow_exit = false,
                .support_fw_mac_sequence = false,
+               .support_dual_stations = false,
+               .pdev_suspend = false,
        },
        {
                .name = "qca6390 hw2.0",
@@ -238,7 +245,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074,
                .single_pdev_only = true,
                .rxdma1_enable = false,
-               .num_rxmda_per_pdev = 2,
+               .num_rxdma_per_pdev = 2,
                .rx_mac_buf_ring = true,
                .vdev_start_delay = true,
                .htt_peer_map_v2 = false,
@@ -253,7 +260,10 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                },
 
                .interface_modes = BIT(NL80211_IFTYPE_STATION) |
-                                       BIT(NL80211_IFTYPE_AP),
+                                       BIT(NL80211_IFTYPE_AP) |
+                                       BIT(NL80211_IFTYPE_P2P_DEVICE) |
+                                       BIT(NL80211_IFTYPE_P2P_CLIENT) |
+                                       BIT(NL80211_IFTYPE_P2P_GO),
                .supports_monitor = false,
                .full_monitor_mode = false,
                .supports_shadow_regs = true,
@@ -263,7 +273,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                .coldboot_cal_ftm = false,
                .cbcal_restart_fw = false,
                .fw_mem_mode = 0,
-               .num_vdevs = 16 + 1,
+               .num_vdevs = 2 + 1,
                .num_peers = 512,
                .supports_suspend = true,
                .hal_desc_sz = sizeof(struct hal_rx_desc_ipq8074),
@@ -298,6 +308,8 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                .tx_ring_size = DP_TCL_DATA_RING_SIZE,
                .smp2p_wow_exit = false,
                .support_fw_mac_sequence = true,
+               .support_dual_stations = true,
+               .pdev_suspend = false,
        },
        {
                .name = "qcn9074 hw1.0",
@@ -322,7 +334,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                .svc_to_ce_map_len = 18,
                .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074,
                .rxdma1_enable = true,
-               .num_rxmda_per_pdev = 1,
+               .num_rxdma_per_pdev = 1,
                .rx_mac_buf_ring = false,
                .vdev_start_delay = false,
                .htt_peer_map_v2 = true,
@@ -380,6 +392,8 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                .tx_ring_size = DP_TCL_DATA_RING_SIZE,
                .smp2p_wow_exit = false,
                .support_fw_mac_sequence = false,
+               .support_dual_stations = false,
+               .pdev_suspend = false,
        },
        {
                .name = "wcn6855 hw2.0",
@@ -405,7 +419,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074,
                .single_pdev_only = true,
                .rxdma1_enable = false,
-               .num_rxmda_per_pdev = 2,
+               .num_rxdma_per_pdev = 2,
                .rx_mac_buf_ring = true,
                .vdev_start_delay = true,
                .htt_peer_map_v2 = false,
@@ -420,7 +434,10 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                },
 
                .interface_modes = BIT(NL80211_IFTYPE_STATION) |
-                                       BIT(NL80211_IFTYPE_AP),
+                                       BIT(NL80211_IFTYPE_AP) |
+                                       BIT(NL80211_IFTYPE_P2P_DEVICE) |
+                                       BIT(NL80211_IFTYPE_P2P_CLIENT) |
+                                       BIT(NL80211_IFTYPE_P2P_GO),
                .supports_monitor = false,
                .full_monitor_mode = false,
                .supports_shadow_regs = true,
@@ -430,7 +447,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                .coldboot_cal_ftm = false,
                .cbcal_restart_fw = false,
                .fw_mem_mode = 0,
-               .num_vdevs = 16 + 1,
+               .num_vdevs = 2 + 1,
                .num_peers = 512,
                .supports_suspend = true,
                .hal_desc_sz = sizeof(struct hal_rx_desc_wcn6855),
@@ -465,6 +482,8 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                .tx_ring_size = DP_TCL_DATA_RING_SIZE,
                .smp2p_wow_exit = false,
                .support_fw_mac_sequence = true,
+               .support_dual_stations = true,
+               .pdev_suspend = false,
        },
        {
                .name = "wcn6855 hw2.1",
@@ -489,7 +508,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                .svc_to_ce_map_len = 14,
                .single_pdev_only = true,
                .rxdma1_enable = false,
-               .num_rxmda_per_pdev = 2,
+               .num_rxdma_per_pdev = 2,
                .rx_mac_buf_ring = true,
                .vdev_start_delay = true,
                .htt_peer_map_v2 = false,
@@ -504,7 +523,10 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                },
 
                .interface_modes = BIT(NL80211_IFTYPE_STATION) |
-                                       BIT(NL80211_IFTYPE_AP),
+                                       BIT(NL80211_IFTYPE_AP) |
+                                       BIT(NL80211_IFTYPE_P2P_DEVICE) |
+                                       BIT(NL80211_IFTYPE_P2P_CLIENT) |
+                                       BIT(NL80211_IFTYPE_P2P_GO),
                .supports_monitor = false,
                .supports_shadow_regs = true,
                .idle_ps = true,
@@ -513,7 +535,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                .coldboot_cal_ftm = false,
                .cbcal_restart_fw = false,
                .fw_mem_mode = 0,
-               .num_vdevs = 16 + 1,
+               .num_vdevs = 2 + 1,
                .num_peers = 512,
                .supports_suspend = true,
                .hal_desc_sz = sizeof(struct hal_rx_desc_wcn6855),
@@ -548,6 +570,8 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                .tx_ring_size = DP_TCL_DATA_RING_SIZE,
                .smp2p_wow_exit = false,
                .support_fw_mac_sequence = true,
+               .support_dual_stations = true,
+               .pdev_suspend = false,
        },
        {
                .name = "wcn6750 hw1.0",
@@ -573,7 +597,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074,
                .single_pdev_only = true,
                .rxdma1_enable = false,
-               .num_rxmda_per_pdev = 1,
+               .num_rxdma_per_pdev = 1,
                .rx_mac_buf_ring = true,
                .vdev_start_delay = true,
                .htt_peer_map_v2 = false,
@@ -597,7 +621,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                .coldboot_cal_ftm = true,
                .cbcal_restart_fw = false,
                .fw_mem_mode = 0,
-               .num_vdevs = 16 + 1,
+               .num_vdevs = 3,
                .num_peers = 512,
                .supports_suspend = false,
                .hal_desc_sz = sizeof(struct hal_rx_desc_qcn9074),
@@ -609,7 +633,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                .supports_dynamic_smps_6ghz = false,
                .alloc_cacheable_memory = false,
                .supports_rssi_stats = true,
-               .fw_wmi_diag_event = false,
+               .fw_wmi_diag_event = true,
                .current_cc_support = true,
                .dbr_debug_support = false,
                .global_reset = false,
@@ -629,6 +653,8 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                .tx_ring_size = DP_TCL_DATA_RING_SIZE_WCN6750,
                .smp2p_wow_exit = true,
                .support_fw_mac_sequence = true,
+               .support_dual_stations = false,
+               .pdev_suspend = true,
        },
        {
                .hw_rev = ATH11K_HW_IPQ5018_HW10,
@@ -665,7 +691,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                .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,
+               .num_rxdma_per_pdev = RXDMA_PER_PDEV_5018,
                .rx_mac_buf_ring = false,
                .vdev_start_delay = false,
                .htt_peer_map_v2 = true,
@@ -710,15 +736,275 @@ static const struct ath11k_hw_params ath11k_hw_params[] 
= {
                .tx_ring_size = DP_TCL_DATA_RING_SIZE,
                .smp2p_wow_exit = false,
                .support_fw_mac_sequence = false,
+               .support_dual_stations = false,
+               .pdev_suspend = false,
        },
-};
+       {
+               .name = "qca2066 hw2.1",
+               .hw_rev = ATH11K_HW_QCA2066_HW21,
+               .fw = {
+                       .dir = "QCA2066/hw2.1",
+                       .board_size = 256 * 1024,
+                       .cal_offset = 128 * 1024,
+               },
+               .max_radios = 3,
+               .bdf_addr = 0x4B0C0000,
+               .hw_ops = &wcn6855_ops,
+               .ring_mask = &ath11k_hw_ring_mask_qca6390,
+               .internal_sleep_clock = true,
+               .regs = &wcn6855_regs,
+               .qmi_service_ins_id = 
ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_QCA6390,
+               .host_ce_config = ath11k_host_ce_config_qca6390,
+               .ce_count = 9,
+               .target_ce_config = ath11k_target_ce_config_wlan_qca6390,
+               .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_rxdma_per_pdev = 2,
+               .rx_mac_buf_ring = true,
+               .vdev_start_delay = true,
+               .htt_peer_map_v2 = false,
 
-static inline struct ath11k_pdev *ath11k_core_get_single_pdev(struct 
ath11k_base *ab)
-{
-       WARN_ON(!ab->hw_params.single_pdev_only);
+               .spectral = {
+                       .fft_sz = 0,
+                       .fft_pad_sz = 0,
+                       .summary_pad_sz = 0,
+                       .fft_hdr_len = 0,
+                       .max_fft_bins = 0,
+                       .fragment_160mhz = false,
+               },
 
-       return &ab->pdevs[0];
-}
+               .interface_modes = BIT(NL80211_IFTYPE_STATION) |
+                                       BIT(NL80211_IFTYPE_AP) |
+                                       BIT(NL80211_IFTYPE_P2P_DEVICE) |
+                                       BIT(NL80211_IFTYPE_P2P_CLIENT) |
+                                       BIT(NL80211_IFTYPE_P2P_GO),
+               .supports_monitor = false,
+               .full_monitor_mode = false,
+               .supports_shadow_regs = true,
+               .idle_ps = true,
+               .supports_sta_ps = true,
+               .coldboot_cal_mm = false,
+               .coldboot_cal_ftm = false,
+               .cbcal_restart_fw = false,
+               .fw_mem_mode = 0,
+               .num_vdevs = 2 + 1,
+               .num_peers = 512,
+               .supports_suspend = true,
+               .hal_desc_sz = sizeof(struct hal_rx_desc_wcn6855),
+               .supports_regdb = true,
+               .fix_l1ss = false,
+               .credit_flow = true,
+               .max_tx_ring = DP_TCL_NUM_RING_MAX_QCA6390,
+               .hal_params = &ath11k_hw_hal_params_qca6390,
+               .supports_dynamic_smps_6ghz = false,
+               .alloc_cacheable_memory = false,
+               .supports_rssi_stats = true,
+               .fw_wmi_diag_event = true,
+               .current_cc_support = true,
+               .dbr_debug_support = false,
+               .global_reset = true,
+               .bios_sar_capa = &ath11k_hw_sar_capa_wcn6855,
+               .m3_fw_support = true,
+               .fixed_bdf_addr = false,
+               .fixed_mem_region = false,
+               .static_window_map = false,
+               .hybrid_bus_type = false,
+               .fixed_fw_mem = false,
+               .support_off_channel_tx = true,
+               .supports_multi_bssid = true,
+
+               .sram_dump = {
+                       .start = 0x01400000,
+                       .end = 0x0177ffff,
+               },
+
+               .tcl_ring_retry = true,
+               .tx_ring_size = DP_TCL_DATA_RING_SIZE,
+               .smp2p_wow_exit = false,
+               .support_fw_mac_sequence = true,
+               .support_dual_stations = true,
+       },
+       {
+               .name = "qca6698aq hw2.1",
+               .hw_rev = ATH11K_HW_QCA6698AQ_HW21,
+               .fw = {
+                       .dir = "QCA6698AQ/hw2.1",
+                       .board_size = 256 * 1024,
+                       .cal_offset = 128 * 1024,
+               },
+               .max_radios = 3,
+               .bdf_addr = 0x4B0C0000,
+               .hw_ops = &wcn6855_ops,
+               .ring_mask = &ath11k_hw_ring_mask_qca6390,
+               .internal_sleep_clock = true,
+               .regs = &wcn6855_regs,
+               .qmi_service_ins_id = 
ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_QCA6390,
+               .host_ce_config = ath11k_host_ce_config_qca6390,
+               .ce_count = 9,
+               .target_ce_config = ath11k_target_ce_config_wlan_qca6390,
+               .target_ce_count = 9,
+               .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_qca6390,
+               .svc_to_ce_map_len = 14,
+               .single_pdev_only = true,
+               .rxdma1_enable = false,
+               .num_rxdma_per_pdev = 2,
+               .rx_mac_buf_ring = true,
+               .vdev_start_delay = true,
+               .htt_peer_map_v2 = false,
+
+               .spectral = {
+                       .fft_sz = 0,
+                       .fft_pad_sz = 0,
+                       .summary_pad_sz = 0,
+                       .fft_hdr_len = 0,
+                       .max_fft_bins = 0,
+                       .fragment_160mhz = false,
+               },
+
+               .interface_modes = BIT(NL80211_IFTYPE_STATION) |
+                                       BIT(NL80211_IFTYPE_AP) |
+                                       BIT(NL80211_IFTYPE_P2P_DEVICE) |
+                                       BIT(NL80211_IFTYPE_P2P_CLIENT) |
+                                       BIT(NL80211_IFTYPE_P2P_GO),
+               .supports_monitor = false,
+               .supports_shadow_regs = true,
+               .idle_ps = true,
+               .supports_sta_ps = true,
+               .coldboot_cal_mm = false,
+               .coldboot_cal_ftm = false,
+               .cbcal_restart_fw = false,
+               .fw_mem_mode = 0,
+               .num_vdevs = 2 + 1,
+               .num_peers = 512,
+               .supports_suspend = true,
+               .hal_desc_sz = sizeof(struct hal_rx_desc_wcn6855),
+               .supports_regdb = true,
+               .fix_l1ss = false,
+               .credit_flow = true,
+               .max_tx_ring = DP_TCL_NUM_RING_MAX_QCA6390,
+               .hal_params = &ath11k_hw_hal_params_qca6390,
+               .supports_dynamic_smps_6ghz = false,
+               .alloc_cacheable_memory = false,
+               .supports_rssi_stats = true,
+               .fw_wmi_diag_event = true,
+               .current_cc_support = true,
+               .dbr_debug_support = false,
+               .global_reset = true,
+               .bios_sar_capa = &ath11k_hw_sar_capa_wcn6855,
+               .m3_fw_support = true,
+               .fixed_bdf_addr = false,
+               .fixed_mem_region = false,
+               .static_window_map = false,
+               .hybrid_bus_type = false,
+               .fixed_fw_mem = false,
+               .support_off_channel_tx = true,
+               .supports_multi_bssid = true,
+
+               .sram_dump = {
*** 12223 LINES SKIPPED ***

Reply via email to