summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authormjacob <mjacob@FreeBSD.org>2007-03-22 23:38:32 +0000
committermjacob <mjacob@FreeBSD.org>2007-03-22 23:38:32 +0000
commit6f755d6db148e306ad33a22315a01a7517244356 (patch)
tree85e12f0631429fadf68036c6a1b21a0a6b2c464d /sys
parent19daed61a74611f0a0af9192abefe321ed79499c (diff)
downloadFreeBSD-src-6f755d6db148e306ad33a22315a01a7517244356.zip
FreeBSD-src-6f755d6db148e306ad33a22315a01a7517244356.tar.gz
MFP4: a) Some constification from NetBSD (gcc 4.1.2)
b) Split default param fetching/setting into scsi and fibre functions and retry the fibre fetch more than once. MFC after: 1 week
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/isp/isp.c246
-rw-r--r--sys/dev/isp/isp_library.c2
-rw-r--r--sys/dev/isp/isp_library.h2
-rw-r--r--sys/dev/isp/isp_pci.c7
-rw-r--r--sys/dev/isp/ispvar.h10
5 files changed, 142 insertions, 125 deletions
diff --git a/sys/dev/isp/isp.c b/sys/dev/isp/isp.c
index 6e938bc..d941e03 100644
--- a/sys/dev/isp/isp.c
+++ b/sys/dev/isp/isp.c
@@ -140,6 +140,7 @@ 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_rdnvram_word(ispsoftc_t *, int, uint16_t *);
@@ -776,7 +777,7 @@ isp_reset(ispsoftc_t *isp)
}
if (dodnld && IS_24XX(isp)) {
- uint32_t *ptr = isp->isp_mdvec->dv_ispfw;
+ const uint32_t *ptr = isp->isp_mdvec->dv_ispfw;
/*
* NB: Whatever you do do, do *not* issue the VERIFY FIRMWARE
@@ -844,7 +845,7 @@ isp_reset(ispsoftc_t *isp)
}
isp->isp_loaded_fw = 1;
} else if (dodnld && IS_23XX(isp)) {
- uint16_t *ptr = isp->isp_mdvec->dv_ispfw;
+ const uint16_t *ptr = isp->isp_mdvec->dv_ispfw;
uint16_t wi, wl, segno;
uint32_t la;
@@ -934,15 +935,18 @@ isp_reset(ispsoftc_t *isp)
}
isp->isp_loaded_fw = 1;
} else if (dodnld) {
- uint16_t *ptr = isp->isp_mdvec->dv_ispfw;
-
- isp->isp_mbxworkp = &ptr[1];
- isp->isp_mbxwrk0 = ptr[3] - 1;
+ 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;
isp->isp_mbxwrk1 = code_org + 1;
MEMZERO(&mbs, sizeof (mbs));
mbs.param[0] = MBOX_WRITE_RAM_WORD;
mbs.param[1] = code_org;
- mbs.param[2] = ptr[0];
+ mbs.param[2] = u.np[0];
mbs.logval = MBLOGNONE;
isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
@@ -1176,9 +1180,13 @@ isp_reset(ispsoftc_t *isp)
/*
* Must do this first to get defaults established.
*/
- isp_setdfltparm(isp, 0);
- if (IS_DUALBUS(isp)) {
- isp_setdfltparm(isp, 1);
+ if (IS_SCSI(isp)) {
+ isp_setdfltparm(isp, 0);
+ if (IS_DUALBUS(isp)) {
+ isp_setdfltparm(isp, 1);
+ }
+ } else {
+ isp_setdfltfcparm(isp);
}
}
@@ -3403,7 +3411,7 @@ isp_scan_fabric(ispsoftc_t *isp)
fcportdb_t *lp;
isp_pdb_t pdb;
uint64_t wwnn, wwpn;
- int dbidx, r, nr;
+ int dbidx, nr;
portid =
((rs1->snscb_ports[portidx].portid[0]) << 16) |
@@ -4535,8 +4543,8 @@ again:
if (mbox & 0x4000) {
isp->isp_intmboxc++;
if (isp->isp_mboxbsy) {
- int i = 0, obits = isp->isp_obits;
- isp->isp_mboxtmp[i++] = mbox;
+ int obits = isp->isp_obits;
+ isp->isp_mboxtmp[0] = mbox;
for (i = 1; i < MAX_MAILBOX(isp); i++) {
if ((obits & (1 << i)) == 0) {
continue;
@@ -5838,7 +5846,7 @@ isp_parse_status(ispsoftc_t *isp, ispstatusreq_t *sp, XS_T *xs, long *rp)
*/
case RQCS_PORT_LOGGED_OUT:
{
- char *reason;
+ const char *reason;
uint8_t sts = sp->req_completion_status & 0xff;
/*
@@ -5988,7 +5996,7 @@ isp_parse_status_24xx(ispsoftc_t *isp, isp24xx_statusreq_t *sp,
*/
case RQCS_PORT_LOGGED_OUT:
{
- char *reason;
+ const char *reason;
uint8_t sts = sp->req_completion_status & 0xff;
/*
@@ -6269,7 +6277,7 @@ static const uint32_t mbpscsi[] = {
ISPOPMAP(0x01, 0x01) /* 0x5d: GET NOST DATA */
};
-static char *scsi_mbcmd_names[] = {
+static const char *scsi_mbcmd_names[] = {
"NO-OP",
"LOAD RAM",
"EXEC FIRMWARE",
@@ -6504,7 +6512,7 @@ static const uint32_t mbpfc[] = {
* is that we won't overflow.
*/
-static char *fc_mbcmd_names[] = {
+static const char *fc_mbcmd_names[] = {
"NO-OP",
"LOAD RAM",
"EXEC FIRMWARE",
@@ -6681,7 +6689,8 @@ isp_mboxcmd_qnw(ispsoftc_t *isp, mbreg_t *mbp, int nodelay)
static void
isp_mboxcmd(ispsoftc_t *isp, mbreg_t *mbp)
{
- char *cname, *xname, tname[16], mname[16];
+ const char *cname, *xname;
+ char tname[16], mname[16];
unsigned int lim, ibits, obits, box, opcode;
const uint32_t *mcp;
@@ -6999,9 +7008,6 @@ isp_update_bus(ispsoftc_t *isp, int bus)
}
}
-#ifndef DEFAULT_FRAMESIZE
-#define DEFAULT_FRAMESIZE(isp) ICB_DFLT_FRMLEN
-#endif
#ifndef DEFAULT_EXEC_THROTTLE
#define DEFAULT_EXEC_THROTTLE(isp) ISP_EXEC_THROTTLE
#endif
@@ -7012,97 +7018,6 @@ isp_setdfltparm(ispsoftc_t *isp, int channel)
int tgt;
sdparam *sdp;
- if (IS_FC(isp)) {
- fcparam *fcp = (fcparam *) isp->isp_param;
- int nvfail;
-
- fcp += channel;
- if (fcp->isp_gotdparms) {
- return;
- }
- fcp->isp_gotdparms = 1;
- fcp->isp_maxfrmlen = DEFAULT_FRAMESIZE(isp);
- fcp->isp_maxalloc = ICB_DFLT_ALLOC;
- fcp->isp_execthrottle = DEFAULT_EXEC_THROTTLE(isp);
- fcp->isp_retry_delay = ICB_DFLT_RDELAY;
- fcp->isp_retry_count = ICB_DFLT_RCOUNT;
- /* Platform specific.... */
- fcp->isp_loopid = DEFAULT_LOOPID(isp);
- fcp->isp_wwnn_nvram = DEFAULT_NODEWWN(isp);
- fcp->isp_wwpn_nvram = DEFAULT_PORTWWN(isp);
- fcp->isp_fwoptions = 0;
- fcp->isp_fwoptions |= ICBOPT_FAIRNESS;
- fcp->isp_fwoptions |= ICBOPT_PDBCHANGE_AE;
- fcp->isp_fwoptions |= ICBOPT_HARD_ADDRESS;
- fcp->isp_fwoptions |= ICBOPT_FAST_POST;
- if (isp->isp_confopts & ISP_CFG_FULL_DUPLEX) {
- fcp->isp_fwoptions |= ICBOPT_FULL_DUPLEX;
- }
-
- /*
- * Make sure this is turned off now until we get
- * extended options from NVRAM
- */
- fcp->isp_fwoptions &= ~ICBOPT_EXTENDED;
-
- /*
- * Now try and read NVRAM unless told to not do so.
- * This will set fcparam's isp_wwnn_nvram && isp_wwpn_nvram.
- */
- if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) {
- nvfail = isp_read_nvram(isp);
- if (nvfail) {
- isp->isp_confopts |= ISP_CFG_NONVRAM;
- }
- } else {
- nvfail = 1;
- }
- /*
- * Set node && port to override platform set defaults
- * unless the nvram read failed (or none was done),
- * or the platform code wants to use what had been
- * set in the defaults.
- */
- if (nvfail) {
- isp->isp_confopts |= ISP_CFG_OWNWWPN|ISP_CFG_OWNWWNN;
- }
- if (isp->isp_confopts & ISP_CFG_OWNWWNN) {
- isp_prt(isp, ISP_LOGCONFIG, "Using Node WWN 0x%08x%08x",
- (uint32_t) (DEFAULT_NODEWWN(isp) >> 32),
- (uint32_t) (DEFAULT_NODEWWN(isp) & 0xffffffff));
- ISP_NODEWWN(isp) = DEFAULT_NODEWWN(isp);
- } else {
- /*
- * We always start out with values derived
- * from NVRAM or our platform default.
- */
- ISP_NODEWWN(isp) = fcp->isp_wwnn_nvram;
- if (fcp->isp_wwnn_nvram == 0) {
- isp_prt(isp, ISP_LOGCONFIG,
- "bad WWNN- using default");
- ISP_NODEWWN(isp) = DEFAULT_NODEWWN(isp);
- }
- }
- if (isp->isp_confopts & ISP_CFG_OWNWWPN) {
- isp_prt(isp, ISP_LOGCONFIG, "Using Port WWN 0x%08x%08x",
- (uint32_t) (DEFAULT_PORTWWN(isp) >> 32),
- (uint32_t) (DEFAULT_PORTWWN(isp) & 0xffffffff));
- ISP_PORTWWN(isp) = DEFAULT_PORTWWN(isp);
- } else {
- /*
- * We always start out with values derived
- * from NVRAM or our platform default.
- */
- ISP_PORTWWN(isp) = fcp->isp_wwpn_nvram;
- if (fcp->isp_wwpn_nvram == 0) {
- isp_prt(isp, ISP_LOGCONFIG,
- "bad WWPN- using default");
- ISP_PORTWWN(isp) = DEFAULT_PORTWWN(isp);
- }
- }
- return;
- }
-
sdp = (sdparam *) isp->isp_param;
sdp += channel;
@@ -7113,7 +7028,7 @@ isp_setdfltparm(ispsoftc_t *isp, int channel)
return;
}
sdp->isp_gotdparms = 1;
-
+ sdp->isp_bad_nvram = 0;
/*
* Establish some default parameters.
*/
@@ -7153,6 +7068,7 @@ isp_setdfltparm(ispsoftc_t *isp, int channel)
if (isp_read_nvram(isp) == 0) {
return;
}
+ sdp->isp_bad_nvram = 1;
}
/*
@@ -7237,6 +7153,110 @@ isp_setdfltparm(ispsoftc_t *isp, int channel)
}
}
+#ifndef DEFAULT_FRAMESIZE
+#define DEFAULT_FRAMESIZE(isp) ICB_DFLT_FRMLEN
+#endif
+static void
+isp_setdfltfcparm(ispsoftc_t *isp)
+{
+ fcparam *fcp = FCPARAM(isp);
+
+ if (fcp->isp_gotdparms) {
+ return;
+ }
+ fcp->isp_gotdparms = 1;
+ fcp->isp_bad_nvram = 0;
+ fcp->isp_maxfrmlen = DEFAULT_FRAMESIZE(isp);
+ fcp->isp_maxalloc = ICB_DFLT_ALLOC;
+ fcp->isp_execthrottle = DEFAULT_EXEC_THROTTLE(isp);
+ fcp->isp_retry_delay = ICB_DFLT_RDELAY;
+ fcp->isp_retry_count = ICB_DFLT_RCOUNT;
+ /* Platform specific.... */
+ fcp->isp_loopid = DEFAULT_LOOPID(isp);
+ fcp->isp_wwnn_nvram = DEFAULT_NODEWWN(isp);
+ fcp->isp_wwpn_nvram = DEFAULT_PORTWWN(isp);
+ fcp->isp_fwoptions = 0;
+ fcp->isp_fwoptions |= ICBOPT_FAIRNESS;
+ fcp->isp_fwoptions |= ICBOPT_PDBCHANGE_AE;
+ fcp->isp_fwoptions |= ICBOPT_HARD_ADDRESS;
+ fcp->isp_fwoptions |= ICBOPT_FAST_POST;
+ if (isp->isp_confopts & ISP_CFG_FULL_DUPLEX) {
+ fcp->isp_fwoptions |= ICBOPT_FULL_DUPLEX;
+ }
+
+ /*
+ * Make sure this is turned off now until we get
+ * extended options from NVRAM
+ */
+ fcp->isp_fwoptions &= ~ICBOPT_EXTENDED;
+
+ /*
+ * Now try and read NVRAM unless told to not do so.
+ * This will set fcparam's isp_wwnn_nvram && isp_wwpn_nvram.
+ */
+ if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) {
+ int i, j = 0;
+ /*
+ * Give a couple of tries at reading NVRAM.
+ */
+ for (i = 0; i < 2; i++) {
+ j = isp_read_nvram(isp);
+ if (j == 0) {
+ break;
+ }
+ }
+ if (j) {
+ fcp->isp_bad_nvram = 1;
+ isp->isp_confopts |= ISP_CFG_NONVRAM;
+ isp->isp_confopts |= ISP_CFG_OWNWWPN;
+ isp->isp_confopts |= ISP_CFG_OWNWWNN;
+ }
+ } else {
+ isp->isp_confopts |= ISP_CFG_OWNWWPN|ISP_CFG_OWNWWNN;
+ }
+
+ /*
+ * Set node && port to override platform set defaults
+ * unless the nvram read failed (or none was done),
+ * or the platform code wants to use what had been
+ * set in the defaults.
+ */
+ if (isp->isp_confopts & ISP_CFG_OWNWWNN) {
+ isp_prt(isp, ISP_LOGCONFIG, "Using Node WWN 0x%08x%08x",
+ (uint32_t) (DEFAULT_NODEWWN(isp) >> 32),
+ (uint32_t) (DEFAULT_NODEWWN(isp) & 0xffffffff));
+ ISP_NODEWWN(isp) = DEFAULT_NODEWWN(isp);
+ } else {
+ /*
+ * We always start out with values derived
+ * from NVRAM or our platform default.
+ */
+ ISP_NODEWWN(isp) = fcp->isp_wwnn_nvram;
+ if (fcp->isp_wwnn_nvram == 0) {
+ isp_prt(isp, ISP_LOGCONFIG,
+ "bad WWNN- using default");
+ ISP_NODEWWN(isp) = DEFAULT_NODEWWN(isp);
+ }
+ }
+ if (isp->isp_confopts & ISP_CFG_OWNWWPN) {
+ isp_prt(isp, ISP_LOGCONFIG, "Using Port WWN 0x%08x%08x",
+ (uint32_t) (DEFAULT_PORTWWN(isp) >> 32),
+ (uint32_t) (DEFAULT_PORTWWN(isp) & 0xffffffff));
+ ISP_PORTWWN(isp) = DEFAULT_PORTWWN(isp);
+ } else {
+ /*
+ * We always start out with values derived
+ * from NVRAM or our platform default.
+ */
+ ISP_PORTWWN(isp) = fcp->isp_wwpn_nvram;
+ if (fcp->isp_wwpn_nvram == 0) {
+ isp_prt(isp, ISP_LOGCONFIG,
+ "bad WWPN- using default");
+ ISP_PORTWWN(isp) = DEFAULT_PORTWWN(isp);
+ }
+ }
+}
+
/*
* Re-initialize the ISP and complete all orphaned commands
* with a 'botched' notice. The reset/init routines should
diff --git a/sys/dev/isp/isp_library.c b/sys/dev/isp/isp_library.c
index 6275f25..98ec5d5f 100644
--- a/sys/dev/isp/isp_library.c
+++ b/sys/dev/isp/isp_library.c
@@ -150,7 +150,7 @@ isp_print_qentry(ispsoftc_t *isp, char *msg, int idx, void *arg)
}
void
-isp_print_bytes(ispsoftc_t *isp, char *msg, int amt, void *arg)
+isp_print_bytes(ispsoftc_t *isp, const char *msg, int amt, void *arg)
{
char buf[128];
uint8_t *ptr = arg;
diff --git a/sys/dev/isp/isp_library.h b/sys/dev/isp/isp_library.h
index 1a4170f..13b077c 100644
--- a/sys/dev/isp/isp_library.h
+++ b/sys/dev/isp/isp_library.h
@@ -35,7 +35,7 @@ extern uint32_t isp_handle_index(uint32_t);
extern void isp_destroy_handle(ispsoftc_t *, uint32_t);
extern int isp_getrqentry(ispsoftc_t *, uint32_t *, uint32_t *, void **);
extern void isp_print_qentry (ispsoftc_t *, char *, int, void *);
-extern void isp_print_bytes(ispsoftc_t *, char *, int, void *);
+extern void isp_print_bytes(ispsoftc_t *, const char *, int, void *);
extern int isp_fc_runstate(ispsoftc_t *, int);
extern void isp_dump_portdb(ispsoftc_t *);
extern void isp_shutdown(ispsoftc_t *);
diff --git a/sys/dev/isp/isp_pci.c b/sys/dev/isp/isp_pci.c
index a5e4a4f..7b5a326 100644
--- a/sys/dev/isp/isp_pci.c
+++ b/sys/dev/isp/isp_pci.c
@@ -1053,12 +1053,7 @@ isp_pci_attach(device_t dev)
isp->isp_osinfo.fw = firmware_get(fwname);
}
if (isp->isp_osinfo.fw != NULL) {
- union {
- const void *fred;
- uint16_t *bob;
- } u;
- u.fred = isp->isp_osinfo.fw->data;
- isp->isp_mdvec->dv_ispfw = u.bob;
+ isp->isp_mdvec->dv_ispfw = isp->isp_osinfo.fw->data;
}
}
#else
diff --git a/sys/dev/isp/ispvar.h b/sys/dev/isp/ispvar.h
index e9ae6c0..da803fd 100644
--- a/sys/dev/isp/ispvar.h
+++ b/sys/dev/isp/ispvar.h
@@ -68,7 +68,7 @@ struct ispmdvec {
void (*dv_reset0) (ispsoftc_t *);
void (*dv_reset1) (ispsoftc_t *);
void (*dv_dregs) (ispsoftc_t *, const char *);
- void * dv_ispfw; /* ptr to f/w */
+ const void * dv_ispfw; /* ptr to f/w */
uint16_t dv_conf1;
uint16_t dv_clock; /* clock frequency */
};
@@ -162,7 +162,9 @@ struct ispmdvec {
* SCSI Specific Host Adapter Parameters- per bus, per target
*/
typedef struct {
- uint32_t isp_gotdparms : 1,
+ uint32_t : 10,
+ isp_bad_nvram : 1,
+ isp_gotdparms : 1,
isp_req_ack_active_neg : 1,
isp_data_line_active_neg: 1,
isp_cmd_dma_burst_enable: 1,
@@ -363,10 +365,10 @@ typedef struct {
isp_gbspeed : 3,
: 1,
: 1,
- : 1,
+ isp_gotdparms : 1,
+ isp_bad_nvram : 1,
isp_loopstate : 4, /* Current Loop State */
isp_fwstate : 4, /* ISP F/W state */
- isp_gotdparms : 1,
isp_topo : 3,
loop_seen_once : 1;
uint32_t : 8,
OpenPOWER on IntegriCloud