From 5e1e5b75d6e8bfac7f4f30ca03d09f27e206227d Mon Sep 17 00:00:00 2001 From: Stanislaw Gruszka Date: Tue, 2 Jul 2019 17:06:01 +0200 Subject: [PATCH] mt76: usb: use full intermediate buffer in mt76u_copy Instead of use several 4 bytes usb requests, use full 32 bytes buffer to copy data to device. With the change we use less requests and copy exact data size to the device regardless size is multiple of 4 or not. Signed-off-by: Stanislaw Gruszka Signed-off-by: Felix Fietkau --- usb.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/usb.c b/usb.c index 0ff6f366..a57f73fc 100644 --- a/usb.c +++ b/usb.c @@ -160,19 +160,24 @@ 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; + int ret, req_len; mutex_lock(&usb->usb_ctrl_mtx); - for (i = 0; i < DIV_ROUND_UP(len, 4); i++) { - put_unaligned(val[i], usb->data); + do { + req_len = min_t(int, len, sizeof(usb->data)); + + memcpy(usb->data, data, req_len); + 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, usb->data, req_len); if (ret < 0) break; - } + + data += req_len; + offset += req_len; + len -= req_len; + } while (len > 0); mutex_unlock(&usb->usb_ctrl_mtx); }