On Fri, Nov 06, 2009 at 01:39:44PM +0800, Wu Zhangjin wrote: > > > + if ((LOONGSON_INTISR & LOONGSON_INTEN) & LOONGSON_INT_BIT_INT0) { > > > + imr = inb(0x21) | (inb(0xa1) << 8); > > > + isr = inb(0x20) | (inb(0xa0) << 8); > > > + isr &= ~0x4; /* irq2 for cascade */ > > > + isr &= ~imr; > > > + irq = ffs(isr) - 1; > > > + } > > > > Any reason why you're not using i8259_irq() from <asm/i8259.h> here? > > That function not only gets the locking right, it also minimizes the number > > of accesses to the i8259 - which even on modern silicon can be stuningly > > slow. > Just asked Yanhua, He told me there is a bug in cs5536, if using the > i8259_irq() directly, we can not get the irq. and just tried it, the > kernel hang on booting. Wonderful. Even 30 years after it was built there are still new i8259 bugs :-) This is probably worth a comment in the code. Ralf