From ff18363a3e5e60f38c8f7a52c7e7f4ea1c8b797f Mon Sep 17 00:00:00 2001 From: jhb Date: Wed, 25 Oct 2000 05:19:40 +0000 Subject: - Overhaul the software interrupt code to use interrupt threads for each type of software interrupt. Roughly, what used to be a bit in spending now maps to a swi thread. Each thread can have multiple handlers, just like a hardware interrupt thread. - Instead of using a bitmask of pending interrupts, we schedule the specific software interrupt thread to run, so spending, NSWI, and the shandlers array are no longer needed. We can now have an arbitrary number of software interrupt threads. When you register a software interrupt thread via sinthand_add(), you get back a struct intrhand that you pass to sched_swi() when you wish to schedule your swi thread to run. - Convert the name of 'struct intrec' to 'struct intrhand' as it is a bit more intuitive. Also, prefix all the members of struct intrhand with 'ih_'. - Make swi_net() a MI function since there is now no point in it being MD. Submitted by: cp --- sys/dev/rc/rc.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'sys/dev/rc') diff --git a/sys/dev/rc/rc.c b/sys/dev/rc/rc.c index 22c82c2..fc35bd5 100644 --- a/sys/dev/rc/rc.c +++ b/sys/dev/rc/rc.c @@ -172,6 +172,8 @@ static int rc_rcsrt[16] = { TTY_BI|TTY_PE|TTY_FE|TTY_OE }; +static struct intrhand *rc_ih; + /* Static prototypes */ static ointhand2_t rcintr; static void rc_hwreset __P((int, int, unsigned int)); @@ -268,7 +270,8 @@ rcattach(dvp) rcb->rcb_probed = RC_ATTACHED; if (!rc_started) { cdevsw_add(&rc_cdevsw); - register_swi(SWI_TTY, rcpoll); + rc_ih = sinthand_add("tty:rc", &tty_ithd, rcpoll, NULL, + SWI_TTY, 0); rc_wakeup((void *)NULL); rc_started = 1; } @@ -362,7 +365,7 @@ rcintr(unit) optr++; rc_scheduled_event++; if (val != 0 && val == rc->rc_hotchar) - setsofttty(); + sched_swi(rc_ih, SWI_NOSWITCH); } } else { /* Store also status data */ @@ -393,7 +396,7 @@ rcintr(unit) && (rc->rc_tp->t_iflag & INPCK)))) val = 0; else if (val != 0 && val == rc->rc_hotchar) - setsofttty(); + sched_swi(rc_ih, SWI_NOSWITCH); optr[0] = val; optr[INPUT_FLAGS_SHIFT] = iack; optr++; @@ -440,7 +443,7 @@ rcintr(unit) if ((iack & MCR_CDchg) && !(rc->rc_flags & RC_MODCHG)) { rc_scheduled_event += LOTS_OF_EVENTS; rc->rc_flags |= RC_MODCHG; - setsofttty(); + sched_swi(rc_ih, SWI_NOSWITCH); } goto more_intrs; } @@ -481,7 +484,7 @@ rcintr(unit) if (!(rc->rc_flags & RC_DOXXFER)) { rc_scheduled_event += LOTS_OF_EVENTS; rc->rc_flags |= RC_DOXXFER; - setsofttty(); + sched_swi(rc_ih, SWI_NOSWITCH); } } } -- cgit v1.1