]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: mt76: mt7925: extend mt7925_mcu_uni_roc_event
authorSean Wang <sean.wang@mediatek.com>
Sat, 6 Jul 2024 08:27:46 +0000 (01:27 -0700)
committerFelix Fietkau <nbd@nbd.name>
Tue, 9 Jul 2024 21:02:01 +0000 (23:02 +0200)
We extended the function to be able multiple pieces of information
in a single event, supporting the future MLO-enabled firmware.

Co-developed-by: Ming Yen Hsieh <mingyen.hsieh@mediatek.com>
Signed-off-by: Ming Yen Hsieh <mingyen.hsieh@mediatek.com>
Co-developed-by: Deren Wu <deren.wu@mediatek.com>
Signed-off-by: Deren Wu <deren.wu@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Link: https://patch.msgid.link/4be7b34904034d521dab147883b898b5402fd29f.1720248331.git.sean.wang@kernel.org
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h

index 1db81cf4d71d3b15d3f3d027a650477de7f8b227..cf4b46ebfc92ad24c67029cfe8f2377df5068eb0 100644 (file)
@@ -313,16 +313,14 @@ mt7925_mcu_roc_iter(void *priv, u8 *mac, struct ieee80211_vif *vif)
        mvif->band_idx = grant->dbdcband;
 }
 
-static void
-mt7925_mcu_uni_roc_event(struct mt792x_dev *dev, struct sk_buff *skb)
+static void mt7925_mcu_roc_handle_grant(struct mt792x_dev *dev,
+                                       struct tlv *tlv)
 {
        struct ieee80211_hw *hw = dev->mt76.hw;
        struct mt7925_roc_grant_tlv *grant;
-       struct mt7925_mcu_rxd *rxd;
        int duration;
 
-       rxd = (struct mt7925_mcu_rxd *)skb->data;
-       grant = (struct mt7925_roc_grant_tlv *)(rxd->tlv + 4);
+       grant = (struct mt7925_roc_grant_tlv *)tlv;
 
        /* should never happen */
        WARN_ON_ONCE((le16_to_cpu(grant->tag) != UNI_EVENT_ROC_GRANT));
@@ -340,6 +338,29 @@ mt7925_mcu_uni_roc_event(struct mt792x_dev *dev, struct sk_buff *skb)
                  jiffies + msecs_to_jiffies(duration));
 }
 
+static void
+mt7925_mcu_uni_roc_event(struct mt792x_dev *dev, struct sk_buff *skb)
+{
+       struct tlv *tlv;
+       int i = 0;
+
+       skb_pull(skb, sizeof(struct mt7925_mcu_rxd) + 4);
+
+       while (i < skb->len) {
+               tlv = (struct tlv *)(skb->data + i);
+
+               switch (le16_to_cpu(tlv->tag)) {
+               case UNI_EVENT_ROC_GRANT:
+                       mt7925_mcu_roc_handle_grant(dev, tlv);
+                       break;
+               case UNI_EVENT_ROC_GRANT_SUB_LINK:
+                       break;
+               }
+
+               i += le16_to_cpu(tlv->len);
+       }
+}
+
 static void
 mt7925_mcu_scan_event(struct mt792x_dev *dev, struct sk_buff *skb)
 {
index 7750049c42f2c1c2a1d6c1318cc54b87d338c598..b7f8802b9cd699b81aca0b56b131ffb51fb1ff9a 100644 (file)
@@ -41,6 +41,7 @@ enum mt7925_roc_req {
 
 enum {
        UNI_EVENT_ROC_GRANT = 0,
+       UNI_EVENT_ROC_GRANT_SUB_LINK = 4,
        UNI_EVENT_ROC_TAG_NUM
 };