Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 6 Mar 2003 12:18:33 -0800 (PST)
From:      John Baldwin <jhb@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 26438 for review
Message-ID:  <200303062018.h26KIXj6049099@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=26438

Change 26438 by jhb@jhb_laptop on 2003/03/06 12:17:46

	IFC @26434.

Affected files ...

.. //depot/projects/smpng/sys/alpha/alpha/sys_machdep.c#13 integrate
.. //depot/projects/smpng/sys/coda/cnode.h#4 integrate
.. //depot/projects/smpng/sys/coda/coda_vfsops.c#10 integrate
.. //depot/projects/smpng/sys/coda/coda_vnops.c#10 integrate
.. //depot/projects/smpng/sys/conf/NOTES#35 integrate
.. //depot/projects/smpng/sys/conf/options#46 integrate
.. //depot/projects/smpng/sys/dev/acpica/acpi.c#40 integrate
.. //depot/projects/smpng/sys/dev/firewire/firewire.c#11 integrate
.. //depot/projects/smpng/sys/dev/firewire/firewire.h#5 integrate
.. //depot/projects/smpng/sys/dev/firewire/firewirereg.h#6 integrate
.. //depot/projects/smpng/sys/dev/firewire/fwdev.c#5 integrate
.. //depot/projects/smpng/sys/dev/firewire/fwohci.c#11 integrate
.. //depot/projects/smpng/sys/dev/firewire/if_fwe.c#7 integrate
.. //depot/projects/smpng/sys/dev/firewire/if_fwevar.h#2 integrate
.. //depot/projects/smpng/sys/fs/smbfs/smbfs_node.h#4 integrate
.. //depot/projects/smpng/sys/fs/smbfs/smbfs_vfsops.c#15 integrate
.. //depot/projects/smpng/sys/fs/smbfs/smbfs_vnops.c#17 integrate
.. //depot/projects/smpng/sys/i386/i386/sys_machdep.c#25 integrate
.. //depot/projects/smpng/sys/kern/kern_mac.c#18 integrate
.. //depot/projects/smpng/sys/kern/kern_subr.c#20 integrate
.. //depot/projects/smpng/sys/kern/subr_witness.c#81 integrate
.. //depot/projects/smpng/sys/kern/uipc_syscalls.c#30 integrate
.. //depot/projects/smpng/sys/kern/vfs_subr.c#43 integrate
.. //depot/projects/smpng/sys/kern/vfs_syscalls.c#52 integrate
.. //depot/projects/smpng/sys/netgraph/ng_ppp.c#10 integrate
.. //depot/projects/smpng/sys/netsmb/smb_dev.c#10 integrate
.. //depot/projects/smpng/sys/netsmb/smb_subr.h#10 integrate
.. //depot/projects/smpng/sys/sys/mac.h#12 integrate
.. //depot/projects/smpng/sys/sys/mac_policy.h#11 integrate
.. //depot/projects/smpng/sys/sys/uio.h#11 integrate
.. //depot/projects/smpng/sys/ufs/ffs/ffs_vnops.c#13 integrate
.. //depot/projects/smpng/sys/vm/vm_fault.c#21 integrate
.. //depot/projects/smpng/sys/vm/vm_map.c#29 integrate
.. //depot/projects/smpng/sys/vm/vm_map.h#16 integrate
.. //depot/projects/smpng/sys/vm/vm_object.c#26 integrate
.. //depot/projects/smpng/sys/vm/vm_object.h#14 integrate
.. //depot/projects/smpng/sys/vm/vm_swap.c#22 integrate
.. //depot/projects/smpng/sys/vm/vnode_pager.c#26 integrate

Differences ...

==== //depot/projects/smpng/sys/alpha/alpha/sys_machdep.c#13 (text+ko) ====

@@ -31,13 +31,16 @@
  * SUCH DAMAGE.
  *
  *	from: @(#)sys_machdep.c	5.5 (Berkeley) 1/19/91
- * $FreeBSD: src/sys/alpha/alpha/sys_machdep.c,v 1.21 2002/12/14 01:56:23 alfred Exp $
+ * $FreeBSD: src/sys/alpha/alpha/sys_machdep.c,v 1.22 2003/03/06 04:47:47 rwatson Exp $
  *
  */
 
+#include "opt_mac.h"
+
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/lock.h>
+#include <sys/mac.h>
 #include <sys/mutex.h>
 #include <sys/proc.h>
 #include <sys/sysent.h>
@@ -114,6 +117,12 @@
 	if (error)
 		return (error);
 
+#ifdef MAC
+	error = mac_check_sysarch_ioperm(td->td_ucred);
+	if (error)
+		return (error);
+#endif
+
 	error = securelevel_gt(td->td_ucred, 0);
 	if (error)
 		return (error);

==== //depot/projects/smpng/sys/coda/cnode.h#4 (text+ko) ====

@@ -27,7 +27,7 @@
  * Mellon the rights to redistribute these changes without encumbrance.
  * 
  * 	@(#) src/sys/coda/cnode.h,v 1.1.1.1 1998/08/29 21:14:52 rvb Exp $ 
- * $FreeBSD: src/sys/coda/cnode.h,v 1.11 2003/02/19 05:46:58 imp Exp $
+ * $FreeBSD: src/sys/coda/cnode.h,v 1.12 2003/03/06 10:48:03 tjr Exp $
  * 
  */
 
@@ -154,6 +154,7 @@
     struct mount	*mi_vfsp;
     struct vcomm	 mi_vcomm;
     dev_t                dev;
+    int                  mi_started;
 };
 extern struct coda_mntinfo coda_mnttbl[]; /* indexed by minor device number */
 

==== //depot/projects/smpng/sys/coda/coda_vfsops.c#10 (text+ko) ====

@@ -27,7 +27,7 @@
  * Mellon the rights to redistribute these changes without encumbrance.
  * 
  *  	@(#) src/sys/cfs/coda_vfsops.c,v 1.1.1.1 1998/08/29 21:14:52 rvb Exp $
- * $FreeBSD: src/sys/coda/coda_vfsops.c,v 1.41 2002/08/04 10:29:24 jeff Exp $
+ * $FreeBSD: src/sys/coda/coda_vfsops.c,v 1.42 2003/03/06 10:48:03 tjr Exp $
  * 
  */
 
@@ -181,6 +181,7 @@
     vfs_getnewfsid (vfsp);
 
     mi->mi_vfsp = vfsp;
+    mi->mi_started = 0;			/* XXX See coda_root() */
     
     /*
      * Make a root vnode to placate the Vnode interface, but don't
@@ -301,9 +302,21 @@
     result = NULL;
     
     if (vfsp == mi->mi_vfsp) {
+	/*
+	 * Cache the root across calls. We only need to pass the request
+	 * on to Venus if the root vnode is the dummy we installed in
+	 * coda_mount() with all c_fid members zeroed.
+	 *
+	 * XXX In addition, if we are called between coda_mount() and
+	 * coda_start(), we assume that the request is from vfs_mount()
+	 * (before the call to checkdirs()) and return the dummy root
+	 * node to avoid a deadlock. This bug is fixed in the Coda CVS
+	 * repository but not in any released versions as of 6 Mar 2003.
+	 */
 	if ((VTOC(mi->mi_rootvp)->c_fid.Volume != 0) ||
 	    (VTOC(mi->mi_rootvp)->c_fid.Vnode != 0) ||
-	    (VTOC(mi->mi_rootvp)->c_fid.Unique != 0))
+	    (VTOC(mi->mi_rootvp)->c_fid.Unique != 0) ||
+	    mi->mi_started == 0)
 	    { /* Found valid root. */
 		*vpp = mi->mi_rootvp;
 		/* On Mach, this is vref.  On NetBSD, VOP_LOCK */
@@ -371,6 +384,18 @@
     return(error);
 }
 
+int
+coda_start(mp, flags, td)
+	struct mount *mp;
+	int flags;
+	struct thread *td;
+{
+
+	/* XXX See coda_root(). */
+	vftomi(mp)->mi_started = 1;
+	return (0);
+}
+
 /*
  * Get filesystem statistics.
  */
@@ -526,7 +551,7 @@
 
 struct vfsops coda_vfsops = {
     coda_mount,
-    vfs_stdstart,
+    coda_start,
     coda_unmount,
     coda_root,
     vfs_stdquotactl,

==== //depot/projects/smpng/sys/coda/coda_vnops.c#10 (text+ko) ====

@@ -27,7 +27,7 @@
  * Mellon the rights to redistribute these changes without encumbrance.
  * 
  *  	@(#) src/sys/coda/coda_vnops.c,v 1.1.1.1 1998/08/29 21:14:52 rvb Exp $
- * $FreeBSD: src/sys/coda/coda_vnops.c,v 1.46 2003/03/05 10:23:51 tjr Exp $
+ * $FreeBSD: src/sys/coda/coda_vnops.c,v 1.47 2003/03/05 22:30:02 tjr Exp $
  * 
  */
 
@@ -1985,7 +1985,7 @@
 {
 	struct vop_pathconf_args *ap;
 	int error;
-	int *retval;
+	register_t *retval;
 
 	ap = v;
 	retval = ap->a_retval;

==== //depot/projects/smpng/sys/conf/NOTES#35 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/NOTES,v 1.1134 2003/03/05 19:24:20 peter Exp $
+# $FreeBSD: src/sys/conf/NOTES,v 1.1135 2003/03/06 03:41:00 alc Exp $
 #
 # NOTES -- Lines that can be cut/pasted into kernel and hints configs.
 #
@@ -756,21 +756,6 @@
 # unsuitable for inclusion on machines with untrusted local users.
 options 	VFS_AIO
 
-# Enable the code UFS IO optimization through the VM system.  This allows
-# use VM operations instead of copying operations when possible.
-# 
-# Even with this enabled, actual use of the code is still controlled by the
-# sysctl vfs.ioopt.  0 gives no optimization, 1 gives normal (use VM
-# operations if a request happens to fit), 2 gives agressive optimization
-# (the operations are split to do as much as possible through the VM system.)
-#
-# Enabling this will probably not give an overall speedup except for
-# special workloads.
-#
-# WARNING: Do not enable this, it is known to be broken, and will result
-# in system instability, as well as possible data loss.
-options 	ENABLE_VFS_IOOPT
-
 # Cryptographically secure random number generator; /dev/[u]random
 device		random
 

==== //depot/projects/smpng/sys/conf/options#46 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/options,v 1.378 2003/03/05 19:24:20 peter Exp $
+# $FreeBSD: src/sys/conf/options,v 1.379 2003/03/06 03:41:01 alc Exp $
 #
 #        On the handling of kernel options
 #
@@ -460,7 +460,6 @@
 DEBUG_VFS_LOCKS		opt_global.h
 LOOKUP_SHARED		opt_global.h
 DIAGNOSTIC		opt_global.h
-ENABLE_VFS_IOOPT	opt_global.h
 INVARIANT_SUPPORT	opt_global.h
 INVARIANTS		opt_global.h
 MCLSHIFT		opt_global.h

==== //depot/projects/smpng/sys/dev/acpica/acpi.c#40 (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/dev/acpica/acpi.c,v 1.86 2003/03/03 12:15:40 phk Exp $
+ *	$FreeBSD: src/sys/dev/acpica/acpi.c,v 1.87 2003/03/06 14:40:15 takawata Exp $
  */
 
 #include "opt_acpi.h"
@@ -107,6 +107,7 @@
 					    u_long start, u_long end, u_long count, u_int flags);
 static int	acpi_release_resource(device_t bus, device_t child, int type, int rid, struct resource *r);
 static u_int32_t acpi_isa_get_logicalid(device_t dev);
+static u_int32_t acpi_isa_get_compatid(device_t dev);
 static int	acpi_isa_pnp_probe(device_t bus, device_t child, struct isa_pnp_id *ids);
 
 static void	acpi_probe_children(device_t bus);
@@ -719,11 +720,39 @@
     return_VALUE(pnpid);
 }
 
+static u_int32_t
+acpi_isa_get_compatid(device_t dev)
+{
+    ACPI_HANDLE		h;
+    ACPI_DEVICE_INFO	devinfo;
+    ACPI_STATUS		error;
+    u_int32_t		pnpid;
+    ACPI_LOCK_DECL;
+
+    ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
+
+    pnpid = 0;
+    ACPI_LOCK;
+    
+    /* fetch and validate the HID */
+    if ((h = acpi_get_handle(dev)) == NULL)
+	goto out;
+    if (ACPI_FAILURE(error = AcpiGetObjectInfo(h, &devinfo)))
+	goto out;
+    if (ACPI_FAILURE(error = acpi_EvaluateInteger(h, "_CID", &pnpid)))
+	goto out;
+
+out:
+    ACPI_UNLOCK;
+    return_VALUE(pnpid);
+}
+
+
 static int
 acpi_isa_pnp_probe(device_t bus, device_t child, struct isa_pnp_id *ids)
 {
     int			result;
-    u_int32_t		pnpid;
+    u_int32_t		lid, cid;
 
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
@@ -735,9 +764,10 @@
     result = ENXIO;
 
     /* scan the supplied IDs for a match */
-    pnpid = acpi_isa_get_logicalid(child);
+    lid = acpi_isa_get_logicalid(child);
+    cid = acpi_isa_get_compatid(child);
     while (ids && ids->ip_id) {
-	if (pnpid == ids->ip_id) {
+	if (lid == ids->ip_id || cid == ids->ip_id) {
 	    result = 0;
 	    goto out;
 	}

==== //depot/projects/smpng/sys/dev/firewire/firewire.c#11 (text+ko) ====

@@ -30,7 +30,7 @@
  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  * 
- * $FreeBSD: src/sys/dev/firewire/firewire.c,v 1.43 2003/02/27 12:51:24 simokawa Exp $
+ * $FreeBSD: src/sys/dev/firewire/firewire.c,v 1.44 2003/03/06 05:06:44 simokawa Exp $
  *
  */
 
@@ -522,6 +522,7 @@
 
 	while ((xfer = STAILQ_FIRST(&xferq->q)) != NULL) {
 		STAILQ_REMOVE_HEAD(&xferq->q, link);
+		xferq->queued --;
 		xfer->resp = EAGAIN;
 		switch (xfer->act_type) {
 		case FWACT_XFER:

==== //depot/projects/smpng/sys/dev/firewire/firewire.h#5 (text+ko) ====

@@ -30,7 +30,7 @@
  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  * 
- * $FreeBSD: src/sys/dev/firewire/firewire.h,v 1.10 2003/02/09 10:14:22 simokawa Exp $
+ * $FreeBSD: src/sys/dev/firewire/firewire.h,v 1.11 2003/03/06 05:06:44 simokawa Exp $
  *
  */
 
@@ -93,7 +93,7 @@
 
 #define MAXREC(x)	(2 << (x))
 #define FWPMAX_S400 (2048 + 20)	/* MAXREC plus space for control data */
-#define FWMAXQUEUE 128
+#define FWMAXQUEUE 256
 
 #define	FWLOCALBUS	0xffc0
 

==== //depot/projects/smpng/sys/dev/firewire/firewirereg.h#6 (text+ko) ====

@@ -30,7 +30,7 @@
  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  * 
- * $FreeBSD: src/sys/dev/firewire/firewirereg.h,v 1.21 2003/02/27 12:51:24 simokawa Exp $
+ * $FreeBSD: src/sys/dev/firewire/firewirereg.h,v 1.22 2003/03/06 05:06:44 simokawa Exp $
  *
  */
 
@@ -230,10 +230,12 @@
 
 struct fw_bulkxfer{
 	caddr_t buf;
+	struct mbuf *mbuf;
 	STAILQ_ENTRY(fw_bulkxfer) link;
 	caddr_t start;
 	caddr_t end;
 	u_int npacket;
+	int resp;
 };
 
 struct fw_dvbuf{

==== //depot/projects/smpng/sys/dev/firewire/fwdev.c#5 (text+ko) ====

@@ -30,7 +30,7 @@
  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  * 
- * $FreeBSD: src/sys/dev/firewire/fwdev.c,v 1.24 2003/03/03 12:15:42 phk Exp $
+ * $FreeBSD: src/sys/dev/firewire/fwdev.c,v 1.25 2003/03/06 05:06:44 simokawa Exp $
  *
  */
 
@@ -67,6 +67,7 @@
 
 struct cdevsw firewire_cdevsw = 
 {
+#if __FreeBSD_version >= 500104
 	.d_open =	fw_open,
 	.d_close =	fw_close,
 	.d_read =	fw_read,
@@ -77,6 +78,10 @@
 	.d_name =	"fw",
 	.d_maj =	CDEV_MAJOR,
 	.d_flags =	D_MEM
+#else
+	fw_open, fw_close, fw_read, fw_write, fw_ioctl,
+	fw_poll, fw_mmap, nostrategy, "fw", CDEV_MAJOR, nodump, nopsize, D_MEM
+#endif
 };
 
 static int
@@ -707,18 +712,14 @@
 
 		for(i = 0 ; i < sc->fc->ir[sub]->bnchunk; i++){
 			ir->bulkxfer[i].buf =
-				ir->buf +
-				i * sc->fc->ir[sub]->bnpacket *
-			  	sc->fc->ir[sub]->psize;
+				ir->buf + i * ir->bnpacket * ir->psize;
 			STAILQ_INSERT_TAIL(&ir->stfree,
 					&ir->bulkxfer[i], link);
 			ir->bulkxfer[i].npacket = ir->bnpacket;
 		}
 		for(i = 0 ; i < sc->fc->it[sub]->bnchunk; i++){
 			it->bulkxfer[i].buf =
-				it->buf +
-				i * sc->fc->it[sub]->bnpacket *
-			  	sc->fc->it[sub]->psize;
+				it->buf + i * it->bnpacket * it->psize;
 			STAILQ_INSERT_TAIL(&it->stfree,
 					&it->bulkxfer[i], link);
 			it->bulkxfer[i].npacket = it->bnpacket;

==== //depot/projects/smpng/sys/dev/firewire/fwohci.c#11 (text+ko) ====

@@ -30,7 +30,7 @@
  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  * 
- * $FreeBSD: src/sys/dev/firewire/fwohci.c,v 1.43 2003/03/05 01:50:57 simokawa Exp $
+ * $FreeBSD: src/sys/dev/firewire/fwohci.c,v 1.44 2003/03/06 05:06:44 simokawa Exp $
  *
  */
 
@@ -835,6 +835,7 @@
 			 = (OREAD(sc, OHCI_CYCLETIMER) >> 12) + (1 << 13);
 	}
 
+again:
 	db_tr->dbcnt = 2;
 	db = &db_tr->db[db_tr->dbcnt];
 	if(len > hdr_off){
@@ -848,7 +849,7 @@
 			db_tr->dbcnt++;
 		} else {
 			int mchain=0;
-			/* XXX we assume mbuf chain is shorter than ndesc */
+			/* XXX we can handle only 6 (=8-2) mbuf chains */
 			for (m = xfer->mbuf; m != NULL; m = m->m_next) {
 				if (m->m_len == 0)
 					/* unrecoverable error could occur. */
@@ -864,11 +865,25 @@
 				db++;
 				db_tr->dbcnt++;
 			}
-			if (mchain > dbch->ndesc - 2)
-				device_printf(sc->fc.dev,
-					"dbch->ndesc(%d) is too small for"
-					" mbuf chain(%d), trancated.\n",
-					dbch->ndesc, mchain);
+			if (mchain > dbch->ndesc - 2) {
+				struct mbuf *m_new;
+				if (bootverbose)
+					device_printf(sc->fc.dev,
+						"too long mbuf chain(%d)\n",
+							mchain);
+				m_new = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
+				if (m_new != NULL) {
+					m_copydata(xfer->mbuf, 0,
+						xfer->mbuf->m_pkthdr.len,
+						mtod(m_new, caddr_t));
+					m_new->m_pkthdr.len = m_new->m_len =
+						xfer->mbuf->m_pkthdr.len;
+					m_freem(xfer->mbuf);
+					xfer->mbuf = m_new;
+					goto again;
+				}
+				device_printf(sc->fc.dev, "m_getcl failed.\n");
+			}
 		}
 	}
 	if (maxdesc < db_tr->dbcnt) {
@@ -1401,7 +1416,10 @@
 		}else{
 			fwohci_add_rx_buf(db_tr,
 				dbch->xferq.psize, dbch->xferq.flag,
-				dbch->xferq.buf + dbch->xferq.psize * idb,
+				dbch->xferq.bulkxfer[idb 
+					/ dbch->xferq.bnpacket].buf
+				+ dbch->xferq.psize *
+					(idb % dbch->xferq.bnpacket),
 				dbch->dummy + sizeof(u_int32_t) * idb);
 		}
 		if(STAILQ_NEXT(db_tr, link) == NULL){
@@ -1611,7 +1629,6 @@
 	first = STAILQ_FIRST(&ir->stfree);
 	if (first == NULL) {
 		device_printf(fc->dev, "IR DMA no free chunk\n");
-		splx(s);
 		return 0;
 	}
 
@@ -1621,6 +1638,10 @@
 	while  ((chunk = STAILQ_FIRST(&ir->stfree)) != NULL) {
 		volatile struct fwohcidb *db;
 
+#if 1 /* XXX for if_fwe */
+		db = ((struct fwohcidb_tr *)(chunk->start))->db;
+		db[ldesc].db.desc.addr = vtophys(chunk->buf);
+#endif
 		db = ((struct fwohcidb_tr *)(chunk->end))->db;
 		db[ldesc].db.desc.status = db[ldesc].db.desc.count = 0;
 		db[ldesc].db.desc.depend &= ~0xf;
@@ -2068,16 +2089,22 @@
 		STAILQ_INSERT_TAIL(&ir->stvalid, chunk, link);
 		switch (stat & FWOHCIEV_MASK) {
 		case FWOHCIEV_ACKCOMPL:
+			chunk->resp = 0;
 			break;
 		default:
+			chunk->resp = EINVAL;
 			device_printf(fc->dev,
 				"Isochronous receive err %02x\n", stat);
 		}
 		w++;
 	}
 	splx(s);
-	if (w)
-		wakeup(ir);
+	if (w) {
+		if (ir->flag & FWXFERQ_HANDLER) 
+			ir->hand(ir);
+		else
+			wakeup(ir);
+	}
 }
 
 void

==== //depot/projects/smpng/sys/dev/firewire/if_fwe.c#7 (text+ko) ====

@@ -31,7 +31,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $FreeBSD: src/sys/dev/firewire/if_fwe.c,v 1.10 2003/02/19 05:47:05 imp Exp $
+ * $FreeBSD: src/sys/dev/firewire/if_fwe.c,v 1.11 2003/03/06 05:06:44 simokawa Exp $
  */
 
 #include "opt_inet.h"
@@ -62,20 +62,21 @@
 #include <dev/firewire/if_fwevar.h>
 
 #define FWEDEBUG	if (fwedebug) printf
-#define MAX_QUEUED	IFQ_MAXLEN /* 50 */
+#define TX_MAX_QUEUE	(FWMAXQUEUE - 1)
+#define RX_MAX_QUEUE	FWMAXQUEUE
 
 /* network interface */
 static void fwe_start __P((struct ifnet *));
 static int fwe_ioctl __P((struct ifnet *, u_long, caddr_t));
 static void fwe_init __P((void *));
 
+static void fwe_output_callback __P((struct fw_xfer *));
 static void fwe_as_output __P((struct fwe_softc *, struct ifnet *));
 static void fwe_as_input __P((struct fw_xferq *));
 
 static int fwedebug = 0;
 static int stream_ch = 1;
 
-MALLOC_DECLARE(M_FWE);
 MALLOC_DEFINE(M_FWE, "if_fwe", "Ethernet over FireWire interface");
 SYSCTL_INT(_debug, OID_AUTO, if_fwe_debug, CTLFLAG_RW, &fwedebug, 0, "");
 SYSCTL_DECL(_hw_firewire);
@@ -193,7 +194,7 @@
 	ifp->if_ioctl = fwe_ioctl;
 	ifp->if_mtu = ETHERMTU;
 	ifp->if_flags = (IFF_BROADCAST|IFF_SIMPLEX|IFF_MULTICAST);
-	ifp->if_snd.ifq_maxlen = FWMAXQUEUE - 1;
+	ifp->if_snd.ifq_maxlen = TX_MAX_QUEUE;
 
 	s = splimp();
 #if __FreeBSD_version >= 500000
@@ -209,7 +210,6 @@
 	ifp->if_capabilities |= IFCAP_VLAN_MTU;
 #endif
 
-	ifp->if_snd.ifq_maxlen = MAX_QUEUED - 1;
 
 	FWEDEBUG("interface %s%d created.\n", ifp->if_name, ifp->if_unit);
 	return 0;
@@ -221,6 +221,8 @@
 	struct firewire_comm *fc;
 	struct fw_xferq *xferq;
 	struct ifnet *ifp = &fwe->fwe_if;
+	struct fw_xfer *xfer, *next;
+	int i;
 
 	fc = fwe->fd.fc;
 
@@ -232,8 +234,22 @@
 		if (xferq->flag & FWXFERQ_RUNNING)
 			fc->irx_disable(fc, fwe->dma_ch);
 		xferq->flag &= 
-			~(FWXFERQ_MODEMASK | FWXFERQ_OPEN | FWXFERQ_HANDLER);
-		/* XXX dequeue xferq->q */
+			~(FWXFERQ_MODEMASK | FWXFERQ_OPEN | 
+				FWXFERQ_EXTBUF | FWXFERQ_HANDLER);
+		xferq->hand =  NULL;
+
+		for (i = 0; i < xferq->bnchunk; i ++)
+			m_freem(xferq->bulkxfer[i].mbuf);
+		free(xferq->bulkxfer, M_FWE);
+
+		for (xfer = STAILQ_FIRST(&fwe->xferlist); xfer != NULL;
+					xfer = next) {
+			next = STAILQ_NEXT(xfer, link);
+			fw_xfer_free(xfer);
+		}
+		STAILQ_INIT(&fwe->xferlist);
+
+		xferq->bulkxfer =  NULL;
 		fwe->dma_ch = -1;
 	}
 
@@ -260,7 +276,6 @@
 	return 0;
 }
 
-
 static void
 fwe_init(void *arg)
 {
@@ -268,6 +283,7 @@
 	struct firewire_comm *fc;
 	struct ifnet *ifp = &fwe->fwe_if;
 	struct fw_xferq *xferq;
+	struct fw_xfer *xfer;
 	int i;
 
 	FWEDEBUG("initializing %s%d\n", ifp->if_name, ifp->if_unit);
@@ -293,12 +309,51 @@
 		fwe->stream_ch = stream_ch;
 		fwe->pkt_hdr.mode.stream.chtag = fwe->stream_ch;
 		/* allocate DMA channel and init packet mode */
-		xferq->flag |= FWXFERQ_OPEN | FWXFERQ_PACKET;
+		xferq->flag |= FWXFERQ_OPEN | FWXFERQ_EXTBUF;
 		xferq->flag |= fwe->stream_ch & 0xff;
 		/* register fwe_input handler */
 		xferq->sc = (caddr_t) fwe;
 		xferq->hand = fwe_as_input;
 		xferq->flag |= FWXFERQ_HANDLER;
+		xferq->bnchunk = RX_MAX_QUEUE;
+		xferq->bnpacket = 1;
+		xferq->psize = MCLBYTES;
+		xferq->queued = 0;
+		xferq->bulkxfer = (struct fw_bulkxfer *) malloc(
+			sizeof(struct fw_bulkxfer) * xferq->bnchunk, M_FWE, 0);
+		if (xferq->bulkxfer == NULL) {
+			printf("if_fwe: malloc failed\n");
+			return;
+		}
+		STAILQ_INIT(&xferq->stvalid);
+		STAILQ_INIT(&xferq->stfree);
+		STAILQ_INIT(&xferq->stdma);
+		xferq->stproc = NULL;
+		for (i = 0; i < xferq->bnchunk; i ++) {
+			xferq->bulkxfer[i].mbuf = 
+#if __FreeBSD_version >= 500000
+				m_getcl(M_TRYWAIT, MT_DATA, M_PKTHDR);
+#else
+				m_getcl(M_WAIT, MT_DATA, M_PKTHDR);
+#endif
+			xferq->bulkxfer[i].buf =
+				mtod(xferq->bulkxfer[i].mbuf, char *);
+			STAILQ_INSERT_TAIL(&xferq->stfree,
+				&xferq->bulkxfer[i], link);
+		}
+		STAILQ_INIT(&fwe->xferlist);
+		for (i = 0; i < TX_MAX_QUEUE; i++) {
+			xfer = fw_xfer_alloc(M_FWE);
+			if (xfer == NULL)
+				break;
+			xfer->send.off = 0;
+			xfer->spd = 2;
+			xfer->fc = fwe->fd.fc;
+			xfer->retry_req = fw_asybusy;
+			xfer->sc = (caddr_t)fwe;
+			xfer->act.hand = fwe_output_callback;
+			STAILQ_INSERT_TAIL(&fwe->xferlist, xfer, link);
+		}
 	} else
 		xferq = fc->ir[fwe->dma_ch];
 
@@ -375,6 +430,39 @@
 }
 
 static void
+fwe_output_callback(struct fw_xfer *xfer)
+{
+	struct fwe_softc *fwe;
+	struct ifnet *ifp;
+	int s;
+
+	fwe = (struct fwe_softc *)xfer->sc;
+	ifp = &fwe->fwe_if;
+	/* XXX error check */
+	FWEDEBUG("resp = %d\n", xfer->resp);
+	if (xfer->resp != 0)
+		ifp->if_oerrors ++;
+		
+	m_freem(xfer->mbuf);
+	xfer->send.buf = NULL;
+#if 0
+	fw_xfer_unload(xfer);
+#else
+	xfer->state = FWXF_INIT;
+	xfer->resp = 0;
+	xfer->retry = 0;
+#endif
+	s = splimp();
+	STAILQ_INSERT_TAIL(&fwe->xferlist, xfer, link);
+	splx(s);
+#if 1
+	/* XXX for queue full */
+	if (ifp->if_snd.ifq_head != NULL)
+		fwe_start(ifp);
+#endif
+}
+
+static void
 fwe_start(struct ifnet *ifp)
 {
 	struct fwe_softc *fwe = ((struct fwe_eth_softc *)ifp->if_softc)->fwe;
@@ -411,29 +499,10 @@
 	splx(s);
 }
 
-
-static void
-fwe_output_callback(struct fw_xfer *xfer)
-{
-	struct fwe_softc *fwe;
-	struct ifnet *ifp;
-
-	fwe = (struct fwe_softc *)xfer->sc;
-	/* XXX error check */
-	FWEDEBUG("resp = %d\n", xfer->resp);
-	m_freem(xfer->mbuf);
-	xfer->send.buf = NULL;
-	fw_xfer_free(xfer);
-#if 1
-	/* XXX for queue full */
-	ifp = &fwe->fwe_if;
-	if (ifp->if_snd.ifq_head != NULL)
-		fwe_start(ifp);
+#define HDR_LEN 4
+#ifndef ETHER_ALIGN
+#define ETHER_ALIGN 2
 #endif
-}
-
-#define HDR_LEN 4
-#define ALIGN_PAD 2
 /* Async. stream output */
 static void
 fwe_as_output(struct fwe_softc *fwe, struct ifnet *ifp)
@@ -446,14 +515,16 @@
 
 	xfer = NULL;
 	xferq = fwe->fd.fc->atq;
-	while (xferq->queued < xferq->maxq) {
+	while (xferq->queued < xferq->maxq - 1) {
+		xfer = STAILQ_FIRST(&fwe->xferlist);
+		if (xfer == NULL) {
+			printf("if_fwe: lack of xfer\n");
+			return;
+		}
 		IF_DEQUEUE(&ifp->if_snd, m);
 		if (m == NULL)
 			break;
-		xfer = fw_xfer_alloc(M_FWXFER);
-		if (xfer == NULL) {
-			return;
-		}
+		STAILQ_REMOVE_HEAD(&fwe->xferlist, link);
 #if __FreeBSD_version >= 500000
 		BPF_MTAP(ifp, m);
 #else
@@ -461,15 +532,8 @@
 			bpf_mtap(ifp, m);
 #endif
 
-		xfer->send.off = 0;
-		xfer->spd = 2;
-		xfer->fc = fwe->fd.fc;
-		xfer->retry_req = fw_asybusy;
-		xfer->sc = (caddr_t)fwe;
-		xfer->act.hand = fwe_output_callback;
-
 		/* keep ip packet alignment for alpha */
-		M_PREPEND(m, ALIGN_PAD, M_DONTWAIT);
+		M_PREPEND(m, ETHER_ALIGN, M_DONTWAIT);
 		fp = (struct fw_pkt *)&xfer->dst; /* XXX */
 		xfer->dst = *((int32_t *)&fwe->pkt_hdr);
 		fp->mode.stream.len = htons(m->m_pkthdr.len);
@@ -477,24 +541,25 @@
 		xfer->mbuf = m;
 		xfer->send.len = m->m_pkthdr.len + HDR_LEN;
 
-		i++;
-		if (fw_asyreq(xfer->fc, -1, xfer) != 0) {
+		if (fw_asyreq(fwe->fd.fc, -1, xfer) != 0) {
 			/* error */
 			ifp->if_oerrors ++;
 			/* XXX set error code */
 			fwe_output_callback(xfer);
 		} else {
 			ifp->if_opackets ++;
+			i++;
 		}
 	}
 #if 0
 	if (i > 1)
 		printf("%d queued\n", i);
 #endif
-	if (xfer != NULL)
-		xferq->start(xfer->fc);
+	if (i > 0)
+		xferq->start(fwe->fd.fc);
 }
 
+#if 0
 #if __FreeBSD_version >= 500000
 static void
 fwe_free(void *buf, void *args)
@@ -525,59 +590,54 @@
 	(*p) ++;
 }
 #endif
+#endif
 
 /* Async. stream output */
 static void
 fwe_as_input(struct fw_xferq *xferq)
 {
 	struct mbuf *m;
-	struct ether_header *eh;
 	struct ifnet *ifp;
-	struct fw_xfer *xfer;
 	struct fwe_softc *fwe;
+	struct fw_bulkxfer *sxfer;
+	struct fw_pkt *fp;
 	u_char *c;
-	int len;
-	caddr_t p;
+#if __FreeBSD_version < 500000
+	struct ether_header *eh;
+#endif
 
 	fwe = (struct fwe_softc *)xferq->sc;
 	ifp = &fwe->fwe_if;
 #if 0
 	FWE_POLL_REGISTER(fwe_poll, fwe, ifp);
 #endif
-	while ((xfer = STAILQ_FIRST(&xferq->q)) != NULL) {
-		STAILQ_REMOVE_HEAD(&xferq->q, link);
+	while ((sxfer = STAILQ_FIRST(&xferq->stvalid)) != NULL) {
+		STAILQ_REMOVE_HEAD(&xferq->stvalid, link);
+#if 0
 		xferq->queued --;
-		MGETHDR(m, M_DONTWAIT, MT_DATA);
-		if (m == NULL) {
-			printf("MGETHDR failed\n");
-			fw_xfer_free(xfer);
-			return;
-		}
-		len = xfer->recv.off + xfer->recv.len;
-		FWEDEBUG("fwe_as_input len=%d\n", len);
-#if __FreeBSD_version >= 500000
-		MEXTADD(m, xfer->recv.buf, len, fwe_free, NULL, 0, EXT_NET_DRV);
-#else
-		m->m_flags |= M_EXT;
-		m->m_ext.ext_buf = xfer->recv.buf;
-		m->m_ext.ext_size = len;
-		m->m_ext.ext_free = fwe_free;
-		m->m_ext.ext_ref = fwe_ref;
-		*((int *)m->m_ext.ext_buf) = 1;  /* XXX refcount */
 #endif
-		p = xfer->recv.buf + xfer->recv.off + HDR_LEN + ALIGN_PAD;
-		eh = (struct ether_header *)p;
-#if __FreeBSD_version >= 500000
-		len -= xfer->recv.off + HDR_LEN + ALIGN_PAD;
-#else
-		p += sizeof(struct ether_header);
-		len -= xfer->recv.off + HDR_LEN + ALIGN_PAD
-						+ sizeof(struct ether_header);
+		if (sxfer->resp != 0)
+			ifp->if_ierrors ++;
+		fp = (struct fw_pkt *)sxfer->buf;
+		/* XXX */
+		if (fwe->fd.fc->irx_post != NULL)
+			fwe->fd.fc->irx_post(fwe->fd.fc, fp->mode.ld);
+		m = sxfer->mbuf;
+
+		/* insert rbuf */
+		sxfer->mbuf = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
+		sxfer->buf = mtod(sxfer->mbuf, char *);
+		STAILQ_INSERT_TAIL(&xferq->stfree, sxfer, link);
+
+		m->m_data += HDR_LEN + ETHER_ALIGN;
+		c = mtod(m, char *);
+#if __FreeBSD_version < 500000
+		eh = (struct ether_header *)c;
+		m->m_data += sizeof(struct ether_header);
 #endif
-		m->m_data = p;
-		m->m_len = m->m_pkthdr.len = len;
+		m->m_len = m->m_pkthdr.len =
+				ntohs(fp->mode.stream.len) - ETHER_ALIGN;
 		m->m_pkthdr.rcvif = ifp;
-		c = (char *)eh;
 #if 0
 		FWEDEBUG("%02x %02x %02x %02x %02x %02x\n"
 			 "%02x %02x %02x %02x %02x %02x\n"
@@ -599,10 +659,9 @@
 		ether_input(ifp, eh, m);
 #endif
 		ifp->if_ipackets ++;
-
-		xfer->recv.buf = NULL;
-		fw_xfer_free(xfer);
 	}
+	if (STAILQ_FIRST(&xferq->stfree) != NULL)
+		fwe->fd.fc->irx_enable(fwe->fd.fc, fwe->dma_ch);
 }
 
 

==== //depot/projects/smpng/sys/dev/firewire/if_fwevar.h#2 (text+ko) ====

@@ -31,7 +31,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $FreeBSD: src/sys/dev/firewire/if_fwevar.h,v 1.1 2002/09/13 12:31:56 ikob Exp $
+ * $FreeBSD: src/sys/dev/firewire/if_fwevar.h,v 1.2 2003/03/06 05:06:44 simokawa Exp $
  */
 
 #ifndef _NET_IF_FWEVAR_H_
@@ -43,8 +43,9 @@
 	short stream_ch;
 	short dma_ch;
 	struct fw_pkt pkt_hdr;
+	STAILQ_HEAD(, fw_xfer) xferlist;
 	struct fwe_eth_softc {
-		/* XXX this must be first for if_ethersub.c */
+		/* XXX this must be the first for if_ethersub.c */
 		struct arpcom	arpcom;	/* ethernet common data      */
 		#define fwe_if		eth_softc.arpcom.ac_if
 		struct fwe_softc *fwe;

==== //depot/projects/smpng/sys/fs/smbfs/smbfs_node.h#4 (text+ko) ====

@@ -29,7 +29,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/fs/smbfs/smbfs_node.h,v 1.3 2002/12/13 10:15:01 tjr Exp $
+ * $FreeBSD: src/sys/fs/smbfs/smbfs_node.h,v 1.4 2003/03/06 10:38:18 tjr Exp $
  */
 #ifndef _FS_SMBFS_NODE_H_
 #define _FS_SMBFS_NODE_H_
@@ -47,9 +47,6 @@
 struct smbfs_fctx;
 
 struct smbnode {
-#ifndef FB_CURRENT
-	struct lock		n_lock;		/* smbnode lock. (mbf) */
-#endif
 	int			n_flag;
 	struct vnode *		n_parent;
 	struct vnode *		n_vnode;

==== //depot/projects/smpng/sys/fs/smbfs/smbfs_vfsops.c#15 (text+ko) ====

@@ -29,7 +29,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *

>>> TRUNCATED FOR MAIL (1000 lines) <<<

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe p4-projects" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200303062018.h26KIXj6049099>