XGMAC_IOWRITE_BITS(pdata, MAC_RCR, JE, val);
 }
 
+static void xgbe_config_mac_speed(struct xgbe_prv_data *pdata)
+{
+       switch (pdata->phy_speed) {
+       case SPEED_10000:
+               xgbe_set_xgmii_speed(pdata);
+               break;
+
+       case SPEED_2500:
+               xgbe_set_gmii_2500_speed(pdata);
+               break;
+
+       case SPEED_1000:
+               xgbe_set_gmii_speed(pdata);
+               break;
+       }
+}
+
 static void xgbe_config_checksum_offload(struct xgbe_prv_data *pdata)
 {
        if (pdata->netdev->features & NETIF_F_RXCSUM)
        xgbe_config_mac_address(pdata);
        xgbe_config_jumbo_enable(pdata);
        xgbe_config_flow_control(pdata);
+       xgbe_config_mac_speed(pdata);
        xgbe_config_checksum_offload(pdata);
        xgbe_config_vlan_support(pdata);
        xgbe_config_mmc(pdata);
 
        DBGPR("<--xgbe_stop\n");
 }
 
-static void xgbe_restart_dev(struct xgbe_prv_data *pdata, unsigned int reset)
+static void xgbe_restart_dev(struct xgbe_prv_data *pdata)
 {
        struct xgbe_channel *channel;
        struct xgbe_hw_if *hw_if = &pdata->hw_if;
        xgbe_free_tx_data(pdata);
        xgbe_free_rx_data(pdata);
 
-       /* Issue software reset to device if requested */
-       if (reset)
-               hw_if->exit(pdata);
+       /* Issue software reset to device */
+       hw_if->exit(pdata);
 
        xgbe_start(pdata);
 
 
        rtnl_lock();
 
-       xgbe_restart_dev(pdata, 1);
+       xgbe_restart_dev(pdata);
 
        rtnl_unlock();
 }
        pdata->rx_buf_size = ret;
        netdev->mtu = mtu;
 
-       xgbe_restart_dev(pdata, 0);
+       xgbe_restart_dev(pdata);
 
        DBGPR("<--xgbe_change_mtu\n");
 
 
        pdata->pause_autoneg = 1;
        pdata->tx_pause = 1;
        pdata->rx_pause = 1;
+       pdata->phy_speed = SPEED_UNKNOWN;
        pdata->power_down = 0;
        pdata->default_autoneg = AUTONEG_ENABLE;
        pdata->default_speed = SPEED_10000;