}
 
        pdata->phy_speed = SPEED_UNKNOWN;
-       phy_dev->supported &= ~SUPPORTED_10baseT_Half &
-                             ~SUPPORTED_100baseT_Half &
-                             ~SUPPORTED_1000baseT_Half;
+       phy_remove_link_mode(phy_dev, ETHTOOL_LINK_MODE_10baseT_Half_BIT);
+       phy_remove_link_mode(phy_dev, ETHTOOL_LINK_MODE_100baseT_Half_BIT);
+       phy_remove_link_mode(phy_dev, ETHTOOL_LINK_MODE_1000baseT_Half_BIT);
        phy_dev->supported |= SUPPORTED_Pause |
                              SUPPORTED_Asym_Pause;
        phy_dev->advertising = phy_dev->supported;
 
                phy_set_max_speed(phydev, SPEED_100);
 
        if (bp->caps & MACB_CAPS_NO_GIGABIT_HALF)
-               phydev->supported &= ~SUPPORTED_1000baseT_Half;
-
-       phydev->advertising = phydev->supported;
+               phy_remove_link_mode(phydev,
+                                    ETHTOOL_LINK_MODE_1000baseT_Half_BIT);
 
        bp->link = 0;
        bp->speed = 0;
 
        /* mask with MAC supported features */
        if (fep->quirks & FEC_QUIRK_HAS_GBIT) {
                phy_set_max_speed(phy_dev, 1000);
-               phy_dev->supported &= ~SUPPORTED_1000baseT_Half;
+               phy_remove_link_mode(phy_dev,
+                                    ETHTOOL_LINK_MODE_1000baseT_Half_BIT);
 #if !defined(CONFIG_M5272)
                phy_dev->supported |= SUPPORTED_Pause;
 #endif
 
                goto return_error;
 
        /* MAC doesn't support 1000T Half */
-       phydev->supported &= ~SUPPORTED_1000baseT_Half;
+       phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_1000baseT_Half_BIT);
 
        /* support both flow controls */
        phy->fc_request_control = (FLOW_CTRL_RX | FLOW_CTRL_TX);
 
        }
 
        /* 10BASE is not supported */
-       phydev->supported &= ~PHY_10BT_FEATURES;
+       phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_10baseT_Half_BIT);
+       phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_10baseT_Full_BIT);
 
        phy_attached_info(phydev);
 
 
         * Half-duplex mode not supported with multiqueue
         * half-duplex can only works with single queue
         */
-       if (tx_cnt > 1)
-               phydev->supported &= ~(SUPPORTED_1000baseT_Half |
-                                      SUPPORTED_100baseT_Half |
-                                      SUPPORTED_10baseT_Half);
+       if (tx_cnt > 1) {
+               phy_remove_link_mode(phydev,
+                                    ETHTOOL_LINK_MODE_10baseT_Half_BIT);
+               phy_remove_link_mode(phydev,
+                                    ETHTOOL_LINK_MODE_100baseT_Half_BIT);
+               phy_remove_link_mode(phydev,
+                                    ETHTOOL_LINK_MODE_1000baseT_Half_BIT);
+       }
 
        /*
         * Broken HW is sometimes missing the pull-up resistor on the
 
 }
 EXPORT_SYMBOL(phy_set_max_speed);
 
+/**
+ * phy_remove_link_mode - Remove a supported link mode
+ * @phydev: phy_device structure to remove link mode from
+ * @link_mode: Link mode to be removed
+ *
+ * Description: Some MACs don't support all link modes which the PHY
+ * does.  e.g. a 1G MAC often does not support 1000Half. Add a helper
+ * to remove a link mode.
+ */
+void phy_remove_link_mode(struct phy_device *phydev, u32 link_mode)
+{
+       WARN_ON(link_mode > 31);
+
+       phydev->supported &= ~BIT(link_mode);
+       phydev->advertising = phydev->supported;
+}
+EXPORT_SYMBOL(phy_remove_link_mode);
+
 static void of_set_phy_supported(struct phy_device *phydev)
 {
        struct device_node *node = phydev->mdio.dev.of_node;
 
        }
 
        /* MAC doesn't support 1000T Half */
-       phydev->supported &= ~SUPPORTED_1000baseT_Half;
+       phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_1000baseT_Half_BIT);
 
        /* support both flow controls */
        dev->fc_request_control = (FLOW_CTRL_RX | FLOW_CTRL_TX);
 
 int phy_start_interrupts(struct phy_device *phydev);
 void phy_print_status(struct phy_device *phydev);
 int phy_set_max_speed(struct phy_device *phydev, u32 max_speed);
+void phy_remove_link_mode(struct phy_device *phydev, u32 link_mode);
 
 int phy_register_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask,
                       int (*run)(struct phy_device *));