linux_dsm_epyc7002/drivers/net/phy
Arseny Solokha c7fa7f567c net: phylink: don't start and stop SGMII PHYs in SFP modules twice
SFP modules connected using the SGMII interface have their own PHYs which
are handled by the struct phylink's phydev field. On the other hand, for
the modules connected using 1000Base-X interface that field is not set.

Since commit ce0aa27ff3 ("sfp: add sfp-bus to bridge between network
devices and sfp cages") phylink_start() ends up setting the phydev field
using the sfp-bus infrastructure, which eventually calls phy_start() on it,
and then calling phy_start() again on the same phydev from phylink_start()
itself. Similar call sequence holds for phylink_stop(), only in the reverse
order. This results in WARNs during network interface bringup and shutdown
when a copper SFP module is connected, as phy_start() and phy_stop() are
called twice in a row for the same phy_device:

  % ip link set up dev eth0
  ------------[ cut here ]------------
  called from state UP
  WARNING: CPU: 1 PID: 155 at drivers/net/phy/phy.c:895 phy_start+0x74/0xc0
  Modules linked in:
  CPU: 1 PID: 155 Comm: backend Not tainted 5.2.0+ #1
  NIP:  c0227bf0 LR: c0227bf0 CTR: c004d224
  REGS: df547720 TRAP: 0700   Not tainted  (5.2.0+)
  MSR:  00029000 <CE,EE,ME>  CR: 24002822  XER: 00000000

  GPR00: c0227bf0 df5477d8 df5d7080 00000014 df9d2370 df9d5ac4 1f4eb000 00000001
  GPR08: c061fe58 00000000 00000000 df5477d8 0000003c 100c8768 00000000 00000000
  GPR16: df486a00 c046f1c8 c046eea0 00000000 c046e904 c0239604 db68449c 00000000
  GPR24: e9083204 00000000 00000001 db684460 e9083404 00000000 db6dce00 db6dcc00
  NIP [c0227bf0] phy_start+0x74/0xc0
  LR [c0227bf0] phy_start+0x74/0xc0
  Call Trace:
  [df5477d8] [c0227bf0] phy_start+0x74/0xc0 (unreliable)
  [df5477e8] [c023cad0] startup_gfar+0x398/0x3f4
  [df547828] [c023cf08] gfar_enet_open+0x364/0x374
  [df547898] [c029d870] __dev_open+0xe4/0x140
  [df5478c8] [c029db70] __dev_change_flags+0xf0/0x188
  [df5478f8] [c029dc28] dev_change_flags+0x20/0x54
  [df547918] [c02ae304] do_setlink+0x310/0x818
  [df547a08] [c02b1eb8] __rtnl_newlink+0x384/0x6b0
  [df547c28] [c02b222c] rtnl_newlink+0x48/0x68
  [df547c48] [c02ad7c8] rtnetlink_rcv_msg+0x240/0x27c
  [df547c98] [c02cc068] netlink_rcv_skb+0x8c/0xf0
  [df547cd8] [c02cba3c] netlink_unicast+0x114/0x19c
  [df547d08] [c02cbd74] netlink_sendmsg+0x2b0/0x2c0
  [df547d58] [c027b668] sock_sendmsg_nosec+0x20/0x40
  [df547d68] [c027d080] ___sys_sendmsg+0x17c/0x1dc
  [df547e98] [c027df7c] __sys_sendmsg+0x68/0x84
  [df547ef8] [c027e430] sys_socketcall+0x1a0/0x204
  [df547f38] [c000d1d8] ret_from_syscall+0x0/0x38
  --- interrupt: c01 at 0xfd4e030
      LR = 0xfd4e010
  Instruction dump:
  813f0188 38800000 2b890005 419d0014 3d40c046 5529103a 394aa208 7c8a482e
  3c60c046 3863a1b8 4cc63182 4be009a1 <0fe00000> 48000030 3c60c046 3863a1d0
  ---[ end trace d4c095aeaf6ea998 ]---

and

  % ip link set down dev eth0
  ------------[ cut here ]------------
  called from state HALTED
  WARNING: CPU: 1 PID: 184 at drivers/net/phy/phy.c:858 phy_stop+0x3c/0x88

  <...>

  Call Trace:
  [df581788] [c0228450] phy_stop+0x3c/0x88 (unreliable)
  [df581798] [c022d548] sfp_sm_phy_detach+0x1c/0x44
  [df5817a8] [c022e8cc] sfp_sm_event+0x4b0/0x87c
  [df581848] [c022f04c] sfp_upstream_stop+0x34/0x44
  [df581858] [c0225608] phylink_stop+0x7c/0xe4
  [df581868] [c023c57c] stop_gfar+0x7c/0x94
  [df581888] [c023c5b8] gfar_close+0x24/0x94
  [df5818a8] [c0298688] __dev_close_many+0xdc/0xf8
  [df5818c8] [c029db58] __dev_change_flags+0xd8/0x188
  [df5818f8] [c029dc28] dev_change_flags+0x20/0x54
  [df581918] [c02ae304] do_setlink+0x310/0x818
  [df581a08] [c02b1eb8] __rtnl_newlink+0x384/0x6b0
  [df581c28] [c02b222c] rtnl_newlink+0x48/0x68
  [df581c48] [c02ad7c8] rtnetlink_rcv_msg+0x240/0x27c
  [df581c98] [c02cc068] netlink_rcv_skb+0x8c/0xf0
  [df581cd8] [c02cba3c] netlink_unicast+0x114/0x19c
  [df581d08] [c02cbd74] netlink_sendmsg+0x2b0/0x2c0
  [df581d58] [c027b668] sock_sendmsg_nosec+0x20/0x40
  [df581d68] [c027d080] ___sys_sendmsg+0x17c/0x1dc
  [df581e98] [c027df7c] __sys_sendmsg+0x68/0x84
  [df581ef8] [c027e430] sys_socketcall+0x1a0/0x204
  [df581f38] [c000d1d8] ret_from_syscall+0x0/0x38

  <...>

  ---[ end trace d4c095aeaf6ea999 ]---

SFP modules with the 1000Base-X interface are not affected.

Place explicit calls to phy_start() and phy_stop() before enabling or after
disabling an attached SFP module, where phydev is not yet set (or is
already unset), so they will be made only from the inside of sfp-bus, if
needed.

Fixes: 2179626156 ("net: phy: warn if phy_start is called from invalid state")
Signed-off-by: Arseny Solokha <asolokha@kb.kras.ru>
Acked-by: Russell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
2019-07-24 14:37:15 -07:00
..
amd.c net: phy: switch drivers to use dynamic feature detection 2019-04-15 17:19:54 -07:00
aquantia_hwmon.c net: phy: aquantia: add hwmon support 2019-02-25 14:16:22 -08:00
aquantia_main.c net: phy: aquantia: add USXGMII support and warn if XGMII mode is set 2019-05-24 13:39:34 -07:00
aquantia.h net: phy: aquantia: add hwmon support 2019-02-25 14:16:22 -08:00
at803x.c net: mdio: rename mdio_device reset to reset_gpio 2019-04-18 17:42:54 -07:00
ax88796b.c net: phy: rename Asix Electronics PHY driver 2019-06-09 13:24:17 -07:00
bcm7xxx.c net: phy: switch drivers to use dynamic feature detection 2019-04-15 17:19:54 -07:00
bcm63xx.c net: phy: switch drivers to use dynamic feature detection 2019-04-15 17:19:54 -07:00
bcm87xx.c net: phy: bcm87xx: improve bcm87xx_config_init and feature detection 2019-05-26 21:56:41 -07:00
bcm-cygnus.c net: phy: switch drivers to use dynamic feature detection 2019-04-15 17:19:54 -07:00
bcm-phy-lib.c net: phy: Prepare for moving Omega out of bcm7xxx 2019-03-21 13:41:26 -07:00
bcm-phy-lib.h net: phy: Prepare for moving Omega out of bcm7xxx 2019-03-21 13:41:26 -07:00
broadcom.c net: phy: broadcom: Add genphy_suspend and genphy_resume for BCM5464 2019-06-09 20:05:19 -07:00
cicada.c net: phy: switch drivers to use dynamic feature detection 2019-04-15 17:19:54 -07:00
cortina.c net: phy: remove gen10g_no_soft_reset 2019-03-03 21:47:57 -08:00
davicom.c net: phy: switch drivers to use dynamic feature detection 2019-04-15 17:19:54 -07:00
dp83tc811.c net: phy: switch drivers to use dynamic feature detection 2019-04-15 17:19:54 -07:00
dp83640_reg.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
dp83640.c net: phy: switch drivers to use dynamic feature detection 2019-04-15 17:19:54 -07:00
dp83822.c net: phy: switch drivers to use dynamic feature detection 2019-04-15 17:19:54 -07:00
dp83848.c net: phy: switch drivers to use dynamic feature detection 2019-04-15 17:19:54 -07:00
dp83867.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2019-05-31 10:49:43 -07:00
et1011c.c net: phy: switch drivers to use dynamic feature detection 2019-04-15 17:19:54 -07:00
fixed_phy.c net: phy: improve pause handling 2019-05-04 00:47:55 -04:00
icplus.c net: phy: switch drivers to use dynamic feature detection 2019-04-15 17:19:54 -07:00
intel-xway.c net: phy: switch drivers to use dynamic feature detection 2019-04-15 17:19:54 -07:00
Kconfig Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2019-06-17 20:20:36 -07:00
lxt.c net: phy: lxt: Add suspend/resume support to LXT971 and LXT973. 2019-05-23 09:19:21 -07:00
Makefile Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2019-06-17 20:20:36 -07:00
marvell10g.c net: phy: marvell10g: report if the PHY fails to boot firmware 2019-05-29 14:25:10 -07:00
marvell.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2019-05-02 22:14:21 -04:00
mdio_bus.c net: mdio: rename mdio_device reset to reset_gpio 2019-04-18 17:42:54 -07:00
mdio_device.c net: mdio: rename mdio_device reset to reset_gpio 2019-04-18 17:42:54 -07:00
mdio-bcm-iproc.c net: phy: Remove redundent License text when SPDX header is present 2019-01-22 20:53:08 -08:00
mdio-bcm-unimac.c net: phy: mdio-bcm-unimac: remove redundant !timeout check 2019-03-27 14:27:30 -07:00
mdio-bitbang.c net: phy: Fixup GPLv2 SPDX tags based on license text 2019-01-22 20:58:40 -08:00
mdio-boardinfo.c net: phy: Convert some PHY and MDIO driver files to SPDX headers 2019-01-22 20:53:08 -08: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-cavium.c net: phy: Add SDPX tag based on COPYING file 2019-01-22 20:59:18 -08:00
mdio-cavium.h net: phy: Add SDPX tag based on COPYING file 2019-01-22 20:59:18 -08:00
mdio-gpio.c net: phy: Fixup GPLv2 SPDX tags based on license text 2019-01-22 20:58:40 -08:00
mdio-hisi-femac.c net: phy: Fixup GPLv2+ SPDX tags based on license text 2019-01-22 20:57:03 -08:00
mdio-i2c.c net: phy: Convert some PHY and MDIO driver files to SPDX headers 2019-01-22 20:53:08 -08:00
mdio-i2c.h net: phy: Convert some PHY and MDIO driver files to SPDX headers 2019-01-22 20:53:08 -08:00
mdio-moxart.c net: phy: Fixup GPLv2 SPDX tags based on license text 2019-01-22 20:58:40 -08:00
mdio-mscc-miim.c drivers: net: Remove device_node checks with of_mdiobus_register() 2018-05-16 14:20:36 -04:00
mdio-mux-bcm-iproc.c net: phy: Convert some PHY and MDIO driver files to SPDX headers 2019-01-22 20:53:08 -08:00
mdio-mux-gpio.c net: phy: Add SDPX tag based on COPYING file 2019-01-22 20:59:18 -08:00
mdio-mux-meson-g12a.c net: meson: fixup g12a glue ephy id 2019-05-13 09:12:19 -07:00
mdio-mux-mmioreg.c net: phy: Convert some PHY and MDIO driver files to SPDX headers 2019-01-22 20:53:08 -08:00
mdio-mux-multiplexer.c drivers: net: phy: mdio-mux: Add support for Generic Mux controls 2019-02-27 12:52:20 -08:00
mdio-mux.c net: phy: Add SDPX tag based on COPYING file 2019-01-22 20:59:18 -08:00
mdio-octeon.c net: phy: Add SDPX tag based on COPYING file 2019-01-22 20:59:18 -08:00
mdio-sun4i.c net: phy: Fixup GPLv2 SPDX tags based on license text 2019-01-22 20:58:40 -08:00
mdio-thunder.c net: phy: Add SDPX tag based on COPYING file 2019-01-22 20:59:18 -08:00
mdio-xgene.c net: phy: Convert some PHY and MDIO driver files to SPDX headers 2019-01-22 20:53:08 -08:00
mdio-xgene.h net: phy: Convert some PHY and MDIO driver files to SPDX headers 2019-01-22 20:53:08 -08:00
meson-gxl.c net: phy: switch drivers to use dynamic feature detection 2019-04-15 17:19:54 -07:00
micrel.c net: phy: micrel: make sure the factory test bit is cleared 2019-04-29 23:17:21 -04:00
microchip_t1.c net: phy: remove flag PHY_HAS_INTERRUPT from driver configs 2018-11-11 09:36:56 -08:00
microchip.c net: phy: switch drivers to use dynamic feature detection 2019-04-15 17:19:54 -07:00
mscc.c net: phy: mscc: add support for VSC8514 PHY. 2019-04-23 10:47:58 -07:00
national.c net: phy: switch drivers to use dynamic feature detection 2019-04-15 17:19:54 -07:00
nxp-tja11xx.c net: phy: tja11xx: Switch to HWMON_CHANNEL_INFO() 2019-05-29 22:02:18 -07:00
phy_device.c net: phy: make exported variables non-static 2019-07-12 15:26:29 -07:00
phy_led_triggers.c net: phy: Convert some PHY and MDIO driver files to SPDX headers 2019-01-22 20:53:08 -08:00
phy-c45.c treewide: Add SPDX license identifier for missed files 2019-05-21 10:50:45 +02:00
phy-core.c net: phy: Add support for 100BaseT1 and 1000BaseT1 2019-05-22 17:46:28 -07:00
phy.c net: phy: Make use of linkmode_mod_bit helper 2019-07-08 20:10:34 -07:00
phylink.c net: phylink: don't start and stop SGMII PHYs in SFP modules twice 2019-07-24 14:37:15 -07:00
qsemi.c net: phy: switch drivers to use dynamic feature detection 2019-04-15 17:19:54 -07:00
realtek.c net: phy: realtek: Replace phy functions with non-locked version in rtl8211e_config_init() 2019-05-13 09:10:39 -07:00
rockchip.c net: phy: switch drivers to use dynamic feature detection 2019-04-15 17:19:54 -07:00
sfp-bus.c net: sfp: remove sfp-bus use of netdevs 2019-05-31 12:37:46 -07:00
sfp.c net: phy: sfp: hwmon: Fix scaling of RX power 2019-07-21 11:51:50 -07:00
sfp.h net: sfp: do not probe SFP module before we're attached 2019-02-08 15:11:25 -08:00
smsc.c net: phy: switch drivers to use dynamic feature detection 2019-04-15 17:19:54 -07:00
spi_ks8995.c spi: Micrel eth switch: declare missing of table 2019-04-23 10:44:44 -07:00
ste10Xp.c net: phy: switch drivers to use dynamic feature detection 2019-04-15 17:19:54 -07:00
swphy.c net: phy: improve auto-neg emulation in swphy 2019-02-24 22:28:15 -08: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 gen10g_no_soft_reset 2019-03-03 21:47:57 -08:00
uPD60620.c net: phy: switch drivers to use dynamic feature detection 2019-04-15 17:19:54 -07:00
vitesse.c net: phy: vitesse: Remove support for VSC8514. 2019-04-23 10:47:58 -07:00
xilinx_gmii2rgmii.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2019-02-20 00:34:07 -08:00