mt76: usb: use max packet length for m76u_copy
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>
This commit is contained in:
parent
d3cc4e7640
commit
a6bfb6d13f
2 changed files with 22 additions and 14 deletions
|
@ -388,10 +388,9 @@ enum mt76u_out_ep {
|
||||||
#define MCU_RESP_URB_SIZE 1024
|
#define MCU_RESP_URB_SIZE 1024
|
||||||
struct mt76_usb {
|
struct mt76_usb {
|
||||||
struct mutex usb_ctrl_mtx;
|
struct mutex usb_ctrl_mtx;
|
||||||
union {
|
__le32 reg_val;
|
||||||
u8 data[128];
|
u8 *data;
|
||||||
__le32 reg_val;
|
u16 data_len;
|
||||||
};
|
|
||||||
|
|
||||||
struct tasklet_struct rx_tasklet;
|
struct tasklet_struct rx_tasklet;
|
||||||
struct workqueue_struct *stat_wq;
|
struct workqueue_struct *stat_wq;
|
||||||
|
|
|
@ -163,7 +163,7 @@ static void mt76u_copy(struct mt76_dev *dev, u32 offset,
|
||||||
|
|
||||||
mutex_lock(&usb->usb_ctrl_mtx);
|
mutex_lock(&usb->usb_ctrl_mtx);
|
||||||
while (i < len) {
|
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);
|
memcpy(usb->data, val + i, current_batch_size);
|
||||||
ret = __mt76u_vendor_request(dev, MT_VEND_MULTI_WRITE,
|
ret = __mt76u_vendor_request(dev, MT_VEND_MULTI_WRITE,
|
||||||
USB_DIR_OUT | USB_TYPE_VENDOR,
|
USB_DIR_OUT | USB_TYPE_VENDOR,
|
||||||
|
@ -950,6 +950,15 @@ static const struct mt76_queue_ops usb_queue_ops = {
|
||||||
.kick = mt76u_tx_kick,
|
.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,
|
int mt76u_init(struct mt76_dev *dev,
|
||||||
struct usb_interface *intf)
|
struct usb_interface *intf)
|
||||||
{
|
{
|
||||||
|
@ -973,6 +982,15 @@ int mt76u_init(struct mt76_dev *dev,
|
||||||
if (!usb->stat_wq)
|
if (!usb->stat_wq)
|
||||||
return -ENOMEM;
|
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->mcu.mutex);
|
||||||
|
|
||||||
mutex_init(&usb->usb_ctrl_mtx);
|
mutex_init(&usb->usb_ctrl_mtx);
|
||||||
|
@ -987,14 +1005,5 @@ int mt76u_init(struct mt76_dev *dev,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mt76u_init);
|
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_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>");
|
||||||
MODULE_LICENSE("Dual BSD/GPL");
|
MODULE_LICENSE("Dual BSD/GPL");
|
||||||
|
|
Loading…
Add table
Reference in a new issue