}
 }
 
+/* Whack a reset.  We should wait for this.
+ * For i.MX6SX SOC, enet use AXI bus, we use disable MAC
+ * instead of reset MAC itself.
+ */
+static void fec_ctrl_reset(struct fec_enet_private *fep, bool allow_wol)
+{
+       u32 val;
+
+       if (!allow_wol || !(fep->wol_flag & FEC_WOL_FLAG_SLEEP_ON)) {
+               if (fep->quirks & FEC_QUIRK_HAS_MULTI_QUEUES ||
+                   ((fep->quirks & FEC_QUIRK_NO_HARD_RESET) && fep->link)) {
+                       writel(0, fep->hwp + FEC_ECNTRL);
+               } else {
+                       writel(FEC_ECR_RESET, fep->hwp + FEC_ECNTRL);
+                       udelay(10);
+               }
+       } else {
+               val = readl(fep->hwp + FEC_ECNTRL);
+               val |= (FEC_ECR_MAGICEN | FEC_ECR_SLEEP);
+               writel(val, fep->hwp + FEC_ECNTRL);
+       }
+}
+
 /*
  * This function is called to start or restart the FEC during a link
  * change, transmit timeout, or to reconfigure the FEC.  The network
        if (fep->bufdesc_ex)
                fec_ptp_save_state(fep);
 
-       /* Whack a reset.  We should wait for this.
-        * For i.MX6SX SOC, enet use AXI bus, we use disable MAC
-        * instead of reset MAC itself.
-        */
-       if (fep->quirks & FEC_QUIRK_HAS_MULTI_QUEUES ||
-           ((fep->quirks & FEC_QUIRK_NO_HARD_RESET) && fep->link)) {
-               writel(0, fep->hwp + FEC_ECNTRL);
-       } else {
-               writel(1, fep->hwp + FEC_ECNTRL);
-               udelay(10);
-       }
+       fec_ctrl_reset(fep, false);
 
        /*
         * enet-mac reset will reset mac address registers too,
        if (fep->bufdesc_ex)
                fec_ptp_save_state(fep);
 
-       /* Whack a reset.  We should wait for this.
-        * For i.MX6SX SOC, enet use AXI bus, we use disable MAC
-        * instead of reset MAC itself.
-        */
-       if (!(fep->wol_flag & FEC_WOL_FLAG_SLEEP_ON)) {
-               if (fep->quirks & FEC_QUIRK_HAS_MULTI_QUEUES) {
-                       writel(0, fep->hwp + FEC_ECNTRL);
-               } else {
-                       writel(FEC_ECR_RESET, fep->hwp + FEC_ECNTRL);
-                       udelay(10);
-               }
-       } else {
-               val = readl(fep->hwp + FEC_ECNTRL);
-               val |= (FEC_ECR_MAGICEN | FEC_ECR_SLEEP);
-               writel(val, fep->hwp + FEC_ECNTRL);
-       }
+       fec_ctrl_reset(fep, true);
        writel(fep->phy_speed, fep->hwp + FEC_MII_SPEED);
        writel(FEC_DEFAULT_IMASK, fep->hwp + FEC_IMASK);