PERFORCE change 108088 for review
Matt Jacob
mjacob at FreeBSD.org
Wed Oct 18 23:03:34 PDT 2006
http://perforce.freebsd.org/chv.cgi?CH=108088
Change 108088 by mjacob at newisp on 2006/10/19 06:02:32
Change mbreg_t to take a logging value and a timeout value. Change
MBOX_ACQUIRE to be a predicate that is non-zero if it fails to
acquire MBOX regs. Clean up freebsd and linux mailbox routines
to run a *much* shorter timeout on commands as a default.
This seems to fix the booting on e4500 with PTI SBus card issue-
we seem to hang when trying to get or set target parameters while
the card is busy with a command. By making the default timeouts
much shorter, we fail the mailbox command much quicker and move
on (and retry).
Affected files ...
.. //depot/projects/newisp/dev/isp/isp.c#18 edit
.. //depot/projects/newisp/dev/isp/isp_freebsd.c#14 edit
.. //depot/projects/newisp/dev/isp/isp_freebsd.h#9 edit
.. //depot/projects/newisp/dev/isp/ispmbox.h#10 edit
.. //depot/projects/newisp/dev/isp/ispreg.h#6 edit
.. //depot/projects/newisp/dev/isp/ispvar.h#8 edit
Differences ...
==== //depot/projects/newisp/dev/isp/isp.c#18 (text+ko) ====
@@ -129,7 +129,7 @@
static uint16_t isp_nxt_handle(ispsoftc_t *, uint16_t);
static void isp_fw_state(ispsoftc_t *);
static void isp_mboxcmd_qnw(ispsoftc_t *, mbreg_t *, int);
-static void isp_mboxcmd(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);
@@ -208,7 +208,8 @@
}
MEMZERO(&mbs, sizeof (mbs));
mbs.param[0] = MBOX_ABOUT_FIRMWARE;
- isp_mboxcmd(isp, &mbs, MBLOGNONE);
+ 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];
@@ -705,7 +706,8 @@
*/
MEMZERO(&mbs, sizeof (mbs));
mbs.param[0] = MBOX_NO_OP;
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
return;
}
@@ -720,7 +722,8 @@
mbs.param[5] = 0xa5a5;
mbs.param[6] = 0x0000;
mbs.param[7] = 0x0000;
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
return;
}
@@ -809,7 +812,8 @@
mbs.param[6] = DMA_WD3(isp->isp_rquest_dma);
mbs.param[7] = DMA_WD2(isp->isp_rquest_dma);
mbs.param[8] = la >> 16;
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ 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");
@@ -869,7 +873,8 @@
mbs.param[6] = DMA_WD3(isp->isp_rquest_dma);
mbs.param[7] = DMA_WD2(isp->isp_rquest_dma);
mbs.param[8] = la >> 16;
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ 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");
@@ -885,7 +890,8 @@
MEMZERO(&mbs, sizeof (mbs));
mbs.param[0] = MBOX_VERIFY_CHECKSUM;
mbs.param[1] = code_org;
- isp_mboxcmd(isp, &mbs, MBLOGNONE);
+ mbs.logval = MBLOGNONE;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
isp_prt(isp, ISP_LOGERR, dcrc);
return;
@@ -920,7 +926,8 @@
mbs.param[0] = MBOX_WRITE_RAM_WORD;
mbs.param[1] = code_org;
mbs.param[2] = ptr[0];
- isp_mboxcmd(isp, &mbs, MBLOGNONE);
+ 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",
@@ -933,7 +940,8 @@
MEMZERO(&mbs, sizeof (mbs));
mbs.param[0] = MBOX_VERIFY_CHECKSUM;
mbs.param[1] = code_org;
- isp_mboxcmd(isp, &mbs, MBLOGNONE);
+ mbs.logval = MBLOGNONE;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
isp_prt(isp, ISP_LOGERR, dcrc);
return;
@@ -973,19 +981,19 @@
mbs.param[1] = code_org;
}
- isp_mboxcmd(isp, &mbs, MBLOGNONE);
+ mbs.logval = MBLOGALL;
+ mbs.timeout = 2000000;
+ isp_mboxcmd(isp, &mbs);
if (IS_2322(isp) || IS_24XX(isp)) {
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
- isp_prt(isp, ISP_LOGERR, "EXEC F/W failed: 0x%x",
- mbs.param[0]);
return;
}
}
/*
- * Give it a chance to start
+ * Give it a chance to finish starting up.
*/
- USEC_DELAY(500);
+ USEC_DELAY(1000);
if (IS_SCSI(isp)) {
/*
@@ -994,14 +1002,16 @@
if (isp->isp_clock) {
mbs.param[0] = MBOX_SET_CLOCK_RATE;
mbs.param[1] = isp->isp_clock;
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGNONE;
+ isp_mboxcmd(isp, &mbs);
/* we will try not to care if this fails */
}
}
MEMZERO(&mbs, sizeof (mbs));
mbs.param[0] = MBOX_ABOUT_FIRMWARE;
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
return;
}
@@ -1091,7 +1101,8 @@
if (!IS_24XX(isp)) {
MEMZERO(&mbs, sizeof (mbs));
mbs.param[0] = MBOX_GET_FIRMWARE_STATUS;
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
return;
}
@@ -1216,8 +1227,8 @@
mbs.param[2] = sdp_chan0->isp_retry_delay;
mbs.param[6] = sdp_chan1->isp_retry_count;
mbs.param[7] = sdp_chan1->isp_retry_delay;
-
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
return;
}
@@ -1229,7 +1240,8 @@
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;
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
return;
}
@@ -1245,9 +1257,8 @@
mbs.param[2] =
(sdp_chan1->isp_req_ack_active_neg << 4) |
(sdp_chan1->isp_data_line_active_neg << 5);
-
- MEMZERO(&mbs, sizeof (mbs));
- isp_mboxcmd(isp, &mbs, MBLOGNONE);
+ mbs.logval = MBLOGNONE;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
isp_prt(isp, ISP_LOGERR,
"failed to set active negation state (%d,%d), (%d,%d)",
@@ -1267,7 +1278,8 @@
mbs.param[0] = MBOX_SET_TAG_AGE_LIMIT;
mbs.param[1] = sdp_chan0->isp_tag_aging;
mbs.param[2] = sdp_chan1->isp_tag_aging;
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
isp_prt(isp, ISP_LOGERR, "failed to set tag age limit (%d,%d)",
sdp_chan0->isp_tag_aging, sdp_chan1->isp_tag_aging);
@@ -1281,7 +1293,8 @@
mbs.param[0] = MBOX_SET_SELECT_TIMEOUT;
mbs.param[1] = sdp_chan0->isp_selection_timeout;
mbs.param[2] = sdp_chan1->isp_selection_timeout;
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
return;
}
@@ -1304,7 +1317,8 @@
mbs.param[4] = 0;
mbs.param[6] = DMA_WD3(isp->isp_result_dma);
mbs.param[7] = DMA_WD2(isp->isp_result_dma);
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
return;
}
@@ -1318,7 +1332,8 @@
mbs.param[5] = 0;
mbs.param[6] = DMA_WD3(isp->isp_result_dma);
mbs.param[7] = DMA_WD2(isp->isp_result_dma);
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
return;
}
@@ -1330,7 +1345,8 @@
mbs.param[2] = DMA_WD1(isp->isp_result_dma);
mbs.param[3] = DMA_WD0(isp->isp_result_dma);
mbs.param[4] = 0;
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
return;
}
@@ -1342,7 +1358,8 @@
mbs.param[2] = DMA_WD1(isp->isp_rquest_dma);
mbs.param[3] = DMA_WD0(isp->isp_rquest_dma);
mbs.param[5] = 0;
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
return;
}
@@ -1372,7 +1389,8 @@
#endif
if (mbs.param[1] != 0) {
uint16_t sfeat = mbs.param[1];
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
isp_prt(isp, ISP_LOGINFO,
"Enabled FW features (0x%x)", sfeat);
@@ -1401,7 +1419,8 @@
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);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
return;
}
@@ -1457,7 +1476,8 @@
"Initial Settings bus%d tgt%d flags 0x%x off 0x%x per 0x%x",
channel, tgt, mbs.param[2], mbs.param[3] >> 8,
mbs.param[3] & 0xff);
- isp_mboxcmd(isp, &mbs, MBLOGNONE);
+ mbs.logval = MBLOGNONE;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
sdf = DPARM_SAFE_DFLT;
MEMZERO(&mbs, sizeof (mbs));
@@ -1465,7 +1485,8 @@
mbs.param[1] = (tgt << 8) | (channel << 15);
mbs.param[2] = sdf;
mbs.param[3] = 0;
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
continue;
}
@@ -1489,7 +1510,8 @@
mbs.param[1] = (channel << 15) | (tgt << 8) | lun;
mbs.param[2] = sdp->isp_max_queue_depth;
mbs.param[3] = sdp->isp_devparam[tgt].exc_throttle;
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
break;
}
@@ -1682,7 +1704,8 @@
mbs.param[1] = 0xb;
mbs.param[2] = 0;
mbs.param[3] = 0;
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
return;
}
@@ -1739,11 +1762,12 @@
mbs.param[3] = DMA_WD0(fcp->isp_scdma);
mbs.param[6] = DMA_WD3(fcp->isp_scdma);
mbs.param[7] = DMA_WD2(fcp->isp_scdma);
+ mbs.logval = MBLOGALL;
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);
MEMORYBARRIER(isp, SYNC_SFORDEV, 0, sizeof (*icbp));
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ isp_mboxcmd(isp, &mbs);
FC_SCRATCH_RELEASE(isp);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
return;
@@ -1774,9 +1798,8 @@
MEMZERO(&mbs, sizeof (mbs));
mbs.param[0] = MBOX_SET_FIRMWARE_OPTIONS;
mbs.param[1] = 1;
- mbs.param[2] = 0;
- mbs.param[3] = 0;
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
return;
}
@@ -1822,7 +1845,8 @@
MEMZERO(&mbs, sizeof (mbs));
mbs.param[0] = MBOX_GET_RESOURCE_COUNT;
mbs.obits = 0x4cf;
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
return;
}
@@ -1995,11 +2019,12 @@
mbs.param[3] = DMA_WD0(fcp->isp_scdma);
mbs.param[6] = DMA_WD3(fcp->isp_scdma);
mbs.param[7] = DMA_WD2(fcp->isp_scdma);
+ mbs.logval = MBLOGALL;
isp_prt(isp, ISP_LOGDEBUG0, "INIT F/W from %04x%04x%04x%04x",
DMA_WD3(fcp->isp_scdma), DMA_WD2(fcp->isp_scdma),
DMA_WD1(fcp->isp_scdma), DMA_WD0(fcp->isp_scdma));
MEMORYBARRIER(isp, SYNC_SFORDEV, 0, sizeof (*icbp));
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ isp_mboxcmd(isp, &mbs);
FC_SCRATCH_RELEASE(isp);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
return;
@@ -2133,8 +2158,9 @@
mbs.param[3] = DMA_WD0(FCPARAM(isp)->isp_scdma);
mbs.param[6] = DMA_WD3(FCPARAM(isp)->isp_scdma);
mbs.param[7] = DMA_WD2(FCPARAM(isp)->isp_scdma);
+ mbs.logval = MBLOGALL;
MEMORYBARRIER(isp, SYNC_SFORDEV, 0, QENTRY_LEN);
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
*log_ret = mbs.param[0];
}
@@ -2241,7 +2267,8 @@
mbs.param[2] = portid >> 16;
mbs.param[3] = portid;
- isp_mboxcmd(isp, &mbs, MBLOGNONE);
+ mbs.logval = MBLOGNONE;
+ isp_mboxcmd(isp, &mbs);
switch (mbs.param[0]) {
case MBOX_PORT_ID_USED:
@@ -2292,7 +2319,8 @@
} else {
mbs.param[1] = handle << 8;
}
- isp_mboxcmd(isp, &mbs, MBLOGNONE);
+ mbs.logval = MBLOGNONE;
+ isp_mboxcmd(isp, &mbs);
}
static int
@@ -2320,11 +2348,12 @@
mbs.param[3] = DMA_WD0(fcp->isp_scdma);
mbs.param[6] = DMA_WD3(fcp->isp_scdma);
mbs.param[7] = DMA_WD2(fcp->isp_scdma);
+ mbs.logval = MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR;
if (dolock) {
FC_SCRATCH_ACQUIRE(isp);
}
MEMORYBARRIER(isp, SYNC_SFORDEV, 0, sizeof (un));
- isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR);
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
if (dolock) {
FC_SCRATCH_RELEASE(isp);
@@ -2372,7 +2401,8 @@
mbs.param[1] |= 1;
}
}
- isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR);
+ mbs.logval = MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
wwn =
(((uint64_t)(mbs.param[2] & 0xff)) << 56) |
@@ -2491,7 +2521,8 @@
*/
MEMZERO(&mbs, sizeof (mbs));
mbs.param[0] = MBOX_GET_LOOP_ID;
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
return (-1);
}
@@ -2576,7 +2607,8 @@
mbs.param[0] = MBOX_GET_SET_DATA_RATE;
mbs.param[1] = MBGSD_GET_RATE;
/* mbs.param[2] undefined if we're just getting rate */
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
if (mbs.param[1] == MBGSD_FOURGB) {
isp_prt(isp, ISP_LOGINFO, "4Gb link speed/s");
@@ -3090,7 +3122,8 @@
mbs.param[3] = DMA_WD0(fcp->isp_scdma);
mbs.param[6] = DMA_WD3(fcp->isp_scdma);
mbs.param[7] = DMA_WD2(fcp->isp_scdma);
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
if (mbs.param[0] == MBOX_INVALID_COMMAND) {
return (1);
@@ -3171,8 +3204,9 @@
mbs.param[3] = DMA_WD0(fcp->isp_scdma + CTXOFF);
mbs.param[6] = DMA_WD3(fcp->isp_scdma + CTXOFF);
mbs.param[7] = DMA_WD2(fcp->isp_scdma + CTXOFF);
+ mbs.logval = MBLOGALL;
MEMORYBARRIER(isp, SYNC_SFORDEV, XTXOFF, 2 * QENTRY_LEN);
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
return (-1);
}
@@ -3735,8 +3769,9 @@
mbs.param[3] = DMA_WD0(fcp->isp_scdma);
mbs.param[6] = DMA_WD3(fcp->isp_scdma);
mbs.param[7] = DMA_WD2(fcp->isp_scdma);
+ mbs.logval = MBLOGALL;
MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_RFT_ID_REQ_SIZE);
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ isp_mboxcmd(isp, &mbs);
FC_SCRATCH_RELEASE(isp);
if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
return (0);
@@ -3811,8 +3846,9 @@
mbs.param[3] = DMA_WD0(fcp->isp_scdma + CTXOFF);
mbs.param[6] = DMA_WD3(fcp->isp_scdma + CTXOFF);
mbs.param[7] = DMA_WD2(fcp->isp_scdma + CTXOFF);
+ mbs.logval = MBLOGALL;
MEMORYBARRIER(isp, SYNC_SFORDEV, XTXOFF, 2 * QENTRY_LEN);
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
FC_SCRATCH_RELEASE(isp);
return (-1);
@@ -3956,6 +3992,7 @@
target = fcp->portdb[i - 1].handle;
}
+#if 0
/*
* Next check to see if any HBA or Device parameters need to be updated.
*/
@@ -3963,6 +4000,8 @@
isp_update(isp);
}
+#endif
+
start_again:
if (isp_getrqentry(isp, &nxti, &optr, (void *)&qep)) {
@@ -4189,7 +4228,8 @@
bus = 0;
}
isp->isp_sendmarker |= (1 << bus);
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
break;
}
@@ -4212,7 +4252,8 @@
}
}
mbs.param[2] = 3; /* 'delay', in seconds */
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
break;
}
@@ -4248,7 +4289,8 @@
(bus << 15) | (XS_TGT(xs) << 8) | XS_LUN(xs);
}
mbs.param[2] = handle;
- isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_ERROR);
+ mbs.logval = MBLOGALL & ~MBOX_COMMAND_ERROR;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
return (0);
}
@@ -4302,7 +4344,8 @@
if (FCPARAM(isp)->isp_2klogin) {
mbs.ibits = (1 << 10);
}
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
return (0);
}
@@ -4319,7 +4362,7 @@
case ISPCTL_RUN_MBOXCMD:
- isp_mboxcmd(isp, arg, MBLOGALL);
+ isp_mboxcmd(isp, arg);
return(0);
#ifdef ISP_TARGET_MODE
@@ -4335,7 +4378,8 @@
mbs.param[0] = MBOX_ENABLE_TARGET_MODE;
mbs.param[1] = param & 0xffff;
mbs.param[2] = param >> 16;
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
break;
}
@@ -4396,8 +4440,7 @@
MBOX_NOTIFY_COMPLETE(isp);
} else {
isp_prt(isp, ISP_LOGWARN,
- "Mbox Command Async (0x%x) with no waiters",
- mbox);
+ "mailbox cmd (0x%x) with no waiters", mbox);
}
} else if (isp_parse_async(isp, mbox) < 0) {
return;
@@ -5687,6 +5730,7 @@
if (FCPARAM(isp)->isp_2klogin) {
mbs.ibits = (1 << 10);
}
+ mbs.logval = MBLOGALL;
isp_mboxcmd_qnw(isp, &mbs, 1);
}
@@ -5844,6 +5888,7 @@
if (FCPARAM(isp)->isp_2klogin) {
mbs.ibits = (1 << 10);
}
+ mbs.logval = MBLOGALL;
isp_mboxcmd_qnw(isp, &mbs, 1);
}
@@ -5999,6 +6044,7 @@
isp->isp_mbxworkp = ptr;
isp->isp_mbxwrk0--;
mbs.param[0] = isp->isp_lastmbxcmd;
+ mbs.logval = MBLOGALL;
isp_mboxcmd_qnw(isp, &mbs, 0);
return (0);
}
@@ -6103,7 +6149,6 @@
ISPOPMAP(0x01, 0x01) /* 0x5d: GET NOST DATA */
};
-#ifndef ISP_STRIPPED
static char *scsi_mbcmd_names[] = {
"NO-OP",
"LOAD RAM",
@@ -6200,7 +6245,6 @@
"SET HOST DATA",
"GET NOST DATA",
};
-#endif
static const uint32_t mbpfc[] = {
ISPOPMAP(0x01, 0x01), /* 0x00: MBOX_NO_OP */
@@ -6340,7 +6384,6 @@
* is that we won't overflow.
*/
-#ifndef ISP_STRIPPED
static char *fc_mbcmd_names[] = {
"NO-OP",
"LOAD RAM",
@@ -6470,7 +6513,6 @@
"SEND LFA",
"Lun RESET"
};
-#endif
static void
isp_mboxcmd_qnw(ispsoftc_t *isp, mbreg_t *mbp, int nodelay)
@@ -6517,7 +6559,7 @@
}
static void
-isp_mboxcmd(ispsoftc_t *isp, mbreg_t *mbp, int logmask)
+isp_mboxcmd(ispsoftc_t *isp, mbreg_t *mbp)
{
char *cname, *xname, tname[16], mname[16];
unsigned int lim, ibits, obits, box, opcode;
@@ -6555,7 +6597,10 @@
/*
* Get exclusive usage of mailbox registers.
*/
- MBOX_ACQUIRE(isp);
+ if (MBOX_ACQUIRE(isp)) {
+ mbp->param[0] = MBOX_REGS_BUSY;
+ goto out;
+ }
for (box = 0; box < MAX_MAILBOX(isp); box++) {
if (ibits & (1 << box)) {
@@ -6586,15 +6631,14 @@
/*
* While we haven't finished the command, spin our wheels here.
*/
- MBOX_WAIT_COMPLETE(isp);
+ MBOX_WAIT_COMPLETE(isp, mbp);
/*
* Did the command time out?
*/
- if (isp->isp_mboxbsy) {
- isp->isp_mboxbsy = 0;
+ if (mbp->param[0] == MBOX_TIMEOUT) {
MBOX_RELEASE(isp);
- return;
+ goto out;
}
/*
@@ -6609,15 +6653,12 @@
}
MBOX_RELEASE(isp);
-
- if (logmask == 0 || opcode == MBOX_EXEC_FIRMWARE) {
+ out:
+ isp->isp_mboxbsy = 0;
+ if (mbp->logval == 0 || opcode == MBOX_EXEC_FIRMWARE) {
return;
}
-#ifdef ISP_STRIPPED
- cname = NULL;
-#else
cname = (IS_FC(isp))? fc_mbcmd_names[opcode] : scsi_mbcmd_names[opcode];
-#endif
if (cname == NULL) {
cname = tname;
SNPRINTF(tname, sizeof tname, "opcode %x", opcode);
@@ -6631,46 +6672,49 @@
case MBOX_COMMAND_COMPLETE:
break;
case MBOX_INVALID_COMMAND:
- if (logmask & MBLOGMASK(MBOX_COMMAND_COMPLETE)) {
+ if (mbp->logval & MBLOGMASK(MBOX_COMMAND_COMPLETE)) {
xname = "INVALID COMMAND";
}
break;
case MBOX_HOST_INTERFACE_ERROR:
- if (logmask & MBLOGMASK(MBOX_HOST_INTERFACE_ERROR)) {
+ if (mbp->logval & MBLOGMASK(MBOX_HOST_INTERFACE_ERROR)) {
xname = "HOST INTERFACE ERROR";
}
break;
case MBOX_TEST_FAILED:
- if (logmask & MBLOGMASK(MBOX_TEST_FAILED)) {
+ if (mbp->logval & MBLOGMASK(MBOX_TEST_FAILED)) {
xname = "TEST FAILED";
}
break;
case MBOX_COMMAND_ERROR:
- if (logmask & MBLOGMASK(MBOX_COMMAND_ERROR)) {
+ if (mbp->logval & MBLOGMASK(MBOX_COMMAND_ERROR)) {
xname = "COMMAND ERROR";
}
break;
case MBOX_COMMAND_PARAM_ERROR:
- if (logmask & MBLOGMASK(MBOX_COMMAND_PARAM_ERROR)) {
+ if (mbp->logval & MBLOGMASK(MBOX_COMMAND_PARAM_ERROR)) {
xname = "COMMAND PARAMETER ERROR";
}
break;
case MBOX_LOOP_ID_USED:
- if (logmask & MBLOGMASK(MBOX_LOOP_ID_USED)) {
+ if (mbp->logval & MBLOGMASK(MBOX_LOOP_ID_USED)) {
xname = "LOOP ID ALREADY IN USE";
}
break;
case MBOX_PORT_ID_USED:
- if (logmask & MBLOGMASK(MBOX_PORT_ID_USED)) {
+ if (mbp->logval & MBLOGMASK(MBOX_PORT_ID_USED)) {
xname = "PORT ID ALREADY IN USE";
}
break;
case MBOX_ALL_IDS_USED:
- if (logmask & MBLOGMASK(MBOX_ALL_IDS_USED)) {
+ if (mbp->logval & MBLOGMASK(MBOX_ALL_IDS_USED)) {
xname = "ALL LOOP IDS IN USE";
}
break;
- case 0: /* special case */
+ case MBOX_REGS_BUSY:
+ xname = "REGISTERS BUSY";
+ break;
+ case MBOX_TIMEOUT:
xname = "TIMEOUT";
break;
default:
@@ -6693,7 +6737,8 @@
MEMZERO(&mbs, sizeof (mbs));
mbs.param[0] = MBOX_GET_FW_STATE;
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
fcp->isp_fwstate = mbs.param[1];
}
@@ -6806,7 +6851,8 @@
continue;
}
mbs.param[1] = (bus << 15) | (tgt << 8);
- isp_mboxcmd(isp, &mbs, MBLOGALL);
+ mbs.logval = MBLOGALL;
+ isp_mboxcmd(isp, &mbs);
if (get == 0) {
isp->isp_sendmarker |= (1 << bus);
continue;
@@ -6993,7 +7039,8 @@
MEMZERO(&mbs, sizeof (mbs));
mbs.param[0] = MBOX_GET_ACT_NEG_STATE;
- isp_mboxcmd(isp, &mbs, MBLOGNONE);
+ mbs.logval = MBLOGNONE;
+ isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
sdp->isp_req_ack_active_neg = 1;
sdp->isp_data_line_active_neg = 1;
==== //depot/projects/newisp/dev/isp/isp_freebsd.c#14 (text+ko) ====
==== //depot/projects/newisp/dev/isp/isp_freebsd.h#9 (text+ko) ====
@@ -151,15 +151,16 @@
struct intr_config_hook ehook;
uint16_t loop_down_time;
uint16_t loop_down_limit;
- uint32_t
- : 16,
+ uint32_t : 5,
+ simqfrozen : 3,
hysteresis : 8,
+ : 2,
disabled : 1,
fcbsy : 1,
- : 1,
+ mboxcmd_done : 1,
+ mboxbsy : 1,
mboxwaiting : 1,
- intsok : 1,
- simqfrozen : 3;
+ intsok : 1;
#if __FreeBSD_version >= 500000
struct firmware * fw;
struct mtx lock;
@@ -251,15 +252,15 @@
break; \
}
-#define MBOX_ACQUIRE(isp)
+#define MBOX_ACQUIRE isp_mbox_acquire
#define MBOX_WAIT_COMPLETE isp_mbox_wait_complete
#define MBOX_NOTIFY_COMPLETE(isp) \
if (isp->isp_osinfo.mboxwaiting) { \
isp->isp_osinfo.mboxwaiting = 0; \
wakeup(&isp->isp_mbxworkp); \
} \
- isp->isp_mboxbsy = 0
-#define MBOX_RELEASE(isp)
+ isp->isp_osinfo.mboxcmd_done = 1
+#define MBOX_RELEASE isp_mbox_release
#define FC_SCRATCH_ACQUIRE(isp) \
if (isp->isp_osinfo.fcbsy) { \
@@ -470,12 +471,36 @@
* Platform specific inline functions
*/
-static __inline void isp_mbox_wait_complete(ispsoftc_t *);
+static __inline int isp_mbox_acquire(ispsoftc_t *);
+static __inline void isp_mbox_wait_complete(ispsoftc_t *, mbreg_t *);
+static __inline void isp_mbox_release(ispsoftc_t *);
+
+static __inline int
+isp_mbox_acquire(ispsoftc_t *isp)
+{
+ if (isp->isp_osinfo.mboxbsy) {
+ return (1);
+ } else {
+ isp->isp_osinfo.mboxbsy = 1;
+ return (0);
+ }
+}
+
static __inline void
-isp_mbox_wait_complete(ispsoftc_t *isp)
+isp_mbox_wait_complete(ispsoftc_t *isp, mbreg_t *mbp)
{
+ int lim = mbp->timeout;
+
+ if (lim == 0) {
+ lim = MBCMD_DEFAULT_TIMEOUT;
+ }
+ if (isp->isp_mbxwrk0) {
+ lim *= isp->isp_mbxwrk0;
+ }
+
+ isp->isp_osinfo.mboxcmd_done = 0;
if (isp->isp_osinfo.intsok) {
- int lim = ((isp->isp_mbxwrk0)? 120 : 20) * hz;
+ lim = (lim * 1000000) / hz;
isp->isp_osinfo.mboxwaiting = 1;
#ifdef ISP_SMPLOCK
(void) msleep(&isp->isp_mbxworkp,
@@ -484,20 +509,20 @@
(void) tsleep(&isp->isp_mbxworkp,
PRIBIO, "isp_mboxwaiting", lim);
#endif
- if (isp->isp_mboxbsy != 0) {
+ isp->isp_osinfo.mboxwaiting = 0;
+ if (isp->isp_osinfo.mboxcmd_done == 0) {
isp_prt(isp, ISP_LOGWARN,
"Interrupting Mailbox Command (0x%x) Timeout",
isp->isp_lastmbxcmd);
- isp->isp_mboxbsy = 0;
+ mbp->param[0] = MBOX_TIMEOUT;
}
- isp->isp_osinfo.mboxwaiting = 0;
} else {
- int lim = ((isp->isp_mbxwrk0)? 240 : 60) * 10000;
int j;
- for (j = 0; j < lim; j++) {
+
+ for (j = 0; j < lim; j += 100) {
uint32_t isr;
uint16_t sema, mbox;
- if (isp->isp_mboxbsy == 0) {
+ if (isp->isp_osinfo.mboxcmd_done) {
break;
}
if (ISP_READ_ISR(isp, &isr, &sema, &mbox)) {
@@ -506,16 +531,24 @@
break;
}
}
- USEC_DELAY(500);
+ USEC_DELAY(100);
}
- if (isp->isp_mboxbsy != 0) {
+ if (isp->isp_osinfo.mboxcmd_done == 0) {
isp_prt(isp, ISP_LOGWARN,
"Polled Mailbox Command (0x%x) Timeout",
isp->isp_lastmbxcmd);
+ isp->isp_mboxbsy = 0;
+ mbp->param[0] = MBOX_TIMEOUT;
}
}
}
+static __inline void
+isp_mbox_release(ispsoftc_t *isp)
+{
+ isp->isp_osinfo.mboxbsy = 0;
+}
+
static __inline uint64_t nanotime_sub(struct timespec *, struct timespec *);
static __inline uint64_t
nanotime_sub(struct timespec *b, struct timespec *a)
==== //depot/projects/newisp/dev/isp/ispmbox.h#10 (text+ko) ====
@@ -176,6 +176,10 @@
#define MBOX_LOOP_ID_USED 0x4008
#define MBOX_ALL_IDS_USED 0x4009
#define MBOX_NOT_LOGGED_IN 0x400A
+/* pseudo mailbox completion codes */
+#define MBOX_REGS_BUSY 0x6000 /* registers in use */
+#define MBOX_TIMEOUT 0x6001 /* command timed out */
+
#define MBLOGALL 0x000f
#define MBLOGNONE 0x0000
#define MBLOGMASK(x) ((x) & 0xf)
==== //depot/projects/newisp/dev/isp/ispreg.h#6 (text+ko) ====
@@ -461,9 +461,15 @@
#define MAX_MAILBOX(isp) ((IS_FC(isp))? 12 : 8)
#define MAILBOX_STORAGE 12
+/* if timeout == 0, then default timeout is picked */
+#define MBCMD_DEFAULT_TIMEOUT 100000 /* 100 ms */
typedef struct {
uint16_t param[MAILBOX_STORAGE];
- uint16_t ibits, obits;
+ uint16_t ibits;
+ uint16_t obits;
+ uint32_t
+ timeout : 28,
+ logval : 4;
} mbreg_t;
/*
==== //depot/projects/newisp/dev/isp/ispvar.h#8 (text+ko) ====
@@ -888,7 +888,7 @@
* of the same object is consistent.
*
* MBOX_ACQUIRE(ispsoftc_t *) acquire lock on mailbox regs
- * MBOX_WAIT_COMPLETE(ispsoftc_t *) wait for mailbox cmd to be done
+ * MBOX_WAIT_COMPLETE(ispsoftc_t *, mbreg_t *) wait for cmd to be done
* MBOX_NOTIFY_COMPLETE(ispsoftc_t *) notification of mbox cmd donee
* MBOX_RELEASE(ispsoftc_t *) release lock on mailbox regs
*
More information about the p4-projects
mailing list