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>