wifi: mt76: mt7921: enable p2p support
authorSean Wang <sean.wang@mediatek.com>
Tue, 7 Mar 2023 21:50:59 +0000 (05:50 +0800)
committerFelix Fietkau <nbd@nbd.name>
Mon, 17 Apr 2023 15:46:05 +0000 (17:46 +0200)
Introduce p2p-go/p2p-client support to mt7921 driver

CONNECTION_P2P_GC/GO is not supported with the current firmware
so we added mt76_dev to mt76_connac_mcu_sta_basic_tlv signature to
use CONNECTION_INFRA_STA/AP instead for p2p-client and p2p-go
respectively to make it work.

Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
drivers/net/wireless/mediatek/mt76/mt7921/init.c
drivers/net/wireless/mediatek/mt76/mt7996/mcu.c

index eea398c79a9849be8af5b07c5fe9bb3c289c2213..195fe1094d9bc122267ce7c6c797813f236ad794 100644 (file)
@@ -861,7 +861,8 @@ mt7615_mcu_wtbl_sta_add(struct mt7615_phy *phy, struct ieee80211_vif *vif,
                else
                        mvif->sta_added = true;
        }
-       mt76_connac_mcu_sta_basic_tlv(sskb, vif, sta, enable, new_entry);
+       mt76_connac_mcu_sta_basic_tlv(&dev->mt76, sskb, vif, sta, enable,
+                                     new_entry);
        if (enable && sta)
                mt76_connac_mcu_sta_tlv(phy->mt76, sskb, sta, vif, 0,
                                        MT76_STA_INFO_STATE_ASSOC);
index cb27885b5da7ceb8d85c685c0867cb930d168bdf..0f0a519f956f81165e613aaa0537b7151bfd2027 100644 (file)
@@ -363,7 +363,7 @@ void mt76_connac_mcu_bss_omac_tlv(struct sk_buff *skb,
 }
 EXPORT_SYMBOL_GPL(mt76_connac_mcu_bss_omac_tlv);
 
-void mt76_connac_mcu_sta_basic_tlv(struct sk_buff *skb,
+void mt76_connac_mcu_sta_basic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
                                   struct ieee80211_vif *vif,
                                   struct ieee80211_sta *sta,
                                   bool enable, bool newly)
@@ -394,7 +394,7 @@ void mt76_connac_mcu_sta_basic_tlv(struct sk_buff *skb,
        switch (vif->type) {
        case NL80211_IFTYPE_MESH_POINT:
        case NL80211_IFTYPE_AP:
-               if (vif->p2p)
+               if (vif->p2p && !is_mt7921(dev))
                        conn_type = CONNECTION_P2P_GC;
                else
                        conn_type = CONNECTION_INFRA_STA;
@@ -402,7 +402,7 @@ void mt76_connac_mcu_sta_basic_tlv(struct sk_buff *skb,
                basic->aid = cpu_to_le16(sta->aid);
                break;
        case NL80211_IFTYPE_STATION:
-               if (vif->p2p)
+               if (vif->p2p && !is_mt7921(dev))
                        conn_type = CONNECTION_P2P_GO;
                else
                        conn_type = CONNECTION_INFRA_AP;
@@ -1029,7 +1029,7 @@ int mt76_connac_mcu_sta_cmd(struct mt76_phy *phy,
                return PTR_ERR(skb);
 
        if (info->sta || !info->offload_fw)
-               mt76_connac_mcu_sta_basic_tlv(skb, info->vif, info->sta,
+               mt76_connac_mcu_sta_basic_tlv(dev, skb, info->vif, info->sta,
                                              info->enable, info->newly);
        if (info->sta && info->enable)
                mt76_connac_mcu_sta_tlv(phy, skb, info->sta,
index 9dbfe26e87e0463dcf539163280e6b5e9c729895..ac7d5817f345b8b93021e36536fd994f0b038b7d 100644 (file)
@@ -1776,7 +1776,7 @@ mt76_connac_mcu_add_tlv(struct sk_buff *skb, int tag, int len)
 
 int mt76_connac_mcu_set_channel_domain(struct mt76_phy *phy);
 int mt76_connac_mcu_set_vif_ps(struct mt76_dev *dev, struct ieee80211_vif *vif);
-void mt76_connac_mcu_sta_basic_tlv(struct sk_buff *skb,
+void mt76_connac_mcu_sta_basic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
                                   struct ieee80211_vif *vif,
                                   struct ieee80211_sta *sta, bool enable,
                                   bool newly);
index 7432b1eb396d00ce4f3e8cf5cafc5091eadb1bbd..9fcb22fa1f97e99e19a554a182403e4d21040d5a 100644 (file)
@@ -1654,8 +1654,8 @@ int mt7915_mcu_add_sta(struct mt7915_dev *dev, struct ieee80211_vif *vif,
                return PTR_ERR(skb);
 
        /* starec basic */
-       mt76_connac_mcu_sta_basic_tlv(skb, vif, sta, enable,
-                       !rcu_access_pointer(dev->mt76.wcid[msta->wcid.idx]));
+       mt76_connac_mcu_sta_basic_tlv(&dev->mt76, skb, vif, sta, enable,
+                                     !rcu_access_pointer(dev->mt76.wcid[msta->wcid.idx]));
        if (!enable)
                goto out;
 
index e5fdf2df8c36141b90980c3d9edd102ca0251963..5955c7c5b91ae82d30ecd507e633e3629f7f4e37 100644 (file)
@@ -31,11 +31,13 @@ static const struct ieee80211_iface_combination if_comb[] = {
 static const struct ieee80211_iface_limit if_limits_chanctx[] = {
        {
                .max = 2,
-               .types = BIT(NL80211_IFTYPE_STATION),
+               .types = BIT(NL80211_IFTYPE_STATION) |
+                        BIT(NL80211_IFTYPE_P2P_CLIENT)
        },
        {
                .max = 1,
-               .types = BIT(NL80211_IFTYPE_AP),
+               .types = BIT(NL80211_IFTYPE_AP) |
+                        BIT(NL80211_IFTYPE_P2P_GO)
        }
 };
 
@@ -99,7 +101,9 @@ mt7921_init_wiphy(struct ieee80211_hw *hw)
        wiphy->flags &= ~(WIPHY_FLAG_IBSS_RSN | WIPHY_FLAG_4ADDR_AP |
                          WIPHY_FLAG_4ADDR_STATION);
        wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
-                                BIT(NL80211_IFTYPE_AP);
+                                BIT(NL80211_IFTYPE_AP) |
+                                BIT(NL80211_IFTYPE_P2P_CLIENT) |
+                                BIT(NL80211_IFTYPE_P2P_GO);
        wiphy->max_remain_on_channel_duration = 5000;
        wiphy->max_scan_ie_len = MT76_CONNAC_SCAN_IE_LEN;
        wiphy->max_scan_ssids = 4;
index 2a66ac546513a27b0e8642fb78605b5ec289a366..016853033c1fc7542c6f9d4e3f20cae126158f28 100644 (file)
@@ -1694,8 +1694,8 @@ int mt7996_mcu_add_sta(struct mt7996_dev *dev, struct ieee80211_vif *vif,
                return PTR_ERR(skb);
 
        /* starec basic */
-       mt76_connac_mcu_sta_basic_tlv(skb, vif, sta, enable,
-                       !rcu_access_pointer(dev->mt76.wcid[msta->wcid.idx]));
+       mt76_connac_mcu_sta_basic_tlv(&dev->mt76, skb, vif, sta, enable,
+                                     !rcu_access_pointer(dev->mt76.wcid[msta->wcid.idx]));
        if (!enable)
                goto out;