mt76: implement .mcu_parse_response in struct mt76_mcu_ops
authorFelix Fietkau <nbd@nbd.name>
Wed, 30 Sep 2020 01:53:59 +0000 (03:53 +0200)
committerFelix Fietkau <nbd@nbd.name>
Fri, 4 Dec 2020 12:46:14 +0000 (13:46 +0100)
Do not free skb inside that function
Preparation for further cleanup

Signed-off-by: Felix Fietkau <nbd@nbd.name>
12 files changed:
drivers/net/wireless/mediatek/mt76/mt76.h
drivers/net/wireless/mediatek/mt76/mt7603/mcu.c
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h
drivers/net/wireless/mediatek/mt76/mt7615/sdio_mcu.c
drivers/net/wireless/mediatek/mt76/mt7615/usb_mcu.c
drivers/net/wireless/mediatek/mt76/mt76x0/pci_mcu.c
drivers/net/wireless/mediatek/mt76/mt76x02_mcu.c
drivers/net/wireless/mediatek/mt76/mt76x02_mcu.h
drivers/net/wireless/mediatek/mt76/mt76x02_usb_mcu.c
drivers/net/wireless/mediatek/mt76/mt76x2/pci_mcu.c
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c

index 47cf3ecfa8c79c46e8e8dd2978f9ca4e57394b7c..2856cb1d1cf62acad3e568121e53bb831954aa4c 100644 (file)
@@ -148,6 +148,8 @@ struct mt76_mcu_ops {
                            int len, bool wait_resp);
        int (*mcu_skb_send_msg)(struct mt76_dev *dev, struct sk_buff *skb,
                                int cmd, bool wait_resp);
+       int (*mcu_parse_response)(struct mt76_dev *dev, int cmd,
+                                 struct sk_buff *skb, int seq);
        u32 (*mcu_rr)(struct mt76_dev *dev, u32 offset);
        void (*mcu_wr)(struct mt76_dev *dev, u32 offset, u32 val);
        int (*mcu_wr_rp)(struct mt76_dev *dev, u32 base,
index ddef085f930df6286291fafdceb1c821a2f0e539..6cd947df6429d692358c8aae9da53471525d5e8e 100644 (file)
@@ -13,6 +13,18 @@ struct mt7603_fw_trailer {
        __le32 dl_len;
 } __packed;
 
+static int
+mt7603_mcu_parse_response(struct mt76_dev *mdev, int cmd,
+                         struct sk_buff *skb, int seq)
+{
+       struct mt7603_mcu_rxd *rxd = (struct mt7603_mcu_rxd *)skb->data;
+
+       if (seq != rxd->seq)
+               return -EAGAIN;
+
+       return 0;
+}
+
 static int
 __mt7603_mcu_msg_send(struct mt7603_dev *dev, struct sk_buff *skb,
                      int cmd, int *wait_seq)
@@ -58,7 +70,6 @@ mt7603_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,
 {
        struct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76);
        unsigned long expires = jiffies + 3 * HZ;
-       struct mt7603_mcu_rxd *rxd;
        struct sk_buff *skb;
        int ret, seq;
 
@@ -73,8 +84,6 @@ mt7603_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,
                goto out;
 
        while (wait_resp) {
-               bool check_seq = false;
-
                skb = mt76_mcu_get_response(&dev->mt76, expires);
                if (!skb) {
                        dev_err(mdev->dev,
@@ -85,13 +94,9 @@ mt7603_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,
                        break;
                }
 
-               rxd = (struct mt7603_mcu_rxd *)skb->data;
-               if (seq == rxd->seq)
-                       check_seq = true;
-
+               ret = mt7603_mcu_parse_response(mdev, cmd, skb, seq);
                dev_kfree_skb(skb);
-
-               if (check_seq)
+               if (ret != -EAGAIN)
                        break;
        }
 
@@ -266,6 +271,7 @@ int mt7603_mcu_init(struct mt7603_dev *dev)
        static const struct mt76_mcu_ops mt7603_mcu_ops = {
                .headroom = sizeof(struct mt7603_mcu_txd),
                .mcu_send_msg = mt7603_mcu_msg_send,
+               .mcu_parse_response = mt7603_mcu_parse_response,
                .mcu_restart = mt7603_mcu_restart,
        };
 
index 48ac583a64e35cedcf9a4dae2d00f4c1c66e73ef..f042299b110e8f6dce6e5201e538e62c15d999cb 100644 (file)
@@ -179,17 +179,14 @@ static int __mt7615_mcu_msg_send(struct mt7615_dev *dev, struct sk_buff *skb,
        return mt76_tx_queue_skb_raw(dev, qid, skb, 0);
 }
 
-static int
-mt7615_mcu_parse_response(struct mt7615_dev *dev, int cmd,
-                         struct sk_buff *skb, int seq)
+int mt7615_mcu_parse_response(struct mt76_dev *mdev, int cmd,
+                             struct sk_buff *skb, int seq)
 {
        struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
        int ret = 0;
 
-       if (seq != rxd->seq) {
-               ret = -EAGAIN;
-               goto out;
-       }
+       if (seq != rxd->seq)
+               return -EAGAIN;
 
        switch (cmd) {
        case MCU_CMD_PATCH_SEM_CONTROL:
@@ -228,11 +225,10 @@ mt7615_mcu_parse_response(struct mt7615_dev *dev, int cmd,
        default:
                break;
        }
-out:
-       dev_kfree_skb(skb);
 
        return ret;
 }
+EXPORT_SYMBOL_GPL(mt7615_mcu_parse_response);
 
 int mt7615_mcu_wait_response(struct mt7615_dev *dev, int cmd, int seq)
 {
@@ -248,7 +244,8 @@ int mt7615_mcu_wait_response(struct mt7615_dev *dev, int cmd, int seq)
                        return -ETIMEDOUT;
                }
 
-               ret = mt7615_mcu_parse_response(dev, cmd, skb, seq);
+               ret = mt7615_mcu_parse_response(&dev->mt76, cmd, skb, seq);
+               dev_kfree_skb(skb);
                if (ret != -EAGAIN)
                        break;
        }
@@ -2467,6 +2464,7 @@ int mt7615_mcu_init(struct mt7615_dev *dev)
                .headroom = sizeof(struct mt7615_mcu_txd),
                .mcu_skb_send_msg = mt7615_mcu_send_message,
                .mcu_send_msg = mt7615_mcu_msg_send,
+               .mcu_parse_response = mt7615_mcu_parse_response,
                .mcu_restart = mt7615_mcu_restart,
        };
        int ret;
index 43d8256af66abaec28aa155f2c29bc8e6592bfb6..66356ed42f73efc6b4a7bc5e194c613208433525 100644 (file)
@@ -592,6 +592,8 @@ u32 mt7615_mac_get_sta_tid_sn(struct mt7615_dev *dev, int wcid, u8 tid);
 int mt7615_mcu_wait_response(struct mt7615_dev *dev, int cmd, int seq);
 int mt7615_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,
                        int len, bool wait_resp);
+int mt7615_mcu_parse_response(struct mt76_dev *mdev, int cmd,
+                             struct sk_buff *skb, int seq);
 u32 mt7615_rf_rr(struct mt7615_dev *dev, u32 wf, u32 reg);
 int mt7615_rf_wr(struct mt7615_dev *dev, u32 wf, u32 reg, u32 val);
 int mt7615_mcu_set_dbdc(struct mt7615_dev *dev);
index 38670c00380c61170d2f3a4831fa403b6252b2fd..263f3a65878f7d658432cf71d5049a210eeca4a9 100644 (file)
@@ -128,6 +128,7 @@ int mt7663s_mcu_init(struct mt7615_dev *dev)
                .tailroom = MT_USB_TAIL_SIZE,
                .mcu_skb_send_msg = mt7663s_mcu_send_message,
                .mcu_send_msg = mt7615_mcu_msg_send,
+               .mcu_parse_response = mt7615_mcu_parse_response,
                .mcu_restart = mt7615_mcu_restart,
                .mcu_rr = mt7615_mcu_reg_rr,
                .mcu_wr = mt7615_mcu_reg_wr,
index 4d8be366af31bfd4f4277e61497511eab59a54cd..4bac8fda47141129676e09f160308d90d898625f 100644 (file)
@@ -57,6 +57,7 @@ int mt7663u_mcu_init(struct mt7615_dev *dev)
                .tailroom = MT_USB_TAIL_SIZE,
                .mcu_skb_send_msg = mt7663u_mcu_send_message,
                .mcu_send_msg = mt7615_mcu_msg_send,
+               .mcu_parse_response = mt7615_mcu_parse_response,
                .mcu_restart = mt7615_mcu_restart,
        };
        int ret;
index 007c762c6db109bf0e3b36c00de7d20cd35e67ba..f0962507f72f4751e99f5c3f9406db4450bdd1fb 100644 (file)
@@ -117,6 +117,7 @@ int mt76x0e_mcu_init(struct mt76x02_dev *dev)
 {
        static const struct mt76_mcu_ops mt76x0e_mcu_ops = {
                .mcu_send_msg = mt76x02_mcu_msg_send,
+               .mcu_parse_response = mt76x02_mcu_parse_response,
        };
        int err;
 
index 1c2e3d16f89c0e21fddc5176216857fa12553336..e35b3a253f82450325303b75ac97d2b8473e3124 100644 (file)
 
 #include "mt76x02_mcu.h"
 
+int mt76x02_mcu_parse_response(struct mt76_dev *mdev, int cmd,
+                              struct sk_buff *skb, int seq)
+{
+       u32 *rxfce = (u32 *)skb->cb;
+
+       if (seq != FIELD_GET(MT_RX_FCE_INFO_CMD_SEQ, *rxfce))
+               return -EAGAIN;
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(mt76x02_mcu_parse_response);
+
 int mt76x02_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,
                         int len, bool wait_resp)
 {
@@ -44,9 +56,6 @@ int mt76x02_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,
                goto out;
 
        while (wait_resp) {
-               u32 *rxfce;
-               bool check_seq = false;
-
                skb = mt76_mcu_get_response(&dev->mt76, expires);
                if (!skb) {
                        dev_err(mdev->dev,
@@ -57,13 +66,9 @@ int mt76x02_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,
                        break;
                }
 
-               rxfce = (u32 *)skb->cb;
-
-               if (seq == FIELD_GET(MT_RX_FCE_INFO_CMD_SEQ, *rxfce))
-                       check_seq = true;
-
+               ret = mt76x02_mcu_parse_response(mdev, cmd, skb, seq);
                dev_kfree_skb(skb);
-               if (check_seq)
+               if (ret != -EAGAIN)
                        break;
        }
 
index 5fba1266c648539fdd1aa4d38905ed29b18d32b1..e187ed52968ea981216007108e2e21307255ac30 100644 (file)
@@ -89,6 +89,8 @@ int mt76x02_mcu_cleanup(struct mt76x02_dev *dev);
 int mt76x02_mcu_calibrate(struct mt76x02_dev *dev, int type, u32 param);
 int mt76x02_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,
                         int len, bool wait_resp);
+int mt76x02_mcu_parse_response(struct mt76_dev *mdev, int cmd,
+                              struct sk_buff *skb, int seq);
 int mt76x02_mcu_function_select(struct mt76x02_dev *dev, enum mcu_function func,
                                u32 val);
 int mt76x02_mcu_set_radio_state(struct mt76x02_dev *dev, bool on);
index e43d13d7c9881839517484db565e986941911efb..2953df7d8388d0c41e665af5c02bb847b2756e7e 100644 (file)
@@ -297,6 +297,7 @@ void mt76x02u_init_mcu(struct mt76_dev *dev)
                .headroom = MT_CMD_HDR_LEN,
                .tailroom = 8,
                .mcu_send_msg = mt76x02u_mcu_send_msg,
+               .mcu_parse_response = mt76x02_mcu_parse_response,
                .mcu_wr_rp = mt76x02u_mcu_wr_rp,
                .mcu_rd_rp = mt76x02u_mcu_rd_rp,
        };
index ca6f968411ac2de3a4b3fd8975b19ea9498ebf50..e5b6282d1a6c61b2e308404ad7692d89a296a3d0 100644 (file)
@@ -179,6 +179,7 @@ int mt76x2_mcu_init(struct mt76x02_dev *dev)
        static const struct mt76_mcu_ops mt76x2_mcu_ops = {
                .mcu_restart = mt76pci_mcu_restart,
                .mcu_send_msg = mt76x02_mcu_msg_send,
+               .mcu_parse_response = mt76x02_mcu_parse_response,
        };
        int ret;
 
index 0600ca7016eee64e098aa296b86a0b7e348d1685..946fe139b9f74c3e5202ce060d3c7de5548dc5da 100644 (file)
@@ -309,16 +309,15 @@ mt7915_mcu_parse_eeprom(struct mt7915_dev *dev, struct sk_buff *skb)
 }
 
 static int
-mt7915_mcu_parse_response(struct mt7915_dev *dev, int cmd,
+mt7915_mcu_parse_response(struct mt76_dev *mdev, int cmd,
                          struct sk_buff *skb, int seq)
 {
+       struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
        struct mt7915_mcu_rxd *rxd = (struct mt7915_mcu_rxd *)skb->data;
        int ret = 0;
 
-       if (seq != rxd->seq) {
-               ret = -EAGAIN;
-               goto out;
-       }
+       if (seq != rxd->seq)
+               return -EAGAIN;
 
        switch (cmd) {
        case -MCU_CMD_PATCH_SEM_CONTROL:
@@ -335,8 +334,6 @@ mt7915_mcu_parse_response(struct mt7915_dev *dev, int cmd,
        default:
                break;
        }
-out:
-       dev_kfree_skb(skb);
 
        return ret;
 }
@@ -356,7 +353,8 @@ mt7915_mcu_wait_response(struct mt7915_dev *dev, int cmd, int seq)
                        return -ETIMEDOUT;
                }
 
-               ret = mt7915_mcu_parse_response(dev, cmd, skb, seq);
+               ret = mt7915_mcu_parse_response(&dev->mt76, cmd, skb, seq);
+               dev_kfree_skb(skb);
                if (ret != -EAGAIN)
                        break;
        }
@@ -2961,6 +2959,7 @@ int mt7915_mcu_init(struct mt7915_dev *dev)
                .headroom = sizeof(struct mt7915_mcu_txd),
                .mcu_skb_send_msg = mt7915_mcu_send_message,
                .mcu_send_msg = mt7915_mcu_msg_send,
+               .mcu_parse_response = mt7915_mcu_parse_response,
                .mcu_restart = mt7915_mcu_restart,
        };
        int ret;