}
 
 static int
-qca8k_mii_read32(struct mii_bus *bus, int phy_id, u32 regnum, u32 *val)
+qca8k_mii_write_lo(struct mii_bus *bus, int phy_id, u32 regnum, u32 val)
 {
        int ret;
+       u16 lo;
 
-       ret = bus->read(bus, phy_id, regnum);
-       if (ret >= 0) {
-               *val = ret;
-               ret = bus->read(bus, phy_id, regnum + 1);
-               *val |= ret << 16;
-       }
+       lo = val & 0xffff;
+       ret = bus->write(bus, phy_id, regnum, lo);
+       if (ret < 0)
+               dev_err_ratelimited(&bus->dev,
+                                   "failed to write qca8k 32bit lo register\n");
 
-       if (ret < 0) {
+       return ret;
+}
+
+static int
+qca8k_mii_write_hi(struct mii_bus *bus, int phy_id, u32 regnum, u32 val)
+{
+       int ret;
+       u16 hi;
+
+       hi = (u16)(val >> 16);
+       ret = bus->write(bus, phy_id, regnum, hi);
+       if (ret < 0)
                dev_err_ratelimited(&bus->dev,
-                                   "failed to read qca8k 32bit register\n");
-               *val = 0;
-               return ret;
-       }
+                                   "failed to write qca8k 32bit hi register\n");
+
+       return ret;
+}
+
+static int
+qca8k_mii_read_lo(struct mii_bus *bus, int phy_id, u32 regnum, u32 *val)
+{
+       int ret;
+
+       ret = bus->read(bus, phy_id, regnum);
+       if (ret < 0)
+               goto err;
 
+       *val = ret & 0xffff;
        return 0;
+
+err:
+       dev_err_ratelimited(&bus->dev,
+                           "failed to read qca8k 32bit lo register\n");
+       *val = 0;
+
+       return ret;
 }
 
-static void
-qca8k_mii_write32(struct mii_bus *bus, int phy_id, u32 regnum, u32 val)
+static int
+qca8k_mii_read_hi(struct mii_bus *bus, int phy_id, u32 regnum, u32 *val)
 {
-       u16 lo, hi;
        int ret;
 
-       lo = val & 0xffff;
-       hi = (u16)(val >> 16);
+       ret = bus->read(bus, phy_id, regnum);
+       if (ret < 0)
+               goto err;
 
-       ret = bus->write(bus, phy_id, regnum, lo);
-       if (ret >= 0)
-               ret = bus->write(bus, phy_id, regnum + 1, hi);
+       *val = ret << 16;
+       return 0;
+
+err:
+       dev_err_ratelimited(&bus->dev,
+                           "failed to read qca8k 32bit hi register\n");
+       *val = 0;
+
+       return ret;
+}
+
+static int
+qca8k_mii_read32(struct mii_bus *bus, int phy_id, u32 regnum, u32 *val)
+{
+       u32 hi, lo;
+       int ret;
+
+       *val = 0;
+
+       ret = qca8k_mii_read_lo(bus, phy_id, regnum, &lo);
        if (ret < 0)
-               dev_err_ratelimited(&bus->dev,
-                                   "failed to write qca8k 32bit register\n");
+               goto err;
+
+       ret = qca8k_mii_read_hi(bus, phy_id, regnum + 1, &hi);
+       if (ret < 0)
+               goto err;
+
+       *val = lo | hi;
+
+err:
+       return ret;
+}
+
+static void
+qca8k_mii_write32(struct mii_bus *bus, int phy_id, u32 regnum, u32 val)
+{
+       if (qca8k_mii_write_lo(bus, phy_id, regnum, val) < 0)
+               return;
+
+       qca8k_mii_write_hi(bus, phy_id, regnum + 1, val);
 }
 
 static int