Date: Tue, 25 Oct 2005 20:20:14 GMT From: John Baldwin <jhb@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 85846 for review Message-ID: <200510252020.j9PKKE3B045657@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=85846 Change 85846 by jhb@jhb_slimer on 2005/10/25 20:19:31 IFC @85845 - loop back intr_event stuff. Affected files ... .. //depot/projects/smpng/sys/alpha/alpha/interrupt.c#36 integrate .. //depot/projects/smpng/sys/alpha/isa/isa.c#15 integrate .. //depot/projects/smpng/sys/amd64/amd64/intr_machdep.c#13 integrate .. //depot/projects/smpng/sys/amd64/include/intr_machdep.h#5 integrate .. //depot/projects/smpng/sys/amd64/isa/atpic.c#10 integrate .. //depot/projects/smpng/sys/amd64/pci/pci_cfgreg.c#8 integrate .. //depot/projects/smpng/sys/arm/arm/intr.c#11 integrate .. //depot/projects/smpng/sys/boot/ofw/libofw/devicename.c#9 integrate .. //depot/projects/smpng/sys/boot/ofw/libofw/ofw_disk.c#11 integrate .. //depot/projects/smpng/sys/conf/kern.post.mk#48 integrate .. //depot/projects/smpng/sys/conf/kmod.mk#51 integrate .. //depot/projects/smpng/sys/dev/fe/if_fe_pccard.c#17 integrate .. //depot/projects/smpng/sys/dev/hme/if_hme.c#27 integrate .. //depot/projects/smpng/sys/dev/hme/if_hmereg.h#7 integrate .. //depot/projects/smpng/sys/dev/hme/if_hmevar.h#9 integrate .. //depot/projects/smpng/sys/dev/if_ndis/if_ndis.c#35 integrate .. //depot/projects/smpng/sys/dev/if_ndis/if_ndisvar.h#17 integrate .. //depot/projects/smpng/sys/dev/pci/pci.c#62 integrate .. //depot/projects/smpng/sys/dev/sio/sio.c#57 integrate .. //depot/projects/smpng/sys/dev/uart/uart_kbd_sun.c#6 integrate .. //depot/projects/smpng/sys/dev/uart/uart_tty.c#15 integrate .. //depot/projects/smpng/sys/i386/i386/intr_machdep.c#15 integrate .. //depot/projects/smpng/sys/i386/include/intr_machdep.h#7 integrate .. //depot/projects/smpng/sys/i386/isa/atpic.c#13 integrate .. //depot/projects/smpng/sys/i386/pci/pci_cfgreg.c#29 integrate .. //depot/projects/smpng/sys/ia64/ia64/interrupt.c#32 integrate .. //depot/projects/smpng/sys/kern/kern_clock.c#43 integrate .. //depot/projects/smpng/sys/kern/kern_intr.c#72 integrate .. //depot/projects/smpng/sys/kern/subr_taskqueue.c#26 integrate .. //depot/projects/smpng/sys/kern/subr_witness.c#142 integrate .. //depot/projects/smpng/sys/modules/sound/driver/Makefile#6 integrate .. //depot/projects/smpng/sys/powerpc/include/intr_machdep.h#6 integrate .. //depot/projects/smpng/sys/powerpc/powerpc/intr_machdep.c#7 integrate .. //depot/projects/smpng/sys/sparc64/conf/NOTES#18 integrate .. //depot/projects/smpng/sys/sparc64/include/intr_machdep.h#12 integrate .. //depot/projects/smpng/sys/sparc64/sparc64/intr_machdep.c#24 integrate .. //depot/projects/smpng/sys/sys/interrupt.h#17 integrate .. //depot/projects/smpng/sys/sys/proc.h#154 integrate .. //depot/projects/smpng/sys/sys/unistd.h#13 integrate .. //depot/projects/smpng/sys/ufs/ufs/ufs_bmap.c#15 integrate Differences ... ==== //depot/projects/smpng/sys/alpha/alpha/interrupt.c#36 (text+ko) ==== @@ -33,7 +33,7 @@ #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ /* __KERNEL_RCSID(0, "$NetBSD: interrupt.c,v 1.23 1998/02/24 07:38:01 thorpej Exp $");*/ -__FBSDID("$FreeBSD: src/sys/alpha/alpha/interrupt.c,v 1.87 2005/09/29 19:12:44 jhb Exp $"); +__FBSDID("$FreeBSD: src/sys/alpha/alpha/interrupt.c,v 1.88 2005/10/25 19:48:45 jhb Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -325,8 +325,9 @@ struct alpha_intr { LIST_ENTRY(alpha_intr) list; /* chain handlers in this hash bucket */ uintptr_t vector; /* vector to match */ - struct ithd *ithd; /* interrupt thread */ + struct intr_event *ie; /* interrupt event structure */ volatile long *cntp; /* interrupt counter */ + void (*disable)(uintptr_t); }; static struct mtx alpha_intr_hash_lock; @@ -338,7 +339,7 @@ ithds_init(void *dummy) { - mtx_init(&alpha_intr_hash_lock, "ithread table lock", NULL, MTX_SPIN); + mtx_init(&alpha_intr_hash_lock, "intr table", NULL, MTX_SPIN); } SYSINIT(ithds_init, SI_SUB_INTR, SI_ORDER_SECOND, ithds_init, NULL); @@ -371,8 +372,9 @@ return ENOMEM; i->vector = vector; i->cntp = cntp; - errcode = ithread_create(&i->ithd, vector, 0, disable, enable, - "intr:"); + i->disable = disable; + errcode = intr_event_create(&i->ie, (void *)vector, 0, + (void (*)(void *))enable, "intr:"); if (errcode) { free(i, M_DEVBUF); return errcode; @@ -384,44 +386,49 @@ } /* Second, add this handler. */ - return (ithread_add_handler(i->ithd, name, handler, arg, - ithread_priority(flags), flags, cookiep)); + return (intr_event_add_handler(i->ie, name, handler, arg, + intr_priority(flags), flags, cookiep)); } int alpha_teardown_intr(void *cookie) { - return (ithread_remove_handler(cookie)); + return (intr_event_remove_handler(cookie)); } +/* + * XXX: Alpha doesn't count stray interrupts like some of the other archs. + */ void alpha_dispatch_intr(void *frame, unsigned long vector) { int h = HASHVEC(vector); struct alpha_intr *i; - struct ithd *ithd; /* our interrupt thread */ - struct intrhand *ih; - int error; + struct intr_event *ie; + struct intr_handler *ih; + int error, thread; /* * Walk the hash bucket for this vector looking for this vector's - * interrupt thread. + * interrupt structure. */ for (i = LIST_FIRST(&alpha_intr_hash[h]); i && i->vector != vector; i = LIST_NEXT(i, list)) ; /* nothing */ + + /* No interrupt structure for this vector. */ if (i == NULL) - return; /* no ithread for this vector */ + return; - ithd = i->ithd; - KASSERT(ithd != NULL, ("interrupt vector without a thread")); + ie = i->ie; + KASSERT(ie != NULL, ("interrupt structure without an event")); /* - * As an optimization, if an ithread has no handlers, don't + * As an optimization, if an event has no handlers, don't * schedule it to run. */ - if (TAILQ_EMPTY(&ithd->it_handlers)) + if (TAILQ_EMPTY(&ie->ie_handlers)) return; atomic_add_long(i->cntp, 1); @@ -433,25 +440,32 @@ */ sched_pin(); + /* Execute all fast interrupt handlers directly. */ + thread = 0; + critical_enter(); + TAILQ_FOREACH(ih, &ie->ie_handlers, ih_next) { + if (!(ih->ih_flags & IH_FAST)) { + thread = 1; + continue; + } + CTR4(KTR_INTR, "%s: exec %p(%p) for %s", __func__, + ih->ih_handler, ih->ih_argument, ih->ih_name); + ih->ih_handler(ih->ih_argument); + } + critical_exit(); + /* - * Handle a fast interrupt if there is no actual thread for this - * interrupt by calling the handler directly without Giant. Note - * that this means that any fast interrupt handler must be MP safe. + * If the ithread needs to run, disable the source and schedule the + * thread. */ - ih = TAILQ_FIRST(&ithd->it_handlers); - if ((ih->ih_flags & IH_FAST) != 0) { - critical_enter(); - ih->ih_handler(ih->ih_argument); - critical_exit(); - } else { - if (ithd->it_disable) { + if (thread) { + if (i->disable) { CTR1(KTR_INTR, "alpha_dispatch_intr: disabling vector 0x%x", i->vector); - ithd->it_disable(ithd->it_vector); + i->disable(i->vector); } - - error = ithread_schedule(ithd); + error = intr_event_schedule_thread(ie); KASSERT(error == 0, ("got an impossible stray interrupt")); } sched_unpin(); ==== //depot/projects/smpng/sys/alpha/isa/isa.c#15 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/alpha/isa/isa.c,v 1.37 2005/09/25 19:34:54 phk Exp $"); +__FBSDID("$FreeBSD: src/sys/alpha/isa/isa.c,v 1.38 2005/10/25 19:48:45 jhb Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -389,14 +389,14 @@ struct resource *irq, void *cookie) { struct isa_intr *ii = cookie; - struct intrhand *ih, *handler = (struct intrhand *)ii->ih; - struct ithd *ithread = handler->ih_ithread; + struct intr_handler *ih, *handler = (struct intr_handler *)ii->ih; + struct intr_event *ie = handler->ih_event; int num_handlers = 0; - mtx_lock(&ithread->it_lock); - TAILQ_FOREACH(ih, &ithread->it_handlers, ih_next) + mtx_lock(&ie->ie_lock); + TAILQ_FOREACH(ih, &ie->ie_handlers, ih_next) num_handlers++; - mtx_unlock(&ithread->it_lock); + mtx_unlock(&ie->ie_lock); /* * Only disable the interrupt in hardware if there are no ==== //depot/projects/smpng/sys/amd64/amd64/intr_machdep.c#13 (text+ko) ==== @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/amd64/amd64/intr_machdep.c,v 1.15 2005/06/24 00:45:01 peter Exp $ + * $FreeBSD: src/sys/amd64/amd64/intr_machdep.c,v 1.16 2005/10/25 19:48:45 jhb Exp $ */ /* @@ -57,7 +57,7 @@ #define MAX_STRAY_LOG 5 -typedef void (*mask_fn)(uintptr_t vector); +typedef void (*mask_fn)(void *); static int intrcnt_index; static struct intsrc *interrupt_sources[NUM_IO_INTS]; @@ -81,15 +81,14 @@ vector = isrc->is_pic->pic_vector(isrc); if (interrupt_sources[vector] != NULL) return (EEXIST); - error = ithread_create(&isrc->is_ithread, (uintptr_t)isrc, 0, - (mask_fn)isrc->is_pic->pic_disable_source, + error = intr_event_create(&isrc->is_event, isrc, 0, (mask_fn)isrc->is_pic->pic_enable_source, "irq%d:", vector); if (error) return (error); mtx_lock_spin(&intr_table_lock); if (interrupt_sources[vector] != NULL) { mtx_unlock_spin(&intr_table_lock); - ithread_destroy(isrc->is_ithread); + intr_event_destroy(isrc->is_event); return (EEXIST); } intrcnt_register(isrc); @@ -115,8 +114,8 @@ isrc = intr_lookup_source(vector); if (isrc == NULL) return (EINVAL); - error = ithread_add_handler(isrc->is_ithread, name, handler, arg, - ithread_priority(flags), flags, cookiep); + error = intr_event_add_handler(isrc->is_event, name, handler, arg, + intr_priority(flags), flags, cookiep); if (error == 0) { intrcnt_updatename(isrc); isrc->is_pic->pic_enable_intr(isrc); @@ -130,7 +129,7 @@ { int error; - error = ithread_remove_handler(cookie); + error = intr_event_remove_handler(cookie); #ifdef XXX if (error == 0) intrcnt_updatename(/* XXX */); @@ -153,12 +152,11 @@ intr_execute_handlers(struct intsrc *isrc, struct intrframe *iframe) { struct thread *td; - struct ithd *it; - struct intrhand *ih; - int error, vector; + struct intr_event *ie; + struct intr_handler *ih; + int error, vector, thread; td = curthread; - td->td_intr_nesting_level++; /* * We count software interrupts when we process them. The @@ -169,11 +167,7 @@ (*isrc->is_count)++; PCPU_LAZY_INC(cnt.v_intr); - it = isrc->is_ithread; - if (it == NULL) - ih = NULL; - else - ih = TAILQ_FIRST(&it->it_handlers); + ie = isrc->is_event; /* * XXX: We assume that IRQ 0 is only used for the ISA timer @@ -183,40 +177,12 @@ if (vector == 0) clkintr_pending = 1; - if (ih != NULL && ih->ih_flags & IH_FAST) { - /* - * Execute fast interrupt handlers directly. - * To support clock handlers, if a handler registers - * with a NULL argument, then we pass it a pointer to - * a trapframe as its argument. - */ - critical_enter(); - TAILQ_FOREACH(ih, &it->it_handlers, ih_next) { - MPASS(ih->ih_flags & IH_FAST); - CTR3(KTR_INTR, "%s: executing handler %p(%p)", - __func__, ih->ih_handler, - ih->ih_argument == NULL ? iframe : - ih->ih_argument); - if (ih->ih_argument == NULL) - ih->ih_handler(iframe); - else - ih->ih_handler(ih->ih_argument); - } - isrc->is_pic->pic_eoi_source(isrc); - error = 0; - critical_exit(); - } else { - /* - * For stray and threaded interrupts, we mask and EOI the - * source. - */ + /* + * For stray interrupts, mask and EOI the source, bump the + * stray count, and log the condition. + */ + if (ie == NULL || TAILQ_EMPTY(&ie->ie_handlers)) { isrc->is_pic->pic_disable_source(isrc, PIC_EOI); - if (ih == NULL) - error = EINVAL; - else - error = ithread_schedule(it); - } - if (error == EINVAL) { (*isrc->is_straycount)++; if (*isrc->is_straycount < MAX_STRAY_LOG) log(LOG_ERR, "stray irq%d\n", vector); @@ -225,6 +191,46 @@ "too many stray irq %d's: not logging anymore\n", vector); } + + /* + * Execute fast interrupt handlers directly. + * To support clock handlers, if a handler registers + * with a NULL argument, then we pass it a pointer to + * an intrframe as its argument. + */ + td->td_intr_nesting_level++; + thread = 0; + critical_enter(); + TAILQ_FOREACH(ih, &ie->ie_handlers, ih_next) { + if (!(ih->ih_flags & IH_FAST)) { + thread = 1; + continue; + } + CTR4(KTR_INTR, "%s: exec %p(%p) for %s", __func__, + ih->ih_handler, ih->ih_argument == NULL ? iframe : + ih->ih_argument, ih->ih_name); + if (ih->ih_argument == NULL) + ih->ih_handler(iframe); + else + ih->ih_handler(ih->ih_argument); + } + + /* + * If there are any threaded handlers that need to run, + * mask the source as well as sending it an EOI. Otherwise, + * just send it an EOI but leave it unmasked. + */ + if (thread) + isrc->is_pic->pic_disable_source(isrc, PIC_EOI); + else + isrc->is_pic->pic_eoi_source(isrc); + critical_exit(); + + /* Schedule the ithread if needed. */ + if (thread) { + error = intr_event_schedule_thread(ie); + KASSERT(error == 0, ("bad stray interrupt")); + } td->td_intr_nesting_level--; } @@ -266,7 +272,7 @@ intrcnt_updatename(struct intsrc *is) { - intrcnt_setname(is->is_ithread->it_td->td_proc->p_comm, is->is_index); + intrcnt_setname(is->is_event->ie_fullname, is->is_index); } static void @@ -275,7 +281,7 @@ char straystr[MAXCOMLEN + 1]; /* mtx_assert(&intr_table_lock, MA_OWNED); */ - KASSERT(is->is_ithread != NULL, ("%s: isrc with no ithread", __func__)); + KASSERT(is->is_event != NULL, ("%s: isrc with no event", __func__)); is->is_index = intrcnt_index; intrcnt_index += 2; snprintf(straystr, MAXCOMLEN + 1, "stray irq%d", @@ -325,6 +331,6 @@ db_setup_paging(db_simple_pager, &quit, db_lines_per_page); for (i = 0; i < NUM_IO_INTS && !quit; i++, isrc++) if (*isrc != NULL) - db_dump_ithread((*isrc)->is_ithread, verbose); + db_dump_intr_event((*isrc)->is_event, verbose); } #endif ==== //depot/projects/smpng/sys/amd64/include/intr_machdep.h#5 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/amd64/include/intr_machdep.h,v 1.5 2005/01/21 06:01:20 peter Exp $ + * $FreeBSD: src/sys/amd64/include/intr_machdep.h,v 1.6 2005/10/25 19:48:46 jhb Exp $ */ #ifndef __MACHINE_INTR_MACHDEP_H__ @@ -75,7 +75,7 @@ */ struct intsrc { struct pic *is_pic; - struct ithd *is_ithread; + struct intr_event *is_event; u_long *is_count; u_long *is_straycount; u_int is_index; ==== //depot/projects/smpng/sys/amd64/isa/atpic.c#10 (text+ko) ==== @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/isa/atpic.c,v 1.15 2005/01/21 06:01:20 peter Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/isa/atpic.c,v 1.16 2005/10/25 19:48:46 jhb Exp $"); #include "opt_auto_eoi.h" #include "opt_isa.h" @@ -472,10 +472,10 @@ isrc = &atintrs[vec].at_intsrc; /* - * If we don't have an ithread, see if this is a spurious + * If we don't have an event, see if this is a spurious * interrupt. */ - if (isrc->is_ithread == NULL && (vec == 7 || vec == 15)) { + if (isrc->is_event == NULL && (vec == 7 || vec == 15)) { int port, isr; /* ==== //depot/projects/smpng/sys/amd64/pci/pci_cfgreg.c#8 (text+ko) ==== @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/pci/pci_cfgreg.c,v 1.108 2005/01/21 05:56:41 peter Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/pci/pci_cfgreg.c,v 1.109 2005/10/25 04:53:29 wpaul Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -139,11 +139,15 @@ { switch (cfgmech) { case 1: - outl(CONF1_ADDR_PORT, 0); + /* + * Do nothing for the config mechanism 1 case. + * Writing a 0 to the address port can apparently + * confuse some bridges and cause spurious + * access failures. + */ break; case 2: outb(CONF2_ENABLE_PORT, 0); - outb(CONF2_FORWARD_PORT, 0); break; } } ==== //depot/projects/smpng/sys/arm/arm/intr.c#11 (text+ko) ==== @@ -37,7 +37,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/arm/arm/intr.c,v 1.10 2005/10/03 14:17:16 cognet Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/arm/intr.c,v 1.11 2005/10/25 19:48:46 jhb Exp $"); #include <sys/param.h> #include <sys/systm.h> #include <sys/syslog.h> @@ -50,7 +50,7 @@ #include <machine/intr.h> #include <machine/cpu.h> -static struct ithd *ithreads[NIRQ]; +static struct intr_event *intr_events[NIRQ]; static int intrcnt_tab[NIRQ]; static int intrcnt_index = 0; static int last_printed = 0; @@ -61,18 +61,18 @@ arm_setup_irqhandler(const char *name, void (*hand)(void*), void *arg, int irq, int flags, void **cookiep) { - struct ithd *cur_ith; + struct intr_event *event; int error; if (irq < 0 || irq >= NIRQ) return; - cur_ith = ithreads[irq]; - if (cur_ith == NULL) { - error = ithread_create(&cur_ith, irq, 0, arm_mask_irq, - arm_unmask_irq, "intr%d:", irq); + event = intr_events[irq]; + if (event == NULL) { + error = intr_event_create(&event, (void *)irq, 0, + (void (*)(void *))arm_unmask_irq, "intr%d:", irq); if (error) return; - ithreads[irq] = cur_ith; + intr_events[irq] = event; last_printed += snprintf(intrnames + last_printed, MAXCOMLEN + 1, @@ -82,14 +82,14 @@ intrcnt_index++; } - ithread_add_handler(cur_ith, name, hand, arg, - ithread_priority(flags), flags, cookiep); + intr_event_add_handler(event, name, hand, arg, + intr_priority(flags), flags, cookiep); } int arm_remove_irqhandler(void *cookie) { - return (ithread_remove_handler(cookie)); + return (intr_event_remove_handler(cookie)); } void dosoftints(void); @@ -101,28 +101,34 @@ void arm_handler_execute(void *frame, int irqnb) { - struct ithd *ithd; - int i; - struct intrhand *ih; + struct intr_event *event; + struct intr_handler *ih; struct thread *td = curthread; + int i, thread; td->td_intr_nesting_level++; while ((i = arm_get_next_irq()) != -1) { arm_mask_irq(i); intrcnt[intrcnt_tab[i]]++; - ithd = ithreads[i]; - if (!ithd) + event = intr_events[i]; + if (!event || TAILQ_EMPTY(&event->ie_handlers)) continue; - ih = TAILQ_FIRST(&ithd->it_handlers); - if (ih && ih->ih_flags & IH_FAST) { - TAILQ_FOREACH(ih, &ithd->it_handlers, - ih_next) { + + /* Execute fast handlers. */ + thread = 0; + TAILQ_FOREACH(ih, &event->ie_handlers, ih_next) { + if (!(ih->ih_flags & IH_FAST)) + thread = 1; + else ih->ih_handler(ih->ih_argument ? ih->ih_argument : frame); - } + } + + /* Schedule thread if needed. */ + if (thread) + intr_event_schedule_thread(event); + else arm_unmask_irq(i); - } else if (ih) - ithread_schedule(ithd); } td->td_intr_nesting_level--; } ==== //depot/projects/smpng/sys/boot/ofw/libofw/devicename.c#9 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/boot/ofw/libofw/devicename.c,v 1.15 2004/01/04 23:27:31 obrien Exp $"); +__FBSDID("$FreeBSD: src/sys/boot/ofw/libofw/devicename.c,v 1.16 2005/10/25 12:49:56 marius Exp $"); #include <stand.h> #include "libofw.h" @@ -99,9 +99,13 @@ return(ENOENT); found: - if (*s != '\0') + if (path != NULL && *s != '\0') *path = s; idev = malloc(sizeof(struct ofw_devdesc)); + if (idev == NULL) { + printf("ofw_parsedev: malloc failed\n"); + return ENOMEM; + } strcpy(idev->d_path, name); idev->d_dev = dv; idev->d_type = dv->dv_type; ==== //depot/projects/smpng/sys/boot/ofw/libofw/ofw_disk.c#11 (text+ko) ==== @@ -24,13 +24,14 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/boot/ofw/libofw/ofw_disk.c,v 1.12 2005/01/05 22:16:58 imp Exp $"); +__FBSDID("$FreeBSD: src/sys/boot/ofw/libofw/ofw_disk.c,v 1.13 2005/10/25 12:51:49 marius Exp $"); /* * Disk I/O routines using Open Firmware */ #include <sys/param.h> +#include <sys/queue.h> #include <netinet/in.h> @@ -60,9 +61,18 @@ ofwd_print }; +struct opened_dev { + ihandle_t handle; + u_int count; + SLIST_ENTRY(opened_dev) link; +}; + +SLIST_HEAD(, opened_dev) opened_devs = SLIST_HEAD_INITIALIZER(opened_dev); + static int ofwd_init(void) { + return 0; } @@ -73,7 +83,6 @@ struct ofw_devdesc *dp = (struct ofw_devdesc *)devdata; daddr_t pos; int n; - int i, j; pos = dblk * 512; do { @@ -90,18 +99,47 @@ static int ofwd_open(struct open_file *f, ...) { + char path[256]; struct ofw_devdesc *dp; - phandle_t handle; + struct opened_dev *odp; va_list vl; va_start(vl, f); dp = va_arg(vl, struct ofw_devdesc *); va_end(vl); - if ((handle = OF_open(dp->d_path)) == -1) { + /* + * We're not guaranteed to be able to open a device more than once + * simultaneously and there is no OFW standard method to determine + * whether a device is already opened. Opening a device more than + * once happens to work with most OFW block device drivers but + * triggers a trap with at least the driver for the on-board SCSI + * controller in Sun Ultra 1. Upper layers and MI code expect to + * be able to open a device more than once however. As a workaround + * keep track of the opened devices and reuse the instance handle + * when asked to open an already opened device. + */ + SLIST_FOREACH(odp, &opened_devs, link) { + if (OF_instance_to_path(odp->handle, path, sizeof(path)) == -1) + continue; + if (strcmp(path, dp->d_path) == 0) { + odp->count++; + dp->d_handle = odp->handle; + return 0; + } + } + odp = malloc(sizeof(struct opened_dev)); + if (odp == NULL) { + printf("ofwd_open: malloc failed\n"); + return ENOMEM; + } + if ((odp->handle = OF_open(dp->d_path)) == -1) { printf("ofwd_open: Could not open %s\n", dp->d_path); - return 1; + free(odp); + return ENOENT; } - dp->d_handle = handle; + odp->count = 1; + SLIST_INSERT_HEAD(&opened_devs, odp, link); + dp->d_handle = odp->handle; return 0; } @@ -109,8 +147,20 @@ ofwd_close(struct open_file *f) { struct ofw_devdesc *dev = f->f_devdata; + struct opened_dev *odp; - OF_close(dev->d_handle); + SLIST_FOREACH(odp, &opened_devs, link) { + if (odp->handle == dev->d_handle) { + odp->count--; + if (odp->count == 0) { + SLIST_REMOVE(&opened_devs, odp, opened_dev, + link); + OF_close(odp->handle); + free(odp); + } + break; + } + } return 0; } @@ -124,4 +174,5 @@ static void ofwd_print(int verbose) { + } ==== //depot/projects/smpng/sys/conf/kern.post.mk#48 (text+ko) ==== @@ -1,4 +1,4 @@ -# $FreeBSD: src/sys/conf/kern.post.mk,v 1.84 2005/09/11 00:22:21 obrien Exp $ +# $FreeBSD: src/sys/conf/kern.post.mk,v 1.86 2005/10/25 09:05:07 ru Exp $ # Part of a unified Makefile for building kernels. This part includes all # the definitions that need to be after all the % directives except %RULES @@ -63,9 +63,14 @@ .endif .endif -.if defined(DEBUG) +.if !defined(DEBUG) +FULLKERNEL= ${KERNEL_KO} +.else +FULLKERNEL= ${KERNEL_KO}.debug +${KERNEL_KO}: ${FULLKERNEL} + ${OBJCOPY} --strip-debug ${FULLKERNEL} ${KERNEL_KO} install.debug reinstall.debug: gdbinit - cd ${.CURDIR}; ${MAKE} -DINSTALL_DEBUG ${.TARGET:R} + cd ${.CURDIR}; ${MAKE} ${.TARGET:R} # Install gdbinit files for kernel debugging. gdbinit: @@ -78,7 +83,7 @@ .endif .endif -${KERNEL_KO}: ${SYSTEM_DEP} vers.o +${FULLKERNEL}: ${SYSTEM_DEP} vers.o @rm -f ${.TARGET} @echo linking ${.TARGET} ${SYSTEM_LD} @@ -104,7 +109,7 @@ kernel-clean: rm -f *.o *.so *.So *.ko *.s eddep errs \ - ${KERNEL_KO} linterrs makelinks tags vers.c \ + ${FULLKERNEL} ${KERNEL_KO} linterrs makelinks tags vers.c \ vnode_if.c vnode_if.h vnode_if_newproto.h vnode_if_typedef.h \ ${MFILES:T:S/.m$/.c/} ${MFILES:T:S/.m$/.h/} \ ${CLEAN} @@ -181,7 +186,7 @@ .endif kernel-install: - @if [ ! -f ${KERNEL_KO} ] ; then \ + @if [ ! -f ${FULLKERNEL} ] ; then \ echo "You must build a kernel first." ; \ exit 1 ; \ fi @@ -200,11 +205,19 @@ fi .endif mkdir -p ${DESTDIR}${KODIR} +.if defined(DEBUG) && !defined(INSTALL_NODEBUG) + ${INSTALL} -p -m 555 -o root -g wheel ${FULLKERNEL} ${DESTDIR}${KODIR}/${KERNEL_KO} +.else ${INSTALL} -p -m 555 -o root -g wheel ${KERNEL_KO} ${DESTDIR}${KODIR} +.endif kernel-reinstall: @-chflags -R noschg ${DESTDIR}${KODIR} +.if defined(DEBUG) && !defined(INSTALL_NODEBUG) + ${INSTALL} -p -m 555 -o root -g wheel ${FULLKERNEL} ${DESTDIR}${KODIR}/${KERNEL_KO} +.else ${INSTALL} -p -m 555 -o root -g wheel ${KERNEL_KO} ${DESTDIR}${KODIR} +.endif config.o env.o hints.o vers.o vnode_if.o: ${NORMAL_C} ==== //depot/projects/smpng/sys/conf/kmod.mk#51 (text+ko) ==== @@ -1,5 +1,5 @@ # From: @(#)bsd.prog.mk 5.26 (Berkeley) 6/25/91 -# $FreeBSD: src/sys/conf/kmod.mk,v 1.196 2005/10/14 15:13:36 ru Exp $ +# $FreeBSD: src/sys/conf/kmod.mk,v 1.197 2005/10/25 09:05:07 ru Exp $ # # The include file <bsd.kmod.mk> handles building and installing loadable # kernel modules. @@ -236,21 +236,17 @@ _INSTALLFLAGS:= ${_INSTALLFLAGS${ie}} .endfor -.if !target(install.debug) && defined(DEBUG_FLAGS) -install.debug: - cd ${.CURDIR}; ${MAKE} -DINSTALL_DEBUG install -.endif - .if !target(realinstall) realinstall: _kmodinstall .ORDER: beforeinstall _kmodinstall _kmodinstall: -.if defined(DEBUG_FLAGS) && defined(INSTALL_DEBUG) +.if defined(DEBUG_FLAGS) && !defined(INSTALL_NODEBUG) ${INSTALL} -o ${KMODOWN} -g ${KMODGRP} -m ${KMODMODE} \ - ${_INSTALLFLAGS} ${FULLPROG} ${DESTDIR}${KMODDIR} + ${_INSTALLFLAGS} ${FULLPROG} ${DESTDIR}${KMODDIR}/${PROG} .else ${INSTALL} -o ${KMODOWN} -g ${KMODGRP} -m ${KMODMODE} \ ${_INSTALLFLAGS} ${PROG} ${DESTDIR}${KMODDIR} +.endif .include <bsd.links.mk> @@ -264,7 +260,6 @@ kldxref ${DESTDIR}${KMODDIR}; \ fi .endif -.endif .endif # !target(realinstall) .endif # !target(install) ==== //depot/projects/smpng/sys/dev/fe/if_fe_pccard.c#17 (text+ko) ==== @@ -22,7 +22,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/fe/if_fe_pccard.c,v 1.30 2005/09/22 05:52:54 imp Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/fe/if_fe_pccard.c,v 1.31 2005/10/25 03:49:24 imp Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -64,6 +64,7 @@ struct pccard_product mpp_product; int mpp_flags; #define MPP_MBH10302 1 +#define MPP_ANYFUNC 2 } fe_pccard_products[] = { /* These need to be first */ { PCMCIA_CARD(FUJITSU2, FMV_J181), MPP_MBH10302 }, @@ -81,31 +82,32 @@ { PCMCIA_CARD(FUJITSU, LA10S), 0 }, { PCMCIA_CARD(FUJITSU, NE200T), MPP_MBH10302 },/* Sold by Eagle */ { PCMCIA_CARD(RATOC, REX_R280), 0 }, + { PCMCIA_CARD(XIRCOM, CE), MPP_ANYFUNC }, { { NULL } } }; static int fe_pccard_probe(device_t dev) { - const struct pccard_product *pp; int error; uint32_t fcn = PCCARD_FUNCTION_UNSPEC; + const struct fe_pccard_product *pp; - /* Make sure we're a network function */ - error = pccard_get_function(dev, &fcn); - if (error != 0) - return (error); - if (fcn != PCCARD_FUNCTION_NETWORK) - return (ENXIO); - - if ((pp = pccard_product_lookup(dev, + if ((pp = (const struct fe_pccard_product *)pccard_product_lookup(dev, (const struct pccard_product *)fe_pccard_products, sizeof(fe_pccard_products[0]), NULL)) != NULL) { - if (pp->pp_name != NULL) - device_set_desc(dev, pp->pp_name); - return 0; + if (pp->mpp_product.pp_name != NULL) + device_set_desc(dev, pp->mpp_product.pp_name); + if (pp->mpp_flags & MPP_ANYFUNC) + return (0); + /* Make sure we're a network function */ + error = pccard_get_function(dev, &fcn); + if (error != 0) + return (error); + if (fcn != PCCARD_FUNCTION_NETWORK) + return (ENXIO); } - return EIO; + return (ENXIO); } static device_method_t fe_pccard_methods[] = { @@ -248,6 +250,40 @@ return 0; } +static int +sn_pccard_xircom_mac(const struct pccard_tuple *tuple, void *argp) +{ + uint8_t *enaddr = argp; + int i; + +#if 1 + /* + * We fail to map the CIS twice, for reasons unknown. We + * may fix this in the future by loading the CIS with a sane + * CIS from userland. + */ + static uint8_t defaultmac[ETHER_ADDR_LEN] = { + 0x00, 0x80, 0xc7, 0xed, 0x16, 0x7b}; + + /* Copy the MAC ADDR and return success */ + for (i = 0; i < ETHER_ADDR_LEN; i++) + enaddr[i] = defaultmac[i]; +#else + /* FUNCE is not after FUNCID, so we gotta go find it */ + if (tuple->code != 0x22) + return (0); + + /* Make sure this is a sane node */ + if (tuple->length < ETHER_ADDR_LEN + 3) + return (0); + + /* Copy the MAC ADDR and return success */ + for (i = 0; i < ETHER_ADDR_LEN; i++) + enaddr[i] = pccard_tuple_read_1(tuple, i + 3); +#endif + return (1); +} + /* >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200510252020.j9PKKE3B045657>