On Wed, May 14, 2014 at 10:32:21AM -0400, Alan Stern wrote: > On Tue, 13 May 2014, Dr. Werner Fink wrote: > > > On Tue, May 13, 2014 at 06:10:46PM +0200, Dr. Werner Fink wrote: > > > On Tue, May 13, 2014 at 11:59:38AM -0400, Alan Stern wrote: > > > > > > > > What about something like this instead? > > > > > > > > masked_status = status & (INTR_MASK | STS_FLR); > > > > > > > > /* Shared IRQ? */ > > > > if (!masked_status || unlikely(ehci->rh_state == EHCI_RH_HALTED)) { > > > > + if (status & STS_RECL) { > > > > + ehci_writel(ehci, STS_RECL, &ehci->regs->status); > > > > + ehci_readl(ehci, &ehci->regs->status); > > > > + } > > > > spin_unlock_irqrestore(&ehci->lock, flags); > > > > return IRQ_NONE; > > > > } > > > > > > > > That should do about the same thing as your change, except for > > > > returning IRQ_NONE rather than IRQ_HANDLED. > > > > > > I'll forward this to my home to try it out. It will take some time > > > as my wife is also working on this system. Nevertheless I'm curious > > > about it. > > > > The code is active now: > > ... > > > it works. > > Does it still work if you omit the ehci_readl() call? > > If you want to submit a patch containing this fix, please add a quirk > flag for it. And a comment explaining why the ehci_writel() call is > needed. During debugging and rebooting I've seen the problem again: speedy:linux # dmesg | grep nobody -A20 [ 3703.558137] irq 16: nobody cared (try booting with the "irqpoll" option) [ 3703.558140] Pid: 0, comm: swapper/1 Not tainted 3.7.10-1.32-desktop #6 [ 3703.558141] Call Trace: [ 3703.558149] [<ffffffff81004818>] dump_trace+0x88/0x300 [ 3703.558153] [<ffffffff8158b543>] dump_stack+0x69/0x6f [ 3703.558157] [<ffffffff810d6c4f>] __report_bad_irq+0x2f/0xe0 [ 3703.558159] [<ffffffff810d7158>] note_interrupt+0x1e8/0x240 [ 3703.558163] [<ffffffff810d4772>] handle_irq_event_percpu+0xc2/0x250 [ 3703.558165] [<ffffffff810d4947>] handle_irq_event+0x47/0x70 [ 3703.558168] [<ffffffff810d7c50>] handle_fasteoi_irq+0x60/0x100 [ 3703.558169] [<ffffffff810046c8>] handle_irq+0x18/0x30 [ 3703.558171] [<ffffffff810043a2>] do_IRQ+0x52/0xd0 [ 3703.558174] [<ffffffff8159856d>] common_interrupt+0x6d/0x6d [ 3703.558179] [<ffffffff8132038c>] intel_idle+0xec/0x160 [ 3703.558182] [<ffffffff8145317d>] cpuidle_idle_call+0x9d/0x330 [ 3703.558185] [<ffffffff8100be0a>] cpu_idle+0x6a/0xe0 [ 3703.558189] [<ffffffff815840f4>] start_secondary+0x20d/0x212 [ 3703.558190] handlers: [ 3703.558192] [<ffffffff813f2510>] usb_hcd_irq [ 3703.558203] [<ffffffffa0281940>] rtl8139_interrupt [8139too] [ 3703.558203] Disabling IRQ #16 speedy:linux # grep 16: /proc/interrupts 16: 105 191676 8248 0 0 0 0 0 IO-APIC-fasteoi ehci_hcd:usb1, eth1 Now the network is very slow. Sidemark ... I've tried to check the Vendor/Product indentifier but run into the problem that I'd like to see the hrdware and not the driver vendor and product. That is I'd like to check for the added lines: drivers/usb/core/quirks.c: /* INTEL Hub */ { USB_DEVICE(0x8087, 0x0024), .driver_info = USB_QUIRK_STATUS_RECL }, include/linux/usb/quirks.h: /* device may cause the STS_RECL status register bit in IRQ if it is not used. This is a readonly bit, which is used to detect an empty asynchronous schedule. */ #define USB_QUIRK_STATUS_RECL 0x00000080 in drivers/usb/host/ehci-hcd.c : ehci_irq() where I've added struct usb_device *hub; hub = hcd->self.root_hub; if (hub->quirks & USB_QUIRK_STATUS_RECL) printk_once(KERN_WARNING FW_BUG "QUIRK: INTEL hub found!"); printk_once(KERN_WARNING FW_BUG "EHCI Hub: Vendor %x Product %x", le16_to_cpu(hub->descriptor.idVendor), le16_to_cpu(hub->descriptor.idProduct)); but then seen the Linux Foundation as Vendor and not the hardware hub. Werner
Attachment:
pgpeKLae986xG.pgp
Description: PGP signature