The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/trm/trm.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  *      O.S   : FreeBSD CAM
    3  *      FILE NAME  : trm.c                                            
    4  *           BY    : C.L. Huang         (ching@tekram.com.tw)
    5  *                   Erich Chen     (erich@tekram.com.tw)
    6  *      Description: Device Driver for Tekram SCSI adapters
    7  *                   DC395U/UW/F ,DC315/U(TRM-S1040)
    8  *                   DC395U2D/U2W(TRM-S2080)
    9  *                   PCI SCSI Bus Master Host Adapter   
   10  *                   (SCSI chip set used Tekram ASIC TRM-S1040,TRM-S2080)
   11  *(C)Copyright 1995-2001 Tekram Technology Co.,Ltd.
   12  */
   13 
   14 #include <sys/cdefs.h>
   15 __FBSDID("$FreeBSD: releng/5.3/sys/dev/trm/trm.c 129879 2004-05-30 20:08:47Z phk $");
   16 
   17 /*
   18  *      HISTORY:                                        
   19  *                                              
   20  *      REV#    DATE    NAME            DESCRIPTION     
   21  *  1.05   05/01/1999  ERICH CHEN  First released for 3.x.x (CAM)
   22  *  1.06   07/29/1999  ERICH CHEN  Modify for NEW PCI
   23  *  1.07   12/12/1999  ERICH CHEN  Modify for 3.3.x ,DCB no free
   24  *  1.08   06/12/2000  ERICH CHEN  Modify for 4.x.x 
   25  *  1.09   11/03/2000  ERICH CHEN  Modify for 4.1.R ,new sim
   26  *  1.10   10/10/2001  Oscar Feng  Fixed CAM rescan hang up bug.        
   27  *  1.11   10/13/2001  Oscar Feng  Fixed wrong Async speed display bug. 
   28  */
   29 
   30 /*
   31  *
   32  *
   33  * Redistribution and use in source and binary forms, with or without
   34  * modification, are permitted provided that the following conditions
   35  * are met:
   36  * 1. Redistributions of source code must retain the above copyright
   37  *    notice, this list of conditions and the following disclaimer.
   38  * 2. Redistributions in binary form must reproduce the above copyright
   39  *    notice, this list of conditions and the following disclaimer in the
   40  *    documentation and/or other materials provided with the distribution.
   41  * 3. The name of the author may not be used to endorse or promote products
   42  *    derived from this software without specific prior written permission.
   43  *
   44  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   45  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   46  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   47  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   48  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   49  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   50  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   51  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   52  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   53  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   54  *
   55  */
   56 
   57 /*
   58  * Imported into FreeBSD source repository, and updated to compile under  
   59  * FreeBSD-3.0-DEVELOPMENT, by Stefan Esser <se@FreeBSD.Org>, 1996-12-17  
   60  */
   61 
   62 /*
   63  * Updated to compile under FreeBSD 5.0-CURRENT by Olivier Houchard
   64  * <doginou@ci0.org>, 2002-03-04
   65  */
   66 
   67 #include <sys/param.h>
   68 
   69 #include <sys/systm.h>
   70 #include <sys/malloc.h>
   71 #include <sys/queue.h>
   72 #if __FreeBSD_version >= 500000
   73 #include <sys/bio.h>
   74 #endif
   75 #include <sys/buf.h>
   76 #include <sys/bus.h>
   77 #include <sys/kernel.h>
   78 #include <sys/module.h>
   79 
   80 #include <vm/vm.h>
   81 #include <vm/pmap.h>
   82 
   83 #include <dev/pci/pcivar.h>
   84 #include <dev/pci/pcireg.h>
   85 #include <machine/resource.h>
   86 #include <machine/bus_pio.h>
   87 #include <machine/bus.h>
   88 #include <machine/clock.h>
   89 #include <sys/rman.h>
   90 
   91 #include <cam/cam.h>
   92 #include <cam/cam_ccb.h>
   93 #include <cam/cam_sim.h>
   94 #include <cam/cam_xpt_sim.h>
   95 #include <cam/cam_debug.h>
   96 
   97 #include <cam/scsi/scsi_all.h>
   98 #include <cam/scsi/scsi_message.h>
   99 
  100 #include <dev/trm/trm.h>
  101 
  102 #define trm_reg_read8(reg)      bus_space_read_1(pACB->tag, pACB->bsh, reg)
  103 #define trm_reg_read16(reg)     bus_space_read_2(pACB->tag, pACB->bsh, reg)
  104 #define trm_reg_read32(reg)     bus_space_read_4(pACB->tag, pACB->bsh, reg)
  105 #define trm_reg_write8(value,reg)       bus_space_write_1(pACB->tag, pACB->bsh,\
  106                 reg, value)
  107 #define trm_reg_write16(value,reg)      bus_space_write_2(pACB->tag, pACB->bsh,\
  108                 reg, value)
  109 #define trm_reg_write32(value,reg)      bus_space_write_4(pACB->tag, pACB->bsh,\
  110                 reg, value)
  111 
  112 #define PCI_Vendor_ID_TEKRAM    0x1DE1
  113 #define PCI_Device_ID_TRM_S1040 0x0391
  114 #define PCI_DEVICEID_TRMS1040   0x03911DE1
  115 #define PCI_DEVICEID_TRMS2080   0x03921DE1
  116 
  117 #ifdef trm_DEBUG1
  118 #define TRM_DPRINTF(fmt, arg...) printf("trm: " fmt, ##arg)
  119 #else
  120 #define TRM_DPRINTF(fmt, arg...) {}
  121 #endif /* TRM_DEBUG */
  122 
  123 static void     trm_check_eeprom(PNVRAMTYPE pEEpromBuf,PACB pACB);
  124 static void     NVRAM_trm_read_all(PNVRAMTYPE pEEpromBuf,PACB pACB);
  125 static u_int8_t NVRAM_trm_get_data(PACB pACB, u_int8_t bAddr);
  126 static void     NVRAM_trm_write_all(PNVRAMTYPE pEEpromBuf,PACB pACB);
  127 static void     NVRAM_trm_set_data(PACB pACB, u_int8_t bAddr, u_int8_t bData);
  128 static void     NVRAM_trm_write_cmd(PACB pACB, u_int8_t bCmd, u_int8_t bAddr);
  129 static void     NVRAM_trm_wait_30us(PACB pACB);
  130 
  131 static void     trm_Interrupt(void *vpACB);
  132 static void     trm_DataOutPhase0(PACB pACB, PSRB pSRB, 
  133                                          u_int16_t * pscsi_status);
  134 static void     trm_DataInPhase0(PACB pACB, PSRB pSRB, 
  135                                         u_int16_t * pscsi_status);
  136 static void     trm_CommandPhase0(PACB pACB, PSRB pSRB, 
  137                                          u_int16_t * pscsi_status);
  138 static void     trm_StatusPhase0(PACB pACB, PSRB pSRB, 
  139                                         u_int16_t * pscsi_status);
  140 static void     trm_MsgOutPhase0(PACB pACB, PSRB pSRB, 
  141                                         u_int16_t * pscsi_status);
  142 static void     trm_MsgInPhase0(PACB pACB, PSRB pSRB, 
  143                                         u_int16_t * pscsi_status);
  144 static void     trm_DataOutPhase1(PACB pACB, PSRB pSRB, 
  145                                          u_int16_t * pscsi_status);
  146 static void     trm_DataInPhase1(PACB pACB, PSRB pSRB, 
  147                                         u_int16_t * pscsi_status);
  148 static void     trm_CommandPhase1(PACB pACB, PSRB pSRB, 
  149                                          u_int16_t * pscsi_status);
  150 static void     trm_StatusPhase1(PACB pACB, PSRB pSRB, 
  151                                         u_int16_t * pscsi_status);
  152 static void     trm_MsgOutPhase1(PACB pACB, PSRB pSRB, 
  153                                         u_int16_t * pscsi_status);
  154 static void     trm_MsgInPhase1(PACB pACB, PSRB pSRB, 
  155                                         u_int16_t * pscsi_status);
  156 static void     trm_Nop0(PACB pACB, PSRB pSRB, u_int16_t * pscsi_status);
  157 static void     trm_Nop1(PACB pACB, PSRB pSRB, u_int16_t * pscsi_status);
  158 static void     trm_SetXferRate(PACB pACB, PSRB pSRB,PDCB pDCB);
  159 static void     trm_DataIO_transfer(PACB pACB, PSRB pSRB, u_int16_t ioDir);
  160 static void     trm_Disconnect(PACB pACB);
  161 static void     trm_Reselect(PACB pACB);
  162 static void     trm_SRBdone(PACB pACB, PDCB pDCB, PSRB pSRB);
  163 static void     trm_DoingSRB_Done(PACB pACB);
  164 static void     trm_ScsiRstDetect(PACB pACB);
  165 static void     trm_ResetSCSIBus(PACB pACB);
  166 static void     trm_RequestSense(PACB pACB, PDCB pDCB, PSRB pSRB);
  167 static void     trm_EnableMsgOutAbort2(PACB pACB, PSRB pSRB);
  168 static void     trm_EnableMsgOutAbort1(PACB pACB, PSRB pSRB);
  169 static void     trm_SendSRB(PACB pACB, PSRB pSRB);
  170 static int      trm_probe(device_t tag);
  171 static int      trm_attach(device_t tag);
  172 static void     trm_reset(PACB pACB);
  173 
  174 static u_int16_t        trm_StartSCSI(PACB pACB, PDCB pDCB, PSRB pSRB);
  175 
  176 static int      trm_initAdapter(PACB pACB, u_int16_t unit); 
  177 static void     trm_initDCB(PACB pACB, PDCB pDCB, u_int16_t unit, 
  178                                         u_int32_t i, u_int32_t j);
  179 static int      trm_initSRB(PACB pACB);
  180 static void     trm_initACB(PACB pACB, u_int8_t adaptType, u_int16_t unit);
  181 /* CAM SIM entry points */
  182 #define ccb_trmsrb_ptr spriv_ptr0
  183 #define ccb_trmacb_ptr spriv_ptr1
  184 static void     trm_action(struct cam_sim *psim, union ccb *pccb);
  185 static void     trm_poll(struct cam_sim *psim);
  186 
  187 
  188 static void * trm_SCSI_phase0[] = {
  189         trm_DataOutPhase0,    /* phase:0 */
  190         trm_DataInPhase0,     /* phase:1 */
  191         trm_CommandPhase0,    /* phase:2 */
  192         trm_StatusPhase0,     /* phase:3 */
  193         trm_Nop0,             /* phase:4 */
  194         trm_Nop1,             /* phase:5 */
  195         trm_MsgOutPhase0,     /* phase:6 */
  196         trm_MsgInPhase0,      /* phase:7 */
  197 };
  198 
  199 /*
  200  *
  201  *          stateV = (void *) trm_SCSI_phase1[phase]
  202  *
  203  */
  204 static void * trm_SCSI_phase1[] = {
  205         trm_DataOutPhase1,    /* phase:0 */
  206         trm_DataInPhase1,     /* phase:1 */
  207         trm_CommandPhase1,    /* phase:2 */
  208         trm_StatusPhase1,     /* phase:3 */
  209         trm_Nop0,             /* phase:4 */
  210         trm_Nop1,             /* phase:5 */
  211         trm_MsgOutPhase1,     /* phase:6 */
  212         trm_MsgInPhase1,      /* phase:7 */
  213 };
  214 
  215 
  216 NVRAMTYPE trm_eepromBuf[TRM_MAX_ADAPTER_NUM];
  217 /*
  218  *Fast20:  000   50ns, 20.0 Mbytes/s
  219  *             001       75ns, 13.3 Mbytes/s
  220  *             010      100ns, 10.0 Mbytes/s
  221  *             011      125ns,  8.0 Mbytes/s
  222  *             100      150ns,  6.6 Mbytes/s
  223  *             101      175ns,  5.7 Mbytes/s
  224  *             110      200ns,  5.0 Mbytes/s
  225  *             111      250ns,  4.0 Mbytes/s
  226  *
  227  *Fast40:  000   25ns, 40.0 Mbytes/s
  228  *             001       50ns, 20.0 Mbytes/s
  229  *             010       75ns, 13.3 Mbytes/s
  230  *             011      100ns, 10.0 Mbytes/s
  231  *             100      125ns,  8.0 Mbytes/s
  232  *             101      150ns,  6.6 Mbytes/s
  233  *             110      175ns,  5.7 Mbytes/s
  234  *             111      200ns,  5.0 Mbytes/s
  235  */
  236                                              /* real period: */
  237 u_int8_t dc395x_clock_period[] = {
  238         12,/*  48  ns 20   MB/sec */
  239         18,/*  72  ns 13.3 MB/sec */
  240         25,/* 100  ns 10.0 MB/sec */
  241         31,/* 124  ns  8.0 MB/sec */
  242         37,/* 148  ns  6.6 MB/sec */
  243         43,/* 172  ns  5.7 MB/sec */
  244         50,/* 200  ns  5.0 MB/sec */
  245         62 /* 248  ns  4.0 MB/sec */
  246 };
  247 
  248 u_int8_t dc395u2x_clock_period[]={
  249         10,/*  25  ns 40.0 MB/sec */
  250         12,/*  48  ns 20.0 MB/sec */
  251         18,/*  72  ns 13.3 MB/sec */
  252         25,/* 100  ns 10.0 MB/sec */
  253         31,/* 124  ns  8.0 MB/sec */
  254         37,/* 148  ns  6.6 MB/sec */
  255         43,/* 172  ns  5.7 MB/sec */
  256         50,/* 200  ns  5.0 MB/sec */
  257 };
  258 
  259 #define  dc395x_tinfo_period           dc395x_clock_period
  260 #define  dc395u2x_tinfo_period         dc395u2x_clock_period
  261 
  262 static PSRB
  263 trm_GetSRB(PACB pACB)
  264 {
  265         int     intflag;
  266         PSRB    pSRB;
  267 
  268         intflag = splcam();
  269         pSRB = pACB->pFreeSRB;
  270         if (pSRB) {
  271                 pACB->pFreeSRB = pSRB->pNextSRB;
  272                 pSRB->pNextSRB = NULL;
  273         }
  274         splx(intflag);
  275         return (pSRB);
  276 }
  277 
  278 static void
  279 trm_RewaitSRB0(PDCB pDCB, PSRB pSRB)
  280 {
  281         PSRB    psrb1;
  282         int     intflag;
  283 
  284         intflag = splcam();
  285         if ((psrb1 = pDCB->pWaitingSRB)) {
  286                 pSRB->pNextSRB = psrb1;
  287                 pDCB->pWaitingSRB = pSRB;
  288         } else {
  289                 pSRB->pNextSRB = NULL;
  290                 pDCB->pWaitingSRB = pSRB;
  291                 pDCB->pWaitingLastSRB = pSRB;
  292         }
  293         splx(intflag);
  294 }
  295 
  296 static void
  297 trm_RewaitSRB(PDCB pDCB, PSRB pSRB)
  298 {
  299         PSRB    psrb1;
  300         int     intflag;
  301 
  302         intflag = splcam();
  303         pDCB->GoingSRBCnt--;
  304         psrb1 = pDCB->pGoingSRB;
  305         if (pSRB == psrb1)
  306                 /*
  307                  * if this SRB is GoingSRB
  308                  * remove this SRB from GoingSRB Q
  309                  */
  310                 pDCB->pGoingSRB = psrb1->pNextSRB;
  311         else {
  312                 /*
  313                  * if this SRB is not current GoingSRB
  314                  * remove this SRB from GoingSRB Q
  315                  */
  316                 while (pSRB != psrb1->pNextSRB)
  317                         psrb1 = psrb1->pNextSRB;
  318                 psrb1->pNextSRB = pSRB->pNextSRB;
  319                 if (pSRB == pDCB->pGoingLastSRB)
  320                         pDCB->pGoingLastSRB = psrb1;
  321         }
  322         if ((psrb1 = pDCB->pWaitingSRB)) {
  323                 /*
  324                  * if WaitingSRB Q is not NULL
  325                  * Q back this SRB into WaitingSRB
  326                  */
  327 
  328                 pSRB->pNextSRB = psrb1;
  329                 pDCB->pWaitingSRB = pSRB;
  330         } else {
  331                 pSRB->pNextSRB = NULL;
  332                 pDCB->pWaitingSRB = pSRB;
  333                 pDCB->pWaitingLastSRB = pSRB;
  334         }
  335         splx(intflag);
  336 }
  337 
  338 static void
  339 trm_DoWaitingSRB(PACB pACB)
  340 {
  341         int     intflag;
  342         PDCB    ptr, ptr1;
  343         PSRB    pSRB;
  344 
  345         intflag = splcam();
  346         if (!(pACB->pActiveDCB) && 
  347             !(pACB->ACBFlag & (RESET_DETECT+RESET_DONE+RESET_DEV))) {
  348                 ptr = pACB->pDCBRunRobin;
  349                 if (!ptr) {
  350                         ptr = pACB->pLinkDCB;
  351                         pACB->pDCBRunRobin = ptr;
  352                 }
  353                 ptr1 = ptr;
  354                 for (;ptr1 ;) {
  355                         pACB->pDCBRunRobin = ptr1->pNextDCB;
  356                         if (!(ptr1->MaxActiveCommandCnt > ptr1->GoingSRBCnt) 
  357                             || !(pSRB = ptr1->pWaitingSRB)) {
  358                                 if (pACB->pDCBRunRobin == ptr)
  359                                         break;
  360                                 ptr1 = ptr1->pNextDCB;
  361                         } else {
  362                                 if (!trm_StartSCSI(pACB, ptr1, pSRB)) {
  363                                 /* 
  364                                  * If trm_StartSCSI return 0 :
  365                                  * current interrupt status is interrupt enable 
  366                                  * It's said that SCSI processor is unoccupied 
  367                                  */
  368                                         ptr1->GoingSRBCnt++;
  369                                         if (ptr1->pWaitingLastSRB == pSRB) {
  370                                                 ptr1->pWaitingSRB = NULL;
  371                                                 ptr1->pWaitingLastSRB = NULL;
  372                                         } else
  373                                                 ptr1->pWaitingSRB = pSRB->pNextSRB;
  374                                         pSRB->pNextSRB = NULL;
  375                                         if (ptr1->pGoingSRB) 
  376                                                 ptr1->pGoingLastSRB->pNextSRB = pSRB;
  377                                         else
  378                                                 ptr1->pGoingSRB = pSRB;
  379                                         ptr1->pGoingLastSRB = pSRB;
  380                                 }
  381                                 break;
  382                         }
  383                 }
  384         }
  385         splx(intflag);
  386         return;
  387 }
  388 
  389 static void
  390 trm_SRBwaiting(PDCB pDCB, PSRB pSRB)
  391 {
  392   
  393         if (pDCB->pWaitingSRB) {
  394                 pDCB->pWaitingLastSRB->pNextSRB = pSRB;
  395                 pDCB->pWaitingLastSRB = pSRB;
  396                 pSRB->pNextSRB = NULL;
  397         } else {
  398                 pDCB->pWaitingSRB = pSRB;
  399                 pDCB->pWaitingLastSRB = pSRB;
  400         }
  401 }
  402 
  403 static u_int32_t
  404 trm_get_sense_bufaddr(PACB pACB, PSRB pSRB)
  405 {
  406         int offset;
  407 
  408         offset = pSRB->TagNumber;
  409         return (pACB->sense_busaddr + 
  410             (offset * sizeof(struct scsi_sense_data)));
  411 }
  412 
  413 static struct scsi_sense_data *
  414 trm_get_sense_buf(PACB pACB, PSRB pSRB)
  415 {
  416         int offset;
  417 
  418         offset = pSRB->TagNumber;
  419         return (&pACB->sense_buffers[offset]);
  420 }
  421 static void
  422 trm_ExecuteSRB(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error)
  423 {
  424         int             flags;
  425         PACB            pACB;
  426         PSRB            pSRB;
  427         union ccb       *ccb;
  428         u_long          totalxferlen=0;
  429 
  430         flags = splcam();
  431         pSRB = (PSRB)arg;
  432         ccb = pSRB->pccb;
  433         pACB = (PACB)ccb->ccb_h.ccb_trmacb_ptr;
  434         TRM_DPRINTF("trm_ExecuteSRB..........\n");        
  435         if (nseg != 0) {
  436                 PSEG                    psg;
  437                 bus_dma_segment_t       *end_seg;
  438                 int                     op;
  439 
  440                 /* Copy the segments into our SG list */
  441                 end_seg = dm_segs + nseg;
  442                 psg = pSRB->pSRBSGL;
  443                 while (dm_segs < end_seg) {
  444                         psg->address = dm_segs->ds_addr;
  445                         psg->length = (u_long)dm_segs->ds_len;
  446                         totalxferlen += dm_segs->ds_len;
  447                         psg++;
  448                         dm_segs++;
  449                 }
  450                 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) {
  451                         op = BUS_DMASYNC_PREREAD;
  452                 } else {
  453                         op = BUS_DMASYNC_PREWRITE;
  454                 }
  455                 bus_dmamap_sync(pACB->buffer_dmat, pSRB->dmamap, op);
  456         }
  457         pSRB->RetryCnt = 0;
  458         pSRB->SRBTotalXferLength = totalxferlen;
  459         pSRB->SRBSGCount = nseg;
  460         pSRB->SRBSGIndex = 0;
  461         pSRB->AdaptStatus = 0;
  462         pSRB->TargetStatus = 0;
  463         pSRB->MsgCnt = 0;
  464         pSRB->SRBStatus = 0;
  465         pSRB->SRBFlag = 0;
  466         pSRB->SRBState = 0;
  467         pSRB->ScsiPhase = PH_BUS_FREE; /* SCSI bus free Phase */
  468 
  469         if (ccb->ccb_h.status != CAM_REQ_INPROG) {
  470                 if (nseg != 0)
  471                         bus_dmamap_unload(pACB->buffer_dmat, pSRB->dmamap);
  472                 pSRB->pNextSRB = pACB->pFreeSRB;
  473                 pACB->pFreeSRB = pSRB;
  474                 xpt_done(ccb);
  475                 splx(flags);
  476                 return;
  477         }
  478         ccb->ccb_h.status |= CAM_SIM_QUEUED;
  479 #if 0
  480         /* XXX Need a timeout handler */
  481         ccb->ccb_h.timeout_ch = timeout(trmtimeout, (caddr_t)srb, (ccb->ccb_h.timeout * hz) / 1000);
  482 #endif
  483         trm_SendSRB(pACB, pSRB);
  484         splx(flags);
  485         return;
  486 }
  487 
  488 static void
  489 trm_SendSRB(PACB pACB, PSRB pSRB)
  490 {
  491         PDCB    pDCB;
  492 
  493         pDCB = pSRB->pSRBDCB;
  494         if (!(pDCB->MaxActiveCommandCnt > pDCB->GoingSRBCnt) || (pACB->pActiveDCB)
  495             || (pACB->ACBFlag & (RESET_DETECT+RESET_DONE+RESET_DEV))) {
  496                 TRM_DPRINTF("pDCB->MaxCommand=%d \n",pDCB->MaxActiveCommandCnt);        
  497                 TRM_DPRINTF("pDCB->GoingSRBCnt=%d \n",pDCB->GoingSRBCnt);
  498                 TRM_DPRINTF("pACB->pActiveDCB=%8x \n",(u_int)pACB->pActiveDCB);
  499                 TRM_DPRINTF("pACB->ACBFlag=%x \n",pACB->ACBFlag);
  500                 trm_SRBwaiting(pDCB, pSRB);
  501                 goto SND_EXIT;
  502         }
  503 
  504         if (pDCB->pWaitingSRB) {
  505                 trm_SRBwaiting(pDCB, pSRB);
  506                 pSRB = pDCB->pWaitingSRB;
  507                 pDCB->pWaitingSRB = pSRB->pNextSRB;
  508                 pSRB->pNextSRB = NULL;
  509         }
  510 
  511         if (!trm_StartSCSI(pACB, pDCB, pSRB)) { 
  512         /* 
  513          * If trm_StartSCSI return 0 :
  514          * current interrupt status is interrupt enable 
  515          * It's said that SCSI processor is unoccupied 
  516          */
  517                 pDCB->GoingSRBCnt++; /* stack waiting SRB*/
  518                 if (pDCB->pGoingSRB) {
  519                         pDCB->pGoingLastSRB->pNextSRB = pSRB;
  520                         pDCB->pGoingLastSRB = pSRB;
  521                 } else {
  522                         pDCB->pGoingSRB = pSRB;
  523                         pDCB->pGoingLastSRB = pSRB;
  524                 }
  525         } else {
  526         /* 
  527          * If trm_StartSCSI return 1 :
  528          * current interrupt status is interrupt disreenable 
  529          * It's said that SCSI processor has more one SRB need to do
  530          */
  531                 trm_RewaitSRB0(pDCB, pSRB);
  532         }
  533 SND_EXIT:
  534         return;
  535 }
  536 
  537 
  538 static void
  539 trm_action(struct cam_sim *psim, union ccb *pccb) 
  540 {
  541         PACB    pACB;
  542         int     actionflags;
  543         u_int   target_id,target_lun;
  544 
  545         CAM_DEBUG(pccb->ccb_h.path, CAM_DEBUG_TRACE, ("trm_action\n"));
  546 
  547         actionflags = splcam();
  548         pACB = (PACB) cam_sim_softc(psim);
  549         target_id  = pccb->ccb_h.target_id;
  550         target_lun = pccb->ccb_h.target_lun;
  551 
  552         switch (pccb->ccb_h.func_code) {
  553                 case XPT_NOOP:                  
  554                         TRM_DPRINTF(" XPT_NOOP \n");
  555                         pccb->ccb_h.status = CAM_REQ_INVALID;
  556                         xpt_done(pccb);
  557                         break;
  558                 /*
  559                  * Execute the requested I/O operation 
  560                  */
  561                 case XPT_SCSI_IO: {
  562                         PDCB                    pDCB = NULL;
  563                         PSRB                    pSRB;
  564                         struct ccb_scsiio       *pcsio;
  565      
  566                         pcsio = &pccb->csio;
  567                         TRM_DPRINTF(" XPT_SCSI_IO \n");
  568                         TRM_DPRINTF("trm: target_id= %d target_lun= %d \n"
  569                              ,target_id, target_lun);
  570                         TRM_DPRINTF(
  571                             "pACB->scan_devices[target_id][target_lun]= %d \n"
  572                             ,pACB->scan_devices[target_id][target_lun]);
  573                         if ((pccb->ccb_h.status & CAM_STATUS_MASK) !=
  574                             CAM_REQ_INPROG) {
  575                                 xpt_done(pccb);
  576                                 splx(actionflags);
  577                                 return;
  578                         }
  579                         pDCB = &pACB->DCBarray[target_id][target_lun];
  580                         if (!(pDCB->DCBstatus & DS_IN_QUEUE)) {
  581                                 pACB->scan_devices[target_id][target_lun] = 1;
  582                                 trm_initDCB(pACB, pDCB, pACB->AdapterUnit, 
  583                                     target_id, target_lun); 
  584                         }
  585                         /*
  586                          * Assign an SRB and connect it with this ccb.
  587                          */
  588                         pSRB = trm_GetSRB(pACB);
  589                         if (!pSRB) {
  590                                 /* Freeze SIMQ */
  591                                 pccb->ccb_h.status = CAM_RESRC_UNAVAIL;
  592                                 xpt_done(pccb);
  593                                 splx(actionflags);
  594                                 return;
  595                         }
  596                         pSRB->pSRBDCB = pDCB;
  597                         pccb->ccb_h.ccb_trmsrb_ptr = pSRB;
  598                         pccb->ccb_h.ccb_trmacb_ptr = pACB;
  599                         pSRB->pccb = pccb;
  600                         pSRB->ScsiCmdLen = pcsio->cdb_len;
  601                         /* 
  602                          * move layer of CAM command block to layer of SCSI
  603                          * Request Block for SCSI processor command doing
  604                          */
  605                         if ((pccb->ccb_h.flags & CAM_CDB_POINTER) != 0) {
  606                                 if ((pccb->ccb_h.flags & CAM_CDB_PHYS) == 0) {
  607                                         bcopy(pcsio->cdb_io.cdb_ptr,pSRB->CmdBlock
  608                                             ,pcsio->cdb_len);
  609                                 } else {
  610                                         pccb->ccb_h.status = CAM_REQ_INVALID;
  611                                         pSRB->pNextSRB = pACB->pFreeSRB;
  612                                         pACB->pFreeSRB=  pSRB;
  613                                         xpt_done(pccb);
  614                                         splx(actionflags);
  615                                         return;
  616                                 }               
  617                         } else
  618                                 bcopy(pcsio->cdb_io.cdb_bytes,
  619                                     pSRB->CmdBlock, pcsio->cdb_len);
  620                         if ((pccb->ccb_h.flags & CAM_DIR_MASK)
  621                             != CAM_DIR_NONE) {
  622                                 if ((pccb->ccb_h.flags &
  623                                       CAM_SCATTER_VALID) == 0) {
  624                                         if ((pccb->ccb_h.flags 
  625                                               & CAM_DATA_PHYS) == 0) {
  626                                                 int vmflags;
  627                                                 int error;
  628 
  629                                                 vmflags = splsoftvm();
  630                                                 error = bus_dmamap_load(
  631                                                     pACB->buffer_dmat,
  632                                                     pSRB->dmamap,
  633                                                     pcsio->data_ptr,
  634                                                     pcsio->dxfer_len,
  635                                                     trm_ExecuteSRB,
  636                                                     pSRB,
  637                                                     0);
  638                                                 if (error == EINPROGRESS) {
  639                                                         xpt_freeze_simq(
  640                                                             pACB->psim,
  641                                                             1);
  642                                                         pccb->ccb_h.status |=
  643                                                           CAM_RELEASE_SIMQ;
  644                                                 }
  645                                                 splx(vmflags);
  646                                         } else {   
  647                                                 struct bus_dma_segment seg;
  648 
  649                                                 /* Pointer to physical buffer */
  650                                                 seg.ds_addr = 
  651                                                   (bus_addr_t)pcsio->data_ptr;
  652                                                 seg.ds_len = pcsio->dxfer_len;
  653                                                 trm_ExecuteSRB(pSRB, &seg, 1,
  654                                                     0);
  655                                         }
  656                                 } else { 
  657                                         /*  CAM_SCATTER_VALID */
  658                                         struct bus_dma_segment *segs;
  659 
  660                                         if ((pccb->ccb_h.flags &
  661                                              CAM_SG_LIST_PHYS) == 0 ||
  662                                              (pccb->ccb_h.flags 
  663                                              & CAM_DATA_PHYS) != 0) {
  664                                                 pSRB->pNextSRB = pACB->pFreeSRB;
  665                                                 pACB->pFreeSRB = pSRB;
  666                                                 pccb->ccb_h.status = 
  667                                                   CAM_PROVIDE_FAIL;
  668                                                 xpt_done(pccb);
  669                                                 splx(actionflags);
  670                                                 return;
  671                                         }
  672 
  673                                         /* cam SG list is physical,
  674                                          *  cam data is virtual 
  675                                          */
  676                                         segs = (struct bus_dma_segment *)
  677                                             pcsio->data_ptr;
  678                                         trm_ExecuteSRB(pSRB, segs,
  679                                             pcsio->sglist_cnt, 1);
  680                                 }   /*  CAM_SCATTER_VALID */
  681                         } else
  682                                 trm_ExecuteSRB(pSRB, NULL, 0, 0);
  683                                   }
  684                         break;
  685                 case XPT_GDEV_TYPE:                 
  686                         TRM_DPRINTF(" XPT_GDEV_TYPE \n");
  687                         pccb->ccb_h.status = CAM_REQ_INVALID;
  688                         xpt_done(pccb);
  689                         break;
  690                 case XPT_GDEVLIST:                  
  691                         TRM_DPRINTF(" XPT_GDEVLIST \n");
  692                         pccb->ccb_h.status = CAM_REQ_INVALID;
  693                         xpt_done(pccb);
  694                         break;
  695                 /*
  696                  * Path routing inquiry 
  697                  * Path Inquiry CCB 
  698                  */
  699                 case XPT_PATH_INQ: {
  700                         struct ccb_pathinq *cpi = &pccb->cpi;
  701 
  702                         TRM_DPRINTF(" XPT_PATH_INQ \n");
  703                         cpi->version_num = 1; 
  704                         cpi->hba_inquiry = PI_SDTR_ABLE|PI_TAG_ABLE|PI_WIDE_16;
  705                         cpi->target_sprt = 0;
  706                         cpi->hba_misc = 0;
  707                         cpi->hba_eng_cnt = 0;
  708                         cpi->max_target = 15 ; 
  709                         cpi->max_lun = pACB->max_lun;        /* 7 or 0 */
  710                         cpi->initiator_id = pACB->AdaptSCSIID;
  711                         cpi->bus_id = cam_sim_bus(psim);
  712                         cpi->base_transfer_speed = 3300;
  713                         strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN);
  714                         strncpy(cpi->hba_vid, "Tekram_TRM", HBA_IDLEN);
  715                         strncpy(cpi->dev_name, cam_sim_name(psim), DEV_IDLEN);
  716                         cpi->unit_number = cam_sim_unit(psim);
  717                         cpi->ccb_h.status = CAM_REQ_CMP;
  718                         xpt_done(pccb);
  719                                    }
  720                         break;
  721                 /*
  722                  * Release a frozen SIM queue 
  723                  * Release SIM Queue 
  724                  */
  725                 case XPT_REL_SIMQ:                  
  726                         TRM_DPRINTF(" XPT_REL_SIMQ \n");
  727                         pccb->ccb_h.status = CAM_REQ_INVALID;
  728                         xpt_done(pccb);
  729                         break;
  730                 /*
  731                  * Set Asynchronous Callback Parameters 
  732                  * Set Asynchronous Callback CCB
  733                  */
  734                 case XPT_SASYNC_CB:                 
  735                         TRM_DPRINTF(" XPT_SASYNC_CB \n");
  736                         pccb->ccb_h.status = CAM_REQ_INVALID;
  737                         xpt_done(pccb);
  738                         break;
  739                 /*
  740                  * Set device type information 
  741                  * Set Device Type CCB 
  742                  */
  743                 case XPT_SDEV_TYPE:                 
  744                         TRM_DPRINTF(" XPT_SDEV_TYPE \n");
  745                         pccb->ccb_h.status = CAM_REQ_INVALID;
  746                         xpt_done(pccb);
  747                         break;
  748                 /*
  749                  * (Re)Scan the SCSI Bus 
  750                  * Rescan the given bus, or bus/target/lun
  751                  */
  752                 case XPT_SCAN_BUS:                  
  753                         TRM_DPRINTF(" XPT_SCAN_BUS \n");
  754                         pccb->ccb_h.status = CAM_REQ_INVALID;
  755                         xpt_done(pccb);
  756                         break;
  757                 /*
  758                  * Get EDT entries matching the given pattern 
  759                  */
  760                 case XPT_DEV_MATCH:             
  761                         TRM_DPRINTF(" XPT_DEV_MATCH \n");
  762                         pccb->ccb_h.status = CAM_REQ_INVALID;
  763                         xpt_done(pccb);
  764                         break;
  765                 /*
  766                  * Turn on debugging for a bus, target or lun 
  767                  */
  768                 case XPT_DEBUG:             
  769                         TRM_DPRINTF(" XPT_DEBUG \n");
  770                         pccb->ccb_h.status = CAM_REQ_INVALID;
  771                         xpt_done(pccb);
  772                         break;
  773                         /*
  774                          * XPT_ABORT = 0x10, Abort the specified CCB 
  775                          * Abort XPT request CCB 
  776                          */
  777                 case XPT_ABORT:             
  778                         TRM_DPRINTF(" XPT_ABORT \n");
  779                         pccb->ccb_h.status = CAM_REQ_INVALID;
  780                         xpt_done(pccb);
  781                         break;
  782                 /*
  783                  * Reset the specified SCSI bus 
  784                  * Reset SCSI Bus CCB 
  785                  */
  786                 case XPT_RESET_BUS: {           
  787                         int i;
  788 
  789                         TRM_DPRINTF(" XPT_RESET_BUS \n");
  790                         trm_reset(pACB);
  791                         pACB->ACBFlag=0;
  792                         for (i=0; i<500; i++)
  793                                 DELAY(1000);
  794                         pccb->ccb_h.status = CAM_REQ_CMP;
  795                         xpt_done(pccb);
  796                                     }
  797                         break;
  798                 /*
  799                  * Bus Device Reset the specified SCSI device 
  800                  * Reset SCSI Device CCB 
  801                  */
  802                 case XPT_RESET_DEV:             
  803                 /*
  804                  * Don't (yet?) support vendor
  805                  * specific commands.
  806                  */
  807                         TRM_DPRINTF(" XPT_RESET_DEV \n");
  808                         pccb->ccb_h.status = CAM_REQ_INVALID;
  809                         xpt_done(pccb);
  810                         break;
  811                 /*
  812                  * Terminate the I/O process 
  813                  * Terminate I/O Process Request CCB 
  814                  */
  815                 case XPT_TERM_IO:               
  816                         TRM_DPRINTF(" XPT_TERM_IO \n");
  817                         pccb->ccb_h.status = CAM_REQ_INVALID;
  818                         xpt_done(pccb);
  819                         break;
  820                 /*
  821                  * Scan Logical Unit 
  822                  */
  823                 case XPT_SCAN_LUN:                 
  824                         TRM_DPRINTF(" XPT_SCAN_LUN \n");
  825                         pccb->ccb_h.status = CAM_REQ_INVALID;
  826                         xpt_done(pccb);
  827                         break;
  828 
  829                 /*
  830                  * Get/Set transfer rate/width/disconnection/tag queueing 
  831                  * settings 
  832                  * (GET) default/user transfer settings for the target 
  833                  */
  834                 case XPT_GET_TRAN_SETTINGS: {
  835                         struct  ccb_trans_settings *cts;        
  836                         int     intflag;
  837                         struct  trm_transinfo *tinfo;
  838                         PDCB    pDCB;   
  839                         
  840                         TRM_DPRINTF(" XPT_GET_TRAN_SETTINGS \n");
  841                         cts = &pccb->cts;
  842                         pDCB = &pACB->DCBarray[target_id][target_lun];
  843                         intflag = splcam();
  844                         /*
  845                          * disable interrupt
  846                          */
  847                         if ((cts->flags & CCB_TRANS_CURRENT_SETTINGS) != 0) {
  848                                 /* current transfer settings */
  849                                 if (pDCB->tinfo.disc_tag & TRM_CUR_DISCENB)
  850                                         cts->flags = CCB_TRANS_DISC_ENB;
  851                                 else
  852                                         cts->flags = 0;/* no tag & disconnect */
  853                                 if (pDCB->tinfo.disc_tag & TRM_CUR_TAGENB)
  854                                         cts->flags |= CCB_TRANS_TAG_ENB;
  855                                 tinfo = &pDCB->tinfo.current;
  856                                 TRM_DPRINTF("CURRENT:  cts->flags= %2x \n",
  857                                     cts->flags);
  858                         } else {
  859                           /* default(user) transfer settings */
  860                                 if (pDCB->tinfo.disc_tag & TRM_USR_DISCENB)
  861                                         cts->flags = CCB_TRANS_DISC_ENB;
  862                                 else
  863                                         cts->flags = 0;
  864                                 if (pDCB->tinfo.disc_tag & TRM_USR_TAGENB)
  865                                         cts->flags |= CCB_TRANS_TAG_ENB;
  866                                 tinfo = &pDCB->tinfo.user;
  867                                 TRM_DPRINTF("USER: cts->flags= %2x \n",
  868                                         cts->flags);
  869                         }
  870                         cts->sync_period = tinfo->period;
  871                         cts->sync_offset = tinfo->offset;
  872                         cts->bus_width   = tinfo->width;
  873                         TRM_DPRINTF("pDCB->SyncPeriod: %d  \n", 
  874                                 pDCB->SyncPeriod);
  875                         TRM_DPRINTF("period: %d  \n", tinfo->period);
  876                         TRM_DPRINTF("offset: %d  \n", tinfo->offset);
  877                         TRM_DPRINTF("width: %d  \n", tinfo->width);
  878 
  879                         splx(intflag);
  880                         cts->valid = CCB_TRANS_SYNC_RATE_VALID | 
  881                             CCB_TRANS_SYNC_OFFSET_VALID | 
  882                             CCB_TRANS_BUS_WIDTH_VALID | 
  883                             CCB_TRANS_DISC_VALID | 
  884                             CCB_TRANS_TQ_VALID;
  885                         pccb->ccb_h.status = CAM_REQ_CMP;
  886                         xpt_done(pccb);
  887                                             }
  888                         break;
  889                 /* 
  890                  * Get/Set transfer rate/width/disconnection/tag queueing 
  891                  * settings
  892                  * (Set) transfer rate/width negotiation settings 
  893                  */
  894                 case XPT_SET_TRAN_SETTINGS: {
  895                         struct  ccb_trans_settings *cts;
  896                         u_int   update_type;
  897                         int     intflag;
  898                         PDCB    pDCB;
  899 
  900                         TRM_DPRINTF(" XPT_SET_TRAN_SETTINGS \n");
  901                         cts = &pccb->cts;
  902                         update_type = 0;
  903                         if ((cts->flags & CCB_TRANS_CURRENT_SETTINGS) != 0)
  904                                 update_type |= TRM_TRANS_GOAL;
  905                         if ((cts->flags & CCB_TRANS_USER_SETTINGS) != 0)
  906                                 update_type |= TRM_TRANS_USER;
  907                         intflag = splcam();
  908                         pDCB = &pACB->DCBarray[target_id][target_lun];
  909 
  910                         if ((cts->valid & CCB_TRANS_DISC_VALID) != 0) {
  911                           /*ccb disc enables */
  912                                 if (update_type & TRM_TRANS_GOAL) {
  913                                         if ((cts->flags & CCB_TRANS_DISC_ENB)
  914                                             != 0) 
  915                                                 pDCB->tinfo.disc_tag 
  916                                                     |= TRM_CUR_DISCENB;
  917                                         else
  918                                                 pDCB->tinfo.disc_tag &=
  919                                                     ~TRM_CUR_DISCENB;
  920                                 }
  921                                 if (update_type & TRM_TRANS_USER) {
  922                                         if ((cts->flags & CCB_TRANS_DISC_ENB)
  923                                             != 0)
  924                                                 pDCB->tinfo.disc_tag 
  925                                                     |= TRM_USR_DISCENB;
  926                                         else
  927                                                 pDCB->tinfo.disc_tag &=
  928                                                     ~TRM_USR_DISCENB;
  929                                 }
  930                         }
  931                         if ((cts->valid & CCB_TRANS_TQ_VALID) != 0) {
  932                           /* if ccb tag q active */
  933                                 if (update_type & TRM_TRANS_GOAL) {
  934                                         if ((cts->flags & CCB_TRANS_TAG_ENB)
  935                                             != 0)
  936                                                 pDCB->tinfo.disc_tag |= 
  937                                                     TRM_CUR_TAGENB;
  938                                         else
  939                                                 pDCB->tinfo.disc_tag &= 
  940                                                     ~TRM_CUR_TAGENB;
  941                                 }
  942                                 if (update_type & TRM_TRANS_USER) {
  943                                         if ((cts->flags & CCB_TRANS_TAG_ENB)
  944                                             != 0)
  945                                                 pDCB->tinfo.disc_tag |= 
  946                                                     TRM_USR_TAGENB;
  947                                         else
  948                                                 pDCB->tinfo.disc_tag &= 
  949                                                     ~TRM_USR_TAGENB;
  950                                 }       
  951                         }
  952                         /* Minimum sync period factor   */
  953 
  954                         if ((cts->valid & CCB_TRANS_SYNC_RATE_VALID) != 0) {
  955                                 /* if ccb sync active */
  956                                 /* TRM-S1040 MinSyncPeriod = 4 clocks/byte */
  957                                 if ((cts->sync_period != 0) &&
  958                                     (cts->sync_period < 125))
  959                                         cts->sync_period = 125;
  960                                 /* 1/(125*4) minsync 2 MByte/sec */
  961                                 if ((cts->valid & CCB_TRANS_SYNC_OFFSET_VALID)
  962                                     != 0) {
  963                                         if (cts->sync_offset == 0)
  964                                                 cts->sync_period = 0;
  965                                         /* TRM-S1040 MaxSyncOffset = 15 bytes*/
  966                                         if (cts->sync_offset > 15) 
  967                                                 cts->sync_offset = 15;
  968                                 }
  969                         }
  970                         if ((update_type & TRM_TRANS_USER) != 0) {
  971                                 pDCB->tinfo.user.period = cts->sync_period;
  972                                 pDCB->tinfo.user.offset = cts->sync_offset;
  973                                 pDCB->tinfo.user.width  = cts->bus_width;
  974                         }
  975                         if ((update_type & TRM_TRANS_GOAL) != 0) {
  976                                 pDCB->tinfo.goal.period = cts->sync_period;
  977                                 pDCB->tinfo.goal.offset = cts->sync_offset;
  978                                 pDCB->tinfo.goal.width  = cts->bus_width;
  979                         }
  980                         splx(intflag);
  981                         pccb->ccb_h.status = CAM_REQ_CMP;
  982                         xpt_done(pccb);
  983                         break;
  984                                             }
  985                 /*
  986                  * Calculate the geometry parameters for a device give
  987                  * the sector size and volume size. 
  988                  */
  989                 case XPT_CALC_GEOMETRY:
  990                         TRM_DPRINTF(" XPT_CALC_GEOMETRY \n");
  991                         cam_calc_geometry(&pccb->ccg, /*extended*/1);
  992                         xpt_done(pccb);
  993                         break;
  994                 case XPT_ENG_INQ:           
  995                         TRM_DPRINTF(" XPT_ENG_INQ \n");
  996                         pccb->ccb_h.status = CAM_REQ_INVALID;
  997                         xpt_done(pccb);
  998                         break;
  999                 /*
 1000                  * HBA execute engine request 
 1001                  * This structure must match SCSIIO size 
 1002                  */
 1003                 case XPT_ENG_EXEC:                  
 1004                         TRM_DPRINTF(" XPT_ENG_EXEC \n");
 1005                         pccb->ccb_h.status = CAM_REQ_INVALID;
 1006                         xpt_done(pccb);
 1007                         break;
 1008                 /*
 1009                  * XPT_EN_LUN = 0x30, Enable LUN as a target 
 1010                  * Target mode structures. 
 1011                  */
 1012                 case XPT_EN_LUN:            
 1013                 /*
 1014                  * Don't (yet?) support vendor
 1015                  * specific commands.
 1016                  */
 1017                         TRM_DPRINTF(" XPT_EN_LUN \n");
 1018                         pccb->ccb_h.status = CAM_REQ_INVALID;
 1019                         xpt_done(pccb);
 1020                         break;
 1021                 /*
 1022                 * Execute target I/O request 
 1023                 */
 1024                 case XPT_TARGET_IO:                 
 1025                 /*
 1026                  * Don't (yet?) support vendor
 1027                  * specific commands.
 1028                  */
 1029                         TRM_DPRINTF(" XPT_TARGET_IO \n");
 1030                         pccb->ccb_h.status = CAM_REQ_INVALID;
 1031                         xpt_done(pccb);
 1032                         break;
 1033                 /*
 1034                  * Accept Host Target Mode CDB 
 1035                  */
 1036                 case XPT_ACCEPT_TARGET_IO:      
 1037                 /*
 1038                  * Don't (yet?) support vendor
 1039                  * specific commands.
 1040                  */
 1041                         TRM_DPRINTF(" XPT_ACCEPT_TARGET_IO \n");
 1042                         pccb->ccb_h.status = CAM_REQ_INVALID;
 1043                         xpt_done(pccb);
 1044                         break;
 1045                 /*
 1046                  * Continue Host Target I/O Connection 
 1047                  */
 1048                 case XPT_CONT_TARGET_IO:        
 1049                 /*
 1050                  * Don't (yet?) support vendor
 1051                  * specific commands.
 1052                  */
 1053                         TRM_DPRINTF(" XPT_CONT_TARGET_IO \n");
 1054                         pccb->ccb_h.status = CAM_REQ_INVALID;
 1055                         xpt_done(pccb);
 1056                         break;
 1057                 /*
 1058                  * Notify Host Target driver of event 
 1059                  */
 1060                 case XPT_IMMED_NOTIFY:      
 1061                         TRM_DPRINTF(" XPT_IMMED_NOTIFY \n");
 1062                         pccb->ccb_h.status = CAM_REQ_INVALID;
 1063                         xpt_done(pccb);
 1064                         break;
 1065                 /*
 1066                  * Acknowledgement of event
 1067                  */
 1068                 case XPT_NOTIFY_ACK:        
 1069                         TRM_DPRINTF(" XPT_NOTIFY_ACK \n");
 1070                         pccb->ccb_h.status = CAM_REQ_INVALID;
 1071                         xpt_done(pccb);
 1072                         break;
 1073                 /*
 1074                  * XPT_VUNIQUE = 0x80
 1075                  */
 1076                 case XPT_VUNIQUE:   
 1077                         pccb->ccb_h.status = CAM_REQ_INVALID;
 1078                         xpt_done(pccb);
 1079                         break;
 1080                 default:
 1081                         pccb->ccb_h.status = CAM_REQ_INVALID;
 1082                         xpt_done(pccb);
 1083                         break;
 1084         }
 1085         splx(actionflags);
 1086 }
 1087 
 1088 static void 
 1089 trm_poll(struct cam_sim *psim)
 1090 {       
 1091         trm_Interrupt(cam_sim_softc(psim));     
 1092 }
 1093 
 1094 static void
 1095 trm_ResetDevParam(PACB pACB)
 1096 {
 1097         PDCB            pDCB, pdcb;
 1098         PNVRAMTYPE      pEEpromBuf;
 1099         u_int8_t        PeriodIndex;
 1100 
 1101         pDCB = pACB->pLinkDCB;
 1102         if (pDCB == NULL)
 1103                 return;
 1104         pdcb = pDCB;
 1105         do {
 1106                 pDCB->SyncMode  &= ~(SYNC_NEGO_DONE+ WIDE_NEGO_DONE);
 1107                 pDCB->SyncPeriod = 0;
 1108                 pDCB->SyncOffset = 0;
 1109                 pEEpromBuf = &trm_eepromBuf[pACB->AdapterUnit];
 1110                 pDCB->DevMode = 
 1111                   pEEpromBuf->NvramTarget[pDCB->TargetID].NvmTarCfg0;
 1112                 pDCB->AdpMode = pEEpromBuf->NvramChannelCfg;
 1113                 PeriodIndex =
 1114                    pEEpromBuf->NvramTarget[pDCB->TargetID].NvmTarPeriod & 0x07;
 1115                 if (pACB->AdaptType == 1) /* is U2? */
 1116                         pDCB->MaxNegoPeriod = dc395u2x_clock_period[PeriodIndex];
 1117                 else
 1118                         pDCB->MaxNegoPeriod = dc395x_clock_period[PeriodIndex];
 1119                 if ((pDCB->DevMode & NTC_DO_WIDE_NEGO) && 
 1120                     (pACB->Config & HCC_WIDE_CARD))
 1121                         pDCB->SyncMode |= WIDE_NEGO_ENABLE;
 1122                 pDCB = pDCB->pNextDCB;
 1123         }
 1124         while (pdcb != pDCB);
 1125 }
 1126 
 1127 static void
 1128 trm_RecoverSRB(PACB pACB)
 1129 {
 1130         PDCB            pDCB, pdcb;
 1131         PSRB            psrb, psrb2;
 1132         u_int16_t       cnt, i;
 1133 
 1134         pDCB = pACB->pLinkDCB;
 1135         if (pDCB == NULL)
 1136                 return;
 1137         pdcb = pDCB;
 1138         do {
 1139                 cnt = pdcb->GoingSRBCnt;
 1140                 psrb = pdcb->pGoingSRB;
 1141                 for (i = 0; i < cnt; i++) {
 1142                         psrb2 = psrb;
 1143                         psrb = psrb->pNextSRB;
 1144                         if (pdcb->pWaitingSRB) {
 1145                                 psrb2->pNextSRB = pdcb->pWaitingSRB;
 1146                                 pdcb->pWaitingSRB = psrb2;
 1147                         } else {
 1148                                 pdcb->pWaitingSRB = psrb2;
 1149                                 pdcb->pWaitingLastSRB = psrb2;
 1150                                 psrb2->pNextSRB = NULL;
 1151                         }
 1152                 }
 1153                 pdcb->GoingSRBCnt = 0;
 1154                 pdcb->pGoingSRB = NULL;
 1155                 pdcb = pdcb->pNextDCB;
 1156         }
 1157         while (pdcb != pDCB);
 1158 }
 1159 
 1160 static void
 1161 trm_reset(PACB pACB)
 1162 {
 1163         int             intflag;
 1164         u_int16_t       i;
 1165 
 1166         TRM_DPRINTF("trm: RESET");
 1167         intflag = splcam();
 1168         trm_reg_write8(0x00, TRMREG_DMA_INTEN);
 1169         trm_reg_write8(0x00, TRMREG_SCSI_INTEN);
 1170 
 1171         trm_ResetSCSIBus(pACB);
 1172         for (i = 0; i < 500; i++)
 1173                 DELAY(1000);
 1174         trm_reg_write8(0x7F, TRMREG_SCSI_INTEN); 
 1175         /* Enable DMA interrupt */
 1176         trm_reg_write8(EN_SCSIINTR, TRMREG_DMA_INTEN);
 1177         /* Clear DMA FIFO */
 1178         trm_reg_write8(CLRXFIFO, TRMREG_DMA_CONTROL);
 1179         /* Clear SCSI FIFO */
 1180         trm_reg_write16(DO_CLRFIFO,TRMREG_SCSI_CONTROL);
 1181         trm_ResetDevParam(pACB);
 1182         trm_DoingSRB_Done(pACB);
 1183         pACB->pActiveDCB = NULL;
 1184         pACB->ACBFlag = 0;/* RESET_DETECT, RESET_DONE ,RESET_DEV */
 1185         trm_DoWaitingSRB(pACB);
 1186         /* Tell the XPT layer that a bus reset occured    */
 1187         if (pACB->ppath != NULL)
 1188                 xpt_async(AC_BUS_RESET, pACB->ppath, NULL);
 1189         splx(intflag);
 1190         return;
 1191 }
 1192 
 1193 static u_int16_t
 1194 trm_StartSCSI(PACB pACB, PDCB pDCB, PSRB pSRB)
 1195 {
 1196         u_int16_t       return_code;
 1197         u_int8_t        scsicommand, i,command,identify_message;
 1198         u_int8_t *      ptr;
 1199         union  ccb      *pccb;
 1200         struct ccb_scsiio *pcsio;
 1201 
 1202         pccb  = pSRB->pccb;
 1203         pcsio = &pccb->csio;
 1204 
 1205         trm_reg_write8(pACB->AdaptSCSIID, TRMREG_SCSI_HOSTID);
 1206         trm_reg_write8(pDCB->TargetID, TRMREG_SCSI_TARGETID);
 1207         trm_reg_write8(pDCB->SyncPeriod, TRMREG_SCSI_SYNC);
 1208         trm_reg_write8(pDCB->SyncOffset, TRMREG_SCSI_OFFSET);
 1209         pSRB->ScsiPhase = PH_BUS_FREE;/* initial phase */
 1210         /* Flush FIFO */
 1211         trm_reg_write16(DO_CLRFIFO, TRMREG_SCSI_CONTROL);
 1212 
 1213         identify_message = pDCB->IdentifyMsg;
 1214 
 1215         if ((pSRB->CmdBlock[0] == INQUIRY) ||
 1216             (pSRB->CmdBlock[0] == REQUEST_SENSE) ||
 1217             (pSRB->SRBFlag & AUTO_REQSENSE)) {
 1218                 if (((pDCB->SyncMode & WIDE_NEGO_ENABLE) &&
 1219                       !(pDCB->SyncMode & WIDE_NEGO_DONE)) 
 1220                 || ((pDCB->SyncMode & SYNC_NEGO_ENABLE) &&
 1221                   !(pDCB->SyncMode & SYNC_NEGO_DONE))) {
 1222                         if (!(pDCB->IdentifyMsg & 7) ||
 1223                             (pSRB->CmdBlock[0] != INQUIRY)) {
 1224                                 scsicommand = SCMD_SEL_ATNSTOP;
 1225                                 pSRB->SRBState = SRB_MSGOUT;
 1226                                 goto polling;
 1227                         }
 1228                 }
 1229         /* 
 1230         * Send identify message 
 1231         */
 1232                 trm_reg_write8((identify_message & 0xBF) ,TRMREG_SCSI_FIFO); 
 1233                 scsicommand = SCMD_SEL_ATN;
 1234                 pSRB->SRBState = SRB_START_;
 1235         } else {
 1236                 /* not inquiry,request sense,auto request sense */
 1237                 /* 
 1238                  * Send identify message        
 1239                  */
 1240                 trm_reg_write8(identify_message,TRMREG_SCSI_FIFO);
 1241                 scsicommand = SCMD_SEL_ATN;
 1242                 pSRB->SRBState = SRB_START_;
 1243                 if (pDCB->SyncMode & EN_TAG_QUEUING) {
 1244                   /* Send Tag message */
 1245                         trm_reg_write8(MSG_SIMPLE_QTAG, TRMREG_SCSI_FIFO);
 1246                         trm_reg_write8(pSRB->TagNumber, TRMREG_SCSI_FIFO);
 1247                         scsicommand = SCMD_SEL_ATN3;
 1248                 }
 1249         }
 1250 polling:
 1251         /*
 1252          *       Send CDB ..command block .........                     
 1253          */
 1254         if (pSRB->SRBFlag & AUTO_REQSENSE) {
 1255                 trm_reg_write8(REQUEST_SENSE, TRMREG_SCSI_FIFO);
 1256                 trm_reg_write8((pDCB->IdentifyMsg << 5), TRMREG_SCSI_FIFO);
 1257                 trm_reg_write8(0, TRMREG_SCSI_FIFO);
 1258                 trm_reg_write8(0, TRMREG_SCSI_FIFO);
 1259                 trm_reg_write8(pcsio->sense_len, TRMREG_SCSI_FIFO);
 1260                 trm_reg_write8(0, TRMREG_SCSI_FIFO);
 1261         } else {
 1262                 ptr = (u_int8_t *) pSRB->CmdBlock;
 1263                 for (i = 0; i < pSRB->ScsiCmdLen ; i++) {
 1264                         command = *ptr++;
 1265                         trm_reg_write8(command,TRMREG_SCSI_FIFO);
 1266                 }
 1267         }
 1268         if (trm_reg_read16(TRMREG_SCSI_STATUS) & SCSIINTERRUPT) { 
 1269             /* 
 1270              * If trm_StartSCSI return 1 :
 1271              * current interrupt status is interrupt disreenable 
 1272              * It's said that SCSI processor has more one SRB need to do,
 1273              * SCSI processor has been occupied by one SRB.
 1274              */
 1275                 pSRB->SRBState = SRB_READY;
 1276                 return_code = 1;
 1277         } else { 
 1278           /* 
 1279            * If trm_StartSCSI return 0 :
 1280            * current interrupt status is interrupt enable 
 1281            * It's said that SCSI processor is unoccupied 
 1282            */
 1283                 pSRB->ScsiPhase  = SCSI_NOP1; /* SCSI bus free Phase */
 1284                 pACB->pActiveDCB = pDCB;
 1285                 pDCB->pActiveSRB = pSRB;
 1286                 return_code = 0;
 1287                 trm_reg_write16(DO_DATALATCH | DO_HWRESELECT, 
 1288                     TRMREG_SCSI_CONTROL);/* it's important for atn stop*/
 1289                 /*
 1290                  * SCSI cammand 
 1291                  */
 1292                 trm_reg_write8(scsicommand,TRMREG_SCSI_COMMAND);
 1293         }
 1294         return (return_code);   
 1295 }
 1296 
 1297 static void 
 1298 trm_Interrupt(vpACB)
 1299 void *vpACB;
 1300 {
 1301         PACB            pACB;
 1302         PDCB            pDCB;
 1303         PSRB            pSRB;
 1304         u_int16_t       phase;
 1305         void            (*stateV)(PACB, PSRB, u_int16_t *);
 1306         u_int16_t       scsi_status=0;
 1307         u_int8_t        scsi_intstatus;
 1308 
 1309         pACB = vpACB;
 1310 
 1311         scsi_status = trm_reg_read16(TRMREG_SCSI_STATUS);
 1312         if (!(scsi_status & SCSIINTERRUPT)) {
 1313                 TRM_DPRINTF("trm_Interrupt: TRMREG_SCSI_STATUS scsi_status = NULL ,return......");
 1314                 return;
 1315         }
 1316         TRM_DPRINTF("scsi_status=%2x,",scsi_status);
 1317 
 1318         scsi_intstatus = trm_reg_read8(TRMREG_SCSI_INTSTATUS);
 1319 
 1320         TRM_DPRINTF("scsi_intstatus=%2x,",scsi_intstatus);
 1321 
 1322         if (scsi_intstatus & (INT_SELTIMEOUT | INT_DISCONNECT)) {
 1323                 trm_Disconnect(pACB);
 1324                 return;
 1325         }
 1326 
 1327         if (scsi_intstatus & INT_RESELECTED) {
 1328                 trm_Reselect(pACB);
 1329                 return;
 1330         }
 1331         if (scsi_intstatus & INT_SCSIRESET) {
 1332                 trm_ScsiRstDetect(pACB);
 1333                 return;
 1334         }
 1335 
 1336         if (scsi_intstatus & (INT_BUSSERVICE | INT_CMDDONE)) {
 1337                 pDCB = pACB->pActiveDCB;
 1338                 KASSERT(pDCB != NULL, ("no active DCB"));
 1339                 pSRB = pDCB->pActiveSRB;
 1340                 if (pDCB->DCBFlag & ABORT_DEV_)
 1341                                 trm_EnableMsgOutAbort1(pACB, pSRB);
 1342                 phase = (u_int16_t) pSRB->ScsiPhase;  /* phase: */
 1343                 stateV = (void *) trm_SCSI_phase0[phase];
 1344                 stateV(pACB, pSRB, &scsi_status);
 1345                 pSRB->ScsiPhase = scsi_status & PHASEMASK; 
 1346                 /* phase:0,1,2,3,4,5,6,7 */
 1347                 phase = (u_int16_t) scsi_status & PHASEMASK;       
 1348                 stateV = (void *) trm_SCSI_phase1[phase];
 1349                 stateV(pACB, pSRB, &scsi_status);  
 1350         }
 1351 }
 1352 
 1353 static void
 1354 trm_MsgOutPhase0(PACB pACB, PSRB pSRB, u_int16_t *pscsi_status)
 1355 {
 1356 
 1357         if (pSRB->SRBState & (SRB_UNEXPECT_RESEL+SRB_ABORT_SENT))
 1358                 *pscsi_status = PH_BUS_FREE;
 1359         /*.. initial phase*/
 1360 }
 1361 
 1362 static void
 1363 trm_MsgOutPhase1(PACB pACB, PSRB pSRB, u_int16_t *pscsi_status)
 1364 {
 1365         u_int8_t        bval;
 1366         u_int16_t       i, cnt;
 1367         u_int8_t *      ptr;
 1368         PDCB            pDCB;
 1369 
 1370         trm_reg_write16(DO_CLRFIFO, TRMREG_SCSI_CONTROL);
 1371         pDCB = pACB->pActiveDCB;
 1372         if (!(pSRB->SRBState & SRB_MSGOUT)) {
 1373                 cnt = pSRB->MsgCnt;
 1374                 if (cnt) {
 1375                         ptr = (u_int8_t *) pSRB->MsgOutBuf;
 1376                         for (i = 0; i < cnt; i++) {
 1377                                 trm_reg_write8(*ptr, TRMREG_SCSI_FIFO);
 1378                                 ptr++;
 1379                         }
 1380                         pSRB->MsgCnt = 0;
 1381                         if ((pDCB->DCBFlag & ABORT_DEV_) &&
 1382                             (pSRB->MsgOutBuf[0] == MSG_ABORT)) {
 1383                                 pSRB->SRBState = SRB_ABORT_SENT;
 1384                         }
 1385                 } else {
 1386                         bval = MSG_ABORT;       
 1387                         if ((pSRB->CmdBlock[0] == INQUIRY) ||
 1388                                         (pSRB->CmdBlock[0] == REQUEST_SENSE) ||
 1389                                         (pSRB->SRBFlag & AUTO_REQSENSE)) {
 1390                                 if (pDCB->SyncMode & SYNC_NEGO_ENABLE) {
 1391                                         goto  mop1;
 1392                                 }
 1393                         }
 1394                         trm_reg_write8(bval, TRMREG_SCSI_FIFO);
 1395                 }
 1396         } else {
 1397 mop1:   /* message out phase */
 1398                 if (!(pSRB->SRBState & SRB_DO_WIDE_NEGO)
 1399                     && (pDCB->SyncMode & WIDE_NEGO_ENABLE)) {
 1400                   /*
 1401                    * WIDE DATA TRANSFER REQUEST code (03h)
 1402                    */
 1403                         pDCB->SyncMode &= ~(SYNC_NEGO_DONE | EN_ATN_STOP);
 1404                         trm_reg_write8((pDCB->IdentifyMsg & 0xBF),
 1405                             TRMREG_SCSI_FIFO); 
 1406                         trm_reg_write8(MSG_EXTENDED,TRMREG_SCSI_FIFO);
 1407                         /* (01h) */
 1408                         trm_reg_write8(2,TRMREG_SCSI_FIFO);     
 1409                         /* Message length (02h) */
 1410                         trm_reg_write8(3,TRMREG_SCSI_FIFO);
 1411                         /* wide data xfer (03h) */
 1412                         trm_reg_write8(1,TRMREG_SCSI_FIFO);
 1413                         /* width:0(8bit),1(16bit),2(32bit) */
 1414                         pSRB->SRBState |= SRB_DO_WIDE_NEGO; 
 1415                 } else if (!(pSRB->SRBState & SRB_DO_SYNC_NEGO) 
 1416                     && (pDCB->SyncMode & SYNC_NEGO_ENABLE)) {
 1417                   /*
 1418                    * SYNCHRONOUS DATA TRANSFER REQUEST code (01h)
 1419                    */
 1420                         if (!(pDCB->SyncMode & WIDE_NEGO_DONE))
 1421                                 trm_reg_write8((pDCB->IdentifyMsg & 0xBF),
 1422                                                 TRMREG_SCSI_FIFO);
 1423                         trm_reg_write8(MSG_EXTENDED,TRMREG_SCSI_FIFO);
 1424                   /* (01h) */
 1425                         trm_reg_write8(3,TRMREG_SCSI_FIFO); 
 1426                   /* Message length (03h) */
 1427                         trm_reg_write8(1,TRMREG_SCSI_FIFO);
 1428                   /* SYNCHRONOUS DATA TRANSFER REQUEST code (01h) */
 1429                         trm_reg_write8(pDCB->MaxNegoPeriod,TRMREG_SCSI_FIFO);
 1430                   /* Transfer peeriod factor */
 1431                         trm_reg_write8((pACB->AdaptType == 1) ? 31 : 15,
 1432                             TRMREG_SCSI_FIFO); 
 1433                   /* REQ/ACK offset */
 1434                         pSRB->SRBState |= SRB_DO_SYNC_NEGO;
 1435                 }
 1436         }
 1437         trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
 1438         /* it's important for atn stop */
 1439         /*
 1440          * SCSI cammand 
 1441          */
 1442         trm_reg_write8(SCMD_FIFO_OUT, TRMREG_SCSI_COMMAND);
 1443 }
 1444 
 1445 static void 
 1446 trm_CommandPhase0(PACB pACB, PSRB pSRB, u_int16_t *pscsi_status)
 1447 {
 1448 
 1449 }
 1450 
 1451 static void 
 1452 trm_CommandPhase1(PACB pACB, PSRB pSRB, u_int16_t *pscsi_status)
 1453 {
 1454         PDCB                    pDCB;
 1455         u_int8_t *              ptr;
 1456         u_int16_t               i, cnt;
 1457         union  ccb              *pccb;
 1458         struct ccb_scsiio       *pcsio;
 1459 
 1460         pccb  = pSRB->pccb;
 1461         pcsio = &pccb->csio;
 1462 
 1463         trm_reg_write16(DO_CLRATN | DO_CLRFIFO , TRMREG_SCSI_CONTROL);
 1464         if (!(pSRB->SRBFlag & AUTO_REQSENSE)) {
 1465                 cnt = (u_int16_t) pSRB->ScsiCmdLen;
 1466                 ptr = (u_int8_t *) pSRB->CmdBlock;
 1467                 for (i = 0; i < cnt; i++) {
 1468                         trm_reg_write8(*ptr, TRMREG_SCSI_FIFO);
 1469                         ptr++;
 1470                 }
 1471         } else {
 1472                 trm_reg_write8(REQUEST_SENSE, TRMREG_SCSI_FIFO);
 1473                 pDCB = pACB->pActiveDCB;
 1474                 /* target id */
 1475                 trm_reg_write8((pDCB->IdentifyMsg << 5), TRMREG_SCSI_FIFO);
 1476                 trm_reg_write8(0, TRMREG_SCSI_FIFO);
 1477                 trm_reg_write8(0, TRMREG_SCSI_FIFO);
 1478                 /* sizeof(struct scsi_sense_data) */
 1479                 trm_reg_write8(pcsio->sense_len, TRMREG_SCSI_FIFO);
 1480                 trm_reg_write8(0, TRMREG_SCSI_FIFO);
 1481         }
 1482         pSRB->SRBState = SRB_COMMAND;
 1483         trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
 1484         /* it's important for atn stop*/
 1485         /*
 1486          * SCSI cammand 
 1487          */
 1488         trm_reg_write8(SCMD_FIFO_OUT, TRMREG_SCSI_COMMAND);
 1489 }
 1490 
 1491 static void
 1492 trm_DataOutPhase0(PACB pACB, PSRB pSRB, u_int16_t *pscsi_status)
 1493 {
 1494         PDCB            pDCB;
 1495         u_int8_t        TempDMAstatus,SGIndexTemp;
 1496         u_int16_t       scsi_status;
 1497         PSEG            pseg;
 1498         u_long          TempSRBXferredLength,dLeftCounter=0;
 1499 
 1500         pDCB = pSRB->pSRBDCB;
 1501         scsi_status = *pscsi_status;
 1502 
 1503         if (!(pSRB->SRBState & SRB_XFERPAD)) {
 1504                 if (scsi_status & PARITYERROR)
 1505                         pSRB->SRBStatus |= PARITY_ERROR;
 1506                 if (!(scsi_status & SCSIXFERDONE)) {
 1507                   /*
 1508                    * when data transfer from DMA FIFO to SCSI FIFO
 1509                    * if there was some data left in SCSI FIFO
 1510                    */
 1511                         dLeftCounter = (u_long) 
 1512                           (trm_reg_read8(TRMREG_SCSI_FIFOCNT) & 0x3F);
 1513                         if (pDCB->SyncPeriod & WIDE_SYNC) {
 1514                           /*
 1515                            * if WIDE scsi SCSI FIFOCNT unit is word
 1516                            * so need to * 2
 1517                            */
 1518                                 dLeftCounter <<= 1;
 1519                         }
 1520                 }
 1521                 /*
 1522                  * caculate all the residue data that not yet tranfered
 1523                  * SCSI transfer counter + left in SCSI FIFO data
 1524                  *
 1525                  * .....TRM_SCSI_COUNTER (24bits)
 1526                  * The counter always decrement by one for every SCSI byte 
 1527                  *transfer.
 1528                  * .....TRM_SCSI_FIFOCNT (5bits)
 1529                  * The counter is SCSI FIFO offset counter
 1530                  */
 1531                 dLeftCounter += trm_reg_read32(TRMREG_SCSI_COUNTER);
 1532                 if (dLeftCounter == 1) {
 1533                         dLeftCounter = 0;
 1534                         trm_reg_write16(DO_CLRFIFO,TRMREG_SCSI_CONTROL);
 1535                 }
 1536                 if ((dLeftCounter == 0) || 
 1537                     (scsi_status & SCSIXFERCNT_2_ZERO)) {   
 1538                         TempDMAstatus = trm_reg_read8(TRMREG_DMA_STATUS);
 1539                         while (!(TempDMAstatus & DMAXFERCOMP)) {
 1540                                 TempDMAstatus = 
 1541                                   trm_reg_read8(TRMREG_DMA_STATUS);
 1542                         }
 1543                         pSRB->SRBTotalXferLength = 0;
 1544                 } else {
 1545                   /* Update SG list             */
 1546                   /*
 1547                    * if transfer not yet complete
 1548                    * there were some data residue in SCSI FIFO or
 1549                    * SCSI transfer counter not empty
 1550                    */
 1551                         if (pSRB->SRBTotalXferLength != dLeftCounter) {
 1552                           /*
 1553                            * data that had transferred length
 1554                            */
 1555                                 TempSRBXferredLength = 
 1556                                   pSRB->SRBTotalXferLength - dLeftCounter;
 1557                                 /*
 1558                                  * next time to be transferred length
 1559                                  */
 1560                                 pSRB->SRBTotalXferLength = dLeftCounter;
 1561                                 /*
 1562                                  * parsing from last time disconnect SRBSGIndex
 1563                                  */
 1564                                 pseg = 
 1565                                   pSRB->pSRBSGL + pSRB->SRBSGIndex;
 1566                                 for (SGIndexTemp = pSRB->SRBSGIndex;
 1567                                     SGIndexTemp < pSRB->SRBSGCount; 
 1568                                     SGIndexTemp++) {
 1569                                         /* 
 1570                                          * find last time which SG transfer be 
 1571                                          * disconnect 
 1572                                          */
 1573                                         if (TempSRBXferredLength >= 
 1574                                             pseg->length) 
 1575                                                 TempSRBXferredLength -= 
 1576                                                   pseg->length;
 1577                                         else {
 1578                                           /*
 1579                                            * update last time disconnected SG 
 1580                                            * list
 1581                                            */
 1582                                                 pseg->length -= 
 1583                                                   TempSRBXferredLength; 
 1584                                                 /* residue data length  */
 1585                                                 pseg->address += 
 1586                                                   TempSRBXferredLength;
 1587                                                 /* residue data pointer */
 1588                                                 pSRB->SRBSGIndex = SGIndexTemp;
 1589                                                 break;
 1590                                         }
 1591                                         pseg++;
 1592                                 }
 1593                         }
 1594                 }
 1595         }
 1596         trm_reg_write8(STOPDMAXFER ,TRMREG_DMA_CONTROL);
 1597 }
 1598 
 1599 
 1600 static void
 1601 trm_DataOutPhase1(PACB pACB, PSRB pSRB, u_int16_t *pscsi_status)
 1602 {
 1603         u_int16_t       ioDir;
 1604         /*
 1605          * do prepare befor transfer when data out phase
 1606          */
 1607 
 1608         ioDir = XFERDATAOUT;
 1609         trm_DataIO_transfer(pACB, pSRB, ioDir);
 1610 }
 1611 
 1612 static void 
 1613 trm_DataInPhase0(PACB pACB, PSRB pSRB, u_int16_t *pscsi_status)
 1614 {
 1615         u_int8_t        TempDMAstatus, SGIndexTemp;
 1616         u_int16_t       scsi_status;
 1617         PSEG            pseg;
 1618         u_long          TempSRBXferredLength,dLeftCounter = 0;
 1619 
 1620         scsi_status = *pscsi_status;
 1621         if (!(pSRB->SRBState & SRB_XFERPAD)) {
 1622                 if (scsi_status & PARITYERROR)
 1623                         pSRB->SRBStatus |= PARITY_ERROR;
 1624                 dLeftCounter += trm_reg_read32(TRMREG_SCSI_COUNTER);
 1625                 if ((dLeftCounter == 0) || (scsi_status & SCSIXFERCNT_2_ZERO)) {
 1626                         TempDMAstatus = trm_reg_read8(TRMREG_DMA_STATUS);
 1627                         while (!(TempDMAstatus & DMAXFERCOMP))
 1628                                 TempDMAstatus = trm_reg_read8(TRMREG_DMA_STATUS);
 1629                         pSRB->SRBTotalXferLength = 0;
 1630                 } else {  
 1631                   /*
 1632                    * parsing the case:
 1633                    * when a transfer not yet complete 
 1634                    * but be disconnected by uper layer
 1635                    * if transfer not yet complete
 1636                    * there were some data residue in SCSI FIFO or
 1637                    * SCSI transfer counter not empty
 1638                    */
 1639                   if (pSRB->SRBTotalXferLength != dLeftCounter) {
 1640                                 /*
 1641                                  * data that had transferred length
 1642                                  */
 1643                         TempSRBXferredLength = 
 1644                           pSRB->SRBTotalXferLength - dLeftCounter;
 1645                                 /*
 1646                                  * next time to be transferred length
 1647                                  */
 1648                         pSRB->SRBTotalXferLength = dLeftCounter;
 1649                                 /*
 1650                                  * parsing from last time disconnect SRBSGIndex
 1651                                  */
 1652                         pseg = pSRB->pSRBSGL + pSRB->SRBSGIndex;
 1653                         for (SGIndexTemp = pSRB->SRBSGIndex; 
 1654                             SGIndexTemp < pSRB->SRBSGCount;
 1655                             SGIndexTemp++) {
 1656                           /* 
 1657                            * find last time which SG transfer be disconnect 
 1658                            */
 1659                                 if (TempSRBXferredLength >= pseg->length)
 1660                                         TempSRBXferredLength -= pseg->length;
 1661                                 else {
 1662                                   /*
 1663                                    * update last time disconnected SG list
 1664                                    */
 1665                                         pseg->length -= TempSRBXferredLength;
 1666                                         /* residue data length  */
 1667                                         pseg->address += TempSRBXferredLength;
 1668                                         /* residue data pointer */
 1669                                         pSRB->SRBSGIndex = SGIndexTemp;
 1670                                         break;
 1671                                 } 
 1672                                 pseg++;
 1673                         }
 1674                   }
 1675                 }
 1676         }
 1677 }
 1678 
 1679 static void
 1680 trm_DataInPhase1(PACB pACB, PSRB pSRB, u_int16_t *pscsi_status)
 1681 {
 1682         u_int16_t       ioDir;
 1683         /*
 1684          * do prepare befor transfer when data in phase
 1685          */
 1686         
 1687         ioDir = XFERDATAIN;
 1688         trm_DataIO_transfer(pACB, pSRB, ioDir);
 1689 }
 1690 
 1691 static void
 1692 trm_DataIO_transfer(PACB pACB, PSRB pSRB, u_int16_t ioDir)
 1693 {
 1694         u_int8_t        bval;
 1695         PDCB            pDCB;
 1696 
 1697         pDCB = pSRB->pSRBDCB;
 1698         if (pSRB->SRBSGIndex < pSRB->SRBSGCount) {
 1699                 if (pSRB->SRBTotalXferLength != 0) {
 1700                         /* 
 1701                          * load what physical address of Scatter/Gather list 
 1702                          table want to be transfer
 1703                          */
 1704                         TRM_DPRINTF(" SG->address=%8x \n",pSRB->pSRBSGL->address);
 1705                         TRM_DPRINTF(" SG->length=%8x \n",pSRB->pSRBSGL->length);
 1706                         TRM_DPRINTF(" pDCB->SyncPeriod=%x \n",pDCB->SyncPeriod);
 1707                         TRM_DPRINTF(" pSRB->pSRBSGL=%8x \n",(unsigned int)pSRB->pSRBSGL);
 1708                         TRM_DPRINTF(" pSRB->SRBSGPhyAddr=%8x \n",pSRB->SRBSGPhyAddr);
 1709                         TRM_DPRINTF(" pSRB->SRBSGIndex=%d \n",pSRB->SRBSGIndex);
 1710                         TRM_DPRINTF(" pSRB->SRBSGCount=%d \n",pSRB->SRBSGCount);
 1711                         TRM_DPRINTF(" pSRB->SRBTotalXferLength=%d \n",pSRB->SRBTotalXferLength);
 1712 
 1713                         pSRB->SRBState = SRB_DATA_XFER;
 1714                         trm_reg_write32(0, TRMREG_DMA_XHIGHADDR);
 1715                         trm_reg_write32(
 1716                             (pSRB->SRBSGPhyAddr + 
 1717                              ((u_long)pSRB->SRBSGIndex << 3)),
 1718                             TRMREG_DMA_XLOWADDR);
 1719                         /*
 1720                          * load how many bytes in the Scatter/Gather 
 1721                          * list table 
 1722                          */
 1723                         trm_reg_write32(
 1724                             ((u_long)(pSRB->SRBSGCount - pSRB->SRBSGIndex) << 3),
 1725                             TRMREG_DMA_XCNT);                   
 1726                         /*
 1727                          * load total transfer length (24bits) max value
 1728                          * 16Mbyte 
 1729                          */
 1730                         trm_reg_write32(pSRB->SRBTotalXferLength,
 1731                             TRMREG_SCSI_COUNTER);
 1732                         /* Start DMA transfer */
 1733                         trm_reg_write16(ioDir, TRMREG_DMA_COMMAND);
 1734                         /* Start SCSI transfer */
 1735                         trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
 1736                         /* it's important for atn stop */
 1737                         /*
 1738                          * SCSI cammand 
 1739                          */
 1740                         bval = (ioDir == XFERDATAOUT) ?
 1741                           SCMD_DMA_OUT : SCMD_DMA_IN;
 1742                         trm_reg_write8(bval, TRMREG_SCSI_COMMAND);
 1743                 } else {
 1744                   /* xfer pad */
 1745                         if (pSRB->SRBSGCount) {
 1746                                 pSRB->AdaptStatus = H_OVER_UNDER_RUN;
 1747                                 pSRB->SRBStatus |= OVER_RUN;
 1748                         }
 1749                         if (pDCB->SyncPeriod & WIDE_SYNC)
 1750                                 trm_reg_write32(2,TRMREG_SCSI_COUNTER);
 1751                         else
 1752                                 trm_reg_write32(1,TRMREG_SCSI_COUNTER);
 1753                         if (ioDir == XFERDATAOUT)
 1754                                 trm_reg_write16(0, TRMREG_SCSI_FIFO);
 1755                         else
 1756                                 trm_reg_read16(TRMREG_SCSI_FIFO);
 1757                         pSRB->SRBState |= SRB_XFERPAD;
 1758                         trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
 1759                         /* it's important for atn stop */
 1760                         /*
 1761                          * SCSI cammand 
 1762                          */
 1763                         bval = (ioDir == XFERDATAOUT) ? 
 1764                           SCMD_FIFO_OUT : SCMD_FIFO_IN;
 1765                         trm_reg_write8(bval, TRMREG_SCSI_COMMAND);
 1766                 }
 1767         }
 1768 }
 1769 
 1770 static void
 1771 trm_StatusPhase0(PACB pACB, PSRB pSRB, u_int16_t *pscsi_status)
 1772 {
 1773 
 1774         pSRB->TargetStatus = trm_reg_read8(TRMREG_SCSI_FIFO);
 1775         pSRB->SRBState = SRB_COMPLETED;
 1776         *pscsi_status = PH_BUS_FREE;  
 1777         /*.. initial phase*/
 1778         trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
 1779         /* it's important for atn stop */
 1780         /*
 1781          * SCSI cammand 
 1782          */
 1783         trm_reg_write8(SCMD_MSGACCEPT, TRMREG_SCSI_COMMAND);
 1784 }
 1785 
 1786 
 1787 
 1788 static void
 1789 trm_StatusPhase1(PACB pACB, PSRB pSRB, u_int16_t *pscsi_status)
 1790 {
 1791 
 1792         if (trm_reg_read16(TRMREG_DMA_COMMAND) & 0x0001) {
 1793                 if (!(trm_reg_read8(TRMREG_SCSI_FIFOCNT) & 0x40))
 1794                         trm_reg_write16(DO_CLRFIFO, TRMREG_SCSI_CONTROL);
 1795                 if (!(trm_reg_read16(TRMREG_DMA_FIFOCNT) & 0x8000))
 1796                         trm_reg_write8(CLRXFIFO, TRMREG_DMA_CONTROL);
 1797         } else {
 1798                 if (!(trm_reg_read16(TRMREG_DMA_FIFOCNT) & 0x8000))
 1799                         trm_reg_write8(CLRXFIFO, TRMREG_DMA_CONTROL);
 1800                 if (!(trm_reg_read8(TRMREG_SCSI_FIFOCNT) & 0x40))
 1801                         trm_reg_write16(DO_CLRFIFO, TRMREG_SCSI_CONTROL);
 1802         }
 1803         pSRB->SRBState = SRB_STATUS;
 1804         trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
 1805         /* it's important for atn stop */
 1806         /*
 1807          * SCSI cammand 
 1808          */
 1809         trm_reg_write8(SCMD_COMP, TRMREG_SCSI_COMMAND);
 1810 }
 1811 
 1812 /*
 1813  *scsiiom                
 1814  *       trm_MsgInPhase0: one of trm_SCSI_phase0[] vectors
 1815  *            stateV = (void *) trm_SCSI_phase0[phase]
 1816  *                         if phase =7    
 1817  * extended message codes:
 1818  *
 1819  *   code        description
 1820  *
 1821  *    02h        Reserved
 1822  *    00h        MODIFY DATA  POINTER
 1823  *    01h        SYNCHRONOUS DATA TRANSFER REQUEST
 1824  *    03h        WIDE DATA TRANSFER REQUEST
 1825  * 04h - 7Fh     Reserved
 1826  * 80h - FFh     Vendor specific  
 1827  *                      
 1828  */
 1829 
 1830 static void
 1831 trm_MsgInPhase0(PACB pACB, PSRB pSRB, u_int16_t *pscsi_status)
 1832 {
 1833         u_int8_t        message_in_code,bIndex,message_in_tag_id;
 1834         PDCB            pDCB;
 1835         PSRB            pSRBTemp;
 1836 
 1837         pDCB = pACB->pActiveDCB;
 1838 
 1839         message_in_code = trm_reg_read8(TRMREG_SCSI_FIFO);
 1840         if (!(pSRB->SRBState & SRB_EXTEND_MSGIN)) {
 1841                 if (message_in_code == MSG_DISCONNECT) {
 1842                         pSRB->SRBState = SRB_DISCONNECT;
 1843                         *pscsi_status = PH_BUS_FREE; /* .. initial phase */
 1844                         /* it's important for atn stop */
 1845                         trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
 1846                         /*
 1847                          * SCSI command
 1848                          */
 1849                         trm_reg_write8(SCMD_MSGACCEPT, TRMREG_SCSI_COMMAND);
 1850                         return;
 1851                 } else if (message_in_code == MSG_SAVE_PTR) {
 1852                         *pscsi_status = PH_BUS_FREE; /* .. initial phase */
 1853                         /* it's important for atn stop */
 1854                         trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
 1855                         /*
 1856                          * SCSI command
 1857                          */
 1858                         trm_reg_write8(SCMD_MSGACCEPT, TRMREG_SCSI_COMMAND);
 1859                         return;
 1860                 } else if ((message_in_code == MSG_EXTENDED) ||
 1861                     ((message_in_code >= MSG_SIMPLE_QTAG) &&
 1862                      (message_in_code <= MSG_ORDER_QTAG))) {
 1863                         pSRB->SRBState |= SRB_EXTEND_MSGIN;
 1864                         pSRB->MsgInBuf[0] = message_in_code;
 1865                         /* extended message      (01h) */
 1866                         pSRB->MsgCnt = 1;
 1867                         pSRB->pMsgPtr = &pSRB->MsgInBuf[1];
 1868                         /* extended message length (n) */
 1869                         *pscsi_status = PH_BUS_FREE; /* .. initial phase */
 1870                         /* it's important for atn stop */
 1871                         trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
 1872                         /*
 1873                          * SCSI command
 1874                          */
 1875                         trm_reg_write8(SCMD_MSGACCEPT, TRMREG_SCSI_COMMAND);
 1876                         return;
 1877                 } else if (message_in_code == MSG_REJECT_) {
 1878                         /* Reject message */
 1879                         if (pDCB->SyncMode & WIDE_NEGO_ENABLE) {
 1880                           /* do wide nego reject */
 1881                                 pDCB = pSRB->pSRBDCB;
 1882                                 pDCB->SyncMode |= WIDE_NEGO_DONE;
 1883                                 pDCB->SyncMode &= ~(SYNC_NEGO_DONE | 
 1884                                     EN_ATN_STOP | WIDE_NEGO_ENABLE);
 1885                                 pSRB->SRBState &= ~(SRB_DO_WIDE_NEGO+SRB_MSGIN);
 1886                                 if ((pDCB->SyncMode & SYNC_NEGO_ENABLE) 
 1887                                     && !(pDCB->SyncMode & SYNC_NEGO_DONE)) {   
 1888                                   /* Set ATN, in case ATN was clear */
 1889                                         pSRB->SRBState |= SRB_MSGOUT;
 1890                                         trm_reg_write16(
 1891                                             DO_SETATN,
 1892                                             TRMREG_SCSI_CONTROL);
 1893                                 } else {   
 1894                                   /* Clear ATN */
 1895                                         trm_reg_write16(
 1896                                             DO_CLRATN,
 1897                                             TRMREG_SCSI_CONTROL);
 1898                                 }
 1899                         } else if (pDCB->SyncMode & SYNC_NEGO_ENABLE) { 
 1900                           /* do sync nego reject */
 1901                                 trm_reg_write16(DO_CLRATN,TRMREG_SCSI_CONTROL);
 1902                                 if (pSRB->SRBState & SRB_DO_SYNC_NEGO) {
 1903                                         pDCB = pSRB->pSRBDCB;
 1904                                         pDCB->SyncMode &= 
 1905                                           ~(SYNC_NEGO_ENABLE+SYNC_NEGO_DONE); 
 1906                                         pDCB->SyncPeriod = 0;
 1907                                         pDCB->SyncOffset = 0;
 1908                                         /*               
 1909                                          *
 1910                                          *   program SCSI control register
 1911                                          *
 1912                                          */
 1913                                         trm_reg_write8(pDCB->SyncPeriod,
 1914                                             TRMREG_SCSI_SYNC);
 1915                                         trm_reg_write8(pDCB->SyncOffset,
 1916                                             TRMREG_SCSI_OFFSET);
 1917                                         trm_SetXferRate(pACB,pSRB,pDCB);
 1918                                 }
 1919                         }
 1920                         *pscsi_status = PH_BUS_FREE; /* .. initial phase */
 1921                         /* it's important for atn stop */
 1922                         trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
 1923                         /*
 1924                          * SCSI command
 1925                          */
 1926                         trm_reg_write8(SCMD_MSGACCEPT, TRMREG_SCSI_COMMAND);
 1927                         return;
 1928                 } else if (message_in_code == MSG_IGNOREWIDE) {
 1929                         trm_reg_write32(1, TRMREG_SCSI_COUNTER);
 1930                         trm_reg_read8(TRMREG_SCSI_FIFO);
 1931                         *pscsi_status = PH_BUS_FREE; /* .. initial phase */
 1932                         /* it's important for atn stop */
 1933                         trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
 1934                         /*
 1935                          * SCSI command
 1936                          */
 1937                         trm_reg_write8(SCMD_MSGACCEPT, TRMREG_SCSI_COMMAND);
 1938                         return;
 1939                 } else {
 1940                   /* Restore data pointer message */
 1941                   /* Save data pointer message    */
 1942                   /* Completion message           */
 1943                   /* NOP message                  */
 1944                         *pscsi_status = PH_BUS_FREE; /* .. initial phase */
 1945                         /* it's important for atn stop */
 1946                         trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
 1947                         /*
 1948                          * SCSI command
 1949                          */
 1950                         trm_reg_write8(SCMD_MSGACCEPT, TRMREG_SCSI_COMMAND);
 1951                         return;
 1952                 }
 1953         } else {        
 1954           /* 
 1955            * Parsing incomming extented messages 
 1956            */
 1957                 *pSRB->pMsgPtr = message_in_code;
 1958                 pSRB->MsgCnt++;
 1959                 pSRB->pMsgPtr++;
 1960                 TRM_DPRINTF("pSRB->MsgInBuf[0]=%2x \n ",pSRB->MsgInBuf[0]);
 1961                 TRM_DPRINTF("pSRB->MsgInBuf[1]=%2x \n ",pSRB->MsgInBuf[1]);
 1962                 TRM_DPRINTF("pSRB->MsgInBuf[2]=%2x \n ",pSRB->MsgInBuf[2]);
 1963                 TRM_DPRINTF("pSRB->MsgInBuf[3]=%2x \n ",pSRB->MsgInBuf[3]);
 1964                 TRM_DPRINTF("pSRB->MsgInBuf[4]=%2x \n ",pSRB->MsgInBuf[4]);
 1965                 if ((pSRB->MsgInBuf[0] >= MSG_SIMPLE_QTAG)
 1966                     && (pSRB->MsgInBuf[0] <= MSG_ORDER_QTAG)) {
 1967                   /*
 1968                    * is QUEUE tag message :
 1969                    *
 1970                    * byte 0:
 1971                    * HEAD    QUEUE TAG (20h)
 1972                    * ORDERED QUEUE TAG (21h)
 1973                    * SIMPLE  QUEUE TAG (22h)
 1974                    * byte 1:
 1975                    * Queue tag (00h - FFh)
 1976                    */
 1977                         if (pSRB->MsgCnt == 2) {
 1978                                 pSRB->SRBState = 0;
 1979                                 message_in_tag_id = pSRB->MsgInBuf[1];
 1980                                 pSRB = pDCB->pGoingSRB;
 1981                                 pSRBTemp = pDCB->pGoingLastSRB;
 1982                                 if (pSRB) {
 1983                                         for (;;) {
 1984                                                 if (pSRB->TagNumber != 
 1985                                                     message_in_tag_id) {
 1986                                                         if (pSRB == pSRBTemp) {
 1987                                                                 goto  mingx0;
 1988                                                         }
 1989                                                         pSRB = pSRB->pNextSRB;
 1990                                                 } else
 1991                                                         break;
 1992                                         }
 1993                                         if (pDCB->DCBFlag & ABORT_DEV_) {
 1994                                                 pSRB->SRBState = SRB_ABORT_SENT;
 1995                                                 trm_EnableMsgOutAbort1(
 1996                                                     pACB, pSRB);
 1997                                         }
 1998                                         if (!(pSRB->SRBState & SRB_DISCONNECT)) {
 1999                                                 TRM_DPRINTF("SRB not yet disconnect........ \n ");
 2000                                                 goto  mingx0;
 2001                                         }
 2002                                         pDCB->pActiveSRB = pSRB;
 2003                                         pSRB->SRBState = SRB_DATA_XFER;
 2004                                 } else {
 2005 mingx0:
 2006                                         pSRB = &pACB->TmpSRB;
 2007                                         pSRB->SRBState = SRB_UNEXPECT_RESEL;
 2008                                         pDCB->pActiveSRB = pSRB;
 2009                                         pSRB->MsgOutBuf[0] = MSG_ABORT_TAG;
 2010                                         trm_EnableMsgOutAbort2(
 2011                                             pACB,
 2012                                             pSRB);
 2013                                 }
 2014                         }
 2015                         *pscsi_status = PH_BUS_FREE;
 2016                         /* .. initial phase */
 2017                         trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
 2018                         /* it's important for atn stop */
 2019                         /*
 2020                          * SCSI command 
 2021                          */
 2022                         trm_reg_write8(SCMD_MSGACCEPT, TRMREG_SCSI_COMMAND);
 2023                         return;
 2024                 } else if ((pSRB->MsgInBuf[0] == MSG_EXTENDED) &&
 2025                     (pSRB->MsgInBuf[2] == 3) && (pSRB->MsgCnt == 4)) {
 2026                   /*
 2027                    * is Wide data xfer Extended message :
 2028                    * ======================================
 2029                    * WIDE DATA TRANSFER REQUEST
 2030                    * ======================================
 2031                    * byte 0 :  Extended message (01h)
 2032                    * byte 1 :  Extended message length (02h)
 2033                    * byte 2 :  WIDE DATA TRANSFER code (03h)
 2034                    * byte 3 :  Transfer width exponent 
 2035                    */
 2036                         pDCB = pSRB->pSRBDCB;
 2037                         pSRB->SRBState &= ~(SRB_EXTEND_MSGIN+SRB_DO_WIDE_NEGO);
 2038                         if ((pSRB->MsgInBuf[1] != 2)) {
 2039                           /* Length is wrong, reject it  */
 2040                                 pDCB->SyncMode &=
 2041                                   ~(WIDE_NEGO_ENABLE+WIDE_NEGO_DONE); 
 2042                                 pSRB->MsgCnt = 1;
 2043                                 pSRB->MsgInBuf[0] = MSG_REJECT_;
 2044                                 trm_reg_write16(DO_SETATN, TRMREG_SCSI_CONTROL);
 2045                                 *pscsi_status = PH_BUS_FREE; /* .. initial phase */
 2046                                 /* it's important for atn stop */
 2047                                 trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
 2048                                 /*
 2049                                  * SCSI command
 2050                                  */
 2051                                 trm_reg_write8(SCMD_MSGACCEPT, TRMREG_SCSI_COMMAND);
 2052                                 return;
 2053                         }
 2054                         if (pDCB->SyncMode & WIDE_NEGO_ENABLE) {                
 2055                           /* Do wide negoniation */
 2056                                 if (pSRB->MsgInBuf[3] > 2) {
 2057                                   /* > 32 bit   */
 2058                                   /* reject_msg: */
 2059                                         pDCB->SyncMode &= 
 2060                                           ~(WIDE_NEGO_ENABLE+WIDE_NEGO_DONE); 
 2061                                         pSRB->MsgCnt = 1;
 2062                                         pSRB->MsgInBuf[0] = MSG_REJECT_;
 2063                                         trm_reg_write16(DO_SETATN,
 2064                                             TRMREG_SCSI_CONTROL);
 2065                                         *pscsi_status = PH_BUS_FREE; /* .. initial phase */
 2066                                         /* it's important for atn stop */
 2067                                         trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
 2068                                         /*
 2069                                          * SCSI command
 2070                                          */
 2071                                         trm_reg_write8(SCMD_MSGACCEPT, TRMREG_SCSI_COMMAND);
 2072                                         return;
 2073                                 }
 2074                                 if (pSRB->MsgInBuf[3] == 2) {
 2075                                         pSRB->MsgInBuf[3] = 1;
 2076                                         /* do 16 bits   */
 2077                                 } else {
 2078                                         if (!(pDCB->SyncMode 
 2079                                               & WIDE_NEGO_DONE)) {
 2080                                                 pSRB->SRBState &=
 2081                                                   ~(SRB_DO_WIDE_NEGO+SRB_MSGIN);
 2082                                                 pDCB->SyncMode |= 
 2083                                                   WIDE_NEGO_DONE;
 2084                                                 pDCB->SyncMode &=
 2085                                                   ~(SYNC_NEGO_DONE |
 2086                                                       EN_ATN_STOP |
 2087                                                       WIDE_NEGO_ENABLE);
 2088                                                 if (pSRB->MsgInBuf[3] != 0) {
 2089                                                   /* is Wide data xfer */
 2090                                                         pDCB->SyncPeriod |=
 2091                                                           WIDE_SYNC;
 2092                                                         pDCB->tinfo.current.width 
 2093                                                           = MSG_EXT_WDTR_BUS_16_BIT;
 2094                                                         pDCB->tinfo.goal.width
 2095                                                           = MSG_EXT_WDTR_BUS_16_BIT;
 2096                                                 }
 2097                                         }
 2098                                 }
 2099                         } else
 2100                                 pSRB->MsgInBuf[3] = 0;
 2101                         pSRB->SRBState |= SRB_MSGOUT;
 2102                         trm_reg_write16(DO_SETATN,TRMREG_SCSI_CONTROL);
 2103                         *pscsi_status = PH_BUS_FREE; /* .. initial phase */
 2104                         /* it's important for atn stop */
 2105                         trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
 2106                         /*
 2107                          * SCSI command
 2108                          */
 2109                         trm_reg_write8(SCMD_MSGACCEPT, TRMREG_SCSI_COMMAND);
 2110                         return;
 2111                 } else if ((pSRB->MsgInBuf[0] == MSG_EXTENDED) &&
 2112                     (pSRB->MsgInBuf[2] == 1) && (pSRB->MsgCnt == 5)) {
 2113                         /*
 2114                          * is 8bit transfer Extended message :
 2115                          * =================================
 2116                          * SYNCHRONOUS DATA TRANSFER REQUEST
 2117                          * =================================
 2118                          * byte 0 :  Extended message (01h)
 2119                          * byte 1 :  Extended message length (03)
 2120                          * byte 2 :  SYNCHRONOUS DATA TRANSFER code (01h)
 2121                          * byte 3 :  Transfer period factor 
 2122                          * byte 4 :  REQ/ACK offset  
 2123                          */
 2124                         pSRB->SRBState &= ~(SRB_EXTEND_MSGIN+SRB_DO_SYNC_NEGO);
 2125                         if ((pSRB->MsgInBuf[1] != 3) ||
 2126                             (pSRB->MsgInBuf[2] != 1)) {
 2127                           /* reject_msg: */
 2128                                 pSRB->MsgCnt = 1;
 2129                                 pSRB->MsgInBuf[0] = MSG_REJECT_;
 2130                                 trm_reg_write16(DO_SETATN, TRMREG_SCSI_CONTROL);
 2131                                 *pscsi_status = PH_BUS_FREE;
 2132                                 /* .. initial phase */
 2133                                 trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
 2134                                 /* it's important for atn stop */
 2135                                 /*
 2136                                  * SCSI cammand 
 2137                                  */
 2138                                 trm_reg_write8(SCMD_MSGACCEPT, TRMREG_SCSI_COMMAND);
 2139                                 return;
 2140                         } else if (!(pSRB->MsgInBuf[3]) || !(pSRB->MsgInBuf[4])) {
 2141                                 /* set async */
 2142                                 pDCB = pSRB->pSRBDCB;
 2143                                 /* disable sync & sync nego */
 2144                                 pDCB->SyncMode &= 
 2145                                   ~(SYNC_NEGO_ENABLE+SYNC_NEGO_DONE);
 2146                                 pDCB->SyncPeriod = 0;
 2147                                 pDCB->SyncOffset = 0;
 2148                                 pDCB->tinfo.goal.period = 0;
 2149                                 pDCB->tinfo.goal.offset = 0;
 2150                                 pDCB->tinfo.current.period = 0;
 2151                                 pDCB->tinfo.current.offset = 0;
 2152                                 pDCB->tinfo.current.width = 
 2153                                   MSG_EXT_WDTR_BUS_8_BIT;
 2154                                 /*               
 2155                                  *
 2156                                  *   program SCSI control register
 2157                                  *
 2158                                  */
 2159                                 trm_reg_write8(pDCB->SyncPeriod,TRMREG_SCSI_SYNC);
 2160                                 trm_reg_write8(pDCB->SyncOffset,TRMREG_SCSI_OFFSET);
 2161                                 trm_SetXferRate(pACB,pSRB,pDCB);
 2162                                 *pscsi_status = PH_BUS_FREE;
 2163                                 /* .. initial phase */
 2164                                 trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
 2165                                 /* it's important for atn stop */
 2166                                 /*
 2167                                  * SCSI cammand 
 2168                                  */
 2169                                 trm_reg_write8(SCMD_MSGACCEPT, TRMREG_SCSI_COMMAND);
 2170                                 return;
 2171                         } else {
 2172                                 /* set sync */
 2173                                 pDCB = pSRB->pSRBDCB;
 2174                                 pDCB->SyncMode |= 
 2175                                   SYNC_NEGO_ENABLE+SYNC_NEGO_DONE;
 2176                                 pDCB->MaxNegoPeriod = pSRB->MsgInBuf[3];
 2177                                 /* Transfer period factor */
 2178                                 pDCB->SyncOffset = pSRB->MsgInBuf[4]; 
 2179                                 /* REQ/ACK offset */
 2180                                 if (pACB->AdaptType == 1) {
 2181                                         for(bIndex = 0; bIndex < 7; bIndex++) {
 2182                                                 if (pSRB->MsgInBuf[3] <=
 2183                                            dc395u2x_clock_period[bIndex]) {
 2184                                             pDCB->tinfo.goal.period =
 2185                                                 dc395u2x_tinfo_period[bIndex];
 2186                                             pDCB->tinfo.current.period =
 2187                                                 dc395u2x_tinfo_period[bIndex];
 2188                                         pDCB->tinfo.goal.offset = 
 2189                                             pDCB->SyncOffset;
 2190                                         pDCB->tinfo.current.offset = 
 2191                                             pDCB->SyncOffset;
 2192                                         pDCB->SyncPeriod |= (bIndex|LVDS_SYNC);
 2193                                         break;
 2194                                                 }
 2195                                         }
 2196                                 } else {
 2197                                         for(bIndex = 0; bIndex < 7; bIndex++) {
 2198                                                 if (pSRB->MsgInBuf[3] <=
 2199                                                  dc395x_clock_period[bIndex]) {
 2200                                                    pDCB->tinfo.goal.period =
 2201                                                 dc395x_tinfo_period[bIndex];
 2202                                                    pDCB->tinfo.current.period =
 2203                                                 dc395x_tinfo_period[bIndex];
 2204                                                    pDCB->tinfo.goal.offset =
 2205                                                 pDCB->SyncOffset;
 2206                                                    pDCB->tinfo.current.offset =
 2207                                                        pDCB->SyncOffset;
 2208                                                    pDCB->SyncPeriod |=
 2209                                                        (bIndex|ALT_SYNC);
 2210                                                    break;
 2211                                                 }
 2212                                         }
 2213                                 }
 2214                                 /*               
 2215                                  *
 2216                                  *   program SCSI control register
 2217                                  *
 2218                                  */
 2219                                 trm_reg_write8(pDCB->SyncPeriod,
 2220                                     TRMREG_SCSI_SYNC);
 2221                                 trm_reg_write8(pDCB->SyncOffset,
 2222                                     TRMREG_SCSI_OFFSET);
 2223                                 trm_SetXferRate(pACB,pSRB,pDCB);
 2224                                 *pscsi_status=PH_BUS_FREE;/*.. initial phase*/
 2225                                 trm_reg_write16(DO_DATALATCH,TRMREG_SCSI_CONTROL);/* it's important for atn stop*/
 2226                     /*
 2227                     ** SCSI command 
 2228                     */
 2229                                 trm_reg_write8(SCMD_MSGACCEPT,TRMREG_SCSI_COMMAND);
 2230                                 return;
 2231                         }
 2232                 }
 2233         *pscsi_status = PH_BUS_FREE;
 2234         /* .. initial phase */
 2235         trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
 2236         /* it's important for atn stop */
 2237         /*
 2238          * SCSI cammand 
 2239          */
 2240         trm_reg_write8(SCMD_MSGACCEPT, TRMREG_SCSI_COMMAND);
 2241         }
 2242 }
 2243 
 2244 static void
 2245 trm_MsgInPhase1(PACB pACB, PSRB pSRB, u_int16_t *pscsi_status)
 2246 {
 2247 
 2248         trm_reg_write16(DO_CLRFIFO, TRMREG_SCSI_CONTROL);
 2249         trm_reg_write32(1,TRMREG_SCSI_COUNTER);
 2250         if (!(pSRB->SRBState & SRB_MSGIN)) {
 2251                 pSRB->SRBState &= SRB_DISCONNECT;
 2252                 pSRB->SRBState |= SRB_MSGIN;
 2253         }
 2254         trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
 2255         /* it's important for atn stop*/
 2256         /*
 2257          * SCSI cammand 
 2258          */
 2259         trm_reg_write8(SCMD_FIFO_IN, TRMREG_SCSI_COMMAND);
 2260 }
 2261 
 2262 static void
 2263 trm_Nop0(PACB pACB, PSRB pSRB, u_int16_t *pscsi_status)
 2264 {
 2265 
 2266 }
 2267 
 2268 static void
 2269 trm_Nop1(PACB pACB, PSRB pSRB, u_int16_t *pscsi_status)
 2270 {
 2271 
 2272 }
 2273 
 2274 static void
 2275 trm_SetXferRate(PACB pACB,PSRB pSRB, PDCB pDCB)
 2276 {
 2277         union ccb       *pccb;
 2278         struct ccb_trans_settings neg;
 2279         u_int16_t       cnt, i;
 2280         u_int8_t        bval;
 2281         PDCB            pDCBTemp;
 2282 
 2283         /*
 2284          * set all lun device's  period , offset
 2285          */
 2286         TRM_DPRINTF("trm_SetXferRate\n");
 2287         pccb = pSRB->pccb;
 2288         neg.sync_period = pDCB->tinfo.goal.period;
 2289         neg.sync_offset = pDCB->tinfo.goal.offset;
 2290         neg.valid = CCB_TRANS_SYNC_RATE_VALID | CCB_TRANS_SYNC_OFFSET_VALID;
 2291         xpt_setup_ccb(&neg.ccb_h, pccb->ccb_h.path, /* priority */1);
 2292         xpt_async(AC_TRANSFER_NEG, pccb->ccb_h.path, &neg);
 2293         if (!(pDCB->IdentifyMsg & 0x07)) {
 2294                 pDCBTemp = pACB->pLinkDCB;
 2295                 cnt = pACB->DeviceCnt;
 2296                 bval = pDCB->TargetID;
 2297                 for (i = 0; i < cnt; i++) {
 2298                         if (pDCBTemp->TargetID == bval) {
 2299                                 pDCBTemp->SyncPeriod = pDCB->SyncPeriod;
 2300                                 pDCBTemp->SyncOffset = pDCB->SyncOffset;
 2301                                 pDCBTemp->SyncMode = pDCB->SyncMode;
 2302                         }
 2303                         pDCBTemp = pDCBTemp->pNextDCB;
 2304                 }
 2305         }
 2306         return;
 2307 }
 2308 
 2309 /*
 2310  * scsiiom              
 2311  *            trm_Interrupt       
 2312  *                      
 2313  *
 2314  *    ---SCSI bus phase
 2315  *
 2316  *      PH_DATA_OUT             0x00     Data out phase               
 2317  *      PH_DATA_IN              0x01     Data in phase              
 2318  *      PH_COMMAND              0x02     Command phase   
 2319  *      PH_STATUS               0x03     Status phase
 2320  *      PH_BUS_FREE             0x04     Invalid phase used as bus free 
 2321  *      PH_BUS_FREE             0x05     Invalid phase used as bus free 
 2322  *      PH_MSG_OUT              0x06     Message out phase
 2323  *      PH_MSG_IN               0x07     Message in phase
 2324  *
 2325  */
 2326 static void 
 2327 trm_Disconnect(PACB pACB)
 2328 {
 2329         PDCB            pDCB;
 2330         PSRB            pSRB, psrb;
 2331         u_int16_t       i,j, cnt;
 2332         u_int           target_id,target_lun;
 2333         
 2334         TRM_DPRINTF("trm_Disconnect...............\n ");
 2335         
 2336         pDCB = pACB->pActiveDCB;
 2337         if (!pDCB) {
 2338                 TRM_DPRINTF(" Exception Disconnect DCB=NULL..............\n ");
 2339                 j = 400;
 2340                 while (--j) 
 2341                         DELAY(1);
 2342                 /* 1 msec */
 2343                 trm_reg_write16((DO_CLRFIFO | DO_HWRESELECT),
 2344                     TRMREG_SCSI_CONTROL);
 2345                 return;
 2346         }
 2347         pSRB = pDCB->pActiveSRB; 
 2348         /* bug pSRB=0 */
 2349         target_id  = pSRB->pccb->ccb_h.target_id;
 2350         target_lun = pSRB->pccb->ccb_h.target_lun;
 2351         TRM_DPRINTF(":pDCB->pActiveSRB= %8x \n ",(u_int) pDCB->pActiveSRB);
 2352         pACB->pActiveDCB = 0;
 2353         pSRB->ScsiPhase = PH_BUS_FREE; 
 2354         /* SCSI bus free Phase */
 2355         trm_reg_write16((DO_CLRFIFO | DO_HWRESELECT), TRMREG_SCSI_CONTROL);
 2356         if (pSRB->SRBState & SRB_UNEXPECT_RESEL) {
 2357                 pSRB->SRBState = 0;
 2358                 trm_DoWaitingSRB(pACB);
 2359         } else if (pSRB->SRBState & SRB_ABORT_SENT) {
 2360                 pDCB->DCBFlag = 0;
 2361                 cnt = pDCB->GoingSRBCnt;
 2362                 pDCB->GoingSRBCnt = 0;
 2363                 pSRB = pDCB->pGoingSRB;
 2364                 for (i = 0; i < cnt; i++) {
 2365                         psrb = pSRB->pNextSRB;
 2366                         pSRB->pNextSRB = pACB->pFreeSRB;
 2367                         pACB->pFreeSRB = pSRB;
 2368                         pSRB = psrb;
 2369                 }
 2370                 pDCB->pGoingSRB = 0;
 2371                 trm_DoWaitingSRB(pACB);
 2372         } else {
 2373                 if ((pSRB->SRBState & (SRB_START_+SRB_MSGOUT)) || 
 2374                     !(pSRB->SRBState & (SRB_DISCONNECT+SRB_COMPLETED))) {
 2375                   /* Selection time out */
 2376                         if (!(pACB->scan_devices[target_id][target_lun]) &&
 2377                             pSRB->CmdBlock[0] != 0x00 && /* TEST UNIT READY */
 2378                             pSRB->CmdBlock[0] != INQUIRY) {
 2379                                 pSRB->SRBState = SRB_READY;
 2380                                 trm_RewaitSRB(pDCB, pSRB);
 2381                         } else {
 2382                                 pSRB->TargetStatus = SCSI_STAT_SEL_TIMEOUT;
 2383                                 goto  disc1;
 2384                         }
 2385                 } else if (pSRB->SRBState & SRB_DISCONNECT) {
 2386                         /*
 2387                          * SRB_DISCONNECT
 2388                          */
 2389                         trm_DoWaitingSRB(pACB);
 2390                 } else if (pSRB->SRBState & SRB_COMPLETED) {
 2391 disc1:
 2392                   /*
 2393                    * SRB_COMPLETED
 2394                    */
 2395                         pDCB->pActiveSRB = 0;
 2396                         pSRB->SRBState = SRB_FREE;
 2397                         trm_SRBdone(pACB, pDCB, pSRB);
 2398                 }
 2399         }
 2400         return;
 2401 }
 2402 
 2403 static void
 2404 trm_Reselect(PACB pACB)
 2405 {
 2406         PDCB            pDCB;
 2407         PSRB            pSRB;
 2408         u_int16_t       RselTarLunId;
 2409 
 2410         TRM_DPRINTF("trm_Reselect................. \n");
 2411         pDCB = pACB->pActiveDCB;
 2412         if (pDCB) {
 2413           /* Arbitration lost but Reselection win */
 2414                 pSRB = pDCB->pActiveSRB;
 2415                 pSRB->SRBState = SRB_READY;
 2416                 trm_RewaitSRB(pDCB, pSRB);
 2417         }
 2418         /* Read Reselected Target Id and LUN */
 2419         RselTarLunId = trm_reg_read16(TRMREG_SCSI_TARGETID) & 0x1FFF;
 2420         pDCB = pACB->pLinkDCB;
 2421         while (RselTarLunId != *((u_int16_t *) &pDCB->TargetID)) {
 2422           /* get pDCB of the reselect id */
 2423                 pDCB = pDCB->pNextDCB;
 2424         }
 2425 
 2426         pACB->pActiveDCB = pDCB;
 2427         if (pDCB->SyncMode & EN_TAG_QUEUING) {
 2428                 pSRB = &pACB->TmpSRB;
 2429                 pDCB->pActiveSRB = pSRB;
 2430         } else {
 2431                 pSRB = pDCB->pActiveSRB;
 2432                 if (!pSRB || !(pSRB->SRBState & SRB_DISCONNECT)) {
 2433                   /*
 2434                    * abort command
 2435                    */
 2436                         pSRB = &pACB->TmpSRB;
 2437                         pSRB->SRBState = SRB_UNEXPECT_RESEL;
 2438                         pDCB->pActiveSRB = pSRB;
 2439                         trm_EnableMsgOutAbort1(pACB, pSRB);
 2440                 } else {
 2441                         if (pDCB->DCBFlag & ABORT_DEV_) {
 2442                                 pSRB->SRBState = SRB_ABORT_SENT;
 2443                                 trm_EnableMsgOutAbort1(pACB, pSRB);
 2444                         } else 
 2445                                 pSRB->SRBState = SRB_DATA_XFER;
 2446                 }
 2447         }
 2448         pSRB->ScsiPhase = PH_BUS_FREE;
 2449         /* SCSI bus free Phase */
 2450         /* 
 2451          * Program HA ID, target ID, period and offset
 2452          */
 2453         trm_reg_write8((u_int8_t) RselTarLunId,TRMREG_SCSI_TARGETID);
 2454         /* target ID */
 2455         trm_reg_write8(pACB->AdaptSCSIID,TRMREG_SCSI_HOSTID);
 2456         /* host   ID */
 2457         trm_reg_write8(pDCB->SyncPeriod,TRMREG_SCSI_SYNC);
 2458         /* period    */
 2459         trm_reg_write8(pDCB->SyncOffset,TRMREG_SCSI_OFFSET); 
 2460         /* offset    */
 2461         trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
 2462         /* it's important for atn stop*/
 2463         /*
 2464          * SCSI cammand 
 2465          */
 2466         trm_reg_write8(SCMD_MSGACCEPT, TRMREG_SCSI_COMMAND);
 2467         /* to rls the /ACK signal */
 2468 }
 2469 
 2470 static void
 2471 trm_SRBdone(PACB pACB, PDCB pDCB, PSRB pSRB)
 2472 {
 2473         PSRB                    psrb;
 2474         u_int8_t                bval, bval1,status;
 2475         union ccb               *pccb;
 2476         struct ccb_scsiio       *pcsio;
 2477         PSCSI_INQDATA           ptr;
 2478         int                     intflag;
 2479         u_int                   target_id,target_lun;
 2480         PDCB                    pTempDCB;
 2481 
 2482         pccb  = pSRB->pccb;
 2483         if (pccb == NULL)
 2484                 return;
 2485         pcsio = &pccb->csio;
 2486         target_id  = pSRB->pccb->ccb_h.target_id;
 2487         target_lun = pSRB->pccb->ccb_h.target_lun;
 2488         if ((pccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) {
 2489                 bus_dmasync_op_t op;
 2490                 if ((pccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN)
 2491                         op = BUS_DMASYNC_POSTREAD;
 2492                 else
 2493                         op = BUS_DMASYNC_POSTWRITE;
 2494                 bus_dmamap_sync(pACB->buffer_dmat, pSRB->dmamap, op);
 2495                 bus_dmamap_unload(pACB->buffer_dmat, pSRB->dmamap);
 2496         }
 2497         /*
 2498          *
 2499          * target status
 2500          *
 2501          */
 2502         status = pSRB->TargetStatus;
 2503         pcsio->scsi_status=SCSI_STAT_GOOD;
 2504         pccb->ccb_h.status = CAM_REQ_CMP;
 2505         if (pSRB->SRBFlag & AUTO_REQSENSE) {
 2506           /* 
 2507            * status of auto request sense 
 2508            */
 2509                 pSRB->SRBFlag &= ~AUTO_REQSENSE;
 2510                 pSRB->AdaptStatus = 0;
 2511                 pSRB->TargetStatus = SCSI_STATUS_CHECK_COND;
 2512                 
 2513                 if (status == SCSI_STATUS_CHECK_COND) {
 2514                         pccb->ccb_h.status = CAM_SEL_TIMEOUT;
 2515                         goto ckc_e;
 2516                 }
 2517                 *((u_long *) &(pSRB->CmdBlock[0])) = pSRB->Segment0[0];
 2518                 *((u_long *) &(pSRB->CmdBlock[4])) = pSRB->Segment0[1];
 2519                 pSRB->SRBTotalXferLength = pSRB->Segment1[1];
 2520                 pSRB->pSRBSGL->address = pSRB->SgSenseTemp.address;
 2521                 pSRB->pSRBSGL->length = pSRB->SgSenseTemp.length;
 2522                 pcsio->scsi_status = SCSI_STATUS_CHECK_COND;
 2523                 bcopy(trm_get_sense_buf(pACB, pSRB), &pcsio->sense_data,
 2524                     pcsio->sense_len);
 2525                 pcsio->ccb_h.status = CAM_SCSI_STATUS_ERROR 
 2526                     | CAM_AUTOSNS_VALID;
 2527                 goto ckc_e;
 2528         }
 2529         /*
 2530          * target status
 2531          */
 2532         if (status) {
 2533                 if (status == SCSI_STATUS_CHECK_COND) {
 2534                         if ((pcsio->ccb_h.flags & CAM_DIS_AUTOSENSE) == 0) {
 2535                           TRM_DPRINTF("trm_RequestSense..................\n");
 2536                           trm_RequestSense(pACB, pDCB, pSRB);
 2537                           return;
 2538                         }
 2539                         pcsio->scsi_status = SCSI_STATUS_CHECK_COND;
 2540                         pccb->ccb_h.status = CAM_SCSI_STATUS_ERROR;
 2541                         goto ckc_e;
 2542                 } else if (status == SCSI_STAT_QUEUEFULL) {
 2543                         bval = (u_int8_t) pDCB->GoingSRBCnt;
 2544                         bval--;
 2545                         pDCB->MaxActiveCommandCnt = bval;
 2546                         trm_RewaitSRB(pDCB, pSRB);
 2547                         pSRB->AdaptStatus = 0;
 2548                         pSRB->TargetStatus = 0;
 2549                         return;
 2550                 } else if (status == SCSI_STAT_SEL_TIMEOUT) {
 2551                         pSRB->AdaptStatus  = H_SEL_TIMEOUT;
 2552                         pSRB->TargetStatus = 0;
 2553                         pcsio->scsi_status = SCSI_STAT_SEL_TIMEOUT;
 2554                         pccb->ccb_h.status = CAM_SEL_TIMEOUT;
 2555                 } else if (status == SCSI_STAT_BUSY) {
 2556                         TRM_DPRINTF("trm: target busy at %s %d\n",
 2557                                 __FILE__, __LINE__);
 2558                         pcsio->scsi_status = SCSI_STAT_BUSY;
 2559                         pccb->ccb_h.status = CAM_SCSI_BUSY;
 2560                         return;
 2561                   /* The device busy, try again later?    */
 2562                 } else if (status == SCSI_STAT_RESCONFLICT) {
 2563                         TRM_DPRINTF("trm: target reserved at %s %d\n",
 2564                                 __FILE__, __LINE__);
 2565                         pcsio->scsi_status = SCSI_STAT_RESCONFLICT;
 2566                         pccb->ccb_h.status = CAM_SCSI_STATUS_ERROR;     /*XXX*/
 2567                         return;
 2568                 } else {
 2569                         pSRB->AdaptStatus = 0;
 2570                         if (pSRB->RetryCnt) {
 2571                                 pSRB->RetryCnt--;
 2572                                 pSRB->TargetStatus = 0;
 2573                                 pSRB->SRBSGIndex = 0;
 2574                                 if (trm_StartSCSI(pACB, pDCB, pSRB)) {
 2575                                   /* 
 2576                                    * If trm_StartSCSI return 1 :
 2577                                    * current interrupt status is interrupt 
 2578                                    * disreenable 
 2579                                    * It's said that SCSI processor has more 
 2580                                    * one SRB need to do
 2581                                    */
 2582                                         trm_RewaitSRB(pDCB, pSRB);
 2583                                 }
 2584                                 return;
 2585                         } else {
 2586                                 TRM_DPRINTF("trm: driver stuffup at %s %d\n",
 2587                                         __FILE__, __LINE__);
 2588                                 pccb->ccb_h.status = CAM_SCSI_STATUS_ERROR;
 2589                         }
 2590                 }
 2591         } else {
 2592         /* 
 2593          * process initiator status..........................
 2594          * Adapter (initiator) status
 2595          */
 2596                 status = pSRB->AdaptStatus;
 2597                 if (status & H_OVER_UNDER_RUN) {
 2598                         pSRB->TargetStatus = 0;
 2599                         pccb->ccb_h.status = CAM_DATA_RUN_ERR;
 2600                         /* Illegal length (over/under run) */
 2601                 } else if (pSRB->SRBStatus & PARITY_ERROR) {
 2602                         TRM_DPRINTF("trm: driver stuffup %s %d\n",
 2603                                 __FILE__, __LINE__);
 2604                         pDCB->tinfo.goal.period = 0;
 2605                         pDCB->tinfo.goal.offset = 0;
 2606                         /* Driver failed to perform operation */
 2607                         pccb->ccb_h.status = CAM_UNCOR_PARITY;
 2608                 } else {
 2609                   /* no error */
 2610                         pSRB->AdaptStatus = 0;
 2611                         pSRB->TargetStatus = 0;
 2612                         pccb->ccb_h.status = CAM_REQ_CMP;
 2613                         /* there is no error, (sense is invalid) */
 2614                 }
 2615         }
 2616 ckc_e:
 2617         if (pACB->scan_devices[target_id][target_lun]) {
 2618           /*
 2619            *   if SCSI command in "scan devices" duty
 2620            */
 2621                 if (pSRB->CmdBlock[0] == TEST_UNIT_READY) 
 2622                         pACB->scan_devices[target_id][target_lun] = 0;
 2623                 /* SCSI command phase :test unit ready */
 2624                 else if (pSRB->CmdBlock[0] == INQUIRY) {
 2625                   /* 
 2626                    * SCSI command phase :inquiry scsi device data 
 2627                    * (type,capacity,manufacture.... 
 2628                    */
 2629                         if (pccb->ccb_h.status == CAM_SEL_TIMEOUT)
 2630                                 goto NO_DEV;
 2631                         ptr = (PSCSI_INQDATA) pcsio->data_ptr;
 2632                         /* page fault */
 2633                         TRM_DPRINTF("trm_SRBdone..PSCSI_INQDATA:%2x \n",
 2634                             ptr->DevType);
 2635                         bval1 = ptr->DevType & SCSI_DEVTYPE; 
 2636                         if (bval1 == SCSI_NODEV) {
 2637 NO_DEV:
 2638                                 TRM_DPRINTF("trm_SRBdone NO Device:target_id= %d ,target_lun= %d \n",
 2639                                     target_id,
 2640                                     target_lun);
 2641                                 intflag = splcam();
 2642                                 pACB->scan_devices[target_id][target_lun] = 0;
 2643                                 /* no device set scan device flag =0*/
 2644                                 /* pDCB Q link */
 2645                                 /* move the head of DCB to tempDCB*/
 2646                                 pTempDCB=pACB->pLinkDCB;  
 2647                                 /* search current DCB for pass link */
 2648                                 while (pTempDCB->pNextDCB != pDCB) {
 2649                                         pTempDCB = pTempDCB->pNextDCB;
 2650                                 }
 2651                                 /*
 2652                                  * when the current DCB found than connect 
 2653                                  * current DCB tail 
 2654                                  */
 2655                                 /* to the DCB tail that before current DCB */
 2656                                 pTempDCB->pNextDCB = pDCB->pNextDCB;
 2657                                 /*
 2658                                  * if there was only one DCB ,connect his tail
 2659                                  * to his head 
 2660                                  */
 2661                                 if (pACB->pLinkDCB == pDCB)
 2662                                         pACB->pLinkDCB = pTempDCB->pNextDCB;
 2663                                 if (pACB->pDCBRunRobin == pDCB)
 2664                                         pACB->pDCBRunRobin = pTempDCB->pNextDCB;
 2665                                 pDCB->DCBstatus &= ~DS_IN_QUEUE;
 2666                                 pACB->DeviceCnt--;
 2667                                 if (pACB->DeviceCnt == 0) {
 2668                                         pACB->pLinkDCB = NULL;
 2669                                         pACB->pDCBRunRobin = NULL;
 2670                                 }
 2671                                 splx(intflag);
 2672                         } else { 
 2673 #ifdef trm_DEBUG1
 2674                                 int j;
 2675                                 for (j = 0; j < 28; j++) {
 2676                                         TRM_DPRINTF("ptr=%2x ", 
 2677                                                 ((u_int8_t *)ptr)[j]);
 2678                                 }
 2679 #endif
 2680                                 pDCB->DevType = bval1;
 2681                                 if (bval1 == SCSI_DASD ||
 2682                                     bval1 == SCSI_OPTICAL) {
 2683                                         if ((((ptr->Vers & 0x07) >= 2) ||
 2684                                               ((ptr->RDF & 0x0F) == 2)) && 
 2685                                             (ptr->Flags & SCSI_INQ_CMDQUEUE) &&
 2686                                             (pDCB->DevMode & TAG_QUEUING_) &&
 2687                                             (pDCB->DevMode & EN_DISCONNECT_)) {
 2688                                                 if (pDCB->DevMode &
 2689                                                     TAG_QUEUING_) {
 2690                                                         pDCB->
 2691                                                             MaxActiveCommandCnt = 
 2692                                                           pACB->TagMaxNum;
 2693                                                         pDCB->SyncMode |= 
 2694                                                           EN_TAG_QUEUING;
 2695                                                         pDCB->tinfo.disc_tag |=
 2696                                                           TRM_CUR_TAGENB;
 2697                                                 } else {
 2698                                                         pDCB->SyncMode |= 
 2699                                                           EN_ATN_STOP;
 2700                                                         pDCB->tinfo.disc_tag &=
 2701                                                           ~TRM_CUR_TAGENB;
 2702                                                 }
 2703                                         }
 2704                                 }
 2705                         }
 2706                         /* pSRB->CmdBlock[0] == INQUIRY */
 2707                 }
 2708                 /* pACB->scan_devices[target_id][target_lun] */
 2709         }
 2710         intflag = splcam();
 2711         /*  ReleaseSRB(pDCB, pSRB); */
 2712         if (pSRB == pDCB->pGoingSRB)
 2713                 pDCB->pGoingSRB = pSRB->pNextSRB;
 2714         else {
 2715                 psrb = pDCB->pGoingSRB;
 2716                 while (psrb->pNextSRB != pSRB) {
 2717                         psrb = psrb->pNextSRB;
 2718                 }
 2719                 psrb->pNextSRB = pSRB->pNextSRB;
 2720                 if (pSRB == pDCB->pGoingLastSRB) {
 2721                         pDCB->pGoingLastSRB = psrb;
 2722                 }
 2723         }
 2724         pSRB->pNextSRB = pACB->pFreeSRB;
 2725         pACB->pFreeSRB = pSRB;
 2726         pDCB->GoingSRBCnt--;
 2727         trm_DoWaitingSRB(pACB);
 2728 
 2729         splx(intflag);
 2730         /*  Notify cmd done */
 2731         xpt_done (pccb);
 2732 }
 2733 
 2734 static void
 2735 trm_DoingSRB_Done(PACB pACB)
 2736 {
 2737         PDCB            pDCB, pdcb;
 2738         PSRB            psrb, psrb2;
 2739         u_int16_t       cnt, i;
 2740         union ccb       *pccb;
 2741 
 2742         pDCB = pACB->pLinkDCB;
 2743         if (pDCB == NULL) 
 2744                 return;
 2745         pdcb = pDCB;
 2746         do {
 2747                 cnt = pdcb->GoingSRBCnt;
 2748                 psrb = pdcb->pGoingSRB;
 2749                 for (i = 0; i < cnt; i++) {
 2750                         psrb2 = psrb->pNextSRB;
 2751                         pccb = psrb->pccb;
 2752                         pccb->ccb_h.status = CAM_SEL_TIMEOUT;
 2753                         /*  ReleaseSRB(pDCB, pSRB); */
 2754                         psrb->pNextSRB = pACB->pFreeSRB;
 2755                         pACB->pFreeSRB = psrb;
 2756                         xpt_done(pccb);
 2757                         psrb  = psrb2;
 2758                 }
 2759                 pdcb->GoingSRBCnt = 0;;
 2760                 pdcb->pGoingSRB = NULL;
 2761                 pdcb = pdcb->pNextDCB;
 2762         }
 2763         while (pdcb != pDCB);
 2764 }
 2765 
 2766 static void 
 2767 trm_ResetSCSIBus(PACB pACB)
 2768 {
 2769         int     intflag;
 2770 
 2771         intflag = splcam();
 2772         pACB->ACBFlag |= RESET_DEV;
 2773 
 2774         trm_reg_write16(DO_RSTSCSI,TRMREG_SCSI_CONTROL);
 2775         while (!(trm_reg_read16(TRMREG_SCSI_INTSTATUS) & INT_SCSIRESET));
 2776         splx(intflag);
 2777         return;
 2778 }
 2779 
 2780 static void 
 2781 trm_ScsiRstDetect(PACB pACB)
 2782 {
 2783         int     intflag;
 2784         u_long  wlval;
 2785 
 2786         TRM_DPRINTF("trm_ScsiRstDetect \n");
 2787         wlval = 1000;
 2788         while (--wlval)
 2789                 DELAY(1000);
 2790         intflag = splcam();
 2791         trm_reg_write8(STOPDMAXFER,TRMREG_DMA_CONTROL);
 2792 
 2793         trm_reg_write16(DO_CLRFIFO,TRMREG_SCSI_CONTROL);
 2794 
 2795         if (pACB->ACBFlag & RESET_DEV)
 2796                 pACB->ACBFlag |= RESET_DONE;
 2797         else {
 2798                 pACB->ACBFlag |= RESET_DETECT;
 2799                 trm_ResetDevParam(pACB);
 2800                 /*      trm_DoingSRB_Done(pACB); ???? */
 2801                 trm_RecoverSRB(pACB);
 2802                 pACB->pActiveDCB = NULL;
 2803                 pACB->ACBFlag = 0;
 2804                 trm_DoWaitingSRB(pACB);
 2805         }
 2806         splx(intflag);
 2807         return;
 2808 }
 2809 
 2810 static void
 2811 trm_RequestSense(PACB pACB, PDCB pDCB, PSRB pSRB)       
 2812 {
 2813         union ccb               *pccb;
 2814         struct ccb_scsiio       *pcsio;
 2815 
 2816         pccb  = pSRB->pccb;
 2817         pcsio = &pccb->csio;
 2818 
 2819         pSRB->SRBFlag |= AUTO_REQSENSE;
 2820         pSRB->Segment0[0] = *((u_long *) &(pSRB->CmdBlock[0]));
 2821         pSRB->Segment0[1] = *((u_long *) &(pSRB->CmdBlock[4]));
 2822         pSRB->Segment1[0] = (u_long) ((pSRB->ScsiCmdLen << 8) + 
 2823             pSRB->SRBSGCount);
 2824         pSRB->Segment1[1] = pSRB->SRBTotalXferLength; /* ?????????? */
 2825 
 2826         /* $$$$$$ Status of initiator/target $$$$$$$$ */
 2827         pSRB->AdaptStatus = 0;
 2828         pSRB->TargetStatus = 0;
 2829         /* $$$$$$ Status of initiator/target $$$$$$$$ */
 2830         
 2831         pSRB->SRBTotalXferLength = sizeof(pcsio->sense_data);
 2832         pSRB->SgSenseTemp.address = pSRB->pSRBSGL->address;
 2833         pSRB->SgSenseTemp.length  = pSRB->pSRBSGL->length;
 2834         pSRB->pSRBSGL->address = trm_get_sense_bufaddr(pACB, pSRB);
 2835         pSRB->pSRBSGL->length = (u_long) sizeof(struct scsi_sense_data);
 2836         pSRB->SRBSGCount = 1;
 2837         pSRB->SRBSGIndex = 0;
 2838         
 2839         *((u_long *) &(pSRB->CmdBlock[0])) = 0x00000003;
 2840         pSRB->CmdBlock[1] = pDCB->IdentifyMsg << 5;
 2841         *((u_int16_t *) &(pSRB->CmdBlock[4])) = pcsio->sense_len;
 2842         pSRB->ScsiCmdLen = 6;
 2843         
 2844         if (trm_StartSCSI(pACB, pDCB, pSRB))
 2845            /* 
 2846             * If trm_StartSCSI return 1 :
 2847             * current interrupt status is interrupt disreenable 
 2848             * It's said that SCSI processor has more one SRB need to do
 2849             */
 2850                 trm_RewaitSRB(pDCB, pSRB);
 2851 }
 2852 
 2853 static void 
 2854 trm_EnableMsgOutAbort2(PACB pACB, PSRB pSRB)
 2855 {
 2856 
 2857         pSRB->MsgCnt = 1;
 2858         trm_reg_write16(DO_SETATN, TRMREG_SCSI_CONTROL);
 2859 }
 2860 
 2861 static void
 2862 trm_EnableMsgOutAbort1(PACB pACB, PSRB pSRB)
 2863 {
 2864   
 2865         pSRB->MsgOutBuf[0] = MSG_ABORT;
 2866         trm_EnableMsgOutAbort2(pACB, pSRB);
 2867 }
 2868 
 2869 static void
 2870 trm_initDCB(PACB pACB, PDCB pDCB, u_int16_t unit,u_int32_t i,u_int32_t j)
 2871 {
 2872         PNVRAMTYPE      pEEpromBuf;
 2873         u_int8_t        bval,PeriodIndex;
 2874         u_int           target_id,target_lun;
 2875         PDCB            pTempDCB;
 2876         int             intflag;
 2877     
 2878         target_id  = i;
 2879         target_lun = j;
 2880 
 2881         /*
 2882          *  Using the lun 0 device to init other DCB first, if the device 
 2883          *  has been initialized.
 2884          *  I don't want init sync arguments one by one, it is the same.
 2885          */
 2886         if (target_lun != 0 && 
 2887             (pACB->DCBarray[target_id][0].DCBstatus & DS_IN_QUEUE))
 2888                 bcopy(&pACB->DCBarray[target_id][0], pDCB, 
 2889                     sizeof(TRM_DCB));
 2890         intflag = splcam();
 2891         if (pACB->pLinkDCB == 0) {
 2892                 pACB->pLinkDCB = pDCB;
 2893                 /* 
 2894                  * RunRobin impersonate the role 
 2895                  * that let each device had good proportion 
 2896                  * about SCSI command proceeding 
 2897                  */
 2898                 pACB->pDCBRunRobin = pDCB;
 2899                 pDCB->pNextDCB = pDCB;
 2900         } else {
 2901                 pTempDCB=pACB->pLinkDCB;
 2902                 /* search the last nod of DCB link */
 2903                 while (pTempDCB->pNextDCB != pACB->pLinkDCB)
 2904                         pTempDCB = pTempDCB->pNextDCB;
 2905                 /* connect current DCB with last DCB tail */
 2906                 pTempDCB->pNextDCB = pDCB;
 2907                 /* connect current DCB tail to this DCB Q head */
 2908                 pDCB->pNextDCB=pACB->pLinkDCB;
 2909         }
 2910         splx(intflag);
 2911 
 2912         pACB->DeviceCnt++;
 2913         pDCB->TargetID = target_id;
 2914         pDCB->TargetLUN =  target_lun;
 2915         pDCB->pWaitingSRB = NULL;
 2916         pDCB->pGoingSRB = NULL;
 2917         pDCB->GoingSRBCnt = 0;
 2918         pDCB->pActiveSRB = NULL;
 2919         pDCB->MaxActiveCommandCnt = 1;
 2920         pDCB->DCBFlag = 0;
 2921         pDCB->DCBstatus |= DS_IN_QUEUE;
 2922         /* $$$$$$$ */
 2923         pEEpromBuf = &trm_eepromBuf[unit];
 2924         pDCB->DevMode = pEEpromBuf->NvramTarget[target_id].NvmTarCfg0;
 2925         pDCB->AdpMode = pEEpromBuf->NvramChannelCfg;
 2926         /* $$$$$$$ */
 2927         /* 
 2928          * disconnect enable ?
 2929          */
 2930         if (pDCB->DevMode & NTC_DO_DISCONNECT) {
 2931                 bval = 0xC0;
 2932                 pDCB->tinfo.disc_tag |= TRM_USR_DISCENB ;
 2933         } else {
 2934                 bval = 0x80;
 2935                 pDCB->tinfo.disc_tag &= ~(TRM_USR_DISCENB);
 2936         }
 2937         bval |= target_lun;
 2938         pDCB->IdentifyMsg = bval;
 2939         if (target_lun != 0 && 
 2940             (pACB->DCBarray[target_id][0].DCBstatus & DS_IN_QUEUE))
 2941                 return;
 2942         /* $$$$$$$ */
 2943         /*
 2944          * tag Qing enable ?
 2945          */
 2946         if (pDCB->DevMode & TAG_QUEUING_) {
 2947                 pDCB->tinfo.disc_tag |= TRM_USR_TAGENB ;
 2948         } else
 2949                 pDCB->tinfo.disc_tag &= ~(TRM_USR_TAGENB);
 2950         /* $$$$$$$ */
 2951         /*
 2952          * wide nego ,sync nego enable ?
 2953          */
 2954         pDCB->SyncPeriod = 0;
 2955         pDCB->SyncOffset = 0;
 2956         PeriodIndex = pEEpromBuf->NvramTarget[target_id].NvmTarPeriod & 0x07;
 2957         if (pACB->AdaptType==1) {/* is U2? */
 2958             pDCB->MaxNegoPeriod=dc395u2x_clock_period[ PeriodIndex ];
 2959             pDCB->tinfo.user.period=pDCB->MaxNegoPeriod;
 2960             pDCB->tinfo.user.offset=(pDCB->SyncMode & SYNC_NEGO_ENABLE) ? 31 : 0;
 2961         } else {
 2962         pDCB->MaxNegoPeriod=dc395x_clock_period[ PeriodIndex ];
 2963             pDCB->tinfo.user.period=pDCB->MaxNegoPeriod;
 2964             pDCB->tinfo.user.offset=(pDCB->SyncMode & SYNC_NEGO_ENABLE) ? 15 : 0;
 2965         }
 2966         pDCB->SyncMode = 0;
 2967         if ((pDCB->DevMode & NTC_DO_WIDE_NEGO) && 
 2968             (pACB->Config & HCC_WIDE_CARD))
 2969                 pDCB->SyncMode |= WIDE_NEGO_ENABLE;
 2970         /* enable wide nego */
 2971         if (pDCB->DevMode & NTC_DO_SYNC_NEGO)
 2972                 pDCB->SyncMode |= SYNC_NEGO_ENABLE;
 2973         /* enable sync nego */
 2974         /* $$$$$$$ */
 2975         /*
 2976          *      Fill in tinfo structure.
 2977          */
 2978         pDCB->tinfo.user.width  = (pDCB->SyncMode & WIDE_NEGO_ENABLE) ? 
 2979           MSG_EXT_WDTR_BUS_16_BIT : MSG_EXT_WDTR_BUS_8_BIT;
 2980 
 2981         pDCB->tinfo.current.period = 0;
 2982         pDCB->tinfo.current.offset = 0;
 2983         pDCB->tinfo.current.width = MSG_EXT_WDTR_BUS_8_BIT;
 2984 }
 2985 
 2986 static void
 2987 trm_srbmapSG(void *arg, bus_dma_segment_t *segs, int nseg, int error)
 2988 {
 2989         PSRB pSRB;
 2990 
 2991         pSRB=(PSRB) arg;
 2992         pSRB->SRBSGPhyAddr=segs->ds_addr;
 2993         return;
 2994 }
 2995 
 2996 static void
 2997 trm_destroySRB(PACB pACB)
 2998 {
 2999         PSRB pSRB;
 3000 
 3001         pSRB = pACB->pFreeSRB;
 3002         while (pSRB) {
 3003                 if (pSRB->sg_dmamap) {
 3004                         bus_dmamap_unload(pACB->sg_dmat, pSRB->sg_dmamap);
 3005                         bus_dmamem_free(pACB->sg_dmat, pSRB->pSRBSGL,
 3006                             pSRB->sg_dmamap);
 3007                         bus_dmamap_destroy(pACB->sg_dmat, pSRB->sg_dmamap);
 3008                 }
 3009                 if (pSRB->dmamap)
 3010                         bus_dmamap_destroy(pACB->buffer_dmat, pSRB->dmamap);
 3011                 pSRB = pSRB->pNextSRB;
 3012         }
 3013 }
 3014 
 3015 static int
 3016 trm_initSRB(PACB pACB)
 3017 {
 3018         u_int16_t    i;
 3019         PSRB    pSRB;
 3020         int error;
 3021 
 3022         for (i = 0; i < TRM_MAX_SRB_CNT; i++) {
 3023                 pSRB = (PSRB)&pACB->pFreeSRB[i];
 3024 
 3025                 if (bus_dmamem_alloc(pACB->sg_dmat, (void **)&pSRB->pSRBSGL,
 3026                     BUS_DMA_NOWAIT, &pSRB->sg_dmamap) !=0 ) {
 3027                         return ENXIO;
 3028                 }
 3029                 bus_dmamap_load(pACB->sg_dmat, pSRB->sg_dmamap, pSRB->pSRBSGL,
 3030                     TRM_MAX_SG_LISTENTRY * sizeof(SGentry),
 3031                     trm_srbmapSG, pSRB, /*flags*/0);
 3032                 if (i != TRM_MAX_SRB_CNT - 1) {
 3033                         /*
 3034                          * link all SRB 
 3035                          */
 3036                         pSRB->pNextSRB = &pACB->pFreeSRB[i+1];
 3037                 } else {
 3038                         /*
 3039                          * load NULL to NextSRB of the last SRB
 3040                          */
 3041                         pSRB->pNextSRB = NULL;
 3042                 }
 3043                 pSRB->TagNumber = i;
 3044 
 3045                 /*
 3046                  * Create the dmamap.  This is no longer optional!
 3047                  */
 3048                 if ((error = bus_dmamap_create(pACB->buffer_dmat, 0,
 3049                                                &pSRB->dmamap)) != 0)
 3050                         return (error);
 3051 
 3052         }
 3053         return (0);
 3054 }
 3055 
 3056 
 3057 
 3058 
 3059 static void
 3060 trm_initACB(PACB pACB, u_int8_t adaptType, u_int16_t unit)
 3061 {
 3062         PNVRAMTYPE      pEEpromBuf;
 3063     
 3064         pEEpromBuf = &trm_eepromBuf[unit];
 3065         pACB->max_id = 15;
 3066         
 3067         if (pEEpromBuf->NvramChannelCfg & NAC_SCANLUN)
 3068                 pACB->max_lun = 7;
 3069         else
 3070                 pACB->max_lun = 0;
 3071 
 3072         TRM_DPRINTF("trm: pACB->max_id= %d pACB->max_lun= %d \n",
 3073             pACB->max_id, pACB->max_lun);
 3074         pACB->pLinkDCB = NULL;
 3075         pACB->pDCBRunRobin = NULL;
 3076         pACB->pActiveDCB = NULL;
 3077         pACB->AdapterUnit = (u_int8_t)unit;
 3078         pACB->AdaptSCSIID = pEEpromBuf->NvramScsiId;
 3079         pACB->AdaptSCSILUN = 0;
 3080         pACB->DeviceCnt = 0;
 3081         pACB->AdaptType = adaptType; 
 3082         pACB->TagMaxNum = 2 << pEEpromBuf->NvramMaxTag;
 3083         pACB->ACBFlag = 0;
 3084         return;
 3085 }
 3086 
 3087 static void
 3088 NVRAM_trm_write_all(PNVRAMTYPE pEEpromBuf,PACB pACB)
 3089 {
 3090         u_int8_t        *bpEeprom = (u_int8_t *) pEEpromBuf;
 3091         u_int8_t        bAddr;
 3092 
 3093         /* Enable SEEPROM */
 3094         trm_reg_write8((trm_reg_read8(TRMREG_GEN_CONTROL) | EN_EEPROM),
 3095             TRMREG_GEN_CONTROL);
 3096         /*
 3097          * Write enable
 3098          */
 3099         NVRAM_trm_write_cmd(pACB, 0x04, 0xFF);
 3100         trm_reg_write8(0, TRMREG_GEN_NVRAM);
 3101         NVRAM_trm_wait_30us(pACB);
 3102         for (bAddr = 0; bAddr < 128; bAddr++, bpEeprom++) { 
 3103                 NVRAM_trm_set_data(pACB, bAddr, *bpEeprom);
 3104         }
 3105         /* 
 3106          * Write disable
 3107          */
 3108         NVRAM_trm_write_cmd(pACB, 0x04, 0x00);
 3109         trm_reg_write8(0 , TRMREG_GEN_NVRAM);
 3110         NVRAM_trm_wait_30us(pACB);
 3111         /* Disable SEEPROM */
 3112         trm_reg_write8((trm_reg_read8(TRMREG_GEN_CONTROL) & ~EN_EEPROM),
 3113             TRMREG_GEN_CONTROL);
 3114         return;
 3115 }
 3116 
 3117 static void
 3118 NVRAM_trm_set_data(PACB pACB, u_int8_t bAddr, u_int8_t bData)
 3119 {
 3120         int             i;
 3121         u_int8_t        bSendData;
 3122         /* 
 3123          * Send write command & address 
 3124          */
 3125         
 3126         NVRAM_trm_write_cmd(pACB, 0x05, bAddr);
 3127         /* 
 3128          * Write data 
 3129          */
 3130         for (i = 0; i < 8; i++, bData <<= 1) {
 3131                 bSendData = NVR_SELECT;
 3132                 if (bData & 0x80)
 3133                   /* Start from bit 7   */
 3134                         bSendData |= NVR_BITOUT;
 3135                 trm_reg_write8(bSendData , TRMREG_GEN_NVRAM);
 3136                 NVRAM_trm_wait_30us(pACB);
 3137                 trm_reg_write8((bSendData | NVR_CLOCK), TRMREG_GEN_NVRAM);
 3138                 NVRAM_trm_wait_30us(pACB);
 3139         }
 3140         trm_reg_write8(NVR_SELECT , TRMREG_GEN_NVRAM);
 3141         NVRAM_trm_wait_30us(pACB);
 3142         /*
 3143          * Disable chip select 
 3144          */
 3145         trm_reg_write8(0 , TRMREG_GEN_NVRAM);
 3146         NVRAM_trm_wait_30us(pACB);
 3147         trm_reg_write8(NVR_SELECT ,TRMREG_GEN_NVRAM);
 3148         NVRAM_trm_wait_30us(pACB);
 3149         /* 
 3150          * Wait for write ready 
 3151          */
 3152         while (1) {
 3153                 trm_reg_write8((NVR_SELECT | NVR_CLOCK), TRMREG_GEN_NVRAM);
 3154                 NVRAM_trm_wait_30us(pACB);
 3155                 trm_reg_write8(NVR_SELECT, TRMREG_GEN_NVRAM);
 3156                 NVRAM_trm_wait_30us(pACB);
 3157                 if (trm_reg_read8(TRMREG_GEN_NVRAM) & NVR_BITIN) {
 3158                         break;
 3159                 }
 3160         }
 3161         /* 
 3162          * Disable chip select 
 3163          */
 3164         trm_reg_write8(0, TRMREG_GEN_NVRAM);
 3165         return;
 3166 }
 3167 
 3168 static void 
 3169 NVRAM_trm_read_all(PNVRAMTYPE pEEpromBuf, PACB pACB)
 3170 {
 3171         u_int8_t        *bpEeprom = (u_int8_t*) pEEpromBuf;
 3172         u_int8_t        bAddr;
 3173     
 3174         /*
 3175          * Enable SEEPROM 
 3176          */
 3177         trm_reg_write8((trm_reg_read8(TRMREG_GEN_CONTROL) | EN_EEPROM),
 3178             TRMREG_GEN_CONTROL);
 3179         for (bAddr = 0; bAddr < 128; bAddr++, bpEeprom++)
 3180                 *bpEeprom = NVRAM_trm_get_data(pACB, bAddr);
 3181         /* 
 3182          * Disable SEEPROM 
 3183          */
 3184         trm_reg_write8((trm_reg_read8(TRMREG_GEN_CONTROL) & ~EN_EEPROM),
 3185             TRMREG_GEN_CONTROL);
 3186         return;
 3187 }
 3188 
 3189 static u_int8_t
 3190 NVRAM_trm_get_data(PACB pACB, u_int8_t bAddr)
 3191 {
 3192         int             i;
 3193         u_int8_t        bReadData, bData = 0;
 3194         /* 
 3195         * Send read command & address
 3196         */
 3197         
 3198         NVRAM_trm_write_cmd(pACB, 0x06, bAddr);
 3199                                 
 3200         for (i = 0; i < 8; i++) {
 3201           /* 
 3202            * Read data
 3203            */
 3204                 trm_reg_write8((NVR_SELECT | NVR_CLOCK) , TRMREG_GEN_NVRAM);
 3205                 NVRAM_trm_wait_30us(pACB);
 3206                 trm_reg_write8(NVR_SELECT , TRMREG_GEN_NVRAM);
 3207                 /* 
 3208                  * Get data bit while falling edge 
 3209                  */
 3210                 bReadData = trm_reg_read8(TRMREG_GEN_NVRAM);
 3211                 bData <<= 1;
 3212                 if (bReadData & NVR_BITIN) {
 3213                         bData |= 1;
 3214                 }
 3215                 NVRAM_trm_wait_30us(pACB);
 3216         }
 3217         /* 
 3218          * Disable chip select 
 3219          */
 3220         trm_reg_write8(0, TRMREG_GEN_NVRAM);
 3221         return (bData);
 3222 }
 3223 
 3224 static void
 3225 NVRAM_trm_wait_30us(PACB pACB)
 3226 {
 3227   
 3228         /*    ScsiPortStallExecution(30);        wait 30 us     */
 3229         trm_reg_write8(5, TRMREG_GEN_TIMER);
 3230         while (!(trm_reg_read8(TRMREG_GEN_STATUS) & GTIMEOUT));
 3231         return;
 3232 }
 3233 
 3234 static void
 3235 NVRAM_trm_write_cmd(PACB pACB, u_int8_t bCmd, u_int8_t bAddr)
 3236 {
 3237         int             i;
 3238         u_int8_t        bSendData;
 3239                                         
 3240         for (i = 0; i < 3; i++, bCmd <<= 1) {
 3241           /* 
 3242            * Program SB+OP code         
 3243            */
 3244                 bSendData = NVR_SELECT;
 3245                 if (bCmd & 0x04)        
 3246                         bSendData |= NVR_BITOUT;
 3247                 /* start from bit 2 */
 3248                 trm_reg_write8(bSendData, TRMREG_GEN_NVRAM);
 3249                 NVRAM_trm_wait_30us(pACB);
 3250                 trm_reg_write8((bSendData | NVR_CLOCK), TRMREG_GEN_NVRAM);
 3251                 NVRAM_trm_wait_30us(pACB);
 3252         }       
 3253         for (i = 0; i < 7; i++, bAddr <<= 1) {
 3254           /* 
 3255            * Program address            
 3256            */
 3257                 bSendData = NVR_SELECT;
 3258                 if (bAddr & 0x40)       
 3259                   /* Start from bit 6   */
 3260                         bSendData |= NVR_BITOUT;
 3261                 trm_reg_write8(bSendData , TRMREG_GEN_NVRAM);
 3262                 NVRAM_trm_wait_30us(pACB);
 3263                 trm_reg_write8((bSendData | NVR_CLOCK), TRMREG_GEN_NVRAM);
 3264                 NVRAM_trm_wait_30us(pACB);
 3265         }
 3266         trm_reg_write8(NVR_SELECT, TRMREG_GEN_NVRAM);
 3267         NVRAM_trm_wait_30us(pACB);
 3268 }
 3269 
 3270 static void
 3271 trm_check_eeprom(PNVRAMTYPE pEEpromBuf, PACB pACB)
 3272 {
 3273         u_int16_t       *wpEeprom = (u_int16_t *) pEEpromBuf;
 3274         u_int16_t       wAddr, wCheckSum;
 3275         u_long  dAddr, *dpEeprom;
 3276 
 3277         NVRAM_trm_read_all(pEEpromBuf,pACB);
 3278         wCheckSum = 0;
 3279         for (wAddr = 0, wpEeprom = (u_int16_t *) pEEpromBuf;
 3280             wAddr < 64; wAddr++, wpEeprom++) {
 3281                 wCheckSum += *wpEeprom;
 3282         }
 3283         if (wCheckSum != 0x1234) {
 3284           /* 
 3285            * Checksum error, load default       
 3286            */
 3287                 pEEpromBuf->NvramSubVendorID[0] = (u_int8_t) PCI_Vendor_ID_TEKRAM;
 3288                 pEEpromBuf->NvramSubVendorID[1] =
 3289                   (u_int8_t) (PCI_Vendor_ID_TEKRAM >> 8);
 3290                 pEEpromBuf->NvramSubSysID[0] = (u_int8_t) PCI_Device_ID_TRM_S1040;
 3291                 pEEpromBuf->NvramSubSysID[1] = 
 3292                   (u_int8_t) (PCI_Device_ID_TRM_S1040 >> 8);
 3293                 pEEpromBuf->NvramSubClass = 0x00;
 3294                 pEEpromBuf->NvramVendorID[0] = (u_int8_t) PCI_Vendor_ID_TEKRAM;
 3295                 pEEpromBuf->NvramVendorID[1] =
 3296                   (u_int8_t) (PCI_Vendor_ID_TEKRAM >> 8);
 3297                 pEEpromBuf->NvramDeviceID[0] = (u_int8_t) PCI_Device_ID_TRM_S1040;
 3298                 pEEpromBuf->NvramDeviceID[1] = 
 3299                   (u_int8_t) (PCI_Device_ID_TRM_S1040 >> 8);
 3300                 pEEpromBuf->NvramReserved = 0x00;
 3301 
 3302                 for (dAddr = 0, dpEeprom = (u_long *) pEEpromBuf->NvramTarget;
 3303                     dAddr < 16; dAddr++, dpEeprom++) {
 3304                         *dpEeprom = 0x00000077;
 3305                         /* NvmTarCfg3,NvmTarCfg2,NvmTarPeriod,NvmTarCfg0 */
 3306                 }
 3307 
 3308                 *dpEeprom++ = 0x04000F07;
 3309                 /* NvramMaxTag,NvramDelayTime,NvramChannelCfg,NvramScsiId */
 3310                 *dpEeprom++ = 0x00000015;
 3311                 /* NvramReserved1,NvramBootLun,NvramBootTarget,NvramReserved0 */
 3312                 for (dAddr = 0; dAddr < 12; dAddr++, dpEeprom++)
 3313                         *dpEeprom = 0x00;
 3314                 pEEpromBuf->NvramCheckSum = 0x00;
 3315                 for (wAddr = 0, wCheckSum = 0, wpEeprom = (u_int16_t *) pEEpromBuf;
 3316                     wAddr < 63; wAddr++, wpEeprom++)
 3317                         wCheckSum += *wpEeprom;
 3318                 *wpEeprom = 0x1234 - wCheckSum;
 3319                 NVRAM_trm_write_all(pEEpromBuf,pACB);
 3320         }
 3321         return;
 3322 }
 3323 static int
 3324 trm_initAdapter(PACB pACB, u_int16_t unit)
 3325 {
 3326         PNVRAMTYPE      pEEpromBuf;
 3327         u_int16_t       wval;
 3328         u_int8_t        bval;
 3329 
 3330         pEEpromBuf = &trm_eepromBuf[unit];
 3331 
 3332         /* 250ms selection timeout */
 3333         trm_reg_write8(SEL_TIMEOUT, TRMREG_SCSI_TIMEOUT);
 3334         /* Mask all the interrupt */
 3335         trm_reg_write8(0x00, TRMREG_DMA_INTEN);    
 3336         trm_reg_write8(0x00, TRMREG_SCSI_INTEN);     
 3337         /* Reset SCSI module */
 3338         trm_reg_write16(DO_RSTMODULE, TRMREG_SCSI_CONTROL); 
 3339         /* program configuration 0 */
 3340         pACB->Config = HCC_AUTOTERM | HCC_PARITY;
 3341         if (trm_reg_read8(TRMREG_GEN_STATUS) & WIDESCSI)
 3342                 pACB->Config |= HCC_WIDE_CARD;
 3343         if (pEEpromBuf->NvramChannelCfg & NAC_POWERON_SCSI_RESET)
 3344                 pACB->Config |= HCC_SCSI_RESET;
 3345         if (pACB->Config & HCC_PARITY)
 3346                 bval = PHASELATCH | INITIATOR | BLOCKRST | PARITYCHECK;
 3347         else
 3348                 bval = PHASELATCH | INITIATOR | BLOCKRST ;
 3349         trm_reg_write8(bval,TRMREG_SCSI_CONFIG0); 
 3350         /* program configuration 1 */
 3351         trm_reg_write8(0x13, TRMREG_SCSI_CONFIG1); 
 3352         /* program Host ID */
 3353         bval = pEEpromBuf->NvramScsiId;
 3354         trm_reg_write8(bval, TRMREG_SCSI_HOSTID); 
 3355         /* set ansynchronous transfer */
 3356         trm_reg_write8(0x00, TRMREG_SCSI_OFFSET); 
 3357         /* Trun LED control off*/
 3358         wval = trm_reg_read16(TRMREG_GEN_CONTROL) & 0x7F;
 3359         trm_reg_write16(wval, TRMREG_GEN_CONTROL); 
 3360         /* DMA config */
 3361         wval = trm_reg_read16(TRMREG_DMA_CONFIG) | DMA_ENHANCE;
 3362         trm_reg_write16(wval, TRMREG_DMA_CONFIG); 
 3363         /* Clear pending interrupt status */
 3364         trm_reg_read8(TRMREG_SCSI_INTSTATUS);
 3365         /* Enable SCSI interrupt */
 3366         trm_reg_write8(0x7F, TRMREG_SCSI_INTEN); 
 3367         trm_reg_write8(EN_SCSIINTR, TRMREG_DMA_INTEN); 
 3368         return (0);
 3369 }
 3370 
 3371 static void
 3372 trm_mapSRB(void *arg, bus_dma_segment_t *segs, int nseg, int error)
 3373 {
 3374         PACB pACB;
 3375 
 3376         pACB = (PACB)arg;
 3377         pACB->srb_physbase = segs->ds_addr;
 3378 }
 3379 
 3380 static void
 3381 trm_dmamap_cb(void *arg, bus_dma_segment_t *segs, int nseg, int error)
 3382 {
 3383         bus_addr_t *baddr;
 3384 
 3385         baddr = (bus_addr_t *)arg;
 3386         *baddr = segs->ds_addr;
 3387 }
 3388 
 3389 static PACB
 3390 trm_init(u_int16_t unit, device_t dev)
 3391 {
 3392         PACB            pACB;
 3393         int             rid = PCIR_BAR(0), i = 0, j = 0;
 3394         u_int16_t       adaptType = 0;
 3395     
 3396         pACB = (PACB) device_get_softc(dev);
 3397         if (!pACB) {
 3398                 printf("trm%d: cannot allocate ACB !\n", unit);
 3399                 return (NULL);
 3400         }
 3401         pACB->iores = bus_alloc_resource_any(dev, SYS_RES_IOPORT, 
 3402             &rid, RF_ACTIVE);
 3403         if (pACB->iores == NULL) {
 3404                 printf("trm_init: bus_alloc_resource failed!\n");
 3405                 return (NULL);
 3406         }
 3407         switch (pci_get_devid(dev)) {
 3408         case PCI_DEVICEID_TRMS1040:
 3409                 adaptType = 0;
 3410                 break;
 3411         case PCI_DEVICEID_TRMS2080:
 3412                 adaptType = 1;
 3413                 break;
 3414         default:
 3415                 printf("trm_init %d: unknown adapter type!\n", unit);
 3416                 goto bad;
 3417         }
 3418         pACB->dev = dev;
 3419         pACB->tag = rman_get_bustag(pACB->iores);
 3420         pACB->bsh = rman_get_bushandle(pACB->iores);
 3421         if (bus_dma_tag_create(
 3422         /*parent_dmat*/ pACB->parent_dmat,
 3423         /*alignment*/   1,
 3424         /*boundary*/    0,
 3425         /*lowaddr*/     BUS_SPACE_MAXADDR,
 3426         /*highaddr*/    BUS_SPACE_MAXADDR,
 3427         /*filter*/      NULL, 
 3428         /*filterarg*/   NULL,
 3429         /*maxsize*/     MAXBSIZE,
 3430         /*nsegments*/   TRM_NSEG,
 3431         /*maxsegsz*/    TRM_MAXTRANSFER_SIZE,
 3432         /*flags*/       BUS_DMA_ALLOCNOW,
 3433         /*lockfunc*/    busdma_lock_mutex,
 3434         /*lockarg*/     &Giant,
 3435         /* dmat */      &pACB->buffer_dmat) != 0) 
 3436                 goto bad;
 3437         /* DMA tag for our ccb structures */
 3438         if (bus_dma_tag_create(                                 
 3439         /*parent_dmat*/pACB->parent_dmat, 
 3440         /*alignment*/  1, 
 3441         /*boundary*/   0,
 3442         /*lowaddr*/    BUS_SPACE_MAXADDR,
 3443         /*highaddr*/   BUS_SPACE_MAXADDR,
 3444         /*filter*/     NULL, 
 3445         /*filterarg*/  NULL,
 3446         /*maxsize*/    TRM_MAX_SRB_CNT * sizeof(TRM_SRB),
 3447         /*nsegments*/  1,
 3448         /*maxsegsz*/   TRM_MAXTRANSFER_SIZE,
 3449         /*flags*/      0,
 3450         /*lockfunc*/   busdma_lock_mutex,
 3451         /*lockarg*/    &Giant,
 3452         /*dmat*/       &pACB->srb_dmat) != 0) {
 3453                 printf("trm_init %d: bus_dma_tag_create SRB failure\n", unit);
 3454                 goto bad;
 3455         }
 3456         if (bus_dmamem_alloc(pACB->srb_dmat, (void **)&pACB->pFreeSRB, 
 3457             BUS_DMA_NOWAIT, &pACB->srb_dmamap) != 0) {
 3458                 printf("trm_init %d: bus_dmamem_alloc SRB failure\n", unit);
 3459                 goto bad;
 3460         }
 3461         bus_dmamap_load(pACB->srb_dmat, pACB->srb_dmamap, pACB->pFreeSRB,
 3462             TRM_MAX_SRB_CNT * sizeof(TRM_SRB), trm_mapSRB, pACB, 
 3463             /* flags */0);
 3464         /* Create, allocate, and map DMA buffers for autosense data */
 3465         if (bus_dma_tag_create(/*parent_dmat*/NULL, /*alignment*/1,
 3466             /*boundary*/0,
 3467             /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
 3468             /*highaddr*/BUS_SPACE_MAXADDR,
 3469             /*filter*/NULL, /*filterarg*/NULL,
 3470             sizeof(struct scsi_sense_data) * TRM_MAX_SRB_CNT,
 3471             /*nsegments*/1,
 3472             /*maxsegsz*/TRM_MAXTRANSFER_SIZE,
 3473             /*flags*/0, /*lockfunc*/busdma_lock_mutex,
 3474             /*lockarg*/&Giant, &pACB->sense_dmat) != 0) {
 3475           if (bootverbose)
 3476             device_printf(dev, "cannot create sense buffer dmat\n");
 3477           goto bad;
 3478         }
 3479 
 3480         if (bus_dmamem_alloc(pACB->sense_dmat, (void **)&pACB->sense_buffers,
 3481                              BUS_DMA_NOWAIT, &pACB->sense_dmamap) != 0)
 3482                 goto bad;
 3483 
 3484         bus_dmamap_load(pACB->sense_dmat, pACB->sense_dmamap,
 3485                        pACB->sense_buffers,
 3486                        sizeof(struct scsi_sense_data) * TRM_MAX_SRB_CNT,
 3487                        trm_dmamap_cb, &pACB->sense_busaddr, /*flags*/0);
 3488 
 3489         trm_check_eeprom(&trm_eepromBuf[unit],pACB);
 3490         trm_initACB(pACB, adaptType, unit);
 3491         for (i = 0; i < (pACB->max_id + 1); i++) {   
 3492                 if (pACB->AdaptSCSIID == i)
 3493                         continue;
 3494                 for(j = 0; j < (pACB->max_lun + 1); j++) {
 3495                         pACB->scan_devices[i][j] = 1;
 3496                         /* we assume we need to scan all devices */ 
 3497                         trm_initDCB(pACB, &pACB->DCBarray[i][j], unit, i, j);
 3498                 }
 3499         }
 3500         bzero(pACB->pFreeSRB, TRM_MAX_SRB_CNT * sizeof(TRM_SRB));
 3501         if (bus_dma_tag_create(                    
 3502                     /*parent_dmat*/NULL, 
 3503                     /*alignment*/  1,
 3504                     /*boundary*/   0,
 3505                     /*lowaddr*/    BUS_SPACE_MAXADDR,
 3506                     /*highaddr*/   BUS_SPACE_MAXADDR,
 3507                     /*filter*/     NULL, 
 3508                     /*filterarg*/  NULL,
 3509                     /*maxsize*/    TRM_MAX_SG_LISTENTRY * sizeof(SGentry), 
 3510                     /*nsegments*/  1,
 3511                     /*maxsegsz*/   TRM_MAXTRANSFER_SIZE,
 3512                     /*flags*/      0, 
 3513                     /*lockfunc*/   busdma_lock_mutex,
 3514                     /*lockarg*/    &Giant,
 3515                     /*dmat*/       &pACB->sg_dmat) != 0)
 3516                 goto bad;
 3517 
 3518         if (trm_initSRB(pACB)) {
 3519                 printf("trm_initSRB: error\n");
 3520                 goto bad;
 3521         }
 3522         if (trm_initAdapter(pACB, unit)) {
 3523                 printf("trm_initAdapter: initial ERROR\n");
 3524                 goto bad;
 3525         }
 3526         return (pACB);
 3527 bad:
 3528         if (pACB->iores)
 3529                 bus_release_resource(dev, SYS_RES_IOPORT, PCIR_BAR(0),
 3530                     pACB->iores);
 3531         if (pACB->sense_dmamap) {
 3532                 bus_dmamap_unload(pACB->sense_dmat, pACB->sense_dmamap);
 3533                 bus_dmamem_free(pACB->sense_dmat, pACB->sense_buffers,
 3534                     pACB->sense_dmamap);
 3535                 bus_dmamap_destroy(pACB->sense_dmat, pACB->sense_dmamap);
 3536         }
 3537         if (pACB->sense_dmat)
 3538                 bus_dma_tag_destroy(pACB->sense_dmat);
 3539         if (pACB->sg_dmat) {
 3540                 trm_destroySRB(pACB);
 3541                 bus_dma_tag_destroy(pACB->sg_dmat);
 3542         }
 3543         if (pACB->srb_dmamap) {
 3544                 bus_dmamap_unload(pACB->srb_dmat, pACB->srb_dmamap);
 3545                 bus_dmamem_free(pACB->srb_dmat, pACB->pFreeSRB, 
 3546                     pACB->srb_dmamap);
 3547                 bus_dmamap_destroy(pACB->srb_dmat, pACB->srb_dmamap);
 3548         }
 3549         if (pACB->srb_dmat)
 3550                 bus_dma_tag_destroy(pACB->srb_dmat);
 3551         if (pACB->buffer_dmat)
 3552                 bus_dma_tag_destroy(pACB->buffer_dmat);
 3553         return (NULL);
 3554 }
 3555 
 3556 static int
 3557 trm_attach(device_t dev)
 3558 {
 3559         struct  cam_devq *device_Q;
 3560         u_long  device_id;
 3561         PACB    pACB = 0;
 3562         int     rid = 0;
 3563         int unit = device_get_unit(dev);
 3564         
 3565         device_id = pci_get_devid(dev);
 3566         /*
 3567          * These cards do not allow memory mapped accesses
 3568          */
 3569         if ((pACB = trm_init((u_int16_t) unit,
 3570             dev)) == NULL) {
 3571                 printf("trm%d: trm_init error!\n",unit);
 3572                 return (ENXIO);
 3573         }
 3574         /* After setting up the adapter, map our interrupt */
 3575         /*  
 3576          * Now let the CAM generic SCSI layer find the SCSI devices on the bus
 3577          * start queue to reset to the idle loop.
 3578          * Create device queue of SIM(s)
 3579          * (MAX_START_JOB - 1) : max_sim_transactions
 3580          */
 3581         pACB->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
 3582             RF_SHAREABLE | RF_ACTIVE);
 3583         if (pACB->irq == NULL ||
 3584             bus_setup_intr(dev, pACB->irq, 
 3585             INTR_TYPE_CAM, trm_Interrupt, pACB, &pACB->ih)) {
 3586                 printf("trm%d: register Interrupt handler error!\n", unit);
 3587                 goto bad;
 3588         }
 3589         device_Q = cam_simq_alloc(TRM_MAX_START_JOB);
 3590         if (device_Q == NULL){ 
 3591                 printf("trm%d: device_Q == NULL !\n",unit);
 3592                 goto bad;
 3593         }
 3594         /*
 3595          * Now tell the generic SCSI layer
 3596          * about our bus.
 3597          * If this is the xpt layer creating a sim, then it's OK
 3598          * to wait for an allocation.
 3599          * XXX Should we pass in a flag to indicate that wait is OK?
 3600          *
 3601          *                    SIM allocation
 3602          *
 3603          *                 SCSI Interface Modules
 3604          * The sim driver creates a sim for each controller.  The sim device
 3605          * queue is separately created in order to allow resource sharing betwee
 3606          * sims.  For instance, a driver may create one sim for each channel of
 3607          * a multi-channel controller and use the same queue for each channel.
 3608          * In this way, the queue resources are shared across all the channels
 3609          * of the multi-channel controller.
 3610          * trm_action     : sim_action_func
 3611          * trm_poll       : sim_poll_func
 3612          * "trm"        : sim_name ,if sim_name =  "xpt" ..M_DEVBUF,M_WAITOK
 3613          * pACB         : *softc    if sim_name <> "xpt" ..M_DEVBUF,M_NOWAIT
 3614          * pACB->unit   : unit
 3615          * 1            : max_dev_transactions
 3616          * MAX_TAGS     : max_tagged_dev_transactions
 3617          *
 3618          *  *******Construct our first channel SIM entry
 3619          */
 3620         pACB->psim = cam_sim_alloc(trm_action,
 3621             trm_poll,
 3622             "trm",
 3623             pACB,
 3624             unit,
 3625             1,
 3626             TRM_MAX_TAGS_CMD_QUEUE,
 3627             device_Q);
 3628         if (pACB->psim == NULL) {
 3629                 printf("trm%d: SIM allocate fault !\n",unit);
 3630                 cam_simq_free(device_Q);  /* SIM allocate fault*/
 3631                 goto bad;
 3632         }
 3633         if (xpt_bus_register(pACB->psim, 0) != CAM_SUCCESS)  {
 3634                 printf("trm%d: xpt_bus_register fault !\n",unit);
 3635                 goto bad;
 3636         }
 3637         if (xpt_create_path(&pACB->ppath,
 3638               NULL,
 3639               cam_sim_path(pACB->psim),
 3640               CAM_TARGET_WILDCARD,
 3641               CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
 3642                 printf("trm%d: xpt_create_path fault !\n",unit);
 3643                 xpt_bus_deregister(cam_sim_path(pACB->psim));
 3644                 goto bad;
 3645         }
 3646         return (0);
 3647 bad:
 3648         if (pACB->iores)
 3649                 bus_release_resource(dev, SYS_RES_IOPORT, PCIR_BAR(0),
 3650                     pACB->iores);
 3651         if (pACB->sg_dmat) {            
 3652                 trm_destroySRB(pACB);
 3653                 bus_dma_tag_destroy(pACB->sg_dmat);
 3654         }
 3655         
 3656         if (pACB->srb_dmamap) {
 3657                 bus_dmamap_unload(pACB->srb_dmat, pACB->srb_dmamap);
 3658                 bus_dmamem_free(pACB->srb_dmat, pACB->pFreeSRB, 
 3659                     pACB->srb_dmamap);
 3660                 bus_dmamap_destroy(pACB->srb_dmat, pACB->srb_dmamap);
 3661         }
 3662         if (pACB->srb_dmat)
 3663                 bus_dma_tag_destroy(pACB->srb_dmat);
 3664         if (pACB->sense_dmamap) {
 3665                   bus_dmamap_unload(pACB->sense_dmat, pACB->sense_dmamap);
 3666                   bus_dmamem_free(pACB->sense_dmat, pACB->sense_buffers,
 3667                       pACB->sense_dmamap);
 3668                   bus_dmamap_destroy(pACB->sense_dmat, pACB->sense_dmamap);
 3669         }
 3670         if (pACB->sense_dmat)
 3671                 bus_dma_tag_destroy(pACB->sense_dmat);          
 3672         if (pACB->buffer_dmat)
 3673                 bus_dma_tag_destroy(pACB->buffer_dmat);
 3674         if (pACB->ih)
 3675                 bus_teardown_intr(dev, pACB->irq, pACB->ih);
 3676         if (pACB->irq)
 3677                 bus_release_resource(dev, SYS_RES_IRQ, 0, pACB->irq);
 3678         if (pACB->psim)
 3679                 cam_sim_free(pACB->psim, TRUE);
 3680         
 3681         return (ENXIO);
 3682         
 3683 }
 3684 
 3685 /*
 3686 *                  pci_device
 3687 *         trm_probe (device_t tag, pcidi_t type)
 3688 *
 3689 */
 3690 static int
 3691 trm_probe(device_t dev)
 3692 {
 3693         switch (pci_get_devid(dev)) {
 3694         case PCI_DEVICEID_TRMS1040: 
 3695                 device_set_desc(dev,
 3696                     "Tekram DC395U/UW/F DC315/U Fast20 Wide SCSI Adapter");
 3697                 return (0);
 3698         case PCI_DEVICEID_TRMS2080:
 3699                 device_set_desc(dev,
 3700                     "Tekram DC395U2D/U2W Fast40 Wide SCSI Adapter");
 3701                 return 0;
 3702         default:
 3703                 return (ENXIO);
 3704         }
 3705 }
 3706 
 3707 static int
 3708 trm_detach(device_t dev)
 3709 {
 3710         PACB pACB = device_get_softc(dev);
 3711 
 3712         bus_release_resource(dev, SYS_RES_IOPORT, PCIR_BAR(0), pACB->iores);
 3713         trm_destroySRB(pACB);
 3714         bus_dma_tag_destroy(pACB->sg_dmat);
 3715         bus_dmamap_unload(pACB->srb_dmat, pACB->srb_dmamap);
 3716         bus_dmamem_free(pACB->srb_dmat, pACB->pFreeSRB,
 3717             pACB->srb_dmamap);
 3718         bus_dmamap_destroy(pACB->srb_dmat, pACB->srb_dmamap);
 3719         bus_dma_tag_destroy(pACB->srb_dmat);    
 3720         bus_dmamap_unload(pACB->sense_dmat, pACB->sense_dmamap);
 3721         bus_dmamem_free(pACB->sense_dmat, pACB->sense_buffers,
 3722             pACB->sense_dmamap);
 3723         bus_dmamap_destroy(pACB->sense_dmat, pACB->sense_dmamap);
 3724         bus_dma_tag_destroy(pACB->sense_dmat);                                
 3725         bus_dma_tag_destroy(pACB->buffer_dmat);
 3726         bus_teardown_intr(dev, pACB->irq, pACB->ih);
 3727         bus_release_resource(dev, SYS_RES_IRQ, 0, pACB->irq);
 3728         xpt_async(AC_LOST_DEVICE, pACB->ppath, NULL);
 3729         xpt_free_path(pACB->ppath);
 3730         xpt_bus_deregister(cam_sim_path(pACB->psim));
 3731         cam_sim_free(pACB->psim, TRUE);
 3732         return (0);
 3733 }
 3734 static device_method_t trm_methods[] = {
 3735         /* Device interface */
 3736         DEVMETHOD(device_probe,         trm_probe),
 3737         DEVMETHOD(device_attach,        trm_attach),
 3738         DEVMETHOD(device_detach,        trm_detach),
 3739         { 0, 0 }
 3740 };
 3741 
 3742 static driver_t trm_driver = {
 3743         "trm", trm_methods, sizeof(struct _ACB)
 3744 };
 3745 
 3746 static devclass_t trm_devclass;
 3747 DRIVER_MODULE(trm, pci, trm_driver, trm_devclass, 0, 0);
 3748 MODULE_DEPEND(trm, cam, 1, 1, 1);

Cache object: f714d95ee95d9ccc43571c29ad67dfe5


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.