mt76x02: use mask for vifs
authorStanislaw Gruszka <sgruszka@redhat.com>
Wed, 30 Jan 2019 16:02:13 +0000 (17:02 +0100)
committerFelix Fietkau <nbd@nbd.name>
Mon, 18 Feb 2019 18:54:32 +0000 (19:54 +0100)
Use vif_mask to count interfaces to allow to set mac address in HW
if there is only one interface and report error if we create
interface with wrong BSSID resulting in already used index.

Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76x02.h
drivers/net/wireless/mediatek/mt76/mt76x02_util.c

index 6d96766a6ed389382e68f482d4813f3e54c768df..be077443bdb0213fb3740d3f9f3230cdd7c4b521 100644 (file)
@@ -73,6 +73,8 @@ struct mt76x02_dev {
 
        struct mutex phy_mutex;
 
+       u16 vif_mask;
+
        u8 txdone_seq;
        DECLARE_KFIFO_PTR(txstatus_fifo, struct mt76x02_tx_status);
 
index 062614ad0d51ceffcb98504853f8c452c253678d..c9340096c187aa5296d527cd3a435834e3ee05ba 100644 (file)
@@ -309,6 +309,15 @@ mt76x02_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
        if (vif->type == NL80211_IFTYPE_STATION)
                idx += 8;
 
+       if (dev->vif_mask & BIT(idx))
+               return -EBUSY;
+
+       /* Allow to change address in HW if we create first interface. */
+       if (!dev->vif_mask && !ether_addr_equal(dev->mt76.macaddr, vif->addr))
+                mt76x02_mac_setaddr(dev, vif->addr);
+
+       dev->vif_mask |= BIT(idx);
+
        mt76x02_vif_init(dev, vif, idx);
        return 0;
 }
@@ -318,8 +327,10 @@ void mt76x02_remove_interface(struct ieee80211_hw *hw,
                              struct ieee80211_vif *vif)
 {
        struct mt76x02_dev *dev = hw->priv;
+       struct mt76x02_vif *mvif = (struct mt76x02_vif *)vif->drv_priv;
 
        mt76_txq_remove(&dev->mt76, vif->txq);
+       dev->vif_mask &= ~BIT(mvif->idx);
 }
 EXPORT_SYMBOL_GPL(mt76x02_remove_interface);