Merge ath-next from git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
ath.git patches for v5.19. Major changes: ath11k * support setting Specific Absorption Rate (SAR) for WCN6855 * read country code from SMBIOS for WCN6855/QCA6390 * support for WCN6750
This commit is contained in:
commit
f39af96d35
@ -20,10 +20,70 @@ properties:
|
|||||||
enum:
|
enum:
|
||||||
- qcom,ipq8074-wifi
|
- qcom,ipq8074-wifi
|
||||||
- qcom,ipq6018-wifi
|
- qcom,ipq6018-wifi
|
||||||
|
- qcom,wcn6750-wifi
|
||||||
|
|
||||||
reg:
|
reg:
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
minItems: 32
|
||||||
|
maxItems: 52
|
||||||
|
|
||||||
|
interrupt-names:
|
||||||
|
maxItems: 52
|
||||||
|
|
||||||
|
qcom,rproc:
|
||||||
|
$ref: /schemas/types.yaml#/definitions/phandle
|
||||||
|
description:
|
||||||
|
DT entry of q6v5-wcss remoteproc driver.
|
||||||
|
Phandle to a node that can contain the following properties
|
||||||
|
* compatible
|
||||||
|
* reg
|
||||||
|
* reg-names
|
||||||
|
|
||||||
|
qcom,ath11k-calibration-variant:
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
description:
|
||||||
|
string to uniquely identify variant of the calibration data in the
|
||||||
|
board-2.bin for designs with colliding bus and device specific ids
|
||||||
|
|
||||||
|
memory-region:
|
||||||
|
minItems: 1
|
||||||
|
maxItems: 2
|
||||||
|
description:
|
||||||
|
phandle to a node describing reserved memory (System RAM memory)
|
||||||
|
used by ath11k firmware (see bindings/reserved-memory/reserved-memory.txt)
|
||||||
|
|
||||||
|
iommus:
|
||||||
|
minItems: 1
|
||||||
|
maxItems: 2
|
||||||
|
|
||||||
|
wifi-firmware:
|
||||||
|
type: object
|
||||||
|
description: |
|
||||||
|
WCN6750 wifi node can contain one optional firmware subnode.
|
||||||
|
Firmware subnode is needed when the platform does not have Trustzone.
|
||||||
|
required:
|
||||||
|
- iommus
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- interrupts
|
||||||
|
- qcom,rproc
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
allOf:
|
||||||
|
- if:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
contains:
|
||||||
|
enum:
|
||||||
|
- qcom,ipq8074-wifi
|
||||||
|
- qcom,ipq6018-wifi
|
||||||
|
then:
|
||||||
|
properties:
|
||||||
interrupts:
|
interrupts:
|
||||||
items:
|
items:
|
||||||
- description: misc-pulse1 interrupt events
|
- description: misc-pulse1 interrupt events
|
||||||
@ -78,8 +138,6 @@ properties:
|
|||||||
- description: interrupt event for ring wbm2host-tx-completions-ring2
|
- description: interrupt event for ring wbm2host-tx-completions-ring2
|
||||||
- description: interrupt event for ring wbm2host-tx-completions-ring1
|
- description: interrupt event for ring wbm2host-tx-completions-ring1
|
||||||
- description: interrupt event for ring tcl2host-status-ring
|
- description: interrupt event for ring tcl2host-status-ring
|
||||||
|
|
||||||
|
|
||||||
interrupt-names:
|
interrupt-names:
|
||||||
items:
|
items:
|
||||||
- const: misc-pulse1
|
- const: misc-pulse1
|
||||||
@ -135,35 +193,59 @@ properties:
|
|||||||
- const: wbm2host-tx-completions-ring1
|
- const: wbm2host-tx-completions-ring1
|
||||||
- const: tcl2host-status-ring
|
- const: tcl2host-status-ring
|
||||||
|
|
||||||
qcom,rproc:
|
- if:
|
||||||
$ref: /schemas/types.yaml#/definitions/phandle
|
properties:
|
||||||
description:
|
compatible:
|
||||||
DT entry of q6v5-wcss remoteproc driver.
|
contains:
|
||||||
Phandle to a node that can contain the following properties
|
enum:
|
||||||
* compatible
|
- qcom,ipq8074-wifi
|
||||||
* reg
|
- qcom,ipq6018-wifi
|
||||||
* reg-names
|
then:
|
||||||
|
|
||||||
qcom,ath11k-calibration-variant:
|
|
||||||
$ref: /schemas/types.yaml#/definitions/string
|
|
||||||
description:
|
|
||||||
string to uniquely identify variant of the calibration data in the
|
|
||||||
board-2.bin for designs with colliding bus and device specific ids
|
|
||||||
|
|
||||||
memory-region:
|
|
||||||
maxItems: 1
|
|
||||||
description:
|
|
||||||
phandle to a node describing reserved memory (System RAM memory)
|
|
||||||
used by ath11k firmware (see bindings/reserved-memory/reserved-memory.txt)
|
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- compatible
|
|
||||||
- reg
|
|
||||||
- interrupts
|
|
||||||
- interrupt-names
|
- interrupt-names
|
||||||
- qcom,rproc
|
|
||||||
|
|
||||||
additionalProperties: false
|
- if:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
contains:
|
||||||
|
enum:
|
||||||
|
- qcom,wcn6750-wifi
|
||||||
|
then:
|
||||||
|
properties:
|
||||||
|
interrupts:
|
||||||
|
items:
|
||||||
|
- description: interrupt event for ring CE1
|
||||||
|
- description: interrupt event for ring CE2
|
||||||
|
- description: interrupt event for ring CE3
|
||||||
|
- description: interrupt event for ring CE4
|
||||||
|
- description: interrupt event for ring CE5
|
||||||
|
- description: interrupt event for ring CE6
|
||||||
|
- description: interrupt event for ring CE7
|
||||||
|
- description: interrupt event for ring CE8
|
||||||
|
- description: interrupt event for ring CE9
|
||||||
|
- description: interrupt event for ring CE10
|
||||||
|
- description: interrupt event for ring DP1
|
||||||
|
- description: interrupt event for ring DP2
|
||||||
|
- description: interrupt event for ring DP3
|
||||||
|
- description: interrupt event for ring DP4
|
||||||
|
- description: interrupt event for ring DP5
|
||||||
|
- description: interrupt event for ring DP6
|
||||||
|
- description: interrupt event for ring DP7
|
||||||
|
- description: interrupt event for ring DP8
|
||||||
|
- description: interrupt event for ring DP9
|
||||||
|
- description: interrupt event for ring DP10
|
||||||
|
- description: interrupt event for ring DP11
|
||||||
|
- description: interrupt event for ring DP12
|
||||||
|
- description: interrupt event for ring DP13
|
||||||
|
- description: interrupt event for ring DP14
|
||||||
|
- description: interrupt event for ring DP15
|
||||||
|
- description: interrupt event for ring DP16
|
||||||
|
- description: interrupt event for ring DP17
|
||||||
|
- description: interrupt event for ring DP18
|
||||||
|
- description: interrupt event for ring DP19
|
||||||
|
- description: interrupt event for ring DP20
|
||||||
|
- description: interrupt event for ring DP21
|
||||||
|
- description: interrupt event for ring DP22
|
||||||
|
|
||||||
examples:
|
examples:
|
||||||
- |
|
- |
|
||||||
@ -309,3 +391,64 @@ examples:
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
|
||||||
|
reserved-memory {
|
||||||
|
#address-cells = <2>;
|
||||||
|
#size-cells = <2>;
|
||||||
|
|
||||||
|
wlan_ce_mem: memory@4cd000 {
|
||||||
|
no-map;
|
||||||
|
reg = <0x0 0x004cd000 0x0 0x1000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
wlan_fw_mem: memory@80c00000 {
|
||||||
|
no-map;
|
||||||
|
reg = <0x0 0x80c00000 0x0 0xc00000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
wifi: wifi@17a10040 {
|
||||||
|
compatible = "qcom,wcn6750-wifi";
|
||||||
|
reg = <0x17a10040 0x0>;
|
||||||
|
iommus = <&apps_smmu 0x1c00 0x1>;
|
||||||
|
interrupts = <GIC_SPI 768 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 769 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 770 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 771 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 772 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 773 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 774 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 775 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 776 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 777 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 778 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 779 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 780 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 781 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 782 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 783 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 784 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 785 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 786 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 787 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 788 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 789 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 790 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 791 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 792 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 793 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 794 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 795 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 796 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 797 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 798 IRQ_TYPE_EDGE_RISING>,
|
||||||
|
<GIC_SPI 799 IRQ_TYPE_EDGE_RISING>;
|
||||||
|
qcom,rproc = <&remoteproc_wpss>;
|
||||||
|
memory-region = <&wlan_fw_mem>, <&wlan_ce_mem>;
|
||||||
|
wifi-firmware {
|
||||||
|
iommus = <&apps_smmu 0x1c02 0x1>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
@ -59,9 +59,6 @@
|
|||||||
#define ATH10K_KEEPALIVE_MAX_IDLE 3895
|
#define ATH10K_KEEPALIVE_MAX_IDLE 3895
|
||||||
#define ATH10K_KEEPALIVE_MAX_UNRESPONSIVE 3900
|
#define ATH10K_KEEPALIVE_MAX_UNRESPONSIVE 3900
|
||||||
|
|
||||||
/* NAPI poll budget */
|
|
||||||
#define ATH10K_NAPI_BUDGET 64
|
|
||||||
|
|
||||||
/* SMBIOS type containing Board Data File Name Extension */
|
/* SMBIOS type containing Board Data File Name Extension */
|
||||||
#define ATH10K_SMBIOS_BDF_EXT_TYPE 0xF8
|
#define ATH10K_SMBIOS_BDF_EXT_TYPE 0xF8
|
||||||
|
|
||||||
|
@ -4119,11 +4119,10 @@ void ath10k_offchan_tx_work(struct work_struct *work)
|
|||||||
peer = ath10k_peer_find(ar, vdev_id, peer_addr);
|
peer = ath10k_peer_find(ar, vdev_id, peer_addr);
|
||||||
spin_unlock_bh(&ar->data_lock);
|
spin_unlock_bh(&ar->data_lock);
|
||||||
|
|
||||||
if (peer)
|
if (peer) {
|
||||||
ath10k_warn(ar, "peer %pM on vdev %d already present\n",
|
ath10k_warn(ar, "peer %pM on vdev %d already present\n",
|
||||||
peer_addr, vdev_id);
|
peer_addr, vdev_id);
|
||||||
|
} else {
|
||||||
if (!peer) {
|
|
||||||
ret = ath10k_peer_create(ar, NULL, NULL, vdev_id,
|
ret = ath10k_peer_create(ar, NULL, NULL, vdev_id,
|
||||||
peer_addr,
|
peer_addr,
|
||||||
WMI_PEER_TYPE_DEFAULT);
|
WMI_PEER_TYPE_DEFAULT);
|
||||||
@ -5340,13 +5339,29 @@ err:
|
|||||||
static void ath10k_stop(struct ieee80211_hw *hw)
|
static void ath10k_stop(struct ieee80211_hw *hw)
|
||||||
{
|
{
|
||||||
struct ath10k *ar = hw->priv;
|
struct ath10k *ar = hw->priv;
|
||||||
|
u32 opt;
|
||||||
|
|
||||||
ath10k_drain_tx(ar);
|
ath10k_drain_tx(ar);
|
||||||
|
|
||||||
mutex_lock(&ar->conf_mutex);
|
mutex_lock(&ar->conf_mutex);
|
||||||
if (ar->state != ATH10K_STATE_OFF) {
|
if (ar->state != ATH10K_STATE_OFF) {
|
||||||
if (!ar->hw_rfkill_on)
|
if (!ar->hw_rfkill_on) {
|
||||||
|
/* If the current driver state is RESTARTING but not yet
|
||||||
|
* fully RESTARTED because of incoming suspend event,
|
||||||
|
* then ath10k_halt() is already called via
|
||||||
|
* ath10k_core_restart() and should not be called here.
|
||||||
|
*/
|
||||||
|
if (ar->state != ATH10K_STATE_RESTARTING) {
|
||||||
ath10k_halt(ar);
|
ath10k_halt(ar);
|
||||||
|
} else {
|
||||||
|
/* Suspending here, because when in RESTARTING
|
||||||
|
* state, ath10k_core_stop() skips
|
||||||
|
* ath10k_wait_for_suspend().
|
||||||
|
*/
|
||||||
|
opt = WMI_PDEV_SUSPEND_AND_DISABLE_INTR;
|
||||||
|
ath10k_wait_for_suspend(ar, opt);
|
||||||
|
}
|
||||||
|
}
|
||||||
ar->state = ATH10K_STATE_OFF;
|
ar->state = ATH10K_STATE_OFF;
|
||||||
}
|
}
|
||||||
mutex_unlock(&ar->conf_mutex);
|
mutex_unlock(&ar->conf_mutex);
|
||||||
|
@ -3216,7 +3216,7 @@ static void ath10k_pci_free_irq(struct ath10k *ar)
|
|||||||
void ath10k_pci_init_napi(struct ath10k *ar)
|
void ath10k_pci_init_napi(struct ath10k *ar)
|
||||||
{
|
{
|
||||||
netif_napi_add(&ar->napi_dev, &ar->napi, ath10k_pci_napi_poll,
|
netif_napi_add(&ar->napi_dev, &ar->napi, ath10k_pci_napi_poll,
|
||||||
ATH10K_NAPI_BUDGET);
|
NAPI_POLL_WEIGHT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ath10k_pci_init_irq(struct ath10k *ar)
|
static int ath10k_pci_init_irq(struct ath10k *ar)
|
||||||
|
@ -2532,7 +2532,7 @@ static int ath10k_sdio_probe(struct sdio_func *func,
|
|||||||
}
|
}
|
||||||
|
|
||||||
netif_napi_add(&ar->napi_dev, &ar->napi, ath10k_sdio_napi_poll,
|
netif_napi_add(&ar->napi_dev, &ar->napi, ath10k_sdio_napi_poll,
|
||||||
ATH10K_NAPI_BUDGET);
|
NAPI_POLL_WEIGHT);
|
||||||
|
|
||||||
ath10k_dbg(ar, ATH10K_DBG_BOOT,
|
ath10k_dbg(ar, ATH10K_DBG_BOOT,
|
||||||
"sdio new func %d vendor 0x%x device 0x%x block 0x%x/0x%x\n",
|
"sdio new func %d vendor 0x%x device 0x%x block 0x%x/0x%x\n",
|
||||||
|
@ -1243,7 +1243,7 @@ static int ath10k_snoc_napi_poll(struct napi_struct *ctx, int budget)
|
|||||||
static void ath10k_snoc_init_napi(struct ath10k *ar)
|
static void ath10k_snoc_init_napi(struct ath10k *ar)
|
||||||
{
|
{
|
||||||
netif_napi_add(&ar->napi_dev, &ar->napi, ath10k_snoc_napi_poll,
|
netif_napi_add(&ar->napi_dev, &ar->napi, ath10k_snoc_napi_poll,
|
||||||
ATH10K_NAPI_BUDGET);
|
NAPI_POLL_WEIGHT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ath10k_snoc_request_irq(struct ath10k *ar)
|
static int ath10k_snoc_request_irq(struct ath10k *ar)
|
||||||
|
@ -1015,7 +1015,7 @@ static int ath10k_usb_probe(struct usb_interface *interface,
|
|||||||
}
|
}
|
||||||
|
|
||||||
netif_napi_add(&ar->napi_dev, &ar->napi, ath10k_usb_napi_poll,
|
netif_napi_add(&ar->napi_dev, &ar->napi, ath10k_usb_napi_poll,
|
||||||
ATH10K_NAPI_BUDGET);
|
NAPI_POLL_WEIGHT);
|
||||||
|
|
||||||
usb_get_dev(dev);
|
usb_get_dev(dev);
|
||||||
vendor_id = le16_to_cpu(dev->descriptor.idVendor);
|
vendor_id = le16_to_cpu(dev->descriptor.idVendor);
|
||||||
|
@ -16,7 +16,8 @@ ath11k-y += core.o \
|
|||||||
ce.o \
|
ce.o \
|
||||||
peer.o \
|
peer.o \
|
||||||
dbring.o \
|
dbring.o \
|
||||||
hw.o
|
hw.o \
|
||||||
|
pcic.o
|
||||||
|
|
||||||
ath11k-$(CONFIG_ATH11K_DEBUGFS) += debugfs.o debugfs_htt_stats.o debugfs_sta.o
|
ath11k-$(CONFIG_ATH11K_DEBUGFS) += debugfs.o debugfs_htt_stats.o debugfs_sta.o
|
||||||
ath11k-$(CONFIG_NL80211_TESTMODE) += testmode.o
|
ath11k-$(CONFIG_NL80211_TESTMODE) += testmode.o
|
||||||
@ -29,7 +30,7 @@ obj-$(CONFIG_ATH11K_AHB) += ath11k_ahb.o
|
|||||||
ath11k_ahb-y += ahb.o
|
ath11k_ahb-y += ahb.o
|
||||||
|
|
||||||
obj-$(CONFIG_ATH11K_PCI) += ath11k_pci.o
|
obj-$(CONFIG_ATH11K_PCI) += ath11k_pci.o
|
||||||
ath11k_pci-y += mhi.o pci.o pcic.o
|
ath11k_pci-y += mhi.o pci.o
|
||||||
|
|
||||||
# for tracing framework to find trace.h
|
# for tracing framework to find trace.h
|
||||||
CFLAGS_trace.o := -I$(src)
|
CFLAGS_trace.o := -I$(src)
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
@ -12,6 +13,7 @@
|
|||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "hif.h"
|
#include "hif.h"
|
||||||
#include <linux/remoteproc.h>
|
#include <linux/remoteproc.h>
|
||||||
|
#include "pcic.h"
|
||||||
|
|
||||||
static const struct of_device_id ath11k_ahb_of_match[] = {
|
static const struct of_device_id ath11k_ahb_of_match[] = {
|
||||||
/* TODO: Should we change the compatible string to something similar
|
/* TODO: Should we change the compatible string to something similar
|
||||||
@ -23,18 +25,14 @@ static const struct of_device_id ath11k_ahb_of_match[] = {
|
|||||||
{ .compatible = "qcom,ipq6018-wifi",
|
{ .compatible = "qcom,ipq6018-wifi",
|
||||||
.data = (void *)ATH11K_HW_IPQ6018_HW10,
|
.data = (void *)ATH11K_HW_IPQ6018_HW10,
|
||||||
},
|
},
|
||||||
|
{ .compatible = "qcom,wcn6750-wifi",
|
||||||
|
.data = (void *)ATH11K_HW_WCN6750_HW10,
|
||||||
|
},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
MODULE_DEVICE_TABLE(of, ath11k_ahb_of_match);
|
MODULE_DEVICE_TABLE(of, ath11k_ahb_of_match);
|
||||||
|
|
||||||
static const struct ath11k_bus_params ath11k_ahb_bus_params = {
|
|
||||||
.mhi_support = false,
|
|
||||||
.m3_fw_support = false,
|
|
||||||
.fixed_bdf_addr = true,
|
|
||||||
.fixed_mem_region = true,
|
|
||||||
};
|
|
||||||
|
|
||||||
#define ATH11K_IRQ_CE0_OFFSET 4
|
#define ATH11K_IRQ_CE0_OFFSET 4
|
||||||
|
|
||||||
static const char *irq_name[ATH11K_IRQ_NUM_MAX] = {
|
static const char *irq_name[ATH11K_IRQ_NUM_MAX] = {
|
||||||
@ -134,6 +132,16 @@ enum ext_irq_num {
|
|||||||
tcl2host_status_ring,
|
tcl2host_status_ring,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int
|
||||||
|
ath11k_ahb_get_msi_irq_wcn6750(struct ath11k_base *ab, unsigned int vector)
|
||||||
|
{
|
||||||
|
return ab->pci.msi.irqs[vector];
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct ath11k_pci_ops ath11k_ahb_pci_ops_wcn6750 = {
|
||||||
|
.get_msi_irq = ath11k_ahb_get_msi_irq_wcn6750,
|
||||||
|
};
|
||||||
|
|
||||||
static inline u32 ath11k_ahb_read32(struct ath11k_base *ab, u32 offset)
|
static inline u32 ath11k_ahb_read32(struct ath11k_base *ab, u32 offset)
|
||||||
{
|
{
|
||||||
return ioread32(ab->mem + offset);
|
return ioread32(ab->mem + offset);
|
||||||
@ -401,6 +409,9 @@ static void ath11k_ahb_free_irq(struct ath11k_base *ab)
|
|||||||
int irq_idx;
|
int irq_idx;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
if (ab->hw_params.hybrid_bus_type)
|
||||||
|
return ath11k_pcic_free_irq(ab);
|
||||||
|
|
||||||
for (i = 0; i < ab->hw_params.ce_count; i++) {
|
for (i = 0; i < ab->hw_params.ce_count; i++) {
|
||||||
if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR)
|
if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR)
|
||||||
continue;
|
continue;
|
||||||
@ -555,6 +566,9 @@ static int ath11k_ahb_config_irq(struct ath11k_base *ab)
|
|||||||
int irq, irq_idx, i;
|
int irq, irq_idx, i;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (ab->hw_params.hybrid_bus_type)
|
||||||
|
return ath11k_pcic_config_irq(ab);
|
||||||
|
|
||||||
/* Configure CE irqs */
|
/* Configure CE irqs */
|
||||||
for (i = 0; i < ab->hw_params.ce_count; i++) {
|
for (i = 0; i < ab->hw_params.ce_count; i++) {
|
||||||
struct ath11k_ce_pipe *ce_pipe = &ab->ce.ce_pipe[i];
|
struct ath11k_ce_pipe *ce_pipe = &ab->ce.ce_pipe[i];
|
||||||
@ -624,7 +638,7 @@ static int ath11k_ahb_map_service_to_pipe(struct ath11k_base *ab, u16 service_id
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct ath11k_hif_ops ath11k_ahb_hif_ops = {
|
static const struct ath11k_hif_ops ath11k_ahb_hif_ops_ipq8074 = {
|
||||||
.start = ath11k_ahb_start,
|
.start = ath11k_ahb_start,
|
||||||
.stop = ath11k_ahb_stop,
|
.stop = ath11k_ahb_stop,
|
||||||
.read32 = ath11k_ahb_read32,
|
.read32 = ath11k_ahb_read32,
|
||||||
@ -636,6 +650,20 @@ static const struct ath11k_hif_ops ath11k_ahb_hif_ops = {
|
|||||||
.power_up = ath11k_ahb_power_up,
|
.power_up = ath11k_ahb_power_up,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct ath11k_hif_ops ath11k_ahb_hif_ops_wcn6750 = {
|
||||||
|
.start = ath11k_pcic_start,
|
||||||
|
.stop = ath11k_pcic_stop,
|
||||||
|
.read32 = ath11k_pcic_read32,
|
||||||
|
.write32 = ath11k_pcic_write32,
|
||||||
|
.irq_enable = ath11k_pcic_ext_irq_enable,
|
||||||
|
.irq_disable = ath11k_pcic_ext_irq_disable,
|
||||||
|
.get_msi_address = ath11k_pcic_get_msi_address,
|
||||||
|
.get_user_msi_vector = ath11k_pcic_get_user_msi_assignment,
|
||||||
|
.map_service_to_pipe = ath11k_pcic_map_service_to_pipe,
|
||||||
|
.power_down = ath11k_ahb_power_down,
|
||||||
|
.power_up = ath11k_ahb_power_up,
|
||||||
|
};
|
||||||
|
|
||||||
static int ath11k_core_get_rproc(struct ath11k_base *ab)
|
static int ath11k_core_get_rproc(struct ath11k_base *ab)
|
||||||
{
|
{
|
||||||
struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab);
|
struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab);
|
||||||
@ -658,12 +686,84 @@ static int ath11k_core_get_rproc(struct ath11k_base *ab)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ath11k_ahb_setup_msi_resources(struct ath11k_base *ab)
|
||||||
|
{
|
||||||
|
struct platform_device *pdev = ab->pdev;
|
||||||
|
phys_addr_t msi_addr_pa;
|
||||||
|
dma_addr_t msi_addr_iova;
|
||||||
|
struct resource *res;
|
||||||
|
int int_prop;
|
||||||
|
int ret;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
ret = ath11k_pcic_init_msi_config(ab);
|
||||||
|
if (ret) {
|
||||||
|
ath11k_err(ab, "failed to init msi config: %d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
|
if (!res) {
|
||||||
|
ath11k_err(ab, "failed to fetch msi_addr\n");
|
||||||
|
return -ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
msi_addr_pa = res->start;
|
||||||
|
msi_addr_iova = dma_map_resource(ab->dev, msi_addr_pa, PAGE_SIZE,
|
||||||
|
DMA_FROM_DEVICE, 0);
|
||||||
|
if (dma_mapping_error(ab->dev, msi_addr_iova))
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
ab->pci.msi.addr_lo = lower_32_bits(msi_addr_iova);
|
||||||
|
ab->pci.msi.addr_hi = upper_32_bits(msi_addr_iova);
|
||||||
|
|
||||||
|
ret = of_property_read_u32_index(ab->dev->of_node, "interrupts", 1, &int_prop);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
ab->pci.msi.irqs[i] = res->start;
|
||||||
|
}
|
||||||
|
|
||||||
|
set_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ath11k_ahb_setup_resources(struct ath11k_base *ab)
|
||||||
|
{
|
||||||
|
struct platform_device *pdev = ab->pdev;
|
||||||
|
struct resource *mem_res;
|
||||||
|
void __iomem *mem;
|
||||||
|
|
||||||
|
if (ab->hw_params.hybrid_bus_type)
|
||||||
|
return ath11k_ahb_setup_msi_resources(ab);
|
||||||
|
|
||||||
|
mem = devm_platform_get_and_ioremap_resource(pdev, 0, &mem_res);
|
||||||
|
if (IS_ERR(mem)) {
|
||||||
|
dev_err(&pdev->dev, "ioremap error\n");
|
||||||
|
return PTR_ERR(mem);
|
||||||
|
}
|
||||||
|
|
||||||
|
ab->mem = mem;
|
||||||
|
ab->mem_len = resource_size(mem_res);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int ath11k_ahb_probe(struct platform_device *pdev)
|
static int ath11k_ahb_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct ath11k_base *ab;
|
struct ath11k_base *ab;
|
||||||
const struct of_device_id *of_id;
|
const struct of_device_id *of_id;
|
||||||
struct resource *mem_res;
|
const struct ath11k_hif_ops *hif_ops;
|
||||||
void __iomem *mem;
|
const struct ath11k_pci_ops *pci_ops;
|
||||||
|
enum ath11k_hw_rev hw_rev;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
of_id = of_match_device(ath11k_ahb_of_match, &pdev->dev);
|
of_id = of_match_device(ath11k_ahb_of_match, &pdev->dev);
|
||||||
@ -672,10 +772,21 @@ static int ath11k_ahb_probe(struct platform_device *pdev)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
mem = devm_platform_get_and_ioremap_resource(pdev, 0, &mem_res);
|
hw_rev = (enum ath11k_hw_rev)of_id->data;
|
||||||
if (IS_ERR(mem)) {
|
|
||||||
dev_err(&pdev->dev, "ioremap error\n");
|
switch (hw_rev) {
|
||||||
return PTR_ERR(mem);
|
case ATH11K_HW_IPQ8074:
|
||||||
|
case ATH11K_HW_IPQ6018_HW10:
|
||||||
|
hif_ops = &ath11k_ahb_hif_ops_ipq8074;
|
||||||
|
pci_ops = NULL;
|
||||||
|
break;
|
||||||
|
case ATH11K_HW_WCN6750_HW10:
|
||||||
|
hif_ops = &ath11k_ahb_hif_ops_wcn6750;
|
||||||
|
pci_ops = &ath11k_ahb_pci_ops_wcn6750;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
dev_err(&pdev->dev, "unsupported device type %d\n", hw_rev);
|
||||||
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
|
ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
|
||||||
@ -685,20 +796,22 @@ static int ath11k_ahb_probe(struct platform_device *pdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ab = ath11k_core_alloc(&pdev->dev, sizeof(struct ath11k_ahb),
|
ab = ath11k_core_alloc(&pdev->dev, sizeof(struct ath11k_ahb),
|
||||||
ATH11K_BUS_AHB,
|
ATH11K_BUS_AHB);
|
||||||
&ath11k_ahb_bus_params);
|
|
||||||
if (!ab) {
|
if (!ab) {
|
||||||
dev_err(&pdev->dev, "failed to allocate ath11k base\n");
|
dev_err(&pdev->dev, "failed to allocate ath11k base\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
ab->hif.ops = &ath11k_ahb_hif_ops;
|
ab->hif.ops = hif_ops;
|
||||||
|
ab->pci.ops = pci_ops;
|
||||||
ab->pdev = pdev;
|
ab->pdev = pdev;
|
||||||
ab->hw_rev = (enum ath11k_hw_rev)of_id->data;
|
ab->hw_rev = hw_rev;
|
||||||
ab->mem = mem;
|
|
||||||
ab->mem_len = resource_size(mem_res);
|
|
||||||
platform_set_drvdata(pdev, ab);
|
platform_set_drvdata(pdev, ab);
|
||||||
|
|
||||||
|
ret = ath11k_ahb_setup_resources(ab);
|
||||||
|
if (ret)
|
||||||
|
goto err_core_free;
|
||||||
|
|
||||||
ret = ath11k_core_pre_init(ab);
|
ret = ath11k_core_pre_init(ab);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_core_free;
|
goto err_core_free;
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2021, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "dp_rx.h"
|
#include "dp_rx.h"
|
||||||
@ -918,9 +919,6 @@ int ath11k_ce_init_pipes(struct ath11k_base *ab)
|
|||||||
int i;
|
int i;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ath11k_ce_get_shadow_config(ab, &ab->qmi.ce_cfg.shadow_reg_v2,
|
|
||||||
&ab->qmi.ce_cfg.shadow_reg_v2_len);
|
|
||||||
|
|
||||||
for (i = 0; i < ab->hw_params.ce_count; i++) {
|
for (i = 0; i < ab->hw_params.ce_count; i++) {
|
||||||
pipe = &ab->ce.ce_pipe[i];
|
pipe = &ab->ce.ce_pipe[i];
|
||||||
|
|
||||||
|
@ -101,6 +101,15 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
|
|||||||
.current_cc_support = false,
|
.current_cc_support = false,
|
||||||
.dbr_debug_support = true,
|
.dbr_debug_support = true,
|
||||||
.global_reset = false,
|
.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,
|
||||||
|
.dp_window_idx = 0,
|
||||||
|
.ce_window_idx = 0,
|
||||||
|
.fixed_fw_mem = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.hw_rev = ATH11K_HW_IPQ6018_HW10,
|
.hw_rev = ATH11K_HW_IPQ6018_HW10,
|
||||||
@ -167,6 +176,15 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
|
|||||||
.current_cc_support = false,
|
.current_cc_support = false,
|
||||||
.dbr_debug_support = true,
|
.dbr_debug_support = true,
|
||||||
.global_reset = false,
|
.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,
|
||||||
|
.dp_window_idx = 0,
|
||||||
|
.ce_window_idx = 0,
|
||||||
|
.fixed_fw_mem = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "qca6390 hw2.0",
|
.name = "qca6390 hw2.0",
|
||||||
@ -232,6 +250,15 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
|
|||||||
.current_cc_support = true,
|
.current_cc_support = true,
|
||||||
.dbr_debug_support = false,
|
.dbr_debug_support = false,
|
||||||
.global_reset = true,
|
.global_reset = true,
|
||||||
|
.bios_sar_capa = NULL,
|
||||||
|
.m3_fw_support = true,
|
||||||
|
.fixed_bdf_addr = false,
|
||||||
|
.fixed_mem_region = false,
|
||||||
|
.static_window_map = false,
|
||||||
|
.hybrid_bus_type = false,
|
||||||
|
.dp_window_idx = 0,
|
||||||
|
.ce_window_idx = 0,
|
||||||
|
.fixed_fw_mem = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "qcn9074 hw1.0",
|
.name = "qcn9074 hw1.0",
|
||||||
@ -297,6 +324,15 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
|
|||||||
.current_cc_support = false,
|
.current_cc_support = false,
|
||||||
.dbr_debug_support = true,
|
.dbr_debug_support = true,
|
||||||
.global_reset = false,
|
.global_reset = false,
|
||||||
|
.bios_sar_capa = NULL,
|
||||||
|
.m3_fw_support = true,
|
||||||
|
.fixed_bdf_addr = false,
|
||||||
|
.fixed_mem_region = false,
|
||||||
|
.static_window_map = true,
|
||||||
|
.hybrid_bus_type = false,
|
||||||
|
.dp_window_idx = 3,
|
||||||
|
.ce_window_idx = 2,
|
||||||
|
.fixed_fw_mem = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "wcn6855 hw2.0",
|
.name = "wcn6855 hw2.0",
|
||||||
@ -362,6 +398,15 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
|
|||||||
.current_cc_support = true,
|
.current_cc_support = true,
|
||||||
.dbr_debug_support = false,
|
.dbr_debug_support = false,
|
||||||
.global_reset = true,
|
.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,
|
||||||
|
.dp_window_idx = 0,
|
||||||
|
.ce_window_idx = 0,
|
||||||
|
.fixed_fw_mem = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "wcn6855 hw2.1",
|
.name = "wcn6855 hw2.1",
|
||||||
@ -426,6 +471,88 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
|
|||||||
.current_cc_support = true,
|
.current_cc_support = true,
|
||||||
.dbr_debug_support = false,
|
.dbr_debug_support = false,
|
||||||
.global_reset = true,
|
.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,
|
||||||
|
.dp_window_idx = 0,
|
||||||
|
.ce_window_idx = 0,
|
||||||
|
.fixed_fw_mem = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "wcn6750 hw1.0",
|
||||||
|
.hw_rev = ATH11K_HW_WCN6750_HW10,
|
||||||
|
.fw = {
|
||||||
|
.dir = "WCN6750/hw1.0",
|
||||||
|
.board_size = 256 * 1024,
|
||||||
|
.cal_offset = 128 * 1024,
|
||||||
|
},
|
||||||
|
.max_radios = 1,
|
||||||
|
.bdf_addr = 0x4B0C0000,
|
||||||
|
.hw_ops = &wcn6750_ops,
|
||||||
|
.ring_mask = &ath11k_hw_ring_mask_qca6390,
|
||||||
|
.internal_sleep_clock = false,
|
||||||
|
.regs = &wcn6750_regs,
|
||||||
|
.qmi_service_ins_id = ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_WCN6750,
|
||||||
|
.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,
|
||||||
|
.rfkill_pin = 0,
|
||||||
|
.rfkill_cfg = 0,
|
||||||
|
.rfkill_on_level = 0,
|
||||||
|
.single_pdev_only = true,
|
||||||
|
.rxdma1_enable = false,
|
||||||
|
.num_rxmda_per_pdev = 1,
|
||||||
|
.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,
|
||||||
|
},
|
||||||
|
|
||||||
|
.interface_modes = BIT(NL80211_IFTYPE_STATION) |
|
||||||
|
BIT(NL80211_IFTYPE_AP),
|
||||||
|
.supports_monitor = false,
|
||||||
|
.supports_shadow_regs = true,
|
||||||
|
.idle_ps = true,
|
||||||
|
.supports_sta_ps = true,
|
||||||
|
.cold_boot_calib = false,
|
||||||
|
.fw_mem_mode = 0,
|
||||||
|
.num_vdevs = 16 + 1,
|
||||||
|
.num_peers = 512,
|
||||||
|
.supports_suspend = false,
|
||||||
|
.hal_desc_sz = sizeof(struct hal_rx_desc_qcn9074),
|
||||||
|
.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 = false,
|
||||||
|
.current_cc_support = true,
|
||||||
|
.dbr_debug_support = false,
|
||||||
|
.global_reset = false,
|
||||||
|
.bios_sar_capa = NULL,
|
||||||
|
.m3_fw_support = false,
|
||||||
|
.fixed_bdf_addr = false,
|
||||||
|
.fixed_mem_region = false,
|
||||||
|
.static_window_map = true,
|
||||||
|
.hybrid_bus_type = true,
|
||||||
|
.dp_window_idx = 1,
|
||||||
|
.ce_window_idx = 2,
|
||||||
|
.fixed_fw_mem = true,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -538,7 +665,7 @@ int ath11k_core_resume(struct ath11k_base *ab)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ath11k_core_resume);
|
EXPORT_SYMBOL(ath11k_core_resume);
|
||||||
|
|
||||||
static void ath11k_core_check_bdfext(const struct dmi_header *hdr, void *data)
|
static void ath11k_core_check_cc_code_bdfext(const struct dmi_header *hdr, void *data)
|
||||||
{
|
{
|
||||||
struct ath11k_base *ab = data;
|
struct ath11k_base *ab = data;
|
||||||
const char *magic = ATH11K_SMBIOS_BDF_EXT_MAGIC;
|
const char *magic = ATH11K_SMBIOS_BDF_EXT_MAGIC;
|
||||||
@ -560,6 +687,28 @@ static void ath11k_core_check_bdfext(const struct dmi_header *hdr, void *data)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spin_lock_bh(&ab->base_lock);
|
||||||
|
|
||||||
|
switch (smbios->country_code_flag) {
|
||||||
|
case ATH11K_SMBIOS_CC_ISO:
|
||||||
|
ab->new_alpha2[0] = (smbios->cc_code >> 8) & 0xff;
|
||||||
|
ab->new_alpha2[1] = smbios->cc_code & 0xff;
|
||||||
|
ath11k_dbg(ab, ATH11K_DBG_BOOT, "boot smbios cc_code %c%c\n",
|
||||||
|
ab->new_alpha2[0], ab->new_alpha2[1]);
|
||||||
|
break;
|
||||||
|
case ATH11K_SMBIOS_CC_WW:
|
||||||
|
ab->new_alpha2[0] = '0';
|
||||||
|
ab->new_alpha2[1] = '0';
|
||||||
|
ath11k_dbg(ab, ATH11K_DBG_BOOT, "boot smbios worldwide regdomain\n");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ath11k_dbg(ab, ATH11K_DBG_BOOT, "boot ignore smbios country code setting %d\n",
|
||||||
|
smbios->country_code_flag);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
spin_unlock_bh(&ab->base_lock);
|
||||||
|
|
||||||
if (!smbios->bdf_enabled) {
|
if (!smbios->bdf_enabled) {
|
||||||
ath11k_dbg(ab, ATH11K_DBG_BOOT, "bdf variant name not found.\n");
|
ath11k_dbg(ab, ATH11K_DBG_BOOT, "bdf variant name not found.\n");
|
||||||
return;
|
return;
|
||||||
@ -599,7 +748,7 @@ static void ath11k_core_check_bdfext(const struct dmi_header *hdr, void *data)
|
|||||||
int ath11k_core_check_smbios(struct ath11k_base *ab)
|
int ath11k_core_check_smbios(struct ath11k_base *ab)
|
||||||
{
|
{
|
||||||
ab->qmi.target.bdf_ext[0] = '\0';
|
ab->qmi.target.bdf_ext[0] = '\0';
|
||||||
dmi_walk(ath11k_core_check_bdfext, ab);
|
dmi_walk(ath11k_core_check_cc_code_bdfext, ab);
|
||||||
|
|
||||||
if (ab->qmi.target.bdf_ext[0] == '\0')
|
if (ab->qmi.target.bdf_ext[0] == '\0')
|
||||||
return -ENODATA;
|
return -ENODATA;
|
||||||
@ -1118,21 +1267,14 @@ static void ath11k_core_pdev_destroy(struct ath11k_base *ab)
|
|||||||
ath11k_debugfs_pdev_destroy(ab);
|
ath11k_debugfs_pdev_destroy(ab);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ath11k_core_start(struct ath11k_base *ab,
|
static int ath11k_core_start(struct ath11k_base *ab)
|
||||||
enum ath11k_firmware_mode mode)
|
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = ath11k_qmi_firmware_start(ab, mode);
|
|
||||||
if (ret) {
|
|
||||||
ath11k_err(ab, "failed to attach wmi: %d\n", ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = ath11k_wmi_attach(ab);
|
ret = ath11k_wmi_attach(ab);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ath11k_err(ab, "failed to attach wmi: %d\n", ret);
|
ath11k_err(ab, "failed to attach wmi: %d\n", ret);
|
||||||
goto err_firmware_stop;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = ath11k_htc_init(ab);
|
ret = ath11k_htc_init(ab);
|
||||||
@ -1207,7 +1349,7 @@ static int ath11k_core_start(struct ath11k_base *ab,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* put hardware to DBS mode */
|
/* put hardware to DBS mode */
|
||||||
if (ab->hw_params.single_pdev_only) {
|
if (ab->hw_params.single_pdev_only && ab->hw_params.num_rxmda_per_pdev > 1) {
|
||||||
ret = ath11k_wmi_set_hw_mode(ab, WMI_HOST_HW_MODE_DBS);
|
ret = ath11k_wmi_set_hw_mode(ab, WMI_HOST_HW_MODE_DBS);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ath11k_err(ab, "failed to send dbs mode: %d\n", ret);
|
ath11k_err(ab, "failed to send dbs mode: %d\n", ret);
|
||||||
@ -1232,8 +1374,23 @@ err_hif_stop:
|
|||||||
ath11k_hif_stop(ab);
|
ath11k_hif_stop(ab);
|
||||||
err_wmi_detach:
|
err_wmi_detach:
|
||||||
ath11k_wmi_detach(ab);
|
ath11k_wmi_detach(ab);
|
||||||
err_firmware_stop:
|
|
||||||
ath11k_qmi_firmware_stop(ab);
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ath11k_core_start_firmware(struct ath11k_base *ab,
|
||||||
|
enum ath11k_firmware_mode mode)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ath11k_ce_get_shadow_config(ab, &ab->qmi.ce_cfg.shadow_reg_v2,
|
||||||
|
&ab->qmi.ce_cfg.shadow_reg_v2_len);
|
||||||
|
|
||||||
|
ret = ath11k_qmi_firmware_start(ab, mode);
|
||||||
|
if (ret) {
|
||||||
|
ath11k_err(ab, "failed to send firmware start: %d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -1263,16 +1420,22 @@ int ath11k_core_qmi_firmware_ready(struct ath11k_base *ab)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
ret = ath11k_core_start_firmware(ab, ATH11K_FIRMWARE_MODE_NORMAL);
|
||||||
|
if (ret) {
|
||||||
|
ath11k_err(ab, "failed to start firmware: %d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = ath11k_ce_init_pipes(ab);
|
ret = ath11k_ce_init_pipes(ab);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ath11k_err(ab, "failed to initialize CE: %d\n", ret);
|
ath11k_err(ab, "failed to initialize CE: %d\n", ret);
|
||||||
return ret;
|
goto err_firmware_stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = ath11k_dp_alloc(ab);
|
ret = ath11k_dp_alloc(ab);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ath11k_err(ab, "failed to init DP: %d\n", ret);
|
ath11k_err(ab, "failed to init DP: %d\n", ret);
|
||||||
return ret;
|
goto err_firmware_stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (ath11k_crypto_mode) {
|
switch (ath11k_crypto_mode) {
|
||||||
@ -1293,7 +1456,7 @@ int ath11k_core_qmi_firmware_ready(struct ath11k_base *ab)
|
|||||||
set_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags);
|
set_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags);
|
||||||
|
|
||||||
mutex_lock(&ab->core_lock);
|
mutex_lock(&ab->core_lock);
|
||||||
ret = ath11k_core_start(ab, ATH11K_FIRMWARE_MODE_NORMAL);
|
ret = ath11k_core_start(ab);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ath11k_err(ab, "failed to start core: %d\n", ret);
|
ath11k_err(ab, "failed to start core: %d\n", ret);
|
||||||
goto err_dp_free;
|
goto err_dp_free;
|
||||||
@ -1322,6 +1485,9 @@ err_core_stop:
|
|||||||
err_dp_free:
|
err_dp_free:
|
||||||
ath11k_dp_free(ab);
|
ath11k_dp_free(ab);
|
||||||
mutex_unlock(&ab->core_lock);
|
mutex_unlock(&ab->core_lock);
|
||||||
|
err_firmware_stop:
|
||||||
|
ath11k_qmi_firmware_stop(ab);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1567,7 +1733,7 @@ static void ath11k_core_reset(struct work_struct *work)
|
|||||||
* completed, then the second reset worker will destroy the previous one,
|
* completed, then the second reset worker will destroy the previous one,
|
||||||
* thus below is to avoid that.
|
* thus below is to avoid that.
|
||||||
*/
|
*/
|
||||||
ath11k_warn(ab, "already reseting count %d\n", reset_count);
|
ath11k_warn(ab, "already resetting count %d\n", reset_count);
|
||||||
|
|
||||||
reinit_completion(&ab->reset_complete);
|
reinit_completion(&ab->reset_complete);
|
||||||
time_left = wait_for_completion_timeout(&ab->reset_complete,
|
time_left = wait_for_completion_timeout(&ab->reset_complete,
|
||||||
@ -1685,8 +1851,7 @@ void ath11k_core_free(struct ath11k_base *ab)
|
|||||||
EXPORT_SYMBOL(ath11k_core_free);
|
EXPORT_SYMBOL(ath11k_core_free);
|
||||||
|
|
||||||
struct ath11k_base *ath11k_core_alloc(struct device *dev, size_t priv_size,
|
struct ath11k_base *ath11k_core_alloc(struct device *dev, size_t priv_size,
|
||||||
enum ath11k_bus bus,
|
enum ath11k_bus bus)
|
||||||
const struct ath11k_bus_params *bus_params)
|
|
||||||
{
|
{
|
||||||
struct ath11k_base *ab;
|
struct ath11k_base *ab;
|
||||||
|
|
||||||
@ -1725,7 +1890,6 @@ struct ath11k_base *ath11k_core_alloc(struct device *dev, size_t priv_size,
|
|||||||
init_completion(&ab->wow.wakeup_completed);
|
init_completion(&ab->wow.wakeup_completed);
|
||||||
|
|
||||||
ab->dev = dev;
|
ab->dev = dev;
|
||||||
ab->bus_params = *bus_params;
|
|
||||||
ab->hif.bus = bus;
|
ab->hif.bus = bus;
|
||||||
|
|
||||||
return ab;
|
return ab;
|
||||||
|
@ -140,6 +140,7 @@ enum ath11k_hw_rev {
|
|||||||
ATH11K_HW_QCN9074_HW10,
|
ATH11K_HW_QCN9074_HW10,
|
||||||
ATH11K_HW_WCN6855_HW20,
|
ATH11K_HW_WCN6855_HW20,
|
||||||
ATH11K_HW_WCN6855_HW21,
|
ATH11K_HW_WCN6855_HW21,
|
||||||
|
ATH11K_HW_WCN6750_HW10,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ath11k_firmware_mode {
|
enum ath11k_firmware_mode {
|
||||||
@ -169,12 +170,38 @@ struct ath11k_ext_irq_grp {
|
|||||||
struct net_device napi_ndev;
|
struct net_device napi_ndev;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum ath11k_smbios_cc_type {
|
||||||
|
/* disable country code setting from SMBIOS */
|
||||||
|
ATH11K_SMBIOS_CC_DISABLE = 0,
|
||||||
|
|
||||||
|
/* set country code by ANSI country name, based on ISO3166-1 alpha2 */
|
||||||
|
ATH11K_SMBIOS_CC_ISO = 1,
|
||||||
|
|
||||||
|
/* worldwide regdomain */
|
||||||
|
ATH11K_SMBIOS_CC_WW = 2,
|
||||||
|
};
|
||||||
|
|
||||||
struct ath11k_smbios_bdf {
|
struct ath11k_smbios_bdf {
|
||||||
struct dmi_header hdr;
|
struct dmi_header hdr;
|
||||||
u32 padding;
|
|
||||||
|
u8 features_disabled;
|
||||||
|
|
||||||
|
/* enum ath11k_smbios_cc_type */
|
||||||
|
u8 country_code_flag;
|
||||||
|
|
||||||
|
/* To set specific country, you need to set country code
|
||||||
|
* flag=ATH11K_SMBIOS_CC_ISO first, then if country is United
|
||||||
|
* States, then country code value = 0x5553 ("US",'U' = 0x55, 'S'=
|
||||||
|
* 0x53). To set country to INDONESIA, then country code value =
|
||||||
|
* 0x4944 ("IN", 'I'=0x49, 'D'=0x44). If country code flag =
|
||||||
|
* ATH11K_SMBIOS_CC_WW, then you can use worldwide regulatory
|
||||||
|
* setting.
|
||||||
|
*/
|
||||||
|
u16 cc_code;
|
||||||
|
|
||||||
u8 bdf_enabled;
|
u8 bdf_enabled;
|
||||||
u8 bdf_ext[];
|
u8 bdf_ext[];
|
||||||
};
|
} __packed;
|
||||||
|
|
||||||
#define HEHANDLE_CAP_PHYINFO_SIZE 3
|
#define HEHANDLE_CAP_PHYINFO_SIZE 3
|
||||||
#define HECAP_PHYINFO_SIZE 9
|
#define HECAP_PHYINFO_SIZE 9
|
||||||
@ -722,14 +749,6 @@ struct ath11k_board_data {
|
|||||||
size_t len;
|
size_t len;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ath11k_bus_params {
|
|
||||||
bool mhi_support;
|
|
||||||
bool m3_fw_support;
|
|
||||||
bool fixed_bdf_addr;
|
|
||||||
bool fixed_mem_region;
|
|
||||||
bool static_window_map;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ath11k_pci_ops {
|
struct ath11k_pci_ops {
|
||||||
int (*wakeup)(struct ath11k_base *ab);
|
int (*wakeup)(struct ath11k_base *ab);
|
||||||
void (*release)(struct ath11k_base *ab);
|
void (*release)(struct ath11k_base *ab);
|
||||||
@ -861,7 +880,6 @@ struct ath11k_base {
|
|||||||
int bd_api;
|
int bd_api;
|
||||||
|
|
||||||
struct ath11k_hw_params hw_params;
|
struct ath11k_hw_params hw_params;
|
||||||
struct ath11k_bus_params bus_params;
|
|
||||||
|
|
||||||
const struct firmware *cal_file;
|
const struct firmware *cal_file;
|
||||||
|
|
||||||
@ -932,6 +950,7 @@ struct ath11k_base {
|
|||||||
struct {
|
struct {
|
||||||
const struct ath11k_msi_config *config;
|
const struct ath11k_msi_config *config;
|
||||||
u32 ep_base_data;
|
u32 ep_base_data;
|
||||||
|
u32 irqs[32];
|
||||||
u32 addr_lo;
|
u32 addr_lo;
|
||||||
u32 addr_hi;
|
u32 addr_hi;
|
||||||
} msi;
|
} msi;
|
||||||
@ -1109,8 +1128,7 @@ int ath11k_core_pre_init(struct ath11k_base *ab);
|
|||||||
int ath11k_core_init(struct ath11k_base *ath11k);
|
int ath11k_core_init(struct ath11k_base *ath11k);
|
||||||
void ath11k_core_deinit(struct ath11k_base *ath11k);
|
void ath11k_core_deinit(struct ath11k_base *ath11k);
|
||||||
struct ath11k_base *ath11k_core_alloc(struct device *dev, size_t priv_size,
|
struct ath11k_base *ath11k_core_alloc(struct device *dev, size_t priv_size,
|
||||||
enum ath11k_bus bus,
|
enum ath11k_bus bus);
|
||||||
const struct ath11k_bus_params *bus_params);
|
|
||||||
void ath11k_core_free(struct ath11k_base *ath11k);
|
void ath11k_core_free(struct ath11k_base *ath11k);
|
||||||
int ath11k_core_fetch_bdf(struct ath11k_base *ath11k,
|
int ath11k_core_fetch_bdf(struct ath11k_base *ath11k,
|
||||||
struct ath11k_board_data *bd);
|
struct ath11k_board_data *bd);
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
#include "hal_tx.h"
|
#include "hal_tx.h"
|
||||||
@ -1082,10 +1083,10 @@ static void ath11k_hal_srng_update_hp_tp_addr(struct ath11k_base *ab,
|
|||||||
srng = &hal->srng_list[ring_id];
|
srng = &hal->srng_list[ring_id];
|
||||||
|
|
||||||
if (srng_config->ring_dir == HAL_SRNG_DIR_DST)
|
if (srng_config->ring_dir == HAL_SRNG_DIR_DST)
|
||||||
srng->u.dst_ring.tp_addr = (u32 *)(HAL_SHADOW_REG(shadow_cfg_idx) +
|
srng->u.dst_ring.tp_addr = (u32 *)(HAL_SHADOW_REG(ab, shadow_cfg_idx) +
|
||||||
(unsigned long)ab->mem);
|
(unsigned long)ab->mem);
|
||||||
else
|
else
|
||||||
srng->u.src_ring.hp_addr = (u32 *)(HAL_SHADOW_REG(shadow_cfg_idx) +
|
srng->u.src_ring.hp_addr = (u32 *)(HAL_SHADOW_REG(ab, shadow_cfg_idx) +
|
||||||
(unsigned long)ab->mem);
|
(unsigned long)ab->mem);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1120,7 +1121,7 @@ int ath11k_hal_srng_update_shadow_config(struct ath11k_base *ab,
|
|||||||
ath11k_dbg(ab, ATH11k_DBG_HAL,
|
ath11k_dbg(ab, ATH11k_DBG_HAL,
|
||||||
"target_reg %x, shadow reg 0x%x shadow_idx 0x%x, ring_type %d, ring num %d",
|
"target_reg %x, shadow reg 0x%x shadow_idx 0x%x, ring_type %d, ring num %d",
|
||||||
target_reg,
|
target_reg,
|
||||||
HAL_SHADOW_REG(shadow_cfg_idx),
|
HAL_SHADOW_REG(ab, shadow_cfg_idx),
|
||||||
shadow_cfg_idx,
|
shadow_cfg_idx,
|
||||||
ring_type, ring_num);
|
ring_type, ring_num);
|
||||||
|
|
||||||
@ -1193,12 +1194,12 @@ static int ath11k_hal_srng_create_config(struct ath11k_base *ab)
|
|||||||
s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_TCL_RING_HP(ab);
|
s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_TCL_RING_HP(ab);
|
||||||
|
|
||||||
s = &hal->srng_config[HAL_REO_REINJECT];
|
s = &hal->srng_config[HAL_REO_REINJECT];
|
||||||
s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_SW2REO_RING_BASE_LSB;
|
s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_SW2REO_RING_BASE_LSB(ab);
|
||||||
s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_SW2REO_RING_HP;
|
s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_SW2REO_RING_HP(ab);
|
||||||
|
|
||||||
s = &hal->srng_config[HAL_REO_CMD];
|
s = &hal->srng_config[HAL_REO_CMD];
|
||||||
s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_CMD_RING_BASE_LSB;
|
s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_CMD_RING_BASE_LSB(ab);
|
||||||
s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_CMD_HP;
|
s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_CMD_HP(ab);
|
||||||
|
|
||||||
s = &hal->srng_config[HAL_REO_STATUS];
|
s = &hal->srng_config[HAL_REO_STATUS];
|
||||||
s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_STATUS_RING_BASE_LSB(ab);
|
s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_STATUS_RING_BASE_LSB(ab);
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/* SPDX-License-Identifier: BSD-3-Clause-Clear */
|
/* SPDX-License-Identifier: BSD-3-Clause-Clear */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef ATH11K_HAL_H
|
#ifndef ATH11K_HAL_H
|
||||||
@ -31,12 +32,12 @@ struct ath11k_base;
|
|||||||
#define HAL_DSCP_TID_TBL_SIZE 24
|
#define HAL_DSCP_TID_TBL_SIZE 24
|
||||||
|
|
||||||
/* calculate the register address from bar0 of shadow register x */
|
/* calculate the register address from bar0 of shadow register x */
|
||||||
#define HAL_SHADOW_BASE_ADDR 0x000008fc
|
#define HAL_SHADOW_BASE_ADDR(ab) ab->hw_params.regs->hal_shadow_base_addr
|
||||||
#define HAL_SHADOW_NUM_REGS 36
|
#define HAL_SHADOW_NUM_REGS 36
|
||||||
#define HAL_HP_OFFSET_IN_REG_START 1
|
#define HAL_HP_OFFSET_IN_REG_START 1
|
||||||
#define HAL_OFFSET_FROM_HP_TO_TP 4
|
#define HAL_OFFSET_FROM_HP_TO_TP 4
|
||||||
|
|
||||||
#define HAL_SHADOW_REG(x) (HAL_SHADOW_BASE_ADDR + (4 * (x)))
|
#define HAL_SHADOW_REG(ab, x) (HAL_SHADOW_BASE_ADDR(ab) + (4 * (x)))
|
||||||
|
|
||||||
/* WCSS Relative address */
|
/* WCSS Relative address */
|
||||||
#define HAL_SEQ_WCSS_UMAC_OFFSET 0x00a00000
|
#define HAL_SEQ_WCSS_UMAC_OFFSET 0x00a00000
|
||||||
@ -180,16 +181,18 @@ struct ath11k_base;
|
|||||||
#define HAL_REO_TCL_RING_HP(ab) ab->hw_params.regs->hal_reo_tcl_ring_hp
|
#define HAL_REO_TCL_RING_HP(ab) ab->hw_params.regs->hal_reo_tcl_ring_hp
|
||||||
|
|
||||||
/* REO CMD R0 address */
|
/* REO CMD R0 address */
|
||||||
#define HAL_REO_CMD_RING_BASE_LSB 0x00000194
|
#define HAL_REO_CMD_RING_BASE_LSB(ab) \
|
||||||
|
ab->hw_params.regs->hal_reo_cmd_ring_base_lsb
|
||||||
|
|
||||||
/* REO CMD R2 address */
|
/* REO CMD R2 address */
|
||||||
#define HAL_REO_CMD_HP 0x00003020
|
#define HAL_REO_CMD_HP(ab) ab->hw_params.regs->hal_reo_cmd_ring_hp
|
||||||
|
|
||||||
/* SW2REO R0 address */
|
/* SW2REO R0 address */
|
||||||
#define HAL_SW2REO_RING_BASE_LSB 0x000001ec
|
#define HAL_SW2REO_RING_BASE_LSB(ab) \
|
||||||
|
ab->hw_params.regs->hal_sw2reo_ring_base_lsb
|
||||||
|
|
||||||
/* SW2REO R2 address */
|
/* SW2REO R2 address */
|
||||||
#define HAL_SW2REO_RING_HP 0x00003028
|
#define HAL_SW2REO_RING_HP(ab) ab->hw_params.regs->hal_sw2reo_ring_hp
|
||||||
|
|
||||||
/* CE ring R0 address */
|
/* CE ring R0 address */
|
||||||
#define HAL_CE_DST_RING_BASE_LSB 0x00000000
|
#define HAL_CE_DST_RING_BASE_LSB 0x00000000
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018-2020 The Linux Foundation. All rights reserved.
|
* Copyright (c) 2018-2020 The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
@ -1014,6 +1015,45 @@ const struct ath11k_hw_ops wcn6855_ops = {
|
|||||||
.rx_desc_mpdu_start_addr2 = ath11k_hw_wcn6855_rx_desc_mpdu_start_addr2,
|
.rx_desc_mpdu_start_addr2 = ath11k_hw_wcn6855_rx_desc_mpdu_start_addr2,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const struct ath11k_hw_ops wcn6750_ops = {
|
||||||
|
.get_hw_mac_from_pdev_id = ath11k_hw_ipq8074_mac_from_pdev_id,
|
||||||
|
.wmi_init_config = ath11k_init_wmi_config_qca6390,
|
||||||
|
.mac_id_to_pdev_id = ath11k_hw_mac_id_to_pdev_id_qca6390,
|
||||||
|
.mac_id_to_srng_id = ath11k_hw_mac_id_to_srng_id_qca6390,
|
||||||
|
.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,
|
||||||
|
.reo_setup = ath11k_hw_wcn6855_reo_setup,
|
||||||
|
.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 0x1
|
#define ATH11K_TX_RING_MASK_0 0x1
|
||||||
#define ATH11K_TX_RING_MASK_1 0x2
|
#define ATH11K_TX_RING_MASK_1 0x2
|
||||||
#define ATH11K_TX_RING_MASK_2 0x4
|
#define ATH11K_TX_RING_MASK_2 0x4
|
||||||
@ -1908,10 +1948,18 @@ const struct ath11k_hw_regs ipq8074_regs = {
|
|||||||
.hal_reo_tcl_ring_base_lsb = 0x000003fc,
|
.hal_reo_tcl_ring_base_lsb = 0x000003fc,
|
||||||
.hal_reo_tcl_ring_hp = 0x00003058,
|
.hal_reo_tcl_ring_hp = 0x00003058,
|
||||||
|
|
||||||
|
/* REO CMD ring address */
|
||||||
|
.hal_reo_cmd_ring_base_lsb = 0x00000194,
|
||||||
|
.hal_reo_cmd_ring_hp = 0x00003020,
|
||||||
|
|
||||||
/* REO status address */
|
/* REO status address */
|
||||||
.hal_reo_status_ring_base_lsb = 0x00000504,
|
.hal_reo_status_ring_base_lsb = 0x00000504,
|
||||||
.hal_reo_status_hp = 0x00003070,
|
.hal_reo_status_hp = 0x00003070,
|
||||||
|
|
||||||
|
/* SW2REO ring address */
|
||||||
|
.hal_sw2reo_ring_base_lsb = 0x000001ec,
|
||||||
|
.hal_sw2reo_ring_hp = 0x00003028,
|
||||||
|
|
||||||
/* WCSS relative address */
|
/* WCSS relative address */
|
||||||
.hal_seq_wcss_umac_ce0_src_reg = 0x00a00000,
|
.hal_seq_wcss_umac_ce0_src_reg = 0x00a00000,
|
||||||
.hal_seq_wcss_umac_ce0_dst_reg = 0x00a01000,
|
.hal_seq_wcss_umac_ce0_dst_reg = 0x00a01000,
|
||||||
@ -1932,6 +1980,9 @@ const struct ath11k_hw_regs ipq8074_regs = {
|
|||||||
/* PCIe base address */
|
/* PCIe base address */
|
||||||
.pcie_qserdes_sysclk_en_sel = 0x0,
|
.pcie_qserdes_sysclk_en_sel = 0x0,
|
||||||
.pcie_pcs_osc_dtct_config_base = 0x0,
|
.pcie_pcs_osc_dtct_config_base = 0x0,
|
||||||
|
|
||||||
|
/* Shadow register area */
|
||||||
|
.hal_shadow_base_addr = 0x0,
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct ath11k_hw_regs qca6390_regs = {
|
const struct ath11k_hw_regs qca6390_regs = {
|
||||||
@ -1979,10 +2030,18 @@ const struct ath11k_hw_regs qca6390_regs = {
|
|||||||
.hal_reo_tcl_ring_base_lsb = 0x000003a4,
|
.hal_reo_tcl_ring_base_lsb = 0x000003a4,
|
||||||
.hal_reo_tcl_ring_hp = 0x00003050,
|
.hal_reo_tcl_ring_hp = 0x00003050,
|
||||||
|
|
||||||
|
/* REO CMD ring address */
|
||||||
|
.hal_reo_cmd_ring_base_lsb = 0x00000194,
|
||||||
|
.hal_reo_cmd_ring_hp = 0x00003020,
|
||||||
|
|
||||||
/* REO status address */
|
/* REO status address */
|
||||||
.hal_reo_status_ring_base_lsb = 0x000004ac,
|
.hal_reo_status_ring_base_lsb = 0x000004ac,
|
||||||
.hal_reo_status_hp = 0x00003068,
|
.hal_reo_status_hp = 0x00003068,
|
||||||
|
|
||||||
|
/* SW2REO ring address */
|
||||||
|
.hal_sw2reo_ring_base_lsb = 0x000001ec,
|
||||||
|
.hal_sw2reo_ring_hp = 0x00003028,
|
||||||
|
|
||||||
/* WCSS relative address */
|
/* WCSS relative address */
|
||||||
.hal_seq_wcss_umac_ce0_src_reg = 0x00a00000,
|
.hal_seq_wcss_umac_ce0_src_reg = 0x00a00000,
|
||||||
.hal_seq_wcss_umac_ce0_dst_reg = 0x00a01000,
|
.hal_seq_wcss_umac_ce0_dst_reg = 0x00a01000,
|
||||||
@ -2003,6 +2062,9 @@ const struct ath11k_hw_regs qca6390_regs = {
|
|||||||
/* PCIe base address */
|
/* PCIe base address */
|
||||||
.pcie_qserdes_sysclk_en_sel = 0x01e0c0ac,
|
.pcie_qserdes_sysclk_en_sel = 0x01e0c0ac,
|
||||||
.pcie_pcs_osc_dtct_config_base = 0x01e0c628,
|
.pcie_pcs_osc_dtct_config_base = 0x01e0c628,
|
||||||
|
|
||||||
|
/* Shadow register area */
|
||||||
|
.hal_shadow_base_addr = 0x000008fc,
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct ath11k_hw_regs qcn9074_regs = {
|
const struct ath11k_hw_regs qcn9074_regs = {
|
||||||
@ -2050,10 +2112,18 @@ const struct ath11k_hw_regs qcn9074_regs = {
|
|||||||
.hal_reo_tcl_ring_base_lsb = 0x000003fc,
|
.hal_reo_tcl_ring_base_lsb = 0x000003fc,
|
||||||
.hal_reo_tcl_ring_hp = 0x00003058,
|
.hal_reo_tcl_ring_hp = 0x00003058,
|
||||||
|
|
||||||
|
/* REO CMD ring address */
|
||||||
|
.hal_reo_cmd_ring_base_lsb = 0x00000194,
|
||||||
|
.hal_reo_cmd_ring_hp = 0x00003020,
|
||||||
|
|
||||||
/* REO status address */
|
/* REO status address */
|
||||||
.hal_reo_status_ring_base_lsb = 0x00000504,
|
.hal_reo_status_ring_base_lsb = 0x00000504,
|
||||||
.hal_reo_status_hp = 0x00003070,
|
.hal_reo_status_hp = 0x00003070,
|
||||||
|
|
||||||
|
/* SW2REO ring address */
|
||||||
|
.hal_sw2reo_ring_base_lsb = 0x000001ec,
|
||||||
|
.hal_sw2reo_ring_hp = 0x00003028,
|
||||||
|
|
||||||
/* WCSS relative address */
|
/* WCSS relative address */
|
||||||
.hal_seq_wcss_umac_ce0_src_reg = 0x01b80000,
|
.hal_seq_wcss_umac_ce0_src_reg = 0x01b80000,
|
||||||
.hal_seq_wcss_umac_ce0_dst_reg = 0x01b81000,
|
.hal_seq_wcss_umac_ce0_dst_reg = 0x01b81000,
|
||||||
@ -2074,6 +2144,9 @@ const struct ath11k_hw_regs qcn9074_regs = {
|
|||||||
/* PCIe base address */
|
/* PCIe base address */
|
||||||
.pcie_qserdes_sysclk_en_sel = 0x01e0e0a8,
|
.pcie_qserdes_sysclk_en_sel = 0x01e0e0a8,
|
||||||
.pcie_pcs_osc_dtct_config_base = 0x01e0f45c,
|
.pcie_pcs_osc_dtct_config_base = 0x01e0f45c,
|
||||||
|
|
||||||
|
/* Shadow register area */
|
||||||
|
.hal_shadow_base_addr = 0x0,
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct ath11k_hw_regs wcn6855_regs = {
|
const struct ath11k_hw_regs wcn6855_regs = {
|
||||||
@ -2121,10 +2194,18 @@ const struct ath11k_hw_regs wcn6855_regs = {
|
|||||||
.hal_reo_tcl_ring_base_lsb = 0x00000454,
|
.hal_reo_tcl_ring_base_lsb = 0x00000454,
|
||||||
.hal_reo_tcl_ring_hp = 0x00003060,
|
.hal_reo_tcl_ring_hp = 0x00003060,
|
||||||
|
|
||||||
|
/* REO CMD ring address */
|
||||||
|
.hal_reo_cmd_ring_base_lsb = 0x00000194,
|
||||||
|
.hal_reo_cmd_ring_hp = 0x00003020,
|
||||||
|
|
||||||
/* REO status address */
|
/* REO status address */
|
||||||
.hal_reo_status_ring_base_lsb = 0x0000055c,
|
.hal_reo_status_ring_base_lsb = 0x0000055c,
|
||||||
.hal_reo_status_hp = 0x00003078,
|
.hal_reo_status_hp = 0x00003078,
|
||||||
|
|
||||||
|
/* SW2REO ring address */
|
||||||
|
.hal_sw2reo_ring_base_lsb = 0x000001ec,
|
||||||
|
.hal_sw2reo_ring_hp = 0x00003028,
|
||||||
|
|
||||||
/* WCSS relative address */
|
/* WCSS relative address */
|
||||||
.hal_seq_wcss_umac_ce0_src_reg = 0x1b80000,
|
.hal_seq_wcss_umac_ce0_src_reg = 0x1b80000,
|
||||||
.hal_seq_wcss_umac_ce0_dst_reg = 0x1b81000,
|
.hal_seq_wcss_umac_ce0_dst_reg = 0x1b81000,
|
||||||
@ -2145,6 +2226,91 @@ const struct ath11k_hw_regs wcn6855_regs = {
|
|||||||
/* PCIe base address */
|
/* PCIe base address */
|
||||||
.pcie_qserdes_sysclk_en_sel = 0x01e0c0ac,
|
.pcie_qserdes_sysclk_en_sel = 0x01e0c0ac,
|
||||||
.pcie_pcs_osc_dtct_config_base = 0x01e0c628,
|
.pcie_pcs_osc_dtct_config_base = 0x01e0c628,
|
||||||
|
|
||||||
|
/* Shadow register area */
|
||||||
|
.hal_shadow_base_addr = 0x000008fc,
|
||||||
|
};
|
||||||
|
|
||||||
|
const struct ath11k_hw_regs wcn6750_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,
|
||||||
|
|
||||||
|
/* 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,
|
||||||
|
|
||||||
|
/* SW2REO ring address */
|
||||||
|
.hal_sw2reo_ring_base_lsb = 0x0000013c,
|
||||||
|
.hal_sw2reo_ring_hp = 0x00003018,
|
||||||
|
|
||||||
|
/* WCSS relative address */
|
||||||
|
.hal_seq_wcss_umac_ce0_src_reg = 0x01b80000,
|
||||||
|
.hal_seq_wcss_umac_ce0_dst_reg = 0x01b81000,
|
||||||
|
.hal_seq_wcss_umac_ce1_src_reg = 0x01b82000,
|
||||||
|
.hal_seq_wcss_umac_ce1_dst_reg = 0x01b83000,
|
||||||
|
|
||||||
|
/* 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,
|
||||||
|
|
||||||
|
/* PCIe base address */
|
||||||
|
.pcie_qserdes_sysclk_en_sel = 0x0,
|
||||||
|
.pcie_pcs_osc_dtct_config_base = 0x0,
|
||||||
|
|
||||||
|
/* Shadow register area */
|
||||||
|
.hal_shadow_base_addr = 0x00000504,
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct ath11k_hw_hal_params ath11k_hw_hal_params_ipq8074 = {
|
const struct ath11k_hw_hal_params ath11k_hw_hal_params_ipq8074 = {
|
||||||
@ -2154,3 +2320,23 @@ const struct ath11k_hw_hal_params ath11k_hw_hal_params_ipq8074 = {
|
|||||||
const struct ath11k_hw_hal_params ath11k_hw_hal_params_qca6390 = {
|
const struct ath11k_hw_hal_params ath11k_hw_hal_params_qca6390 = {
|
||||||
.rx_buf_rbm = HAL_RX_BUF_RBM_SW1_BM,
|
.rx_buf_rbm = HAL_RX_BUF_RBM_SW1_BM,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct cfg80211_sar_freq_ranges ath11k_hw_sar_freq_ranges_wcn6855[] = {
|
||||||
|
{.start_freq = 2402, .end_freq = 2482 }, /* 2G ch1~ch13 */
|
||||||
|
{.start_freq = 5150, .end_freq = 5250 }, /* 5G UNII-1 ch32~ch48 */
|
||||||
|
{.start_freq = 5250, .end_freq = 5725 }, /* 5G UNII-2 ch50~ch144 */
|
||||||
|
{.start_freq = 5725, .end_freq = 5810 }, /* 5G UNII-3 ch149~ch161 */
|
||||||
|
{.start_freq = 5815, .end_freq = 5895 }, /* 5G UNII-4 ch163~ch177 */
|
||||||
|
{.start_freq = 5925, .end_freq = 6165 }, /* 6G UNII-5 Ch1, Ch2 ~ Ch41 */
|
||||||
|
{.start_freq = 6165, .end_freq = 6425 }, /* 6G UNII-5 ch45~ch93 */
|
||||||
|
{.start_freq = 6425, .end_freq = 6525 }, /* 6G UNII-6 ch97~ch113 */
|
||||||
|
{.start_freq = 6525, .end_freq = 6705 }, /* 6G UNII-7 ch117~ch149 */
|
||||||
|
{.start_freq = 6705, .end_freq = 6875 }, /* 6G UNII-7 ch153~ch185 */
|
||||||
|
{.start_freq = 6875, .end_freq = 7125 }, /* 6G UNII-8 ch189~ch233 */
|
||||||
|
};
|
||||||
|
|
||||||
|
const struct cfg80211_sar_capa ath11k_hw_sar_capa_wcn6855 = {
|
||||||
|
.type = NL80211_SAR_TYPE_POWER,
|
||||||
|
.num_freq_ranges = (ARRAY_SIZE(ath11k_hw_sar_freq_ranges_wcn6855)),
|
||||||
|
.freq_ranges = ath11k_hw_sar_freq_ranges_wcn6855,
|
||||||
|
};
|
||||||
|
@ -195,6 +195,15 @@ struct ath11k_hw_params {
|
|||||||
bool current_cc_support;
|
bool current_cc_support;
|
||||||
bool dbr_debug_support;
|
bool dbr_debug_support;
|
||||||
bool global_reset;
|
bool global_reset;
|
||||||
|
const struct cfg80211_sar_capa *bios_sar_capa;
|
||||||
|
bool m3_fw_support;
|
||||||
|
bool fixed_bdf_addr;
|
||||||
|
bool fixed_mem_region;
|
||||||
|
bool static_window_map;
|
||||||
|
bool hybrid_bus_type;
|
||||||
|
u8 dp_window_idx;
|
||||||
|
u8 ce_window_idx;
|
||||||
|
bool fixed_fw_mem;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ath11k_hw_ops {
|
struct ath11k_hw_ops {
|
||||||
@ -244,6 +253,7 @@ extern const struct ath11k_hw_ops ipq6018_ops;
|
|||||||
extern const struct ath11k_hw_ops qca6390_ops;
|
extern const struct ath11k_hw_ops qca6390_ops;
|
||||||
extern const struct ath11k_hw_ops qcn9074_ops;
|
extern const struct ath11k_hw_ops qcn9074_ops;
|
||||||
extern const struct ath11k_hw_ops wcn6855_ops;
|
extern const struct ath11k_hw_ops wcn6855_ops;
|
||||||
|
extern const struct ath11k_hw_ops wcn6750_ops;
|
||||||
|
|
||||||
extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_ipq8074;
|
extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_ipq8074;
|
||||||
extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_qca6390;
|
extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_qca6390;
|
||||||
@ -346,6 +356,12 @@ struct ath11k_hw_regs {
|
|||||||
u32 hal_reo_status_ring_base_lsb;
|
u32 hal_reo_status_ring_base_lsb;
|
||||||
u32 hal_reo_status_hp;
|
u32 hal_reo_status_hp;
|
||||||
|
|
||||||
|
u32 hal_reo_cmd_ring_base_lsb;
|
||||||
|
u32 hal_reo_cmd_ring_hp;
|
||||||
|
|
||||||
|
u32 hal_sw2reo_ring_base_lsb;
|
||||||
|
u32 hal_sw2reo_ring_hp;
|
||||||
|
|
||||||
u32 hal_seq_wcss_umac_ce0_src_reg;
|
u32 hal_seq_wcss_umac_ce0_src_reg;
|
||||||
u32 hal_seq_wcss_umac_ce0_dst_reg;
|
u32 hal_seq_wcss_umac_ce0_dst_reg;
|
||||||
u32 hal_seq_wcss_umac_ce1_src_reg;
|
u32 hal_seq_wcss_umac_ce1_src_reg;
|
||||||
@ -361,12 +377,15 @@ struct ath11k_hw_regs {
|
|||||||
|
|
||||||
u32 pcie_qserdes_sysclk_en_sel;
|
u32 pcie_qserdes_sysclk_en_sel;
|
||||||
u32 pcie_pcs_osc_dtct_config_base;
|
u32 pcie_pcs_osc_dtct_config_base;
|
||||||
|
|
||||||
|
u32 hal_shadow_base_addr;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern const struct ath11k_hw_regs ipq8074_regs;
|
extern const struct ath11k_hw_regs ipq8074_regs;
|
||||||
extern const struct ath11k_hw_regs qca6390_regs;
|
extern const struct ath11k_hw_regs qca6390_regs;
|
||||||
extern const struct ath11k_hw_regs qcn9074_regs;
|
extern const struct ath11k_hw_regs qcn9074_regs;
|
||||||
extern const struct ath11k_hw_regs wcn6855_regs;
|
extern const struct ath11k_hw_regs wcn6855_regs;
|
||||||
|
extern const struct ath11k_hw_regs wcn6750_regs;
|
||||||
|
|
||||||
static inline const char *ath11k_bd_ie_type_str(enum ath11k_bd_ie_type type)
|
static inline const char *ath11k_bd_ie_type_str(enum ath11k_bd_ie_type type)
|
||||||
{
|
{
|
||||||
@ -380,4 +399,5 @@ static inline const char *ath11k_bd_ie_type_str(enum ath11k_bd_ie_type type)
|
|||||||
return "unknown";
|
return "unknown";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern const struct cfg80211_sar_capa ath11k_hw_sar_capa_wcn6855;
|
||||||
#endif
|
#endif
|
||||||
|
@ -5594,7 +5594,7 @@ static int ath11k_mac_mgmt_tx(struct ath11k *ar, struct sk_buff *skb,
|
|||||||
|
|
||||||
skb_queue_tail(q, skb);
|
skb_queue_tail(q, skb);
|
||||||
atomic_inc(&ar->num_pending_mgmt_tx);
|
atomic_inc(&ar->num_pending_mgmt_tx);
|
||||||
queue_work(ar->ab->workqueue, &ar->wmi_mgmt_tx_work);
|
queue_work(ar->ab->workqueue_aux, &ar->wmi_mgmt_tx_work);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -8147,6 +8147,7 @@ static void ath11k_mac_op_sta_statistics(struct ieee80211_hw *hw,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if IS_ENABLED(CONFIG_IPV6)
|
||||||
static void ath11k_generate_ns_mc_addr(struct ath11k *ar,
|
static void ath11k_generate_ns_mc_addr(struct ath11k *ar,
|
||||||
struct ath11k_arp_ns_offload *offload)
|
struct ath11k_arp_ns_offload *offload)
|
||||||
{
|
{
|
||||||
@ -8241,6 +8242,7 @@ generate:
|
|||||||
/* generate ns multicast address */
|
/* generate ns multicast address */
|
||||||
ath11k_generate_ns_mc_addr(ar, offload);
|
ath11k_generate_ns_mc_addr(ar, offload);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void ath11k_mac_op_set_rekey_data(struct ieee80211_hw *hw,
|
static void ath11k_mac_op_set_rekey_data(struct ieee80211_hw *hw,
|
||||||
struct ieee80211_vif *vif,
|
struct ieee80211_vif *vif,
|
||||||
@ -8275,6 +8277,68 @@ static void ath11k_mac_op_set_rekey_data(struct ieee80211_hw *hw,
|
|||||||
mutex_unlock(&ar->conf_mutex);
|
mutex_unlock(&ar->conf_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ath11k_mac_op_set_bios_sar_specs(struct ieee80211_hw *hw,
|
||||||
|
const struct cfg80211_sar_specs *sar)
|
||||||
|
{
|
||||||
|
struct ath11k *ar = hw->priv;
|
||||||
|
const struct cfg80211_sar_sub_specs *sspec = sar->sub_specs;
|
||||||
|
int ret, index;
|
||||||
|
u8 *sar_tbl;
|
||||||
|
u32 i;
|
||||||
|
|
||||||
|
mutex_lock(&ar->conf_mutex);
|
||||||
|
|
||||||
|
if (!test_bit(WMI_TLV_SERVICE_BIOS_SAR_SUPPORT, ar->ab->wmi_ab.svc_map) ||
|
||||||
|
!ar->ab->hw_params.bios_sar_capa) {
|
||||||
|
ret = -EOPNOTSUPP;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!sar || sar->type != NL80211_SAR_TYPE_POWER ||
|
||||||
|
sar->num_sub_specs == 0) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = ath11k_wmi_pdev_set_bios_geo_table_param(ar);
|
||||||
|
if (ret) {
|
||||||
|
ath11k_warn(ar->ab, "failed to set geo table: %d\n", ret);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
sar_tbl = kzalloc(BIOS_SAR_TABLE_LEN, GFP_KERNEL);
|
||||||
|
if (!sar_tbl) {
|
||||||
|
ret = -ENOMEM;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < sar->num_sub_specs; i++) {
|
||||||
|
if (sspec->freq_range_index >= (BIOS_SAR_TABLE_LEN >> 1)) {
|
||||||
|
ath11k_warn(ar->ab, "Ignore bad frequency index %u, max allowed %u\n",
|
||||||
|
sspec->freq_range_index, BIOS_SAR_TABLE_LEN >> 1);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* chain0 and chain1 share same power setting */
|
||||||
|
sar_tbl[sspec->freq_range_index] = sspec->power;
|
||||||
|
index = sspec->freq_range_index + (BIOS_SAR_TABLE_LEN >> 1);
|
||||||
|
sar_tbl[index] = sspec->power;
|
||||||
|
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "sar tbl[%d] = %d\n",
|
||||||
|
sspec->freq_range_index, sar_tbl[sspec->freq_range_index]);
|
||||||
|
sspec++;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = ath11k_wmi_pdev_set_bios_sar_table_param(ar, sar_tbl);
|
||||||
|
if (ret)
|
||||||
|
ath11k_warn(ar->ab, "failed to set sar power: %d", ret);
|
||||||
|
|
||||||
|
kfree(sar_tbl);
|
||||||
|
exit:
|
||||||
|
mutex_unlock(&ar->conf_mutex);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct ieee80211_ops ath11k_ops = {
|
static const struct ieee80211_ops ath11k_ops = {
|
||||||
.tx = ath11k_mac_op_tx,
|
.tx = ath11k_mac_op_tx,
|
||||||
.start = ath11k_mac_op_start,
|
.start = ath11k_mac_op_start,
|
||||||
@ -8326,6 +8390,7 @@ static const struct ieee80211_ops ath11k_ops = {
|
|||||||
.ipv6_addr_change = ath11k_mac_op_ipv6_changed,
|
.ipv6_addr_change = ath11k_mac_op_ipv6_changed,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
.set_sar_specs = ath11k_mac_op_set_bios_sar_specs,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void ath11k_mac_update_ch_list(struct ath11k *ar,
|
static void ath11k_mac_update_ch_list(struct ath11k *ar,
|
||||||
@ -8751,6 +8816,10 @@ static int __ath11k_mac_register(struct ath11k *ar)
|
|||||||
ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
|
ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (test_bit(WMI_TLV_SERVICE_BIOS_SAR_SUPPORT, ar->ab->wmi_ab.svc_map) &&
|
||||||
|
ab->hw_params.bios_sar_capa)
|
||||||
|
ar->hw->wiphy->sar_capa = ab->hw_params.bios_sar_capa;
|
||||||
|
|
||||||
ret = ieee80211_register_hw(ar->hw);
|
ret = ieee80211_register_hw(ar->hw);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ath11k_err(ar->ab, "ieee80211 registration failed: %d\n", ret);
|
ath11k_err(ar->ab, "ieee80211 registration failed: %d\n", ret);
|
||||||
@ -8772,6 +8841,17 @@ static int __ath11k_mac_register(struct ath11k *ar)
|
|||||||
goto err_unregister_hw;
|
goto err_unregister_hw;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ab->hw_params.current_cc_support && ab->new_alpha2[0]) {
|
||||||
|
struct wmi_set_current_country_params set_current_param = {};
|
||||||
|
|
||||||
|
memcpy(&set_current_param.alpha2, ab->new_alpha2, 2);
|
||||||
|
memcpy(&ar->alpha2, ab->new_alpha2, 2);
|
||||||
|
ret = ath11k_wmi_send_set_current_country_cmd(ar, &set_current_param);
|
||||||
|
if (ret)
|
||||||
|
ath11k_warn(ar->ab,
|
||||||
|
"failed set cc code for mac register: %d\n", ret);
|
||||||
|
}
|
||||||
|
|
||||||
ret = ath11k_debugfs_register(ar);
|
ret = ath11k_debugfs_register(ar);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ath11k_err(ar->ab, "debugfs registration failed: %d\n", ret);
|
ath11k_err(ar->ab, "debugfs registration failed: %d\n", ret);
|
||||||
|
@ -115,13 +115,6 @@ static const struct ath11k_pci_ops ath11k_pci_ops_qcn9074 = {
|
|||||||
.window_read32 = ath11k_pci_window_read32,
|
.window_read32 = ath11k_pci_window_read32,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct ath11k_bus_params ath11k_pci_bus_params = {
|
|
||||||
.mhi_support = true,
|
|
||||||
.m3_fw_support = true,
|
|
||||||
.fixed_bdf_addr = false,
|
|
||||||
.fixed_mem_region = false,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct ath11k_msi_config msi_config_one_msi = {
|
static const struct ath11k_msi_config msi_config_one_msi = {
|
||||||
.total_vectors = 1,
|
.total_vectors = 1,
|
||||||
.total_users = 4,
|
.total_users = 4,
|
||||||
@ -593,7 +586,7 @@ static int ath11k_pci_power_up(struct ath11k_base *ab)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ab->bus_params.static_window_map)
|
if (ab->hw_params.static_window_map)
|
||||||
ath11k_pci_select_static_window(ab_pci);
|
ath11k_pci_select_static_window(ab_pci);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -706,8 +699,8 @@ static int ath11k_pci_probe(struct pci_dev *pdev,
|
|||||||
u32 soc_hw_version_major, soc_hw_version_minor, addr;
|
u32 soc_hw_version_major, soc_hw_version_minor, addr;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ab = ath11k_core_alloc(&pdev->dev, sizeof(*ab_pci), ATH11K_BUS_PCI,
|
ab = ath11k_core_alloc(&pdev->dev, sizeof(*ab_pci), ATH11K_BUS_PCI);
|
||||||
&ath11k_pci_bus_params);
|
|
||||||
if (!ab) {
|
if (!ab) {
|
||||||
dev_err(&pdev->dev, "failed to allocate ath11k base\n");
|
dev_err(&pdev->dev, "failed to allocate ath11k base\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
@ -764,7 +757,6 @@ static int ath11k_pci_probe(struct pci_dev *pdev,
|
|||||||
ab->pci.ops = &ath11k_pci_ops_qca6390;
|
ab->pci.ops = &ath11k_pci_ops_qca6390;
|
||||||
break;
|
break;
|
||||||
case QCN9074_DEVICE_ID:
|
case QCN9074_DEVICE_ID:
|
||||||
ab->bus_params.static_window_map = true;
|
|
||||||
ab->pci.ops = &ath11k_pci_ops_qcn9074;
|
ab->pci.ops = &ath11k_pci_ops_qcn9074;
|
||||||
ab->hw_rev = ATH11K_HW_QCN9074_HW10;
|
ab->hw_rev = ATH11K_HW_QCN9074_HW10;
|
||||||
break;
|
break;
|
||||||
|
@ -106,6 +106,15 @@ static const struct ath11k_msi_config ath11k_msi_config[] = {
|
|||||||
},
|
},
|
||||||
.hw_rev = ATH11K_HW_WCN6855_HW21,
|
.hw_rev = ATH11K_HW_WCN6855_HW21,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.total_vectors = 28,
|
||||||
|
.total_users = 2,
|
||||||
|
.users = (struct ath11k_msi_user[]) {
|
||||||
|
{ .name = "CE", .num_vectors = 10, .base_vector = 0 },
|
||||||
|
{ .name = "DP", .num_vectors = 18, .base_vector = 10 },
|
||||||
|
},
|
||||||
|
.hw_rev = ATH11K_HW_WCN6750_HW10,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
int ath11k_pcic_init_msi_config(struct ath11k_base *ab)
|
int ath11k_pcic_init_msi_config(struct ath11k_base *ab)
|
||||||
@ -134,16 +143,13 @@ EXPORT_SYMBOL(ath11k_pcic_init_msi_config);
|
|||||||
static inline u32 ath11k_pcic_get_window_start(struct ath11k_base *ab,
|
static inline u32 ath11k_pcic_get_window_start(struct ath11k_base *ab,
|
||||||
u32 offset)
|
u32 offset)
|
||||||
{
|
{
|
||||||
u32 window_start;
|
u32 window_start = 0;
|
||||||
|
|
||||||
/* If offset lies within DP register range, use 3rd window */
|
|
||||||
if ((offset ^ HAL_SEQ_WCSS_UMAC_OFFSET) < ATH11K_PCI_WINDOW_RANGE_MASK)
|
if ((offset ^ HAL_SEQ_WCSS_UMAC_OFFSET) < ATH11K_PCI_WINDOW_RANGE_MASK)
|
||||||
window_start = 3 * ATH11K_PCI_WINDOW_START;
|
window_start = ab->hw_params.dp_window_idx * ATH11K_PCI_WINDOW_START;
|
||||||
/* If offset lies within CE register range, use 2nd window */
|
else if ((offset ^ HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab)) <
|
||||||
else if ((offset ^ HAL_CE_WFSS_CE_REG_BASE) < ATH11K_PCI_WINDOW_RANGE_MASK)
|
ATH11K_PCI_WINDOW_RANGE_MASK)
|
||||||
window_start = 2 * ATH11K_PCI_WINDOW_START;
|
window_start = ab->hw_params.ce_window_idx * ATH11K_PCI_WINDOW_START;
|
||||||
else
|
|
||||||
window_start = ATH11K_PCI_WINDOW_START;
|
|
||||||
|
|
||||||
return window_start;
|
return window_start;
|
||||||
}
|
}
|
||||||
@ -162,19 +168,12 @@ void ath11k_pcic_write32(struct ath11k_base *ab, u32 offset, u32 value)
|
|||||||
|
|
||||||
if (offset < ATH11K_PCI_WINDOW_START) {
|
if (offset < ATH11K_PCI_WINDOW_START) {
|
||||||
iowrite32(value, ab->mem + offset);
|
iowrite32(value, ab->mem + offset);
|
||||||
} else {
|
} else if (ab->hw_params.static_window_map) {
|
||||||
if (ab->bus_params.static_window_map)
|
|
||||||
window_start = ath11k_pcic_get_window_start(ab, offset);
|
window_start = ath11k_pcic_get_window_start(ab, offset);
|
||||||
else
|
|
||||||
window_start = ATH11K_PCI_WINDOW_START;
|
|
||||||
|
|
||||||
if (window_start == ATH11K_PCI_WINDOW_START &&
|
|
||||||
ab->pci.ops->window_write32) {
|
|
||||||
ab->pci.ops->window_write32(ab, offset, value);
|
|
||||||
} else {
|
|
||||||
iowrite32(value, ab->mem + window_start +
|
iowrite32(value, ab->mem + window_start +
|
||||||
(offset & ATH11K_PCI_WINDOW_RANGE_MASK));
|
(offset & ATH11K_PCI_WINDOW_RANGE_MASK));
|
||||||
}
|
} else if (ab->pci.ops->window_write32) {
|
||||||
|
ab->pci.ops->window_write32(ab, offset, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (test_bit(ATH11K_FLAG_DEVICE_INIT_DONE, &ab->dev_flags) &&
|
if (test_bit(ATH11K_FLAG_DEVICE_INIT_DONE, &ab->dev_flags) &&
|
||||||
@ -182,10 +181,12 @@ void ath11k_pcic_write32(struct ath11k_base *ab, u32 offset, u32 value)
|
|||||||
!ret)
|
!ret)
|
||||||
ab->pci.ops->release(ab);
|
ab->pci.ops->release(ab);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(ath11k_pcic_write32);
|
||||||
|
|
||||||
u32 ath11k_pcic_read32(struct ath11k_base *ab, u32 offset)
|
u32 ath11k_pcic_read32(struct ath11k_base *ab, u32 offset)
|
||||||
{
|
{
|
||||||
u32 val, window_start;
|
u32 val = 0;
|
||||||
|
u32 window_start;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
/* for offset beyond BAR + 4K - 32, may
|
/* for offset beyond BAR + 4K - 32, may
|
||||||
@ -197,19 +198,12 @@ u32 ath11k_pcic_read32(struct ath11k_base *ab, u32 offset)
|
|||||||
|
|
||||||
if (offset < ATH11K_PCI_WINDOW_START) {
|
if (offset < ATH11K_PCI_WINDOW_START) {
|
||||||
val = ioread32(ab->mem + offset);
|
val = ioread32(ab->mem + offset);
|
||||||
} else {
|
} else if (ab->hw_params.static_window_map) {
|
||||||
if (ab->bus_params.static_window_map)
|
|
||||||
window_start = ath11k_pcic_get_window_start(ab, offset);
|
window_start = ath11k_pcic_get_window_start(ab, offset);
|
||||||
else
|
|
||||||
window_start = ATH11K_PCI_WINDOW_START;
|
|
||||||
|
|
||||||
if (window_start == ATH11K_PCI_WINDOW_START &&
|
|
||||||
ab->pci.ops->window_read32) {
|
|
||||||
val = ab->pci.ops->window_read32(ab, offset);
|
|
||||||
} else {
|
|
||||||
val = ioread32(ab->mem + window_start +
|
val = ioread32(ab->mem + window_start +
|
||||||
(offset & ATH11K_PCI_WINDOW_RANGE_MASK));
|
(offset & ATH11K_PCI_WINDOW_RANGE_MASK));
|
||||||
}
|
} else if (ab->pci.ops->window_read32) {
|
||||||
|
val = ab->pci.ops->window_read32(ab, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (test_bit(ATH11K_FLAG_DEVICE_INIT_DONE, &ab->dev_flags) &&
|
if (test_bit(ATH11K_FLAG_DEVICE_INIT_DONE, &ab->dev_flags) &&
|
||||||
@ -219,6 +213,7 @@ u32 ath11k_pcic_read32(struct ath11k_base *ab, u32 offset)
|
|||||||
|
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(ath11k_pcic_read32);
|
||||||
|
|
||||||
void ath11k_pcic_get_msi_address(struct ath11k_base *ab, u32 *msi_addr_lo,
|
void ath11k_pcic_get_msi_address(struct ath11k_base *ab, u32 *msi_addr_lo,
|
||||||
u32 *msi_addr_hi)
|
u32 *msi_addr_hi)
|
||||||
@ -226,6 +221,7 @@ void ath11k_pcic_get_msi_address(struct ath11k_base *ab, u32 *msi_addr_lo,
|
|||||||
*msi_addr_lo = ab->pci.msi.addr_lo;
|
*msi_addr_lo = ab->pci.msi.addr_lo;
|
||||||
*msi_addr_hi = ab->pci.msi.addr_hi;
|
*msi_addr_hi = ab->pci.msi.addr_hi;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(ath11k_pcic_get_msi_address);
|
||||||
|
|
||||||
int ath11k_pcic_get_user_msi_assignment(struct ath11k_base *ab, char *user_name,
|
int ath11k_pcic_get_user_msi_assignment(struct ath11k_base *ab, char *user_name,
|
||||||
int *num_vectors, u32 *user_base_data,
|
int *num_vectors, u32 *user_base_data,
|
||||||
@ -253,6 +249,7 @@ int ath11k_pcic_get_user_msi_assignment(struct ath11k_base *ab, char *user_name,
|
|||||||
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(ath11k_pcic_get_user_msi_assignment);
|
||||||
|
|
||||||
void ath11k_pcic_get_ce_msi_idx(struct ath11k_base *ab, u32 ce_id, u32 *msi_idx)
|
void ath11k_pcic_get_ce_msi_idx(struct ath11k_base *ab, u32 ce_id, u32 *msi_idx)
|
||||||
{
|
{
|
||||||
@ -269,6 +266,7 @@ void ath11k_pcic_get_ce_msi_idx(struct ath11k_base *ab, u32 ce_id, u32 *msi_idx)
|
|||||||
}
|
}
|
||||||
*msi_idx = msi_data_idx;
|
*msi_idx = msi_data_idx;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(ath11k_pcic_get_ce_msi_idx);
|
||||||
|
|
||||||
static void ath11k_pcic_free_ext_irq(struct ath11k_base *ab)
|
static void ath11k_pcic_free_ext_irq(struct ath11k_base *ab)
|
||||||
{
|
{
|
||||||
@ -297,6 +295,7 @@ void ath11k_pcic_free_irq(struct ath11k_base *ab)
|
|||||||
|
|
||||||
ath11k_pcic_free_ext_irq(ab);
|
ath11k_pcic_free_ext_irq(ab);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(ath11k_pcic_free_irq);
|
||||||
|
|
||||||
static void ath11k_pcic_ce_irq_enable(struct ath11k_base *ab, u16 ce_id)
|
static void ath11k_pcic_ce_irq_enable(struct ath11k_base *ab, u16 ce_id)
|
||||||
{
|
{
|
||||||
@ -447,6 +446,7 @@ void ath11k_pcic_ext_irq_enable(struct ath11k_base *ab)
|
|||||||
ath11k_pcic_ext_grp_enable(irq_grp);
|
ath11k_pcic_ext_grp_enable(irq_grp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(ath11k_pcic_ext_irq_enable);
|
||||||
|
|
||||||
static void ath11k_pcic_sync_ext_irqs(struct ath11k_base *ab)
|
static void ath11k_pcic_sync_ext_irqs(struct ath11k_base *ab)
|
||||||
{
|
{
|
||||||
@ -467,6 +467,7 @@ void ath11k_pcic_ext_irq_disable(struct ath11k_base *ab)
|
|||||||
__ath11k_pcic_ext_irq_disable(ab);
|
__ath11k_pcic_ext_irq_disable(ab);
|
||||||
ath11k_pcic_sync_ext_irqs(ab);
|
ath11k_pcic_sync_ext_irqs(ab);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(ath11k_pcic_ext_irq_disable);
|
||||||
|
|
||||||
static int ath11k_pcic_ext_grp_napi_poll(struct napi_struct *napi, int budget)
|
static int ath11k_pcic_ext_grp_napi_poll(struct napi_struct *napi, int budget)
|
||||||
{
|
{
|
||||||
@ -646,6 +647,7 @@ int ath11k_pcic_config_irq(struct ath11k_base *ab)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(ath11k_pcic_config_irq);
|
||||||
|
|
||||||
void ath11k_pcic_ce_irqs_enable(struct ath11k_base *ab)
|
void ath11k_pcic_ce_irqs_enable(struct ath11k_base *ab)
|
||||||
{
|
{
|
||||||
@ -659,6 +661,7 @@ void ath11k_pcic_ce_irqs_enable(struct ath11k_base *ab)
|
|||||||
ath11k_pcic_ce_irq_enable(ab, i);
|
ath11k_pcic_ce_irq_enable(ab, i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(ath11k_pcic_ce_irqs_enable);
|
||||||
|
|
||||||
static void ath11k_pcic_kill_tasklets(struct ath11k_base *ab)
|
static void ath11k_pcic_kill_tasklets(struct ath11k_base *ab)
|
||||||
{
|
{
|
||||||
@ -680,12 +683,14 @@ void ath11k_pcic_ce_irq_disable_sync(struct ath11k_base *ab)
|
|||||||
ath11k_pcic_sync_ce_irqs(ab);
|
ath11k_pcic_sync_ce_irqs(ab);
|
||||||
ath11k_pcic_kill_tasklets(ab);
|
ath11k_pcic_kill_tasklets(ab);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(ath11k_pcic_ce_irq_disable_sync);
|
||||||
|
|
||||||
void ath11k_pcic_stop(struct ath11k_base *ab)
|
void ath11k_pcic_stop(struct ath11k_base *ab)
|
||||||
{
|
{
|
||||||
ath11k_pcic_ce_irq_disable_sync(ab);
|
ath11k_pcic_ce_irq_disable_sync(ab);
|
||||||
ath11k_ce_cleanup_pipes(ab);
|
ath11k_ce_cleanup_pipes(ab);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(ath11k_pcic_stop);
|
||||||
|
|
||||||
int ath11k_pcic_start(struct ath11k_base *ab)
|
int ath11k_pcic_start(struct ath11k_base *ab)
|
||||||
{
|
{
|
||||||
@ -696,6 +701,7 @@ int ath11k_pcic_start(struct ath11k_base *ab)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(ath11k_pcic_start);
|
||||||
|
|
||||||
int ath11k_pcic_map_service_to_pipe(struct ath11k_base *ab, u16 service_id,
|
int ath11k_pcic_map_service_to_pipe(struct ath11k_base *ab, u16 service_id,
|
||||||
u8 *ul_pipe, u8 *dl_pipe)
|
u8 *ul_pipe, u8 *dl_pipe)
|
||||||
@ -739,3 +745,4 @@ int ath11k_pcic_map_service_to_pipe(struct ath11k_base *ab, u16 service_id,
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(ath11k_pcic_map_service_to_pipe);
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/elf.h>
|
#include <linux/elf.h>
|
||||||
@ -12,6 +13,8 @@
|
|||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
#include <linux/ioport.h>
|
#include <linux/ioport.h>
|
||||||
#include <linux/firmware.h>
|
#include <linux/firmware.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
|
#include <linux/of_irq.h>
|
||||||
|
|
||||||
#define SLEEP_CLOCK_SELECT_INTERNAL_BIT 0x02
|
#define SLEEP_CLOCK_SELECT_INTERNAL_BIT 0x02
|
||||||
#define HOST_CSTATE_BIT 0x04
|
#define HOST_CSTATE_BIT 0x04
|
||||||
@ -748,6 +751,68 @@ static struct qmi_elem_info qmi_wlanfw_cap_req_msg_v01_ei[] = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct qmi_elem_info qmi_wlanfw_device_info_req_msg_v01_ei[] = {
|
||||||
|
{
|
||||||
|
.data_type = QMI_EOTI,
|
||||||
|
.array_type = NO_ARRAY,
|
||||||
|
.tlv_type = QMI_COMMON_TLV_TYPE,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct qmi_elem_info qmi_wlfw_device_info_resp_msg_v01_ei[] = {
|
||||||
|
{
|
||||||
|
.data_type = QMI_STRUCT,
|
||||||
|
.elem_len = 1,
|
||||||
|
.elem_size = sizeof(struct qmi_response_type_v01),
|
||||||
|
.array_type = NO_ARRAY,
|
||||||
|
.tlv_type = 0x02,
|
||||||
|
.offset = offsetof(struct qmi_wlanfw_device_info_resp_msg_v01,
|
||||||
|
resp),
|
||||||
|
.ei_array = qmi_response_type_v01_ei,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.data_type = QMI_OPT_FLAG,
|
||||||
|
.elem_len = 1,
|
||||||
|
.elem_size = sizeof(u8),
|
||||||
|
.array_type = NO_ARRAY,
|
||||||
|
.tlv_type = 0x10,
|
||||||
|
.offset = offsetof(struct qmi_wlanfw_device_info_resp_msg_v01,
|
||||||
|
bar_addr_valid),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.data_type = QMI_UNSIGNED_8_BYTE,
|
||||||
|
.elem_len = 1,
|
||||||
|
.elem_size = sizeof(u64),
|
||||||
|
.array_type = NO_ARRAY,
|
||||||
|
.tlv_type = 0x10,
|
||||||
|
.offset = offsetof(struct qmi_wlanfw_device_info_resp_msg_v01,
|
||||||
|
bar_addr),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.data_type = QMI_OPT_FLAG,
|
||||||
|
.elem_len = 1,
|
||||||
|
.elem_size = sizeof(u8),
|
||||||
|
.array_type = NO_ARRAY,
|
||||||
|
.tlv_type = 0x11,
|
||||||
|
.offset = offsetof(struct qmi_wlanfw_device_info_resp_msg_v01,
|
||||||
|
bar_size_valid),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.data_type = QMI_UNSIGNED_4_BYTE,
|
||||||
|
.elem_len = 1,
|
||||||
|
.elem_size = sizeof(u32),
|
||||||
|
.array_type = NO_ARRAY,
|
||||||
|
.tlv_type = 0x11,
|
||||||
|
.offset = offsetof(struct qmi_wlanfw_device_info_resp_msg_v01,
|
||||||
|
bar_size),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.data_type = QMI_EOTI,
|
||||||
|
.array_type = NO_ARRAY,
|
||||||
|
.tlv_type = QMI_COMMON_TLV_TYPE,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct qmi_elem_info qmi_wlanfw_rf_chip_info_s_v01_ei[] = {
|
static struct qmi_elem_info qmi_wlanfw_rf_chip_info_s_v01_ei[] = {
|
||||||
{
|
{
|
||||||
.data_type = QMI_UNSIGNED_4_BYTE,
|
.data_type = QMI_UNSIGNED_4_BYTE,
|
||||||
@ -1648,7 +1713,7 @@ static int ath11k_qmi_host_cap_send(struct ath11k_base *ab)
|
|||||||
req.bdf_support_valid = 1;
|
req.bdf_support_valid = 1;
|
||||||
req.bdf_support = 1;
|
req.bdf_support = 1;
|
||||||
|
|
||||||
if (ab->bus_params.m3_fw_support) {
|
if (ab->hw_params.m3_fw_support) {
|
||||||
req.m3_support_valid = 1;
|
req.m3_support_valid = 1;
|
||||||
req.m3_support = 1;
|
req.m3_support = 1;
|
||||||
req.m3_cache_support_valid = 1;
|
req.m3_cache_support_valid = 1;
|
||||||
@ -1734,10 +1799,6 @@ static int ath11k_qmi_fw_ind_register_send(struct ath11k_base *ab)
|
|||||||
req->client_id = QMI_WLANFW_CLIENT_ID;
|
req->client_id = QMI_WLANFW_CLIENT_ID;
|
||||||
req->fw_ready_enable_valid = 1;
|
req->fw_ready_enable_valid = 1;
|
||||||
req->fw_ready_enable = 1;
|
req->fw_ready_enable = 1;
|
||||||
req->request_mem_enable_valid = 1;
|
|
||||||
req->request_mem_enable = 1;
|
|
||||||
req->fw_mem_ready_enable_valid = 1;
|
|
||||||
req->fw_mem_ready_enable = 1;
|
|
||||||
req->cal_done_enable_valid = 1;
|
req->cal_done_enable_valid = 1;
|
||||||
req->cal_done_enable = 1;
|
req->cal_done_enable = 1;
|
||||||
req->fw_init_done_enable_valid = 1;
|
req->fw_init_done_enable_valid = 1;
|
||||||
@ -1746,6 +1807,17 @@ static int ath11k_qmi_fw_ind_register_send(struct ath11k_base *ab)
|
|||||||
req->pin_connect_result_enable_valid = 0;
|
req->pin_connect_result_enable_valid = 0;
|
||||||
req->pin_connect_result_enable = 0;
|
req->pin_connect_result_enable = 0;
|
||||||
|
|
||||||
|
/* WCN6750 doesn't request for DDR memory via QMI,
|
||||||
|
* instead it uses a fixed 12MB reserved memory
|
||||||
|
* region in DDR.
|
||||||
|
*/
|
||||||
|
if (!ab->hw_params.fixed_fw_mem) {
|
||||||
|
req->request_mem_enable_valid = 1;
|
||||||
|
req->request_mem_enable = 1;
|
||||||
|
req->fw_mem_ready_enable_valid = 1;
|
||||||
|
req->fw_mem_ready_enable = 1;
|
||||||
|
}
|
||||||
|
|
||||||
ret = qmi_txn_init(handle, &txn,
|
ret = qmi_txn_init(handle, &txn,
|
||||||
qmi_wlanfw_ind_register_resp_msg_v01_ei, resp);
|
qmi_wlanfw_ind_register_resp_msg_v01_ei, resp);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@ -1803,7 +1875,7 @@ static int ath11k_qmi_respond_fw_mem_request(struct ath11k_base *ab)
|
|||||||
* failure to FW and FW will then request mulitple blocks of small
|
* failure to FW and FW will then request mulitple blocks of small
|
||||||
* chunk size memory.
|
* chunk size memory.
|
||||||
*/
|
*/
|
||||||
if (!(ab->bus_params.fixed_mem_region ||
|
if (!(ab->hw_params.fixed_mem_region ||
|
||||||
test_bit(ATH11K_FLAG_FIXED_MEM_RGN, &ab->dev_flags)) &&
|
test_bit(ATH11K_FLAG_FIXED_MEM_RGN, &ab->dev_flags)) &&
|
||||||
ab->qmi.target_mem_delayed) {
|
ab->qmi.target_mem_delayed) {
|
||||||
delayed = true;
|
delayed = true;
|
||||||
@ -1873,7 +1945,7 @@ static void ath11k_qmi_free_target_mem_chunk(struct ath11k_base *ab)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < ab->qmi.mem_seg_count; i++) {
|
for (i = 0; i < ab->qmi.mem_seg_count; i++) {
|
||||||
if ((ab->bus_params.fixed_mem_region ||
|
if ((ab->hw_params.fixed_mem_region ||
|
||||||
test_bit(ATH11K_FLAG_FIXED_MEM_RGN, &ab->dev_flags)) &&
|
test_bit(ATH11K_FLAG_FIXED_MEM_RGN, &ab->dev_flags)) &&
|
||||||
ab->qmi.target_mem[i].iaddr)
|
ab->qmi.target_mem[i].iaddr)
|
||||||
iounmap(ab->qmi.target_mem[i].iaddr);
|
iounmap(ab->qmi.target_mem[i].iaddr);
|
||||||
@ -2007,6 +2079,80 @@ static int ath11k_qmi_assign_target_mem_chunk(struct ath11k_base *ab)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ath11k_qmi_request_device_info(struct ath11k_base *ab)
|
||||||
|
{
|
||||||
|
struct qmi_wlanfw_device_info_req_msg_v01 req = {};
|
||||||
|
struct qmi_wlanfw_device_info_resp_msg_v01 resp = {};
|
||||||
|
struct qmi_txn txn;
|
||||||
|
void __iomem *bar_addr_va;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/* device info message req is only sent for hybrid bus devices */
|
||||||
|
if (!ab->hw_params.hybrid_bus_type)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
ret = qmi_txn_init(&ab->qmi.handle, &txn,
|
||||||
|
qmi_wlfw_device_info_resp_msg_v01_ei, &resp);
|
||||||
|
if (ret < 0)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
|
||||||
|
QMI_WLANFW_DEVICE_INFO_REQ_V01,
|
||||||
|
QMI_WLANFW_DEVICE_INFO_REQ_MSG_V01_MAX_LEN,
|
||||||
|
qmi_wlanfw_device_info_req_msg_v01_ei, &req);
|
||||||
|
if (ret < 0) {
|
||||||
|
qmi_txn_cancel(&txn);
|
||||||
|
ath11k_warn(ab, "failed to send qmi target device info request: %d\n",
|
||||||
|
ret);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
|
||||||
|
if (ret < 0) {
|
||||||
|
ath11k_warn(ab, "failed to wait qmi target device info request: %d\n",
|
||||||
|
ret);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
|
||||||
|
ath11k_warn(ab, "qmi device info request failed: %d %d\n",
|
||||||
|
resp.resp.result, resp.resp.error);
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!resp.bar_addr_valid || !resp.bar_size_valid) {
|
||||||
|
ath11k_warn(ab, "qmi device info response invalid: %d %d\n",
|
||||||
|
resp.resp.result, resp.resp.error);
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!resp.bar_addr ||
|
||||||
|
resp.bar_size != ATH11K_QMI_DEVICE_BAR_SIZE) {
|
||||||
|
ath11k_warn(ab, "qmi device info invalid address and size: %llu %u\n",
|
||||||
|
resp.bar_addr, resp.bar_size);
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
bar_addr_va = devm_ioremap(ab->dev, resp.bar_addr, resp.bar_size);
|
||||||
|
|
||||||
|
if (!bar_addr_va) {
|
||||||
|
ath11k_warn(ab, "qmi device info ioremap failed\n");
|
||||||
|
ab->mem_len = 0;
|
||||||
|
ret = -EIO;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ab->mem = bar_addr_va;
|
||||||
|
ab->mem_len = resp.bar_size;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
out:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int ath11k_qmi_request_target_cap(struct ath11k_base *ab)
|
static int ath11k_qmi_request_target_cap(struct ath11k_base *ab)
|
||||||
{
|
{
|
||||||
struct qmi_wlanfw_cap_req_msg_v01 req;
|
struct qmi_wlanfw_cap_req_msg_v01 req;
|
||||||
@ -2124,7 +2270,7 @@ static int ath11k_qmi_load_file_target_mem(struct ath11k_base *ab,
|
|||||||
|
|
||||||
memset(&resp, 0, sizeof(resp));
|
memset(&resp, 0, sizeof(resp));
|
||||||
|
|
||||||
if (ab->bus_params.fixed_bdf_addr) {
|
if (ab->hw_params.fixed_bdf_addr) {
|
||||||
bdf_addr = ioremap(ab->hw_params.bdf_addr, ab->hw_params.fw.board_size);
|
bdf_addr = ioremap(ab->hw_params.bdf_addr, ab->hw_params.fw.board_size);
|
||||||
if (!bdf_addr) {
|
if (!bdf_addr) {
|
||||||
ath11k_warn(ab, "qmi ioremap error for bdf_addr\n");
|
ath11k_warn(ab, "qmi ioremap error for bdf_addr\n");
|
||||||
@ -2153,7 +2299,7 @@ static int ath11k_qmi_load_file_target_mem(struct ath11k_base *ab,
|
|||||||
req->end = 1;
|
req->end = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ab->bus_params.fixed_bdf_addr ||
|
if (ab->hw_params.fixed_bdf_addr ||
|
||||||
type == ATH11K_QMI_FILE_TYPE_EEPROM) {
|
type == ATH11K_QMI_FILE_TYPE_EEPROM) {
|
||||||
req->data_valid = 0;
|
req->data_valid = 0;
|
||||||
req->end = 1;
|
req->end = 1;
|
||||||
@ -2162,7 +2308,7 @@ static int ath11k_qmi_load_file_target_mem(struct ath11k_base *ab,
|
|||||||
memcpy(req->data, temp, req->data_len);
|
memcpy(req->data, temp, req->data_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ab->bus_params.fixed_bdf_addr) {
|
if (ab->hw_params.fixed_bdf_addr) {
|
||||||
if (type == ATH11K_QMI_FILE_TYPE_CALDATA)
|
if (type == ATH11K_QMI_FILE_TYPE_CALDATA)
|
||||||
bdf_addr += ab->hw_params.fw.cal_offset;
|
bdf_addr += ab->hw_params.fw.cal_offset;
|
||||||
|
|
||||||
@ -2201,7 +2347,7 @@ static int ath11k_qmi_load_file_target_mem(struct ath11k_base *ab,
|
|||||||
goto err_iounmap;
|
goto err_iounmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ab->bus_params.fixed_bdf_addr ||
|
if (ab->hw_params.fixed_bdf_addr ||
|
||||||
type == ATH11K_QMI_FILE_TYPE_EEPROM) {
|
type == ATH11K_QMI_FILE_TYPE_EEPROM) {
|
||||||
remaining = 0;
|
remaining = 0;
|
||||||
} else {
|
} else {
|
||||||
@ -2214,7 +2360,7 @@ static int ath11k_qmi_load_file_target_mem(struct ath11k_base *ab,
|
|||||||
}
|
}
|
||||||
|
|
||||||
err_iounmap:
|
err_iounmap:
|
||||||
if (ab->bus_params.fixed_bdf_addr)
|
if (ab->hw_params.fixed_bdf_addr)
|
||||||
iounmap(bdf_addr);
|
iounmap(bdf_addr);
|
||||||
|
|
||||||
err_free_req:
|
err_free_req:
|
||||||
@ -2353,7 +2499,7 @@ static void ath11k_qmi_m3_free(struct ath11k_base *ab)
|
|||||||
{
|
{
|
||||||
struct m3_mem_region *m3_mem = &ab->qmi.m3_mem;
|
struct m3_mem_region *m3_mem = &ab->qmi.m3_mem;
|
||||||
|
|
||||||
if (!ab->bus_params.m3_fw_support || !m3_mem->vaddr)
|
if (!ab->hw_params.m3_fw_support || !m3_mem->vaddr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
dma_free_coherent(ab->dev, m3_mem->size,
|
dma_free_coherent(ab->dev, m3_mem->size,
|
||||||
@ -2373,7 +2519,7 @@ static int ath11k_qmi_wlanfw_m3_info_send(struct ath11k_base *ab)
|
|||||||
memset(&req, 0, sizeof(req));
|
memset(&req, 0, sizeof(req));
|
||||||
memset(&resp, 0, sizeof(resp));
|
memset(&resp, 0, sizeof(resp));
|
||||||
|
|
||||||
if (ab->bus_params.m3_fw_support) {
|
if (ab->hw_params.m3_fw_support) {
|
||||||
ret = ath11k_qmi_m3_load(ab);
|
ret = ath11k_qmi_m3_load(ab);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ath11k_err(ab, "failed to load m3 firmware: %d", ret);
|
ath11k_err(ab, "failed to load m3 firmware: %d", ret);
|
||||||
@ -2701,27 +2847,6 @@ ath11k_qmi_driver_event_post(struct ath11k_qmi *qmi,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ath11k_qmi_event_server_arrive(struct ath11k_qmi *qmi)
|
|
||||||
{
|
|
||||||
struct ath11k_base *ab = qmi->ab;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = ath11k_qmi_fw_ind_register_send(ab);
|
|
||||||
if (ret < 0) {
|
|
||||||
ath11k_warn(ab, "failed to send qmi firmware indication: %d\n",
|
|
||||||
ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = ath11k_qmi_host_cap_send(ab);
|
|
||||||
if (ret < 0) {
|
|
||||||
ath11k_warn(ab, "failed to send qmi host cap: %d\n", ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ath11k_qmi_event_mem_request(struct ath11k_qmi *qmi)
|
static int ath11k_qmi_event_mem_request(struct ath11k_qmi *qmi)
|
||||||
{
|
{
|
||||||
struct ath11k_base *ab = qmi->ab;
|
struct ath11k_base *ab = qmi->ab;
|
||||||
@ -2748,6 +2873,12 @@ static int ath11k_qmi_event_load_bdf(struct ath11k_qmi *qmi)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = ath11k_qmi_request_device_info(ab);
|
||||||
|
if (ret < 0) {
|
||||||
|
ath11k_warn(ab, "failed to request qmi device info: %d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
if (ab->hw_params.supports_regdb)
|
if (ab->hw_params.supports_regdb)
|
||||||
ath11k_qmi_load_bdf_qmi(ab, true);
|
ath11k_qmi_load_bdf_qmi(ab, true);
|
||||||
|
|
||||||
@ -2757,9 +2888,33 @@ static int ath11k_qmi_event_load_bdf(struct ath11k_qmi *qmi)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = ath11k_qmi_wlanfw_m3_info_send(ab);
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ath11k_qmi_event_server_arrive(struct ath11k_qmi *qmi)
|
||||||
|
{
|
||||||
|
struct ath11k_base *ab = qmi->ab;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = ath11k_qmi_fw_ind_register_send(ab);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
ath11k_warn(ab, "failed to send qmi m3 info req: %d\n", ret);
|
ath11k_warn(ab, "failed to send qmi firmware indication: %d\n",
|
||||||
|
ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = ath11k_qmi_host_cap_send(ab);
|
||||||
|
if (ret < 0) {
|
||||||
|
ath11k_warn(ab, "failed to send qmi host cap: %d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ab->hw_params.fixed_fw_mem)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = ath11k_qmi_event_load_bdf(qmi);
|
||||||
|
if (ret < 0) {
|
||||||
|
ath11k_warn(ab, "qmi failed to download BDF:%d\n", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2792,7 +2947,7 @@ static void ath11k_qmi_msg_mem_request_cb(struct qmi_handle *qmi_hdl,
|
|||||||
msg->mem_seg[i].type, msg->mem_seg[i].size);
|
msg->mem_seg[i].type, msg->mem_seg[i].size);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ab->bus_params.fixed_mem_region ||
|
if (ab->hw_params.fixed_mem_region ||
|
||||||
test_bit(ATH11K_FLAG_FIXED_MEM_RGN, &ab->dev_flags)) {
|
test_bit(ATH11K_FLAG_FIXED_MEM_RGN, &ab->dev_flags)) {
|
||||||
ret = ath11k_qmi_assign_target_mem_chunk(ab);
|
ret = ath11k_qmi_assign_target_mem_chunk(ab);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
@ -2959,8 +3114,18 @@ static void ath11k_qmi_driver_event_work(struct work_struct *work)
|
|||||||
break;
|
break;
|
||||||
case ATH11K_QMI_EVENT_FW_MEM_READY:
|
case ATH11K_QMI_EVENT_FW_MEM_READY:
|
||||||
ret = ath11k_qmi_event_load_bdf(qmi);
|
ret = ath11k_qmi_event_load_bdf(qmi);
|
||||||
if (ret < 0)
|
if (ret < 0) {
|
||||||
set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
|
set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = ath11k_qmi_wlanfw_m3_info_send(ab);
|
||||||
|
if (ret < 0) {
|
||||||
|
ath11k_warn(ab,
|
||||||
|
"failed to send qmi m3 info req: %d\n", ret);
|
||||||
|
set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case ATH11K_QMI_EVENT_FW_READY:
|
case ATH11K_QMI_EVENT_FW_READY:
|
||||||
clear_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
|
clear_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/* SPDX-License-Identifier: BSD-3-Clause-Clear */
|
/* SPDX-License-Identifier: BSD-3-Clause-Clear */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef ATH11K_QMI_H
|
#ifndef ATH11K_QMI_H
|
||||||
@ -20,6 +21,7 @@
|
|||||||
#define ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_QCA6390 0x01
|
#define ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_QCA6390 0x01
|
||||||
#define ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_IPQ8074 0x02
|
#define ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_IPQ8074 0x02
|
||||||
#define ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_QCN9074 0x07
|
#define ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_QCN9074 0x07
|
||||||
|
#define ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_WCN6750 0x03
|
||||||
#define ATH11K_QMI_WLANFW_MAX_TIMESTAMP_LEN_V01 32
|
#define ATH11K_QMI_WLANFW_MAX_TIMESTAMP_LEN_V01 32
|
||||||
#define ATH11K_QMI_RESP_LEN_MAX 8192
|
#define ATH11K_QMI_RESP_LEN_MAX 8192
|
||||||
#define ATH11K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01 52
|
#define ATH11K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01 52
|
||||||
@ -36,6 +38,8 @@
|
|||||||
#define ATH11K_FIRMWARE_MODE_OFF 4
|
#define ATH11K_FIRMWARE_MODE_OFF 4
|
||||||
#define ATH11K_COLD_BOOT_FW_RESET_DELAY (40 * HZ)
|
#define ATH11K_COLD_BOOT_FW_RESET_DELAY (40 * HZ)
|
||||||
|
|
||||||
|
#define ATH11K_QMI_DEVICE_BAR_SIZE 0x200000
|
||||||
|
|
||||||
struct ath11k_base;
|
struct ath11k_base;
|
||||||
|
|
||||||
enum ath11k_qmi_file_type {
|
enum ath11k_qmi_file_type {
|
||||||
@ -289,6 +293,8 @@ struct qmi_wlanfw_fw_cold_cal_done_ind_msg_v01 {
|
|||||||
#define QMI_WLANFW_CAP_RESP_MSG_V01_MAX_LEN 235
|
#define QMI_WLANFW_CAP_RESP_MSG_V01_MAX_LEN 235
|
||||||
#define QMI_WLANFW_CAP_REQ_V01 0x0024
|
#define QMI_WLANFW_CAP_REQ_V01 0x0024
|
||||||
#define QMI_WLANFW_CAP_RESP_V01 0x0024
|
#define QMI_WLANFW_CAP_RESP_V01 0x0024
|
||||||
|
#define QMI_WLANFW_DEVICE_INFO_REQ_V01 0x004C
|
||||||
|
#define QMI_WLANFW_DEVICE_INFO_REQ_MSG_V01_MAX_LEN 0
|
||||||
|
|
||||||
enum qmi_wlanfw_pipedir_enum_v01 {
|
enum qmi_wlanfw_pipedir_enum_v01 {
|
||||||
QMI_WLFW_PIPEDIR_NONE_V01 = 0,
|
QMI_WLFW_PIPEDIR_NONE_V01 = 0,
|
||||||
@ -381,6 +387,18 @@ struct qmi_wlanfw_cap_req_msg_v01 {
|
|||||||
char placeholder;
|
char placeholder;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct qmi_wlanfw_device_info_req_msg_v01 {
|
||||||
|
char placeholder;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct qmi_wlanfw_device_info_resp_msg_v01 {
|
||||||
|
struct qmi_response_type_v01 resp;
|
||||||
|
u64 bar_addr;
|
||||||
|
u32 bar_size;
|
||||||
|
u8 bar_addr_valid;
|
||||||
|
u8 bar_size_valid;
|
||||||
|
};
|
||||||
|
|
||||||
#define QMI_WLANFW_BDF_DOWNLOAD_REQ_MSG_V01_MAX_LEN 6182
|
#define QMI_WLANFW_BDF_DOWNLOAD_REQ_MSG_V01_MAX_LEN 6182
|
||||||
#define QMI_WLANFW_BDF_DOWNLOAD_RESP_MSG_V01_MAX_LEN 7
|
#define QMI_WLANFW_BDF_DOWNLOAD_RESP_MSG_V01_MAX_LEN 7
|
||||||
#define QMI_WLANFW_BDF_DOWNLOAD_RESP_V01 0x0025
|
#define QMI_WLANFW_BDF_DOWNLOAD_RESP_V01 0x0025
|
||||||
|
@ -212,7 +212,10 @@ static int ath11k_spectral_scan_config(struct ath11k *ar,
|
|||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
arvif->spectral_enabled = (mode != ATH11K_SPECTRAL_DISABLED);
|
arvif->spectral_enabled = (mode != ATH11K_SPECTRAL_DISABLED);
|
||||||
|
|
||||||
|
spin_lock_bh(&ar->spectral.lock);
|
||||||
ar->spectral.mode = mode;
|
ar->spectral.mode = mode;
|
||||||
|
spin_unlock_bh(&ar->spectral.lock);
|
||||||
|
|
||||||
ret = ath11k_wmi_vdev_spectral_enable(ar, arvif->vdev_id,
|
ret = ath11k_wmi_vdev_spectral_enable(ar, arvif->vdev_id,
|
||||||
ATH11K_WMI_SPECTRAL_TRIGGER_CMD_CLEAR,
|
ATH11K_WMI_SPECTRAL_TRIGGER_CMD_CLEAR,
|
||||||
@ -843,9 +846,6 @@ static inline void ath11k_spectral_ring_free(struct ath11k *ar)
|
|||||||
{
|
{
|
||||||
struct ath11k_spectral *sp = &ar->spectral;
|
struct ath11k_spectral *sp = &ar->spectral;
|
||||||
|
|
||||||
if (!sp->enabled)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ath11k_dbring_srng_cleanup(ar, &sp->rx_ring);
|
ath11k_dbring_srng_cleanup(ar, &sp->rx_ring);
|
||||||
ath11k_dbring_buf_cleanup(ar, &sp->rx_ring);
|
ath11k_dbring_buf_cleanup(ar, &sp->rx_ring);
|
||||||
}
|
}
|
||||||
@ -897,15 +897,16 @@ void ath11k_spectral_deinit(struct ath11k_base *ab)
|
|||||||
if (!sp->enabled)
|
if (!sp->enabled)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
ath11k_spectral_debug_unregister(ar);
|
mutex_lock(&ar->conf_mutex);
|
||||||
ath11k_spectral_ring_free(ar);
|
ath11k_spectral_scan_config(ar, ATH11K_SPECTRAL_DISABLED);
|
||||||
|
mutex_unlock(&ar->conf_mutex);
|
||||||
|
|
||||||
spin_lock_bh(&sp->lock);
|
spin_lock_bh(&sp->lock);
|
||||||
|
|
||||||
sp->mode = ATH11K_SPECTRAL_DISABLED;
|
|
||||||
sp->enabled = false;
|
sp->enabled = false;
|
||||||
|
|
||||||
spin_unlock_bh(&sp->lock);
|
spin_unlock_bh(&sp->lock);
|
||||||
|
|
||||||
|
ath11k_spectral_debug_unregister(ar);
|
||||||
|
ath11k_spectral_ring_free(ar);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2021, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
#include <linux/skbuff.h>
|
#include <linux/skbuff.h>
|
||||||
#include <linux/ctype.h>
|
#include <linux/ctype.h>
|
||||||
@ -390,6 +391,10 @@ ath11k_pull_mac_phy_cap_svc_ready_ext(struct ath11k_pdev_wmi *wmi_handle,
|
|||||||
ab->target_pdev_ids[ab->target_pdev_count].pdev_id = mac_phy_caps->pdev_id;
|
ab->target_pdev_ids[ab->target_pdev_count].pdev_id = mac_phy_caps->pdev_id;
|
||||||
ab->target_pdev_count++;
|
ab->target_pdev_count++;
|
||||||
|
|
||||||
|
if (!(mac_phy_caps->supported_bands & WMI_HOST_WLAN_2G_CAP) &&
|
||||||
|
!(mac_phy_caps->supported_bands & WMI_HOST_WLAN_5G_CAP))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
/* Take non-zero tx/rx chainmask. If tx/rx chainmask differs from
|
/* Take non-zero tx/rx chainmask. If tx/rx chainmask differs from
|
||||||
* band to band for a single radio, need to see how this should be
|
* band to band for a single radio, need to see how this should be
|
||||||
* handled.
|
* handled.
|
||||||
@ -397,7 +402,9 @@ ath11k_pull_mac_phy_cap_svc_ready_ext(struct ath11k_pdev_wmi *wmi_handle,
|
|||||||
if (mac_phy_caps->supported_bands & WMI_HOST_WLAN_2G_CAP) {
|
if (mac_phy_caps->supported_bands & WMI_HOST_WLAN_2G_CAP) {
|
||||||
pdev_cap->tx_chain_mask = mac_phy_caps->tx_chain_mask_2g;
|
pdev_cap->tx_chain_mask = mac_phy_caps->tx_chain_mask_2g;
|
||||||
pdev_cap->rx_chain_mask = mac_phy_caps->rx_chain_mask_2g;
|
pdev_cap->rx_chain_mask = mac_phy_caps->rx_chain_mask_2g;
|
||||||
} else if (mac_phy_caps->supported_bands & WMI_HOST_WLAN_5G_CAP) {
|
}
|
||||||
|
|
||||||
|
if (mac_phy_caps->supported_bands & WMI_HOST_WLAN_5G_CAP) {
|
||||||
pdev_cap->vht_cap = mac_phy_caps->vht_cap_info_5g;
|
pdev_cap->vht_cap = mac_phy_caps->vht_cap_info_5g;
|
||||||
pdev_cap->vht_mcs = mac_phy_caps->vht_supp_mcs_5g;
|
pdev_cap->vht_mcs = mac_phy_caps->vht_supp_mcs_5g;
|
||||||
pdev_cap->he_mcs = mac_phy_caps->he_supp_mcs_5g;
|
pdev_cap->he_mcs = mac_phy_caps->he_supp_mcs_5g;
|
||||||
@ -407,8 +414,6 @@ ath11k_pull_mac_phy_cap_svc_ready_ext(struct ath11k_pdev_wmi *wmi_handle,
|
|||||||
WMI_NSS_RATIO_ENABLE_DISABLE_GET(mac_phy_caps->nss_ratio);
|
WMI_NSS_RATIO_ENABLE_DISABLE_GET(mac_phy_caps->nss_ratio);
|
||||||
pdev_cap->nss_ratio_info =
|
pdev_cap->nss_ratio_info =
|
||||||
WMI_NSS_RATIO_INFO_GET(mac_phy_caps->nss_ratio);
|
WMI_NSS_RATIO_INFO_GET(mac_phy_caps->nss_ratio);
|
||||||
} else {
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* tx/rx chainmask reported from fw depends on the actual hw chains used,
|
/* tx/rx chainmask reported from fw depends on the actual hw chains used,
|
||||||
@ -5789,9 +5794,9 @@ static int ath11k_wmi_tlv_rssi_chain_parse(struct ath11k_base *ab,
|
|||||||
arvif->bssid,
|
arvif->bssid,
|
||||||
NULL);
|
NULL);
|
||||||
if (!sta) {
|
if (!sta) {
|
||||||
ath11k_warn(ab, "not found station for bssid %pM\n",
|
ath11k_dbg(ab, ATH11K_DBG_WMI,
|
||||||
|
"not found station of bssid %pM for rssi chain\n",
|
||||||
arvif->bssid);
|
arvif->bssid);
|
||||||
ret = -EPROTO;
|
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5889,7 +5894,8 @@ static int ath11k_wmi_tlv_fw_stats_data_parse(struct ath11k_base *ab,
|
|||||||
"wmi stats vdev id %d snr %d\n",
|
"wmi stats vdev id %d snr %d\n",
|
||||||
src->vdev_id, src->beacon_snr);
|
src->vdev_id, src->beacon_snr);
|
||||||
} else {
|
} else {
|
||||||
ath11k_warn(ab, "not found station for bssid %pM\n",
|
ath11k_dbg(ab, ATH11K_DBG_WMI,
|
||||||
|
"not found station of bssid %pM for vdev stat\n",
|
||||||
arvif->bssid);
|
arvif->bssid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -7297,31 +7303,17 @@ static void ath11k_vdev_install_key_compl_event(struct ath11k_base *ab,
|
|||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ath11k_service_available_event(struct ath11k_base *ab, struct sk_buff *skb)
|
static int ath11k_wmi_tlv_services_parser(struct ath11k_base *ab,
|
||||||
|
u16 tag, u16 len,
|
||||||
|
const void *ptr, void *data)
|
||||||
{
|
{
|
||||||
const void **tb;
|
|
||||||
const struct wmi_service_available_event *ev;
|
const struct wmi_service_available_event *ev;
|
||||||
int ret;
|
u32 *wmi_ext2_service_bitmap;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
|
switch (tag) {
|
||||||
if (IS_ERR(tb)) {
|
case WMI_TAG_SERVICE_AVAILABLE_EVENT:
|
||||||
ret = PTR_ERR(tb);
|
ev = (struct wmi_service_available_event *)ptr;
|
||||||
ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ev = tb[WMI_TAG_SERVICE_AVAILABLE_EVENT];
|
|
||||||
if (!ev) {
|
|
||||||
ath11k_warn(ab, "failed to fetch svc available ev");
|
|
||||||
kfree(tb);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TODO: Use wmi_service_segment_offset information to get the service
|
|
||||||
* especially when more services are advertised in multiple sevice
|
|
||||||
* available events.
|
|
||||||
*/
|
|
||||||
for (i = 0, j = WMI_MAX_SERVICE;
|
for (i = 0, j = WMI_MAX_SERVICE;
|
||||||
i < WMI_SERVICE_SEGMENT_BM_SIZE32 && j < WMI_MAX_EXT_SERVICE;
|
i < WMI_SERVICE_SEGMENT_BM_SIZE32 && j < WMI_MAX_EXT_SERVICE;
|
||||||
i++) {
|
i++) {
|
||||||
@ -7333,11 +7325,42 @@ static void ath11k_service_available_event(struct ath11k_base *ab, struct sk_buf
|
|||||||
}
|
}
|
||||||
|
|
||||||
ath11k_dbg(ab, ATH11K_DBG_WMI,
|
ath11k_dbg(ab, ATH11K_DBG_WMI,
|
||||||
"wmi_ext_service_bitmap 0:0x%x, 1:0x%x, 2:0x%x, 3:0x%x",
|
"wmi_ext_service_bitmap 0:0x%04x, 1:0x%04x, 2:0x%04x, 3:0x%04x",
|
||||||
ev->wmi_service_segment_bitmap[0], ev->wmi_service_segment_bitmap[1],
|
ev->wmi_service_segment_bitmap[0],
|
||||||
ev->wmi_service_segment_bitmap[2], ev->wmi_service_segment_bitmap[3]);
|
ev->wmi_service_segment_bitmap[1],
|
||||||
|
ev->wmi_service_segment_bitmap[2],
|
||||||
|
ev->wmi_service_segment_bitmap[3]);
|
||||||
|
break;
|
||||||
|
case WMI_TAG_ARRAY_UINT32:
|
||||||
|
wmi_ext2_service_bitmap = (u32 *)ptr;
|
||||||
|
for (i = 0, j = WMI_MAX_EXT_SERVICE;
|
||||||
|
i < WMI_SERVICE_SEGMENT_BM_SIZE32 && j < WMI_MAX_EXT2_SERVICE;
|
||||||
|
i++) {
|
||||||
|
do {
|
||||||
|
if (wmi_ext2_service_bitmap[i] &
|
||||||
|
BIT(j % WMI_AVAIL_SERVICE_BITS_IN_SIZE32))
|
||||||
|
set_bit(j, ab->wmi_ab.svc_map);
|
||||||
|
} while (++j % WMI_AVAIL_SERVICE_BITS_IN_SIZE32);
|
||||||
|
}
|
||||||
|
|
||||||
kfree(tb);
|
ath11k_dbg(ab, ATH11K_DBG_WMI,
|
||||||
|
"wmi_ext2_service__bitmap 0:0x%04x, 1:0x%04x, 2:0x%04x, 3:0x%04x",
|
||||||
|
wmi_ext2_service_bitmap[0], wmi_ext2_service_bitmap[1],
|
||||||
|
wmi_ext2_service_bitmap[2], wmi_ext2_service_bitmap[3]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ath11k_service_available_event(struct ath11k_base *ab, struct sk_buff *skb)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = ath11k_wmi_tlv_iter(ab, skb->data, skb->len,
|
||||||
|
ath11k_wmi_tlv_services_parser,
|
||||||
|
NULL);
|
||||||
|
if (ret)
|
||||||
|
ath11k_warn(ab, "failed to parse services available tlv %d\n", ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ath11k_peer_assoc_conf_event(struct ath11k_base *ab, struct sk_buff *skb)
|
static void ath11k_peer_assoc_conf_event(struct ath11k_base *ab, struct sk_buff *skb)
|
||||||
@ -7822,7 +7845,7 @@ static void ath11k_wmi_gtk_offload_status_event(struct ath11k_base *ab,
|
|||||||
replay_ctr_be = cpu_to_be64(replay_ctr);
|
replay_ctr_be = cpu_to_be64(replay_ctr);
|
||||||
|
|
||||||
ieee80211_gtk_rekey_notify(arvif->vif, arvif->bssid,
|
ieee80211_gtk_rekey_notify(arvif->vif, arvif->bssid,
|
||||||
(void *)&replay_ctr_be, GFP_KERNEL);
|
(void *)&replay_ctr_be, GFP_ATOMIC);
|
||||||
|
|
||||||
kfree(tb);
|
kfree(tb);
|
||||||
}
|
}
|
||||||
@ -8208,7 +8231,7 @@ int ath11k_wmi_attach(struct ath11k_base *ab)
|
|||||||
ab->wmi_ab.preferred_hw_mode = WMI_HOST_HW_MODE_MAX;
|
ab->wmi_ab.preferred_hw_mode = WMI_HOST_HW_MODE_MAX;
|
||||||
|
|
||||||
/* It's overwritten when service_ext_ready is handled */
|
/* It's overwritten when service_ext_ready is handled */
|
||||||
if (ab->hw_params.single_pdev_only)
|
if (ab->hw_params.single_pdev_only && ab->hw_params.num_rxmda_per_pdev > 1)
|
||||||
ab->wmi_ab.preferred_hw_mode = WMI_HOST_HW_MODE_SINGLE;
|
ab->wmi_ab.preferred_hw_mode = WMI_HOST_HW_MODE_SINGLE;
|
||||||
|
|
||||||
/* TODO: Init remaining wmi soc resources required */
|
/* TODO: Init remaining wmi soc resources required */
|
||||||
@ -8866,3 +8889,73 @@ int ath11k_wmi_gtk_rekey_getinfo(struct ath11k *ar,
|
|||||||
arvif->vdev_id);
|
arvif->vdev_id);
|
||||||
return ath11k_wmi_cmd_send(ar->wmi, skb, WMI_GTK_OFFLOAD_CMDID);
|
return ath11k_wmi_cmd_send(ar->wmi, skb, WMI_GTK_OFFLOAD_CMDID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ath11k_wmi_pdev_set_bios_sar_table_param(struct ath11k *ar, const u8 *sar_val)
|
||||||
|
{ struct ath11k_pdev_wmi *wmi = ar->wmi;
|
||||||
|
struct wmi_pdev_set_sar_table_cmd *cmd;
|
||||||
|
struct wmi_tlv *tlv;
|
||||||
|
struct sk_buff *skb;
|
||||||
|
u8 *buf_ptr;
|
||||||
|
u32 len, sar_len_aligned, rsvd_len_aligned;
|
||||||
|
|
||||||
|
sar_len_aligned = roundup(BIOS_SAR_TABLE_LEN, sizeof(u32));
|
||||||
|
rsvd_len_aligned = roundup(BIOS_SAR_RSVD1_LEN, sizeof(u32));
|
||||||
|
len = sizeof(*cmd) +
|
||||||
|
TLV_HDR_SIZE + sar_len_aligned +
|
||||||
|
TLV_HDR_SIZE + rsvd_len_aligned;
|
||||||
|
|
||||||
|
skb = ath11k_wmi_alloc_skb(wmi->wmi_ab, len);
|
||||||
|
if (!skb)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
cmd = (struct wmi_pdev_set_sar_table_cmd *)skb->data;
|
||||||
|
cmd->tlv_header = FIELD_PREP(WMI_TLV_TAG, WMI_TAG_PDEV_SET_BIOS_SAR_TABLE_CMD) |
|
||||||
|
FIELD_PREP(WMI_TLV_LEN, sizeof(*cmd) - TLV_HDR_SIZE);
|
||||||
|
cmd->pdev_id = ar->pdev->pdev_id;
|
||||||
|
cmd->sar_len = BIOS_SAR_TABLE_LEN;
|
||||||
|
cmd->rsvd_len = BIOS_SAR_RSVD1_LEN;
|
||||||
|
|
||||||
|
buf_ptr = skb->data + sizeof(*cmd);
|
||||||
|
tlv = (struct wmi_tlv *)buf_ptr;
|
||||||
|
tlv->header = FIELD_PREP(WMI_TLV_TAG, WMI_TAG_ARRAY_BYTE) |
|
||||||
|
FIELD_PREP(WMI_TLV_LEN, sar_len_aligned);
|
||||||
|
buf_ptr += TLV_HDR_SIZE;
|
||||||
|
memcpy(buf_ptr, sar_val, BIOS_SAR_TABLE_LEN);
|
||||||
|
|
||||||
|
buf_ptr += sar_len_aligned;
|
||||||
|
tlv = (struct wmi_tlv *)buf_ptr;
|
||||||
|
tlv->header = FIELD_PREP(WMI_TLV_TAG, WMI_TAG_ARRAY_BYTE) |
|
||||||
|
FIELD_PREP(WMI_TLV_LEN, rsvd_len_aligned);
|
||||||
|
|
||||||
|
return ath11k_wmi_cmd_send(wmi, skb, WMI_PDEV_SET_BIOS_SAR_TABLE_CMDID);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ath11k_wmi_pdev_set_bios_geo_table_param(struct ath11k *ar)
|
||||||
|
{
|
||||||
|
struct ath11k_pdev_wmi *wmi = ar->wmi;
|
||||||
|
struct wmi_pdev_set_geo_table_cmd *cmd;
|
||||||
|
struct wmi_tlv *tlv;
|
||||||
|
struct sk_buff *skb;
|
||||||
|
u8 *buf_ptr;
|
||||||
|
u32 len, rsvd_len_aligned;
|
||||||
|
|
||||||
|
rsvd_len_aligned = roundup(BIOS_SAR_RSVD2_LEN, sizeof(u32));
|
||||||
|
len = sizeof(*cmd) + TLV_HDR_SIZE + rsvd_len_aligned;
|
||||||
|
|
||||||
|
skb = ath11k_wmi_alloc_skb(wmi->wmi_ab, len);
|
||||||
|
if (!skb)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
cmd = (struct wmi_pdev_set_geo_table_cmd *)skb->data;
|
||||||
|
cmd->tlv_header = FIELD_PREP(WMI_TLV_TAG, WMI_TAG_PDEV_SET_BIOS_GEO_TABLE_CMD) |
|
||||||
|
FIELD_PREP(WMI_TLV_LEN, sizeof(*cmd) - TLV_HDR_SIZE);
|
||||||
|
cmd->pdev_id = ar->pdev->pdev_id;
|
||||||
|
cmd->rsvd_len = BIOS_SAR_RSVD2_LEN;
|
||||||
|
|
||||||
|
buf_ptr = skb->data + sizeof(*cmd);
|
||||||
|
tlv = (struct wmi_tlv *)buf_ptr;
|
||||||
|
tlv->header = FIELD_PREP(WMI_TLV_TAG, WMI_TAG_ARRAY_BYTE) |
|
||||||
|
FIELD_PREP(WMI_TLV_LEN, rsvd_len_aligned);
|
||||||
|
|
||||||
|
return ath11k_wmi_cmd_send(wmi, skb, WMI_PDEV_SET_BIOS_GEO_TABLE_CMDID);
|
||||||
|
}
|
||||||
|
@ -285,6 +285,11 @@ enum wmi_tlv_cmd_id {
|
|||||||
WMI_PDEV_SET_SRG_OBSS_BSSID_ENABLE_BITMAP_CMDID,
|
WMI_PDEV_SET_SRG_OBSS_BSSID_ENABLE_BITMAP_CMDID,
|
||||||
WMI_PDEV_SET_NON_SRG_OBSS_COLOR_ENABLE_BITMAP_CMDID,
|
WMI_PDEV_SET_NON_SRG_OBSS_COLOR_ENABLE_BITMAP_CMDID,
|
||||||
WMI_PDEV_SET_NON_SRG_OBSS_BSSID_ENABLE_BITMAP_CMDID,
|
WMI_PDEV_SET_NON_SRG_OBSS_BSSID_ENABLE_BITMAP_CMDID,
|
||||||
|
WMI_PDEV_GET_TPC_STATS_CMDID,
|
||||||
|
WMI_PDEV_ENABLE_DURATION_BASED_TX_MODE_SELECTION_CMDID,
|
||||||
|
WMI_PDEV_GET_DPD_STATUS_CMDID,
|
||||||
|
WMI_PDEV_SET_BIOS_SAR_TABLE_CMDID,
|
||||||
|
WMI_PDEV_SET_BIOS_GEO_TABLE_CMDID,
|
||||||
WMI_VDEV_CREATE_CMDID = WMI_TLV_CMD(WMI_GRP_VDEV),
|
WMI_VDEV_CREATE_CMDID = WMI_TLV_CMD(WMI_GRP_VDEV),
|
||||||
WMI_VDEV_DELETE_CMDID,
|
WMI_VDEV_DELETE_CMDID,
|
||||||
WMI_VDEV_START_REQUEST_CMDID,
|
WMI_VDEV_START_REQUEST_CMDID,
|
||||||
@ -1859,6 +1864,8 @@ enum wmi_tlv_tag {
|
|||||||
WMI_TAG_PDEV_SRG_OBSS_BSSID_ENABLE_BITMAP_CMD,
|
WMI_TAG_PDEV_SRG_OBSS_BSSID_ENABLE_BITMAP_CMD,
|
||||||
WMI_TAG_PDEV_NON_SRG_OBSS_COLOR_ENABLE_BITMAP_CMD,
|
WMI_TAG_PDEV_NON_SRG_OBSS_COLOR_ENABLE_BITMAP_CMD,
|
||||||
WMI_TAG_PDEV_NON_SRG_OBSS_BSSID_ENABLE_BITMAP_CMD,
|
WMI_TAG_PDEV_NON_SRG_OBSS_BSSID_ENABLE_BITMAP_CMD,
|
||||||
|
WMI_TAG_PDEV_SET_BIOS_SAR_TABLE_CMD = 0x3D8,
|
||||||
|
WMI_TAG_PDEV_SET_BIOS_GEO_TABLE_CMD,
|
||||||
WMI_TAG_MAX
|
WMI_TAG_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1992,6 +1999,7 @@ enum wmi_tlv_service {
|
|||||||
WMI_TLV_SERVICE_ACK_TIMEOUT = 126,
|
WMI_TLV_SERVICE_ACK_TIMEOUT = 126,
|
||||||
WMI_TLV_SERVICE_PDEV_BSS_CHANNEL_INFO_64 = 127,
|
WMI_TLV_SERVICE_PDEV_BSS_CHANNEL_INFO_64 = 127,
|
||||||
|
|
||||||
|
/* The first 128 bits */
|
||||||
WMI_MAX_SERVICE = 128,
|
WMI_MAX_SERVICE = 128,
|
||||||
|
|
||||||
WMI_TLV_SERVICE_CHAN_LOAD_INFO = 128,
|
WMI_TLV_SERVICE_CHAN_LOAD_INFO = 128,
|
||||||
@ -2084,7 +2092,12 @@ enum wmi_tlv_service {
|
|||||||
WMI_TLV_SERVICE_EXT2_MSG = 220,
|
WMI_TLV_SERVICE_EXT2_MSG = 220,
|
||||||
WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT = 249,
|
WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT = 249,
|
||||||
|
|
||||||
WMI_MAX_EXT_SERVICE
|
/* The second 128 bits */
|
||||||
|
WMI_MAX_EXT_SERVICE = 256,
|
||||||
|
WMI_TLV_SERVICE_BIOS_SAR_SUPPORT = 326,
|
||||||
|
|
||||||
|
/* The third 128 bits */
|
||||||
|
WMI_MAX_EXT2_SERVICE = 384
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@ -5370,7 +5383,7 @@ struct ath11k_wmi_base {
|
|||||||
|
|
||||||
struct completion service_ready;
|
struct completion service_ready;
|
||||||
struct completion unified_ready;
|
struct completion unified_ready;
|
||||||
DECLARE_BITMAP(svc_map, WMI_MAX_EXT_SERVICE);
|
DECLARE_BITMAP(svc_map, WMI_MAX_EXT2_SERVICE);
|
||||||
wait_queue_head_t tx_credits_wq;
|
wait_queue_head_t tx_credits_wq;
|
||||||
const struct wmi_peer_flags_map *peer_flags;
|
const struct wmi_peer_flags_map *peer_flags;
|
||||||
u32 num_mem_chunks;
|
u32 num_mem_chunks;
|
||||||
@ -5877,6 +5890,23 @@ struct wmi_gtk_rekey_offload_cmd {
|
|||||||
u8 replay_ctr[GTK_REPLAY_COUNTER_BYTES];
|
u8 replay_ctr[GTK_REPLAY_COUNTER_BYTES];
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
|
#define BIOS_SAR_TABLE_LEN (22)
|
||||||
|
#define BIOS_SAR_RSVD1_LEN (6)
|
||||||
|
#define BIOS_SAR_RSVD2_LEN (18)
|
||||||
|
|
||||||
|
struct wmi_pdev_set_sar_table_cmd {
|
||||||
|
u32 tlv_header;
|
||||||
|
u32 pdev_id;
|
||||||
|
u32 sar_len;
|
||||||
|
u32 rsvd_len;
|
||||||
|
} __packed;
|
||||||
|
|
||||||
|
struct wmi_pdev_set_geo_table_cmd {
|
||||||
|
u32 tlv_header;
|
||||||
|
u32 pdev_id;
|
||||||
|
u32 rsvd_len;
|
||||||
|
} __packed;
|
||||||
|
|
||||||
int ath11k_wmi_cmd_send(struct ath11k_pdev_wmi *wmi, struct sk_buff *skb,
|
int ath11k_wmi_cmd_send(struct ath11k_pdev_wmi *wmi, struct sk_buff *skb,
|
||||||
u32 cmd_id);
|
u32 cmd_id);
|
||||||
struct sk_buff *ath11k_wmi_alloc_skb(struct ath11k_wmi_base *wmi_sc, u32 len);
|
struct sk_buff *ath11k_wmi_alloc_skb(struct ath11k_wmi_base *wmi_sc, u32 len);
|
||||||
@ -6055,5 +6085,7 @@ int ath11k_wmi_gtk_rekey_offload(struct ath11k *ar,
|
|||||||
struct ath11k_vif *arvif, bool enable);
|
struct ath11k_vif *arvif, bool enable);
|
||||||
int ath11k_wmi_gtk_rekey_getinfo(struct ath11k *ar,
|
int ath11k_wmi_gtk_rekey_getinfo(struct ath11k *ar,
|
||||||
struct ath11k_vif *arvif);
|
struct ath11k_vif *arvif);
|
||||||
|
int ath11k_wmi_pdev_set_bios_sar_table_param(struct ath11k *ar, const u8 *sar_val);
|
||||||
|
int ath11k_wmi_pdev_set_bios_geo_table_param(struct ath11k *ar);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -758,7 +758,7 @@ int ath11k_wow_op_resume(struct ieee80211_hw *hw)
|
|||||||
ret = ath11k_dp_rx_pktlog_start(ar->ab);
|
ret = ath11k_dp_rx_pktlog_start(ar->ab);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ath11k_warn(ar->ab, "failed to start rx pktlog from wow: %d\n", ret);
|
ath11k_warn(ar->ab, "failed to start rx pktlog from wow: %d\n", ret);
|
||||||
return ret;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = ath11k_wow_wakeup(ar->ab);
|
ret = ath11k_wow_wakeup(ar->ab);
|
||||||
|
@ -99,10 +99,8 @@ static int ath_ahb_probe(struct platform_device *pdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
irq = platform_get_irq(pdev, 0);
|
irq = platform_get_irq(pdev, 0);
|
||||||
if (irq < 0) {
|
if (irq < 0)
|
||||||
dev_err(&pdev->dev, "no IRQ resource found\n");
|
|
||||||
return irq;
|
return irq;
|
||||||
}
|
|
||||||
|
|
||||||
ath9k_fill_chanctx_ops();
|
ath9k_fill_chanctx_ops();
|
||||||
hw = ieee80211_alloc_hw(sizeof(struct ath_softc), &ath9k_ops);
|
hw = ieee80211_alloc_hw(sizeof(struct ath_softc), &ath9k_ops);
|
||||||
|
@ -720,7 +720,7 @@
|
|||||||
#define AR_CH0_TOP2 (AR_SREV_9300(ah) ? 0x1628c : \
|
#define AR_CH0_TOP2 (AR_SREV_9300(ah) ? 0x1628c : \
|
||||||
(AR_SREV_9462(ah) ? 0x16290 : 0x16284))
|
(AR_SREV_9462(ah) ? 0x16290 : 0x16284))
|
||||||
#define AR_CH0_TOP2_XPABIASLVL (AR_SREV_9561(ah) ? 0x1e00 : 0xf000)
|
#define AR_CH0_TOP2_XPABIASLVL (AR_SREV_9561(ah) ? 0x1e00 : 0xf000)
|
||||||
#define AR_CH0_TOP2_XPABIASLVL_S 12
|
#define AR_CH0_TOP2_XPABIASLVL_S (AR_SREV_9561(ah) ? 9 : 12)
|
||||||
|
|
||||||
#define AR_CH0_XTAL (AR_SREV_9300(ah) ? 0x16294 : \
|
#define AR_CH0_XTAL (AR_SREV_9300(ah) ? 0x16294 : \
|
||||||
((AR_SREV_9462(ah) || AR_SREV_9565(ah)) ? 0x16298 : \
|
((AR_SREV_9462(ah) || AR_SREV_9565(ah)) ? 0x16298 : \
|
||||||
|
@ -368,10 +368,9 @@ static int __hif_usb_tx(struct hif_device_usb *hif_dev)
|
|||||||
__skb_queue_head_init(&tx_buf->skb_queue);
|
__skb_queue_head_init(&tx_buf->skb_queue);
|
||||||
list_move_tail(&tx_buf->list, &hif_dev->tx.tx_buf);
|
list_move_tail(&tx_buf->list, &hif_dev->tx.tx_buf);
|
||||||
hif_dev->tx.tx_buf_cnt++;
|
hif_dev->tx.tx_buf_cnt++;
|
||||||
}
|
} else {
|
||||||
|
|
||||||
if (!ret)
|
|
||||||
TX_STAT_INC(buf_queued);
|
TX_STAT_INC(buf_queued);
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -1016,6 +1016,14 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv,
|
|||||||
goto rx_next;
|
goto rx_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rxstatus->rs_keyix >= ATH_KEYMAX &&
|
||||||
|
rxstatus->rs_keyix != ATH9K_RXKEYIX_INVALID) {
|
||||||
|
ath_dbg(common, ANY,
|
||||||
|
"Invalid keyix, dropping (keyix: %d)\n",
|
||||||
|
rxstatus->rs_keyix);
|
||||||
|
goto rx_next;
|
||||||
|
}
|
||||||
|
|
||||||
/* Get the RX status information */
|
/* Get the RX status information */
|
||||||
|
|
||||||
memset(rx_status, 0, sizeof(struct ieee80211_rx_status));
|
memset(rx_status, 0, sizeof(struct ieee80211_rx_status));
|
||||||
|
@ -1271,7 +1271,7 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf,
|
|||||||
int phy;
|
int phy;
|
||||||
|
|
||||||
if (!rates[i].count || (rates[i].idx < 0))
|
if (!rates[i].count || (rates[i].idx < 0))
|
||||||
continue;
|
break;
|
||||||
|
|
||||||
rix = rates[i].idx;
|
rix = rates[i].idx;
|
||||||
info->rates[i].Tries = rates[i].count;
|
info->rates[i].Tries = rates[i].count;
|
||||||
|
@ -1559,6 +1559,9 @@ static struct carl9170_vif_info *carl9170_pick_beaconing_vif(struct ar9170 *ar)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
} while (ar->beacon_enabled && i--);
|
} while (ar->beacon_enabled && i--);
|
||||||
|
|
||||||
|
/* no entry found in list */
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
@ -1653,10 +1653,9 @@ static int wil_cfg80211_add_key(struct wiphy *wiphy,
|
|||||||
params->seq_len, params->seq);
|
params->seq_len, params->seq);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
|
|
||||||
if (!IS_ERR(cs))
|
|
||||||
wil_del_rx_key(key_index, key_usage, cs);
|
wil_del_rx_key(key_index, key_usage, cs);
|
||||||
|
}
|
||||||
|
|
||||||
if (params->seq && params->seq_len != IEEE80211_GCMP_PN_LEN) {
|
if (params->seq && params->seq_len != IEEE80211_GCMP_PN_LEN) {
|
||||||
wil_err(wil,
|
wil_err(wil,
|
||||||
|
@ -457,17 +457,17 @@ int wil_if_add(struct wil6210_priv *wil)
|
|||||||
if (wil->use_enhanced_dma_hw) {
|
if (wil->use_enhanced_dma_hw) {
|
||||||
netif_napi_add(&wil->napi_ndev, &wil->napi_rx,
|
netif_napi_add(&wil->napi_ndev, &wil->napi_rx,
|
||||||
wil6210_netdev_poll_rx_edma,
|
wil6210_netdev_poll_rx_edma,
|
||||||
WIL6210_NAPI_BUDGET);
|
NAPI_POLL_WEIGHT);
|
||||||
netif_tx_napi_add(&wil->napi_ndev,
|
netif_tx_napi_add(&wil->napi_ndev,
|
||||||
&wil->napi_tx, wil6210_netdev_poll_tx_edma,
|
&wil->napi_tx, wil6210_netdev_poll_tx_edma,
|
||||||
WIL6210_NAPI_BUDGET);
|
NAPI_POLL_WEIGHT);
|
||||||
} else {
|
} else {
|
||||||
netif_napi_add(&wil->napi_ndev, &wil->napi_rx,
|
netif_napi_add(&wil->napi_ndev, &wil->napi_rx,
|
||||||
wil6210_netdev_poll_rx,
|
wil6210_netdev_poll_rx,
|
||||||
WIL6210_NAPI_BUDGET);
|
NAPI_POLL_WEIGHT);
|
||||||
netif_tx_napi_add(&wil->napi_ndev,
|
netif_tx_napi_add(&wil->napi_ndev,
|
||||||
&wil->napi_tx, wil6210_netdev_poll_tx,
|
&wil->napi_tx, wil6210_netdev_poll_tx,
|
||||||
WIL6210_NAPI_BUDGET);
|
NAPI_POLL_WEIGHT);
|
||||||
}
|
}
|
||||||
|
|
||||||
wil_update_net_queues_bh(wil, vif, NULL, true);
|
wil_update_net_queues_bh(wil, vif, NULL, true);
|
||||||
|
@ -445,10 +445,9 @@ int wil_pm_runtime_get(struct wil6210_priv *wil)
|
|||||||
int rc;
|
int rc;
|
||||||
struct device *dev = wil_to_dev(wil);
|
struct device *dev = wil_to_dev(wil);
|
||||||
|
|
||||||
rc = pm_runtime_get_sync(dev);
|
rc = pm_runtime_resume_and_get(dev);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
wil_err(wil, "pm_runtime_get_sync() failed, rc = %d\n", rc);
|
wil_err(wil, "pm_runtime_resume_and_get() failed, rc = %d\n", rc);
|
||||||
pm_runtime_put_noidle(dev);
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,7 +82,6 @@ static inline u32 WIL_GET_BITS(u32 x, int b0, int b1)
|
|||||||
#define WIL6210_MAX_TX_RINGS (24) /* HW limit */
|
#define WIL6210_MAX_TX_RINGS (24) /* HW limit */
|
||||||
#define WIL6210_MAX_CID (20) /* max number of stations */
|
#define WIL6210_MAX_CID (20) /* max number of stations */
|
||||||
#define WIL6210_RX_DESC_MAX_CID (8) /* HW limit */
|
#define WIL6210_RX_DESC_MAX_CID (8) /* HW limit */
|
||||||
#define WIL6210_NAPI_BUDGET (16) /* arbitrary */
|
|
||||||
#define WIL_MAX_AMPDU_SIZE (64 * 1024) /* FW/HW limit */
|
#define WIL_MAX_AMPDU_SIZE (64 * 1024) /* FW/HW limit */
|
||||||
#define WIL_MAX_AGG_WSIZE (32) /* FW/HW limit */
|
#define WIL_MAX_AGG_WSIZE (32) /* FW/HW limit */
|
||||||
#define WIL_MAX_AMPDU_SIZE_128 (128 * 1024) /* FW/HW limit */
|
#define WIL_MAX_AMPDU_SIZE_128 (128 * 1024) /* FW/HW limit */
|
||||||
|
Loading…
Reference in New Issue
Block a user