PERFORCE change 35225 for review

Sam Leffler sam at FreeBSD.org
Wed Jul 30 11:34:02 PDT 2003


http://perforce.freebsd.org/chv.cgi?CH=35225

Change 35225 by sam at sam_ebb on 2003/07/30 11:33:50

	IFC

Affected files ...

.. //depot/projects/netperf/sys/alpha/alpha/machdep.c#3 integrate
.. //depot/projects/netperf/sys/amd64/amd64/vm_machdep.c#3 integrate
.. //depot/projects/netperf/sys/cam/scsi/scsi_da.c#3 integrate
.. //depot/projects/netperf/sys/compat/linux/linux_misc.c#3 integrate
.. //depot/projects/netperf/sys/conf/NOTES#2 integrate
.. //depot/projects/netperf/sys/conf/options#2 integrate
.. //depot/projects/netperf/sys/dev/acpica/acpi_ec.c#3 integrate
.. //depot/projects/netperf/sys/dev/fatm/if_fatm.c#2 integrate
.. //depot/projects/netperf/sys/dev/fatm/if_fatmvar.h#2 integrate
.. //depot/projects/netperf/sys/dev/hatm/if_hatm.c#2 integrate
.. //depot/projects/netperf/sys/dev/hatm/if_hatm_ioctl.c#2 integrate
.. //depot/projects/netperf/sys/dev/hatm/if_hatm_tx.c#2 integrate
.. //depot/projects/netperf/sys/dev/hatm/if_hatmvar.h#2 integrate
.. //depot/projects/netperf/sys/dev/hea/eni_if.c#2 integrate
.. //depot/projects/netperf/sys/dev/hfa/fore_if.c#2 integrate
.. //depot/projects/netperf/sys/dev/patm/if_patm.c#2 integrate
.. //depot/projects/netperf/sys/dev/patm/if_patm_ioctl.c#2 integrate
.. //depot/projects/netperf/sys/dev/patm/if_patm_tx.c#2 integrate
.. //depot/projects/netperf/sys/dev/usb/usb_mem.c#2 integrate
.. //depot/projects/netperf/sys/dev/utopia/utopia.c#2 integrate
.. //depot/projects/netperf/sys/geom/geom_ccd.c#2 integrate
.. //depot/projects/netperf/sys/geom/geom_mbr.c#2 integrate
.. //depot/projects/netperf/sys/i386/acpica/acpi_wakeup.c#2 integrate
.. //depot/projects/netperf/sys/i386/i386/locore.s#2 integrate
.. //depot/projects/netperf/sys/i386/include/pcpu.h#2 integrate
.. //depot/projects/netperf/sys/kern/kern_descrip.c#3 integrate
.. //depot/projects/netperf/sys/kern/vfs_syscalls.c#3 integrate
.. //depot/projects/netperf/sys/kern/vfs_vnops.c#3 integrate
.. //depot/projects/netperf/sys/kern/vnode_if.src#3 integrate
.. //depot/projects/netperf/sys/modules/cam/Makefile#2 integrate
.. //depot/projects/netperf/sys/net/if_atm.h#2 integrate
.. //depot/projects/netperf/sys/net/if_atmsubr.c#2 integrate
.. //depot/projects/netperf/sys/netatm/atm_if.c#3 integrate
.. //depot/projects/netperf/sys/netatm/atm_ioctl.h#3 integrate
.. //depot/projects/netperf/sys/netatm/atm_usrreq.c#2 integrate
.. //depot/projects/netperf/sys/netatm/atm_vc.h#2 integrate
.. //depot/projects/netperf/sys/netatm/ipatm/ipatm_usrreq.c#3 integrate
.. //depot/projects/netperf/sys/netatm/sigpvc/sigpvc_if.c#2 integrate
.. //depot/projects/netperf/sys/netatm/spans/spans_arp.c#2 integrate
.. //depot/projects/netperf/sys/netatm/spans/spans_if.c#2 integrate
.. //depot/projects/netperf/sys/netatm/uni/uniarp.c#3 integrate
.. //depot/projects/netperf/sys/netatm/uni/uniarp_cache.c#3 integrate
.. //depot/projects/netperf/sys/netatm/uni/uniip_var.h#3 integrate
.. //depot/projects/netperf/sys/netatm/uni/unisig_if.c#2 integrate
.. //depot/projects/netperf/sys/netgraph/atm/ng_atm.c#2 integrate
.. //depot/projects/netperf/sys/netgraph/atm/ng_atm.h#2 integrate
.. //depot/projects/netperf/sys/netinet6/ip6_fw.c#3 integrate
.. //depot/projects/netperf/sys/nfsclient/nfs_vnops.c#2 integrate
.. //depot/projects/netperf/sys/sparc64/sparc64/pmap.c#2 integrate
.. //depot/projects/netperf/sys/ufs/ffs/ffs_vnops.c#2 integrate
.. //depot/projects/netperf/sys/ufs/ufs/extattr.h#2 integrate
.. //depot/projects/netperf/sys/ufs/ufs/ufs_extattr.c#3 integrate
.. //depot/projects/netperf/sys/ufs/ufs/ufs_vnops.c#2 integrate
.. //depot/projects/netperf/sys/vm/uma_core.c#3 integrate
.. //depot/projects/netperf/sys/vm/uma_int.h#2 integrate

Differences ...

==== //depot/projects/netperf/sys/alpha/alpha/machdep.c#3 (text+ko) ====

@@ -88,7 +88,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/alpha/alpha/machdep.c,v 1.208 2003/07/27 23:45:47 marcel Exp $");
+__FBSDID("$FreeBSD: src/sys/alpha/alpha/machdep.c,v 1.209 2003/07/30 06:38:35 marcel Exp $");
 
 #include "opt_compat.h"
 #include "opt_ddb.h"
@@ -2021,6 +2021,7 @@
 	if (clear_ret != 0) {
 		mcp->mc_regs[FRAME_V0] = 0;
 		mcp->mc_regs[FRAME_A4] = 0;
+		mcp->mc_regs[FRAME_A3] = 0;
 	}
 
 	/*

==== //depot/projects/netperf/sys/amd64/amd64/vm_machdep.c#3 (text+ko) ====

@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/vm_machdep.c,v 1.214 2003/07/25 21:15:45 obrien Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/vm_machdep.c,v 1.215 2003/07/29 12:44:16 davidxu Exp $");
 
 #include "opt_isa.h"
 #include "opt_kstack_pages.h"
@@ -260,7 +260,7 @@
 	pcb2->pcb_rsp = (register_t)td->td_frame - sizeof(void *);	/* trampoline arg */
 	pcb2->pcb_rbx = (register_t)td;			    /* trampoline arg */
 	pcb2->pcb_rip = (register_t)fork_trampoline;
-	pcb2->pcb_rflags = td->td_frame->tf_rflags & ~PSL_I; /* ints disabled */
+	pcb2->pcb_rflags = PSL_KERNEL; /* ints disabled */
 	/*
 	 * If we didn't copy the pcb, we'd need to do the following registers:
 	 * pcb2->pcb_savefpu:	cloned above.

==== //depot/projects/netperf/sys/cam/scsi/scsi_da.c#3 (text+ko) ====

@@ -27,9 +27,10 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/cam/scsi/scsi_da.c,v 1.147 2003/07/28 06:15:58 njl Exp $");
+__FBSDID("$FreeBSD: src/sys/cam/scsi/scsi_da.c,v 1.149 2003/07/29 18:08:16 njl Exp $");
 
 #ifdef _KERNEL
+#include "opt_da.h"
 #include "opt_hw_wdog.h"
 #endif /* _KERNEL */
 
@@ -145,6 +146,7 @@
 
 static struct da_quirk_entry da_quirk_table[] =
 {
+#ifdef DA_OLD_QUIRKS
 	/*
 	 * Logitec USB/Firewire LHD-P30FU
 	 */
@@ -158,6 +160,7 @@
 		{T_DIRECT, SIP_MEDIA_FIXED, "LSILogic", "SYM13FW*", "*"},
 		/*quirks*/ DA_Q_NO_6_BYTE
 	},
+#endif /* DA_OLD_QUIRKS */
 	{
 		/*
 		 * Fujitsu M2513A MO drives.
@@ -241,6 +244,7 @@
 		/*quirks*/ DA_Q_NO_6_BYTE
 	},
 
+#ifdef DA_OLD_QUIRKS
 	/* Below a list of quirks for USB devices supported by umass. */
 	{
 		/*
@@ -250,12 +254,12 @@
 		 * not support sync cache (0x35).
 		 */
 		{T_DIRECT, SIP_MEDIA_REMOVABLE, "Y-E DATA", "USB-FDU", "*"},
-		/*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE
+		/*quirks*/ DA_Q_NO_SYNC_CACHE
 	},
 	{
 		/* Another USB floppy */
 		{T_DIRECT, SIP_MEDIA_REMOVABLE, "MATSHITA", "FDD CF-VFDU*","*"},
-		/*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE
+		/*quirks*/ DA_Q_NO_SYNC_CACHE
 	},
 	{
 		/*
@@ -264,7 +268,7 @@
 		 * Make all sony MS* products use this quirk.
 		 */
 		{T_DIRECT, SIP_MEDIA_REMOVABLE, "Sony", "MS*", "*"},
-		/*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE
+		/*quirks*/ DA_Q_NO_SYNC_CACHE
 	},
 	{
 		/*
@@ -272,22 +276,23 @@
 		 * of PalmOS PDA's
 		 */
 		{T_DIRECT, SIP_MEDIA_REMOVABLE, "Sony", "CLIE*", "*"},
-		/*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE
+		/*quirks*/ DA_Q_NO_SYNC_CACHE
 	},
 	{
 		/*
 		 * Intelligent Stick USB disk-on-key
 		 * PR: kern/53005
 		 */
-		{T_DIRECT, SIP_MEDIA_REMOVABLE, "USB Card", "IntelligentStick*", "*"},
-		/*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE
+		{T_DIRECT, SIP_MEDIA_REMOVABLE, "USB Card",
+		 "IntelligentStick*", "*"},
+		/*quirks*/ DA_Q_NO_SYNC_CACHE
 	},
 	{
 		/*
 		 * Sony DSC cameras (DSC-S30, DSC-S50, DSC-S70)
 		 */
 		{T_DIRECT, SIP_MEDIA_REMOVABLE, "Sony", "Sony DSC", "*"},
-		/*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE
+		/*quirks*/ DA_Q_NO_SYNC_CACHE
 	},
 	{
 		/*
@@ -313,7 +318,7 @@
 		 */
 		{T_DIRECT, SIP_MEDIA_REMOVABLE, "eUSB    Compact*",
 		 "Compact Flash*", "*"},
-		/*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE
+		/*quirks*/ DA_Q_NO_SYNC_CACHE
 	},
 	{
 		/*
@@ -322,14 +327,14 @@
 		 * spaces. The trailing wildcard character '*' is required.
 		 */
 		{T_DIRECT, SIP_MEDIA_REMOVABLE, "SMSC*", "USB FDC*","*"},
-		/*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE
+		/*quirks*/ DA_Q_NO_SYNC_CACHE
 	},
 	{
 		/*
 		 * Olympus digital cameras (C-3040ZOOM, C-2040ZOOM, C-1)
 		 */
 		{T_DIRECT, SIP_MEDIA_REMOVABLE, "OLYMPUS", "C-*", "*"},
-		/*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE
+		/*quirks*/ DA_Q_NO_SYNC_CACHE
 	},
 	{
 		/*
@@ -343,14 +348,14 @@
 		 * Olympus digital cameras (E-100RS, E-10).
 		 */
 		{T_DIRECT, SIP_MEDIA_REMOVABLE, "OLYMPUS", "E-*", "*"},
-		/*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE
+		/*quirks*/ DA_Q_NO_SYNC_CACHE
 	},
 	{
 		/*
 		 * KingByte Pen Drives
 		 */
 		{T_DIRECT, SIP_MEDIA_REMOVABLE, "NO BRAND", "PEN DRIVE", "*"},
-		/*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE
+		/*quirks*/ DA_Q_NO_SYNC_CACHE
  	},
  	{
 		/*
@@ -358,7 +363,7 @@
 		 */
  		{T_DIRECT, SIP_MEDIA_REMOVABLE, "FUJIFILMUSB-DRIVEUNIT",
 		 "USB-DRIVEUNIT", "*"},
- 		/*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE
+ 		/*quirks*/ DA_Q_NO_SYNC_CACHE
  	},
 	{
 		/*
@@ -393,7 +398,7 @@
 		 * Minolta Dimage E203
 		 */
 		{T_DIRECT, SIP_MEDIA_REMOVABLE, "MINOLTA", "DiMAGE E203", "*"},
-		/*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE
+		/*quirks*/ DA_Q_NO_SYNC_CACHE
 	},
 	{
 		/*
@@ -416,7 +421,7 @@
 		 * PR: kern/43627
 		 */
 		{T_DIRECT, SIP_MEDIA_REMOVABLE, "Apacer", "HandyDrive", "*"},
-		/*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE
+		/*quirks*/ DA_Q_NO_SYNC_CACHE
 	},
 	{
 		/*
@@ -424,7 +429,7 @@
 		 * PR: kern/43580
 		 */
 		{T_DIRECT, SIP_MEDIA_REMOVABLE, "ZORAN", "COACH", "*"},
-		/*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE
+		/*quirks*/ DA_Q_NO_SYNC_CACHE
 	},
 	{
 		/*
@@ -448,7 +453,7 @@
 		 * PR: kern/46386
 		 */
 		{T_DIRECT, SIP_MEDIA_REMOVABLE, "Sony", "Storage Media", "*"},
-		/*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE
+		/*quirks*/ DA_Q_NO_SYNC_CACHE
 	},
 	{
 		/*
@@ -507,7 +512,7 @@
 		 * PR: kern/50226
 		 */
 		{T_DIRECT, SIP_MEDIA_REMOVABLE, "MITSUMI", "USB FDD", "*"},
-		/*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE
+		/*quirks*/ DA_Q_NO_SYNC_CACHE
 	},
 	{
 		/*
@@ -517,6 +522,7 @@
 		{T_DIRECT, SIP_MEDIA_REMOVABLE, "OTi", "Flash Disk", "*"},
 		/*quirks*/ DA_Q_NO_6_BYTE
 	}
+#endif /* DA_OLD_QUIRKS */
 };
 
 static	disk_strategy_t	dastrategy;

==== //depot/projects/netperf/sys/compat/linux/linux_misc.c#3 (text+ko) ====

@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/linux/linux_misc.c,v 1.146 2003/07/26 07:32:20 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/linux/linux_misc.c,v 1.147 2003/07/29 10:03:15 des Exp $");
 
 #include "opt_mac.h"
 
@@ -75,6 +75,10 @@
 #include <compat/linux/linux_mib.h>
 #include <compat/linux/linux_util.h>
 
+#ifdef __i386__
+#include <machine/cputypes.h>
+#endif
+
 #ifdef __alpha__
 #define BSD_TO_LINUX_SIGNAL(sig)       (sig)
 #else
@@ -689,6 +693,7 @@
 	struct l_new_utsname utsname;
 	char osname[LINUX_MAX_UTSNAME];
 	char osrelease[LINUX_MAX_UTSNAME];
+	char *p;
 
 #ifdef DEBUG
 	if (ldebug(newuname))
@@ -703,7 +708,32 @@
 	getcredhostname(td->td_ucred, utsname.nodename, LINUX_MAX_UTSNAME);
 	strlcpy(utsname.release, osrelease, LINUX_MAX_UTSNAME);
 	strlcpy(utsname.version, version, LINUX_MAX_UTSNAME);
+	for (p = utsname.version; *p != '\0'; ++p)
+		if (*p == '\n') {
+			*p = '\0';
+			break;
+		}
+#ifdef __i386__
+	{
+		const char *class;
+		switch (cpu_class) {
+		case CPUCLASS_686:
+			class = "i686";
+			break;
+		case CPUCLASS_586:
+			class = "i586";
+			break;
+		case CPUCLASS_486:
+			class = "i486";
+			break;
+		default:
+			class = "i386";
+		}
+		strlcpy(utsname.machine, class, LINUX_MAX_UTSNAME);
+	}
+#else
 	strlcpy(utsname.machine, machine, LINUX_MAX_UTSNAME);
+#endif
 	strlcpy(utsname.domainname, domainname, LINUX_MAX_UTSNAME);
 
 	return (copyout(&utsname, args->buf, sizeof(utsname)));

==== //depot/projects/netperf/sys/conf/NOTES#2 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/NOTES,v 1.1164 2003/07/21 13:56:21 harti Exp $
+# $FreeBSD: src/sys/conf/NOTES,v 1.1165 2003/07/29 04:32:32 njl Exp $
 #
 # NOTES -- Lines that can be cut/pasted into kernel and hints configs.
 #
@@ -962,6 +962,12 @@
 options 	SCSI_NO_OP_STRINGS
 options 	SCSI_DELAY=8000	# Be pessimistic about Joe SCSI device
 
+# Options for the CAM SCSI disk driver:
+# DA_OLD_QUIRKS: Restore old USB and firewire quirks that have been
+#		 deprecated.  Please also email scsi at freebsd.org if you
+#		 have a device that needs this option.
+options		DA_OLD_QUIRKS
+
 # Options for the CAM CDROM driver:
 # CHANGER_MIN_BUSY_SECONDS: Guaranteed minimum time quantum for a changer LUN
 # CHANGER_MAX_BUSY_SECONDS: Maximum time quantum per changer LUN, only

==== //depot/projects/netperf/sys/conf/options#2 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/options,v 1.404 2003/07/22 11:42:45 ticso Exp $
+# $FreeBSD: src/sys/conf/options,v 1.406 2003/07/29 18:08:16 njl Exp $
 #
 #        On the handling of kernel options
 #
@@ -258,6 +258,8 @@
 CHANGER_MIN_BUSY_SECONDS	opt_cd.h
 CHANGER_MAX_BUSY_SECONDS	opt_cd.h
 
+DA_OLD_QUIRKS		opt_da.h
+
 # Options used only in cam/scsi/scsi_sa.c.
 SA_IO_TIMEOUT		opt_sa.h
 SA_SPACE_TIMEOUT	opt_sa.h

==== //depot/projects/netperf/sys/dev/acpica/acpi_ec.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/acpica/acpi_ec.c,v 1.37 2003/07/25 16:49:46 njl Exp $
+ *	$FreeBSD: src/sys/dev/acpica/acpi_ec.c,v 1.38 2003/07/30 16:22:52 njl Exp $
  */
 /******************************************************************************
  *
@@ -288,6 +288,9 @@
 	 ((event) == EC_EVENT_INPUT_BUFFER_EMPTY && 	\
 	 ((status) & EC_FLAG_INPUT_BUFFER) == 0))
 
+static int	ec_poll_timeout = EC_POLL_TIMEOUT;
+TUNABLE_INT("hw.acpi.ec.poll_timeout", &ec_poll_timeout);
+
 static __inline ACPI_STATUS
 EcLock(struct acpi_ec_softc *sc)
 {
@@ -792,12 +795,12 @@
 	sc->ec_polldelay = 100;
 
     /*
-     * If we still don't have a response, wait up to EC_POLL_TIMEOUT ms
+     * If we still don't have a response, wait up to ec_poll_timeout ms
      * for completion, sleeping for chunks of 10 ms.
      */
     if (Status != AE_OK) {
 	retval = -1;
-	for (i = 0; i < EC_POLL_TIMEOUT / 10; i++) {
+	for (i = 0; i < ec_poll_timeout / 10; i++) {
 	    if (retval != 0)
 		EcStatus = EC_GET_CSR(sc);
 	    else

==== //depot/projects/netperf/sys/dev/fatm/if_fatm.c#2 (text+ko) ====

@@ -29,7 +29,7 @@
  * Fore PCA200E driver for NATM
  */
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/fatm/if_fatm.c,v 1.3 2003/07/02 13:53:41 harti Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/fatm/if_fatm.c,v 1.5 2003/07/30 14:20:00 harti Exp $");
 
 #include "opt_inet.h"
 #include "opt_natm.h"
@@ -48,6 +48,7 @@
 #include <sys/endian.h>
 #include <sys/sysctl.h>
 #include <sys/condvar.h>
+#include <vm/uma.h>
 
 #include <sys/sockio.h>
 #include <sys/mbuf.h>
@@ -470,6 +471,8 @@
 
 	if (sc->ifatm.ifnet.if_flags & IFF_RUNNING) {
 		sc->ifatm.ifnet.if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
+		ATMEV_SEND_IFSTATE_CHANGED(&sc->ifatm,
+		    sc->utopia.carrier == UTP_CARR_OK);
 
 		/*
 		 * Collect transmit mbufs, partial receive mbufs and
@@ -518,9 +521,13 @@
 	sc->small_cnt = sc->large_cnt = 0;
 
 	/* Reset vcc info */
-	if (sc->vccs != NULL)
-		for (i = 0; i <= FORE_MAX_VCC; i++)
-			sc->vccs[i].flags = 0;
+	if (sc->vccs != NULL) {
+		for (i = 0; i < FORE_MAX_VCC + 1; i++)
+			if (sc->vccs[i] != NULL) {
+				uma_zfree(sc->vcc_zone, sc->vccs[i]);
+				sc->vccs[i] = NULL;
+			}
+	}
 
 	sc->open_vccs = 0;
 }
@@ -1325,6 +1332,9 @@
 	/* start SUNI */
 	utopia_start(&sc->utopia);
 
+	ATMEV_SEND_IFSTATE_CHANGED(&sc->ifatm,
+	    sc->utopia.carrier == UTP_CARR_OK);
+
 	DBG(sc, INIT, ("done"));
 }
 
@@ -1441,7 +1451,7 @@
 fatm_intr_drain_rx(struct fatm_softc *sc)
 {
 	struct rxqueue *q;
-	int stat, mlen, drop;
+	int stat, mlen;
 	u_int i;
 	uint32_t h;
 	struct mbuf *last, *m0;
@@ -1450,6 +1460,7 @@
 	u_int vci, vpi, pt;
 	struct atm_pseudohdr aph;
 	struct ifnet *ifp;
+	struct card_vcc *vc;
 
 	for (;;) {
 		q = GET_QUEUE(sc->rxqueue, struct rxqueue, sc->rxqueue.tail);
@@ -1464,7 +1475,6 @@
 		H_SYNCQ_POSTREAD(&sc->rxq_mem, rpd, RPD_SIZE);
 
 		rpd->nseg = le32toh(rpd->nseg);
-		drop = 0;
 		mlen = 0;
 		m0 = last = 0;
 		for (i = 0; i < rpd->nseg; i++) {
@@ -1504,26 +1514,30 @@
 		 * Locate the VCC this packet belongs to
 		 */
 		if (!VC_OK(sc, vpi, vci))
-			drop = 1;
-		else if ((sc->vccs[vci].flags & FATM_VCC_OPEN) == 0) {
+			vc = NULL;
+		else if ((vc = sc->vccs[vci]) == NULL ||
+		    !(sc->vccs[vci]->vflags & FATM_VCC_OPEN)) {
 			sc->istats.rx_closed++;
-			drop = 1;
+			vc = NULL;
 		}
 
 		DBG(sc, RCV, ("RCV: vc=%u.%u pt=%u mlen=%d %s", vpi, vci,
-		    pt, mlen, drop ? "dropped" : ""));
+		    pt, mlen, vc == NULL ? "dropped" : ""));
 
-		if (drop) {
+		if (vc == NULL) {
 			m_freem(m0);
 		} else {
-			ATM_PH_FLAGS(&aph) = sc->vccs[vci].flags & 0xff;
+			ATM_PH_FLAGS(&aph) = vc->param.flags;
 			ATM_PH_VPI(&aph) = vpi;
 			ATM_PH_SETVCI(&aph, vci);
 
 			ifp = &sc->ifatm.ifnet;
 			ifp->if_ipackets++;
 
-			atm_input(ifp, &aph, m0, sc->vccs[vci].rxhand);
+			vc->ipackets++;
+			vc->ibytes += m0->m_pkthdr.len;
+
+			atm_input(ifp, &aph, m0, vc->rxhand);
 		}
 
 		H_SETSTAT(q->q.statp, FATM_STAT_FREE);
@@ -1890,7 +1904,7 @@
  * Note, that we update the internal statistics without the lock here.
  */
 static int
-fatm_tx(struct fatm_softc *sc, struct mbuf *m, u_int vpi, u_int vci, u_int mlen)
+fatm_tx(struct fatm_softc *sc, struct mbuf *m, struct card_vcc *vc, u_int mlen)
 {
 	struct txqueue *q;
 	u_int nblks;
@@ -1943,7 +1957,7 @@
 	/*
 	 * OK. Now go and do it.
 	 */
-	aal = (sc->vccs[vci].aal == ATMIO_AAL_5) ? 5 : 0;
+	aal = (vc->param.aal == ATMIO_AAL_5) ? 5 : 0;
 
 	H_SETSTAT(q->q.statp, FATM_STAT_PENDING);
 	H_SYNCSTAT_PREWRITE(sc, q->q.statp);
@@ -1956,15 +1970,16 @@
 	 */
 	H_SETDESC(tpd->spec, TDX_MKSPEC((sc->txcnt >=
 	    (4 * FATM_TX_QLEN) / 5), aal, nsegs, mlen));
-	H_SETDESC(tpd->atm_header, TDX_MKHDR(vpi, vci, 0, 0));
+	H_SETDESC(tpd->atm_header, TDX_MKHDR(vc->param.vpi,
+	    vc->param.vci, 0, 0));
 
-	if (sc->vccs[vci].traffic == ATMIO_TRAFFIC_UBR)
+	if (vc->param.traffic == ATMIO_TRAFFIC_UBR)
 		H_SETDESC(tpd->stream, 0);
 	else {
 		u_int i;
 
 		for (i = 0; i < RATE_TABLE_SIZE; i++)
-			if (rate_table[i].cell_rate < sc->vccs[vci].pcr)
+			if (rate_table[i].cell_rate < vc->param.tparam.pcr)
 				break;
 		if (i > 0)
 			i--;
@@ -1982,6 +1997,8 @@
 
 	sc->txcnt++;
 	sc->ifatm.ifnet.if_opackets++;
+	vc->obytes += m->m_pkthdr.len;
+	vc->opackets++;
 
 	NEXT_QUEUE_ENTRY(sc->txqueue.head, FATM_TX_QLEN);
 
@@ -1995,6 +2012,7 @@
 	struct fatm_softc *sc;
 	struct mbuf *m;
 	u_int mlen, vpi, vci;
+	struct card_vcc *vc;
 
 	sc = (struct fatm_softc *)ifp->if_softc;
 
@@ -2043,13 +2061,13 @@
 			m_freem(m);
 			break;
 		}
-		if (!VC_OK(sc, vpi, vci) ||
-		    !(sc->vccs[vci].flags & FATM_VCC_OPEN)) {
+		if (!VC_OK(sc, vpi, vci) || (vc = sc->vccs[vci]) == NULL ||
+		    !(vc->vflags & FATM_VCC_OPEN)) {
 			FATM_UNLOCK(sc);
 			m_freem(m);
 			continue;
 		}
-		if (fatm_tx(sc, m, vpi, vci, mlen)) {
+		if (fatm_tx(sc, m, vc, mlen)) {
 			FATM_UNLOCK(sc);
 			break;
 		}
@@ -2058,52 +2076,6 @@
 }
 
 /*
- * Return a table of all currently open VCCs.
- */
-static struct atmio_vcctable *
-get_vccs(struct fatm_softc *sc, int flags)
-{
-	struct atmio_vcctable *vccs;
-	struct atmio_vcc *v;
-	u_int i, alloc;
-
-	alloc = 10;
-	vccs = NULL;
-	for (;;) {
-		vccs = reallocf(vccs,
-		    sizeof(*vccs) + alloc * sizeof(vccs->vccs[0]),
-		    M_DEVBUF, flags);
-		if (vccs == NULL)
-			return (NULL);
-
-		vccs->count = 0;
-		FATM_LOCK(sc);
-		v = vccs->vccs;
-		for (i = 0; i < (1U << sc->ifatm.mib.vci_bits); i++) {
-			if (sc->vccs[i].flags & FATM_VCC_OPEN) {
-				if (vccs->count++ == alloc) {
-					alloc *= 2;
-					break;
-				}
-				v->vpi = 0;
-				v->vci = i;
-				v->flags = sc->vccs[i].flags;
-				v->aal = sc->vccs[i].aal;
-				v->traffic = sc->vccs[i].traffic;
-				bzero(&v->tparam, sizeof(v->tparam));
-				v->tparam.pcr = sc->vccs[i].pcr;
-				v++;
-			}
-		}
-		if (i == (1U << sc->ifatm.mib.vci_bits))
-			break;
-		FATM_UNLOCK(sc);
-	}
-	FATM_UNLOCK(sc);
-	return (vccs);
-}
-
-/*
  * VCC managment
  *
  * This may seem complicated. The reason for this is, that we need an
@@ -2148,79 +2120,57 @@
 }
 
 /*
- * Start to open a VCC. This just initiates the operation.
+ * The VC has been opened/closed and somebody has been waiting for this.
+ * Wake him up.
  */
-static int
-fatm_start_open_vcc(struct fatm_softc *sc, u_int vpi, u_int vci, u_int aal,
-    u_int traffic, u_int pcr, u_int flags, void *rxhand,
-    void (*func)(struct fatm_softc *, struct cmdqueue *), struct cmdqueue **qp)
+static void
+fatm_cmd_complete(struct fatm_softc *sc, struct cmdqueue *q)
 {
-	int error;
-	uint32_t cmd;
-	struct cmdqueue *q;
 
-	error = 0;
+	H_SYNCSTAT_POSTREAD(sc, q->q.statp);
+	if (H_GETSTAT(q->q.statp) & FATM_STAT_ERROR) {
+		sc->istats.get_stat_errors++;
+		q->error = EIO;
+	}
+	wakeup(q);
+}
 
-	if (!(sc->ifatm.ifnet.if_flags & IFF_RUNNING))
-		return (EIO);
-	if (!VC_OK(sc, vpi, vci) ||
-	    (aal != ATMIO_AAL_0 && aal != ATMIO_AAL_5) ||
-	    (traffic != ATMIO_TRAFFIC_UBR && traffic != ATMIO_TRAFFIC_CBR))
-		return (EINVAL);
-	if (sc->vccs[vci].flags & FATM_VCC_BUSY)
-		return (EBUSY);
+/*
+ * Open complete
+ */
+static void
+fatm_open_finish(struct fatm_softc *sc, struct card_vcc *vc)
+{
+	vc->vflags &= ~FATM_VCC_TRY_OPEN;
+	vc->vflags |= FATM_VCC_OPEN;
 
-	/* Command and buffer strategy */
-	cmd = FATM_OP_ACTIVATE_VCIN | FATM_OP_INTERRUPT_SEL | (0 << 16);
-	if (aal == ATMIO_AAL_0)
-		cmd |= (0 << 8);
-	else
-		cmd |= (5 << 8);
-
-	if ((q = fatm_start_vcc(sc, vpi, vci, cmd, 1, func)) == NULL)
-		return (EIO);
-	if (qp != NULL)
-		*qp = q;
-
-	sc->vccs[vci].aal = aal;
-	sc->vccs[vci].flags = flags | FATM_VCC_TRY_OPEN;
-	sc->vccs[vci].rxhand = rxhand;
-	sc->vccs[vci].pcr = pcr;
-	sc->vccs[vci].traffic = traffic;
-
-	return (0);
+	/* inform management if this is not an NG
+	 * VCC or it's an NG PVC. */
+	if (!(vc->param.flags & ATMIO_FLAG_NG) ||
+	    (vc->param.flags & ATMIO_FLAG_PVC))
+		ATMEV_SEND_VCC_CHANGED(&sc->ifatm, 0, vc->param.vci, 1);
 }
 
 /*
- * Initiate closing a VCC
+ * The VC that we have tried to open asynchronuosly has been opened.
  */
-static int
-fatm_start_close_vcc(struct fatm_softc *sc, u_int vpi, u_int vci,
-    void (*func)(struct fatm_softc *, struct cmdqueue *), struct cmdqueue **qp)
+static void
+fatm_open_complete(struct fatm_softc *sc, struct cmdqueue *q)
 {
-	int error;
-	struct cmdqueue *q;
+	u_int vci;
+	struct card_vcc *vc;
 
-	error = 0;
-
-	if (!(sc->ifatm.ifnet.if_flags & IFF_RUNNING))
-		return (EIO);
-	if (!VC_OK(sc, vpi, vci))
-		return (EINVAL);
-	if (!(sc->vccs[vci].flags & (FATM_VCC_OPEN | FATM_VCC_TRY_OPEN)))
-		return (ENOENT);
-
-	if ((q = fatm_start_vcc(sc, vpi, vci, 
-	    FATM_OP_DEACTIVATE_VCIN | FATM_OP_INTERRUPT_SEL, 1, func)) == NULL)
-		return (EIO);
-
-	if (qp != NULL)
-		*qp = q;
-
-	sc->vccs[vci].flags &= ~(FATM_VCC_OPEN | FATM_VCC_TRY_OPEN);
-	sc->vccs[vci].flags |= FATM_VCC_TRY_CLOSE;
-
-	return (0);
+	vci = GETVCI(READ4(sc, q->q.card + FATMOC_ACTIN_VPVC));
+	vc = sc->vccs[vci];
+	H_SYNCSTAT_POSTREAD(sc, q->q.statp);
+	if (H_GETSTAT(q->q.statp) & FATM_STAT_ERROR) {
+		sc->istats.get_stat_errors++;
+		sc->vccs[vci] = NULL;
+		uma_zfree(sc->vcc_zone, vc);
+		if_printf(&sc->ifatm.ifnet, "opening VCI %u failed\n", vci);
+		return;
+	}
+	fatm_open_finish(sc, vc);
 }
 
 /*
@@ -2242,130 +2192,121 @@
 }
 
 /*
- * The VC has been opened/closed and somebody has been waiting for this.
- * Wake him up.
+ * Start to open a VCC. This just initiates the operation.
  */
-static void
-fatm_cmd_complete(struct fatm_softc *sc, struct cmdqueue *q)
-{
-
-	H_SYNCSTAT_POSTREAD(sc, q->q.statp);
-	if (H_GETSTAT(q->q.statp) & FATM_STAT_ERROR) {
-		sc->istats.get_stat_errors++;
-		q->error = EIO;
-	}
-	wakeup(q);
-}
-
-/*
- * Open a vcc and wait for completion
- */
 static int
-fatm_open_vcc(struct fatm_softc *sc, u_int vpi, u_int vci, u_int flags,
-    u_int aal, u_int traffic, u_int pcr, void *rxhand)
+fatm_open_vcc(struct fatm_softc *sc, struct atmio_openvcc *op, int wait)
 {
+	uint32_t cmd;
 	int error;
 	struct cmdqueue *q;
+	struct card_vcc *vc;
+
+	/*
+	 * Check parameters
+	 */
+	if ((op->param.flags & ATMIO_FLAG_NOTX) &&
+	    (op->param.flags & ATMIO_FLAG_NORX))
+		return (EINVAL);
+
+	if (!VC_OK(sc, op->param.vpi, op->param.vci))
+		return (EINVAL);
+	if (op->param.aal != ATMIO_AAL_0 && op->param.aal != ATMIO_AAL_5)
+		return (EINVAL);
+
+	vc = uma_zalloc(sc->vcc_zone, M_NOWAIT | M_ZERO);
+	if (vc == NULL)
+		return (ENOMEM);
 
 	error = 0;
 
 	FATM_LOCK(sc);
-	error = fatm_start_open_vcc(sc, vpi, vci, aal, traffic, pcr, 
-	    flags, rxhand, fatm_cmd_complete, &q);
-	if (error != 0) {
-		FATM_UNLOCK(sc);
-		return (error);
+	if (!(sc->ifatm.ifnet.if_flags & IFF_RUNNING)) {
+		error = EIO;
+		goto done;
+	}
+	if (sc->vccs[op->param.vci] != NULL) {
+		error = EBUSY;
+		goto done;
 	}
-	error = fatm_waitvcc(sc, q);
+	vc->param = op->param;
+	vc->rxhand = op->rxhand;
 
-	if (error == 0) {
-		sc->vccs[vci].flags &= ~FATM_VCC_TRY_OPEN;
-		sc->vccs[vci].flags |= FATM_VCC_OPEN;
-		sc->open_vccs++;
+	switch (op->param.traffic) {
 
-#ifdef notyet
-		/* inform management if this is not an NG
-		 * VCC or it's an NG PVC. */
-		if (!(sc->vccs[vci].flags & ATMIO_FLAG_NG) ||
-		    (sc->vccs[vci].flags & ATMIO_FLAG_PVC))
-			atm_message(&sc->ifatm.ifnet,
-			    ATM_MSG_VCC_CHANGED,
-			    (1 << 24) | (0 << 16) | vci);
-#endif
-	} else
-		bzero(&sc->vccs[vci], sizeof(sc->vccs[vci]));
+	  case ATMIO_TRAFFIC_UBR:
+		break;
 
-	FATM_UNLOCK(sc);
-	return (error);
-}
+	  case ATMIO_TRAFFIC_CBR:
+		if (op->param.tparam.pcr == 0 ||
+		    op->param.tparam.pcr > sc->ifatm.mib.pcr) {
+			error = EINVAL;
+			goto done;
+		}
+		break;
 
-/*
- * Close a VCC synchronuosly
- */
-static int
-fatm_close_vcc(struct fatm_softc *sc, u_int vpi, u_int vci)
-{
-	int error;
-	struct cmdqueue *q;
+	  default:
+		error = EINVAL;
+		goto done;
+		return (EINVAL);
+	}
+	vc->ibytes = vc->obytes = 0;
+	vc->ipackets = vc->opackets = 0;
 
-	error = 0;
+	/* Command and buffer strategy */
+	cmd = FATM_OP_ACTIVATE_VCIN | FATM_OP_INTERRUPT_SEL | (0 << 16);
+	if (op->param.aal == ATMIO_AAL_0)
+		cmd |= (0 << 8);
+	else
+		cmd |= (5 << 8);
 
-	FATM_LOCK(sc);
-	error = fatm_start_close_vcc(sc, vpi, vci, fatm_cmd_complete, &q);
-	if (error != 0) {
-		FATM_UNLOCK(sc);
-		return (error);
+	q = fatm_start_vcc(sc, op->param.vpi, op->param.vci, cmd, 1,
+	    wait ? fatm_cmd_complete : fatm_open_complete);
+	if (q == NULL) {
+		error = EIO;
+		goto done;
 	}
-	error = fatm_waitvcc(sc, q);
 
-	if (error == 0) {
-#ifdef notyet
-		/* inform management of this is not an NG
-		 * VCC or it's an NG PVC. */
-		if (!(sc->vccs[vci].flags & ATMIO_FLAG_NG) ||
-		    (sc->vccs[vci].flags & ATMIO_FLAG_PVC))
-			atm_message(&sc->ifatm.ifnet,
-			    ATM_MSG_VCC_CHANGED,
-			    (0 << 24) | (0 << 16) | vci);
-#endif
+	vc->vflags = FATM_VCC_TRY_OPEN;
+	sc->vccs[op->param.vci] = vc;
+	sc->open_vccs++;
 
-		bzero(&sc->vccs[vci], sizeof(sc->vccs[vci]));
-		sc->open_vccs--;
+	if (wait) {
+		error = fatm_waitvcc(sc, q);
+		if (error != 0) {
+			sc->vccs[op->param.vci] = NULL;
+			sc->open_vccs--;
+			goto done;
+		}
+		fatm_open_finish(sc, vc);
 	}
 
+	/* don't free below */
+	vc = NULL;
+
+  done:
 	FATM_UNLOCK(sc);
+	if (vc != NULL)
+		uma_zfree(sc->vcc_zone, vc);
 	return (error);
 }
 
 /*
- * The VC has been opened.
+ * Finish close
  */
 static void
-fatm_open_complete(struct fatm_softc *sc, struct cmdqueue *q)
+fatm_close_finish(struct fatm_softc *sc, struct card_vcc *vc)
 {
-	u_int vci;
+	/* inform management of this is not an NG
+	 * VCC or it's an NG PVC. */
+	if (!(vc->param.flags & ATMIO_FLAG_NG) ||
+	    (vc->param.flags & ATMIO_FLAG_PVC))
+		ATMEV_SEND_VCC_CHANGED(&sc->ifatm, 0, vc->param.vci, 0);
 
-	vci = GETVCI(READ4(sc, q->q.card + FATMOC_ACTIN_VPVC));
-	H_SYNCSTAT_POSTREAD(sc, q->q.statp);
-	if (H_GETSTAT(q->q.statp) & FATM_STAT_ERROR) {
-		sc->istats.get_stat_errors++;
-		bzero(&sc->vccs[vci], sizeof(sc->vccs[vci]));
-		if_printf(&sc->ifatm.ifnet, "opening VCI %u failed\n", vci);
-		return;

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


More information about the p4-projects mailing list