r8153_aldps_en(tp, true);
 }
 
+static u32 fc_pause_on_auto(struct r8152 *tp)
+{
+       return (ALIGN(mtu_to_size(tp->netdev->mtu), 1024) + 6 * 1024);
+}
+
+static u32 fc_pause_off_auto(struct r8152 *tp)
+{
+       return (ALIGN(mtu_to_size(tp->netdev->mtu), 1024) + 14 * 1024);
+}
+
+static void r8156_fc_parameter(struct r8152 *tp)
+{
+       u32 pause_on = tp->fc_pause_on ? tp->fc_pause_on : fc_pause_on_auto(tp);
+       u32 pause_off = tp->fc_pause_off ? tp->fc_pause_off : fc_pause_off_auto(tp);
+
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_RX_FIFO_FULL, pause_on / 16);
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_RX_FIFO_EMPTY, pause_off / 16);
+}
+
 static int rtl8156_enable(struct r8152 *tp)
 {
        u32 ocp_data;
        if (test_bit(RTL8152_UNPLUG, &tp->flags))
                return -ENODEV;
 
+       r8156_fc_parameter(tp);
        set_tx_qlen(tp);
        rtl_set_eee_plus(tp);
        r8153_set_rx_early_timeout(tp);
                ocp_write_word(tp, MCU_TYPE_USB, USB_L1_CTRL, ocp_data);
        }
 
+       ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_FW_TASK);
+       ocp_data &= ~FC_PATCH_TASK;
+       ocp_write_word(tp, MCU_TYPE_USB, USB_FW_TASK, ocp_data);
+       usleep_range(1000, 2000);
+       ocp_data |= FC_PATCH_TASK;
+       ocp_write_word(tp, MCU_TYPE_USB, USB_FW_TASK, ocp_data);
+
        return rtl_enable(tp);
 }
 
+static void rtl8156_disable(struct r8152 *tp)
+{
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_RX_FIFO_FULL, 0);
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_RX_FIFO_EMPTY, 0);
+
+       rtl8153_disable(tp);
+}
+
 static int rtl8156b_enable(struct r8152 *tp)
 {
        u32 ocp_data;
        r8153b_u1u2en(tp, true);
 }
 
-static inline u32 fc_pause_on_auto(struct r8152 *tp)
-{
-       return (ALIGN(mtu_to_size(tp->netdev->mtu), 1024) + 6 * 1024);
-}
-
-static inline u32 fc_pause_off_auto(struct r8152 *tp)
-{
-       return (ALIGN(mtu_to_size(tp->netdev->mtu), 1024) + 14 * 1024);
-}
-
-static void r8156_fc_parameter(struct r8152 *tp)
-{
-       u32 pause_on = tp->fc_pause_on ? tp->fc_pause_on : fc_pause_on_auto(tp);
-       u32 pause_off = tp->fc_pause_off ? tp->fc_pause_off : fc_pause_off_auto(tp);
-
-       ocp_write_word(tp, MCU_TYPE_PLA, PLA_RX_FIFO_FULL, pause_on / 16);
-       ocp_write_word(tp, MCU_TYPE_PLA, PLA_RX_FIFO_EMPTY, pause_off / 16);
-}
-
 static void rtl8156_change_mtu(struct r8152 *tp)
 {
        u32 rx_max_size = mtu_to_size(tp->netdev->mtu);
        case RTL_VER_10:
                ops->init               = r8156_init;
                ops->enable             = rtl8156_enable;
-               ops->disable            = rtl8153_disable;
+               ops->disable            = rtl8156_disable;
                ops->up                 = rtl8156_up;
                ops->down               = rtl8156_down;
                ops->unload             = rtl8153_unload;