#define DEFAULT_TSO_CSUM_ENABLE                (true)
 #define DEFAULT_VLAN_FILTER_ENABLE     (true)
 #define DEFAULT_VLAN_RX_OFFLOAD                (true)
-#define TX_OVERHEAD                    (8)
 #define TX_ALIGNMENT                   (4)
 #define RXW_PADDING                    2
 
 #define TX_SKB_MIN_LEN                 (TX_CMD_LEN + ETH_HLEN)
 #define LAN78XX_TSO_SIZE(dev)          ((dev)->tx_urb_size - TX_SKB_MIN_LEN)
 
+#define RX_CMD_LEN                     10
+#define RX_SKB_MIN_LEN                 (RX_CMD_LEN + ETH_HLEN)
+#define RX_MAX_FRAME_LEN(mtu)          ((mtu) + ETH_HLEN + VLAN_HLEN)
+
 /* USB related defines */
 #define BULK_IN_PIPE                   1
 #define BULK_OUT_PIPE                  2
        struct mutex            phy_mutex; /* for phy access */
        unsigned int            pipe_in, pipe_out, pipe_intr;
 
-       u32                     hard_mtu;       /* count any extra framing */
-
        unsigned int            bulk_in_delay;
        unsigned int            burst_cap;
 
 static int lan78xx_change_mtu(struct net_device *netdev, int new_mtu)
 {
        struct lan78xx_net *dev = netdev_priv(netdev);
-       int ll_mtu = new_mtu + netdev->hard_header_len;
-       int old_hard_mtu = dev->hard_mtu;
-       int old_rx_urb_size = dev->rx_urb_size;
+       int max_frame_len = RX_MAX_FRAME_LEN(new_mtu);
        int ret;
 
        /* no second zero-length packet read wanted after mtu-sized packets */
-       if ((ll_mtu % dev->maxpacket) == 0)
+       if ((max_frame_len % dev->maxpacket) == 0)
                return -EDOM;
 
        ret = usb_autopm_get_interface(dev->intf);
        if (ret < 0)
                return ret;
 
-       lan78xx_set_rx_max_frame_length(dev, new_mtu + VLAN_ETH_HLEN);
-
-       netdev->mtu = new_mtu;
-
-       dev->hard_mtu = netdev->mtu + netdev->hard_header_len;
-       if (dev->rx_urb_size == old_hard_mtu) {
-               dev->rx_urb_size = dev->hard_mtu;
-               if (dev->rx_urb_size > old_rx_urb_size) {
-                       if (netif_running(dev->net)) {
-                               unlink_urbs(dev, &dev->rxq);
-                               tasklet_schedule(&dev->bh);
-                       }
-               }
-       }
+       ret = lan78xx_set_rx_max_frame_length(dev, max_frame_len);
+       if (!ret)
+               netdev->mtu = new_mtu;
 
        usb_autopm_put_interface(dev->intf);
 
-       return 0;
+       return ret;
 }
 
 static int lan78xx_set_mac_addr(struct net_device *netdev, void *p)
                return ret;
 
        ret = lan78xx_set_rx_max_frame_length(dev,
-                                             dev->net->mtu + VLAN_ETH_HLEN);
+                                             RX_MAX_FRAME_LEN(dev->net->mtu));
 
        return ret;
 }
                goto out1;
        }
 
-       dev->net->hard_header_len += TX_OVERHEAD;
-       dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len;
-
        /* Init all registers */
        ret = lan78xx_reset(dev);
        if (ret) {
 
 static int lan78xx_rx(struct lan78xx_net *dev, struct sk_buff *skb)
 {
-       if (skb->len < dev->net->hard_header_len)
+       if (skb->len < RX_SKB_MIN_LEN)
                return 0;
 
        while (skb->len > 0) {
 
        switch (urb_status) {
        case 0:
-               if (skb->len < dev->net->hard_header_len) {
+               if (skb->len < RX_SKB_MIN_LEN) {
                        state = rx_cleanup;
                        dev->net->stats.rx_errors++;
                        dev->net->stats.rx_length_errors++;
        if (ret < 0)
                goto out3;
 
+       /* MTU range: 68 - 9000 */
+       netdev->max_mtu = MAX_SINGLE_PACKET_SIZE;
+
        netif_set_gso_max_size(netdev, LAN78XX_TSO_SIZE(dev));
 
        tasklet_setup(&dev->bh, lan78xx_bh);
        if (ret < 0)
                goto out4;
 
-       if (netdev->mtu > (dev->hard_mtu - netdev->hard_header_len))
-               netdev->mtu = dev->hard_mtu - netdev->hard_header_len;
-
-       /* MTU range: 68 - 9000 */
-       netdev->max_mtu = MAX_SINGLE_PACKET_SIZE;
-       netif_set_gso_max_size(netdev, MAX_SINGLE_PACKET_SIZE - MAX_HEADER);
-
        period = ep_intr->desc.bInterval;
        maxp = usb_maxpacket(dev->udev, dev->pipe_intr, 0);
        buf = kmalloc(maxp, GFP_KERNEL);