diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2020-03-02 15:19:49 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2020-03-26 07:21:14 +0100 |
commit | 709961ab5d36ec15db98a04b90d68d9c3394255d (patch) | |
tree | b731cad2c966abde43603fb3f5e69b5927098396 /drivers | |
parent | 32aeef4be60cfe5b96cda2d6ae88ae32ef015894 (diff) | |
download | barebox-709961ab5d36ec15db98a04b90d68d9c3394255d.tar.gz barebox-709961ab5d36ec15db98a04b90d68d9c3394255d.tar.xz |
usb: net: Allocate rx buffer dynamically
Allocate an individual rx buffer per device in the size we need it
instead of using one global buffer for all devices.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/usb/usbnet.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index 60e67ff1a2..9809c424fb 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c @@ -5,6 +5,7 @@ #include <errno.h> #include <malloc.h> #include <linux/phy.h> +#include <dma.h> /* handles CDC Ethernet and many other network "bulk data" interfaces */ int usbnet_get_endpoints(struct usbnet *dev) @@ -113,8 +114,6 @@ static int usbnet_send(struct eth_device *edev, void *eth_data, int data_length) return ret; } -static char rx_buf[4096]; - static int usbnet_recv(struct eth_device *edev) { struct usbnet *dev = (struct usbnet*) edev->priv; @@ -125,15 +124,15 @@ static int usbnet_recv(struct eth_device *edev) len = dev->rx_urb_size; - ret = usb_bulk_msg(dev->udev, dev->in, rx_buf, len, &alen, 100); + ret = usb_bulk_msg(dev->udev, dev->in, dev->rx_buf, len, &alen, 100); if (ret) return ret; if (alen) { if (info->rx_fixup) - return info->rx_fixup(dev, rx_buf, alen); + return info->rx_fixup(dev, dev->rx_buf, alen); else - net_receive(edev, rx_buf, alen); + net_receive(edev, dev->rx_buf, alen); } return 0; @@ -211,6 +210,12 @@ int usbnet_probe(struct usb_device *usbdev, const struct usb_device_id *prod) undev->rx_urb_size = 1514; /* FIXME: What to put here? */ undev->maxpacket = usb_maxpacket(undev->udev, undev->out); + undev->rx_buf = dma_alloc(undev->rx_urb_size); + if (!undev->rx_buf) { + status = -ENOMEM; + goto out1; + } + eth_register(edev); return 0; @@ -231,5 +236,6 @@ void usbnet_disconnect(struct usb_device *usbdev) eth_unregister(edev); + free(undev->rx_buf); free(undev); } |