Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 25 Jun 2004 04:41:36 GMT
From:      ps@FreeBSD.org (Paul Saab)
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 55764 for review
Message-ID:  <200406250441.i5P4faWA003356@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
Change 55764 by ps@butter.corp on 2004/06/25 04:33:12

	Integrace the sack branch for testing a perforce commit.

Affected files ...

.. //depot/projects/sack/boot/forth/loader.conf#4 integrate
.. //depot/projects/sack/compat/svr4/imgact_svr4.c#2 integrate
.. //depot/projects/sack/conf/files#6 integrate
.. //depot/projects/sack/conf/kmod.mk#3 integrate
.. //depot/projects/sack/conf/options#4 integrate
.. //depot/projects/sack/conf/options.sparc64#2 integrate
.. //depot/projects/sack/dev/acpica/acpi.c#5 integrate
.. //depot/projects/sack/dev/acpica/acpi_cpu.c#3 integrate
.. //depot/projects/sack/dev/acpica/acpi_pci.c#3 integrate
.. //depot/projects/sack/dev/acpica/acpi_quirks#1 branch
.. //depot/projects/sack/dev/ichsmb/ichsmb_pci.c#2 integrate
.. //depot/projects/sack/dev/ofw/ofw_console.c#4 integrate
.. //depot/projects/sack/dev/sound/pcm/mixer.c#3 integrate
.. //depot/projects/sack/dev/twa/twa_freebsd.c#3 integrate
.. //depot/projects/sack/dev/uart/uart_bus.h#3 integrate
.. //depot/projects/sack/dev/uart/uart_dev_i8251.c#2 integrate
.. //depot/projects/sack/dev/uart/uart_dev_ns8250.c#2 integrate
.. //depot/projects/sack/dev/uart/uart_dev_sab82532.c#2 integrate
.. //depot/projects/sack/dev/uart/uart_dev_z8530.c#2 integrate
.. //depot/projects/sack/dev/uart/uart_tty.c#4 integrate
.. //depot/projects/sack/dev/usb/usbdevs#3 integrate
.. //depot/projects/sack/dev/usb/usbdevs.h#3 integrate
.. //depot/projects/sack/dev/usb/usbdevs_data.h#3 integrate
.. //depot/projects/sack/fs/portalfs/portal_vnops.c#4 integrate
.. //depot/projects/sack/fs/udf/udf_vnops.c#3 integrate
.. //depot/projects/sack/geom/geom_slice.c#2 integrate
.. //depot/projects/sack/geom/vinum/geom_vinum.c#3 integrate
.. //depot/projects/sack/geom/vinum/geom_vinum_plex.c#3 integrate
.. //depot/projects/sack/geom/vinum/geom_vinum_raid5.c#3 integrate
.. //depot/projects/sack/geom/vinum/geom_vinum_raid5.h#2 integrate
.. //depot/projects/sack/geom/vinum/geom_vinum_share.c#2 integrate
.. //depot/projects/sack/i386/linux/imgact_linux.c#2 integrate
.. //depot/projects/sack/kern/tty.c#5 integrate
.. //depot/projects/sack/kern/uipc_socket.c#5 integrate
.. //depot/projects/sack/kern/uipc_socket2.c#4 integrate
.. //depot/projects/sack/kern/uipc_syscalls.c#5 integrate
.. //depot/projects/sack/kern/vfs_syscalls.c#5 integrate
.. //depot/projects/sack/net/if_ethersubr.c#3 integrate
.. //depot/projects/sack/net/if_vlan.c#4 integrate
.. //depot/projects/sack/netgraph/ng_base.c#2 integrate
.. //depot/projects/sack/netinet/in_pcb.h#2 integrate
.. //depot/projects/sack/netinet/ip_dummynet.c#2 integrate
.. //depot/projects/sack/netinet/ip_fw2.c#3 integrate
.. //depot/projects/sack/netinet/ip_mroute.c#3 integrate
.. //depot/projects/sack/netinet/ip_output.c#3 integrate
.. //depot/projects/sack/netinet/tcp.h#4 integrate
.. //depot/projects/sack/netinet/tcp_input.c#5 integrate
.. //depot/projects/sack/netinet/tcp_output.c#5 integrate
.. //depot/projects/sack/netinet/tcp_seq.h#3 integrate
.. //depot/projects/sack/netinet/tcp_subr.c#5 integrate
.. //depot/projects/sack/netinet/tcp_syncache.c#5 integrate
.. //depot/projects/sack/netinet/tcp_timer.c#3 integrate
.. //depot/projects/sack/netinet/tcp_var.h#3 integrate
.. //depot/projects/sack/netipx/spx_usrreq.c#4 integrate
.. //depot/projects/sack/netnatm/natm.c#3 integrate
.. //depot/projects/sack/nfsclient/nfs_socket.c#3 integrate
.. //depot/projects/sack/security/mac/mac_net.c#2 integrate
.. //depot/projects/sack/security/mac_biba/mac_biba.c#3 integrate
.. //depot/projects/sack/security/mac_lomac/mac_lomac.c#3 integrate
.. //depot/projects/sack/security/mac_mls/mac_mls.c#3 integrate
.. //depot/projects/sack/security/mac_stub/mac_stub.c#3 integrate
.. //depot/projects/sack/security/mac_test/mac_test.c#3 integrate
.. //depot/projects/sack/sparc64/conf/NOTES#2 integrate
.. //depot/projects/sack/sys/mac_policy.h#3 integrate
.. //depot/projects/sack/sys/serial.h#1 branch
.. //depot/projects/sack/sys/socketvar.h#4 integrate
.. //depot/projects/sack/sys/ttycom.h#3 integrate
.. //depot/projects/sack/tools/acpi_quirks2h.awk#1 branch
.. //depot/projects/sack/ufs/ufs/ufs_extattr.c#2 integrate
.. //depot/projects/sack/vm/uma_core.c#3 integrate
.. //depot/projects/sack/vm/vm_map.c#2 integrate
.. //depot/projects/sack/vm/vm_pageout.c#3 integrate

Differences ...

==== //depot/projects/sack/boot/forth/loader.conf#4 (text+ko) ====

@@ -6,7 +6,7 @@
 #
 # All arguments must be in double quotes.
 #
-# $FreeBSD: src/sys/boot/forth/loader.conf,v 1.79 2004/06/22 22:57:13 brueffer Exp $
+# $FreeBSD: src/sys/boot/forth/loader.conf,v 1.80 2004/06/24 17:49:18 josef Exp $
 
 ##############################################################
 ###  Basic configuration options  ############################
@@ -278,7 +278,6 @@
 snd_via8233_load="NO"		# via8233
 snd_via82c686_load="NO"		# via82c686
 snd_driver_load="NO"		# All sound drivers
-#pcm0.line="0"			# Default value for a mixer channel
 
 ##############################################################
 ###  USB modules  ############################################

==== //depot/projects/sack/compat/svr4/imgact_svr4.c#2 (text+ko) ====

@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/svr4/imgact_svr4.c,v 1.22 2004/02/04 21:52:53 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/svr4/imgact_svr4.c,v 1.23 2004/06/24 02:21:17 obrien Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -90,7 +90,7 @@
     }
     bss_size = round_page(a_out->a_bss);
 #ifdef DEBUG
-    printf("imgact: text: %08lx, data: %08lx, bss: %08lx\n", a_out->a_text, a_out->a_data, bss_size);
+    printf("imgact: text: %08lx, data: %08lx, bss: %08lx\n", (u_long)a_out->a_text, (u_long)a_out->a_data, bss_size);
 #endif
 
     /*
@@ -193,7 +193,7 @@
     
 #ifdef DEBUG
 	printf("imgact: startaddr=%08lx, length=%08lx\n", (u_long)vmaddr,
-	    a_out->a_text + a_out->a_data);
+	    (u_long)a_out->a_text + a_out->a_data);
 #endif
 	/*
 	 * allow read/write of data

==== //depot/projects/sack/conf/files#6 (text+ko) ====

@@ -1,9 +1,14 @@
-# $FreeBSD: src/sys/conf/files,v 1.907 2004/06/22 20:13:24 brooks Exp $
+# $FreeBSD: src/sys/conf/files,v 1.909 2004/06/24 06:29:22 njl Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
 # dependency lines other than the first are silently ignored.
 #
+acpi_quirks.h		standard					   \
+	dependency	"$S/tools/acpi_quirks2h.awk $S/dev/acpica/acpi_quirks" \
+	compile-with	"${AWK} -f $S/tools/acpi_quirks2h.awk $S/dev/acpica/acpi_quirks" \
+	no-obj no-implicit-rule						   \
+	clean		"acpi_quirks.h"
 aicasm				optional ahc				   \
 	dependency 	"$S/dev/aic7xxx/aicasm/*.[chyl]"		   \
 	compile-with	"CC=${CC} ${MAKE} -f $S/dev/aic7xxx/aicasm/Makefile MAKESRCPATH=$S/dev/aic7xxx/aicasm" \

==== //depot/projects/sack/conf/kmod.mk#3 (text+ko) ====

@@ -1,5 +1,5 @@
 #	From: @(#)bsd.prog.mk	5.26 (Berkeley) 6/25/91
-# $FreeBSD: src/sys/conf/kmod.mk,v 1.161 2004/06/13 17:29:06 mlaier Exp $
+# $FreeBSD: src/sys/conf/kmod.mk,v 1.162 2004/06/24 06:29:22 njl Exp $
 #
 # The include file <bsd.kmod.mk> handles installing Kernel Loadable Device
 # drivers (KLD's).
@@ -343,6 +343,17 @@
 .endif
 .endfor # _i
 
+.if ${SRCS:Macpi_quirks.h} != ""
+CLEANFILES+=	acpi_quirks.h
+.if !exists(@)
+acpi_quirks.h: @
+.endif
+.if exists(@)
+acpi_quirks.h: @/tools/acpi_quirks2h.awk @/dev/acpica/acpi_quirks
+.endif
+	${AWK} -f @/tools/acpi_quirks2h.awk @/dev/acpica/acpi_quirks
+.endif
+
 regress:
 
 lint: ${SRCS}

==== //depot/projects/sack/conf/options#4 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/options,v 1.453 2004/06/13 17:29:06 mlaier Exp $
+# $FreeBSD: src/sys/conf/options,v 1.454 2004/06/23 21:04:37 ps Exp $
 #
 #        On the handling of kernel options
 #

==== //depot/projects/sack/conf/options.sparc64#2 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/options.sparc64,v 1.10 2004/05/08 13:53:46 marius Exp $
+# $FreeBSD: src/sys/conf/options.sparc64,v 1.11 2004/06/24 02:57:10 obrien Exp $
 
 SUN4U			opt_global.h
 
@@ -9,6 +9,7 @@
 PSYCHO_DEBUG		opt_psycho.h
 DEBUGGER_ON_POWERFAIL	opt_psycho.h
 OFW_PCI_DEBUG		opt_ofw_pci.h
+OFWCONS_POLL_HZ		opt_ofw.h
 # Debug IOMMU inserts/removes using diagnostic accesses. Very loud.
 IOMMU_DIAG		opt_iommu.h
 PMAP_STATS		opt_pmap.h

==== //depot/projects/sack/dev/acpica/acpi.c#5 (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/acpica/acpi.c,v 1.164 2004/06/23 17:21:02 jhb Exp $
+ *	$FreeBSD: src/sys/dev/acpica/acpi.c,v 1.165 2004/06/24 00:48:45 njl Exp $
  */
 
 #include "opt_acpi.h"
@@ -129,7 +129,6 @@
 static ACPI_STATUS acpi_probe_child(ACPI_HANDLE handle, UINT32 level,
 			void *context, void **status);
 static void	acpi_shutdown_final(void *arg, int howto);
-static void	acpi_shutdown_poweroff(void *arg);
 static void	acpi_enable_fixed_events(struct acpi_softc *sc);
 static int	acpi_parse_prw(ACPI_HANDLE h, struct acpi_prw_data *prw);
 static ACPI_STATUS acpi_wake_limit(ACPI_HANDLE h, UINT32 level, void *context,
@@ -1282,9 +1281,9 @@
     ACPI_STATUS	status;
 
     /*
-     * If powering off, run the actual shutdown code on each processor.
-     * It will only perform the shutdown on the BSP.  Some chipsets do
-     * not power off the system correctly if called from an AP.
+     * XXX Shutdown code should only run on the BSP (cpuid 0).
+     * Some chipsets do not power off the system correctly if called from
+     * an AP.
      */
     if ((howto & RB_POWEROFF) != 0) {
 	status = AcpiEnterSleepStatePrep(ACPI_STATE_S5);
@@ -1294,36 +1293,20 @@
 	    return;
 	}
 	printf("Powering system off using ACPI\n");
-	smp_rendezvous(NULL, acpi_shutdown_poweroff, NULL, NULL);
+	ACPI_DISABLE_IRQS();
+	status = AcpiEnterSleepState(ACPI_STATE_S5);
+	if (ACPI_FAILURE(status)) {
+	    printf("ACPI power-off failed - %s\n", AcpiFormatException(status));
+	} else {
+	    DELAY(1000000);
+	    printf("ACPI power-off failed - timeout\n");
+	}
     } else {
 	printf("Shutting down ACPI\n");
 	AcpiTerminate();
     }
 }
 
-/*
- * Since this function may be called with locks held or in an unknown
- * context, it cannot allocate memory, acquire locks, sleep, etc.
- */
-static void
-acpi_shutdown_poweroff(void *arg)
-{
-    ACPI_STATUS	status;
-
-    /* Only attempt to power off if this is the BSP (cpuid 0). */
-    if (PCPU_GET(cpuid) != 0)
-	return;
-
-    ACPI_DISABLE_IRQS();
-    status = AcpiEnterSleepState(ACPI_STATE_S5);
-    if (ACPI_FAILURE(status)) {
-	printf("ACPI power-off failed - %s\n", AcpiFormatException(status));
-    } else {
-	DELAY(1000000);
-	printf("ACPI power-off failed - timeout\n");
-    }
-}
-
 static void
 acpi_enable_fixed_events(struct acpi_softc *sc)
 {

==== //depot/projects/sack/dev/acpica/acpi_cpu.c#3 (text+ko) ====

@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_cpu.c,v 1.40 2004/06/19 02:27:23 njl Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_cpu.c,v 1.41 2004/06/24 00:38:51 njl Exp $");
 
 #include "opt_acpi.h"
 #include <sys/param.h>
@@ -1046,7 +1046,7 @@
     struct sbuf	 sb;
     char	 buf[128];
     int		 i;
-    uint64_t	 fract, sum, whole;
+    uintmax_t	 fract, sum, whole;
 
     sum = 0;
     for (i = 0; i < cpu_cx_count; i++)
@@ -1054,7 +1054,7 @@
     sbuf_new(&sb, buf, sizeof(buf), SBUF_FIXEDLEN);
     for (i = 0; i < cpu_cx_count; i++) {
 	if (sum > 0) {
-	    whole = cpu_cx_stats[i] * 100;
+	    whole = (uintmax_t)cpu_cx_stats[i] * 100;
 	    fract = (whole % sum) * 100;
 	    sbuf_printf(&sb, "%u.%02u%% ", (u_int)(whole / sum),
 		(u_int)(fract / sum));

==== //depot/projects/sack/dev/acpica/acpi_pci.c#3 (text+ko) ====

@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_pci.c,v 1.19 2004/06/23 15:08:40 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_pci.c,v 1.20 2004/06/24 01:57:31 njl Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -232,7 +232,7 @@
 	if (ACPI_FAILURE(status))
 		printf("WARNING: Unable to detach object data from %s - %s\n",
 		    acpi_name(handle), AcpiFormatException(status));
-	status = AcpiAttachData(handle, acpi_fake_objhandler, child);
+	status = AcpiAttachData(handle, acpi_fake_objhandler, pci_child);
 	if (ACPI_FAILURE(status))
 		printf("WARNING: Unable to attach object data to %s - %s\n",
 		    acpi_name(handle), AcpiFormatException(status));
@@ -261,8 +261,7 @@
 		    dinfo->ap_dinfo.cfg.slot == slot) {
 			dinfo->ap_handle = handle;
 			acpi_pci_update_device(handle, devlist[i]);
-			free(devlist, M_TEMP);
-			return_ACPI_STATUS (AE_OK);
+			break;
 		}
 	}
 	free(devlist, M_TEMP);

==== //depot/projects/sack/dev/ichsmb/ichsmb_pci.c#2 (text+ko) ====

@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ichsmb/ichsmb_pci.c,v 1.12 2004/05/30 20:08:33 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ichsmb/ichsmb_pci.c,v 1.13 2004/06/24 18:21:28 ambrisko Exp $");
 
 /*
  * Support for the SMBus controller logical device which is part of the
@@ -73,6 +73,7 @@
 #define ID_82801CA			0x24838086
 #define ID_82801DC			0x24C38086
 #define ID_82801EB			0x24D38086
+#define ID_6300ESB			0x25a48086
 
 #define PCIS_SERIALBUS_SMBUS_PROGIF	0x00
 
@@ -137,6 +138,9 @@
 	case ID_82801EB:
 		device_set_desc(dev, "Intel 82801EB (ICH5) SMBus controller");
 		break;
+	case ID_6300ESB:
+		device_set_desc(dev, "Intel 6300ESB (ICH) SMBus controller");
+		break;
 	default:
 		if (pci_get_class(dev) == PCIC_SERIALBUS
 		    && pci_get_subclass(dev) == PCIS_SERIALBUS_SMBUS
@@ -167,6 +171,9 @@
 	sc->io_rid = ICH_SMB_BASE;
 	sc->io_res = bus_alloc_resource(dev, SYS_RES_IOPORT,
 	    &sc->io_rid, 0, ~0, 16, RF_ACTIVE);
+	if (sc->io_res == NULL)
+		sc->io_res = bus_alloc_resource(dev, SYS_RES_IOPORT,
+		    &sc->io_rid, 0, ~0, 32, RF_ACTIVE);
 	if (sc->io_res == NULL) {
 		log(LOG_ERR, "%s: can't map I/O\n", device_get_nameunit(dev));
 		error = ENXIO;

==== //depot/projects/sack/dev/ofw/ofw_console.c#4 (text+ko) ====

@@ -24,10 +24,11 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ofw/ofw_console.c,v 1.24 2004/06/16 09:46:52 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ofw/ofw_console.c,v 1.25 2004/06/24 02:57:11 obrien Exp $");
 
 #include "opt_ddb.h"
 #include "opt_comconsole.h"
+#include "opt_ofw.h"
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -42,7 +43,10 @@
 
 #include <ddb/ddb.h>
 
-#define	OFW_POLL_HZ	4
+#ifndef	OFWCONS_POLL_HZ
+#define	OFWCONS_POLL_HZ	4	/* 50-100 works best on Ultra2 */
+#endif
+#define OFBURSTLEN	128	/* max number of bytes to write in one chunk */
 
 static d_open_t		ofw_dev_open;
 static d_close_t	ofw_dev_close;
@@ -125,7 +129,7 @@
 		ttychars(tp);
 		tp->t_iflag = TTYDEF_IFLAG;
 		tp->t_oflag = TTYDEF_OFLAG;
-		tp->t_cflag = TTYDEF_CFLAG|CLOCAL;
+		tp->t_cflag = TTYDEF_CFLAG;
 		tp->t_lflag = TTYDEF_LFLAG;
 		tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED;
 		ttsetwater(tp);
@@ -138,7 +142,7 @@
 	error = ttyld_open(tp, dev);
 
 	if (error == 0 && setuptimeout) {
-		polltime = hz / OFW_POLL_HZ;
+		polltime = hz / OFWCONS_POLL_HZ;
 		if (polltime < 1) {
 			polltime = 1;
 		}
@@ -162,6 +166,8 @@
 		return (ENXIO);
 	}
 
+	/* XXX Should be replaced with callout_stop(9) */
+	untimeout(ofw_timeout, tp, ofw_timeouthandle);
 	ttyld_close(tp, flag);
 	ttyclose(tp);
 
@@ -179,16 +185,18 @@
 static void
 ofw_tty_start(struct tty *tp)
 {
+	struct clist *cl;
+	int len;
+	u_char buf[OFBURSTLEN];
+
 
-	if (tp->t_state & (TS_TIMEOUT | TS_TTSTOP)) {
-		ttwwakeup(tp);
+	if (tp->t_state & (TS_TIMEOUT | TS_BUSY | TS_TTSTOP))
 		return;
-	}
 
 	tp->t_state |= TS_BUSY;
-	while (tp->t_outq.c_cc != 0) {
-		ofw_cons_putc(NULL, getc(&tp->t_outq));
-	}
+	cl = &tp->t_outq;
+	len = q_to_b(cl, buf, OFBURSTLEN);
+	OF_write(stdout, buf, len);
 	tp->t_state &= ~TS_BUSY;
 
 	ttwwakeup(tp);

==== //depot/projects/sack/dev/sound/pcm/mixer.c#3 (text+ko) ====

@@ -25,11 +25,10 @@
  */
 
 #include <dev/sound/pcm/sound.h>
-#include <sys/kernel.h>
 
 #include "mixer_if.h"
 
-SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/pcm/mixer.c,v 1.38 2004/06/20 15:38:11 josef Exp $");
+SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/pcm/mixer.c,v 1.39 2004/06/24 17:41:20 josef Exp $");
 
 MALLOC_DEFINE(M_MIXER, "mixer", "mixer");
 
@@ -190,7 +189,6 @@
 {
 	struct snddev_info *snddev;
 	struct snd_mixer *m;
-	char devname[20];
 	u_int16_t v;
 	struct cdev *pdev;
 	int i, unit, val;
@@ -206,13 +204,14 @@
 		goto bad;
 
 	for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
-		snprintf(devname, sizeof(devname), "%s.%s", device_get_nameunit(dev), snd_mixernames[i]);
-		TUNABLE_INT_FETCH(devname, &val);
-
-		if (val >= 0 && val <= 100)
-			v = (u_int16_t) val;
-		else
+		if (resource_int_value(device_get_name(dev),
+		    device_get_unit(dev), snd_mixernames[i], &val) == 0) {
+			if (val >= 0 && val <= 100) {
+				v = (u_int16_t) val;
+			}
+		} else {
 			v = snd_mixerdefaults[i];
+		}
 
 		mixer_set(m, i, v | (v << 8));
 	}

==== //depot/projects/sack/dev/twa/twa_freebsd.c#3 (text+ko) ====

@@ -25,7 +25,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	$FreeBSD: src/sys/dev/twa/twa_freebsd.c,v 1.6 2004/06/16 09:47:00 phk Exp $
+ *	$FreeBSD: src/sys/dev/twa/twa_freebsd.c,v 1.7 2004/06/24 18:30:08 scottl Exp $
  */
 
 /*
@@ -584,7 +584,7 @@
 				TWA_ALIGNMENT,		/* alignment */
 				0,			/* boundary */
 				BUS_SPACE_MAXADDR,	/* lowaddr */
-				BUS_SPACE_MAXADDR + 1, 	/* highaddr */
+				BUS_SPACE_MAXADDR, 	/* highaddr */
 				NULL, NULL, 		/* filter, filterarg */
 				TWA_Q_LENGTH *
 				(sizeof(struct twa_command_packet)),/* maxsize */

==== //depot/projects/sack/dev/uart/uart_bus.h#3 (text+ko) ====

@@ -23,7 +23,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/uart/uart_bus.h,v 1.5 2004/06/16 09:47:00 phk Exp $
+ * $FreeBSD: src/sys/dev/uart/uart_bus.h,v 1.6 2004/06/24 10:07:28 phk Exp $
  */
 
 #ifndef _DEV_UART_BUS_H_
@@ -33,6 +33,7 @@
 #include "opt_uart.h"
 #endif
 
+#include <sys/serial.h>
 #include <sys/timepps.h>
 
 /* Drain and flush targets. */
@@ -45,7 +46,7 @@
  * Interrupt sources (in priority order). See also uart_core.c
  * Note that the low order 16 bits are used to pass modem signals
  * from the hardware interrupt handler to the software interrupt
- * handler. See UART_SIG_* and UART_SIGMASK_* below.
+ * handler.
  */
 #define	UART_IPEND_OVERRUN	0x010000
 #define	UART_IPEND_BREAK	0x020000
@@ -62,31 +63,17 @@
 #define	UART_STAT_OVERRUN	0x0400
 #define	UART_STAT_PARERR	0x0800
 
-/* Modem and line signals. */
-#define	UART_SIG_DTR		0x0001
-#define	UART_SIG_RTS		0x0002
-#define	UART_SIG_DSR		0x0004
-#define	UART_SIG_CTS		0x0008
-#define	UART_SIG_DCD		0x0010
-#define	UART_SIG_RI		0x0020
-#define	UART_SIG_DDTR		0x0100
-#define	UART_SIG_DRTS		0x0200
-#define	UART_SIG_DDSR		0x0400
-#define	UART_SIG_DCTS		0x0800
-#define	UART_SIG_DDCD		0x1000
-#define	UART_SIG_DRI		0x2000
-
-#define	UART_SIGMASK_DTE	0x0003
-#define	UART_SIGMASK_DCE	0x003c
-#define	UART_SIGMASK_STATE	0x003f
-#define	UART_SIGMASK_DELTA	0x3f00
+#define	UART_SIGMASK_DTE	(SER_DTR | SER_RTS)
+#define	UART_SIGMASK_DCE	(SER_DSR | SER_CTS | SER_DCD | SER_RI)
+#define	UART_SIGMASK_STATE	(UART_SIGMASK_DTE | UART_SIGMASK_DCE)
+#define	UART_SIGMASK_DELTA	(UART_SIGMASK_STATE << 8)
 
 #ifdef UART_PPS_ON_CTS
-#define	UART_SIG_DPPS		UART_SIG_DCTS
-#define	UART_SIG_PPS		UART_SIG_CTS
+#define	UART_SIG_DPPS		SER_DCTS
+#define	UART_SIG_PPS		SER_CTS
 #else
-#define	UART_SIG_DPPS		UART_SIG_DDCD
-#define	UART_SIG_PPS		UART_SIG_DCD
+#define	UART_SIG_DPPS		SER_DDCD
+#define	UART_SIG_PPS		SER_DCD
 #endif
 
 /* UART_IOCTL() requests */

==== //depot/projects/sack/dev/uart/uart_dev_i8251.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_i8251.c,v 1.3 2003/09/17 03:11:32 marcel Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_i8251.c,v 1.4 2004/06/24 10:07:28 phk Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -398,9 +398,9 @@
 	i8251_bus_flush(sc, UART_FLUSH_RECEIVER|UART_FLUSH_TRANSMITTER);
 
 	if (i8251->mcr & MCR_DTR)
-		sc->sc_hwsig |= UART_SIG_DTR;
+		sc->sc_hwsig |= SER_DTR;
 	if (i8251->mcr & MCR_RTS)
-		sc->sc_hwsig |= UART_SIG_RTS;
+		sc->sc_hwsig |= SER_RTS;
 	i8251_bus_getsig(sc);
 
 	i8251_clrint(bas);
@@ -454,10 +454,10 @@
 		mtx_lock_spin(&sc->sc_hwmtx);
 		msr = uart_getreg(&sc->sc_bas, REG_MSR);
 		mtx_unlock_spin(&sc->sc_hwmtx);
-		SIGCHG(msr & MSR_DSR, sig, UART_SIG_DSR, UART_SIG_DDSR);
-		SIGCHG(msr & MSR_CTS, sig, UART_SIG_CTS, UART_SIG_DCTS);
-		SIGCHG(msr & MSR_DCD, sig, UART_SIG_DCD, UART_SIG_DDCD);
-		SIGCHG(msr & MSR_RI,  sig, UART_SIG_RI,  UART_SIG_DRI);
+		SIGCHG(msr & MSR_DSR, sig, SER_DSR, SER_DDSR);
+		SIGCHG(msr & MSR_CTS, sig, SER_CTS, SER_DCTS);
+		SIGCHG(msr & MSR_DCD, sig, SER_DCD, SER_DDCD);
+		SIGCHG(msr & MSR_RI,  sig, SER_RI,  SER_DRI);
 		new = sig & ~UART_SIGMASK_DELTA;
 	} while (!atomic_cmpset_32(&sc->sc_hwsig, old, new));
 	return (sig);
@@ -715,20 +715,20 @@
 	do {
 		old = sc->sc_hwsig;
 		new = old;
-		if (sig & UART_SIG_DDTR) {
-			SIGCHG(sig & UART_SIG_DTR, new, UART_SIG_DTR,
-			    UART_SIG_DDTR);
+		if (sig & SER_DDTR) {
+			SIGCHG(sig & SER_DTR, new, SER_DTR,
+			    SER_DDTR);
 		}
-		if (sig & UART_SIG_DRTS) {
-			SIGCHG(sig & UART_SIG_RTS, new, UART_SIG_RTS,
-			    UART_SIG_DRTS);
+		if (sig & SER_DRTS) {
+			SIGCHG(sig & SER_RTS, new, SER_RTS,
+			    SER_DRTS);
 		}
 	} while (!atomic_cmpset_32(&sc->sc_hwsig, old, new));
 	mtx_lock_spin(&sc->sc_hwmtx);
 	i8251->mcr &= ~(MCR_DTR|MCR_RTS);
-	if (new & UART_SIG_DTR)
+	if (new & SER_DTR)
 		i8251->mcr |= MCR_DTR;
-	if (new & UART_SIG_RTS)
+	if (new & SER_RTS)
 		i8251->mcr |= MCR_RTS;
 	uart_setreg(bas, REG_MCR, i8251->mcr);
 	uart_barrier(bas);

==== //depot/projects/sack/dev/uart/uart_dev_ns8250.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_ns8250.c,v 1.7 2004/05/26 21:59:01 tmm Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_ns8250.c,v 1.8 2004/06/24 10:07:28 phk Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -399,9 +399,9 @@
 	ns8250_bus_flush(sc, UART_FLUSH_RECEIVER|UART_FLUSH_TRANSMITTER);
 
 	if (ns8250->mcr & MCR_DTR)
-		sc->sc_hwsig |= UART_SIG_DTR;
+		sc->sc_hwsig |= SER_DTR;
 	if (ns8250->mcr & MCR_RTS)
-		sc->sc_hwsig |= UART_SIG_RTS;
+		sc->sc_hwsig |= SER_RTS;
 	ns8250_bus_getsig(sc);
 
 	ns8250_clrint(bas);
@@ -455,10 +455,10 @@
 		mtx_lock_spin(&sc->sc_hwmtx);
 		msr = uart_getreg(&sc->sc_bas, REG_MSR);
 		mtx_unlock_spin(&sc->sc_hwmtx);
-		SIGCHG(msr & MSR_DSR, sig, UART_SIG_DSR, UART_SIG_DDSR);
-		SIGCHG(msr & MSR_CTS, sig, UART_SIG_CTS, UART_SIG_DCTS);
-		SIGCHG(msr & MSR_DCD, sig, UART_SIG_DCD, UART_SIG_DDCD);
-		SIGCHG(msr & MSR_RI,  sig, UART_SIG_RI,  UART_SIG_DRI);
+		SIGCHG(msr & MSR_DSR, sig, SER_DSR, SER_DDSR);
+		SIGCHG(msr & MSR_CTS, sig, SER_CTS, SER_DCTS);
+		SIGCHG(msr & MSR_DCD, sig, SER_DCD, SER_DDCD);
+		SIGCHG(msr & MSR_RI,  sig, SER_RI,  SER_DRI);
 		new = sig & ~UART_SIGMASK_DELTA;
 	} while (!atomic_cmpset_32(&sc->sc_hwsig, old, new));
 	return (sig);
@@ -753,20 +753,20 @@
 	do {
 		old = sc->sc_hwsig;
 		new = old;
-		if (sig & UART_SIG_DDTR) {
-			SIGCHG(sig & UART_SIG_DTR, new, UART_SIG_DTR,
-			    UART_SIG_DDTR);
+		if (sig & SER_DDTR) {
+			SIGCHG(sig & SER_DTR, new, SER_DTR,
+			    SER_DDTR);
 		}
-		if (sig & UART_SIG_DRTS) {
-			SIGCHG(sig & UART_SIG_RTS, new, UART_SIG_RTS,
-			    UART_SIG_DRTS);
+		if (sig & SER_DRTS) {
+			SIGCHG(sig & SER_RTS, new, SER_RTS,
+			    SER_DRTS);
 		}
 	} while (!atomic_cmpset_32(&sc->sc_hwsig, old, new));
 	mtx_lock_spin(&sc->sc_hwmtx);
 	ns8250->mcr &= ~(MCR_DTR|MCR_RTS);
-	if (new & UART_SIG_DTR)
+	if (new & SER_DTR)
 		ns8250->mcr |= MCR_DTR;
-	if (new & UART_SIG_RTS)
+	if (new & SER_RTS)
 		ns8250->mcr |= MCR_RTS;
 	uart_setreg(bas, REG_MCR, ns8250->mcr);
 	uart_barrier(bas);

==== //depot/projects/sack/dev/uart/uart_dev_sab82532.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_sab82532.c,v 1.6 2004/04/25 04:30:40 marcel Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_sab82532.c,v 1.7 2004/06/24 10:07:28 phk Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -410,7 +410,7 @@
 	uart_barrier(bas);
 
 	if (sc->sc_sysdev == NULL)
-		sab82532_bus_setsig(sc, UART_SIG_DDTR|UART_SIG_DRTS);
+		sab82532_bus_setsig(sc, SER_DDTR|SER_DRTS);
 	(void)sab82532_bus_getsig(sc);
 	return (0);
 }
@@ -455,9 +455,9 @@
 		sig = old;
 		mtx_lock_spin(&sc->sc_hwmtx);
 		star = uart_getreg(bas, SAB_STAR);
-		SIGCHG(star & SAB_STAR_CTS, sig, UART_SIG_CTS, UART_SIG_DCTS);
+		SIGCHG(star & SAB_STAR_CTS, sig, SER_CTS, SER_DCTS);
 		vstr = uart_getreg(bas, SAB_VSTR);
-		SIGCHG(vstr & SAB_VSTR_CD, sig, UART_SIG_DCD, UART_SIG_DDCD);
+		SIGCHG(vstr & SAB_VSTR_CD, sig, SER_DCD, SER_DDCD);
 		pvr = uart_getreg(bas, SAB_PVR);
 		switch (bas->chan) {
 		case 1:
@@ -467,7 +467,7 @@
 			pvr &= SAB_PVR_DSR_B;
 			break;
 		}
-		SIGCHG(~pvr, sig, UART_SIG_DSR, UART_SIG_DDSR);
+		SIGCHG(~pvr, sig, SER_DSR, SER_DDSR);
 		mtx_unlock_spin(&sc->sc_hwmtx);
 		new = sig & ~UART_SIGMASK_DELTA;
 	} while (!atomic_cmpset_32(&sc->sc_hwsig, old, new));
@@ -655,13 +655,13 @@
 	do {
 		old = sc->sc_hwsig;
 		new = old;
-		if (sig & UART_SIG_DDTR) {
-			SIGCHG(sig & UART_SIG_DTR, new, UART_SIG_DTR,
-			    UART_SIG_DDTR);
+		if (sig & SER_DDTR) {
+			SIGCHG(sig & SER_DTR, new, SER_DTR,
+			    SER_DDTR);
 		}
-		if (sig & UART_SIG_DRTS) {
-			SIGCHG(sig & UART_SIG_RTS, new, UART_SIG_RTS,
-			    UART_SIG_DRTS);
+		if (sig & SER_DRTS) {
+			SIGCHG(sig & SER_RTS, new, SER_RTS,
+			    SER_DRTS);
 		}
 	} while (!atomic_cmpset_32(&sc->sc_hwsig, old, new));
 
@@ -670,13 +670,13 @@
 	pvr = uart_getreg(bas, SAB_PVR);
 	switch (bas->chan) {
 	case 1:
-		if (new & UART_SIG_DTR)
+		if (new & SER_DTR)
 			pvr &= ~SAB_PVR_DTR_A;
 		else
 			pvr |= SAB_PVR_DTR_A;
 		break;
 	case 2:
-		if (new & UART_SIG_DTR)
+		if (new & SER_DTR)
 			pvr &= ~SAB_PVR_DTR_B;
 		else
 			pvr |= SAB_PVR_DTR_B;
@@ -686,7 +686,7 @@
 
 	/* Set RTS pin. */
 	mode = uart_getreg(bas, SAB_MODE);
-	if (new & UART_SIG_RTS)
+	if (new & SER_RTS)
 		mode &= ~SAB_MODE_FRTS;
 	else
 		mode |= SAB_MODE_FRTS;

==== //depot/projects/sack/dev/uart/uart_dev_z8530.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_z8530.c,v 1.7 2004/05/04 06:58:10 marcel Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_z8530.c,v 1.8 2004/06/24 10:07:28 phk Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -350,8 +350,8 @@
 		mtx_lock_spin(&sc->sc_hwmtx);
 		bes = uart_getmreg(&sc->sc_bas, RR_BES);
 		mtx_unlock_spin(&sc->sc_hwmtx);
-		SIGCHG(bes & BES_CTS, sig, UART_SIG_CTS, UART_SIG_DCTS);
-		SIGCHG(bes & BES_DCD, sig, UART_SIG_DCD, UART_SIG_DDCD);
+		SIGCHG(bes & BES_CTS, sig, SER_CTS, SER_DCTS);
+		SIGCHG(bes & BES_DCD, sig, SER_DCD, SER_DDCD);
 		new = sig & ~UART_SIGMASK_DELTA;
 	} while (!atomic_cmpset_32(&sc->sc_hwsig, old, new));
 	return (sig);
@@ -411,8 +411,8 @@
 	if (bes & BES_RXA)
 		ipend |= UART_IPEND_RXREADY;
 	sig = sc->sc_hwsig;
-	SIGCHG(bes & BES_CTS, sig, UART_SIG_CTS, UART_SIG_DCTS);
-	SIGCHG(bes & BES_DCD, sig, UART_SIG_DCD, UART_SIG_DDCD);
+	SIGCHG(bes & BES_CTS, sig, SER_CTS, SER_DCTS);
+	SIGCHG(bes & BES_DCD, sig, SER_DCD, SER_DDCD);
 	if (sig & UART_SIGMASK_DELTA)
 		ipend |= UART_IPEND_SIGCHG;
 	src = uart_getmreg(bas, RR_SRC);
@@ -509,22 +509,22 @@
 	do {
 		old = sc->sc_hwsig;
 		new = old;
-		if (sig & UART_SIG_DDTR) {
-			SIGCHG(sig & UART_SIG_DTR, new, UART_SIG_DTR,
-			    UART_SIG_DDTR);
+		if (sig & SER_DDTR) {
+			SIGCHG(sig & SER_DTR, new, SER_DTR,
+			    SER_DDTR);
 		}
-		if (sig & UART_SIG_DRTS) {
-			SIGCHG(sig & UART_SIG_RTS, new, UART_SIG_RTS,
-			    UART_SIG_DRTS);
+		if (sig & SER_DRTS) {
+			SIGCHG(sig & SER_RTS, new, SER_RTS,
+			    SER_DRTS);
 		}
 	} while (!atomic_cmpset_32(&sc->sc_hwsig, old, new));
 
 	mtx_lock_spin(&sc->sc_hwmtx);
-	if (new & UART_SIG_DTR)
+	if (new & SER_DTR)
 		z8530->tpc |= TPC_DTR;
 	else
 		z8530->tpc &= ~TPC_DTR;
-	if (new & UART_SIG_RTS)
+	if (new & SER_RTS)
 		z8530->tpc |= TPC_RTS;
 	else
 		z8530->tpc &= ~TPC_RTS;

==== //depot/projects/sack/dev/uart/uart_tty.c#4 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/uart/uart_tty.c,v 1.12 2004/06/23 10:28:09 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/uart/uart_tty.c,v 1.13 2004/06/24 10:07:28 phk Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -164,11 +164,11 @@
 	 */
 	if ((tp->t_cflag & CRTS_IFLOW) && !sc->sc_hwiflow) {
 		if ((tp->t_state & TS_TBLOCK) &&
-		    (sc->sc_hwsig & UART_SIG_RTS))
-			UART_SETSIG(sc, UART_SIG_DRTS);
+		    (sc->sc_hwsig & SER_RTS))
+			UART_SETSIG(sc, SER_DRTS);
 		else if (!(tp->t_state & TS_TBLOCK) &&
-		    !(sc->sc_hwsig & UART_SIG_RTS))
-			UART_SETSIG(sc, UART_SIG_DRTS|UART_SIG_RTS);
+		    !(sc->sc_hwsig & SER_RTS))
+			UART_SETSIG(sc, SER_DRTS|SER_RTS);
 	}
 
 	if (tp->t_state & TS_TTSTOP)
@@ -207,7 +207,7 @@
 		t->c_cflag &= ~HUPCL;
 	}
 	if (t->c_ospeed == 0) {
-		UART_SETSIG(sc, UART_SIG_DDTR | UART_SIG_DRTS);
+		UART_SETSIG(sc, SER_DDTR | SER_DRTS);
 		return (0);
 	}
 	switch (t->c_cflag & CSIZE) {
@@ -224,13 +224,13 @@
 		parity = UART_PARITY_NONE;
 	if (UART_PARAM(sc, t->c_ospeed, databits, stopbits, parity) != 0)
 		return (EINVAL);
-	UART_SETSIG(sc, UART_SIG_DDTR | UART_SIG_DTR);
+	UART_SETSIG(sc, SER_DDTR | SER_DTR);
 	/* Set input flow control state. */
 	if (!sc->sc_hwiflow) {
 		if ((t->c_cflag & CRTS_IFLOW) && (tp->t_state & TS_TBLOCK))
-			UART_SETSIG(sc, UART_SIG_DRTS);
+			UART_SETSIG(sc, SER_DRTS);
 		else
-			UART_SETSIG(sc, UART_SIG_DRTS | UART_SIG_RTS);
+			UART_SETSIG(sc, SER_DRTS | SER_RTS);
 	} else
 		UART_IOCTL(sc, UART_IOCTL_IFLOW, (t->c_cflag & CRTS_IFLOW));
 	/* Set output flow control state. */
@@ -297,11 +297,11 @@
 
 	if (pend & UART_IPEND_SIGCHG) {
 		sig = pend & UART_IPEND_SIGMASK;
-		if (sig & UART_SIG_DDCD)
-			ttyld_modem(tp, sig & UART_SIG_DCD);
-		if ((sig & UART_SIG_DCTS) && (tp->t_cflag & CCTS_OFLOW) &&
+		if (sig & SER_DDCD)
+			ttyld_modem(tp, sig & SER_DCD);
+		if ((sig & SER_DCTS) && (tp->t_cflag & CCTS_OFLOW) &&
 		    !sc->sc_hwoflow) {
-			if (sig & UART_SIG_CTS) {
+			if (sig & SER_CTS) {
 				tp->t_state &= ~TS_TTSTOP;
 				ttyld_start(tp);
 			} else
@@ -418,7 +418,7 @@
 		/*
 		 * Handle initial DCD.
 		 */
-		if ((sc->sc_hwsig & UART_SIG_DCD) || sc->sc_callout)
+		if ((sc->sc_hwsig & SER_DCD) || sc->sc_callout)
 			ttyld_modem(tp, 1);
 	}
 	/*
@@ -464,7 +464,7 @@
 	if (sc->sc_hwoflow)
 		UART_IOCTL(sc, UART_IOCTL_OFLOW, 0);
 	if (sc->sc_sysdev == NULL)
-		UART_SETSIG(sc, UART_SIG_DDTR | UART_SIG_DRTS);
+		UART_SETSIG(sc, SER_DDTR | SER_DRTS);
 
 	/* Disable pulse capturing. */
 	sc->sc_pps.ppsparam.mode = 0;
@@ -504,52 +504,52 @@
 		UART_IOCTL(sc, UART_IOCTL_BREAK, 0);
 		break;
 	case TIOCSDTR:
-		UART_SETSIG(sc, UART_SIG_DDTR | UART_SIG_DTR);
+		UART_SETSIG(sc, SER_DDTR | SER_DTR);
 		break;
 	case TIOCCDTR:
-		UART_SETSIG(sc, UART_SIG_DDTR);
+		UART_SETSIG(sc, SER_DDTR);
 		break;
 	case TIOCMSET:
 		bits = *(int*)data;
-		sig = UART_SIG_DDTR | UART_SIG_DRTS;
+		sig = SER_DDTR | SER_DRTS;
 		if (bits & TIOCM_DTR)
-			sig |= UART_SIG_DTR;
+			sig |= SER_DTR;
 		if (bits & TIOCM_RTS)
-			sig |= UART_SIG_RTS;
+			sig |= SER_RTS;
 		UART_SETSIG(sc, sig);
 		break;
         case TIOCMBIS:
 		bits = *(int*)data;
 		sig = 0;
 		if (bits & TIOCM_DTR)

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



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