Port-arm archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: pic/arm lost blocked irqs
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?
--
NetBSD - Simplicity is prerequisite for reliability
Home |
Main Index |
Thread Index |
Old Index