return budget - quota;
 }
 
+static void ravb_set_duplex_gbeth(struct net_device *ndev)
+{
+       struct ravb_private *priv = netdev_priv(ndev);
+
+       ravb_modify(ndev, ECMR, ECMR_DM, priv->duplex > 0 ? ECMR_DM : 0);
+}
+
 /* PHY state control function */
 static void ravb_adjust_link(struct net_device *ndev)
 {
                ravb_rcv_snd_disable(ndev);
 
        if (phydev->link) {
+               if (info->half_duplex && phydev->duplex != priv->duplex) {
+                       new_state = true;
+                       priv->duplex = phydev->duplex;
+                       ravb_set_duplex_gbeth(ndev);
+               }
+
                if (phydev->speed != priv->speed) {
                        new_state = true;
                        priv->speed = phydev->speed;
                new_state = true;
                priv->link = 0;
                priv->speed = 0;
+               if (info->half_duplex)
+                       priv->duplex = -1;
        }
 
        /* Enable TX and RX right over here, if E-MAC change is ignored */
 {
        struct device_node *np = ndev->dev.parent->of_node;
        struct ravb_private *priv = netdev_priv(ndev);
+       const struct ravb_hw_info *info = priv->info;
        struct phy_device *phydev;
        struct device_node *pn;
        phy_interface_t iface;
 
        priv->link = 0;
        priv->speed = 0;
+       priv->duplex = -1;
 
        /* Try connecting to PHY */
        pn = of_parse_phandle(np, "phy-handle", 0);
                netdev_info(ndev, "limited PHY to 100Mbit/s\n");
        }
 
-       /* 10BASE, Pause and Asym Pause is not supported */
-       phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_10baseT_Half_BIT);
-       phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_10baseT_Full_BIT);
-       phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_Pause_BIT);
-       phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_Asym_Pause_BIT);
+       if (!info->half_duplex) {
+               /* 10BASE, Pause and Asym Pause is not supported */
+               phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_10baseT_Half_BIT);
+               phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_10baseT_Full_BIT);
+               phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_Pause_BIT);
+               phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_Asym_Pause_BIT);
 
-       /* Half Duplex is not supported */
-       phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_1000baseT_Half_BIT);
-       phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_100baseT_Half_BIT);
+               /* Half Duplex is not supported */
+               phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_1000baseT_Half_BIT);
+               phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_100baseT_Half_BIT);
+       }
 
        phy_attached_info(phydev);
 
        .tsrq = TCCR_TSRQ0,
        .aligned_tx = 1,
        .tx_counters = 1,
+       .half_duplex = 1,
 };
 
 static const struct of_device_id ravb_match_table[] = {