[PATCH v3] wifi: ath11k: support DBS and DFS compatibility

Baochen Qiang quic_bqiang at quicinc.com
Sun May 11 23:09:46 PDT 2025



On 5/12/2025 1:52 PM, Yu Zhang (Yuriy) wrote:
> 
> 
> 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.

do you mean that combinations[0] and combinations[1] share the same limit configuration?
which is

limits[0].max = 2;
limits[0].types |= BIT(NL80211_IFTYPE_STATION);
limits[1].max = 16;
limits[1].types |= BIT(NL80211_IFTYPE_AP);


>>
>>> -        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 at 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