diff options
author | Kenneth R Westerback <krw@cvs.openbsd.org> | 2008-06-11 22:53:47 +0000 |
---|---|---|
committer | Kenneth R Westerback <krw@cvs.openbsd.org> | 2008-06-11 22:53:47 +0000 |
commit | 21af0ea2c8433c8c539e5967ba1406de7278db31 (patch) | |
tree | ebea1041e10202700a38ca57f4d03b9f136ae53a /sys/dev/ic | |
parent | 2493fdae556b633a4a2251e0ce371c4a67c33b92 (diff) |
Zero mbreg_t (mailbox) structures allocated on the stack before filling
them in and sending to the adapter. Reduces probe of empty controller
from 15 minutes or so to 30 seconds or so. And probably fixes other
things too.
Also add a few more debug statements and tweak some comments.
From mjacob via FreeBSD.
ok deraadt@
Diffstat (limited to 'sys/dev/ic')
-rw-r--r-- | sys/dev/ic/isp.c | 94 |
1 files changed, 65 insertions, 29 deletions
diff --git a/sys/dev/ic/isp.c b/sys/dev/ic/isp.c index f523bc3a9c8..e54e65fb1a0 100644 --- a/sys/dev/ic/isp.c +++ b/sys/dev/ic/isp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: isp.c,v 1.42 2008/05/28 18:40:21 kettenis Exp $ */ +/* $OpenBSD: isp.c,v 1.43 2008/06/11 22:53:46 krw Exp $ */ /* * Machine and OS Independent (well, as best as possible) * code for the QLogic ISP SCSI adapters. @@ -203,6 +203,7 @@ isp_reset(struct ispsoftc *isp) * Just in case it was paused... */ ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE); + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_ABOUT_FIRMWARE; isp_mboxcmd(isp, &mbs, MBLOGNONE); if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { @@ -593,6 +594,7 @@ again: /* * Do some sanity checking. */ + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_NO_OP; isp_mboxcmd(isp, &mbs, MBLOGALL); if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { @@ -600,6 +602,7 @@ again: } if (IS_SCSI(isp)) { + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_MAILBOX_REG_TEST; mbs.param[1] = 0xdead; mbs.param[2] = 0xbeef; @@ -645,6 +648,7 @@ again: isp->isp_mbxworkp = (void *) &isp->isp_mdvec->dv_ispfw[1]; isp->isp_mbxwrk0 = isp->isp_mdvec->dv_ispfw[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] = isp->isp_mdvec->dv_ispfw[0]; @@ -659,6 +663,7 @@ again: /* * Verify that it downloaded correctly. */ + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_VERIFY_CHECKSUM; mbs.param[1] = code_org; isp_mboxcmd(isp, &mbs, MBLOGNONE); @@ -680,6 +685,7 @@ again: */ + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_EXEC_FIRMWARE; mbs.param[1] = code_org; isp_mboxcmd(isp, &mbs, MBLOGNONE); @@ -693,6 +699,7 @@ again: * Set CLOCK RATE, but only if asked to. */ if (isp->isp_clock) { + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_SET_CLOCK_RATE; mbs.param[1] = isp->isp_clock; isp_mboxcmd(isp, &mbs, MBLOGALL); @@ -700,6 +707,7 @@ again: } } + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_ABOUT_FIRMWARE; isp_mboxcmd(isp, &mbs, MBLOGALL); if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { @@ -764,6 +772,7 @@ again: isp->isp_romfw_rev[2]); } + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_GET_FIRMWARE_STATUS; isp_mboxcmd(isp, &mbs, MBLOGALL); if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { @@ -874,6 +883,7 @@ isp_scsi_init(struct ispsoftc *isp) * Set Retry Delay and Count. * You set both channels at the same time. */ + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_SET_RETRY_COUNT; mbs.param[1] = sdp_chan0->isp_retry_count; mbs.param[2] = sdp_chan0->isp_retry_delay; @@ -888,6 +898,7 @@ isp_scsi_init(struct ispsoftc *isp) /* * Set ASYNC DATA SETUP time. This is very important. */ + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_SET_ASYNC_DATA_SETUP_TIME; mbs.param[1] = sdp_chan0->isp_async_data_setup; mbs.param[2] = sdp_chan1->isp_async_data_setup; @@ -899,6 +910,7 @@ isp_scsi_init(struct ispsoftc *isp) /* * Set ACTIVE Negation State. */ + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_SET_ACT_NEG_STATE; mbs.param[1] = (sdp_chan0->isp_req_ack_active_neg << 4) | @@ -923,6 +935,7 @@ isp_scsi_init(struct ispsoftc *isp) /* * Set the Tag Aging limit */ + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_SET_TAG_AGE_LIMIT; mbs.param[1] = sdp_chan0->isp_tag_aging; mbs.param[2] = sdp_chan1->isp_tag_aging; @@ -936,6 +949,7 @@ isp_scsi_init(struct ispsoftc *isp) /* * Set selection timeout. */ + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_SET_SELECT_TIMEOUT; mbs.param[1] = sdp_chan0->isp_selection_timeout; mbs.param[2] = sdp_chan1->isp_selection_timeout; @@ -954,6 +968,7 @@ isp_scsi_init(struct ispsoftc *isp) */ if (IS_ULTRA2(isp) || IS_1240(isp)) { + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_INIT_RES_QUEUE_A64; mbs.param[1] = RESULT_QUEUE_LEN(isp); mbs.param[2] = DMA_WD1(isp->isp_result_dma); @@ -967,6 +982,7 @@ isp_scsi_init(struct ispsoftc *isp) } isp->isp_residx = mbs.param[5]; + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_INIT_REQ_QUEUE_A64; mbs.param[1] = RQUEST_QUEUE_LEN(isp); mbs.param[2] = DMA_WD1(isp->isp_rquest_dma); @@ -980,6 +996,7 @@ isp_scsi_init(struct ispsoftc *isp) } isp->isp_reqidx = isp->isp_reqodx = mbs.param[4]; } else { + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_INIT_RES_QUEUE; mbs.param[1] = RESULT_QUEUE_LEN(isp); mbs.param[2] = DMA_WD1(isp->isp_result_dma); @@ -991,6 +1008,7 @@ isp_scsi_init(struct ispsoftc *isp) } isp->isp_residx = mbs.param[5]; + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_INIT_REQ_QUEUE; mbs.param[1] = RQUEST_QUEUE_LEN(isp); mbs.param[2] = DMA_WD1(isp->isp_rquest_dma); @@ -1012,6 +1030,7 @@ isp_scsi_init(struct ispsoftc *isp) * to assume not for them. */ + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_SET_FW_FEATURES; mbs.param[1] = 0; if (IS_ULTRA2(isp)) @@ -1053,6 +1072,7 @@ isp_scsi_channel_init(struct ispsoftc *isp, int channel) /* * Set (possibly new) Initiator ID. */ + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_SET_INIT_SCSI_ID; mbs.param[1] = (channel << 7) | sdp->isp_initiator_id; isp_mboxcmd(isp, &mbs, MBLOGALL); @@ -1096,6 +1116,7 @@ isp_scsi_channel_init(struct ispsoftc *isp, int channel) */ sdp->isp_devparam[tgt].goal_flags = sdf = DPARM_DEFAULT; #endif + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_SET_TARGET_PARAMS; mbs.param[1] = (channel << 15) | (tgt << 8); mbs.param[2] = sdf; @@ -1113,6 +1134,7 @@ isp_scsi_channel_init(struct ispsoftc *isp, int channel) isp_mboxcmd(isp, &mbs, MBLOGNONE); if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { sdf = DPARM_SAFE_DFLT; + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_SET_TARGET_PARAMS; mbs.param[1] = (tgt << 8) | (channel << 15); mbs.param[2] = sdf; @@ -1136,6 +1158,7 @@ isp_scsi_channel_init(struct ispsoftc *isp, int channel) */ sdp->isp_devparam[tgt].actv_flags = sdf & ~DPARM_TQING; for (lun = 0; lun < (int) isp->isp_maxluns; lun++) { + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_SET_DEV_QUEUE_PARAMS; mbs.param[1] = (channel << 15) | (tgt << 8) | lun; mbs.param[2] = sdp->isp_max_queue_depth; @@ -1340,6 +1363,7 @@ isp_fibre_init(struct ispsoftc *isp) * Turn on generate AE 8013 on all LIP Resets (2) * Disable LIP F7 switching (8) */ + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_SET_FIRMWARE_OPTIONS; mbs.param[1] = 0xb; mbs.param[2] = 0; @@ -1391,14 +1415,15 @@ isp_fibre_init(struct ispsoftc *isp) /* * Init the firmware */ + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_INIT_FIRMWARE; - mbs.param[1] = 0; mbs.param[2] = DMA_WD1(fcp->isp_scdma); mbs.param[3] = DMA_WD0(fcp->isp_scdma); - mbs.param[4] = 0; - mbs.param[5] = 0; mbs.param[6] = DMA_WD3(fcp->isp_scdma); mbs.param[7] = DMA_WD2(fcp->isp_scdma); + isp_prt(isp, ISP_LOGDEBUG0, "INIT F/W from %p (%08x%08x)", + fcp->isp_scratch, (uint32_t) ((uint64_t)fcp->isp_scdma >> 32), + (uint32_t) fcp->isp_scdma); isp_mboxcmd(isp, &mbs, MBLOGALL); FC_SCRATCH_RELEASE(isp); if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { @@ -1427,19 +1452,10 @@ isp_getmap(struct ispsoftc *isp, fcpos_map_t *map) fcparam *fcp = (fcparam *) isp->isp_param; mbreg_t mbs; + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_GET_FC_AL_POSITION_MAP; - mbs.param[1] = 0; mbs.param[2] = DMA_WD1(fcp->isp_scdma); mbs.param[3] = DMA_WD0(fcp->isp_scdma); - /* - * Unneeded. For the 2100, except for initializing f/w, registers - * 4/5 have to not be written to. - * mbs.param[4] = 0; - * mbs.param[5] = 0; - * - */ - mbs.param[6] = 0; - mbs.param[7] = 0; FC_SCRATCH_ACQUIRE(isp); isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR); if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { @@ -1468,17 +1484,11 @@ isp_getpdb(struct ispsoftc *isp, int id, isp_pdb_t *pdbp) fcparam *fcp = (fcparam *) isp->isp_param; mbreg_t mbs; + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_GET_PORT_DB; mbs.param[1] = id << 8; mbs.param[2] = DMA_WD1(fcp->isp_scdma); mbs.param[3] = DMA_WD0(fcp->isp_scdma); - /* - * Unneeded. For the 2100, except for initializing f/w, registers - * 4/5 have to not be written to. - * mbs.param[4] = 0; - * mbs.param[5] = 0; - * - */ mbs.param[6] = DMA_WD3(fcp->isp_scdma); mbs.param[7] = DMA_WD2(fcp->isp_scdma); FC_SCRATCH_ACQUIRE(isp); @@ -1498,6 +1508,7 @@ isp_get_portname(struct ispsoftc *isp, int loopid, int nodename) u_int64_t wwn = 0; mbreg_t mbs; + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_GET_PORT_NAME; mbs.param[1] = loopid << 8; if (nodename) @@ -1617,6 +1628,7 @@ isp_fclink_test(struct ispsoftc *isp, int usdelay) /* * Get our Loop ID (if possible). We really need to have it. */ + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_GET_LOOP_ID; isp_mboxcmd(isp, &mbs, MBLOGALL); if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { @@ -1710,6 +1722,7 @@ not_on_fabric: fcp->isp_gbspeed = 1; if (IS_23XX(isp)) { + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_GET_SET_DATA_RATE; mbs.param[1] = MBGSD_GET_RATE; /* mbs.param[2] undefined if we're just getting rate */ @@ -1936,10 +1949,9 @@ isp_pdb_sync(struct ispsoftc *isp) if (lp->loggedin) { if (lp->force_logout || isp_getpdb(isp, lp->loopid, &pdb) == 0) { + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_FABRIC_LOGOUT; mbs.param[1] = lp->loopid << 8; - mbs.param[2] = 0; - mbs.param[3] = 0; isp_mboxcmd(isp, &mbs, MBLOGNONE); isp_prt(isp, ISP_LOGINFO, plogout, (int) (lp - fcp->portdb), lp->loopid, @@ -1958,6 +1970,7 @@ isp_pdb_sync(struct ispsoftc *isp) loopid = lp - fcp->portdb; lp->loopid = FL_PORT_ID; do { + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_FABRIC_LOGIN; mbs.param[1] = loopid << 8; mbs.param[2] = portid >> 16; @@ -2074,6 +2087,7 @@ dump_em: lp->valid = 0; isp_prt(isp, ISP_LOGINFO, ldumped, loopid, lp->loopid, lp->portid); + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_FABRIC_LOGOUT; mbs.param[1] = lp->loopid << 8; mbs.param[2] = 0; @@ -2369,6 +2383,7 @@ isp_scan_loop(struct ispsoftc *isp) static int isp_fabric_mbox_cmd(struct ispsoftc *isp, mbreg_t *mbp) { + /* the caller sets up the mailbox */ isp_mboxcmd(isp, mbp, MBLOGNONE); if (mbp->param[0] != MBOX_COMMAND_COMPLETE) { if (FCPARAM(isp)->isp_loopstate == LOOP_SCANNING_FABRIC) { @@ -2458,6 +2473,7 @@ isp_scan_fabric(struct ispsoftc *isp, int ftype) rq->snscb_data[5] = (portid >> 16) & 0xff; isp_put_sns_request(isp, rq, (sns_screq_t *) fcp->isp_scratch); MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GA_NXT_REQ_SIZE); + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_SEND_SNS; mbs.param[1] = SNS_GA_NXT_REQ_SIZE >> 1; mbs.param[2] = DMA_WD1(fcp->isp_scdma); @@ -2608,6 +2624,7 @@ isp_scan_fabric(struct ispsoftc *isp, int ftype) rq->snscb_fc4_type = ftype; isp_put_gid_ft_request(isp, rq, (sns_gid_ft_req_t *) fcp->isp_scratch); MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GID_FT_REQ_SIZE); + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_SEND_SNS; mbs.param[1] = SNS_GID_FT_REQ_SIZE >> 1; mbs.param[2] = DMA_WD1(fcp->isp_scdma); @@ -2685,6 +2702,7 @@ isp_scan_fabric(struct ispsoftc *isp, int ftype) isp_put_gxn_id_request(isp, gq, (sns_gxn_id_req_t *) fcp->isp_scratch); MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GXN_ID_REQ_SIZE); + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_SEND_SNS; mbs.param[1] = SNS_GXN_ID_REQ_SIZE >> 1; mbs.param[2] = DMA_WD1(fcp->isp_scdma); @@ -2740,6 +2758,7 @@ isp_scan_fabric(struct ispsoftc *isp, int ftype) isp_put_gxn_id_request(isp, gq, (sns_gxn_id_req_t *) fcp->isp_scratch); MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GXN_ID_REQ_SIZE); + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_SEND_SNS; mbs.param[1] = SNS_GXN_ID_REQ_SIZE >> 1; mbs.param[2] = DMA_WD1(fcp->isp_scdma); @@ -2803,6 +2822,7 @@ isp_scan_fabric(struct ispsoftc *isp, int ftype) isp_put_gxn_id_request(isp, gq, (sns_gxn_id_req_t *) fcp->isp_scratch); MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GXN_ID_REQ_SIZE); + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_SEND_SNS; mbs.param[1] = SNS_GXN_ID_REQ_SIZE >> 1; mbs.param[2] = DMA_WD1(fcp->isp_scdma); @@ -2904,6 +2924,7 @@ isp_register_fc4_type(struct ispsoftc *isp) #endif FC_SCRATCH_ACQUIRE(isp); isp_put_sns_request(isp, reqp, (sns_screq_t *) fcp->isp_scratch); + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_SEND_SNS; mbs.param[1] = SNS_RFT_ID_REQ_SIZE >> 1; mbs.param[2] = DMA_WD1(fcp->isp_scdma); @@ -3315,8 +3336,8 @@ isp_control(struct ispsoftc *isp, ispctl_t ctl, void *arg) /* * Issue a bus reset. */ + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_BUS_RESET; - mbs.param[2] = 0; if (IS_SCSI(isp)) { mbs.param[1] = ((sdparam *) isp->isp_param)->isp_bus_reset_delay; @@ -3341,6 +3362,7 @@ isp_control(struct ispsoftc *isp, ispctl_t ctl, void *arg) case ISPCTL_RESET_DEV: tgt = (*((int *) arg)) & 0xffff; bus = (*((int *) arg)) >> 16; + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_ABORT_TARGET; mbs.param[1] = (tgt << 8) | (bus << 15); mbs.param[2] = 3; /* 'delay', in seconds */ @@ -3363,6 +3385,7 @@ isp_control(struct ispsoftc *isp, ispctl_t ctl, void *arg) break; } bus = XS_CHANNEL(xs); + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_ABORT; if (IS_FC(isp)) { if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) { @@ -3377,7 +3400,6 @@ isp_control(struct ispsoftc *isp, ispctl_t ctl, void *arg) mbs.param[1] = (bus << 15) | (XS_TGT(xs) << 8) | XS_LUN(xs); } - mbs.param[3] = 0; mbs.param[2] = handle; isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_ERROR); if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { @@ -3427,6 +3449,7 @@ isp_control(struct ispsoftc *isp, ispctl_t ctl, void *arg) case ISPCTL_SEND_LIP: if (IS_FC(isp)) { + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_INIT_LIP; isp_mboxcmd(isp, &mbs, MBLOGALL); if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { @@ -3457,6 +3480,7 @@ isp_control(struct ispsoftc *isp, ispctl_t ctl, void *arg) */ if (IS_SCSI(isp)) { int param = *(int *)arg; + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_ENABLE_TARGET_MODE; mbs.param[1] = param & 0xffff; mbs.param[2] = param >> 16; @@ -4659,6 +4683,7 @@ isp_parse_status(struct ispsoftc *isp, ispstatusreq_t *sp, XS_T *xs) if (FCPARAM(isp)->isp_topo == TOPO_NL_PORT || FCPARAM(isp)->isp_topo == TOPO_FL_PORT) { mbreg_t mbs; + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_INIT_LIP; isp_mboxcmd_qnw(isp, &mbs, 1); } @@ -4776,6 +4801,7 @@ isp_mbox_continue(struct ispsoftc *isp) break; } isp->isp_mbxworkp = ptr; + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = isp->isp_lastmbxcmd; isp->isp_mbxwrk0 -= 1; isp_mboxcmd_qnw(isp, &mbs, 0); @@ -5273,6 +5299,8 @@ isp_mboxcmd_qnw(struct ispsoftc *isp, mbreg_t *mbp, int nodelay) obits = LOBYT(mcp[opcode]) & NMBOX_BMASK(isp); for (box = 0; box < MAX_MAILBOX; box++) { if (ibits & (1 << box)) { + isp_prt(isp, ISP_LOGDEBUG1, "IN mbox %d = 0x%x", box, + mbp->param[box]); ISP_WRITE(isp, MBOX_OFF(box), mbp->param[box]); } if (nodelay == 0) { @@ -5370,6 +5398,8 @@ isp_mboxcmd(struct ispsoftc *isp, mbreg_t *mbp, int logmask) for (box = 0; box < MAX_MAILBOX; box++) { if (obits & (1 << box)) { mbp->param[box] = isp->isp_mboxtmp[box]; + isp_prt(isp, ISP_LOGDEBUG1, "OUT mbox %d = 0x%x", box, + mbp->param[box]); } } @@ -5447,6 +5477,7 @@ isp_fw_state(struct ispsoftc *isp) mbreg_t mbs; fcparam *fcp = isp->isp_param; + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_GET_FW_STATE; isp_mboxcmd(isp, &mbs, MBLOGALL); if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { @@ -5503,6 +5534,8 @@ isp_update_bus(struct ispsoftc *isp, int bus) * current device state, get the current parameters. */ + MEMZERO(&mbs, sizeof (mbs)); + /* * Refresh overrides set */ @@ -5529,9 +5562,7 @@ isp_update_bus(struct ispsoftc *isp, int bus) mbs.param[2] |= DPARM_PARITY; } - if ((mbs.param[2] & DPARM_SYNC) == 0) { - mbs.param[3] = 0; - } else { + if (mbs.param[2] & DPARM_SYNC) { mbs.param[3] = (sdp->isp_devparam[tgt].goal_offset << 8) | (sdp->isp_devparam[tgt].goal_period); @@ -5596,7 +5627,6 @@ static void isp_setdfltparm(struct ispsoftc *isp, int channel) { int tgt; - mbreg_t mbs; sdparam *sdp; if (IS_FC(isp)) { @@ -5736,6 +5766,9 @@ isp_setdfltparm(struct ispsoftc *isp, int channel) * Now try and see whether we have specific values for them. */ if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) { + mbreg_t mbs; + + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_GET_ACT_NEG_STATE; isp_mboxcmd(isp, &mbs, MBLOGNONE); if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { @@ -6530,6 +6563,7 @@ isp2200_fw_dump(struct ispsoftc *isp) } } ENABLE_INTS(isp); + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_READ_RAM_WORD; mbs.param[1] = 0x1000; isp->isp_mbxworkp = (void *) ptr; @@ -6672,6 +6706,7 @@ isp2300_fw_dump(struct ispsoftc *isp) return; } ENABLE_INTS(isp); + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_READ_RAM_WORD; mbs.param[1] = 0x800; isp->isp_mbxworkp = (void *) ptr; @@ -6693,6 +6728,7 @@ isp2300_fw_dump(struct ispsoftc *isp) */ ISP_WRITE(isp, PCI_MBOX_REGS2300_OFF + (8 << 1), 0x1); + MEMZERO(&mbs, sizeof (mbs)); mbs.param[0] = MBOX_READ_RAM_WORD_EXTENDED; mbs.param[1] = 0; isp->isp_mbxworkp = (void *) ptr; |