Date: Tue, 17 Jun 2008 16:35:57 -0700 From: Sean Bruno <sbruno@miralink.com> To: Hidetoshi Shimokawa <simokawa@FreeBSD.ORG> Cc: freebsd-firewire@freebsd.org Subject: Re: sbp_targ errors with windows initiators Message-ID: <48584A5D.2000601@miralink.com> In-Reply-To: <48572538.6040000@miralink.com> References: <4846F3F9.1080302@miralink.com> <48482800.8000501@miralink.com> <484EEF6B.7010407@miralink.com> <626eb4530806102213w3beda7a3u89efffd01d5e254b@mail.gmail.com> <4850BAA6.30501@miralink.com> <48520367.7090807@miralink.com> <4852F55E.6000208@miralink.com> <48572538.6040000@miralink.com>
next in thread | previous in thread | raw e-mail | index | archive | help
> Allrighty, I seem to have found my issue(I can't believe that it's > only affecting sbp_targ however). > > It seems that fwohci_intr_body() invoked from the interrupt handler at > fwohci_pci.c::fwohci_pci_attach() was being set with INTR_MPSAFE. It > definitely was not MPSAFE and needed Giant locked before it could > start another interrupt. Strange that this hasn't been seen in the wild. > > small diff attached: > [sbruno@desdemona > ~/work/branches/miralink.FreeBSD.6/src/sys/dev/firewire]$ svn diff > Index: fwohci_pci.c > =================================================================== > --- fwohci_pci.c (revision 5496) > +++ fwohci_pci.c (working copy) > @@ -336,7 +336,7 @@ > > err = bus_setup_intr(self, sc->irq_res, > #if FWOHCI_TASKQUEUE > - INTR_TYPE_NET | INTR_MPSAFE, > + INTR_TYPE_NET, > #else > INTR_TYPE_NET, > #endif > > This failed after a few more iterations in the same way. I enabled "OHCI_DEBUG" so I can see what events are being processed in fwohci_intr_body(). It looks like the following is the first event that is seen: fwohci0: INTERRUPT < CYC_64SECOND CYC_START BUS_RESET DMA_PRRQ > 0x00320010, 0x81430133 The DMA_PRRQ seems to cause the firewire layer to end up calling sbp_targ_recv(). The next event to occur is: fwohci0: INTERRUPT < CYC_LOST CYC_START SID DMA_PRRQ > 0x00510010, 0x81010133 This causes us to properly probe/explore the firewire bus and setup the node ids. Unfortuneatly, the first event causes an sbp_targ failure as it is not processed correctly: fwohci0: INTERRUPT < CYC_64SECOND CYC_START BUS_RESET DMA_PRRQ > 0x00320010, 0x81430133 fwohci0: BUS reset sbp_targ_recv: cannot resolve nodeid=0 sbp_targ_recv: rtcode = 6 lo == 0x0 fwohci0: INTERRUPT < CYC_LOST CYC_START SID DMA_PRRQ > 0x00510010, 0x81010133 fwohci0: node_id=0xc800ffc1, gen=4, CYCLEMASTER mode firewire0: 2 nodes, maxhop <= 1, cable IRM = 1 (me) firewire0: bus manager 1 (me) I guess that the BUS_RESET OHCI event needs to do something different that I don't fully understand. Any ideas? -- Sean Bruno MiraLink Corporation 6015 NE 80th Ave, Ste 100 Portland, OR 97218 Phone 503-621-5143 Fax 503-621-5199
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?48584A5D.2000601>