Hi Alan,
I've switched to kernel 4.2 for the latest debug sessions.
In drivers/usb/host/ehci-hcd.c, ehci_stop calls
ehci_silence_controller which calls ehci_halt:
static int ehci_halt (struct ehci_hcd *ehci)
{
u32 temp;
printk(KERN_INFO "ehci_halt: entry\n");
spin_lock_irq(&ehci->lock);
printk(KERN_INFO "ehci_halt: after spin_lock_irq\n");
/* disable any irqs left enabled by previous code */
ehci_writel(ehci, 0, &ehci->regs->intr_enable);
printk(KERN_INFO "ehci_halt: after first ehci_writel\n");
if (ehci_is_TDI(ehci) && !tdi_in_host_mode(ehci)) {
// this branch is not entered
printk(KERN_INFO "ehci_halt: before early spin_unlock_irq\n");
spin_unlock_irq(&ehci->lock);
printk(KERN_INFO "ehci_halt: early exit\n");
return 0;
}
/*
* This routine gets called during probe before ehci->command
* has been initialized, so we can't rely on its value.
*/
ehci->command &= ~CMD_RUN;
printk(KERN_INFO "ehci_halt: before ehci_readl\n");
temp = ehci_readl(ehci, &ehci->regs->command);
// this point is never reached
printk(KERN_INFO "ehci_halt: after ehci_readl, before ehci_writel\n");
There's one call to ehci_writel in the first part, which succeeds.
Then the call of ehci_readl freezes. The name sounds like a generic
communication primitive which is used from various places, so I
didn't drill further down. If you think it might help, I will.
Here's a transcript of the output I see:
ehci-pci 0000:00:1d.0: remove, state 4
ehci-pci 0000:00:1d.0: roothub graceful disconnect
usb usb3: USB disconnect, device number 1
usb3-1: USB disconnect, device number 2
usb3-1: ep 81: release intr @ 8+64 (1.0+256) [1/0 us] mask 0001
usb_remove_hcd: calling stop
ehci-pci 0000:00:1d.0: stop
ehci_silence_controller: entry
ehci_halt: entry
ehci_halt: after spin_lock_irq
ehci_halt: after first ehci_writel
ehci_halt: before ehci_readl
thanks and cheers,
Roland
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html