mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

The KSZ9477 switch driver uses the XPCS driver to operate its SGMII port. However there are some hardware bugs in the KSZ9477 SGMII module so workarounds are needed. There was a proposal to update the XPCS driver to accommodate KSZ9477, but the new code is not generic enough to be used by other vendors. It is better to do all these workarounds inside the KSZ9477 driver instead of modifying the XPCS driver. There are 3 hardware issues. The first is the MII_ADVERTISE register needs to be write once after reset for the correct code word to be sent. The XPCS driver disables auto-negotiation first before configuring the SGMII/1000BASE-X mode and then enables it back. The KSZ9477 driver then writes the MII_ADVERTISE register before enabling auto-negotiation. In 1000BASE-X mode the MII_ADVERTISE register will be set, so KSZ9477 driver does not need to write it. The second issue is the MII_BMCR register needs to set the exact speed and duplex mode when running in SGMII mode. During link polling the KSZ9477 will check the speed and duplex mode are different from previous ones and update the MII_BMCR register accordingly. The last issue is 1000BASE-X mode does not work with auto-negotiation on. The cause is the local port hardware does not know the link is up and so network traffic is not forwarded. The workaround is to write 2 additional bits when 1000BASE-X mode is configured. Note the SGMII interrupt in the port cannot be masked. As that interrupt is not handled in the KSZ9477 driver the SGMII interrupt bit will not be set even when the XPCS driver sets it. Signed-off-by: Tristram Ha <tristram.ha@microchip.com> Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com> Tested-by: Maxime Chevallier <maxime.chevallier@bootlin.com> Link: https://patch.msgid.link/20250520230720.23425-1-Tristram.Ha@microchip.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
47 lines
1.7 KiB
Text
47 lines
1.7 KiB
Text
# SPDX-License-Identifier: GPL-2.0-only
|
|
menuconfig NET_DSA_MICROCHIP_KSZ_COMMON
|
|
tristate "Microchip KSZ8XXX/KSZ9XXX/LAN937X series switch support"
|
|
depends on NET_DSA
|
|
select NET_DSA_TAG_KSZ
|
|
select NET_DSA_TAG_NONE
|
|
select NET_IEEE8021Q_HELPERS
|
|
select DCB
|
|
select PCS_XPCS
|
|
help
|
|
This driver adds support for Microchip KSZ8, KSZ9 and
|
|
LAN937X series switch chips, being KSZ8863/8873,
|
|
KSZ8895/8864, KSZ8794/8795/8765,
|
|
KSZ9477/9897/9896/9567/8567, KSZ9893/9563/8563 and
|
|
LAN9370/9371/9372/9373/9374.
|
|
|
|
config NET_DSA_MICROCHIP_KSZ9477_I2C
|
|
tristate "KSZ series I2C connected switch driver"
|
|
depends on NET_DSA_MICROCHIP_KSZ_COMMON && I2C
|
|
select REGMAP_I2C
|
|
help
|
|
Select to enable support for registering switches configured through I2C.
|
|
|
|
config NET_DSA_MICROCHIP_KSZ_SPI
|
|
tristate "KSZ series SPI connected switch driver"
|
|
depends on NET_DSA_MICROCHIP_KSZ_COMMON && SPI
|
|
select REGMAP_SPI
|
|
help
|
|
Select to enable support for registering switches configured through SPI.
|
|
|
|
config NET_DSA_MICROCHIP_KSZ_PTP
|
|
bool "Support for the PTP clock on the KSZ9563/LAN937x Ethernet Switch"
|
|
depends on NET_DSA_MICROCHIP_KSZ_COMMON && PTP_1588_CLOCK
|
|
depends on NET_DSA_MICROCHIP_KSZ_COMMON=m || PTP_1588_CLOCK=y
|
|
help
|
|
Select to enable support for timestamping & PTP clock manipulation in
|
|
KSZ8563/KSZ9563/LAN937x series of switches. KSZ9563/KSZ8563 supports
|
|
only one step timestamping. LAN937x switch supports both one step and
|
|
two step timestamping.
|
|
|
|
config NET_DSA_MICROCHIP_KSZ8863_SMI
|
|
tristate "KSZ series SMI connected switch driver"
|
|
depends on NET_DSA_MICROCHIP_KSZ_COMMON
|
|
select MDIO_BITBANG
|
|
help
|
|
Select to enable support for registering switches configured through
|
|
Microchip SMI. It supports the KSZ8863 and KSZ8873 switch.
|