From owner-p4-projects@FreeBSD.ORG Sat Oct 7 05:13:27 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 449E916A415; Sat, 7 Oct 2006 05:13:27 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id EBBD616A40F for ; Sat, 7 Oct 2006 05:13:26 +0000 (UTC) (envelope-from mjacob@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 98D4243D46 for ; Sat, 7 Oct 2006 05:13:26 +0000 (GMT) (envelope-from mjacob@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k975DQXQ025819 for ; Sat, 7 Oct 2006 05:13:26 GMT (envelope-from mjacob@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k975DQAZ025816 for perforce@freebsd.org; Sat, 7 Oct 2006 05:13:26 GMT (envelope-from mjacob@freebsd.org) Date: Sat, 7 Oct 2006 05:13:26 GMT Message-Id: <200610070513.k975DQAZ025816@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to mjacob@freebsd.org using -f From: Matt Jacob To: Perforce Change Reviews Cc: Subject: PERFORCE change 107396 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 07 Oct 2006 05:13:27 -0000 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, ¬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.