[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