]> git.baikalelectronics.ru Git - kernel.git/commitdiff
mt76: add support for an extra wiphy in mt76_sta_state()
authorFelix Fietkau <nbd@nbd.name>
Sat, 12 Oct 2019 15:42:00 +0000 (17:42 +0200)
committerFelix Fietkau <nbd@nbd.name>
Fri, 14 Feb 2020 09:03:08 +0000 (10:03 +0100)
This is preparation for supporting multiple wiphys per device to support the
concurrent dual-band feature of MT7615D

Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mac80211.c
drivers/net/wireless/mediatek/mt76/mt76.h
drivers/net/wireless/mediatek/mt76/util.h

index 360e38527623cd29b591df393135457ab38174b5..4a02d74da88fc885235257ada43787be2d7fe608 100644 (file)
@@ -829,7 +829,7 @@ EXPORT_SYMBOL_GPL(mt76_rx_poll_complete);
 
 static int
 mt76_sta_add(struct mt76_dev *dev, struct ieee80211_vif *vif,
-            struct ieee80211_sta *sta)
+            struct ieee80211_sta *sta, bool ext_phy)
 {
        struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv;
        int ret;
@@ -854,6 +854,8 @@ mt76_sta_add(struct mt76_dev *dev, struct ieee80211_vif *vif,
        }
 
        ewma_signal_init(&wcid->rssi);
+       if (ext_phy)
+               mt76_wcid_mask_set(dev->wcid_phy_mask, wcid->idx);
        rcu_assign_pointer(dev->wcid[wcid->idx], wcid);
 
 out:
@@ -880,7 +882,8 @@ void __mt76_sta_remove(struct mt76_dev *dev, struct ieee80211_vif *vif,
        mt76_tx_status_check(dev, wcid, true);
        for (i = 0; i < ARRAY_SIZE(sta->txq); i++)
                mt76_txq_remove(dev, sta->txq[i]);
-       mt76_wcid_free(dev->wcid_mask, idx);
+       mt76_wcid_mask_clear(dev->wcid_mask, idx);
+       mt76_wcid_mask_clear(dev->wcid_phy_mask, idx);
 }
 EXPORT_SYMBOL_GPL(__mt76_sta_remove);
 
@@ -898,11 +901,13 @@ int mt76_sta_state(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                   enum ieee80211_sta_state old_state,
                   enum ieee80211_sta_state new_state)
 {
-       struct mt76_dev *dev = hw->priv;
+       struct mt76_phy *phy = hw->priv;
+       struct mt76_dev *dev = phy->dev;
+       bool ext_phy = phy != &dev->phy;
 
        if (old_state == IEEE80211_STA_NOTEXIST &&
            new_state == IEEE80211_STA_NONE)
-               return mt76_sta_add(dev, vif, sta);
+               return mt76_sta_add(dev, vif, sta, ext_phy);
 
        if (old_state == IEEE80211_STA_AUTH &&
            new_state == IEEE80211_STA_ASSOC &&
index 604d70fd06e739d605d699ef820145ce00285ebd..446a06c290148105309d1f80cec73cabe3de1dc3 100644 (file)
@@ -504,6 +504,7 @@ struct mt76_dev {
        struct sk_buff_head status_list;
 
        unsigned long wcid_mask[MT76_N_WCIDS / BITS_PER_LONG];
+       unsigned long wcid_phy_mask[MT76_N_WCIDS / BITS_PER_LONG];
 
        struct mt76_wcid global_wcid;
        struct mt76_wcid __rcu *wcid[MT76_N_WCIDS];
@@ -596,6 +597,16 @@ enum mt76_phy_type {
 
 #define mt76_hw(dev) (dev)->mphy.hw
 
+static inline struct ieee80211_hw *
+mt76_wcid_hw(struct mt76_dev *dev, u8 wcid)
+{
+       if (wcid <= MT76_N_WCIDS &&
+           mt76_wcid_mask_test(dev->wcid_phy_mask, wcid))
+               return dev->phy2->hw;
+
+       return dev->phy.hw;
+}
+
 bool __mt76_poll(struct mt76_dev *dev, u32 offset, u32 mask, u32 val,
                 int timeout);
 
index fe3479c8e561d1cfc426ca06c90177ccdd945e11..48a71e7479e5da8d9afcc93161f9fd7e8c06ec55 100644 (file)
 
 int mt76_wcid_alloc(unsigned long *mask, int size);
 
+static inline bool
+mt76_wcid_mask_test(unsigned long *mask, int idx)
+{
+       return mask[idx / BITS_PER_LONG] & BIT(idx % BITS_PER_LONG);
+}
+
+static inline void
+mt76_wcid_mask_set(unsigned long *mask, int idx)
+{
+       mask[idx / BITS_PER_LONG] |= BIT(idx % BITS_PER_LONG);
+}
+
 static inline void
-mt76_wcid_free(unsigned long *mask, int idx)
+mt76_wcid_mask_clear(unsigned long *mask, int idx)
 {
        mask[idx / BITS_PER_LONG] &= ~BIT(idx % BITS_PER_LONG);
 }