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>