On Fri Jul 14, 2023 at 4:38 AM CEST, Carl Huang wrote: > Add hardware parameter support_dual_stations to indicate > whether 2 station interfaces are supported. For chips which > support this feature, limit total number of AP interface and > mesh point to 1. The max interfaces are 3 for such chips. > > The chips affected are: > QCA6390 hw2.0 > WCN6855 hw2.0 > WCN6855 hw2.1 > Other chips are not affected. > > For affected chips, remove radar_detect_widths because now > num_different_channels is set to 2. radar_detect_widths can > be set only when num_different_channels is 1. See mac80211 > function wiphy_verify_combinations for details. > > Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3 Hi Carl, Unfortunately this commit breaks wifi on a QCM6490 smartphone (qcm6490-fairphone-fp5) and makes the board crash. Reverting this commit (plus for conflict resolution 5dc9d1a55e95 ("wifi: ath11k: add support for QCA2066") and 24395ec11707 ("wifi: ath11k: provide address list if chip supports 2 stations")) makes wifi work again. Here's the crash log: [ 43.458118] ath11k 17a10040.wifi: Adding to iommu group 11 [ 43.459075] ath11k 17a10040.wifi: wcn6750 hw1.0 [ 43.461219] remoteproc remoteproc2: powering up 8a00000.remoteproc [ 43.490363] remoteproc remoteproc2: Booting fw image qcom/qcm6490/fairphone5/wpss.mbn, size 7435056 [ 43.614039] remoteproc remoteproc2: remote processor 8a00000.remoteproc is now up [ 43.746227] ath11k 17a10040.wifi: chip_id 0x1 chip_family 0xb board_id 0xff soc_id 0xffffffff [ 43.746262] ath11k 17a10040.wifi: fw_version 0x1011855b fw_build_timestamp 2023-09-03 07:43 fw_build_id WLAN.MSL.1.0.1-01371-QCAMSLSWPLZ-1 [ 53.116443] qcom_q6v5_pas 8a00000.remoteproc: fatal error received: cmnos_thread.c:4645:Asserted in cmnos_allocram.c:cmnos_allocram_base_with_alignment_recurse:497 with Args:0x3,0x3,0x0 [ 53.116503] remoteproc remoteproc2: crash detected in 8a00000.remoteproc: type fatal error [ 53.116734] remoteproc remoteproc2: handling crash #1 in 8a00000.remoteproc [ 53.116749] remoteproc remoteproc2: recovering 8a00000.remoteproc [ 53.125088] ath11k 17a10040.wifi: failed to send WMI_PDEV_SET_PARAM cmd [ 53.125116] ath11k 17a10040.wifi: failed to enable PMF QOS: (-108 [ 53.125167] remoteproc remoteproc2: stopped remote processor 8a00000.remoteproc [ 53.127827] ath11k 17a10040.wifi: failed to send WMI_PDEV_SET_PARAM cmd [ 53.127848] ath11k 17a10040.wifi: failed to enable PMF QOS: (-108 [ 53.258990] remoteproc remoteproc2: remote processor 8a00000.remoteproc is now up [ 53.390288] ath11k 17a10040.wifi: chip_id 0x1 chip_family 0xb board_id 0xff soc_id 0xffffffff [ 53.390319] ath11k 17a10040.wifi: fw_version 0x1011855b fw_build_timestamp 2023-09-03 07:43 fw_build_id WLAN.MSL.1.0.1-01371-QCAMSLSWPLZ-1 [ 53.404765] ath11k 17a10040.wifi: Last interrupt received for each CE: [ 53.404789] ath11k 17a10040.wifi: CE_id 0 pipe_num 0 580ms before [ 53.404804] ath11k 17a10040.wifi: CE_id 1 pipe_num 1 476ms before [ 53.404818] ath11k 17a10040.wifi: CE_id 2 pipe_num 2 476ms before [ 53.404831] ath11k 17a10040.wifi: CE_id 3 pipe_num 3 580ms before [ 53.404844] ath11k 17a10040.wifi: CE_id 5 pipe_num 5 4294720700ms before [ 53.404858] ath11k 17a10040.wifi: CE_id 7 pipe_num 7 4294720700ms before [ 53.404871] ath11k 17a10040.wifi: CE_id 8 pipe_num 8 4294720700ms before [ 53.404883] ath11k 17a10040.wifi: Last interrupt received for each group: [ 53.404894] ath11k 17a10040.wifi: group_id 0 4294720700ms before [ 53.404907] ath11k 17a10040.wifi: group_id 1 4294720700ms before [ 53.404918] ath11k 17a10040.wifi: group_id 2 4294720700ms before [ 53.404929] ath11k 17a10040.wifi: group_id 3 4294720700ms before [ 53.404940] ath11k 17a10040.wifi: group_id 4 4294720700ms before [ 53.404952] ath11k 17a10040.wifi: group_id 5 4294720700ms before [ 53.404964] ath11k 17a10040.wifi: group_id 6 4294720700ms before [ 53.404976] ath11k 17a10040.wifi: group_id 7 4294720700ms before [ 53.404987] ath11k 17a10040.wifi: group_id 8 4294720700ms before [ 53.404998] ath11k 17a10040.wifi: group_id 9 4294720700ms before [ 53.405009] ath11k 17a10040.wifi: group_id 10 4294720700ms before [ 53.405021] ath11k 17a10040.wifi: dst srng id 0 tp 0, cur hp 0, cached hp 0 last hp 0 napi processed before 4294720700ms [ 53.405037] ath11k 17a10040.wifi: dst srng id 1 tp 0, cur hp 0, cached hp 0 last hp 0 napi processed before 4294720700ms [ 53.405052] ath11k 17a10040.wifi: dst srng id 2 tp 0, cur hp 0, cached hp 0 last hp 0 napi processed before 4294720700ms [ 53.405066] ath11k 17a10040.wifi: dst srng id 3 tp 0, cur hp 0, cached hp 0 last hp 0 napi processed before 4294720700ms [ 53.405082] ath11k 17a10040.wifi: dst srng id 4 tp 0, cur hp 0, cached hp 0 last hp 0 napi processed before 4294720700ms [ 53.405097] ath11k 17a10040.wifi: src srng id 5 hp 0, reap_hp 248, cur tp 0, cached tp 0 last tp 0 napi processed before 4294720700ms [ 53.405114] ath11k 17a10040.wifi: src srng id 8 hp 0, reap_hp 2550, cur tp 0, cached tp 0 last tp 0 napi processed before 4294720700ms [ 53.405130] ath11k 17a10040.wifi: dst srng id 9 tp 0, cur hp 0, cached hp 0 last hp 0 napi processed before 4294720700ms [ 53.405145] ath11k 17a10040.wifi: src srng id 16 hp 0, reap_hp 16376, cur tp 0, cached tp 0 last tp 0 napi processed before 4294720700ms [ 53.405162] ath11k 17a10040.wifi: src srng id 17 hp 0, reap_hp 16376, cur tp 0, cached tp 0 last tp 0 napi processed before 4294720700ms [ 53.405179] ath11k 17a10040.wifi: src srng id 18 hp 0, reap_hp 16376, cur tp 0, cached tp 0 last tp 0 napi processed before 4294720700ms [ 53.405196] ath11k 17a10040.wifi: src srng id 24 hp 0, reap_hp 248, cur tp 0, cached tp 0 last tp 0 napi processed before 4294720700ms [ 53.405213] ath11k 17a10040.wifi: dst srng id 25 tp 0, cur hp 0, cached hp 0 last hp 0 napi processed before 4294720700ms [ 53.405228] ath11k 17a10040.wifi: src srng id 32 hp 12, reap_hp 8, cur tp 12, cached tp 12 last tp 8 napi processed before 580ms [ 53.405244] ath11k 17a10040.wifi: src srng id 35 hp 4, reap_hp 0, cur tp 4, cached tp 4 last tp 0 napi processed before 580ms [ 53.405260] ath11k 17a10040.wifi: src srng id 36 hp 20, reap_hp 0, cur tp 20, cached tp 12 last tp 12 napi processed before 460ms [ 53.405276] ath11k 17a10040.wifi: src srng id 39 hp 0, reap_hp 124, cur tp 0, cached tp 0 last tp 0 napi processed before 4294720700ms [ 53.405294] ath11k 17a10040.wifi: src srng id 57 hp 1022, reap_hp 1022, cur tp 2, cached tp 2 last tp 2 napi processed before 476ms [ 53.405310] ath11k 17a10040.wifi: src srng id 58 hp 18, reap_hp 18, cur tp 22, cached tp 22 last tp 22 napi processed before 476ms [ 53.405327] ath11k 17a10040.wifi: src srng id 61 hp 1020, reap_hp 1020, cur tp 0, cached tp 0 last tp 0 napi processed before 584ms [ 53.405345] ath11k 17a10040.wifi: dst srng id 81 tp 4, cur hp 4, cached hp 4 last hp 4 napi processed before 476ms [ 53.405361] ath11k 17a10040.wifi: dst srng id 82 tp 44, cur hp 44, cached hp 44 last hp 44 napi processed before 476ms [ 53.405378] ath11k 17a10040.wifi: dst srng id 85 tp 0, cur hp 0, cached hp 0 last hp 0 napi processed before 4294720700ms [ 53.405394] ath11k 17a10040.wifi: src srng id 104 hp 65532, reap_hp 65532, cur tp 0, cached tp 0 last tp 0 napi processed before 588ms [ 53.405411] ath11k 17a10040.wifi: src srng id 105 hp 0, reap_hp 504, cur tp 0, cached tp 0 last tp 0 napi processed before 4294720700ms [ 53.405427] ath11k 17a10040.wifi: dst srng id 106 tp 0, cur hp 0, cached hp 0 last hp 0 napi processed before 4294720700ms [ 53.405443] ath11k 17a10040.wifi: dst srng id 108 tp 0, cur hp 0, cached hp 0 last hp 0 napi processed before 4294720700ms [ 53.405458] ath11k 17a10040.wifi: dst srng id 109 tp 0, cur hp 0, cached hp 0 last hp 0 napi processed before 4294720700ms [ 53.405474] ath11k 17a10040.wifi: dst srng id 110 tp 0, cur hp 0, cached hp 0 last hp 0 napi processed before 4294720700ms [ 53.405491] ath11k 17a10040.wifi: src srng id 128 hp 8190, reap_hp 8190, cur tp 0, cached tp 0 last tp 0 napi processed before 464ms [ 53.405507] ath11k 17a10040.wifi: src srng id 129 hp 0, reap_hp 2046, cur tp 0, cached tp 0 last tp 0 napi processed before 4294720700ms [ 53.405525] ath11k 17a10040.wifi: src srng id 132 hp 2046, reap_hp 2046, cur tp 0, cached tp 0 last tp 0 napi processed before 460ms [ 53.405542] ath11k 17a10040.wifi: dst srng id 133 tp 0, cur hp 0, cached hp 0 last hp 0 napi processed before 4294720700ms [ 53.747641] qcom_q6v5_pas 8a00000.remoteproc: fatal error received: platform_msl.c:513:PCIE ACMT error debug0 0x6030, debug1 0x101 [ 53.747677] remoteproc remoteproc2: crash detected in 8a00000.remoteproc: type fatal error [ 53.747864] remoteproc remoteproc2: handling crash #2 in 8a00000.remoteproc [ 53.747875] remoteproc remoteproc2: recovering 8a00000.remoteproc [ 53.758632] remoteproc remoteproc2: stopped remote processor 8a00000.remoteproc [ 53.886889] remoteproc remoteproc2: remote processor 8a00000.remoteproc is now up [ 54.017475] ath11k 17a10040.wifi: chip_id 0x1 chip_family 0xb board_id 0xff soc_id 0xffffffff [ 54.017505] ath11k 17a10040.wifi: fw_version 0x1011855b fw_build_timestamp 2023-09-03 07:43 fw_build_id WLAN.MSL.1.0.1-01371-QCAMSLSWPLZ-1 [ 54.027605] ath11k 17a10040.wifi: Last interrupt received for each CE: [ 54.027627] ath11k 17a10040.wifi: CE_id 0 pipe_num 0 1204ms before [ 54.027642] ath11k 17a10040.wifi: CE_id 1 pipe_num 1 1100ms before [ 54.027655] ath11k 17a10040.wifi: CE_id 2 pipe_num 2 1100ms before [ 54.027667] ath11k 17a10040.wifi: CE_id 3 pipe_num 3 1204ms before [ 54.027680] ath11k 17a10040.wifi: CE_id 5 pipe_num 5 4294721324ms before [ 54.027692] ath11k 17a10040.wifi: CE_id 7 pipe_num 7 4294721324ms before [ 54.027704] ath11k 17a10040.wifi: CE_id 8 pipe_num 8 4294721324ms before [ 54.027716] ath11k 17a10040.wifi: Last interrupt received for each group: [ 54.027726] ath11k 17a10040.wifi: group_id 0 4294721324ms before [ 54.027738] ath11k 17a10040.wifi: group_id 1 4294721324ms before [ 54.027749] ath11k 17a10040.wifi: group_id 2 4294721324ms before [ 54.027760] ath11k 17a10040.wifi: group_id 3 4294721324ms before [ 54.027771] ath11k 17a10040.wifi: group_id 4 4294721324ms before [ 54.027782] ath11k 17a10040.wifi: group_id 5 4294721324ms before [ 54.027794] ath11k 17a10040.wifi: group_id 6 4294721324ms before [ 54.027805] ath11k 17a10040.wifi: group_id 7 4294721324ms before [ 54.027816] ath11k 17a10040.wifi: group_id 8 4294721324ms before [ 54.027827] ath11k 17a10040.wifi: group_id 9 4294721324ms before [ 54.027838] ath11k 17a10040.wifi: group_id 10 4294721324ms before [ 54.027850] ath11k 17a10040.wifi: dst srng id 4 tp 0, cur hp 0, cached hp 0 last hp 0 napi processed before 4294721324ms [ 54.027866] ath11k 17a10040.wifi: src srng id 5 hp 0, reap_hp 248, cur tp 0, cached tp 0 last tp 0 napi processed before 4294721324ms [ 54.027882] ath11k 17a10040.wifi: src srng id 8 hp 0, reap_hp 2550, cur tp 0, cached tp 0 last tp 0 napi processed before 4294721324ms [ 54.027898] ath11k 17a10040.wifi: dst srng id 9 tp 0, cur hp 0, cached hp 0 last hp 0 napi processed before 4294721324ms [ 54.027914] ath11k 17a10040.wifi: src srng id 16 hp 0, reap_hp 16376, cur tp 0, cached tp 0 last tp 0 napi processed before 4294721324ms [ 54.027930] ath11k 17a10040.wifi: src srng id 17 hp 0, reap_hp 16376, cur tp 0, cached tp 0 last tp 0 napi processed before 4294721324ms [ 54.027947] ath11k 17a10040.wifi: src srng id 18 hp 0, reap_hp 16376, cur tp 0, cached tp 0 last tp 0 napi processed before 4294721324ms [ 54.027964] ath11k 17a10040.wifi: src srng id 24 hp 0, reap_hp 248, cur tp 0, cached tp 0 last tp 0 napi processed before 4294721324ms [ 54.027980] ath11k 17a10040.wifi: dst srng id 25 tp 0, cur hp 0, cached hp 0 last hp 0 napi processed before 4294721324ms [ 54.027997] ath11k 17a10040.wifi: src srng id 32 hp 0, reap_hp 60, cur tp 0, cached tp 0 last tp 0 napi processed before 4294721324ms [ 54.028014] ath11k 17a10040.wifi: src srng id 35 hp 0, reap_hp 124, cur tp 0, cached tp 0 last tp 0 napi processed before 4294721324ms [ 54.028030] ath11k 17a10040.wifi: src srng id 36 hp 0, reap_hp 8188, cur tp 0, cached tp 0 last tp 0 napi processed before 4294721324ms [ 54.028045] ath11k 17a10040.wifi: src srng id 39 hp 0, reap_hp 124, cur tp 0, cached tp 0 last tp 0 napi processed before 4294721324ms [ 54.028063] ath11k 17a10040.wifi: src srng id 57 hp 1020, reap_hp 1020, cur tp 0, cached tp 0 last tp 0 napi processed before 440ms [ 54.028079] ath11k 17a10040.wifi: src srng id 58 hp 1020, reap_hp 1020, cur tp 0, cached tp 0 last tp 0 napi processed before 436ms [ 54.028095] ath11k 17a10040.wifi: src srng id 61 hp 1020, reap_hp 1020, cur tp 0, cached tp 0 last tp 0 napi processed before 436ms [ 54.028112] ath11k 17a10040.wifi: dst srng id 81 tp 0, cur hp 0, cached hp 0 last hp 0 napi processed before 4294721324ms [ 54.028128] ath11k 17a10040.wifi: dst srng id 82 tp 0, cur hp 0, cached hp 0 last hp 0 napi processed before 4294721324ms [ 54.028143] ath11k 17a10040.wifi: dst srng id 85 tp 0, cur hp 0, cached hp 0 last hp 0 napi processed before 4294721324ms [ 54.028160] ath11k 17a10040.wifi: src srng id 104 hp 65532, reap_hp 65532, cur tp 0, cached tp 0 last tp 0 napi processed before 448ms [ 54.028177] ath11k 17a10040.wifi: src srng id 105 hp 0, reap_hp 504, cur tp 0, cached tp 0 last tp 0 napi processed before 4294721324ms [ 54.028194] ath11k 17a10040.wifi: dst srng id 106 tp 0, cur hp 0, cached hp 0 last hp 0 napi processed before 4294721324ms [ 54.028210] ath11k 17a10040.wifi: dst srng id 108 tp 0, cur hp 0, cached hp 0 last hp 0 napi processed before 4294721324ms [ 54.028226] ath11k 17a10040.wifi: dst srng id 109 tp 0, cur hp 0, cached hp 0 last hp 0 napi processed before 4294721324ms [ 54.028242] ath11k 17a10040.wifi: dst srng id 110 tp 0, cur hp 0, cached hp 0 last hp 0 napi processed before 4294721324ms [ 54.622819] ath11k 17a10040.wifi: failed to receive control response completion, polling.. [ 55.646232] ath11k 17a10040.wifi: ctl_resp never came in (-110) [ 55.646259] ath11k 17a10040.wifi: failed to connect to HTC: -110 [ 55.653201] ath11k 17a10040.wifi: failed to start core: -110 Let me know if you need any more information. Regards Luca > > Signed-off-by: Carl Huang <quic_cjhuang@xxxxxxxxxxx> > --- > drivers/net/wireless/ath/ath11k/core.c | 14 ++++-- > drivers/net/wireless/ath/ath11k/hw.c | 2 +- > drivers/net/wireless/ath/ath11k/hw.h | 1 + > drivers/net/wireless/ath/ath11k/mac.c | 62 +++++++++++++++++--------- > 4 files changed, 53 insertions(+), 26 deletions(-) > > diff --git a/drivers/net/wireless/ath/ath11k/core.c b/drivers/net/wireless/ath/ath11k/core.c > index bebfd342e28b..739a8d13d57d 100644 > --- a/drivers/net/wireless/ath/ath11k/core.c > +++ b/drivers/net/wireless/ath/ath11k/core.c > @@ -120,6 +120,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { > .tcl_ring_retry = true, > .tx_ring_size = DP_TCL_DATA_RING_SIZE, > .smp2p_wow_exit = false, > + .support_dual_stations = false, > }, > { > .hw_rev = ATH11K_HW_IPQ6018_HW10, > @@ -202,6 +203,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { > .tx_ring_size = DP_TCL_DATA_RING_SIZE, > .smp2p_wow_exit = false, > .support_fw_mac_sequence = false, > + .support_dual_stations = false, > }, > { > .name = "qca6390 hw2.0", > @@ -251,7 +253,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { > .cold_boot_calib = false, > .cbcal_restart_fw = false, > .fw_mem_mode = 0, > - .num_vdevs = 16 + 1, > + .num_vdevs = 2 + 1, > .num_peers = 512, > .supports_suspend = true, > .hal_desc_sz = sizeof(struct hal_rx_desc_ipq8074), > @@ -286,6 +288,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { > .tx_ring_size = DP_TCL_DATA_RING_SIZE, > .smp2p_wow_exit = false, > .support_fw_mac_sequence = true, > + .support_dual_stations = true, > }, > { > .name = "qcn9074 hw1.0", > @@ -367,6 +370,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { > .tx_ring_size = DP_TCL_DATA_RING_SIZE, > .smp2p_wow_exit = false, > .support_fw_mac_sequence = false, > + .support_dual_stations = false, > }, > { > .name = "wcn6855 hw2.0", > @@ -416,7 +420,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { > .cold_boot_calib = false, > .cbcal_restart_fw = false, > .fw_mem_mode = 0, > - .num_vdevs = 16 + 1, > + .num_vdevs = 2 + 1, > .num_peers = 512, > .supports_suspend = true, > .hal_desc_sz = sizeof(struct hal_rx_desc_wcn6855), > @@ -451,6 +455,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { > .tx_ring_size = DP_TCL_DATA_RING_SIZE, > .smp2p_wow_exit = false, > .support_fw_mac_sequence = true, > + .support_dual_stations = true, > }, > { > .name = "wcn6855 hw2.1", > @@ -498,7 +503,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { > .cold_boot_calib = false, > .cbcal_restart_fw = false, > .fw_mem_mode = 0, > - .num_vdevs = 16 + 1, > + .num_vdevs = 2 + 1, > .num_peers = 512, > .supports_suspend = true, > .hal_desc_sz = sizeof(struct hal_rx_desc_wcn6855), > @@ -533,6 +538,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { > .tx_ring_size = DP_TCL_DATA_RING_SIZE, > .smp2p_wow_exit = false, > .support_fw_mac_sequence = true, > + .support_dual_stations = true, > }, > { > .name = "wcn6750 hw1.0", > @@ -613,6 +619,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { > .tx_ring_size = DP_TCL_DATA_RING_SIZE_WCN6750, > .smp2p_wow_exit = true, > .support_fw_mac_sequence = true, > + .support_dual_stations = false, > }, > { > .hw_rev = ATH11K_HW_IPQ5018_HW10, > @@ -693,6 +700,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { > .tx_ring_size = DP_TCL_DATA_RING_SIZE, > .smp2p_wow_exit = false, > .support_fw_mac_sequence = false, > + .support_dual_stations = false, > }, > }; > > diff --git a/drivers/net/wireless/ath/ath11k/hw.c b/drivers/net/wireless/ath/ath11k/hw.c > index d7b5ec6e6904..3b56ba1b8534 100644 > --- a/drivers/net/wireless/ath/ath11k/hw.c > +++ b/drivers/net/wireless/ath/ath11k/hw.c > @@ -58,7 +58,7 @@ static void ath11k_hw_wcn6855_tx_mesh_enable(struct ath11k_base *ab, > static void ath11k_init_wmi_config_qca6390(struct ath11k_base *ab, > struct target_resource_config *config) > { > - config->num_vdevs = 4; > + config->num_vdevs = ab->hw_params.num_vdevs; > config->num_peers = 16; > config->num_tids = 32; > > diff --git a/drivers/net/wireless/ath/ath11k/hw.h b/drivers/net/wireless/ath/ath11k/hw.h > index f5533630a7f9..40ed5608fe81 100644 > --- a/drivers/net/wireless/ath/ath11k/hw.h > +++ b/drivers/net/wireless/ath/ath11k/hw.h > @@ -225,6 +225,7 @@ struct ath11k_hw_params { > u32 tx_ring_size; > bool smp2p_wow_exit; > bool support_fw_mac_sequence; > + bool support_dual_stations; > }; > > struct ath11k_hw_ops { > diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c > index 8c77ade49437..3a9494bc944c 100644 > --- a/drivers/net/wireless/ath/ath11k/mac.c > +++ b/drivers/net/wireless/ath/ath11k/mac.c > @@ -9287,28 +9287,46 @@ static int ath11k_mac_setup_iface_combinations(struct ath11k *ar) > return -ENOMEM; > } > > - limits[0].max = 1; > - limits[0].types |= BIT(NL80211_IFTYPE_STATION); > - > - limits[1].max = 16; > - limits[1].types |= BIT(NL80211_IFTYPE_AP); > - > - if (IS_ENABLED(CONFIG_MAC80211_MESH) && > - ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_MESH_POINT)) > - limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT); > - > - combinations[0].limits = limits; > - combinations[0].n_limits = n_limits; > - combinations[0].max_interfaces = 16; > - combinations[0].num_different_channels = 1; > - combinations[0].beacon_int_infra_match = true; > - combinations[0].beacon_int_min_gcd = 100; > - combinations[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) | > - BIT(NL80211_CHAN_WIDTH_20) | > - BIT(NL80211_CHAN_WIDTH_40) | > - BIT(NL80211_CHAN_WIDTH_80) | > - BIT(NL80211_CHAN_WIDTH_80P80) | > - BIT(NL80211_CHAN_WIDTH_160); > + if (ab->hw_params.support_dual_stations) { > + limits[0].max = 2; > + limits[0].types |= BIT(NL80211_IFTYPE_STATION); > + > + limits[1].max = 1; > + limits[1].types |= BIT(NL80211_IFTYPE_AP); > + if (IS_ENABLED(CONFIG_MAC80211_MESH) && > + ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_MESH_POINT)) > + limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT); > + > + combinations[0].limits = limits; > + combinations[0].n_limits = 2; > + combinations[0].max_interfaces = ab->hw_params.num_vdevs; > + combinations[0].num_different_channels = 2; > + combinations[0].beacon_int_infra_match = true; > + combinations[0].beacon_int_min_gcd = 100; > + } else { > + limits[0].max = 1; > + limits[0].types |= BIT(NL80211_IFTYPE_STATION); > + > + limits[1].max = 16; > + limits[1].types |= BIT(NL80211_IFTYPE_AP); > + > + if (IS_ENABLED(CONFIG_MAC80211_MESH) && > + ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_MESH_POINT)) > + limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT); > + > + combinations[0].limits = limits; > + combinations[0].n_limits = 2; > + combinations[0].max_interfaces = 16; > + combinations[0].num_different_channels = 1; > + combinations[0].beacon_int_infra_match = true; > + combinations[0].beacon_int_min_gcd = 100; > + combinations[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) | > + BIT(NL80211_CHAN_WIDTH_20) | > + BIT(NL80211_CHAN_WIDTH_40) | > + BIT(NL80211_CHAN_WIDTH_80) | > + BIT(NL80211_CHAN_WIDTH_80P80) | > + BIT(NL80211_CHAN_WIDTH_160); > + } > > ar->hw->wiphy->iface_combinations = combinations; > ar->hw->wiphy->n_iface_combinations = 1;