cvs commit: src/sys/compat/ndis kern_ndis.c ndis_var.h ntoskrnl_var.h subr_ndis.c subr_ntoskrnl.c src/sys/dev/if_ndis if_ndis.c if_ndisvar.h

Bill Paul wpaul at FreeBSD.org
Tue Oct 18 12:52:16 PDT 2005


wpaul       2005-10-18 19:52:15 UTC

  FreeBSD src repository

  Modified files:
    sys/compat/ndis      kern_ndis.c ndis_var.h ntoskrnl_var.h 
                         subr_ndis.c subr_ntoskrnl.c 
    sys/dev/if_ndis      if_ndis.c if_ndisvar.h 
  Log:
  Another round of cleanups and fixes:
  
  - Change ndis_return() from a DPC to a workitem so that it doesn't
    run at DISPATCH_LEVEL (with the dispatcher lock held).
  
  - In if_ndis.c, submit packets to the stack via (*ifp->if_input)() in
    a workitem instead of doing it directly in ndis_rxeof(), because
    ndis_rxeof() runs in a DPC, and hence at DISPATCH_LEVEL. This
    implies that the 'dispatch level' mutex for the current CPU is
    being held, and we don't want to call if_input while holding
    any locks.
  
  - Reimplement IoConnectInterrupt()/IoDisconnectInterrupt(). The original
    approach I used to track down the interrupt resource (by scanning
    the device tree starting at the nexus) is prone to problems when
    two devices share an interrupt. (E.g removing ndis1 might disable
    interrupts for ndis0.) The new approach is to multiplex all the
    NDIS interrupts through a common internal dispatcher (ntoskrnl_intr())
    and allow IoConnectInterrupt()/IoDisconnectInterrupt() to add or
    remove interrupts from the dispatch list.
  
  - Implement KeAcquireInterruptSpinLock() and KeReleaseInterruptSpinLock().
  
  - Change the DPC and workitem threads to use the KeXXXSpinLock
    API instead of mtx_lock_spin()/mtx_unlock_spin().
  
  - Simplify the NdisXXXPacket routines by creating an actual
    packet pool structure and using the InterlockedSList routines
    to manage the packet queue.
  
  - Only honor the value returned by OID_GEN_MAXIMUM_SEND_PACKETS
    for serialized drivers. For deserialized drivers, we now create
    a packet array of 64 entries. (The Microsoft DDK documentation
    says that for deserialized miniports, OID_GEN_MAXIMUM_SEND_PACKETS
    is ignored, and the driver for the Marvell 8335 chip, which is
    a deserialized miniport, returns 1 when queried.)
  
  - Clean up timer handling in subr_ntoskrnl.
  
  - Add the following conditional debugging code:
          NTOSKRNL_DEBUG_TIMERS - add debugging and stats for timers
          NDIS_DEBUG_PACKETS - add extra sanity checking for NdisXXXPacket API
          NTOSKRNL_DEBUG_SPINLOCKS - add test for spinning too long
  
  - In kern_ndis.c, always start the HAL first and shut it down last,
    since Windows spinlocks depend on it. Ntoskrnl should similarly be
    started second and shut down next to last.
  
  Revision  Changes    Path
  1.88      +93 -25    src/sys/compat/ndis/kern_ndis.c
  1.44      +19 -3     src/sys/compat/ndis/ndis_var.h
  1.39      +12 -0     src/sys/compat/ndis/ntoskrnl_var.h
  1.96      +93 -92    src/sys/compat/ndis/subr_ndis.c
  1.74      +328 -273  src/sys/compat/ndis/subr_ntoskrnl.c
  1.108     +98 -12    src/sys/dev/if_ndis/if_ndis.c
  1.25      +5 -4      src/sys/dev/if_ndis/if_ndisvar.h


More information about the cvs-src mailing list