Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 5 Feb 2015 12:21:06 +0000 (UTC)
From:      Garrett Cooper <ngie@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r278256 - in projects/building-blocks: etc/rc.d include lib/clang lib/csu/powerpc64 release share/examples sys/arm/broadcom/bcm2835 sys/arm/ti sys/boot/amd64/efi sys/boot/efi/include sy...
Message-ID:  <201502051221.t15CL67X092231@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ngie
Date: Thu Feb  5 12:21:05 2015
New Revision: 278256
URL: https://svnweb.freebsd.org/changeset/base/278256

Log:
  MFhead @ r278255

Modified:
  projects/building-blocks/etc/rc.d/Makefile
  projects/building-blocks/include/Makefile
  projects/building-blocks/lib/clang/clang.build.mk
  projects/building-blocks/lib/csu/powerpc64/Makefile
  projects/building-blocks/release/release.sh
  projects/building-blocks/share/examples/Makefile
  projects/building-blocks/sys/arm/broadcom/bcm2835/bcm2835_gpio.c
  projects/building-blocks/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c
  projects/building-blocks/sys/arm/ti/ti_gpio.c
  projects/building-blocks/sys/boot/amd64/efi/main.c
  projects/building-blocks/sys/boot/efi/include/efiapi.h
  projects/building-blocks/sys/cam/cam_ccb.h
  projects/building-blocks/sys/cam/cam_xpt.c
  projects/building-blocks/sys/cam/cam_xpt_internal.h
  projects/building-blocks/sys/cam/scsi/scsi_xpt.c
  projects/building-blocks/sys/conf/kern.mk
  projects/building-blocks/sys/conf/options
  projects/building-blocks/sys/dev/cxgbe/offload.h
  projects/building-blocks/sys/dev/ed/if_ed.c
  projects/building-blocks/sys/dev/iscsi/icl.h
  projects/building-blocks/sys/dev/iscsi/icl_soft.c
  projects/building-blocks/sys/dev/iscsi/iscsi.c
  projects/building-blocks/sys/dev/iscsi/iscsi_ioctl.h
  projects/building-blocks/sys/dev/sfxge/common/efsys.h
  projects/building-blocks/sys/dev/sfxge/sfxge.c
  projects/building-blocks/sys/dev/sfxge/sfxge.h
  projects/building-blocks/sys/dev/sfxge/sfxge_ev.c
  projects/building-blocks/sys/dev/sfxge/sfxge_mcdi.c
  projects/building-blocks/sys/dev/sfxge/sfxge_port.c
  projects/building-blocks/sys/dev/sfxge/sfxge_rx.c
  projects/building-blocks/sys/dev/sfxge/sfxge_tx.c
  projects/building-blocks/sys/dev/sfxge/sfxge_tx.h
  projects/building-blocks/sys/kern/init_main.c
  projects/building-blocks/sys/kern/kern_clock.c
  projects/building-blocks/sys/kern/kern_clocksource.c
  projects/building-blocks/sys/sys/cdefs.h
  projects/building-blocks/sys/sys/param.h
  projects/building-blocks/tools/build/mk/OptionalObsoleteFiles.inc
  projects/building-blocks/usr.bin/iscsictl/iscsi.conf.5
  projects/building-blocks/usr.bin/iscsictl/iscsictl.c
  projects/building-blocks/usr.bin/iscsictl/iscsictl.h
  projects/building-blocks/usr.bin/iscsictl/parse.y
  projects/building-blocks/usr.bin/iscsictl/token.l
  projects/building-blocks/usr.sbin/iscsid/iscsid.c
  projects/building-blocks/usr.sbin/iscsid/iscsid.h
  projects/building-blocks/usr.sbin/iscsid/login.c
Directory Properties:
  projects/building-blocks/   (props changed)
  projects/building-blocks/etc/   (props changed)
  projects/building-blocks/include/   (props changed)
  projects/building-blocks/share/   (props changed)
  projects/building-blocks/share/man/man4/   (props changed)
  projects/building-blocks/sys/   (props changed)
  projects/building-blocks/sys/boot/   (props changed)
  projects/building-blocks/sys/conf/   (props changed)

Modified: projects/building-blocks/etc/rc.d/Makefile
==============================================================================
--- projects/building-blocks/etc/rc.d/Makefile	Thu Feb  5 12:10:23 2015	(r278255)
+++ projects/building-blocks/etc/rc.d/Makefile	Thu Feb  5 12:21:05 2015	(r278256)
@@ -157,10 +157,6 @@ FILES+=		bootparams
 .endif
 
 .if ${MK_BSNMP} != "no"
-_bsnmpd=	bsnmpd
-.endif
-
-.if ${MK_BSNMP} != "no"
 FILES+=		bsnmpd
 .endif
 

Modified: projects/building-blocks/include/Makefile
==============================================================================
--- projects/building-blocks/include/Makefile	Thu Feb  5 12:10:23 2015	(r278255)
+++ projects/building-blocks/include/Makefile	Thu Feb  5 12:21:05 2015	(r278256)
@@ -106,7 +106,14 @@ INCS+=	hesiod.h
 .if ${MK_ICONV} == "yes"
 INCS+=		iconv.h
 .endif
-	
+
+.if ${MK_USB} != "no"
+LSUBDIRS+=	dev/usb
+.endif
+
+.if ${MACHINE_ARCH} == "powerpc" || ${MACHINE_ARCH} == "powerpc64"
+_dev_powermac_nvram=	dev/powermac_nvram
+.endif
 
 # Define SHARED to indicate whether you want symbolic links to the system
 # source (``symlinks''), or a separate copy (``copies'').  ``symlinks'' is

Modified: projects/building-blocks/lib/clang/clang.build.mk
==============================================================================
--- projects/building-blocks/lib/clang/clang.build.mk	Thu Feb  5 12:10:23 2015	(r278255)
+++ projects/building-blocks/lib/clang/clang.build.mk	Thu Feb  5 12:21:05 2015	(r278256)
@@ -35,6 +35,7 @@ CFLAGS+=	-DLLVM_DEFAULT_TARGET_TRIPLE=\"
 		-DLLVM_HOST_TRIPLE=\"${BUILD_TRIPLE}\" \
 		-DDEFAULT_SYSROOT=\"${TOOLS_PREFIX}\"
 CXXFLAGS+=	-std=c++11 -fno-exceptions -fno-rtti
+CXXFLAGS.clang+= -stdlib=libc++
 
 .PATH:	${LLVM_SRCS}/${SRCDIR}
 

Modified: projects/building-blocks/lib/csu/powerpc64/Makefile
==============================================================================
--- projects/building-blocks/lib/csu/powerpc64/Makefile	Thu Feb  5 12:10:23 2015	(r278255)
+++ projects/building-blocks/lib/csu/powerpc64/Makefile	Thu Feb  5 12:21:05 2015	(r278256)
@@ -9,6 +9,9 @@ CFLAGS+=	-I${.CURDIR}/../common \
 		-I${.CURDIR}/../../libc/include \
 		-mlongcall
 
+CC:=		gcc
+COMPILER_TYPE:=	gcc
+
 all: ${OBJS}
 
 CLEANFILES=	${OBJS}

Modified: projects/building-blocks/release/release.sh
==============================================================================
--- projects/building-blocks/release/release.sh	Thu Feb  5 12:10:23 2015	(r278255)
+++ projects/building-blocks/release/release.sh	Thu Feb  5 12:21:05 2015	(r278256)
@@ -1,6 +1,6 @@
 #!/bin/sh
 #-
-# Copyright (c) 2013, 2014 The FreeBSD Foundation
+# Copyright (c) 2013-2015 The FreeBSD Foundation
 # Copyright (c) 2013 Glen Barber
 # Copyright (c) 2011 Nathan Whitehorn
 # All rights reserved.

Modified: projects/building-blocks/share/examples/Makefile
==============================================================================
--- projects/building-blocks/share/examples/Makefile	Thu Feb  5 12:10:23 2015	(r278255)
+++ projects/building-blocks/share/examples/Makefile	Thu Feb  5 12:21:05 2015	(r278256)
@@ -188,6 +188,16 @@ XFILES+=	hast/ucarp.sh \
 		hast/vip-up.sh
 .endif
 
+.if ${MK_USB} != "no"
+LDIRS+=		libusb20
+XFILES+=	libusb20/Makefile \
+		libusb20/README \
+		libusb20/util.c \
+		libusb20/util.h \
+		libusb20/bulk.c \
+		libusb20/control.c
+.endif
+
 .if ${MACHINE_CPUARCH} == "amd64"
 .if ${MK_BHYVE} != "no"
 LDIRS+=		bhyve

Modified: projects/building-blocks/sys/arm/broadcom/bcm2835/bcm2835_gpio.c
==============================================================================
--- projects/building-blocks/sys/arm/broadcom/bcm2835/bcm2835_gpio.c	Thu Feb  5 12:10:23 2015	(r278255)
+++ projects/building-blocks/sys/arm/broadcom/bcm2835/bcm2835_gpio.c	Thu Feb  5 12:21:05 2015	(r278256)
@@ -31,26 +31,19 @@ __FBSDID("$FreeBSD$");
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/bus.h>
-
+#include <sys/gpio.h>
+#include <sys/interrupt.h>
 #include <sys/kernel.h>
-#include <sys/module.h>
-#include <sys/rman.h>
 #include <sys/lock.h>
+#include <sys/module.h>
 #include <sys/mutex.h>
-#include <sys/gpio.h>
+#include <sys/rman.h>
 #include <sys/sysctl.h>
 
 #include <machine/bus.h>
-#include <machine/cpu.h>
-#include <machine/cpufunc.h>
-#include <machine/resource.h>
-#include <machine/fdt.h>
-#include <machine/intr.h>
 
-#include <dev/fdt/fdt_common.h>
 #include <dev/gpio/gpiobusvar.h>
 #include <dev/ofw/ofw_bus.h>
-#include <dev/ofw/ofw_bus_subr.h>
 
 #include <arm/broadcom/bcm2835/bcm2835_gpio.h>
 
@@ -65,6 +58,7 @@ __FBSDID("$FreeBSD$");
 
 #define	BCM_GPIO_IRQS		4
 #define	BCM_GPIO_PINS		54
+#define	BCM_GPIO_PINS_PER_BANK	32
 #define	BCM_GPIO_DEFAULT_CAPS	(GPIO_PIN_INPUT | GPIO_PIN_OUTPUT |	\
     GPIO_PIN_PULLUP | GPIO_PIN_PULLDOWN)
 
@@ -89,12 +83,15 @@ struct bcm_gpio_softc {
 	struct resource *	sc_res[BCM_GPIO_IRQS + 1];
 	bus_space_tag_t		sc_bst;
 	bus_space_handle_t	sc_bsh;
-	void *			sc_intrhand;
+	void *			sc_intrhand[BCM_GPIO_IRQS];
 	int			sc_gpio_npins;
 	int			sc_ro_npins;
 	int			sc_ro_pins[BCM_GPIO_PINS];
 	struct gpio_pin		sc_gpio_pins[BCM_GPIO_PINS];
+	struct intr_event *	sc_events[BCM_GPIO_PINS];
 	struct bcm_gpio_sysctl	sc_sysctl[BCM_GPIO_PINS];
+	enum intr_trigger	sc_irq_trigger[BCM_GPIO_PINS];
+	enum intr_polarity	sc_irq_polarity[BCM_GPIO_PINS];
 };
 
 enum bcm_gpio_pud {
@@ -103,21 +100,35 @@ enum bcm_gpio_pud {
 	BCM_GPIO_PULLUP,
 };
 
-#define	BCM_GPIO_LOCK(_sc)	mtx_lock(&_sc->sc_mtx)
-#define	BCM_GPIO_UNLOCK(_sc)	mtx_unlock(&_sc->sc_mtx)
-#define	BCM_GPIO_LOCK_ASSERT(_sc)	mtx_assert(&_sc->sc_mtx, MA_OWNED)
-
-#define	BCM_GPIO_GPFSEL(_bank)	0x00 + _bank * 4
-#define	BCM_GPIO_GPSET(_bank)	0x1c + _bank * 4
-#define	BCM_GPIO_GPCLR(_bank)	0x28 + _bank * 4
-#define	BCM_GPIO_GPLEV(_bank)	0x34 + _bank * 4
-#define	BCM_GPIO_GPPUD(_bank)	0x94
-#define	BCM_GPIO_GPPUDCLK(_bank)	0x98 + _bank * 4
-
+#define	BCM_GPIO_LOCK(_sc)	mtx_lock_spin(&(_sc)->sc_mtx)
+#define	BCM_GPIO_UNLOCK(_sc)	mtx_unlock_spin(&(_sc)->sc_mtx)
+#define	BCM_GPIO_LOCK_ASSERT(_sc)	mtx_assert(&(_sc)->sc_mtx, MA_OWNED)
 #define	BCM_GPIO_WRITE(_sc, _off, _val)		\
-    bus_space_write_4(_sc->sc_bst, _sc->sc_bsh, _off, _val)
+    bus_space_write_4((_sc)->sc_bst, (_sc)->sc_bsh, _off, _val)
 #define	BCM_GPIO_READ(_sc, _off)		\
-    bus_space_read_4(_sc->sc_bst, _sc->sc_bsh, _off)
+    bus_space_read_4((_sc)->sc_bst, (_sc)->sc_bsh, _off)
+#define	BCM_GPIO_CLEAR_BITS(_sc, _off, _bits)	\
+    BCM_GPIO_WRITE(_sc, _off, BCM_GPIO_READ(_sc, _off) & ~(_bits))
+#define	BCM_GPIO_SET_BITS(_sc, _off, _bits)	\
+    BCM_GPIO_WRITE(_sc, _off, BCM_GPIO_READ(_sc, _off) | _bits)
+#define	BCM_GPIO_BANK(a)	(a / BCM_GPIO_PINS_PER_BANK)
+#define	BCM_GPIO_MASK(a)	(1U << (a % BCM_GPIO_PINS_PER_BANK))
+
+#define	BCM_GPIO_GPFSEL(_bank)	(0x00 + _bank * 4)	/* Function Select */
+#define	BCM_GPIO_GPSET(_bank)	(0x1c + _bank * 4)	/* Pin Out Set */
+#define	BCM_GPIO_GPCLR(_bank)	(0x28 + _bank * 4)	/* Pin Out Clear */
+#define	BCM_GPIO_GPLEV(_bank)	(0x34 + _bank * 4)	/* Pin Level */
+#define	BCM_GPIO_GPEDS(_bank)	(0x40 + _bank * 4)	/* Event Status */
+#define	BCM_GPIO_GPREN(_bank)	(0x4c + _bank * 4)	/* Rising Edge irq */
+#define	BCM_GPIO_GPFEN(_bank)	(0x58 + _bank * 4)	/* Falling Edge irq */
+#define	BCM_GPIO_GPHEN(_bank)	(0x64 + _bank * 4)	/* High Level irq */
+#define	BCM_GPIO_GPLEN(_bank)	(0x70 + _bank * 4)	/* Low Level irq */
+#define	BCM_GPIO_GPAREN(_bank)	(0x7c + _bank * 4)	/* Async Rising Edge */
+#define	BCM_GPIO_GPAFEN(_bank)	(0x88 + _bank * 4)	/* Async Falling Egde */
+#define	BCM_GPIO_GPPUD(_bank)	(0x94)			/* Pin Pull up/down */
+#define	BCM_GPIO_GPPUDCLK(_bank) (0x98 + _bank * 4)	/* Pin Pull up clock */
+
+static struct bcm_gpio_softc *bcm_gpio_sc = NULL;
 
 static int
 bcm_gpio_pin_is_ro(struct bcm_gpio_softc *sc, int pin)
@@ -665,6 +676,40 @@ bcm_gpio_get_reserved_pins(struct bcm_gp
 }
 
 static int
+bcm_gpio_intr(void *arg)
+{
+	int bank_last, irq;
+	struct bcm_gpio_softc *sc;
+	struct intr_event *event;
+	uint32_t bank, mask, reg;
+
+	sc = (struct bcm_gpio_softc *)arg;
+	reg = 0;
+	bank_last = -1;
+	for (irq = 0; irq < BCM_GPIO_PINS; irq++) {
+		bank = BCM_GPIO_BANK(irq);
+		mask = BCM_GPIO_MASK(irq);
+		if (bank != bank_last) {
+			reg = BCM_GPIO_READ(sc, BCM_GPIO_GPEDS(bank));
+			bank_last = bank;
+		}
+		if (reg & mask) {
+			event = sc->sc_events[irq];
+			if (event != NULL && !TAILQ_EMPTY(&event->ie_handlers))
+				intr_event_handle(event, NULL);
+			else {
+				device_printf(sc->sc_dev, "Stray IRQ %d\n",
+				    irq);
+			}
+			/* Clear the Status bit by writing '1' to it. */
+			BCM_GPIO_WRITE(sc, BCM_GPIO_GPEDS(bank), mask);
+		}
+	}
+
+	return (FILTER_HANDLED);
+}
+
+static int
 bcm_gpio_probe(device_t dev)
 {
 
@@ -679,6 +724,39 @@ bcm_gpio_probe(device_t dev)
 }
 
 static int
+bcm_gpio_intr_attach(device_t dev)
+{
+	struct bcm_gpio_softc *sc;
+	int i;
+
+	sc = device_get_softc(dev);
+	for (i = 0; i < BCM_GPIO_IRQS; i++) {
+		if (bus_setup_intr(dev, sc->sc_res[i + 1],
+		    INTR_TYPE_MISC | INTR_MPSAFE, bcm_gpio_intr,
+		    NULL, sc, &sc->sc_intrhand[i]) != 0) {
+			return (-1);
+		}
+	}
+
+	return (0);
+}
+
+static void
+bcm_gpio_intr_detach(device_t dev)
+{
+	struct bcm_gpio_softc *sc;
+	int i;
+
+	sc = device_get_softc(dev);
+	for (i = 0; i < BCM_GPIO_IRQS; i++) {
+		if (sc->sc_intrhand[i]) {
+			bus_teardown_intr(dev, sc->sc_res[i + 1],
+			    sc->sc_intrhand[i]);
+		}
+	}
+}
+
+static int
 bcm_gpio_attach(device_t dev)
 {
 	int i, j;
@@ -686,30 +764,34 @@ bcm_gpio_attach(device_t dev)
 	struct bcm_gpio_softc *sc;
 	uint32_t func;
 
- 	sc = device_get_softc(dev);
-	sc->sc_dev = dev;
-	mtx_init(&sc->sc_mtx, "bcm gpio", "gpio", MTX_DEF);
+	if (bcm_gpio_sc != NULL)
+		return (ENXIO);
+
+	bcm_gpio_sc = sc = device_get_softc(dev);
+ 	sc->sc_dev = dev;
+	mtx_init(&sc->sc_mtx, "bcm gpio", "gpio", MTX_SPIN);
 	if (bus_alloc_resources(dev, bcm_gpio_res_spec, sc->sc_res) != 0) {
 		device_printf(dev, "cannot allocate resources\n");
 		goto fail;
 	}
 	sc->sc_bst = rman_get_bustag(sc->sc_res[0]);
 	sc->sc_bsh = rman_get_bushandle(sc->sc_res[0]);
-
+	/* Setup the GPIO interrupt handler. */
+	if (bcm_gpio_intr_attach(dev)) {
+		device_printf(dev, "unable to setup the gpio irq handler\n");
+		goto fail;
+	}
 	/* Find our node. */
 	gpio = ofw_bus_get_node(sc->sc_dev);
-
 	if (!OF_hasprop(gpio, "gpio-controller"))
 		/* Node is not a GPIO controller. */
 		goto fail;
-
 	/*
 	 * Find the read-only pins.  These are pins we never touch or bad
 	 * things could happen.
 	 */
 	if (bcm_gpio_get_reserved_pins(sc) == -1)
 		goto fail;
-
 	/* Initialize the software controlled pins. */
 	for (i = 0, j = 0; j < BCM_GPIO_PINS; j++) {
 		snprintf(sc->sc_gpio_pins[i].gp_name, GPIOMAXNAME,
@@ -718,6 +800,9 @@ bcm_gpio_attach(device_t dev)
 		sc->sc_gpio_pins[i].gp_pin = j;
 		sc->sc_gpio_pins[i].gp_caps = BCM_GPIO_DEFAULT_CAPS;
 		sc->sc_gpio_pins[i].gp_flags = bcm_gpio_func_flag(func);
+		/* The default is active-low interrupts. */
+		sc->sc_irq_trigger[i] = INTR_TRIGGER_LEVEL;
+		sc->sc_irq_polarity[i] = INTR_POLARITY_LOW;
 		i++;
 	}
 	sc->sc_gpio_npins = i;
@@ -729,6 +814,7 @@ bcm_gpio_attach(device_t dev)
 	return (0);
 
 fail:
+	bcm_gpio_intr_detach(dev);
 	bus_release_resources(dev, bcm_gpio_res_spec, sc->sc_res);
 	mtx_destroy(&sc->sc_mtx);
 
@@ -742,6 +828,177 @@ bcm_gpio_detach(device_t dev)
 	return (EBUSY);
 }
 
+static uint32_t
+bcm_gpio_intr_reg(struct bcm_gpio_softc *sc, unsigned int irq, uint32_t bank)
+{
+
+	if (irq > BCM_GPIO_PINS)
+		return (0);
+	if (sc->sc_irq_trigger[irq] == INTR_TRIGGER_LEVEL) {
+		if (sc->sc_irq_polarity[irq] == INTR_POLARITY_LOW)
+			return (BCM_GPIO_GPLEN(bank));
+		else if (sc->sc_irq_polarity[irq] == INTR_POLARITY_HIGH)
+			return (BCM_GPIO_GPHEN(bank));
+	} else if (sc->sc_irq_trigger[irq] == INTR_TRIGGER_EDGE) {
+		if (sc->sc_irq_polarity[irq] == INTR_POLARITY_LOW)
+			return (BCM_GPIO_GPFEN(bank));
+		else if (sc->sc_irq_polarity[irq] == INTR_POLARITY_HIGH)
+			return (BCM_GPIO_GPREN(bank));
+	}
+
+	return (0);
+}
+
+static void
+bcm_gpio_mask_irq(void *source)
+{
+	uint32_t bank, mask, reg;
+	unsigned int irq;
+
+	irq = (unsigned int)source;
+	if (irq > BCM_GPIO_PINS)
+		return;
+	if (bcm_gpio_pin_is_ro(bcm_gpio_sc, irq))
+		return;
+	bank = BCM_GPIO_BANK(irq);
+	mask = BCM_GPIO_MASK(irq);
+	BCM_GPIO_LOCK(bcm_gpio_sc);
+	reg = bcm_gpio_intr_reg(bcm_gpio_sc, irq, bank);
+	if (reg != 0)
+		BCM_GPIO_CLEAR_BITS(bcm_gpio_sc, reg, mask);
+	BCM_GPIO_UNLOCK(bcm_gpio_sc);
+}
+
+static void
+bcm_gpio_unmask_irq(void *source)
+{
+	uint32_t bank, mask, reg;
+	unsigned int irq;
+
+	irq = (unsigned int)source;
+	if (irq > BCM_GPIO_PINS)
+		return;
+	if (bcm_gpio_pin_is_ro(bcm_gpio_sc, irq))
+		return;
+	bank = BCM_GPIO_BANK(irq);
+	mask = BCM_GPIO_MASK(irq);
+	BCM_GPIO_LOCK(bcm_gpio_sc);
+	reg = bcm_gpio_intr_reg(bcm_gpio_sc, irq, bank);
+	if (reg != 0)
+		BCM_GPIO_SET_BITS(bcm_gpio_sc, reg, mask);
+	BCM_GPIO_UNLOCK(bcm_gpio_sc);
+}
+
+static int
+bcm_gpio_activate_resource(device_t bus, device_t child, int type, int rid,
+	struct resource *res)
+{
+	int pin;
+
+	if (type != SYS_RES_IRQ)
+		return (ENXIO);
+	/* Unmask the interrupt. */
+	pin = rman_get_start(res);
+	bcm_gpio_unmask_irq((void *)pin);
+
+	return (0);
+}
+
+static int
+bcm_gpio_deactivate_resource(device_t bus, device_t child, int type, int rid,
+	struct resource *res)
+{
+	int pin;
+
+	if (type != SYS_RES_IRQ)
+		return (ENXIO);
+	/* Mask the interrupt. */
+	pin = rman_get_start(res);
+	bcm_gpio_mask_irq((void *)pin);
+
+	return (0);
+}
+
+static int
+bcm_gpio_config_intr(device_t dev, int irq, enum intr_trigger trig,
+	enum intr_polarity pol)
+{
+	int bank;
+	struct bcm_gpio_softc *sc;
+	uint32_t mask, oldreg, reg;
+
+	if (irq > BCM_GPIO_PINS)
+		return (EINVAL);
+	/* There is no standard trigger or polarity. */
+	if (trig == INTR_TRIGGER_CONFORM || pol == INTR_POLARITY_CONFORM)
+		return (EINVAL);
+	sc = device_get_softc(dev);
+	if (bcm_gpio_pin_is_ro(sc, irq))
+		return (EINVAL);
+	bank = BCM_GPIO_BANK(irq);
+	mask = BCM_GPIO_MASK(irq);
+	BCM_GPIO_LOCK(sc);
+	oldreg = bcm_gpio_intr_reg(sc, irq, bank);
+	sc->sc_irq_trigger[irq] = trig;
+	sc->sc_irq_polarity[irq] = pol;
+	reg = bcm_gpio_intr_reg(sc, irq, bank);
+	if (reg != 0)
+		BCM_GPIO_SET_BITS(sc, reg, mask);
+	if (reg != oldreg && oldreg != 0)
+		BCM_GPIO_CLEAR_BITS(sc, oldreg, mask);
+	BCM_GPIO_UNLOCK(sc);
+
+	return (0);
+}
+
+static int
+bcm_gpio_setup_intr(device_t bus, device_t child, struct resource *ires,
+	int flags, driver_filter_t *filt, driver_intr_t *handler,
+	void *arg, void **cookiep)
+{
+	struct bcm_gpio_softc *sc;
+	struct intr_event *event;
+	int pin, error;
+
+	sc = device_get_softc(bus);
+	pin = rman_get_start(ires);
+	if (pin > BCM_GPIO_PINS)
+		panic("%s: bad pin %d", __func__, pin);
+	event = sc->sc_events[pin];
+	if (event == NULL) {
+		error = intr_event_create(&event, (void *)pin, 0, pin, 
+		    bcm_gpio_mask_irq, bcm_gpio_unmask_irq, NULL, NULL,
+		    "gpio%d pin%d:", device_get_unit(bus), pin);
+		if (error != 0)
+			return (error);
+		sc->sc_events[pin] = event;
+	}
+	intr_event_add_handler(event, device_get_nameunit(child), filt,
+	    handler, arg, intr_priority(flags), flags, cookiep);
+
+	return (0);
+}
+
+static int
+bcm_gpio_teardown_intr(device_t dev, device_t child, struct resource *ires,
+	void *cookie)
+{
+	struct bcm_gpio_softc *sc;
+	int pin, err;
+
+	sc = device_get_softc(dev);
+	pin = rman_get_start(ires);
+	if (pin > BCM_GPIO_PINS)
+		panic("%s: bad pin %d", __func__, pin);
+	if (sc->sc_events[pin] == NULL)
+		panic("Trying to teardown unoccupied IRQ");
+	err = intr_event_remove_handler(cookie);
+	if (!err)
+		sc->sc_events[pin] = NULL;
+
+	return (err);
+}
+
 static phandle_t
 bcm_gpio_get_node(device_t bus, device_t dev)
 {
@@ -767,6 +1024,13 @@ static device_method_t bcm_gpio_methods[
 	DEVMETHOD(gpio_pin_set,		bcm_gpio_pin_set),
 	DEVMETHOD(gpio_pin_toggle,	bcm_gpio_pin_toggle),
 
+	/* Bus interface */
+	DEVMETHOD(bus_activate_resource,	bcm_gpio_activate_resource),
+	DEVMETHOD(bus_deactivate_resource,	bcm_gpio_deactivate_resource),
+	DEVMETHOD(bus_config_intr,	bcm_gpio_config_intr),
+	DEVMETHOD(bus_setup_intr,	bcm_gpio_setup_intr),
+	DEVMETHOD(bus_teardown_intr,	bcm_gpio_teardown_intr),
+
 	/* ofw_bus interface */
 	DEVMETHOD(ofw_bus_get_node,	bcm_gpio_get_node),
 

Modified: projects/building-blocks/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c
==============================================================================
--- projects/building-blocks/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c	Thu Feb  5 12:10:23 2015	(r278255)
+++ projects/building-blocks/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c	Thu Feb  5 12:21:05 2015	(r278256)
@@ -29,32 +29,17 @@ __FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
 #include <sys/systm.h>
-#include <sys/bio.h>
 #include <sys/bus.h>
-#include <sys/conf.h>
-#include <sys/endian.h>
 #include <sys/kernel.h>
-#include <sys/kthread.h>
 #include <sys/lock.h>
 #include <sys/malloc.h>
 #include <sys/module.h>
 #include <sys/mutex.h>
-#include <sys/queue.h>
-#include <sys/resource.h>
 #include <sys/rman.h>
 #include <sys/sysctl.h>
 #include <sys/taskqueue.h>
-#include <sys/time.h>
-#include <sys/timetc.h>
-#include <sys/watchdog.h>
-
-#include <sys/kdb.h>
 
 #include <machine/bus.h>
-#include <machine/cpu.h>
-#include <machine/cpufunc.h>
-#include <machine/resource.h>
-#include <machine/intr.h>
 
 #include <dev/fdt/fdt_common.h>
 #include <dev/ofw/ofw_bus.h>
@@ -82,19 +67,9 @@ __FBSDID("$FreeBSD$");
 #define dprintf(fmt, args...)
 #endif
 
-/* 
- * Arasan HC seems to have problem with Data CRC on lower frequencies.
- * Use this tunable to cap initialization sequence frequency at higher
- * value.  Default is standard 400kHz.
- * HS mode brings too many problems for most of cards, so disable HS mode
- * until a better fix comes up.
- * HS mode still can be enabled with the tunable.
- */
-static int bcm2835_sdhci_min_freq = 400000;
 static int bcm2835_sdhci_hs = 1;
 static int bcm2835_sdhci_pio_mode = 0;
 
-TUNABLE_INT("hw.bcm2835.sdhci.min_freq", &bcm2835_sdhci_min_freq);
 TUNABLE_INT("hw.bcm2835.sdhci.hs", &bcm2835_sdhci_hs);
 TUNABLE_INT("hw.bcm2835.sdhci.pio_mode", &bcm2835_sdhci_pio_mode);
 
@@ -211,16 +186,12 @@ bcm_sdhci_attach(device_t dev)
 	    RF_ACTIVE);
 	if (!sc->sc_irq_res) {
 		device_printf(dev, "cannot allocate interrupt\n");
-		bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res);
 		err = ENXIO;
 		goto fail;
 	}
 
 	if (bus_setup_intr(dev, sc->sc_irq_res, INTR_TYPE_BIO | INTR_MPSAFE,
-	    NULL, bcm_sdhci_intr, sc, &sc->sc_intrhand))
-	{
-		bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res);
-		bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_irq_res);
+	    NULL, bcm_sdhci_intr, sc, &sc->sc_intrhand)) {
 		device_printf(dev, "cannot setup interrupt handler\n");
 		err = ENXIO;
 		goto fail;
@@ -286,6 +257,7 @@ fail:
 		bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_irq_res);
 	if (sc->sc_mem_res)
 		bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res);
+	mtx_destroy(&sc->sc_mtx);
 
 	return (err);
 }
@@ -422,13 +394,6 @@ bcm_sdhci_write_multi_4(device_t dev, st
 	bus_space_write_multi_4(sc->sc_bst, sc->sc_bsh, off, data, count);
 }
 
-static uint32_t
-bcm_sdhci_min_freq(device_t dev, struct sdhci_slot *slot)
-{
-
-	return bcm2835_sdhci_min_freq;
-}
-
 static void
 bcm_sdhci_start_dma_seg(struct bcm_sdhci_softc *sc)
 {
@@ -681,7 +646,6 @@ static device_method_t bcm_sdhci_methods
 	DEVMETHOD(mmcbr_acquire_host,	sdhci_generic_acquire_host),
 	DEVMETHOD(mmcbr_release_host,	sdhci_generic_release_host),
 
-	DEVMETHOD(sdhci_min_freq,	bcm_sdhci_min_freq),
 	/* Platform transfer methods */
 	DEVMETHOD(sdhci_platform_will_handle,		bcm_sdhci_will_handle_transfer),
 	DEVMETHOD(sdhci_platform_start_transfer,	bcm_sdhci_start_transfer),

Modified: projects/building-blocks/sys/arm/ti/ti_gpio.c
==============================================================================
--- projects/building-blocks/sys/arm/ti/ti_gpio.c	Thu Feb  5 12:10:23 2015	(r278255)
+++ projects/building-blocks/sys/arm/ti/ti_gpio.c	Thu Feb  5 12:21:05 2015	(r278256)
@@ -1004,7 +1004,7 @@ ti_gpio_config_intr(device_t dev, int ir
 		val |= TI_GPIO_MASK(irq);
 		ti_gpio_write_4(sc, TI_GPIO_BANK(irq), reg, val);
 	}
-	if (oldreg != 0) {
+	if (reg != oldreg && oldreg != 0) {
 		/* Remove the old settings. */
 		val = ti_gpio_read_4(sc, TI_GPIO_BANK(irq), oldreg);
 		val &= ~TI_GPIO_MASK(irq);

Modified: projects/building-blocks/sys/boot/amd64/efi/main.c
==============================================================================
--- projects/building-blocks/sys/boot/amd64/efi/main.c	Thu Feb  5 12:10:23 2015	(r278255)
+++ projects/building-blocks/sys/boot/amd64/efi/main.c	Thu Feb  5 12:21:05 2015	(r278256)
@@ -53,6 +53,10 @@ EFI_GUID imgid = LOADED_IMAGE_PROTOCOL;
 EFI_GUID mps = MPS_TABLE_GUID;
 EFI_GUID netid = EFI_SIMPLE_NETWORK_PROTOCOL;
 EFI_GUID smbios = SMBIOS_TABLE_GUID;
+EFI_GUID dxe = DXE_SERVICES_TABLE_GUID;
+EFI_GUID hoblist = HOB_LIST_TABLE_GUID;
+EFI_GUID memtype = MEMORY_TYPE_INFORMATION_TABLE_GUID;
+EFI_GUID debugimg = DEBUG_IMAGE_INFO_TABLE_GUID;
 
 EFI_STATUS
 main(int argc, CHAR16 *argv[])
@@ -264,6 +268,14 @@ command_configuration(int argc, char *ar
 			printf("ACPI 2.0 Table");
 		else if (!memcmp(guid, &smbios, sizeof(EFI_GUID)))
 			printf("SMBIOS Table");
+		else if (!memcmp(guid, &dxe, sizeof(EFI_GUID)))
+			printf("DXE Table");
+		else if (!memcmp(guid, &hoblist, sizeof(EFI_GUID)))
+			printf("HOB List Table");
+		else if (!memcmp(guid, &memtype, sizeof(EFI_GUID)))
+			printf("Memory Type Information Table");
+		else if (!memcmp(guid, &debugimg, sizeof(EFI_GUID)))
+			printf("Debug Image Info Table");
 		else
 			printf("Unknown Table (%s)", guid_to_string(guid));
 		printf(" at %p\n", ST->ConfigurationTable[i].VendorTable);
@@ -319,7 +331,7 @@ command_mode(int argc, char *argv[])
 	}
 
 	if (i != 0)
-		printf("Choose the mode with \"col <mode number>\"\n");	
+		printf("Choose the mode with \"col <mode number>\"\n");
 
 	return (CMD_OK);
 }

Modified: projects/building-blocks/sys/boot/efi/include/efiapi.h
==============================================================================
--- projects/building-blocks/sys/boot/efi/include/efiapi.h	Thu Feb  5 12:10:23 2015	(r278255)
+++ projects/building-blocks/sys/boot/efi/include/efiapi.h	Thu Feb  5 12:21:05 2015	(r278256)
@@ -88,7 +88,7 @@ EFI_STATUS
     IN VOID                         *Buffer
     );
 
-typedef 
+typedef
 EFI_STATUS
 (EFIAPI *EFI_SET_VIRTUAL_ADDRESS_MAP) (
     IN UINTN                        MemoryMapSize,
@@ -103,7 +103,7 @@ EFI_STATUS
 #define EFI_INTERNAL_PTR            0x00000004      // Pointer to internal runtime data
 
 
-typedef 
+typedef
 EFI_STATUS
 (EFIAPI *EFI_CONVERT_POINTER) (
     IN UINTN                        DebugDisposition,
@@ -168,7 +168,7 @@ EFI_STATUS
     IN EFI_EVENT                Event
     );
 
-typedef 
+typedef
 EFI_STATUS
 (EFIAPI *EFI_WAIT_FOR_EVENT) (
     IN UINTN                    NumberOfEvents,
@@ -194,8 +194,8 @@ EFI_STATUS
 
 #define TPL_APPLICATION    4
 #define TPL_CALLBACK       8
-#define TPL_NOTIFY        16 
-#define TPL_HIGH_LEVEL    31 
+#define TPL_NOTIFY        16
+#define TPL_HIGH_LEVEL    31
 
 typedef
 EFI_TPL
@@ -320,14 +320,14 @@ EFI_STATUS
 
 // Image Entry prototype
 
-typedef 
+typedef
 EFI_STATUS
 (EFIAPI *EFI_IMAGE_ENTRY_POINT) (
     IN EFI_HANDLE                   ImageHandle,
     IN struct _EFI_SYSTEM_TABLE     *SystemTable
     );
 
-typedef 
+typedef
 EFI_STATUS
 (EFIAPI *EFI_IMAGE_LOAD) (
     IN BOOLEAN                      BootPolicy,
@@ -338,7 +338,7 @@ EFI_STATUS
     OUT EFI_HANDLE                  *ImageHandle
     );
 
-typedef 
+typedef
 EFI_STATUS
 (EFIAPI *EFI_IMAGE_START) (
     IN EFI_HANDLE                   ImageHandle,
@@ -355,7 +355,7 @@ EFI_STATUS
     IN CHAR16                       *ExitData OPTIONAL
     );
 
-typedef 
+typedef
 EFI_STATUS
 (EFIAPI *EFI_IMAGE_UNLOAD) (
     IN EFI_HANDLE                   ImageHandle
@@ -491,7 +491,7 @@ EFI_STATUS
     );
 
 typedef
-EFI_STATUS 
+EFI_STATUS
 (EFIAPI *EFI_REGISTER_PROTOCOL_NOTIFY) (
     IN EFI_GUID                 *Protocol,
     IN EFI_EVENT                Event,
@@ -535,7 +535,7 @@ EFI_STATUS
     );
 
 typedef
-EFI_STATUS 
+EFI_STATUS
 (EFIAPI *EFI_CONNECT_CONTROLLER) (
   IN  EFI_HANDLE                    ControllerHandle,
   IN  EFI_HANDLE                    *DriverImageHandle    OPTIONAL,
@@ -544,19 +544,19 @@ EFI_STATUS 
   );
 
 typedef
-EFI_STATUS 
+EFI_STATUS
 (EFIAPI *EFI_DISCONNECT_CONTROLLER)(
   IN EFI_HANDLE           ControllerHandle,
   IN EFI_HANDLE           DriverImageHandle, OPTIONAL
   IN EFI_HANDLE           ChildHandle        OPTIONAL
-  );    
+  );
 
-#define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL	 0x00000001  
-#define EFI_OPEN_PROTOCOL_GET_PROTOCOL	       0x00000002  
-#define EFI_OPEN_PROTOCOL_TEST_PROTOCOL        0x00000004  
-#define EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER  0x00000008  
-#define EFI_OPEN_PROTOCOL_BY_DRIVER            0x00000010  
-#define EFI_OPEN_PROTOCOL_EXCLUSIVE            0x00000020  
+#define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL	 0x00000001
+#define EFI_OPEN_PROTOCOL_GET_PROTOCOL	       0x00000002
+#define EFI_OPEN_PROTOCOL_TEST_PROTOCOL        0x00000004
+#define EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER  0x00000008
+#define EFI_OPEN_PROTOCOL_BY_DRIVER            0x00000010
+#define EFI_OPEN_PROTOCOL_EXCLUSIVE            0x00000020
 
 typedef
 EFI_STATUS
@@ -804,7 +804,7 @@ typedef struct {
   //
   EFI_PROTOCOLS_PER_HANDLE        ProtocolsPerHandle;
   EFI_LOCATE_HANDLE_BUFFER        LocateHandleBuffer;
-  EFI_LOCATE_PROTOCOL             LocateProtocol;    
+  EFI_LOCATE_PROTOCOL             LocateProtocol;
 
   EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES    InstallMultipleProtocolInterfaces;
   EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES  UninstallMultipleProtocolInterfaces;
@@ -845,6 +845,18 @@ typedef struct {
 #define FDT_TABLE_GUID    \
   { 0xb1b621d5, 0xf19c, 0x41a5, 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0 }
 
+#define DXE_SERVICES_TABLE_GUID	\
+  { 0x5ad34ba, 0x6f02, 0x4214, 0x95, 0x2e, 0x4d, 0xa0, 0x39, 0x8e, 0x2b, 0xb9 }
+
+#define	HOB_LIST_TABLE_GUID	\
+  { 0x7739f24c, 0x93d7, 0x11d4, 0x9a, 0x3a, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d }
+
+#define MEMORY_TYPE_INFORMATION_TABLE_GUID \
+  { 0x4c19049f, 0x4137, 0x4dd3, 0x9c, 0x10, 0x8b, 0x97, 0xa8, 0x3f, 0xfd, 0xfa }
+
+#define DEBUG_IMAGE_INFO_TABLE_GUID \
+  { 0x49152e77, 0x1ada, 0x4764, 0xb7, 0xa2, 0x7a, 0xfe, 0xfe, 0xd9, 0x5e, 0x8b }
+
 typedef struct _EFI_CONFIGURATION_TABLE {
   EFI_GUID                VendorGuid;
   VOID                    *VendorTable;

Modified: projects/building-blocks/sys/cam/cam_ccb.h
==============================================================================
--- projects/building-blocks/sys/cam/cam_ccb.h	Thu Feb  5 12:10:23 2015	(r278255)
+++ projects/building-blocks/sys/cam/cam_ccb.h	Thu Feb  5 12:21:05 2015	(r278256)
@@ -1147,6 +1147,7 @@ struct ccb_dev_advinfo {
 #define	CDAI_TYPE_SERIAL_NUM	2
 #define	CDAI_TYPE_PHYS_PATH	3
 #define	CDAI_TYPE_RCAPLONG	4
+#define	CDAI_TYPE_EXT_INQ	5
 	off_t bufsiz;			/* IN: Size of external buffer */
 #define	CAM_SCSI_DEVID_MAXLEN	65536	/* length in buffer is an uint16_t */
 	off_t provsiz;			/* OUT: Size required/used */

Modified: projects/building-blocks/sys/cam/cam_xpt.c
==============================================================================
--- projects/building-blocks/sys/cam/cam_xpt.c	Thu Feb  5 12:10:23 2015	(r278255)
+++ projects/building-blocks/sys/cam/cam_xpt.c	Thu Feb  5 12:21:05 2015	(r278256)
@@ -4795,6 +4795,7 @@ xpt_release_device(struct cam_ed *device
 	 */
 	free(device->supported_vpds, M_CAMXPT);
 	free(device->device_id, M_CAMXPT);
+	free(device->ext_inq, M_CAMXPT);
 	free(device->physpath, M_CAMXPT);
 	free(device->rcap_buf, M_CAMXPT);
 	free(device->serial_num, M_CAMXPT);

Modified: projects/building-blocks/sys/cam/cam_xpt_internal.h
==============================================================================
--- projects/building-blocks/sys/cam/cam_xpt_internal.h	Thu Feb  5 12:10:23 2015	(r278255)
+++ projects/building-blocks/sys/cam/cam_xpt_internal.h	Thu Feb  5 12:21:05 2015	(r278256)
@@ -83,6 +83,8 @@ struct cam_ed {
 	uint8_t		 supported_vpds_len;
 	uint32_t	 device_id_len;
 	uint8_t		 *device_id;
+	uint32_t	 ext_inq_len;
+	uint8_t		 *ext_inq;
 	uint8_t		 physpath_len;
 	uint8_t		 *physpath;	/* physical path string form */
 	uint32_t	 rcap_len;

Modified: projects/building-blocks/sys/cam/scsi/scsi_xpt.c
==============================================================================
--- projects/building-blocks/sys/cam/scsi/scsi_xpt.c	Thu Feb  5 12:10:23 2015	(r278255)
+++ projects/building-blocks/sys/cam/scsi/scsi_xpt.c	Thu Feb  5 12:21:05 2015	(r278256)
@@ -139,6 +139,7 @@ typedef enum {
 	PROBE_MODE_SENSE,
 	PROBE_SUPPORTED_VPD_LIST,
 	PROBE_DEVICE_ID,
+	PROBE_EXTENDED_INQUIRY,
 	PROBE_SERIAL_NUM,
 	PROBE_TUR_FOR_NEGOTIATION,
 	PROBE_INQUIRY_BASIC_DV1,
@@ -156,6 +157,7 @@ static char *probe_action_text[] = {
 	"PROBE_MODE_SENSE",
 	"PROBE_SUPPORTED_VPD_LIST",
 	"PROBE_DEVICE_ID",
+	"PROBE_EXTENDED_INQUIRY",
 	"PROBE_SERIAL_NUM",
 	"PROBE_TUR_FOR_NEGOTIATION",
 	"PROBE_INQUIRY_BASIC_DV1",
@@ -923,6 +925,34 @@ done:
 		}
 		goto done;
 	}
+	case PROBE_EXTENDED_INQUIRY:
+	{
+		struct scsi_vpd_extended_inquiry_data *ext_inq;
+
+		ext_inq = NULL;
+		if (scsi_vpd_supported_page(periph, SVPD_EXTENDED_INQUIRY_DATA))
+			ext_inq = malloc(sizeof(*ext_inq), M_CAMXPT,
+			    M_NOWAIT | M_ZERO);
+
+		if (ext_inq != NULL) {
+			scsi_inquiry(csio,
+				     /*retries*/4,
+				     probedone,
+				     MSG_SIMPLE_Q_TAG,
+				     (uint8_t *)ext_inq,
+				     sizeof(*ext_inq),
+				     /*evpd*/TRUE,
+				     SVPD_EXTENDED_INQUIRY_DATA,
+				     SSD_MIN_SIZE,
+				     /*timeout*/60 * 1000);
+			break;
+		}
+		/*
+		 * We'll have to do without, let our probedone
+		 * routine finish up for us.
+		 */
+		goto done;
+	}
 	case PROBE_SERIAL_NUM:
 	{
 		struct scsi_vpd_unit_serial_number *serial_buf;
@@ -1454,6 +1484,50 @@ out:
 		if (devid && length == 0)
 			free(devid, M_CAMXPT);
 		xpt_release_ccb(done_ccb);
+		PROBE_SET_ACTION(softc, PROBE_EXTENDED_INQUIRY);
+		xpt_schedule(periph, priority);
+		goto out;
+	}
+	case PROBE_EXTENDED_INQUIRY: {
+		struct scsi_vpd_extended_inquiry_data *ext_inq;
+		struct ccb_scsiio *csio;
+		int32_t length = 0;
+
+		csio = &done_ccb->csio;
+		ext_inq = (struct scsi_vpd_extended_inquiry_data *)
+		    csio->data_ptr;
+		if (path->device->ext_inq != NULL) {
+			path->device->ext_inq_len = 0;
+			free(path->device->ext_inq, M_CAMXPT);
+			path->device->ext_inq = NULL;
+		}
+
+		if (ext_inq == NULL) {
+			/* Don't process the command as it was never sent */
+		} else if (CCB_COMPLETED_OK(csio->ccb_h)) {
+			length = scsi_2btoul(ext_inq->page_length) +
+			    __offsetof(struct scsi_vpd_extended_inquiry_data,
+			    flags1);
+			length = min(length, sizeof(*ext_inq));
+			length -= csio->resid;
+			if (length > 0) {
+				path->device->ext_inq_len = length;
+				path->device->ext_inq = (uint8_t *)ext_inq;
+			}
+		} else if (cam_periph_error(done_ccb, 0,
+					    SF_RETRY_UA,
+					    &softc->saved_ccb) == ERESTART) {
+			return;
+		} else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) {
+			/* Don't wedge the queue */
+			xpt_release_devq(done_ccb->ccb_h.path, /*count*/1,
+					 /*run_queue*/TRUE);
+		}
+
+		/* Free the device id space if we don't use it */
+		if (ext_inq && length <= 0)
+			free(ext_inq, M_CAMXPT);
+		xpt_release_ccb(done_ccb);
 		PROBE_SET_ACTION(softc, PROBE_SERIAL_NUM);
 		xpt_schedule(periph, priority);
 		goto out;
@@ -2477,6 +2551,21 @@ scsi_dev_advinfo(union ccb *start_ccb)
 			memcpy(cdai->buf, device->rcap_buf, amt);
 		}
 		break;
+	case CDAI_TYPE_EXT_INQ:
+		/*
+		 * We fetch extended inquiry data during probe, if
+		 * available.  We don't allow changing it.
+		 */
+		if (cdai->flags & CDAI_FLAG_STORE) 
+			return;
+		cdai->provsiz = device->ext_inq_len;
+		if (device->ext_inq_len == 0)
+			break;
+		amt = device->ext_inq_len;
+		if (cdai->provsiz > cdai->bufsiz)
+			amt = cdai->bufsiz;
+		memcpy(cdai->buf, device->ext_inq, amt);
+		break;
 	default:
 		return;
 	}

Modified: projects/building-blocks/sys/conf/kern.mk
==============================================================================
--- projects/building-blocks/sys/conf/kern.mk	Thu Feb  5 12:10:23 2015	(r278255)
+++ projects/building-blocks/sys/conf/kern.mk	Thu Feb  5 12:21:05 2015	(r278256)
@@ -158,6 +158,14 @@ INLINE_LIMIT?=	8000
 CFLAGS+=	-ffreestanding
 
 #
+# The C standard leaves signed integer overflow behavior undefined.
+# gcc and clang opimizers take advantage of this.  The kernel makes
+# use of signed integer wraparound mechanics so we need the compiler
+# to treat it as a wraparound and not take shortcuts.
+# 
+CFLAGS+=	-fwrapv
+
+#
 # GCC SSP support
 #
 .if ${MK_SSP} != "no" && \

Modified: projects/building-blocks/sys/conf/options
==============================================================================
--- projects/building-blocks/sys/conf/options	Thu Feb  5 12:10:23 2015	(r278255)
+++ projects/building-blocks/sys/conf/options	Thu Feb  5 12:21:05 2015	(r278256)
@@ -129,6 +129,7 @@ GEOM_SHSEC	opt_geom.h
 GEOM_STRIPE	opt_geom.h

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



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