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