Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 22 Jun 2011 16:26:28 GMT
From:      John Baldwin <jhb@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 195152 for review
Message-ID:  <201106221626.p5MGQSZX028513@skunkworks.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@195152?ac=10

Change 195152 by jhb@jhb_jhbbsd on 2011/06/22 16:25:39

	IFC @195151

Affected files ...

.. //depot/projects/pci/sys/amd64/pci/pci_bus.c#8 integrate
.. //depot/projects/pci/sys/dev/acpica/acpi_pcib_acpi.c#25 integrate
.. //depot/projects/pci/sys/dev/acpica/acpi_resource.c#7 integrate
.. //depot/projects/pci/sys/dev/acpica/acpivar.h#4 integrate
.. //depot/projects/pci/sys/dev/atkbdc/atkbd.c#3 integrate
.. //depot/projects/pci/sys/dev/cardbus/cardbus_cis.c#5 integrate
.. //depot/projects/pci/sys/dev/dc/if_dc.c#3 integrate
.. //depot/projects/pci/sys/dev/e1000/if_igb.c#5 integrate
.. //depot/projects/pci/sys/dev/e1000/if_igb.h#5 integrate
.. //depot/projects/pci/sys/dev/firewire/fwohci.c#3 integrate
.. //depot/projects/pci/sys/dev/pccbb/pccbb_pci.c#2 integrate
.. //depot/projects/pci/sys/dev/pci/pci.c#22 integrate
.. //depot/projects/pci/sys/dev/vr/if_vr.c#4 integrate
.. //depot/projects/pci/sys/dev/vr/if_vrreg.h#2 integrate
.. //depot/projects/pci/sys/dev/xl/if_xl.c#4 integrate
.. //depot/projects/pci/sys/fs/nfsserver/nfs_nfsdserv.c#3 integrate
.. //depot/projects/pci/sys/fs/nfsserver/nfs_nfsdsocket.c#3 integrate
.. //depot/projects/pci/sys/geom/part/g_part_bsd.c#3 integrate
.. //depot/projects/pci/sys/i386/pci/pci_bus.c#8 integrate
.. //depot/projects/pci/sys/ia64/conf/NOTES#2 integrate
.. //depot/projects/pci/sys/net/route.c#3 integrate
.. //depot/projects/pci/sys/net/route.h#3 integrate
.. //depot/projects/pci/sys/net80211/ieee80211_ht.c#4 integrate
.. //depot/projects/pci/sys/net80211/ieee80211_var.h#4 integrate
.. //depot/projects/pci/sys/netinet/ipfw/ip_dn_io.c#3 integrate
.. //depot/projects/pci/sys/netinet/ipfw/ip_fw_pfil.c#2 integrate
.. //depot/projects/pci/sys/netinet/libalias/libalias.3#2 integrate
.. //depot/projects/pci/sys/netinet/tcp_output.c#5 integrate
.. //depot/projects/pci/sys/powerpc/ps3/if_glc.c#2 integrate
.. //depot/projects/pci/sys/powerpc/ps3/ps3bus.c#4 integrate
.. //depot/projects/pci/sys/powerpc/ps3/ps3disk.c#2 integrate
.. //depot/projects/pci/sys/sparc64/include/tsb.h#2 integrate
.. //depot/projects/pci/sys/sparc64/include/vmparam.h#4 integrate
.. //depot/projects/pci/sys/sparc64/sparc64/mp_machdep.c#3 integrate
.. //depot/projects/pci/sys/sparc64/sparc64/pmap.c#5 integrate
.. //depot/projects/pci/sys/sparc64/sparc64/tlb.c#3 integrate
.. //depot/projects/pci/sys/ufs/ffs/ffs_alloc.c#5 integrate
.. //depot/projects/pci/sys/ufs/ffs/ffs_extern.h#5 integrate
.. //depot/projects/pci/sys/ufs/ffs/ffs_softdep.c#5 integrate

Differences ...

==== //depot/projects/pci/sys/amd64/pci/pci_bus.c#8 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/pci/pci_bus.c,v 1.126 2011/05/03 17:37:24 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/pci/pci_bus.c,v 1.127 2011/06/22 16:15:15 jhb Exp $");
 
 #include "opt_cpu.h"
 
@@ -42,7 +42,6 @@
 #include <dev/pci/pcireg.h>
 #include <dev/pci/pcib_private.h>
 #include <isa/isavar.h>
-#include <machine/bus.h>
 #include <machine/legacyvar.h>
 #include <machine/pci_cfgreg.h>
 #include <machine/resource.h>
@@ -303,6 +302,39 @@
 	return ENOENT;
 }
 
+/*
+ * Helper routine for x86 Host-PCI bridge driver resource allocation.
+ * This is used to adjust the start address of wildcard allocation
+ * requests to avoid low addresses that are known to be problematic.
+ *
+ * If no memory preference is given, use upper 32MB slot most BIOSes
+ * use for their memory window.  This is typically only used on older
+ * laptops that don't have PCI busses behind a PCI bridge, so assuming
+ * > 32MB is likely OK.
+ *	
+ * However, this can cause problems for other chipsets, so we make
+ * this tunable by hw.pci.host_mem_start.
+ */
+SYSCTL_DECL(_hw_pci);
+
+static unsigned long host_mem_start = 0x80000000;
+TUNABLE_ULONG("hw.pci.host_mem_start", &host_mem_start);
+SYSCTL_ULONG(_hw_pci, OID_AUTO, host_mem_start, CTLFLAG_RDTUN, &host_mem_start,
+    0, "Limit the host bridge memory to being above this address.");
+
+u_long
+hostb_alloc_start(int type, u_long start, u_long end, u_long count)
+{
+
+	if (start + count - 1 != end) {
+		if (type == SYS_RES_MEMORY && start < host_mem_start)
+			start = host_mem_start;
+		if (type == SYS_RES_IOPORT && start < 0x1000)
+			start = 0x1000;
+	}
+	return (start);
+}
+
 struct resource *
 legacy_pcib_alloc_resource(device_t dev, device_t child, int type, int *rid,
     u_long start, u_long end, u_long count, u_int flags)

==== //depot/projects/pci/sys/dev/acpica/acpi_pcib_acpi.c#25 (text+ko) ====

@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_pcib_acpi.c,v 1.65 2011/05/03 17:37:24 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_pcib_acpi.c,v 1.66 2011/06/22 16:15:15 jhb Exp $");
 
 #include "opt_acpi.h"
 #include <sys/param.h>

==== //depot/projects/pci/sys/dev/acpica/acpi_resource.c#7 (text+ko) ====

@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_resource.c,v 1.43 2011/02/14 20:05:37 jkim Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_resource.c,v 1.45 2011/06/21 21:30:20 jhb Exp $");
 
 #include "opt_acpi.h"
 #include <sys/param.h>
@@ -343,22 +343,23 @@
 	if (res->Data.Address.MinAddressFixed == ACPI_ADDRESS_FIXED &&
 	    res->Data.Address.MaxAddressFixed == ACPI_ADDRESS_FIXED) {
 	    if (res->Data.Address.ResourceType == ACPI_MEMORY_RANGE) {
-		ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "%s/Memory 0x%x/%d\n",
-		    name, min, length));
+		ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "%s/Memory 0x%jx/%ju\n",
+		    name, (uintmax_t)min, (uintmax_t)length));
 		set->set_memory(dev, arc->context, min, length);
 	    } else {
-		ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "%s/IO 0x%x/%d\n", name,
-		    min, length));
+		ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "%s/IO 0x%jx/%ju\n", name,
+		    (uintmax_t)min, (uintmax_t)length));
 		set->set_ioport(dev, arc->context, min, length);
 	    }
 	} else {
 	    if (res->Data.Address32.ResourceType == ACPI_MEMORY_RANGE) {
-		ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "%s/Memory 0x%x-0x%x/%d\n",
-		    name, min, max, length));
+		ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
+		    "%s/Memory 0x%jx-0x%jx/%ju\n", name, (uintmax_t)min,
+		    (uintmax_t)max, (uintmax_t)length));
 		set->set_memoryrange(dev, arc->context, min, max, length, gran);
 	    } else {
-		ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "%s/IO 0x%x-0x%x/%d\n",
-		    name, min, max, length));
+		ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "%s/IO 0x%jx-0x%jx/%ju\n",
+		    name, (uintmax_t)min, (uintmax_t)max, (uintmax_t)length));
 		set->set_iorange(dev, arc->context, min, max, length, gran);
 	    }
 	}		    

==== //depot/projects/pci/sys/dev/acpica/acpivar.h#4 (text+ko) ====

@@ -25,7 +25,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/acpivar.h,v 1.124 2011/04/04 18:39:04 jkim Exp $
+ * $FreeBSD: src/sys/dev/acpica/acpivar.h,v 1.125 2011/06/21 19:29:27 jhb Exp $
  */
 
 #ifndef _ACPIVAR_H_

==== //depot/projects/pci/sys/dev/atkbdc/atkbd.c#3 (text+ko) ====

@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/atkbdc/atkbd.c,v 1.65 2011/06/11 01:19:19 delphij Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/atkbdc/atkbd.c,v 1.66 2011/06/20 16:42:20 delphij Exp $");
 
 #include "opt_compat.h"
 #include "opt_kbd.h"
@@ -1100,7 +1100,7 @@
 	/*
 	 * Traditional entry points of int 0x15 and 0x16 are fixed
 	 * and later BIOSes follow them.  (U)EFI CSM specification
-	 * also mandate these fixed entry points.
+	 * also mandates these fixed entry points.
 	 *
 	 * Validate the entry points here before we proceed further.
 	 * It's known that some recent laptops does not have the

==== //depot/projects/pci/sys/dev/cardbus/cardbus_cis.c#5 (text+ko) ====

@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/cardbus/cardbus_cis.c,v 1.71 2011/06/06 13:21:11 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/cardbus/cardbus_cis.c,v 1.72 2011/06/21 22:45:31 imp Exp $");
 
 /*
  * CIS Handling for the Cardbus Bus
@@ -369,6 +369,14 @@
  * Functions to read the a tuple from the card
  */
 
+/*
+ * Read CIS bytes out of the config space.  We have to read it 4 bytes at a
+ * time and do the usual mask and shift to return the bytes.  The standard
+ * defines the byte order to be little endian.  pci_read_config converts it to
+ * host byte order.  This is why we have no endian conversion functions: the
+ * shifts wind up being endian neutral.  This is also why we avoid the obvious
+ * memcpy optimization.
+ */
 static int
 cardbus_read_tuple_conf(device_t cbdev, device_t child, uint32_t start,
     uint32_t *off, int *tupleid, int *len, uint8_t *tupledata)
@@ -379,12 +387,11 @@
 
 	loc = start + *off;
 
-	e = pci_read_config(child, loc - loc % 4, 4);
-	for (j = loc % 4; j > 0; j--)
-		e >>= 8;
+	e = pci_read_config(child, loc & ~0x3, 4);
+	e >>= 8 * (loc & 0x3);
 	*len = 0;
 	for (i = loc, j = -2; j < *len; j++, i++) {
-		if (i % 4 == 0)
+		if ((i & 0x3) == 0)
 			e = pci_read_config(child, i, 4);
 		if (j == -2)
 			*tupleid = 0xff & e;
@@ -398,6 +405,10 @@
 	return (0);
 }
 
+/*
+ * Read the CIS data out of memroy.  We indirect through the bus space
+ * routines to ensure proper byte ordering conversions when necessary.
+ */
 static int
 cardbus_read_tuple_mem(device_t cbdev, struct resource *res, uint32_t start,
     uint32_t *off, int *tupleid, int *len, uint8_t *tupledata)
@@ -580,7 +591,7 @@
 	expect_linktarget = TRUE;
 	if ((start = pci_read_config(child, PCIR_CIS, 4)) == 0) {
 		DEVPRINTF((cbdev, "Warning: CIS pointer is 0: (no CIS)\n"));
-		return (ENXIO);
+		return (0);
 	}
 	DEVPRINTF((cbdev, "CIS pointer is %#x\n", start));
 	off = 0;

==== //depot/projects/pci/sys/dev/dc/if_dc.c#3 (text+ko) ====

@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/dc/if_dc.c,v 1.224 2011/03/28 19:08:53 yongari Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/dc/if_dc.c,v 1.225 2011/06/21 20:52:55 imp Exp $");
 
 /*
  * DEC "tulip" clone ethernet driver. Supports the DEC/Intel 21143
@@ -1385,7 +1385,7 @@
 			break;
 		DELAY(10);
 	}
-	if (i == DC_TIMEOUT) {
+	if (i == DC_TIMEOUT && bus_child_present(sc->dc_dev)) {
 		if (!(isr & DC_ISR_TX_IDLE) && !DC_IS_ASIX(sc))
 			device_printf(sc->dc_dev,
 			    "%s: failed to force tx to idle state\n", __func__);

==== //depot/projects/pci/sys/dev/e1000/if_igb.c#5 (text+ko) ====

@@ -30,12 +30,13 @@
   POSSIBILITY OF SUCH DAMAGE.
 
 ******************************************************************************/
-/*$FreeBSD: src/sys/dev/e1000/if_igb.c,v 1.69 2011/06/17 20:06:52 jhb Exp $*/
+/*$FreeBSD: src/sys/dev/e1000/if_igb.c,v 1.70 2011/06/20 22:59:29 jfv Exp $*/
 
 
 #ifdef HAVE_KERNEL_OPTION_HEADERS
 #include "opt_device_polling.h"
 #include "opt_inet.h"
+#include "opt_inet6.h"
 #include "opt_altq.h"
 #endif
 
@@ -99,7 +100,7 @@
 /*********************************************************************
  *  Driver version:
  *********************************************************************/
-char igb_driver_version[] = "version - 2.2.3";
+char igb_driver_version[] = "version - 2.2.5";
 
 
 /*********************************************************************
@@ -265,6 +266,7 @@
 static void	igb_set_sysctl_value(struct adapter *, const char *,
 		    const char *, int *, int);
 static int	igb_set_flowcntl(SYSCTL_HANDLER_ARGS);
+static int	igb_sysctl_dmac(SYSCTL_HANDLER_ARGS);
 
 #ifdef DEVICE_POLLING
 static poll_handler_t igb_poll;
@@ -344,25 +346,6 @@
 static int igb_num_queues = 0;
 TUNABLE_INT("hw.igb.num_queues", &igb_num_queues);
 
-/* How many packets rxeof tries to clean at a time */
-static int igb_rx_process_limit = 100;
-TUNABLE_INT("hw.igb.rx_process_limit", &igb_rx_process_limit);
-
-/* Flow control setting - default to FULL */
-static int igb_fc_setting = e1000_fc_full;
-TUNABLE_INT("hw.igb.fc_setting", &igb_fc_setting);
-
-/* Energy Efficient Ethernet - default to off */
-static int igb_eee_disabled = TRUE;
-TUNABLE_INT("hw.igb.eee_disabled", &igb_eee_disabled);
-
-/*
-** DMA Coalescing, only for i350 - default to off,
-** this feature is for power savings
-*/
-static int igb_dma_coalesce = FALSE;
-TUNABLE_INT("hw.igb.dma_coalesce", &igb_dma_coalesce);
-
 /*********************************************************************
  *  Device identification routine
  *
@@ -433,6 +416,11 @@
 
 	INIT_DEBUGOUT("igb_attach: begin");
 
+	if (resource_disabled("igb", device_get_unit(dev))) {
+		device_printf(dev, "Disabled by device hint\n");
+		return (ENXIO);
+	}
+
 	adapter = device_get_softc(dev);
 	adapter->dev = adapter->osdep.dev = dev;
 	IGB_CORE_LOCK_INIT(adapter, device_get_nameunit(dev));
@@ -450,7 +438,7 @@
 
 	SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
 	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
-	    OID_AUTO, "flow_control", CTLTYPE_INT|CTLFLAG_RW,
+	    OID_AUTO, "fc", CTLTYPE_INT|CTLFLAG_RW,
 	    adapter, 0, igb_set_flowcntl, "I", "Flow Control");
 
 	callout_init_mtx(&adapter->timer, &adapter->core_mtx, 0);
@@ -476,8 +464,8 @@
 
 	/* Sysctl for limiting the amount of work done in the taskqueue */
 	igb_set_sysctl_value(adapter, "rx_processing_limit",
-	    "max number of rx packets to process", &adapter->rx_process_limit,
-	    igb_rx_process_limit);
+	    "max number of rx packets to process",
+	    &adapter->rx_process_limit, 100);
 
 	/*
 	 * Validate number of transmit and receive descriptors. It
@@ -552,13 +540,14 @@
 
 	/* Some adapter-specific advanced features */
 	if (adapter->hw.mac.type >= e1000_i350) {
-		igb_set_sysctl_value(adapter, "dma_coalesce",
-		    "configure dma coalesce",
-		    &adapter->dma_coalesce, igb_dma_coalesce);
+		SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
+		    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
+		    OID_AUTO, "dmac", CTLTYPE_INT|CTLFLAG_RW,
+		    adapter, 0, igb_sysctl_dmac, "I", "DMA Coalesce");
 		igb_set_sysctl_value(adapter, "eee_disabled",
 		    "enable Energy Efficient Ethernet",
 		    &adapter->hw.dev_spec._82575.eee_disable,
-		    igb_eee_disabled);
+		    TRUE);
 		e1000_set_eee_i350(&adapter->hw);
 	}
 
@@ -658,6 +647,7 @@
 	return (0);
 
 err_late:
+	igb_detach(dev);
 	igb_free_transmit_structures(adapter);
 	igb_free_receive_structures(adapter);
 	igb_release_hw_control(adapter);
@@ -736,7 +726,8 @@
 
 	igb_free_transmit_structures(adapter);
 	igb_free_receive_structures(adapter);
-	free(adapter->mta, M_DEVBUF);
+	if (adapter->mta != NULL)
+		free(adapter->mta, M_DEVBUF);
 
 	IGB_CORE_LOCK_DESTROY(adapter);
 
@@ -1025,11 +1016,12 @@
 igb_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
 {
 	struct adapter	*adapter = ifp->if_softc;
-	struct ifreq *ifr = (struct ifreq *)data;
-#ifdef INET
-	struct ifaddr *ifa = (struct ifaddr *)data;
+	struct ifreq	*ifr = (struct ifreq *)data;
+#if defined(INET) || defined(INET6)
+	struct ifaddr	*ifa = (struct ifaddr *)data;
+	bool		avoid_reset = FALSE;
 #endif
-	int error = 0;
+	int		error = 0;
 
 	if (adapter->in_detach)
 		return (error);
@@ -1037,20 +1029,22 @@
 	switch (command) {
 	case SIOCSIFADDR:
 #ifdef INET
-		if (ifa->ifa_addr->sa_family == AF_INET) {
-			/*
-			 * XXX
-			 * Since resetting hardware takes a very long time
-			 * and results in link renegotiation we only
-			 * initialize the hardware only when it is absolutely
-			 * required.
-			 */
+		if (ifa->ifa_addr->sa_family == AF_INET)
+			avoid_reset = TRUE;
+#endif
+#ifdef INET6
+		if (ifa->ifa_addr->sa_family == AF_INET6)
+			avoid_reset = TRUE;
+#endif
+#if defined(INET) || defined(INET6)
+		/*
+		** Calling init results in link renegotiation,
+		** so we avoid doing it when possible.
+		*/
+		if (avoid_reset) {
 			ifp->if_flags |= IFF_UP;
-			if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
-				IGB_CORE_LOCK(adapter);
-				igb_init_locked(adapter);
-				IGB_CORE_UNLOCK(adapter);
-			}
+			if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
+				igb_init(adapter);
 			if (!(ifp->if_flags & IFF_NOARP))
 				arp_ifinit(ifp, ifa);
 		} else
@@ -1175,6 +1169,10 @@
 			ifp->if_capenable ^= IFCAP_VLAN_HWFILTER;
 			reinit = 1;
 		}
+		if (mask & IFCAP_VLAN_HWTSO) {
+			ifp->if_capenable ^= IFCAP_VLAN_HWTSO;
+			reinit = 1;
+		}
 		if (mask & IFCAP_LRO) {
 			ifp->if_capenable ^= IFCAP_LRO;
 			reinit = 1;
@@ -2721,6 +2719,12 @@
 
 	fc->pause_time = IGB_FC_PAUSE_TIME;
 	fc->send_xon = TRUE;
+	if (fc->requested_mode)
+		fc->current_mode = fc->requested_mode;
+	else
+		fc->current_mode = e1000_fc_full;
+
+	adapter->fc = fc->current_mode;
 
 	/* Issue a global reset */
 	e1000_reset_hw(hw);
@@ -2730,9 +2734,13 @@
 		device_printf(dev, "Hardware Initialization Failed\n");
 
 	/* Setup DMA Coalescing */
-	if ((hw->mac.type == e1000_i350) &&
-	    (adapter->dma_coalesce == TRUE)) {
-		u32 reg;
+	if (hw->mac.type == e1000_i350) {
+		u32 reg = ~E1000_DMACR_DMAC_EN;
+
+		if (adapter->dmac == 0) { /* Disabling it */
+			E1000_WRITE_REG(hw, E1000_DMACR, reg);
+			goto reset_out;
+		}
 
 		hwm = (pba - 4) << 10;
 		reg = (((pba-6) << E1000_DMACR_DMACTHR_SHIFT)
@@ -2741,8 +2749,8 @@
 		/* transition to L0x or L1 if available..*/
 		reg |= (E1000_DMACR_DMAC_EN | E1000_DMACR_DMAC_LX_MASK);
 
-		/* timer = +-1000 usec in 32usec intervals */
-		reg |= (1000 >> 5);
+		/* timer = value in adapter->dmac in 32usec intervals */
+		reg |= (adapter->dmac >> 5);
 		E1000_WRITE_REG(hw, E1000_DMACR, reg);
 
 		/* No lower threshold */
@@ -2767,6 +2775,7 @@
 		device_printf(dev, "DMA Coalescing enabled\n");
 	}
 
+reset_out:
 	E1000_WRITE_REG(&adapter->hw, E1000_VET, ETHERTYPE_VLAN);
 	e1000_get_phy_info(hw);
 	e1000_check_for_link(hw);
@@ -2827,15 +2836,19 @@
 	 * support full VLAN capability.
 	 */
 	ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
-	ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU;
-	ifp->if_capenable |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU;
+	ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING
+			     |  IFCAP_VLAN_HWTSO
+			     |  IFCAP_VLAN_MTU;
+	ifp->if_capenable |= IFCAP_VLAN_HWTAGGING
+			  |  IFCAP_VLAN_HWTSO
+			  |  IFCAP_VLAN_MTU;
 
 	/*
-	** Dont turn this on by default, if vlans are
+	** Don't turn this on by default, if vlans are
 	** created on another pseudo device (eg. lagg)
 	** then vlan events are not passed thru, breaking
 	** operation, but with HW FILTER off it works. If
-	** using vlans directly on the em driver you can
+	** using vlans directly on the igb driver you can
 	** enable this and get full hardware tag filtering.
 	*/
 	ifp->if_capabilities |= IFCAP_VLAN_HWFILTER;
@@ -5595,19 +5608,18 @@
 igb_set_flowcntl(SYSCTL_HANDLER_ARGS)
 {
 	int error;
-	struct adapter *adapter;
+	struct adapter *adapter = (struct adapter *) arg1;
 
-	error = sysctl_handle_int(oidp, &igb_fc_setting, 0, req);
+	error = sysctl_handle_int(oidp, &adapter->fc, 0, req);
 
-	if (error)
+	if ((error) || (req->newptr == NULL))
 		return (error);
 
-	adapter = (struct adapter *) arg1;
-	switch (igb_fc_setting) {
+	switch (adapter->fc) {
 		case e1000_fc_rx_pause:
 		case e1000_fc_tx_pause:
 		case e1000_fc_full:
-			adapter->hw.fc.requested_mode = igb_fc_setting;
+			adapter->hw.fc.requested_mode = adapter->fc;
 			break;
 		case e1000_fc_none:
 		default:
@@ -5616,5 +5628,54 @@
 
 	adapter->hw.fc.current_mode = adapter->hw.fc.requested_mode;
 	e1000_force_mac_fc(&adapter->hw);
-	return error;
+	return (error);
+}
+
+/*
+** Manage DMA Coalesce:
+** Control values:
+** 	0/1 - off/on
+**	Legal timer values are:
+**	250,500,1000-10000 in thousands
+*/
+static int
+igb_sysctl_dmac(SYSCTL_HANDLER_ARGS)
+{
+	struct adapter *adapter = (struct adapter *) arg1;
+	int		error;
+
+	error = sysctl_handle_int(oidp, &adapter->dmac, 0, req);
+
+	if ((error) || (req->newptr == NULL))
+		return (error);
+
+	switch (adapter->dmac) {
+		case 0:
+			/*Disabling */
+			break;
+		case 1: /* Just enable and use default */
+			adapter->dmac = 1000;
+			break;
+		case 250:
+		case 500:
+		case 1000:
+		case 2000:
+		case 3000:
+		case 4000:
+		case 5000:
+		case 6000:
+		case 7000:
+		case 8000:
+		case 9000:
+		case 10000:
+			/* Legal values - allow */
+			break;
+		default:
+			/* Do nothing, illegal value */
+			adapter->dmac = 0;
+			return (error);
+	}
+	/* Reinit the interface */
+	igb_init(adapter);
+	return (error);
 }

==== //depot/projects/pci/sys/dev/e1000/if_igb.h#5 (text+ko) ====

@@ -30,7 +30,7 @@
   POSSIBILITY OF SUCH DAMAGE.
 
 ******************************************************************************/
-/*$FreeBSD: src/sys/dev/e1000/if_igb.h,v 1.22 2011/06/17 20:06:52 jhb Exp $*/
+/*$FreeBSD: src/sys/dev/e1000/if_igb.h,v 1.23 2011/06/20 22:59:29 jfv Exp $*/
 
 #ifndef _IGB_H_DEFINED_
 #define _IGB_H_DEFINED_
@@ -396,11 +396,12 @@
 	u32		shadow_vfta[IGB_VFTA_SIZE];
 
 	/* Info about the interface */
-	u8		link_active;
+	u16		link_active;
+	u16		fc;
 	u16		link_speed;
 	u16		link_duplex;
 	u32		smartspeed;
-	u32		dma_coalesce;
+	u32		dmac;
 
 	/* Interface queues */
 	struct igb_queue	*queues;

==== //depot/projects/pci/sys/dev/firewire/fwohci.c#3 (text+ko) ====

@@ -31,7 +31,7 @@
  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  * 
- * $FreeBSD: src/sys/dev/firewire/fwohci.c,v 1.100 2011/03/11 22:19:49 marius Exp $
+ * $FreeBSD: src/sys/dev/firewire/fwohci.c,v 1.101 2011/06/21 03:07:59 imp Exp $
  *
  */
 
@@ -2072,8 +2072,9 @@
 	FW_GLOCK_ASSERT(&sc->fc);
 	stat = OREAD(sc, FWOHCI_INTSTAT);
 	if (stat == 0xffffffff) {
-		device_printf(sc->fc.dev, 
-			"device physically ejected?\n");
+		if (!bus_child_present(sc->fc.dev))
+			return (FILTER_HANDLED);
+		device_printf(sc->fc.dev, "device physically ejected?\n");
 		return (FILTER_STRAY);
 	}
 	if (stat)

==== //depot/projects/pci/sys/dev/pccbb/pccbb_pci.c#2 (text+ko) ====

@@ -72,7 +72,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/pccbb/pccbb_pci.c,v 1.36 2009/04/10 04:08:34 thompsa Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/pccbb/pccbb_pci.c,v 1.37 2011/06/21 03:05:17 imp Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -658,6 +658,12 @@
 	struct cbb_softc *sc = (struct cbb_softc *)device_get_softc(brdev);
 
 	/*
+	 * We're about to pull the rug out from the card, so mark it as
+	 * gone to prevent harm.
+         */
+        sc->cardok = 0;
+
+	/*
 	 * Place the cards in reset, turn off the interrupts and power
 	 * down the socket.
 	 */

==== //depot/projects/pci/sys/dev/pci/pci.c#22 (text+ko) ====

@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/pci/pci.c,v 1.421 2011/06/06 13:21:11 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/pci/pci.c,v 1.422 2011/06/21 19:31:31 jhb Exp $");
 
 #include "opt_bus.h"
 

==== //depot/projects/pci/sys/dev/vr/if_vr.c#4 (text+ko) ====

@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/vr/if_vr.c,v 1.141 2011/05/03 19:51:29 marius Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/vr/if_vr.c,v 1.142 2011/06/22 02:18:45 yongari Exp $");
 
 /*
  * VIA Rhine fast ethernet PCI NIC driver
@@ -185,7 +185,6 @@
 static int vr_miibus_writereg(device_t, int, int, int);
 static void vr_miibus_statchg(device_t);
 
-static void vr_link_task(void *, int);
 static void vr_cam_mask(struct vr_softc *, uint32_t, int);
 static int vr_cam_data(struct vr_softc *, int, int, uint8_t *);
 static void vr_set_filter(struct vr_softc *);
@@ -226,7 +225,6 @@
 	DEVMETHOD(miibus_readreg,	vr_miibus_readreg),
 	DEVMETHOD(miibus_writereg,	vr_miibus_writereg),
 	DEVMETHOD(miibus_statchg,	vr_miibus_statchg),
-	DEVMETHOD(miibus_linkchg,	vr_miibus_statchg),
 
 	{ NULL, NULL }
 };
@@ -290,22 +288,13 @@
 	return (0);
 }
 
-static void
-vr_miibus_statchg(device_t dev)
-{
-	struct vr_softc		*sc;
-
-	sc = device_get_softc(dev);
-	taskqueue_enqueue(taskqueue_swi, &sc->vr_link_task);
-}
-
 /*
  * In order to fiddle with the
  * 'full-duplex' and '100Mbps' bits in the netconfig register, we
  * first have to put the transmit and/or receive logic in the idle state.
  */
 static void
-vr_link_task(void *arg, int pending)
+vr_miibus_statchg(device_t dev)
 {
 	struct vr_softc		*sc;
 	struct mii_data		*mii;
@@ -313,22 +302,25 @@
 	int			lfdx, mfdx;
 	uint8_t			cr0, cr1, fc;
 
-	sc = (struct vr_softc *)arg;
-
-	VR_LOCK(sc);
+	sc = device_get_softc(dev);
 	mii = device_get_softc(sc->vr_miibus);
 	ifp = sc->vr_ifp;
 	if (mii == NULL || ifp == NULL ||
-	    (ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
-		VR_UNLOCK(sc);
+	    (ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
 		return;
-	}
 
-	if (mii->mii_media_status & IFM_ACTIVE) {
-		if (IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE)
+	sc->vr_link = 0;
+	if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) ==
+	    (IFM_ACTIVE | IFM_AVALID)) {
+		switch (IFM_SUBTYPE(mii->mii_media_active)) {
+		case IFM_10_T:
+		case IFM_100_TX:
 			sc->vr_link = 1;
-	} else
-		sc->vr_link = 0;
+			break;
+		default:
+			break;
+		}
+	}
 
 	if (sc->vr_link != 0) {
 		cr0 = CSR_READ_1(sc, VR_CR0);
@@ -384,11 +376,8 @@
 			    "%s: Tx/Rx shutdown error -- resetting\n",
 			    __func__);
 			sc->vr_flags |= VR_F_RESTART;
-			VR_UNLOCK(sc);
-			return;
 		}
 	}
-	VR_UNLOCK(sc);
 }
 
 
@@ -621,7 +610,6 @@
 	mtx_init(&sc->vr_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
 	    MTX_DEF);
 	callout_init_mtx(&sc->vr_stat_callout, &sc->vr_mtx, 0);
-	TASK_INIT(&sc->vr_link_task, 0, vr_link_task, sc);
 	SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
 	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
 	    OID_AUTO, "stats", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
@@ -841,7 +829,6 @@
 		vr_stop(sc);
 		VR_UNLOCK(sc);
 		callout_drain(&sc->vr_stat_callout);
-		taskqueue_drain(taskqueue_swi, &sc->vr_link_task);
 		ether_ifdetach(ifp);
 	}
 	if (sc->vr_miibus)
@@ -1559,6 +1546,8 @@
 
 	mii = device_get_softc(sc->vr_miibus);
 	mii_tick(mii);
+	if (sc->vr_link == 0)
+		vr_miibus_statchg(sc->vr_dev);
 	vr_watchdog(sc);
 	callout_reset(&sc->vr_stat_callout, hz, vr_tick, sc);
 }
@@ -2161,6 +2150,10 @@
 	sc = ifp->if_softc;
 	mii = device_get_softc(sc->vr_miibus);
 	VR_LOCK(sc);
+	if ((ifp->if_flags & IFF_UP) == 0) {
+		VR_UNLOCK(sc);
+		return;
+	}
 	mii_pollstat(mii);
 	VR_UNLOCK(sc);
 	ifmr->ifm_active = mii->mii_media_active;

==== //depot/projects/pci/sys/dev/vr/if_vrreg.h#2 (text+ko) ====

@@ -29,7 +29,7 @@
  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/vr/if_vrreg.h,v 1.39 2010/10/15 14:52:11 marius Exp $
+ * $FreeBSD: src/sys/dev/vr/if_vrreg.h,v 1.40 2011/06/22 02:18:45 yongari Exp $
  */
 
 /*
@@ -723,7 +723,6 @@
 	uint8_t			vr_flags;	/* See VR_F_* below */
 #define	VR_F_RESTART		0x01		/* Restart unit on next tick */
 	int			vr_if_flags;
-	struct task		vr_link_task;
 	struct vr_chain_data	vr_cdata;
 	struct vr_ring_data	vr_rdata;
 	struct vr_statistics	vr_stat;

==== //depot/projects/pci/sys/dev/xl/if_xl.c#4 (text+ko) ====

@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/xl/if_xl.c,v 1.31 2011/05/07 04:40:44 yongari Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/xl/if_xl.c,v 1.34 2011/06/21 22:17:28 imp Exp $");
 
 /*
  * 3Com 3c90x Etherlink XL PCI NIC driver
@@ -334,7 +334,7 @@
  * only a finite amount of time to avoid getting caught in an
  * infinite loop. Normally this delay routine would be a macro,
  * but it isn't called during normal operation so we can afford
- * to make it a function.
+ * to make it a function.  Suppress warning when card gone.
  */
 static void
 xl_wait(struct xl_softc *sc)
@@ -346,7 +346,7 @@
 			break;
 	}
 
-	if (i == XL_TIMEOUT)
+	if (i == XL_TIMEOUT && bus_child_present(sc->xl_dev))
 		device_printf(sc->xl_dev, "command never completed!\n");
 }
 

==== //depot/projects/pci/sys/fs/nfsserver/nfs_nfsdserv.c#3 (text+ko) ====

@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/fs/nfsserver/nfs_nfsdserv.c,v 1.17 2011/04/14 23:46:15 rmacklem Exp $");
+__FBSDID("$FreeBSD: src/sys/fs/nfsserver/nfs_nfsdserv.c,v 1.19 2011/06/21 19:58:29 rmacklem Exp $");
 
 /*
  * nfs version 2, 3 and 4 server calls to vnode ops
@@ -172,11 +172,12 @@
 	fhandle_t fh;
 	int at_root = 0, error = 0, supports_nfsv4acls;
 	struct nfsreferral *refp;
-	nfsattrbit_t attrbits;
+	nfsattrbit_t attrbits, tmpbits;
 	struct mount *mp;
 	struct vnode *tvp = NULL;
 	struct vattr va;
 	uint64_t mounted_on_fileno = 0;
+	accmode_t accmode;
 
 	if (nd->nd_repstat)
 		return (0);
@@ -197,11 +198,20 @@
 			vput(vp);
 			return (0);
 		}
-		if (!nd->nd_repstat)
-			nd->nd_repstat = nfsvno_accchk(vp,
-			    VREAD_ATTRIBUTES,
-			    nd->nd_cred, exp, p, NFSACCCHK_NOOVERRIDE,
-			    NFSACCCHK_VPISLOCKED, NULL);
+		if (nd->nd_repstat == 0) {
+			accmode = 0;
+			NFSSET_ATTRBIT(&tmpbits, &attrbits);
+			if (NFSISSET_ATTRBIT(&tmpbits, NFSATTRBIT_ACL)) {
+				NFSCLRBIT_ATTRBIT(&tmpbits, NFSATTRBIT_ACL);
+				accmode |= VREAD_ACL;
+			}
+			if (NFSNONZERO_ATTRBIT(&tmpbits))
+				accmode |= VREAD_ATTRIBUTES;
+			if (accmode != 0)
+				nd->nd_repstat = nfsvno_accchk(vp, accmode,
+				    nd->nd_cred, exp, p, NFSACCCHK_NOOVERRIDE,
+				    NFSACCCHK_VPISLOCKED, NULL);
+		}
 	}
 	if (!nd->nd_repstat)
 		nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
@@ -454,7 +464,7 @@
 APPLESTATIC int
 nfsrvd_lookup(struct nfsrv_descript *nd, __unused int isdgram,
     vnode_t dp, vnode_t *vpp, fhandle_t *fhp, NFSPROC_T *p,
-    __unused struct nfsexstuff *exp)
+    struct nfsexstuff *exp)
 {
 	struct nameidata named;
 	vnode_t vp, dirp = NULL;
@@ -508,7 +518,15 @@
 		vrele(named.ni_startdir);
 	nfsvno_relpathbuf(&named);
 	vp = named.ni_vp;
-	nd->nd_repstat = nfsvno_getfh(vp, fhp, p);
+	if ((nd->nd_flag & ND_NFSV4) != 0 && !NFSVNO_EXPORTED(exp) &&
+	    vp->v_type != VDIR && vp->v_type != VLNK)
+		/*
+		 * Only allow lookup of VDIR and VLNK for traversal of
+		 * non-exported volumes during NFSv4 mounting.
+		 */
+		nd->nd_repstat = ENOENT;
+	if (nd->nd_repstat == 0)
+		nd->nd_repstat = nfsvno_getfh(vp, fhp, p);
 	if (!(nd->nd_flag & ND_NFSV4) && !nd->nd_repstat)
 		nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
 	if (vpp != NULL && nd->nd_repstat == 0)

==== //depot/projects/pci/sys/fs/nfsserver/nfs_nfsdsocket.c#3 (text+ko) ====

@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/fs/nfsserver/nfs_nfsdsocket.c,v 1.13 2011/05/27 22:05:10 rmacklem Exp $");
+__FBSDID("$FreeBSD: src/sys/fs/nfsserver/nfs_nfsdsocket.c,v 1.14 2011/06/20 21:57:26 rmacklem Exp $");
 
 /*
  * Socket operations for use by the nfs server.
@@ -786,6 +786,8 @@
 			    op != NFSV4OP_LOOKUP &&
 			    op != NFSV4OP_GETATTR &&
 			    op != NFSV4OP_GETFH &&
+			    op != NFSV4OP_ACCESS &&
+			    op != NFSV4OP_READLINK &&
 			    op != NFSV4OP_SECINFO)
 				nd->nd_repstat = NFSERR_NOFILEHANDLE;

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



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