[PATCH v3] wifi: ath11k: support DBS and DFS compatibility
Yu Zhang (Yuriy)
quic_yuzha at quicinc.com
Sun May 11 22:52:53 PDT 2025
On 5/12/2025 10:56 AM, Baochen Qiang wrote:
>
>
> On 11/27/2024 10:27 AM, Yu Zhang(Yuriy) wrote:
>> Now some chips which support 'support_dual_stations' will enable DBS,
>> but will disable DFS. Restructure the ath11k_mac_setup_iface_combinations
>> function to support DBS and DFS compatibility.
>>
>> About 'support_dual_station' feature can refer:
>> https://msgid.link/20230714023801.2621802-2-quic_cjhuang@quicinc.com
>>
>> Add a ieee80211_iface_combination to support DBS and DFS compatibility,
>> one combination can support DFS(same with non dual sta), another
>> combination can support DBS. When running different scenarios that will
>> use different ieee80211_iface_combination due to mac80211 will go through
>> all of possible interface combinations.
>>
>> In addition, maximum number of interfaces of these types should be total
>> allowed in this group.
>>
>> The chips affected are:
>>
>> QCA6390 hw2.0
>> WCN6855 hw2.0
>> WCN6855 hw2.1
>>
>> Other chips are not affected.
>>
>> Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.1.0.1-00410-QCAHKSWPL_SILICONZ-2
>> Tested-on: IPQ6018 hw1.0 AHB WLAN.HK.2.1.0.1-01161-QCAHKSWPL_SILICONZ-1
>> Tested-on: WCN6855 hw2.1 PCI WLAN.HSP.1.1-04402-QCAHSPSWPL_V1_V2_SILICONZ_IOE-1.
>> Tested-by: Mihai Moldovan <ionic at ionic.de>
>> Tested-on: QCA6390 hw2.0 PCI WLAN.HST.1.0.1-05266-QCAHSTSWPLZ_V2_TO_X86-1
>>
>> Signed-off-by: Yu Zhang(Yuriy) <quic_yuzha at quicinc.com>
>> ---
>> v2:
>> - Add tested-on IPQ8074 and IPQ6018.
>> v3:
>> - Add tested-on QCA6390.
>> ---
>> drivers/net/wireless/ath/ath11k/mac.c | 42 +++++++++++++++------------
>> 1 file changed, 24 insertions(+), 18 deletions(-)
>>
>> diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c
>> index 31ae9b384a29..aa63f5e20f2b 100644
>> --- a/drivers/net/wireless/ath/ath11k/mac.c
>> +++ b/drivers/net/wireless/ath/ath11k/mac.c
>> @@ -9911,12 +9911,17 @@ static int ath11k_mac_setup_iface_combinations(struct ath11k *ar)
>> struct ath11k_base *ab = ar->ab;
>> struct ieee80211_iface_combination *combinations;
>> struct ieee80211_iface_limit *limits;
>> - int n_limits;
>> + int n_limits, n_combos;
>> bool p2p;
>>
>> p2p = ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_P2P_DEVICE);
>>
>> - combinations = kzalloc(sizeof(*combinations), GFP_KERNEL);
>> + if (ab->hw_params.support_dual_stations)
>> + n_combos = 2;
>> + else
>> + n_combos = 1;
>> +
>> + combinations = kcalloc(n_combos, sizeof(*combinations), GFP_KERNEL);
>> if (!combinations)
>> return -ENOMEM;
>>
>> @@ -9931,7 +9936,9 @@ 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))
>> @@ -9941,25 +9948,24 @@ static int ath11k_mac_setup_iface_combinations(struct ath11k *ar)
>> combinations[0].n_limits = n_limits;
>> combinations[0].beacon_int_infra_match = true;
>> combinations[0].beacon_int_min_gcd = 100;
>> + combinations[0].max_interfaces = 16;
>> + combinations[0].num_different_channels = 1;
>> + 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;
>
> as this limits array is assigned to combinations[0], don't you need another array that
> would be assigned to combinations[1]?
This limits array just for AP and STA iftypes that can be shared.
>
>> - limits[1].max = 1;
>
> why is this removed?
AP interface shouldn't be limited to only 1.
As Jose Ignacio Tornos Martinez <jtornosm at redhat.com> issues "[PATCH]
wifi: ath11k: allow APs combination when dual stations are supported"
https://lore.kernel.org/all/20241202091858.200773-1-jtornosm@redhat.com/
>
>> -
>> - combinations[0].max_interfaces = ab->hw_params.num_vdevs;
>> - combinations[0].num_different_channels = 2;
>> - } else {
>> - limits[0].max = 1;
>> - limits[1].max = 16;
>>
>> - combinations[0].max_interfaces = 16;
>> - combinations[0].num_different_channels = 1;
>> - 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);
>> + combinations[1].limits = limits;
>> + combinations[1].n_limits = n_limits;
>> + combinations[1].beacon_int_infra_match = true;
>> + combinations[1].beacon_int_min_gcd = 100;
>> + combinations[1].max_interfaces = ab->hw_params.num_vdevs;
>> + combinations[1].num_different_channels = 2;
>> }
>>
>> if (p2p) {
>> @@ -9970,7 +9976,7 @@ static int ath11k_mac_setup_iface_combinations(struct ath11k *ar)
>> }
>>
>> ar->hw->wiphy->iface_combinations = combinations;
>> - ar->hw->wiphy->n_iface_combinations = 1;
>> + ar->hw->wiphy->n_iface_combinations = n_combos;
>>
>> return 0;
>> }
>
More information about the ath11k
mailing list