You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
3.5 KiB
Diff
80 lines
3.5 KiB
Diff
4 years ago
|
From d81fe3c13aa6f4ab1ec318212d2007175e6d05aa Mon Sep 17 00:00:00 2001
|
||
|
From: Sergio Paracuellos <sergio.paracuellos@gmail.com>
|
||
|
Date: Fri, 20 Mar 2020 16:38:37 +0100
|
||
|
Subject: [PATCH] staging: mt7621-pci: avoid to poweroff the phy for slot one
|
||
|
|
||
|
Phy for slot 0 and 1 is shared and handled properly in slot 0.
|
||
|
If there is only one port in use,(slot 0) we shall not call the
|
||
|
'phy_power_off' function with an invalid slot because kernel
|
||
|
will crash with an unaligned access fault like the following:
|
||
|
|
||
|
mt7621-pci 1e140000.pcie: Error applying setting, reverse things back
|
||
|
mt7621-pci-phy 1e149000.pcie-phy: PHY for 0xbe149000 (dual port = 1)
|
||
|
mt7621-pci-phy 1e14a000.pcie-phy: PHY for 0xbe14a000 (dual port = 0)
|
||
|
mt7621-pci-phy 1e149000.pcie-phy: Xtal is 40MHz
|
||
|
mt7621-pci-phy 1e14a000.pcie-phy: Xtal is 40MHz
|
||
|
mt7621-pci 1e140000.pcie: pcie1 no card, disable it (RST & CLK)
|
||
|
Unhandled kernel unaligned access[#1]:
|
||
|
CPU: 3 PID: 111 Comm: kworker/3:2 Not tainted 5.6.0-rc3-00347-g825c6f470c62-dirty #9
|
||
|
Workqueue: events deferred_probe_work_func
|
||
|
$ 0 : 00000000 00000001 5f60d043 8fe1ba80
|
||
|
$ 4 : 0000010d 01eb9000 00000000 00000000
|
||
|
$ 8 : 294b4c00 80940000 00000008 000000ce
|
||
|
$12 : 2e303030 00000000 00000000 65696370
|
||
|
$16 : ffffffed 0000010d 8e373cd0 8214c1e0
|
||
|
$20 : 00000000 82144c80 82144680 8214c250
|
||
|
$24 : 00000018 803ef8f4
|
||
|
$28 : 8e372000 8e373c60 8214c080 803940e8
|
||
|
Hi : 00000125
|
||
|
Lo : 122f2000
|
||
|
epc : 807b3328 mutex_lock+0x8/0x44
|
||
|
ra : 803940e8 phy_power_off+0x28/0xb0
|
||
|
Status: 1100fc03 KERNEL EXL IE
|
||
|
Cause : 00800010 (ExcCode 04)
|
||
|
BadVA : 0000010d
|
||
|
PrId : 0001992f (MIPS 1004Kc)
|
||
|
Modules linked in:
|
||
|
Process kworker/3:2 (pid: 111, threadinfo=(ptrval), task=(ptrval), tls=00000000)
|
||
|
Stack : 8e373cd0 803fe4f4 8e372000 8e373c90 8214c080 804fde1c 8e373c98 808d62f4
|
||
|
8e373c78 00000000 8214c254 804fe648 1e160000 804f27b8 00000001 808d62f4
|
||
|
00000000 00000001 8214c228 808d62f4 80930000 809a0000 8fd47e10 808d63d4
|
||
|
808d62d4 8fd47e10 808d0000 808d0000 8e373cd0 8e373cd0 809e2a74 809db510
|
||
|
809db510 00000006 00000001 00000000 00000000 00000000 01000000 1e1440ff
|
||
|
...
|
||
|
Call Trace:
|
||
|
[<807b3328>] mutex_lock+0x8/0x44
|
||
|
[<803940e8>] phy_power_off+0x28/0xb0
|
||
|
[<804fe648>] mt7621_pci_probe+0xc20/0xd18
|
||
|
[<80402ab8>] platform_drv_probe+0x40/0x94
|
||
|
[<80400a74>] really_probe+0x104/0x364
|
||
|
[<803feb74>] bus_for_each_drv+0x84/0xdc
|
||
|
[<80400924>] __device_attach+0xdc/0x120
|
||
|
[<803ffb5c>] bus_probe_device+0xa0/0xbc
|
||
|
[<80400124>] deferred_probe_work_func+0x7c/0xbc
|
||
|
[<800420e8>] process_one_work+0x230/0x450
|
||
|
[<80042638>] worker_thread+0x330/0x5fc
|
||
|
[<80048eb0>] kthread+0x12c/0x134
|
||
|
[<80007438>] ret_from_kernel_thread+0x14/0x1c
|
||
|
Code: 24050002 27bdfff8 8f830000 <c0850000> 14a00005 00000000 00600825 e0810000 1020fffa
|
||
|
|
||
|
Fixes: bf516f413f4e ("staging: mt7621-pci: use only two phys from device tree")
|
||
|
Signed-off-by: Sergio Paracuellos <sergio.paracuellos@gmail.com>
|
||
|
Link: https://lore.kernel.org/r/20200320153837.20415-1-sergio.paracuellos@gmail.com
|
||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||
|
---
|
||
|
drivers/staging/mt7621-pci/pci-mt7621.c | 3 ++-
|
||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||
|
|
||
|
--- a/drivers/staging/mt7621-pci/pci-mt7621.c
|
||
|
+++ b/drivers/staging/mt7621-pci/pci-mt7621.c
|
||
|
@@ -517,7 +517,8 @@ static void mt7621_pcie_init_ports(struc
|
||
|
if (!mt7621_pcie_port_is_linkup(port)) {
|
||
|
dev_err(dev, "pcie%d no card, disable it (RST & CLK)\n",
|
||
|
slot);
|
||
|
- phy_power_off(port->phy);
|
||
|
+ if (slot != 1)
|
||
|
+ phy_power_off(port->phy);
|
||
|
mt7621_control_assert(port);
|
||
|
mt7621_pcie_port_clk_disable(port);
|
||
|
port->enabled = false;
|