PERFORCE change 107396 for review
Matt Jacob
mjacob at FreeBSD.org
Fri Oct 6 22:13:27 PDT 2006
http://perforce.freebsd.org/chv.cgi?CH=107396
Change 107396 by mjacob at 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, ¬ify);
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.
More information about the p4-projects
mailing list