PERFORCE change 32480 for review
John Baldwin
jhb at FreeBSD.org
Tue Jun 3 08:28:34 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=32480
Change 32480 by jhb at 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) <<<
More information about the p4-projects
mailing list