Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 7 Oct 2006 05:13:26 GMT
From:      Matt Jacob <mjacob@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 107396 for review
Message-ID:  <200610070513.k975DQAZ025816@repoman.freebsd.org>

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

Change 107396 by mjacob@newisp on 2006/10/07 05:12:59

	Change DISABLE_INTS/ENABLE_INTS macros to avoid possible
	namespace collisions.
	
	Use MBOX_GET_RESOURCE_COUNT to set exchange count limits
	for target mode.
	
	Add more 24XX target mode support (ATIOQ handling; at least
	some of ABTS handling).
	
	Check for interrupts at the end of isp_start- apparently the
	ZIO option for 2300 && 2400 cards will *not* assert an interrupt
	if you've just updated the request queue pointers.
	
	Field ASYNC_LIP_ERROR- it's just treated like a LIP. Field
	RQSTYPE_ABTS_RCVD/RQSYTYPE_ABTS_RSP IOCBs- they're the 24XX
	way of doing ABORT TASK.
	
	Plus much much more!

Affected files ...

.. //depot/projects/newisp/dev/isp/isp.c#15 edit
.. //depot/projects/newisp/dev/isp/isp_freebsd.c#12 edit
.. //depot/projects/newisp/dev/isp/isp_freebsd.h#7 edit
.. //depot/projects/newisp/dev/isp/isp_ioctl.h#2 edit
.. //depot/projects/newisp/dev/isp/isp_library.c#8 edit
.. //depot/projects/newisp/dev/isp/isp_library.h#7 edit
.. //depot/projects/newisp/dev/isp/isp_pci.c#12 edit
.. //depot/projects/newisp/dev/isp/isp_sbus.c#5 edit
.. //depot/projects/newisp/dev/isp/isp_stds.h#4 edit
.. //depot/projects/newisp/dev/isp/isp_target.c#6 edit
.. //depot/projects/newisp/dev/isp/isp_target.h#8 edit
.. //depot/projects/newisp/dev/isp/isp_tpublic.h#3 edit
.. //depot/projects/newisp/dev/isp/ispmbox.h#7 edit
.. //depot/projects/newisp/dev/isp/ispreg.h#5 edit
.. //depot/projects/newisp/dev/isp/ispvar.h#5 edit

Differences ...

==== //depot/projects/newisp/dev/isp/isp.c#15 (text+ko) ====

@@ -78,8 +78,9 @@
 static const char pskip[] =
     "SCSI phase skipped for target %d.%d.%d";
 static const char topology[] =
-    "Our PortID 0x%06x N-Port Handle %d, Connection Topology '%s'\n"
-    "      WWNN 0x%08x%08x WWPN 0x%08x%08x";
+    "HBA PortID 0x%06x N-Port Handle %d, Connection Topology '%s'";
+static const char ourwwn[] =
+    "HBA WWNN 0x%08x%08x HBA WWPN 0x%08x%08x";
 static const char finmsg[] =
     "%d.%d.%d: FIN dl%d resid %d STS 0x%x SKEY %c XS_ERR=0x%x";
 static const char sc0[] =
@@ -217,7 +218,7 @@
 		isp->isp_touched = 1;
 	}
 
-	DISABLE_INTS(isp);
+	ISP_DISABLE_INTS(isp);
 
 	/*
 	 * Pick an initial maxcmds value which will be used
@@ -1139,6 +1140,14 @@
 	if (IS_DUALBUS(isp)) {
 		isp_setdfltparm(isp, 1);
 	}
+
+	/*
+	 * If we have neither Target nor Initiator role, leave now.
+	 */
+	if (isp->isp_role == ISP_ROLE_NONE) {
+		return;
+	}
+
 	if (IS_FC(isp)) {
 		/*
 		 * Do this *before* initializing the firmware.
@@ -1825,27 +1834,36 @@
 
 	if (isp->isp_role & ISP_ROLE_TARGET) {
 		/*
-		 * Target Mode Only
+		 * Get current resource count
 		 */
-		icbp->icb_xchgcnt = fcp->isp_maxalloc;
+		MEMZERO(&mbs, sizeof (mbs));
+		mbs.param[0] = MBOX_GET_RESOURCE_COUNT;
+		mbs.obits = 0x4cf;
+		isp_mboxcmd(isp, &mbs, MBLOGALL);
+		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
+			return;
+		}
+		icbp->icb_xchgcnt = mbs.param[3];
 	}
 
+	icbp->icb_fwoptions1 = fcp->isp_fwoptions;
+
 	icbp->icb_hardaddr = fcp->isp_loopid;
-
 	if (icbp->icb_hardaddr > 125) {
 		/*
 		 * We end up with these Loop IDs for F-Port topologies
 		 */
 		if (icbp->icb_hardaddr != 0xff && icbp->icb_hardaddr != 0x800) {
-		    isp_prt(isp, ISP_LOGERR,
-			"bad hard address %u- resetting to zero",
-			icbp->icb_hardaddr); 
+			isp_prt(isp, ISP_LOGERR,
+			    "bad hard address %u- resetting to zero",
+			    icbp->icb_hardaddr); 
+			icbp->icb_hardaddr = 0;
 		}
-		icbp->icb_hardaddr = 0;
 	}
 
-	icbp->icb_fwoptions1 = fcp->isp_fwoptions;
-	icbp->icb_fwoptions1 |= ICB2400_OPT1_HARD_ADDRESS;
+	if (isp->isp_confopts & ISP_CFG_OWNLOOPID) {
+		icbp->icb_fwoptions1 |= ICB2400_OPT1_HARD_ADDRESS;
+	}
 
 	icbp->icb_fwoptions2 = fcp->isp_xfwoptions;
 	switch(isp->isp_confopts & ISP_CFG_PORT_PREF) {
@@ -1893,7 +1911,9 @@
 		icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_AUTO;
 	}
 
-
+	if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0) {
+		icbp->icb_fwoptions3 |= ICB2400_OPT3_SOFTID;
+	}
 	icbp->icb_logintime = ICB_LOGIN_TOV;
 
 	nwwn = ISP_NODEWWN(isp);
@@ -1939,14 +1959,35 @@
 	icbp->icb_rqstaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_rquest_dma);
 	icbp->icb_rqstaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_rquest_dma);
 	icbp->icb_rqstaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_rquest_dma);
+
 	icbp->icb_respaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_result_dma);
 	icbp->icb_respaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_result_dma);
 	icbp->icb_respaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_result_dma);
 	icbp->icb_respaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_result_dma);
 
+#ifdef	ISP_TARGET_MODE
+	if (isp->isp_role & ISP_ROLE_TARGET) {
+		icbp->icb_atioqlen = RESULT_QUEUE_LEN(isp);
+		if (icbp->icb_atioqlen < 8) {
+			isp_prt(isp, ISP_LOGERR, "bad ATIO queue length %d",
+			    icbp->icb_atioqlen);
+			return;
+		}
+		icbp->icb_atioqaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_atioq_dma);
+		icbp->icb_atioqaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_atioq_dma);
+		icbp->icb_atioqaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_atioq_dma);
+		icbp->icb_atioqaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_atioq_dma);
+		isp_prt(isp, ISP_LOGDEBUG0,
+		    "isp_fibre_init_2400: atioq %04x%04x%04x%04x",
+		    DMA_WD3(isp->isp_atioq_dma), DMA_WD2(isp->isp_atioq_dma),
+		    DMA_WD1(isp->isp_atioq_dma), DMA_WD0(isp->isp_atioq_dma));
+	}
+#endif
+
 	isp_prt(isp, ISP_LOGDEBUG0,
 	    "isp_fibre_init_2400: fwopt1 0x%x fwopt2 0x%x fwopt3 0x%x",
 	    icbp->icb_fwoptions1, icbp->icb_fwoptions2, icbp->icb_fwoptions3);
+
 	isp_prt(isp, ISP_LOGDEBUG0,
 	    "isp_fibre_init_2400: rqst %04x%04x%04x%04x rsp %04x%04x%04x%04x",
 	    DMA_WD3(isp->isp_rquest_dma), DMA_WD2(isp->isp_rquest_dma),
@@ -1954,13 +1995,13 @@
 	    DMA_WD3(isp->isp_result_dma), DMA_WD2(isp->isp_result_dma),
 	    DMA_WD1(isp->isp_result_dma), DMA_WD0(isp->isp_result_dma));
 
+	if (isp->isp_dblev & ISP_LOGDEBUG1) {
+		isp_print_bytes(isp, "isp_fibre_init_2400", sizeof (*icbp),
+		    icbp);
+	}
 	FC_SCRATCH_ACQUIRE(isp);
 	isp_put_icb_2400(isp, icbp, fcp->isp_scratch);
 
-	if (isp->isp_dblev & ISP_LOGDEBUG1) {
-		isp_print_bytes(isp, "isp_fibre_init_2400", sizeof (*icbp),
-		    fcp->isp_scratch);
-	}
 
 	/*
 	 * Init the firmware
@@ -2568,7 +2609,8 @@
 	 * Announce ourselves, too.
 	 */
 	isp_prt(isp, ISP_LOGCONFIG, topology, fcp->isp_portid,
-	    fcp->isp_loopid, toponames[fcp->isp_topo],
+	    fcp->isp_loopid, toponames[fcp->isp_topo]);
+	isp_prt(isp, ISP_LOGCONFIG, ourwwn,
 	    (uint32_t) (ISP_NODEWWN(isp) >> 32),
 	    (uint32_t) ISP_NODEWWN(isp),
 	    (uint32_t) (ISP_PORTWWN(isp) >> 32),
@@ -3874,7 +3916,7 @@
 isp_start(XS_T *xs)
 {
 	ispsoftc_t *isp;
-	uint32_t nxti, optr, handle;
+	uint32_t nxti, optr, handle, isr, sema, mbox;
 	uint8_t local[QENTRY_LEN];
 	ispreq_t *reqp, *qep;
 	void *cdbp;
@@ -4130,8 +4172,8 @@
 	    (long) XS_XFRLEN(xs));
 	ISP_ADD_REQUEST(isp, nxti);
 	isp->isp_nactive++;
-	if (IS_24XX(isp) || IS_23XX(isp)) {
-		isp_intr(isp, 0, 0, 0);
+	if (ISP_READ_ISR(isp, &isr, &sema, &mbox)) {
+		isp_intr(isp, isr, sema, mbox);
 	}
 	return (CMD_QUEUED);
 }
@@ -4416,6 +4458,7 @@
 		if (IS_24XX(isp)) {
 			ISP_WRITE(isp, BIU2400_HCCR,
 			    HCCR_2400_CMD_CLEAR_RISC_INT);
+			ISP_DISABLE_INTS(isp);
 		} else {
 			ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT);
 			ISP_WRITE(isp, BIU_SEMA, 0);
@@ -4423,6 +4466,39 @@
 		return;
 	}
 
+#ifdef	ISP_TARGET_MODE
+	/*
+	 * Check for ATIO Queue entries.
+	 */
+	if ((isp->isp_role & ISP_ROLE_TARGET) && IS_24XX(isp)) {
+		iptr = ISP_READ(isp, isp->isp_atioinrp);
+		optr = ISP_READ(isp, isp->isp_atiooutrp);
+
+		isp->isp_rspbsy = 1;
+		i = 0;
+		while (optr != iptr) {
+			uint8_t qe[QENTRY_LEN];
+			uint16_t oop;
+			isphdr_t *hp;
+			void *addr;
+
+			oop = optr;
+			optr = ISP_NXT_QENTRY(optr, RESULT_QUEUE_LEN(isp));
+			MEMORYBARRIER(isp, SYNC_ATIOQ, oop, QENTRY_LEN);
+			addr = (isphdr_t *) ISP_QUEUE_ENTRY(isp->isp_atioq, optr);
+			isp_get_hdr(isp, addr, (isphdr_t *)qe);
+			hp = (isphdr_t *)qe;
+			isp_prt(isp, ISP_LOGALL, "ATIOQ: got 0x%x", hp->rqs_entry_type);
+			isp_print_bytes(isp, "ATIOQU", QENTRY_LEN, addr);
+			i++;
+		}
+		if (i) {
+			ISP_WRITE(isp, isp->isp_atiooutrp, optr);
+		}
+		isp->isp_rspbsy = 0;
+	}
+#endif
+
 	/*
 	 * Get the current Response Queue Out Pointer.
 	 *
@@ -5049,6 +5125,7 @@
 #endif
 		break;
 	}
+	case ASYNC_LIP_ERROR:
 	case ASYNC_LIP_F8:
 	case ASYNC_LIP_OCCURRED:
 		FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT;
@@ -5254,6 +5331,8 @@
 	case RQSTYPE_CTIO2:
 	case RQSTYPE_CTIO3:
 	case RQSTYPE_CTIO7:
+	case RQSTYPE_ABTS_RCVD:
+	case RQSTYPE_ABTS_RSP:
 		isp->isp_rsltccmplt++;	/* count as a response completion */
 #ifdef	ISP_TARGET_MODE
 		if (isp_target_notify(isp, (ispstatusreq_t *) hp, optrp)) {
@@ -6212,7 +6291,7 @@
 	ISPOPMAP(0x00, 0x00),	/* 0x3f: */
 	ISPOPMAP(0x03, 0x01),	/* 0x40: MBOX_LOOP_PORT_BYPASS */
 	ISPOPMAP(0x03, 0x01),	/* 0x41: MBOX_LOOP_PORT_ENABLE */
-	ISPOPMAP(0x03, 0x07),	/* 0x42: MBOX_GET_RESOURCE_COUNTS */
+	ISPOPMAP(0x03, 0x07),	/* 0x42: MBOX_GET_RESOURCE_COUNT */
 	ISPOPMAP(0x01, 0x01),	/* 0x43: MBOX_REQUEST_NON_PARTICIPATING_MODE */
 	ISPOPMAP(0x00, 0x00),	/* 0x44: */
 	ISPOPMAP(0x00, 0x00),	/* 0x45: */
@@ -6351,7 +6430,7 @@
 	NULL,
 	"LOOP PORT BYPASS",
 	"LOOP PORT ENABLE",
-	"GET RESOURCE COUNTS",
+	"GET RESOURCE COUNT",
 	"REQUEST NON PARTICIPATING MODE",
 	NULL,
 	NULL,
@@ -7035,23 +7114,27 @@
 		if (isp->isp_state != ISP_RUNSTATE) {
 			isp_prt(isp, ISP_LOGERR,
 			    "isp_reinit cannot restart card");
+			ISP_DISABLE_INTS(isp);
 		}
-	} else if (IS_FC(isp)) {
-		/*
-		 * If we're in ISP_ROLE_NONE, turn off the lasers.
-		 */
-		if (!IS_24XX(isp)) {
-			ISP_WRITE(isp, BIU2100_CSR, BIU2100_FPM0_REGS);
-			ISP_WRITE(isp, FPM_DIAG_CONFIG, FPM_SOFT_RESET);
-			ISP_WRITE(isp, BIU2100_CSR, BIU2100_FB_REGS);
-			ISP_WRITE(isp, FBM_CMD, FBMCMD_FIFO_RESET_ALL);
-			ISP_WRITE(isp, BIU2100_CSR, BIU2100_RISC_REGS);
+	} else {
+		ISP_DISABLE_INTS(isp);
+		if (IS_FC(isp)) {
+			/*
+			 * If we're in ISP_ROLE_NONE, turn off the lasers.
+			 */
+			if (!IS_24XX(isp)) {
+				ISP_WRITE(isp, BIU2100_CSR, BIU2100_FPM0_REGS);
+				ISP_WRITE(isp, FPM_DIAG_CONFIG, FPM_SOFT_RESET);
+				ISP_WRITE(isp, BIU2100_CSR, BIU2100_FB_REGS);
+				ISP_WRITE(isp, FBM_CMD, FBMCMD_FIFO_RESET_ALL);
+				ISP_WRITE(isp, BIU2100_CSR, BIU2100_RISC_REGS);
+			}
 		}
  	}
 	isp->isp_nactive = 0;
 
 	for (tmp = 0; tmp < isp->isp_maxcmds; tmp++) {
-		uint16_t handle;
+		uint32_t handle;
 
 		xs = isp->isp_xflist[tmp];
 		if (xs == NULL) {
@@ -7071,6 +7154,9 @@
 		XS_SETERR(xs, HBA_BUSRESET);
 		isp_done(xs);
 	}
+#ifdef	ISP_TARGET_MODE
+	MEMZERO(isp->isp_tgtlist, isp->isp_maxcmds * sizeof (void **));
+#endif
 }
 
 /*
@@ -7889,7 +7975,7 @@
 			break;
 		}
 	}
-	ENABLE_INTS(isp);
+	ISP_ENABLE_INTS(isp);
 	mbs.param[0] = MBOX_READ_RAM_WORD;
 	mbs.param[1] = 0x1000;
 	isp->isp_mbxworkp = (void *) ptr;
@@ -8032,7 +8118,7 @@
 		isp_prt(isp, ISP_LOGERR, "Board Would Not Reset");
 		return;
 	}
-	ENABLE_INTS(isp);
+	ISP_ENABLE_INTS(isp);
 	MEMZERO(&mbs, sizeof (mbs));
 	mbs.param[0] = MBOX_READ_RAM_WORD;
 	mbs.param[1] = 0x800;

==== //depot/projects/newisp/dev/isp/isp_freebsd.c#12 (text+ko) ====

@@ -245,7 +245,7 @@
 
 	if (isp->isp_role != ISP_ROLE_NONE) {
 		isp->isp_state = ISP_RUNSTATE;
-		ENABLE_INTS(isp);
+		ISP_ENABLE_INTS(isp);
 	}
 	if (isplist == NULL) {
 		isplist = isp;
@@ -660,7 +660,7 @@
 {
 	ispsoftc_t *isp = arg;
 	if (isp->isp_role != ISP_ROLE_NONE) {
-		ENABLE_INTS(isp);
+		ISP_ENABLE_INTS(isp);
 #if	0
 		isp->isp_osinfo.intsok = 1;
 #endif
@@ -3286,7 +3286,7 @@
 	} else {
 		ISP_WRITE(isp, HCCR, HCCR_CMD_RESET);
 	}
-	DISABLE_INTS(isp);
+	ISP_DISABLE_INTS(isp);
 }
 
 void

==== //depot/projects/newisp/dev/isp/isp_freebsd.h#7 (text+ko) ====


==== //depot/projects/newisp/dev/isp/isp_ioctl.h#2 (text+ko) ====


==== //depot/projects/newisp/dev/isp/isp_library.c#8 (text) ====

@@ -180,10 +180,6 @@
  * action because things may have changed while we were doing this.
  * Any failure or change of state causes us to return a nonzero value.
  *
- * We honor HBA roles in that if we're not in Initiator mode, we don't
- * attempt to sync up the database (that's for somebody else to do,
- * if ever).
- *
  * We assume we enter here with any locks held.
  */
 
@@ -193,6 +189,9 @@
 	fcparam *fcp;
 	int *tptr;
 
+        if (isp->isp_role == ISP_ROLE_NONE) {
+		return (0);
+	}
 	fcp = FCPARAM(isp);
 	tptr = &tval;
 	if (fcp->isp_fwstate < FW_READY ||
@@ -209,6 +208,10 @@
 			return (-1);
 		}
 	}
+        if ((isp->isp_role & ISP_ROLE_INITIATOR) == 0) {
+		fcp->isp_loopstate = LOOP_READY;
+		return (0);
+	}
 	if (isp_control(isp, ISPCTL_SCAN_LOOP, NULL) != 0) {
 		isp_prt(isp, ISP_LOGINFO, "isp_fc_runstate: scan loop fails");
 		return (LOOP_PDB_RCVD);
@@ -692,6 +695,7 @@
 		ISP_IOXPUT_8(isp, src->icb_icnt, &dst->icb_icnt);
 	}
 	ISP_IOXPUT_16(isp, src->icb_lunetimeout, &dst->icb_lunetimeout);
+	ISP_IOXPUT_16(isp, src->icb_reserved1, &dst->icb_reserved1);
 	ISP_IOXPUT_16(isp, src->icb_xfwoptions, &dst->icb_xfwoptions);
 	if (ISP_IS_SBUS(isp)) {
 		ISP_IOXPUT_8(isp, src->icb_racctimer, &dst->icb_idelaytimer);
@@ -2499,6 +2503,114 @@
 	}
 	ISP_IOXGET_16(isp, &src->na_oxid, dst->na_oxid);
 }
+
+void
+isp_get_abts(ispsoftc_t *isp, abts_t *src, abts_t *dst)
+{
+	int i;
+
+	isp_get_hdr(isp, &src->abts_header, &dst->abts_header);
+	for (i = 0; i < 6; i++) {
+		ISP_IOXGET_8(isp, &src->abts_reserved0[i],
+		    dst->abts_reserved0[i]);
+	}
+	ISP_IOXGET_16(isp, &src->abts_nphdl, dst->abts_nphdl);
+	ISP_IOXGET_16(isp, &src->abts_reserved1, dst->abts_reserved1);
+	ISP_IOXGET_16(isp, &src->abts_sof, dst->abts_sof);
+	ISP_IOXGET_32(isp, &src->abts_rxid_abts, dst->abts_rxid_abts);
+	ISP_IOXGET_16(isp, &src->abts_did_lo, dst->abts_did_lo);
+	ISP_IOXGET_8(isp, &src->abts_did_hi, dst->abts_did_hi);
+	ISP_IOXGET_8(isp, &src->abts_r_ctl, dst->abts_r_ctl);
+	ISP_IOXGET_16(isp, &src->abts_sid_lo, dst->abts_sid_lo);
+	ISP_IOXGET_8(isp, &src->abts_sid_hi, dst->abts_sid_hi);
+	ISP_IOXGET_8(isp, &src->abts_cs_ctl, dst->abts_cs_ctl);
+	ISP_IOXGET_16(isp, &src->abts_fs_ctl, dst->abts_fs_ctl);
+	ISP_IOXGET_8(isp, &src->abts_f_ctl, dst->abts_f_ctl);
+	ISP_IOXGET_8(isp, &src->abts_type, dst->abts_type);
+	ISP_IOXGET_16(isp, &src->abts_seq_cnt, dst->abts_seq_cnt);
+	ISP_IOXGET_8(isp, &src->abts_df_ctl, dst->abts_df_ctl);
+	ISP_IOXGET_8(isp, &src->abts_seq_id, dst->abts_seq_id);
+	ISP_IOXGET_16(isp, &src->abts_rx_id, dst->abts_rx_id);
+	ISP_IOXGET_16(isp, &src->abts_ox_id, dst->abts_ox_id);
+	ISP_IOXGET_32(isp, &src->abts_param, dst->abts_param);
+	for (i = 0; i < 16; i++) {
+	ISP_IOXGET_8(isp, &src->abts_reserved2[i],
+		    dst->abts_reserved2[i]);
+	}
+	ISP_IOXGET_32(isp, &src->abts_rxid_task, dst->abts_rxid_task);
+}
+
+void
+isp_put_abts_rsp(ispsoftc_t *isp, abts_rsp_t *src, abts_rsp_t *dst)
+{
+	int i;
+
+	isp_put_hdr(isp, &src->abts_rsp_header, &dst->abts_rsp_header);
+	ISP_IOXPUT_32(isp, src->abts_rsp_handle, &dst->abts_rsp_handle);
+	ISP_IOXPUT_16(isp, src->abts_rsp_status, &dst->abts_rsp_status);
+	ISP_IOXPUT_16(isp, src->abts_rsp_nphdl, &dst->abts_rsp_nphdl);
+	ISP_IOXPUT_16(isp, src->abts_rsp_ctl_flags, &dst->abts_rsp_ctl_flags);
+	ISP_IOXPUT_16(isp, src->abts_rsp_sof, &dst->abts_rsp_sof);
+	ISP_IOXPUT_32(isp, src->abts_rsp_rxid_abts, &dst->abts_rsp_rxid_abts);
+	ISP_IOXPUT_16(isp, src->abts_rsp_did_lo, &dst->abts_rsp_did_lo);
+	ISP_IOXPUT_8(isp, src->abts_rsp_did_hi, &dst->abts_rsp_did_hi);
+	ISP_IOXPUT_8(isp, src->abts_rsp_r_ctl, &dst->abts_rsp_r_ctl);
+	ISP_IOXPUT_16(isp, src->abts_rsp_sid_lo, &dst->abts_rsp_sid_lo);
+	ISP_IOXPUT_8(isp, src->abts_rsp_sid_hi, &dst->abts_rsp_sid_hi);
+	ISP_IOXPUT_8(isp, src->abts_rsp_cs_ctl, &dst->abts_rsp_cs_ctl);
+	ISP_IOXPUT_16(isp, src->abts_rsp_fs_ctl, &dst->abts_rsp_fs_ctl);
+	ISP_IOXPUT_8(isp, src->abts_rsp_f_ctl, &dst->abts_rsp_f_ctl);
+	ISP_IOXPUT_8(isp, src->abts_rsp_type, &dst->abts_rsp_type);
+	ISP_IOXPUT_16(isp, src->abts_rsp_seq_cnt, &dst->abts_rsp_seq_cnt);
+	ISP_IOXPUT_8(isp, src->abts_rsp_df_ctl, &dst->abts_rsp_df_ctl);
+	ISP_IOXPUT_8(isp, src->abts_rsp_seq_id, &dst->abts_rsp_seq_id);
+	ISP_IOXPUT_16(isp, src->abts_rsp_rx_id, &dst->abts_rsp_rx_id);
+	ISP_IOXPUT_16(isp, src->abts_rsp_ox_id, &dst->abts_rsp_ox_id);
+	ISP_IOXPUT_32(isp, src->abts_rsp_param, &dst->abts_rsp_param);
+	for (i = 0; i < 12; i++) {
+		ISP_IOXPUT_8(isp, src->abts_rsp_reserved2[i],
+		    &dst->abts_rsp_reserved2[i]);
+	}
+	ISP_IOXPUT_16(isp, src->abts_rsp_subcode1, &dst->abts_rsp_subcode1);
+	ISP_IOXPUT_16(isp, src->abts_rsp_subcode2, &dst->abts_rsp_subcode2);
+	ISP_IOXPUT_32(isp, src->abts_rsp_rxid_task, &dst->abts_rsp_rxid_task);
+}
+
+void
+isp_get_abts_rsp(ispsoftc_t *isp, abts_rsp_t *src, abts_rsp_t *dst)
+{
+	int i;
+
+	isp_get_hdr(isp, &src->abts_rsp_header, &dst->abts_rsp_header);
+	ISP_IOXGET_32(isp, &src->abts_rsp_handle, dst->abts_rsp_handle);
+	ISP_IOXGET_16(isp, &src->abts_rsp_status, dst->abts_rsp_status);
+	ISP_IOXGET_16(isp, &src->abts_rsp_nphdl, dst->abts_rsp_nphdl);
+	ISP_IOXGET_16(isp, &src->abts_rsp_ctl_flags, dst->abts_rsp_ctl_flags);
+	ISP_IOXGET_16(isp, &src->abts_rsp_sof, dst->abts_rsp_sof);
+	ISP_IOXGET_32(isp, &src->abts_rsp_rxid_abts, dst->abts_rsp_rxid_abts);
+	ISP_IOXGET_16(isp, &src->abts_rsp_did_lo, dst->abts_rsp_did_lo);
+	ISP_IOXGET_8(isp, &src->abts_rsp_did_hi, dst->abts_rsp_did_hi);
+	ISP_IOXGET_8(isp, &src->abts_rsp_r_ctl, dst->abts_rsp_r_ctl);
+	ISP_IOXGET_16(isp, &src->abts_rsp_sid_lo, dst->abts_rsp_sid_lo);
+	ISP_IOXGET_8(isp, &src->abts_rsp_sid_hi, dst->abts_rsp_sid_hi);
+	ISP_IOXGET_8(isp, &src->abts_rsp_cs_ctl, dst->abts_rsp_cs_ctl);
+	ISP_IOXGET_16(isp, &src->abts_rsp_fs_ctl, dst->abts_rsp_fs_ctl);
+	ISP_IOXGET_8(isp, &src->abts_rsp_f_ctl, dst->abts_rsp_f_ctl);
+	ISP_IOXGET_8(isp, &src->abts_rsp_type, dst->abts_rsp_type);
+	ISP_IOXGET_16(isp, &src->abts_rsp_seq_cnt, dst->abts_rsp_seq_cnt);
+	ISP_IOXGET_8(isp, &src->abts_rsp_df_ctl, dst->abts_rsp_df_ctl);
+	ISP_IOXGET_8(isp, &src->abts_rsp_seq_id, dst->abts_rsp_seq_id);
+	ISP_IOXGET_16(isp, &src->abts_rsp_rx_id, dst->abts_rsp_rx_id);
+	ISP_IOXGET_16(isp, &src->abts_rsp_ox_id, dst->abts_rsp_ox_id);
+	ISP_IOXGET_32(isp, &src->abts_rsp_param, dst->abts_rsp_param);
+	for (i = 0; i < 12; i++) {
+		ISP_IOXGET_8(isp, &src->abts_rsp_reserved2[i],
+		    dst->abts_rsp_reserved2[i]);
+	}
+	ISP_IOXGET_16(isp, &src->abts_rsp_subcode1, dst->abts_rsp_subcode1);
+	ISP_IOXGET_16(isp, &src->abts_rsp_subcode2, dst->abts_rsp_subcode2);
+	ISP_IOXGET_32(isp, &src->abts_rsp_rxid_task, dst->abts_rsp_rxid_task);
+}
 #endif	/* ISP_TARGET_MODE */
 /*
  * vim:ts=8:sw=8

==== //depot/projects/newisp/dev/isp/isp_library.h#7 (text) ====

@@ -202,5 +202,11 @@
 isp_get_notify_ack_fc_e(ispsoftc_t *, na_fcentry_e_t *, na_fcentry_e_t *);
 extern void isp_get_notify_ack_24xx(ispsoftc_t *, na_fcentry_24xx_t *,
     na_fcentry_24xx_t *);
+extern void
+isp_get_abts(ispsoftc_t *, abts_t *, abts_t *);
+extern void
+isp_put_abts_rsp(ispsoftc_t *, abts_rsp_t *, abts_rsp_t *);
+extern void
+isp_get_abts_rsp(ispsoftc_t *, abts_rsp_t *, abts_rsp_t *);
 #endif	/* ISP_TARGET_MODE */
 #endif	/* _ISP_LIBRARY_H */

==== //depot/projects/newisp/dev/isp/isp_pci.c#12 (text+ko) ====

@@ -1208,9 +1208,7 @@
 		return (ENXIO);
 	}
 	isp = (ispsoftc_t *) pcs;
-	ISP_LOCK(isp);
-	DISABLE_INTS(isp);
-	ISP_UNLOCK(isp);
+	ISP_DISABLE_INTS(isp);
 	return (0);
 }
 
@@ -2874,7 +2872,7 @@
 		isp_pci_wr_reg(isp, HCCR, PCI_HCCR_CMD_BIOS);
 	}
 	/* and enable interrupts */
-	ENABLE_INTS(isp);
+	ISP_ENABLE_INTS(isp);
 }
 
 static void

==== //depot/projects/newisp/dev/isp/isp_sbus.c#5 (text+ko) ====


==== //depot/projects/newisp/dev/isp/isp_stds.h#4 (text+ko) ====


==== //depot/projects/newisp/dev/isp/isp_target.c#6 (text+ko) ====

@@ -127,10 +127,13 @@
 		in_entry_t	*inotp;
 		in_fcentry_t	*inot_fcp;
 		in_fcentry_e_t	*inote_fcp;
+		in_fcentry_24xx_t *inot_24xx;
 		na_entry_t	*nackp;
 		na_fcentry_t	*nack_fcp;
 		na_fcentry_e_t	*nacke_fcp;
 		isphdr_t	*hp;
+		abts_t		*abts;
+		abts_rsp_t	*abts_rsp;
 		void *		*vp;
 #define	atiop		unp.atiop
 #define	at2iop		unp.at2iop
@@ -144,9 +147,12 @@
 #define	inotp		unp.inotp
 #define	inot_fcp	unp.inot_fcp
 #define	inote_fcp	unp.inote_fcp
+#define	inot_24xx	unp.inot_24xx
 #define	nackp		unp.nackp
 #define	nack_fcp	unp.nack_fcp
 #define	nacke_fcp	unp.nacke_fcp
+#define	abts		unp.abts
+#define	abts_rsp	unp.abts_rsp
 #define	hdrp		unp.hp
 	} unp;
 	uint8_t local[QENTRY_LEN];
@@ -168,10 +174,12 @@
 			isp_handle_atio(isp, (at_entry_t *) local);
 		}
 		break;
+
 	case RQSTYPE_CTIO:
 		isp_get_ctio(isp, ctiop, (ct_entry_t *) local);
 		isp_handle_ctio(isp, (ct_entry_t *) local);
 		break;
+
 	case RQSTYPE_ATIO2:
 		if (FCPARAM(isp)->isp_2klogin) {
 			isp_get_atio2e(isp, at2eiop, (at2e_entry_t *) local);
@@ -180,6 +188,7 @@
 		}
 		isp_handle_atio2(isp, (at2_entry_t *) local);
 		break;
+
 	case RQSTYPE_CTIO3:
 	case RQSTYPE_CTIO2:
 		if (FCPARAM(isp)->isp_2klogin) {
@@ -189,10 +198,12 @@
 		}
 		isp_handle_ctio2(isp, (ct2_entry_t *) local);
 		break;
+
 	case RQSTYPE_CTIO7:
 		isp_get_ctio7(isp, ct7iop, (ct7_entry_t *) local);
 		isp_handle_ctio7(isp, (ct7_entry_t *) local);
 		break;
+
 	case RQSTYPE_ENABLE_LUN:
 	case RQSTYPE_MODIFY_LUN:
 		isp_get_enable_lun(isp, lunenp, (lun_entry_t *) local);
@@ -208,7 +219,13 @@
 		 * (we set this initially in the Enable Lun entry).
 		 */
 		bus = 0;
-		if (IS_FC(isp)) {
+		if (IS_24XX(isp)) {
+			isp_get_notify_24xx(isp, inot_24xx,
+			    (in_fcentry_24xx_t *)local);
+			inot_24xx = (in_fcentry_24xx_t *) local;
+			status = inot_24xx->in_status;
+			seqid = 0;
+		} else if (IS_FC(isp)) {
 			if (FCPARAM(isp)->isp_2klogin) {
 				isp_get_notify_fc_e(isp, inote_fcp,
 				    (in_fcentry_e_t *)local);
@@ -247,13 +264,16 @@
 			isp_prt(isp, ISP_LOGWARN, "Firmware out of ATIOs");
 			isp_notify_ack(isp, local);
 			break;
-		case IN_RESET:
+		case IN_RESET:	/* same as IN24XX_LIP_RESET */
+		case IN24XX_LINK_RESET:
 			(void) isp_target_async(isp, 0, ASYNC_BUS_RESET);
 			break;
-		case IN_PORT_LOGOUT:
+		case IN_PORT_LOGOUT:	/* same as IN24XX_PORT_LOGOUT */
 		case IN_ABORT_TASK:
-		case IN_PORT_CHANGED:
-		case IN_GLOBAL_LOGO:
+		case IN_PORT_CHANGED:	/* same as IN24XX_PORT_CHANGED */
+		case IN_GLOBAL_LOGO:	/* same as IN24XX_LINK_FAILED */
+		case IN24XX_SRR_RCVD:
+		case IN24XX_ELS_RCVD:
 			(void) isp_async(isp, ISPASYNC_TARGET_ACTION, &local);
 			break;
 		default:
@@ -289,6 +309,19 @@
 			    nackp->na_event, nackp->na_status, nackp->na_seqid);
 		}
 		break;
+
+	case RQSTYPE_ABTS_RCVD:
+		isp_get_abts(isp, abts, (abts_t *)local);
+		(void) isp_async(isp, ISPASYNC_TARGET_ACTION, &local);
+		break;
+	case RQSTYPE_ABTS_RSP:
+		isp_get_abts_rsp(isp, abts_rsp, (abts_rsp_t *)local);
+		abts_rsp = (abts_rsp_t *) local;
+		isp_prt(isp, ISP_LOGALL,
+		    "ABTS RSP response[0x%x]: status=0x%x sub=(0x%x 0x%x)",
+		    abts_rsp->abts_rsp_rxid_task, abts_rsp->abts_rsp_status,
+		    abts_rsp->abts_rsp_subcode1, abts_rsp->abts_rsp_subcode2);
+		break;
 	default:
 		isp_prt(isp, ISP_LOGERR,
 		    "Unknown entry type 0x%x in isp_target_notify", type);
@@ -307,9 +340,12 @@
 #undef	inotp
 #undef	inot_fcp
 #undef	inote_fcp
+#undef	inot_24xx
 #undef	nackp
 #undef	nack_fcp
 #undef	nacke_fcp
+#undef	abts
+#undef	abts_rsp
 #undef	hdrp
 	return (rval);
 }
@@ -586,6 +622,7 @@
 		notify.nt_ncode = NT_LINK_DOWN;
 		(void) isp_async(isp, ISPASYNC_TARGET_NOTIFY, &notify);
 		break;
+	case ASYNC_LIP_ERROR:
 	case ASYNC_LIP_F8:
 	case ASYNC_LIP_OCCURRED:
 	case ASYNC_LOOP_RESET:
@@ -777,7 +814,41 @@
 
 	MEMZERO(storage, QENTRY_LEN);
 
-	if (IS_FC(isp)) {
+	if (IS_24XX(isp) && arg != NULL && (((isphdr_t *)arg)->rqs_entry_type == RQSTYPE_ABTS_RCVD)) {
+		abts_t *abts = arg;
+		abts_rsp_t *abts_rsp = (abts_rsp_t *) storage;
+		/*
+		 * The caller will have set response values as appropriate
+		 * in the ABTS structure just before calling us.
+		 */
+		MEMCPY(abts_rsp, abts, QENTRY_LEN);
+		abts_rsp->abts_rsp_header.rqs_entry_type = RQSTYPE_ABTS_RSP;
+		isp_put_abts_rsp(isp, abts_rsp, (abts_rsp_t *)outp);
+
+	} else if (IS_24XX(isp)) {
+		na_fcentry_24xx_t *na = (na_fcentry_24xx_t *) storage;
+		if (arg) {
+			in_fcentry_24xx_t *in = arg;
+			na->na_nphdl = in->in_nphdl;
+			na->na_status = in->in_status;
+			na->na_status_subcode = in->in_status_subcode;
+			na->na_rxid = in->in_rxid;
+			na->na_oxid = in->in_oxid;
+			if (in->in_status == IN24XX_SRR_RCVD) {
+				na->na_srr_rxid = in->in_srr_rxid;
+				na->na_srr_reloff_hi = in->in_srr_reloff_hi;
+				na->na_srr_reloff_lo = in->in_srr_reloff_lo;
+				na->na_srr_iu = in->in_srr_iu;
+				na->na_srr_flags = 1;
+				na->na_srr_reject_vunique = 0;
+				na->na_srr_reject_explanation = 1;
+				na->na_srr_reject_code = 1;
+			}
+		}
+		na->na_header.rqs_entry_type = RQSTYPE_NOTIFY_ACK;
+		na->na_header.rqs_entry_count = 1;
+		isp_put_notify_24xx_ack(isp, na, (na_fcentry_24xx_t *)outp);
+	} else if (IS_FC(isp)) {
 		na_fcentry_t *na = (na_fcentry_t *) storage;
 		int iid = 0;
 

==== //depot/projects/newisp/dev/isp/isp_target.h#8 (text+ko) ====

@@ -799,6 +799,78 @@
 #define	CT7_SRR		0x45	/* SRR Received */
 
 /*
+ * Other 24XX related target IOCBs
+ */
+
+/*
+ * ABTS Received
+ */
+typedef struct {
+	isphdr_t	abts_header;
+	uint8_t		abts_reserved0[6];
+	uint16_t	abts_nphdl;
+	uint16_t	abts_reserved1;
+	uint16_t	abts_sof;
+	uint32_t	abts_rxid_abts;
+	uint16_t	abts_did_lo;
+	uint8_t		abts_did_hi;
+	uint8_t		abts_r_ctl;
+	uint16_t	abts_sid_lo;
+	uint8_t		abts_sid_hi;
+	uint8_t		abts_cs_ctl;
+	uint16_t	abts_fs_ctl;
+	uint8_t		abts_f_ctl;
+	uint8_t		abts_type;
+	uint16_t	abts_seq_cnt;
+	uint8_t		abts_df_ctl;
+	uint8_t		abts_seq_id;
+	uint16_t	abts_rx_id;
+	uint16_t	abts_ox_id;
+	uint32_t	abts_param;
+	uint8_t		abts_reserved2[16];
+	uint32_t	abts_rxid_task;
+} abts_t;
+
+typedef struct {
+	isphdr_t	abts_rsp_header;
+	uint32_t	abts_rsp_handle;
+	uint16_t	abts_rsp_status;
+	uint16_t	abts_rsp_nphdl;
+	uint16_t	abts_rsp_ctl_flags;
+	uint16_t	abts_rsp_sof;
+	uint32_t	abts_rsp_rxid_abts;
+	uint16_t	abts_rsp_did_lo;
+	uint8_t		abts_rsp_did_hi;
+	uint8_t		abts_rsp_r_ctl;
+	uint16_t	abts_rsp_sid_lo;
+	uint8_t		abts_rsp_sid_hi;
+	uint8_t		abts_rsp_cs_ctl;
+	uint16_t	abts_rsp_fs_ctl;
+	uint8_t		abts_rsp_f_ctl;
+	uint8_t		abts_rsp_type;
+	uint16_t	abts_rsp_seq_cnt;
+	uint8_t		abts_rsp_df_ctl;
+	uint8_t		abts_rsp_seq_id;
+	uint16_t	abts_rsp_rx_id;
+	uint16_t	abts_rsp_ox_id;
+	uint32_t	abts_rsp_param;
+	uint8_t		abts_rsp_reserved2[12];
+	uint16_t	abts_rsp_subcode1;
+	uint16_t	abts_rsp_subcode2;
+	uint32_t	abts_rsp_rxid_task;
+} abts_rsp_t;
+
+#define	ISP24XX_ABTS_RSP_TERMINATE	0x01
+
+#define	ISP24XX_ABTS_RSP_COMPLETE	0x00
+#define	ISP24XX_ABTS_RSP_RESET		0x04
+#define	ISP24XX_ABTS_RSP_ABORTED	0x05
+#define	ISP24XX_ABTS_RSP_TIMEOUT	0x06
+#define	ISP24XX_ABTS_RSP_INVXID		0x08
+#define	ISP24XX_ABTS_RSP_LOGOUT		0x29
+#define	ISP24XX_ABTS_RSP_SUBCODE	0x31
+
+/*
  * Debug macros
  */
 

==== //depot/projects/newisp/dev/isp/isp_tpublic.h#3 (text+ko) ====


==== //depot/projects/newisp/dev/isp/ispmbox.h#7 (text+ko) ====

@@ -340,6 +340,8 @@
 #define	RQSTYPE_CT_PASSTHRU	0x29
 #define	RQSTYPE_T6RQS		0x48
 #define	RQSTYPE_LOGIN		0x52
+#define	RQSTYPE_ABTS_RCVD	0x54	/* 24XX only */
+#define	RQSTYPE_ABTS_RSP	0x55	/* 24XX only */
 
 
 #define	ISP_RQDSEG	4
@@ -798,7 +800,7 @@
 	uint8_t		icb_ccnt;
 	uint8_t		icb_icnt;
 	uint16_t	icb_lunetimeout;
-	uint16_t	icb__reserved1;
+	uint16_t	icb_reserved1;
 	uint16_t	icb_xfwoptions;
 	uint8_t		icb_racctimer;
 	uint8_t		icb_idelaytimer;
@@ -939,7 +941,7 @@
 	uint16_t	icb_prqstqlen;
 	uint16_t	icb_rqstaddr[4];
 	uint16_t	icb_respaddr[4];
-	uint16_t	icb_priaddr[4];
+	uint16_t	icb_priaddr[4];	
 	uint16_t	icb_reserved1[4];
 	uint16_t	icb_atio_in;
 	uint16_t	icb_atioqlen;

==== //depot/projects/newisp/dev/isp/ispreg.h#5 (text+ko) ====

@@ -763,20 +763,20 @@
 /*
  * Defines for Interrupts
  */
-#define	INTS_ENABLED(isp)						\
+#define	ISP_INTS_ENABLED(isp)						\
  ((IS_SCSI(isp))?  							\
   (ISP_READ(isp, BIU_ICR) & BIU_IMASK) :				\
    (IS_24XX(isp)? (ISP_READ(isp, BIU2400_ICR) & BIU2400_IMASK) :	\
    (ISP_READ(isp, BIU_ICR) & BIU2100_IMASK)))
 
-#define	ENABLE_INTS(isp)						\
+#define	ISP_ENABLE_INTS(isp)						\
  (IS_SCSI(isp) ?  							\
    ISP_WRITE(isp, BIU_ICR, BIU_IMASK) :					\
    (IS_24XX(isp) ?							\
     (ISP_WRITE(isp, BIU2400_ICR, BIU2400_IMASK)) :			\
     (ISP_WRITE(isp, BIU_ICR, BIU2100_IMASK))))
 
-#define	DISABLE_INTS(isp)		\
+#define	ISP_DISABLE_INTS(isp)						\
  IS_24XX(isp)? ISP_WRITE(isp, BIU2400_ICR, 0) : ISP_WRITE(isp, BIU_ICR, 0)
 
 /*

==== //depot/projects/newisp/dev/isp/ispvar.h#5 (text+ko) ====

@@ -126,6 +126,7 @@
 #define	SYNC_SFORDEV	2	/* scratch, sync for ISP */
 #define	SYNC_SFORCPU	3	/* scratch, sync for CPU */
 #define	SYNC_REG	4	/* for registers */
+#define	SYNC_ATIOQ	5	/* atio result queue (24xx) */
 
 /*
  * Request/Response Queue defines and macros.



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