From owner-p4-projects@FreeBSD.ORG Thu Sep 21 01:09:36 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 399ED16A4C8; Thu, 21 Sep 2006 01:09:36 +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 DEBB516A4AB for ; Thu, 21 Sep 2006 01:09:35 +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 D83D743D55 for ; Thu, 21 Sep 2006 01:09:34 +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 k8L19YLC014779 for ; Thu, 21 Sep 2006 01:09:34 GMT (envelope-from mjacob@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k8L19YEa014776 for perforce@freebsd.org; Thu, 21 Sep 2006 01:09:34 GMT (envelope-from mjacob@freebsd.org) Date: Thu, 21 Sep 2006 01:09:34 GMT Message-Id: <200609210109.k8L19YEa014776@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 106428 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: Thu, 21 Sep 2006 01:09:36 -0000 http://perforce.freebsd.org/chv.cgi?CH=106428 Change 106428 by mjacob@newisp on 2006/09/21 01:09:09 Checkpoint some 24XX changes. Affected files ... .. //depot/projects/newisp/dev/isp/isp.c#12 edit .. //depot/projects/newisp/dev/isp/isp_target.c#5 edit .. //depot/projects/newisp/dev/isp/isp_target.h#7 edit .. //depot/projects/newisp/dev/isp/ispmbox.h#5 edit .. //depot/projects/newisp/dev/isp/ispvar.h#4 edit Differences ... ==== //depot/projects/newisp/dev/isp/isp.c#12 (text+ko) ==== @@ -4303,7 +4303,7 @@ * We can't be getting this now. */ if (isp->isp_state != ISP_RUNSTATE) { - isp_prt(isp, ISP_LOGWARN, + isp_prt(isp, ISP_LOGINFO, "interrupt (ISR=%x SEMA=%x) when not ready", isr, sema); /* * Thank you very much! *Burrrp*! @@ -4332,7 +4332,8 @@ * Debug: to be taken out eventually */ if (isp->isp_residx != optr) { - isp_prt(isp, ISP_LOGWARN, "optr %x soft optr %x", + isp_prt(isp, ISP_LOGINFO, + "isp_intr: hard optr=%x, soft optr %x", optr, isp->isp_residx); } } else { @@ -5148,6 +5149,7 @@ case RQSTYPE_ATIO2: case RQSTYPE_CTIO2: case RQSTYPE_CTIO3: + case RQSTYPE_CTIO7: isp->isp_rsltccmplt++; /* count as a response completion */ #ifdef ISP_TARGET_MODE if (isp_target_notify(isp, (ispstatusreq_t *) hp, optrp)) { ==== //depot/projects/newisp/dev/isp/isp_target.c#5 (text+ko) ==== @@ -62,6 +62,7 @@ static void isp_handle_atio2(ispsoftc_t *, at2_entry_t *); static void isp_handle_ctio(ispsoftc_t *, ct_entry_t *); static void isp_handle_ctio2(ispsoftc_t *, ct2_entry_t *); +static void isp_handle_ctio7(ispsoftc_t *, ct7_entry_t *); /* * The Qlogic driver gets an interrupt to look at response queue entries. @@ -117,9 +118,11 @@ at_entry_t *atiop; at2_entry_t *at2iop; at2e_entry_t *at2eiop; + at7_entry_t *at7iop; ct_entry_t *ctiop; ct2_entry_t *ct2iop; ct2e_entry_t *ct2eiop; + ct7_entry_t *ct7iop; lun_entry_t *lunenp; in_entry_t *inotp; in_fcentry_t *inot_fcp; @@ -132,9 +135,11 @@ #define atiop unp.atiop #define at2iop unp.at2iop #define at2eiop unp.at2eiop +#define at7iop unp.at7iop #define ctiop unp.ctiop #define ct2iop unp.ct2iop #define ct2eiop unp.ct2eiop +#define ct7iop unp.ct7iop #define lunenp unp.lunenp #define inotp unp.inotp #define inot_fcp unp.inot_fcp @@ -154,8 +159,14 @@ switch(type) { case RQSTYPE_ATIO: - isp_get_atio(isp, atiop, (at_entry_t *) local); - isp_handle_atio(isp, (at_entry_t *) local); + if (IS_24XX(isp)) { + isp_get_atio7(isp, at7iop, (at7_entry_t *) local); + /* Punt directly to platform specific layer. */ + (void) isp_async(isp, ISPASYNC_TARGET_ACTION, local); + } else { + isp_get_atio(isp, atiop, (at_entry_t *) local); + isp_handle_atio(isp, (at_entry_t *) local); + } break; case RQSTYPE_CTIO: isp_get_ctio(isp, ctiop, (ct_entry_t *) local); @@ -178,6 +189,10 @@ } 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); @@ -283,9 +298,11 @@ #undef atiop #undef at2iop #undef at2eiop +#undef at7iop #undef ctiop #undef ct2iop #undef ct2eiop +#undef ct7iop #undef lunenp #undef inotp #undef inot_fcp @@ -1319,4 +1336,149 @@ */ } } + +static void +isp_handle_ctio7(ispsoftc_t *isp, ct7_entry_t *ct) +{ + void *xs; + int pl = ISP_LOGTDEBUG2; + char *fmsg = NULL; + + if (ct->ct_syshandle) { + xs = isp_find_xs_tgt(isp, ct->ct_syshandle); + if (xs == NULL) { + pl = ISP_LOGALL; + } + } else { + xs = NULL; + } + + switch(ct->ct_nphdl) { + case CT7_BUS_ERROR: + isp_prt(isp, ISP_LOGERR, "PCI DMA Bus Error"); + /* FALL Through */ + case CT7_DATA_OVER: + case CT7_DATA_UNDER: + case CT7_OK: + /* + * There are generally 2 possibilities as to why we'd get + * this condition: + * We sent or received data. + * We sent status & command complete. + */ + + break; + + case CT7_RESET: + if (fmsg == NULL) + fmsg = "LIP Reset"; + /*FALLTHROUGH*/ + case CT7_ABORTED: + /* + * When an Abort message is received the firmware goes to + * Bus Free and returns all outstanding CTIOs with the status + * set, then sends us an Immediate Notify entry. + */ + if (fmsg == NULL) { + fmsg = "ABORT"; + } + + isp_prt(isp, ISP_LOGTDEBUG0, + "CTIO2 destroyed by %s: RX_ID=0x%x", fmsg, ct->ct_rxid); + break; + + case CT7_TIMEOUT: + if (fmsg == NULL) + fmsg = "command"; + isp_prt(isp, ISP_LOGERR, "Firmware timed out on %s", fmsg); + break; + + case CT7_ERR: + fmsg = "Completed with Error"; + /*FALLTHROUGH*/ + case CT7_LOGOUT: + if (fmsg == NULL) + fmsg = "Port Logout"; + /*FALLTHROUGH*/ + case CT7_PORTUNAVAIL: + if (fmsg == NULL) + fmsg = "Port not available"; + /*FALLTHROUGH*/ + case CT7_PORTCHANGED: + if (fmsg == NULL) + fmsg = "Port Changed"; + isp_prt(isp, ISP_LOGWARN, "CTIO returned by f/w- %s", fmsg); + break; + + case CT7_INVRXID: + /* + * CTIO rejected by the firmware because an invalid RX_ID. + * Just print a message. + */ + isp_prt(isp, ISP_LOGWARN, + "CTIO2 completed with Invalid RX_ID 0x%x", ct->ct_rxid); + break; + + case CT7_REASSY_ERR: + isp_prt(isp, ISP_LOGWARN, "reassembly error"); + break; + + case CT7_SRR: + isp_prt(isp, ISP_LOGWARN, "SRR received"); + break; + + default: + isp_prt(isp, ISP_LOGERR, "Unknown CTIO2 status 0x%x", + ct->ct_nphdl); + break; + } + + if (xs == NULL) { + /* + * There may be more than one CTIO for a data transfer, + * or this may be a status CTIO we're not monitoring. + * + * The assumption is that they'll all be returned in the + * order we got them. + */ + if (ct->ct_syshandle == 0) { + if ((ct->ct_flags & CT7_SENDSTATUS) == 0) { + isp_prt(isp, pl, + "intermediate CTIO completed ok"); + } else { + isp_prt(isp, pl, + "unmonitored CTIO completed ok"); + } + } else { + isp_prt(isp, pl, + "NO xs for CTIO (handle 0x%x) status 0x%x", + ct->ct_syshandle, ct->ct_nphdl); + } + } else { + if ((ct->ct_flags & CT2_DATAMASK) != CT2_NO_DATA) { + ISP_DMAFREE(isp, xs, ct->ct_syshandle); + } + if (ct->ct_flags & CT2_SENDSTATUS) { + /* + * Sent status and command complete. + * + * We're now really done with this command, so we + * punt to the platform dependent layers because + * only there can we do the appropriate command + * complete thread synchronization. + */ + isp_prt(isp, pl, "status CTIO complete"); + } else { + /* + * Final CTIO completed. Release DMA resources and + * notify platform dependent layers. + */ + isp_prt(isp, pl, "data CTIO complete"); + } + (void) isp_async(isp, ISPASYNC_TARGET_ACTION, ct); + /* + * The platform layer will destroy the handle if appropriate. + */ + } +} #endif ==== //depot/projects/newisp/dev/isp/isp_target.h#7 (text+ko) ==== @@ -723,7 +723,7 @@ typedef struct { isphdr_t ct_header; uint32_t ct_syshandle; - uint16_t ct_nphdl; + uint16_t ct_nphdl; /* status on returned CTIOs */ uint16_t ct_timeout; uint16_t ct_seg_count; uint8_t ct_vpindex; @@ -782,21 +782,21 @@ /* * Type 7 CTIO status codes */ -#define CY7_OK 0x01 /* completed without error */ -#define CY7_ABORTED 0x02 /* aborted by host */ -#define CY7_ERR 0x04 /* see sense data for error */ -#define CY7_INVAL 0x06 /* request for disabled lun */ -#define CY7_INVRXID 0x08 /* (FC only) Invalid RX_ID */ -#define CY7_DATA_OVER 0x09 /* (FC only) Data Overrun */ -#define CY7_TIMEOUT 0x0B /* timed out */ -#define CY7_RESET 0x0E /* LIP Rset Received */ -#define CY7_BUS_ERROR 0x10 /* DMA PCI Error */ +#define CT7_OK 0x01 /* completed without error */ +#define CT7_ABORTED 0x02 /* aborted by host */ +#define CT7_ERR 0x04 /* see sense data for error */ +#define CT7_INVAL 0x06 /* request for disabled lun */ +#define CT7_INVRXID 0x08 /* (FC only) Invalid RX_ID */ +#define CT7_DATA_OVER 0x09 /* (FC only) Data Overrun */ +#define CT7_TIMEOUT 0x0B /* timed out */ +#define CT7_RESET 0x0E /* LIP Rset Received */ +#define CT7_BUS_ERROR 0x10 /* DMA PCI Error */ #define CT7_REASSY_ERR 0x11 /* DMA reassembly error */ -#define CY7_DATA_UNDER 0x15 /* (FC only) Data Underrun */ -#define CY7_PORTUNAVAIL 0x28 /* port not available */ -#define CY7_LOGOUT 0x29 /* port logout */ -#define CY7_PORTCHANGED 0x2A /* port changed */ -#define CY7_SRR 0x45 /* SRR Received */ +#define CT7_DATA_UNDER 0x15 /* (FC only) Data Underrun */ +#define CT7_PORTUNAVAIL 0x28 /* port not available */ +#define CT7_LOGOUT 0x29 /* port logout */ +#define CT7_PORTCHANGED 0x2A /* port changed */ +#define CT7_SRR 0x45 /* SRR Received */ /* * Debug macros ==== //depot/projects/newisp/dev/isp/ispmbox.h#5 (text+ko) ==== @@ -315,6 +315,7 @@ #define RQSTYPE_CTIO1 0x0f /* Target Mode */ #define RQSTYPE_STATUS_CONT 0x10 #define RQSTYPE_T2RQS 0x11 +#define RQSTYPE_CTIO7 0x12 #define RQSTYPE_IP_XMIT 0x13 #define RQSTYPE_TSK_MGMT 0x14 #define RQSTYPE_T4RQS 0x15 ==== //depot/projects/newisp/dev/isp/ispvar.h#4 (text+ko) ==== @@ -495,6 +495,11 @@ void * isp_result; XS_DMA_ADDR_T isp_rquest_dma; XS_DMA_ADDR_T isp_result_dma; +#ifdef ISP_TARGET_MODE + /* for 24XX only */ + void * isp_atioq; + XS_DMA_ADDR_T isp_atioq_dma; +#endif }; #define SDPARAM(isp) ((sdparam *) (isp)->isp_param)