Re: [PATCH v3] usb: Add a new quirk to let buggy hub enable and disable LPM during suspend and resume

2019-10-21 Thread Kai-Heng Feng



> On Oct 21, 2019, at 21:59, Mathias Nyman  
> wrote:
> 
> On 18.10.2019 21.59, Greg Kroah-Hartman wrote:
>> On Thu, Oct 17, 2019 at 02:33:00PM +0800, Kai-Heng Feng wrote:
>>> 
>>> 
 On Oct 4, 2019, at 03:04, Alan Stern  wrote:
 
 On Fri, 4 Oct 2019, Kai-Heng Feng wrote:
 
> Dell WD15 dock has a topology like this:
> /:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 1M
>|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/7p, 5000M
>|__ Port 2: Dev 3, If 0, Class=Vendor Specific Class, 
> Driver=r8152, 5000M
> 
> Their IDs:
> Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
> Bus 004 Device 002: ID 0424:5537 Standard Microsystems Corp.
> Bus 004 Device 004: ID 0bda:8153 Realtek Semiconductor Corp.
> 
> Ethernet cannot be detected after plugging ethernet cable to the dock,
> the hub and roothub get runtime resumed and runtime suspended
> immediately:
> ...
> [  433.315169] xhci_hcd :3a:00.0: hcd_pci_runtime_resume: 0
> [  433.315204] usb usb4: usb auto-resume
> [  433.315226] hub 4-0:1.0: hub_resume
> [  433.315239] xhci_hcd :3a:00.0: Get port status 4-1 read: 
> 0x10202e2, return 0x10343
> [  433.315264] usb usb4-port1: status 0343 change 0001
> [  433.315279] xhci_hcd :3a:00.0: clear port1 connect change, portsc: 
> 0x10002e2
> [  433.315293] xhci_hcd :3a:00.0: Get port status 4-2 read: 0x2a0, 
> return 0x2a0
> [  433.317012] xhci_hcd :3a:00.0: xhci_hub_status_data: stopping port 
> polling.
> [  433.422282] xhci_hcd :3a:00.0: Get port status 4-1 read: 
> 0x10002e2, return 0x343
> 
> At this point the SMSC hub (usb 4-1) enters into compliance mode
> (USB_SS_PORT_LS_COMP_MOD), and USB core tries to warm-reset it,
> 
> [  433.422307] usb usb4-port1: do warm reset
> [  433.422311] usb 4-1: device reset not allowed in state 8
> [  433.422339] hub 4-0:1.0: state 7 ports 2 chg 0002 evt 
> [  433.422346] xhci_hcd :3a:00.0: Get port status 4-1 read: 
> 0x10002e2, return 0x343
> [  433.422356] usb usb4-port1: do warm reset
> [  433.422358] usb 4-1: device reset not allowed in state 8
> [  433.422428] xhci_hcd :3a:00.0: set port remote wake mask, actual 
> port 0 status  = 0xf0002e2
> [  433.422455] xhci_hcd :3a:00.0: set port remote wake mask, actual 
> port 1 status  = 0xe0002a0
> [  433.422465] hub 4-0:1.0: hub_suspend
> [  433.422475] usb usb4: bus auto-suspend, wakeup 1
> [  433.426161] xhci_hcd :3a:00.0: xhci_hub_status_data: stopping port 
> polling.
> [  433.466209] xhci_hcd :3a:00.0: port 0 polling in bus suspend, 
> waiting
> [  433.510204] xhci_hcd :3a:00.0: port 0 polling in bus suspend, 
> waiting
> [  433.554051] xhci_hcd :3a:00.0: port 0 polling in bus suspend, 
> waiting
> [  433.598235] xhci_hcd :3a:00.0: port 0 polling in bus suspend, 
> waiting
> [  433.642154] xhci_hcd :3a:00.0: port 0 polling in bus suspend, 
> waiting
> [  433.686204] xhci_hcd :3a:00.0: port 0 polling in bus suspend, 
> waiting
> [  433.730205] xhci_hcd :3a:00.0: port 0 polling in bus suspend, 
> waiting
> [  433.774203] xhci_hcd :3a:00.0: port 0 polling in bus suspend, 
> waiting
> [  433.818207] xhci_hcd :3a:00.0: port 0 polling in bus suspend, 
> waiting
> [  433.862040] xhci_hcd :3a:00.0: port 0 polling in bus suspend, 
> waiting
> [  433.862053] xhci_hcd :3a:00.0: xhci_hub_status_data: stopping port 
> polling.
> [  433.862077] xhci_hcd :3a:00.0: xhci_suspend: stopping port polling.
> [  433.862096] xhci_hcd :3a:00.0: // Setting command ring address to 
> 0x8578fc001
> [  433.862312] xhci_hcd :3a:00.0: hcd_pci_runtime_suspend: 0
> [  433.862445] xhci_hcd :3a:00.0: PME# enabled
> [  433.902376] xhci_hcd :3a:00.0: restoring config space at offset 
> 0xc (was 0x0, writing 0x20)
> [  433.902395] xhci_hcd :3a:00.0: restoring config space at offset 
> 0x4 (was 0x10, writing 0x100403)
> [  433.902490] xhci_hcd :3a:00.0: PME# disabled
> [  433.902504] xhci_hcd :3a:00.0: enabling bus mastering
> [  433.902547] xhci_hcd :3a:00.0: // Setting command ring address to 
> 0x8578fc001
> [  433.902649] pcieport :00:1b.0: PME: Spurious native interrupt!
> [  433.902839] xhci_hcd :3a:00.0: Port change event, 4-1, id 3, 
> portsc: 0xb0202e2
> [  433.902842] xhci_hcd :3a:00.0: resume root hub
> [  433.902845] xhci_hcd :3a:00.0: handle_port_status: starting port 
> polling.
> [  433.902877] xhci_hcd :3a:00.0: xhci_resume: starting port polling.
> [  433.902889] xhci_hcd :3a:00.0: xhci_hub_status_data: stopping port 
> polling.
> [  433.902891] xhci_hcd :3a:00.0: hcd_p

Re: [PATCH v3] usb: Add a new quirk to let buggy hub enable and disable LPM during suspend and resume

2019-10-21 Thread Mathias Nyman

On 18.10.2019 21.59, Greg Kroah-Hartman wrote:

On Thu, Oct 17, 2019 at 02:33:00PM +0800, Kai-Heng Feng wrote:




On Oct 4, 2019, at 03:04, Alan Stern  wrote:

On Fri, 4 Oct 2019, Kai-Heng Feng wrote:


Dell WD15 dock has a topology like this:
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 1M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/7p, 5000M
|__ Port 2: Dev 3, If 0, Class=Vendor Specific Class, Driver=r8152, 
5000M

Their IDs:
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 004 Device 002: ID 0424:5537 Standard Microsystems Corp.
Bus 004 Device 004: ID 0bda:8153 Realtek Semiconductor Corp.

Ethernet cannot be detected after plugging ethernet cable to the dock,
the hub and roothub get runtime resumed and runtime suspended
immediately:
...
[  433.315169] xhci_hcd :3a:00.0: hcd_pci_runtime_resume: 0
[  433.315204] usb usb4: usb auto-resume
[  433.315226] hub 4-0:1.0: hub_resume
[  433.315239] xhci_hcd :3a:00.0: Get port status 4-1 read: 0x10202e2, 
return 0x10343
[  433.315264] usb usb4-port1: status 0343 change 0001
[  433.315279] xhci_hcd :3a:00.0: clear port1 connect change, portsc: 
0x10002e2
[  433.315293] xhci_hcd :3a:00.0: Get port status 4-2 read: 0x2a0, return 
0x2a0
[  433.317012] xhci_hcd :3a:00.0: xhci_hub_status_data: stopping port 
polling.
[  433.422282] xhci_hcd :3a:00.0: Get port status 4-1 read: 0x10002e2, 
return 0x343

At this point the SMSC hub (usb 4-1) enters into compliance mode
(USB_SS_PORT_LS_COMP_MOD), and USB core tries to warm-reset it,

[  433.422307] usb usb4-port1: do warm reset
[  433.422311] usb 4-1: device reset not allowed in state 8
[  433.422339] hub 4-0:1.0: state 7 ports 2 chg 0002 evt 
[  433.422346] xhci_hcd :3a:00.0: Get port status 4-1 read: 0x10002e2, 
return 0x343
[  433.422356] usb usb4-port1: do warm reset
[  433.422358] usb 4-1: device reset not allowed in state 8
[  433.422428] xhci_hcd :3a:00.0: set port remote wake mask, actual port 0 
status  = 0xf0002e2
[  433.422455] xhci_hcd :3a:00.0: set port remote wake mask, actual port 1 
status  = 0xe0002a0
[  433.422465] hub 4-0:1.0: hub_suspend
[  433.422475] usb usb4: bus auto-suspend, wakeup 1
[  433.426161] xhci_hcd :3a:00.0: xhci_hub_status_data: stopping port 
polling.
[  433.466209] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
[  433.510204] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
[  433.554051] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
[  433.598235] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
[  433.642154] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
[  433.686204] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
[  433.730205] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
[  433.774203] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
[  433.818207] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
[  433.862040] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
[  433.862053] xhci_hcd :3a:00.0: xhci_hub_status_data: stopping port 
polling.
[  433.862077] xhci_hcd :3a:00.0: xhci_suspend: stopping port polling.
[  433.862096] xhci_hcd :3a:00.0: // Setting command ring address to 
0x8578fc001
[  433.862312] xhci_hcd :3a:00.0: hcd_pci_runtime_suspend: 0
[  433.862445] xhci_hcd :3a:00.0: PME# enabled
[  433.902376] xhci_hcd :3a:00.0: restoring config space at offset 0xc (was 
0x0, writing 0x20)
[  433.902395] xhci_hcd :3a:00.0: restoring config space at offset 0x4 (was 
0x10, writing 0x100403)
[  433.902490] xhci_hcd :3a:00.0: PME# disabled
[  433.902504] xhci_hcd :3a:00.0: enabling bus mastering
[  433.902547] xhci_hcd :3a:00.0: // Setting command ring address to 
0x8578fc001
[  433.902649] pcieport :00:1b.0: PME: Spurious native interrupt!
[  433.902839] xhci_hcd :3a:00.0: Port change event, 4-1, id 3, portsc: 
0xb0202e2
[  433.902842] xhci_hcd :3a:00.0: resume root hub
[  433.902845] xhci_hcd :3a:00.0: handle_port_status: starting port polling.
[  433.902877] xhci_hcd :3a:00.0: xhci_resume: starting port polling.
[  433.902889] xhci_hcd :3a:00.0: xhci_hub_status_data: stopping port 
polling.
[  433.902891] xhci_hcd :3a:00.0: hcd_pci_runtime_resume: 0
[  433.902919] usb usb4: usb wakeup-resume
[  433.902942] usb usb4: usb auto-resume
[  433.902966] hub 4-0:1.0: hub_resume
...

However the warm-reset never success, the asserted PCI PME keeps the
runtime-resume, warm-reset and runtime-suspend loop which never bring it back
and causing spurious interrupts floods.

After some trial and errors, the issue goes away if LPM on the SMSC hub
is disabled. Digging further, enabling and disabling LPM during runtime
resume and runtime suspend respectively can solve the issue.

So bring back the old LPM behavior as a quirk and use it for the SMSC
hub to solve the issue.

Fixes: d590c23111

Re: [PATCH v3] usb: Add a new quirk to let buggy hub enable and disable LPM during suspend and resume

2019-10-18 Thread Greg Kroah-Hartman
On Thu, Oct 17, 2019 at 02:33:00PM +0800, Kai-Heng Feng wrote:
> 
> 
> > On Oct 4, 2019, at 03:04, Alan Stern  wrote:
> > 
> > On Fri, 4 Oct 2019, Kai-Heng Feng wrote:
> > 
> >> Dell WD15 dock has a topology like this:
> >> /:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 1M
> >>|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/7p, 5000M
> >>|__ Port 2: Dev 3, If 0, Class=Vendor Specific Class, 
> >> Driver=r8152, 5000M
> >> 
> >> Their IDs:
> >> Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
> >> Bus 004 Device 002: ID 0424:5537 Standard Microsystems Corp.
> >> Bus 004 Device 004: ID 0bda:8153 Realtek Semiconductor Corp.
> >> 
> >> Ethernet cannot be detected after plugging ethernet cable to the dock,
> >> the hub and roothub get runtime resumed and runtime suspended
> >> immediately:
> >> ...
> >> [  433.315169] xhci_hcd :3a:00.0: hcd_pci_runtime_resume: 0
> >> [  433.315204] usb usb4: usb auto-resume
> >> [  433.315226] hub 4-0:1.0: hub_resume
> >> [  433.315239] xhci_hcd :3a:00.0: Get port status 4-1 read: 0x10202e2, 
> >> return 0x10343
> >> [  433.315264] usb usb4-port1: status 0343 change 0001
> >> [  433.315279] xhci_hcd :3a:00.0: clear port1 connect change, portsc: 
> >> 0x10002e2
> >> [  433.315293] xhci_hcd :3a:00.0: Get port status 4-2 read: 0x2a0, 
> >> return 0x2a0
> >> [  433.317012] xhci_hcd :3a:00.0: xhci_hub_status_data: stopping port 
> >> polling.
> >> [  433.422282] xhci_hcd :3a:00.0: Get port status 4-1 read: 0x10002e2, 
> >> return 0x343
> >> 
> >> At this point the SMSC hub (usb 4-1) enters into compliance mode
> >> (USB_SS_PORT_LS_COMP_MOD), and USB core tries to warm-reset it,
> >> 
> >> [  433.422307] usb usb4-port1: do warm reset
> >> [  433.422311] usb 4-1: device reset not allowed in state 8
> >> [  433.422339] hub 4-0:1.0: state 7 ports 2 chg 0002 evt 
> >> [  433.422346] xhci_hcd :3a:00.0: Get port status 4-1 read: 0x10002e2, 
> >> return 0x343
> >> [  433.422356] usb usb4-port1: do warm reset
> >> [  433.422358] usb 4-1: device reset not allowed in state 8
> >> [  433.422428] xhci_hcd :3a:00.0: set port remote wake mask, actual 
> >> port 0 status  = 0xf0002e2
> >> [  433.422455] xhci_hcd :3a:00.0: set port remote wake mask, actual 
> >> port 1 status  = 0xe0002a0
> >> [  433.422465] hub 4-0:1.0: hub_suspend
> >> [  433.422475] usb usb4: bus auto-suspend, wakeup 1
> >> [  433.426161] xhci_hcd :3a:00.0: xhci_hub_status_data: stopping port 
> >> polling.
> >> [  433.466209] xhci_hcd :3a:00.0: port 0 polling in bus suspend, 
> >> waiting
> >> [  433.510204] xhci_hcd :3a:00.0: port 0 polling in bus suspend, 
> >> waiting
> >> [  433.554051] xhci_hcd :3a:00.0: port 0 polling in bus suspend, 
> >> waiting
> >> [  433.598235] xhci_hcd :3a:00.0: port 0 polling in bus suspend, 
> >> waiting
> >> [  433.642154] xhci_hcd :3a:00.0: port 0 polling in bus suspend, 
> >> waiting
> >> [  433.686204] xhci_hcd :3a:00.0: port 0 polling in bus suspend, 
> >> waiting
> >> [  433.730205] xhci_hcd :3a:00.0: port 0 polling in bus suspend, 
> >> waiting
> >> [  433.774203] xhci_hcd :3a:00.0: port 0 polling in bus suspend, 
> >> waiting
> >> [  433.818207] xhci_hcd :3a:00.0: port 0 polling in bus suspend, 
> >> waiting
> >> [  433.862040] xhci_hcd :3a:00.0: port 0 polling in bus suspend, 
> >> waiting
> >> [  433.862053] xhci_hcd :3a:00.0: xhci_hub_status_data: stopping port 
> >> polling.
> >> [  433.862077] xhci_hcd :3a:00.0: xhci_suspend: stopping port polling.
> >> [  433.862096] xhci_hcd :3a:00.0: // Setting command ring address to 
> >> 0x8578fc001
> >> [  433.862312] xhci_hcd :3a:00.0: hcd_pci_runtime_suspend: 0
> >> [  433.862445] xhci_hcd :3a:00.0: PME# enabled
> >> [  433.902376] xhci_hcd :3a:00.0: restoring config space at offset 0xc 
> >> (was 0x0, writing 0x20)
> >> [  433.902395] xhci_hcd :3a:00.0: restoring config space at offset 0x4 
> >> (was 0x10, writing 0x100403)
> >> [  433.902490] xhci_hcd :3a:00.0: PME# disabled
> >> [  433.902504] xhci_hcd :3a:00.0: enabling bus mastering
> >> [  433.902547] xhci_hcd :3a:00.0: // Setting command ring address to 
> >> 0x8578fc001
> >> [  433.902649] pcieport :00:1b.0: PME: Spurious native interrupt!
> >> [  433.902839] xhci_hcd :3a:00.0: Port change event, 4-1, id 3, 
> >> portsc: 0xb0202e2
> >> [  433.902842] xhci_hcd :3a:00.0: resume root hub
> >> [  433.902845] xhci_hcd :3a:00.0: handle_port_status: starting port 
> >> polling.
> >> [  433.902877] xhci_hcd :3a:00.0: xhci_resume: starting port polling.
> >> [  433.902889] xhci_hcd :3a:00.0: xhci_hub_status_data: stopping port 
> >> polling.
> >> [  433.902891] xhci_hcd :3a:00.0: hcd_pci_runtime_resume: 0
> >> [  433.902919] usb usb4: usb wakeup-resume
> >> [  433.902942] usb usb4: usb auto-resume
> >> [  433.902966] hub 4-0:1.0: hub_resume
> >> ...
> >> 
> >> However the warm-reset never succe

Re: [PATCH v3] usb: Add a new quirk to let buggy hub enable and disable LPM during suspend and resume

2019-10-16 Thread Kai-Heng Feng



> On Oct 4, 2019, at 03:04, Alan Stern  wrote:
> 
> On Fri, 4 Oct 2019, Kai-Heng Feng wrote:
> 
>> Dell WD15 dock has a topology like this:
>> /:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 1M
>>|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/7p, 5000M
>>|__ Port 2: Dev 3, If 0, Class=Vendor Specific Class, 
>> Driver=r8152, 5000M
>> 
>> Their IDs:
>> Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
>> Bus 004 Device 002: ID 0424:5537 Standard Microsystems Corp.
>> Bus 004 Device 004: ID 0bda:8153 Realtek Semiconductor Corp.
>> 
>> Ethernet cannot be detected after plugging ethernet cable to the dock,
>> the hub and roothub get runtime resumed and runtime suspended
>> immediately:
>> ...
>> [  433.315169] xhci_hcd :3a:00.0: hcd_pci_runtime_resume: 0
>> [  433.315204] usb usb4: usb auto-resume
>> [  433.315226] hub 4-0:1.0: hub_resume
>> [  433.315239] xhci_hcd :3a:00.0: Get port status 4-1 read: 0x10202e2, 
>> return 0x10343
>> [  433.315264] usb usb4-port1: status 0343 change 0001
>> [  433.315279] xhci_hcd :3a:00.0: clear port1 connect change, portsc: 
>> 0x10002e2
>> [  433.315293] xhci_hcd :3a:00.0: Get port status 4-2 read: 0x2a0, 
>> return 0x2a0
>> [  433.317012] xhci_hcd :3a:00.0: xhci_hub_status_data: stopping port 
>> polling.
>> [  433.422282] xhci_hcd :3a:00.0: Get port status 4-1 read: 0x10002e2, 
>> return 0x343
>> 
>> At this point the SMSC hub (usb 4-1) enters into compliance mode
>> (USB_SS_PORT_LS_COMP_MOD), and USB core tries to warm-reset it,
>> 
>> [  433.422307] usb usb4-port1: do warm reset
>> [  433.422311] usb 4-1: device reset not allowed in state 8
>> [  433.422339] hub 4-0:1.0: state 7 ports 2 chg 0002 evt 
>> [  433.422346] xhci_hcd :3a:00.0: Get port status 4-1 read: 0x10002e2, 
>> return 0x343
>> [  433.422356] usb usb4-port1: do warm reset
>> [  433.422358] usb 4-1: device reset not allowed in state 8
>> [  433.422428] xhci_hcd :3a:00.0: set port remote wake mask, actual port 
>> 0 status  = 0xf0002e2
>> [  433.422455] xhci_hcd :3a:00.0: set port remote wake mask, actual port 
>> 1 status  = 0xe0002a0
>> [  433.422465] hub 4-0:1.0: hub_suspend
>> [  433.422475] usb usb4: bus auto-suspend, wakeup 1
>> [  433.426161] xhci_hcd :3a:00.0: xhci_hub_status_data: stopping port 
>> polling.
>> [  433.466209] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
>> [  433.510204] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
>> [  433.554051] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
>> [  433.598235] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
>> [  433.642154] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
>> [  433.686204] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
>> [  433.730205] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
>> [  433.774203] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
>> [  433.818207] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
>> [  433.862040] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
>> [  433.862053] xhci_hcd :3a:00.0: xhci_hub_status_data: stopping port 
>> polling.
>> [  433.862077] xhci_hcd :3a:00.0: xhci_suspend: stopping port polling.
>> [  433.862096] xhci_hcd :3a:00.0: // Setting command ring address to 
>> 0x8578fc001
>> [  433.862312] xhci_hcd :3a:00.0: hcd_pci_runtime_suspend: 0
>> [  433.862445] xhci_hcd :3a:00.0: PME# enabled
>> [  433.902376] xhci_hcd :3a:00.0: restoring config space at offset 0xc 
>> (was 0x0, writing 0x20)
>> [  433.902395] xhci_hcd :3a:00.0: restoring config space at offset 0x4 
>> (was 0x10, writing 0x100403)
>> [  433.902490] xhci_hcd :3a:00.0: PME# disabled
>> [  433.902504] xhci_hcd :3a:00.0: enabling bus mastering
>> [  433.902547] xhci_hcd :3a:00.0: // Setting command ring address to 
>> 0x8578fc001
>> [  433.902649] pcieport :00:1b.0: PME: Spurious native interrupt!
>> [  433.902839] xhci_hcd :3a:00.0: Port change event, 4-1, id 3, portsc: 
>> 0xb0202e2
>> [  433.902842] xhci_hcd :3a:00.0: resume root hub
>> [  433.902845] xhci_hcd :3a:00.0: handle_port_status: starting port 
>> polling.
>> [  433.902877] xhci_hcd :3a:00.0: xhci_resume: starting port polling.
>> [  433.902889] xhci_hcd :3a:00.0: xhci_hub_status_data: stopping port 
>> polling.
>> [  433.902891] xhci_hcd :3a:00.0: hcd_pci_runtime_resume: 0
>> [  433.902919] usb usb4: usb wakeup-resume
>> [  433.902942] usb usb4: usb auto-resume
>> [  433.902966] hub 4-0:1.0: hub_resume
>> ...
>> 
>> However the warm-reset never success, the asserted PCI PME keeps the
>> runtime-resume, warm-reset and runtime-suspend loop which never bring it back
>> and causing spurious interrupts floods.
>> 
>> After some trial and errors, the issue goes away if LPM on the SMSC hub
>> is disabled. Digging further, enabling and disabling LPM during runtime

Re: [PATCH v3] usb: Add a new quirk to let buggy hub enable and disable LPM during suspend and resume

2019-10-03 Thread Alan Stern
On Fri, 4 Oct 2019, Kai-Heng Feng wrote:

> Dell WD15 dock has a topology like this:
> /:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 1M
> |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/7p, 5000M
> |__ Port 2: Dev 3, If 0, Class=Vendor Specific Class, 
> Driver=r8152, 5000M
> 
> Their IDs:
> Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
> Bus 004 Device 002: ID 0424:5537 Standard Microsystems Corp.
> Bus 004 Device 004: ID 0bda:8153 Realtek Semiconductor Corp.
> 
> Ethernet cannot be detected after plugging ethernet cable to the dock,
> the hub and roothub get runtime resumed and runtime suspended
> immediately:
> ...
> [  433.315169] xhci_hcd :3a:00.0: hcd_pci_runtime_resume: 0
> [  433.315204] usb usb4: usb auto-resume
> [  433.315226] hub 4-0:1.0: hub_resume
> [  433.315239] xhci_hcd :3a:00.0: Get port status 4-1 read: 0x10202e2, 
> return 0x10343
> [  433.315264] usb usb4-port1: status 0343 change 0001
> [  433.315279] xhci_hcd :3a:00.0: clear port1 connect change, portsc: 
> 0x10002e2
> [  433.315293] xhci_hcd :3a:00.0: Get port status 4-2 read: 0x2a0, return 
> 0x2a0
> [  433.317012] xhci_hcd :3a:00.0: xhci_hub_status_data: stopping port 
> polling.
> [  433.422282] xhci_hcd :3a:00.0: Get port status 4-1 read: 0x10002e2, 
> return 0x343
> 
> At this point the SMSC hub (usb 4-1) enters into compliance mode
> (USB_SS_PORT_LS_COMP_MOD), and USB core tries to warm-reset it,
> 
> [  433.422307] usb usb4-port1: do warm reset
> [  433.422311] usb 4-1: device reset not allowed in state 8
> [  433.422339] hub 4-0:1.0: state 7 ports 2 chg 0002 evt 
> [  433.422346] xhci_hcd :3a:00.0: Get port status 4-1 read: 0x10002e2, 
> return 0x343
> [  433.422356] usb usb4-port1: do warm reset
> [  433.422358] usb 4-1: device reset not allowed in state 8
> [  433.422428] xhci_hcd :3a:00.0: set port remote wake mask, actual port 
> 0 status  = 0xf0002e2
> [  433.422455] xhci_hcd :3a:00.0: set port remote wake mask, actual port 
> 1 status  = 0xe0002a0
> [  433.422465] hub 4-0:1.0: hub_suspend
> [  433.422475] usb usb4: bus auto-suspend, wakeup 1
> [  433.426161] xhci_hcd :3a:00.0: xhci_hub_status_data: stopping port 
> polling.
> [  433.466209] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
> [  433.510204] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
> [  433.554051] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
> [  433.598235] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
> [  433.642154] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
> [  433.686204] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
> [  433.730205] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
> [  433.774203] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
> [  433.818207] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
> [  433.862040] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
> [  433.862053] xhci_hcd :3a:00.0: xhci_hub_status_data: stopping port 
> polling.
> [  433.862077] xhci_hcd :3a:00.0: xhci_suspend: stopping port polling.
> [  433.862096] xhci_hcd :3a:00.0: // Setting command ring address to 
> 0x8578fc001
> [  433.862312] xhci_hcd :3a:00.0: hcd_pci_runtime_suspend: 0
> [  433.862445] xhci_hcd :3a:00.0: PME# enabled
> [  433.902376] xhci_hcd :3a:00.0: restoring config space at offset 0xc 
> (was 0x0, writing 0x20)
> [  433.902395] xhci_hcd :3a:00.0: restoring config space at offset 0x4 
> (was 0x10, writing 0x100403)
> [  433.902490] xhci_hcd :3a:00.0: PME# disabled
> [  433.902504] xhci_hcd :3a:00.0: enabling bus mastering
> [  433.902547] xhci_hcd :3a:00.0: // Setting command ring address to 
> 0x8578fc001
> [  433.902649] pcieport :00:1b.0: PME: Spurious native interrupt!
> [  433.902839] xhci_hcd :3a:00.0: Port change event, 4-1, id 3, portsc: 
> 0xb0202e2
> [  433.902842] xhci_hcd :3a:00.0: resume root hub
> [  433.902845] xhci_hcd :3a:00.0: handle_port_status: starting port 
> polling.
> [  433.902877] xhci_hcd :3a:00.0: xhci_resume: starting port polling.
> [  433.902889] xhci_hcd :3a:00.0: xhci_hub_status_data: stopping port 
> polling.
> [  433.902891] xhci_hcd :3a:00.0: hcd_pci_runtime_resume: 0
> [  433.902919] usb usb4: usb wakeup-resume
> [  433.902942] usb usb4: usb auto-resume
> [  433.902966] hub 4-0:1.0: hub_resume
> ...
> 
> However the warm-reset never success, the asserted PCI PME keeps the
> runtime-resume, warm-reset and runtime-suspend loop which never bring it back
> and causing spurious interrupts floods.
> 
> After some trial and errors, the issue goes away if LPM on the SMSC hub
> is disabled. Digging further, enabling and disabling LPM during runtime
> resume and runtime suspend respectively can solve the issue.
> 
> So bring back the old LPM behavior as a quirk and use it for the SMSC
> hub to s

[PATCH v3] usb: Add a new quirk to let buggy hub enable and disable LPM during suspend and resume

2019-10-03 Thread Kai-Heng Feng
Dell WD15 dock has a topology like this:
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 1M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/7p, 5000M
|__ Port 2: Dev 3, If 0, Class=Vendor Specific Class, Driver=r8152, 
5000M

Their IDs:
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 004 Device 002: ID 0424:5537 Standard Microsystems Corp.
Bus 004 Device 004: ID 0bda:8153 Realtek Semiconductor Corp.

Ethernet cannot be detected after plugging ethernet cable to the dock,
the hub and roothub get runtime resumed and runtime suspended
immediately:
...
[  433.315169] xhci_hcd :3a:00.0: hcd_pci_runtime_resume: 0
[  433.315204] usb usb4: usb auto-resume
[  433.315226] hub 4-0:1.0: hub_resume
[  433.315239] xhci_hcd :3a:00.0: Get port status 4-1 read: 0x10202e2, 
return 0x10343
[  433.315264] usb usb4-port1: status 0343 change 0001
[  433.315279] xhci_hcd :3a:00.0: clear port1 connect change, portsc: 
0x10002e2
[  433.315293] xhci_hcd :3a:00.0: Get port status 4-2 read: 0x2a0, return 
0x2a0
[  433.317012] xhci_hcd :3a:00.0: xhci_hub_status_data: stopping port 
polling.
[  433.422282] xhci_hcd :3a:00.0: Get port status 4-1 read: 0x10002e2, 
return 0x343

At this point the SMSC hub (usb 4-1) enters into compliance mode
(USB_SS_PORT_LS_COMP_MOD), and USB core tries to warm-reset it,

[  433.422307] usb usb4-port1: do warm reset
[  433.422311] usb 4-1: device reset not allowed in state 8
[  433.422339] hub 4-0:1.0: state 7 ports 2 chg 0002 evt 
[  433.422346] xhci_hcd :3a:00.0: Get port status 4-1 read: 0x10002e2, 
return 0x343
[  433.422356] usb usb4-port1: do warm reset
[  433.422358] usb 4-1: device reset not allowed in state 8
[  433.422428] xhci_hcd :3a:00.0: set port remote wake mask, actual port 0 
status  = 0xf0002e2
[  433.422455] xhci_hcd :3a:00.0: set port remote wake mask, actual port 1 
status  = 0xe0002a0
[  433.422465] hub 4-0:1.0: hub_suspend
[  433.422475] usb usb4: bus auto-suspend, wakeup 1
[  433.426161] xhci_hcd :3a:00.0: xhci_hub_status_data: stopping port 
polling.
[  433.466209] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
[  433.510204] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
[  433.554051] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
[  433.598235] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
[  433.642154] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
[  433.686204] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
[  433.730205] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
[  433.774203] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
[  433.818207] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
[  433.862040] xhci_hcd :3a:00.0: port 0 polling in bus suspend, waiting
[  433.862053] xhci_hcd :3a:00.0: xhci_hub_status_data: stopping port 
polling.
[  433.862077] xhci_hcd :3a:00.0: xhci_suspend: stopping port polling.
[  433.862096] xhci_hcd :3a:00.0: // Setting command ring address to 
0x8578fc001
[  433.862312] xhci_hcd :3a:00.0: hcd_pci_runtime_suspend: 0
[  433.862445] xhci_hcd :3a:00.0: PME# enabled
[  433.902376] xhci_hcd :3a:00.0: restoring config space at offset 0xc (was 
0x0, writing 0x20)
[  433.902395] xhci_hcd :3a:00.0: restoring config space at offset 0x4 (was 
0x10, writing 0x100403)
[  433.902490] xhci_hcd :3a:00.0: PME# disabled
[  433.902504] xhci_hcd :3a:00.0: enabling bus mastering
[  433.902547] xhci_hcd :3a:00.0: // Setting command ring address to 
0x8578fc001
[  433.902649] pcieport :00:1b.0: PME: Spurious native interrupt!
[  433.902839] xhci_hcd :3a:00.0: Port change event, 4-1, id 3, portsc: 
0xb0202e2
[  433.902842] xhci_hcd :3a:00.0: resume root hub
[  433.902845] xhci_hcd :3a:00.0: handle_port_status: starting port polling.
[  433.902877] xhci_hcd :3a:00.0: xhci_resume: starting port polling.
[  433.902889] xhci_hcd :3a:00.0: xhci_hub_status_data: stopping port 
polling.
[  433.902891] xhci_hcd :3a:00.0: hcd_pci_runtime_resume: 0
[  433.902919] usb usb4: usb wakeup-resume
[  433.902942] usb usb4: usb auto-resume
[  433.902966] hub 4-0:1.0: hub_resume
...

However the warm-reset never success, the asserted PCI PME keeps the
runtime-resume, warm-reset and runtime-suspend loop which never bring it back
and causing spurious interrupts floods.

After some trial and errors, the issue goes away if LPM on the SMSC hub
is disabled. Digging further, enabling and disabling LPM during runtime
resume and runtime suspend respectively can solve the issue.

So bring back the old LPM behavior as a quirk and use it for the SMSC
hub to solve the issue.

Fixes: d590c2311150 ("usb: Avoid unnecessary LPM enabling and disabling during 
suspend and resume")
Signed-off-by: Kai-Heng Feng 
---
v3:
- Add forgotten patch revision changelog.

v2:
- Explained by Alan, the hub should