mt76: speed up usb bulk copy
authorMarkus Theil <markus.theil@tu-ilmenau.de>
Wed, 18 Dec 2019 16:07:53 +0000 (17:07 +0100)
committerFelix Fietkau <nbd@nbd.name>
Fri, 14 Feb 2020 09:06:01 +0000 (10:06 +0100)
Use larger batches for usb copy to speed this operation up. Otherwise it
would be too slow for copying new beacons or broadcast frames over usb.
Assure, that always a multiple of 4 Bytes is copied, as outlined in
850e8f6fbd "mt76: round up length on mt76_wr_copy" from Felix Fietkau.

Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76.h
drivers/net/wireless/mediatek/mt76/usb.c

index 846c9e1..3d50850 100644 (file)
@@ -389,7 +389,7 @@ enum mt76u_out_ep {
 struct mt76_usb {
        struct mutex usb_ctrl_mtx;
        union {
-               u8 data[32];
+               u8 data[128];
                __le32 reg_val;
        };
 
index 8561d1b..e89b38b 100644 (file)
@@ -149,18 +149,30 @@ static void mt76u_copy(struct mt76_dev *dev, u32 offset,
                       const void *data, int len)
 {
        struct mt76_usb *usb = &dev->usb;
-       const u32 *val = data;
-       int i, ret;
+       const u8 *val = data;
+       int ret;
+       int current_batch_size;
+       int i = 0;
+
+       /* Assure that always a multiple of 4 bytes are copied,
+        * otherwise beacons can be corrupted.
+        * See: "mt76: round up length on mt76_wr_copy"
+        * Commit 850e8f6fbd5d0003b0
+        */
+       len = round_up(len, 4);
 
        mutex_lock(&usb->usb_ctrl_mtx);
-       for (i = 0; i < DIV_ROUND_UP(len, 4); i++) {
-               put_unaligned(val[i], (u32 *)usb->data);
+       while (i < len) {
+               current_batch_size = min_t(int, sizeof(usb->data), 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,
-                                            0, offset + i * 4, usb->data,
-                                            sizeof(u32));
+                                            0, offset + i, usb->data,
+                                            current_batch_size);
                if (ret < 0)
                        break;
+
+               i += current_batch_size;
        }
        mutex_unlock(&usb->usb_ctrl_mtx);
 }