#include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/device.h>
+#include <linux/iopoll.h>
 #include <linux/of.h>
 #include <linux/of_mdio.h>
 #include <linux/bitops.h>
 #define IS_7398(a) ((a)->chipid == VSC73XX_CHIPID_ID_7398)
 #define IS_739X(a) (IS_7395(a) || IS_7398(a))
 
+#define VSC73XX_POLL_SLEEP_US          1000
+#define VSC73XX_POLL_TIMEOUT_US                10000
+
 struct vsc73xx_counter {
        u8 counter;
        const char *name;
         * after a PHY or the CPU port comes up or down.
         */
        if (!phydev->link) {
-               int maxloop = 10;
+               int ret, err;
 
                dev_dbg(vsc->dev, "port %d: went down\n",
                        port);
                                    VSC73XX_ARBDISC, BIT(port), BIT(port));
 
                /* Wait until queue is empty */
-               vsc73xx_read(vsc, VSC73XX_BLOCK_ARBITER, 0,
-                            VSC73XX_ARBEMPTY, &val);
-               while (!(val & BIT(port))) {
-                       msleep(1);
-                       vsc73xx_read(vsc, VSC73XX_BLOCK_ARBITER, 0,
-                                    VSC73XX_ARBEMPTY, &val);
-                       if (--maxloop == 0) {
-                               dev_err(vsc->dev,
-                                       "timeout waiting for block arbiter\n");
-                               /* Continue anyway */
-                               break;
-                       }
-               }
+               ret = read_poll_timeout(vsc73xx_read, err,
+                                       err < 0 || (val & BIT(port)),
+                                       VSC73XX_POLL_SLEEP_US,
+                                       VSC73XX_POLL_TIMEOUT_US, false,
+                                       vsc, VSC73XX_BLOCK_ARBITER, 0,
+                                       VSC73XX_ARBEMPTY, &val);
+               if (ret)
+                       dev_err(vsc->dev,
+                               "timeout waiting for block arbiter\n");
+               else if (err < 0)
+                       dev_err(vsc->dev, "error reading arbiter\n");
 
                /* Put this port into reset */
                vsc73xx_write(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_MAC_CFG,