struct atl1_hw *hw = &adapter->hw;
        struct net_device *netdev = adapter->netdev;
 
-       hw->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN;
+       hw->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;
        hw->min_frame_size = ETH_ZLEN + ETH_FCS_LEN;
 
        adapter->wol = 0;
 {
        struct atl1_adapter *adapter = netdev_priv(netdev);
        int old_mtu = netdev->mtu;
-       int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN;
+       int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;
 
        if ((max_frame < ETH_ZLEN + ETH_FCS_LEN) ||
            (max_frame > MAX_JUMBO_FRAME_SIZE)) {
        /* set Interrupt Clear Timer */
        iowrite16(adapter->ict, hw->hw_addr + REG_CMBDISDMA_TIMER);
 
-       /* set MTU, 4 : VLAN */
-       iowrite32(hw->max_frame_size + 4, hw->hw_addr + REG_MTU);
+       /* set max frame size hw will accept */
+       iowrite32(hw->max_frame_size, hw->hw_addr + REG_MTU);
 
        /* jumbo size & rrd retirement timer */
        value = (((u32) hw->rx_jumbo_th & RXQ_JMBOSZ_TH_MASK)