PERFORCE change 45818 for review
Sam Leffler
sam at FreeBSD.org
Fri Jan 23 15:24:29 PST 2004
http://perforce.freebsd.org/chv.cgi?CH=45818
Change 45818 by sam at sam_ebb on 2004/01/23 15:19:23
IFC
Affected files ...
.. //depot/projects/netperf+sockets/sys/alpha/alpha/support.s#2 integrate
.. //depot/projects/netperf+sockets/sys/amd64/amd64/cpu_switch.S#3 integrate
.. //depot/projects/netperf+sockets/sys/boot/i386/libi386/biosdisk.c#2 integrate
.. //depot/projects/netperf+sockets/sys/compat/ndis/kern_ndis.c#12 integrate
.. //depot/projects/netperf+sockets/sys/compat/ndis/ndis_var.h#11 integrate
.. //depot/projects/netperf+sockets/sys/compat/ndis/ntoskrnl_var.h#5 integrate
.. //depot/projects/netperf+sockets/sys/compat/ndis/subr_ndis.c#12 integrate
.. //depot/projects/netperf+sockets/sys/compat/ndis/subr_ntoskrnl.c#10 integrate
.. //depot/projects/netperf+sockets/sys/compat/svr4/svr4_misc.c#3 integrate
.. //depot/projects/netperf+sockets/sys/conf/files.i386#5 integrate
.. //depot/projects/netperf+sockets/sys/conf/files.pc98#4 integrate
.. //depot/projects/netperf+sockets/sys/conf/files.powerpc#3 integrate
.. //depot/projects/netperf+sockets/sys/conf/kern.post.mk#6 integrate
.. //depot/projects/netperf+sockets/sys/conf/kern.pre.mk#5 integrate
.. //depot/projects/netperf+sockets/sys/conf/options.i386#6 integrate
.. //depot/projects/netperf+sockets/sys/conf/options.powerpc#2 integrate
.. //depot/projects/netperf+sockets/sys/dev/acpica/acpi_pci_link.c#5 integrate
.. //depot/projects/netperf+sockets/sys/dev/amd/amd.c#2 integrate
.. //depot/projects/netperf+sockets/sys/dev/ata/ata-all.c#4 integrate
.. //depot/projects/netperf+sockets/sys/dev/ata/ata-all.h#4 integrate
.. //depot/projects/netperf+sockets/sys/dev/ata/ata-chipset.c#7 integrate
.. //depot/projects/netperf+sockets/sys/dev/ata/ata-disk.c#4 integrate
.. //depot/projects/netperf+sockets/sys/dev/ata/ata-pci.h#5 integrate
.. //depot/projects/netperf+sockets/sys/dev/ata/ata-queue.c#4 integrate
.. //depot/projects/netperf+sockets/sys/dev/ata/atapi-cd.c#4 integrate
.. //depot/projects/netperf+sockets/sys/dev/fb/fbreg.h#2 integrate
.. //depot/projects/netperf+sockets/sys/dev/firewire/fwdev.c#4 integrate
.. //depot/projects/netperf+sockets/sys/dev/firewire/fwohci.c#6 integrate
.. //depot/projects/netperf+sockets/sys/dev/firewire/fwohci_pci.c#5 integrate
.. //depot/projects/netperf+sockets/sys/dev/firewire/sbp_targ.c#5 integrate
.. //depot/projects/netperf+sockets/sys/dev/if_ndis/if_ndis.c#12 integrate
.. //depot/projects/netperf+sockets/sys/dev/if_ndis/if_ndisvar.h#6 integrate
.. //depot/projects/netperf+sockets/sys/dev/lnc/if_lnc_pci.c#2 integrate
.. //depot/projects/netperf+sockets/sys/dev/pccard/pccarddevs#5 integrate
.. //depot/projects/netperf+sockets/sys/dev/pccard/pccarddevs.h#5 integrate
.. //depot/projects/netperf+sockets/sys/dev/sound/pcm/ac97.c#3 integrate
.. //depot/projects/netperf+sockets/sys/dev/sound/pcm/dsp.c#4 integrate
.. //depot/projects/netperf+sockets/sys/dev/sound/pcm/dsp.h#2 integrate
.. //depot/projects/netperf+sockets/sys/dev/sound/pcm/sound.c#4 integrate
.. //depot/projects/netperf+sockets/sys/dev/sound/pcm/sound.h#3 integrate
.. //depot/projects/netperf+sockets/sys/dev/sound/pcm/vchan.c#3 integrate
.. //depot/projects/netperf+sockets/sys/dev/syscons/scgfbrndr.c#2 integrate
.. //depot/projects/netperf+sockets/sys/dev/syscons/schistory.c#2 integrate
.. //depot/projects/netperf+sockets/sys/dev/syscons/scterm-dumb.c#2 integrate
.. //depot/projects/netperf+sockets/sys/dev/syscons/scterm-sc.c#2 integrate
.. //depot/projects/netperf+sockets/sys/dev/syscons/syscons.c#3 integrate
.. //depot/projects/netperf+sockets/sys/dev/usb/umass.c#5 integrate
.. //depot/projects/netperf+sockets/sys/dev/usb/usbdevs#10 integrate
.. //depot/projects/netperf+sockets/sys/dev/usb/usbdevs.h#10 integrate
.. //depot/projects/netperf+sockets/sys/dev/usb/usbdevs_data.h#10 integrate
.. //depot/projects/netperf+sockets/sys/fs/devfs/devfs_rule.c#2 integrate
.. //depot/projects/netperf+sockets/sys/geom/bde/g_bde_crypt.c#2 integrate
.. //depot/projects/netperf+sockets/sys/geom/geom_dev.c#2 integrate
.. //depot/projects/netperf+sockets/sys/geom/geom_disk.c#3 integrate
.. //depot/projects/netperf+sockets/sys/geom/geom_event.c#4 integrate
.. //depot/projects/netperf+sockets/sys/geom/geom_subr.c#4 integrate
.. //depot/projects/netperf+sockets/sys/gnu/ext2fs/ext2_readwrite.c#2 integrate
.. //depot/projects/netperf+sockets/sys/i386/conf/NOTES#7 integrate
.. //depot/projects/netperf+sockets/sys/i386/i386/p4tcc.c#1 branch
.. //depot/projects/netperf+sockets/sys/i386/i386/swtch.s#2 integrate
.. //depot/projects/netperf+sockets/sys/i386/include/specialreg.h#2 integrate
.. //depot/projects/netperf+sockets/sys/ia64/ia64/interrupt.c#3 integrate
.. //depot/projects/netperf+sockets/sys/ia64/ia64/trap.c#4 integrate
.. //depot/projects/netperf+sockets/sys/isofs/cd9660/cd9660_vnops.c#2 integrate
.. //depot/projects/netperf+sockets/sys/kern/kern_exit.c#3 integrate
.. //depot/projects/netperf+sockets/sys/kern/kern_fork.c#5 integrate
.. //depot/projects/netperf+sockets/sys/kern/kern_jail.c#3 integrate
.. //depot/projects/netperf+sockets/sys/kern/kern_ktrace.c#3 integrate
.. //depot/projects/netperf+sockets/sys/kern/kern_prot.c#4 integrate
.. //depot/projects/netperf+sockets/sys/kern/kern_shutdown.c#2 integrate
.. //depot/projects/netperf+sockets/sys/kern/kern_tc.c#3 integrate
.. //depot/projects/netperf+sockets/sys/kern/kern_thread.c#6 integrate
.. //depot/projects/netperf+sockets/sys/kern/kern_uuid.c#2 integrate
.. //depot/projects/netperf+sockets/sys/kern/sys_generic.c#3 integrate
.. //depot/projects/netperf+sockets/sys/kern/uipc_sem.c#2 integrate
.. //depot/projects/netperf+sockets/sys/kern/uipc_syscalls.c#8 integrate
.. //depot/projects/netperf+sockets/sys/modules/firewire/Makefile#2 integrate
.. //depot/projects/netperf+sockets/sys/modules/if_ef/Makefile#2 integrate
.. //depot/projects/netperf+sockets/sys/modules/ncp/Makefile#2 integrate
.. //depot/projects/netperf+sockets/sys/modules/netgraph/Makefile#2 integrate
.. //depot/projects/netperf+sockets/sys/modules/nwfs/Makefile#3 integrate
.. //depot/projects/netperf+sockets/sys/modules/smbfs/Makefile#3 integrate
.. //depot/projects/netperf+sockets/sys/modules/syscons/Makefile#2 integrate
.. //depot/projects/netperf+sockets/sys/net/if.c#5 integrate
.. //depot/projects/netperf+sockets/sys/net/if_media.h#4 integrate
.. //depot/projects/netperf+sockets/sys/net/if_ppp.c#3 integrate
.. //depot/projects/netperf+sockets/sys/net/if_spppsubr.c#3 integrate
.. //depot/projects/netperf+sockets/sys/net/if_vlan_var.h#4 integrate
.. //depot/projects/netperf+sockets/sys/net80211/ieee80211_ioctl.c#10 integrate
.. //depot/projects/netperf+sockets/sys/netgraph/ng_cisco.c#2 integrate
.. //depot/projects/netperf+sockets/sys/netgraph/ng_socket.c#3 integrate
.. //depot/projects/netperf+sockets/sys/netinet/tcp_input.c#7 integrate
.. //depot/projects/netperf+sockets/sys/netinet/tcp_output.c#3 integrate
.. //depot/projects/netperf+sockets/sys/netinet/tcp_syncache.c#5 integrate
.. //depot/projects/netperf+sockets/sys/netipsec/ipsec.h#2 integrate
.. //depot/projects/netperf+sockets/sys/netipsec/ipsec_output.c#2 integrate
.. //depot/projects/netperf+sockets/sys/netipsec/xform_ipip.c#2 integrate
.. //depot/projects/netperf+sockets/sys/pc98/conf/NOTES#6 integrate
.. //depot/projects/netperf+sockets/sys/pc98/pc98/sio.c#4 integrate
.. //depot/projects/netperf+sockets/sys/pci/if_rl.c#5 integrate
.. //depot/projects/netperf+sockets/sys/pci/if_sk.c#3 integrate
.. //depot/projects/netperf+sockets/sys/powerpc/conf/GENERIC#2 integrate
.. //depot/projects/netperf+sockets/sys/powerpc/include/float.h#2 integrate
.. //depot/projects/netperf+sockets/sys/powerpc/include/sc_machdep.h#1 branch
.. //depot/projects/netperf+sockets/sys/powerpc/ofw/ofw_syscons.c#1 branch
.. //depot/projects/netperf+sockets/sys/powerpc/ofw/ofw_syscons.h#1 branch
.. //depot/projects/netperf+sockets/sys/powerpc/powerpc/clock.c#2 integrate
.. //depot/projects/netperf+sockets/sys/powerpc/powerpc/machdep.c#5 integrate
.. //depot/projects/netperf+sockets/sys/powerpc/powerpc/sc_machdep.c#1 branch
.. //depot/projects/netperf+sockets/sys/powerpc/powerpc/trap_subr.S#2 integrate
.. //depot/projects/netperf+sockets/sys/security/mac_portacl/mac_portacl.c#2 integrate
.. //depot/projects/netperf+sockets/sys/sys/_task.h#1 branch
.. //depot/projects/netperf+sockets/sys/sys/jail.h#2 integrate
.. //depot/projects/netperf+sockets/sys/sys/proc.h#5 integrate
.. //depot/projects/netperf+sockets/sys/sys/systm.h#4 integrate
.. //depot/projects/netperf+sockets/sys/sys/taskqueue.h#2 integrate
.. //depot/projects/netperf+sockets/sys/sys/user.h#2 integrate
.. //depot/projects/netperf+sockets/sys/ufs/ffs/ffs_vnops.c#2 integrate
Differences ...
==== //depot/projects/netperf+sockets/sys/alpha/alpha/support.s#2 (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/alpha/alpha/support.s,v 1.15 2003/07/24 07:49:45 marcel Exp $
+ * $FreeBSD: src/sys/alpha/alpha/support.s,v 1.16 2004/01/19 21:27:10 phk Exp $
*/
/*
@@ -680,8 +680,10 @@
longjmp_botch:
lda a0, longjmp_botchmsg
- mov ra, a1
- CALL(panic)
+ mov 0, a1
+ mov 0, a2
+ mov ra, a3
+ CALL(__panic)
call_pal PAL_bugchk
.data
==== //depot/projects/netperf+sockets/sys/amd64/amd64/cpu_switch.S#3 (text+ko) ====
@@ -34,7 +34,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/amd64/amd64/cpu_switch.S,v 1.144 2003/11/17 08:58:12 peter Exp $
+ * $FreeBSD: src/sys/amd64/amd64/cpu_switch.S,v 1.145 2004/01/23 01:04:28 peter Exp $
*/
#include <machine/asmacros.h>
@@ -243,7 +243,7 @@
pushq %r14
pushq %r15
pushq $sw0_1
- call panic
+ call __panic
sw0_1: .asciz "cpu_throw: no newthread supplied"
badsw2:
@@ -263,7 +263,7 @@
pushq %r14
pushq %r15
pushq $sw0_2
- call panic
+ call __panic
sw0_2: .asciz "cpu_switch: no curthread supplied"
badsw3:
@@ -283,7 +283,7 @@
pushq %r14
pushq %r15
pushq $sw0_3
- call panic
+ call __panic
sw0_3: .asciz "cpu_switch: no newthread supplied"
#endif
==== //depot/projects/netperf+sockets/sys/boot/i386/libi386/biosdisk.c#2 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/boot/i386/libi386/biosdisk.c,v 1.40 2003/08/25 23:28:31 obrien Exp $");
+__FBSDID("$FreeBSD: src/sys/boot/i386/libi386/biosdisk.c,v 1.41 2004/01/21 23:22:29 jhb Exp $");
/*
* BIOS disk device handling.
@@ -867,7 +867,7 @@
*/
x = min(FLOPPY_BOUNCEBUF, (unsigned)blks);
bbuf = malloc(x * 2 * BIOSDISK_SECSIZE);
- if (((u_int32_t)VTOP(bbuf) & 0xffff0000) == ((u_int32_t)VTOP(dest + x * BIOSDISK_SECSIZE) & 0xffff0000)) {
+ if (((u_int32_t)VTOP(bbuf) & 0xffff0000) == ((u_int32_t)VTOP(bbuf + x * BIOSDISK_SECSIZE) & 0xffff0000)) {
breg = bbuf;
} else {
breg = bbuf + x * BIOSDISK_SECSIZE;
@@ -1000,7 +1000,7 @@
x = min(FLOPPY_BOUNCEBUF, (unsigned)blks);
bbuf = malloc(x * 2 * BIOSDISK_SECSIZE);
- if (((u_int32_t)VTOP(bbuf) & 0xffff0000) == ((u_int32_t)VTOP(dest + x * BIOSDISK_SECSIZE) & 0xffff0000)) {
+ if (((u_int32_t)VTOP(bbuf) & 0xffff0000) == ((u_int32_t)VTOP(bbuf + x * BIOSDISK_SECSIZE) & 0xffff0000)) {
breg = bbuf;
} else {
breg = bbuf + x * BIOSDISK_SECSIZE;
==== //depot/projects/netperf+sockets/sys/compat/ndis/kern_ndis.c#12 (text+ko) ====
@@ -31,23 +31,25 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/ndis/kern_ndis.c,v 1.29 2004/01/13 22:49:45 obrien Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/ndis/kern_ndis.c,v 1.32 2004/01/21 19:14:52 wpaul Exp $");
#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/unistd.h>
#include <sys/types.h>
#include <sys/errno.h>
#include <sys/callout.h>
#include <sys/socket.h>
#include <sys/queue.h>
#include <sys/sysctl.h>
-#include <sys/systm.h>
+#include <sys/proc.h>
#include <sys/malloc.h>
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/conf.h>
-#include <sys/taskqueue.h>
#include <sys/kernel.h>
+#include <sys/kthread.h>
#include <machine/bus.h>
#include <machine/resource.h>
#include <sys/bus.h>
@@ -85,7 +87,35 @@
__stdcall static void ndis_resetdone_func(ndis_handle, ndis_status, uint8_t);
__stdcall static void ndis_sendrsrcavail_func(ndis_handle);
+struct ndis_req {
+ void (*nr_func)(void *);
+ void *nr_arg;
+ int nr_exit;
+ STAILQ_ENTRY(ndis_req) link;
+};
+
+struct ndisproc {
+ struct ndisqhead *np_q;
+ struct proc *np_p;
+};
+
+static int ndis_create_kthreads(void);
+static void ndis_destroy_kthreads(void);
+static void ndis_stop_thread(int);
+static int ndis_enlarge_thrqueue(int);
+static int ndis_shrink_thrqueue(int);
+static void ndis_runq(void *);
+
+extern struct mtx_pool *ndis_mtxpool;
static uma_zone_t ndis_packet_zone, ndis_buffer_zone;
+struct mtx *ndis_thr_mtx;
+static STAILQ_HEAD(ndisqhead, ndis_req) ndis_ttodo;
+struct ndisqhead ndis_itodo;
+struct ndisqhead ndis_free;
+static int ndis_jobs = 32;
+
+static struct ndisproc ndis_tproc;
+static struct ndisproc ndis_iproc;
/*
* This allows us to export our symbols to other modules.
@@ -111,9 +141,15 @@
ndis_buffer_zone = uma_zcreate("NDIS buffer",
sizeof(ndis_buffer), NULL, NULL, NULL,
NULL, UMA_ALIGN_PTR, 0);
+
+ ndis_create_kthreads();
+
break;
case MOD_UNLOAD:
case MOD_SHUTDOWN:
+ /* stop kthreads */
+ ndis_destroy_kthreads();
+
/* Shut down subsystems */
ndis_libfini();
ntoskrnl_libfini();
@@ -132,7 +168,268 @@
DEV_MODULE(ndisapi, ndis_modevent, NULL);
MODULE_VERSION(ndisapi, 1);
+/*
+ * We create two kthreads for the NDIS subsystem. One of them is a task
+ * queue for performing various odd jobs. The other is an swi thread
+ * reserved exclusively for running interrupt handlers. The reason we
+ * have our own task queue is that there are some cases where we may
+ * need to sleep for a significant amount of time, and if we were to
+ * use one of the taskqueue threads, we might delay the processing
+ * of other pending tasks which might need to run right away. We have
+ * a separate swi thread because we don't want our interrupt handling
+ * to be delayed either.
+ *
+ * By default there are 32 jobs available to start, and another 8
+ * are added to the free list each time a new device is created.
+ */
+
+static void
+ndis_runq(arg)
+ void *arg;
+{
+ struct ndis_req *r = NULL, *die = NULL;
+ struct ndisproc *p;
+
+ p = arg;
+
+ while (1) {
+ kthread_suspend(p->np_p, 0);
+
+ /* Look for any jobs on the work queue. */
+
+ mtx_pool_lock(ndis_mtxpool, ndis_thr_mtx);
+ while(STAILQ_FIRST(p->np_q) != NULL) {
+ r = STAILQ_FIRST(p->np_q);
+ STAILQ_REMOVE_HEAD(p->np_q, link);
+ mtx_pool_unlock(ndis_mtxpool, ndis_thr_mtx);
+
+ /* Do the work. */
+
+ if (r->nr_func != NULL)
+ (*r->nr_func)(r->nr_arg);
+
+ mtx_pool_lock(ndis_mtxpool, ndis_thr_mtx);
+ STAILQ_INSERT_HEAD(&ndis_free, r, link);
+
+ /* Check for a shutdown request */
+
+ if (r->nr_exit == TRUE)
+ die = r;
+ }
+ mtx_pool_unlock(ndis_mtxpool, ndis_thr_mtx);
+
+ /* Bail if we were told to shut down. */
+
+ if (die != NULL)
+ break;
+ }
+
+ wakeup(die);
+ mtx_lock(&Giant);
+ kthread_exit(0);
+}
+
+static int
+ndis_create_kthreads()
+{
+ struct ndis_req *r;
+ int i, error = 0;
+
+ ndis_thr_mtx = mtx_pool_alloc(ndis_mtxpool);
+ STAILQ_INIT(&ndis_ttodo);
+ STAILQ_INIT(&ndis_itodo);
+ STAILQ_INIT(&ndis_free);
+
+ for (i = 0; i < ndis_jobs; i++) {
+ r = malloc(sizeof(struct ndis_req), M_DEVBUF, M_WAITOK);
+ if (r == NULL) {
+ error = ENOMEM;
+ break;
+ }
+ STAILQ_INSERT_HEAD(&ndis_free, r, link);
+ }
+
+ if (error == 0) {
+ ndis_tproc.np_q = &ndis_ttodo;
+ error = kthread_create(ndis_runq, &ndis_tproc,
+ &ndis_tproc.np_p, RFHIGHPID, 0, "ndis taskqueue");
+ }
+
+ if (error == 0) {
+ ndis_iproc.np_q = &ndis_itodo;
+ error = kthread_create(ndis_runq, &ndis_iproc,
+ &ndis_iproc.np_p, RFHIGHPID, 0, "ndis swi");
+ }
+
+ if (error) {
+ while ((r = STAILQ_FIRST(&ndis_free)) != NULL) {
+ STAILQ_REMOVE_HEAD(&ndis_free, link);
+ free(r, M_DEVBUF);
+ }
+ return(error);
+ }
+
+ return(0);
+}
+
+static void
+ndis_destroy_kthreads()
+{
+ struct ndis_req *r;
+
+ /* Stop the threads. */
+
+ ndis_stop_thread(NDIS_TASKQUEUE);
+ ndis_stop_thread(NDIS_SWI);
+
+ /* Destroy request structures. */
+ while ((r = STAILQ_FIRST(&ndis_free)) != NULL) {
+ STAILQ_REMOVE_HEAD(&ndis_free, link);
+ free(r, M_DEVBUF);
+ }
+
+ return;
+}
+
+static void
+ndis_stop_thread(t)
+ int t;
+{
+ struct ndis_req *r;
+ struct timeval tv;
+ struct ndisqhead *q;
+ struct proc *p;
+
+ if (t == NDIS_TASKQUEUE) {
+ q = &ndis_ttodo;
+ p = ndis_tproc.np_p;
+ } else {
+ q = &ndis_itodo;
+ p = ndis_iproc.np_p;
+ }
+
+ /* Create and post a special 'exit' job. */
+
+ mtx_pool_lock(ndis_mtxpool, ndis_thr_mtx);
+ r = STAILQ_FIRST(&ndis_free);
+ STAILQ_REMOVE_HEAD(&ndis_free, link);
+ r->nr_func = NULL;
+ r->nr_arg = NULL;
+ r->nr_exit = TRUE;
+ STAILQ_INSERT_TAIL(q, r, link);
+ mtx_pool_unlock(ndis_mtxpool, ndis_thr_mtx);
+
+ kthread_resume(p);
+
+ /* wait for thread exit */
+
+ tv.tv_sec = 60;
+ tv.tv_usec = 0;
+ tsleep(r, PPAUSE|PCATCH, "ndisthrexit", tvtohz(&tv));
+
+ /* Now empty the job list. */
+
+ mtx_pool_lock(ndis_mtxpool, ndis_thr_mtx);
+ while ((r = STAILQ_FIRST(q)) != NULL) {
+ STAILQ_REMOVE_HEAD(q, link);
+ STAILQ_INSERT_HEAD(&ndis_free, r, link);
+ }
+ mtx_pool_unlock(ndis_mtxpool, ndis_thr_mtx);
+
+ return;
+}
+
+static int
+ndis_enlarge_thrqueue(cnt)
+ int cnt;
+{
+ struct ndis_req *r;
+ int i;
+
+ for (i = 0; i < cnt; i++) {
+ r = malloc(sizeof(struct ndis_req), M_DEVBUF, M_WAITOK);
+ if (r == NULL)
+ return(ENOMEM);
+ mtx_pool_lock(ndis_mtxpool, ndis_thr_mtx);
+ STAILQ_INSERT_HEAD(&ndis_free, r, link);
+ ndis_jobs++;
+ mtx_pool_unlock(ndis_mtxpool, ndis_thr_mtx);
+ }
+
+ return(0);
+}
+
+static int
+ndis_shrink_thrqueue(cnt)
+ int cnt;
+{
+ struct ndis_req *r;
+ int i;
+
+ for (i = 0; i < cnt; i++) {
+ mtx_pool_lock(ndis_mtxpool, ndis_thr_mtx);
+ r = STAILQ_FIRST(&ndis_free);
+ if (r == NULL) {
+ mtx_pool_unlock(ndis_mtxpool, ndis_thr_mtx);
+ return(ENOMEM);
+ }
+ STAILQ_REMOVE_HEAD(&ndis_free, link);
+ ndis_jobs--;
+ mtx_pool_unlock(ndis_mtxpool, ndis_thr_mtx);
+ free(r, M_DEVBUF);
+ }
+
+ return(0);
+}
+
+int
+ndis_sched(func, arg, t)
+ void (*func)(void *);
+ void *arg;
+ int t;
+{
+ struct ndis_req *r;
+ struct ndisqhead *q;
+ struct proc *p;
+
+ if (t == NDIS_TASKQUEUE) {
+ q = &ndis_ttodo;
+ p = ndis_tproc.np_p;
+ } else {
+ q = &ndis_itodo;
+ p = ndis_iproc.np_p;
+ }
+
+ mtx_pool_lock(ndis_mtxpool, ndis_thr_mtx);
+ /*
+ * Check to see if an instance of this job is already
+ * pending. If so, don't bother queuing it again.
+ */
+ STAILQ_FOREACH(r, q, link) {
+ if (r->nr_func == func && r->nr_arg == arg) {
+ mtx_pool_unlock(ndis_mtxpool, ndis_thr_mtx);
+ return(0);
+ }
+ }
+ r = STAILQ_FIRST(&ndis_free);
+ if (r == NULL) {
+ mtx_pool_unlock(ndis_mtxpool, ndis_thr_mtx);
+ return(EAGAIN);
+ }
+ STAILQ_REMOVE_HEAD(&ndis_free, link);
+ r->nr_func = func;
+ r->nr_arg = arg;
+ r->nr_exit = FALSE;
+ STAILQ_INSERT_TAIL(q, r, link);
+ mtx_pool_unlock(ndis_mtxpool, ndis_thr_mtx);
+
+ /* Post the job. */
+ kthread_resume(p);
+
+ return(0);
+}
+
__stdcall static void
ndis_sendrsrcavail_func(adapter)
ndis_handle adapter;
@@ -704,6 +1001,9 @@
rval == NDIS_STATUS_NOT_ACCEPTED)
return(ENOTSUP);
+ if (rval != NDIS_STATUS_SUCCESS)
+ return(ENODEV);
+
return(0);
}
@@ -1065,6 +1365,9 @@
rval == NDIS_STATUS_NOT_ACCEPTED)
return(ENOTSUP);
+ if (rval != NDIS_STATUS_SUCCESS)
+ return(ENODEV);
+
return(0);
}
@@ -1080,6 +1383,8 @@
ndis_flush_sysctls(sc);
+ ndis_shrink_thrqueue(8);
+
return(0);
}
@@ -1186,5 +1491,7 @@
block->nmb_dev = sc->ndis_dev;
block->nmb_img = img;
+ ndis_enlarge_thrqueue(8);
+
return(0);
}
==== //depot/projects/netperf+sockets/sys/compat/ndis/ndis_var.h#11 (text+ko) ====
@@ -29,7 +29,7 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
- * $FreeBSD: src/sys/compat/ndis/ndis_var.h,v 1.16 2004/01/16 02:07:04 obrien Exp $
+ * $FreeBSD: src/sys/compat/ndis/ndis_var.h,v 1.18 2004/01/21 21:09:09 wpaul Exp $
*/
#ifndef _NDIS_VAR_H_
@@ -573,6 +573,110 @@
typedef struct ndis_80211_test ndis_80211_test;
+/* TCP OIDs. */
+
+#define OID_TCP_TASK_OFFLOAD 0xFC010201
+#define OID_TCP_TASK_IPSEC_ADD_SA 0xFC010202
+#define OID_TCP_TASK_IPSEC_DELETE_SA 0xFC010203
+#define OID_TCP_SAN_SUPPORT 0xFC010204
+
+
+#define NDIS_TASK_OFFLOAD_VERSION 1
+
+#define NDIS_TASK_TCPIP_CSUM 0x00000000
+#define NDIS_TASK_IPSEC 0x00000001
+#define NDIS_TASK_TCP_LARGESEND 0x00000002
+
+#define NDIS_ENCAP_UNSPEC 0x00000000
+#define NDIS_ENCAP_NULL 0x00000001
+#define NDIS_ENCAP_IEEE802_3 0x00000002
+#define NDIS_ENCAP_IEEE802_5 0x00000003
+#define NDIS_ENCAP_SNAP_ROUTED 0x00000004
+#define NDIS_ENCAP_SNAP_BRIDGED 0x00000005
+
+#define NDIS_ENCAPFLAG_FIXEDHDRLEN 0x00000001
+
+struct ndis_encap_fmt {
+ uint32_t nef_encap;
+ uint32_t nef_flags;
+ uint32_t nef_encaphdrlen;
+};
+
+typedef struct ndis_encap_fmt ndis_encap_fmt;
+
+struct ndis_task_offload_hdr {
+ uint32_t ntoh_vers;
+ uint32_t ntoh_len;
+ uint32_t ntoh_rsvd;
+ uint32_t ntoh_offset_firsttask;
+ ndis_encap_fmt ntoh_encapfmt;
+};
+
+typedef struct ndis_task_offload_hdr ndis_task_offload_hdr;
+
+struct ndis_task_offload {
+ uint32_t nto_vers;
+ uint32_t nto_len;
+ uint32_t nto_task;
+ uint32_t nto_offset_nexttask;
+ uint32_t nto_taskbuflen;
+ uint8_t nto_taskbuf[1];
+};
+
+typedef struct ndis_task_offload ndis_task_offload;
+
+#define NDIS_TCPSUM_FLAGS_IP_OPTS 0x00000001
+#define NDIS_TCPSUM_FLAGS_TCP_OPTS 0x00000002
+#define NDIS_TCPSUM_FLAGS_TCP_CSUM 0x00000004
+#define NDIS_TCPSUM_FLAGS_UDP_CSUM 0x00000008
+#define NDIS_TCPSUM_FLAGS_IP_CSUM 0x00000010
+
+struct ndis_task_tcpip_csum {
+ uint32_t nttc_v4tx;
+ uint32_t nttc_v4rx;
+ uint32_t nttc_v6tx;
+ uint32_t nttc_v6rx;
+};
+
+typedef struct ndis_task_tcpip_csum ndis_task_tcpip_csum;
+
+struct ndis_task_tcp_largesend {
+ uint32_t nttl_vers;
+ uint32_t nttl_maxofflen;
+ uint32_t nttl_minsegcnt;
+ uint8_t nttl_tcpopt;
+ uint8_t nttl_ipopt;
+};
+
+typedef struct ndis_task_tcp_largesend ndis_task_tcp_largesend;
+
+#define NDIS_IPSEC_AH_MD5 0x00000001
+#define NDIS_IPSEC_AH_SHA1 0x00000002
+#define NDIS_IPSEC_AH_TRANSPORT 0x00000004
+#define NDIS_IPSEC_AH_TUNNEL 0x00000008
+#define NDIS_IPSEC_AH_SEND 0x00000010
+#define NDIS_IPSEC_AH_RECEIVE 0x00000020
+
+#define NDIS_IPSEC_ESP_DES 0x00000001
+#define NDIS_IPSEC_ESP_RSVD 0x00000002
+#define NDIS_IPSEC_ESP_3DES 0x00000004
+#define NDIS_IPSEC_ESP_NULL 0x00000008
+#define NDIS_IPSEC_ESP_TRANSPORT 0x00000010
+#define NDIS_IPSEC_ESP_TUNNEL 0x00000020
+#define NDIS_IPSEC_ESP_SEND 0x00000040
+#define NDIS_IPSEC_ESP_RECEIVE 0x00000080
+
+struct ndis_task_ipsec {
+ uint32_t nti_ah_esp_combined;
+ uint32_t nti_ah_transport_tunnel_combined;
+ uint32_t nti_v4_options;
+ uint32_t nti_rsvd;
+ uint32_t nti_v4ah;
+ uint32_t nti_v4esp;
+};
+
+typedef struct ndis_task_ipsec ndis_task_ipsec;
+
/*
* Attribures of NDIS drivers. Not all drivers support
* all attributes.
@@ -872,6 +976,43 @@
typedef struct ndis_sc_list ndis_sc_list;
+struct ndis_tcpip_csum {
+ union {
+ uint32_t ntc_txflags;
+ uint32_t ntc_rxflags;
+ uint32_t ntc_val;
+ } u;
+};
+
+typedef struct ndis_tcpip_csum ndis_tcpip_csum;
+
+#define NDIS_TXCSUM_DO_IPV4 0x00000001
+#define NDIS_TXCSUM_DO_IPV6 0x00000002
+#define NDIS_TXCSUM_DO_TCP 0x00000004
+#define NDIS_TXCSUM_DO_UDP 0x00000008
+#define NDIS_TXCSUM_DO_IP 0x00000010
+
+#define NDIS_RXCSUM_TCP_FAILED 0x00000001
+#define NDIS_RXCSUM_UDP_FAILED 0x00000002
+#define NDIS_RXCSUM_IP_FAILED 0x00000004
+#define NDIS_RXCSUM_TCP_PASSED 0x00000008
+#define NDIS_RXCSUM_UDP_PASSED 0x00000010
+#define NDIS_RXCSUM_IP_PASSED 0x00000020
+#define NDIS_RXCSUM_LOOPBACK 0x00000040
+
+struct ndis_vlan {
+ union {
+ struct {
+ uint32_t nvt_userprio:3;
+ uint32_t nvt_canformatid:1;
+ uint32_t nvt_vlanid:12;
+ uint32_t nvt_rsvd:16;
+ } nv_taghdr;
+ } u;
+};
+
+typedef struct ndis_vlan ndis_vlan;
+
enum ndis_perpkt_info {
ndis_tcpipcsum_info,
ndis_ipsec_info,
@@ -1321,6 +1462,9 @@
extern image_patch_table ndis_functbl[];
+#define NDIS_TASKQUEUE 1
+#define NDIS_SWI 2
+
__BEGIN_DECLS
extern int ndis_libinit(void);
extern int ndis_libfini(void);
@@ -1353,6 +1497,7 @@
extern int ndis_create_sysctls(void *);
extern int ndis_add_sysctl(void *, char *, char *, char *, int);
extern int ndis_flush_sysctls(void *);
+extern int ndis_sched(void (*)(void *), void *, int);
__END_DECLS
#endif /* _NDIS_VAR_H_ */
==== //depot/projects/netperf+sockets/sys/compat/ndis/ntoskrnl_var.h#5 (text+ko) ====
@@ -29,7 +29,7 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
- * $FreeBSD: src/sys/compat/ndis/ntoskrnl_var.h,v 1.5 2004/01/16 02:07:04 obrien Exp $
+ * $FreeBSD: src/sys/compat/ndis/ntoskrnl_var.h,v 1.6 2004/01/19 20:45:27 wpaul Exp $
*/
#ifndef _NTOSKRNL_VAR_H_
@@ -55,6 +55,13 @@
#define MDL_VA(b) \
((void *)((char *)((b)->nb_startva) + (b)->nb_byteoffset))
+#define WDM_MAJOR 1
+#define WDM_MINOR_WIN98 0x00
+#define WDM_MINOR_WINME 0x05
+#define WDM_MINOR_WIN2000 0x10
+#define WDM_MINOR_WINXP 0x20
+#define WDM_MINOR_WIN2003 0x30
+
/*-
* The ndis_kspin_lock type is called KSPIN_LOCK in MS-Windows.
* According to the Windows DDK header files, KSPIN_LOCK is defined like this:
==== //depot/projects/netperf+sockets/sys/compat/ndis/subr_ndis.c#12 (text+ko) ====
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ndis.c,v 1.37 2004/01/15 07:42:26 wpaul Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ndis.c,v 1.38 2004/01/18 22:57:11 wpaul Exp $");
/*
* This file implements a translation layer between the BSD networking
@@ -64,7 +64,6 @@
#include <sys/timespec.h>
#include <sys/smp.h>
#include <sys/queue.h>
-#include <sys/taskqueue.h>
#include <sys/proc.h>
#include <sys/namei.h>
#include <sys/fcntl.h>
@@ -261,7 +260,7 @@
__stdcall static void ndis_ind_statusdone(ndis_handle);
__stdcall static void ndis_ind_status(ndis_handle, ndis_status,
void *, uint32_t);
-static void ndis_workfunc(void *, int);
+static void ndis_workfunc(void *);
__stdcall static ndis_status ndis_sched_workitem(ndis_work_item *);
__stdcall static void ndis_pkt_to_pkt(ndis_packet *, uint32_t, uint32_t,
ndis_packet *, uint32_t, uint32_t *);
@@ -601,18 +600,18 @@
ndis_config_parm *parm;
char *val;
{
- uint16_t *unicode;
ndis_unicode_string *ustr;
+ char *astr = NULL;
- unicode = (uint16_t *)&block->nmb_dummybuf;
-
switch(parm->ncp_type) {
case ndis_parm_string:
ustr = &parm->ncp_parmdata.ncp_stringdata;
- ndis_unicode_to_ascii(ustr->nus_buf, ustr->nus_len, &val);
+ ndis_unicode_to_ascii(ustr->nus_buf, ustr->nus_len, &astr);
+ bcopy(astr, val, 254);
+ free(astr, M_DEVBUF);
break;
case ndis_parm_int:
- sprintf(val, "%ul", parm->ncp_parmdata.ncp_intdata);
+ sprintf(val, "%d", parm->ncp_parmdata.ncp_intdata);
break;
case ndis_parm_hexint:
sprintf(val, "%xu", parm->ncp_parmdata.ncp_intdata);
@@ -644,6 +643,7 @@
ndis_unicode_to_ascii(key->nus_buf, key->nus_len, &keystr);
/* Decode the parameter into a string. */
+ bzero(val, sizeof(val));
*status = ndis_decode_parm(block, parm, val);
if (*status != NDIS_STATUS_SUCCESS) {
free(keystr, M_DEVBUF);
@@ -2484,9 +2484,8 @@
}
static void
-ndis_workfunc(ctx, pending)
+ndis_workfunc(ctx)
void *ctx;
- int pending;
{
ndis_work_item *work;
__stdcall ndis_proc workfunc;
@@ -2501,11 +2500,7 @@
ndis_sched_workitem(work)
ndis_work_item *work;
{
- struct task *t;
-
- t = (struct task *)&work->nwi_wraprsvd;
- TASK_INIT(t, 0, ndis_workfunc, work);
- taskqueue_enqueue(taskqueue_swi, t);
+ ndis_sched(ndis_workfunc, work, NDIS_TASKQUEUE);
return(NDIS_STATUS_SUCCESS);
}
==== //depot/projects/netperf+sockets/sys/compat/ndis/subr_ntoskrnl.c#10 (text+ko) ====
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ntoskrnl.c,v 1.17 2004/01/15 21:31:48 wpaul Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ntoskrnl.c,v 1.19 2004/01/19 19:57:00 wpaul Exp $");
#include <sys/ctype.h>
#include <sys/param.h>
@@ -75,7 +75,8 @@
ndis_ansi_string *, uint8_t);
__stdcall static void *ntoskrnl_iobuildsynchfsdreq(uint32_t, void *,
void *, uint32_t, uint32_t *, void *, void *);
-__stdcall static uint32_t ntoskrnl_iofcalldriver(void *, void *);
+__stdcall static uint32_t ntoskrnl_iofcalldriver(/*void *, void * */ void);
+__stdcall static void ntoskrnl_iofcompletereq(/*void *, uint8_t*/ void);
__stdcall static uint32_t ntoskrnl_waitforobj(void *, uint32_t,
uint32_t, uint8_t, void *);
__stdcall static void ntoskrnl_initevent(void *, uint32_t, uint8_t);
@@ -129,6 +130,9 @@
__stdcall static void ntoskrnl_free_ansi_string(ndis_ansi_string *);
__stdcall static ndis_status ntoskrnl_unicode_to_int(ndis_unicode_string *,
uint32_t, uint32_t *);
+static int atoi (const char *);
+static long atol (const char *);
+__stdcall static uint8_t ntoskrnl_wdmver(uint8_t, uint8_t);
__stdcall static void dummy(void);
static struct mtx *ntoskrnl_interlock;
@@ -251,11 +255,25 @@
}
__stdcall static uint32_t
-ntoskrnl_iofcalldriver(dobj, irp)
+ntoskrnl_iofcalldriver(/*dobj, irp*/)
+{
void *dobj;
void *irp;
+
+ __asm__ __volatile__ ("" : "=c" (dobj), "=d" (irp));
+
+ return(0);
+}
+
+__stdcall static void
+ntoskrnl_iofcompletereq(/*irp, prioboost*/)
{
- return(0);
+ void *irp;
+ uint8_t prioboost;
+
+ __asm__ __volatile__ ("" : "=c" (irp), "=d" (prioboost));
+
+ return;
}
__stdcall static uint32_t
@@ -805,6 +823,30 @@
return;
}
+static int
+atoi(str)
+ const char *str;
+{
+ return (int)strtol(str, (char **)NULL, 10);
+}
+
+static long
+atol(str)
+ const char *str;
+{
+ return strtol(str, (char **)NULL, 10);
+}
+
+__stdcall static uint8_t
+ntoskrnl_wdmver(major, minor)
+ uint8_t major;
+ uint8_t minor;
+{
+ if (major == WDM_MAJOR && minor == WDM_MINOR_WINXP)
+ return(TRUE);
+ return(FALSE);
+}
+
__stdcall static void
dummy()
{
@@ -825,6 +867,7 @@
{ "RtlFreeUnicodeString", (FUNC)ntoskrnl_free_unicode_string },
{ "RtlUnicodeStringToInteger", (FUNC)ntoskrnl_unicode_to_int },
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list