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