Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 3 Jun 2003 08:28:30 -0700 (PDT)
From:      John Baldwin <jhb@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 32480 for review
Message-ID:  <200306031528.h53FSUY0083752@repoman.freebsd.org>

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

Change 32480 by jhb@jhb_laptop on 2003/06/03 08:27:49

	IFC @32475.

Affected files ...

.. //depot/projects/smpng/sys/amd64/amd64/trap.c#6 integrate
.. //depot/projects/smpng/sys/amd64/include/setjmp.h#2 integrate
.. //depot/projects/smpng/sys/dev/aac/aac.c#26 integrate
.. //depot/projects/smpng/sys/dev/ata/ata-card.c#11 integrate
.. //depot/projects/smpng/sys/dev/ccd/ccd.c#26 integrate
.. //depot/projects/smpng/sys/dev/hifn/hifn7751.c#7 integrate
.. //depot/projects/smpng/sys/dev/pccard/pccarddevs#25 integrate
.. //depot/projects/smpng/sys/dev/pccard/pccarddevs.h#25 integrate
.. //depot/projects/smpng/sys/dev/ubsec/ubsec.c#12 integrate
.. //depot/projects/smpng/sys/dev/ubsec/ubsecvar.h#6 integrate
.. //depot/projects/smpng/sys/dev/vinum/vinum.c#13 integrate
.. //depot/projects/smpng/sys/geom/geom_ctl.c#12 integrate
.. //depot/projects/smpng/sys/i386/i386/vm_machdep.c#37 integrate
.. //depot/projects/smpng/sys/i386/include/acpica_machdep.h#2 integrate
.. //depot/projects/smpng/sys/kern/kern_umtx.c#3 integrate
.. //depot/projects/smpng/sys/netinet/ip_fw2.c#12 integrate
.. //depot/projects/smpng/sys/opencrypto/crypto.c#7 integrate
.. //depot/projects/smpng/sys/opencrypto/cryptodev.c#7 integrate
.. //depot/projects/smpng/sys/opencrypto/cryptodev.h#4 integrate
.. //depot/projects/smpng/sys/sys/ccdvar.h#7 integrate
.. //depot/projects/smpng/sys/sys/kernel.h#19 integrate
.. //depot/projects/smpng/sys/sys/proc.h#89 integrate
.. //depot/projects/smpng/sys/sys/umtx.h#2 integrate

Differences ...

==== //depot/projects/smpng/sys/amd64/amd64/trap.c#6 (text+ko) ====

@@ -35,7 +35,7 @@
  * SUCH DAMAGE.
  *
  *	from: @(#)trap.c	7.4 (Berkeley) 5/13/91
- * $FreeBSD: src/sys/amd64/amd64/trap.c,v 1.259 2003/05/23 05:04:53 peter Exp $
+ * $FreeBSD: src/sys/amd64/amd64/trap.c,v 1.260 2003/06/02 21:56:08 peter Exp $
  */
 
 /*
@@ -751,10 +751,14 @@
 
 	case ERESTART:
 		/*
-		 * Reconstruct pc, assuming lcall $X,y is 7 bytes,
-		 * int 0x80 is 2 bytes. We saved this in tf_err.
+		 * Reconstruct pc, we know that 'syscall' is 2 bytes.
+		 * We have to do a full context restore so that %r10
+		 * (which was holding the value of %rcx) is restored for
+		 * the next iteration.
 		 */
 		frame.tf_rip -= frame.tf_err;
+		frame.tf_r10 = frame.tf_rcx;
+		td->td_pcb->pcb_flags |= PCB_FULLCTX;
 		break;
 
 	case EJUSTRETURN:

==== //depot/projects/smpng/sys/amd64/include/setjmp.h#2 (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/amd64/include/setjmp.h,v 1.8 2003/05/01 01:05:23 peter Exp $
+ * $FreeBSD: src/sys/amd64/include/setjmp.h,v 1.9 2003/06/02 21:49:35 peter Exp $
  */
 
 #ifndef _MACHINE_SETJMP_H_
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 
-#define	_JBLEN	22		/* Size of the jmp_buf on x86. */
+#define	_JBLEN	12		/* Size of the jmp_buf on AMD64. */
 
 /*
  * jmp_buf and sigjmp_buf are encapsulated in different structs to force
@@ -45,9 +45,9 @@
  * internally to avoid some run-time errors for mismatches.
  */
 #if __BSD_VISIBLE || __POSIX_VISIBLE || __XSI_VISIBLE
-typedef	struct _sigjmp_buf { int _sjb[_JBLEN + 1]; } sigjmp_buf[1];
+typedef	struct _sigjmp_buf { long _sjb[_JBLEN]; } sigjmp_buf[1];
 #endif
 
-typedef	struct _jmp_buf { int _jb[_JBLEN + 1]; } jmp_buf[1];
+typedef	struct _jmp_buf { long _jb[_JBLEN]; } jmp_buf[1];
 
 #endif /* !_MACHINE_SETJMP_H_ */

==== //depot/projects/smpng/sys/dev/aac/aac.c#26 (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/aac/aac.c,v 1.68 2003/04/28 06:16:20 scottl Exp $
+ *	$FreeBSD: src/sys/dev/aac/aac.c,v 1.69 2003/06/03 02:10:55 scottl Exp $
  */
 
 /*
@@ -306,7 +306,7 @@
 	struct aac_fib *fib;
 	struct aac_mntinfo *mi;
 	struct aac_mntinforesp *mir = NULL;
-	int i = 0;
+	int count = 0, i = 0;
 
 	debug_called(1);
 
@@ -327,14 +327,16 @@
 		mi->MntCount = i;
 		if (aac_sync_fib(sc, ContainerCommand, 0, fib,
 				 sizeof(struct aac_mntinfo))) {
-			debug(2, "error probing container %d", i);
+			printf("error probing container %d", i);
 			continue;
 		}
 
 		mir = (struct aac_mntinforesp *)&fib->data[0];
+		/* XXX Need to check if count changed */
+		count = mir->MntRespCount;
 		aac_add_container(sc, mir, 0);
 		i++;
-	} while ((i < mir->MntRespCount) && (i < AAC_MAX_CONTAINERS));
+	} while ((i < count) && (i < AAC_MAX_CONTAINERS));
 
 	aac_release_sync_fib(sc);
 
@@ -2565,7 +2567,7 @@
 	struct aac_mntinforesp *mir = NULL;
 	u_int16_t rsize;
 	int next, found;
-	int added = 0, i = 0;
+	int count = 0, added = 0, i = 0;
 
 	debug_called(2);
 
@@ -2600,11 +2602,13 @@
 				rsize = sizeof(mir);
 				if (aac_sync_fib(sc, ContainerCommand, 0, fib,
 						 sizeof(struct aac_mntinfo))) {
-					debug(2, "Error probing container %d\n",
+					printf("Error probing container %d\n",
 					      i);
 					continue;
 				}
 				mir = (struct aac_mntinforesp *)&fib->data[0];
+				/* XXX Need to check if count changed */
+				count = mir->MntRespCount;
 				/*
 				 * Check the container against our list.
 				 * co->co_found was already set to 0 in a
@@ -2640,8 +2644,7 @@
 					added = 1;
 				}
 				i++;
-			} while ((i < mir->MntRespCount) &&
-				 (i < AAC_MAX_CONTAINERS));
+			} while ((i < count) && (i < AAC_MAX_CONTAINERS));
 			aac_release_sync_fib(sc);
 
 			/*

==== //depot/projects/smpng/sys/dev/ata/ata-card.c#11 (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/dev/ata/ata-card.c,v 1.12 2003/05/12 15:26:05 phk Exp $
+ * $FreeBSD: src/sys/dev/ata/ata-card.c,v 1.13 2003/06/03 01:30:55 imp Exp $
  */
 
 #include <sys/param.h>
@@ -50,6 +50,7 @@
 	PCMCIA_CARD(EXP, EXPMULTIMEDIA, 0),
 	PCMCIA_CARD(IODATA, CBIDE2, 0),
 	PCMCIA_CARD(OEM2, CDROM1, 0),
+	PCMCIA_CARD(OEM2, IDE, 0),
 	PCMCIA_CARD(PANASONIC, KXLC005, 0),
 	PCMCIA_CARD(TEAC, IDECARDII, 0),
 	{NULL}

==== //depot/projects/smpng/sys/dev/ccd/ccd.c#26 (text+ko) ====

@@ -50,7 +50,7 @@
  *
  *	$NetBSD: ccd.c,v 1.22 1995/12/08 19:13:26 thorpej Exp $ 
  *
- * $FreeBSD: src/sys/dev/ccd/ccd.c,v 1.135 2003/05/31 18:52:05 phk Exp $
+ * $FreeBSD: src/sys/dev/ccd/ccd.c,v 1.137 2003/06/02 21:29:04 phk Exp $
  */
 
 #include <sys/param.h>
@@ -63,14 +63,93 @@
 #include <sys/namei.h>
 #include <sys/conf.h>
 #include <sys/stat.h>
-#include <sys/sysctl.h>
 #include <sys/disk.h>
 #include <sys/fcntl.h>
 #include <sys/vnode.h>
+#include <geom/geom.h>
 #include <geom/geom_disk.h>
 
 #include <sys/ccdvar.h>
 
+/*
+ * Component info table.
+ * Describes a single component of a concatenated disk.
+ */
+struct ccdcinfo {
+	struct vnode	*ci_vp;			/* device's vnode */
+	dev_t		ci_dev;			/* XXX: device's dev_t */
+	size_t		ci_size; 		/* size */
+	char		*ci_path;		/* path to component */
+	size_t		ci_pathlen;		/* length of component path */
+};
+
+/*
+ * Interleave description table.
+ * Computed at boot time to speed irregular-interleave lookups.
+ * The idea is that we interleave in "groups".  First we interleave
+ * evenly over all component disks up to the size of the smallest
+ * component (the first group), then we interleave evenly over all
+ * remaining disks up to the size of the next-smallest (second group),
+ * and so on.
+ *
+ * Each table entry describes the interleave characteristics of one
+ * of these groups.  For example if a concatenated disk consisted of
+ * three components of 5, 3, and 7 DEV_BSIZE blocks interleaved at
+ * DEV_BSIZE (1), the table would have three entries:
+ *
+ *	ndisk	startblk	startoff	dev
+ *	3	0		0		0, 1, 2
+ *	2	9		3		0, 2
+ *	1	13		5		2
+ *	0	-		-		-
+ *
+ * which says that the first nine blocks (0-8) are interleaved over
+ * 3 disks (0, 1, 2) starting at block offset 0 on any component disk,
+ * the next 4 blocks (9-12) are interleaved over 2 disks (0, 2) starting
+ * at component block 3, and the remaining blocks (13-14) are on disk
+ * 2 starting at offset 5.
+ */
+struct ccdiinfo {
+	int	ii_ndisk;	/* # of disks range is interleaved over */
+	daddr_t	ii_startblk;	/* starting scaled block # for range */
+	daddr_t	ii_startoff;	/* starting component offset (block #) */
+	int	*ii_index;	/* ordered list of components in range */
+};
+
+/*
+ * Concatenated disk pseudo-geometry information.
+ */
+struct ccdgeom {
+	u_int32_t	ccg_secsize;	/* # bytes per sector */
+	u_int32_t	ccg_nsectors;	/* # data sectors per track */
+	u_int32_t	ccg_ntracks;	/* # tracks per cylinder */
+	u_int32_t	ccg_ncylinders;	/* # cylinders per unit */
+};
+
+
+/*
+ * A concatenated disk is described by this structure.
+ */
+struct ccd_s {
+	LIST_ENTRY(ccd_s) list;
+
+	int		 sc_unit;		/* logical unit number */
+	struct vnode	 **sc_vpp;		/* array of component vnodes */
+	int		 sc_flags;		/* flags */
+	int		 sc_cflags;		/* configuration flags */
+	size_t		 sc_size;		/* size of ccd */
+	int		 sc_ileave;		/* interleave */
+	u_int		 sc_nccdisks;		/* number of components */
+#define	CCD_MAXNDISKS	 65536
+	struct ccdcinfo	 *sc_cinfo;		/* component info */
+	struct ccdiinfo	 *sc_itable;		/* interleave table */
+	struct ccdgeom   sc_geom;		/* pseudo geometry info */
+	int		 sc_pick;		/* side of mirror picked */
+	daddr_t		 sc_blk[2];		/* mirror localization */
+	struct disk	 *sc_disk;
+	struct cdev	 *__remove00;		/* XXX: remove when convenient */
+};
+
 MALLOC_DEFINE(M_CCD, "CCD driver", "Concatenated Disk driver");
 
 /*
@@ -921,7 +1000,6 @@
 {
 	struct ccd_ioctl *ccio;
 	u_int unit;
-	int error;
 
 	switch (cmd) {
 	case CCDIOCSET:
@@ -929,85 +1007,8 @@
 		ccio = (struct ccd_ioctl *)data;
 		unit = ccio->ccio_size;
 		return (ccdioctltoo(unit, cmd, data, flag, td));
-	case CCDCONFINFO:
-		{
-		int ninit = 0;
-		struct ccdconf *conf = (struct ccdconf *)data;
-		struct ccd_s *tmpcs;
-		struct ccd_s *ubuf = conf->buffer;
-
-		/* XXX: LOCK(unique unit numbers) */
-		LIST_FOREACH(tmpcs, &ccd_softc_list, list)
-			if (IS_INITED(tmpcs))
-				ninit++;
-
-		if (conf->size == 0) {
-			conf->size = sizeof(struct ccd_s) * ninit;
-			return (0);
-		} else if ((conf->size / sizeof(struct ccd_s) != ninit) ||
-		    (conf->size % sizeof(struct ccd_s) != 0)) {
-			/* XXX: UNLOCK(unique unit numbers) */
-			return (EINVAL);
-		}
-
-		ubuf += ninit;
-		LIST_FOREACH(tmpcs, &ccd_softc_list, list) {
-			if (!IS_INITED(tmpcs))
-				continue;
-			error = copyout(tmpcs, --ubuf,
-			    sizeof(struct ccd_s));
-			if (error != 0)
-				/* XXX: UNLOCK(unique unit numbers) */
-				return (error);
-		}
-		/* XXX: UNLOCK(unique unit numbers) */
-		return (0);
-		}
-
-	case CCDCPPINFO:
-		{
-		struct ccdcpps *cpps = (struct ccdcpps *)data;
-		char *ubuf = cpps->buffer;
-		struct ccd_s *cs;
-
-	
-		error = copyin(ubuf, &unit, sizeof (unit));
-		if (error)
-			return (error);
-
-		if (!IS_ALLOCATED(unit))
-			return (ENXIO);
-		cs = ccdfind(unit);
-		if (!IS_INITED(cs))
-			return (ENXIO);
-
-		{
-			int len = 0, i;
-			struct ccdcpps *cpps = (struct ccdcpps *)data;
-			char *ubuf = cpps->buffer;
-
-
-			for (i = 0; i < cs->sc_nccdisks; ++i)
-				len += cs->sc_cinfo[i].ci_pathlen;
-
-			if (cpps->size < len)
-				return (ENOMEM);
-
-			for (i = 0; i < cs->sc_nccdisks; ++i) {
-				len = cs->sc_cinfo[i].ci_pathlen;
-				error = copyout(cs->sc_cinfo[i].ci_path, ubuf,
-				    len);
-				if (error != 0)
-					return (error);
-				ubuf += len;
-			}
-			return(copyout("", ubuf, 1));
-		}
-		break;
-		}
-
 	default:
-		return (ENXIO);
+		return (ENOIOCTL);
 	}
 }
 
@@ -1264,3 +1265,58 @@
 		wakeup(cs);
 	}
 }
+
+static struct sbuf *
+g_ccd_list(int unit)
+{
+	struct sbuf *sb;
+	struct ccd_s *cs;
+	int i;
+
+	sb = sbuf_new(NULL, NULL, 0, SBUF_AUTOEXTEND);
+	sbuf_clear(sb);
+	LIST_FOREACH(cs, &ccd_softc_list, list) {
+		if (!IS_INITED(cs))
+			continue;
+		if (unit >= 0 && unit != cs->sc_unit)
+			continue;
+		sbuf_printf(sb, "ccd%d\t\t%d\t%d\t",
+		    cs->sc_unit, cs->sc_ileave, cs->sc_cflags & CCDF_USERMASK);
+			
+		for (i = 0; i < cs->sc_nccdisks; ++i) {
+			sbuf_printf(sb, "%s%s", i == 0 ? "" : " ",
+			    cs->sc_cinfo[i].ci_path);
+		}
+		sbuf_printf(sb, "\n");
+	}
+	sbuf_finish(sb);
+	return (sb);
+}
+
+static void
+g_ccd_config(struct gctl_req *req, struct g_class *mp, char const *verb)
+{
+	struct sbuf *sb;
+	int u, *up;
+
+	g_topology_assert();
+	if (!strcmp(verb, "create geom")) {
+		gctl_error(req, "TBD");
+	} else if (!strcmp(verb, "destroy geom")) {
+		gctl_error(req, "TBD");
+	} else if (!strcmp(verb, "list")) {
+		up = gctl_get_paraml(req, "unit", sizeof (int));
+		u = *up;
+		sb = g_ccd_list(u);
+		gctl_set_param(req, "output", sbuf_data(sb), sbuf_len(sb) + 1);
+	} else {
+		gctl_error(req, "unknown verb");
+	}
+}
+
+static struct g_class g_ccd_class = {
+	.name = "CCD",
+	.ctlreq = g_ccd_config,
+};
+
+DECLARE_GEOM_CLASS(g_ccd_class, g_ccd);

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

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/dev/hifn/hifn7751.c,v 1.13 2003/03/11 22:47:06 sam Exp $ */
+/* $FreeBSD: src/sys/dev/hifn/hifn7751.c,v 1.14 2003/06/02 23:34:59 sam Exp $ */
 /*	$OpenBSD: hifn7751.c,v 1.120 2002/05/17 00:33:34 deraadt Exp $	*/
 
 /*
@@ -259,7 +259,7 @@
 	bzero(sc, sizeof (*sc));
 	sc->sc_dev = dev;
 
-	mtx_init(&sc->sc_mtx, device_get_nameunit(dev), "crypto driver", MTX_DEF);
+	mtx_init(&sc->sc_mtx, device_get_nameunit(dev), "hifn driver", MTX_DEF);
 
 	/* XXX handle power management */
 
@@ -423,7 +423,7 @@
 	 * NB: Network code assumes we are blocked with splimp()
 	 *     so make sure the IRQ is marked appropriately.
 	 */
-	if (bus_setup_intr(dev, sc->sc_irq, INTR_TYPE_NET,
+	if (bus_setup_intr(dev, sc->sc_irq, INTR_TYPE_NET | INTR_MPSAFE,
 			   hifn_intr, sc, &sc->sc_intrhand)) {
 		device_printf(dev, "could not setup interrupt\n");
 		goto fail_intr2;
@@ -524,7 +524,8 @@
 
 	KASSERT(sc != NULL, ("hifn_detach: null software carrier!"));
 
-	HIFN_LOCK(sc);
+	/* disable interrupts */
+	WRITE_REG_1(sc, HIFN_1_DMA_IER, 0);
 
 	/*XXX other resources */
 	callout_stop(&sc->sc_tickto);
@@ -550,8 +551,6 @@
 	bus_release_resource(dev, SYS_RES_MEMORY, HIFN_BAR1, sc->sc_bar1res);
 	bus_release_resource(dev, SYS_RES_MEMORY, HIFN_BAR0, sc->sc_bar0res);
 
-	HIFN_UNLOCK(sc);
-
 	mtx_destroy(&sc->sc_mtx);
 
 	return (0);
@@ -1627,6 +1626,7 @@
 	 *
 	 * NB: check this first since it's easy.
 	 */
+	HIFN_LOCK(sc);
 	if ((dma->cmdu + 1) > HIFN_D_CMD_RSIZE ||
 	    (dma->resu + 1) > HIFN_D_RES_RSIZE) {
 #ifdef HIFN_DEBUG
@@ -1637,11 +1637,13 @@
 		}
 #endif
 		hifnstats.hst_nomem_cr++;
+		HIFN_UNLOCK(sc);
 		return (ERESTART);
 	}
 
 	if (bus_dmamap_create(sc->sc_dmat, BUS_DMA_NOWAIT, &cmd->src_map)) {
 		hifnstats.hst_nomem_map++;
+		HIFN_UNLOCK(sc);
 		return (ENOMEM);
 	}
 
@@ -1912,6 +1914,7 @@
 #endif
 
 	sc->sc_active = 5;
+	HIFN_UNLOCK(sc);
 	KASSERT(err == 0, ("hifn_crypto: success with error %u", err));
 	return (err);		/* success */
 
@@ -1929,6 +1932,7 @@
 	bus_dmamap_unload(sc->sc_dmat, cmd->src_map);
 err_srcmap1:
 	bus_dmamap_destroy(sc->sc_dmat, cmd->src_map);
+	HIFN_UNLOCK(sc);
 	return (err);
 }
 
@@ -1974,11 +1978,16 @@
 	u_int32_t dmacsr, restart;
 	int i, u;
 
+	dmacsr = READ_REG_1(sc, HIFN_1_DMA_CSR);
+
+	/* Nothing in the DMA unit interrupted */
+	if ((dmacsr & sc->sc_dmaier) == 0)
+		return;
+
 	HIFN_LOCK(sc);
+
 	dma = sc->sc_dma;
 
-	dmacsr = READ_REG_1(sc, HIFN_1_DMA_CSR);
-
 #ifdef HIFN_DEBUG
 	if (hifn_debug) {
 		device_printf(sc->sc_dev,
@@ -1990,13 +1999,6 @@
 	}
 #endif
 
-	/* Nothing in the DMA unit interrupted */
-	if ((dmacsr & sc->sc_dmaier) == 0) {
-		hifnstats.hst_noirq++;
-		HIFN_UNLOCK(sc);
-		return;
-	}
-
 	WRITE_REG_1(sc, HIFN_1_DMA_CSR, dmacsr & sc->sc_dmaier);
 
 	if ((sc->sc_flags & HIFN_HAS_PUBLIC) &&
@@ -2104,6 +2106,8 @@
 	}
 	dma->cmdk = i; dma->cmdu = u;
 
+	HIFN_UNLOCK(sc);
+
 	if (sc->sc_needwakeup) {		/* XXX check high watermark */
 		int wakeup = sc->sc_needwakeup & (CRYPTO_SYMQ|CRYPTO_ASYMQ);
 #ifdef HIFN_DEBUG
@@ -2116,7 +2120,6 @@
 		sc->sc_needwakeup &= ~wakeup;
 		crypto_unblock(sc->sc_cid, wakeup);
 	}
-	HIFN_UNLOCK(sc);
 }
 
 /*

==== //depot/projects/smpng/sys/dev/pccard/pccarddevs#25 (text+ko) ====

@@ -1,4 +1,4 @@
-$FreeBSD: src/sys/dev/pccard/pccarddevs,v 1.50 2003/04/27 03:31:47 imp Exp $
+$FreeBSD: src/sys/dev/pccard/pccarddevs,v 1.51 2003/06/03 01:29:01 imp Exp $
 /* $NetBSD: pcmciadevs,v 1.182 2003/04/09 02:09:55 christos Exp $ */
 /* $OpenBSD: pcmciadevs,v 1.93 2002/06/21 08:31:10 henning Exp $ */
 
@@ -522,6 +522,7 @@
 product NEWMEDIA BASICS_SCSI	{ "BASICS&spby&spNew&spMedia&spCorporation" "SCSI&spSym53C500", NULL, NULL } New Media Corporation BASICS SCSI
 product NTT_ME WLAN		{ "NTT-ME", "11Mbps&spWireless&spLAN&spPC&spCard", NULL, NULL } NTT-ME 11Mbps Wireless LAN PC Card
 product OEM2 CDROM1	{ "PCMCIA", "CD-ROM", NULL, NULL } Generic PCMCIA CD-ROM
+product OEM2 IDE	{ "PCMCIA", "IDE&spCARD", NULL, NULL } Generic PCMCIA IDE CARD
 product PLANET SMARTCOM2000	{ "PCMCIA", "UE2212", NULL, NULL } Planet SmartCOM 2000
 /*
  * vendor ID of both FNW-3600-T and FNW-3700-T is LINKSYS (0x0149) and

==== //depot/projects/smpng/sys/dev/pccard/pccarddevs.h#25 (text+ko) ====

@@ -1,10 +1,10 @@
-/*	$FreeBSD: src/sys/dev/pccard/pccarddevs.h,v 1.50 2003/04/27 03:32:09 imp Exp $	*/
+/*	$FreeBSD: src/sys/dev/pccard/pccarddevs.h,v 1.51 2003/06/03 01:29:58 imp Exp $	*/
 
 /*
  * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.
  *
  * generated from:
- *	FreeBSD: src/sys/dev/pccard/pccarddevs,v 1.50 2003/04/27 03:31:47 imp Exp 
+ *	FreeBSD: src/sys/dev/pccard/pccarddevs,v 1.51 2003/06/03 01:29:01 imp Exp 
  */
 /* $NetBSD: pcmciadevs,v 1.182 2003/04/09 02:09:55 christos Exp $ */
 /* $OpenBSD: pcmciadevs,v 1.93 2002/06/21 08:31:10 henning Exp $ */
@@ -969,6 +969,9 @@
 #define	PCMCIA_CIS_OEM2_CDROM1	{ "PCMCIA", "CD-ROM", NULL, NULL }
 #define	PCMCIA_PRODUCT_OEM2_CDROM1	0xffffffff
 #define	PCMCIA_STR_OEM2_CDROM1	"Generic PCMCIA CD-ROM"
+#define	PCMCIA_CIS_OEM2_IDE	{ "PCMCIA", "IDE CARD", NULL, NULL }
+#define	PCMCIA_PRODUCT_OEM2_IDE	0xffffffff
+#define	PCMCIA_STR_OEM2_IDE	"Generic PCMCIA IDE CARD"
 #define	PCMCIA_CIS_PLANET_SMARTCOM2000	{ "PCMCIA", "UE2212", NULL, NULL }
 #define	PCMCIA_PRODUCT_PLANET_SMARTCOM2000	0xffffffff
 #define	PCMCIA_STR_PLANET_SMARTCOM2000	"Planet SmartCOM 2000"

==== //depot/projects/smpng/sys/dev/ubsec/ubsec.c#12 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/dev/ubsec/ubsec.c,v 1.21 2003/04/27 04:26:22 sam Exp $ */
+/* $FreeBSD: src/sys/dev/ubsec/ubsec.c,v 1.22 2003/06/02 23:32:03 sam Exp $ */
 /*	$OpenBSD: ubsec.c,v 1.115 2002/09/24 18:33:26 jason Exp $	*/
 
 /*
@@ -260,12 +260,9 @@
 	u_int32_t cmd, i;
 	int rid;
 
-	KASSERT(sc != NULL, ("ubsec_attach: null software carrier!"));
 	bzero(sc, sizeof (*sc));
 	sc->sc_dev = dev;
 
-	mtx_init(&sc->sc_mtx, device_get_nameunit(dev), "crypto driver", MTX_DEF);
-
 	SIMPLEQ_INIT(&sc->sc_queue);
 	SIMPLEQ_INIT(&sc->sc_qchip);
 	SIMPLEQ_INIT(&sc->sc_queue2);
@@ -346,7 +343,7 @@
 	 * NB: Network code assumes we are blocked with splimp()
 	 *     so make sure the IRQ is mapped appropriately.
 	 */
-	if (bus_setup_intr(dev, sc->sc_irq, INTR_TYPE_NET,
+	if (bus_setup_intr(dev, sc->sc_irq, INTR_TYPE_NET | INTR_MPSAFE,
 			   ubsec_intr, sc, &sc->sc_ih)) {
 		device_printf(dev, "could not establish interrupt\n");
 		goto bad2;
@@ -399,6 +396,10 @@
 
 		SIMPLEQ_INSERT_TAIL(&sc->sc_freequeue, q, q_next);
 	}
+	mtx_init(&sc->sc_mcr1lock, device_get_nameunit(dev),
+		"mcr1 operations", MTX_DEF);
+	mtx_init(&sc->sc_freeqlock, device_get_nameunit(dev),
+		"mcr1 free q", MTX_DEF);
 
 	device_printf(sc->sc_dev, "%s\n", ubsec_partname(sc));
 
@@ -467,6 +468,8 @@
 	;
 	}
 #endif /* UBSEC_NO_RNG */
+	mtx_init(&sc->sc_mcr2lock, device_get_nameunit(dev),
+		"mcr2 operations", MTX_DEF);
 
 	if (sc->sc_flags & UBS_FLAGS_KEY) {
 		sc->sc_statmask |= BS_STAT_MCR2_DONE;
@@ -488,7 +491,6 @@
 bad1:
 	bus_release_resource(dev, SYS_RES_MEMORY, BS_BAR, sc->sc_sr);
 bad:
-	mtx_destroy(&sc->sc_mtx);
 	return (ENXIO);
 }
 
@@ -500,11 +502,11 @@
 {
 	struct ubsec_softc *sc = device_get_softc(dev);
 
-	KASSERT(sc != NULL, ("ubsec_detach: null software carrier"));
-
 	/* XXX wait/abort active ops */
 
-	UBSEC_LOCK(sc);
+	/* disable interrupts */
+	WRITE_REG(sc, BS_CTRL, READ_REG(sc, BS_CTRL) &~
+		(BS_CTRL_MCR2INT | BS_CTRL_MCR1INT | BS_CTRL_DMAERR));
 
 	callout_stop(&sc->sc_rngto);
 
@@ -523,6 +525,7 @@
 		ubsec_dma_free(sc, &q->q_dma->d_alloc);
 		free(q, M_DEVBUF);
 	}
+	mtx_destroy(&sc->sc_mcr1lock);
 #ifndef UBSEC_NO_RNG
 	if (sc->sc_flags & UBS_FLAGS_RNG) {
 		ubsec_dma_free(sc, &sc->sc_rng.rng_q.q_mcr);
@@ -530,6 +533,7 @@
 		ubsec_dma_free(sc, &sc->sc_rng.rng_buf);
 	}
 #endif /* UBSEC_NO_RNG */
+	mtx_destroy(&sc->sc_mcr2lock);
 
 	bus_generic_detach(dev);
 	bus_teardown_intr(dev, sc->sc_irq, sc->sc_ih);
@@ -538,10 +542,6 @@
 	bus_dma_tag_destroy(sc->sc_dmat);
 	bus_release_resource(dev, SYS_RES_MEMORY, BS_BAR, sc->sc_sr);
 
-	UBSEC_UNLOCK(sc);
-
-	mtx_destroy(&sc->sc_mtx);
-
 	return (0);
 }
 
@@ -565,7 +565,6 @@
 {
 	struct ubsec_softc *sc = device_get_softc(dev);
 
-	KASSERT(sc != NULL, ("ubsec_suspend: null software carrier"));
 #ifdef notyet
 	/* XXX stop the device and save PCI settings */
 #endif
@@ -579,7 +578,6 @@
 {
 	struct ubsec_softc *sc = device_get_softc(dev);
 
-	KASSERT(sc != NULL, ("ubsec_resume: null software carrier"));
 #ifdef notyet
 	/* XXX retore PCI settings and start the device */
 #endif
@@ -599,14 +597,10 @@
 	struct ubsec_dma *dmap;
 	int npkts = 0, i;
 
-	UBSEC_LOCK(sc);
-
 	stat = READ_REG(sc, BS_STAT);
 	stat &= sc->sc_statmask;
-	if (stat == 0) {
-		UBSEC_UNLOCK(sc);
+	if (stat == 0)
 		return;
-	}
 
 	WRITE_REG(sc, BS_STAT, stat);		/* IACK */
 
@@ -614,6 +608,7 @@
 	 * Check to see if we have any packets waiting for us
 	 */
 	if ((stat & BS_STAT_MCR1_DONE)) {
+		mtx_lock(&sc->sc_mcr1lock);
 		while (!SIMPLEQ_EMPTY(&sc->sc_qchip)) {
 			q = SIMPLEQ_FIRST(&sc->sc_qchip);
 			dmap = q->q_dma;
@@ -639,13 +634,13 @@
 			}
 			ubsec_callback(sc, q);
 		}
-
 		/*
 		 * Don't send any more packet to chip if there has been
 		 * a DMAERR.
 		 */
 		if (!(stat & BS_STAT_DMAERR))
 			ubsec_feed(sc);
+		mtx_unlock(&sc->sc_mcr1lock);
 	}
 
 	/*
@@ -656,6 +651,7 @@
 		struct ubsec_q2 *q2;
 		struct ubsec_mcr *mcr;
 
+		mtx_lock(&sc->sc_mcr2lock);
 		while (!SIMPLEQ_EMPTY(&sc->sc_qchip2)) {
 			q2 = SIMPLEQ_FIRST(&sc->sc_qchip2);
 
@@ -677,6 +673,7 @@
 			if (!(stat & BS_STAT_DMAERR))
 				ubsec_feed2(sc);
 		}
+		mtx_unlock(&sc->sc_mcr2lock);
 	}
 
 	/*
@@ -693,8 +690,10 @@
 		}
 #endif /* UBSEC_DEBUG */
 		ubsecstats.hst_dmaerr++;
+		mtx_lock(&sc->sc_mcr1lock);
 		ubsec_totalreset(sc);
 		ubsec_feed(sc);
+		mtx_unlock(&sc->sc_mcr1lock);
 	}
 
 	if (sc->sc_needwakeup) {		/* XXX check high watermark */
@@ -707,8 +706,6 @@
 		sc->sc_needwakeup &= ~wakeup;
 		crypto_unblock(sc->sc_cid, wakeup);
 	}
-
-	UBSEC_UNLOCK(sc);
 }
 
 /*
@@ -843,7 +840,6 @@
 	SHA1_CTX sha1ctx;
 	int i, sesn;
 
-	KASSERT(sc != NULL, ("ubsec_newsession: null softc"));
 	if (sidp == NULL || cri == NULL || sc == NULL)
 		return (EINVAL);
 
@@ -895,9 +891,9 @@
 			sc->sc_nsessions++;
 		}
 	}
-
 	bzero(ses, sizeof(struct ubsec_session));
 	ses->ses_used = 1;
+
 	if (encini) {
 		/* get an IV, network byte order */
 		/* XXX may read fewer than requested */
@@ -977,19 +973,21 @@
 ubsec_freesession(void *arg, u_int64_t tid)
 {
 	struct ubsec_softc *sc = arg;
-	int session;
+	int session, ret;
 	u_int32_t sid = ((u_int32_t) tid) & 0xffffffff;
 
-	KASSERT(sc != NULL, ("ubsec_freesession: null softc"));
 	if (sc == NULL)
 		return (EINVAL);
 
 	session = UBSEC_SESSION(sid);
-	if (session >= sc->sc_nsessions)
-		return (EINVAL);
+	if (session < sc->sc_nsessions) {
+		bzero(&sc->sc_sessions[session],
+			sizeof(sc->sc_sessions[session]));
+		ret = 0;
+	} else
+		ret = EINVAL;
 
-	bzero(&sc->sc_sessions[session], sizeof(sc->sc_sessions[session]));
-	return (0);
+	return (ret);
 }
 
 static void
@@ -1032,17 +1030,16 @@
 		return (EINVAL);
 	}
 
-	UBSEC_LOCK(sc);
-
+	mtx_lock(&sc->sc_freeqlock);
 	if (SIMPLEQ_EMPTY(&sc->sc_freequeue)) {
 		ubsecstats.hst_queuefull++;
 		sc->sc_needwakeup |= CRYPTO_SYMQ;
-		UBSEC_UNLOCK(sc);
+		mtx_unlock(&sc->sc_freeqlock);
 		return (ERESTART);
 	}
 	q = SIMPLEQ_FIRST(&sc->sc_freequeue);
 	SIMPLEQ_REMOVE_HEAD(&sc->sc_freequeue, q, q_next);
-	UBSEC_UNLOCK(sc);
+	mtx_unlock(&sc->sc_freeqlock);
 
 	dmap = q->q_dma; /* Save dma pointer */
 	bzero(q, sizeof(struct ubsec_q));
@@ -1509,14 +1506,14 @@
 		    offsetof(struct ubsec_dmachunk, d_ctx),
 		    sizeof(struct ubsec_pktctx));
 
-	UBSEC_LOCK(sc);
+	mtx_lock(&sc->sc_mcr1lock);
 	SIMPLEQ_INSERT_TAIL(&sc->sc_queue, q, q_next);
 	sc->sc_nqueue++;
 	ubsecstats.hst_ipackets++;
 	ubsecstats.hst_ibytes += dmap->d_alloc.dma_size;
 	if ((hint & CRYPTO_HINT_MORE) == 0 || sc->sc_nqueue >= UBS_MAX_AGGR)
 		ubsec_feed(sc);
-	UBSEC_UNLOCK(sc);
+	mtx_unlock(&sc->sc_mcr1lock);
 	return (0);
 
 errout:
@@ -1533,9 +1530,9 @@
 			bus_dmamap_destroy(sc->sc_dmat, q->q_src_map);
 		}
 
-		UBSEC_LOCK(sc);
+		mtx_lock(&sc->sc_freeqlock);
 		SIMPLEQ_INSERT_TAIL(&sc->sc_freequeue, q, q_next);
-		UBSEC_UNLOCK(sc);
+		mtx_unlock(&sc->sc_freeqlock);
 	}
 	if (err != ERESTART) {
 		crp->crp_etype = err;
@@ -1606,7 +1603,9 @@
 			    crp->crp_mac, 12);
 		break;
 	}
+	mtx_lock(&sc->sc_freeqlock);
 	SIMPLEQ_INSERT_TAIL(&sc->sc_freequeue, q, q_next);
+	mtx_unlock(&sc->sc_freeqlock);
 	crypto_done(crp);
 }
 
@@ -1778,9 +1777,9 @@
 	struct ubsec_mcr *mcr;
 	struct ubsec_ctx_rngbypass *ctx;
 
-	UBSEC_LOCK(sc);
+	mtx_lock(&sc->sc_mcr2lock);
 	if (rng->rng_used) {
-		UBSEC_UNLOCK(sc);
+		mtx_unlock(&sc->sc_mcr2lock);
 		return;
 	}
 	sc->sc_nqueue2++;
@@ -1811,7 +1810,7 @@
 	rng->rng_used = 1;
 	ubsec_feed2(sc);
 	ubsecstats.hst_rng++;
-	UBSEC_UNLOCK(sc);
+	mtx_unlock(&sc->sc_mcr2lock);
 
 	return;
 
@@ -1820,7 +1819,7 @@
 	 * Something weird happened, generate our own call back.
 	 */
 	sc->sc_nqueue2--;
-	UBSEC_UNLOCK(sc);
+	mtx_unlock(&sc->sc_mcr2lock);
 	callout_reset(&sc->sc_rngto, sc->sc_rnghz, ubsec_rng, sc);
 }
 #endif /* UBSEC_NO_RNG */
@@ -2302,11 +2301,11 @@
 	ubsec_dma_sync(&me->me_epb, BUS_DMASYNC_PREWRITE);
 
 	/* Enqueue and we're done... */
-	UBSEC_LOCK(sc);
+	mtx_lock(&sc->sc_mcr2lock);
 	SIMPLEQ_INSERT_TAIL(&sc->sc_queue2, &me->me_q, q_next);
 	ubsec_feed2(sc);
 	ubsecstats.hst_modexp++;
-	UBSEC_UNLOCK(sc);
+	mtx_unlock(&sc->sc_mcr2lock);
 
 	return (0);
 
@@ -2504,10 +2503,10 @@
 	ubsec_dma_sync(&me->me_epb, BUS_DMASYNC_PREWRITE);
 
 	/* Enqueue and we're done... */
-	UBSEC_LOCK(sc);
+	mtx_lock(&sc->sc_mcr2lock);
 	SIMPLEQ_INSERT_TAIL(&sc->sc_queue2, &me->me_q, q_next);
 	ubsec_feed2(sc);
-	UBSEC_UNLOCK(sc);
+	mtx_unlock(&sc->sc_mcr2lock);
 
 	return (0);
 
@@ -2698,11 +2697,11 @@
 	ubsec_dma_sync(&rp->rpr_msgout, BUS_DMASYNC_PREREAD);
 
 	/* Enqueue and we're done... */
-	UBSEC_LOCK(sc);
+	mtx_lock(&sc->sc_mcr2lock);
 	SIMPLEQ_INSERT_TAIL(&sc->sc_queue2, &rp->rpr_q, q_next);
 	ubsec_feed2(sc);
 	ubsecstats.hst_modexpcrt++;
-	UBSEC_UNLOCK(sc);
+	mtx_unlock(&sc->sc_mcr2lock);
 	return (0);
 
 errout:

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

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/dev/ubsec/ubsecvar.h,v 1.6 2003/03/11 22:47:06 sam Exp $ */

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



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