linux/drivers/net/phy
Claudiu Beznea 4f2c4ba321 net: phy: micrel: populate .soft_reset for KSZ9131
[ Upstream commit e398822c47 ]

The RZ/G3S SMARC Module has 2 KSZ9131 PHYs. In this setup, the KSZ9131 PHY
is used with the ravb Ethernet driver. It has been discovered that when
bringing the Ethernet interface down/up continuously, e.g., with the
following sh script:

$ while :; do ifconfig eth0 down; ifconfig eth0 up; done

the link speed and duplex are wrong after interrupting the bring down/up
operation even though the Ethernet interface is up. To recover from this
state the following configuration sequence is necessary (executed
manually):

$ ifconfig eth0 down
$ ifconfig eth0 up

The behavior has been identified also on the Microchip SAMA7G5-EK board
which runs the macb driver and uses the same PHY.

The order of PHY-related operations in ravb_open() is as follows:
ravb_open() ->
  ravb_phy_start() ->
    ravb_phy_init() ->
      of_phy_connect() ->
        phy_connect_direct() ->
	  phy_attach_direct() ->
	    phy_init_hw() ->
	      phydev->drv->soft_reset()
	      phydev->drv->config_init()
	      phydev->drv->config_intr()
	    phy_resume()
	      kszphy_resume()

The order of PHY-related operations in ravb_close is as follows:
ravb_close() ->
  phy_stop() ->
    phy_suspend() ->
      kszphy_suspend() ->
        genphy_suspend()
	  // set BMCR_PDOWN bit in MII_BMCR

In genphy_suspend() setting the BMCR_PDWN bit in MII_BMCR switches the PHY
to Software Power-Down (SPD) mode (according to the KSZ9131 datasheet).
Thus, when opening the interface after it has been  previously closed (via
ravb_close()), the phydev->drv->config_init() and
phydev->drv->config_intr() reach the KSZ9131 PHY driver via the
ksz9131_config_init() and kszphy_config_intr() functions.

KSZ9131 specifies that the MII management interface remains operational
during SPD (Software Power-Down), but (according to manual):
- Only access to the standard registers (0 through 31) is supported.
- Access to MMD address spaces other than MMD address space 1 is possible
  if the spd_clock_gate_override bit is set.
- Access to MMD address space 1 is not possible.

The spd_clock_gate_override bit is not used in the KSZ9131 driver.

ksz9131_config_init() configures RGMII delay, pad skews and LEDs by
accessesing MMD registers other than those in address space 1.

The datasheet for the KSZ9131 does not specify what happens if registers
from an unsupported address space are accessed while the PHY is in SPD.

To fix the issue the .soft_reset method has been instantiated for KSZ9131,
too. This resets the PHY to the default state before doing any
configurations to it, thus switching it out of SPD.

Fixes: bff5b4b373 ("net: phy: micrel: add Microchip KSZ9131 initial driver")
Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2024-01-25 14:52:53 -08:00
..
mscc ethernet: constify references to netdev->dev_addr in drivers 2024-01-05 15:13:37 +01:00
adin.c net: phy: Demote non-compliant kernel-doc headers 2021-05-17 14:12:39 -07:00
amd.c net: phy: amd: remove the use of .ack_interrupt() 2020-11-17 11:37:00 -08:00
aquantia.h net: phy: Use the correct style for SPDX License Identifier 2019-11-27 11:25:48 -08:00
aquantia_hwmon.c net: phy: aquantia: add hwmon support 2019-02-25 14:16:22 -08:00
aquantia_main.c net: phy: aquantia: wait for the suspend/resume operations to finish 2022-09-28 11:11:47 +02:00
at803x.c net: phy: at803x: remove set/get wol callbacks for AR8032 2023-08-16 18:22:01 +02:00
ax88796b.c net: phy: ax88772a: fix lost pause advertisement configuration 2022-07-07 17:53:28 +02:00
bcm-cygnus.c net: phy: broadcom: remove use of ack_interrupt() 2020-11-05 16:32:39 -08:00
bcm-phy-lib.c net: phy: broadcom: Only advertise EEE for supported modes 2021-03-30 17:39:23 -07:00
bcm-phy-lib.h net: phy: broadcom: implement generic .handle_interrupt() callback 2020-11-05 16:32:27 -08:00
bcm7xxx.c net: phy: bcm7xxx: Fixed indirect MMD operations 2021-09-29 11:36:38 +01:00
bcm63xx.c net: phy: broadcom: remove use of ack_interrupt() 2020-11-05 16:32:39 -08:00
bcm87xx.c net: phy: change format of some declarations 2021-06-16 12:34:07 -07:00
bcm54140.c net: phy: broadcom: remove use of ack_interrupt() 2020-11-05 16:32:39 -08:00
bcm84881.c net: phy: bcm84881: clear settings on link down 2020-04-23 15:55:35 -07:00
broadcom.c net: phy: broadcom: stub c45 read/write for 54810 2023-08-26 14:23:34 +02:00
cicada.c net: phy: cicada: remove the use of .ack_interrupt() 2020-11-05 16:32:39 -08:00
cortina.c net: mdiobus: add clause 45 mdiobus accessors 2020-05-26 15:31:45 -07:00
davicom.c net: phy: fix space alignment issues 2021-06-16 12:34:07 -07:00
dp83tc811.c net: phy: ti: take into account all possible interrupt sources 2021-03-01 11:46:55 -08:00
dp83640.c net: phy: remove unnecessary line continuation 2021-06-16 12:34:07 -07:00
dp83640_reg.h ptp: dp83640: don't define PAGE0 2021-09-14 20:03:24 -07:00
dp83822.c net: phy: dp83822: Fix null pointer access on DP83825/DP83826 devices 2023-02-09 11:26:35 +01:00
dp83848.c net: phy: ti: remove the use of .ack_interrupt() 2020-11-25 11:18:38 -08:00
dp83867.c Revert "net: phy: dp83867: perform soft reset and retain established link" 2023-06-28 10:29:49 +02:00
dp83869.c net: phy: dp83869: fix default value for tx-/rx-internal-delay 2023-04-05 11:24:59 +02:00
et1011c.c net: phy: remove unnecessary line continuation 2021-06-16 12:34:07 -07:00
fixed_phy.c net: phy: fix formatting issues with braces 2021-06-16 12:34:07 -07:00
icplus.c net: phy: icplus: call phy_restore_page() when phy_select_page() fails 2021-02-22 18:47:48 -08:00
intel-xway.c net: phy: intel-xway: Add RGMII internal delay configuration 2021-07-20 07:23:16 -07:00
Kconfig ethernet: fix PTP_1588_CLOCK dependencies 2021-08-13 17:49:05 -07:00
linkmode.c net: add linkmode helper for setting flow control advertisement 2020-02-16 19:39:44 -08:00
lxt.c net: phy: correct format of block comments 2021-06-16 12:34:07 -07:00
Makefile net: phy: add Maxlinear GPY115/21x/24x driver 2021-07-20 06:55:20 -07:00
marvell-88x2222.c net: phy: marvell-88x2222: enable autoneg by default 2021-04-27 14:05:41 -07:00
marvell.c net: phy: marvell: add sleep time after enabling the loopback bit 2022-11-26 09:24:47 +01:00
marvell10g.c net: phy: marvell10g: fix 88x3310 power up 2023-08-03 10:22:33 +02:00
mdio-boardinfo.c net: phy: Correct function name mdiobus_register_board_info() in comment 2021-03-29 13:42:44 -07:00
mdio-boardinfo.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
mdio_bus.c net: mdio: validate parameter addr in mdiobus_get_phy() 2023-02-01 08:27:10 +01:00
mdio_device.c net: mdio: fix unbalanced fwnode reference count in mdio_device_release() 2022-12-14 11:37:28 +01:00
mdio_devres.c net: mdio: fix owner field for mdio buses registered using device-tree 2023-03-30 12:47:46 +02:00
mediatek-ge.c net: phy: mediatek: remove PHY mode check on MT7531 2022-02-23 12:03:12 +01:00
meson-gxl.c net: phy: meson-gxl: use MMD access dummy stubs for GXL, internal PHY 2023-02-14 19:17:59 +01:00
micrel.c net: phy: micrel: populate .soft_reset for KSZ9131 2024-01-25 14:52:53 -08:00
microchip.c net: lan78xx: fix accessing the LAN7800's internal phy specific registers from the MAC driver 2023-03-17 08:48:54 +01:00
microchip_t1.c net: phy: microchip: remove the use of .ack_interrupt() 2020-11-17 11:36:59 -08:00
mii_timestamper.c net: mii_timestamper: check NULL in unregister_mii_timestamper() 2021-06-11 13:08:52 -07:00
motorcomm.c net: phy: abort loading yt8511 driver in unsupported modes 2021-05-30 14:24:38 -07:00
mxl-gpy.c net: phy: mxl-gpy: fix version reporting 2022-12-14 11:37:29 +01:00
national.c net: phy: correct format of block comments 2021-06-16 12:34:07 -07:00
nxp-c45-tja11xx.c net: phy: nxp-c45-tja11xx: fix unsigned long multiplication overflow 2023-04-20 12:13:55 +02:00
nxp-tja11xx.c net: phy: nxp-tja11xx: log critical health state 2021-08-12 10:51:45 +01:00
phy-c45.c net: phy: delete repeated words of comments 2021-06-16 12:34:07 -07:00
phy-core.c net: phy: prefer 1000baseT over 1000baseKX 2022-01-27 11:04:38 +01:00
phy.c net: phy: Ensure state transitions are processed from phy_stop() 2023-03-30 12:47:45 +02:00
phy_device.c net: phy: fix IRQ-based wake-on-lan over hibernate / power off 2023-08-26 14:23:33 +02:00
phy_led_triggers.c net: phy: leds: Deduplicate link LED trigger registration 2020-10-30 10:43:37 -07:00
phylink.c net: phylink: initialize carrier state at creation 2023-11-28 16:56:34 +00:00
qsemi.c net: phy: change format of some declarations 2021-06-16 12:34:07 -07:00
realtek.c net: phy: realtek: net: Fix less than zero comparison of a u16 2021-06-09 15:32:08 -07:00
rockchip.c net: phy: Demote non-compliant kernel-doc headers 2021-05-17 14:12:39 -07:00
sfp-bus.c net: sfp: add 2500base-X quirk for Lantech SFP module 2022-04-13 20:59:09 +02:00
sfp.c net: sfp: initialize sfp->i2c_block_size at sfp allocation 2023-04-20 12:13:55 +02:00
sfp.h phy: sfp: add netlink SFP support to generic SFP code 2021-04-11 16:34:56 -07:00
smsc.c net: phy: smsc: bail out in lan87xx_read_status if genphy_read_status fails 2023-03-22 13:31:26 +01:00
spi_ks8995.c net: phy: fix space alignment issues 2021-06-16 12:34:07 -07:00
ste10Xp.c net: phy: fix space alignment issues 2021-06-16 12:34:07 -07:00
swphy.c Update rmk's email address in various drivers 2020-04-21 17:50:09 +01:00
swphy.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
teranetics.c net: phy: remove genphy_no_soft_reset 2020-04-24 16:47:51 -07:00
uPD60620.c net: phy: use phy_resolve_aneg_pause() 2019-12-19 12:52:34 -08:00
vitesse.c net: phy: correct format of block comments 2021-06-16 12:34:07 -07:00
xilinx_gmii2rgmii.c net: phy: xgmiitorgmii: Fix refcount leak in xgmiitorgmii_probe 2023-01-12 11:59:13 +01:00