diff options
author | mjacob <mjacob@FreeBSD.org> | 2007-03-22 23:38:32 +0000 |
---|---|---|
committer | mjacob <mjacob@FreeBSD.org> | 2007-03-22 23:38:32 +0000 |
commit | 6f755d6db148e306ad33a22315a01a7517244356 (patch) | |
tree | 85e12f0631429fadf68036c6a1b21a0a6b2c464d /sys | |
parent | 19daed61a74611f0a0af9192abefe321ed79499c (diff) | |
download | FreeBSD-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.c | 246 | ||||
-rw-r--r-- | sys/dev/isp/isp_library.c | 2 | ||||
-rw-r--r-- | sys/dev/isp/isp_library.h | 2 | ||||
-rw-r--r-- | sys/dev/isp/isp_pci.c | 7 | ||||
-rw-r--r-- | sys/dev/isp/ispvar.h | 10 |
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, |