linux-uconsole/drivers/net/phy
Florian Fainelli 081be8c9ef Revert "net: phy: Correctly process PHY_HALTED in phy_stop_machine()"
[ Upstream commit ebc8254aea ]

This reverts commit 7ad813f208 ("net: phy:
Correctly process PHY_HALTED in phy_stop_machine()") because it is
creating the possibility for a NULL pointer dereference.

David Daney provide the following call trace and diagram of events:

When ndo_stop() is called we call:

 phy_disconnect()
    +---> phy_stop_interrupts() implies: phydev->irq = PHY_POLL;
    +---> phy_stop_machine()
    |      +---> phy_state_machine()
    |              +----> queue_delayed_work(): Work queued.
    +--->phy_detach() implies: phydev->attached_dev = NULL;

Now at a later time the queued work does:

 phy_state_machine()
    +---->netif_carrier_off(phydev->attached_dev): Oh no! It is NULL:

 CPU 12 Unable to handle kernel paging request at virtual address
0000000000000048, epc == ffffffff80de37ec, ra == ffffffff80c7c
Oops[#1]:
CPU: 12 PID: 1502 Comm: kworker/12:1 Not tainted 4.9.43-Cavium-Octeon+ #1
Workqueue: events_power_efficient phy_state_machine
task: 80000004021ed100 task.stack: 8000000409d70000
$ 0   : 0000000000000000 ffffffff84720060 0000000000000048 0000000000000004
$ 4   : 0000000000000000 0000000000000001 0000000000000004 0000000000000000
$ 8   : 0000000000000000 0000000000000000 00000000ffff98f3 0000000000000000
$12   : 8000000409d73fe0 0000000000009c00 ffffffff846547c8 000000000000af3b
$16   : 80000004096bab68 80000004096babd0 0000000000000000 80000004096ba800
$20   : 0000000000000000 0000000000000000 ffffffff81090000 0000000000000008
$24   : 0000000000000061 ffffffff808637b0
$28   : 8000000409d70000 8000000409d73cf0 80000000271bd300 ffffffff80c7804c
Hi    : 000000000000002a
Lo    : 000000000000003f
epc   : ffffffff80de37ec netif_carrier_off+0xc/0x58
ra    : ffffffff80c7804c phy_state_machine+0x48c/0x4f8
Status: 14009ce3        KX SX UX KERNEL EXL IE
Cause : 00800008 (ExcCode 02)
BadVA : 0000000000000048
PrId  : 000d9501 (Cavium Octeon III)
Modules linked in:
Process kworker/12:1 (pid: 1502, threadinfo=8000000409d70000,
task=80000004021ed100, tls=0000000000000000)
Stack : 8000000409a54000 80000004096bab68 80000000271bd300 80000000271c1e00
        0000000000000000 ffffffff808a1708 8000000409a54000 80000000271bd300
        80000000271bd320 8000000409a54030 ffffffff80ff0f00 0000000000000001
        ffffffff81090000 ffffffff808a1ac0 8000000402182080 ffffffff84650000
        8000000402182080 ffffffff84650000 ffffffff80ff0000 8000000409a54000
        ffffffff808a1970 0000000000000000 80000004099e8000 8000000402099240
        0000000000000000 ffffffff808a8598 0000000000000000 8000000408eeeb00
        8000000409a54000 00000000810a1d00 0000000000000000 8000000409d73de8
        8000000409d73de8 0000000000000088 000000000c009c00 8000000409d73e08
        8000000409d73e08 8000000402182080 ffffffff808a84d0 8000000402182080
        ...
Call Trace:
[<ffffffff80de37ec>] netif_carrier_off+0xc/0x58
[<ffffffff80c7804c>] phy_state_machine+0x48c/0x4f8
[<ffffffff808a1708>] process_one_work+0x158/0x368
[<ffffffff808a1ac0>] worker_thread+0x150/0x4c0
[<ffffffff808a8598>] kthread+0xc8/0xe0
[<ffffffff808617f0>] ret_from_kernel_thread+0x14/0x1c

The original motivation for this change originated from Marc Gonzales
indicating that his network driver did not have its adjust_link callback
executing with phydev->link = 0 while he was expecting it.

PHYLIB has never made any such guarantees ever because phy_stop() merely just
tells the workqueue to move into PHY_HALTED state which will happen
asynchronously.

Reported-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reported-by: David Daney <ddaney.cavm@gmail.com>
Fixes: 7ad813f208 ("net: phy: Correctly process PHY_HALTED in phy_stop_machine()")
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2017-09-27 11:00:11 +02:00
..
amd.c
aquantia.c net: phy: aquantia/teranetics: Convert to use module_phy_driver macro 2015-10-14 19:01:16 -07:00
at803x.c net: phy: at803x: support interrupt on 8030 and 8035 2015-11-16 14:18:40 -05:00
bcm-cygnus.c net: phy: Broadcom Cygnus internal Etherent PHY driver 2015-10-08 04:45:52 -07:00
bcm-phy-lib.c net: phy: bcm-phy-lib: Fix module license issue 2015-10-18 19:35:10 -07:00
bcm-phy-lib.h net: phy: Add Broadcom phy library for common interfaces 2015-10-08 04:45:46 -07:00
bcm7xxx.c net: phy: bcm7xxx: Modified to use global core register defines 2015-10-08 04:45:53 -07:00
bcm63xx.c net: phy: bcm63xx: Utilize correct config_intr function 2017-02-04 09:45:09 +01:00
bcm87xx.c
broadcom.c broadcom: fix PHY_ID_BCM5481 entry in the id table 2015-11-23 23:29:27 -05:00
cicada.c
davicom.c net: phy: davicom: add IDs for DM9161B and C variants 2015-06-11 00:24:53 -07:00
dp83640.c net: dp83640: Avoid NULL pointer dereference. 2017-07-21 07:44:54 +02:00
dp83640_reg.h
dp83848.c net: phy: dp83848: Add TI DP83848 Ethernet PHY 2015-10-22 06:37:19 -07:00
dp83867.c net: phy: dp83867: fix irq generation 2017-08-11 09:08:56 -07:00
et1011c.c
fixed_phy.c phy: fixed-phy: properly validate phy in fixed_phy_update_state() 2015-09-24 23:04:53 -07:00
icplus.c net: phy: Utilize phy_interface_is_rgmii 2015-05-27 00:27:35 -04:00
Kconfig Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2015-10-24 06:54:12 -07:00
lxt.c
Makefile Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2015-10-24 06:54:12 -07:00
marvell.c net: phy: fix marvell phy status reading 2017-06-29 12:48:53 +02:00
mdio-bcm-iproc.c net: phy: Initialize mdio clock at probe function 2017-06-29 12:48:53 +02:00
mdio-bcm-unimac.c net: phy: mdio-bcm-unimac: Fix module autoload for OF platform driver 2015-09-21 16:11:20 -07:00
mdio-bitbang.c net: phy: mdio-gpio: Handle phy_ignore_ta_mask 2015-05-14 13:40:55 -04:00
mdio-gpio.c net: mdio-gpio: move platform data header 2015-10-21 19:50:44 -07:00
mdio-moxart.c
mdio-mux-gpio.c gpiolib: rename gpiod_set_array to gpiod_set_array_value 2015-06-01 15:10:09 +02:00
mdio-mux-mmioreg.c net: phy: mdio: add missing of_node_put 2015-10-26 22:08:12 -07:00
mdio-mux.c net: phy: mdio-mux: Check return value of mdiobus_alloc() 2015-12-14 14:27:40 -05:00
mdio-octeon.c net: mdio-octeon: Fix octeon_mdiobus_probe function for return values 2015-07-29 17:17:44 -07:00
mdio-sun4i.c
mdio_bus.c net: phy: Add nested variants of mdiobus read/write 2015-10-23 05:57:43 -07:00
micrel.c net/phy: micrel: configure intterupts after autoneg workaround 2017-07-21 07:44:54 +02:00
microchip.c add microchip LAN88xx phy driver 2015-09-09 17:19:14 -07:00
national.c
phy.c Revert "net: phy: Correctly process PHY_HALTED in phy_stop_machine()" 2017-09-27 11:00:11 +02:00
phy_device.c net: phy: Fix PHY unbind crash 2017-08-11 09:08:55 -07:00
qsemi.c
realtek.c net: phy: add RealTek RTL8211DN phy id 2015-08-09 22:52:15 -07:00
smsc.c net: phy: smsc: disable energy detect mode 2015-10-21 06:41:44 -07:00
spi_ks8995.c spi: Drop owner assignment from spi_drivers 2015-10-28 10:30:17 +09:00
ste10Xp.c
teranetics.c net: phy: aquantia/teranetics: Convert to use module_phy_driver macro 2015-10-14 19:01:16 -07:00
vitesse.c net: phy: vitesse: add support for VSC8601 2015-11-16 14:18:40 -05:00