void arm_do_pending_intr(int pcpl) { struct cpu_info *ci = curcpu(); static int processing = 0; int oldirqstate; oldirqstate = disable_interrupts(I32_bit); if (processing == 1) { /* Don't use splx... we are here already! */ arm_intr_func.setipl(pcpl); restore_interrupts(oldirqstate); return; } #define DO_SOFTINT(si, ipl) \ if ((ci->ci_ipending & arm_smask[pcpl]) & \ SI_TO_IRQBIT(si)) { \ ci->ci_ipending &= ~SI_TO_IRQBIT(si); \ arm_intr_func.setipl(ipl); \ restore_interrupts(oldirqstate); \ softintr_dispatch(si); \ oldirqstate = disable_interrupts(I32_bit); \ } do { DO_SOFTINT(SI_SOFTTTY, IPL_SOFTTTY); DO_SOFTINT(SI_SOFTNET, IPL_SOFTNET); DO_SOFTINT(SI_SOFTCLOCK, IPL_SOFTCLOCK); DO_SOFTINT(SI_SOFT, IPL_SOFT); } while (ci->ci_ipending & arm_smask[pcpl]); /* Don't use splx... we are here already! */ arm_intr_func.setipl(pcpl); processing = 0; restore_interrupts(oldirqstate); }
void s3c2xx0_do_pending(int enable_int) { static __cpu_simple_lock_t processing = __SIMPLELOCK_UNLOCKED; int oldirqstate, irqstate, spl_save; if (__cpu_simple_lock_try(&processing) == 0) return; spl_save = current_spl_level; oldirqstate = irqstate = disable_interrupts(I32_bit); if (enable_int) irqstate &= ~I32_bit; #define DO_SOFTINT(si,ipl) \ if (get_pending_softint() & SI_TO_IRQBIT(si)) { \ softint_pending &= ~SI_TO_IRQBIT(si); \ __raise(ipl); \ restore_interrupts(irqstate); \ softintr_dispatch(si); \ disable_interrupts(I32_bit); \ s3c2xx0_setipl(spl_save); \ } do { DO_SOFTINT(SI_SOFTSERIAL, IPL_SOFTSERIAL); DO_SOFTINT(SI_SOFTNET, IPL_SOFTNET); DO_SOFTINT(SI_SOFTCLOCK, IPL_SOFTCLOCK); DO_SOFTINT(SI_SOFT, IPL_SOFT); } while (get_pending_softint()); __cpu_simple_unlock(&processing); restore_interrupts(oldirqstate); }