Port-arm archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: pic/arm lost blocked irqs
Hi! Adam,
From: Adam Hoka <adam.hoka%gmail.com@localhost>
Date: Tue, 31 Aug 2010 11:21:03 +0200
> On Mon, 30 Aug 2010 22:31:43 +0900 (JST)
> KIYOHARA Takashi <kiyohara%kk.iij4u.or.jp@localhost> wrote:
>
> > Hi! Adam,
> >
> >
> > From: KIYOHARA Takashi <kiyohara%kk.iij4u.or.jp@localhost>
> > Date: Mon, 30 Aug 2010 21:25:31 +0900 (JST)
> >
> > > From: Adam Hoka <adam.hoka%gmail.com@localhost>
> > > Date: Mon, 30 Aug 2010 13:48:10 +0200
> > >
> > > > i saw hangups in interrupt handling too with the dm9000 driver
> > > > i have tried to port. maybe it wasnt my mistake then?
> > >
> > > That patch of me fixes a bug. However, I happen another bug, too.
> > > For instance, can you type your keyboard on tip(1)(or cu(1)) of Host
> > > toward the console of your devkit9000?
> > >
> > > My smsh(4) works again with typing keyboard.
> >
> >
> > Maybe, it is this. ;-)
> >
> > arm/pic/pic.c:pic_deliver_irqs() --
> >
> > for (;;) {
> > pending_irqs = pic_find_pending_irqs_by_ipl(pic, irq_base,
> > *ipending, ipl);
> > :
> > if (pending_irqs == 0) {
> > irq_count += 32;
> > if (__predict_true(irq_count >=
> > pic->pic_maxsources))
> > break;
> > :
> > }
> > :
> > do {
> > :
> > pending_irqs = pic_find_pending_irqs_by_ipl(pic,
> > irq_base, *ipending, ipl);
> > } while (pending_irqs);
> > :
> > }
> > :
> > if (atomic_and_32_nv(&pic->pic_pending_ipls, ~ipl_mask) == 0)
> > atomic_and_32(&pic_pending_pics, ~__BIT(pic->pic_id));
> >
> >
> > com uses intr-74 and gpio uses intr between 29 and 34, both IPL_HIGH
> > (IPL_SERIAL). If gpio interrupts in comintr(intr 74), pic_pending_pics
> > is cleared, and ipending not cleared.
> >
> >
> > Index: pic.c
> > ===================================================================
> > RCS file: /cvsroot/src/sys/arch/arm/pic/pic.c,v
> > retrieving revision 1.4
> > diff -u -r1.4 pic.c
> > --- pic.c 30 Dec 2008 05:43:14 -0000 1.4
> > +++ pic.c 30 Aug 2010 13:29:23 -0000
> > @@ -196,7 +196,7 @@
> > #endif
> > uint32_t pending_irqs;
> > uint32_t blocked_irqs;
> > - int irq;
> > + int irq, dispatched;
> > bool progress = false;
> >
> > KASSERT(pic->pic_pending_ipls & ipl_mask);
> > @@ -206,6 +206,7 @@
> > irq_count = 0;
> > #endif
> >
> > + dispatched = 0;
> > for (;;) {
> > pending_irqs = pic_find_pending_irqs_by_ipl(pic, irq_base,
> > *ipending, ipl);
> > @@ -214,14 +215,19 @@
> > if (pending_irqs == 0) {
> > #if PIC_MAXSOURCES > 32
> > irq_count += 32;
> > - if (__predict_true(irq_count >=
> > pic->pic_maxsources))
> > - break;
> > - irq_base += 32;
> > - ipending++;
> > - iblocked++;
> > - if (irq_base >= pic->pic_maxsources) {
> > + if (__predict_true(irq_count >=
> > pic->pic_maxsources)) {
> > + if (!dispatched)
> > + break;
> > + irq_base = 0;
> > + irq_count = 0;
> > + dispatched = 0;
> > ipending = pic->pic_pending_irqs;
> > iblocked = pic->pic_blocked_irqs;
> > + } else {
> > + irq_base += 32;
> > + ipending++;
> > + iblocked++;
> > + KASSERT(irq_base <= pic->pic_maxsources);
> > }
> > continue;
> > #else
> > @@ -251,6 +257,7 @@
> > atomic_or_32(iblocked, blocked_irqs);
> > atomic_or_32(&pic_blocked_pics, __BIT(pic->pic_id));
> > }
> > + dispatched = 1;
> > }
> >
> > KASSERT(progress);
> >
> >
> > In my case, this fix clear that problem. ;-)
> >
> > Thanks,
> > --
> > kiyohara
>
> yes it does fix the hangup with my dme driver port
> will you commit?
Done.
Thanks,
--
kiyohara
Home |
Main Index |
Thread Index |
Old Index