|
67 | 67 | #define DEFAULT_TSO_CSUM_ENABLE (true) |
68 | 68 | #define DEFAULT_VLAN_FILTER_ENABLE (true) |
69 | 69 | #define DEFAULT_VLAN_RX_OFFLOAD (true) |
70 | | -#define TX_OVERHEAD (8) |
71 | 70 | #define TX_ALIGNMENT (4) |
72 | 71 | #define RXW_PADDING 2 |
73 | 72 |
|
|
120 | 119 | #define TX_SKB_MIN_LEN (TX_CMD_LEN + ETH_HLEN) |
121 | 120 | #define LAN78XX_TSO_SIZE(dev) ((dev)->tx_urb_size - TX_SKB_MIN_LEN) |
122 | 121 |
|
| 122 | +#define RX_CMD_LEN 10 |
| 123 | +#define RX_SKB_MIN_LEN (RX_CMD_LEN + ETH_HLEN) |
| 124 | +#define RX_MAX_FRAME_LEN(mtu) ((mtu) + ETH_HLEN + VLAN_HLEN) |
| 125 | + |
123 | 126 | /* USB related defines */ |
124 | 127 | #define BULK_IN_PIPE 1 |
125 | 128 | #define BULK_OUT_PIPE 2 |
@@ -440,8 +443,6 @@ struct lan78xx_net { |
440 | 443 | struct mutex phy_mutex; /* for phy access */ |
441 | 444 | unsigned int pipe_in, pipe_out, pipe_intr; |
442 | 445 |
|
443 | | - u32 hard_mtu; /* count any extra framing */ |
444 | | - |
445 | 446 | unsigned int bulk_in_delay; |
446 | 447 | unsigned int burst_cap; |
447 | 448 |
|
@@ -2536,37 +2537,24 @@ static int unlink_urbs(struct lan78xx_net *dev, struct sk_buff_head *q) |
2536 | 2537 | static int lan78xx_change_mtu(struct net_device *netdev, int new_mtu) |
2537 | 2538 | { |
2538 | 2539 | struct lan78xx_net *dev = netdev_priv(netdev); |
2539 | | - int ll_mtu = new_mtu + netdev->hard_header_len; |
2540 | | - int old_hard_mtu = dev->hard_mtu; |
2541 | | - int old_rx_urb_size = dev->rx_urb_size; |
| 2540 | + int max_frame_len = RX_MAX_FRAME_LEN(new_mtu); |
2542 | 2541 | int ret; |
2543 | 2542 |
|
2544 | 2543 | /* no second zero-length packet read wanted after mtu-sized packets */ |
2545 | | - if ((ll_mtu % dev->maxpacket) == 0) |
| 2544 | + if ((max_frame_len % dev->maxpacket) == 0) |
2546 | 2545 | return -EDOM; |
2547 | 2546 |
|
2548 | 2547 | ret = usb_autopm_get_interface(dev->intf); |
2549 | 2548 | if (ret < 0) |
2550 | 2549 | return ret; |
2551 | 2550 |
|
2552 | | - lan78xx_set_rx_max_frame_length(dev, new_mtu + VLAN_ETH_HLEN); |
2553 | | - |
2554 | | - netdev->mtu = new_mtu; |
2555 | | - |
2556 | | - dev->hard_mtu = netdev->mtu + netdev->hard_header_len; |
2557 | | - if (dev->rx_urb_size == old_hard_mtu) { |
2558 | | - dev->rx_urb_size = dev->hard_mtu; |
2559 | | - if (dev->rx_urb_size > old_rx_urb_size) { |
2560 | | - if (netif_running(dev->net)) { |
2561 | | - unlink_urbs(dev, &dev->rxq); |
2562 | | - tasklet_schedule(&dev->bh); |
2563 | | - } |
2564 | | - } |
2565 | | - } |
| 2551 | + ret = lan78xx_set_rx_max_frame_length(dev, max_frame_len); |
| 2552 | + if (!ret) |
| 2553 | + netdev->mtu = new_mtu; |
2566 | 2554 |
|
2567 | 2555 | usb_autopm_put_interface(dev->intf); |
2568 | 2556 |
|
2569 | | - return 0; |
| 2557 | + return ret; |
2570 | 2558 | } |
2571 | 2559 |
|
2572 | 2560 | static int lan78xx_set_mac_addr(struct net_device *netdev, void *p) |
@@ -3084,7 +3072,7 @@ static int lan78xx_reset(struct lan78xx_net *dev) |
3084 | 3072 | return ret; |
3085 | 3073 |
|
3086 | 3074 | ret = lan78xx_set_rx_max_frame_length(dev, |
3087 | | - dev->net->mtu + VLAN_ETH_HLEN); |
| 3075 | + RX_MAX_FRAME_LEN(dev->net->mtu)); |
3088 | 3076 |
|
3089 | 3077 | return ret; |
3090 | 3078 | } |
@@ -3489,9 +3477,6 @@ static int lan78xx_bind(struct lan78xx_net *dev, struct usb_interface *intf) |
3489 | 3477 | goto out1; |
3490 | 3478 | } |
3491 | 3479 |
|
3492 | | - dev->net->hard_header_len += TX_OVERHEAD; |
3493 | | - dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len; |
3494 | | - |
3495 | 3480 | /* Init all registers */ |
3496 | 3481 | ret = lan78xx_reset(dev); |
3497 | 3482 | if (ret) { |
@@ -3592,7 +3577,7 @@ static void lan78xx_skb_return(struct lan78xx_net *dev, struct sk_buff *skb) |
3592 | 3577 |
|
3593 | 3578 | static int lan78xx_rx(struct lan78xx_net *dev, struct sk_buff *skb) |
3594 | 3579 | { |
3595 | | - if (skb->len < dev->net->hard_header_len) |
| 3580 | + if (skb->len < RX_SKB_MIN_LEN) |
3596 | 3581 | return 0; |
3597 | 3582 |
|
3598 | 3583 | while (skb->len > 0) { |
@@ -3699,7 +3684,7 @@ static void rx_complete(struct urb *urb) |
3699 | 3684 |
|
3700 | 3685 | switch (urb_status) { |
3701 | 3686 | case 0: |
3702 | | - if (skb->len < dev->net->hard_header_len) { |
| 3687 | + if (skb->len < RX_SKB_MIN_LEN) { |
3703 | 3688 | state = rx_cleanup; |
3704 | 3689 | dev->net->stats.rx_errors++; |
3705 | 3690 | dev->net->stats.rx_length_errors++; |
@@ -4343,6 +4328,9 @@ static int lan78xx_probe(struct usb_interface *intf, |
4343 | 4328 | if (ret < 0) |
4344 | 4329 | goto out3; |
4345 | 4330 |
|
| 4331 | + /* MTU range: 68 - 9000 */ |
| 4332 | + netdev->max_mtu = MAX_SINGLE_PACKET_SIZE; |
| 4333 | + |
4346 | 4334 | netif_set_gso_max_size(netdev, LAN78XX_TSO_SIZE(dev)); |
4347 | 4335 |
|
4348 | 4336 | tasklet_setup(&dev->bh, lan78xx_bh); |
@@ -4390,13 +4378,6 @@ static int lan78xx_probe(struct usb_interface *intf, |
4390 | 4378 | if (ret < 0) |
4391 | 4379 | goto out4; |
4392 | 4380 |
|
4393 | | - if (netdev->mtu > (dev->hard_mtu - netdev->hard_header_len)) |
4394 | | - netdev->mtu = dev->hard_mtu - netdev->hard_header_len; |
4395 | | - |
4396 | | - /* MTU range: 68 - 9000 */ |
4397 | | - netdev->max_mtu = MAX_SINGLE_PACKET_SIZE; |
4398 | | - netif_set_gso_max_size(netdev, MAX_SINGLE_PACKET_SIZE - MAX_HEADER); |
4399 | | - |
4400 | 4381 | period = ep_intr->desc.bInterval; |
4401 | 4382 | maxp = usb_maxpacket(dev->udev, dev->pipe_intr, 0); |
4402 | 4383 | buf = kmalloc(maxp, GFP_KERNEL); |
|
0 commit comments