diff options
author | David S. Miller <davem@davemloft.net> | 2020-09-09 11:26:32 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2020-09-09 11:26:32 -0700 |
commit | 8794ebfe9a5c567fcfcaeac1d99c753c696d9cdf (patch) | |
tree | 3e5d7a73d395ee8cea1722e2489af0e3c8102439 | |
parent | d85427e3c8dd36ab5a1202cc2c003b307c49bc07 (diff) | |
parent | 5b797980908ac83a55a3d1ec578382ff60a33551 (diff) |
Merge branch 'ksz9477-dsa-switch-driver-improvements'
Paul Barker says:
====================
ksz9477 dsa switch driver improvements
These changes were made while debugging the ksz9477 driver for use on a
custom board which uses the ksz9893 switch supported by this driver. The
patches have been runtime tested on top of Linux 5.8.4, I couldn't
runtime test them on top of 5.9-rc3 due to unrelated issues. They have
been build tested on top of net-next.
These changes can also be pulled from:
https://gitlab.com/pbarker.dev/staging/linux.git
tag: for-net-next/ksz-v3_2020-09-09
Changes from v2:
* Fixed incorrect type in assignment error.
Reported-by: kernel test robot <lkp@intel.com>
Changes from v1:
* Rebased onto net-next.
* Dropped unnecessary `#include <linux/printk.h>`.
* Instead of printing the phy mode in `ksz9477_port_setup()`, modify
the existing print in `ksz9477_config_cpu_port()` to always produce
output and to be more clear.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/dsa/microchip/ksz9477.c | 26 | ||||
-rw-r--r-- | drivers/net/dsa/microchip/ksz_common.c | 3 |
2 files changed, 23 insertions, 6 deletions
diff --git a/drivers/net/dsa/microchip/ksz9477.c b/drivers/net/dsa/microchip/ksz9477.c index 3cb22d149813..b62dd64470a8 100644 --- a/drivers/net/dsa/microchip/ksz9477.c +++ b/drivers/net/dsa/microchip/ksz9477.c @@ -1235,6 +1235,9 @@ static void ksz9477_port_setup(struct ksz_device *dev, int port, bool cpu_port) if (dev->interface == PHY_INTERFACE_MODE_RGMII_ID || dev->interface == PHY_INTERFACE_MODE_RGMII_TXID) data8 |= PORT_RGMII_ID_EG_ENABLE; + /* On KSZ9893, disable RGMII in-band status support */ + if (dev->features & IS_9893) + data8 &= ~PORT_MII_MAC_MODE; p->phydev.speed = SPEED_1000; break; } @@ -1265,6 +1268,8 @@ static void ksz9477_config_cpu_port(struct dsa_switch *ds) for (i = 0; i < dev->port_cnt; i++) { if (dsa_is_cpu_port(ds, i) && (dev->cpu_ports & (1 << i))) { phy_interface_t interface; + const char *prev_msg; + const char *prev_mode; dev->cpu_port = i; dev->host_mask = (1 << dev->cpu_port); @@ -1277,11 +1282,19 @@ static void ksz9477_config_cpu_port(struct dsa_switch *ds) interface = ksz9477_get_interface(dev, i); if (!dev->interface) dev->interface = interface; - if (interface && interface != dev->interface) - dev_info(dev->dev, - "use %s instead of %s\n", - phy_modes(dev->interface), - phy_modes(interface)); + if (interface && interface != dev->interface) { + prev_msg = " instead of "; + prev_mode = phy_modes(interface); + } else { + prev_msg = ""; + prev_mode = ""; + } + dev_info(dev->dev, + "Port%d: using phy mode %s%s%s\n", + i, + phy_modes(dev->interface), + prev_msg, + prev_mode); /* enable cpu port */ ksz9477_port_setup(dev, i, true); @@ -1426,10 +1439,12 @@ static int ksz9477_switch_detect(struct ksz_device *dev) /* Default capability is gigabit capable. */ dev->features = GBIT_SUPPORT; + dev_dbg(dev->dev, "Switch detect: ID=%08x%02x\n", id32, data8); id_hi = (u8)(id32 >> 16); id_lo = (u8)(id32 >> 8); if ((id_lo & 0xf) == 3) { /* Chip is from KSZ9893 design. */ + dev_info(dev->dev, "Found KSZ9893\n"); dev->features |= IS_9893; /* Chip does not support gigabit. */ @@ -1438,6 +1453,7 @@ static int ksz9477_switch_detect(struct ksz_device *dev) dev->mib_port_cnt = 3; dev->phy_port_cnt = 2; } else { + dev_info(dev->dev, "Found KSZ9477 or compatible\n"); /* Chip uses new XMII register definitions. */ dev->features |= NEW_XMII; diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/microchip/ksz_common.c index 8d53b12d40a8..a31738662d95 100644 --- a/drivers/net/dsa/microchip/ksz_common.c +++ b/drivers/net/dsa/microchip/ksz_common.c @@ -400,8 +400,9 @@ int ksz_switch_register(struct ksz_device *dev, if (dev->reset_gpio) { gpiod_set_value_cansleep(dev->reset_gpio, 1); - mdelay(10); + usleep_range(10000, 12000); gpiod_set_value_cansleep(dev->reset_gpio, 0); + usleep_range(100, 1000); } mutex_init(&dev->dev_mutex); |