/*
  * Microchip KSZ9477 switch driver main logic
  *
- * Copyright (C) 2017-2018 Microchip Technology Inc.
+ * Copyright (C) 2017-2019 Microchip Technology Inc.
  */
 
 #include <linux/delay.h>
                             PORT_MIRROR_SNIFFER, false);
 }
 
+static void ksz9477_phy_setup(struct ksz_device *dev, int port,
+                             struct phy_device *phy)
+{
+       if (port < dev->phy_port_cnt) {
+               /* The MAC actually cannot run in 1000 half-duplex mode. */
+               phy_remove_link_mode(phy,
+                                    ETHTOOL_LINK_MODE_1000baseT_Half_BIT);
+       }
+}
+
 static void ksz9477_port_setup(struct ksz_device *dev, int port, bool cpu_port)
 {
        u8 data8;
        .get_port_addr = ksz9477_get_port_addr,
        .cfg_port_member = ksz9477_cfg_port_member,
        .flush_dyn_mac_table = ksz9477_flush_dyn_mac_table,
+       .phy_setup = ksz9477_phy_setup,
        .port_setup = ksz9477_port_setup,
        .shutdown = ksz9477_reset_switch,
        .detect = ksz9477_switch_detect,
 
 /*
  * Microchip switch driver main logic
  *
- * Copyright (C) 2017-2018 Microchip Technology Inc.
+ * Copyright (C) 2017-2019 Microchip Technology Inc.
  */
 
 #include <linux/delay.h>
 
        /* setup slave port */
        dev->dev_ops->port_setup(dev, port, false);
+       dev->dev_ops->phy_setup(dev, port, phy);
 
        /* port_stp_state_set() will be called after to enable the port so
         * there is no need to do anything.
 
  *
  * Microchip KSZ series switch common definitions
  *
- * Copyright (C) 2017-2018 Microchip Technology Inc.
+ * Copyright (C) 2017-2019 Microchip Technology Inc.
  */
 
 #ifndef __KSZ_PRIV_H
        u32 (*get_port_addr)(int port, int offset);
        void (*cfg_port_member)(struct ksz_device *dev, int port, u8 member);
        void (*flush_dyn_mac_table)(struct ksz_device *dev, int port);
+       void (*phy_setup)(struct ksz_device *dev, int port,
+                         struct phy_device *phy);
        void (*port_setup)(struct ksz_device *dev, int port, bool cpu_port);
        void (*r_phy)(struct ksz_device *dev, u16 phy, u16 reg, u16 *val);
        void (*w_phy)(struct ksz_device *dev, u16 phy, u16 reg, u16 val);