struct platform_device *pdev;
        void __iomem *rgmii_base;
        void __iomem *mac_base;
-       int (*configure_func)(struct qcom_ethqos *ethqos);
+       int (*configure_func)(struct qcom_ethqos *ethqos, int speed);
 
        unsigned int link_clk_rate;
        struct clk *link_clk;
        struct phy *serdes_phy;
-       int speed;
        int serdes_speed;
        phy_interface_t phy_mode;
 
        return 0;
 }
 
-static int ethqos_rgmii_macro_init(struct qcom_ethqos *ethqos)
+static int ethqos_rgmii_macro_init(struct qcom_ethqos *ethqos, int speed)
 {
        struct device *dev = ðqos->pdev->dev;
        int phase_shift;
        rgmii_updatel(ethqos, RGMII_CONFIG_INTF_SEL,
                      0, RGMII_IO_MACRO_CONFIG);
 
-       switch (ethqos->speed) {
+       switch (speed) {
        case SPEED_1000:
                rgmii_updatel(ethqos, RGMII_CONFIG_DDR_MODE,
                              RGMII_CONFIG_DDR_MODE, RGMII_IO_MACRO_CONFIG);
                              loopback, RGMII_IO_MACRO_CONFIG);
                break;
        default:
-               dev_err(dev, "Invalid speed %d\n", ethqos->speed);
+               dev_err(dev, "Invalid speed %d\n", speed);
                return -EINVAL;
        }
 
        return 0;
 }
 
-static int ethqos_configure_rgmii(struct qcom_ethqos *ethqos)
+static int ethqos_configure_rgmii(struct qcom_ethqos *ethqos, int speed)
 {
        struct device *dev = ðqos->pdev->dev;
        volatile unsigned int dll_lock;
                      SDCC_DLL_CONFIG_PDN, SDCC_HC_REG_DLL_CONFIG);
 
        if (ethqos->has_emac_ge_3) {
-               if (ethqos->speed == SPEED_1000) {
+               if (speed == SPEED_1000) {
                        rgmii_writel(ethqos, 0x1800000, SDCC_TEST_CTL);
                        rgmii_writel(ethqos, 0x2C010800, SDCC_USR_CTL);
                        rgmii_writel(ethqos, 0xA001, SDCC_HC_REG_DLL_CONFIG2);
        rgmii_updatel(ethqos, SDCC_DLL_CONFIG_PDN, 0,
                      SDCC_HC_REG_DLL_CONFIG);
 
-       if (ethqos->speed != SPEED_100 && ethqos->speed != SPEED_10) {
+       if (speed != SPEED_100 && speed != SPEED_10) {
                /* Set DLL_EN */
                rgmii_updatel(ethqos, SDCC_DLL_CONFIG_DLL_EN,
                              SDCC_DLL_CONFIG_DLL_EN, SDCC_HC_REG_DLL_CONFIG);
                        dev_err(dev, "Timeout while waiting for DLL lock\n");
        }
 
-       if (ethqos->speed == SPEED_1000)
+       if (speed == SPEED_1000)
                ethqos_dll_configure(ethqos);
 
-       ethqos_rgmii_macro_init(ethqos);
+       ethqos_rgmii_macro_init(ethqos, speed);
 
        return 0;
 }
 /* On interface toggle MAC registers gets reset.
  * Configure MAC block for SGMII on ethernet phy link up
  */
-static int ethqos_configure_sgmii(struct qcom_ethqos *ethqos)
+static int ethqos_configure_sgmii(struct qcom_ethqos *ethqos, int speed)
 {
        struct net_device *dev = platform_get_drvdata(ethqos->pdev);
        struct stmmac_priv *priv = netdev_priv(dev);
 
        val = readl(ethqos->mac_base + MAC_CTRL_REG);
 
-       switch (ethqos->speed) {
+       switch (speed) {
        case SPEED_2500:
                val &= ~ETHQOS_MAC_CTRL_PORT_SEL;
                rgmii_updatel(ethqos, RGMII_CONFIG2_RGMII_CLK_SEL_CFG,
        priv->plat->phy_interface = PHY_INTERFACE_MODE_2500BASEX;
 }
 
-static int ethqos_configure(struct qcom_ethqos *ethqos)
+static int ethqos_configure(struct qcom_ethqos *ethqos, int speed)
 {
-       return ethqos->configure_func(ethqos);
+       return ethqos->configure_func(ethqos, speed);
 }
 
 static void ethqos_fix_mac_speed(void *priv, int speed, unsigned int mode)
        struct qcom_ethqos *ethqos = priv;
 
        qcom_ethqos_set_sgmii_loopback(ethqos, false);
-       ethqos->speed = speed;
        ethqos_update_link_clk(ethqos, speed);
-       ethqos_configure(ethqos);
+       ethqos_configure(ethqos, speed);
 }
 
 static int qcom_ethqos_serdes_powerup(struct net_device *ndev, void *priv)
                return dev_err_probe(dev, PTR_ERR(ethqos->serdes_phy),
                                     "Failed to get serdes phy\n");
 
-       ethqos->speed = SPEED_1000;
        ethqos->serdes_speed = SPEED_1000;
        ethqos_update_link_clk(ethqos, SPEED_1000);
        ethqos_set_func_clk_en(ethqos);