mirror of https://gitee.com/openkylin/linux.git
usb: gadget: ether: Allow jumbo frames
USB network adapters support Jumbo frames. The only thing blocking that feature is the code in the gadget driver that disposes of packets larger than 1518 bytes, and the limit on the ioctl to set the mtu. This patch relaxes these limits, and allows up to 15k frames sizes. The 15k value was chosen because 16k does not work on all platforms, and usingclose to 16k will result in allocating 5 or 8 4k pages to store the skb, wasting pages at no measurable performance gain. On a topic-miami board (Zynq-7000), iperf3 performance reports: MTU= 1500, PC-to-gadget: 139 Mbps, Gadget-to-PC: 116 Mbps MTU=15000, PC-to-gadget: 239 Mbps, Gadget-to-PC: 361 Mbps On boards with slower CPUs the performance improvement will be relatively much larger, e.g. an OMAP-L138 increased from 40 to 220 Mbps using a similar patch on an 2.6.37 kernel. Signed-off-by: Mike Looijmans <mike.looijmans@topic.nl> Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
parent
428163d703
commit
bba787a860
|
@ -48,6 +48,11 @@
|
||||||
|
|
||||||
#define UETH__VERSION "29-May-2008"
|
#define UETH__VERSION "29-May-2008"
|
||||||
|
|
||||||
|
/* Experiments show that both Linux and Windows hosts allow up to 16k
|
||||||
|
* frame sizes. Set the max size to 15k+52 to prevent allocating 32k
|
||||||
|
* blocks and still have efficient handling. */
|
||||||
|
#define GETHER_MAX_ETH_FRAME_LEN 15412
|
||||||
|
|
||||||
struct eth_dev {
|
struct eth_dev {
|
||||||
/* lock is held while accessing port_usb
|
/* lock is held while accessing port_usb
|
||||||
*/
|
*/
|
||||||
|
@ -146,7 +151,7 @@ static int ueth_change_mtu(struct net_device *net, int new_mtu)
|
||||||
spin_lock_irqsave(&dev->lock, flags);
|
spin_lock_irqsave(&dev->lock, flags);
|
||||||
if (dev->port_usb)
|
if (dev->port_usb)
|
||||||
status = -EBUSY;
|
status = -EBUSY;
|
||||||
else if (new_mtu <= ETH_HLEN || new_mtu > ETH_FRAME_LEN)
|
else if (new_mtu <= ETH_HLEN || new_mtu > GETHER_MAX_ETH_FRAME_LEN)
|
||||||
status = -ERANGE;
|
status = -ERANGE;
|
||||||
else
|
else
|
||||||
net->mtu = new_mtu;
|
net->mtu = new_mtu;
|
||||||
|
@ -294,7 +299,7 @@ static void rx_complete(struct usb_ep *ep, struct usb_request *req)
|
||||||
while (skb2) {
|
while (skb2) {
|
||||||
if (status < 0
|
if (status < 0
|
||||||
|| ETH_HLEN > skb2->len
|
|| ETH_HLEN > skb2->len
|
||||||
|| skb2->len > VLAN_ETH_FRAME_LEN) {
|
|| skb2->len > GETHER_MAX_ETH_FRAME_LEN) {
|
||||||
dev->net->stats.rx_errors++;
|
dev->net->stats.rx_errors++;
|
||||||
dev->net->stats.rx_length_errors++;
|
dev->net->stats.rx_length_errors++;
|
||||||
DBG(dev, "rx length %d\n", skb2->len);
|
DBG(dev, "rx length %d\n", skb2->len);
|
||||||
|
|
Loading…
Reference in New Issue