wifi: mt76: change .sta_assoc callback to .sta_event
authorFelix Fietkau <nbd@nbd.name>
Tue, 27 Aug 2024 09:29:58 +0000 (11:29 +0200)
committerFelix Fietkau <nbd@nbd.name>
Fri, 6 Sep 2024 12:23:06 +0000 (14:23 +0200)
Also report auth/disassoc events, in order to give the driver more control over
handling the station state.

Link: https://patch.msgid.link/20240827093011.18621-11-nbd@nbd.name
Signed-off-by: Felix Fietkau <nbd@nbd.name>
14 files changed:
drivers/net/wireless/mediatek/mt76/mac80211.c
drivers/net/wireless/mediatek/mt76/mt76.h
drivers/net/wireless/mediatek/mt76/mt7603/init.c
drivers/net/wireless/mediatek/mt76/mt7603/main.c
drivers/net/wireless/mediatek/mt76/mt7603/mt7603.h
drivers/net/wireless/mediatek/mt76/mt7921/main.c
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
drivers/net/wireless/mediatek/mt76/mt7921/pci.c
drivers/net/wireless/mediatek/mt76/mt7921/sdio.c
drivers/net/wireless/mediatek/mt76/mt7921/usb.c
drivers/net/wireless/mediatek/mt76/mt7925/main.c
drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h
drivers/net/wireless/mediatek/mt76/mt7925/pci.c
drivers/net/wireless/mediatek/mt76/mt7925/usb.c

index 6183b021f6eb08f1954b37d290d5c3ee2dcc36f4..9d5561f441347bb75951fe1468feb18d7ef4b62c 100644 (file)
@@ -1509,21 +1509,32 @@ int mt76_sta_state(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 {
        struct mt76_phy *phy = hw->priv;
        struct mt76_dev *dev = phy->dev;
+       enum mt76_sta_event ev;
 
        if (old_state == IEEE80211_STA_NOTEXIST &&
            new_state == IEEE80211_STA_NONE)
                return mt76_sta_add(phy, vif, sta);
 
-       if (old_state == IEEE80211_STA_AUTH &&
-           new_state == IEEE80211_STA_ASSOC &&
-           dev->drv->sta_assoc)
-               dev->drv->sta_assoc(dev, vif, sta);
-
        if (old_state == IEEE80211_STA_NONE &&
            new_state == IEEE80211_STA_NOTEXIST)
                mt76_sta_remove(dev, vif, sta);
 
-       return 0;
+       if (!dev->drv->sta_event)
+               return 0;
+
+       if (old_state == IEEE80211_STA_AUTH &&
+           new_state == IEEE80211_STA_ASSOC)
+               ev = MT76_STA_EVENT_ASSOC;
+       else if (old_state == IEEE80211_STA_ASSOC &&
+                new_state == IEEE80211_STA_AUTHORIZED)
+               ev = MT76_STA_EVENT_AUTHORIZE;
+       else if (old_state == IEEE80211_STA_ASSOC &&
+                new_state == IEEE80211_STA_AUTH)
+               ev = MT76_STA_EVENT_DISASSOC;
+       else
+               return 0;
+
+       return dev->drv->sta_event(dev, vif, sta, ev);
 }
 EXPORT_SYMBOL_GPL(mt76_sta_state);
 
index 87048aa27fbf093af3d04e6c6cc5f0f398023627..f1cd9dc86b42303e1774a5ae9e99d85f68517c2c 100644 (file)
@@ -467,6 +467,12 @@ enum {
        MT76_STATE_WED_RESET,
 };
 
+enum mt76_sta_event {
+       MT76_STA_EVENT_ASSOC,
+       MT76_STA_EVENT_AUTHORIZE,
+       MT76_STA_EVENT_DISASSOC,
+};
+
 struct mt76_hw_cap {
        bool has_2ghz;
        bool has_5ghz;
@@ -513,8 +519,8 @@ struct mt76_driver_ops {
        int (*sta_add)(struct mt76_dev *dev, struct ieee80211_vif *vif,
                       struct ieee80211_sta *sta);
 
-       void (*sta_assoc)(struct mt76_dev *dev, struct ieee80211_vif *vif,
-                         struct ieee80211_sta *sta);
+       int (*sta_event)(struct mt76_dev *dev, struct ieee80211_vif *vif,
+                        struct ieee80211_sta *sta, enum mt76_sta_event ev);
 
        void (*sta_remove)(struct mt76_dev *dev, struct ieee80211_vif *vif,
                           struct ieee80211_sta *sta);
index 1528a8be7762de274d799cebb7a211bbf930bf61..86617a3e4328b004bf48e63663d42f7d43bf2e70 100644 (file)
@@ -15,7 +15,7 @@ const struct mt76_driver_ops mt7603_drv_ops = {
        .rx_poll_complete = mt7603_rx_poll_complete,
        .sta_ps = mt7603_sta_ps,
        .sta_add = mt7603_sta_add,
-       .sta_assoc = mt7603_sta_assoc,
+       .sta_event = mt7603_sta_event,
        .sta_remove = mt7603_sta_remove,
        .update_survey = mt7603_update_channel,
        .set_channel = mt7603_set_channel,
index 3d3a4cc2bab102296e1c3cd0da8dff9fc8cf80dc..574f74ad325da72affd582b3f9b1eb4a04a08441 100644 (file)
@@ -355,13 +355,19 @@ mt7603_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
        return ret;
 }
 
-void
-mt7603_sta_assoc(struct mt76_dev *mdev, struct ieee80211_vif *vif,
-                struct ieee80211_sta *sta)
+int
+mt7603_sta_event(struct mt76_dev *mdev, struct ieee80211_vif *vif,
+                struct ieee80211_sta *sta, enum mt76_sta_event ev)
 {
        struct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76);
 
-       mt7603_wtbl_update_cap(dev, sta);
+       if (ev == MT76_STA_EVENT_ASSOC) {
+               mutex_lock(&dev->mt76.mutex);
+               mt7603_wtbl_update_cap(dev, sta);
+               mutex_unlock(&dev->mt76.mutex);
+       }
+
+       return 0;
 }
 
 void
index dbdfe596f29e521eaedca9b7fe7f4882fa3a216b..55a034ccbacd9410a14643b1a5722085b7f53db3 100644 (file)
@@ -246,8 +246,8 @@ void mt7603_rx_poll_complete(struct mt76_dev *mdev, enum mt76_rxq_id q);
 void mt7603_sta_ps(struct mt76_dev *mdev, struct ieee80211_sta *sta, bool ps);
 int mt7603_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
                   struct ieee80211_sta *sta);
-void mt7603_sta_assoc(struct mt76_dev *mdev, struct ieee80211_vif *vif,
-                     struct ieee80211_sta *sta);
+int mt7603_sta_event(struct mt76_dev *mdev, struct ieee80211_vif *vif,
+                    struct ieee80211_sta *sta, enum mt76_sta_event ev);
 void mt7603_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
                       struct ieee80211_sta *sta);
 
index ffb2b68ddd519f8fb1b32642da44275aa5290625..a7f5bfbc02ed1f45f6a903fb8ceff63a1c54c526 100644 (file)
@@ -822,13 +822,16 @@ int mt7921_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
 }
 EXPORT_SYMBOL_GPL(mt7921_mac_sta_add);
 
-void mt7921_mac_sta_assoc(struct mt76_dev *mdev, struct ieee80211_vif *vif,
-                         struct ieee80211_sta *sta)
+int mt7921_mac_sta_event(struct mt76_dev *mdev, struct ieee80211_vif *vif,
+                        struct ieee80211_sta *sta, enum mt76_sta_event ev)
 {
        struct mt792x_dev *dev = container_of(mdev, struct mt792x_dev, mt76);
        struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv;
        struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
 
+       if (ev != MT76_STA_EVENT_ASSOC)
+           return 0;
+
        mt792x_mutex_acquire(dev);
 
        if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls)
@@ -844,8 +847,10 @@ void mt7921_mac_sta_assoc(struct mt76_dev *mdev, struct ieee80211_vif *vif,
        mt7921_mcu_sta_update(dev, sta, vif, true, MT76_STA_INFO_STATE_ASSOC);
 
        mt792x_mutex_release(dev);
+
+       return 0;
 }
-EXPORT_SYMBOL_GPL(mt7921_mac_sta_assoc);
+EXPORT_SYMBOL_GPL(mt7921_mac_sta_event);
 
 void mt7921_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
                           struct ieee80211_sta *sta)
index 0b4f4c8d88589a3c278ca42cc35d6696f68b661e..16c89815c0b8a324ebbf35fc5deb04773ccb930b 100644 (file)
@@ -245,8 +245,8 @@ int mt7921_mac_init(struct mt792x_dev *dev);
 bool mt7921_mac_wtbl_update(struct mt792x_dev *dev, int idx, u32 mask);
 int mt7921_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
                       struct ieee80211_sta *sta);
-void mt7921_mac_sta_assoc(struct mt76_dev *mdev, struct ieee80211_vif *vif,
-                         struct ieee80211_sta *sta);
+int mt7921_mac_sta_event(struct mt76_dev *mdev, struct ieee80211_vif *vif,
+                        struct ieee80211_sta *sta, enum mt76_sta_event ev);
 void mt7921_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
                           struct ieee80211_sta *sta);
 void mt7921_mac_reset_work(struct work_struct *work);
index bb8cfff78dc5889b5b45d82fb21abfbfbbb0a130..67723c22aea6cec3e25bb762ea9a1df97a51d920 100644 (file)
@@ -244,7 +244,7 @@ static int mt7921_pci_probe(struct pci_dev *pdev,
                .rx_skb = mt7921_queue_rx_skb,
                .rx_poll_complete = mt792x_rx_poll_complete,
                .sta_add = mt7921_mac_sta_add,
-               .sta_assoc = mt7921_mac_sta_assoc,
+               .sta_event = mt7921_mac_sta_event,
                .sta_remove = mt7921_mac_sta_remove,
                .update_survey = mt792x_update_channel,
                .set_channel = mt7921_set_channel,
index 2ef502d0ce9a4a401746b77b49aa0be515523d07..95f526f7bb991d265ee41e26e237f56e953efbba 100644 (file)
@@ -100,7 +100,7 @@ static int mt7921s_probe(struct sdio_func *func,
                .rx_skb = mt7921_queue_rx_skb,
                .rx_check = mt7921_rx_check,
                .sta_add = mt7921_mac_sta_add,
-               .sta_assoc = mt7921_mac_sta_assoc,
+               .sta_event = mt7921_mac_sta_event,
                .sta_remove = mt7921_mac_sta_remove,
                .update_survey = mt792x_update_channel,
                .set_channel = mt7921_set_channel,
index 3b5e52db4a13de00ef523ca55cfea933c45fa1d0..8aa4f0203208ab89582274858123da1d688985fb 100644 (file)
@@ -151,7 +151,7 @@ static int mt7921u_probe(struct usb_interface *usb_intf,
                .rx_skb = mt7921_queue_rx_skb,
                .rx_check = mt7921_rx_check,
                .sta_add = mt7921_mac_sta_add,
-               .sta_assoc = mt7921_mac_sta_assoc,
+               .sta_event = mt7921_mac_sta_event,
                .sta_remove = mt7921_mac_sta_remove,
                .update_survey = mt792x_update_channel,
                .set_channel = mt7921_set_channel,
index 8c0768bf9343b34230dba47b93253e69354dc486..38a3015332970cc37de9d6bdda7fcf8603ab6741 100644 (file)
@@ -1078,23 +1078,26 @@ static void mt7925_mac_link_sta_assoc(struct mt76_dev *mdev,
        mt792x_mutex_release(dev);
 }
 
-void mt7925_mac_sta_assoc(struct mt76_dev *mdev, struct ieee80211_vif *vif,
-                         struct ieee80211_sta *sta)
+int mt7925_mac_sta_event(struct mt76_dev *mdev, struct ieee80211_vif *vif,
+                        struct ieee80211_sta *sta, enum mt76_sta_event ev)
 {
+       struct ieee80211_link_sta *link_sta = &sta->deflink;
+
+       if (ev != MT76_STA_EVENT_ASSOC)
+               return 0;
+
        if (ieee80211_vif_is_mld(vif)) {
                struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv;
-               struct ieee80211_link_sta *link_sta;
 
                link_sta = mt792x_sta_to_link_sta(vif, sta, msta->deflink_id);
-
                mt7925_mac_set_links(mdev, vif);
-
-               mt7925_mac_link_sta_assoc(mdev, vif, link_sta);
-       } else {
-               mt7925_mac_link_sta_assoc(mdev, vif, &sta->deflink);
        }
+
+       mt7925_mac_link_sta_assoc(mdev, vif, link_sta);
+
+       return 0;
 }
-EXPORT_SYMBOL_GPL(mt7925_mac_sta_assoc);
+EXPORT_SYMBOL_GPL(mt7925_mac_sta_event);
 
 static void mt7925_mac_link_sta_remove(struct mt76_dev *mdev,
                                       struct ieee80211_vif *vif,
index 669f3a079d048556e7169d05dcf547858e7d7cf9..e80824a10b2c38d9a9e0a28144c3f1460893afc2 100644 (file)
@@ -219,8 +219,8 @@ int mt7925_mac_init(struct mt792x_dev *dev);
 int mt7925_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
                       struct ieee80211_sta *sta);
 bool mt7925_mac_wtbl_update(struct mt792x_dev *dev, int idx, u32 mask);
-void mt7925_mac_sta_assoc(struct mt76_dev *mdev, struct ieee80211_vif *vif,
-                         struct ieee80211_sta *sta);
+int mt7925_mac_sta_event(struct mt76_dev *mdev, struct ieee80211_vif *vif,
+                        struct ieee80211_sta *sta, enum mt76_sta_event ev);
 void mt7925_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
                           struct ieee80211_sta *sta);
 void mt7925_mac_reset_work(struct work_struct *work);
index 6e4f4e78c3505dc956a2321d5eb078a191317f6d..cb25eb50a45b1851f3c1467cd950c19f5dddacb1 100644 (file)
@@ -279,7 +279,7 @@ static int mt7925_pci_probe(struct pci_dev *pdev,
                .rx_skb = mt7925_queue_rx_skb,
                .rx_poll_complete = mt792x_rx_poll_complete,
                .sta_add = mt7925_mac_sta_add,
-               .sta_assoc = mt7925_mac_sta_assoc,
+               .sta_event = mt7925_mac_sta_event,
                .sta_remove = mt7925_mac_sta_remove,
                .update_survey = mt792x_update_channel,
        };
index 1e0f094fc9059dbb02585bdc168b6b763f198004..682db1bab21c6aeec452097e4e24cc34efb63c10 100644 (file)
@@ -142,7 +142,7 @@ static int mt7925u_probe(struct usb_interface *usb_intf,
                .rx_skb = mt7925_queue_rx_skb,
                .rx_check = mt7925_rx_check,
                .sta_add = mt7925_mac_sta_add,
-               .sta_assoc = mt7925_mac_sta_assoc,
+               .sta_event = mt7925_mac_sta_event,
                .sta_remove = mt7925_mac_sta_remove,
                .update_survey = mt792x_update_channel,
        };