Enable IFTYPE_ADHOC support on 7615 devices. The feature has been tested
using a mt76x2 device as wireless peer.

Signed-off-by: Lorenzo Bianconi <[email protected]>
---
 drivers/net/wireless/mediatek/mt76/mt7615/init.c | 6 ++++++
 drivers/net/wireless/mediatek/mt76/mt7615/main.c | 1 +
 drivers/net/wireless/mediatek/mt76/mt7615/mcu.c  | 8 ++++++++
 3 files changed, 15 insertions(+)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/init.c 
b/drivers/net/wireless/mediatek/mt76/mt7615/init.c
index 1e7723aceee2..4f56b4a4a015 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/init.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/init.c
@@ -177,6 +177,9 @@ static struct ieee80211_rate mt7615_rates[] = {
 
 static const struct ieee80211_iface_limit if_limits[] = {
        {
+               .max = 1,
+               .types = BIT(NL80211_IFTYPE_ADHOC)
+       }, {
                .max = MT7615_MAX_INTERFACES,
                .types = BIT(NL80211_IFTYPE_AP) |
 #ifdef CONFIG_MAC80211_MESH
@@ -289,6 +292,8 @@ int mt7615_register_device(struct mt7615_dev *dev)
        wiphy->reg_notifier = mt7615_regd_notifier;
        wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
 
+       wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_VHT_IBSS);
+
        ieee80211_hw_set(hw, SUPPORTS_REORDERING_BUFFER);
        ieee80211_hw_set(hw, TX_STATUS_NO_AMPDU_LEN);
 
@@ -304,6 +309,7 @@ int mt7615_register_device(struct mt7615_dev *dev)
        dev->dfs_state = -1;
 
        wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
+                                BIT(NL80211_IFTYPE_ADHOC) |
 #ifdef CONFIG_MAC80211_MESH
                                 BIT(NL80211_IFTYPE_MESH_POINT) |
 #endif
diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/main.c 
b/drivers/net/wireless/mediatek/mt76/mt7615/main.c
index d9f4d425424c..0a3cdc7ae5c4 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/main.c
@@ -41,6 +41,7 @@ static int get_omac_idx(enum nl80211_iftype type, u32 mask)
        switch (type) {
        case NL80211_IFTYPE_AP:
        case NL80211_IFTYPE_MESH_POINT:
+       case NL80211_IFTYPE_ADHOC:
                /* ap use hw bssid 0 and ext bssid */
                if (~mask & BIT(HW_BSSID_0))
                        return HW_BSSID_0;
diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c 
b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
index 275d5eaed3b7..76403b0b8040 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
@@ -851,6 +851,11 @@ int mt7615_mcu_set_bss_info(struct mt7615_dev *dev,
                conn_type = CONNECTION_INFRA_STA;
                break;
        }
+       case NL80211_IFTYPE_ADHOC:
+               conn_type = CONNECTION_IBSS_ADHOC;
+               tx_wlan_idx = mvif->sta.wcid.idx;
+               net_type = NETWORK_IBSS;
+               break;
        default:
                WARN_ON(1);
                break;
@@ -1076,6 +1081,9 @@ int mt7615_mcu_set_sta_rec(struct mt7615_dev *dev, struct 
ieee80211_vif *vif,
        case NL80211_IFTYPE_STATION:
                req.basic.conn_type = cpu_to_le32(CONNECTION_INFRA_AP);
                break;
+       case NL80211_IFTYPE_ADHOC:
+               req.basic.conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
+               break;
        default:
                WARN_ON(1);
                break;
-- 
2.21.0

Reply via email to