mt76: usb: use max packet length for m76u_copy
authorStanislaw Gruszka <sgruszka@redhat.com>
Fri, 29 Nov 2019 12:32:26 +0000 (13:32 +0100)
committerFelix Fietkau <nbd@nbd.name>
Fri, 14 Feb 2020 09:06:01 +0000 (10:06 +0100)
For transferring data over USB the optimal size is endpoint maxpacket.
For my hardware maxpaket for control endpoint is 64 bytes and changing
to this value from 128 bytes further shorten TBTT work time from
3ms to 1ms.

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

index 3d508500574ca93c5bee6eff4ead154285fbd892..7034e901098a95d41f686bf3d64273a4d8131841 100644 (file)
@@ -388,10 +388,9 @@ enum mt76u_out_ep {
 #define MCU_RESP_URB_SIZE      1024
 struct mt76_usb {
        struct mutex usb_ctrl_mtx;
-       union {
-               u8 data[128];
-               __le32 reg_val;
-       };
+       __le32 reg_val;
+       u8 *data;
+       u16 data_len;
 
        struct tasklet_struct rx_tasklet;
        struct workqueue_struct *stat_wq;
index e89b38b0445cfee0ba7f2202e78afec4bcf7a30e..22dacf040123d7454159dd373228ba5890f13eb8 100644 (file)
@@ -163,7 +163,7 @@ static void mt76u_copy(struct mt76_dev *dev, u32 offset,
 
        mutex_lock(&usb->usb_ctrl_mtx);
        while (i < len) {
-               current_batch_size = min_t(int, sizeof(usb->data), len - i);
+               current_batch_size = min_t(int, usb->data_len, len - i);
                memcpy(usb->data, val + i, current_batch_size);
                ret = __mt76u_vendor_request(dev, MT_VEND_MULTI_WRITE,
                                             USB_DIR_OUT | USB_TYPE_VENDOR,
@@ -950,6 +950,15 @@ static const struct mt76_queue_ops usb_queue_ops = {
        .kick = mt76u_tx_kick,
 };
 
+void mt76u_deinit(struct mt76_dev *dev)
+{
+       if (dev->usb.stat_wq) {
+               destroy_workqueue(dev->usb.stat_wq);
+               dev->usb.stat_wq = NULL;
+       }
+}
+EXPORT_SYMBOL_GPL(mt76u_deinit);
+
 int mt76u_init(struct mt76_dev *dev,
               struct usb_interface *intf)
 {
@@ -973,6 +982,15 @@ int mt76u_init(struct mt76_dev *dev,
        if (!usb->stat_wq)
                return -ENOMEM;
 
+       usb->data_len = usb_maxpacket(udev, usb_sndctrlpipe(udev, 0), 1);
+       if (usb->data_len < 32)
+               usb->data_len = 32;
+       usb->data = devm_kmalloc(dev->dev, usb->data_len, GFP_KERNEL);
+       if (!usb->data) {
+               mt76u_deinit(dev);
+               return -ENOMEM;
+       }
+
        mutex_init(&usb->mcu.mutex);
 
        mutex_init(&usb->usb_ctrl_mtx);
@@ -987,14 +1005,5 @@ int mt76u_init(struct mt76_dev *dev,
 }
 EXPORT_SYMBOL_GPL(mt76u_init);
 
-void mt76u_deinit(struct mt76_dev *dev)
-{
-       if (dev->usb.stat_wq) {
-               destroy_workqueue(dev->usb.stat_wq);
-               dev->usb.stat_wq = NULL;
-       }
-}
-EXPORT_SYMBOL_GPL(mt76u_deinit);
-
 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>");
 MODULE_LICENSE("Dual BSD/GPL");