mt76: usb: introduce __mt76u_init utility routine
authorLorenzo Bianconi <lorenzo@kernel.org>
Mon, 14 Mar 2022 15:10:25 +0000 (16:10 +0100)
committerFelix Fietkau <nbd@nbd.name>
Wed, 16 Mar 2022 16:40:22 +0000 (17:40 +0100)
Introduce __mt76u_init unitility routine and move mt7615 usb bus ops
into mt7615 module in order to allow specifying driver specific
parameter.
This is a preliminary patch to add usb support to mt7921 driver.

Tested-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76.h
drivers/net/wireless/mediatek/mt76/mt7615/usb.c
drivers/net/wireless/mediatek/mt76/mt76x0/usb.c
drivers/net/wireless/mediatek/mt76/mt76x2/usb.c
drivers/net/wireless/mediatek/mt76/usb.c

index 81078be3bd07af9dbdf54bd6786e934885399668..882fb5d2517fa8c329e2d15443e1a57396dacf4f 100644 (file)
@@ -1274,13 +1274,21 @@ mt76u_bulk_msg(struct mt76_dev *dev, void *data, int len, int *actual_len,
 void mt76_ethtool_worker(struct mt76_ethtool_worker_info *wi,
                         struct mt76_sta_stats *stats);
 int mt76_skb_adjust_pad(struct sk_buff *skb, int pad);
+int __mt76u_vendor_request(struct mt76_dev *dev, u8 req, u8 req_type,
+                          u16 val, u16 offset, void *buf, size_t len);
 int mt76u_vendor_request(struct mt76_dev *dev, u8 req,
                         u8 req_type, u16 val, u16 offset,
                         void *buf, size_t len);
 void mt76u_single_wr(struct mt76_dev *dev, const u8 req,
                     const u16 offset, const u32 val);
-int mt76u_init(struct mt76_dev *dev, struct usb_interface *intf,
-              bool ext);
+void mt76u_read_copy(struct mt76_dev *dev, u32 offset,
+                    void *data, int len);
+u32 ___mt76u_rr(struct mt76_dev *dev, u8 req, u8 req_type, u32 addr);
+void ___mt76u_wr(struct mt76_dev *dev, u8 req, u8 req_type,
+                u32 addr, u32 val);
+int __mt76u_init(struct mt76_dev *dev, struct usb_interface *intf,
+                struct mt76_bus_ops *ops);
+int mt76u_init(struct mt76_dev *dev, struct usb_interface *intf);
 int mt76u_alloc_mcu_queue(struct mt76_dev *dev);
 int mt76u_alloc_queues(struct mt76_dev *dev);
 void mt76u_stop_tx(struct mt76_dev *dev);
index aeeba7c72f14a82c3717fba70435a1e992357cff..967641aebf5f00b23effcffd2e46760a2d5db1a5 100644 (file)
@@ -21,6 +21,64 @@ static const struct usb_device_id mt7615_device_table[] = {
        { },
 };
 
+static u32 mt7663u_rr(struct mt76_dev *dev, u32 addr)
+{
+       u32 ret;
+
+       mutex_lock(&dev->usb.usb_ctrl_mtx);
+       ret = ___mt76u_rr(dev, MT_VEND_READ_EXT,
+                         USB_DIR_IN | USB_TYPE_VENDOR, addr);
+       mutex_unlock(&dev->usb.usb_ctrl_mtx);
+
+       return ret;
+}
+
+static void mt7663u_wr(struct mt76_dev *dev, u32 addr, u32 val)
+{
+       mutex_lock(&dev->usb.usb_ctrl_mtx);
+       ___mt76u_wr(dev, MT_VEND_WRITE_EXT,
+                   USB_DIR_OUT | USB_TYPE_VENDOR, addr, val);
+       mutex_unlock(&dev->usb.usb_ctrl_mtx);
+}
+
+static u32 mt7663u_rmw(struct mt76_dev *dev, u32 addr,
+                      u32 mask, u32 val)
+{
+       mutex_lock(&dev->usb.usb_ctrl_mtx);
+       val |= ___mt76u_rr(dev, MT_VEND_READ_EXT,
+                          USB_DIR_IN | USB_TYPE_VENDOR, addr) & ~mask;
+       ___mt76u_wr(dev, MT_VEND_WRITE_EXT,
+                   USB_DIR_OUT | USB_TYPE_VENDOR, addr, val);
+       mutex_unlock(&dev->usb.usb_ctrl_mtx);
+
+       return val;
+}
+
+static void mt7663u_copy(struct mt76_dev *dev, u32 offset,
+                        const void *data, int len)
+{
+       struct mt76_usb *usb = &dev->usb;
+       int ret, i = 0, batch_len;
+       const u8 *val = data;
+
+       len = round_up(len, 4);
+
+       mutex_lock(&usb->usb_ctrl_mtx);
+       while (i < len) {
+               batch_len = min_t(int, usb->data_len, len - i);
+               memcpy(usb->data, val + i, batch_len);
+               ret = __mt76u_vendor_request(dev, MT_VEND_WRITE_EXT,
+                                            USB_DIR_OUT | USB_TYPE_VENDOR,
+                                            (offset + i) >> 16, offset + i,
+                                            usb->data, batch_len);
+               if (ret < 0)
+                       break;
+
+               i += batch_len;
+       }
+       mutex_unlock(&usb->usb_ctrl_mtx);
+}
+
 static void mt7663u_stop(struct ieee80211_hw *hw)
 {
        struct mt7615_phy *phy = mt7615_hw_phy(hw);
@@ -66,6 +124,14 @@ static int mt7663u_probe(struct usb_interface *usb_intf,
                .sta_remove = mt7615_mac_sta_remove,
                .update_survey = mt7615_update_channel,
        };
+       static struct mt76_bus_ops bus_ops = {
+               .rr = mt7663u_rr,
+               .wr = mt7663u_wr,
+               .rmw = mt7663u_rmw,
+               .read_copy = mt76u_read_copy,
+               .write_copy = mt7663u_copy,
+               .type = MT76_BUS_USB,
+       };
        struct usb_device *udev = interface_to_usbdev(usb_intf);
        struct ieee80211_ops *ops;
        struct mt7615_dev *dev;
@@ -92,7 +158,7 @@ static int mt7663u_probe(struct usb_interface *usb_intf,
        INIT_WORK(&dev->mcu_work, mt7663u_init_work);
        dev->reg_map = mt7663_usb_sdio_reg_map;
        dev->ops = ops;
-       ret = mt76u_init(mdev, usb_intf, true);
+       ret = __mt76u_init(mdev, usb_intf, &bus_ops);
        if (ret < 0)
                goto error;
 
index 436daf6d6d8697da65ef989304bff0da1b4b661d..0422c332354a131dab040c72a8961ec6f1b79515 100644 (file)
@@ -245,7 +245,7 @@ static int mt76x0u_probe(struct usb_interface *usb_intf,
        usb_set_intfdata(usb_intf, dev);
 
        mt76x02u_init_mcu(mdev);
-       ret = mt76u_init(mdev, usb_intf, false);
+       ret = mt76u_init(mdev, usb_intf);
        if (ret)
                goto err;
 
index 2575369e44e204b333c5ab7021624cca2c536b58..55068f3252ef341f4fbdc6d7dd382296e47b17f7 100644 (file)
@@ -57,7 +57,7 @@ static int mt76x2u_probe(struct usb_interface *intf,
        usb_set_intfdata(intf, dev);
 
        mt76x02u_init_mcu(mdev);
-       err = mt76u_init(mdev, intf, false);
+       err = mt76u_init(mdev, intf);
        if (err < 0)
                goto err;
 
index 4b7a816f1b9330658a332431f9e2306ba9a47d5f..a85e192c9d590ee9691eec3ba0816364f7f396fb 100644 (file)
@@ -15,9 +15,8 @@ static bool disable_usb_sg;
 module_param_named(disable_usb_sg, disable_usb_sg, bool, 0644);
 MODULE_PARM_DESC(disable_usb_sg, "Disable usb scatter-gather support");
 
-static int __mt76u_vendor_request(struct mt76_dev *dev, u8 req,
-                                 u8 req_type, u16 val, u16 offset,
-                                 void *buf, size_t len)
+int __mt76u_vendor_request(struct mt76_dev *dev, u8 req, u8 req_type,
+                          u16 val, u16 offset, void *buf, size_t len)
 {
        struct usb_interface *uintf = to_usb_interface(dev->dev);
        struct usb_device *udev = interface_to_usbdev(uintf);
@@ -45,6 +44,7 @@ static int __mt76u_vendor_request(struct mt76_dev *dev, u8 req,
                req, offset, ret);
        return ret;
 }
+EXPORT_SYMBOL_GPL(__mt76u_vendor_request);
 
 int mt76u_vendor_request(struct mt76_dev *dev, u8 req,
                         u8 req_type, u16 val, u16 offset,
@@ -62,8 +62,7 @@ int mt76u_vendor_request(struct mt76_dev *dev, u8 req,
 }
 EXPORT_SYMBOL_GPL(mt76u_vendor_request);
 
-static u32 ___mt76u_rr(struct mt76_dev *dev, u8 req, u8 req_type,
-                      u32 addr)
+u32 ___mt76u_rr(struct mt76_dev *dev, u8 req, u8 req_type, u32 addr)
 {
        struct mt76_usb *usb = &dev->usb;
        u32 data = ~0;
@@ -77,6 +76,7 @@ static u32 ___mt76u_rr(struct mt76_dev *dev, u8 req, u8 req_type,
 
        return data;
 }
+EXPORT_SYMBOL_GPL(___mt76u_rr);
 
 static u32 __mt76u_rr(struct mt76_dev *dev, u32 addr)
 {
@@ -109,20 +109,8 @@ static u32 mt76u_rr(struct mt76_dev *dev, u32 addr)
        return ret;
 }
 
-static u32 mt76u_rr_ext(struct mt76_dev *dev, u32 addr)
-{
-       u32 ret;
-
-       mutex_lock(&dev->usb.usb_ctrl_mtx);
-       ret = ___mt76u_rr(dev, MT_VEND_READ_EXT,
-                         USB_DIR_IN | USB_TYPE_VENDOR, addr);
-       mutex_unlock(&dev->usb.usb_ctrl_mtx);
-
-       return ret;
-}
-
-static void ___mt76u_wr(struct mt76_dev *dev, u8 req, u8 req_type,
-                       u32 addr, u32 val)
+void ___mt76u_wr(struct mt76_dev *dev, u8 req, u8 req_type,
+                u32 addr, u32 val)
 {
        struct mt76_usb *usb = &dev->usb;
 
@@ -131,6 +119,7 @@ static void ___mt76u_wr(struct mt76_dev *dev, u8 req, u8 req_type,
                               addr, usb->data, sizeof(__le32));
        trace_usb_reg_wr(dev, addr, val);
 }
+EXPORT_SYMBOL_GPL(___mt76u_wr);
 
 static void __mt76u_wr(struct mt76_dev *dev, u32 addr, u32 val)
 {
@@ -155,14 +144,6 @@ static void mt76u_wr(struct mt76_dev *dev, u32 addr, u32 val)
        mutex_unlock(&dev->usb.usb_ctrl_mtx);
 }
 
-static void mt76u_wr_ext(struct mt76_dev *dev, u32 addr, u32 val)
-{
-       mutex_lock(&dev->usb.usb_ctrl_mtx);
-       ___mt76u_wr(dev, MT_VEND_WRITE_EXT,
-                   USB_DIR_OUT | USB_TYPE_VENDOR, addr, val);
-       mutex_unlock(&dev->usb.usb_ctrl_mtx);
-}
-
 static u32 mt76u_rmw(struct mt76_dev *dev, u32 addr,
                     u32 mask, u32 val)
 {
@@ -174,19 +155,6 @@ static u32 mt76u_rmw(struct mt76_dev *dev, u32 addr,
        return val;
 }
 
-static u32 mt76u_rmw_ext(struct mt76_dev *dev, u32 addr,
-                        u32 mask, u32 val)
-{
-       mutex_lock(&dev->usb.usb_ctrl_mtx);
-       val |= ___mt76u_rr(dev, MT_VEND_READ_EXT,
-                          USB_DIR_IN | USB_TYPE_VENDOR, addr) & ~mask;
-       ___mt76u_wr(dev, MT_VEND_WRITE_EXT,
-                   USB_DIR_OUT | USB_TYPE_VENDOR, addr, val);
-       mutex_unlock(&dev->usb.usb_ctrl_mtx);
-
-       return val;
-}
-
 static void mt76u_copy(struct mt76_dev *dev, u32 offset,
                       const void *data, int len)
 {
@@ -219,33 +187,8 @@ static void mt76u_copy(struct mt76_dev *dev, u32 offset,
        mutex_unlock(&usb->usb_ctrl_mtx);
 }
 
-static void mt76u_copy_ext(struct mt76_dev *dev, u32 offset,
-                          const void *data, int len)
-{
-       struct mt76_usb *usb = &dev->usb;
-       int ret, i = 0, batch_len;
-       const u8 *val = data;
-
-       len = round_up(len, 4);
-       mutex_lock(&usb->usb_ctrl_mtx);
-       while (i < len) {
-               batch_len = min_t(int, usb->data_len, len - i);
-               memcpy(usb->data, val + i, batch_len);
-               ret = __mt76u_vendor_request(dev, MT_VEND_WRITE_EXT,
-                                            USB_DIR_OUT | USB_TYPE_VENDOR,
-                                            (offset + i) >> 16, offset + i,
-                                            usb->data, batch_len);
-               if (ret < 0)
-                       break;
-
-               i += batch_len;
-       }
-       mutex_unlock(&usb->usb_ctrl_mtx);
-}
-
-static void
-mt76u_read_copy_ext(struct mt76_dev *dev, u32 offset,
-                   void *data, int len)
+void mt76u_read_copy(struct mt76_dev *dev, u32 offset,
+                    void *data, int len)
 {
        struct mt76_usb *usb = &dev->usb;
        int i = 0, batch_len, ret;
@@ -267,6 +210,7 @@ mt76u_read_copy_ext(struct mt76_dev *dev, u32 offset,
        }
        mutex_unlock(&usb->usb_ctrl_mtx);
 }
+EXPORT_SYMBOL_GPL(mt76u_read_copy);
 
 void mt76u_single_wr(struct mt76_dev *dev, const u8 req,
                     const u16 offset, const u32 val)
@@ -1115,24 +1059,13 @@ static const struct mt76_queue_ops usb_queue_ops = {
        .kick = mt76u_tx_kick,
 };
 
-int mt76u_init(struct mt76_dev *dev,
-              struct usb_interface *intf, bool ext)
+int __mt76u_init(struct mt76_dev *dev, struct usb_interface *intf,
+                struct mt76_bus_ops *ops)
 {
-       static struct mt76_bus_ops mt76u_ops = {
-               .read_copy = mt76u_read_copy_ext,
-               .wr_rp = mt76u_wr_rp,
-               .rd_rp = mt76u_rd_rp,
-               .type = MT76_BUS_USB,
-       };
        struct usb_device *udev = interface_to_usbdev(intf);
        struct mt76_usb *usb = &dev->usb;
        int err;
 
-       mt76u_ops.rr = ext ? mt76u_rr_ext : mt76u_rr;
-       mt76u_ops.wr = ext ? mt76u_wr_ext : mt76u_wr;
-       mt76u_ops.rmw = ext ? mt76u_rmw_ext : mt76u_rmw;
-       mt76u_ops.write_copy = ext ? mt76u_copy_ext : mt76u_copy;
-
        INIT_WORK(&usb->stat_work, mt76u_tx_status_data);
 
        usb->data_len = usb_maxpacket(udev, usb_sndctrlpipe(udev, 0), 1);
@@ -1144,7 +1077,7 @@ int mt76u_init(struct mt76_dev *dev,
                return -ENOMEM;
 
        mutex_init(&usb->usb_ctrl_mtx);
-       dev->bus = &mt76u_ops;
+       dev->bus = ops;
        dev->queue_ops = &usb_queue_ops;
 
        dev_set_drvdata(&udev->dev, dev);
@@ -1170,6 +1103,23 @@ int mt76u_init(struct mt76_dev *dev,
 
        return 0;
 }
+EXPORT_SYMBOL_GPL(__mt76u_init);
+
+int mt76u_init(struct mt76_dev *dev, struct usb_interface *intf)
+{
+       static struct mt76_bus_ops bus_ops = {
+               .rr = mt76u_rr,
+               .wr = mt76u_wr,
+               .rmw = mt76u_rmw,
+               .read_copy = mt76u_read_copy,
+               .write_copy = mt76u_copy,
+               .wr_rp = mt76u_wr_rp,
+               .rd_rp = mt76u_rd_rp,
+               .type = MT76_BUS_USB,
+       };
+
+       return __mt76u_init(dev, intf, &bus_ops);
+}
 EXPORT_SYMBOL_GPL(mt76u_init);
 
 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>");