svn commit: r204252 - in stable/7/sys: cam dev/isp

Matt Jacob mjacob at FreeBSD.org
Tue Feb 23 18:37:22 UTC 2010


Author: mjacob
Date: Tue Feb 23 18:37:21 2010
New Revision: 204252
URL: http://svn.freebsd.org/changeset/base/204252

Log:
  MFC 196008 196162 197214 197372 197373
  MFC 198822 200089 201325 201408 202418
  MFC 203444 203463 203478 204050
  
  Move back into RELENG_7 the current state of isp.

Deleted:
  stable/7/sys/dev/isp/isp_tpublic.h
Modified:
  stable/7/sys/cam/cam_ccb.h
  stable/7/sys/cam/cam_xpt.c
  stable/7/sys/dev/isp/isp.c
  stable/7/sys/dev/isp/isp_freebsd.c
  stable/7/sys/dev/isp/isp_freebsd.h
  stable/7/sys/dev/isp/isp_ioctl.h
  stable/7/sys/dev/isp/isp_library.c
  stable/7/sys/dev/isp/isp_library.h
  stable/7/sys/dev/isp/isp_pci.c
  stable/7/sys/dev/isp/isp_sbus.c
  stable/7/sys/dev/isp/isp_stds.h
  stable/7/sys/dev/isp/isp_target.c
  stable/7/sys/dev/isp/isp_target.h
  stable/7/sys/dev/isp/ispmbox.h
  stable/7/sys/dev/isp/ispreg.h
  stable/7/sys/dev/isp/ispvar.h
Directory Properties:
  stable/7/sbin/geom/   (props changed)
  stable/7/sbin/geom/class/label/   (props changed)
  stable/7/sbin/geom/class/part/   (props changed)
  stable/7/sbin/geom/class/stripe/   (props changed)
  stable/7/sbin/geom/misc/   (props changed)
  stable/7/sys/   (props changed)
  stable/7/sys/cddl/contrib/opensolaris/   (props changed)
  stable/7/sys/contrib/dev/acpica/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)

Modified: stable/7/sys/cam/cam_ccb.h
==============================================================================
--- stable/7/sys/cam/cam_ccb.h	Tue Feb 23 16:46:34 2010	(r204251)
+++ stable/7/sys/cam/cam_ccb.h	Tue Feb 23 18:37:21 2010	(r204252)
@@ -170,6 +170,15 @@ typedef enum {
 				 * volume size.
 				 */
 
+	XPT_GET_SIM_KNOB	= 0x18,
+				/*
+				 * Get SIM specific knob values.
+				 */
+
+	XPT_SET_SIM_KNOB	= 0x19,
+				/*
+				 * Set SIM specific knob values.
+				 */
 /* HBA engine commands 0x20->0x2F */
 	XPT_ENG_INQ		= 0x20 | XPT_FC_XPT_ONLY,
 				/* HBA engine feature inquiry */
@@ -186,8 +195,12 @@ typedef enum {
 	XPT_CONT_TARGET_IO	= 0x33 | XPT_FC_DEV_QUEUED,
 				/* Continue Host Target I/O Connection */
 	XPT_IMMED_NOTIFY	= 0x34 | XPT_FC_QUEUED | XPT_FC_USER_CCB,
-				/* Notify Host Target driver of event */
+				/* Notify Host Target driver of event (obsolete) */
 	XPT_NOTIFY_ACK		= 0x35,
+				/* Acknowledgement of event (obsolete) */
+	XPT_IMMEDIATE_NOTIFY	= 0x36 | XPT_FC_QUEUED | XPT_FC_USER_CCB,
+				/* Notify Host Target driver of event */
+	XPT_NOTIFY_ACKNOWLEDGE	= 0x37 | XPT_FC_QUEUED | XPT_FC_USER_CCB,
 				/* Acknowledgement of event */
 
 /* Vendor Unique codes: 0x80->0x8F */
@@ -521,12 +534,14 @@ typedef enum {
 struct ccb_pathinq_settings_spi {
 	u_int8_t ppr_options;
 };
+
 struct ccb_pathinq_settings_fc {
 	u_int64_t wwnn;		/* world wide node name */
 	u_int64_t wwpn;		/* world wide port name */
 	u_int32_t port;		/* 24 bit port id, if known */
 	u_int32_t bitrate;	/* Mbps */
 };
+
 struct ccb_pathinq_settings_sas {
 	u_int32_t bitrate;	/* Mbps */
 };
@@ -645,6 +660,7 @@ struct ccb_relsim {
  * Definitions for the asynchronous callback CCB fields.
  */
 typedef enum {
+	AC_CONTRACT		= 0x1000,/* A contractual callback */
 	AC_GETDEV_CHANGED	= 0x800,/* Getdev info might have changed */
 	AC_INQ_CHANGED		= 0x400,/* Inquiry info might have changed */
 	AC_TRANSFER_NEG		= 0x200,/* New transfer settings in effect */
@@ -661,6 +677,26 @@ typedef enum {
 typedef void ac_callback_t (void *softc, u_int32_t code,
 			    struct cam_path *path, void *args);
 
+/*
+ * Generic Asynchronous callbacks.
+ *
+ * Generic arguments passed bac which are then interpreted between a per-system
+ * contract number.
+ */
+#define	AC_CONTRACT_DATA_MAX (128 - sizeof (u_int64_t))
+struct ac_contract {
+	u_int64_t	contract_number;
+	u_int8_t	contract_data[AC_CONTRACT_DATA_MAX];
+};
+
+#define	AC_CONTRACT_DEV_CHG	1
+struct ac_device_changed {
+	u_int64_t	wwpn;
+	u_int32_t	port;
+	target_id_t	target;
+	u_int8_t	arrived;
+};
+
 /* Set Asynchronous Callback CCB */
 struct ccb_setasync {
 	struct ccb_hdr	 ccb_h;
@@ -782,6 +818,50 @@ struct ccb_calc_geometry {
 };
 
 /*
+ * Set or get SIM (and transport) specific knobs
+ */
+
+#define	KNOB_VALID_ADDRESS	0x1
+#define	KNOB_VALID_ROLE		0x2
+
+
+#define	KNOB_ROLE_NONE		0x0
+#define	KNOB_ROLE_INITIATOR	0x1
+#define	KNOB_ROLE_TARGET	0x2
+#define	KNOB_ROLE_BOTH		0x3
+
+struct ccb_sim_knob_settings_spi {
+	u_int		valid;
+	u_int		initiator_id;
+	u_int		role;
+};
+
+struct ccb_sim_knob_settings_fc {
+	u_int		valid;
+	u_int64_t	wwnn;		/* world wide node name */
+	u_int64_t 	wwpn;		/* world wide port name */
+	u_int		role;
+};
+
+struct ccb_sim_knob_settings_sas {
+	u_int		valid;
+	u_int64_t	wwnn;		/* world wide node name */
+	u_int		role;
+};
+#define	KNOB_SETTINGS_SIZE	128
+
+struct ccb_sim_knob {
+	struct	  ccb_hdr ccb_h;
+	union {
+		u_int  valid;	/* Which fields to honor */
+		struct ccb_sim_knob_settings_spi spi;
+		struct ccb_sim_knob_settings_fc fc;
+		struct ccb_sim_knob_settings_sas sas;
+		char pad[KNOB_SETTINGS_SIZE];
+	} xport_specific;
+};
+
+/*
  * Rescan the given bus, or bus/target/lun
  */
 struct ccb_rescan {
@@ -806,6 +886,7 @@ struct ccb_en_lun {
 	u_int8_t  enable;
 };
 
+/* old, barely used immediate notify, binary compatibility */
 struct ccb_immed_notify {
 	struct	  ccb_hdr ccb_h;
 	struct    scsi_sense_data sense_data;
@@ -820,6 +901,22 @@ struct ccb_notify_ack {
 	u_int8_t  event;		/* Event flags */
 };
 
+struct ccb_immediate_notify {
+	struct    ccb_hdr ccb_h;
+	u_int     tag_id;		/* Tag for immediate notify */
+	u_int     seq_id;		/* Tag for target of notify */
+	u_int     initiator_id;		/* Initiator Identifier */
+	u_int     arg;			/* Function specific */
+};
+
+struct ccb_notify_acknowledge {
+	struct    ccb_hdr ccb_h;
+	u_int     tag_id;		/* Tag for immediate notify */
+	u_int     seq_id;		/* Tar for target of notify */
+	u_int     initiator_id;		/* Initiator Identifier */
+	u_int     arg;			/* Function specific */
+};
+
 /* HBA engine structures. */
 
 typedef enum {
@@ -894,6 +991,7 @@ union ccb {
 	struct	ccb_dev_match		cdm;
 	struct	ccb_trans_settings	cts;
 	struct	ccb_calc_geometry	ccg;	
+	struct	ccb_sim_knob		knob;	
 	struct	ccb_abort		cab;
 	struct	ccb_resetbus		crb;
 	struct	ccb_resetdev		crd;
@@ -903,6 +1001,8 @@ union ccb {
 	struct	ccb_en_lun		cel;
 	struct	ccb_immed_notify	cin;
 	struct	ccb_notify_ack		cna;
+	struct	ccb_immediate_notify	cin1;
+	struct	ccb_notify_acknowledge	cna2;
 	struct	ccb_eng_inq		cei;
 	struct	ccb_eng_exec		cee;
 	struct 	ccb_rescan		crcn;

Modified: stable/7/sys/cam/cam_xpt.c
==============================================================================
--- stable/7/sys/cam/cam_xpt.c	Tue Feb 23 16:46:34 2010	(r204251)
+++ stable/7/sys/cam/cam_xpt.c	Tue Feb 23 18:37:21 2010	(r204252)
@@ -3150,6 +3150,10 @@ xpt_action(union ccb *start_ccb)
 	case XPT_NOTIFY_ACK:
 	case XPT_GET_TRAN_SETTINGS:
 	case XPT_RESET_BUS:
+	case XPT_IMMEDIATE_NOTIFY:
+	case XPT_NOTIFY_ACKNOWLEDGE:
+	case XPT_GET_SIM_KNOB:
+	case XPT_SET_SIM_KNOB:
 	{
 		struct cam_sim *sim;
 

Modified: stable/7/sys/dev/isp/isp.c
==============================================================================
--- stable/7/sys/dev/isp/isp.c	Tue Feb 23 16:46:34 2010	(r204251)
+++ stable/7/sys/dev/isp/isp.c	Tue Feb 23 18:37:21 2010	(r204252)
@@ -1,17 +1,17 @@
 /*-
- *  Copyright (c) 1997-2007 by Matthew Jacob
+ *  Copyright (c) 1997-2009 by Matthew Jacob
  *  All rights reserved.
- * 
+ *
  *  Redistribution and use in source and binary forms, with or without
  *  modification, are permitted provided that the following conditions
  *  are met:
- * 
+ *
  *  1. Redistributions of source code must retain the above copyright
  *     notice, this list of conditions and the following disclaimer.
  *  2. Redistributions in binary form must reproduce the above copyright
  *     notice, this list of conditions and the following disclaimer in the
  *     documentation and/or other materials provided with the distribution.
- * 
+ *
  *  THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  *  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@@ -23,6 +23,7 @@
  *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  *  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  *  SUCH DAMAGE.
+ *
  */
 
 /*
@@ -62,53 +63,53 @@ __FBSDID("$FreeBSD$");
 /*
  * General defines
  */
-
 #define	MBOX_DELAY_COUNT	1000000 / 100
-#define	ISP_MARK_PORTDB(a, b)	\
-    isp_prt(isp, ISP_LOGSANCFG, "line %d: markportdb", __LINE__); \
-    isp_mark_portdb(a, b)
+#define	ISP_MARK_PORTDB(a, b, c)				\
+    isp_prt(isp, ISP_LOGSANCFG, 				\
+	"Chan %d ISP_MARK_PORTDB at LINE %d", b, __LINE__);	\
+    isp_mark_portdb(a, b, c)
 
 /*
  * Local static data
  */
-static const char fconf[] =
-    "PortDB[%d] changed:\n current =(0x%x at 0x%06x 0x%08x%08x 0x%08x%08x)\n"
-    " database=(0x%x at 0x%06x 0x%08x%08x 0x%08x%08x)";
-static const char notresp[] =
-  "Not RESPONSE in RESPONSE Queue (type 0x%x) @ idx %d (next %d) nlooked %d";
-static const char xact1[] =
-    "HBA attempted queued transaction with disconnect not set for %d.%d.%d";
-static const char xact2[] =
-    "HBA attempted queued transaction to target routine %d on target %d bus %d";
-static const char xact3[] =
-    "HBA attempted queued cmd for %d.%d.%d when queueing disabled";
-static const char pskip[] =
-    "SCSI phase skipped for target %d.%d.%d";
-static const char topology[] =
-    "HBA PortID 0x%06x N-Port Handle %d, Connection Topology '%s'";
-static const char ourwwn[] =
-    "HBA WWNN 0x%08x%08x HBA WWPN 0x%08x%08x";
-static const char finmsg[] =
-    "%d.%d.%d: FIN dl%d resid %d STS 0x%x SKEY %c XS_ERR=0x%x";
-static const char sc0[] =
-    "%s CHAN %d FTHRSH %d IID %d RESETD %d RETRYC %d RETRYD %d ASD 0x%x";
-static const char sc1[] =
-    "%s RAAN 0x%x DLAN 0x%x DDMAB 0x%x CDMAB 0x%x SELTIME %d MQD %d";
-static const char sc2[] = "%s CHAN %d TGT %d FLAGS 0x%x 0x%x/0x%x";
-static const char sc3[] = "Generated";
+static const char fconf[] = "Chan %d PortDB[%d] changed:\n current =(0x%x at 0x%06x 0x%08x%08x 0x%08x%08x)\n database=(0x%x at 0x%06x 0x%08x%08x 0x%08x%08x)";
+static const char notresp[] = "Not RESPONSE in RESPONSE Queue (type 0x%x) @ idx %d (next %d) nlooked %d";
+static const char xact1[] = "HBA attempted queued transaction with disconnect not set for %d.%d.%d";
+static const char xact2[] = "HBA attempted queued transaction to target routine %d on target %d bus %d";
+static const char xact3[] = "HBA attempted queued cmd for %d.%d.%d when queueing disabled";
+static const char pskip[] = "SCSI phase skipped for target %d.%d.%d";
+static const char topology[] = "Chan %d WWPN 0x%08x%08x PortID 0x%06x N-Port Handle %d, Connection '%s'";
+static const char finmsg[] = "%d.%d.%d: FIN dl%d resid %ld STS 0x%x SKEY %c XS_ERR=0x%x";
 static const char sc4[] = "NVRAM";
-static const char bun[] =
-    "bad underrun for %d.%d (count %d, resid %d, status %s)";
+static const char bun[] = "bad underrun for %d.%d (count %d, resid %d, status %s)";
+static const char lipd[] = "Chan %d LIP destroyed %d active commands";
+static const char sacq[] = "unable to acquire scratch area";
+
+static const uint8_t alpa_map[] = {
+	0xef, 0xe8, 0xe4, 0xe2, 0xe1, 0xe0, 0xdc, 0xda,
+	0xd9, 0xd6, 0xd5, 0xd4, 0xd3, 0xd2, 0xd1, 0xce,
+	0xcd, 0xcc, 0xcb, 0xca, 0xc9, 0xc7, 0xc6, 0xc5,
+	0xc3, 0xbc, 0xba, 0xb9, 0xb6, 0xb5, 0xb4, 0xb3,
+	0xb2, 0xb1, 0xae, 0xad, 0xac, 0xab, 0xaa, 0xa9,
+	0xa7, 0xa6, 0xa5, 0xa3, 0x9f, 0x9e, 0x9d, 0x9b,
+	0x98, 0x97, 0x90, 0x8f, 0x88, 0x84, 0x82, 0x81,
+	0x80, 0x7c, 0x7a, 0x79, 0x76, 0x75, 0x74, 0x73,
+	0x72, 0x71, 0x6e, 0x6d, 0x6c, 0x6b, 0x6a, 0x69,
+	0x67, 0x66, 0x65, 0x63, 0x5c, 0x5a, 0x59, 0x56,
+	0x55, 0x54, 0x53, 0x52, 0x51, 0x4e, 0x4d, 0x4c,
+	0x4b, 0x4a, 0x49, 0x47, 0x46, 0x45, 0x43, 0x3c,
+	0x3a, 0x39, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31,
+	0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x27, 0x26,
+	0x25, 0x23, 0x1f, 0x1e, 0x1d, 0x1b, 0x18, 0x17,
+	0x10, 0x0f, 0x08, 0x04, 0x02, 0x01, 0x00
+};
 
 /*
  * Local function prototypes.
  */
 static int isp_parse_async(ispsoftc_t *, uint16_t);
-static int isp_handle_other_response(ispsoftc_t *, int, isphdr_t *,
-    uint32_t *);
-static void
-isp_parse_status(ispsoftc_t *, ispstatusreq_t *, XS_T *, long *);
-static void
+static int isp_handle_other_response(ispsoftc_t *, int, isphdr_t *, uint32_t *);
+static void isp_parse_status(ispsoftc_t *, ispstatusreq_t *, XS_T *, long *); static void
 isp_parse_status_24xx(ispsoftc_t *, isp24xx_statusreq_t *, XS_T *, long *);
 static void isp_fastpost_complete(ispsoftc_t *, uint16_t);
 static int isp_mbox_continue(ispsoftc_t *);
@@ -116,39 +117,37 @@ static void isp_scsi_init(ispsoftc_t *);
 static void isp_scsi_channel_init(ispsoftc_t *, int);
 static void isp_fibre_init(ispsoftc_t *);
 static void isp_fibre_init_2400(ispsoftc_t *);
-static void isp_mark_portdb(ispsoftc_t *, int);
-static int isp_plogx(ispsoftc_t *, uint16_t, uint32_t, int, int);
+static void isp_mark_portdb(ispsoftc_t *, int, int);
+static int isp_plogx(ispsoftc_t *, int, uint16_t, uint32_t, int, int);
 static int isp_port_login(ispsoftc_t *, uint16_t, uint32_t);
 static int isp_port_logout(ispsoftc_t *, uint16_t, uint32_t);
-static int isp_getpdb(ispsoftc_t *, uint16_t, isp_pdb_t *, int);
-static uint64_t isp_get_portname(ispsoftc_t *, int, int);
-static int isp_fclink_test(ispsoftc_t *, int);
-static const char *ispfc_fw_statename(int);
-static int isp_pdb_sync(ispsoftc_t *);
-static int isp_scan_loop(ispsoftc_t *);
-static int isp_gid_ft_sns(ispsoftc_t *);
-static int isp_gid_ft_ct_passthru(ispsoftc_t *);
-static int isp_scan_fabric(ispsoftc_t *);
-static int isp_login_device(ispsoftc_t *, uint32_t, isp_pdb_t *, uint16_t *);
-static int isp_register_fc4_type(ispsoftc_t *);
-static int isp_register_fc4_type_24xx(ispsoftc_t *);
-static uint16_t isp_nxt_handle(ispsoftc_t *, uint16_t);
-static void isp_fw_state(ispsoftc_t *);
+static int isp_getpdb(ispsoftc_t *, int, uint16_t, isp_pdb_t *, int);
+static void isp_dump_chip_portdb(ispsoftc_t *, int, int);
+static uint64_t isp_get_wwn(ispsoftc_t *, int, int, int);
+static int isp_fclink_test(ispsoftc_t *, int, int);
+static int isp_pdb_sync(ispsoftc_t *, int);
+static int isp_scan_loop(ispsoftc_t *, int);
+static int isp_gid_ft_sns(ispsoftc_t *, int);
+static int isp_gid_ft_ct_passthru(ispsoftc_t *, int);
+static int isp_scan_fabric(ispsoftc_t *, int);
+static int isp_login_device(ispsoftc_t *, int, uint32_t, isp_pdb_t *, uint16_t *);
+static int isp_register_fc4_type(ispsoftc_t *, int);
+static int isp_register_fc4_type_24xx(ispsoftc_t *, int);
+static uint16_t isp_nxt_handle(ispsoftc_t *, int, uint16_t);
+static void isp_fw_state(ispsoftc_t *, int);
 static void isp_mboxcmd_qnw(ispsoftc_t *, mbreg_t *, int);
 static void isp_mboxcmd(ispsoftc_t *, mbreg_t *);
 
-static void isp_update(ispsoftc_t *);
-static void isp_update_bus(ispsoftc_t *, int);
-static void isp_setdfltparm(ispsoftc_t *, int);
-static void isp_setdfltfcparm(ispsoftc_t *);
-static int isp_read_nvram(ispsoftc_t *);
-static int isp_read_nvram_2400(ispsoftc_t *);
+static void isp_spi_update(ispsoftc_t *, int);
+static void isp_setdfltsdparm(ispsoftc_t *);
+static void isp_setdfltfcparm(ispsoftc_t *, int);
+static int isp_read_nvram(ispsoftc_t *, int);
+static int isp_read_nvram_2400(ispsoftc_t *, uint8_t *);
 static void isp_rdnvram_word(ispsoftc_t *, int, uint16_t *);
 static void isp_rd_2400_nvram(ispsoftc_t *, uint32_t, uint32_t *);
 static void isp_parse_nvram_1020(ispsoftc_t *, uint8_t *);
 static void isp_parse_nvram_1080(ispsoftc_t *, int, uint8_t *);
 static void isp_parse_nvram_12160(ispsoftc_t *, int, uint8_t *);
-static void isp_fix_nvram_wwns(ispsoftc_t *);
 static void isp_parse_nvram_2100(ispsoftc_t *, uint8_t *);
 static void isp_parse_nvram_2400(ispsoftc_t *, uint8_t *);
 
@@ -161,15 +160,20 @@ static void isp_parse_nvram_2400(ispsoft
  */
 
 void
-isp_reset(ispsoftc_t *isp)
+isp_reset(ispsoftc_t *isp, int do_load_defaults)
 {
 	mbreg_t mbs;
 	uint32_t code_org, val;
 	int loops, i, dodnld = 1;
-	static const char *btype = "????";
+	const char *btype = "????";
 	static const char dcrc[] = "Downloaded RISC Code Checksum Failure";
 
 	isp->isp_state = ISP_NILSTATE;
+	if (isp->isp_dead) {
+		isp_shutdown(isp);
+		ISP_DISABLE_INTS(isp);
+		return;
+	}
 
 	/*
 	 * Basic types (SCSI, FibreChannel and PCI or SBus)
@@ -181,51 +185,6 @@ isp_reset(ispsoftc_t *isp)
 	 * for SCSI adapters and do other settings for the 2100.
 	 */
 
-	/*
-	 * Get the current running firmware revision out of the
-	 * chip before we hit it over the head (if this is our
-	 * first time through). Note that we store this as the
-	 * 'ROM' firmware revision- which it may not be. In any
-	 * case, we don't really use this yet, but we may in
-	 * the future.
-	 */
-	if (isp->isp_touched == 0) {
-		/*
-		 * First see whether or not we're sitting in the ISP PROM.
-		 * If we've just been reset, we'll have the string "ISP   "
-		 * spread through outgoing mailbox registers 1-3. We do
-		 * this for PCI cards because otherwise we really don't
-		 * know what state the card is in and we could hang if
-		 * we try this command otherwise.
-		 *
-		 * For SBus cards, we just do this because they almost
-		 * certainly will be running firmware by now.
-		 */
-		if (ISP_READ(isp, OUTMAILBOX1) != 0x4953 ||
-		    ISP_READ(isp, OUTMAILBOX2) != 0x5020 ||
-		    ISP_READ(isp, OUTMAILBOX3) != 0x2020) {
-			/*
-			 * Just in case it was paused...
-			 */
-			if (IS_24XX(isp)) {
-				ISP_WRITE(isp, BIU2400_HCCR,
-				    HCCR_2400_CMD_RELEASE);
-			} else {
-				ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE);
-			}
-			MEMZERO(&mbs, sizeof (mbs));
-			mbs.param[0] = MBOX_ABOUT_FIRMWARE;
-			mbs.logval = MBLOGNONE;
-			isp_mboxcmd(isp, &mbs);
-			if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
-				isp->isp_romfw_rev[0] = mbs.param[1];
-				isp->isp_romfw_rev[1] = mbs.param[2];
-				isp->isp_romfw_rev[2] = mbs.param[3];
-			}
-		}
-		isp->isp_touched = 1;
-	}
-
 	ISP_DISABLE_INTS(isp);
 
 	/*
@@ -244,17 +203,16 @@ isp_reset(ispsoftc_t *isp)
 	}
 
 	/*
-	 * Set up DMA for the request and result queues.
+	 * Set up DMA for the request and response queues.
 	 *
 	 * We do this now so we can use the request queue
-	 * for a dma
+	 * for dma to load firmware from.
 	 */
 	if (ISP_MBOXDMASETUP(isp) != 0) {
 		isp_prt(isp, ISP_LOGERR, "Cannot setup DMA");
 		return;
 	}
 
-
 	/*
 	 * Set up default request/response queue in-pointer/out-pointer
 	 * register indices.
@@ -264,8 +222,6 @@ isp_reset(ispsoftc_t *isp)
 		isp->isp_rqstoutrp = BIU2400_REQOUTP;
 		isp->isp_respinrp = BIU2400_RSPINP;
 		isp->isp_respoutrp = BIU2400_RSPOUTP;
-		isp->isp_atioinrp = BIU2400_ATIO_RSPINP;
-		isp->isp_atiooutrp = BIU2400_ATIO_REQINP;
 	} else if (IS_23XX(isp)) {
 		isp->isp_rqstinrp = BIU_REQINP;
 		isp->isp_rqstoutrp = BIU_REQOUTP;
@@ -310,6 +266,9 @@ isp_reset(ispsoftc_t *isp)
 		case ISP_HA_FC_2400:
 			btype = "2422";
 			break;
+		case ISP_HA_FC_2500:
+			btype = "2532";
+			break;
 		default:
 			break;
 		}
@@ -326,11 +285,13 @@ isp_reset(ispsoftc_t *isp)
 			ISP_WRITE(isp, BIU2100_CSR, BIU2100_RISC_REGS);
 		}
 	} else if (IS_1240(isp)) {
-		sdparam *sdp = isp->isp_param;
+		sdparam *sdp;
+
 		btype = "1240";
 		isp->isp_clock = 60;
+		sdp = SDPARAM(isp, 0);
 		sdp->isp_ultramode = 1;
-		sdp++;
+		sdp = SDPARAM(isp, 1);
 		sdp->isp_ultramode = 1;
 		/*
 		 * XXX: Should probably do some bus sensing.
@@ -355,7 +316,7 @@ isp_reset(ispsoftc_t *isp)
 	} else if (IS_ULTRA2(isp)) {
 		static const char m[] = "bus %d is in %s Mode";
 		uint16_t l;
-		sdparam *sdp = isp->isp_param;
+		sdparam *sdp = SDPARAM(isp, 0);
 
 		isp->isp_clock = 100;
 
@@ -387,10 +348,10 @@ isp_reset(ispsoftc_t *isp)
 		}
 
 		if (IS_DUALBUS(isp)) {
-			sdp++;
+			sdp = SDPARAM(isp, 1);
 			l = ISP_READ(isp, SXP_PINS_DIFF|SXP_BANK1_SELECT);
 			l &= ISP1080_MODE_MASK;
-			switch(l) {
+			switch (l) {
 			case ISP1080_LVD_MODE:
 				sdp->isp_lvdmode = 1;
 				isp_prt(isp, ISP_LOGCONFIG, m, 1, "LVD");
@@ -412,7 +373,7 @@ isp_reset(ispsoftc_t *isp)
 			}
 		}
 	} else {
-		sdparam *sdp = isp->isp_param;
+		sdparam *sdp = SDPARAM(isp, 0);
 		i = ISP_READ(isp, BIU_CONF0) & BIU_CONF0_HW_MASK;
 		switch (i) {
 		default:
@@ -509,7 +470,7 @@ isp_reset(ispsoftc_t *isp)
 
 	/*
 	 * Hit the chip over the head with hammer,
-	 * and give the ISP a chance to recover.
+	 * and give it a chance to recover.
 	 */
 
 	if (IS_SCSI(isp)) {
@@ -517,15 +478,13 @@ isp_reset(ispsoftc_t *isp)
 		/*
 		 * A slight delay...
 		 */
-		USEC_DELAY(100);
+		ISP_DELAY(100);
 
 		/*
 		 * Clear data && control DMA engines.
 		 */
-		ISP_WRITE(isp, CDMA_CONTROL,
-		    DMA_CNTRL_CLEAR_CHAN | DMA_CNTRL_RESET_INT);
-		ISP_WRITE(isp, DDMA_CONTROL,
-		    DMA_CNTRL_CLEAR_CHAN | DMA_CNTRL_RESET_INT);
+		ISP_WRITE(isp, CDMA_CONTROL, DMA_CNTRL_CLEAR_CHAN | DMA_CNTRL_RESET_INT);
+		ISP_WRITE(isp, DDMA_CONTROL, DMA_CNTRL_CLEAR_CHAN | DMA_CNTRL_RESET_INT);
 
 
 	} else if (IS_24XX(isp)) {
@@ -534,12 +493,12 @@ isp_reset(ispsoftc_t *isp)
 		 */
 		ISP_WRITE(isp, BIU2400_CSR, BIU2400_DMA_STOP|(3 << 4));
 		for (val = loops = 0; loops < 30000; loops++) {
-			USEC_DELAY(10);
+			ISP_DELAY(10);
 			val = ISP_READ(isp, BIU2400_CSR);
 			if ((val & BIU2400_DMA_ACTIVE) == 0) {
 				break;
 			}
-		} 
+		}
 		if (val & BIU2400_DMA_ACTIVE) {
 			ISP_RESET0(isp);
 			isp_prt(isp, ISP_LOGERR, "DMA Failed to Stop on Reset");
@@ -548,11 +507,10 @@ isp_reset(ispsoftc_t *isp)
 		/*
 		 * Hold it in SOFT_RESET and STOP state for 100us.
 		 */
-		ISP_WRITE(isp, BIU2400_CSR,
-		    BIU2400_SOFT_RESET|BIU2400_DMA_STOP|(3 << 4));
-		USEC_DELAY(100);
+		ISP_WRITE(isp, BIU2400_CSR, BIU2400_SOFT_RESET|BIU2400_DMA_STOP|(3 << 4));
+		ISP_DELAY(100);
 		for (loops = 0; loops < 10000; loops++) {
-			USEC_DELAY(5);
+			ISP_DELAY(5);
 			val = ISP_READ(isp, OUTMAILBOX0);
 		}
 		for (val = loops = 0; loops < 500000; loops ++) {
@@ -571,17 +529,14 @@ isp_reset(ispsoftc_t *isp)
 		/*
 		 * A slight delay...
 		 */
-		USEC_DELAY(100);
+		ISP_DELAY(100);
 
 		/*
 		 * Clear data && control DMA engines.
 		 */
-		ISP_WRITE(isp, CDMA2100_CONTROL,
-			DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT);
-		ISP_WRITE(isp, TDMA2100_CONTROL,
-			DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT);
-		ISP_WRITE(isp, RDMA2100_CONTROL,
-			DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT);
+		ISP_WRITE(isp, CDMA2100_CONTROL, DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT);
+		ISP_WRITE(isp, TDMA2100_CONTROL, DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT);
+		ISP_WRITE(isp, RDMA2100_CONTROL, DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT);
 	}
 
 	/*
@@ -601,7 +556,7 @@ isp_reset(ispsoftc_t *isp)
 			if (!(ISP_READ(isp, BIU2100_CSR) & BIU2100_SOFT_RESET))
 				break;
 		}
-		USEC_DELAY(100);
+		ISP_DELAY(100);
 		if (--loops < 0) {
 			ISP_DUMPREGS(isp, "chip reset timed out");
 			ISP_RESET0(isp);
@@ -629,17 +584,16 @@ isp_reset(ispsoftc_t *isp)
 		ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_CLEAR_RESET);
 	} else {
 		ISP_WRITE(isp, HCCR, HCCR_CMD_RESET);
-		USEC_DELAY(100);
+		ISP_DELAY(100);
 		ISP_WRITE(isp, BIU_SEMA, 0);
 	}
 
-	
 	/*
 	 * Post-RISC Reset stuff.
 	 */
 	if (IS_24XX(isp)) {
 		for (val = loops = 0; loops < 5000000; loops++) {
-			USEC_DELAY(5);
+			ISP_DELAY(5);
 			val = ISP_READ(isp, OUTMAILBOX0);
 			if (val == 0) {
 				break;
@@ -663,8 +617,8 @@ isp_reset(ispsoftc_t *isp)
 			ISP_SETBITS(isp, CDMA_CONF, DMA_ENABLE_BURST);
 			ISP_SETBITS(isp, DDMA_CONF, DMA_ENABLE_BURST);
 		}
-		if (SDPARAM(isp)->isp_ptisp) {
-			if (SDPARAM(isp)->isp_ultramode) {
+		if (SDPARAM(isp, 0)->isp_ptisp) {
+			if (SDPARAM(isp, 0)->isp_ultramode) {
 				while (ISP_READ(isp, RISC_MTR) != 0x1313) {
 					ISP_WRITE(isp, RISC_MTR, 0x1313);
 					ISP_WRITE(isp, HCCR, HCCR_CMD_STEP);
@@ -692,7 +646,12 @@ isp_reset(ispsoftc_t *isp)
 	ISP_WRITE(isp, isp->isp_rqstoutrp, 0);
 	ISP_WRITE(isp, isp->isp_respinrp, 0);
 	ISP_WRITE(isp, isp->isp_respoutrp, 0);
-
+	if (IS_24XX(isp)) {
+		ISP_WRITE(isp, BIU2400_PRI_REQINP, 0);
+		ISP_WRITE(isp, BIU2400_PRI_REQOUTP, 0);
+		ISP_WRITE(isp, BIU2400_ATIO_RSPINP, 0);
+		ISP_WRITE(isp, BIU2400_ATIO_RSPOUTP, 0);
+	}
 
 	/*
 	 * Do MD specific post initialization
@@ -702,15 +661,15 @@ isp_reset(ispsoftc_t *isp)
 	/*
 	 * Wait for everything to finish firing up.
 	 *
-	 * Avoid doing this on the 2312 because you can generate a PCI
+	 * Avoid doing this on early 2312s because you can generate a PCI
 	 * parity error (chip breakage).
 	 */
-	if (IS_2312(isp)) {
-		USEC_DELAY(100);
+	if (IS_2312(isp) && isp->isp_revision < 2) {
+		ISP_DELAY(100);
 	} else {
 		loops = MBOX_DELAY_COUNT;
 		while (ISP_READ(isp, OUTMAILBOX0) == MBOX_BUSY) {
-			USEC_DELAY(100);
+			ISP_DELAY(100);
 			if (--loops < 0) {
 				ISP_RESET0(isp);
 				isp_prt(isp, ISP_LOGERR,
@@ -727,19 +686,25 @@ isp_reset(ispsoftc_t *isp)
 	 */
 
 	/*
-	 * Do some sanity checking.
+	 * Do some sanity checking by running a NOP command.
+	 * If it succeeds, the ROM firmware is now running.
 	 */
-	MEMZERO(&mbs, sizeof (mbs));
+	ISP_MEMZERO(&mbs, sizeof (mbs));
 	mbs.param[0] = MBOX_NO_OP;
 	mbs.logval = MBLOGALL;
 	isp_mboxcmd(isp, &mbs);
 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
+		isp_prt(isp, ISP_LOGERR, "NOP command failed (%x)", mbs.param[0]);
 		ISP_RESET0(isp);
 		return;
 	}
 
+	/*
+	 * Do some operational tests
+	 */
+
 	if (IS_SCSI(isp) || IS_24XX(isp)) {
-		MEMZERO(&mbs, sizeof (mbs));
+		ISP_MEMZERO(&mbs, sizeof (mbs));
 		mbs.param[0] = MBOX_MAILBOX_REG_TEST;
 		mbs.param[1] = 0xdead;
 		mbs.param[2] = 0xbeef;
@@ -758,10 +723,7 @@ isp_reset(ispsoftc_t *isp)
 		    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],
-			    mbs.param[4], mbs.param[5]);
+			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], mbs.param[4], mbs.param[5]);
 			return;
 		}
 
@@ -776,8 +738,7 @@ isp_reset(ispsoftc_t *isp)
 	 * whether we have f/w at all and whether a config flag
 	 * has disabled our download.
 	 */
-	if ((isp->isp_mdvec->dv_ispfw == NULL) ||
-	    (isp->isp_confopts & ISP_CFG_NORELOAD)) {
+	if ((isp->isp_mdvec->dv_ispfw == NULL) || (isp->isp_confopts & ISP_CFG_NORELOAD)) {
 		dodnld = 0;
 	}
 
@@ -793,13 +754,6 @@ isp_reset(ispsoftc_t *isp)
 		const uint32_t *ptr = isp->isp_mdvec->dv_ispfw;
 
 		/*
-		 * NB: Whatever you do do, do *not* issue the VERIFY FIRMWARE
-		 * NB: command to the 2400 while loading new firmware. This
-		 * NB: causes the new f/w to start and immediately crash back
-		 * NB: to the ROM.
-		 */
-
-		/*
 		 * Keep loading until we run out of f/w.
 		 */
 		code_org = ptr[2];	/* 1st load address is our start addr */
@@ -807,9 +761,7 @@ isp_reset(ispsoftc_t *isp)
 		for (;;) {
 			uint32_t la, wi, wl;
 
-			isp_prt(isp, ISP_LOGDEBUG0,
-			    "load 0x%x words of code at load address 0x%x",
-			    ptr[3], ptr[2]);
+			isp_prt(isp, ISP_LOGDEBUG0, "load 0x%x words of code at load address 0x%x", ptr[3], ptr[2]);
 
 			wi = 0;
 			la = ptr[2];
@@ -828,23 +780,31 @@ isp_reset(ispsoftc_t *isp)
 					ISP_IOXPUT_32(isp,  ptr[wi++], &cp[i]);
 					wl--;
 				}
-				MEMORYBARRIER(isp, SYNC_REQUEST,
-				    0, ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)));
-				MEMZERO(&mbs, sizeof (mbs));
-				mbs.param[0] = MBOX_LOAD_RISC_RAM;
-				mbs.param[1] = la;
-				mbs.param[2] = DMA_WD1(isp->isp_rquest_dma);
-				mbs.param[3] = DMA_WD0(isp->isp_rquest_dma);
-				mbs.param[4] = nw >> 16;
-				mbs.param[5] = nw;
-				mbs.param[6] = DMA_WD3(isp->isp_rquest_dma);
-				mbs.param[7] = DMA_WD2(isp->isp_rquest_dma);
-				mbs.param[8] = la >> 16;
+				MEMORYBARRIER(isp, SYNC_REQUEST, 0, ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)));
+				ISP_MEMZERO(&mbs, sizeof (mbs));
+				if (la < 0x10000 && nw < 0x10000) {
+					mbs.param[0] = MBOX_LOAD_RISC_RAM_2100;
+					mbs.param[1] = la;
+					mbs.param[2] = DMA_WD1(isp->isp_rquest_dma);
+					mbs.param[3] = DMA_WD0(isp->isp_rquest_dma);
+					mbs.param[4] = nw;
+					mbs.param[6] = DMA_WD3(isp->isp_rquest_dma);
+					mbs.param[7] = DMA_WD2(isp->isp_rquest_dma);
+				} else {
+					mbs.param[0] = MBOX_LOAD_RISC_RAM;
+					mbs.param[1] = la;
+					mbs.param[2] = DMA_WD1(isp->isp_rquest_dma);
+					mbs.param[3] = DMA_WD0(isp->isp_rquest_dma);
+					mbs.param[4] = nw >> 16;
+					mbs.param[5] = nw;
+					mbs.param[6] = DMA_WD3(isp->isp_rquest_dma);
+					mbs.param[7] = DMA_WD2(isp->isp_rquest_dma);
+					mbs.param[8] = la >> 16;
+				}
 				mbs.logval = MBLOGALL;
 				isp_mboxcmd(isp, &mbs);
 				if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
-					isp_prt(isp, ISP_LOGERR,
-					    "F/W Risc Ram Load Failed");
+					isp_prt(isp, ISP_LOGERR, "F/W Risc Ram Load Failed");
 					ISP_RESET0(isp);
 					return;
 				}
@@ -855,7 +815,7 @@ isp_reset(ispsoftc_t *isp)
 				break;
 			}
 			ptr += ptr[3];
-		} 
+		}
 		isp->isp_loaded_fw = 1;
 	} else if (dodnld && IS_23XX(isp)) {
 		const uint16_t *ptr = isp->isp_mdvec->dv_ispfw;
@@ -868,17 +828,15 @@ isp_reset(ispsoftc_t *isp)
 		for (;;) {
 			uint32_t nxtaddr;
 
-			isp_prt(isp, ISP_LOGDEBUG0,
-			    "load 0x%x words of code at load address 0x%x",
-			    ptr[3], la);
+			isp_prt(isp, ISP_LOGDEBUG0, "load 0x%x words of code at load address 0x%x", ptr[3], la);
 
 			wi = 0;
 			wl = ptr[3];
 
 			while (wi < ptr[3]) {
 				uint16_t *cp;
-				uint32_t nw;
-				
+				uint16_t nw;
+
 				nw = ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)) >> 1;
 				if (nw > wl) {
 					nw = wl;
@@ -891,22 +849,30 @@ isp_reset(ispsoftc_t *isp)
 					ISP_IOXPUT_16(isp,  ptr[wi++], &cp[i]);
 					wl--;
 				}
-				MEMORYBARRIER(isp, SYNC_REQUEST,
-				    0, ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)));
-				MEMZERO(&mbs, sizeof (mbs));
-				mbs.param[0] = MBOX_LOAD_RISC_RAM;
-				mbs.param[1] = la;
-				mbs.param[2] = DMA_WD1(isp->isp_rquest_dma);
-				mbs.param[3] = DMA_WD0(isp->isp_rquest_dma);
-				mbs.param[4] = nw;
-				mbs.param[6] = DMA_WD3(isp->isp_rquest_dma);
-				mbs.param[7] = DMA_WD2(isp->isp_rquest_dma);
-				mbs.param[8] = la >> 16;
+				MEMORYBARRIER(isp, SYNC_REQUEST, 0, ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)));
+				ISP_MEMZERO(&mbs, sizeof (mbs));
+				if (la < 0x10000) {
+					mbs.param[0] = MBOX_LOAD_RISC_RAM_2100;
+					mbs.param[1] = la;
+					mbs.param[2] = DMA_WD1(isp->isp_rquest_dma);
+					mbs.param[3] = DMA_WD0(isp->isp_rquest_dma);
+					mbs.param[4] = nw;
+					mbs.param[6] = DMA_WD3(isp->isp_rquest_dma);
+					mbs.param[7] = DMA_WD2(isp->isp_rquest_dma);
+				} else {
+					mbs.param[0] = MBOX_LOAD_RISC_RAM;
+					mbs.param[1] = la;
+					mbs.param[2] = DMA_WD1(isp->isp_rquest_dma);
+					mbs.param[3] = DMA_WD0(isp->isp_rquest_dma);
+					mbs.param[4] = nw;
+					mbs.param[6] = DMA_WD3(isp->isp_rquest_dma);
+					mbs.param[7] = DMA_WD2(isp->isp_rquest_dma);
+					mbs.param[8] = la >> 16;
+				}
 				mbs.logval = MBLOGALL;
 				isp_mboxcmd(isp, &mbs);
 				if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
-					isp_prt(isp, ISP_LOGERR,
-					    "F/W Risc Ram Load Failed");
+					isp_prt(isp, ISP_LOGERR, "F/W Risc Ram Load Failed");
 					ISP_RESET0(isp);
 					return;
 				}
@@ -914,19 +880,6 @@ isp_reset(ispsoftc_t *isp)
 			}
 
 			if (!IS_2322(isp)) {
-				/*
-				 * Verify that it downloaded correctly.
-				 */
-				MEMZERO(&mbs, sizeof (mbs));
-				mbs.param[0] = MBOX_VERIFY_CHECKSUM;
-				mbs.param[1] = code_org;
-				mbs.logval = MBLOGNONE;
-				isp_mboxcmd(isp, &mbs);
-				if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
-					isp_prt(isp, ISP_LOGERR, dcrc);
-					ISP_RESET0(isp);
-					return;
-				}
 				break;
 			}
 
@@ -951,41 +904,45 @@ isp_reset(ispsoftc_t *isp)
 		union {
 			const uint16_t *cp;
 			uint16_t *np;
-		} u;
-		u.cp = isp->isp_mdvec->dv_ispfw;
-		isp->isp_mbxworkp = &u.np[1];
-		isp->isp_mbxwrk0 = u.np[3] - 1;
+		} ucd;
+		ucd.cp = isp->isp_mdvec->dv_ispfw;
+		isp->isp_mbxworkp = &ucd.np[1];
+		isp->isp_mbxwrk0 = ucd.np[3] - 1;
 		isp->isp_mbxwrk1 = code_org + 1;
-		MEMZERO(&mbs, sizeof (mbs));
+		ISP_MEMZERO(&mbs, sizeof (mbs));
 		mbs.param[0] = MBOX_WRITE_RAM_WORD;
 		mbs.param[1] = code_org;
-		mbs.param[2] = u.np[0];
+		mbs.param[2] = ucd.np[0];
 		mbs.logval = MBLOGNONE;
 		isp_mboxcmd(isp, &mbs);
 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
-			isp_prt(isp, ISP_LOGERR,
-			    "F/W download failed at word %d",
-			    isp->isp_mbxwrk1 - code_org);
+			isp_prt(isp, ISP_LOGERR, "F/W download failed at word %d", isp->isp_mbxwrk1 - code_org);
 			ISP_RESET0(isp);
 			return;
 		}
-		/*
-		 * Verify that it downloaded correctly.
-		 */
-		MEMZERO(&mbs, sizeof (mbs));
+	} else {
+		isp->isp_loaded_fw = 0;
+		isp_prt(isp, ISP_LOGDEBUG2, "skipping f/w download");
+	}
+
+	/*
+	 * If we loaded firmware, verify its checksum
+	 */
+	if (isp->isp_loaded_fw) {
+		ISP_MEMZERO(&mbs, sizeof (mbs));
 		mbs.param[0] = MBOX_VERIFY_CHECKSUM;
-		mbs.param[1] = code_org;
-		mbs.logval = MBLOGNONE;
+		if (IS_24XX(isp)) {
+			mbs.param[1] = code_org >> 16;
+			mbs.param[2] = code_org;
+		} else {
+			mbs.param[1] = code_org;
+		}
 		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;
-	} else {
-		isp->isp_loaded_fw = 0;
-		isp_prt(isp, ISP_LOGDEBUG2, "skipping f/w download");
 	}
 
 	/*
@@ -996,9 +953,7 @@ isp_reset(ispsoftc_t *isp)
 	 */
 
 
-	MEMZERO(&mbs, sizeof (mbs));
-	mbs.timeout = 1000000;
-	mbs.param[0] = MBOX_EXEC_FIRMWARE;
+	MBSINIT(&mbs, MBOX_EXEC_FIRMWARE, MBLOGALL, 1000000);
 	if (IS_24XX(isp)) {
 		mbs.param[1] = code_org >> 16;
 		mbs.param[2] = code_org;
@@ -1007,6 +962,9 @@ isp_reset(ispsoftc_t *isp)
 		} else {
 			mbs.param[3] = 1;
 		}
+		if (IS_25XX(isp)) {
+			mbs.ibits |= 0x10;
+		}
 	} else if (IS_2322(isp)) {
 		mbs.param[1] = code_org;
 		if (isp->isp_loaded_fw) {
@@ -1017,8 +975,6 @@ isp_reset(ispsoftc_t *isp)
 	} else {
 		mbs.param[1] = code_org;
 	}
-
-	mbs.logval = MBLOGALL;

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


More information about the svn-src-stable mailing list