void                    *wait_func_data;
 };
 
+static inline u32 unimac_mdio_readl(struct unimac_mdio_priv *priv, u32 offset)
+{
+       /* MIPS chips strapped for BE will automagically configure the
+        * peripheral registers for CPU-native byte order.
+        */
+       if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
+               return __raw_readl(priv->base + offset);
+       else
+               return readl_relaxed(priv->base + offset);
+}
+
+static inline void unimac_mdio_writel(struct unimac_mdio_priv *priv, u32 val,
+                                     u32 offset)
+{
+       if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
+               __raw_writel(val, priv->base + offset);
+       else
+               writel_relaxed(val, priv->base + offset);
+}
+
 static inline void unimac_mdio_start(struct unimac_mdio_priv *priv)
 {
        u32 reg;
 
-       reg = __raw_readl(priv->base + MDIO_CMD);
+       reg = unimac_mdio_readl(priv, MDIO_CMD);
        reg |= MDIO_START_BUSY;
-       __raw_writel(reg, priv->base + MDIO_CMD);
+       unimac_mdio_writel(priv, reg, MDIO_CMD);
 }
 
 static inline unsigned int unimac_mdio_busy(struct unimac_mdio_priv *priv)
 {
-       return __raw_readl(priv->base + MDIO_CMD) & MDIO_START_BUSY;
+       return unimac_mdio_readl(priv, MDIO_CMD) & MDIO_START_BUSY;
 }
 
 static int unimac_mdio_poll(void *wait_func_data)
 
        /* Prepare the read operation */
        cmd = MDIO_RD | (phy_id << MDIO_PMD_SHIFT) | (reg << MDIO_REG_SHIFT);
-       __raw_writel(cmd, priv->base + MDIO_CMD);
+       unimac_mdio_writel(priv, cmd, MDIO_CMD);
 
        /* Start MDIO transaction */
        unimac_mdio_start(priv);
        if (ret)
                return ret;
 
-       cmd = __raw_readl(priv->base + MDIO_CMD);
+       cmd = unimac_mdio_readl(priv, MDIO_CMD);
 
        /* Some broken devices are known not to release the line during
         * turn-around, e.g: Broadcom BCM53125 external switches, so check for
        /* Prepare the write operation */
        cmd = MDIO_WR | (phy_id << MDIO_PMD_SHIFT) |
                (reg << MDIO_REG_SHIFT) | (0xffff & val);
-       __raw_writel(cmd, priv->base + MDIO_CMD);
+       unimac_mdio_writel(priv, cmd, MDIO_CMD);
 
        unimac_mdio_start(priv);