wifi: ath12k: fix and enable AP mode for WCN7850
authorKang Yang <quic_kangyang@quicinc.com>
Fri, 1 Dec 2023 16:09:48 +0000 (18:09 +0200)
committerKalle Valo <quic_kvalo@quicinc.com>
Tue, 5 Dec 2023 15:09:50 +0000 (17:09 +0200)
For AP mode, the peer is created earlier in ath12k_mac_op_add_interface() but
ath12k_mac_op_assign_vif_chanctx() will try to create peer again.  Then an
error will return which makes AP mode startup fail.

Kernel log:

[ 5017.665006] ath12k_pci 0000:04:00.0: failed to create peer after vdev start delay: -22

wpa_supplicant log:

Failed to set beacon parameters
Interface initialization failed
wls1: interface state UNINITIALIZED->DISABLED
wls1: AP-DISABLED
wls1: Unable to setup interface.
Failed to initialize AP interface
wls1: interface state DISABLED->DISABLED
wls1: AP-DISABLED

So fix this check and enable AP mode for WCN7850, as now AP mode works normally.

Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0-03427-QCAHMTSWPL_V1.0_V2.0_SILICONZ-1.15378.4

Signed-off-by: Kang Yang <quic_kangyang@quicinc.com>
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://lore.kernel.org/r/20231121022459.17209-1-quic_kangyang@quicinc.com
drivers/net/wireless/ath/ath12k/hw.c
drivers/net/wireless/ath/ath12k/mac.c

index ea3eda1f19489a22c8e32f74593b02755fddc67f..de60d988d8608f0ec2525d8bfb467886a7b099e8 100644 (file)
@@ -949,7 +949,8 @@ static const struct ath12k_hw_params ath12k_hw_params[] = {
                .rx_mac_buf_ring = true,
                .vdev_start_delay = true,
 
-               .interface_modes = BIT(NL80211_IFTYPE_STATION),
+               .interface_modes = BIT(NL80211_IFTYPE_STATION) |
+                                  BIT(NL80211_IFTYPE_AP),
                .supports_monitor = false,
 
                .idle_ps = true,
index 556013f8c6096f943cf0e26b24e16b3e02bd24b3..a27135436f412fe7690564c1164af4775d46c44b 100644 (file)
@@ -6389,8 +6389,8 @@ ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
        }
 
        if (ab->hw_params->vdev_start_delay &&
-           (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
-           arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)) {
+           arvif->vdev_type != WMI_VDEV_TYPE_AP &&
+           arvif->vdev_type != WMI_VDEV_TYPE_MONITOR) {
                param.vdev_id = arvif->vdev_id;
                param.peer_type = WMI_PEER_TYPE_DEFAULT;
                param.peer_addr = ar->mac_addr;