Date: Tue, 28 Mar 2006 00:10:21 +0400 (MSD) From: Oleg Sharoiko <os@rsu.ru> To: John Baldwin <jhb@freebsd.org> Cc: freebsd-scsi@freebsd.org, Andrey Beresovsky <and@rsu.ru> Subject: Re: Boot hangs on ips0: resetting adapter, this may take up to 5 minutes Message-ID: <20060327234908.K831@wolf.os.rsu.ru> In-Reply-To: <200603241718.49362.jhb@freebsd.org> References: <20060215102749.D58480@brain.cc.rsu.ru> <200603241607.55075.jhb@freebsd.org> <20060325003610.J11600@brain.cc.rsu.ru> <200603241718.49362.jhb@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, 24 Mar 2006, John Baldwin wrote: JB>> I've found an interesting thread on netbsd mailing list. JB>> http://mail-index.netbsd.org/port-amd64/2006/03/ JB>> With subject "Re: Bug in x86 ioapic interrupt code for devices with shared JB>> interrupts?". May this relate to my problems? JB>Well, there is one possibly interesting patch for bge in there, (the JB>one from the linux driver) but I'm not sure if it would really help or JB>not. John, can it be possible that interrupts are incorrectly delivered to bge_intr? Is it possible that these interrupts are generated by some different device? I've added simple debug out to the bge_intr. This is from the normal interrupts: statusword: 0001 bge0: BGE_PCI_PCISTATE: 1210 And this is from interrupt storm: bge0: statusword: 0000 bge0: BGE_PCI_PCISTATE: 1212 According to linux driver bit 0x02 (called PCISTATE_INT_NOT_ACTIVE) of BGE_PCI_PCISTATE register means that device is not generating interrups. Here is an extract from linux driver (distributed by broadcom - manufacturer of bge cards): /* In INTx mode, it is possible for the interrupt to arrive at * the CPU before the status block posted prior to the interrupt. * Reading the PCI State register will confirm whether the * interrupt is ours and will flush the status block. */ if ((sblk->status & SD_STATUS_UPDATED) || !(tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) { ... } else { /* shared interrupt */ handled = 0; } out: return IRQ_RETVAL(handled); As I understand in Linux when driver interrupt routine returns 0 it means that this interrupt was not for this driver and kernel should handle this case. I don't know how to implement this in FreeBSD. -- Oleg Sharoiko. Software and Network Engineer Computer Center of Rostov State University.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20060327234908.K831>