svn commit: r211952 - in user/imp/tbemd: contrib/top sys/cddl/contrib/opensolaris/uts/common sys/cddl/contrib/opensolaris/uts/common/fs/zfs sys/fs/nfs sys/fs/nfsserver sys/mips/rmi sys/mips/rmi/dev...

Warner Losh imp at FreeBSD.org
Sat Aug 28 22:14:25 UTC 2010


Author: imp
Date: Sat Aug 28 22:14:24 2010
New Revision: 211952
URL: http://svn.freebsd.org/changeset/base/211952

Log:
  Merge from head at 211951

Added:
  user/imp/tbemd/sys/mips/rmi/dev/nlge/
     - copied from r211951, head/sys/mips/rmi/dev/nlge/
Modified:
  user/imp/tbemd/sys/cddl/contrib/opensolaris/uts/common/Makefile.files
  user/imp/tbemd/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/rrwlock.c
  user/imp/tbemd/sys/fs/nfs/nfs_commonsubs.c
  user/imp/tbemd/sys/fs/nfs/nfs_var.h
  user/imp/tbemd/sys/fs/nfsserver/nfs_nfsdsocket.c
  user/imp/tbemd/sys/fs/nfsserver/nfs_nfsdstate.c
  user/imp/tbemd/sys/mips/rmi/board.c
  user/imp/tbemd/sys/mips/rmi/board.h
  user/imp/tbemd/sys/mips/rmi/files.xlr
  user/imp/tbemd/sys/mips/rmi/iodi.c
  user/imp/tbemd/sys/netinet/sctp.h
  user/imp/tbemd/sys/netinet/sctp_cc_functions.c
  user/imp/tbemd/sys/netinet/sctp_indata.c
  user/imp/tbemd/sys/netinet/sctp_input.c
  user/imp/tbemd/sys/netinet/sctp_output.c
  user/imp/tbemd/sys/netinet/sctp_pcb.c
  user/imp/tbemd/sys/netinet/sctp_pcb.h
  user/imp/tbemd/sys/netinet/sctp_peeloff.c
  user/imp/tbemd/sys/netinet/sctp_timer.c
  user/imp/tbemd/sys/netinet/sctp_usrreq.c
  user/imp/tbemd/sys/netinet/sctputil.c
  user/imp/tbemd/sys/netinet6/sctp6_usrreq.c
Directory Properties:
  user/imp/tbemd/   (props changed)
  user/imp/tbemd/cddl/contrib/opensolaris/   (props changed)
  user/imp/tbemd/contrib/bind9/   (props changed)
  user/imp/tbemd/contrib/ee/   (props changed)
  user/imp/tbemd/contrib/expat/   (props changed)
  user/imp/tbemd/contrib/file/   (props changed)
  user/imp/tbemd/contrib/gdb/   (props changed)
  user/imp/tbemd/contrib/gdtoa/   (props changed)
  user/imp/tbemd/contrib/gnu-sort/   (props changed)
  user/imp/tbemd/contrib/groff/   (props changed)
  user/imp/tbemd/contrib/less/   (props changed)
  user/imp/tbemd/contrib/libpcap/   (props changed)
  user/imp/tbemd/contrib/llvm/   (props changed)
  user/imp/tbemd/contrib/llvm/tools/clang/   (props changed)
  user/imp/tbemd/contrib/ncurses/   (props changed)
  user/imp/tbemd/contrib/netcat/   (props changed)
  user/imp/tbemd/contrib/ntp/   (props changed)
  user/imp/tbemd/contrib/one-true-awk/   (props changed)
  user/imp/tbemd/contrib/openbsm/   (props changed)
  user/imp/tbemd/contrib/openpam/   (props changed)
  user/imp/tbemd/contrib/pf/   (props changed)
  user/imp/tbemd/contrib/sendmail/   (props changed)
  user/imp/tbemd/contrib/tcpdump/   (props changed)
  user/imp/tbemd/contrib/tcsh/   (props changed)
  user/imp/tbemd/contrib/top/   (props changed)
  user/imp/tbemd/contrib/top/install-sh   (props changed)
  user/imp/tbemd/contrib/tzcode/stdtime/   (props changed)
  user/imp/tbemd/contrib/tzcode/zic/   (props changed)
  user/imp/tbemd/contrib/tzdata/   (props changed)
  user/imp/tbemd/contrib/wpa/   (props changed)
  user/imp/tbemd/crypto/openssh/   (props changed)
  user/imp/tbemd/crypto/openssl/   (props changed)
  user/imp/tbemd/lib/libc/   (props changed)
  user/imp/tbemd/lib/libc/stdtime/   (props changed)
  user/imp/tbemd/lib/libutil/   (props changed)
  user/imp/tbemd/lib/libz/   (props changed)
  user/imp/tbemd/sbin/   (props changed)
  user/imp/tbemd/sbin/ipfw/   (props changed)
  user/imp/tbemd/share/zoneinfo/   (props changed)
  user/imp/tbemd/sys/   (props changed)
  user/imp/tbemd/sys/amd64/include/xen/   (props changed)
  user/imp/tbemd/sys/cddl/contrib/opensolaris/   (props changed)
  user/imp/tbemd/sys/contrib/dev/acpica/   (props changed)
  user/imp/tbemd/sys/contrib/pf/   (props changed)
  user/imp/tbemd/sys/contrib/x86emu/   (props changed)
  user/imp/tbemd/sys/dev/xen/xenpci/   (props changed)
  user/imp/tbemd/usr.bin/csup/   (props changed)
  user/imp/tbemd/usr.bin/procstat/   (props changed)
  user/imp/tbemd/usr.sbin/zic/   (props changed)

Modified: user/imp/tbemd/sys/cddl/contrib/opensolaris/uts/common/Makefile.files
==============================================================================
--- user/imp/tbemd/sys/cddl/contrib/opensolaris/uts/common/Makefile.files	Sat Aug 28 21:41:18 2010	(r211951)
+++ user/imp/tbemd/sys/cddl/contrib/opensolaris/uts/common/Makefile.files	Sat Aug 28 22:14:24 2010	(r211952)
@@ -19,9 +19,6 @@
 # CDDL HEADER END
 #
 
-ZUT_OBJS +=			\
-	zut.o
-
 #
 # Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
 # Use is subject to license terms.
@@ -109,3 +106,6 @@ ZFS_OBJS +=			\
 	zfs_vfsops.o		\
 	zfs_vnops.o		\
 	zvol.o
+
+ZUT_OBJS +=			\
+	zut.o

Modified: user/imp/tbemd/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/rrwlock.c
==============================================================================
--- user/imp/tbemd/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/rrwlock.c	Sat Aug 28 21:41:18 2010	(r211951)
+++ user/imp/tbemd/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/rrwlock.c	Sat Aug 28 22:14:24 2010	(r211952)
@@ -82,7 +82,7 @@ rrn_find(rrwlock_t *rrl)
 	rrw_node_t *rn;
 
 	if (refcount_count(&rrl->rr_linked_rcount) == 0)
-		return (B_FALSE);
+		return (NULL);
 
 	for (rn = tsd_get(rrw_tsd_key); rn != NULL; rn = rn->rn_next) {
 		if (rn->rn_rrl == rrl)

Modified: user/imp/tbemd/sys/fs/nfs/nfs_commonsubs.c
==============================================================================
--- user/imp/tbemd/sys/fs/nfs/nfs_commonsubs.c	Sat Aug 28 21:41:18 2010	(r211951)
+++ user/imp/tbemd/sys/fs/nfs/nfs_commonsubs.c	Sat Aug 28 22:14:24 2010	(r211952)
@@ -1824,6 +1824,21 @@ nfsv4_getref(struct nfsv4lock *lp, int *
 }
 
 /*
+ * Get a reference as above, but return failure instead of sleeping if
+ * an exclusive lock is held.
+ */
+APPLESTATIC int
+nfsv4_getref_nonblock(struct nfsv4lock *lp)
+{
+
+	if ((lp->nfslock_lock & NFSV4LOCK_LOCK) != 0)
+		return (0);
+
+	lp->nfslock_usecnt++;
+	return (1);
+}
+
+/*
  * Test for a lock. Return 1 if locked, 0 otherwise.
  */
 APPLESTATIC int

Modified: user/imp/tbemd/sys/fs/nfs/nfs_var.h
==============================================================================
--- user/imp/tbemd/sys/fs/nfs/nfs_var.h	Sat Aug 28 21:41:18 2010	(r211951)
+++ user/imp/tbemd/sys/fs/nfs/nfs_var.h	Sat Aug 28 22:14:24 2010	(r211952)
@@ -251,6 +251,7 @@ int nfsv4_lock(struct nfsv4lock *, int, 
 void nfsv4_unlock(struct nfsv4lock *, int);
 void nfsv4_relref(struct nfsv4lock *);
 void nfsv4_getref(struct nfsv4lock *, int *, void *);
+int nfsv4_getref_nonblock(struct nfsv4lock *);
 int nfsv4_testlock(struct nfsv4lock *);
 int nfsrv_mtostr(struct nfsrv_descript *, char *, int);
 int nfsrv_checkutf8(u_int8_t *, int);

Modified: user/imp/tbemd/sys/fs/nfsserver/nfs_nfsdsocket.c
==============================================================================
--- user/imp/tbemd/sys/fs/nfsserver/nfs_nfsdsocket.c	Sat Aug 28 21:41:18 2010	(r211951)
+++ user/imp/tbemd/sys/fs/nfsserver/nfs_nfsdsocket.c	Sat Aug 28 22:14:24 2010	(r211952)
@@ -533,8 +533,6 @@ nfsrvd_compound(struct nfsrv_descript *n
 		    NFSV4ROOTLOCKMUTEXPTR);
 	NFSUNLOCKV4ROOTMUTEX();
 	if (igotlock) {
-		NFSLOCKSTATE();	/* to avoid a race with */
-		NFSUNLOCKSTATE();	/* nfsrv_servertimer() */
 		/*
 		 * If I got the lock, I can update the stable storage file.
 		 * Done when the grace period is over or a client has long

Modified: user/imp/tbemd/sys/fs/nfsserver/nfs_nfsdstate.c
==============================================================================
--- user/imp/tbemd/sys/fs/nfsserver/nfs_nfsdstate.c	Sat Aug 28 21:41:18 2010	(r211951)
+++ user/imp/tbemd/sys/fs/nfsserver/nfs_nfsdstate.c	Sat Aug 28 22:14:24 2010	(r211952)
@@ -164,8 +164,6 @@ nfsrv_setclient(struct nfsrv_descript *n
 		    NFSV4ROOTLOCKMUTEXPTR);
 	} while (!igotlock);
 	NFSUNLOCKV4ROOTMUTEX();
-	NFSLOCKSTATE();	/* to avoid a race with */
-	NFSUNLOCKSTATE();	/* nfsrv_servertimer() */
 
 	/*
 	 * Search for a match in the client list.
@@ -416,8 +414,6 @@ nfsrv_getclient(nfsquad_t clientid, int 
 			    NFSV4ROOTLOCKMUTEXPTR);
 		} while (!igotlock);
 		NFSUNLOCKV4ROOTMUTEX();
-		NFSLOCKSTATE();	/* to avoid a race with */
-		NFSUNLOCKSTATE();	/* nfsrv_servertimer() */
 	} else if (opflags != CLOPS_RENEW) {
 		NFSLOCKSTATE();
 	}
@@ -547,8 +543,6 @@ nfsrv_adminrevoke(struct nfsd_clid *revo
 		    NFSV4ROOTLOCKMUTEXPTR);
 	} while (!igotlock);
 	NFSUNLOCKV4ROOTMUTEX();
-	NFSLOCKSTATE();	/* to avoid a race with */
-	NFSUNLOCKSTATE();	/* nfsrv_servertimer() */
 
 	/*
 	 * Search for a match in the client list.
@@ -824,11 +818,8 @@ nfsrv_dumplocks(vnode_t vp, struct nfsd_
 
 /*
  * Server timer routine. It can scan any linked list, so long
- * as it holds the spin lock and there is no exclusive lock on
+ * as it holds the spin/mutex lock and there is no exclusive lock on
  * nfsv4rootfs_lock.
- * Must be called by a kernel thread and not a timer interrupt,
- * so that it only runs when the nfsd threads are sleeping on a
- * uniprocessor and uses the State spin lock for an SMP system.
  * (For OpenBSD, a kthread is ok. For FreeBSD, I think it is ok
  *  to do this from a callout, since the spin locks work. For
  *  Darwin, I'm not sure what will work correctly yet.)
@@ -839,7 +830,7 @@ nfsrv_servertimer(void)
 {
 	struct nfsclient *clp, *nclp;
 	struct nfsstate *stp, *nstp;
-	int i;
+	int got_ref, i;
 
 	/*
 	 * Make sure nfsboottime is set. This is used by V3 as well
@@ -867,13 +858,14 @@ nfsrv_servertimer(void)
 	}
 
 	/*
-	 * Return now if an nfsd thread has the exclusive lock on
-	 * nfsv4rootfs_lock. The dirty trick here is that we have
-	 * the spin lock already and the nfsd threads do a:
-	 * NFSLOCKSTATE, NFSUNLOCKSTATE after getting the exclusive
-	 * lock, so they won't race with code after this check.
+	 * Try and get a reference count on the nfsv4rootfs_lock so that
+	 * no nfsd thread can acquire an exclusive lock on it before this
+	 * call is done. If it is already exclusively locked, just return.
 	 */
-	if (nfsv4rootfs_lock.nfslock_lock & NFSV4LOCK_LOCK) {
+	NFSLOCKV4ROOTMUTEX();
+	got_ref = nfsv4_getref_nonblock(&nfsv4rootfs_lock);
+	NFSUNLOCKV4ROOTMUTEX();
+	if (got_ref == 0) {
 		NFSUNLOCKSTATE();
 		return;
 	}
@@ -945,6 +937,9 @@ nfsrv_servertimer(void)
 	    }
 	}
 	NFSUNLOCKSTATE();
+	NFSLOCKV4ROOTMUTEX();
+	nfsv4_relref(&nfsv4rootfs_lock);
+	NFSUNLOCKV4ROOTMUTEX();
 }
 
 /*
@@ -4224,8 +4219,6 @@ nfsrv_clientconflict(struct nfsclient *c
 			    NFSV4ROOTLOCKMUTEXPTR);
 		} while (!gotlock);
 		NFSUNLOCKV4ROOTMUTEX();
-		NFSLOCKSTATE();	/* to avoid a race with */
-		NFSUNLOCKSTATE();	/* nfsrv_servertimer() */
 		*haslockp = 1;
 		NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY, p);
 		return (1);
@@ -4390,8 +4383,6 @@ nfsrv_delegconflict(struct nfsstate *stp
 			    NFSV4ROOTLOCKMUTEXPTR);
 		} while (!gotlock);
 		NFSUNLOCKV4ROOTMUTEX();
-		NFSLOCKSTATE();	/* to avoid a race with */
-		NFSUNLOCKSTATE();	/* nfsrv_servertimer() */
 		*haslockp = 1;
 		NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY, p);
 		return (-1);

Modified: user/imp/tbemd/sys/mips/rmi/board.c
==============================================================================
--- user/imp/tbemd/sys/mips/rmi/board.c	Sat Aug 28 21:41:18 2010	(r211951)
+++ user/imp/tbemd/sys/mips/rmi/board.c	Sat Aug 28 22:14:24 2010	(r211952)
@@ -78,13 +78,12 @@ static int xls_rxstn_to_txstn_map[128] =
 	[120 ... 127] = TX_STN_SAE
 };
 
-struct stn_cc *xlr_core_cc_configs[] = {&cc_table_cpu_0, &cc_table_cpu_1,
-	&cc_table_cpu_2, &cc_table_cpu_3,
-	&cc_table_cpu_4, &cc_table_cpu_5,
-&cc_table_cpu_6, &cc_table_cpu_7};
+struct stn_cc *xlr_core_cc_configs[] = { &cc_table_cpu_0, &cc_table_cpu_1,
+    &cc_table_cpu_2, &cc_table_cpu_3, &cc_table_cpu_4, &cc_table_cpu_5,
+    &cc_table_cpu_6, &cc_table_cpu_7};
 
-struct stn_cc *xls_core_cc_configs[] = {&xls_cc_table_cpu_0, &xls_cc_table_cpu_1,
-&xls_cc_table_cpu_2, &xls_cc_table_cpu_3};
+struct stn_cc *xls_core_cc_configs[] = { &xls_cc_table_cpu_0, &xls_cc_table_cpu_1,
+   &xls_cc_table_cpu_2, &xls_cc_table_cpu_3 };
 
 struct xlr_board_info xlr_board_info;
 
@@ -98,6 +97,174 @@ xlr_pcmcia_present(void)
 	return ((resetconf & 0x4000) != 0);
 }
 
+static void
+xlr_board_specific_overrides(struct xlr_board_info* board)
+{
+	struct xlr_gmac_block_t *blk1, *blk2;
+
+	blk1 = &board->gmac_block[1];
+	blk2 = &board->gmac_block[2];
+
+	switch (xlr_boot1_info.board_major_version) {
+	case RMI_XLR_BOARD_ARIZONA_I: 
+		/* ATX-I has SPI-4, not XGMAC */
+		blk1->type = XLR_SPI4;
+		blk1->enabled = 0;     /* nlge does not
+							 support SPI-4 */
+		blk2->type = XLR_SPI4;
+		blk2->enabled = 0;
+		break;
+
+	case RMI_XLR_BOARD_ARIZONA_II:
+		/* XGMII_A --> VSC7281, XGMII_B --> VSC7281 */
+		blk1->enabled = 1;
+		blk1->num_ports = 1;
+		blk1->gmac_port[0].valid = 1;
+
+		blk2->enabled = 1;
+		blk2->num_ports = 1;
+		blk2->gmac_port[0].valid = 1;
+	default:
+		break;
+	}
+}
+
+static int
+quad0_xaui(void)
+{
+	xlr_reg_t *gpio_mmio =
+	    (unsigned int *)(DEFAULT_XLR_IO_BASE + XLR_IO_GPIO_OFFSET);
+	uint32_t bit24;
+
+	bit24 = (xlr_read_reg(gpio_mmio, 0x15) >> 24) & 0x1;
+	return (bit24);
+}
+
+static int
+quad1_xaui(void)
+{
+	xlr_reg_t *gpio_mmio =
+	    (unsigned int *)(DEFAULT_XLR_IO_BASE + XLR_IO_GPIO_OFFSET);
+	uint32_t bit25;
+
+	bit25 = (xlr_read_reg(gpio_mmio, 0x15) >> 25) & 0x1;
+	return (bit25);
+}
+
+static void
+xls_board_specific_overrides(struct xlr_board_info* board)
+{
+	struct xlr_gmac_block_t *blk0, *blk1;
+	int i;
+
+	blk0 = &board->gmac_block[0];
+	blk1 = &board->gmac_block[1];
+
+	switch (xlr_boot1_info.board_major_version) {
+	case RMI_XLR_BOARD_ARIZONA_VI:
+		blk0->mode = XLR_PORT0_RGMII;
+		blk0->gmac_port[0].type = XLR_RGMII;
+		blk0->gmac_port[0].phy_addr = 0;
+		blk0->gmac_port[0].mii_addr = XLR_IO_GMAC_4_OFFSET;
+		/* Because of the Octal PHY, SGMII Quad1 is MII is also bound
+		 * to the PHY attached to SGMII0_MDC/MDIO/MDINT. */
+		for (i = 0; i < 4; i++) {
+			blk1->gmac_port[i].mii_addr = XLR_IO_GMAC_0_OFFSET;
+			blk1->gmac_port[i].serdes_addr = XLR_IO_GMAC_0_OFFSET;
+		}
+		blk1->gmac_port[1].mii_addr = XLR_IO_GMAC_0_OFFSET;
+		blk1->gmac_port[2].mii_addr = XLR_IO_GMAC_0_OFFSET;
+		blk1->gmac_port[3].mii_addr = XLR_IO_GMAC_0_OFFSET;
+
+		blk1->gmac_port[1].serdes_addr = XLR_IO_GMAC_0_OFFSET;
+		blk1->gmac_port[2].serdes_addr = XLR_IO_GMAC_0_OFFSET;
+		blk1->gmac_port[3].serdes_addr = XLR_IO_GMAC_0_OFFSET;
+
+		/* RGMII MDIO interrupt is thru NA1 and SGMII MDIO 
+		 * interrupts for ports in blk1 are from NA0 */
+		blk0->gmac_port[0].mdint_id = 1;
+
+		blk1->gmac_port[0].mdint_id = 0;
+		blk1->gmac_port[1].mdint_id = 0;
+		blk1->gmac_port[2].mdint_id = 0;
+		blk1->gmac_port[3].mdint_id = 0;
+		break;
+
+	case RMI_XLR_BOARD_ARIZONA_VIII:
+		/* There is just one Octal PHY on the board and it is 
+		 * connected to the MII interface for NA Quad 0. */
+		blk1->gmac_port[0].mii_addr = XLR_IO_GMAC_0_OFFSET;
+		blk1->gmac_port[1].mii_addr = XLR_IO_GMAC_0_OFFSET;
+		blk1->gmac_port[2].mii_addr = XLR_IO_GMAC_0_OFFSET;
+		blk1->gmac_port[3].mii_addr = XLR_IO_GMAC_0_OFFSET;
+
+		/* Board 8.3 (Lite) has XLS108 */
+		if (xlr_boot1_info.board_minor_version == 3) {
+			/* NA0 has 3 ports */
+			blk0->gmac_port[3].valid = 1;
+			blk0->num_ports--;
+			/* NA1 is completely disabled */
+			blk1->enabled = 0;
+		}
+
+		break;
+
+	case RMI_XLR_BOARD_ARIZONA_XI:
+	case RMI_XLR_BOARD_ARIZONA_XII:
+		if (quad0_xaui()) { /* GMAC ports 0-3 are set to XAUI */
+			/* only GMAC0 is active i.e, the 0-th port on this quad.
+			 * Disable all the other 7 possible ports. */
+			for (i = 1; i < MAX_NA_PORTS; i++) {
+				memset(&blk0->gmac_port[i], 0,
+				    sizeof(blk0->gmac_port[i]));
+			}
+			/* Setup for XAUI on N/w Acc0: gmac0 */
+			blk0->type 		= XLR_XGMAC;
+			blk0->mode 		= XLR_XAUI;
+			blk0->num_ports 	= 1;
+			blk0->gmac_port[0].type = XLR_XAUI;
+			blk1->gmac_port[0].phy_addr = 16;
+			blk0->gmac_port[0].tx_bucket_id = blk0->station_txbase;
+			/* Other addresses etc need not be modified as XAUI_0
+			 * shares its addresses with SGMII GMAC_0, which was 
+			 * set in the caller. */
+		}
+		else {
+			blk0->num_ports 	= 1;  /* only 1 RGMII port */ 
+			blk0->mode = XLR_PORT0_RGMII;
+			blk0->gmac_port[0].type = XLR_RGMII;
+			blk0->gmac_port[0].phy_addr = 0;
+			blk0->gmac_port[0].mii_addr = XLR_IO_GMAC_0_OFFSET;
+		}
+
+		if (quad1_xaui()) { /* GMAC ports 4-7 are used for XAUI */
+			/* only GMAC4 is active i.e, the 0-th port on this quad.
+			 * Disable all the other 7 possible ports. */
+			for (i = 1; i < MAX_NA_PORTS; i++) {
+				memset(&blk1->gmac_port[i], 0,
+				    sizeof(blk1->gmac_port[i]));
+			}
+			/* Setup for XAUI on N/w Acc1: gmac4 */
+			blk1->type 		= XLR_XGMAC;
+			blk1->mode 		= XLR_XAUI;
+			blk1->num_ports 	= 1;
+			/* XAUI and SGMII ports share FMN buckets on N/w Acc 1;
+			   so, station_txbase, station_rfr need not be
+			   patched up. */
+			blk1->gmac_port[0].type = XLR_XAUI;
+			blk1->gmac_port[0].phy_addr = 16;
+			blk1->gmac_port[0].tx_bucket_id = blk1->station_txbase;
+			/* Other addresses etc need not be modified as XAUI_1
+			 * shares its addresses with SGMII GMAC_4, which was 
+			 * set in the caller. */
+		}
+		break;
+
+	default:
+		break;
+	}
+}
+
 /*
  * All our knowledge of chip and board that cannot be detected by probing
  * at run-time goes here
@@ -105,6 +272,57 @@ xlr_pcmcia_present(void)
 int 
 xlr_board_info_setup()
 {
+	struct xlr_gmac_block_t *blk0, *blk1, *blk2;
+	int i;
+
+	/* This setup code is long'ish because the same base driver
+	 * (if_nlge.c) is used for different: 
+	 *    - CPUs (XLR/XLS)
+	 *    - boards (for each CPU, multiple board configs are possible
+	 *	        and available).
+	 *
+	 * At the time of writing, there are atleast 12 boards, 4 with XLR 
+	 * and 8 with XLS. This means that the base driver needs to work with
+	 * 12 different configurations, with varying levels of differences. 
+	 * To accomodate the different configs, the xlr_board_info struct
+	 * has various attributes for paramters that could be different. 
+	 * These attributes are setup here and can be used directly in the 
+	 * base driver. 
+	 * It was seen that the setup code is not entirely trivial and
+	 * it is possible to organize it in different ways. In the following,
+	 * we choose an approach that sacrifices code-compactness/speed for
+	 * readability. This is because configuration code executes once
+	 * per reboot and hence has a minimal performance impact.
+	 * On the other hand, driver debugging/enhancements require 
+	 * that different engineers can quickly comprehend the setup 
+	 * sequence. Hence, readability is seen as the key requirement for
+	 * this code. It is for the reader to decide how much of this
+	 * requirement is met with the current code organization !!
+	 *
+	 * The initialization is organized thus: 
+	 *
+	 * if (CPU is XLS) {
+	 *    // initialize per XLS architecture
+	 *       // default inits (per chip spec)
+	 *       // board-specific overrides
+	 * } else if (CPU is XLR) {
+	 *    // initialize per XLR architecture
+	 *       // default inits (per chip spec)
+	 *       // board-specific overrides
+	 * }
+	 * 
+	 * Within each CPU-specific initialization, all the default 
+	 * initializations are done first. This is followed up with 
+	 * board specific overrides. 
+	 */
+
+	/* start with a clean slate */
+	memset(&xlr_board_info, 0, sizeof(xlr_board_info));
+	xlr_board_info.ata =  xlr_pcmcia_present();
+
+	blk0 = &xlr_board_info.gmac_block[0];
+	blk1 = &xlr_board_info.gmac_block[1];
+	blk2 = &xlr_board_info.gmac_block[2];
 
 	if (xlr_is_xls()) {
 		xlr_board_info.is_xls = 1;
@@ -113,98 +331,154 @@ xlr_board_info_setup()
 		/* Board version 8 has NAND flash */
 		xlr_board_info.cfi =
 		    (xlr_boot1_info.board_major_version != RMI_XLR_BOARD_ARIZONA_VIII);
-		xlr_board_info.ata = xlr_pcmcia_present();
 		xlr_board_info.pci_irq = 0;
 		xlr_board_info.credit_configs = xls_core_cc_configs;
-		xlr_board_info.bucket_sizes = &xls_bucket_sizes;
-		xlr_board_info.msgmap = xls_rxstn_to_txstn_map;
-		xlr_board_info.gmacports = 8;
-
-		/* network block 0 */
-		xlr_board_info.gmac_block[0].type = XLR_GMAC;
-		xlr_board_info.gmac_block[0].enabled = 0xf;
-		xlr_board_info.gmac_block[0].credit_config = &xls_cc_table_gmac0;
-		xlr_board_info.gmac_block[0].station_txbase = MSGRNG_STNID_GMACTX0;
-		xlr_board_info.gmac_block[0].station_rfr = MSGRNG_STNID_GMACRFR_0;
-		if (xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_VI ||
-		    xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_XI ||
-		    xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_XII)
-			xlr_board_info.gmac_block[0].mode = XLR_PORT0_RGMII;
-		else
-			xlr_board_info.gmac_block[0].mode = XLR_SGMII;
-		xlr_board_info.gmac_block[0].baseaddr = XLR_IO_GMAC_0_OFFSET;
-		xlr_board_info.gmac_block[0].baseirq = PIC_GMAC_0_IRQ;
-		xlr_board_info.gmac_block[0].baseinst = 0;
-
-		/* network block 1 */
-		xlr_board_info.gmac_block[1].type = XLR_GMAC;
-		xlr_board_info.gmac_block[1].enabled = xlr_is_xls1xx() ? 0 : 0xf;
-		if (xlr_is_xls4xx_lite()) {
-			xlr_reg_t *mmio = xlr_io_mmio(XLR_IO_GPIO_OFFSET);
-			uint32_t tmp;
-
-			/* some ports are not enabled on the condor 4xx, figure this
-			   out from the GPIO fuse bank */
-			tmp = xlr_read_reg(mmio, 35);
-			if (tmp & (1<<28))
-				xlr_board_info.gmac_block[1].enabled &= ~0x8;
-			if (tmp & (1<<29))
-				xlr_board_info.gmac_block[1].enabled &= ~0x4;
-		}
-		xlr_board_info.gmac_block[1].credit_config = &xls_cc_table_gmac1;
-		xlr_board_info.gmac_block[1].station_txbase = MSGRNG_STNID_GMAC1_TX0;
-		xlr_board_info.gmac_block[1].station_rfr = MSGRNG_STNID_GMAC1_FR_0;
-		xlr_board_info.gmac_block[1].mode = XLR_SGMII;
-		xlr_board_info.gmac_block[1].baseaddr = XLR_IO_GMAC_4_OFFSET;
-		xlr_board_info.gmac_block[1].baseirq = PIC_XGS_0_IRQ;
-		xlr_board_info.gmac_block[1].baseinst = 4;
-
-		/* network block 2 */
-		xlr_board_info.gmac_block[2].enabled = 0;	/* disabled on XLS */
-	} else {
+		xlr_board_info.bucket_sizes   = &xls_bucket_sizes;
+		xlr_board_info.msgmap         = xls_rxstn_to_txstn_map;
+		xlr_board_info.gmacports      = MAX_NA_PORTS;
+
+		/* ---------------- Network Acc 0 ---------------- */
+
+		blk0->type 		= XLR_GMAC;
+		blk0->enabled 		= 0xf;
+		blk0->credit_config 	= &xls_cc_table_gmac0;
+		blk0->station_id 	= TX_STN_GMAC0;
+		blk0->station_txbase 	= MSGRNG_STNID_GMACTX0;
+		blk0->station_rfr 	= MSGRNG_STNID_GMACRFR_0;
+		blk0->mode 		= XLR_SGMII;
+		blk0->baseaddr 		= XLR_IO_GMAC_0_OFFSET;
+		blk0->baseirq 		= PIC_GMAC_0_IRQ;
+		blk0->baseinst 		= 0;
+
+		/* By default, assume SGMII is setup. But this can change based 
+		   on board-specific or setting-specific info. */
+		for (i = 0; i < 4; i++) {
+			blk0->gmac_port[i].valid = 1;
+			blk0->gmac_port[i].instance = i + blk0->baseinst;
+			blk0->gmac_port[i].type = XLR_SGMII;
+			blk0->gmac_port[i].phy_addr = i + 16;
+			blk0->gmac_port[i].tx_bucket_id = 
+			    blk0->station_txbase + i;
+			blk0->gmac_port[i].mdint_id = 0;
+			blk0->num_ports++;
+			blk0->gmac_port[i].base_addr = XLR_IO_GMAC_0_OFFSET + i * 0x1000;
+			blk0->gmac_port[i].mii_addr = XLR_IO_GMAC_0_OFFSET;
+			blk0->gmac_port[i].pcs_addr = XLR_IO_GMAC_0_OFFSET;
+			blk0->gmac_port[i].serdes_addr = XLR_IO_GMAC_0_OFFSET;
+		}
+
+		/* ---------------- Network Acc 1 ---------------- */
+		blk1->type 		= XLR_GMAC;
+		blk1->enabled 		= 0xf;
+		blk1->credit_config 	= &xls_cc_table_gmac1;
+		blk1->station_id 	= TX_STN_GMAC1;
+		blk1->station_txbase 	= MSGRNG_STNID_GMAC1_TX0;
+		blk1->station_rfr 	= MSGRNG_STNID_GMAC1_FR_0;
+		blk1->mode 		= XLR_SGMII;
+		blk1->baseaddr 		= XLR_IO_GMAC_4_OFFSET;
+		blk1->baseirq 		= PIC_XGS_0_IRQ;
+		blk1->baseinst 		= 4;
+
+		for (i = 0; i < 4; i++) {
+			blk1->gmac_port[i].valid = 1;
+			blk1->gmac_port[i].instance = i + blk1->baseinst;
+			blk1->gmac_port[i].type = XLR_SGMII;
+			blk1->gmac_port[i].phy_addr = i + 20;
+			blk1->gmac_port[i].tx_bucket_id = 
+			    blk1->station_txbase + i;
+			blk1->gmac_port[i].mdint_id = 1;
+			blk1->num_ports++;
+			blk1->gmac_port[i].base_addr = XLR_IO_GMAC_4_OFFSET +  i * 0x1000;
+			blk1->gmac_port[i].mii_addr = XLR_IO_GMAC_4_OFFSET;
+			blk1->gmac_port[i].pcs_addr = XLR_IO_GMAC_4_OFFSET;
+			blk1->gmac_port[i].serdes_addr = XLR_IO_GMAC_0_OFFSET;
+		}
+
+		/* ---------------- Network Acc 2 ---------------- */
+		xlr_board_info.gmac_block[2].enabled = 0;  /* disabled on XLS */
+
+		xls_board_specific_overrides(&xlr_board_info);
+
+	} else {	/* XLR */
 		xlr_board_info.is_xls = 0;
 		xlr_board_info.nr_cpus = 32;
 		xlr_board_info.usb = 0;
 		xlr_board_info.cfi = 1;
-		xlr_board_info.ata = xlr_pcmcia_present();
 		xlr_board_info.pci_irq = 0;
 		xlr_board_info.credit_configs = xlr_core_cc_configs;
-		xlr_board_info.bucket_sizes = &bucket_sizes;
-		xlr_board_info.msgmap = xlr_rxstn_to_txstn_map;
-		xlr_board_info.gmacports = 4;
-
-		/* GMAC0 */
-		xlr_board_info.gmac_block[0].type = XLR_GMAC;
-		xlr_board_info.gmac_block[0].enabled = 0xf;
-		xlr_board_info.gmac_block[0].credit_config = &cc_table_gmac;
-		xlr_board_info.gmac_block[0].station_txbase = MSGRNG_STNID_GMACTX0;
-		xlr_board_info.gmac_block[0].station_rfr = MSGRNG_STNID_GMACRFR_0;
-		xlr_board_info.gmac_block[0].mode = XLR_RGMII;
-		xlr_board_info.gmac_block[0].baseaddr = XLR_IO_GMAC_0_OFFSET;
-		xlr_board_info.gmac_block[0].baseirq = PIC_GMAC_0_IRQ;
-		xlr_board_info.gmac_block[0].baseinst = 0;
-
-		/* XGMAC0  */
-		xlr_board_info.gmac_block[1].type = XLR_XGMAC;
-		xlr_board_info.gmac_block[1].enabled = 1;
-		xlr_board_info.gmac_block[1].credit_config = &cc_table_xgs_0;
-		xlr_board_info.gmac_block[1].station_txbase = MSGRNG_STNID_XGS0_TX;
-		xlr_board_info.gmac_block[1].station_rfr = MSGRNG_STNID_XGS0FR;
-		xlr_board_info.gmac_block[1].mode = -1;
-		xlr_board_info.gmac_block[1].baseaddr = XLR_IO_XGMAC_0_OFFSET;
-		xlr_board_info.gmac_block[1].baseirq = PIC_XGS_0_IRQ;
-		xlr_board_info.gmac_block[1].baseinst = 4;
-
-		/* XGMAC1 */
-		xlr_board_info.gmac_block[2].type = XLR_XGMAC;
-		xlr_board_info.gmac_block[2].enabled = 1;
-		xlr_board_info.gmac_block[2].credit_config = &cc_table_xgs_1;
-		xlr_board_info.gmac_block[2].station_txbase = MSGRNG_STNID_XGS1_TX;
-		xlr_board_info.gmac_block[2].station_rfr = MSGRNG_STNID_XGS1FR;
-		xlr_board_info.gmac_block[2].mode = -1;
-		xlr_board_info.gmac_block[2].baseaddr = XLR_IO_XGMAC_1_OFFSET;
-		xlr_board_info.gmac_block[2].baseirq = PIC_XGS_1_IRQ;
-		xlr_board_info.gmac_block[2].baseinst = 5;
-	}
-	return 0;
+		xlr_board_info.bucket_sizes   = &bucket_sizes;
+		xlr_board_info.msgmap         =  xlr_rxstn_to_txstn_map;
+		xlr_board_info.gmacports         = 4;
+
+		/* ---------------- GMAC0 ---------------- */
+		blk0->type 		= XLR_GMAC;
+		blk0->enabled 		= 0xf;
+		blk0->credit_config 	= &cc_table_gmac;
+		blk0->station_id 	= TX_STN_GMAC;
+		blk0->station_txbase 	= MSGRNG_STNID_GMACTX0;
+		blk0->station_rfr 	= MSGRNG_STNID_GMACRFR_0;
+		blk0->mode 		= XLR_RGMII;
+		blk0->baseaddr 		= XLR_IO_GMAC_0_OFFSET;
+		blk0->baseirq 		= PIC_GMAC_0_IRQ;
+		blk0->baseinst 		= 0;
+
+		/* first, do the common/easy stuff for all the ports */
+		for (i = 0; i < 4; i++) {
+			blk0->gmac_port[i].valid = 1;
+			blk0->gmac_port[i].instance = i + blk0->baseinst;
+			blk0->gmac_port[i].type = XLR_RGMII;
+			blk0->gmac_port[i].phy_addr = i;
+			blk0->gmac_port[i].tx_bucket_id = 
+			    blk0->station_txbase + i;
+			blk0->gmac_port[i].mdint_id = 0;
+			blk0->gmac_port[i].base_addr = XLR_IO_GMAC_0_OFFSET + i * 0x1000;
+			blk0->gmac_port[i].mii_addr = XLR_IO_GMAC_0_OFFSET;
+			/* RGMII ports, no PCS/SERDES */
+			blk0->num_ports++;
+		}
+
+		/* ---------------- XGMAC0 ---------------- */
+		blk1->type 		= XLR_XGMAC;
+		blk1->mode 		= XLR_XGMII;
+		blk1->enabled 		= 0;
+		blk1->credit_config 	= &cc_table_xgs_0;
+		blk1->station_txbase 	= MSGRNG_STNID_XGS0_TX;
+		blk1->station_rfr 	= MSGRNG_STNID_XMAC0RFR;
+		blk1->station_id 	= TX_STN_XGS_0;	/* TBD: is this correct ? */
+		blk1->baseaddr 		= XLR_IO_XGMAC_0_OFFSET;
+		blk1->baseirq 		= PIC_XGS_0_IRQ;
+		blk1->baseinst 		= 4;
+
+		blk1->gmac_port[0].type 	= XLR_XGMII;
+		blk1->gmac_port[0].instance 	= 0;
+		blk1->gmac_port[0].phy_addr 	= 0;
+		blk1->gmac_port[0].base_addr 	= XLR_IO_XGMAC_0_OFFSET;
+		blk1->gmac_port[0].mii_addr 	= XLR_IO_XGMAC_0_OFFSET;
+		blk1->gmac_port[0].tx_bucket_id = blk1->station_txbase;
+		blk1->gmac_port[0].mdint_id 	= 1;
+
+		/* ---------------- XGMAC1 ---------------- */
+		blk2->type 		= XLR_XGMAC;
+		blk2->mode 		= XLR_XGMII;
+		blk2->enabled 		= 0;
+		blk2->credit_config 	= &cc_table_xgs_1;
+		blk2->station_txbase 	= MSGRNG_STNID_XGS1_TX;
+		blk2->station_rfr 	= MSGRNG_STNID_XMAC1RFR;
+		blk2->station_id 	= TX_STN_XGS_1;	/* TBD: is this correct ? */
+		blk2->baseaddr 		= XLR_IO_XGMAC_1_OFFSET;
+		blk2->baseirq 		= PIC_XGS_1_IRQ;
+		blk2->baseinst 		= 5;
+
+		blk2->gmac_port[0].type 	= XLR_XGMII;
+		blk2->gmac_port[0].instance 	= 0;
+		blk2->gmac_port[0].phy_addr 	= 0;
+		blk2->gmac_port[0].base_addr 	= XLR_IO_XGMAC_1_OFFSET;
+		blk2->gmac_port[0].mii_addr 	= XLR_IO_XGMAC_1_OFFSET;
+		blk2->gmac_port[0].tx_bucket_id = blk2->station_txbase;
+		blk2->gmac_port[0].mdint_id 	= 2;
+
+		/* Done with default setup. Now do board-specific tweaks. */
+		xlr_board_specific_overrides(&xlr_board_info);
+  	}
+  	return 0;
 }

Modified: user/imp/tbemd/sys/mips/rmi/board.h
==============================================================================
--- user/imp/tbemd/sys/mips/rmi/board.h	Sat Aug 28 21:41:18 2010	(r211951)
+++ user/imp/tbemd/sys/mips/rmi/board.h	Sat Aug 28 22:14:24 2010	(r211952)
@@ -132,41 +132,53 @@ xlr_is_xls4xx_lite(void)
 	uint32_t chipid = xlr_processor_id();
 
 	return (chipid == 0x88 || chipid == 0x8c);
-}
+  }
+  
+/* SPI-4 --> 8 ports, 1G MAC --> 4 ports and 10G MAC --> 1 port */
+#define	MAX_NA_PORTS					8
 
 /* all our knowledge of chip and board that cannot be detected run-time goes here */
-enum gmac_block_types {
-	XLR_GMAC, XLR_XGMAC, XLR_SPI4
-};
-
-enum gmac_block_modes {
-	XLR_RGMII, XLR_SGMII, XLR_PORT0_RGMII
-};
+enum gmac_block_types { XLR_GMAC, XLR_XGMAC, XLR_SPI4};
+enum gmac_port_types  { XLR_RGMII, XLR_SGMII, XLR_PORT0_RGMII, XLR_XGMII, XLR_XAUI };
 
 struct xlr_board_info {
 	int is_xls;
 	int nr_cpus;
-	int usb;		/* usb enabled ? */
-	int cfi;		/* NOR flash */
-	int ata;		/* PCMCIA/compactflash driver */
+	int usb;                               /* usb enabled ? */
+	int cfi;                               /* compact flash driver for NOR? */
+	int ata;                               /* ata driver */
 	int pci_irq;
-	struct stn_cc **credit_configs;	/* pointer to Core station credits */
-	struct bucket_size *bucket_sizes;	/* pointer to Core station
-						 * bucket */
-	int *msgmap;		/* mapping of message station to devices */
-	int gmacports;		/* number of gmac ports on the board */
-	struct xlr_gmac_block_t {
-		int type;	/* see  enum gmac_block_types */
-		unsigned int enabled;	/* mask of ports enabled */
-		struct stn_cc *credit_config;	/* credit configuration */
-		int station_txbase;	/* station id for tx */
-		int station_rfr;/* free desc bucket */
-		int mode;	/* see gmac_block_modes */
-		uint32_t baseaddr;	/* IO base */
-		int baseirq;	/* first irq for this block, the rest are in
-				 * sequence */
-		int baseinst;	/* the first rge unit for this block */
-	}  gmac_block[3];
+	struct stn_cc **credit_configs;        /* pointer to Core station credits */
+	struct bucket_size *bucket_sizes;      /* pointer to Core station bucket */
+	int *msgmap;                           /* mapping of message station to devices */
+	int gmacports;                         /* number of gmac ports on the board */
+	struct xlr_gmac_block_t {              /* refers to the set of GMACs controlled by a 
+                                                  network accelarator */
+		int  type;                     /* see  enum gmac_block_types */
+		unsigned int enabled;          /* mask of ports enabled */   
+		struct stn_cc *credit_config;  /* credit configuration */
+		int station_id;		       /* station id for sending msgs */
+		int station_txbase;            /* station id for tx */
+		int station_rfr;               /* free desc bucket */
+		int  mode;                     /* see gmac_block_modes */
+		uint32_t baseaddr;             /* IO base */
+		int baseirq;        /* first irq for this block, the rest are in sequence */
+		int baseinst;       /* the first rge unit for this block */
+		int num_ports;
+		struct xlr_gmac_port {
+			int valid;
+			int type;		/* see enum gmac_port_types */
+			uint32_t instance;	/* identifies the GMAC to which
+						   this port is bound to. */
+			uint32_t phy_addr;
+			uint32_t base_addr;
+			uint32_t mii_addr;
+			uint32_t pcs_addr;
+			uint32_t serdes_addr;
+			uint32_t tx_bucket_id;
+			uint32_t mdint_id;
+		} gmac_port[MAX_NA_PORTS];
+	} gmac_block [3];
 };
 
 extern struct xlr_board_info xlr_board_info;

Modified: user/imp/tbemd/sys/mips/rmi/files.xlr
==============================================================================
--- user/imp/tbemd/sys/mips/rmi/files.xlr	Sat Aug 28 21:41:18 2010	(r211951)
+++ user/imp/tbemd/sys/mips/rmi/files.xlr	Sat Aug 28 22:14:24 2010	(r211952)
@@ -21,6 +21,7 @@ mips/rmi/bus_space_rmi_pci.c			standard
 mips/rmi/dev/sec/rmisec.c			optional rmisec
 mips/rmi/dev/sec/rmilib.c			optional rmisec
 mips/rmi/dev/xlr/rge.c				optional rge
+mips/rmi/dev/nlge/if_nlge.c			optional nlge
 dev/iicbus/xlr_rtc.c				optional xlr_rtc
 dev/iicbus/xlr_temperature.c			optional xlr_temperature
 dev/iicbus/xlr_eeprom.c				optional xlr_eeprom

Modified: user/imp/tbemd/sys/mips/rmi/iodi.c
==============================================================================
--- user/imp/tbemd/sys/mips/rmi/iodi.c	Sat Aug 28 21:41:18 2010	(r211951)
+++ user/imp/tbemd/sys/mips/rmi/iodi.c	Sat Aug 28 22:14:24 2010	(r211952)
@@ -108,13 +108,14 @@ iodi_setup_intr(device_t dev, device_t c
     struct resource *ires, int flags, driver_filter_t * filt,
     driver_intr_t *intr, void *arg, void **cookiep)
 {
+	const char *name = device_get_name(child);
 
-	if (strcmp(device_get_name(child), "uart") == 0) {
+	if (strcmp(name, "uart") == 0) {
 		/* FIXME uart 1? */
 		cpu_establish_hardintr("uart", filt, intr, arg,
 		    PIC_UART_0_IRQ, flags, cookiep);
 		pic_setup_intr(PIC_IRT_UART_0_INDEX, PIC_UART_0_IRQ, 0x1, 0);
-	} else if (strcmp(device_get_name(child), "rge") == 0) {
+	} else if (strcmp(name, "rge") == 0 || strcmp(name, "nlge") == 0) {
 		int irq;
 
 		/* This is a hack to pass in the irq */
@@ -122,16 +123,15 @@ iodi_setup_intr(device_t dev, device_t c
 		cpu_establish_hardintr("rge", filt, intr, arg, irq, flags,
 		    cookiep);
 		pic_setup_intr(irq - PIC_IRQ_BASE, irq, 0x1, 0);
-	} else if (strcmp(device_get_name(child), "ehci") == 0) {
+	} else if (strcmp(name, "ehci") == 0) {
 		cpu_establish_hardintr("ehci", filt, intr, arg, PIC_USB_IRQ, flags,
 		    cookiep);
 		pic_setup_intr(PIC_USB_IRQ - PIC_IRQ_BASE, PIC_USB_IRQ, 0x1, 0);
-	} else if (strcmp(device_get_name(child), "ata") == 0) {
+	} else if (strcmp(name, "ata") == 0) {
 		xlr_establish_intr("ata", filt, intr, arg, PIC_PCMCIA_IRQ, flags,
 		    cookiep, bridge_pcmcia_ack);
 		pic_setup_intr(PIC_PCMCIA_IRQ - PIC_IRQ_BASE, PIC_PCMCIA_IRQ, 0x1, 0);
 	}
-
 	return (0);
 }
 
@@ -194,6 +194,7 @@ iodi_activate_resource(device_t bus, dev
 /* prototypes */
 static int iodi_probe(device_t);
 static int iodi_attach(device_t);
+static int iodi_detach(device_t);
 static void iodi_identify(driver_t *, device_t);
 
 int
@@ -213,6 +214,7 @@ int
 iodi_attach(device_t dev)
 {
 	device_t tmpd;
+	int i;
 
 	/*
 	 * Attach each devices
@@ -268,17 +270,47 @@ iodi_attach(device_t dev)
 			tmpd = device_add_child(dev, "rge", 5);
 			device_set_ivars(tmpd, &xlr_board_info.gmac_block[1]);
 #endif
-		} else
-			device_printf(dev, "Unknown type of gmac 1\n");
+		} else 
+			device_printf(dev, "Unknown type of gmac 1\n"); 
+	}
+
+	/* This is to add the new GMAC driver. The above adds the old driver,
+	   which has been retained for now as the new driver is stabilized.
+	   The new driver is enabled with "option nlge". Make sure that only
+	   one of rge or nlge is enabled in the conf file. */
+	for (i = 0; i < 3; i++) {
+		if (xlr_board_info.gmac_block[i].enabled == 0)
+			continue;
+		tmpd = device_add_child(dev, "nlna", i);
+		device_set_ivars(tmpd, &xlr_board_info.gmac_block[i]);
 	}
 	bus_generic_probe(dev);
 	bus_generic_attach(dev);
 	return 0;
 }
 
+int
+iodi_detach(device_t dev)
+{
+	device_t nlna_dev;
+	int error, i, ret;
+
+	error = 0;
+	ret = 0;
+	for (i = 0; i < 3; i++) {
+		nlna_dev = device_find_child(dev, "nlna", i);
+		if (nlna_dev != NULL)
+			error = bus_generic_detach(nlna_dev);
+		if (error)
+			ret = error;
+	}
+	return ret;
+}
+
 static device_method_t iodi_methods[] = {
 	DEVMETHOD(device_probe, iodi_probe),
 	DEVMETHOD(device_attach, iodi_attach),
+	DEVMETHOD(device_detach, iodi_detach),
 	DEVMETHOD(device_identify, iodi_identify),
 	DEVMETHOD(bus_alloc_resource, iodi_alloc_resource),
 	DEVMETHOD(bus_activate_resource, iodi_activate_resource),

Modified: user/imp/tbemd/sys/netinet/sctp.h
==============================================================================
--- user/imp/tbemd/sys/netinet/sctp.h	Sat Aug 28 21:41:18 2010	(r211951)
+++ user/imp/tbemd/sys/netinet/sctp.h	Sat Aug 28 22:14:24 2010	(r211952)
@@ -155,10 +155,8 @@ struct sctp_paramhdr {
 /* CMT ON/OFF socket option */
 #define SCTP_CMT_ON_OFF                 0x00001200
 #define SCTP_CMT_USE_DAC                0x00001201
-/* EY - NR_SACK on/off socket option */
-#define SCTP_NR_SACK_ON_OFF                 0x00001300
 /* JRS - Pluggable Congestion Control Socket option */
-#define SCTP_PLUGGABLE_CC				0x00001202
+#define SCTP_PLUGGABLE_CC               0x00001202
 
 /* read only */
 #define SCTP_GET_SNDBUF_USE		0x00001101

Modified: user/imp/tbemd/sys/netinet/sctp_cc_functions.c
==============================================================================
--- user/imp/tbemd/sys/netinet/sctp_cc_functions.c	Sat Aug 28 21:41:18 2010	(r211951)
+++ user/imp/tbemd/sys/netinet/sctp_cc_functions.c	Sat Aug 28 22:14:24 2010	(r211952)
@@ -71,7 +71,8 @@ sctp_cwnd_update_after_fr(struct sctp_tc
 	 * (net->fast_retran_loss_recovery == 0)))
 	 */
 	TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
-		if ((asoc->fast_retran_loss_recovery == 0) || (SCTP_BASE_SYSCTL(sctp_cmt_on_off) == 1)) {
+		if ((asoc->fast_retran_loss_recovery == 0) ||
+		    (asoc->sctp_cmt_on_off == 1)) {
 			/* out of a RFC2582 Fast recovery window? */
 			if (net->net_ack > 0) {
 				/*
@@ -232,11 +233,11 @@ sctp_cwnd_update_after_sack(struct sctp_
 			 * 
 			 * Should we stop any running T3 timer here?
 			 */
-			if (SCTP_BASE_SYSCTL(sctp_cmt_on_off) &&
-			    SCTP_BASE_SYSCTL(sctp_cmt_pf) &&
+			if ((asoc->sctp_cmt_on_off == 1) &&
+			    (asoc->sctp_cmt_pf > 0) &&
 			    ((net->dest_state & SCTP_ADDR_PF) == SCTP_ADDR_PF)) {
 				net->dest_state &= ~SCTP_ADDR_PF;
-				net->cwnd = net->mtu * SCTP_BASE_SYSCTL(sctp_cmt_pf);
+				net->cwnd = net->mtu * asoc->sctp_cmt_pf;
 				SCTPDBG(SCTP_DEBUG_INDATA1, "Destination %p moved from PF to reachable with cwnd %d.\n",
 				    net, net->cwnd);
 				/*
@@ -260,7 +261,9 @@ sctp_cwnd_update_after_sack(struct sctp_
 		 */
 #endif
 
-		if (asoc->fast_retran_loss_recovery && will_exit == 0 && SCTP_BASE_SYSCTL(sctp_cmt_on_off) == 0) {
+		if (asoc->fast_retran_loss_recovery &&
+		    (will_exit == 0) &&
+		    (asoc->sctp_cmt_on_off == 0)) {
 			/*
 			 * If we are in loss recovery we skip any cwnd
 			 * update
@@ -271,7 +274,8 @@ sctp_cwnd_update_after_sack(struct sctp_
 		 * CMT: CUC algorithm. Update cwnd if pseudo-cumack has
 		 * moved.
 		 */
-		if (accum_moved || (SCTP_BASE_SYSCTL(sctp_cmt_on_off) && net->new_pseudo_cumack)) {
+		if (accum_moved ||
+		    ((asoc->sctp_cmt_on_off == 1) && net->new_pseudo_cumack)) {
 			/* If the cumulative ack moved we can proceed */
 			if (net->cwnd <= net->ssthresh) {
 				/* We are in slow start */
@@ -697,7 +701,8 @@ sctp_hs_cwnd_update_after_fr(struct sctp
 	 * (net->fast_retran_loss_recovery == 0)))
 	 */
 	TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
-		if ((asoc->fast_retran_loss_recovery == 0) || (SCTP_BASE_SYSCTL(sctp_cmt_on_off) == 1)) {
+		if ((asoc->fast_retran_loss_recovery == 0) ||
+		    (asoc->sctp_cmt_on_off == 1)) {
 			/* out of a RFC2582 Fast recovery window? */
 			if (net->net_ack > 0) {
 				/*
@@ -850,11 +855,11 @@ sctp_hs_cwnd_update_after_sack(struct sc
 			 * 
 			 * Should we stop any running T3 timer here?
 			 */
-			if (SCTP_BASE_SYSCTL(sctp_cmt_on_off) &&
-			    SCTP_BASE_SYSCTL(sctp_cmt_pf) &&
+			if ((asoc->sctp_cmt_on_off == 1) &&
+			    (asoc->sctp_cmt_pf > 0) &&
 			    ((net->dest_state & SCTP_ADDR_PF) == SCTP_ADDR_PF)) {
 				net->dest_state &= ~SCTP_ADDR_PF;
-				net->cwnd = net->mtu * SCTP_BASE_SYSCTL(sctp_cmt_pf);
+				net->cwnd = net->mtu * asoc->sctp_cmt_pf;
 				SCTPDBG(SCTP_DEBUG_INDATA1, "Destination %p moved from PF to reachable with cwnd %d.\n",
 				    net, net->cwnd);
 				/*
@@ -878,7 +883,9 @@ sctp_hs_cwnd_update_after_sack(struct sc
 		 */
 #endif
 
-		if (asoc->fast_retran_loss_recovery && will_exit == 0 && SCTP_BASE_SYSCTL(sctp_cmt_on_off) == 0) {
+		if (asoc->fast_retran_loss_recovery &&
+		    (will_exit == 0) &&
+		    (asoc->sctp_cmt_on_off == 0)) {
 			/*
 			 * If we are in loss recovery we skip any cwnd
 			 * update
@@ -889,7 +896,8 @@ sctp_hs_cwnd_update_after_sack(struct sc
 		 * CMT: CUC algorithm. Update cwnd if pseudo-cumack has
 		 * moved.
 		 */
-		if (accum_moved || (SCTP_BASE_SYSCTL(sctp_cmt_on_off) && net->new_pseudo_cumack)) {
+		if (accum_moved ||
+		    ((asoc->sctp_cmt_on_off == 1) && net->new_pseudo_cumack)) {
 			/* If the cumulative ack moved we can proceed */
 			if (net->cwnd <= net->ssthresh) {
 				/* We are in slow start */
@@ -1333,11 +1341,11 @@ sctp_htcp_cwnd_update_after_sack(struct 
 			 * 
 			 * Should we stop any running T3 timer here?
 			 */
-			if (SCTP_BASE_SYSCTL(sctp_cmt_on_off) &&
-			    SCTP_BASE_SYSCTL(sctp_cmt_pf) &&
+			if ((asoc->sctp_cmt_on_off == 1) &&
+			    (asoc->sctp_cmt_pf > 0) &&
 			    ((net->dest_state & SCTP_ADDR_PF) == SCTP_ADDR_PF)) {
 				net->dest_state &= ~SCTP_ADDR_PF;
-				net->cwnd = net->mtu * SCTP_BASE_SYSCTL(sctp_cmt_pf);
+				net->cwnd = net->mtu * asoc->sctp_cmt_pf;
 				SCTPDBG(SCTP_DEBUG_INDATA1, "Destination %p moved from PF to reachable with cwnd %d.\n",
 				    net, net->cwnd);
 				/*
@@ -1361,7 +1369,9 @@ sctp_htcp_cwnd_update_after_sack(struct 
 		 */
 #endif
 
-		if (asoc->fast_retran_loss_recovery && will_exit == 0 && SCTP_BASE_SYSCTL(sctp_cmt_on_off) == 0) {
+		if (asoc->fast_retran_loss_recovery &&
+		    will_exit == 0 &&
+		    (asoc->sctp_cmt_on_off == 0)) {
 			/*

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-src-user mailing list