Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 17 Apr 2003 08:23:46 -0700 (PDT)
From:      John Baldwin <jhb@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 29118 for review
Message-ID:  <200304171523.h3HFNkvZ027186@repoman.freebsd.org>

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

Change 29118 by jhb@jhb_laptop on 2003/04/17 08:22:52

	IFC @29117.

Affected files ...

.. //depot/projects/smpng/sys/boot/alpha/boot1/boot1.c#3 integrate
.. //depot/projects/smpng/sys/boot/arc/lib/arcdisk.c#3 integrate
.. //depot/projects/smpng/sys/boot/arc/lib/devicename.c#2 integrate
.. //depot/projects/smpng/sys/boot/ofw/libofw/devicename.c#6 integrate
.. //depot/projects/smpng/sys/boot/ofw/libofw/ofw_disk.c#7 integrate
.. //depot/projects/smpng/sys/boot/sparc64/boot1/boot1.c#6 integrate
.. //depot/projects/smpng/sys/compat/linux/linux_ioctl.c#25 integrate
.. //depot/projects/smpng/sys/compat/linux/linux_misc.c#36 integrate
.. //depot/projects/smpng/sys/conf/files#73 integrate
.. //depot/projects/smpng/sys/conf/files.alpha#22 integrate
.. //depot/projects/smpng/sys/conf/files.i386#39 integrate
.. //depot/projects/smpng/sys/conf/files.ia64#26 integrate
.. //depot/projects/smpng/sys/conf/files.pc98#39 integrate
.. //depot/projects/smpng/sys/conf/files.sparc64#26 integrate
.. //depot/projects/smpng/sys/dev/asr/asr.c#18 integrate
.. //depot/projects/smpng/sys/dev/firewire/firewire.c#13 integrate
.. //depot/projects/smpng/sys/dev/firewire/firewire.h#6 integrate
.. //depot/projects/smpng/sys/dev/firewire/firewire_phy.h#2 integrate
.. //depot/projects/smpng/sys/dev/firewire/firewirereg.h#7 integrate
.. //depot/projects/smpng/sys/dev/firewire/fwcrom.c#3 integrate
.. //depot/projects/smpng/sys/dev/firewire/fwdev.c#6 integrate
.. //depot/projects/smpng/sys/dev/firewire/fwdma.c#1 branch
.. //depot/projects/smpng/sys/dev/firewire/fwdma.h#1 branch
.. //depot/projects/smpng/sys/dev/firewire/fwmem.c#8 integrate
.. //depot/projects/smpng/sys/dev/firewire/fwmem.h#4 integrate
.. //depot/projects/smpng/sys/dev/firewire/fwohci.c#14 integrate
.. //depot/projects/smpng/sys/dev/firewire/fwohci_pci.c#10 integrate
.. //depot/projects/smpng/sys/dev/firewire/fwohcireg.h#5 integrate
.. //depot/projects/smpng/sys/dev/firewire/fwohcivar.h#5 integrate
.. //depot/projects/smpng/sys/dev/firewire/iec13213.h#3 integrate
.. //depot/projects/smpng/sys/dev/firewire/iec68113.h#3 integrate
.. //depot/projects/smpng/sys/dev/firewire/if_fwe.c#10 integrate
.. //depot/projects/smpng/sys/dev/firewire/if_fwevar.h#3 integrate
.. //depot/projects/smpng/sys/dev/firewire/sbp.c#13 integrate
.. //depot/projects/smpng/sys/dev/mcd/mcd_isa.c#3 integrate
.. //depot/projects/smpng/sys/dev/scd/scd_isa.c#2 integrate
.. //depot/projects/smpng/sys/dev/sound/pci/via8233.c#6 integrate
.. //depot/projects/smpng/sys/dev/sound/pci/via8233.h#3 integrate
.. //depot/projects/smpng/sys/dev/wds/wd7000.c#3 integrate
.. //depot/projects/smpng/sys/geom/geom_bsd.c#26 integrate
.. //depot/projects/smpng/sys/geom/geom_bsd_enc.c#1 branch
.. //depot/projects/smpng/sys/i386/isa/bs/bsif.h#4 integrate
.. //depot/projects/smpng/sys/kern/kern_shutdown.c#34 integrate
.. //depot/projects/smpng/sys/kern/subr_devstat.c#9 integrate
.. //depot/projects/smpng/sys/kern/subr_disk.c#19 integrate
.. //depot/projects/smpng/sys/modules/firewire/Makefile.inc#2 integrate
.. //depot/projects/smpng/sys/modules/firewire/firewire/Makefile#7 integrate
.. //depot/projects/smpng/sys/modules/firewire/fwe/Makefile#3 integrate
.. //depot/projects/smpng/sys/pc98/pc98/wd.c#11 integrate
.. //depot/projects/smpng/sys/pci/if_dc.c#32 integrate
.. //depot/projects/smpng/sys/sys/disklabel.h#24 integrate
.. //depot/projects/smpng/sys/sys/param.h#38 integrate
.. //depot/user/jhb/proc/proc.fields#19 edit

Differences ...

==== //depot/projects/smpng/sys/boot/alpha/boot1/boot1.c#3 (text+ko) ====

@@ -1,5 +1,5 @@
 /*
- * $FreeBSD: src/sys/boot/alpha/boot1/boot1.c,v 1.12 2002/06/29 02:32:32 peter Exp $
+ * $FreeBSD: src/sys/boot/alpha/boot1/boot1.c,v 1.13 2003/04/16 21:09:41 phk Exp $
  * From	$NetBSD: bootxx.c,v 1.4 1997/09/06 14:08:29 drochner Exp $ 
  */
 
@@ -33,7 +33,6 @@
 #include <string.h>
 #include <sys/param.h>
 #include <sys/dirent.h>
-#include <sys/disklabel.h>
 
 #include <machine/prom.h>
 #include <machine/rpb.h>

==== //depot/projects/smpng/sys/boot/arc/lib/arcdisk.c#3 (text+ko) ====

@@ -24,7 +24,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/boot/arc/lib/arcdisk.c,v 1.5 2003/04/04 16:35:14 phk Exp $
+ * $FreeBSD: src/sys/boot/arc/lib/arcdisk.c,v 1.6 2003/04/16 21:09:41 phk Exp $
  */
 
 /*
@@ -39,7 +39,6 @@
 
 #include <stand.h>
 
-#include <sys/disklabel.h>
 
 #include <machine/stdarg.h>
 

==== //depot/projects/smpng/sys/boot/arc/lib/devicename.c#2 (text+ko) ====

@@ -23,12 +23,11 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/boot/arc/lib/devicename.c,v 1.2 1999/08/28 00:39:38 peter Exp $
+ * $FreeBSD: src/sys/boot/arc/lib/devicename.c,v 1.3 2003/04/16 21:09:41 phk Exp $
  */
 
 #include <stand.h>
 #include <string.h>
-#include <sys/disklabel.h>
 #include "bootstrap.h"
 #include "libarc.h"
 

==== //depot/projects/smpng/sys/boot/ofw/libofw/devicename.c#6 (text+ko) ====

@@ -23,11 +23,10 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/boot/ofw/libofw/devicename.c,v 1.12 2002/12/02 01:46:22 jake Exp $
+ * $FreeBSD: src/sys/boot/ofw/libofw/devicename.c,v 1.13 2003/04/16 21:09:41 phk Exp $
  */
 
 #include <stand.h>
-#include <sys/disklabel.h>
 #include "libofw.h"
 
 static int ofw_parsedev(struct ofw_devdesc **, const char *, const char **);

==== //depot/projects/smpng/sys/boot/ofw/libofw/ofw_disk.c#7 (text+ko) ====

@@ -22,7 +22,7 @@
  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/boot/ofw/libofw/ofw_disk.c,v 1.8 2002/11/10 19:17:36 jake Exp $
+ * $FreeBSD: src/sys/boot/ofw/libofw/ofw_disk.c,v 1.9 2003/04/16 21:09:41 phk Exp $
  */
 
 /*
@@ -30,7 +30,6 @@
  */
 
 #include <sys/param.h>
-#include <sys/disklabel.h>
 
 #include <netinet/in.h>
 

==== //depot/projects/smpng/sys/boot/sparc64/boot1/boot1.c#6 (text+ko) ====

@@ -17,10 +17,9 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/boot/sparc64/boot1/boot1.c,v 1.15 2003/04/04 16:35:15 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/boot/sparc64/boot1/boot1.c,v 1.16 2003/04/16 21:09:41 phk Exp $");
 
 #include <sys/param.h>
-#include <sys/disklabel.h>
 #include <sys/dirent.h>
 #include <machine/elf.h>
 #include <machine/stdarg.h>

==== //depot/projects/smpng/sys/compat/linux/linux_ioctl.c#25 (text+ko) ====

@@ -25,7 +25,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/compat/linux/linux_ioctl.c,v 1.105 2003/04/01 12:34:47 phk Exp $
+ * $FreeBSD: src/sys/compat/linux/linux_ioctl.c,v 1.106 2003/04/16 20:57:35 phk Exp $
  */
 
 #include <sys/param.h>
@@ -37,7 +37,6 @@
 #include <sys/disk.h>
 #include <sys/consio.h>
 #include <sys/ctype.h>
-#include <sys/disklabel.h>
 #include <sys/fcntl.h>
 #include <sys/file.h>
 #include <sys/filedesc.h>

==== //depot/projects/smpng/sys/compat/linux/linux_misc.c#36 (text+ko) ====

@@ -25,7 +25,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/compat/linux/linux_misc.c,v 1.140 2003/04/16 20:07:48 jhb Exp $
+ * $FreeBSD: src/sys/compat/linux/linux_misc.c,v 1.141 2003/04/16 20:43:10 jhb Exp $
  */
 
 #include "opt_mac.h"
@@ -878,7 +878,7 @@
 {
 #ifdef DEBUG
 	if (ldebug(personality))
-		printf(ARGS(personality, "%ld"), args->per);
+		printf(ARGS(personality, "%lu"), (unsigned long)args->per);
 #endif
 #ifndef __alpha__
 	if (args->per != 0)

==== //depot/projects/smpng/sys/conf/files#73 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/files,v 1.782 2003/04/15 04:08:01 mdodd Exp $
+# $FreeBSD: src/sys/conf/files,v 1.784 2003/04/17 07:39:03 phk Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -395,6 +395,7 @@
 dev/firewire/firewire.c	optional firewire
 dev/firewire/fwcrom.c	optional firewire
 dev/firewire/fwdev.c	optional firewire
+dev/firewire/fwdma.c	optional firewire
 dev/firewire/fwmem.c	optional firewire
 dev/firewire/fwohci.c	optional firewire
 dev/firewire/fwohci_pci.c	optional firewire pci
@@ -891,6 +892,7 @@
 geom/geom_aes.c		optional geom_aes
 geom/geom_apple.c	optional geom_apple
 geom/geom_bsd.c		optional geom_bsd
+geom/geom_bsd_enc.c	optional geom_bsd
 geom/geom_ctl.c		standard
 geom/geom_dev.c		standard
 geom/geom_disk.c	standard

==== //depot/projects/smpng/sys/conf/files.alpha#22 (text+ko) ====

@@ -1,7 +1,7 @@
 # This file tells config what files go into building a kernel,
 # files marked standard are always included.
 #
-# $FreeBSD: src/sys/conf/files.alpha,v 1.100 2003/02/28 21:59:13 ru Exp $
+# $FreeBSD: src/sys/conf/files.alpha,v 1.101 2003/04/17 07:39:03 phk Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -192,6 +192,7 @@
 dev/syscons/syscons.c		optional	sc
 dev/syscons/sysmouse.c		optional	sc
 geom/geom_bsd.c			standard
+geom/geom_bsd_enc.c		standard
 isa/atkbd_isa.c			optional	atkbd
 isa/atkbdc_isa.c		optional	atkbdc
 isa/fd.c			optional	fdc

==== //depot/projects/smpng/sys/conf/files.i386#39 (text+ko) ====

@@ -1,7 +1,7 @@
 # This file tells config what files go into building a kernel,
 # files marked standard are always included.
 #
-# $FreeBSD: src/sys/conf/files.i386,v 1.442 2003/04/12 08:34:40 phk Exp $
+# $FreeBSD: src/sys/conf/files.i386,v 1.443 2003/04/17 07:39:03 phk Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -147,6 +147,7 @@
 dev/syscons/syscons.c		optional	sc
 dev/syscons/sysmouse.c		optional	sc
 geom/geom_bsd.c			standard
+geom/geom_bsd_enc.c		standard
 geom/geom_mbr.c			standard
 geom/geom_mbr_enc.c		standard
 gnu/i386/fpemul/div_small.s	optional	gpl_math_emulate \

==== //depot/projects/smpng/sys/conf/files.ia64#26 (text+ko) ====

@@ -1,7 +1,7 @@
 # This file tells config what files go into building a kernel,
 # files marked standard are always included.
 #
-# $FreeBSD: src/sys/conf/files.ia64,v 1.49 2003/04/12 08:34:40 phk Exp $
+# $FreeBSD: src/sys/conf/files.ia64,v 1.50 2003/04/17 07:39:03 phk Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -93,6 +93,7 @@
 dev/syscons/syscons.c		optional	sc
 dev/syscons/sysmouse.c		optional	sc
 geom/geom_bsd.c			standard
+geom/geom_bsd_enc.c		standard
 geom/geom_gpt.c			standard
 geom/geom_mbr.c			standard
 geom/geom_mbr_enc.c		standard

==== //depot/projects/smpng/sys/conf/files.pc98#39 (text+ko) ====

@@ -3,7 +3,7 @@
 #
 # modified for PC-9801
 #
-# $FreeBSD: src/sys/conf/files.pc98,v 1.267 2003/03/25 05:19:17 mdodd Exp $
+# $FreeBSD: src/sys/conf/files.pc98,v 1.268 2003/04/17 07:39:03 phk Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -124,6 +124,7 @@
 dev/syscons/scvidctl.c		optional	sc
 dev/syscons/sysmouse.c		optional	sc
 geom/geom_bsd.c			standard
+geom/geom_bsd_enc.c		standard
 geom/geom_pc98.c		standard
 gnu/i386/fpemul/div_small.s	optional	gpl_math_emulate \
 	warning "kernel contains GPL contaminated math emulator"

==== //depot/projects/smpng/sys/conf/files.sparc64#26 (text+ko) ====

@@ -1,7 +1,7 @@
 # This file tells config what files go into building a kernel,
 # files marked standard are always included.
 #
-# $FreeBSD: src/sys/conf/files.sparc64,v 1.40 2003/03/19 06:55:36 jake Exp $
+# $FreeBSD: src/sys/conf/files.sparc64,v 1.41 2003/04/17 07:39:03 phk Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -18,6 +18,7 @@
 dev/sio/sio.c			optional	sio
 dev/sio/sio_isa.c		optional	sio isa
 geom/geom_bsd.c			standard
+geom/geom_bsd_enc.c		standard
 geom/geom_sunlabel.c		standard
 libkern/ffs.c			standard
 kern/syscalls.c			optional	ktr

==== //depot/projects/smpng/sys/dev/asr/asr.c#18 (text+ko) ====

@@ -103,7 +103,7 @@
  *			use proprietary packet creation instead of scsi_inquire
  *			CAM layer sends synchronize commands.
  *
- * $FreeBSD: src/sys/dev/asr/asr.c,v 1.33 2003/03/03 12:15:40 phk Exp $
+ * $FreeBSD: src/sys/dev/asr/asr.c,v 1.34 2003/04/16 20:46:30 phk Exp $
  */
 
 #define	ASR_VERSION	1
@@ -216,7 +216,7 @@
 #include <sys/systm.h>
 #include <sys/malloc.h>
 #include <sys/conf.h>
-#include <sys/disklabel.h>
+#include <sys/ioccom.h>
 #include <sys/proc.h>
 #include <sys/bus.h>
 #include <machine/resource.h>

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

@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2003 Hidetoshi Shimokawa
  * Copyright (c) 1998-2002 Katsushi Kobayashi and Hidetoshi Shimokawa
  * All rights reserved.
  *
@@ -30,7 +31,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.45 2003/03/24 04:11:21 simokawa Exp $
+ * $FreeBSD: src/sys/dev/firewire/firewire.c,v 1.46 2003/04/17 03:38:02 simokawa Exp $
  *
  */
 
@@ -44,13 +45,13 @@
 #include <sys/kernel.h>
 #include <sys/malloc.h>
 #include <sys/conf.h>
-#include <sys/uio.h>
 #include <sys/sysctl.h>
 
 #include <machine/cpufunc.h>    /* for rdtsc proto for clock.h below */
 #include <machine/clock.h>
 
 #include <sys/bus.h>		/* used by smbus and newbus */
+#include <machine/bus.h>
 
 #include <dev/firewire/firewire.h>
 #include <dev/firewire/firewirereg.h>
@@ -71,8 +72,6 @@
 #define FW_MAXASYRTY 4
 #define FW_MAXDEVRCNT 4
 
-#define XFER_TIMEOUT 0
-
 devclass_t firewire_devclass;
 
 static int firewire_match      __P((device_t));
@@ -202,9 +201,9 @@
 		xferq = fc->ats;
 	len = info->hdr_len;
 	if (info->flag & FWTI_BLOCK_STR)
-		len += ntohs(fp->mode.stream.len);
+		len += fp->mode.stream.len;
 	else if (info->flag & FWTI_BLOCK_ASY)
-		len += ntohs(fp->mode.rresb.len);
+		len += fp->mode.rresb.len;
 	if( len >  xfer->send.len ){
 		printf("len(%d) > send.len(%d) (tcode=%d)\n",
 				len, xfer->send.len, tcode);
@@ -230,11 +229,9 @@
 	}
 
 	xfer->tl = tl;
-	xfer->tcode = tcode;
 	xfer->resp = 0;
 	xfer->fc = fc;
 	xfer->q = xferq;
-	xfer->act_type = FWACT_XFER;
 	xfer->retry_req = fw_asybusy;
 
 	fw_asystart(xfer);
@@ -252,12 +249,7 @@
  * Postpone to later retry.
  */
 void fw_asybusy(struct fw_xfer *xfer){
-#if 1
 	printf("fw_asybusy\n");
-#endif
-#if XFER_TIMEOUT
-	untimeout(fw_xfer_timeout, (void *)xfer, xfer->ch);
-#endif
 /*
 	xfer->ch =  timeout((timeout_t *)fw_asystart, (void *)xfer, 20000);
 */
@@ -265,24 +257,7 @@
 	fw_asystart(xfer);
 	return;
 }
-#if XFER_TIMEOUT
-/*
- * Post timeout for async. request.
- */
-void
-fw_xfer_timeout(void *arg)
-{
-	int s;
-	struct fw_xfer *xfer;
 
-	xfer = (struct fw_xfer *)arg;
-	printf("fw_xfer_timeout status=%d resp=%d\n", xfer->state, xfer->resp);
-	/* XXX set error code */
-	s = splfw();
-	xfer->act.hand(xfer);
-	splx(s);
-}
-#endif
 /*
  * Async. request with given xfer structure.
  */
@@ -292,6 +267,7 @@
 	struct firewire_comm *fc = xfer->fc;
 	int s;
 	if(xfer->retry++ >= fc->max_asyretry){
+		device_printf(fc->bdev, "max_asyretry exceeded\n");
 		xfer->resp = EBUSY;
 		xfer->state = FWXF_BUSY;
 		xfer->act.hand(xfer);
@@ -314,10 +290,6 @@
 	/* XXX just queue for mbuf */
 	if (xfer->mbuf == NULL)
 		xfer->q->start(fc);
-#if XFER_TIMEOUT
-	if (xfer->act.hand != NULL)
-		xfer->ch = timeout(fw_xfer_timeout, (void *)xfer, hz);
-#endif
 	return;
 }
 
@@ -355,15 +327,7 @@
 				xfer->dst, i);
 			xfer->resp = ETIMEDOUT;
 			STAILQ_REMOVE_HEAD(&fc->tlabels[i], link);
-			switch (xfer->act_type) {
-			case FWACT_XFER:
-				fw_xfer_done(xfer);
-				break;
-			default:
-				/* ??? */
-				fw_xfer_free(xfer);
-				break;
-			}
+			fw_xfer_done(xfer);
 		}
 	}
 	splx(s);
@@ -437,10 +401,8 @@
 	/* launch attachement of the added children */
 	bus_generic_attach(dev);
 
-#if 1
 	/* bus_reset */
 	fc->ibr(fc);
-#endif
 
 	return 0;
 }
@@ -524,15 +486,7 @@
 		STAILQ_REMOVE_HEAD(&xferq->q, link);
 		xferq->queued --;
 		xfer->resp = EAGAIN;
-		switch (xfer->act_type) {
-		case FWACT_XFER:
-			fw_xfer_done(xfer);
-			break;
-		default:
-			/* ??? */
-			fw_xfer_free(xfer);
-			break;
-		}
+		fw_xfer_done(xfer);
 	}
 }
 
@@ -553,6 +507,9 @@
 void
 fw_busreset(struct firewire_comm *fc)
 {
+	struct firewire_dev_comm *fdc;
+	device_t *devlistp;
+	int devcnt;
 	int i;
 
 	switch(fc->status){
@@ -601,6 +558,16 @@
 
 	CSRARC(fc, STATE_CLEAR) &= ~(1 << 23 | 1 << 15 | 1 << 14 );
 	CSRARC(fc, STATE_SET) = CSRARC(fc, STATE_CLEAR);
+
+	if (device_get_children(fc->bdev, &devlistp, &devcnt) == 0) {
+		for( i = 0 ; i < devcnt ; i++)
+			if (device_get_state(devlistp[i]) >= DS_ATTACHED)  {
+				fdc = device_get_softc(devlistp[i]);
+				if (fdc->post_busreset != NULL)
+					fdc->post_busreset(fdc);
+			}
+		free(devlistp, M_TEMP);
+	}
 }
 
 /* Call once after reboot */
@@ -620,21 +587,15 @@
 	fc->atq->queued = 0;
 	fc->ats->queued = 0;
 
-	fc->arq->psize = PAGE_SIZE;
-	fc->ars->psize = PAGE_SIZE;
-	fc->atq->psize = 0;
-	fc->ats->psize = 0;
-
-
 	fc->arq->buf = NULL;
 	fc->ars->buf = NULL;
 	fc->atq->buf = NULL;
 	fc->ats->buf = NULL;
 
-	fc->arq->flag = FWXFERQ_PACKET;
-	fc->ars->flag = FWXFERQ_PACKET;
-	fc->atq->flag = FWXFERQ_PACKET;
-	fc->ats->flag = FWXFERQ_PACKET;
+	fc->arq->flag = 0;
+	fc->ars->flag = 0;
+	fc->atq->flag = 0;
+	fc->ats->flag = 0;
 
 	STAILQ_INIT(&fc->atq->q);
 	STAILQ_INIT(&fc->ats->q);
@@ -723,7 +684,6 @@
 		fw_xfer_free(xfer);
 	}
 	xfer->act.hand = fw_vmaccess;
-	xfer->act_type = FWACT_XFER;
 	xfer->fc = fc;
 	xfer->sc = NULL;
 
@@ -744,7 +704,7 @@
 	struct fw_bind *tfw;
 	for(tfw = STAILQ_FIRST(&fc->binds) ; tfw != NULL ;
 		tfw = STAILQ_NEXT(tfw, fclist)){
-		if(tfw->xfer->act_type != FWACT_NULL &&
+		if (tfw->act_type != FWACT_NULL &&
 			tfw->start_hi == dest_hi &&
 			tfw->start_lo <= dest_lo &&
 			(tfw->start_lo + tfw->addrlen) > dest_lo){
@@ -796,9 +756,8 @@
 		STAILQ_INSERT_TAIL(&fc->binds, fwb, fclist);
 	}
 out:
-	if(!err && fwb->xfer->act_type == FWACT_CH){
-		STAILQ_INSERT_HEAD(&fc->ir[fwb->xfer->sub]->binds, fwb, chlist);
-	}
+	if (!err && fwb->act_type == FWACT_CH)
+		STAILQ_INSERT_HEAD(&fc->ir[fwb->sub]->binds, fwb, chlist);
 	return err;
 }
 
@@ -809,14 +768,19 @@
 fw_bindremove(struct firewire_comm *fc, struct fw_bind *fwb)
 {
 	int s;
+	struct fw_xfer *xfer, *next;
 
 	s = splfw();
 	/* shall we check the existance? */
 	STAILQ_REMOVE(&fc->binds, fwb, fw_bind, fclist);
+	/* shall we do this? */
+	for (xfer = STAILQ_FIRST(&fwb->xferlist); xfer != NULL; xfer = next) {
+		next = STAILQ_NEXT(xfer, link);
+		fw_xfer_free(xfer);
+	}
+	STAILQ_INIT(&fwb->xferlist);
+
 	splx(s);
-	if (fwb->xfer)
-		fw_xfer_free(fwb->xfer);
-
 	return 0;
 }
 
@@ -881,12 +845,40 @@
 		return xfer;
 
 	microtime(&xfer->tv);
-	xfer->sub = -1;
 	xfer->malloc = type;
 
 	return xfer;
 }
 
+struct fw_xfer *
+fw_xfer_alloc_buf(struct malloc_type *type, int send_len, int recv_len)
+{
+	struct fw_xfer *xfer;
+
+	xfer = fw_xfer_alloc(type);
+	xfer->send.len = send_len;
+	xfer->recv.len = recv_len;
+	if (xfer == NULL)
+		return(NULL);
+	if (send_len) {
+		xfer->send.buf = malloc(send_len, type, M_NOWAIT | M_ZERO);
+		if (xfer->send.buf == NULL) {
+			fw_xfer_free(xfer);
+			return(NULL);
+		}
+	}
+	if (recv_len) {
+		xfer->recv.buf = malloc(recv_len, type, M_NOWAIT);
+		if (xfer->recv.buf == NULL) {
+			if (xfer->send.buf != NULL)
+				free(xfer->send.buf, type);
+			fw_xfer_free(xfer);
+			return(NULL);
+		}
+	}
+	return(xfer);
+}
+
 /*
  * IEEE1394 XFER post process.
  */
@@ -896,10 +888,6 @@
 	if (xfer->act.hand == NULL)
 		return;
 
-#if XFER_TIMEOUT
-	untimeout(fw_xfer_timeout, (void *)xfer, xfer->ch);
-#endif
-
 	if (xfer->fc->status != FWBUSRESET)
 		xfer->act.hand(xfer);
 	else {
@@ -911,13 +899,11 @@
 	}
 }
 
-/*
- * To free IEEE1394 XFER structure. 
- */
 void
-fw_xfer_free( struct fw_xfer* xfer)
+fw_xfer_unload(struct fw_xfer* xfer)
 {
 	int s;
+
 	if(xfer == NULL ) return;
 	if(xfer->state == FWXF_INQ){
 		printf("fw_xfer_free FWXF_INQ\n");
@@ -926,25 +912,31 @@
 		xfer->q->queued --;
 		splx(s);
 	}
-	if(xfer->fc != NULL){
-		if(xfer->state == FWXF_START){
-#if 0 /* this could happen if we call fwohci_arcv() before fwohci_txd() */
-			printf("fw_xfer_free FWXF_START\n");
+	if (xfer->fc != NULL) {
+#if 1 /* this could happen if we call fwohci_arcv() before fwohci_txd() */
+		if(xfer->state == FWXF_START)
+			panic("fw_xfer_free FWXF_START\n");
 #endif
-			s = splfw();
-			xfer->q->drain(xfer->fc, xfer);
-			splx(s);
-		}
+		fw_tl_free(xfer->fc, xfer);
 	}
+	xfer->state = FWXF_INIT;
+	xfer->resp = 0;
+	xfer->retry = 0;
+}
+/*
+ * To free IEEE1394 XFER structure. 
+ */
+void
+fw_xfer_free( struct fw_xfer* xfer)
+{
+	if(xfer == NULL ) return;
+	fw_xfer_unload(xfer);
 	if(xfer->send.buf != NULL){
-		free(xfer->send.buf, M_FW);
+		free(xfer->send.buf, xfer->malloc);
 	}
 	if(xfer->recv.buf != NULL){
-		free(xfer->recv.buf, M_FW);
+		free(xfer->recv.buf, xfer->malloc);
 	}
-	if(xfer->fc != NULL){
-		fw_tl_free(xfer->fc, xfer);
-	}
 	free(xfer, xfer->malloc);
 }
 
@@ -969,24 +961,19 @@
 
 	fc->status = FWBUSPHYCONF;
 
-#if 0
-	DELAY(100000);
-#endif
-	xfer = fw_xfer_alloc(M_FWXFER);
-	xfer->send.len = 12;
-	xfer->send.off = 0;
+	xfer = fw_xfer_alloc_buf(M_FWXFER, 12, 0);
+	if (xfer == NULL)
+		return;
 	xfer->fc = fc;
 	xfer->retry_req = fw_asybusy;
 	xfer->act.hand = fw_asy_callback_free;
 
-	xfer->send.buf = malloc(sizeof(u_int32_t),
-					M_FW, M_NOWAIT | M_ZERO);
 	fp = (struct fw_pkt *)xfer->send.buf;
 	fp->mode.ld[1] = 0;
 	if (root_node >= 0)
-		fp->mode.ld[1] |= htonl((root_node & 0x3f) << 24 | 1 << 23);
+		fp->mode.ld[1] |= (root_node & 0x3f) << 24 | 1 << 23;
 	if (gap_count >= 0)
-		fp->mode.ld[1] |= htonl(1 << 22 | (gap_count & 0x3f) << 16);
+		fp->mode.ld[1] |= 1 << 22 | (gap_count & 0x3f) << 16;
 	fp->mode.ld[2] = ~fp->mode.ld[1];
 /* XXX Dangerous, how to pass PHY packet to device driver */
 	fp->mode.common.tcode |= FWTCODE_PHY;
@@ -1018,9 +1005,9 @@
 /*
  * To receive self ID. 
  */
-void fw_sidrcv(struct firewire_comm* fc, caddr_t buf, u_int len, u_int off)
+void fw_sidrcv(struct firewire_comm* fc, u_int32_t *sid, u_int len)
 {
-	u_int32_t *p, *sid = (u_int32_t *)(buf + off);
+	u_int32_t *p;
 	union fw_self_id *self_id;
 	u_int i, j, node, c_port = 0, i_branch = 0;
 
@@ -1103,9 +1090,7 @@
 	bcopy(p, &CSRARC(fc, SPED_MAP + 8), (fc->speed_map->crc_len - 1)*4);
 
 	fc->max_hop = fc->max_node - i_branch;
-#if 1
 	printf(", maxhop <= %d", fc->max_hop);
-#endif
 		
 	if(fc->irm == -1 ){
 		printf(", Not found IRM capable node");
@@ -1132,7 +1117,6 @@
 				CSRARC(fc, BUS_MGR_ID));
 #endif
 	}
-	free(buf, M_FW);
 	if(fc->irm == ((CSRARC(fc, NODE_IDS) >> 16 ) & 0x3f)){
 		/* I am BMGR */
 		fw_bmr(fc);
@@ -1240,12 +1224,7 @@
 		fwdev->dst = fc->ongonode;
 		fwdev->eui.hi = fc->ongoeui.hi; fwdev->eui.lo = fc->ongoeui.lo;
 		fwdev->status = FWDEVINIT;
-#if 0
-		fwdev->speed = CSRARC(fc, SPED_MAP + 8 + fc->ongonode / 4)
-			>> ((3 - (fc->ongonode % 4)) * 8);
-#else
 		fwdev->speed = fc->speed_map->speed[fc->nodeid][fc->ongonode];
-#endif
 
 		pfwdev = NULL;
 		STAILQ_FOREACH(tfwdev, &fc->devices, link) {
@@ -1276,28 +1255,20 @@
 		fw_bus_explore_callback);
 	if(xfer == NULL) goto done;
 #else
-	xfer = fw_xfer_alloc(M_FWXFER);
+	xfer = fw_xfer_alloc_buf(M_FWXFER, 16, 16);
 	if(xfer == NULL){
 		goto done;
 	}
-	xfer->send.len = 16;
 	xfer->spd = 0;
-	xfer->send.buf = malloc(16, M_FW, M_NOWAIT);
-	if(xfer->send.buf == NULL){
-		fw_xfer_free( xfer);
-		return;
-	}
-
-	xfer->send.off = 0; 
 	fp = (struct fw_pkt *)xfer->send.buf;
-	fp->mode.rreqq.dest_hi = htons(0xffff);
+	fp->mode.rreqq.dest_hi = 0xffff;
 	fp->mode.rreqq.tlrt = 0;
 	fp->mode.rreqq.tcode = FWTCODE_RREQQ;
 	fp->mode.rreqq.pri = 0;
 	fp->mode.rreqq.src = 0;
 	xfer->dst = FWLOCALBUS | fc->ongonode;
-	fp->mode.rreqq.dst = htons(xfer->dst);
-	fp->mode.rreqq.dest_lo = htonl(addr);
+	fp->mode.rreqq.dst = xfer->dst;
+	fp->mode.rreqq.dest_lo = addr;
 	xfer->act.hand = fw_bus_explore_callback;
 
 	if (firewire_debug)
@@ -1330,21 +1301,13 @@
 	struct fw_pkt *fp;
 	int err;
 
-	xfer = fw_xfer_alloc(M_FWXFER);
-	if(xfer == NULL){
+	xfer = fw_xfer_alloc_buf(M_FWXFER, 16, 16);
+	if (xfer == NULL)
 		return NULL;
-	}
-	xfer->send.len = 16;
+
 	xfer->spd = spd; /* XXX:min(spd, fc->spd) */
-	xfer->send.buf = malloc(16, M_FW, M_NOWAIT);
-	if(xfer->send.buf == NULL){
-		fw_xfer_free( xfer);
-		return NULL;
-	}
-
-	xfer->send.off = 0; 
 	fp = (struct fw_pkt *)xfer->send.buf;
-	fp->mode.rreqq.dest_hi = htons(addr_hi & 0xffff);
+	fp->mode.rreqq.dest_hi = addr_hi & 0xffff;
 	if(tl & FWP_TL_VALID){
 		fp->mode.rreqq.tlrt = (tl & 0x3f) << 2;
 	}else{
@@ -1355,8 +1318,8 @@
 	fp->mode.rreqq.pri = 0;
 	fp->mode.rreqq.src = 0;
 	xfer->dst = addr_hi >> 16;
-	fp->mode.rreqq.dst = htons(xfer->dst);
-	fp->mode.rreqq.dest_lo = htonl(addr_lo);
+	fp->mode.rreqq.dst = xfer->dst;
+	fp->mode.rreqq.dest_lo = addr_lo;
 	xfer->act.hand = hand;
 
 	err = fw_asyreq(fc, -1, xfer);
@@ -1420,14 +1383,14 @@
 		qld = (u_int32_t *)xfer->recv.buf;
 		printf("len:%d\n", xfer->recv.len);
 		for( i = 0 ; i <= xfer->recv.len && i < 32; i+= 4){
-			printf("0x%08x ", ntohl(rfp->mode.ld[i/4]));
+			printf("0x%08x ", rfp->mode.ld[i/4]);
 			if((i % 16) == 15) printf("\n");
 		}
 		if((i % 16) != 15) printf("\n");
 	}
 #endif
 	if(fc->ongodev == NULL){
-		if(sfp->mode.rreqq.dest_lo == htonl((0xf0000000 | CSRROMOFF))){
+		if(sfp->mode.rreqq.dest_lo == (0xf0000000 | CSRROMOFF)){
 			rfp->mode.rresq.data = ntohl(rfp->mode.rresq.data);
 			chdr = (struct csrhdr *)(&rfp->mode.rresq.data);
 /* If CSR is minimal confinguration, more investgation is not needed. */
@@ -1439,10 +1402,10 @@
 			}else{
 				fc->ongoaddr = CSRROMOFF + 0xc;
 			}
-		}else if(sfp->mode.rreqq.dest_lo == htonl((0xf0000000 |(CSRROMOFF + 0xc)))){
+		}else if(sfp->mode.rreqq.dest_lo == (0xf0000000 |(CSRROMOFF + 0xc))){
 			fc->ongoeui.hi = ntohl(rfp->mode.rresq.data);
 			fc->ongoaddr = CSRROMOFF + 0x10;
-		}else if(sfp->mode.rreqq.dest_lo == htonl((0xf0000000 |(CSRROMOFF + 0x10)))){
+		}else if(sfp->mode.rreqq.dest_lo == (0xf0000000 |(CSRROMOFF + 0x10))){
 			fc->ongoeui.lo = ntohl(rfp->mode.rresq.data);
 			if (fc->ongoeui.hi == 0 && fc->ongoeui.lo == 0) {
 				if (firewire_debug)
@@ -1701,17 +1664,42 @@
 	return(-1);
 }
 
+static void
+fw_rcv_copy(struct fw_xfer *xfer, struct iovec *vec, int nvec)
+{
+	char *p;
+	int res, i, len;
+
+	p = xfer->recv.buf;
+	res = xfer->recv.len;
+	for (i = 0; i < nvec; i++, vec++) {
+		len = vec->iov_len;
+		if (res < len) {
+			printf("rcv buffer(%d) is %d bytes short.\n",
+						xfer->recv.len, len - res);
+			len = res;
+		}
+		bcopy(vec->iov_base, p, len);
+		p += len;
+		res -= len;
+		if (res <= 0)
+			break;
+	}
+	xfer->recv.len -= res;
+}
+
 /*
  * Generic packet receving process.
  */
 void
-fw_rcv(struct firewire_comm* fc, caddr_t buf, u_int len, u_int sub, u_int off, u_int spd)
+fw_rcv(struct firewire_comm *fc, struct iovec *vec, int nvec, u_int sub, u_int spd)
 {
 	struct fw_pkt *fp, *resfp;
 	struct fw_xfer *xfer;
 	struct fw_bind *bind;
 	struct firewire_softc *sc;
-	int s;
+	int tcode, s;
+	int i, len, oldstate;
 #if 0
 	{
 		u_int32_t *qld;
@@ -1725,25 +1713,37 @@
 		if((i % 16) != 15) printf("\n");
 	}
 #endif
-	fp = (struct fw_pkt *)(buf + off);
-	switch(fp->mode.common.tcode){
+	fp = (struct fw_pkt *)vec[0].iov_base;
+	tcode = fp->mode.common.tcode;
+#if 0 /* XXX this check is not valid for RRESQ and WREQQ */
+	if (vec[0].iov_len < fc->tcode[tcode].hdr_len) {
+#if __FreeBSD_version >= 500000
+		printf("fw_rcv: iov_len(%zu) is less than"
+#else
+		printf("fw_rcv: iov_len(%u) is less than"
+#endif
+			" hdr_len(%d:tcode=%d)\n", vec[0].iov_len,
+			fc->tcode[tcode].hdr_len, tcode);
+	}
+#endif
+	switch (tcode) {
 	case FWTCODE_WRES:
 	case FWTCODE_RRESQ:
 	case FWTCODE_RRESB:
 	case FWTCODE_LRES:
-		xfer = fw_tl2xfer(fc, ntohs(fp->mode.hdr.src),
+		xfer = fw_tl2xfer(fc, fp->mode.hdr.src,
 					fp->mode.hdr.tlrt >> 2);
 		if(xfer == NULL) {
 			printf("fw_rcv: unknown response "
 					"tcode=%d src=0x%x tl=0x%x rt=%d data=0x%x\n",
-					fp->mode.common.tcode,
-					ntohs(fp->mode.hdr.src),
+					tcode,
+					fp->mode.hdr.src,
 					fp->mode.hdr.tlrt >> 2,
 					fp->mode.hdr.tlrt & 3,
 					fp->mode.rresq.data);
 #if 1
 			printf("try ad-hoc work around!!\n");
-			xfer = fw_tl2xfer(fc, ntohs(fp->mode.hdr.src),
+			xfer = fw_tl2xfer(fc, fp->mode.hdr.src,

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



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