RTL_W16(IntrStatus, 0xffff);
 }
 
-static void rtl8169_asic_down(void __iomem *ioaddr)
-{
-       RTL_W8(ChipCmd, 0x00);
-       rtl8169_irq_mask_and_ack(ioaddr);
-       RTL_R16(CPlusCmd);
-}
-
 static unsigned int rtl8169_tbi_reset_pending(struct rtl8169_private *tp)
 {
        void __iomem *ioaddr = tp->mmio_addr;
        }
 }
 
+static void rtl8169_init_ring_indexes(struct rtl8169_private *tp)
+{
+       tp->dirty_tx = tp->dirty_rx = tp->cur_tx = tp->cur_rx = 0;
+}
+
 static void rtl_hw_reset(struct rtl8169_private *tp)
 {
        void __iomem *ioaddr = tp->mmio_addr;
        for (i = 0; i < 100; i++) {
                if ((RTL_R8(ChipCmd) & CmdReset) == 0)
                        break;
-               msleep_interruptible(1);
+               udelay(100);
        }
+
+       rtl8169_init_ring_indexes(tp);
 }
 
 static int __devinit
        goto out;
 }
 
+static void rtl_rx_close(struct rtl8169_private *tp)
+{
+       void __iomem *ioaddr = tp->mmio_addr;
+       u32 rxcfg = RTL_R32(RxConfig);
+
+       rxcfg &= ~(AcceptErr | AcceptRunt | AcceptBroadcast | AcceptMulticast |
+                  AcceptMyPhys | AcceptAllPhys);
+       RTL_W32(RxConfig, rxcfg);
+}
+
 static void rtl8169_hw_reset(struct rtl8169_private *tp)
 {
        void __iomem *ioaddr = tp->mmio_addr;
        /* Disable interrupts */
        rtl8169_irq_mask_and_ack(ioaddr);
 
+       rtl_rx_close(tp);
+
        if (tp->mac_version == RTL_GIGA_MAC_VER_27 ||
            tp->mac_version == RTL_GIGA_MAC_VER_28 ||
            tp->mac_version == RTL_GIGA_MAC_VER_31) {
                while (RTL_R8(TxPoll) & NPQ)
                        udelay(20);
-
+       } else {
+               RTL_W8(ChipCmd, RTL_R8(ChipCmd) | StopReq);
+               udelay(100);
        }
 
-       /* Reset the chipset */
-       RTL_W8(ChipCmd, CmdReset);
-
-       /* PCI commit */
-       RTL_R8(ChipCmd);
+       rtl_hw_reset(tp);
 }
 
 static void rtl_set_rx_tx_config_registers(struct rtl8169_private *tp)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
 
-       rtl_hw_reset(tp);
-
        tp->hw_start(dev);
 
        netif_start_queue(dev);
        return -ENOMEM;
 }
 
-static void rtl8169_init_ring_indexes(struct rtl8169_private *tp)
-{
-       tp->dirty_tx = tp->dirty_rx = tp->cur_tx = tp->cur_rx = 0;
-}
-
 static int rtl8169_init_ring(struct net_device *dev)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
 
        rtl8169_tx_clear(tp);
 
-       rtl8169_init_ring_indexes(tp);
+       rtl8169_hw_reset(tp);
        rtl_hw_start(dev);
        netif_wake_queue(dev);
        rtl8169_check_link_status(dev, tp, tp->mmio_addr);
                 * the chip, so just exit the loop.
                 */
                if (unlikely(!netif_running(dev))) {
-                       rtl8169_asic_down(ioaddr);
+                       rtl8169_hw_reset(tp);
                        break;
                }
 
 
        spin_lock_irq(&tp->lock);
 
-       rtl8169_asic_down(ioaddr);
+       rtl8169_hw_reset(tp);
        /*
         * At this point device interrupts can not be enabled in any function,
         * as netif_running is not true (rtl8169_interrupt, rtl8169_reset_task,
 
        spin_lock_irq(&tp->lock);
 
-       rtl8169_asic_down(ioaddr);
+       rtl8169_hw_reset(tp);
 
        spin_unlock_irq(&tp->lock);