PERFORCE change 111794 for review
John Baldwin
jhb at FreeBSD.org
Sat Dec 16 06:38:33 PST 2006
http://perforce.freebsd.org/chv.cgi?CH=111794
Change 111794 by jhb at jhb_zion on 2006/12/16 14:38:20
IFC @111791.
Affected files ...
.. //depot/projects/smpng/sys/arm/at91/at91_st.c#6 integrate
.. //depot/projects/smpng/sys/arm/xscale/i80321/i80321_wdog.c#2 integrate
.. //depot/projects/smpng/sys/dev/ata/ata-all.c#86 integrate
.. //depot/projects/smpng/sys/dev/bge/if_bge.c#84 integrate
.. //depot/projects/smpng/sys/dev/bge/if_bgereg.h#48 integrate
.. //depot/projects/smpng/sys/dev/ichwd/ichwd.c#5 integrate
.. //depot/projects/smpng/sys/dev/ipmi/ipmi.c#6 integrate
.. //depot/projects/smpng/sys/dev/isp/isp.c#49 integrate
.. //depot/projects/smpng/sys/dev/isp/isp_pci.c#45 integrate
.. //depot/projects/smpng/sys/dev/isp/isp_sbus.c#19 integrate
.. //depot/projects/smpng/sys/dev/mk48txx/mk48txx.c#7 integrate
.. //depot/projects/smpng/sys/dev/mpt/mpt_cam.c#18 integrate
.. //depot/projects/smpng/sys/dev/pci/pci.c#81 integrate
.. //depot/projects/smpng/sys/dev/pci/pcivar.h#24 integrate
.. //depot/projects/smpng/sys/dev/sound/pci/hda/hdac.c#4 integrate
.. //depot/projects/smpng/sys/dev/watchdog/watchdog.c#4 integrate
.. //depot/projects/smpng/sys/i386/i386/elan-mmcr.c#23 integrate
.. //depot/projects/smpng/sys/kern/kern_clock.c#54 integrate
.. //depot/projects/smpng/sys/kern/kern_condvar.c#44 integrate
.. //depot/projects/smpng/sys/kern/kern_mutex.c#138 integrate
.. //depot/projects/smpng/sys/kern/kern_synch.c#109 integrate
.. //depot/projects/smpng/sys/kern/subr_sleepqueue.c#29 integrate
.. //depot/projects/smpng/sys/kern/sysv_ipc.c#16 integrate
.. //depot/projects/smpng/sys/kern/vfs_export.c#24 integrate
.. //depot/projects/smpng/sys/netinet/libalias/alias.c#5 integrate
.. //depot/projects/smpng/sys/netinet/libalias/alias_db.c#4 integrate
.. //depot/projects/smpng/sys/netinet/libalias/alias_local.h#4 integrate
.. //depot/projects/smpng/sys/netinet/libalias/alias_mod.c#2 integrate
.. //depot/projects/smpng/sys/netinet/libalias/alias_proxy.c#4 integrate
.. //depot/projects/smpng/sys/netinet/libalias/alias_util.c#5 integrate
.. //depot/projects/smpng/sys/sun4v/include/trap.h#3 integrate
.. //depot/projects/smpng/sys/sun4v/sun4v/exception.S#5 integrate
.. //depot/projects/smpng/sys/sun4v/sun4v/pmap.c#8 integrate
.. //depot/projects/smpng/sys/sun4v/sun4v/trap.c#6 integrate
.. //depot/projects/smpng/sys/sun4v/sun4v/tte_hash.c#5 integrate
.. //depot/projects/smpng/sys/sun4v/sun4v/vm_machdep.c#3 integrate
.. //depot/projects/smpng/sys/sun4v/sun4v/wbuf.S#3 integrate
.. //depot/projects/smpng/sys/sys/lock_profile.h#3 integrate
.. //depot/projects/smpng/sys/sys/mutex.h#67 integrate
.. //depot/projects/smpng/sys/sys/param.h#108 integrate
.. //depot/projects/smpng/sys/sys/proc.h#175 integrate
.. //depot/projects/smpng/sys/sys/sleepqueue.h#9 integrate
.. //depot/projects/smpng/sys/sys/watchdog.h#4 integrate
.. //depot/projects/smpng/sys/vm/vm_object.c#88 integrate
Differences ...
==== //depot/projects/smpng/sys/arm/at91/at91_st.c#6 (text) ====
@@ -23,7 +23,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/at91/at91_st.c,v 1.5 2006/08/09 20:58:55 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/at91/at91_st.c,v 1.6 2006/12/15 21:44:48 n_hibma Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -170,10 +170,15 @@
uint32_t wdog;
int t;
- wdog = 0;
t = cmd & WD_INTERVAL;
- if (cmd != 0 && t >= 22 && t <= 37)
+ if (cmd > 0 && t >= 22 && t <= 37) {
wdog = (1 << (t - 22)) | ST_WDMR_RSTEN;
+ *error = 0;
+ } else {
+ wdog = 0;
+ if (cmd > 0)
+ *error = EINVAL;
+ }
WR4(ST_WDMR, wdog);
WR4(ST_CR, ST_CR_WDRST);
}
==== //depot/projects/smpng/sys/arm/xscale/i80321/i80321_wdog.c#2 (text+ko) ====
@@ -41,7 +41,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/xscale/i80321/i80321_wdog.c,v 1.2 2005/01/15 18:38:10 cognet Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/xscale/i80321/i80321_wdog.c,v 1.3 2006/12/15 21:44:48 n_hibma Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -62,7 +62,6 @@
device_t dev;
int armed;
int wdog_period;
- struct callout_handle wdog_callout;
};
static __inline void
@@ -83,8 +82,6 @@
return;
wdtcr_write(WDTCR_ENABLE1);
wdtcr_write(WDTCR_ENABLE2);
- sc->wdog_callout = timeout(iopwdog_tickle, sc,
- hz * (sc->wdog_period - 1));
}
static int
@@ -112,14 +109,21 @@
{
struct iopwdog_softc *sc = private;
- if (cmd == 0)
- return;
- if ((((uint64_t)1 << (cmd & WD_INTERVAL))) >
- (uint64_t)sc->wdog_period * 1000000000)
- return;
- sc->armed = 1;
- iopwdog_tickle(sc);
- *error = 0;
+ cmd &= WD_INTERVAL;
+ if (cmd > 0 && cmd <= 63
+ && (uint64_t)1 << (cmd & WD_INTERVAL) <=
+ (uint64_t)sc->wdog_period * 1000000000) {
+ /* Valid value -> Enable watchdog */
+ iopwdog_tickle(sc);
+ sc->armed = 1;
+ *error = 0;
+ } else {
+ /* XXX Can't disable this watchdog? */
+ if (sc->armed)
+ *error = EOPNOTSUPP;
+ else if (cmd > 0)
+ *error = EINVAL;
+ }
}
static int
==== //depot/projects/smpng/sys/dev/ata/ata-all.c#86 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/ata-all.c,v 1.275 2006/11/17 11:13:47 sos Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/ata-all.c,v 1.276 2006/12/16 14:00:54 cognet Exp $");
#include "opt_ata.h"
#include <sys/param.h>
@@ -601,14 +601,12 @@
isprint(atadev->param.model[1]))) {
struct ata_params *atacap = &atadev->param;
char buffer[64];
-#ifndef __ARMEB__
int16_t *ptr;
for (ptr = (int16_t *)atacap;
ptr < (int16_t *)atacap + sizeof(struct ata_params)/2; ptr++) {
*ptr = le16toh(*ptr);
}
-#endif
if (!(!strncmp(atacap->model, "FX", 2) ||
!strncmp(atacap->model, "NEC", 3) ||
!strncmp(atacap->model, "Pioneer", 7) ||
==== //depot/projects/smpng/sys/dev/bge/if_bge.c#84 (text+ko) ====
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/bge/if_bge.c,v 1.163 2006/12/13 21:13:09 scottl Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/bge/if_bge.c,v 1.165 2006/12/15 00:27:06 jdp Exp $");
/*
* Broadcom BCM570x family gigabit ethernet driver for FreeBSD.
@@ -114,6 +114,12 @@
#define BGE_CSUM_FEATURES (CSUM_IP | CSUM_TCP | CSUM_UDP)
#define ETHER_MIN_NOPAD (ETHER_MIN_LEN - ETHER_CRC_LEN) /* i.e., 60 */
+/*
+ * Disable the use of MSI until we sort out on which chip revisions support
+ * it properly.
+ */
+#define BGE_DISABLE_MSI 1
+
MODULE_DEPEND(bge, pci, 1, 1, 1);
MODULE_DEPEND(bge, ether, 1, 1, 1);
MODULE_DEPEND(bge, miibus, 1, 1, 1);
@@ -2113,7 +2119,7 @@
uint32_t hwcfg = 0;
uint32_t mac_tmp = 0;
u_char eaddr[6];
- int error = 0, rid, trys, reg;
+ int error = 0, msicount, rid, trys, reg;
sc = device_get_softc(dev);
sc->bge_dev = dev;
@@ -2136,8 +2142,21 @@
sc->bge_btag = rman_get_bustag(sc->bge_res);
sc->bge_bhandle = rman_get_bushandle(sc->bge_res);
- /* Allocate interrupt. */
- rid = 0;
+ /*
+ * Allocate the interrupt, using MSI if possible. These devices
+ * support 8 MSI messages, but only the first one is used in
+ * normal operation.
+ */
+ if ((msicount = pci_msi_count(dev)) > 1)
+ msicount = 1;
+#ifdef BGE_DISABLE_MSI
+ msicount = 0;
+#endif
+ if (msicount == 1 && pci_alloc_msi(dev, &msicount) == 0) {
+ rid = 1;
+ sc->bge_flags |= BGE_FLAG_MSI;
+ } else
+ rid = 0;
sc->bge_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
RF_SHAREABLE | RF_ACTIVE);
@@ -2492,7 +2511,11 @@
bus_teardown_intr(dev, sc->bge_irq, sc->bge_intrhand);
if (sc->bge_irq != NULL)
- bus_release_resource(dev, SYS_RES_IRQ, 0, sc->bge_irq);
+ bus_release_resource(dev, SYS_RES_IRQ,
+ sc->bge_flags & BGE_FLAG_MSI ? 1 : 0, sc->bge_irq);
+
+ if (sc->bge_flags & BGE_FLAG_MSI)
+ pci_release_msi(dev);
if (sc->bge_res != NULL)
bus_release_resource(dev, SYS_RES_MEMORY,
==== //depot/projects/smpng/sys/dev/bge/if_bgereg.h#48 (text+ko) ====
@@ -30,7 +30,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/bge/if_bgereg.h,v 1.61 2006/12/12 05:11:12 scottl Exp $
+ * $FreeBSD: src/sys/dev/bge/if_bgereg.h,v 1.62 2006/12/14 23:10:12 jdp Exp $
*/
/*
@@ -2477,6 +2477,7 @@
#define BGE_FLAG_5705_PLUS 0x00000200
#define BGE_FLAG_5714_FAMILY 0x00000400
#define BGE_FLAG_575X_PLUS 0x00000800
+#define BGE_FLAG_MSI 0x00001000
uint32_t bge_chipid;
uint8_t bge_asicrev;
uint8_t bge_chiprev;
==== //depot/projects/smpng/sys/dev/ichwd/ichwd.c#5 (text+ko) ====
@@ -54,7 +54,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ichwd/ichwd.c,v 1.6 2006/02/17 18:46:18 ambrisko Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ichwd/ichwd.c,v 1.7 2006/12/15 21:44:48 n_hibma Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -178,38 +178,22 @@
struct ichwd_softc *sc = arg;
unsigned int timeout;
+ /* convert from power-of-two-ns to WDT ticks */
+ cmd &= WD_INTERVAL;
+ timeout = ((uint64_t)1 << cmd) / ICHWD_TICK;
+ if (cmd > 0 && cmd <= 63
+ && timeout >= ICHWD_MIN_TIMEOUT && timeout <= ICHWD_MAX_TIMEOUT) {
+ if (timeout != sc->timeout)
+ ichwd_tmr_set(sc, timeout);
- /* disable / enable */
- if (!(cmd & WD_ACTIVE)) {
+ ichwd_tmr_reload(sc);
+ *error = 0;
+ } else {
if (sc->active)
ichwd_tmr_disable(sc);
- *error = 0;
- return;
- }
- if (!sc->active)
- ichwd_tmr_enable(sc);
-
- cmd &= WD_INTERVAL;
- /* convert from power-of-to-ns to WDT ticks */
- if (cmd >= 64) {
- *error = EINVAL;
- return;
+ if (cmd > 0)
+ *error = EINVAL;
}
- timeout = ((uint64_t)1 << cmd) / ICHWD_TICK;
- if (timeout < ICHWD_MIN_TIMEOUT || timeout > ICHWD_MAX_TIMEOUT) {
- *error = EINVAL;
- return;
- }
-
- /* set new initial value */
- if (timeout != sc->timeout)
- ichwd_tmr_set(sc, timeout);
-
- /* reload */
- ichwd_tmr_reload(sc);
-
- *error = 0;
- return;
}
static unsigned int pmbase = 0;
@@ -332,8 +316,6 @@
{
struct ichwd_softc *sc;
- device_printf(dev, "detaching\n");
-
sc = device_get_softc(dev);
/* halt the watchdog timer */
==== //depot/projects/smpng/sys/dev/ipmi/ipmi.c#6 (text) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ipmi/ipmi.c,v 1.7 2006/12/06 15:10:11 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ipmi/ipmi.c,v 1.8 2006/12/15 21:44:48 n_hibma Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -649,25 +649,16 @@
struct ipmi_softc *sc = arg;
unsigned int timeout;
- /* disable / enable */
- if (!(cmd & WD_ACTIVE)) {
+ cmd &= WD_INTERVAL;
+ if (cmd > 0 && cmd <= 63) {
+ timeout = ((uint64_t)1 << cmd) / 1800000000;
+ ipmi_set_watchdog(sc, timeout);
+ *error = 0;
+ } else {
ipmi_set_watchdog(sc, 0);
- *error = 0;
- return;
+ if (cmd > 0)
+ *error = 0;
}
-
- cmd &= WD_INTERVAL;
- /* convert from power-of-to-ns to WDT ticks */
- if (cmd >= 64) {
- *error = EINVAL;
- return;
- }
- timeout = ((uint64_t)1 << cmd) / 1800000000;
-
- /* reload */
- ipmi_set_watchdog(sc, timeout);
-
- *error = 0;
}
#ifdef CLONING
==== //depot/projects/smpng/sys/dev/isp/isp.c#49 (text+ko) ====
@@ -43,7 +43,7 @@
#endif
#ifdef __FreeBSD__
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/isp/isp.c,v 1.133 2006/12/05 07:50:23 mjacob Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/isp/isp.c,v 1.134 2006/12/16 05:54:29 mjacob Exp $");
#include <dev/isp/isp_freebsd.h>
#endif
#ifdef __OpenBSD__
@@ -524,6 +524,7 @@
}
}
if (val & BIU2400_DMA_ACTIVE) {
+ ISP_RESET0(isp);
isp_prt(isp, ISP_LOGERR, "DMA Failed to Stop on Reset");
return;
}
@@ -544,6 +545,7 @@
}
}
if (val & BIU2400_SOFT_RESET) {
+ ISP_RESET0(isp);
isp_prt(isp, ISP_LOGERR, "Failed to come out of reset");
return;
}
@@ -585,6 +587,7 @@
USEC_DELAY(100);
if (--loops < 0) {
ISP_DUMPREGS(isp, "chip reset timed out");
+ ISP_RESET0(isp);
return;
}
}
@@ -626,6 +629,7 @@
}
}
if (val != 0) {
+ ISP_RESET0(isp);
isp_prt(isp, ISP_LOGERR, "reset didn't clear");
return;
}
@@ -691,6 +695,7 @@
while (ISP_READ(isp, OUTMAILBOX0) == MBOX_BUSY) {
USEC_DELAY(100);
if (--loops < 0) {
+ ISP_RESET0(isp);
isp_prt(isp, ISP_LOGERR,
"MBOX_BUSY never cleared on reset");
return;
@@ -712,6 +717,7 @@
mbs.logval = MBLOGALL;
isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
+ ISP_RESET0(isp);
return;
}
@@ -728,11 +734,13 @@
mbs.logval = MBLOGALL;
isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
+ ISP_RESET0(isp);
return;
}
if (mbs.param[1] != 0xdead || mbs.param[2] != 0xbeef ||
mbs.param[3] != 0xffff || mbs.param[4] != 0x1111 ||
mbs.param[5] != 0xa5a5) {
+ ISP_RESET0(isp);
isp_prt(isp, ISP_LOGERR,
"Register Test Failed (0x%x 0x%x 0x%x 0x%x 0x%x)",
mbs.param[1], mbs.param[2], mbs.param[3],
@@ -820,6 +828,7 @@
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
isp_prt(isp, ISP_LOGERR,
"F/W Risc Ram Load Failed");
+ ISP_RESET0(isp);
return;
}
la += nw;
@@ -881,6 +890,7 @@
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
isp_prt(isp, ISP_LOGERR,
"F/W Risc Ram Load Failed");
+ ISP_RESET0(isp);
return;
}
la += nw;
@@ -897,6 +907,7 @@
isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
isp_prt(isp, ISP_LOGERR, dcrc);
+ ISP_RESET0(isp);
return;
}
break;
@@ -935,6 +946,7 @@
isp_prt(isp, ISP_LOGERR,
"F/W download failed at word %d",
isp->isp_mbxwrk1 - code_org);
+ ISP_RESET0(isp);
return;
}
/*
@@ -947,6 +959,7 @@
isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
isp_prt(isp, ISP_LOGERR, dcrc);
+ ISP_RESET0(isp);
return;
}
isp->isp_loaded_fw = 1;
@@ -989,6 +1002,7 @@
isp_mboxcmd(isp, &mbs);
if (IS_2322(isp) || IS_24XX(isp)) {
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
+ ISP_RESET0(isp);
return;
}
}
@@ -1016,11 +1030,13 @@
mbs.logval = MBLOGALL;
isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
+ ISP_RESET0(isp);
return;
}
if (IS_24XX(isp) && mbs.param[1] == 0xdead) {
isp_prt(isp, ISP_LOGERR, "f/w didn't *really* start");
+ ISP_RESET0(isp);
return;
}
@@ -1107,6 +1123,7 @@
mbs.logval = MBLOGALL;
isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
+ ISP_RESET0(isp);
return;
}
if (isp->isp_maxcmds >= mbs.param[2]) {
==== //depot/projects/smpng/sys/dev/isp/isp_pci.c#45 (text+ko) ====
@@ -30,7 +30,7 @@
* FreeBSD Version.
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/isp/isp_pci.c,v 1.128 2006/12/10 03:41:48 mjacob Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/isp/isp_pci.c,v 1.129 2006/12/16 05:54:29 mjacob Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -81,6 +81,7 @@
isp_pci_dmateardown(ispsoftc_t *, XS_T *, uint32_t);
+static void isp_pci_reset0(ispsoftc_t *);
static void isp_pci_reset1(ispsoftc_t *);
static void isp_pci_dumpregs(ispsoftc_t *, const char *);
@@ -91,7 +92,7 @@
isp_pci_mbxdma,
isp_pci_dmasetup,
isp_pci_dmateardown,
- NULL,
+ isp_pci_reset0,
isp_pci_reset1,
isp_pci_dumpregs,
NULL,
@@ -105,7 +106,7 @@
isp_pci_mbxdma,
isp_pci_dmasetup,
isp_pci_dmateardown,
- NULL,
+ isp_pci_reset0,
isp_pci_reset1,
isp_pci_dumpregs,
NULL,
@@ -119,7 +120,7 @@
isp_pci_mbxdma,
isp_pci_dmasetup,
isp_pci_dmateardown,
- NULL,
+ isp_pci_reset0,
isp_pci_reset1,
isp_pci_dumpregs,
NULL,
@@ -133,7 +134,7 @@
isp_pci_mbxdma,
isp_pci_dmasetup,
isp_pci_dmateardown,
- NULL,
+ isp_pci_reset0,
isp_pci_reset1,
isp_pci_dumpregs
};
@@ -145,7 +146,7 @@
isp_pci_mbxdma,
isp_pci_dmasetup,
isp_pci_dmateardown,
- NULL,
+ isp_pci_reset0,
isp_pci_reset1,
isp_pci_dumpregs
};
@@ -157,7 +158,7 @@
isp_pci_mbxdma,
isp_pci_dmasetup,
isp_pci_dmateardown,
- NULL,
+ isp_pci_reset0,
isp_pci_reset1,
isp_pci_dumpregs
};
@@ -169,7 +170,7 @@
isp_pci_mbxdma,
isp_pci_dmasetup,
isp_pci_dmateardown,
- NULL,
+ isp_pci_reset0,
isp_pci_reset1,
NULL
};
@@ -2882,6 +2883,12 @@
static void
+isp_pci_reset0(ispsoftc_t *isp)
+{
+ ISP_DISABLE_INTS(isp);
+}
+
+static void
isp_pci_reset1(ispsoftc_t *isp)
{
if (!IS_24XX(isp)) {
==== //depot/projects/smpng/sys/dev/isp/isp_sbus.c#19 (text+ko) ====
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/isp/isp_sbus.c,v 1.24 2006/12/10 03:41:48 mjacob Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/isp/isp_sbus.c,v 1.25 2006/12/16 05:54:29 mjacob Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -63,6 +63,7 @@
static void
isp_sbus_dmateardown(ispsoftc_t *, XS_T *, uint32_t);
+static void isp_sbus_reset0(ispsoftc_t *);
static void isp_sbus_reset1(ispsoftc_t *);
static void isp_sbus_dumpregs(ispsoftc_t *, const char *);
@@ -73,7 +74,7 @@
isp_sbus_mbxdma,
isp_sbus_dmasetup,
isp_sbus_dmateardown,
- NULL,
+ isp_sbus_reset0,
isp_sbus_reset1,
isp_sbus_dumpregs,
NULL,
@@ -826,6 +827,12 @@
}
static void
+isp_sbus_reset0(ispsoftc_t *isp)
+{
+ ISP_DISABLE_INTS(isp);
+}
+
+static void
isp_sbus_reset1(ispsoftc_t *isp)
{
ISP_ENABLE_INTS(isp);
==== //depot/projects/smpng/sys/dev/mk48txx/mk48txx.c#7 (text+ko) ====
@@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/mk48txx/mk48txx.c,v 1.7 2006/09/01 20:14:06 marius Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/mk48txx/mk48txx.c,v 1.8 2006/12/15 21:44:49 n_hibma Exp $");
/*
* Mostek MK48T02, MK48T08, MK48T18, MK48T59 time-of-day chip subroutines.
@@ -297,7 +297,7 @@
wdog = 0;
t = cmd & WD_INTERVAL;
- if (cmd != 0 && t >= 26 && t <= 37) {
+ if (cmd > 0 && t >= 26 && t <= 37) {
if (t <= WD_TO_2SEC) {
wdog |= MK48TXX_WDOG_RB_1_16;
t -= 26;
@@ -317,6 +317,8 @@
if (sc->sc_flag & MK48TXX_WDOG_ENABLE_WDS)
wdog |= MK48TXX_WDOG_WDS;
*error = 0;
+ } else if (cmd > 0) {
+ *error = EINVAL;
}
mtx_lock(&sc->sc_mtx);
(*sc->sc_nvwr)(dev, sc->sc_clkoffset + MK48TXX_WDOG, wdog);
==== //depot/projects/smpng/sys/dev/mpt/mpt_cam.c#18 (text+ko) ====
@@ -94,7 +94,7 @@
* OWNER OR CONTRIBUTOR IS ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt_cam.c,v 1.46 2006/12/10 01:13:56 mjacob Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt_cam.c,v 1.47 2006/12/16 07:39:55 mjacob Exp $");
#include <dev/mpt/mpt.h>
#include <dev/mpt/mpt_cam.h>
@@ -110,6 +110,12 @@
#include <sys/callout.h>
#include <sys/kthread.h>
+#if __FreeBSD_version >= 700000
+#ifndef CAM_NEW_TRAN_CODE
+#define CAM_NEW_TRAN_CODE 1
+#endif
+#endif
+
static void mpt_poll(struct cam_sim *);
static timeout_t mpt_timeout;
static void mpt_action(struct cam_sim *, union ccb *);
@@ -2951,7 +2957,11 @@
break;
}
+#ifdef CAM_NEW_TRAN_CODE
#define IS_CURRENT_SETTINGS(c) ((c)->type == CTS_TYPE_CURRENT_SETTINGS)
+#else
+#define IS_CURRENT_SETTINGS(c) ((c)->flags & CCB_TRANS_CURRENT_SETTINGS)
+#endif
#define DP_DISC_ENABLE 0x1
#define DP_DISC_DISABL 0x2
#define DP_DISC (DP_DISC_ENABLE|DP_DISC_DISABL)
@@ -2968,8 +2978,10 @@
case XPT_SET_TRAN_SETTINGS: /* Nexus Settings */
{
+#ifdef CAM_NEW_TRAN_CODE
struct ccb_trans_settings_scsi *scsi;
struct ccb_trans_settings_spi *spi;
+#endif
uint8_t dval;
u_int period;
u_int offset;
@@ -2982,6 +2994,7 @@
break;
}
+#ifdef CAM_NEW_TRAN_CODE
scsi = &cts->proto_specific.scsi;
spi = &cts->xport_specific.spi;
@@ -2992,6 +3005,7 @@
mpt_set_ccb_status(ccb, CAM_REQ_CMP);
break;
}
+#endif
/*
* Skip attempting settings on RAID volume disks.
@@ -3021,6 +3035,28 @@
period = 0;
offset = 0;
+#ifndef CAM_NEW_TRAN_CODE
+ if ((cts->valid & CCB_TRANS_DISC_VALID) != 0) {
+ dval |= (cts->flags & CCB_TRANS_DISC_ENB) ?
+ DP_DISC_ENABLE : DP_DISC_DISABL;
+ }
+
+ if ((cts->valid & CCB_TRANS_TQ_VALID) != 0) {
+ dval |= (cts->flags & CCB_TRANS_TAG_ENB) ?
+ DP_TQING_ENABLE : DP_TQING_DISABL;
+ }
+
+ if ((cts->valid & CCB_TRANS_BUS_WIDTH_VALID) != 0) {
+ dval |= cts->bus_width ? DP_WIDE : DP_NARROW;
+ }
+
+ if ((cts->valid & CCB_TRANS_SYNC_RATE_VALID) &&
+ (cts->valid & CCB_TRANS_SYNC_OFFSET_VALID)) {
+ dval |= DP_SYNC;
+ period = cts->sync_period;
+ offset = cts->sync_offset;
+ }
+#else
if ((spi->valid & CTS_SPI_VALID_DISC) != 0) {
dval |= ((spi->flags & CTS_SPI_FLAGS_DISC_ENB) != 0) ?
DP_DISC_ENABLE : DP_DISC_DISABL;
@@ -3056,6 +3092,7 @@
period &= MPI_SCSIDEVPAGE1_RP_MIN_SYNC_PERIOD_MASK;
period >>= MPI_SCSIDEVPAGE1_RP_SHIFT_MIN_SYNC_PERIOD;
}
+#endif
CAMLOCK_2_MPTLOCK(mpt);
if (dval & DP_DISC_ENABLE) {
mpt->mpt_disc_enable |= (1 << tgt);
@@ -3091,8 +3128,10 @@
}
case XPT_GET_TRAN_SETTINGS:
{
+#ifdef CAM_NEW_TRAN_CODE
+ struct ccb_trans_settings_scsi *scsi;
cts = &ccb->cts;
- struct ccb_trans_settings_scsi *scsi;
+ cts->protocol = PROTO_SCSI;
if (mpt->is_fc) {
struct ccb_trans_settings_fc *fc =
&cts->xport_specific.fc;
@@ -3104,24 +3143,38 @@
} else if (mpt->is_sas) {
struct ccb_trans_settings_sas *sas =
&cts->xport_specific.sas;
-
cts->protocol_version = SCSI_REV_SPC2;
cts->transport = XPORT_SAS;
cts->transport_version = 0;
sas->valid = CTS_SAS_VALID_SPEED;
sas->bitrate = 300000;
} else {
+ cts->protocol_version = SCSI_REV_2;
+ cts->transport = XPORT_SPI;
+ cts->transport_version = 2;
if (mpt_get_spi_settings(mpt, cts) != 0) {
mpt_set_ccb_status(ccb, CAM_REQ_CMP_ERR);
- } else {
- mpt_set_ccb_status(ccb, CAM_REQ_CMP);
+ break;
}
- break;
}
- cts->protocol = PROTO_SCSI;
scsi = &cts->proto_specific.scsi;
scsi->valid = CTS_SCSI_VALID_TQ;
scsi->flags = CTS_SCSI_FLAGS_TAG_ENB;
+#else
+ cts = &ccb->cts;
+ if (mpt->is_fc) {
+ cts->flags = CCB_TRANS_TAG_ENB | CCB_TRANS_DISC_ENB;
+ cts->valid = CCB_TRANS_DISC_VALID | CCB_TRANS_TQ_VALID;
+ cts->bus_width = MSG_EXT_WDTR_BUS_8_BIT;
+ } else if (mpt->is_sas) {
+ cts->flags = CCB_TRANS_TAG_ENB | CCB_TRANS_DISC_ENB;
+ cts->valid = CCB_TRANS_DISC_VALID | CCB_TRANS_TQ_VALID;
+ cts->bus_width = MSG_EXT_WDTR_BUS_8_BIT;
+ } else if (mpt_get_spi_settings(mpt, cts) != 0) {
+ mpt_set_ccb_status(ccb, CAM_REQ_CMP_ERR);
+ break;
+ }
+#endif
mpt_set_ccb_status(ccb, CAM_REQ_CMP);
break;
}
@@ -3296,18 +3349,15 @@
static int
mpt_get_spi_settings(struct mpt_softc *mpt, struct ccb_trans_settings *cts)
{
+#ifdef CAM_NEW_TRAN_CODE
struct ccb_trans_settings_scsi *scsi = &cts->proto_specific.scsi;
struct ccb_trans_settings_spi *spi = &cts->xport_specific.spi;
+#endif
target_id_t tgt;
uint32_t dval, pval, oval;
int rv;
- cts->protocol = PROTO_SCSI;
- cts->protocol_version = SCSI_REV_2;
- cts->transport = XPORT_SPI;
- cts->transport_version = 2;
-
- if (cts->type == CTS_TYPE_USER_SETTINGS) {
+ if (IS_CURRENT_SETTINGS(cts) == 0) {
tgt = cts->ccb_h.target_id;
} else if (xpt_path_sim(cts->ccb_h.path) == mpt->phydisk_sim) {
if (mpt_map_physdisk(mpt, (union ccb *)cts, &tgt)) {
@@ -3364,6 +3414,29 @@
pval = MPI_SCSIPORTPAGE0_CAP_GET_MIN_SYNC_PERIOD(pval);
}
+#ifndef CAM_NEW_TRAN_CODE
+ cts->flags &= ~(CCB_TRANS_DISC_ENB|CCB_TRANS_TAG_ENB);
+ cts->valid = 0;
+ cts->sync_period = pval;
+ cts->sync_offset = oval;
+ cts->valid |= CCB_TRANS_SYNC_RATE_VALID;
+ cts->valid |= CCB_TRANS_SYNC_OFFSET_VALID;
+ cts->valid |= CCB_TRANS_BUS_WIDTH_VALID;
+ if (dval & DP_WIDE) {
+ cts->bus_width = MSG_EXT_WDTR_BUS_16_BIT;
+ } else {
+ cts->bus_width = MSG_EXT_WDTR_BUS_8_BIT;
+ }
+ if (cts->ccb_h.target_lun != CAM_LUN_WILDCARD) {
+ cts->valid |= CCB_TRANS_DISC_VALID | CCB_TRANS_TQ_VALID;
+ if (dval & DP_DISC_ENABLE) {
+ cts->flags |= CCB_TRANS_DISC_ENB;
+ }
+ if (dval & DP_TQING_ENABLE) {
+ cts->flags |= CCB_TRANS_TAG_ENB;
+ }
+ }
+#else
spi->valid = 0;
scsi->valid = 0;
spi->flags = 0;
@@ -3388,6 +3461,7 @@
spi->flags |= CTS_SPI_FLAGS_DISC_ENB;
}
}
+#endif
mpt_lprt(mpt, MPT_PRT_NEGOTIATION,
"mpt_get_spi_settings[%d]: %s flags 0x%x per 0x%x off=%d\n", tgt,
IS_CURRENT_SETTINGS(cts)? "ACTIVE" : "NVRAM ", dval, pval, oval);
==== //depot/projects/smpng/sys/dev/pci/pci.c#81 (text+ko) ====
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/pci/pci.c,v 1.328 2006/12/14 16:53:48 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/pci/pci.c,v 1.330 2006/12/14 19:59:29 jhb Exp $");
#include "opt_bus.h"
@@ -165,6 +165,7 @@
uint32_t devid; /* Vendor/device of the card */
int type;
#define PCI_QUIRK_MAP_REG 1 /* PCI map register in weird place */
+#define PCI_QUIRK_DISABLE_MSI 2 /* MSI/MSI-X doesn't work */
int arg1;
int arg2;
};
@@ -176,6 +177,12 @@
/* As does the Serverworks OSB4 (the SMBus mapping register) */
{ 0x02001166, PCI_QUIRK_MAP_REG, 0x90, 0 },
+ /*
+ * MSI doesn't work with the Intel E7501 chipset, at least on
+ * the Tyan 2721 motherboard.
+ */
+ { 0x254c8086, PCI_QUIRK_DISABLE_MSI, 0, 0 },
+
{ 0 }
};
@@ -224,6 +231,11 @@
SYSCTL_INT(_hw_pci, OID_AUTO, enable_msix, CTLFLAG_RW, &pci_do_msix, 1,
"Enable support for MSI-X interrupts");
+static int pci_honor_msi_blacklist = 1;
+TUNABLE_INT("hw.pci.honor_msi_blacklist", &pci_honor_msi_blacklist);
+SYSCTL_INT(_hw_pci, OID_AUTO, honor_msi_blacklist, CTLFLAG_RD,
+ &pci_honor_msi_blacklist, 1, "Honor chipset blacklist for MSI");
+
/* Find a device_t by bus/slot/function */
device_t
@@ -1195,6 +1207,47 @@
}
/*
+ * Returns true if the specified device is blacklisted because MSI
+ * doesn't work.
+ */
+int
+pci_msi_device_blacklisted(device_t dev)
+{
+ struct pci_quirk *q;
+
+ if (!pci_honor_msi_blacklist)
+ return (0);
+
+ for (q = &pci_quirks[0]; q->devid; q++) {
+ if (q->devid == pci_get_devid(dev) &&
+ q->type == PCI_QUIRK_DISABLE_MSI)
+ return (1);
+ }
+ return (0);
+}
+
+/*
+ * Determine if MSI is blacklisted globally on this sytem. Currently,
+ * we just check for blacklisted chipsets as represented by the
+ * host-PCI bridge at device 0:0:0. In the future, it may become
+ * necessary to check other system attributes, such as the kenv values
+ * that give the motherboard manufacturer and model number.
+ */
+static int
+pci_msi_blacklisted(void)
+{
+ device_t dev;
+
+ if (!pci_honor_msi_blacklist)
+ return (0);
+
+ dev = pci_find_bsf(0, 0, 0);
+ if (dev != NULL)
+ return (pci_msi_device_blacklisted(dev));
+ return (0);
+}
+
+/*
* Attempt to allocate *count MSI messages. The actual number allocated is
* returned in *count. After this function returns, each message will be
* available to the driver as SYS_RES_IRQ resources starting at a rid 1.
@@ -1217,6 +1270,10 @@
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list