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

Yu Zhang (Yuriy) quic_yuzha at quicinc.com
Sun May 11 23:45:58 PDT 2025



On 5/12/2025 2:09 PM, Baochen Qiang wrote:
> 
> 
> 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);
yes, when support_dual_stations limits[0].max = 2, else limits[0].max = 1.
> 
> 
>>>
>>>> -        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