mirror of
https://github.com/armbian/linux-cix.git
synced 2026-01-06 12:30:45 -08:00
Merge tag 'wireless-next-2022-05-03' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next
Kalle Valo says: ==================== wireless-next patches for v5.19 First set of patches for v5.19 and this is a big one. We have two new drivers, a change in mac80211 STA API affecting most drivers and ath11k getting support for WCN6750. And as usual lots of fixes and cleanups all over. Major changes: new drivers - wfx: silicon labs devices - plfxlc: pureLiFi X, XL, XC devices mac80211 - host based BSS color collision detection - prepare sta handling for IEEE 802.11be Multi-Link Operation (MLO) support rtw88 - support TP-Link T2E devices rtw89 - support firmware crash simulation - preparation for 8852ce hardware support ath11k - Wake-on-WLAN support for QCA6390 and WCN6855 - device recovery (firmware restart) support for QCA6390 and WCN6855 - support setting Specific Absorption Rate (SAR) for WCN6855 - read country code from SMBIOS for WCN6855/QCA6390 - support for WCN6750 wcn36xx - support for transmit rate reporting to user space * tag 'wireless-next-2022-05-03' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next: (228 commits) rtw89: 8852c: rfk: add DPK rtw89: 8852c: rfk: add IQK rtw89: 8852c: rfk: add RX DCK rtw89: 8852c: rfk: add RCK rtw89: 8852c: rfk: add TSSI rtw89: 8852c: rfk: add LCK rtw89: 8852c: rfk: add DACK rtw89: 8852c: rfk: add RFK tables plfxlc: fix le16_to_cpu warning for beacon_interval rtw88: remove a copy of the NAPI_POLL_WEIGHT define carl9170: tx: fix an incorrect use of list iterator wil6210: use NAPI_POLL_WEIGHT for napi budget ath10k: remove a copy of the NAPI_POLL_WEIGHT define ath11k: Add support for WCN6750 device ath11k: Datapath changes to support WCN6750 ath11k: HAL changes to support WCN6750 ath11k: Add QMI changes for WCN6750 ath11k: Fetch device information via QMI for WCN6750 ath11k: Add register access logic for WCN6750 ath11k: Add HW params for WCN6750 ... ==================== Link: https://lore.kernel.org/r/20220503153622.C1671C385A4@smtp.kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -20,120 +20,17 @@ properties:
|
||||
enum:
|
||||
- qcom,ipq8074-wifi
|
||||
- qcom,ipq6018-wifi
|
||||
- qcom,wcn6750-wifi
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
items:
|
||||
- description: misc-pulse1 interrupt events
|
||||
- description: misc-latch interrupt events
|
||||
- description: sw exception interrupt events
|
||||
- description: watchdog interrupt events
|
||||
- description: interrupt event for ring CE0
|
||||
- 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 CE11
|
||||
- description: interrupt event for ring host2wbm-desc-feed
|
||||
- description: interrupt event for ring host2reo-re-injection
|
||||
- description: interrupt event for ring host2reo-command
|
||||
- description: interrupt event for ring host2rxdma-monitor-ring3
|
||||
- description: interrupt event for ring host2rxdma-monitor-ring2
|
||||
- description: interrupt event for ring host2rxdma-monitor-ring1
|
||||
- description: interrupt event for ring reo2ost-exception
|
||||
- description: interrupt event for ring wbm2host-rx-release
|
||||
- description: interrupt event for ring reo2host-status
|
||||
- description: interrupt event for ring reo2host-destination-ring4
|
||||
- description: interrupt event for ring reo2host-destination-ring3
|
||||
- description: interrupt event for ring reo2host-destination-ring2
|
||||
- description: interrupt event for ring reo2host-destination-ring1
|
||||
- description: interrupt event for ring rxdma2host-monitor-destination-mac3
|
||||
- description: interrupt event for ring rxdma2host-monitor-destination-mac2
|
||||
- description: interrupt event for ring rxdma2host-monitor-destination-mac1
|
||||
- description: interrupt event for ring ppdu-end-interrupts-mac3
|
||||
- description: interrupt event for ring ppdu-end-interrupts-mac2
|
||||
- description: interrupt event for ring ppdu-end-interrupts-mac1
|
||||
- description: interrupt event for ring rxdma2host-monitor-status-ring-mac3
|
||||
- description: interrupt event for ring rxdma2host-monitor-status-ring-mac2
|
||||
- description: interrupt event for ring rxdma2host-monitor-status-ring-mac1
|
||||
- description: interrupt event for ring host2rxdma-host-buf-ring-mac3
|
||||
- description: interrupt event for ring host2rxdma-host-buf-ring-mac2
|
||||
- description: interrupt event for ring host2rxdma-host-buf-ring-mac1
|
||||
- description: interrupt event for ring rxdma2host-destination-ring-mac3
|
||||
- description: interrupt event for ring rxdma2host-destination-ring-mac2
|
||||
- description: interrupt event for ring rxdma2host-destination-ring-mac1
|
||||
- description: interrupt event for ring host2tcl-input-ring4
|
||||
- description: interrupt event for ring host2tcl-input-ring3
|
||||
- description: interrupt event for ring host2tcl-input-ring2
|
||||
- description: interrupt event for ring host2tcl-input-ring1
|
||||
- description: interrupt event for ring wbm2host-tx-completions-ring3
|
||||
- description: interrupt event for ring wbm2host-tx-completions-ring2
|
||||
- description: interrupt event for ring wbm2host-tx-completions-ring1
|
||||
- description: interrupt event for ring tcl2host-status-ring
|
||||
|
||||
minItems: 32
|
||||
maxItems: 52
|
||||
|
||||
interrupt-names:
|
||||
items:
|
||||
- const: misc-pulse1
|
||||
- const: misc-latch
|
||||
- const: sw-exception
|
||||
- const: watchdog
|
||||
- const: ce0
|
||||
- const: ce1
|
||||
- const: ce2
|
||||
- const: ce3
|
||||
- const: ce4
|
||||
- const: ce5
|
||||
- const: ce6
|
||||
- const: ce7
|
||||
- const: ce8
|
||||
- const: ce9
|
||||
- const: ce10
|
||||
- const: ce11
|
||||
- const: host2wbm-desc-feed
|
||||
- const: host2reo-re-injection
|
||||
- const: host2reo-command
|
||||
- const: host2rxdma-monitor-ring3
|
||||
- const: host2rxdma-monitor-ring2
|
||||
- const: host2rxdma-monitor-ring1
|
||||
- const: reo2ost-exception
|
||||
- const: wbm2host-rx-release
|
||||
- const: reo2host-status
|
||||
- const: reo2host-destination-ring4
|
||||
- const: reo2host-destination-ring3
|
||||
- const: reo2host-destination-ring2
|
||||
- const: reo2host-destination-ring1
|
||||
- const: rxdma2host-monitor-destination-mac3
|
||||
- const: rxdma2host-monitor-destination-mac2
|
||||
- const: rxdma2host-monitor-destination-mac1
|
||||
- const: ppdu-end-interrupts-mac3
|
||||
- const: ppdu-end-interrupts-mac2
|
||||
- const: ppdu-end-interrupts-mac1
|
||||
- const: rxdma2host-monitor-status-ring-mac3
|
||||
- const: rxdma2host-monitor-status-ring-mac2
|
||||
- const: rxdma2host-monitor-status-ring-mac1
|
||||
- const: host2rxdma-host-buf-ring-mac3
|
||||
- const: host2rxdma-host-buf-ring-mac2
|
||||
- const: host2rxdma-host-buf-ring-mac1
|
||||
- const: rxdma2host-destination-ring-mac3
|
||||
- const: rxdma2host-destination-ring-mac2
|
||||
- const: rxdma2host-destination-ring-mac1
|
||||
- const: host2tcl-input-ring4
|
||||
- const: host2tcl-input-ring3
|
||||
- const: host2tcl-input-ring2
|
||||
- const: host2tcl-input-ring1
|
||||
- const: wbm2host-tx-completions-ring3
|
||||
- const: wbm2host-tx-completions-ring2
|
||||
- const: wbm2host-tx-completions-ring1
|
||||
- const: tcl2host-status-ring
|
||||
maxItems: 52
|
||||
|
||||
qcom,rproc:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle
|
||||
@@ -151,20 +48,205 @@ properties:
|
||||
board-2.bin for designs with colliding bus and device specific ids
|
||||
|
||||
memory-region:
|
||||
maxItems: 1
|
||||
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
|
||||
- interrupt-names
|
||||
- qcom,rproc
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
allOf:
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,ipq8074-wifi
|
||||
- qcom,ipq6018-wifi
|
||||
then:
|
||||
properties:
|
||||
interrupts:
|
||||
items:
|
||||
- description: misc-pulse1 interrupt events
|
||||
- description: misc-latch interrupt events
|
||||
- description: sw exception interrupt events
|
||||
- description: watchdog interrupt events
|
||||
- description: interrupt event for ring CE0
|
||||
- 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 CE11
|
||||
- description: interrupt event for ring host2wbm-desc-feed
|
||||
- description: interrupt event for ring host2reo-re-injection
|
||||
- description: interrupt event for ring host2reo-command
|
||||
- description: interrupt event for ring host2rxdma-monitor-ring3
|
||||
- description: interrupt event for ring host2rxdma-monitor-ring2
|
||||
- description: interrupt event for ring host2rxdma-monitor-ring1
|
||||
- description: interrupt event for ring reo2ost-exception
|
||||
- description: interrupt event for ring wbm2host-rx-release
|
||||
- description: interrupt event for ring reo2host-status
|
||||
- description: interrupt event for ring reo2host-destination-ring4
|
||||
- description: interrupt event for ring reo2host-destination-ring3
|
||||
- description: interrupt event for ring reo2host-destination-ring2
|
||||
- description: interrupt event for ring reo2host-destination-ring1
|
||||
- description: interrupt event for ring rxdma2host-monitor-destination-mac3
|
||||
- description: interrupt event for ring rxdma2host-monitor-destination-mac2
|
||||
- description: interrupt event for ring rxdma2host-monitor-destination-mac1
|
||||
- description: interrupt event for ring ppdu-end-interrupts-mac3
|
||||
- description: interrupt event for ring ppdu-end-interrupts-mac2
|
||||
- description: interrupt event for ring ppdu-end-interrupts-mac1
|
||||
- description: interrupt event for ring rxdma2host-monitor-status-ring-mac3
|
||||
- description: interrupt event for ring rxdma2host-monitor-status-ring-mac2
|
||||
- description: interrupt event for ring rxdma2host-monitor-status-ring-mac1
|
||||
- description: interrupt event for ring host2rxdma-host-buf-ring-mac3
|
||||
- description: interrupt event for ring host2rxdma-host-buf-ring-mac2
|
||||
- description: interrupt event for ring host2rxdma-host-buf-ring-mac1
|
||||
- description: interrupt event for ring rxdma2host-destination-ring-mac3
|
||||
- description: interrupt event for ring rxdma2host-destination-ring-mac2
|
||||
- description: interrupt event for ring rxdma2host-destination-ring-mac1
|
||||
- description: interrupt event for ring host2tcl-input-ring4
|
||||
- description: interrupt event for ring host2tcl-input-ring3
|
||||
- description: interrupt event for ring host2tcl-input-ring2
|
||||
- description: interrupt event for ring host2tcl-input-ring1
|
||||
- description: interrupt event for ring wbm2host-tx-completions-ring3
|
||||
- description: interrupt event for ring wbm2host-tx-completions-ring2
|
||||
- description: interrupt event for ring wbm2host-tx-completions-ring1
|
||||
- description: interrupt event for ring tcl2host-status-ring
|
||||
interrupt-names:
|
||||
items:
|
||||
- const: misc-pulse1
|
||||
- const: misc-latch
|
||||
- const: sw-exception
|
||||
- const: watchdog
|
||||
- const: ce0
|
||||
- const: ce1
|
||||
- const: ce2
|
||||
- const: ce3
|
||||
- const: ce4
|
||||
- const: ce5
|
||||
- const: ce6
|
||||
- const: ce7
|
||||
- const: ce8
|
||||
- const: ce9
|
||||
- const: ce10
|
||||
- const: ce11
|
||||
- const: host2wbm-desc-feed
|
||||
- const: host2reo-re-injection
|
||||
- const: host2reo-command
|
||||
- const: host2rxdma-monitor-ring3
|
||||
- const: host2rxdma-monitor-ring2
|
||||
- const: host2rxdma-monitor-ring1
|
||||
- const: reo2ost-exception
|
||||
- const: wbm2host-rx-release
|
||||
- const: reo2host-status
|
||||
- const: reo2host-destination-ring4
|
||||
- const: reo2host-destination-ring3
|
||||
- const: reo2host-destination-ring2
|
||||
- const: reo2host-destination-ring1
|
||||
- const: rxdma2host-monitor-destination-mac3
|
||||
- const: rxdma2host-monitor-destination-mac2
|
||||
- const: rxdma2host-monitor-destination-mac1
|
||||
- const: ppdu-end-interrupts-mac3
|
||||
- const: ppdu-end-interrupts-mac2
|
||||
- const: ppdu-end-interrupts-mac1
|
||||
- const: rxdma2host-monitor-status-ring-mac3
|
||||
- const: rxdma2host-monitor-status-ring-mac2
|
||||
- const: rxdma2host-monitor-status-ring-mac1
|
||||
- const: host2rxdma-host-buf-ring-mac3
|
||||
- const: host2rxdma-host-buf-ring-mac2
|
||||
- const: host2rxdma-host-buf-ring-mac1
|
||||
- const: rxdma2host-destination-ring-mac3
|
||||
- const: rxdma2host-destination-ring-mac2
|
||||
- const: rxdma2host-destination-ring-mac1
|
||||
- const: host2tcl-input-ring4
|
||||
- const: host2tcl-input-ring3
|
||||
- const: host2tcl-input-ring2
|
||||
- const: host2tcl-input-ring1
|
||||
- const: wbm2host-tx-completions-ring3
|
||||
- const: wbm2host-tx-completions-ring2
|
||||
- const: wbm2host-tx-completions-ring1
|
||||
- const: tcl2host-status-ring
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,ipq8074-wifi
|
||||
- qcom,ipq6018-wifi
|
||||
then:
|
||||
required:
|
||||
- interrupt-names
|
||||
|
||||
- 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:
|
||||
- |
|
||||
|
||||
@@ -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>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
%YAML 1.2
|
||||
---
|
||||
|
||||
$id: http://devicetree.org/schemas/staging/net/wireless/silabs,wfx.yaml#
|
||||
$id: http://devicetree.org/schemas/net/wireless/silabs,wfx.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Silicon Labs WFxxx devicetree bindings
|
||||
10
MAINTAINERS
10
MAINTAINERS
@@ -15989,6 +15989,12 @@ T: git git://linuxtv.org/media_tree.git
|
||||
F: Documentation/admin-guide/media/pulse8-cec.rst
|
||||
F: drivers/media/cec/usb/pulse8/
|
||||
|
||||
PURELIFI PLFXLC DRIVER
|
||||
M: Srinivasan Raju <srini.raju@purelifi.com>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/net/wireless/purelifi/plfxlc/
|
||||
|
||||
PVRUSB2 VIDEO4LINUX DRIVER
|
||||
M: Mike Isely <isely@pobox.com>
|
||||
L: pvrusb2@isely.net (subscribers-only)
|
||||
@@ -17997,8 +18003,8 @@ F: drivers/platform/x86/touchscreen_dmi.c
|
||||
SILICON LABS WIRELESS DRIVERS (for WFxxx series)
|
||||
M: Jérôme Pouiller <jerome.pouiller@silabs.com>
|
||||
S: Supported
|
||||
F: Documentation/devicetree/bindings/staging/net/wireless/silabs,wfx.yaml
|
||||
F: drivers/staging/wfx/
|
||||
F: Documentation/devicetree/bindings/net/wireless/silabs,wfx.yaml
|
||||
F: drivers/net/wireless/silabs/wfx/
|
||||
|
||||
SILICON MOTION SM712 FRAME BUFFER DRIVER
|
||||
M: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
|
||||
|
||||
@@ -28,9 +28,11 @@ source "drivers/net/wireless/intersil/Kconfig"
|
||||
source "drivers/net/wireless/marvell/Kconfig"
|
||||
source "drivers/net/wireless/mediatek/Kconfig"
|
||||
source "drivers/net/wireless/microchip/Kconfig"
|
||||
source "drivers/net/wireless/purelifi/Kconfig"
|
||||
source "drivers/net/wireless/ralink/Kconfig"
|
||||
source "drivers/net/wireless/realtek/Kconfig"
|
||||
source "drivers/net/wireless/rsi/Kconfig"
|
||||
source "drivers/net/wireless/silabs/Kconfig"
|
||||
source "drivers/net/wireless/st/Kconfig"
|
||||
source "drivers/net/wireless/ti/Kconfig"
|
||||
source "drivers/net/wireless/zydas/Kconfig"
|
||||
|
||||
@@ -13,9 +13,11 @@ obj-$(CONFIG_WLAN_VENDOR_INTERSIL) += intersil/
|
||||
obj-$(CONFIG_WLAN_VENDOR_MARVELL) += marvell/
|
||||
obj-$(CONFIG_WLAN_VENDOR_MEDIATEK) += mediatek/
|
||||
obj-$(CONFIG_WLAN_VENDOR_MICROCHIP) += microchip/
|
||||
obj-$(CONFIG_WLAN_VENDOR_PURELIFI) += purelifi/
|
||||
obj-$(CONFIG_WLAN_VENDOR_RALINK) += ralink/
|
||||
obj-$(CONFIG_WLAN_VENDOR_REALTEK) += realtek/
|
||||
obj-$(CONFIG_WLAN_VENDOR_RSI) += rsi/
|
||||
obj-$(CONFIG_WLAN_VENDOR_SILABS) += silabs/
|
||||
obj-$(CONFIG_WLAN_VENDOR_ST) += st/
|
||||
obj-$(CONFIG_WLAN_VENDOR_TI) += ti/
|
||||
obj-$(CONFIG_WLAN_VENDOR_ZYDAS) += zydas/
|
||||
|
||||
@@ -1160,7 +1160,7 @@ static int ar5523_get_wlan_mode(struct ar5523 *ar,
|
||||
ar5523_info(ar, "STA not found!\n");
|
||||
return WLAN_MODE_11b;
|
||||
}
|
||||
sta_rate_set = sta->supp_rates[ar->hw->conf.chandef.chan->band];
|
||||
sta_rate_set = sta->deflink.supp_rates[ar->hw->conf.chandef.chan->band];
|
||||
|
||||
for (bit = 0; bit < band->n_bitrates; bit++) {
|
||||
if (sta_rate_set & 1) {
|
||||
@@ -1198,7 +1198,7 @@ static void ar5523_create_rateset(struct ar5523 *ar,
|
||||
ar5523_info(ar, "STA not found. Cannot set rates\n");
|
||||
sta_rate_set = bss_conf->basic_rates;
|
||||
} else
|
||||
sta_rate_set = sta->supp_rates[ar->hw->conf.chandef.chan->band];
|
||||
sta_rate_set = sta->deflink.supp_rates[ar->hw->conf.chandef.chan->band];
|
||||
|
||||
ar5523_dbg(ar, "sta rate_set = %08x\n", sta_rate_set);
|
||||
|
||||
|
||||
@@ -728,20 +728,17 @@ static int ath10k_ahb_probe(struct platform_device *pdev)
|
||||
struct ath10k *ar;
|
||||
struct ath10k_ahb *ar_ahb;
|
||||
struct ath10k_pci *ar_pci;
|
||||
const struct of_device_id *of_id;
|
||||
enum ath10k_hw_rev hw_rev;
|
||||
size_t size;
|
||||
int ret;
|
||||
struct ath10k_bus_params bus_params = {};
|
||||
|
||||
of_id = of_match_device(ath10k_ahb_of_match, &pdev->dev);
|
||||
if (!of_id) {
|
||||
dev_err(&pdev->dev, "failed to find matching device tree id\n");
|
||||
hw_rev = (enum ath10k_hw_rev)of_device_get_match_data(&pdev->dev);
|
||||
if (!hw_rev) {
|
||||
dev_err(&pdev->dev, "OF data missing\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
hw_rev = (enum ath10k_hw_rev)of_id->data;
|
||||
|
||||
size = sizeof(*ar_pci) + sizeof(*ar_ahb);
|
||||
ar = ath10k_core_create(size, &pdev->dev, ATH10K_BUS_AHB,
|
||||
hw_rev, &ath10k_ahb_hif_ops);
|
||||
|
||||
@@ -94,6 +94,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.credit_size_workaround = false,
|
||||
.tx_stats_over_pktlog = true,
|
||||
.dynamic_sar_support = false,
|
||||
.hw_restart_disconnect = false,
|
||||
},
|
||||
{
|
||||
.id = QCA988X_HW_2_0_VERSION,
|
||||
@@ -131,6 +132,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.credit_size_workaround = false,
|
||||
.tx_stats_over_pktlog = true,
|
||||
.dynamic_sar_support = false,
|
||||
.hw_restart_disconnect = false,
|
||||
},
|
||||
{
|
||||
.id = QCA9887_HW_1_0_VERSION,
|
||||
@@ -169,6 +171,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.credit_size_workaround = false,
|
||||
.tx_stats_over_pktlog = false,
|
||||
.dynamic_sar_support = false,
|
||||
.hw_restart_disconnect = false,
|
||||
},
|
||||
{
|
||||
.id = QCA6174_HW_3_2_VERSION,
|
||||
@@ -202,6 +205,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.bmi_large_size_download = true,
|
||||
.supports_peer_stats_info = true,
|
||||
.dynamic_sar_support = true,
|
||||
.hw_restart_disconnect = false,
|
||||
},
|
||||
{
|
||||
.id = QCA6174_HW_2_1_VERSION,
|
||||
@@ -239,6 +243,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.credit_size_workaround = false,
|
||||
.tx_stats_over_pktlog = false,
|
||||
.dynamic_sar_support = false,
|
||||
.hw_restart_disconnect = false,
|
||||
},
|
||||
{
|
||||
.id = QCA6174_HW_2_1_VERSION,
|
||||
@@ -276,6 +281,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.credit_size_workaround = false,
|
||||
.tx_stats_over_pktlog = false,
|
||||
.dynamic_sar_support = false,
|
||||
.hw_restart_disconnect = false,
|
||||
},
|
||||
{
|
||||
.id = QCA6174_HW_3_0_VERSION,
|
||||
@@ -313,6 +319,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.credit_size_workaround = false,
|
||||
.tx_stats_over_pktlog = false,
|
||||
.dynamic_sar_support = false,
|
||||
.hw_restart_disconnect = false,
|
||||
},
|
||||
{
|
||||
.id = QCA6174_HW_3_2_VERSION,
|
||||
@@ -354,6 +361,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.tx_stats_over_pktlog = false,
|
||||
.supports_peer_stats_info = true,
|
||||
.dynamic_sar_support = true,
|
||||
.hw_restart_disconnect = false,
|
||||
},
|
||||
{
|
||||
.id = QCA99X0_HW_2_0_DEV_VERSION,
|
||||
@@ -397,6 +405,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.credit_size_workaround = false,
|
||||
.tx_stats_over_pktlog = false,
|
||||
.dynamic_sar_support = false,
|
||||
.hw_restart_disconnect = false,
|
||||
},
|
||||
{
|
||||
.id = QCA9984_HW_1_0_DEV_VERSION,
|
||||
@@ -447,6 +456,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.credit_size_workaround = false,
|
||||
.tx_stats_over_pktlog = false,
|
||||
.dynamic_sar_support = false,
|
||||
.hw_restart_disconnect = false,
|
||||
},
|
||||
{
|
||||
.id = QCA9888_HW_2_0_DEV_VERSION,
|
||||
@@ -494,6 +504,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.credit_size_workaround = false,
|
||||
.tx_stats_over_pktlog = false,
|
||||
.dynamic_sar_support = false,
|
||||
.hw_restart_disconnect = false,
|
||||
},
|
||||
{
|
||||
.id = QCA9377_HW_1_0_DEV_VERSION,
|
||||
@@ -531,6 +542,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.credit_size_workaround = false,
|
||||
.tx_stats_over_pktlog = false,
|
||||
.dynamic_sar_support = false,
|
||||
.hw_restart_disconnect = false,
|
||||
},
|
||||
{
|
||||
.id = QCA9377_HW_1_1_DEV_VERSION,
|
||||
@@ -570,6 +582,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.credit_size_workaround = false,
|
||||
.tx_stats_over_pktlog = false,
|
||||
.dynamic_sar_support = false,
|
||||
.hw_restart_disconnect = false,
|
||||
},
|
||||
{
|
||||
.id = QCA9377_HW_1_1_DEV_VERSION,
|
||||
@@ -600,6 +613,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.uart_pin_workaround = true,
|
||||
.credit_size_workaround = true,
|
||||
.dynamic_sar_support = false,
|
||||
.hw_restart_disconnect = false,
|
||||
},
|
||||
{
|
||||
.id = QCA4019_HW_1_0_DEV_VERSION,
|
||||
@@ -644,6 +658,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.credit_size_workaround = false,
|
||||
.tx_stats_over_pktlog = false,
|
||||
.dynamic_sar_support = false,
|
||||
.hw_restart_disconnect = false,
|
||||
},
|
||||
{
|
||||
.id = WCN3990_HW_1_0_DEV_VERSION,
|
||||
@@ -674,6 +689,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.credit_size_workaround = false,
|
||||
.tx_stats_over_pktlog = false,
|
||||
.dynamic_sar_support = true,
|
||||
.hw_restart_disconnect = true,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -2442,6 +2458,7 @@ EXPORT_SYMBOL(ath10k_core_napi_sync_disable);
|
||||
static void ath10k_core_restart(struct work_struct *work)
|
||||
{
|
||||
struct ath10k *ar = container_of(work, struct ath10k, restart_work);
|
||||
struct ath10k_vif *arvif;
|
||||
int ret;
|
||||
|
||||
set_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags);
|
||||
@@ -2480,6 +2497,14 @@ static void ath10k_core_restart(struct work_struct *work)
|
||||
ar->state = ATH10K_STATE_RESTARTING;
|
||||
ath10k_halt(ar);
|
||||
ath10k_scan_finish(ar);
|
||||
if (ar->hw_params.hw_restart_disconnect) {
|
||||
list_for_each_entry(arvif, &ar->arvifs, list) {
|
||||
if (arvif->is_up &&
|
||||
arvif->vdev_type == WMI_VDEV_TYPE_STA)
|
||||
ieee80211_hw_restart_disconnect(arvif->vif);
|
||||
}
|
||||
}
|
||||
|
||||
ieee80211_restart_hw(ar->hw);
|
||||
break;
|
||||
case ATH10K_STATE_OFF:
|
||||
|
||||
@@ -59,9 +59,6 @@
|
||||
#define ATH10K_KEEPALIVE_MAX_IDLE 3895
|
||||
#define ATH10K_KEEPALIVE_MAX_UNRESPONSIVE 3900
|
||||
|
||||
/* NAPI poll budget */
|
||||
#define ATH10K_NAPI_BUDGET 64
|
||||
|
||||
/* SMBIOS type containing Board Data File Name Extension */
|
||||
#define ATH10K_SMBIOS_BDF_EXT_TYPE 0xF8
|
||||
|
||||
|
||||
@@ -633,6 +633,8 @@ struct ath10k_hw_params {
|
||||
bool supports_peer_stats_info;
|
||||
|
||||
bool dynamic_sar_support;
|
||||
|
||||
bool hw_restart_disconnect;
|
||||
};
|
||||
|
||||
struct htt_resp;
|
||||
|
||||
@@ -2251,7 +2251,7 @@ static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
|
||||
|
||||
band = def.chan->band;
|
||||
sband = ar->hw->wiphy->bands[band];
|
||||
ratemask = sta->supp_rates[band];
|
||||
ratemask = sta->deflink.supp_rates[band];
|
||||
ratemask &= arvif->bitrate_mask.control[band].legacy;
|
||||
rates = sband->bitrates;
|
||||
|
||||
@@ -2296,7 +2296,7 @@ static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
|
||||
struct ieee80211_sta *sta,
|
||||
struct wmi_peer_assoc_complete_arg *arg)
|
||||
{
|
||||
const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
|
||||
const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
|
||||
struct ath10k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct cfg80211_chan_def def;
|
||||
enum nl80211_band band;
|
||||
@@ -2335,7 +2335,7 @@ static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
|
||||
if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
|
||||
arg->peer_flags |= ar->wmi.peer_flags->ldbc;
|
||||
|
||||
if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
|
||||
if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) {
|
||||
arg->peer_flags |= ar->wmi.peer_flags->bw40;
|
||||
arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
|
||||
}
|
||||
@@ -2388,7 +2388,8 @@ static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
|
||||
arg->peer_ht_rates.rates[i] = i;
|
||||
} else {
|
||||
arg->peer_ht_rates.num_rates = n;
|
||||
arg->peer_num_spatial_streams = min(sta->rx_nss, max_nss);
|
||||
arg->peer_num_spatial_streams = min(sta->deflink.rx_nss,
|
||||
max_nss);
|
||||
}
|
||||
|
||||
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
|
||||
@@ -2545,7 +2546,7 @@ static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
|
||||
struct ieee80211_sta *sta,
|
||||
struct wmi_peer_assoc_complete_arg *arg)
|
||||
{
|
||||
const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
|
||||
const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
|
||||
struct ath10k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath10k_hw_params *hw = &ar->hw_params;
|
||||
struct cfg80211_chan_def def;
|
||||
@@ -2587,10 +2588,10 @@ static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
|
||||
(1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
|
||||
ampdu_factor)) - 1);
|
||||
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
|
||||
arg->peer_flags |= ar->wmi.peer_flags->bw80;
|
||||
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
|
||||
arg->peer_flags |= ar->wmi.peer_flags->bw160;
|
||||
|
||||
/* Calculate peer NSS capability from VHT capabilities if STA
|
||||
@@ -2604,7 +2605,7 @@ static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
|
||||
vht_mcs_mask[i])
|
||||
max_nss = i + 1;
|
||||
}
|
||||
arg->peer_num_spatial_streams = min(sta->rx_nss, max_nss);
|
||||
arg->peer_num_spatial_streams = min(sta->deflink.rx_nss, max_nss);
|
||||
arg->peer_vht_rates.rx_max_rate =
|
||||
__le16_to_cpu(vht_cap->vht_mcs.rx_highest);
|
||||
arg->peer_vht_rates.rx_mcs_set =
|
||||
@@ -2684,15 +2685,15 @@ static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
|
||||
|
||||
static bool ath10k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
|
||||
{
|
||||
return sta->supp_rates[NL80211_BAND_2GHZ] >>
|
||||
return sta->deflink.supp_rates[NL80211_BAND_2GHZ] >>
|
||||
ATH10K_MAC_FIRST_OFDM_RATE_IDX;
|
||||
}
|
||||
|
||||
static enum wmi_phy_mode ath10k_mac_get_phymode_vht(struct ath10k *ar,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_160) {
|
||||
switch (sta->vht_cap.cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
|
||||
switch (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
|
||||
case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
|
||||
return MODE_11AC_VHT160;
|
||||
case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ:
|
||||
@@ -2703,13 +2704,13 @@ static enum wmi_phy_mode ath10k_mac_get_phymode_vht(struct ath10k *ar,
|
||||
}
|
||||
}
|
||||
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
|
||||
return MODE_11AC_VHT80;
|
||||
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
return MODE_11AC_VHT40;
|
||||
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
|
||||
return MODE_11AC_VHT20;
|
||||
|
||||
return MODE_UNKNOWN;
|
||||
@@ -2736,15 +2737,15 @@ static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
|
||||
|
||||
switch (band) {
|
||||
case NL80211_BAND_2GHZ:
|
||||
if (sta->vht_cap.vht_supported &&
|
||||
if (sta->deflink.vht_cap.vht_supported &&
|
||||
!ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
phymode = MODE_11AC_VHT40;
|
||||
else
|
||||
phymode = MODE_11AC_VHT20;
|
||||
} else if (sta->ht_cap.ht_supported &&
|
||||
} else if (sta->deflink.ht_cap.ht_supported &&
|
||||
!ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
phymode = MODE_11NG_HT40;
|
||||
else
|
||||
phymode = MODE_11NG_HT20;
|
||||
@@ -2759,12 +2760,12 @@ static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
|
||||
/*
|
||||
* Check VHT first.
|
||||
*/
|
||||
if (sta->vht_cap.vht_supported &&
|
||||
if (sta->deflink.vht_cap.vht_supported &&
|
||||
!ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
|
||||
phymode = ath10k_mac_get_phymode_vht(ar, sta);
|
||||
} else if (sta->ht_cap.ht_supported &&
|
||||
} else if (sta->deflink.ht_cap.ht_supported &&
|
||||
!ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
|
||||
if (sta->bandwidth >= IEEE80211_STA_RX_BW_40)
|
||||
if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40)
|
||||
phymode = MODE_11NA_HT40;
|
||||
else
|
||||
phymode = MODE_11NA_HT20;
|
||||
@@ -3079,8 +3080,8 @@ static void ath10k_bss_assoc(struct ieee80211_hw *hw,
|
||||
/* ap_sta must be accessed only within rcu section which must be left
|
||||
* before calling ath10k_setup_peer_smps() which might sleep.
|
||||
*/
|
||||
ht_cap = ap_sta->ht_cap;
|
||||
vht_cap = ap_sta->vht_cap;
|
||||
ht_cap = ap_sta->deflink.ht_cap;
|
||||
vht_cap = ap_sta->deflink.vht_cap;
|
||||
|
||||
ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg);
|
||||
if (ret) {
|
||||
@@ -3278,7 +3279,7 @@ static int ath10k_station_assoc(struct ath10k *ar,
|
||||
*/
|
||||
if (!reassoc) {
|
||||
ret = ath10k_setup_peer_smps(ar, arvif, sta->addr,
|
||||
&sta->ht_cap);
|
||||
&sta->deflink.ht_cap);
|
||||
if (ret) {
|
||||
ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n",
|
||||
arvif->vdev_id, ret);
|
||||
@@ -4118,11 +4119,10 @@ void ath10k_offchan_tx_work(struct work_struct *work)
|
||||
peer = ath10k_peer_find(ar, vdev_id, peer_addr);
|
||||
spin_unlock_bh(&ar->data_lock);
|
||||
|
||||
if (peer)
|
||||
if (peer) {
|
||||
ath10k_warn(ar, "peer %pM on vdev %d already present\n",
|
||||
peer_addr, vdev_id);
|
||||
|
||||
if (!peer) {
|
||||
} else {
|
||||
ret = ath10k_peer_create(ar, NULL, NULL, vdev_id,
|
||||
peer_addr,
|
||||
WMI_PEER_TYPE_DEFAULT);
|
||||
@@ -5339,13 +5339,29 @@ err:
|
||||
static void ath10k_stop(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct ath10k *ar = hw->priv;
|
||||
u32 opt;
|
||||
|
||||
ath10k_drain_tx(ar);
|
||||
|
||||
mutex_lock(&ar->conf_mutex);
|
||||
if (ar->state != ATH10K_STATE_OFF) {
|
||||
if (!ar->hw_rfkill_on)
|
||||
ath10k_halt(ar);
|
||||
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);
|
||||
} 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;
|
||||
}
|
||||
mutex_unlock(&ar->conf_mutex);
|
||||
@@ -6787,10 +6803,10 @@ static int ath10k_sta_set_txpwr(struct ieee80211_hw *hw,
|
||||
int ret = 0;
|
||||
s16 txpwr;
|
||||
|
||||
if (sta->txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
|
||||
if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
|
||||
txpwr = 0;
|
||||
} else {
|
||||
txpwr = sta->txpwr.power;
|
||||
txpwr = sta->deflink.txpwr.power;
|
||||
if (!txpwr)
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -6910,26 +6926,26 @@ static int ath10k_mac_validate_rate_mask(struct ath10k *ar,
|
||||
struct ieee80211_sta *sta,
|
||||
u32 rate_ctrl_flag, u8 nss)
|
||||
{
|
||||
if (nss > sta->rx_nss) {
|
||||
if (nss > sta->deflink.rx_nss) {
|
||||
ath10k_warn(ar, "Invalid nss field, configured %u limit %u\n",
|
||||
nss, sta->rx_nss);
|
||||
nss, sta->deflink.rx_nss);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (ATH10K_HW_PREAMBLE(rate_ctrl_flag) == WMI_RATE_PREAMBLE_VHT) {
|
||||
if (!sta->vht_cap.vht_supported) {
|
||||
if (!sta->deflink.vht_cap.vht_supported) {
|
||||
ath10k_warn(ar, "Invalid VHT rate for sta %pM\n",
|
||||
sta->addr);
|
||||
return -EINVAL;
|
||||
}
|
||||
} else if (ATH10K_HW_PREAMBLE(rate_ctrl_flag) == WMI_RATE_PREAMBLE_HT) {
|
||||
if (!sta->ht_cap.ht_supported || sta->vht_cap.vht_supported) {
|
||||
if (!sta->deflink.ht_cap.ht_supported || sta->deflink.vht_cap.vht_supported) {
|
||||
ath10k_warn(ar, "Invalid HT rate for sta %pM\n",
|
||||
sta->addr);
|
||||
return -EINVAL;
|
||||
}
|
||||
} else {
|
||||
if (sta->ht_cap.ht_supported || sta->vht_cap.vht_supported)
|
||||
if (sta->deflink.ht_cap.ht_supported || sta->deflink.vht_cap.vht_supported)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -8272,7 +8288,7 @@ static bool ath10k_mac_set_vht_bitrate_mask_fixup(struct ath10k *ar,
|
||||
u8 rate = arvif->vht_pfr;
|
||||
|
||||
/* skip non vht and multiple rate peers */
|
||||
if (!sta->vht_cap.vht_supported || arvif->vht_num_rates != 1)
|
||||
if (!sta->deflink.vht_cap.vht_supported || arvif->vht_num_rates != 1)
|
||||
return false;
|
||||
|
||||
err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
|
||||
@@ -8313,7 +8329,7 @@ static void ath10k_mac_clr_bitrate_mask_iter(void *data,
|
||||
int err;
|
||||
|
||||
/* clear vht peers only */
|
||||
if (arsta->arvif != arvif || !sta->vht_cap.vht_supported)
|
||||
if (arsta->arvif != arvif || !sta->deflink.vht_cap.vht_supported)
|
||||
return;
|
||||
|
||||
err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
|
||||
@@ -8457,13 +8473,14 @@ static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
|
||||
|
||||
ath10k_dbg(ar, ATH10K_DBG_STA,
|
||||
"mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
|
||||
sta->addr, changed, sta->bandwidth, sta->rx_nss,
|
||||
sta->addr, changed, sta->deflink.bandwidth,
|
||||
sta->deflink.rx_nss,
|
||||
sta->smps_mode);
|
||||
|
||||
if (changed & IEEE80211_RC_BW_CHANGED) {
|
||||
bw = WMI_PEER_CHWIDTH_20MHZ;
|
||||
|
||||
switch (sta->bandwidth) {
|
||||
switch (sta->deflink.bandwidth) {
|
||||
case IEEE80211_STA_RX_BW_20:
|
||||
bw = WMI_PEER_CHWIDTH_20MHZ;
|
||||
break;
|
||||
@@ -8478,7 +8495,7 @@ static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
|
||||
break;
|
||||
default:
|
||||
ath10k_warn(ar, "Invalid bandwidth %d in rc update for %pM\n",
|
||||
sta->bandwidth, sta->addr);
|
||||
sta->deflink.bandwidth, sta->addr);
|
||||
bw = WMI_PEER_CHWIDTH_20MHZ;
|
||||
break;
|
||||
}
|
||||
@@ -8487,7 +8504,7 @@ static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
|
||||
}
|
||||
|
||||
if (changed & IEEE80211_RC_NSS_CHANGED)
|
||||
arsta->nss = sta->rx_nss;
|
||||
arsta->nss = sta->deflink.rx_nss;
|
||||
|
||||
if (changed & IEEE80211_RC_SMPS_CHANGED) {
|
||||
smps = WMI_PEER_SMPS_PS_NONE;
|
||||
|
||||
@@ -3216,7 +3216,7 @@ static void ath10k_pci_free_irq(struct ath10k *ar)
|
||||
void ath10k_pci_init_napi(struct ath10k *ar)
|
||||
{
|
||||
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)
|
||||
|
||||
@@ -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,
|
||||
ATH10K_NAPI_BUDGET);
|
||||
NAPI_POLL_WEIGHT);
|
||||
|
||||
ath10k_dbg(ar, ATH10K_DBG_BOOT,
|
||||
"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)
|
||||
{
|
||||
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)
|
||||
|
||||
@@ -345,6 +345,12 @@ static void ath10k_usb_rx_complete(struct ath10k *ar, struct sk_buff *skb)
|
||||
ep->ep_ops.ep_rx_complete(ar, skb);
|
||||
/* The RX complete handler now owns the skb... */
|
||||
|
||||
if (test_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags)) {
|
||||
local_bh_disable();
|
||||
napi_schedule(&ar->napi);
|
||||
local_bh_enable();
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
out_free_skb:
|
||||
@@ -387,6 +393,7 @@ static int ath10k_usb_hif_start(struct ath10k *ar)
|
||||
int i;
|
||||
struct ath10k_usb *ar_usb = ath10k_usb_priv(ar);
|
||||
|
||||
ath10k_core_napi_enable(ar);
|
||||
ath10k_usb_start_recv_pipes(ar);
|
||||
|
||||
/* set the TX resource avail threshold for each TX pipe */
|
||||
@@ -462,6 +469,7 @@ err:
|
||||
static void ath10k_usb_hif_stop(struct ath10k *ar)
|
||||
{
|
||||
ath10k_usb_flush_all(ar);
|
||||
ath10k_core_napi_sync_disable(ar);
|
||||
}
|
||||
|
||||
static u16 ath10k_usb_hif_get_free_queue_number(struct ath10k *ar, u8 pipe_id)
|
||||
@@ -966,6 +974,20 @@ err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ath10k_usb_napi_poll(struct napi_struct *ctx, int budget)
|
||||
{
|
||||
struct ath10k *ar = container_of(ctx, struct ath10k, napi);
|
||||
int done;
|
||||
|
||||
done = ath10k_htt_rx_hl_indication(ar, budget);
|
||||
ath10k_dbg(ar, ATH10K_DBG_USB, "napi poll: done: %d, budget:%d\n", done, budget);
|
||||
|
||||
if (done < budget)
|
||||
napi_complete_done(ctx, done);
|
||||
|
||||
return done;
|
||||
}
|
||||
|
||||
/* ath10k usb driver registered functions */
|
||||
static int ath10k_usb_probe(struct usb_interface *interface,
|
||||
const struct usb_device_id *id)
|
||||
@@ -992,6 +1014,9 @@ static int ath10k_usb_probe(struct usb_interface *interface,
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
netif_napi_add(&ar->napi_dev, &ar->napi, ath10k_usb_napi_poll,
|
||||
NAPI_POLL_WEIGHT);
|
||||
|
||||
usb_get_dev(dev);
|
||||
vendor_id = le16_to_cpu(dev->descriptor.idVendor);
|
||||
product_id = le16_to_cpu(dev->descriptor.idProduct);
|
||||
@@ -1013,6 +1038,7 @@ static int ath10k_usb_probe(struct usb_interface *interface,
|
||||
bus_params.dev_type = ATH10K_DEV_TYPE_HL;
|
||||
/* TODO: don't know yet how to get chip_id with USB */
|
||||
bus_params.chip_id = 0;
|
||||
bus_params.hl_msdu_ids = true;
|
||||
ret = ath10k_core_register(ar, &bus_params);
|
||||
if (ret) {
|
||||
ath10k_warn(ar, "failed to register driver core: %d\n", ret);
|
||||
@@ -1044,6 +1070,7 @@ static void ath10k_usb_remove(struct usb_interface *interface)
|
||||
return;
|
||||
|
||||
ath10k_core_unregister(ar_usb->ar);
|
||||
netif_napi_del(&ar_usb->ar->napi);
|
||||
ath10k_usb_destroy(ar_usb->ar);
|
||||
usb_put_dev(interface_to_usbdev(interface));
|
||||
ath10k_core_destroy(ar_usb->ar);
|
||||
|
||||
@@ -17,13 +17,14 @@ ath11k-y += core.o \
|
||||
peer.o \
|
||||
dbring.o \
|
||||
hw.o \
|
||||
wow.o
|
||||
pcic.o
|
||||
|
||||
ath11k-$(CONFIG_ATH11K_DEBUGFS) += debugfs.o debugfs_htt_stats.o debugfs_sta.o
|
||||
ath11k-$(CONFIG_NL80211_TESTMODE) += testmode.o
|
||||
ath11k-$(CONFIG_ATH11K_TRACING) += trace.o
|
||||
ath11k-$(CONFIG_THERMAL) += thermal.o
|
||||
ath11k-$(CONFIG_ATH11K_SPECTRAL) += spectral.o
|
||||
ath11k-$(CONFIG_PM) += wow.o
|
||||
|
||||
obj-$(CONFIG_ATH11K_AHB) += ath11k_ahb.o
|
||||
ath11k_ahb-y += ahb.o
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
||||
/*
|
||||
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
@@ -12,6 +13,7 @@
|
||||
#include "debug.h"
|
||||
#include "hif.h"
|
||||
#include <linux/remoteproc.h>
|
||||
#include "pcic.h"
|
||||
|
||||
static const struct of_device_id ath11k_ahb_of_match[] = {
|
||||
/* 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",
|
||||
.data = (void *)ATH11K_HW_IPQ6018_HW10,
|
||||
},
|
||||
{ .compatible = "qcom,wcn6750-wifi",
|
||||
.data = (void *)ATH11K_HW_WCN6750_HW10,
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
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
|
||||
|
||||
static const char *irq_name[ATH11K_IRQ_NUM_MAX] = {
|
||||
@@ -134,6 +132,16 @@ enum ext_irq_num {
|
||||
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)
|
||||
{
|
||||
return ioread32(ab->mem + offset);
|
||||
@@ -401,6 +409,9 @@ static void ath11k_ahb_free_irq(struct ath11k_base *ab)
|
||||
int irq_idx;
|
||||
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++) {
|
||||
if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR)
|
||||
continue;
|
||||
@@ -555,6 +566,9 @@ static int ath11k_ahb_config_irq(struct ath11k_base *ab)
|
||||
int irq, irq_idx, i;
|
||||
int ret;
|
||||
|
||||
if (ab->hw_params.hybrid_bus_type)
|
||||
return ath11k_pcic_config_irq(ab);
|
||||
|
||||
/* Configure CE irqs */
|
||||
for (i = 0; i < ab->hw_params.ce_count; 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;
|
||||
}
|
||||
|
||||
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,
|
||||
.stop = ath11k_ahb_stop,
|
||||
.read32 = ath11k_ahb_read32,
|
||||
@@ -636,6 +650,20 @@ static const struct ath11k_hif_ops ath11k_ahb_hif_ops = {
|
||||
.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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
struct ath11k_base *ab;
|
||||
const struct of_device_id *of_id;
|
||||
struct resource *mem_res;
|
||||
void __iomem *mem;
|
||||
const struct ath11k_hif_ops *hif_ops;
|
||||
const struct ath11k_pci_ops *pci_ops;
|
||||
enum ath11k_hw_rev hw_rev;
|
||||
int ret;
|
||||
|
||||
of_id = of_match_device(ath11k_ahb_of_match, &pdev->dev);
|
||||
@@ -672,10 +772,21 @@ static int ath11k_ahb_probe(struct platform_device *pdev)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
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);
|
||||
hw_rev = (enum ath11k_hw_rev)of_id->data;
|
||||
|
||||
switch (hw_rev) {
|
||||
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));
|
||||
@@ -685,20 +796,22 @@ static int ath11k_ahb_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
ab = ath11k_core_alloc(&pdev->dev, sizeof(struct ath11k_ahb),
|
||||
ATH11K_BUS_AHB,
|
||||
&ath11k_ahb_bus_params);
|
||||
ATH11K_BUS_AHB);
|
||||
if (!ab) {
|
||||
dev_err(&pdev->dev, "failed to allocate ath11k base\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ab->hif.ops = &ath11k_ahb_hif_ops;
|
||||
ab->hif.ops = hif_ops;
|
||||
ab->pci.ops = pci_ops;
|
||||
ab->pdev = pdev;
|
||||
ab->hw_rev = (enum ath11k_hw_rev)of_id->data;
|
||||
ab->mem = mem;
|
||||
ab->mem_len = resource_size(mem_res);
|
||||
ab->hw_rev = hw_rev;
|
||||
platform_set_drvdata(pdev, ab);
|
||||
|
||||
ret = ath11k_ahb_setup_resources(ab);
|
||||
if (ret)
|
||||
goto err_core_free;
|
||||
|
||||
ret = ath11k_core_pre_init(ab);
|
||||
if (ret)
|
||||
goto err_core_free;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
||||
/*
|
||||
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2021, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#include "dp_rx.h"
|
||||
@@ -918,9 +919,6 @@ int ath11k_ce_init_pipes(struct ath11k_base *ab)
|
||||
int i;
|
||||
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++) {
|
||||
pipe = &ab->ce.ce_pipe[i];
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,7 @@
|
||||
/* SPDX-License-Identifier: BSD-3-Clause-Clear */
|
||||
/*
|
||||
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef ATH11K_CORE_H
|
||||
@@ -10,6 +11,9 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/rhashtable.h>
|
||||
#include "qmi.h"
|
||||
#include "htc.h"
|
||||
#include "wmi.h"
|
||||
@@ -23,6 +27,7 @@
|
||||
#include "thermal.h"
|
||||
#include "dbring.h"
|
||||
#include "spectral.h"
|
||||
#include "wow.h"
|
||||
|
||||
#define SM(_v, _f) (((_v) << _f##_LSB) & _f##_MASK)
|
||||
|
||||
@@ -36,9 +41,26 @@
|
||||
#define ATH11K_INVALID_HW_MAC_ID 0xFF
|
||||
#define ATH11K_CONNECTION_LOSS_HZ (3 * HZ)
|
||||
|
||||
/* SMBIOS type containing Board Data File Name Extension */
|
||||
#define ATH11K_SMBIOS_BDF_EXT_TYPE 0xF8
|
||||
|
||||
/* SMBIOS type structure length (excluding strings-set) */
|
||||
#define ATH11K_SMBIOS_BDF_EXT_LENGTH 0x9
|
||||
|
||||
/* The magic used by QCA spec */
|
||||
#define ATH11K_SMBIOS_BDF_EXT_MAGIC "BDF_"
|
||||
|
||||
extern unsigned int ath11k_frame_mode;
|
||||
|
||||
#define ATH11K_SCAN_TIMEOUT_HZ (20 * HZ)
|
||||
|
||||
#define ATH11K_MON_TIMER_INTERVAL 10
|
||||
#define ATH11K_RESET_TIMEOUT_HZ (20 * HZ)
|
||||
#define ATH11K_RESET_MAX_FAIL_COUNT_FIRST 3
|
||||
#define ATH11K_RESET_MAX_FAIL_COUNT_FINAL 5
|
||||
#define ATH11K_RESET_FAIL_TIMEOUT_HZ (20 * HZ)
|
||||
#define ATH11K_RECONFIGURE_TIMEOUT_HZ (10 * HZ)
|
||||
#define ATH11K_RECOVER_START_TIMEOUT_HZ (20 * HZ)
|
||||
|
||||
enum ath11k_supported_bw {
|
||||
ATH11K_BW_20 = 0,
|
||||
@@ -118,6 +140,7 @@ enum ath11k_hw_rev {
|
||||
ATH11K_HW_QCN9074_HW10,
|
||||
ATH11K_HW_WCN6855_HW20,
|
||||
ATH11K_HW_WCN6855_HW21,
|
||||
ATH11K_HW_WCN6750_HW10,
|
||||
};
|
||||
|
||||
enum ath11k_firmware_mode {
|
||||
@@ -147,6 +170,39 @@ struct ath11k_ext_irq_grp {
|
||||
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 dmi_header hdr;
|
||||
|
||||
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_ext[];
|
||||
} __packed;
|
||||
|
||||
#define HEHANDLE_CAP_PHYINFO_SIZE 3
|
||||
#define HECAP_PHYINFO_SIZE 9
|
||||
#define HECAP_MACINFO_SIZE 5
|
||||
@@ -189,6 +245,12 @@ enum ath11k_scan_state {
|
||||
ATH11K_SCAN_ABORTING,
|
||||
};
|
||||
|
||||
enum ath11k_11d_state {
|
||||
ATH11K_11D_IDLE,
|
||||
ATH11K_11D_PREPARING,
|
||||
ATH11K_11D_RUNNING,
|
||||
};
|
||||
|
||||
enum ath11k_dev_flags {
|
||||
ATH11K_CAC_RUNNING,
|
||||
ATH11K_FLAG_CORE_REGISTERED,
|
||||
@@ -204,6 +266,8 @@ enum ath11k_dev_flags {
|
||||
ATH11K_FLAG_CE_IRQ_ENABLED,
|
||||
ATH11K_FLAG_EXT_IRQ_ENABLED,
|
||||
ATH11K_FLAG_FIXED_MEM_RGN,
|
||||
ATH11K_FLAG_DEVICE_INIT_DONE,
|
||||
ATH11K_FLAG_MULTI_MSI_VECTORS,
|
||||
};
|
||||
|
||||
enum ath11k_monitor_flags {
|
||||
@@ -212,6 +276,30 @@ enum ath11k_monitor_flags {
|
||||
ATH11K_FLAG_MONITOR_VDEV_CREATED,
|
||||
};
|
||||
|
||||
#define ATH11K_IPV6_UC_TYPE 0
|
||||
#define ATH11K_IPV6_AC_TYPE 1
|
||||
|
||||
#define ATH11K_IPV6_MAX_COUNT 16
|
||||
#define ATH11K_IPV4_MAX_COUNT 2
|
||||
|
||||
struct ath11k_arp_ns_offload {
|
||||
u8 ipv4_addr[ATH11K_IPV4_MAX_COUNT][4];
|
||||
u32 ipv4_count;
|
||||
u32 ipv6_count;
|
||||
u8 ipv6_addr[ATH11K_IPV6_MAX_COUNT][16];
|
||||
u8 self_ipv6_addr[ATH11K_IPV6_MAX_COUNT][16];
|
||||
u8 ipv6_type[ATH11K_IPV6_MAX_COUNT];
|
||||
bool ipv6_valid[ATH11K_IPV6_MAX_COUNT];
|
||||
u8 mac_addr[ETH_ALEN];
|
||||
};
|
||||
|
||||
struct ath11k_rekey_data {
|
||||
u8 kck[NL80211_KCK_LEN];
|
||||
u8 kek[NL80211_KCK_LEN];
|
||||
u64 replay_ctr;
|
||||
bool enable_offload;
|
||||
};
|
||||
|
||||
struct ath11k_vif {
|
||||
u32 vdev_id;
|
||||
enum wmi_vdev_type vdev_type;
|
||||
@@ -263,6 +351,9 @@ struct ath11k_vif {
|
||||
bool bcca_zero_sent;
|
||||
bool do_not_send_tmpl;
|
||||
struct ieee80211_chanctx_conf chanctx;
|
||||
struct ath11k_arp_ns_offload arp_ns_offload;
|
||||
struct ath11k_rekey_data rekey_data;
|
||||
|
||||
#ifdef CONFIG_ATH11K_DEBUGFS
|
||||
struct dentry *debugfs_twt;
|
||||
#endif /* CONFIG_ATH11K_DEBUGFS */
|
||||
@@ -590,6 +681,9 @@ struct ath11k {
|
||||
struct work_struct wmi_mgmt_tx_work;
|
||||
struct sk_buff_head wmi_mgmt_tx_queue;
|
||||
|
||||
struct ath11k_wow wow;
|
||||
struct completion target_suspend;
|
||||
bool target_suspend_ack;
|
||||
struct ath11k_per_peer_tx_stats peer_tx_stats;
|
||||
struct list_head ppdu_stats_info;
|
||||
u32 ppdu_stat_list_depth;
|
||||
@@ -607,12 +701,13 @@ struct ath11k {
|
||||
bool dfs_block_radar_events;
|
||||
struct ath11k_thermal thermal;
|
||||
u32 vdev_id_11d_scan;
|
||||
struct completion finish_11d_scan;
|
||||
struct completion finish_11d_ch_list;
|
||||
bool pending_11d;
|
||||
struct completion completed_11d_scan;
|
||||
enum ath11k_11d_state state_11d;
|
||||
bool regdom_set_by_user;
|
||||
int hw_rate_code;
|
||||
u8 twt_enabled;
|
||||
bool nlo_enabled;
|
||||
u8 alpha2[REG_ALPHA2_LEN + 1];
|
||||
};
|
||||
|
||||
struct ath11k_band_cap {
|
||||
@@ -654,12 +749,12 @@ struct ath11k_board_data {
|
||||
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 {
|
||||
int (*wakeup)(struct ath11k_base *ab);
|
||||
void (*release)(struct ath11k_base *ab);
|
||||
int (*get_msi_irq)(struct ath11k_base *ab, unsigned int vector);
|
||||
void (*window_write32)(struct ath11k_base *ab, u32 offset, u32 value);
|
||||
u32 (*window_read32)(struct ath11k_base *ab, u32 offset);
|
||||
};
|
||||
|
||||
/* IPQ8074 HW channel counters frequency value in hertz */
|
||||
@@ -703,6 +798,19 @@ struct ath11k_soc_dp_stats {
|
||||
struct ath11k_dp_ring_bp_stats bp_stats;
|
||||
};
|
||||
|
||||
struct ath11k_msi_user {
|
||||
char *name;
|
||||
int num_vectors;
|
||||
u32 base_vector;
|
||||
};
|
||||
|
||||
struct ath11k_msi_config {
|
||||
int total_vectors;
|
||||
int total_users;
|
||||
struct ath11k_msi_user *users;
|
||||
u16 hw_rev;
|
||||
};
|
||||
|
||||
/* Master structure to hold the hw data which may be used in core module */
|
||||
struct ath11k_base {
|
||||
enum ath11k_hw_rev hw_rev;
|
||||
@@ -747,6 +855,18 @@ struct ath11k_base {
|
||||
struct ath11k_pdev __rcu *pdevs_active[MAX_RADIOS];
|
||||
struct ath11k_hal_reg_capabilities_ext hal_reg_cap[MAX_RADIOS];
|
||||
unsigned long long free_vdev_map;
|
||||
|
||||
/* To synchronize rhash tbl write operation */
|
||||
struct mutex tbl_mtx_lock;
|
||||
|
||||
/* The rhashtable containing struct ath11k_peer keyed by mac addr */
|
||||
struct rhashtable *rhead_peer_addr;
|
||||
struct rhashtable_params rhash_peer_addr_param;
|
||||
|
||||
/* The rhashtable containing struct ath11k_peer keyed by id */
|
||||
struct rhashtable *rhead_peer_id;
|
||||
struct rhashtable_params rhash_peer_id_param;
|
||||
|
||||
struct list_head peers;
|
||||
wait_queue_head_t peer_mapping_wq;
|
||||
u8 mac_addr[ETH_ALEN];
|
||||
@@ -760,7 +880,6 @@ struct ath11k_base {
|
||||
int bd_api;
|
||||
|
||||
struct ath11k_hw_params hw_params;
|
||||
struct ath11k_bus_params bus_params;
|
||||
|
||||
const struct firmware *cal_file;
|
||||
|
||||
@@ -788,6 +907,18 @@ struct ath11k_base {
|
||||
struct work_struct restart_work;
|
||||
struct work_struct update_11d_work;
|
||||
u8 new_alpha2[3];
|
||||
struct workqueue_struct *workqueue_aux;
|
||||
struct work_struct reset_work;
|
||||
atomic_t reset_count;
|
||||
atomic_t recovery_count;
|
||||
atomic_t recovery_start_count;
|
||||
bool is_reset;
|
||||
struct completion reset_complete;
|
||||
struct completion reconfigure_complete;
|
||||
struct completion recovery_start;
|
||||
/* continuous recovery fail count */
|
||||
atomic_t fail_cont_count;
|
||||
unsigned long reset_fail_timeout;
|
||||
struct {
|
||||
/* protected by data_lock */
|
||||
u32 fw_crash_counter;
|
||||
@@ -815,6 +946,18 @@ struct ath11k_base {
|
||||
u32 subsystem_device;
|
||||
} id;
|
||||
|
||||
struct {
|
||||
struct {
|
||||
const struct ath11k_msi_config *config;
|
||||
u32 ep_base_data;
|
||||
u32 irqs[32];
|
||||
u32 addr_lo;
|
||||
u32 addr_hi;
|
||||
} msi;
|
||||
|
||||
const struct ath11k_pci_ops *ops;
|
||||
} pci;
|
||||
|
||||
/* must be last */
|
||||
u8 drv_priv[] __aligned(sizeof(void *));
|
||||
};
|
||||
@@ -985,8 +1128,7 @@ int ath11k_core_pre_init(struct ath11k_base *ab);
|
||||
int ath11k_core_init(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,
|
||||
enum ath11k_bus bus,
|
||||
const struct ath11k_bus_params *bus_params);
|
||||
enum ath11k_bus bus);
|
||||
void ath11k_core_free(struct ath11k_base *ath11k);
|
||||
int ath11k_core_fetch_bdf(struct ath11k_base *ath11k,
|
||||
struct ath11k_board_data *bd);
|
||||
@@ -996,7 +1138,7 @@ int ath11k_core_fetch_board_data_api_1(struct ath11k_base *ab,
|
||||
const char *name);
|
||||
void ath11k_core_free_bdf(struct ath11k_base *ab, struct ath11k_board_data *bd);
|
||||
int ath11k_core_check_dt(struct ath11k_base *ath11k);
|
||||
|
||||
int ath11k_core_check_smbios(struct ath11k_base *ab);
|
||||
void ath11k_core_halt(struct ath11k *ar);
|
||||
int ath11k_core_resume(struct ath11k_base *ab);
|
||||
int ath11k_core_suspend(struct ath11k_base *ab);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user