Merge branch 'vhost-net-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mst...
[pandora-kernel.git] / drivers / net / r8169.c
index ef2133b..493b0de 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/dma-mapping.h>
 #include <linux/pm_runtime.h>
 #include <linux/firmware.h>
+#include <linux/pci-aspm.h>
 
 #include <asm/system.h>
 #include <asm/io.h>
@@ -36,6 +37,7 @@
 
 #define FIRMWARE_8168D_1       "rtl_nic/rtl8168d-1.fw"
 #define FIRMWARE_8168D_2       "rtl_nic/rtl8168d-2.fw"
+#define FIRMWARE_8105E_1       "rtl_nic/rtl8105e-1.fw"
 
 #ifdef RTL8169_DEBUG
 #define assert(expr) \
@@ -123,6 +125,8 @@ enum mac_version {
        RTL_GIGA_MAC_VER_26 = 0x1a, // 8168D
        RTL_GIGA_MAC_VER_27 = 0x1b, // 8168DP
        RTL_GIGA_MAC_VER_28 = 0x1c, // 8168DP
+       RTL_GIGA_MAC_VER_29 = 0x1d, // 8105E
+       RTL_GIGA_MAC_VER_30 = 0x1e, // 8105E
 };
 
 #define _R(NAME,MAC,MASK) \
@@ -160,7 +164,9 @@ static const struct {
        _R("RTL8168d/8111d",    RTL_GIGA_MAC_VER_25, 0xff7e1880), // PCI-E
        _R("RTL8168d/8111d",    RTL_GIGA_MAC_VER_26, 0xff7e1880), // PCI-E
        _R("RTL8168dp/8111dp",  RTL_GIGA_MAC_VER_27, 0xff7e1880), // PCI-E
-       _R("RTL8168dp/8111dp",  RTL_GIGA_MAC_VER_28, 0xff7e1880)  // PCI-E
+       _R("RTL8168dp/8111dp",  RTL_GIGA_MAC_VER_28, 0xff7e1880), // PCI-E
+       _R("RTL8105e",          RTL_GIGA_MAC_VER_29, 0xff7e1880), // PCI-E
+       _R("RTL8105e",          RTL_GIGA_MAC_VER_30, 0xff7e1880)  // PCI-E
 };
 #undef _R
 
@@ -267,9 +273,15 @@ enum rtl8168_8101_registers {
 #define        EPHYAR_REG_MASK                 0x1f
 #define        EPHYAR_REG_SHIFT                16
 #define        EPHYAR_DATA_MASK                0xffff
+       DLLPR                   = 0xd0,
+#define        PM_SWITCH                       (1 << 6)
        DBG_REG                 = 0xd1,
 #define        FIX_NAK_1                       (1 << 4)
 #define        FIX_NAK_2                       (1 << 3)
+       TWSI                    = 0xd2,
+       MCU                     = 0xd3,
+#define        EN_NDP                          (1 << 3)
+#define        EN_OOB_RESET                    (1 << 2)
        EFUSEAR                 = 0xdc,
 #define        EFUSEAR_FLAG                    0x80000000
 #define        EFUSEAR_WRITE_CMD               0x80000000
@@ -526,9 +538,6 @@ struct rtl8169_private {
        u16 napi_event;
        u16 intr_mask;
        int phy_1000_ctrl_reg;
-#ifdef CONFIG_R8169_VLAN
-       struct vlan_group *vlgrp;
-#endif
 
        struct mdio_ops {
                void (*write)(void __iomem *, int, int);
@@ -540,7 +549,7 @@ struct rtl8169_private {
                void (*up)(struct rtl8169_private *);
        } pll_power_ops;
 
-       int (*set_speed)(struct net_device *, u8 autoneg, u16 speed, u8 duplex);
+       int (*set_speed)(struct net_device *, u8 aneg, u16 sp, u8 dpx, u32 adv);
        int (*get_settings)(struct net_device *, struct ethtool_cmd *);
        void (*phy_reset_enable)(struct rtl8169_private *tp);
        void (*hw_start)(struct net_device *);
@@ -568,6 +577,7 @@ MODULE_LICENSE("GPL");
 MODULE_VERSION(RTL8169_VERSION);
 MODULE_FIRMWARE(FIRMWARE_8168D_1);
 MODULE_FIRMWARE(FIRMWARE_8168D_2);
+MODULE_FIRMWARE(FIRMWARE_8105E_1);
 
 static int rtl8169_open(struct net_device *dev);
 static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
@@ -1097,7 +1107,7 @@ static int rtl8169_get_regs_len(struct net_device *dev)
 }
 
 static int rtl8169_set_speed_tbi(struct net_device *dev,
-                                u8 autoneg, u16 speed, u8 duplex)
+                                u8 autoneg, u16 speed, u8 duplex, u32 ignored)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
        void __iomem *ioaddr = tp->mmio_addr;
@@ -1120,17 +1130,30 @@ static int rtl8169_set_speed_tbi(struct net_device *dev,
 }
 
 static int rtl8169_set_speed_xmii(struct net_device *dev,
-                                 u8 autoneg, u16 speed, u8 duplex)
+                                 u8 autoneg, u16 speed, u8 duplex, u32 adv)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
        int giga_ctrl, bmcr;
+       int rc = -EINVAL;
+
+       rtl_writephy(tp, 0x1f, 0x0000);
 
        if (autoneg == AUTONEG_ENABLE) {
                int auto_nego;
 
                auto_nego = rtl_readphy(tp, MII_ADVERTISE);
-               auto_nego |= (ADVERTISE_10HALF | ADVERTISE_10FULL |
-                             ADVERTISE_100HALF | ADVERTISE_100FULL);
+               auto_nego &= ~(ADVERTISE_10HALF | ADVERTISE_10FULL |
+                               ADVERTISE_100HALF | ADVERTISE_100FULL);
+
+               if (adv & ADVERTISED_10baseT_Half)
+                       auto_nego |= ADVERTISE_10HALF;
+               if (adv & ADVERTISED_10baseT_Full)
+                       auto_nego |= ADVERTISE_10FULL;
+               if (adv & ADVERTISED_100baseT_Half)
+                       auto_nego |= ADVERTISE_100HALF;
+               if (adv & ADVERTISED_100baseT_Full)
+                       auto_nego |= ADVERTISE_100FULL;
+
                auto_nego |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
 
                giga_ctrl = rtl_readphy(tp, MII_CTRL1000);
@@ -1144,27 +1167,22 @@ static int rtl8169_set_speed_xmii(struct net_device *dev,
                    (tp->mac_version != RTL_GIGA_MAC_VER_13) &&
                    (tp->mac_version != RTL_GIGA_MAC_VER_14) &&
                    (tp->mac_version != RTL_GIGA_MAC_VER_15) &&
-                   (tp->mac_version != RTL_GIGA_MAC_VER_16)) {
-                       giga_ctrl |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
-               } else {
+                   (tp->mac_version != RTL_GIGA_MAC_VER_16) &&
+                   (tp->mac_version != RTL_GIGA_MAC_VER_29) &&
+                   (tp->mac_version != RTL_GIGA_MAC_VER_30)) {
+                       if (adv & ADVERTISED_1000baseT_Half)
+                               giga_ctrl |= ADVERTISE_1000HALF;
+                       if (adv & ADVERTISED_1000baseT_Full)
+                               giga_ctrl |= ADVERTISE_1000FULL;
+               } else if (adv & (ADVERTISED_1000baseT_Half |
+                                 ADVERTISED_1000baseT_Full)) {
                        netif_info(tp, link, dev,
                                   "PHY does not support 1000Mbps\n");
+                       goto out;
                }
 
                bmcr = BMCR_ANENABLE | BMCR_ANRESTART;
 
-               if ((tp->mac_version == RTL_GIGA_MAC_VER_11) ||
-                   (tp->mac_version == RTL_GIGA_MAC_VER_12) ||
-                   (tp->mac_version >= RTL_GIGA_MAC_VER_17)) {
-                       /*
-                        * Wake up the PHY.
-                        * Vendor specific (0x1f) and reserved (0x0e) MII
-                        * registers.
-                        */
-                       rtl_writephy(tp, 0x1f, 0x0000);
-                       rtl_writephy(tp, 0x0e, 0x0000);
-               }
-
                rtl_writephy(tp, MII_ADVERTISE, auto_nego);
                rtl_writephy(tp, MII_CTRL1000, giga_ctrl);
        } else {
@@ -1175,12 +1193,10 @@ static int rtl8169_set_speed_xmii(struct net_device *dev,
                else if (speed == SPEED_100)
                        bmcr = BMCR_SPEED100;
                else
-                       return -EINVAL;
+                       goto out;
 
                if (duplex == DUPLEX_FULL)
                        bmcr |= BMCR_FULLDPLX;
-
-               rtl_writephy(tp, 0x1f, 0x0000);
        }
 
        tp->phy_1000_ctrl_reg = giga_ctrl;
@@ -1198,16 +1214,18 @@ static int rtl8169_set_speed_xmii(struct net_device *dev,
                }
        }
 
-       return 0;
+       rc = 0;
+out:
+       return rc;
 }
 
 static int rtl8169_set_speed(struct net_device *dev,
-                            u8 autoneg, u16 speed, u8 duplex)
+                            u8 autoneg, u16 speed, u8 duplex, u32 advertising)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
        int ret;
 
-       ret = tp->set_speed(dev, autoneg, speed, duplex);
+       ret = tp->set_speed(dev, autoneg, speed, duplex, advertising);
 
        if (netif_running(dev) && (tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL))
                mod_timer(&tp->timer, jiffies + RTL8169_PHY_TIMEOUT);
@@ -1222,7 +1240,8 @@ static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
        int ret;
 
        spin_lock_irqsave(&tp->lock, flags);
-       ret = rtl8169_set_speed(dev, cmd->autoneg, cmd->speed, cmd->duplex);
+       ret = rtl8169_set_speed(dev,
+               cmd->autoneg, cmd->speed, cmd->duplex, cmd->advertising);
        spin_unlock_irqrestore(&tp->lock, flags);
 
        return ret;
@@ -1256,8 +1275,6 @@ static int rtl8169_set_rx_csum(struct net_device *dev, u32 data)
        return 0;
 }
 
-#ifdef CONFIG_R8169_VLAN
-
 static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
                                      struct sk_buff *skb)
 {
@@ -1265,64 +1282,37 @@ static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
                TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00;
 }
 
-static void rtl8169_vlan_rx_register(struct net_device *dev,
-                                    struct vlan_group *grp)
+#define NETIF_F_HW_VLAN_TX_RX  (NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX)
+
+static void rtl8169_vlan_mode(struct net_device *dev)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
        void __iomem *ioaddr = tp->mmio_addr;
        unsigned long flags;
 
        spin_lock_irqsave(&tp->lock, flags);
-       tp->vlgrp = grp;
-       /*
-        * Do not disable RxVlan on 8110SCd.
-        */
-       if (tp->vlgrp || (tp->mac_version == RTL_GIGA_MAC_VER_05))
+       if (dev->features & NETIF_F_HW_VLAN_RX)
                tp->cp_cmd |= RxVlan;
        else
                tp->cp_cmd &= ~RxVlan;
        RTL_W16(CPlusCmd, tp->cp_cmd);
+       /* PCI commit */
        RTL_R16(CPlusCmd);
        spin_unlock_irqrestore(&tp->lock, flags);
+
+       dev->vlan_features = dev->features &~ NETIF_F_HW_VLAN_TX_RX;
 }
 
-static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
-                              struct sk_buff *skb, int polling)
+static void rtl8169_rx_vlan_tag(struct RxDesc *desc, struct sk_buff *skb)
 {
        u32 opts2 = le32_to_cpu(desc->opts2);
-       struct vlan_group *vlgrp = tp->vlgrp;
-       int ret;
 
-       if (vlgrp && (opts2 & RxVlanTag)) {
-               u16 vtag = swab16(opts2 & 0xffff);
+       if (opts2 & RxVlanTag)
+               __vlan_hwaccel_put_tag(skb, swab16(opts2 & 0xffff));
 
-               if (likely(polling))
-                       vlan_gro_receive(&tp->napi, vlgrp, vtag, skb);
-               else
-                       __vlan_hwaccel_rx(skb, vlgrp, vtag, polling);
-               ret = 0;
-       } else
-               ret = -1;
        desc->opts2 = 0;
-       return ret;
 }
 
-#else /* !CONFIG_R8169_VLAN */
-
-static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
-                                     struct sk_buff *skb)
-{
-       return 0;
-}
-
-static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
-                              struct sk_buff *skb, int polling)
-{
-       return -1;
-}
-
-#endif
-
 static int rtl8169_gset_tbi(struct net_device *dev, struct ethtool_cmd *cmd)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
@@ -1493,6 +1483,28 @@ static void rtl8169_get_strings(struct net_device *dev, u32 stringset, u8 *data)
        }
 }
 
+static int rtl8169_set_flags(struct net_device *dev, u32 data)
+{
+       struct rtl8169_private *tp = netdev_priv(dev);
+       unsigned long old_feat = dev->features;
+       int rc;
+
+       if ((tp->mac_version == RTL_GIGA_MAC_VER_05) &&
+           !(data & ETH_FLAG_RXVLAN)) {
+               netif_info(tp, drv, dev, "8110SCd requires hardware Rx VLAN\n");
+               return -EINVAL;
+       }
+
+       rc = ethtool_op_set_flags(dev, data, ETH_FLAG_TXVLAN | ETH_FLAG_RXVLAN);
+       if (rc)
+               return rc;
+
+       if ((old_feat ^ dev->features) & NETIF_F_HW_VLAN_RX)
+               rtl8169_vlan_mode(dev);
+
+       return 0;
+}
+
 static const struct ethtool_ops rtl8169_ethtool_ops = {
        .get_drvinfo            = rtl8169_get_drvinfo,
        .get_regs_len           = rtl8169_get_regs_len,
@@ -1512,6 +1524,8 @@ static const struct ethtool_ops rtl8169_ethtool_ops = {
        .get_strings            = rtl8169_get_strings,
        .get_sset_count         = rtl8169_get_sset_count,
        .get_ethtool_stats      = rtl8169_get_ethtool_stats,
+       .set_flags              = rtl8169_set_flags,
+       .get_flags              = ethtool_op_get_flags,
 };
 
 static void rtl8169_get_mac_version(struct rtl8169_private *tp,
@@ -1560,6 +1574,9 @@ static void rtl8169_get_mac_version(struct rtl8169_private *tp,
                { 0x7c800000, 0x30000000,       RTL_GIGA_MAC_VER_11 },
 
                /* 8101 family. */
+               { 0x7cf00000, 0x40a00000,       RTL_GIGA_MAC_VER_30 },
+               { 0x7cf00000, 0x40900000,       RTL_GIGA_MAC_VER_29 },
+               { 0x7c800000, 0x40800000,       RTL_GIGA_MAC_VER_30 },
                { 0x7cf00000, 0x34a00000,       RTL_GIGA_MAC_VER_09 },
                { 0x7cf00000, 0x24a00000,       RTL_GIGA_MAC_VER_09 },
                { 0x7cf00000, 0x34900000,       RTL_GIGA_MAC_VER_08 },
@@ -2436,6 +2453,33 @@ static void rtl8102e_hw_phy_config(struct rtl8169_private *tp)
        rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
 }
 
+static void rtl8105e_hw_phy_config(struct rtl8169_private *tp)
+{
+       static const struct phy_reg phy_reg_init[] = {
+               { 0x1f, 0x0005 },
+               { 0x1a, 0x0000 },
+               { 0x1f, 0x0000 },
+
+               { 0x1f, 0x0004 },
+               { 0x1c, 0x0000 },
+               { 0x1f, 0x0000 },
+
+               { 0x1f, 0x0001 },
+               { 0x15, 0x7701 },
+               { 0x1f, 0x0000 }
+       };
+
+       /* Disable ALDPS before ram code */
+       rtl_writephy(tp, 0x1f, 0x0000);
+       rtl_writephy(tp, 0x18, 0x0310);
+       msleep(100);
+
+       if (rtl_apply_firmware(tp, FIRMWARE_8105E_1) < 0)
+               netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n");
+
+       rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
+}
+
 static void rtl_hw_phy_config(struct net_device *dev)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
@@ -2503,6 +2547,10 @@ static void rtl_hw_phy_config(struct net_device *dev)
        case RTL_GIGA_MAC_VER_28:
                rtl8168d_4_hw_phy_config(tp);
                break;
+       case RTL_GIGA_MAC_VER_29:
+       case RTL_GIGA_MAC_VER_30:
+               rtl8105e_hw_phy_config(tp);
+               break;
 
        default:
                break;
@@ -2634,11 +2682,12 @@ static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp)
 
        rtl8169_phy_reset(dev, tp);
 
-       /*
-        * rtl8169_set_speed_xmii takes good care of the Fast Ethernet
-        * only 8101. Don't panic.
-        */
-       rtl8169_set_speed(dev, AUTONEG_ENABLE, SPEED_1000, DUPLEX_FULL);
+       rtl8169_set_speed(dev, AUTONEG_ENABLE, SPEED_1000, DUPLEX_FULL,
+               ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |
+               ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |
+               (tp->mii.supports_gmii ?
+                       ADVERTISED_1000baseT_Half |
+                       ADVERTISED_1000baseT_Full : 0));
 
        if (RTL_R8(PHYstatus) & TBI_Enable)
                netif_info(tp, link, dev, "TBI auto-negotiating\n");
@@ -2794,9 +2843,6 @@ static const struct net_device_ops rtl8169_netdev_ops = {
        .ndo_set_mac_address    = rtl_set_mac_address,
        .ndo_do_ioctl           = rtl8169_ioctl,
        .ndo_set_multicast_list = rtl_set_rx_mode,
-#ifdef CONFIG_R8169_VLAN
-       .ndo_vlan_rx_register   = rtl8169_vlan_rx_register,
-#endif
 #ifdef CONFIG_NET_POLL_CONTROLLER
        .ndo_poll_controller    = rtl8169_netpoll,
 #endif
@@ -2951,6 +2997,8 @@ static void __devinit rtl_init_pll_power_ops(struct rtl8169_private *tp)
        case RTL_GIGA_MAC_VER_09:
        case RTL_GIGA_MAC_VER_10:
        case RTL_GIGA_MAC_VER_16:
+       case RTL_GIGA_MAC_VER_29:
+       case RTL_GIGA_MAC_VER_30:
                ops->down       = r810x_pll_power_down;
                ops->up         = r810x_pll_power_up;
                break;
@@ -3020,6 +3068,11 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        mii->reg_num_mask = 0x1f;
        mii->supports_gmii = !!(cfg->features & RTL_FEATURE_GMII);
 
+       /* disable ASPM completely as that cause random device stop working
+        * problems as well as full system hangs for some PCIe devices users */
+       pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 |
+                                    PCIE_LINK_STATE_CLKPM);
+
        /* enable device (incl. PCI PM wakeup and hotplug setup) */
        rc = pci_enable_device(pdev);
        if (rc < 0) {
@@ -3098,6 +3151,13 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        /* Identify chip attached to board */
        rtl8169_get_mac_version(tp, ioaddr);
 
+       /*
+        * Pretend we are using VLANs; This bypasses a nasty bug where
+        * Interrupts stop flowing on high load on 8110SCd controllers.
+        */
+       if (tp->mac_version == RTL_GIGA_MAC_VER_05)
+               tp->cp_cmd |= RxVlan;
+
        rtl_init_mdio_ops(tp);
        rtl_init_pll_power_ops(tp);
 
@@ -3166,10 +3226,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        netif_napi_add(dev, &tp->napi, rtl8169_poll, R8169_NAPI_WEIGHT);
 
-#ifdef CONFIG_R8169_VLAN
-       dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
-#endif
-       dev->features |= NETIF_F_GRO;
+       dev->features |= NETIF_F_HW_VLAN_TX_RX | NETIF_F_GRO;
 
        tp->intr_mask = 0xffff;
        tp->hw_start = cfg->hw_start;
@@ -3287,12 +3344,7 @@ static int rtl8169_open(struct net_device *dev)
 
        rtl8169_init_phy(dev, tp);
 
-       /*
-        * Pretend we are using VLANs; This bypasses a nasty bug where
-        * Interrupts stop flowing on high load on 8110SCd controllers.
-        */
-       if (tp->mac_version == RTL_GIGA_MAC_VER_05)
-               RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | RxVlan);
+       rtl8169_vlan_mode(dev);
 
        rtl_pll_power_up(tp);
 
@@ -3909,6 +3961,37 @@ static void rtl_hw_start_8102e_3(void __iomem *ioaddr, struct pci_dev *pdev)
        rtl_ephy_write(ioaddr, 0x03, 0xc2f9);
 }
 
+static void rtl_hw_start_8105e_1(void __iomem *ioaddr, struct pci_dev *pdev)
+{
+       static const struct ephy_info e_info_8105e_1[] = {
+               { 0x07, 0, 0x4000 },
+               { 0x19, 0, 0x0200 },
+               { 0x19, 0, 0x0020 },
+               { 0x1e, 0, 0x2000 },
+               { 0x03, 0, 0x0001 },
+               { 0x19, 0, 0x0100 },
+               { 0x19, 0, 0x0004 },
+               { 0x0a, 0, 0x0020 }
+       };
+
+       /* Force LAN exit from ASPM if Rx/Tx are not idel */
+       RTL_W32(FuncEvent, RTL_R32(FuncEvent) | 0x002800);
+
+       /* disable Early Tally Counter */
+       RTL_W32(FuncEvent, RTL_R32(FuncEvent) & ~0x010000);
+
+       RTL_W8(MCU, RTL_R8(MCU) | EN_NDP | EN_OOB_RESET);
+       RTL_W8(DLLPR, RTL_R8(DLLPR) | PM_SWITCH);
+
+       rtl_ephy_init(ioaddr, e_info_8105e_1, ARRAY_SIZE(e_info_8105e_1));
+}
+
+static void rtl_hw_start_8105e_2(void __iomem *ioaddr, struct pci_dev *pdev)
+{
+       rtl_hw_start_8105e_1(ioaddr, pdev);
+       rtl_ephy_write(ioaddr, 0x1e, rtl_ephy_read(ioaddr, 0x1e) | 0x8000);
+}
+
 static void rtl_hw_start_8101(struct net_device *dev)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
@@ -3939,6 +4022,13 @@ static void rtl_hw_start_8101(struct net_device *dev)
        case RTL_GIGA_MAC_VER_09:
                rtl_hw_start_8102e_2(ioaddr, pdev);
                break;
+
+       case RTL_GIGA_MAC_VER_29:
+               rtl_hw_start_8105e_1(ioaddr, pdev);
+               break;
+       case RTL_GIGA_MAC_VER_30:
+               rtl_hw_start_8105e_2(ioaddr, pdev);
+               break;
        }
 
        RTL_W8(Cfg9346, Cfg9346_Lock);
@@ -4597,12 +4687,12 @@ static int rtl8169_rx_interrupt(struct net_device *dev,
                        skb_put(skb, pkt_size);
                        skb->protocol = eth_type_trans(skb, dev);
 
-                       if (rtl8169_rx_vlan_skb(tp, desc, skb, polling) < 0) {
-                               if (likely(polling))
-                                       napi_gro_receive(&tp->napi, skb);
-                               else
-                                       netif_rx(skb);
-                       }
+                       rtl8169_rx_vlan_tag(desc, skb);
+
+                       if (likely(polling))
+                               napi_gro_receive(&tp->napi, skb);
+                       else
+                               netif_rx(skb);
 
                        dev->stats.rx_bytes += pkt_size;
                        dev->stats.rx_packets++;