diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/RELEASE.TXT open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/RELEASE.TXT
--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/RELEASE.TXT	2011-10-26 07:21:46.000000000 -0500
+++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/RELEASE.TXT	2011-10-26 17:55:59.000000000 -0500
@@ -1,7 +1,7 @@
                               Release Notes
                         Broadcom uIP Linux Driver
                             Version 0.7.0.14
-                               08/23/2011
+                               10/25/2011
 
                           Broadcom Corporation
                          5300 California Avenue,
@@ -10,7 +10,7 @@
                Copyright (c) 2004 - 2011 Broadcom Corporation
                            All rights reserved
 
-uIP v0.7.0.14 (Aug 23, 2011)
+uIP v0.7.0.14 (Oct 25, 2011)
 =======================================================
    Fixes
    -----
@@ -23,11 +23,56 @@ uIP v0.7.0.14 (Aug 23, 2011)
       Change:  Adjusted the routine which seeks the device->net entry
                to include more logic instead of hard waiting for 5s.
 
+   2. Problem: Cont00058256 - Sessions fail after loginstress to via
+               simultaneous ipv4 and ipv6 dhcp
+      Cause:   Switching between DHCPv4/v6 coupled with VLAN exposed
+               a drawback in our nic_iface architecture design where
+               VLAN is not specified by iscsid.
+      Change:  The code was optimized and improved the performance when
+               switching between DHCPv4/v6+VLAN.  However, the ultimate
+               fix is to make use of the net config parameters introduced
+               in the newer open-iscsi util which will identify the
+               specific VLAN nic_iface to use.
+
+   3. Problem: Cont00058602 - Can't iboot using IPv6 offload path
+      Cause:   The bug was exposed by a fix in 0.7.0.14c where the
+               IPv6 router solicitation timeout exceeded the nic
+               enable thread timeout.
+      Change:  The IPv6 router solicitation timeout has been adjusted
+
+   4. Problem: Cont00058678 - Can not iboot target from ipv6 path
+               using VLAN
+      Cause:   A bug was found in the path request path where the vlan
+               iface's protocol family was not used correctly in the
+               iface search
+      Change:  This has been corrected
+
+   5. Problem: Cont00058994 - DOS vulnerability in uip during UDP flood
+      Cause:   The warning messages from the UDP handler was logging
+               at a rate faster than the log file logrotate rate
+               Therefore, the system's OOM eventually got kicked in to
+               start terminating running processes which includes iscsiuio
+      Change:  Moved several UDP warning messages from the default log
+               level to the debug log level
+      Impact:  All (minor)
+
+   6. Problem: Cont00059288 - Show segfault w/ Xen kernel
+      Cause:   The bnx2x chip_id was not read correctly from the PCIe BAR1
+               under the Xen kernel.  The error was in the mmap area.
+      Change:  Corrected the mmapping of the PCI MMIO space.
+      Impact:  Xen kernels
+
    Enhancements
    ------------
    1. Change:  Added support for RHEL6.2 for out-of-box release
    2. Change:  Updated the man page with -h and -p info
    3. Change:  Updated the -h info
+   4. Change:  Added support for bnx2x-1.71.00
+   5. Change:  Changed the log file open error to a warning and let
+               the daemon progress
+   6. Change:  Added oom_adjust call to prevent OOM Killer from killing
+               iscsiuio when memory is low
+   7. Change:  Added mlockall setting to prevent page swap
 
 
 uIP v0.7.0.13 (Aug 10, 2011)
diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/uip/uip.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/uip/uip.c
--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/uip/uip.c	2011-10-26 07:21:27.000000000 -0500
+++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/uip/uip.c	2011-10-26 17:55:59.000000000 -0500
@@ -1300,7 +1300,7 @@ void uip_process(struct uip_stack *ustac
 		u16_t len = ntohs(ipv6_hdr->ip6_plen);
 		if (len <= ustack->uip_len) {
 		} else {
-			LOG_WARN(PFX
+			LOG_DEBUG(PFX
 				 "ip: packet shorter than reported in IP header"
 				 ":IPv6_BUF(ustack)->len: %d ustack->uip_len: "
 				 "%d", len, ustack->uip_len);
@@ -1312,7 +1312,7 @@ void uip_process(struct uip_stack *ustac
 			ustack->uip_len = (tcp_ipv4_hdr->len[0] << 8) +
 			    tcp_ipv4_hdr->len[1];
 		} else {
-			LOG_WARN(PFX
+			LOG_DEBUG(PFX
 				 "ip: packet shorter than reported in IP header"
 				 ":tcp_ipv4_hdr->len: %d ustack->uip_len:%d.",
 				 (tcp_ipv4_hdr->len[0] << 8) +
@@ -1505,7 +1505,7 @@ icmp_input:
 	if (UDPBUF(ustack)->udpchksum != 0 && uip_udpchksum(ustack) != 0xffff) {
 		++ustack->stats.udp.drop;
 		++ustack->stats.udp.chkerr;
-		LOG_WARN(PFX "udp: bad checksum.");
+		LOG_DEBUG(PFX "udp: bad checksum.");
 		goto drop;
 	}
 #else /* UIP_UDP_CHECKSUMS */
diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/iscsid_ipc.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/iscsid_ipc.c
--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/iscsid_ipc.c	2011-10-26 07:21:46.000000000 -0500
+++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/iscsid_ipc.c	2011-10-26 17:55:59.000000000 -0500
@@ -111,8 +111,8 @@ static void *enable_nic_thread(void *dat
 	LOG_INFO(PFX "%s: started NIC enable thread state: 0x%x",
 		 nic->log_name, nic->state)
 
-	    /*  Enable the NIC */
-	    nic_enable(nic);
+	/*  Enable the NIC */
+	nic_enable(nic);
 
 	pthread_exit(NULL);
 }
@@ -206,7 +206,7 @@ static int parse_iface(void *arg)
 {
 	int rc;
 	nic_t *nic = NULL;
-	nic_interface_t *nic_iface, *next_nic_iface;
+	nic_interface_t *nic_iface, *vlan_iface, *base_nic_iface;
 	char *transport_name;
 	size_t transport_name_size;
 	nic_lib_handle_t *handle;
@@ -356,24 +356,22 @@ static int parse_iface(void *arg)
 	LOG_INFO(PFX "%s library set using transport_name %s",
 		 nic->log_name, transport_name);
 
-	/*  Create the network interface if it doesn't exist */
-	nic_iface = nic_find_nic_iface_protocol(nic, vlan, ipam.ip_type);
+	/*  Create the base network interface if it doesn't exist */
+	nic_iface = nic_find_nic_iface_protocol(nic, 0, ipam.ip_type);
 	if (nic_iface == NULL) {
-		LOG_INFO(PFX "%s couldn't find VLAN %d interface with "
+		LOG_INFO(PFX "%s couldn't find interface with "
 			 "ip_type: 0x%x creating it",
-			 nic->log_name, vlan, ipam.ip_type);
+			 nic->log_name, ipam.ip_type);
 
-		/*  Create the vlan interface */
+		/*  Create the nic interface */
 		nic_iface = nic_iface_init();
 
 		if (nic_iface == NULL) {
-			LOG_ERR(PFX "Couldn't allocate nic_iface for VLAN: %d",
-				nic_iface, vlan);
+			LOG_ERR(PFX "Couldn't allocate nic_iface", nic_iface);
 			goto done;
 		}
 
 		nic_iface->protocol = ipam.ip_type;
-		nic_iface->vlan_id = vlan;
 		nic_add_nic_iface(nic, nic_iface);
 
 		persist_all_nic_iface(nic);
@@ -384,6 +382,37 @@ static int parse_iface(void *arg)
 			 nic->log_name);
 	}
 
+	set_nic_iface(nic, nic_iface);
+
+	/* Find the vlan nic_interface */
+	if (vlan) {
+		vlan_iface = nic_find_vlan_iface_protocol(nic, nic_iface, vlan,
+							  ipam.ip_type);
+		if (vlan_iface == NULL) {
+			LOG_INFO(PFX "%s couldn't find interface with VLAN = %d"
+				 "ip_type: 0x%x creating it",
+				 nic->log_name, vlan, ipam.ip_type);
+
+			/*  Create the nic interface */
+			vlan_iface = nic_iface_init();
+
+			if (vlan_iface == NULL) {
+				LOG_ERR(PFX "Couldn't allocate nic_iface for "
+					"VLAN: %d", vlan_iface, vlan);
+				goto done;
+			}
+
+			vlan_iface->protocol = ipam.ip_type;
+			vlan_iface->vlan_id = vlan;
+			nic_add_vlan_iface(nic, nic_iface, vlan_iface);
+		} else {
+			LOG_INFO(PFX "%s: using existing vlan interface",
+				 nic->log_name);
+		}
+		base_nic_iface = nic_iface;
+		nic_iface = vlan_iface;
+	}
+
 	/*  Determine how to configure the IP address */
 	if (ipam.ip_type == AF_INET) {
 		if (memcmp(&ipam.addr4,
@@ -509,24 +538,27 @@ diff:
 	}
 
 	/* Configuration changed, do VLAN WA */
-	next_nic_iface = nic_iface->next;
-	while (next_nic_iface) {
-		if (next_nic_iface->vlan_id) {
-			/* TODO: When VLAN support is placed in the iface file
-			* revisit this code */
-			next_nic_iface->ustack.ip_config =
+	vlan_iface = nic_iface->vlan_next;
+	while (vlan_iface) {
+		/* TODO: When VLAN support is placed in the iface file
+		* revisit this code */
+		if (vlan_iface->ustack.ip_config) {
+			vlan_iface->ustack.ip_config =
 				nic_iface->ustack.ip_config;
-			memcpy(next_nic_iface->ustack.hostaddr,
+			memcpy(vlan_iface->ustack.hostaddr,
 			       nic_iface->ustack.hostaddr,
 			       sizeof(nic_iface->ustack.hostaddr));
-			memcpy(next_nic_iface->ustack.netmask,
+			memcpy(vlan_iface->ustack.netmask,
 			       nic_iface->ustack.netmask,
 			       sizeof(nic_iface->ustack.netmask));
-			memcpy(next_nic_iface->ustack.hostaddr6,
+			memcpy(vlan_iface->ustack.hostaddr6,
 			       nic_iface->ustack.hostaddr6,
 			       sizeof(nic_iface->ustack.hostaddr6));
+			memcpy(vlan_iface->ustack.netmask6,
+			       nic_iface->ustack.netmask6,
+			       sizeof(nic_iface->ustack.netmask6));
 		}
-		next_nic_iface = next_nic_iface->next;
+		vlan_iface = vlan_iface->vlan_next;
 	}
 
 enable_nic:
diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/bnx2.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/bnx2.c
--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/bnx2.c	2011-10-26 07:21:27.000000000 -0500
+++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/bnx2.c	2011-10-26 17:55:59.000000000 -0500
@@ -396,6 +396,7 @@ static bnx2_t *bnx2_alloc(nic_t * nic)
 	/*  Clear out the bnx2 contents */
 	memset(bp, 0, sizeof(*bp));
 
+	bp->bar0_fd = INVALID_FD;
 	bp->flags = BNX2_UIO_TX_HAS_SENT;
 
 	bp->parent = nic;
@@ -417,6 +418,7 @@ static int bnx2_open(nic_t * nic)
 	__u32 val;
 	uint32_t tx_cid;
 	__u32 msix_vector = 0;
+	char sysfs_resc_path[80];
 
 	/*  Sanity Check: validate the parameters */
 	if (nic == NULL) {
@@ -465,6 +467,14 @@ static int bnx2_open(nic_t * nic)
 	}
 	nic->uio_minor = minor(uio_stat.st_rdev);
 
+	cnic_get_sysfs_pci_resource_path(nic, 0, sysfs_resc_path, 80);
+	bp->bar0_fd = open(sysfs_resc_path, O_RDWR | O_SYNC);
+	if (bp->bar0_fd < 0) {
+		LOG_ERR(PFX "%s: Could not open %s", nic->log_name,
+			sysfs_resc_path);
+		return -ENODEV;
+	}
+
 	/*  TODO: hardcoded with the cnic driver */
 	bp->rx_ring_size = 3;
 	bp->rx_buffer_size = 0x400;
@@ -498,7 +508,7 @@ static int bnx2_open(nic_t * nic)
 	mlock(bp->rx_pkt_ring, sizeof(void *) * bp->rx_ring_size);
 
 	bp->reg = mmap(NULL, 0x12800, PROT_READ | PROT_WRITE, MAP_SHARED,
-		       nic->fd, (off_t) 0);
+		       bp->bar0_fd, (off_t) 0);
 	if (bp->reg == MAP_FAILED) {
 		LOG_INFO(PFX "%s: Couldn't mmap registers: %s",
 			 nic->log_name, strerror(errno));
@@ -758,6 +768,11 @@ static int bnx2_uio_close_resources(nic_
 		bp->reg = NULL;
 	}
 
+	if (bp->bar0_fd != INVALID_FD) {
+		close(bp->bar0_fd);
+		bp->bar0_fd = INVALID_FD;
+	}
+
 	if (nic->fd != INVALID_FD) {
 		rc = close(nic->fd);
 		if (rc != 0) {
diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/bnx2.h open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/bnx2.h
--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/bnx2.h	2011-10-26 07:21:27.000000000 -0500
+++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/bnx2.h	2011-10-26 17:55:59.000000000 -0500
@@ -250,6 +250,7 @@ typedef struct bnx2 {
 #define BNX2_UIO_TX_HAS_SENT		0x0002
 #define BNX2_OPENED			0x0004
 
+	int bar0_fd;
 	void *reg;		/* Pointer to the mapped registers      */
 
 	__u32 tx_bidx_io;
diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/bnx2x.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/bnx2x.c
--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/bnx2x.c	2011-10-26 07:21:46.000000000 -0500
+++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/bnx2x.c	2011-10-26 17:55:59.000000000 -0500
@@ -77,9 +77,6 @@ static const char library_uio_name[] = "
 static const char cnic_uio_sysfs_name_tempate[] = "/sys/class/uio/uio%i/name";
 static const char bnx2x_uio_sysfs_name[] = "bnx2x_cnic";
 
-static const char cnic_uio_sysfs_resc_tempate[] =
-    "/sys/class/uio/uio%i/device/resource";
-
 /*******************************************************************************
  * String constants used to display human readable adapter name
  ******************************************************************************/
@@ -377,7 +374,7 @@ error:
 
 static inline int bnx2x_is_ver70(bnx2x_t *bp)
 {
-	return (bp->version.major == 1 && bp->version.minor == 70);
+	return (bp->version.major == 1 && bp->version.minor >= 70);
 }
 
 static inline int bnx2x_is_ver60(bnx2x_t * bp)
@@ -506,44 +503,10 @@ static int bnx2x_uio_verify(nic_t * nic)
 
 	LOG_INFO(PFX "%s: Verified is a cnic_uio device", nic->log_name);
 
-      error:
+error:
 	return rc;
 }
 
-static unsigned long cnic_get_bar2(nic_t * nic)
-{
-	char *raw = NULL, *raw_tmp;
-	uint32_t raw_size = 0;
-	char temp_path[sizeof(cnic_uio_sysfs_resc_tempate) + 8];
-	int rc = 0, i, new_line;
-	unsigned long bar = 0;
-
-	/*  Build the path to determine uio name */
-	snprintf(temp_path, sizeof(temp_path),
-		 cnic_uio_sysfs_resc_tempate, nic->uio_minor);
-
-	rc = capture_file(&raw, &raw_size, temp_path);
-	if (rc != 0)
-		return 0;
-
-	/* Skip 2 lines to get to BAR2 */
-	raw_tmp = raw;
-	i = 0;
-	new_line = 0;
-	while (i++ < raw_size && new_line < 2) {
-		if (*raw_tmp == '\n')
-			new_line++;
-		raw_tmp++;
-	}
-
-	if (new_line == 2)
-		sscanf(raw_tmp, "%lx ", &bar);
-
-	free(raw);
-
-	return bar;
-}
-
 /*******************************************************************************
  * bnx2x Utility Functions to get to the hardware consumer indexes
  ******************************************************************************/
@@ -635,7 +598,8 @@ static bnx2x_t *bnx2x_alloc(nic_t * nic)
 	/*  Clear out the CNIC contents */
 	memset(bp, 0, sizeof(*bp));
 
-	bp->mem_fd = INVALID_FD;
+	bp->bar0_fd = INVALID_FD;
+	bp->bar2_fd = INVALID_FD;
 
 	bp->parent = nic;
 	nic->priv = (void *)bp;
@@ -657,9 +621,8 @@ static int bnx2x_open(nic_t * nic)
 	struct stat uio_stat;
 	int i, rc;
 	__u32 val;
-	unsigned long bar2;
 	int count;
-
+	char sysfs_resc_path[80];
 	uint32_t bus;
 	uint32_t slot;
 	uint32_t func;
@@ -722,20 +685,37 @@ static int bnx2x_open(nic_t * nic)
 	}
 	nic->uio_minor = minor(uio_stat.st_rdev);
 
-	bar2 = cnic_get_bar2(nic);
-	if (bar2 == 0) {
-		LOG_ERR(PFX "%s: Could not read BAR2", nic->log_name);
+	cnic_get_sysfs_pci_resource_path(nic, 0, sysfs_resc_path, 80);
+	bp->bar0_fd = open(sysfs_resc_path, O_RDWR | O_SYNC);
+	if (bp->bar0_fd < 0) {
+		LOG_ERR(PFX "%s: Could not open %s", nic->log_name,
+			sysfs_resc_path);
 		return -ENODEV;
 	}
 
-	bp->mem_fd = open("/dev/mem", O_RDWR | O_SYNC);
-	if (bp->mem_fd < 0) {
-		LOG_ERR(PFX "%s: Could not open /dev/mem", nic->log_name);
+	bp->reg = mmap(NULL, BNX2X_BAR_SIZE, PROT_READ | PROT_WRITE,
+			MAP_SHARED, bp->bar0_fd, (off_t) 0);
+
+	if (bp->reg == MAP_FAILED) {
+		LOG_INFO(PFX "%s: Couldn't mmap BAR registers: %s",
+			 nic->log_name, strerror(errno));
+		bp->reg = NULL;
+		rc = errno;
+		goto open_error;
+	}
+
+	msync(bp->reg, BNX2X_BAR_SIZE, MS_SYNC);
+
+	cnic_get_sysfs_pci_resource_path(nic, 2, sysfs_resc_path, 80);
+	bp->bar2_fd = open(sysfs_resc_path, O_RDWR | O_SYNC);
+	if (bp->bar2_fd < 0) {
+		LOG_ERR(PFX "%s: Could not open %s", nic->log_name,
+			sysfs_resc_path);
 		return -ENODEV;
 	}
 
 	bp->reg2 = mmap(NULL, BNX2X_BAR2_SIZE, PROT_READ | PROT_WRITE,
-			MAP_SHARED, bp->mem_fd, (off_t) bar2);
+			MAP_SHARED, bp->bar2_fd, (off_t) 0);
 
 	if (bp->reg2 == MAP_FAILED) {
 		LOG_INFO(PFX "%s: Couldn't mmap BAR2 registers: %s",
@@ -768,18 +748,6 @@ static int bnx2x_open(nic_t * nic)
 		goto open_error;
 	}
 
-	bp->reg = mmap(NULL, BNX2X_BAR_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,
-		       nic->fd, (off_t) 0);
-	if (bp->reg == MAP_FAILED) {
-		LOG_INFO(PFX "%s: Couldn't mmap registers: %s",
-			 nic->log_name, strerror(errno));
-		bp->reg = NULL;
-		rc = errno;
-		goto open_error;
-	}
-
-	msync(bp->reg, BNX2X_BAR_SIZE, MS_SYNC);
-
 	if (bnx2x_is_ver60_plus(bp))
 		bp->status_blk_size = sizeof(struct host_sp_status_block);
 	else if (bnx2x_is_ver52(bp))
@@ -1036,9 +1004,14 @@ open_error:
 		bp->rx_pkt_ring = NULL;
 	}
 
-	if (bp->mem_fd != INVALID_FD) {
-		close(bp->mem_fd);
-		bp->mem_fd = INVALID_FD;
+	if (bp->bar2_fd != INVALID_FD) {
+		close(bp->bar2_fd);
+		bp->bar2_fd = INVALID_FD;
+	}
+
+	if (bp->bar0_fd != INVALID_FD) {
+		close(bp->bar0_fd);
+		bp->bar0_fd = INVALID_FD;
 	}
 
 	return rc;
@@ -1108,9 +1081,14 @@ static int bnx2x_uio_close_resources(nic
 		bp->reg2 = NULL;
 	}
 
-	if (bp->mem_fd != INVALID_FD) {
-		close(bp->mem_fd);
-		bp->mem_fd = INVALID_FD;
+	if (bp->bar2_fd != INVALID_FD) {
+		close(bp->bar2_fd);
+		bp->bar2_fd = INVALID_FD;
+	}
+
+	if (bp->bar0_fd != INVALID_FD) {
+		close(bp->bar0_fd);
+		bp->bar0_fd = INVALID_FD;
 	}
 
 	if (nic->fd != INVALID_FD) {
diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/bnx2x.h open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/bnx2x.h
--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/bnx2x.h	2011-10-26 07:21:27.000000000 -0500
+++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/bnx2x.h	2011-10-26 17:55:59.000000000 -0500
@@ -574,7 +574,8 @@ typedef struct bnx2x {
 	void *reg;		/* Pointer to the BAR1 mapped registers */
 	void *reg2;		/* Pointer to the BAR2 mapped registers */
 
-	int mem_fd;
+	int bar0_fd;
+	int bar2_fd;
 
 	__u32 chip_id;
 	__u32 shmem_base;
diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/cnic.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/cnic.c
--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/cnic.c	2011-10-26 07:21:46.000000000 -0500
+++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/cnic.c	2011-10-26 17:55:59.000000000 -0500
@@ -325,7 +325,7 @@ int cnic_handle_ipv4_iscsi_path_req(nic_
 				    struct iscsi_uevent *ev,
 				    struct iscsi_path *path)
 {
-	nic_interface_t *nic_iface;
+	nic_interface_t *nic_iface, *vlan_iface;
 	struct in_addr src_addr, dst_addr,
 	    src_matching_addr, dst_matching_addr, netmask;
 	__u8 mac_addr[6];
@@ -338,18 +338,50 @@ int cnic_handle_ipv4_iscsi_path_req(nic_
 	pthread_mutex_lock(&nic_list_mutex);
 
 	/*  Find the proper interface via VLAN id */
-	nic_iface = nic_find_nic_iface_protocol(nic, path->vlan_id, AF_INET);
+	nic_iface = nic_find_nic_iface_protocol(nic, 0, AF_INET);
 	if (nic_iface == NULL) {
-		nic_iface = nic_find_nic_iface_protocol(nic, 0, AF_INET);
-		if (nic_iface == NULL) {
-			pthread_mutex_unlock(&nic_list_mutex);
-			LOG_ERR(PFX "%s: Couldn't find net_iface vlan_id: %d",
-				nic->log_name, path->vlan_id);
-			return -EINVAL;
-		}
+		pthread_mutex_unlock(&nic_list_mutex);
+		LOG_ERR(PFX "%s: Couldn't find net_iface vlan_id: %d",
+			nic->log_name, path->vlan_id);
+		return -EINVAL;
+	}
+	if (path->vlan_id) {
+		vlan_iface = nic_find_vlan_iface_protocol(nic, nic_iface,
+							  path->vlan_id,
+							  AF_INET);
+		if (vlan_iface == NULL) {
+			LOG_INFO(PFX "%s couldn't find interface with VLAN = %d"
+				 "ip_type: 0x%x creating it",
+				 nic->log_name, path->vlan_id, AF_INET);
+
+			/*  Create the nic interface */
+			vlan_iface = nic_iface_init();
+
+			if (vlan_iface == NULL) {
+				LOG_ERR(PFX "Couldn't allocate nic_iface for "
+					"VLAN: %d", vlan_iface,
+					path->vlan_id);
+				return -EINVAL;
+			}
 
-		nic_iface->vlan_id = path->vlan_id;
+			vlan_iface->protocol = nic_iface->protocol;
+			vlan_iface->vlan_id = path->vlan_id;
+			vlan_iface->ustack.ip_config =
+						nic_iface->ustack.ip_config;
+			memcpy(vlan_iface->ustack.hostaddr,
+			       nic_iface->ustack.hostaddr,
+			       sizeof(nic_iface->ustack.hostaddr));
+			memcpy(vlan_iface->ustack.netmask,
+			       nic_iface->ustack.netmask,
+			       sizeof(nic_iface->ustack.netmask));
+			nic_add_vlan_iface(nic, nic_iface, vlan_iface);
+		} else {
+			LOG_INFO(PFX "%s: using existing vlan interface",
+				 nic->log_name);
+		}
+		nic_iface = vlan_iface;
 	}
+
 #define MAX_ARP_RETRY 4
 
 	memcpy(&dst_addr, &path->dst.v4_addr, sizeof(dst_addr));
@@ -364,6 +396,9 @@ int cnic_handle_ipv4_iscsi_path_req(nic_
 	src_matching_addr.s_addr = src_addr.s_addr & netmask.s_addr;
 	dst_matching_addr.s_addr = dst_addr.s_addr & netmask.s_addr;
 
+	LOG_DEBUG(PFX "%s: src=%s", nic->log_name, inet_ntoa(src_addr));
+	LOG_DEBUG(PFX "%s: dst=%s", nic->log_name, inet_ntoa(dst_addr));
+	LOG_DEBUG(PFX "%s: nm=%s", nic->log_name, inet_ntoa(netmask));
 	if (src_matching_addr.s_addr != dst_matching_addr.s_addr) {
 		/*  If there is an assigned gateway address then use it
 		 *  if the source address doesn't match */
@@ -374,6 +409,7 @@ int cnic_handle_ipv4_iscsi_path_req(nic_
 			       sizeof(dst_addr));
 		} else {
 			arp_retry = MAX_ARP_RETRY;
+			LOG_DEBUG(PFX "%s: no default", nic->log_name);
 			goto done;
 		}
 	}
@@ -473,7 +509,7 @@ int cnic_handle_ipv6_iscsi_path_req(nic_
 				    struct iscsi_uevent *ev,
 				    struct iscsi_path *path)
 {
-	nic_interface_t *nic_iface;
+	nic_interface_t *nic_iface, *vlan_iface;
 	__u8 mac_addr[6];
 	int rc, i;
 	uint16_t neighbor_retry;
@@ -492,18 +528,49 @@ int cnic_handle_ipv6_iscsi_path_req(nic_
 	pthread_mutex_lock(&nic_list_mutex);
 
 	/*  Find the proper interface via VLAN id */
-	nic_iface = nic_find_nic_iface_protocol(nic, path->vlan_id, AF_INET6);
+	nic_iface = nic_find_nic_iface_protocol(nic, 0, AF_INET6);
 	if (nic_iface == NULL) {
-		nic_iface = nic_find_nic_iface_protocol(nic, 0, AF_INET6);
-		if (nic_iface == NULL) {
-			pthread_mutex_unlock(&nic_list_mutex);
-			LOG_ERR(PFX "%s: Couldn't find net_iface vlan_id: %d",
-				nic->log_name, path->vlan_id);
-			return -EINVAL;
+		pthread_mutex_unlock(&nic_list_mutex);
+		LOG_ERR(PFX "%s: Couldn't find net_iface vlan_id: %d",
+			nic->log_name, path->vlan_id);
+		return -EINVAL;
+	}
+	if (path->vlan_id) {
+		vlan_iface = nic_find_vlan_iface_protocol(nic, nic_iface,
+							  path->vlan_id,
+							  AF_INET6);
+		if (vlan_iface == NULL) {
+			LOG_INFO(PFX "%s couldn't find interface with VLAN = %d"
+				 "ip_type: 0x%x creating it",
+				 nic->log_name, path->vlan_id, AF_INET6);
+
+			/*  Create the nic interface */
+			vlan_iface = nic_iface_init();
+
+			if (vlan_iface == NULL) {
+				LOG_ERR(PFX "Couldn't allocate nic_iface for "
+					"VLAN: %d", vlan_iface,
+					path->vlan_id);
+				return -EINVAL;
+			}
+			vlan_iface->protocol = nic_iface->protocol;
+			vlan_iface->vlan_id = path->vlan_id;
+			vlan_iface->ustack.ip_config =
+						nic_iface->ustack.ip_config;
+			memcpy(vlan_iface->ustack.hostaddr6,
+			       nic_iface->ustack.hostaddr6,
+			       sizeof(nic_iface->ustack.hostaddr6));
+			memcpy(vlan_iface->ustack.netmask6,
+			       nic_iface->ustack.netmask6,
+			       sizeof(nic_iface->ustack.netmask6));
+			nic_add_vlan_iface(nic, nic_iface, vlan_iface);
+		} else {
+			LOG_INFO(PFX "%s: using existing vlan interface",
+				 nic->log_name);
 		}
-
-		nic_iface->vlan_id = path->vlan_id;
+		nic_iface = vlan_iface;
 	}
+
 	/*  Depending on the IPv6 address of the target we will need to
 	 *  determine whether we use the assigned IPv6 address or the
 	 *  link local IPv6 address */
diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/logger.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/logger.c
--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/logger.c	2011-10-26 07:21:46.000000000 -0500
+++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/logger.c	2011-10-26 17:55:59.000000000 -0500
@@ -109,7 +109,7 @@ void log_uip(char *level_str, char *fmt,
 		fflush(stdout);
 	}
 
-      end:
+end:
 	va_end(ap2);
 	va_end(ap);
 	pthread_mutex_unlock(&main_log.lock);
@@ -129,17 +129,26 @@ int init_logger(char *filename)
 
 	pthread_mutex_lock(&main_log.lock);
 
+	if (opt.debug != DEBUG_ON) {
+		rc = -EIO;
+		goto disable;
+	}
 	main_log.fp = fopen(filename, "a");
 	if (main_log.fp == NULL) {
 		printf("Could not create log file: %s <%s>\n",
 		       filename, strerror(errno));
 		rc = -EIO;
 	}
-	main_log.enabled = LOGGER_ENABLED;
+disable:
+	if (rc)
+		main_log.enabled = LOGGER_DISABLED;
+	else
+		main_log.enabled = LOGGER_ENABLED;
 
 	pthread_mutex_unlock(&main_log.lock);
 
-	LOG_INFO("Initialize logger using log file: %s", filename);
+	if (!rc)
+		LOG_INFO("Initialize logger using log file: %s", filename);
 
 	return rc;
 }
diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/main.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/main.c
--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/main.c	2011-10-26 07:21:46.000000000 -0500
+++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/main.c	2011-10-26 17:55:59.000000000 -0500
@@ -48,6 +48,7 @@
 #include <sys/utsname.h>
 #include <net/ethernet.h>
 #include <arpa/inet.h>
+#include <sys/mman.h>
 
 #include "uip.h"
 #include "uip_arp.h"
@@ -143,11 +144,9 @@ signal_wait:
 retry:
 		fini_logger(SHUTDOWN_LOGGER);
 		rc = init_logger(main_log.log_file);
-		if (rc != 0) {
+		if (rc != 0)
 			printf("Could not initialize the logger in "
 			       "signal!\n");
-			goto retry;
-		}
 		goto signal_wait;
 	default:
 		break;
@@ -198,6 +197,38 @@ static void daemon_init()
 	rc = chdir("/");
 }
 
+#define ISCSI_OOM_PATH_LEN 48
+
+int oom_adjust(void)
+{
+	int fd;
+	char path[ISCSI_OOM_PATH_LEN];
+	struct stat statb;
+
+	if (nice(-10) < 0)
+		LOG_DEBUG("Could not increase process priority: %s",
+			  strerror(errno));
+
+	snprintf(path, ISCSI_OOM_PATH_LEN, "/proc/%d/oom_score_adj", getpid());
+	if (stat(path, &statb)) {
+		/* older kernel so use old oom_adj file */
+		snprintf(path, ISCSI_OOM_PATH_LEN, "/proc/%d/oom_adj",
+			 getpid());
+	}
+	fd = open(path, O_WRONLY);
+	if (fd < 0)
+		return -1;
+	if (write(fd, "-16", 3) < 0) /* for 2.6.11 */
+		LOG_DEBUG("Could not set oom score to -16: %s",
+			  strerror(errno));
+	if (write(fd, "-17", 3) < 0) /* for Andrea's patch */
+		LOG_DEBUG("Could not set oom score to -17: %s",
+			  strerror(errno));
+	close(fd);
+	return 0;
+}
+
+
 /*******************************************************************************
  * Main routine
  ******************************************************************************/
@@ -250,10 +281,8 @@ int main(int argc, char *argv[])
 	if (main_log.enabled == LOGGER_ENABLED) {
 		/*  initialize the logger */
 		rc = init_logger(main_log.log_file);
-		if (rc != 0) {
-			printf("Could not initialize the logger\n");
-			goto error;
-		}
+		if (rc != 0 && opt.debug == DEBUG_ON)
+			printf("WARN: Could not initialize the logger\n");
 	}
 
 	LOG_INFO("Started iSCSI uio stack: Ver " PACKAGE_VERSION);
@@ -348,6 +377,16 @@ int main(int argc, char *argv[])
 	/* Using sysfs to discover iSCSI hosts */
 	nic_discover_iscsi_hosts();
 
+	/* oom-killer will not kill us at the night... */
+	if (oom_adjust())
+		LOG_DEBUG("Can not adjust oom-killer's pardon");
+
+	/* we don't want our active sessions to be paged out... */
+	if (mlockall(MCL_CURRENT | MCL_FUTURE)) {
+		LOG_ERR("failed to mlockall, exiting...");
+		goto error;
+	}
+
 	/*  Start the iscsid listener */
 	rc = iscsid_start();
 	if (rc != 0) {
diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic.c
--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic.c	2011-10-26 07:21:46.000000000 -0500
+++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic.c	2011-10-26 17:55:59.000000000 -0500
@@ -440,7 +440,7 @@ int nic_remove(nic_t * nic)
 	nic_t *prev, *current;
 	struct stat file_stat;
 	void *res;
-	nic_interface_t *nic_iface, *next_nic_iface;
+	nic_interface_t *nic_iface, *next_nic_iface, *vlan_iface;
 
 	pthread_mutex_lock(&nic->nic_mutex);
 
@@ -505,6 +505,12 @@ int nic_remove(nic_t * nic)
 		   nic_iface */
 		nic_iface = nic->nic_iface;
 		while (nic_iface != NULL) {
+			vlan_iface = nic_iface->vlan_next;
+			while (vlan_iface != NULL) {
+				next_nic_iface = vlan_iface->vlan_next;
+				free(vlan_iface);
+				vlan_iface = next_nic_iface;
+			}
 			next_nic_iface = nic_iface->next;
 			free(nic_iface);
 			nic_iface = next_nic_iface;
@@ -532,7 +538,7 @@ int nic_remove(nic_t * nic)
 void nic_close(nic_t * nic, NIC_SHUTDOWN_T graceful, int clean)
 {
 	int rc;
-	nic_interface_t *nic_iface;
+	nic_interface_t *nic_iface, *vlan_iface;
 	struct stat file_stat;
 
 	/*  The NIC could be configured by the uIP config file
@@ -559,8 +565,14 @@ void nic_close(nic_t * nic, NIC_SHUTDOWN
 	nic_iface = nic->nic_iface;
 	while (nic_iface != NULL) {
 		if (!((nic_iface->flags & NIC_IFACE_PERSIST) ==
-		      NIC_IFACE_PERSIST))
+		      NIC_IFACE_PERSIST)) {
 			uip_reset(&nic_iface->ustack);
+			vlan_iface = nic_iface->vlan_next;
+			while (vlan_iface != NULL) {
+				uip_reset(&vlan_iface->ustack);
+				vlan_iface = vlan_iface->vlan_next;
+			}
+		}
 		nic_iface = nic_iface->next;
 	}
 
@@ -608,12 +620,13 @@ nic_interface_t *nic_iface_init()
 
 	memset(nic_iface, 0, sizeof(*nic_iface));
 	nic_iface->next = NULL;
+	nic_iface->vlan_next = NULL;
 
 	return nic_iface;
 }
 
 /**
- *  nic_add_net_iface() - This function is used to add an interface to the 
+ *  nic_add_nic_iface() - This function is used to add an interface to the
  *                        nic structure
  *  @param nic - struct nic device to add the interface to
  *  @param nic_iface - network interface used to add to the nic
@@ -632,7 +645,7 @@ int nic_add_nic_iface(nic_t * nic, nic_i
 
 		/*  Check to see if this interface already exists via 2
 		 *  conditions: 1) VLAN 2) protocol */
-		while (current->next != NULL) {
+		while (current != NULL) {
 			if ((current->protocol == nic_iface->protocol) &&
 			    (current->vlan_id == nic_iface->vlan_id)) {
 				LOG_WARN(PFX "%s: nic interface alread exists"
@@ -641,7 +654,6 @@ int nic_add_nic_iface(nic_t * nic, nic_i
 					 current->protocol);
 				goto error;
 			}
-
 			current = current->next;
 		}
 
@@ -668,6 +680,60 @@ error:
 	return 0;
 }
 
+/**
+ *  nic_add_vlan_iface() - This function is used to add a vlan interface to the
+ *                         nic structure
+ *  @param nic - struct nic device to add the interface to
+ *  @param nic_iface - network interface to be added to
+ *  @param vlan_iface - vlan interface used to add to the nic_iface
+ *  @return 0 on success, <0 on failure
+ */
+int nic_add_vlan_iface(nic_t *nic, nic_interface_t *nic_iface,
+		       nic_interface_t *vlan_iface)
+{
+	pthread_mutex_lock(&nic->nic_mutex);
+
+	/*  Add the nic_interface */
+	if (nic_iface == NULL)
+		goto error;
+	else {
+		nic_interface_t *current = nic_iface->vlan_next;
+
+		/*  Check to see if this interface already exists via 2
+		 *  conditions: 1) VLAN 2) protocol */
+		while (current != NULL) {
+			if ((current->protocol == vlan_iface->protocol) &&
+			    (current->vlan_id == vlan_iface->vlan_id)) {
+				LOG_WARN(PFX "%s: vlan interface already exists"
+					 "for VLAN: %d, protocol: %d",
+					 nic->log_name, current->vlan_id,
+					 current->protocol);
+				goto error;
+			}
+			current = current->vlan_next;
+		}
+
+		/*   This interface doesn't exists, we can safely add
+		 *   this nic interface */
+		current = nic_iface;
+		while (current->vlan_next != NULL)
+			current = current->vlan_next;
+
+		current->vlan_next = vlan_iface;
+	}
+
+	/* Set nic_interface common fields */
+	vlan_iface->parent = nic;
+	nic->num_of_nic_iface++;
+
+	LOG_INFO(PFX "%s: Added vlan interface for VLAN: %d, protocol: %d",
+		 nic->log_name, vlan_iface->vlan_id, vlan_iface->protocol);
+
+error:
+	pthread_mutex_unlock(&nic->nic_mutex);
+
+	return 0;
+}
 /******************************************************************************
  * Routine to process interrupts from the NIC device
  ******************************************************************************/
@@ -944,6 +1010,7 @@ int process_packets(nic_t * nic,
 		uint16_t type = 0;
 		int af_type = 0;
 		struct uip_stack *ustack;
+		nic_interface_t *vlan_iface;
 
 		if ((pkt->vlan_tag == 0) ||
 		    (NIC_VLAN_STRIP_ENABLED & nic->flags)) {
@@ -970,8 +1037,7 @@ int process_packets(nic_t * nic,
 
 		/*  check if we have the given VLAN interface */
 		if (nic_iface == NULL) {
-			nic_iface = nic_find_nic_iface_protocol(nic,
-								pkt->vlan_tag,
+			nic_iface = nic_find_nic_iface_protocol(nic, 0,
 								af_type);
 			if (nic_iface == NULL) {
 				LOG_INFO(PFX "%s: Couldn't find interface for "
@@ -993,11 +1059,58 @@ int process_packets(nic_t * nic,
 				}
 
 				nic_iface->protocol = af_type;
-				nic_iface->vlan_id = pkt->vlan_tag;
+				nic_iface->vlan_id = 0;
 				nic_add_nic_iface(nic, nic_iface);
 
 				persist_all_nic_iface(nic);
 			}
+			if (pkt->vlan_tag) {
+				vlan_iface = nic_find_vlan_iface_protocol(nic,
+						nic_iface, pkt->vlan_tag,
+						af_type);
+				if (vlan_iface == NULL) {
+					LOG_INFO(PFX "%s couldn't find "
+						 "interface with VLAN ="
+						 " %d ip_type: 0x%x "
+						 "creating it",
+						 nic->log_name, pkt->vlan_tag,
+						 af_type);
+
+					/*  Create the nic interface */
+					vlan_iface = nic_iface_init();
+
+					if (vlan_iface == NULL) {
+						LOG_ERR(PFX "Couldn't allocate "
+							"nic_iface for VLAN: %d",
+							vlan_iface,
+							pkt->vlan_tag);
+						rc = 0;
+						goto done;
+					}
+					vlan_iface->protocol = af_type;
+					vlan_iface->vlan_id = pkt->vlan_tag;
+					nic_add_vlan_iface(nic, nic_iface,
+							   vlan_iface);
+					/* TODO: When VLAN support is placed */
+					/* in the iface file revisit this */
+					/* code */
+					memcpy(vlan_iface->ustack.hostaddr,
+					       nic_iface->ustack.hostaddr,
+					    sizeof(nic_iface->ustack.hostaddr));
+					memcpy(vlan_iface->ustack.netmask,
+					       nic_iface->ustack.netmask,
+					     sizeof(nic_iface->ustack.netmask));
+					memcpy(vlan_iface->ustack.netmask6,
+					       nic_iface->ustack.netmask6,
+					    sizeof(nic_iface->ustack.netmask6));
+					memcpy(vlan_iface->ustack.hostaddr6,
+					       nic_iface->ustack.hostaddr6,
+					   sizeof(nic_iface->ustack.hostaddr6));
+
+					persist_all_nic_iface(nic);
+				}
+				nic_iface = vlan_iface;
+			}
 		}
 
 		pkt->nic_iface = nic_iface;
@@ -1095,10 +1208,19 @@ static int process_dhcp_loop(nic_t * nic
 	struct timeval total_time;
 
 	/* 10s loop time to wait for DHCP */
-	if (nic_iface->ustack.ip_config == IPV4_CONFIG_DHCP)
+	switch (nic_iface->ustack.ip_config) {
+	case IPV4_CONFIG_DHCP:
 		wait_time.tv_sec = 10;
-	else
+		break;
+	case IPV6_CONFIG_DHCP:
 		wait_time.tv_sec = 15;
+		break;
+	case IPV6_CONFIG_STATIC:
+		wait_time.tv_sec = 4;
+		break;
+	default:
+		wait_time.tv_sec = 2;
+	}
 	wait_time.tv_usec = 0;
 
 	s = nic_iface->ustack.dhcpc;
@@ -1177,7 +1299,6 @@ void *nic_loop(void *arg)
 	/*  Signal the device to enable itself */
 	pthread_mutex_lock(&nic->nic_mutex);
 	pthread_cond_signal(&nic->nic_loop_started_cond);
-	pthread_mutex_unlock(&nic->nic_mutex);
 
 	while ((event_loop_stop == 0) &&
 	       !(nic->flags & NIC_EXIT_MAIN_LOOP) &&
@@ -1189,16 +1310,17 @@ void *nic_loop(void *arg)
 				  nic->log_name);
 
 			/*  Wait for the device to be enabled */
-			pthread_mutex_lock(&nic->nic_mutex);
+			/* nic_mutex is already locked */
 			pthread_cond_wait(&nic->enable_wait_cond,
 					  &nic->nic_mutex);
-			pthread_mutex_unlock(&nic->nic_mutex);
 
-			if (nic->state == NIC_EXIT)
+			if (nic->state == NIC_EXIT) {
+				pthread_mutex_unlock(&nic->nic_mutex);
 				pthread_exit(NULL);
-
+			}
 			LOG_DEBUG(PFX "%s: is now enabled", nic->log_name);
 		}
+		pthread_mutex_unlock(&nic->nic_mutex);
 
 		/*  initialize the device to send/rec data */
 		rc = (*nic->ops->open) (nic);
@@ -1407,7 +1529,7 @@ skip:
 				 nic->log_name,
 				 nic_iface->vlan_id, nic_iface->protocol);
 
-			nic_iface = nic_iface->next;
+			nic_iface = nic_iface->vlan_next;
 		}
 
 		if (nic->flags & NIC_DISABLED) {
@@ -1458,20 +1580,27 @@ dev_close:
 
 			nic->flags &= ~NIC_GOING_DOWN;
 		} else {
-
 			pthread_mutex_destroy(&nic->xmit_mutex);
 			pthread_mutex_init(&nic->xmit_mutex, NULL);
 
 			if (nic->flags & NIC_RESET_UIP) {
 				nic_interface_t *nic_iface = nic->nic_iface;
+				nic_interface_t *vlan_iface;
 				while (nic_iface != NULL) {
 					LOG_INFO(PFX "%s: resetting uIP stack",
 						 nic->log_name);
 					uip_reset(&nic_iface->ustack);
-
+					vlan_iface = nic_iface->vlan_next;
+					while (vlan_iface != NULL) {
+						LOG_INFO(PFX "%s: resetting "
+							 "vlan uIP stack",
+							 nic->log_name);
+						uip_reset(&vlan_iface->ustack);
+						vlan_iface =
+							vlan_iface->vlan_next;
+					}
 					nic_iface = nic_iface->next;
 				}
-
 				nic->flags &= ~NIC_RESET_UIP;
 			}
 		}
@@ -1486,8 +1615,8 @@ dev_close:
 			/*  Signal we are done closing CNIC/UIO device */
 			pthread_cond_broadcast(&nic->disable_wait_cond);
 		}
-		pthread_mutex_unlock(&nic->nic_mutex);
 	}
+	pthread_mutex_unlock(&nic->nic_mutex);
 
 	LOG_INFO(PFX "%s: nic loop thread exited", nic->log_name);
 
diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic.h open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic.h
--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic.h	2011-10-26 07:21:46.000000000 -0500
+++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic.h	2011-10-26 17:55:59.000000000 -0500
@@ -130,6 +130,7 @@ typedef struct nic_interface {
 	time_t start_time;
 
 	struct uip_stack ustack;
+	struct nic_interface *vlan_next;
 } nic_interface_t;
 
 /******************************************************************************
@@ -302,11 +303,13 @@ typedef struct nic {
 int load_all_nic_libraries();
 
 nic_t *nic_init();
-void nic_add(nic_t * nic);
-int nic_remove(nic_t * nic);
+void nic_add(nic_t *nic);
+int nic_remove(nic_t *nic);
 
-int nic_add_nic_iface(nic_t * nic, nic_interface_t * nic_iface);
-int nic_process_intr(nic_t * nic, int discard_check);
+int nic_add_nic_iface(nic_t *nic, nic_interface_t *nic_iface);
+int nic_add_vlan_iface(nic_t *nic, nic_interface_t *nic_iface,
+		       nic_interface_t *vlan_iface);
+int nic_process_intr(nic_t *nic, int discard_check);
 
 nic_interface_t *nic_iface_init();
 
@@ -340,6 +343,10 @@ struct nic_interface *nic_find_nic_iface
 struct nic_interface *nic_find_nic_iface_protocol(nic_t * nic,
 						  uint16_t vlan_id,
 						  uint16_t protocol);
+struct nic_interface *nic_find_vlan_iface_protocol(nic_t *nic,
+						   nic_interface_t *nic_iface,
+						   uint16_t vlan_id,
+						   uint16_t protocol);
 int find_nic_lib_using_pci_id(uint32_t vendor, uint32_t device,
 			      uint32_t subvendor, uint32_t subdevice,
 			      nic_lib_handle_t ** handle,
diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic_nl.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic_nl.c
--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic_nl.c	2011-10-26 07:21:46.000000000 -0500
+++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic_nl.c	2011-10-26 17:55:59.000000000 -0500
@@ -329,7 +329,7 @@ static int ctldev_handle(char *data)
 
 	if (ev->type == ISCSI_KEVENT_PATH_REQ) {
 		struct timespec sleep_rem;
-		nic_interface_t *nic_iface;
+		nic_interface_t *nic_iface, *vlan_iface;
 		uint16_t ip_type;
 
 		if (path->ip_addr_len == 4)
@@ -339,52 +339,56 @@ static int ctldev_handle(char *data)
 		else
 			ip_type = 0;
 
-		nic_iface = nic_find_nic_iface_protocol(nic, path->vlan_id,
-							ip_type);
+		/* Find the parent nic_iface */
+		nic_iface = nic_find_nic_iface_protocol(nic, 0,	ip_type);
 		if (nic_iface == NULL) {
-			nic_interface_t *default_iface;
-			default_iface = nic_find_nic_iface_protocol(nic,
-								    0, ip_type);
-			if (default_iface == NULL) {
-				LOG_ERR(PFX "%s: Couldn't find default iface "
-					"vlan: %d ip_type: %d "
-					"ip_addr_len: %d to clone",
-					nic->log_name, path->vlan_id, ip_type,
-					path->ip_addr_len);
-				goto error;
-			}
-
-			nic_iface = nic_iface_init();
-			if (nic_iface == NULL) {
-				LOG_ERR(PFX "%s: Couldn't allocate space for "
-					"vlan: %d ip_type: %d "
-					"ip_addr_len: %d",
-					nic->log_name, path->vlan_id, ip_type,
-					path->ip_addr_len);
-
-				goto error;
+			LOG_ERR(PFX "%s: Couldn't find nic iface "
+				"vlan: %d ip_type: %d "
+				"ip_addr_len: %d to clone",
+				nic->log_name, path->vlan_id, ip_type,
+				path->ip_addr_len);
+			goto error;
+		}
+		if (path->vlan_id) {
+			vlan_iface = nic_find_vlan_iface_protocol(nic,
+					nic_iface, path->vlan_id, ip_type);
+			if (vlan_iface == NULL) {
+				/* Create a vlan_iface */
+				vlan_iface = nic_iface_init();
+				if (vlan_iface == NULL) {
+					LOG_ERR(PFX "%s: Couldn't allocate "
+						"space for vlan: %d ip_type: "
+						"%d ip_addr_len: %d",
+						nic->log_name, path->vlan_id,
+						ip_type, path->ip_addr_len);
+					goto error;
+				}
+
+				vlan_iface->protocol = ip_type;
+				vlan_iface->vlan_id = path->vlan_id;
+				nic_add_vlan_iface(nic, nic_iface, vlan_iface);
+
+				/* TODO: When VLAN support is placed in */
+				/* the iface file revisit this code */
+				vlan_iface->ustack.ip_config =
+					nic_iface->ustack.ip_config;
+				memcpy(vlan_iface->ustack.hostaddr,
+				       nic_iface->ustack.hostaddr,
+				       sizeof(nic_iface->ustack.hostaddr));
+				memcpy(vlan_iface->ustack.netmask,
+				       nic_iface->ustack.netmask,
+				       sizeof(nic_iface->ustack.netmask));
+				memcpy(vlan_iface->ustack.netmask6,
+				       nic_iface->ustack.netmask6,
+				       sizeof(nic_iface->ustack.netmask6));
+				memcpy(vlan_iface->ustack.hostaddr6,
+				       nic_iface->ustack.hostaddr6,
+				       sizeof(nic_iface->ustack.hostaddr6));
+
+				persist_all_nic_iface(nic);
+				nic_disable(nic, 0);
+				nic_iface = vlan_iface;
 			}
-
-			nic_iface->protocol = ip_type;
-			nic_iface->vlan_id = path->vlan_id;
-			nic_add_nic_iface(nic, nic_iface);
-
-			/* TODO: When VLAN support is placed in the iface file
-			 * revisit this code */
-			nic_iface->ustack.ip_config =
-			    default_iface->ustack.ip_config;
-			memcpy(nic_iface->ustack.hostaddr,
-			       default_iface->ustack.hostaddr,
-			       sizeof(nic_iface->ustack.hostaddr));
-			memcpy(nic_iface->ustack.netmask,
-			       default_iface->ustack.netmask,
-			       sizeof(nic_iface->ustack.netmask));
-			memcpy(nic_iface->ustack.hostaddr6,
-			       default_iface->ustack.hostaddr6,
-			       sizeof(nic_iface->ustack.hostaddr6));
-
-			persist_all_nic_iface(nic);
-			nic_disable(nic, 0);
 		}
 
 		/*  Force enable the NIC */
diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic_utils.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic_utils.c
--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic_utils.c	2011-10-26 07:21:46.000000000 -0500
+++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic_utils.c	2011-10-26 17:55:59.000000000 -0500
@@ -78,6 +78,8 @@ static const char host_template[] = "hos
 static const char iscsi_host_path_template[] = "/sys/class/iscsi_host/host%d";
 static const char iscsi_host_path_netdev_template[] =
     "/sys/class/iscsi_host/host%d/netdev";
+static const char cnic_uio_sysfs_resc_template[] =
+	"/sys/class/uio/uio%i/device/resource%i";
 
 /**
  *  manually_trigger_uio_event() - If the uio file node doesn't exist then
@@ -824,6 +826,15 @@ int nic_fill_name(nic_t * nic)
 	return 0;
 }
 
+void cnic_get_sysfs_pci_resource_path(nic_t *nic, int resc_no,
+				      char *sys_path, size_t size)
+{
+	/*  Build the path to sysfs pci resource */
+	snprintf(sys_path, size,
+		 cnic_uio_sysfs_resc_template, nic->uio_minor, resc_no);
+
+}
+
 void prepare_library(nic_t * nic)
 {
 	int rc;
@@ -925,13 +936,23 @@ int nic_enable(nic_t * nic)
 		rc = gettimeofday(&tp, NULL);
 		ts.tv_sec = tp.tv_sec;
 		ts.tv_nsec = tp.tv_usec * 1000;
-		/* Changed the timeout to 10s to accommodate for DHCP
-		   timeout */
 		ts.tv_sec += 10;
 
-		/*  Wait for the device to be disabled */
+		/*  Wait for the device to be enabled */
 		rc = pthread_cond_timedwait(&nic->enable_done_cond,
 					    &nic->nic_mutex, &ts);
+#if 0
+		if (rc || !nic->flags & NIC_ENABLED) {
+			/* Give it one more shout */
+			pthread_cond_broadcast(&nic->enable_wait_cond);
+			rc = gettimeofday(&tp, NULL);
+			ts.tv_sec = tp.tv_sec;
+			ts.tv_nsec = tp.tv_usec * 1000;
+			ts.tv_sec += 5;
+			rc = pthread_cond_timedwait(&nic->enable_done_cond,
+						    &nic->nic_mutex, &ts);
+		}
+#endif
 		nic->flags &= ~NIC_ENABLED_PENDING;
 		pthread_mutex_unlock(&nic->nic_mutex);
 
@@ -940,6 +961,24 @@ int nic_enable(nic_t * nic)
 		} else {
 			LOG_ERR(PFX "%s: waiting to finish nic_enable err:%s",
 				nic->log_name, strerror(rc));
+			/* Must clean up the ustack */
+			nic_interface_t *nic_iface = nic->nic_iface;
+			nic_interface_t *vlan_iface;
+			while (nic_iface != NULL) {
+				LOG_INFO(PFX "%s: resetting uIP stack",
+					 nic->log_name);
+				uip_reset(&nic_iface->ustack);
+				vlan_iface = nic_iface->vlan_next;
+				while (vlan_iface != NULL) {
+					LOG_INFO(PFX "%s: resetting "
+						 "vlan uIP stack",
+						 nic->log_name);
+					uip_reset(&vlan_iface->ustack);
+					vlan_iface =
+						vlan_iface->vlan_next;
+				}
+				nic_iface = nic_iface->next;
+			}
 		}
 
 		return rc;
@@ -979,7 +1018,7 @@ int nic_disable(nic_t * nic, int going_d
 		rc = gettimeofday(&tp, NULL);
 		ts.tv_sec = tp.tv_sec;
 		ts.tv_nsec = tp.tv_usec * 1000;
-		ts.tv_sec += 5;	/*  TODO: hardcoded wait for 2 seconds */
+		ts.tv_sec += 5;	/*  TODO: hardcoded wait for 5 seconds */
 
 		/*  Wait for the device to be disabled */
 		rc = pthread_cond_timedwait(&nic->disable_wait_cond,
@@ -1087,7 +1126,7 @@ error:
  */
 void nic_set_all_nic_iface_mac_to_parent(nic_t * nic)
 {
-	nic_interface_t *current;
+	nic_interface_t *current, *vlan_current;
 
 	pthread_mutex_lock(&nic->nic_mutex);
 
@@ -1097,6 +1136,11 @@ void nic_set_all_nic_iface_mac_to_parent
 		 *  adapter */
 		memcpy(current->mac_addr, nic->mac_addr, 6);
 
+		vlan_current = current->vlan_next;
+		while (vlan_current != NULL) {
+			memcpy(vlan_current->mac_addr, nic->mac_addr, 6);
+			vlan_current = vlan_current->vlan_next;
+		}
 		current = current->next;
 	}
 
@@ -1286,20 +1330,80 @@ nic_interface_t *nic_find_nic_iface_prot
 
 void persist_all_nic_iface(nic_t * nic)
 {
-	nic_interface_t *current;
+	nic_interface_t *current, *vlan_iface;
 
 	pthread_mutex_lock(&nic->nic_mutex);
 
 	current = nic->nic_iface;
 	while (current != NULL) {
 		current->flags |= NIC_IFACE_PERSIST;
-
+		vlan_iface = current->vlan_next;
+		while (vlan_iface != NULL) {
+			vlan_iface->flags |= NIC_IFACE_PERSIST;
+			vlan_iface = vlan_iface->vlan_next;
+		}
 		current = current->next;
 	}
 
 	pthread_mutex_unlock(&nic->nic_mutex);
 }
 
+/**
+ *  nic_find_vlan_iface_protocol() - This function is used to find an interface
+ *                                   from the NIC
+ *  @param nic_iface - Base NIC to look for the vlan interfaces
+ *  @param vlan_id - VLAN id to look for
+ *  @param protocol - either AF_INET or AF_INET6
+ *  @return nic_iface - if found network interface with the given VLAN ID
+ *                      if not found a NULL is returned
+ */
+nic_interface_t *nic_find_vlan_iface_protocol(nic_t *nic,
+					      nic_interface_t *nic_iface,
+					      uint16_t vlan_id,
+					      uint16_t protocol)
+{
+	nic_interface_t *current;
+
+	pthread_mutex_lock(&nic->nic_mutex);
+
+	current = nic_iface->vlan_next;
+	while (current != NULL) {
+		if ((current->vlan_id == vlan_id) &&
+		    (current->protocol == protocol)) {
+			pthread_mutex_unlock(&nic->nic_mutex);
+			return current;
+		}
+		current = current->vlan_next;
+	}
+
+	pthread_mutex_unlock(&nic->nic_mutex);
+	return NULL;
+}
+
+void set_nic_iface(nic_t *nic, nic_interface_t *nic_iface)
+{
+	nic_interface_t *current, *prev;
+
+	pthread_mutex_lock(&nic->nic_mutex);
+
+	if (nic->nic_iface == nic_iface)
+		goto done;
+
+	prev = nic->nic_iface;
+	current = nic->nic_iface->next;
+	while (current != NULL) {
+		if (current == nic_iface) {
+			prev->next = current->next;
+			current->next = nic->nic_iface;
+			nic->nic_iface = current;
+			goto done;
+		}
+		prev = current;
+		current = current->next;
+	}
+done:
+	pthread_mutex_unlock(&nic->nic_mutex);
+}
 /*******************************************************************************
  *  Packet management utility functions
  ******************************************************************************/
diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic_utils.h open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic_utils.h
--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic_utils.h	2011-10-26 07:21:46.000000000 -0500
+++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic_utils.h	2011-10-26 17:55:59.000000000 -0500
@@ -68,12 +68,15 @@ void nic_fill_ethernet_header(nic_interf
 			      uint16_t ether_type);
 
 nic_interface_t *nic_find_nic_iface(nic_t * nic, uint16_t vlan_id);
+void set_nic_iface(nic_t *nic, nic_interface_t *nic_iface);
 
 void persist_all_nic_iface(nic_t * nic);
 
 int add_vlan_interfaces(nic_t * nic);
 
 int nic_verify_uio_sysfs_name(nic_t * nic);
+void cnic_get_sysfs_pci_resource_path(nic_t *nic, int resc_no,
+				      char *sys_path, size_t size);
 void nic_close_all();
 void nic_remove_all();