]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
net: dsa: microchip: prepare PHY for proper advertisement
authorTristram Ha <Tristram.Ha@microchip.com>
Sat, 23 Feb 2019 00:36:47 +0000 (16:36 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 25 Feb 2019 01:49:59 +0000 (17:49 -0800)
Prepare PHY for proper advertisement as sometimes the PHY in the switch
has its own problems even though it may share the PHY id from regular PHY
but the fixes in the PHY driver do not apply.

Signed-off-by: Tristram Ha <Tristram.Ha@microchip.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/microchip/ksz9477.c
drivers/net/dsa/microchip/ksz_common.c
drivers/net/dsa/microchip/ksz_priv.h

index 674d77e1b029134d7807f22d818448d82d0d21ea..4573b6ed2c4f434b0a33820c3068aed11f28988f 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * Microchip KSZ9477 switch driver main logic
  *
- * Copyright (C) 2017-2018 Microchip Technology Inc.
+ * Copyright (C) 2017-2019 Microchip Technology Inc.
  */
 
 #include <linux/delay.h>
@@ -966,6 +966,16 @@ static void ksz9477_port_mirror_del(struct dsa_switch *ds, int port,
                             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;
@@ -1299,6 +1309,7 @@ static const struct ksz_dev_ops ksz9477_dev_ops = {
        .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,
index 8a5111f9414c07ae3aebc3950a7e64b337f827ac..6f728429eec693f6429ce4b9cd2e4956c5eab22d 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * Microchip switch driver main logic
  *
- * Copyright (C) 2017-2018 Microchip Technology Inc.
+ * Copyright (C) 2017-2019 Microchip Technology Inc.
  */
 
 #include <linux/delay.h>
@@ -238,6 +238,7 @@ int ksz_enable_port(struct dsa_switch *ds, int port, struct phy_device *phy)
 
        /* 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.
index 60b49010904bfa1fefb3dc93d1b8e9c38ffbcd6d..0fdc58bdd503c0e20ac07886c7dd70aab91c03eb 100644 (file)
@@ -2,7 +2,7 @@
  *
  * Microchip KSZ series switch common definitions
  *
- * Copyright (C) 2017-2018 Microchip Technology Inc.
+ * Copyright (C) 2017-2019 Microchip Technology Inc.
  */
 
 #ifndef __KSZ_PRIV_H
@@ -137,6 +137,8 @@ struct ksz_dev_ops {
        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);