Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 28 Oct 2025 23:46:23 GMT
From:      "David E. O'Brien" <obrien@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 685a78570b35 - main - random: remove hifn(4)
Message-ID:  <202510282346.59SNkNN2039995@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by obrien:

URL: https://cgit.FreeBSD.org/src/commit/?id=685a78570b359eb2bd4d8c28dde22de54d55b8ec

commit 685a78570b359eb2bd4d8c28dde22de54d55b8ec
Author:     David E. O'Brien <obrien@FreeBSD.org>
AuthorDate: 2025-10-18 03:15:50 +0000
Commit:     David E. O'Brien <obrien@FreeBSD.org>
CommitDate: 2025-10-28 23:46:15 +0000

    random: remove hifn(4)
    
    The Hifn 7955 & 7956 only supports deprecated & NIST disallowed
    algorithms (NIST SP800-224idp): SHA1 and SHA1-HMAC.
    
    Furthermore the entropy RNG of the Hifn 7751, 7951, 7811, 7955,
    and 7956 has no NIST Entropy Source Validation (ESV) certificate
    and cannot be used in a FIPS-140-3 nor Common Criteara environment.
    
    Furthermore the most prolific instance for FreeBSD was the
    Soekris Engineering vpn1201, vpn1211, vpn1401, and vpn1411
    offerings.  These are all 32-bit only processors.  The i386
    kernel was de-supported in 15.0.
    
    Reviewed by:    jhb
    Differential Revision:  https://reviews.freebsd.org/D53182
---
 ObsoleteFiles.inc                        |    3 +
 share/man/man4/hifn.4                    |  132 --
 share/man/man4/rndtest.4                 |    1 -
 sys/conf/NOTES                           |    4 -
 sys/conf/files                           |    1 -
 sys/conf/options                         |    4 -
 sys/dev/hifn/hifn7751.c                  | 2739 ------------------------------
 sys/dev/hifn/hifn7751reg.h               |  542 ------
 sys/dev/hifn/hifn7751var.h               |  346 ----
 sys/dev/random/fenestrasX/fx_pool.c      |    3 -
 sys/dev/random/random_harvestq.c         |    1 -
 sys/modules/Makefile                     |    1 -
 sys/modules/hifn/Makefile                |   12 -
 sys/sys/random.h                         |    1 -
 tools/kerneldoc/subsys/Doxyfile-dev_hifn |   19 -
 tools/tools/crypto/Makefile              |    3 +-
 tools/tools/crypto/hifnstats.c           |   63 -
 17 files changed, 4 insertions(+), 3871 deletions(-)

diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc
index 3645cff43458..e415c2c5f9fe 100644
--- a/ObsoleteFiles.inc
+++ b/ObsoleteFiles.inc
@@ -51,6 +51,9 @@
 #   xargs -n1 | sort | uniq -d;
 # done
 
+# 20251028: Remove hifn(4)
+OLD_FILES+=share/man/man4/hifn.4
+
 # 20251006: Remove libnss_tacplus.a (it never should have been installed)
 OLD_FILES+=usr/lib/libnss_tacplus.a
 
diff --git a/share/man/man4/hifn.4 b/share/man/man4/hifn.4
deleted file mode 100644
index 22494fcb6c6d..000000000000
--- a/share/man/man4/hifn.4
+++ /dev/null
@@ -1,132 +0,0 @@
-.\"	$OpenBSD: hifn.4,v 1.32 2002/09/26 07:55:40 miod Exp $
-.\"
-.\" Copyright (c) 2000 Theo de Raadt
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in the
-.\"    documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-.\" DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
-.\" INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-.\" ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-.\" POSSIBILITY OF SUCH DAMAGE.
-.\"
-.Dd July 29, 2020
-.Dt HIFN 4
-.Os
-.Sh NAME
-.Nm hifn
-.Nd Hifn 7751/7951/7811/7955/7956 crypto accelerator
-.Sh SYNOPSIS
-To compile this driver into the kernel,
-place the following lines in your
-kernel configuration file:
-.Bd -ragged -offset indent
-.Cd "device crypto"
-.Cd "device cryptodev"
-.Cd "device hifn"
-.Ed
-.Pp
-Alternatively, to load the driver as a
-module at boot time, place the following line in
-.Xr loader.conf 5 :
-.Bd -literal -offset indent
-hifn_load="YES"
-.Ed
-.Sh DESCRIPTION
-The
-.Nm
-driver supports various cards containing the Hifn 7751, 7951,
-7811, 7955, and 7956 chipsets.
-.Pp
-The
-.Nm
-driver registers itself to accelerate
-AES (7955 and 7956 only),
-SHA1, and SHA1-HMAC operations for
-.Xr ipsec 4
-and
-.Xr crypto 4 .
-.Pp
-The Hifn
-.Tn 7951 ,
-.Tn 7811 ,
-.Tn 7955 ,
-and
-.Tn 7956
-will also supply data to the kernel
-.Xr random 4
-subsystem.
-.Sh HARDWARE
-The
-.Nm
-driver supports various cards containing the Hifn 7751, 7951,
-7811, 7955, and 7956
-chipsets, such as:
-.Bl -tag -width namenamenamena -offset indent
-.It Invertex AEON
-No longer being made.
-Came as 128KB SRAM model, or 2MB DRAM model.
-.It Hifn 7751
-Reference board with 512KB SRAM.
-.It PowerCrypt
-Comes with 512KB SRAM.
-.It XL-Crypt
-Only board based on 7811 (which is faster than 7751 and has
-a random number generator).
-.It NetSec 7751
-Supports the most IPsec sessions, with 1MB SRAM.
-.It Soekris Engineering vpn1201 and vpn1211
-See
-.Pa http://www.soekris.com/ .
-Contains a 7951 and supports symmetric and random number operations.
-.It Soekris Engineering vpn1401 and vpn1411
-See
-.Pa http://www.soekris.com/ .
-Contains a 7955 and supports symmetric and random number operations.
-.El
-.Sh SEE ALSO
-.Xr crypto 4 ,
-.Xr intro 4 ,
-.Xr ipsec 4 ,
-.Xr random 4 ,
-.Xr crypto 7 ,
-.Xr crypto 9
-.Sh HISTORY
-The
-.Nm
-device driver appeared in
-.Ox 2.7 .
-The
-.Nm
-device driver was imported to
-.Fx 5.0 .
-.Sh CAVEATS
-The Hifn 9751 shares the same PCI ID.
-This chip is basically a 7751, but with the cryptographic functions missing.
-Instead, the 9751 is only capable of doing compression.
-Since we do not currently attempt to use any of these chips to do
-compression, the 9751-based cards are not useful.
-.Pp
-Support for the 7955 and 7956 is incomplete; the asymmetric crypto
-facilities are to be added and the performance is suboptimal.
-.Sh BUGS
-The 7751 chip starts out at initialization by only supporting compression.
-A proprietary algorithm, which has been reverse engineered, is required to
-unlock the cryptographic functionality of the chip.
-It is possible for vendors to make boards which have a lock ID not known
-to the driver, but all vendors currently just use the obvious ID which is
-13 bytes of 0.
diff --git a/share/man/man4/rndtest.4 b/share/man/man4/rndtest.4
index 9ed16caf3b87..c73302063cd3 100644
--- a/share/man/man4/rndtest.4
+++ b/share/man/man4/rndtest.4
@@ -49,7 +49,6 @@ is received from the device.
 Failures are optionally reported on the console.
 .Sh SEE ALSO
 .Xr crypto 4 ,
-.Xr hifn 4 ,
 .Xr random 4 ,
 .Xr safe 4 ,
 .Xr crypto 9
diff --git a/sys/conf/NOTES b/sys/conf/NOTES
index 9944375c3615..df71aa60099d 100644
--- a/sys/conf/NOTES
+++ b/sys/conf/NOTES
@@ -2655,10 +2655,6 @@ device		rndtest		# FIPS 140-2 entropy tester
 
 device		ccr		# Chelsio T6
 
-device		hifn		# Hifn 7951, 7781, etc.
-options 	HIFN_DEBUG	# enable debugging support: hw.hifn.debug
-options 	HIFN_RNDTEST	# enable rndtest support
-
 device		safe		# SafeNet 1141
 options 	SAFE_DEBUG	# enable debugging support: hw.safe.debug
 options 	SAFE_RNDTEST	# enable rndtest support
diff --git a/sys/conf/files b/sys/conf/files
index 0a24b5e1e39b..87c8830b192e 100644
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -1782,7 +1782,6 @@ dev/hid/ietp.c			optional ietp
 dev/hid/ps4dshock.c		optional ps4dshock
 dev/hid/u2f.c			optional u2f
 dev/hid/xb360gp.c		optional xb360gp
-dev/hifn/hifn7751.c		optional hifn
 dev/hptiop/hptiop.c		optional hptiop scbus
 dev/hwpmc/hwpmc_logging.c	optional hwpmc
 dev/hwpmc/hwpmc_mod.c		optional hwpmc
diff --git a/sys/conf/options b/sys/conf/options
index 0b795a8d28fb..b00b381d1da1 100644
--- a/sys/conf/options
+++ b/sys/conf/options
@@ -736,10 +736,6 @@ BCE_NVRAM_WRITE_SUPPORT	opt_bce.h
 SOCKBUF_DEBUG		opt_global.h
 
 
-# options for hifn driver
-HIFN_DEBUG		opt_hifn.h
-HIFN_RNDTEST		opt_hifn.h
-
 # options for safenet driver
 SAFE_DEBUG		opt_safe.h
 SAFE_NO_RNG		opt_safe.h
diff --git a/sys/dev/hifn/hifn7751.c b/sys/dev/hifn/hifn7751.c
deleted file mode 100644
index 2e7545779b09..000000000000
--- a/sys/dev/hifn/hifn7751.c
+++ /dev/null
@@ -1,2739 +0,0 @@
-/*	$OpenBSD: hifn7751.c,v 1.120 2002/05/17 00:33:34 deraadt Exp $	*/
-
-/*-
- * SPDX-License-Identifier: BSD-3-Clause
- *
- * Invertex AEON / Hifn 7751 driver
- * Copyright (c) 1999 Invertex Inc. All rights reserved.
- * Copyright (c) 1999 Theo de Raadt
- * Copyright (c) 2000-2001 Network Security Technologies, Inc.
- *			http://www.netsec.net
- * Copyright (c) 2003 Hifn Inc.
- *
- * This driver is based on a previous driver by Invertex, for which they
- * requested:  Please send any comments, feedback, bug-fixes, or feature
- * requests to software@invertex.com.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *   derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Effort sponsored in part by the Defense Advanced Research Projects
- * Agency (DARPA) and Air Force Research Laboratory, Air Force
- * Materiel Command, USAF, under agreement number F30602-01-2-0537.
- */
-
-#include <sys/cdefs.h>
-/*
- * Driver for various Hifn encryption processors.
- */
-#include "opt_hifn.h"
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/proc.h>
-#include <sys/errno.h>
-#include <sys/malloc.h>
-#include <sys/kernel.h>
-#include <sys/module.h>
-#include <sys/mbuf.h>
-#include <sys/lock.h>
-#include <sys/mutex.h>
-#include <sys/sysctl.h>
-#include <sys/uio.h>
-
-#include <vm/vm.h>
-#include <vm/pmap.h>
-
-#include <machine/bus.h>
-#include <machine/resource.h>
-#include <sys/bus.h>
-#include <sys/rman.h>
-
-#include <opencrypto/cryptodev.h>
-#include <opencrypto/xform_auth.h>
-#include <sys/random.h>
-#include <sys/kobj.h>
-
-#include "cryptodev_if.h"
-
-#include <dev/pci/pcivar.h>
-#include <dev/pci/pcireg.h>
-
-#ifdef HIFN_RNDTEST
-#include <dev/rndtest/rndtest.h>
-#endif
-#include <dev/hifn/hifn7751reg.h>
-#include <dev/hifn/hifn7751var.h>
-
-#ifdef HIFN_VULCANDEV
-#include <sys/conf.h>
-#include <sys/uio.h>
-
-static struct cdevsw vulcanpk_cdevsw; /* forward declaration */
-#endif
-
-/*
- * Prototypes and count for the pci_device structure
- */
-static	int hifn_probe(device_t);
-static	int hifn_attach(device_t);
-static	int hifn_detach(device_t);
-static	int hifn_suspend(device_t);
-static	int hifn_resume(device_t);
-static	int hifn_shutdown(device_t);
-
-static	int hifn_probesession(device_t, const struct crypto_session_params *);
-static	int hifn_newsession(device_t, crypto_session_t,
-    const struct crypto_session_params *);
-static	int hifn_process(device_t, struct cryptop *, int);
-
-static device_method_t hifn_methods[] = {
-	/* Device interface */
-	DEVMETHOD(device_probe,		hifn_probe),
-	DEVMETHOD(device_attach,	hifn_attach),
-	DEVMETHOD(device_detach,	hifn_detach),
-	DEVMETHOD(device_suspend,	hifn_suspend),
-	DEVMETHOD(device_resume,	hifn_resume),
-	DEVMETHOD(device_shutdown,	hifn_shutdown),
-
-	/* crypto device methods */
-	DEVMETHOD(cryptodev_probesession, hifn_probesession),
-	DEVMETHOD(cryptodev_newsession,	hifn_newsession),
-	DEVMETHOD(cryptodev_process,	hifn_process),
-
-	DEVMETHOD_END
-};
-
-static driver_t hifn_driver = {
-	"hifn",
-	hifn_methods,
-	sizeof (struct hifn_softc)
-};
-
-DRIVER_MODULE(hifn, pci, hifn_driver, 0, 0);
-MODULE_DEPEND(hifn, crypto, 1, 1, 1);
-#ifdef HIFN_RNDTEST
-MODULE_DEPEND(hifn, rndtest, 1, 1, 1);
-#endif
-
-static	void hifn_reset_board(struct hifn_softc *, int);
-static	void hifn_reset_puc(struct hifn_softc *);
-static	void hifn_puc_wait(struct hifn_softc *);
-static	int hifn_enable_crypto(struct hifn_softc *);
-static	void hifn_set_retry(struct hifn_softc *sc);
-static	void hifn_init_dma(struct hifn_softc *);
-static	void hifn_init_pci_registers(struct hifn_softc *);
-static	int hifn_sramsize(struct hifn_softc *);
-static	int hifn_dramsize(struct hifn_softc *);
-static	int hifn_ramtype(struct hifn_softc *);
-static	void hifn_sessions(struct hifn_softc *);
-static	void hifn_intr(void *);
-static	u_int hifn_write_command(struct hifn_command *, u_int8_t *);
-static	u_int32_t hifn_next_signature(u_int32_t a, u_int cnt);
-static	void hifn_callback(struct hifn_softc *, struct hifn_command *, u_int8_t *);
-static	int hifn_crypto(struct hifn_softc *, struct hifn_command *, struct cryptop *, int);
-static	int hifn_readramaddr(struct hifn_softc *, int, u_int8_t *);
-static	int hifn_writeramaddr(struct hifn_softc *, int, u_int8_t *);
-static	int hifn_dmamap_load_src(struct hifn_softc *, struct hifn_command *);
-static	int hifn_dmamap_load_dst(struct hifn_softc *, struct hifn_command *);
-static	int hifn_init_pubrng(struct hifn_softc *);
-static	void hifn_rng(void *);
-static	void hifn_tick(void *);
-static	void hifn_abort(struct hifn_softc *);
-static	void hifn_alloc_slot(struct hifn_softc *, int *, int *, int *, int *);
-
-static	void hifn_write_reg_0(struct hifn_softc *, bus_size_t, u_int32_t);
-static	void hifn_write_reg_1(struct hifn_softc *, bus_size_t, u_int32_t);
-
-static __inline u_int32_t
-READ_REG_0(struct hifn_softc *sc, bus_size_t reg)
-{
-    u_int32_t v = bus_space_read_4(sc->sc_st0, sc->sc_sh0, reg);
-    sc->sc_bar0_lastreg = (bus_size_t) -1;
-    return (v);
-}
-#define	WRITE_REG_0(sc, reg, val)	hifn_write_reg_0(sc, reg, val)
-
-static __inline u_int32_t
-READ_REG_1(struct hifn_softc *sc, bus_size_t reg)
-{
-    u_int32_t v = bus_space_read_4(sc->sc_st1, sc->sc_sh1, reg);
-    sc->sc_bar1_lastreg = (bus_size_t) -1;
-    return (v);
-}
-#define	WRITE_REG_1(sc, reg, val)	hifn_write_reg_1(sc, reg, val)
-
-static SYSCTL_NODE(_hw, OID_AUTO, hifn, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
-    "Hifn driver parameters");
-
-#ifdef HIFN_DEBUG
-static	int hifn_debug = 0;
-SYSCTL_INT(_hw_hifn, OID_AUTO, debug, CTLFLAG_RW, &hifn_debug,
-	    0, "control debugging msgs");
-#endif
-
-static	struct hifn_stats hifnstats;
-SYSCTL_STRUCT(_hw_hifn, OID_AUTO, stats, CTLFLAG_RD, &hifnstats,
-	    hifn_stats, "driver statistics");
-static	int hifn_maxbatch = 1;
-SYSCTL_INT(_hw_hifn, OID_AUTO, maxbatch, CTLFLAG_RW, &hifn_maxbatch,
-	    0, "max ops to batch w/o interrupt");
-
-/*
- * Probe for a supported device.  The PCI vendor and device
- * IDs are used to detect devices we know how to handle.
- */
-static int
-hifn_probe(device_t dev)
-{
-	if (pci_get_vendor(dev) == PCI_VENDOR_INVERTEX &&
-	    pci_get_device(dev) == PCI_PRODUCT_INVERTEX_AEON)
-		return (BUS_PROBE_DEFAULT);
-	if (pci_get_vendor(dev) == PCI_VENDOR_HIFN &&
-	    (pci_get_device(dev) == PCI_PRODUCT_HIFN_7751 ||
-	     pci_get_device(dev) == PCI_PRODUCT_HIFN_7951 ||
-	     pci_get_device(dev) == PCI_PRODUCT_HIFN_7955 ||
-	     pci_get_device(dev) == PCI_PRODUCT_HIFN_7956 ||
-	     pci_get_device(dev) == PCI_PRODUCT_HIFN_7811))
-		return (BUS_PROBE_DEFAULT);
-	if (pci_get_vendor(dev) == PCI_VENDOR_NETSEC &&
-	    pci_get_device(dev) == PCI_PRODUCT_NETSEC_7751)
-		return (BUS_PROBE_DEFAULT);
-	return (ENXIO);
-}
-
-static void
-hifn_dmamap_cb(void *arg, bus_dma_segment_t *segs, int nseg, int error)
-{
-	bus_addr_t *paddr = (bus_addr_t*) arg;
-	*paddr = segs->ds_addr;
-}
-
-static const char*
-hifn_partname(struct hifn_softc *sc)
-{
-	/* XXX sprintf numbers when not decoded */
-	switch (pci_get_vendor(sc->sc_dev)) {
-	case PCI_VENDOR_HIFN:
-		switch (pci_get_device(sc->sc_dev)) {
-		case PCI_PRODUCT_HIFN_6500:	return "Hifn 6500";
-		case PCI_PRODUCT_HIFN_7751:	return "Hifn 7751";
-		case PCI_PRODUCT_HIFN_7811:	return "Hifn 7811";
-		case PCI_PRODUCT_HIFN_7951:	return "Hifn 7951";
-		case PCI_PRODUCT_HIFN_7955:	return "Hifn 7955";
-		case PCI_PRODUCT_HIFN_7956:	return "Hifn 7956";
-		}
-		return "Hifn unknown-part";
-	case PCI_VENDOR_INVERTEX:
-		switch (pci_get_device(sc->sc_dev)) {
-		case PCI_PRODUCT_INVERTEX_AEON:	return "Invertex AEON";
-		}
-		return "Invertex unknown-part";
-	case PCI_VENDOR_NETSEC:
-		switch (pci_get_device(sc->sc_dev)) {
-		case PCI_PRODUCT_NETSEC_7751:	return "NetSec 7751";
-		}
-		return "NetSec unknown-part";
-	}
-	return "Unknown-vendor unknown-part";
-}
-
-static void
-default_harvest(struct rndtest_state *rsp, void *buf, u_int count)
-{
-	/* MarkM: FIX!! Check that this does not swamp the harvester! */
-	random_harvest_queue(buf, count, RANDOM_PURE_HIFN);
-}
-
-static u_int
-checkmaxmin(device_t dev, const char *what, u_int v, u_int min, u_int max)
-{
-	if (v > max) {
-		device_printf(dev, "Warning, %s %u out of range, "
-			"using max %u\n", what, v, max);
-		v = max;
-	} else if (v < min) {
-		device_printf(dev, "Warning, %s %u out of range, "
-			"using min %u\n", what, v, min);
-		v = min;
-	}
-	return v;
-}
-
-/*
- * Select PLL configuration for 795x parts.  This is complicated in
- * that we cannot determine the optimal parameters without user input.
- * The reference clock is derived from an external clock through a
- * multiplier.  The external clock is either the host bus (i.e. PCI)
- * or an external clock generator.  When using the PCI bus we assume
- * the clock is either 33 or 66 MHz; for an external source we cannot
- * tell the speed.
- *
- * PLL configuration is done with a string: "pci" for PCI bus, or "ext"
- * for an external source, followed by the frequency.  We calculate
- * the appropriate multiplier and PLL register contents accordingly.
- * When no configuration is given we default to "pci66" since that
- * always will allow the card to work.  If a card is using the PCI
- * bus clock and in a 33MHz slot then it will be operating at half
- * speed until the correct information is provided.
- *
- * We use a default setting of "ext66" because according to Mike Ham
- * of HiFn, almost every board in existence has an external crystal
- * populated at 66Mhz. Using PCI can be a problem on modern motherboards,
- * because PCI33 can have clocks from 0 to 33Mhz, and some have
- * non-PCI-compliant spread-spectrum clocks, which can confuse the pll.
- */
-static void
-hifn_getpllconfig(device_t dev, u_int *pll)
-{
-	const char *pllspec;
-	u_int freq, mul, fl, fh;
-	u_int32_t pllconfig;
-	char *nxt;
-
-	if (resource_string_value("hifn", device_get_unit(dev),
-	    "pllconfig", &pllspec))
-		pllspec = "ext66";
-	fl = 33, fh = 66;
-	pllconfig = 0;
-	if (strncmp(pllspec, "ext", 3) == 0) {
-		pllspec += 3;
-		pllconfig |= HIFN_PLL_REF_SEL;
-		switch (pci_get_device(dev)) {
-		case PCI_PRODUCT_HIFN_7955:
-		case PCI_PRODUCT_HIFN_7956:
-			fl = 20, fh = 100;
-			break;
-#ifdef notyet
-		case PCI_PRODUCT_HIFN_7954:
-			fl = 20, fh = 66;
-			break;
-#endif
-		}
-	} else if (strncmp(pllspec, "pci", 3) == 0)
-		pllspec += 3;
-	freq = strtoul(pllspec, &nxt, 10);
-	if (nxt == pllspec)
-		freq = 66;
-	else
-		freq = checkmaxmin(dev, "frequency", freq, fl, fh);
-	/*
-	 * Calculate multiplier.  We target a Fck of 266 MHz,
-	 * allowing only even values, possibly rounded down.
-	 * Multipliers > 8 must set the charge pump current.
-	 */
-	mul = checkmaxmin(dev, "PLL divisor", (266 / freq) &~ 1, 2, 12);
-	pllconfig |= (mul / 2 - 1) << HIFN_PLL_ND_SHIFT;
-	if (mul > 8)
-		pllconfig |= HIFN_PLL_IS;
-	*pll = pllconfig;
-}
-
-/*
- * Attach an interface that successfully probed.
- */
-static int 
-hifn_attach(device_t dev)
-{
-	struct hifn_softc *sc = device_get_softc(dev);
-	caddr_t kva;
-	int rseg, rid;
-	char rbase;
-	uint16_t rev;
-
-	sc->sc_dev = dev;
-
-	mtx_init(&sc->sc_mtx, device_get_nameunit(dev), "hifn driver", MTX_DEF);
-
-	/* XXX handle power management */
-
-	/*
-	 * The 7951 and 795x have a random number generator and
-	 * public key support; note this.
-	 */
-	if (pci_get_vendor(dev) == PCI_VENDOR_HIFN &&
-	    (pci_get_device(dev) == PCI_PRODUCT_HIFN_7951 ||
-	     pci_get_device(dev) == PCI_PRODUCT_HIFN_7955 ||
-	     pci_get_device(dev) == PCI_PRODUCT_HIFN_7956))
-		sc->sc_flags = HIFN_HAS_RNG | HIFN_HAS_PUBLIC;
-	/*
-	 * The 7811 has a random number generator and
-	 * we also note it's identity 'cuz of some quirks.
-	 */
-	if (pci_get_vendor(dev) == PCI_VENDOR_HIFN &&
-	    pci_get_device(dev) == PCI_PRODUCT_HIFN_7811)
-		sc->sc_flags |= HIFN_IS_7811 | HIFN_HAS_RNG;
-
-	/*
-	 * The 795x parts support AES.
-	 */
-	if (pci_get_vendor(dev) == PCI_VENDOR_HIFN &&
-	    (pci_get_device(dev) == PCI_PRODUCT_HIFN_7955 ||
-	     pci_get_device(dev) == PCI_PRODUCT_HIFN_7956)) {
-		sc->sc_flags |= HIFN_IS_7956 | HIFN_HAS_AES;
-		/*
-		 * Select PLL configuration.  This depends on the
-		 * bus and board design and must be manually configured
-		 * if the default setting is unacceptable.
-		 */
-		hifn_getpllconfig(dev, &sc->sc_pllconfig);
-	}
-
-	/*
-	 * Setup PCI resources. Note that we record the bus
-	 * tag and handle for each register mapping, this is
-	 * used by the READ_REG_0, WRITE_REG_0, READ_REG_1,
-	 * and WRITE_REG_1 macros throughout the driver.
-	 */
-	pci_enable_busmaster(dev);
-
-	rid = HIFN_BAR0;
-	sc->sc_bar0res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
-			 			RF_ACTIVE);
-	if (sc->sc_bar0res == NULL) {
-		device_printf(dev, "cannot map bar%d register space\n", 0);
-		goto fail_pci;
-	}
-	sc->sc_st0 = rman_get_bustag(sc->sc_bar0res);
-	sc->sc_sh0 = rman_get_bushandle(sc->sc_bar0res);
-	sc->sc_bar0_lastreg = (bus_size_t) -1;
-
-	rid = HIFN_BAR1;
-	sc->sc_bar1res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
-						RF_ACTIVE);
-	if (sc->sc_bar1res == NULL) {
-		device_printf(dev, "cannot map bar%d register space\n", 1);
-		goto fail_io0;
-	}
-	sc->sc_st1 = rman_get_bustag(sc->sc_bar1res);
-	sc->sc_sh1 = rman_get_bushandle(sc->sc_bar1res);
-	sc->sc_bar1_lastreg = (bus_size_t) -1;
-
-	hifn_set_retry(sc);
-
-	/*
-	 * Setup the area where the Hifn DMA's descriptors
-	 * and associated data structures.
-	 */
-	if (bus_dma_tag_create(bus_get_dma_tag(dev),	/* PCI parent */
-			       1, 0,			/* alignment,boundary */
-			       BUS_SPACE_MAXADDR_32BIT,	/* lowaddr */
-			       BUS_SPACE_MAXADDR,	/* highaddr */
-			       NULL, NULL,		/* filter, filterarg */
-			       HIFN_MAX_DMALEN,		/* maxsize */
-			       MAX_SCATTER,		/* nsegments */
-			       HIFN_MAX_SEGLEN,		/* maxsegsize */
-			       BUS_DMA_ALLOCNOW,	/* flags */
-			       NULL,			/* lockfunc */
-			       NULL,			/* lockarg */
-			       &sc->sc_dmat)) {
-		device_printf(dev, "cannot allocate DMA tag\n");
-		goto fail_io1;
-	}
-	if (bus_dmamap_create(sc->sc_dmat, BUS_DMA_NOWAIT, &sc->sc_dmamap)) {
-		device_printf(dev, "cannot create dma map\n");
-		bus_dma_tag_destroy(sc->sc_dmat);
-		goto fail_io1;
-	}
-	if (bus_dmamem_alloc(sc->sc_dmat, (void**) &kva, BUS_DMA_NOWAIT, &sc->sc_dmamap)) {
-		device_printf(dev, "cannot alloc dma buffer\n");
-		bus_dmamap_destroy(sc->sc_dmat, sc->sc_dmamap);
-		bus_dma_tag_destroy(sc->sc_dmat);
-		goto fail_io1;
-	}
-	if (bus_dmamap_load(sc->sc_dmat, sc->sc_dmamap, kva,
-			     sizeof (*sc->sc_dma),
-			     hifn_dmamap_cb, &sc->sc_dma_physaddr,
-			     BUS_DMA_NOWAIT)) {
-		device_printf(dev, "cannot load dma map\n");
-		bus_dmamem_free(sc->sc_dmat, kva, sc->sc_dmamap);
-		bus_dma_tag_destroy(sc->sc_dmat);
-		goto fail_io1;
-	}
-	sc->sc_dma = (struct hifn_dma *)kva;
-	bzero(sc->sc_dma, sizeof(*sc->sc_dma));
-
-	KASSERT(sc->sc_st0 != 0, ("hifn_attach: null bar0 tag!"));
-	KASSERT(sc->sc_sh0 != 0, ("hifn_attach: null bar0 handle!"));
-	KASSERT(sc->sc_st1 != 0, ("hifn_attach: null bar1 tag!"));
-	KASSERT(sc->sc_sh1 != 0, ("hifn_attach: null bar1 handle!"));
-
-	/*
-	 * Reset the board and do the ``secret handshake''
-	 * to enable the crypto support.  Then complete the
-	 * initialization procedure by setting up the interrupt
-	 * and hooking in to the system crypto support so we'll
-	 * get used for system services like the crypto device,
-	 * IPsec, RNG device, etc.
-	 */
-	hifn_reset_board(sc, 0);
-
-	if (hifn_enable_crypto(sc) != 0) {
-		device_printf(dev, "crypto enabling failed\n");
-		goto fail_mem;
-	}
-	hifn_reset_puc(sc);
-
-	hifn_init_dma(sc);
-	hifn_init_pci_registers(sc);
-
-	/* XXX can't dynamically determine ram type for 795x; force dram */
-	if (sc->sc_flags & HIFN_IS_7956)
-		sc->sc_drammodel = 1;
-	else if (hifn_ramtype(sc))
-		goto fail_mem;
-
-	if (sc->sc_drammodel == 0)
-		hifn_sramsize(sc);
-	else
-		hifn_dramsize(sc);
-
-	/*
-	 * Workaround for NetSec 7751 rev A: half ram size because two
-	 * of the address lines were left floating
-	 */
-	if (pci_get_vendor(dev) == PCI_VENDOR_NETSEC &&
-	    pci_get_device(dev) == PCI_PRODUCT_NETSEC_7751 &&
-	    pci_get_revid(dev) == 0x61)	/*XXX???*/
-		sc->sc_ramsize >>= 1;
-
-	/*
-	 * Arrange the interrupt line.
-	 */
-	rid = 0;
-	sc->sc_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
-					    RF_SHAREABLE|RF_ACTIVE);
-	if (sc->sc_irq == NULL) {
-		device_printf(dev, "could not map interrupt\n");
-		goto fail_mem;
-	}
-	/*
-	 * 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 | INTR_MPSAFE,
-			   NULL, hifn_intr, sc, &sc->sc_intrhand)) {
-		device_printf(dev, "could not setup interrupt\n");
-		goto fail_intr2;
-	}
-
-	hifn_sessions(sc);
-
-	/*
-	 * NB: Keep only the low 16 bits; this masks the chip id
-	 *     from the 7951.
-	 */
-	rev = READ_REG_1(sc, HIFN_1_REVID) & 0xffff;
-
-	rseg = sc->sc_ramsize / 1024;
-	rbase = 'K';
-	if (sc->sc_ramsize >= (1024 * 1024)) {
-		rbase = 'M';
-		rseg /= 1024;
-	}
-	device_printf(sc->sc_dev, "%s, rev %u, %d%cB %cram",
-		hifn_partname(sc), rev,
-		rseg, rbase, sc->sc_drammodel ? 'd' : 's');
-	if (sc->sc_flags & HIFN_IS_7956)
-		printf(", pll=0x%x<%s clk, %ux mult>",
-			sc->sc_pllconfig,
-			sc->sc_pllconfig & HIFN_PLL_REF_SEL ? "ext" : "pci",
-			2 + 2*((sc->sc_pllconfig & HIFN_PLL_ND) >> 11));
-	printf("\n");
-
-	WRITE_REG_0(sc, HIFN_0_PUCNFG,
-	    READ_REG_0(sc, HIFN_0_PUCNFG) | HIFN_PUCNFG_CHIPID);
-	sc->sc_ena = READ_REG_0(sc, HIFN_0_PUSTAT) & HIFN_PUSTAT_CHIPENA;
-
-	switch (sc->sc_ena) {
-	case HIFN_PUSTAT_ENA_2:
-	case HIFN_PUSTAT_ENA_1:
-		sc->sc_cid = crypto_get_driverid(dev,
-		    sizeof(struct hifn_session), CRYPTOCAP_F_HARDWARE);
-		if (sc->sc_cid < 0) {
-			device_printf(dev, "could not get crypto driver id\n");
-			goto fail_intr;
-		}
-		break;
-	}
-		
-	bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap,
-	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
-
-	if (sc->sc_flags & (HIFN_HAS_PUBLIC | HIFN_HAS_RNG))
-		hifn_init_pubrng(sc);
-
-	callout_init(&sc->sc_tickto, 1);
-	callout_reset(&sc->sc_tickto, hz, hifn_tick, sc);
-
-	return (0);
-
-fail_intr:
-	bus_teardown_intr(dev, sc->sc_irq, sc->sc_intrhand);
-fail_intr2:
-	/* XXX don't store rid */
-	bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_irq);
-fail_mem:
-	bus_dmamap_unload(sc->sc_dmat, sc->sc_dmamap);
-	bus_dmamem_free(sc->sc_dmat, sc->sc_dma, sc->sc_dmamap);
-	bus_dma_tag_destroy(sc->sc_dmat);
-
-	/* Turn off DMA polling */
-	WRITE_REG_1(sc, HIFN_1_DMA_CNFG, HIFN_DMACNFG_MSTRESET |
-	    HIFN_DMACNFG_DMARESET | HIFN_DMACNFG_MODE);
-fail_io1:
-	bus_release_resource(dev, SYS_RES_MEMORY, HIFN_BAR1, sc->sc_bar1res);
-fail_io0:
-	bus_release_resource(dev, SYS_RES_MEMORY, HIFN_BAR0, sc->sc_bar0res);
-fail_pci:
-	mtx_destroy(&sc->sc_mtx);
-	return (ENXIO);
-}
-
-/*
- * Detach an interface that successfully probed.
- */
-static int 
-hifn_detach(device_t dev)
-{
-	struct hifn_softc *sc = device_get_softc(dev);
-
-	KASSERT(sc != NULL, ("hifn_detach: null software carrier!"));
-
-	/* disable interrupts */
-	WRITE_REG_1(sc, HIFN_1_DMA_IER, 0);
-
-	/*XXX other resources */
-	callout_stop(&sc->sc_tickto);
-	callout_stop(&sc->sc_rngto);
-#ifdef HIFN_RNDTEST
-	if (sc->sc_rndtest)
-		rndtest_detach(sc->sc_rndtest);
-#endif
-
-	/* Turn off DMA polling */
-	WRITE_REG_1(sc, HIFN_1_DMA_CNFG, HIFN_DMACNFG_MSTRESET |
-	    HIFN_DMACNFG_DMARESET | HIFN_DMACNFG_MODE);
-
-	crypto_unregister_all(sc->sc_cid);
-
-	bus_teardown_intr(dev, sc->sc_irq, sc->sc_intrhand);
-	/* XXX don't store rid */
-	bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_irq);
-
-	bus_dmamap_unload(sc->sc_dmat, sc->sc_dmamap);
-	bus_dmamem_free(sc->sc_dmat, sc->sc_dma, sc->sc_dmamap);
-	bus_dma_tag_destroy(sc->sc_dmat);
-
-	bus_release_resource(dev, SYS_RES_MEMORY, HIFN_BAR1, sc->sc_bar1res);
-	bus_release_resource(dev, SYS_RES_MEMORY, HIFN_BAR0, sc->sc_bar0res);
-
-	mtx_destroy(&sc->sc_mtx);
-
-	return (0);
-}
-
-/*
- * Stop all chip I/O so that the kernel's probe routines don't
- * get confused by errant DMAs when rebooting.
- */
-static int
-hifn_shutdown(device_t dev)
-{
-#ifdef notyet
-	hifn_stop(device_get_softc(dev));
-#endif
-	return (0);
-}
-
-/*
- * Device suspend routine.  Stop the interface and save some PCI
- * settings in case the BIOS doesn't restore them properly on
- * resume.
- */
-static int
-hifn_suspend(device_t dev)
-{
-	struct hifn_softc *sc = device_get_softc(dev);
-#ifdef notyet
-	hifn_stop(sc);
-#endif
-	sc->sc_suspended = 1;
-
-	return (0);
-}
-
-/*
- * Device resume routine.  Restore some PCI settings in case the BIOS
- * doesn't, re-enable busmastering, and restart the interface if
- * appropriate.
- */
-static int
-hifn_resume(device_t dev)
-{
-	struct hifn_softc *sc = device_get_softc(dev);
-#ifdef notyet
-        /* reinitialize interface if necessary */
-        if (ifp->if_flags & IFF_UP)
-                rl_init(sc);
-#endif
-	sc->sc_suspended = 0;
-
-	return (0);
-}
-
-static int
-hifn_init_pubrng(struct hifn_softc *sc)
-{
-	u_int32_t r;
-	int i;
-
-#ifdef HIFN_RNDTEST
-	sc->sc_rndtest = rndtest_attach(sc->sc_dev);
-	if (sc->sc_rndtest)
-		sc->sc_harvest = rndtest_harvest;
-	else
-		sc->sc_harvest = default_harvest;
-#else
-	sc->sc_harvest = default_harvest;
-#endif
-	if ((sc->sc_flags & HIFN_IS_7811) == 0) {
-		/* Reset 7951 public key/rng engine */
-		WRITE_REG_1(sc, HIFN_1_PUB_RESET,
-		    READ_REG_1(sc, HIFN_1_PUB_RESET) | HIFN_PUBRST_RESET);
-
-		for (i = 0; i < 100; i++) {
-			DELAY(1000);
-			if ((READ_REG_1(sc, HIFN_1_PUB_RESET) &
-			    HIFN_PUBRST_RESET) == 0)
-				break;
*** 3093 LINES SKIPPED ***



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