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
This commit is contained in:
parent
19daed61a7
commit
6f755d6db1
@ -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 @@ isp_intr(ispsoftc_t *isp, uint32_t isr, uint16_t sema, uint16_t mbox)
|
||||
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
|
||||
|
@ -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;
|
||||
|
@ -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 *);
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user