#include <linux/of_net.h>
 #include <linux/phy.h>
 #include <linux/interrupt.h>
+#include <linux/iopoll.h>
 
 #define DRIVER_NAME "xilinx_emaclite"
 
 
 static int xemaclite_mdio_wait(struct net_local *lp)
 {
-       unsigned long end = jiffies + 2;
+       u32 val;
 
        /* wait for the MDIO interface to not be busy or timeout
         * after some time.
         */
-       while (xemaclite_readl(lp->base_addr + XEL_MDIOCTRL_OFFSET) &
-                       XEL_MDIOCTRL_MDIOSTS_MASK) {
-               if (time_before_eq(end, jiffies)) {
-                       WARN_ON(1);
-                       return -ETIMEDOUT;
-               }
-               msleep(1);
-       }
-       return 0;
+       return readx_poll_timeout(xemaclite_readl,
+                                 lp->base_addr + XEL_MDIOCTRL_OFFSET,
+                                 val, !(val & XEL_MDIOCTRL_MDIOSTS_MASK),
+                                 1000, 20000);
 }
 
 /**