wifi: rtw89: declare MCC in interface combination
authorZong-Zhe Yang <kevin_yang@realtek.com>
Thu, 21 Sep 2023 00:35:59 +0000 (08:35 +0800)
committerKalle Valo <kvalo@kernel.org>
Thu, 28 Sep 2023 16:25:05 +0000 (19:25 +0300)
MCC (multi-channel concurrency) supports two combinations as below.
* P2P-GO + STA
* P2P-GC + STA
We add the corresponding ieee80211_iface_limit for it into
ieee80211_iface_combination.

Besides, for multiple channels, it must run with mac80211 chanctx.
So, only with it, ieee80211_iface_combination can allow MCC case.

Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20230921003559.11588-5-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.c

index 50854b63e11b32e767a2912bbf8ec7bcbd5f619c..def5db8804425703c931bac740a27d1fd51376a5 100644 (file)
@@ -172,13 +172,31 @@ static const struct ieee80211_iface_limit rtw89_iface_limits[] = {
        },
 };
 
+static const struct ieee80211_iface_limit rtw89_iface_limits_mcc[] = {
+       {
+               .max = 1,
+               .types = BIT(NL80211_IFTYPE_STATION),
+       },
+       {
+               .max = 1,
+               .types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
+                        BIT(NL80211_IFTYPE_P2P_GO),
+       },
+};
+
 static const struct ieee80211_iface_combination rtw89_iface_combs[] = {
        {
                .limits = rtw89_iface_limits,
                .n_limits = ARRAY_SIZE(rtw89_iface_limits),
                .max_interfaces = 2,
                .num_different_channels = 1,
-       }
+       },
+       {
+               .limits = rtw89_iface_limits_mcc,
+               .n_limits = ARRAY_SIZE(rtw89_iface_limits_mcc),
+               .max_interfaces = 2,
+               .num_different_channels = 2,
+       },
 };
 
 bool rtw89_ra_report_to_bitrate(struct rtw89_dev *rtwdev, u8 rpt_rate, u16 *bitrate)
@@ -4285,7 +4303,11 @@ struct rtw89_dev *rtw89_alloc_ieee80211_hw(struct device *device,
                goto err;
 
        hw->wiphy->iface_combinations = rtw89_iface_combs;
-       hw->wiphy->n_iface_combinations = ARRAY_SIZE(rtw89_iface_combs);
+
+       if (no_chanctx || chip->support_chanctx_num == 1)
+               hw->wiphy->n_iface_combinations = 1;
+       else
+               hw->wiphy->n_iface_combinations = ARRAY_SIZE(rtw89_iface_combs);
 
        rtwdev = hw->priv;
        rtwdev->hw = hw;