mirror of
https://github.com/outbackdingo/mt76.git
synced 2026-10-24 13:26:48 +00:00
mt76: speed up usb bulk copy
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 <[email protected]> Signed-off-by: Felix Fietkau <[email protected]>
This commit is contained in:
committed by
Felix Fietkau
parent
462a16e185
commit
fa24aba4c2
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user