summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2020-03-03 16:07:09 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2020-03-26 07:21:14 +0100
commit5195ff3294373197881be1545de4ff23995b9842 (patch)
tree069082a53608d6b2a51c53a6d4824bf261c8ee9d
parent709961ab5d36ec15db98a04b90d68d9c3394255d (diff)
downloadbarebox-5195ff3294373197881be1545de4ff23995b9842.tar.gz
barebox-5195ff3294373197881be1545de4ff23995b9842.tar.xz
usb: net: Allocate tx buffer dynamically
It's cleaner to have a tx buffer per device and not one for all. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--drivers/net/usb/usbnet.c21
-rw-r--r--include/usb/usbnet.h1
2 files changed, 15 insertions, 7 deletions
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index 9809c424fb..92a31ee894 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -78,8 +78,6 @@ int usbnet_get_endpoints(struct usbnet *dev)
}
EXPORT_SYMBOL(usbnet_get_endpoints);
-char tx_buffer[4096];
-
static int usbnet_send(struct eth_device *edev, void *eth_data, int data_length)
{
struct usbnet *dev = edev->priv;
@@ -92,23 +90,25 @@ static int usbnet_send(struct eth_device *edev, void *eth_data, int data_length)
* win32 driver (usually) and/or hardware quirks
*/
if(info->tx_fixup) {
- if(info->tx_fixup(dev, eth_data, data_length, tx_buffer, &len)) {
+ if(info->tx_fixup(dev, eth_data, data_length, dev->tx_buf, &len)) {
dev_dbg(&edev->dev, "can't tx_fixup packet");
return 0;
}
} else {
len = data_length;
- memmove(tx_buffer, (void*) eth_data, len);
+ memmove(dev->tx_buf, (void*) eth_data, len);
}
/* don't assume the hardware handles USB_ZERO_PACKET
* NOTE: strictly conforming cdc-ether devices should expect
* the ZLP here, but ignore the one-byte packet.
*/
- if ((len % dev->maxpacket) == 0)
- tx_buffer[len++] = 0;
+ if ((len % dev->maxpacket) == 0) {
+ *(unsigned char *)(dev->tx_buf + len) = 0;
+ len++;
+ }
- ret = usb_bulk_msg(dev->udev, dev->out, tx_buffer, len, &alen, 1000);
+ ret = usb_bulk_msg(dev->udev, dev->out, dev->tx_buf, len, &alen, 1000);
dev_dbg(&edev->dev, "%s: ret: %d len: %d alen: %d\n", __func__, ret, len, alen);
return ret;
@@ -216,6 +216,12 @@ int usbnet_probe(struct usb_device *usbdev, const struct usb_device_id *prod)
goto out1;
}
+ undev->tx_buf = dma_alloc(4096);
+ if (!undev->tx_buf) {
+ status = -ENOMEM;
+ goto out1;
+ }
+
eth_register(edev);
return 0;
@@ -237,5 +243,6 @@ void usbnet_disconnect(struct usb_device *usbdev)
eth_unregister(edev);
free(undev->rx_buf);
+ free(undev->tx_buf);
free(undev);
}
diff --git a/include/usb/usbnet.h b/include/usb/usbnet.h
index 3edf49413a..450db47b40 100644
--- a/include/usb/usbnet.h
+++ b/include/usb/usbnet.h
@@ -46,6 +46,7 @@ struct usbnet {
u32 hard_mtu; /* count any extra framing */
size_t rx_urb_size; /* size for rx urbs */
void *rx_buf;
+ void *tx_buf;
unsigned long flags;
# define EVENT_TX_HALT 0