|
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