Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 19 Oct 2006 06:03:33 GMT
From:      Matt Jacob <mjacob@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 108088 for review
Message-ID:  <200610190603.k9J63Xuf030965@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=108088

Change 108088 by mjacob@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
  *



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200610190603.k9J63Xuf030965>