Date: Fri, 9 May 2008 03:52:29 GMT From: Andrew Thompson <thompsa@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 141357 for review Message-ID: <200805090352.m493qTIA034026@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=141357 Change 141357 by thompsa@thompsa_burger on 2008/05/09 03:52:02 Fix some vap handling. - Only start the vaps if the init routine passed. - Remove double vap init in NDIS. Affected files ... .. //depot/projects/vap/sys/compat/ndis/kern_ndis.c#7 edit .. //depot/projects/vap/sys/compat/ndis/ntoskrnl_var.h#7 edit .. //depot/projects/vap/sys/compat/ndis/subr_ndis.c#7 edit .. //depot/projects/vap/sys/compat/ndis/subr_ntoskrnl.c#7 edit .. //depot/projects/vap/sys/dev/bwi/if_bwi.c#21 edit .. //depot/projects/vap/sys/dev/if_ndis/if_ndis.c#22 edit .. //depot/projects/vap/sys/dev/ipw/if_ipw.c#19 edit .. //depot/projects/vap/sys/dev/ral/rt2560.c#35 edit .. //depot/projects/vap/sys/dev/ral/rt2661.c#33 edit .. //depot/projects/vap/sys/dev/wi/if_wi.c#32 edit Differences ... ==== //depot/projects/vap/sys/compat/ndis/kern_ndis.c#7 (text+ko) ==== @@ -101,6 +101,11 @@ static struct nd_head ndis_devhead; +#ifdef NDIS_DEBUG +int ndis_debug = 0; +SYSCTL_INT(_debug, OID_AUTO, ndis, CTLFLAG_RW, &ndis_debug, 0, + "ndis debug level"); +#endif /* * This allows us to export our symbols to other modules. * Note that we call ourselves 'ndisapi' to avoid a namespace ==== //depot/projects/vap/sys/compat/ndis/ntoskrnl_var.h#7 (text+ko) ==== @@ -35,6 +35,22 @@ #ifndef _NTOSKRNL_VAR_H_ #define _NTOSKRNL_VAR_H_ +#define NDIS_DEBUG +#ifdef NDIS_DEBUG +#define DPRINTF(fmt, args...) \ + do { if (ndis_debug > 0) printf("NDIS: " fmt, ##args); } while (0) +#define DPRINTFN(n, fmt, args...) \ + do { if (ndis_debug >= (n)) printf("NDIS: " fmt, ##args); } while (0) +#define NDISTRACE(fmt, args...) \ + if (ndis_debug >= 10) \ + printf("NDIS: %s(" fmt ")\n", __func__, ##args); +extern int ndis_debug; +#else +#define DPRINTF(x) +#define DPRINTFN(x) +#define NDISTRACE(x) +#endif + #define MTX_NTOSKRNL_SPIN_LOCK "NDIS thread lock" /* ==== //depot/projects/vap/sys/compat/ndis/subr_ndis.c#7 (text+ko) ==== @@ -362,6 +362,8 @@ void *path; void *unused; { + NDISTRACE("%p, %p, %p, %p", wrapper, drv, path, unused); + /* * As of yet, I haven't come up with a compelling * reason to define a private NDIS wrapper structure, @@ -392,6 +394,8 @@ ndis_handle handle; void *syspec; { + NDISTRACE("%p, %p", handle, syspec); + /* Nothing to see here, move along. */ return; } @@ -402,6 +406,8 @@ ndis_miniport_characteristics *characteristics; int len; { + NDISTRACE("%p, %p, %u", handle, characteristics, len); + ndis_miniport_characteristics *ch = NULL; driver_object *drv; @@ -513,6 +519,8 @@ ndis_handle *cfg; ndis_handle wrapctx; { + NDISTRACE("%p, %p, %p", status, cfg, wrapctx); + *cfg = wrapctx; *status = NDIS_STATUS_SUCCESS; @@ -810,6 +818,8 @@ NdisAllocateSpinLock(lock) ndis_spin_lock *lock; { + NDISTRACE("%p", lock); + KeInitializeSpinLock(&lock->nsl_spinlock); lock->nsl_kirql = 0; @@ -828,6 +838,8 @@ NdisFreeSpinLock(lock) ndis_spin_lock *lock; { + NDISTRACE("%p", lock); + #ifdef notdef KeInitializeSpinLock(&lock->nsl_spinlock); lock->nsl_kirql = 0; @@ -932,6 +944,8 @@ char *dest; device_t dev; + NDISTRACE("%p, %u, %u, %p, %u", adapter, slot, offset, buf, len); + block = (ndis_miniport_block *)adapter; dest = buf; if (block == NULL) @@ -970,6 +984,8 @@ void *buf; uint32_t len; { + NDISTRACE("%p, %u, %u, %p, %u", adapter, slot, offset, buf, len); + ndis_miniport_block *block; int i; char *dest; ==== //depot/projects/vap/sys/compat/ndis/subr_ntoskrnl.c#7 (text+ko) ==== @@ -657,6 +657,8 @@ { void *buf; + NDISTRACE("%u, %zu, %u", pooltype, len, tag); + buf = malloc(len, M_DEVBUF, M_NOWAIT|M_ZERO); if (buf == NULL) return(NULL); @@ -668,6 +670,8 @@ ExFreePool(buf) void *buf; { + NDISTRACE("%p", buf); + free(buf, M_DEVBUF); return; } @@ -681,6 +685,8 @@ { custom_extension *ce; + NDISTRACE("%p, %p, %u, %p", drv, clid, extlen, ext); + ce = ExAllocatePoolWithTag(NonPagedPool, sizeof(custom_extension) + extlen, 0); @@ -703,6 +709,8 @@ list_entry *e; custom_extension *ce; + NDISTRACE("%p, %p", drv, clid); + /* * Sanity check. Our dummy bus drivers don't have * any driver extentions. @@ -735,6 +743,9 @@ { device_object *dev; + NDISTRACE("%p, %u, str, %u, %u, %u, %p", drv, devextlen, devtype, + devchars, exclusive, newdev); + dev = ExAllocatePoolWithTag(NonPagedPool, sizeof(device_object), 0); if (dev == NULL) return(STATUS_INSUFFICIENT_RESOURCES); @@ -815,6 +826,8 @@ { device_object *prev; + NDISTRACE("%p", dev); + if (dev == NULL) return; @@ -846,6 +859,8 @@ { device_object *d; + NDISTRACE("%p", dev); + if (dev == NULL) return (NULL); @@ -869,6 +884,9 @@ { irp *ip; + NDISTRACE("%u, %p, %p, %u, %p, %p, %p", func, dobj, buf, len, off, + event, status); + ip = IoBuildAsynchronousFsdRequest(func, dobj, buf, len, off, status); if (ip == NULL) return(NULL); @@ -889,6 +907,8 @@ irp *ip; io_stack_location *sl; + NDISTRACE("%u, %p, %p, %u, %p, %p", func, dobj, buf, len, off, status); + ip = IoAllocateIrp(dobj->do_stacksize, TRUE); if (ip == NULL) return(NULL); @@ -965,6 +985,9 @@ io_stack_location *sl; uint32_t buflen; + NDISTRACE("%u, %p, %p, %u, %p, %u, %u, %p, %p", iocode, dobj, ibuf, + ilen, obuf, olen, isinternal, event, status); + ip = IoAllocateIrp(dobj->do_stacksize, TRUE); if (ip == NULL) return(NULL); @@ -1051,6 +1074,8 @@ { irp *i; + NDISTRACE("%u, %u", stsize, chargequota); + i = ExAllocatePoolWithTag(NonPagedPool, IoSizeOfIrp(stsize), 0); if (i == NULL) return (NULL); @@ -1067,6 +1092,8 @@ { irp *associrp; + NDISTRACE("%p, %u", ip, stsize); + associrp = IoAllocateIrp(stsize, FALSE); if (associrp == NULL) return(NULL); @@ -1085,6 +1112,8 @@ IoFreeIrp(ip) irp *ip; { + NDISTRACE("%p", ip); + ExFreePool(ip); return; } @@ -1095,6 +1124,8 @@ uint16_t psize; uint8_t ssize; { + NDISTRACE("%p, %u, %u", io, psize, ssize); + bzero((char *)io, IoSizeOfIrp(ssize)); io->irp_size = psize; io->irp_stackcnt = ssize; @@ -1113,6 +1144,8 @@ { uint8_t allocflags; + NDISTRACE("%p, %u", ip, status); + allocflags = ip->irp_allocflags; IoInitializeIrp(ip, ip->irp_size, ip->irp_stackcnt); ip->irp_iostat.isb_status = status; @@ -1142,6 +1175,8 @@ { cancel_func cfunc; + NDISTRACE("%p", ip); + IoAcquireCancelSpinLock(&ip->irp_cancelirql); cfunc = IoSetCancelRoutine(ip, NULL); ip->irp_cancel = TRUE; @@ -1163,6 +1198,8 @@ uint32_t status; driver_dispatch disp; + NDISTRACE("%p, %p", dobj, ip); + drvobj = dobj->do_drvobj; if (ip->irp_currentstackloc <= 0) @@ -1190,6 +1227,8 @@ io_stack_location *sl; completion_func cf; + NDISTRACE("%p, %u", ip, prioboost); + ip->irp_pendingreturned = IoGetCurrentIrpStackLocation(ip)->isl_ctl & SL_PENDING_RETURNED; sl = (io_stack_location *)(ip + 1); @@ -1346,6 +1385,10 @@ { uint8_t curirql; + NDISTRACE("%p, %p, %p, %p, %u, %u, %u, %u, %u, %u, %u", iobj, svcfunc, + svcctx, lock, vector, irql, syncirql, imode, shared, affinity, + savefloat); + *iobj = ExAllocatePoolWithTag(NonPagedPool, sizeof(kinterrupt), 0); if (*iobj == NULL) return(STATUS_INSUFFICIENT_RESOURCES); @@ -1372,6 +1415,8 @@ { uint8_t irql; + NDISTRACE("%p", iobj); + if (iobj == NULL) return; @@ -1391,6 +1436,8 @@ { device_object *attached; + NDISTRACE("%p, %p", src, dst); + mtx_lock(&ntoskrnl_dispatchlock); attached = IoGetAttachedDevice(dst); attached->do_attacheddev = src; @@ -1407,6 +1454,8 @@ { device_object *tail; + NDISTRACE("%p", topdev); + mtx_lock(&ntoskrnl_dispatchlock); /* First, break the chain. */ @@ -2205,6 +2254,9 @@ uint32_t tag; uint16_t depth; { + NDISTRACE("%p, %p, %p, %u, %zu, %u, %u", lookaside, allocfunc, + freefunc, flags, size, tag, depth); + bzero((char *)lookaside, sizeof(paged_lookaside_list)); if (size < sizeof(slist_entry)) @@ -2242,6 +2294,8 @@ void *buf; void (*freefunc)(void *); + NDISTRACE("%p", lookaside); + freefunc = lookaside->nll_l.gl_freefunc; while((buf = ntoskrnl_popsl(&lookaside->nll_l.gl_listhead)) != NULL) MSCALL1(freefunc, buf); @@ -2260,6 +2314,9 @@ uint32_t tag; uint16_t depth; { + NDISTRACE("%p, %p, %p, %u, %zu, %u, %u", lookaside, allocfunc, + freefunc, flags, size, tag, depth); + bzero((char *)lookaside, sizeof(npaged_lookaside_list)); if (size < sizeof(slist_entry)) @@ -2297,6 +2354,8 @@ void *buf; void (*freefunc)(void *); + NDISTRACE("%p", lookaside); + freefunc = lookaside->nll_l.gl_freefunc; while((buf = ntoskrnl_popsl(&lookaside->nll_l.gl_listhead)) != NULL) MSCALL1(freefunc, buf); @@ -2486,6 +2545,9 @@ mdl *m; int zone = 0; + NDISTRACE("%p, %u, %u, %u, %p", vaddr, len, secondarybuf, chargequota, + iopkt); + if (MmSizeOfMdl(vaddr, len) > MDL_ZONE_SIZE) m = ExAllocatePoolWithTag(NonPagedPool, MmSizeOfMdl(vaddr, len), 0); @@ -2529,6 +2591,8 @@ IoFreeMdl(m) mdl *m; { + NDISTRACE("%p", m); + if (m == NULL) return; @@ -2548,6 +2612,8 @@ void *addr; size_t pagelength = roundup(size, PAGE_SIZE); + NDISTRACE("%u, %ju", size, highest); + addr = ExAllocatePoolWithTag(NonPagedPool, pagelength, 0); return(addr); @@ -2565,6 +2631,9 @@ void *addr; size_t pagelength = roundup(size, PAGE_SIZE); + NDISTRACE("%u, %ju, %ju, %ju, %u", size, lowest, highest, boundary, + cachetype); + addr = ExAllocatePoolWithTag(NonPagedPool, pagelength, 0); return(addr); @@ -2574,6 +2643,8 @@ MmFreeContiguousMemory(base) void *base; { + NDISTRACE("%p", base); + ExFreePool(base); } @@ -2583,6 +2654,8 @@ uint32_t size; uint32_t cachetype; { + NDISTRACE("%p", base); + ExFreePool(base); } @@ -2613,6 +2686,8 @@ vm_offset_t *mdl_pages; int pagecnt, i; + NDISTRACE("%p", m); + pagecnt = SPAN_PAGES(m->mdl_byteoffset, m->mdl_bytecount); if (pagecnt > (m->mdl_size - sizeof(mdl)) / sizeof(vm_offset_t *)) @@ -2874,6 +2949,8 @@ { io_workitem *iw; + NDISTRACE("%p", dobj); + iw = uma_zalloc(iw_zone, M_NOWAIT); if (iw == NULL) return(NULL); @@ -2893,6 +2970,8 @@ IoFreeWorkItem(iw) io_workitem *iw; { + NDISTRACE("%p", iw); + uma_zfree(iw_zone, iw); return; } @@ -2909,6 +2988,8 @@ io_workitem *cur; uint8_t irql; + NDISTRACE("%p, %p, %u, %p", iw, iw_func, qtype, ctx); + kq = wq_queues + iw->iw_idx; KeAcquireSpinLock(&kq->kq_lock, &irql); @@ -2996,6 +3077,7 @@ io_workitem *cur; uint8_t irql; + NDISTRACE("%p, %u", w, qtype); /* * We need to do a special sanity test to make sure @@ -3244,6 +3326,8 @@ driver_object *drv; uint16_t **name; + NDISTRACE("%p, %u, %u, %p, %p", devobj, regprop, buflen, prop, reslen); + drv = devobj->do_drvobj; switch (regprop) { @@ -3265,6 +3349,8 @@ kmutant *kmutex; uint32_t level; { + NDISTRACE("%p, %u", kmutex, level); + InitializeListHead((&kmutex->km_header.dh_waitlisthead)); kmutex->km_abandoned = FALSE; kmutex->km_apcdisable = 1; @@ -3315,6 +3401,8 @@ uint32_t type; uint8_t state; { + NDISTRACE("%p, %u, %u", kevent, type, state); + InitializeListHead((&kevent->k_header.dh_waitlisthead)); kevent->k_header.dh_sigstate = state; if (type == EVENT_TYPE_NOTIFY) @@ -3331,6 +3419,8 @@ { uint32_t prevstate; + NDISTRACE("%p", kevent); + mtx_lock(&ntoskrnl_dispatchlock); prevstate = kevent->k_header.dh_sigstate; kevent->k_header.dh_sigstate = FALSE; @@ -3351,6 +3441,8 @@ struct thread *td; wb_ext *we; + NDISTRACE("%p, %u, %u", kevent, increment, kwait); + mtx_lock(&ntoskrnl_dispatchlock); prevstate = kevent->k_header.dh_sigstate; dh = &kevent->k_header; @@ -3398,6 +3490,8 @@ KeClearEvent(kevent) nt_kevent *kevent; { + NDISTRACE("%p", kevent); + kevent->k_header.dh_sigstate = FALSE; return; } @@ -3455,6 +3549,9 @@ { nt_objref *nr; + NDISTRACE("%p, %u, %p, %u, %p, %p", handle, reqaccess, otype, + accessmode, object, handleinfo); + nr = malloc(sizeof(nt_objref), M_DEVBUF, M_NOWAIT|M_ZERO); if (nr == NULL) return(STATUS_INSUFFICIENT_RESOURCES); @@ -3477,6 +3574,8 @@ { nt_objref *nr; + NDISTRACE("%p", object); + nr = object; TAILQ_REMOVE(&ntoskrnl_reflist, nr, link); free(nr, M_DEVBUF); @@ -3557,6 +3656,9 @@ thread_context *tc; struct proc *p; + NDISTRACE("%p, %u, %p, %p, %p, %p, %p", handle, reqaccess, objattrs, + phandle, clientid, thrfunc, thrctx); + tc = malloc(sizeof(thread_context), M_TEMP, M_NOWAIT); if (tc == NULL) return(STATUS_INSUFFICIENT_RESOURCES); @@ -3593,6 +3695,8 @@ { struct nt_objref *nr; + NDISTRACE(""); + mtx_lock(&ntoskrnl_dispatchlock); TAILQ_FOREACH(nr, &ntoskrnl_reflist, link) { if (nr->no_obj != curthread->td_proc) @@ -3617,7 +3721,7 @@ { va_list ap; - if (bootverbose) { + if (bootverbose || ndis_debug) { va_start(ap, fmt); vprintf(fmt, ap); } @@ -3824,6 +3928,8 @@ ktimer *timer; uint32_t type; { + NDISTRACE("%p, %u", timer, type); + if (timer == NULL) return; @@ -3988,6 +4094,7 @@ void *dpcfunc; void *dpcctx; { + NDISTRACE("%p, %p, %p", dpc, dpcfunc, dpcctx); if (dpc == NULL) return; @@ -4011,6 +4118,8 @@ uint8_t r; uint8_t irql; + NDISTRACE("%p, %p, %p", dpc, sysarg1, sysarg2); + if (dpc == NULL) return(FALSE); @@ -4055,6 +4164,8 @@ kdpc_queue *kq; uint8_t irql; + NDISTRACE("%p", dpc); + if (dpc == NULL) return(FALSE); @@ -4088,6 +4199,8 @@ kdpc *dpc; uint32_t imp; { + NDISTRACE("%p, %u", dpc, imp); + if (imp != KDPC_IMPORTANCE_LOW && imp != KDPC_IMPORTANCE_MEDIUM && imp != KDPC_IMPORTANCE_HIGH) @@ -4102,6 +4215,8 @@ kdpc *dpc; uint8_t cpu; { + NDISTRACE("%p, %u", dpc, cpu); + if (cpu > mp_ncpus) return; @@ -4115,6 +4230,8 @@ kdpc_queue *kq; int i; + NDISTRACE(""); + /* * Poke each DPC queue and wait * for them to drain. @@ -4150,6 +4267,8 @@ uint64_t curtime; uint8_t pending; + NDISTRACE("%p, %ju, %u, %p", timer, duetime, period, dpc); + if (timer == NULL) return(FALSE); @@ -4217,9 +4336,14 @@ { uint8_t pending; + NDISTRACE("%p", timer); + if (timer == NULL) return(FALSE); + if (timer->k_dpc) + printf("NDIS: KeCancelTimer with pending DPC\n"); + mtx_lock(&ntoskrnl_dispatchlock); pending = timer->k_header.dh_inserted; @@ -4241,6 +4365,8 @@ KeReadStateTimer(timer) ktimer *timer; { + NDISTRACE("%p", timer); + return(timer->k_header.dh_sigstate); } ==== //depot/projects/vap/sys/dev/bwi/if_bwi.c#21 (text+ko) ==== @@ -1222,10 +1222,15 @@ bwi_init(void *xsc) { struct bwi_softc *sc = xsc; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; BWI_LOCK(sc); bwi_init_statechg(sc, 1); BWI_UNLOCK(sc); + + if (ifp->if_drv_flags & IFF_DRV_RUNNING) + ieee80211_start_all(ic); /* start all vap's */ } static void ==== //depot/projects/vap/sys/dev/if_ndis/if_ndis.c#22 (text+ko) ==== @@ -1979,8 +1979,6 @@ ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; NDIS_UNLOCK(sc); - - /* XXX force handling */ ieee80211_start_all(ic); /* start all vap's */ /* @@ -2813,10 +2811,8 @@ case SIOCSIFFLAGS: /*NDIS_LOCK(sc);*/ if (ifp->if_flags & IFF_UP) { - if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { + if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) ndis_init(sc); - ieee80211_start_all(ic); - } } else { if (ifp->if_drv_flags & IFF_DRV_RUNNING) ndis_stop(sc); ==== //depot/projects/vap/sys/dev/ipw/if_ipw.c#19 (text+ko) ==== @@ -2406,7 +2406,8 @@ ipw_init_locked(sc); IPW_UNLOCK(sc); - ieee80211_start_all(ic); + if (ifp->if_drv_flags & IFF_DRV_RUNNING) + ieee80211_start_all(ic); } static void ==== //depot/projects/vap/sys/dev/ral/rt2560.c#35 (text) ==== @@ -2751,7 +2751,8 @@ rt2560_init_locked(sc); RAL_UNLOCK(sc); - ieee80211_start_all(ic); + if (ifp->if_drv_flags & IFF_DRV_RUNNING) + ieee80211_start_all(ic); /* start all vap's */ } static void ==== //depot/projects/vap/sys/dev/ral/rt2661.c#33 (text) ==== @@ -2496,7 +2496,8 @@ rt2661_init_locked(sc); RAL_UNLOCK(sc); - ieee80211_start_all(ic); + if (ifp->if_drv_flags & IFF_DRV_RUNNING) + ieee80211_start_all(ic); /* start all vap's */ } void ==== //depot/projects/vap/sys/dev/wi/if_wi.c#32 (text+ko) ==== @@ -704,7 +704,8 @@ wi_init_locked(sc); WI_UNLOCK(sc); - ieee80211_start_all(ic); + if (ifp->if_drv_flags & IFF_DRV_RUNNING) + ieee80211_start_all(ic); /* start all vap's */ } static void
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200805090352.m493qTIA034026>