1 /* $OpenBSD: trm.c,v 1.43 2020/09/22 19:32:52 krw Exp $ 2 * ------------------------------------------------------------ 3 * O.S : OpenBSD 4 * File Name : trm.c 5 * Device Driver for Tekram DC395U/UW/F,DC315/U 6 * PCI SCSI Bus Master Host Adapter 7 * (SCSI chip set used Tekram ASIC TRM-S1040) 8 * 9 * (C)Copyright 1995-1999 Tekram Technology Co., Ltd. 10 * (C)Copyright 2001-2002 Ashley R. Martens and Kenneth R Westerback 11 * ------------------------------------------------------------ 12 * HISTORY: 13 * 14 * REV# DATE NAME DESCRIPTION 15 * 1.00 05/01/99 ERICH CHEN First released for NetBSD 1.4.x 16 * 1.01 00/00/00 MARTIN AKESSON Port to OpenBSD 2.8 17 * 1.02 09/19/01 ASHLEY MARTENS Cleanup and formatting 18 * 2.00 01/00/02 KENNETH R WESTERBACK Rewrite of the bus and code logic 19 * ------------------------------------------------------------ 20 * 21 * Redistribution and use in source and binary forms, with or without 22 * modification, are permitted provided that the following conditions 23 * are met: 24 * 1. Redistributions of source code must retain the above copyright 25 * notice, this list of conditions and the following disclaimer. 26 * 2. Redistributions in binary form must reproduce the above copyright 27 * notice, this list of conditions and the following disclaimer in the 28 * documentation and/or other materials provided with the distribution. 29 * 3. The name of the author may not be used to endorse or promote products 30 * derived from this software without specific prior written permission. 31 * 32 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 33 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 34 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 35 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 36 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 37 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 38 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 39 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 40 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 41 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 42 * 43 * ------------------------------------------------------------ 44 */ 45 46 #include <sys/param.h> 47 #include <sys/systm.h> 48 #include <sys/kernel.h> 49 #include <sys/malloc.h> 50 #include <sys/buf.h> 51 #include <sys/device.h> 52 53 #include <machine/bus.h> 54 55 #include <scsi/scsi_all.h> 56 #include <scsi/scsiconf.h> 57 #include <scsi/scsi_message.h> 58 59 #include <dev/pci/pcidevs.h> 60 #include <dev/ic/trm.h> 61 62 /* #define TRM_DEBUG0 */ 63 64 void trm_initSRB(struct trm_scsi_req_q *); 65 66 void trm_check_eeprom(struct trm_adapter_nvram *, bus_space_tag_t, bus_space_handle_t); 67 void trm_read_all (struct trm_adapter_nvram *, bus_space_tag_t, bus_space_handle_t); 68 void trm_write_all (struct trm_adapter_nvram *, bus_space_tag_t, bus_space_handle_t); 69 70 void trm_set_data (bus_space_tag_t, bus_space_handle_t, u_int8_t, u_int8_t); 71 void trm_write_cmd(bus_space_tag_t, bus_space_handle_t, u_int8_t, u_int8_t); 72 73 u_int8_t trm_get_data(bus_space_tag_t, bus_space_handle_t, u_int8_t); 74 75 void trm_wait_30us(bus_space_tag_t, bus_space_handle_t); 76 77 void *trm_srb_alloc(void *); 78 79 void trm_DataOutPhase0(struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *); 80 void trm_DataInPhase0 (struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *); 81 void trm_StatusPhase0 (struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *); 82 void trm_MsgOutPhase0 (struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *); 83 void trm_MsgInPhase0 (struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *); 84 void trm_DataOutPhase1(struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *); 85 void trm_DataInPhase1 (struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *); 86 void trm_CommandPhase1(struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *); 87 void trm_StatusPhase1 (struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *); 88 void trm_MsgOutPhase1 (struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *); 89 void trm_MsgInPhase1 (struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *); 90 void trm_Nop (struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *); 91 92 void trm_SetXferParams (struct trm_softc *, struct trm_dcb *, int); 93 94 void trm_DataIO_transfer(struct trm_softc *, struct trm_scsi_req_q *, u_int16_t); 95 96 int trm_StartSRB (struct trm_softc *, struct trm_scsi_req_q *); 97 void trm_srb_reinit (struct trm_softc *, struct trm_scsi_req_q *); 98 void trm_srb_free (void *, void *); 99 void trm_RewaitSRB (struct trm_softc *, struct trm_scsi_req_q *); 100 void trm_FinishSRB (struct trm_softc *, struct trm_scsi_req_q *); 101 void trm_RequestSense(struct trm_softc *, struct trm_scsi_req_q *); 102 103 void trm_initAdapter (struct trm_softc *); 104 void trm_Disconnect (struct trm_softc *); 105 void trm_Reselect (struct trm_softc *); 106 void trm_GoingSRB_Done (struct trm_softc *, struct trm_dcb *); 107 void trm_ScsiRstDetect (struct trm_softc *); 108 void trm_ResetSCSIBus (struct trm_softc *); 109 void trm_reset (struct trm_softc *); 110 void trm_StartWaitingSRB (struct trm_softc *); 111 void trm_ResetAllDevParam(struct trm_softc *); 112 void trm_RecoverSRB (struct trm_softc *); 113 void trm_linkSRB (struct trm_softc *); 114 115 void trm_initACB(struct trm_softc *, int); 116 117 void trm_ResetDevParam(struct trm_softc *, struct trm_dcb *, u_int8_t); 118 119 void trm_EnableMsgOut(struct trm_softc *, u_int8_t); 120 121 void trm_timeout(void *); 122 123 void trm_print_info(struct trm_softc *, struct trm_dcb *); 124 125 /* 126 * ------------------------------------------------------------ 127 * 128 * stateV = (void *) trm_SCSI_phase0[phase] 129 * 130 * ------------------------------------------------------------ 131 */ 132 static void *trm_SCSI_phase0[8] = { 133 trm_DataOutPhase0, /* phase:0 */ 134 trm_DataInPhase0, /* phase:1 */ 135 trm_Nop, /* phase:2 */ 136 trm_StatusPhase0, /* phase:3 */ 137 trm_Nop, /* phase:4 */ 138 trm_Nop, /* phase:5 */ 139 trm_MsgOutPhase0, /* phase:6 */ 140 trm_MsgInPhase0, /* phase:7 */ 141 }; 142 143 /* 144 * ------------------------------------------------------------ 145 * 146 * stateV = (void *) trm_SCSI_phase1[phase] 147 * 148 * ------------------------------------------------------------ 149 */ 150 static void *trm_SCSI_phase1[8] = { 151 trm_DataOutPhase1, /* phase:0 */ 152 trm_DataInPhase1, /* phase:1 */ 153 trm_CommandPhase1, /* phase:2 */ 154 trm_StatusPhase1, /* phase:3 */ 155 trm_Nop, /* phase:4 */ 156 trm_Nop, /* phase:5 */ 157 trm_MsgOutPhase1, /* phase:6 */ 158 trm_MsgInPhase1, /* phase:7 */ 159 }; 160 161 162 struct trm_adapter_nvram trm_eepromBuf[TRM_MAX_ADAPTER_NUM]; 163 /* 164 *Fast20: 000 50ns, 20.0 Mbytes/s 165 * 001 75ns, 13.3 Mbytes/s 166 * 010 100ns, 10.0 Mbytes/s 167 * 011 125ns, 8.0 Mbytes/s 168 * 100 150ns, 6.6 Mbytes/s 169 * 101 175ns, 5.7 Mbytes/s 170 * 110 200ns, 5.0 Mbytes/s 171 * 111 250ns, 4.0 Mbytes/s 172 * 173 *Fast40: 000 25ns, 40.0 Mbytes/s 174 * 001 50ns, 20.0 Mbytes/s 175 * 010 75ns, 13.3 Mbytes/s 176 * 011 100ns, 10.0 Mbytes/s 177 * 100 125ns, 8.0 Mbytes/s 178 * 101 150ns, 6.6 Mbytes/s 179 * 110 175ns, 5.7 Mbytes/s 180 * 111 200ns, 5.0 Mbytes/s 181 */ 182 183 /* 184 * real period: 185 */ 186 u_int8_t trm_clock_period[8] = { 187 /* nanosecond divided by 4 */ 188 12, /* 48 ns 20 MB/sec */ 189 18, /* 72 ns 13.3 MB/sec */ 190 25, /* 100 ns 10.0 MB/sec */ 191 31, /* 124 ns 8.0 MB/sec */ 192 37, /* 148 ns 6.6 MB/sec */ 193 43, /* 172 ns 5.7 MB/sec */ 194 50, /* 200 ns 5.0 MB/sec */ 195 62 /* 248 ns 4.0 MB/sec */ 196 }; 197 198 /* 199 * ------------------------------------------------------------ 200 * Function : trm_srb_alloc 201 * Purpose : Get the first free SRB 202 * Inputs : 203 * Return : NULL or a free SCSI Request block 204 * ------------------------------------------------------------ 205 */ 206 void * 207 trm_srb_alloc(void *xsc) 208 { 209 struct trm_softc *sc = xsc; 210 struct trm_scsi_req_q *pSRB; 211 212 mtx_enter(&sc->sc_srb_mtx); 213 pSRB = TAILQ_FIRST(&sc->freeSRB); 214 if (pSRB != NULL) 215 TAILQ_REMOVE(&sc->freeSRB, pSRB, link); 216 mtx_leave(&sc->sc_srb_mtx); 217 218 #ifdef TRM_DEBUG0 219 printf("%s: trm_srb_alloc. pSRB = %p, next pSRB = %p\n", 220 sc->sc_device.dv_xname, pSRB, TAILQ_FIRST(&sc->freeSRB)); 221 #endif 222 223 return pSRB; 224 } 225 226 /* 227 * ------------------------------------------------------------ 228 * Function : trm_RewaitSRB 229 * Purpose : Q back to pending Q 230 * Inputs : struct trm_dcb * - 231 * struct trm_scsi_req_q * - 232 * ------------------------------------------------------------ 233 */ 234 void 235 trm_RewaitSRB(struct trm_softc *sc, struct trm_scsi_req_q *pSRB) 236 { 237 int intflag; 238 239 intflag = splbio(); 240 241 if ((pSRB->SRBFlag & TRM_ON_WAITING_SRB) != 0) { 242 pSRB->SRBFlag &= ~TRM_ON_WAITING_SRB; 243 TAILQ_REMOVE(&sc->waitingSRB, pSRB, link); 244 } 245 246 if ((pSRB->SRBFlag & TRM_ON_GOING_SRB) != 0) { 247 pSRB->SRBFlag &= ~TRM_ON_GOING_SRB; 248 TAILQ_REMOVE(&sc->goingSRB, pSRB, link); 249 } 250 251 pSRB->SRBState = TRM_READY; 252 pSRB->TargetStatus = SCSI_OK; 253 pSRB->AdaptStatus = TRM_STATUS_GOOD; 254 255 pSRB->SRBFlag |= TRM_ON_WAITING_SRB; 256 TAILQ_INSERT_HEAD(&sc->waitingSRB, pSRB, link); 257 258 splx(intflag); 259 } 260 261 /* 262 * ------------------------------------------------------------ 263 * Function : trm_StartWaitingSRB 264 * Purpose : If there is no active DCB then run robin through 265 * the DCB's to find the next waiting SRB 266 * and move it to the going list. 267 * Inputs : struct trm_softc * - 268 * ------------------------------------------------------------ 269 */ 270 void 271 trm_StartWaitingSRB(struct trm_softc *sc) 272 { 273 struct trm_scsi_req_q *pSRB, *next; 274 int intflag; 275 276 intflag = splbio(); 277 278 if ((sc->pActiveDCB != NULL) || 279 (TAILQ_EMPTY(&sc->waitingSRB)) || 280 (sc->sc_Flag & (RESET_DETECT | RESET_DONE | RESET_DEV)) != 0) 281 goto out; 282 283 for (pSRB = TAILQ_FIRST(&sc->waitingSRB); pSRB != NULL; pSRB = next) { 284 next = TAILQ_NEXT(pSRB, link); 285 if (trm_StartSRB(sc, pSRB) == 0) { 286 pSRB->SRBFlag &= ~TRM_ON_WAITING_SRB; 287 TAILQ_REMOVE(&sc->waitingSRB, pSRB, link); 288 pSRB->SRBFlag |= TRM_ON_GOING_SRB; 289 TAILQ_INSERT_TAIL(&sc->goingSRB, pSRB, link); 290 break; 291 } 292 } 293 294 out: 295 splx(intflag); 296 } 297 298 /* 299 * ------------------------------------------------------------ 300 * Function : trm_scsi_cmd 301 * Purpose : enqueues a SCSI command 302 * Inputs : 303 * Call By : GENERIC SCSI driver 304 * ------------------------------------------------------------ 305 */ 306 void 307 trm_scsi_cmd(struct scsi_xfer *xs) 308 { 309 struct trm_scsi_req_q *pSRB; 310 bus_space_handle_t ioh; 311 struct trm_softc *sc; 312 bus_space_tag_t iot; 313 struct trm_dcb *pDCB; 314 u_int8_t target, lun; 315 int i, error, intflag, timeout, xferflags; 316 317 target = xs->sc_link->target; 318 lun = xs->sc_link->lun; 319 320 sc = xs->sc_link->bus->sb_adapter_softc; 321 ioh = sc->sc_iohandle; 322 iot = sc->sc_iotag; 323 324 #ifdef TRM_DEBUG0 325 if ((xs->flags & SCSI_POLL) != 0) { 326 sc_print_addr(xs->sc_link); 327 printf("trm_scsi_cmd. sc = %p, xs = %p, opcode = 0x%02x\n", 328 sc, xs, lun, xs->cmd.opcode); 329 } 330 #endif 331 332 if (target >= TRM_MAX_TARGETS) { 333 sc_print_addr(xs->sc_link); 334 printf("target >= %d\n", TRM_MAX_TARGETS); 335 xs->error = XS_DRIVER_STUFFUP; 336 scsi_done(xs); 337 return; 338 } 339 if (lun >= TRM_MAX_LUNS) { 340 sc_print_addr(xs->sc_link); 341 printf("lun >= %d\n", TRM_MAX_LUNS); 342 xs->error = XS_DRIVER_STUFFUP; 343 scsi_done(xs); 344 return; 345 } 346 347 pDCB = sc->pDCB[target][lun]; 348 if (pDCB == NULL) { 349 /* Removed as a result of INQUIRY proving no device present */ 350 xs->error = XS_DRIVER_STUFFUP; 351 scsi_done(xs); 352 return; 353 } 354 355 xferflags = xs->flags; 356 if (xferflags & SCSI_RESET) { 357 #ifdef TRM_DEBUG0 358 sc_print_addr(xs->sc_link); 359 printf("trm_reset via SCSI_RESET\n"); 360 #endif 361 trm_reset(sc); 362 xs->error = XS_NOERROR; 363 scsi_done(xs); 364 return; 365 } 366 367 pSRB = xs->io; 368 trm_srb_reinit(sc, pSRB); 369 370 xs->error = XS_NOERROR; 371 xs->status = SCSI_OK; 372 xs->resid = 0; 373 374 intflag = splbio(); 375 376 /* 377 * BuildSRB(pSRB,pDCB); 378 */ 379 if (xs->datalen != 0) { 380 #ifdef TRM_DEBUG0 381 sc_print_addr(xs->sc_link); 382 printf("xs->datalen=%x\n", (u_int32_t)&xs->datalen); 383 sc_print_addr(xs->sc_link); 384 printf("sc->sc_dmatag=0x%x\n", (u_int32_t)sc->sc_dmatag); 385 sc_print_addr(xs->sc_link); 386 printf("pSRB->dmamapxfer=0x%x\n", (u_int32_t)pSRB->dmamapxfer); 387 sc_print_addr(xs->sc_link); 388 printf("xs->data=0x%x\n", (u_int32_t)&xs->data); 389 #endif 390 if ((error = bus_dmamap_load(sc->sc_dmatag, pSRB->dmamapxfer, 391 xs->data, xs->datalen, NULL, 392 (xferflags & SCSI_NOSLEEP) ? BUS_DMA_NOWAIT : 393 BUS_DMA_WAITOK)) != 0) { 394 sc_print_addr(xs->sc_link); 395 printf("DMA transfer map unable to load, error = %d\n", 396 error); 397 xs->error = XS_DRIVER_STUFFUP; 398 splx(intflag); 399 scsi_done(xs); 400 return; 401 } 402 403 bus_dmamap_sync(sc->sc_dmatag, pSRB->dmamapxfer, 404 0, pSRB->dmamapxfer->dm_mapsize, 405 (xferflags & SCSI_DATA_IN) ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE); 406 407 /* 408 * Set up the scatter gather list 409 */ 410 for (i = 0; i < pSRB->dmamapxfer->dm_nsegs; i++) { 411 pSRB->SegmentX[i].address = pSRB->dmamapxfer->dm_segs[i].ds_addr; 412 pSRB->SegmentX[i].length = pSRB->dmamapxfer->dm_segs[i].ds_len; 413 } 414 pSRB->SRBTotalXferLength = xs->datalen; 415 pSRB->SRBSGCount = pSRB->dmamapxfer->dm_nsegs; 416 } 417 418 pSRB->pSRBDCB = pDCB; 419 pSRB->xs = xs; 420 pSRB->ScsiCmdLen = xs->cmdlen; 421 422 memcpy(pSRB->CmdBlock, &xs->cmd, xs->cmdlen); 423 424 timeout_set(&xs->stimeout, trm_timeout, pSRB); 425 426 pSRB->SRBFlag |= TRM_ON_WAITING_SRB; 427 TAILQ_INSERT_TAIL(&sc->waitingSRB, pSRB, link); 428 trm_StartWaitingSRB(sc); 429 430 if ((xferflags & SCSI_POLL) == 0) { 431 timeout_add_msec(&xs->stimeout, xs->timeout); 432 splx(intflag); 433 return; 434 } 435 436 splx(intflag); 437 for (timeout = xs->timeout; timeout > 0; timeout--) { 438 intflag = splbio(); 439 trm_Interrupt(sc); 440 splx(intflag); 441 if (ISSET(xs->flags, ITSDONE)) 442 break; 443 DELAY(1000); 444 } 445 446 if (!ISSET(xs->flags, ITSDONE) && timeout == 0) 447 trm_timeout(pSRB); 448 449 scsi_done(xs); 450 } 451 452 /* 453 * ------------------------------------------------------------ 454 * Function : trm_ResetAllDevParam 455 * Purpose : 456 * Inputs : struct trm_softc * 457 * ------------------------------------------------------------ 458 */ 459 void 460 trm_ResetAllDevParam(struct trm_softc *sc) 461 { 462 struct trm_adapter_nvram *pEEpromBuf; 463 int target, quirks; 464 465 pEEpromBuf = &trm_eepromBuf[sc->sc_AdapterUnit]; 466 467 for (target = 0; target < TRM_MAX_TARGETS; target++) { 468 if (target == sc->sc_AdaptSCSIID || sc->pDCB[target][0] == NULL) 469 continue; 470 471 if ((sc->pDCB[target][0]->DCBFlag & TRM_QUIRKS_VALID) == 0) 472 quirks = SDEV_NOWIDE | SDEV_NOSYNC | SDEV_NOTAGS; 473 else if (sc->pDCB[target][0]->sc_link != NULL) 474 quirks = sc->pDCB[target][0]->sc_link->quirks; 475 476 trm_ResetDevParam(sc, sc->pDCB[target][0], quirks); 477 } 478 } 479 480 /* 481 * ------------------------------------------------------------ 482 * Function : trm_ResetDevParam 483 * Purpose : 484 * Inputs : 485 * ------------------------------------------------------------ 486 */ 487 void 488 trm_ResetDevParam(struct trm_softc *sc, struct trm_dcb *pDCB, u_int8_t quirks) 489 { 490 struct trm_adapter_nvram *pEEpromBuf = &trm_eepromBuf[sc->sc_AdapterUnit]; 491 u_int8_t PeriodIndex; 492 const int target = pDCB->target; 493 494 pDCB->DCBFlag &= TRM_QUIRKS_VALID; 495 pDCB->DCBFlag |= (TRM_WIDE_NEGO_ENABLE | TRM_SYNC_NEGO_ENABLE); 496 497 pDCB->SyncPeriod = 0; 498 pDCB->SyncOffset = 0; 499 pDCB->MaxNegoPeriod = 0; 500 501 pDCB->DevMode = pEEpromBuf->NvramTarget[target].NvmTarCfg0; 502 503 pDCB->IdentifyMsg = MSG_IDENTIFY(pDCB->lun, ((pDCB->DevMode & TRM_DISCONNECT) != 0)); 504 505 if (((quirks & SDEV_NOWIDE) == 0) && 506 (pDCB->DevMode & TRM_WIDE) && 507 ((sc->sc_config & HCC_WIDE_CARD) != 0)) 508 pDCB->DCBFlag |= TRM_WIDE_NEGO_16BIT; 509 510 if (((quirks & SDEV_NOSYNC) == 0) && 511 ((pDCB->DevMode & TRM_SYNC) != 0)) { 512 PeriodIndex = pEEpromBuf->NvramTarget[target].NvmTarPeriod & 0x07; 513 pDCB->MaxNegoPeriod = trm_clock_period[PeriodIndex]; 514 } 515 516 if (((quirks & SDEV_NOTAGS) == 0) && 517 ((pDCB->DevMode & TRM_TAG_QUEUING) != 0) && 518 ((pDCB->DevMode & TRM_DISCONNECT) != 0)) 519 /* TODO XXXX: Every device(lun) gets to queue TagMaxNum commands? */ 520 pDCB->DCBFlag |= TRM_USE_TAG_QUEUING; 521 522 trm_SetXferParams(sc, pDCB, 0); 523 } 524 525 /* 526 * ------------------------------------------------------------ 527 * Function : trm_RecoverSRB 528 * Purpose : Moves all SRBs from Going to Waiting for all the Link DCBs 529 * Inputs : struct trm_softc * - 530 * ------------------------------------------------------------ 531 */ 532 void 533 trm_RecoverSRB(struct trm_softc *sc) 534 { 535 struct trm_scsi_req_q *pSRB; 536 537 /* ASSUME we are inside splbio()/splx() */ 538 539 while ((pSRB = TAILQ_FIRST(&sc->goingSRB)) != NULL) { 540 pSRB->SRBFlag &= ~TRM_ON_GOING_SRB; 541 TAILQ_REMOVE(&sc->goingSRB, pSRB, link); 542 pSRB->SRBFlag |= TRM_ON_WAITING_SRB; 543 TAILQ_INSERT_HEAD(&sc->waitingSRB, pSRB, link); 544 } 545 } 546 547 /* 548 * ------------------------------------------------------------ 549 * Function : trm_reset 550 * Purpose : perform a hard reset on the SCSI bus (and TRM_S1040 chip). 551 * Inputs : 552 * ------------------------------------------------------------ 553 */ 554 void 555 trm_reset (struct trm_softc *sc) 556 { 557 const bus_space_handle_t ioh = sc->sc_iohandle; 558 const bus_space_tag_t iot = sc->sc_iotag; 559 int i, intflag; 560 561 intflag = splbio(); 562 563 bus_space_write_1(iot, ioh, TRM_S1040_DMA_INTEN, 0); 564 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_INTEN, 0); 565 566 trm_ResetSCSIBus(sc); 567 for (i = 0; i < 500; i++) 568 DELAY(1000); 569 570 /* 571 * Enable all SCSI interrupts except EN_SCAM 572 */ 573 bus_space_write_1(iot, ioh, 574 TRM_S1040_SCSI_INTEN, 575 (EN_SELECT | EN_SELTIMEOUT | EN_DISCONNECT | EN_RESELECTED | 576 EN_SCSIRESET | EN_BUSSERVICE | EN_CMDDONE)); 577 /* 578 * Enable DMA interrupt 579 */ 580 bus_space_write_1(iot, ioh, TRM_S1040_DMA_INTEN, EN_SCSIINTR); 581 /* 582 * Clear DMA FIFO 583 */ 584 bus_space_write_1(iot, ioh, TRM_S1040_DMA_CONTROL, CLRXFIFO); 585 /* 586 * Clear SCSI FIFO 587 */ 588 bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_CLRFIFO); 589 590 trm_ResetAllDevParam(sc); 591 trm_GoingSRB_Done(sc, NULL); 592 sc->pActiveDCB = NULL; 593 594 /* 595 * RESET_DETECT, RESET_DONE, RESET_DEV 596 */ 597 sc->sc_Flag = 0; 598 trm_StartWaitingSRB(sc); 599 600 splx(intflag); 601 } 602 603 /* 604 * ------------------------------------------------------------ 605 * Function : trm_timeout 606 * Purpose : Prints a timeout message and aborts the timed out SCSI request 607 * Inputs : void * - A struct trm_scsi_req_q * structure pointer 608 * ------------------------------------------------------------ 609 */ 610 void 611 trm_timeout(void *arg1) 612 { 613 struct trm_scsi_req_q *pSRB; 614 struct scsi_xfer *xs; 615 struct trm_softc *sc; 616 617 pSRB = (struct trm_scsi_req_q *)arg1; 618 xs = pSRB->xs; 619 620 if (xs != NULL) { 621 sc = xs->sc_link->bus->sb_adapter_softc; 622 sc_print_addr(xs->sc_link); 623 printf("SCSI OpCode 0x%02x ", xs->cmd.opcode); 624 if (pSRB->SRBFlag & TRM_AUTO_REQSENSE) 625 printf("REQUEST SENSE "); 626 printf("timed out\n"); 627 pSRB->SRBFlag |= TRM_SCSI_TIMED_OUT; 628 trm_FinishSRB(sc, pSRB); 629 #ifdef TRM_DEBUG0 630 sc_print_addr(xs->sc_link); 631 printf("trm_reset via trm_timeout()\n"); 632 #endif 633 trm_reset(sc); 634 trm_StartWaitingSRB(sc); 635 } 636 } 637 638 /* 639 * ------------------------------------------------------------ 640 * Function : trm_StartSRB 641 * Purpose : Send the commands in the SRB to the device 642 * Inputs : struct trm_softc * - 643 * struct trm_scsi_req_q * - 644 * Return : 0 - SCSI processor is unoccupied 645 * 1 - SCSI processor is occupied with an SRB 646 * ------------------------------------------------------------ 647 */ 648 int 649 trm_StartSRB(struct trm_softc *sc, struct trm_scsi_req_q *pSRB) 650 { 651 const bus_space_handle_t ioh = sc->sc_iohandle; 652 const bus_space_tag_t iot = sc->sc_iotag; 653 struct trm_dcb *pDCB = pSRB->pSRBDCB; 654 u_int32_t tag_mask; 655 u_int8_t tag_id, scsicommand; 656 657 #ifdef TRM_DEBUG0 658 printf("%s: trm_StartSRB. sc = %p, pDCB = %p, pSRB = %p\n", 659 sc->sc_device.dv_xname, sc, pDCB, pSRB); 660 #endif 661 /* 662 * If the queue is full or the SCSI processor has a pending interrupt 663 * then try again later. 664 */ 665 if ((pDCB->DCBFlag & TRM_QUEUE_FULL) || (bus_space_read_2(iot, ioh, 666 TRM_S1040_SCSI_STATUS) & SCSIINTERRUPT)) 667 return (1); 668 669 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_HOSTID, sc->sc_AdaptSCSIID); 670 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_TARGETID, pDCB->target); 671 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_SYNC, pDCB->SyncPeriod); 672 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_OFFSET, pDCB->SyncOffset); 673 674 if ((sc->pDCB[pDCB->target][0]->sc_link != NULL) && 675 ((sc->pDCB[pDCB->target][0]->DCBFlag & TRM_QUIRKS_VALID) == 0)) { 676 sc->pDCB[pDCB->target][0]->DCBFlag |= TRM_QUIRKS_VALID; 677 trm_ResetDevParam(sc, sc->pDCB[pDCB->target][0], sc->pDCB[pDCB->target][0]->sc_link->quirks); 678 } 679 680 /* 681 * Flush FIFO 682 */ 683 bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_CLRFIFO); 684 685 sc->MsgCnt = 1; 686 sc->MsgBuf[0] = pDCB->IdentifyMsg; 687 if (((pSRB->xs->flags & SCSI_POLL) != 0) || 688 (pSRB->CmdBlock[0] == INQUIRY) || 689 (pSRB->CmdBlock[0] == REQUEST_SENSE)) 690 sc->MsgBuf[0] &= ~MSG_IDENTIFY_DISCFLAG; 691 692 scsicommand = SCMD_SEL_ATN; 693 694 if ((pDCB->DCBFlag & (TRM_WIDE_NEGO_ENABLE | TRM_SYNC_NEGO_ENABLE)) != 0) { 695 scsicommand = SCMD_SEL_ATNSTOP; 696 pSRB->SRBState = TRM_MSGOUT; 697 698 } else if ((pDCB->DCBFlag & TRM_USE_TAG_QUEUING) == 0) { 699 pDCB->DCBFlag |= TRM_QUEUE_FULL; 700 701 } else if ((sc->MsgBuf[0] & MSG_IDENTIFY_DISCFLAG) != 0) { 702 if (pSRB->TagNumber == TRM_NO_TAG) { 703 for (tag_id=1, tag_mask=2; tag_id < 32; tag_id++, tag_mask <<= 1) 704 if ((tag_mask & pDCB->TagMask) == 0) { 705 pDCB->TagMask |= tag_mask; 706 pSRB->TagNumber = tag_id; 707 break; 708 } 709 710 if (tag_id >= 32) { 711 pDCB->DCBFlag |= TRM_QUEUE_FULL; 712 sc->MsgCnt = 0; 713 return 1; 714 } 715 } 716 717 /* TODO XXXX: Should send ORDERED_Q_TAG if metadata (non-block) i/o!? */ 718 sc->MsgBuf[sc->MsgCnt++] = MSG_SIMPLE_Q_TAG; 719 sc->MsgBuf[sc->MsgCnt++] = pSRB->TagNumber; 720 721 scsicommand = SCMD_SEL_ATN3; 722 } 723 724 pSRB->SRBState = TRM_START; 725 pSRB->ScsiPhase = PH_BUS_FREE; /* SCSI bus free Phase */ 726 sc->pActiveDCB = pDCB; 727 pDCB->pActiveSRB = pSRB; 728 729 if (sc->MsgCnt > 0) { 730 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_FIFO, sc->MsgBuf[0]); 731 if (sc->MsgCnt > 1) { 732 DELAY(30); 733 bus_space_write_multi_1(iot, ioh, TRM_S1040_SCSI_FIFO, &sc->MsgBuf[1], sc->MsgCnt - 1); 734 } 735 sc->MsgCnt = 0; 736 } 737 738 /* 739 * it's important for atn stop 740 */ 741 bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_DATALATCH | DO_HWRESELECT); 742 /* 743 * SCSI command 744 */ 745 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_COMMAND, scsicommand); 746 747 return 0; 748 } 749 750 /* 751 * ------------------------------------------------------------ 752 * Function : trm_Interrupt 753 * Purpose : Catch an interrupt from the adapter 754 * Process pending device interrupts. 755 * Inputs : void * - struct trm_softc * structure pointer 756 * ------------------------------------------------------------ 757 */ 758 int 759 trm_Interrupt(void *vsc) 760 { 761 void (*stateV)(struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *); 762 struct trm_scsi_req_q *pSRB; 763 bus_space_handle_t ioh; 764 struct trm_softc *sc = (struct trm_softc *)vsc; 765 bus_space_tag_t iot; 766 u_int16_t phase; 767 u_int8_t scsi_status, scsi_intstatus; 768 769 if (sc == NULL) 770 return 0; 771 772 ioh = sc->sc_iohandle; 773 iot = sc->sc_iotag; 774 775 scsi_status = bus_space_read_2(iot, ioh, TRM_S1040_SCSI_STATUS); 776 if (!(scsi_status & SCSIINTERRUPT)) 777 return 0; 778 scsi_intstatus = bus_space_read_1(iot, ioh, TRM_S1040_SCSI_INTSTATUS); 779 780 #ifdef TRM_DEBUG0 781 printf("%s: trm_interrupt - scsi_status=0x%02x, scsi_intstatus=0x%02x\n", 782 sc->sc_device.dv_xname, scsi_status, scsi_intstatus); 783 #endif 784 if ((scsi_intstatus & (INT_SELTIMEOUT | INT_DISCONNECT)) != 0) 785 trm_Disconnect(sc); 786 787 else if ((scsi_intstatus & INT_RESELECTED) != 0) 788 trm_Reselect(sc); 789 790 else if ((scsi_intstatus & INT_SCSIRESET) != 0) 791 trm_ScsiRstDetect(sc); 792 793 else if ((sc->pActiveDCB != NULL) && ((scsi_intstatus & (INT_BUSSERVICE | INT_CMDDONE)) != 0)) { 794 pSRB = sc->pActiveDCB->pActiveSRB; 795 /* 796 * software sequential machine 797 */ 798 phase = (u_int16_t) pSRB->ScsiPhase; /* phase: */ 799 /* 800 * 62037 or 62137 801 * call trm_SCSI_phase0[]... "phase entry" 802 * handle every phase before start transfer 803 */ 804 stateV = trm_SCSI_phase0[phase]; 805 stateV(sc, pSRB, &scsi_status); 806 /* 807 * if any exception occurred 808 * scsi_status will be modified to bus free phase 809 * new scsi_status transfer out from previous stateV 810 */ 811 /* 812 * phase:0,1,2,3,4,5,6,7 813 */ 814 pSRB->ScsiPhase = scsi_status & PHASEMASK; 815 phase = (u_int16_t) scsi_status & PHASEMASK; 816 /* 817 * call trm_SCSI_phase1[]... "phase entry" 818 * handle every phase do transfer 819 */ 820 stateV = trm_SCSI_phase1[phase]; 821 stateV(sc, pSRB, &scsi_status); 822 823 } else { 824 return 0; 825 } 826 827 return 1; 828 } 829 830 /* 831 * ------------------------------------------------------------ 832 * Function : trm_MsgOutPhase0 833 * Purpose : Check the state machine before sending a message out 834 * Inputs : struct trm_softc * - 835 * struct trm_scsi_req_q * - 836 * u_int8_t * - scsi status, set to PH_BUS_FREE if not ready 837 * ------------------------------------------------------------ 838 */ 839 void 840 trm_MsgOutPhase0(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int8_t *pscsi_status) 841 { 842 switch (pSRB->SRBState) { 843 case TRM_UNEXPECT_RESEL: 844 case TRM_ABORT_SENT: 845 *pscsi_status = PH_BUS_FREE; /* initial phase */ 846 break; 847 848 default: 849 break; 850 } 851 } 852 853 /* 854 * ------------------------------------------------------------ 855 * Function : trm_MsgOutPhase1 856 * Purpose : Write the message out to the bus 857 * Inputs : struct trm_softc * - 858 * struct trm_scsi_req_q * - 859 * u_int8_t * - unused 860 * ------------------------------------------------------------ 861 */ 862 void 863 trm_MsgOutPhase1(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int8_t *pscsi_status) 864 { 865 const bus_space_handle_t ioh = sc->sc_iohandle; 866 const bus_space_tag_t iot = sc->sc_iotag; 867 struct trm_dcb *pDCB = sc->pActiveDCB; 868 869 bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_CLRFIFO); 870 871 if ((pDCB->DCBFlag & TRM_WIDE_NEGO_ENABLE) != 0) { 872 /* 873 * WIDE DATA TRANSFER REQUEST code (03h) 874 */ 875 pDCB->DCBFlag &= ~TRM_WIDE_NEGO_ENABLE; 876 pDCB->DCBFlag |= TRM_DOING_WIDE_NEGO; 877 878 sc->MsgBuf[0] = pDCB->IdentifyMsg & ~MSG_IDENTIFY_DISCFLAG; 879 sc->MsgBuf[1] = MSG_EXTENDED; 880 sc->MsgBuf[2] = MSG_EXT_WDTR_LEN; 881 sc->MsgBuf[3] = MSG_EXT_WDTR; 882 883 if ((pDCB->DCBFlag & TRM_WIDE_NEGO_16BIT) == 0) 884 sc->MsgBuf[4] = MSG_EXT_WDTR_BUS_8_BIT; 885 else 886 sc->MsgBuf[4] = MSG_EXT_WDTR_BUS_16_BIT; 887 888 sc->MsgCnt = 5; 889 890 } else if ((pDCB->DCBFlag & TRM_SYNC_NEGO_ENABLE) != 0) { 891 892 pDCB->DCBFlag &= ~TRM_SYNC_NEGO_ENABLE; 893 pDCB->DCBFlag |= TRM_DOING_SYNC_NEGO; 894 895 sc->MsgCnt = 0; 896 897 if ((pDCB->DCBFlag & TRM_WIDE_NEGO_DONE) == 0) 898 sc->MsgBuf[sc->MsgCnt++] = pDCB->IdentifyMsg & ~MSG_IDENTIFY_DISCFLAG; 899 900 sc->MsgBuf[sc->MsgCnt++] = MSG_EXTENDED; 901 sc->MsgBuf[sc->MsgCnt++] = MSG_EXT_SDTR_LEN; 902 sc->MsgBuf[sc->MsgCnt++] = MSG_EXT_SDTR; 903 sc->MsgBuf[sc->MsgCnt++] = pDCB->MaxNegoPeriod; 904 905 if (pDCB->MaxNegoPeriod > 0) 906 sc->MsgBuf[sc->MsgCnt++] = TRM_MAX_SYNC_OFFSET; 907 else 908 sc->MsgBuf[sc->MsgCnt++] = 0; 909 } 910 911 if (sc->MsgCnt > 0) { 912 bus_space_write_multi_1(iot, ioh, TRM_S1040_SCSI_FIFO, &sc->MsgBuf[0], sc->MsgCnt); 913 if (sc->MsgBuf[0] == MSG_ABORT) 914 pSRB->SRBState = TRM_ABORT_SENT; 915 sc->MsgCnt = 0; 916 } 917 /* 918 * it's important for atn stop 919 */ 920 bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); 921 /* 922 * Transfer information out 923 */ 924 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_COMMAND, SCMD_FIFO_OUT); 925 } 926 927 /* 928 * ------------------------------------------------------------ 929 * Function : trm_CommandPhase1 930 * Purpose : Send commands to bus 931 * Inputs : 932 * ------------------------------------------------------------ 933 */ 934 void 935 trm_CommandPhase1(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int8_t *pscsi_status) 936 { 937 const bus_space_handle_t ioh = sc->sc_iohandle; 938 const bus_space_tag_t iot = sc->sc_iotag; 939 940 bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_CLRATN | DO_CLRFIFO); 941 942 bus_space_write_multi_1(iot, ioh, TRM_S1040_SCSI_FIFO, &pSRB->CmdBlock[0], pSRB->ScsiCmdLen); 943 944 pSRB->SRBState = TRM_COMMAND; 945 /* 946 * it's important for atn stop 947 */ 948 bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); 949 /* 950 * Transfer information out 951 */ 952 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_COMMAND, SCMD_FIFO_OUT); 953 } 954 955 /* 956 * ------------------------------------------------------------ 957 * Function : trm_DataOutPhase0 958 * Purpose : Ready for Data Out, clear FIFO 959 * Inputs : u_int8_t * - SCSI status, used but not set 960 * ------------------------------------------------------------ 961 */ 962 void 963 trm_DataOutPhase0(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int8_t *pscsi_status) 964 { 965 const bus_space_handle_t ioh = sc->sc_iohandle; 966 const bus_space_tag_t iot = sc->sc_iotag; 967 struct SGentry *pseg; 968 struct trm_dcb *pDCB; 969 u_int32_t dLeftCounter, TempSRBXferredLength; 970 u_int16_t scsi_status; 971 u_int8_t TempDMAstatus, SGIndexTemp; 972 973 dLeftCounter = 0; 974 975 pDCB = pSRB->pSRBDCB; 976 scsi_status = *pscsi_status; 977 978 if (pSRB->SRBState != TRM_XFERPAD) { 979 if ((scsi_status & PARITYERROR) != 0) 980 pSRB->SRBFlag |= TRM_PARITY_ERROR; 981 if ((scsi_status & SCSIXFERDONE) == 0) { 982 /* 983 * when data transfer from DMA FIFO to SCSI FIFO 984 * if there was some data left in SCSI FIFO 985 */ 986 dLeftCounter = (u_int32_t)(bus_space_read_1( 987 iot, ioh, TRM_S1040_SCSI_FIFOCNT) & 0x1F); 988 if (pDCB->SyncPeriod & WIDE_SYNC) { 989 /* 990 * if WIDE scsi SCSI FIFOCNT unit is word 991 * so need to * 2 992 */ 993 dLeftCounter <<= 1; 994 } 995 } 996 /* 997 * calculate all the residue data that not yet transferred 998 * SCSI transfer counter + left in SCSI FIFO data 999 * 1000 * .....TRM_S1040_SCSI_COUNTER (24bits) 1001 * The counter always decrement by one for every SCSI byte 1002 * transfer. 1003 * .....TRM_S1040_SCSI_FIFOCNT ( 5bits) 1004 * The counter is SCSI FIFO offset counter 1005 */ 1006 dLeftCounter += bus_space_read_4(iot, ioh, 1007 TRM_S1040_SCSI_COUNTER); 1008 if (dLeftCounter == 1) { 1009 dLeftCounter = 0; 1010 bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, 1011 DO_CLRFIFO); 1012 } 1013 if (dLeftCounter == 0 || 1014 (scsi_status & SCSIXFERCNT_2_ZERO) != 0) { 1015 TempDMAstatus = bus_space_read_1(iot, 1016 ioh, TRM_S1040_DMA_STATUS); 1017 while ((TempDMAstatus & DMAXFERCOMP) == 0) { 1018 TempDMAstatus = bus_space_read_1(iot, 1019 ioh, TRM_S1040_DMA_STATUS); 1020 } 1021 pSRB->SRBTotalXferLength = 0; 1022 } else { 1023 /* 1024 * Update SG list 1025 */ 1026 /* 1027 * if transfer not yet complete 1028 * there were some data residue in SCSI FIFO or 1029 * SCSI transfer counter not empty 1030 */ 1031 if (pSRB->SRBTotalXferLength != dLeftCounter) { 1032 /* 1033 * data that had transferred length 1034 */ 1035 TempSRBXferredLength = pSRB->SRBTotalXferLength 1036 - dLeftCounter; 1037 /* 1038 * next time to be transferred length 1039 */ 1040 pSRB->SRBTotalXferLength = dLeftCounter; 1041 /* 1042 * parsing from last time disconnect SRBSGIndex 1043 */ 1044 pseg = &pSRB->SegmentX[pSRB->SRBSGIndex]; 1045 for (SGIndexTemp = pSRB->SRBSGIndex; 1046 SGIndexTemp < pSRB->SRBSGCount; 1047 SGIndexTemp++) { 1048 /* 1049 * find last time which SG transfer be 1050 * disconnect 1051 */ 1052 if (TempSRBXferredLength >= pseg->length) 1053 TempSRBXferredLength -= pseg->length; 1054 else { 1055 /* 1056 * update last time disconnected 1057 * SG list 1058 */ 1059 /* 1060 * residue data length 1061 */ 1062 pseg->length -= 1063 TempSRBXferredLength; 1064 /* 1065 * residue data pointer 1066 */ 1067 pseg->address += 1068 TempSRBXferredLength; 1069 pSRB->SRBSGIndex = SGIndexTemp; 1070 break; 1071 } 1072 pseg++; 1073 } 1074 } 1075 } 1076 } 1077 bus_space_write_1(iot, ioh, TRM_S1040_DMA_CONTROL, STOPDMAXFER); 1078 } 1079 1080 /* 1081 * ------------------------------------------------------------ 1082 * Function : trm_DataOutPhase1 1083 * Purpose : Transfers data out, calls trm_DataIO_transfer 1084 * Inputs : 1085 * ------------------------------------------------------------ 1086 */ 1087 void 1088 trm_DataOutPhase1(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int8_t *pscsi_status) 1089 { 1090 trm_DataIO_transfer(sc, pSRB, XFERDATAOUT); 1091 } 1092 1093 /* 1094 * ------------------------------------------------------------ 1095 * Function : trm_DataInPhase0 1096 * Purpose : Prepare for reading data in from bus 1097 * Inputs : 1098 * ------------------------------------------------------------ 1099 */ 1100 void 1101 trm_DataInPhase0(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int8_t *pscsi_status) 1102 { 1103 const bus_space_handle_t ioh = sc->sc_iohandle; 1104 const bus_space_tag_t iot = sc->sc_iotag; 1105 struct SGentry *pseg; 1106 u_int32_t TempSRBXferredLength, dLeftCounter; 1107 u_int16_t scsi_status; 1108 u_int8_t SGIndexTemp; 1109 1110 dLeftCounter = 0; 1111 1112 scsi_status = *pscsi_status; 1113 if (pSRB->SRBState != TRM_XFERPAD) { 1114 if ((scsi_status & PARITYERROR) != 0) 1115 pSRB->SRBFlag |= TRM_PARITY_ERROR; 1116 dLeftCounter += bus_space_read_4(iot, ioh, 1117 TRM_S1040_SCSI_COUNTER); 1118 if (dLeftCounter == 0 || 1119 (scsi_status & SCSIXFERCNT_2_ZERO) != 0) { 1120 while ((bus_space_read_1(iot, ioh, TRM_S1040_DMA_STATUS) & DMAXFERCOMP) == 0) 1121 ; 1122 pSRB->SRBTotalXferLength = 0; 1123 } else { 1124 /* 1125 * phase changed 1126 * 1127 * parsing the case: 1128 * when a transfer not yet complete 1129 * but be disconnected by uper layer 1130 * if transfer not yet complete 1131 * there were some data residue in SCSI FIFO or 1132 * SCSI transfer counter not empty 1133 */ 1134 if (pSRB->SRBTotalXferLength != dLeftCounter) { 1135 /* 1136 * data that had transferred length 1137 */ 1138 TempSRBXferredLength = pSRB->SRBTotalXferLength 1139 - dLeftCounter; 1140 /* 1141 * next time to be transferred length 1142 */ 1143 pSRB->SRBTotalXferLength = dLeftCounter; 1144 /* 1145 * parsing from last time disconnect SRBSGIndex 1146 */ 1147 pseg = &pSRB->SegmentX[pSRB->SRBSGIndex]; 1148 for (SGIndexTemp = pSRB->SRBSGIndex; 1149 SGIndexTemp < pSRB->SRBSGCount; 1150 SGIndexTemp++) { 1151 /* 1152 * find last time which SG transfer be 1153 * disconnect 1154 */ 1155 if (TempSRBXferredLength >= 1156 pseg->length) { 1157 TempSRBXferredLength -= pseg->length; 1158 } else { 1159 /* 1160 * update last time disconnected 1161 * SG list 1162 * 1163 * residue data length 1164 */ 1165 pseg->length -= TempSRBXferredLength; 1166 /* 1167 * residue data pointer 1168 */ 1169 pseg->address += TempSRBXferredLength; 1170 pSRB->SRBSGIndex = SGIndexTemp; 1171 break; 1172 } 1173 pseg++; 1174 } 1175 } 1176 } 1177 } 1178 } 1179 1180 /* 1181 * ------------------------------------------------------------ 1182 * Function : trm_DataInPhase1 1183 * Purpose : Transfer data in from bus, calls trm_DataIO_transfer 1184 * Inputs : 1185 * ------------------------------------------------------------ 1186 */ 1187 void 1188 trm_DataInPhase1(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int8_t *pscsi_status) 1189 { 1190 trm_DataIO_transfer(sc, pSRB, XFERDATAIN); 1191 } 1192 1193 /* 1194 * ------------------------------------------------------------ 1195 * Function : trm_DataIO_transfer 1196 * Purpose : 1197 * Inputs : 1198 * ------------------------------------------------------------ 1199 */ 1200 void 1201 trm_DataIO_transfer(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int16_t ioDir) 1202 { 1203 const bus_space_handle_t ioh = sc->sc_iohandle; 1204 const bus_space_tag_t iot = sc->sc_iotag; 1205 struct trm_dcb *pDCB = pSRB->pSRBDCB; 1206 u_int8_t bval; 1207 1208 if (pSRB->SRBSGIndex < pSRB->SRBSGCount) { 1209 if (pSRB->SRBTotalXferLength != 0) { 1210 /* 1211 * load what physical address of Scatter/Gather list 1212 * table want to be transfer 1213 */ 1214 pSRB->SRBState = TRM_DATA_XFER; 1215 bus_space_write_4(iot, ioh, TRM_S1040_DMA_XHIGHADDR, 0); 1216 bus_space_write_4(iot, ioh, 1217 TRM_S1040_DMA_XLOWADDR, (pSRB->SRBSGPhyAddr + 1218 ((u_int32_t)pSRB->SRBSGIndex << 3))); 1219 /* 1220 * load how many bytes in the Scatter/Gather list table 1221 */ 1222 bus_space_write_4(iot, ioh, TRM_S1040_DMA_XCNT, 1223 ((u_int32_t)(pSRB->SRBSGCount - 1224 pSRB->SRBSGIndex) << 3)); 1225 /* 1226 * load total transfer length (24bits, 1227 * pSRB->SRBTotalXferLength) max value 16Mbyte 1228 */ 1229 bus_space_write_4(iot, ioh, 1230 TRM_S1040_SCSI_COUNTER, pSRB->SRBTotalXferLength); 1231 /* 1232 * Start DMA transfer 1233 */ 1234 bus_space_write_2(iot,ioh,TRM_S1040_DMA_COMMAND, ioDir); 1235 /* bus_space_write_2(iot, ioh, 1236 TRM_S1040_DMA_CONTROL, STARTDMAXFER);*/ 1237 /* 1238 * Set the transfer bus and direction 1239 */ 1240 bval = ioDir == XFERDATAOUT ? SCMD_DMA_OUT :SCMD_DMA_IN; 1241 } else { 1242 /* 1243 * xfer pad 1244 */ 1245 if (pSRB->SRBSGCount) 1246 pSRB->AdaptStatus = TRM_OVER_UNDER_RUN; 1247 1248 if (pDCB->SyncPeriod & WIDE_SYNC) { 1249 bus_space_write_4(iot, ioh, 1250 TRM_S1040_SCSI_COUNTER, 2); 1251 } else { 1252 bus_space_write_4(iot, ioh, 1253 TRM_S1040_SCSI_COUNTER, 1); 1254 } 1255 1256 if (ioDir == XFERDATAOUT) { 1257 bus_space_write_2(iot, 1258 ioh, TRM_S1040_SCSI_FIFO, 0); 1259 } else { 1260 bus_space_read_2(iot, 1261 ioh, TRM_S1040_SCSI_FIFO); 1262 } 1263 pSRB->SRBState = TRM_XFERPAD; 1264 /* 1265 * Set the transfer bus and direction 1266 */ 1267 bval = ioDir == XFERDATAOUT ? SCMD_FIFO_OUT : SCMD_FIFO_IN; 1268 } 1269 /* 1270 * it's important for atn stop 1271 */ 1272 bus_space_write_2(iot,ioh,TRM_S1040_SCSI_CONTROL, DO_DATALATCH); 1273 /* 1274 * Tell the bus to do the transfer 1275 */ 1276 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_COMMAND, bval); 1277 } 1278 } 1279 1280 /* 1281 * ------------------------------------------------------------ 1282 * Function : trm_StatusPhase0 1283 * Purpose : Update Target Status with data from SCSI FIFO 1284 * Inputs : u_int8_t * - Set to PH_BUS_FREE 1285 * ------------------------------------------------------------ 1286 */ 1287 void 1288 trm_StatusPhase0(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int8_t *pscsi_status) 1289 { 1290 const bus_space_handle_t ioh = sc->sc_iohandle; 1291 const bus_space_tag_t iot = sc->sc_iotag; 1292 1293 pSRB->TargetStatus = bus_space_read_1(iot, ioh, TRM_S1040_SCSI_FIFO); 1294 1295 pSRB->SRBState = TRM_COMPLETED; 1296 /* 1297 * initial phase 1298 */ 1299 *pscsi_status = PH_BUS_FREE; 1300 /* 1301 * it's important for atn stop 1302 */ 1303 bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); 1304 /* 1305 * Tell bus that the message was accepted 1306 */ 1307 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_COMMAND, SCMD_MSGACCEPT); 1308 } 1309 1310 /* 1311 * ------------------------------------------------------------ 1312 * Function : trm_StatusPhase1 1313 * Purpose : Clear FIFO of DMA and SCSI 1314 * Inputs : 1315 * ------------------------------------------------------------ 1316 */ 1317 void 1318 trm_StatusPhase1(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int8_t *pscsi_status) 1319 { 1320 const bus_space_handle_t ioh = sc->sc_iohandle; 1321 const bus_space_tag_t iot = sc->sc_iotag; 1322 1323 if ((bus_space_read_2(iot, ioh, TRM_S1040_DMA_COMMAND) & 0x0001) != 0) { 1324 if ((bus_space_read_1(iot, ioh, TRM_S1040_SCSI_FIFOCNT) & 0x40) 1325 == 0) { 1326 bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, 1327 DO_CLRFIFO); 1328 } 1329 if ((bus_space_read_2(iot, ioh, 1330 TRM_S1040_DMA_FIFOCNT) & 0x8000) == 0) { 1331 bus_space_write_1(iot, ioh, 1332 TRM_S1040_DMA_CONTROL, CLRXFIFO); 1333 } 1334 } else { 1335 if ((bus_space_read_2(iot, ioh, 1336 TRM_S1040_DMA_FIFOCNT) & 0x8000) == 0) { 1337 bus_space_write_1(iot, ioh, 1338 TRM_S1040_DMA_CONTROL, CLRXFIFO); 1339 } 1340 if ((bus_space_read_1(iot, ioh, 1341 TRM_S1040_SCSI_FIFOCNT) & 0x40) == 0) { 1342 bus_space_write_2(iot, ioh, 1343 TRM_S1040_SCSI_CONTROL, DO_CLRFIFO); 1344 } 1345 } 1346 pSRB->SRBState = TRM_STATUS; 1347 /* 1348 * it's important for atn stop 1349 */ 1350 bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); 1351 /* 1352 * Tell the bus that the command is complete 1353 */ 1354 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_COMMAND, SCMD_COMP); 1355 } 1356 1357 /* 1358 * ------------------------------------------------------------ 1359 * Function : trm_MsgInPhase0 1360 * Purpose : 1361 * Inputs : 1362 * 1363 * extended message codes: 1364 * code description 1365 * ---- ----------- 1366 * 02h Reserved 1367 * 00h MODIFY DATA POINTER 1368 * 01h SYNCHRONOUS DATA TRANSFER REQUEST 1369 * 03h WIDE DATA TRANSFER REQUEST 1370 * 04h - 7Fh Reserved 1371 * 80h - FFh Vendor specific 1372 * 1373 * ------------------------------------------------------------ 1374 */ 1375 void 1376 trm_MsgInPhase0(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int8_t *pscsi_status) 1377 { 1378 const bus_space_handle_t ioh = sc->sc_iohandle; 1379 const bus_space_tag_t iot = sc->sc_iotag; 1380 struct trm_dcb *pDCB; 1381 u_int8_t message_in_code, bIndex, message_in_tag_id; 1382 1383 pDCB = sc->pActiveDCB; 1384 1385 message_in_code = bus_space_read_1(iot, ioh, TRM_S1040_SCSI_FIFO); 1386 1387 if (pSRB->SRBState != TRM_EXTEND_MSGIN) { 1388 switch (message_in_code) { 1389 case MSG_DISCONNECT: 1390 pSRB->SRBState = TRM_DISCONNECTED; 1391 break; 1392 1393 case MSG_EXTENDED: 1394 case MSG_SIMPLE_Q_TAG: 1395 case MSG_HEAD_OF_Q_TAG: 1396 case MSG_ORDERED_Q_TAG: 1397 pSRB->SRBState = TRM_EXTEND_MSGIN; 1398 /* 1399 * extended message (01h) 1400 */ 1401 bzero(&sc->MsgBuf[0], sizeof(sc->MsgBuf)); 1402 sc->MsgBuf[0] = message_in_code; 1403 sc->MsgCnt = 1; 1404 /* 1405 * extended message length (n) 1406 */ 1407 break; 1408 1409 case MSG_MESSAGE_REJECT: 1410 /* 1411 * Reject message 1412 */ 1413 if ((pDCB->DCBFlag & TRM_DOING_WIDE_NEGO) != 0) { 1414 /* 1415 * do wide nego reject 1416 */ 1417 pDCB = pSRB->pSRBDCB; 1418 1419 pDCB->DCBFlag &= ~TRM_DOING_WIDE_NEGO; 1420 pDCB->DCBFlag |= TRM_WIDE_NEGO_DONE; 1421 1422 if ((pDCB->DCBFlag & TRM_SYNC_NEGO_ENABLE) != 0) { 1423 /* 1424 * Set ATN, in case ATN was clear 1425 */ 1426 pSRB->SRBState = TRM_MSGOUT; 1427 bus_space_write_2(iot, ioh, 1428 TRM_S1040_SCSI_CONTROL, DO_SETATN); 1429 } else { 1430 /* 1431 * Clear ATN 1432 */ 1433 bus_space_write_2(iot, ioh, 1434 TRM_S1040_SCSI_CONTROL, DO_CLRATN); 1435 } 1436 1437 } else if ((pDCB->DCBFlag & TRM_DOING_SYNC_NEGO) != 0) { 1438 /* 1439 * do sync nego reject 1440 */ 1441 pDCB = pSRB->pSRBDCB; 1442 1443 pDCB->DCBFlag &= ~TRM_DOING_SYNC_NEGO; 1444 1445 pDCB->SyncPeriod = 0; 1446 pDCB->SyncOffset = 0; 1447 1448 bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_CLRATN); 1449 goto re_prog; 1450 } 1451 break; 1452 1453 case MSG_IGN_WIDE_RESIDUE: 1454 bus_space_write_4(iot, ioh, TRM_S1040_SCSI_COUNTER, 1); 1455 bus_space_read_1(iot, ioh, TRM_S1040_SCSI_FIFO); 1456 break; 1457 1458 default: 1459 break; 1460 } 1461 1462 } else { 1463 1464 /* 1465 * We are collecting an extended message. Save the latest byte and then 1466 * check to see if the message is complete. If so, process it. 1467 */ 1468 sc->MsgBuf[sc->MsgCnt++] = message_in_code; 1469 #ifdef TRM_DEBUG0 1470 printf("%s: sc->MsgBuf = 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", 1471 sc->sc_device.dv_xname, 1472 sc->MsgBuf[0], sc->MsgBuf[1], sc->MsgBuf[2], sc->MsgBuf[3], sc->MsgBuf[4], sc->MsgBuf[5] ); 1473 #endif 1474 switch (sc->MsgBuf[0]) { 1475 case MSG_SIMPLE_Q_TAG: 1476 case MSG_HEAD_OF_Q_TAG: 1477 case MSG_ORDERED_Q_TAG: 1478 if (sc->MsgCnt == 2) { 1479 pSRB->SRBState = TRM_FREE; 1480 message_in_tag_id = sc->MsgBuf[1]; 1481 sc->MsgCnt = 0; 1482 TAILQ_FOREACH(pSRB, &sc->goingSRB, link) { 1483 if ((pSRB->pSRBDCB == pDCB) && (pSRB->TagNumber == message_in_tag_id)) 1484 break; 1485 } 1486 if ((pSRB != NULL) && (pSRB->SRBState == TRM_DISCONNECTED)) { 1487 pDCB->pActiveSRB = pSRB; 1488 pSRB->SRBState = TRM_DATA_XFER; 1489 } else { 1490 #ifdef TRM_DEBUG0 1491 printf("%s: TRM_UNEXPECT_RESEL!\n", 1492 sc->sc_device.dv_xname); 1493 #endif 1494 pSRB = &sc->SRB[0]; 1495 trm_srb_reinit(sc, pSRB); 1496 pSRB->SRBState = TRM_UNEXPECT_RESEL; 1497 pDCB->pActiveSRB = pSRB; 1498 trm_EnableMsgOut(sc, MSG_ABORT_TAG); 1499 } 1500 } 1501 break; 1502 1503 case MSG_EXTENDED: 1504 /* TODO XXXX: Correctly handling target initiated negotiations? */ 1505 if ((sc->MsgBuf[2] == MSG_EXT_WDTR) && (sc->MsgCnt == 4)) { 1506 /* 1507 * ====================================== 1508 * WIDE DATA TRANSFER REQUEST 1509 * ====================================== 1510 * byte 0 : Extended message (01h) 1511 * byte 1 : Extended message length (02h) 1512 * byte 2 : WIDE DATA TRANSFER code (03h) 1513 * byte 3 : Transfer width exponent 1514 */ 1515 1516 pSRB->SRBState = TRM_FREE; 1517 pDCB->DCBFlag &= ~(TRM_WIDE_NEGO_ENABLE | TRM_DOING_WIDE_NEGO); 1518 1519 if (sc->MsgBuf[1] != MSG_EXT_WDTR_LEN) 1520 goto reject_offer; 1521 1522 switch (sc->MsgBuf[3]) { 1523 case MSG_EXT_WDTR_BUS_32_BIT: 1524 if ((pDCB->DCBFlag & TRM_WIDE_NEGO_16BIT) == 0) 1525 sc->MsgBuf[3] = MSG_EXT_WDTR_BUS_8_BIT; 1526 else 1527 sc->MsgBuf[3] = MSG_EXT_WDTR_BUS_16_BIT; 1528 break; 1529 1530 case MSG_EXT_WDTR_BUS_16_BIT: 1531 if ((pDCB->DCBFlag & TRM_WIDE_NEGO_16BIT) == 0) { 1532 sc->MsgBuf[3] = MSG_EXT_WDTR_BUS_8_BIT; 1533 break; 1534 } 1535 pDCB->SyncPeriod |= WIDE_SYNC; 1536 /* FALL THROUGH == ACCEPT OFFER */ 1537 1538 case MSG_EXT_WDTR_BUS_8_BIT: 1539 pSRB->SRBState = TRM_MSGOUT; 1540 pDCB->DCBFlag |= (TRM_SYNC_NEGO_ENABLE | TRM_WIDE_NEGO_DONE); 1541 1542 if (pDCB->MaxNegoPeriod == 0) { 1543 pDCB->SyncPeriod = 0; 1544 pDCB->SyncOffset = 0; 1545 goto re_prog; 1546 } 1547 break; 1548 1549 default: 1550 pDCB->DCBFlag &= ~TRM_WIDE_NEGO_ENABLE; 1551 pDCB->DCBFlag |= TRM_WIDE_NEGO_DONE; 1552 reject_offer: 1553 sc->MsgCnt = 1; 1554 sc->MsgBuf[0] = MSG_MESSAGE_REJECT; 1555 break; 1556 } 1557 1558 /* Echo accepted offer, or send revised offer */ 1559 bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_SETATN); 1560 1561 } else if ((sc->MsgBuf[2] == MSG_EXT_SDTR) && (sc->MsgCnt == 5)) { 1562 /* 1563 * ================================= 1564 * SYNCHRONOUS DATA TRANSFER REQUEST 1565 * ================================= 1566 * byte 0 : Extended message (01h) 1567 * byte 1 : Extended message length (03) 1568 * byte 2 : SYNCHRONOUS DATA TRANSFER code (01h) 1569 * byte 3 : Transfer period factor 1570 * byte 4 : REQ/ACK offset 1571 */ 1572 1573 pSRB->SRBState = TRM_FREE; 1574 pDCB->DCBFlag &= ~(TRM_SYNC_NEGO_ENABLE | TRM_DOING_SYNC_NEGO); 1575 1576 if (sc->MsgBuf[1] != MSG_EXT_SDTR_LEN) 1577 goto reject_offer; 1578 1579 if ((sc->MsgBuf[3] == 0) || (sc->MsgBuf[4] == 0)) { 1580 /* 1581 * Asynchronous transfers 1582 */ 1583 pDCB->SyncPeriod = 0; 1584 pDCB->SyncOffset = 0; 1585 1586 } else { 1587 /* 1588 * Synchronous transfers 1589 */ 1590 /* 1591 * REQ/ACK offset 1592 */ 1593 pDCB->SyncOffset = sc->MsgBuf[4]; 1594 1595 for (bIndex = 0; bIndex < 7; bIndex++) 1596 if (sc->MsgBuf[3] <= trm_clock_period[bIndex]) 1597 break; 1598 1599 pDCB->SyncPeriod |= (bIndex | ALT_SYNC); 1600 } 1601 1602 re_prog: /* 1603 * program SCSI control register 1604 */ 1605 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_SYNC, pDCB->SyncPeriod); 1606 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_OFFSET, pDCB->SyncOffset); 1607 1608 trm_SetXferParams(sc, pDCB, (pDCB->DCBFlag & TRM_QUIRKS_VALID)); 1609 } 1610 break; 1611 1612 default: 1613 break; 1614 } 1615 } 1616 1617 /* 1618 * initial phase 1619 */ 1620 *pscsi_status = PH_BUS_FREE; 1621 /* 1622 * it's important for atn stop 1623 */ 1624 bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); 1625 /* 1626 * Tell bus that the message was accepted 1627 */ 1628 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_COMMAND, SCMD_MSGACCEPT); 1629 } 1630 1631 /* 1632 * ------------------------------------------------------------ 1633 * Function : trm_MsgInPhase1 1634 * Purpose : Clear the FIFO 1635 * Inputs : 1636 * ------------------------------------------------------------ 1637 */ 1638 void 1639 trm_MsgInPhase1(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int8_t *pscsi_status) 1640 { 1641 const bus_space_handle_t ioh = sc->sc_iohandle; 1642 const bus_space_tag_t iot = sc->sc_iotag; 1643 1644 bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_CLRFIFO); 1645 bus_space_write_4(iot, ioh, TRM_S1040_SCSI_COUNTER, 1); 1646 1647 /* 1648 * it's important for atn stop 1649 */ 1650 bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); 1651 /* 1652 * SCSI command 1653 */ 1654 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_COMMAND, SCMD_FIFO_IN); 1655 } 1656 1657 /* 1658 * ------------------------------------------------------------ 1659 * Function : trm_Nop 1660 * Purpose : EMPTY 1661 * Inputs : 1662 * ------------------------------------------------------------ 1663 */ 1664 void 1665 trm_Nop(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int8_t *pscsi_status) 1666 { 1667 } 1668 1669 /* 1670 * ------------------------------------------------------------ 1671 * Function : trm_SetXferParams 1672 * Purpose : Set the Sync period, offset and mode for each device that has 1673 * the same target as the given one (struct trm_dcb *) 1674 * Inputs : 1675 * ------------------------------------------------------------ 1676 */ 1677 void 1678 trm_SetXferParams(struct trm_softc *sc, struct trm_dcb *pDCB, int print_info) 1679 { 1680 struct trm_dcb *pDCBTemp; 1681 int lun, target; 1682 1683 /* 1684 * set all lun device's period, offset 1685 */ 1686 #ifdef TRM_DEBUG0 1687 printf("%s: trm_SetXferParams\n", sc->sc_device.dv_xname); 1688 #endif 1689 1690 target = pDCB->target; 1691 for(lun = 0; lun < TRM_MAX_LUNS; lun++) { 1692 pDCBTemp = sc->pDCB[target][lun]; 1693 if (pDCBTemp != NULL) { 1694 pDCBTemp->DevMode = pDCB->DevMode; 1695 pDCBTemp->MaxNegoPeriod = pDCB->MaxNegoPeriod; 1696 pDCBTemp->SyncPeriod = pDCB->SyncPeriod; 1697 pDCBTemp->SyncOffset = pDCB->SyncOffset; 1698 pDCBTemp->DCBFlag = pDCB->DCBFlag; 1699 } 1700 } 1701 1702 if (print_info) 1703 trm_print_info(sc, pDCB); 1704 } 1705 1706 /* 1707 * ------------------------------------------------------------ 1708 * Function : trm_Disconnect 1709 * Purpose : 1710 * Inputs : 1711 * 1712 * ---SCSI bus phase 1713 * PH_DATA_OUT 0x00 Data out phase 1714 * PH_DATA_IN 0x01 Data in phase 1715 * PH_COMMAND 0x02 Command phase 1716 * PH_STATUS 0x03 Status phase 1717 * PH_BUS_FREE 0x04 Invalid phase used as bus free 1718 * PH_BUS_FREE 0x05 Invalid phase used as bus free 1719 * PH_MSG_OUT 0x06 Message out phase 1720 * PH_MSG_IN 0x07 Message in phase 1721 * ------------------------------------------------------------ 1722 */ 1723 void 1724 trm_Disconnect(struct trm_softc *sc) 1725 { 1726 const bus_space_handle_t ioh = sc->sc_iohandle; 1727 struct trm_scsi_req_q *pSRB; 1728 const bus_space_tag_t iot = sc->sc_iotag; 1729 struct trm_dcb *pDCB; 1730 int j; 1731 1732 #ifdef TRM_DEBUG0 1733 printf("%s: trm_Disconnect\n", sc->sc_device.dv_xname); 1734 #endif 1735 1736 pDCB = sc->pActiveDCB; 1737 if (pDCB == NULL) { 1738 /* TODO: Why use a loop? Why not use DELAY(400)? */ 1739 for(j = 400; j > 0; --j) 1740 DELAY(1); /* 1 msec */ 1741 bus_space_write_2(iot, ioh, 1742 TRM_S1040_SCSI_CONTROL, (DO_CLRFIFO | DO_HWRESELECT)); 1743 return; 1744 } 1745 1746 pSRB = pDCB->pActiveSRB; 1747 sc->pActiveDCB = NULL; 1748 pSRB->ScsiPhase = PH_BUS_FREE; /* SCSI bus free Phase */ 1749 bus_space_write_2(iot, ioh, 1750 TRM_S1040_SCSI_CONTROL, (DO_CLRFIFO | DO_HWRESELECT)); 1751 DELAY(100); 1752 1753 switch (pSRB->SRBState) { 1754 case TRM_UNEXPECT_RESEL: 1755 pSRB->SRBState = TRM_FREE; 1756 break; 1757 1758 case TRM_ABORT_SENT: 1759 trm_GoingSRB_Done(sc, pDCB); 1760 break; 1761 1762 case TRM_START: 1763 case TRM_MSGOUT: 1764 /* 1765 * Selection time out 1766 */ 1767 /* If not polling just keep trying until xs->stimeout expires */ 1768 if ((pSRB->xs->flags & SCSI_POLL) == 0) { 1769 trm_RewaitSRB(sc, pSRB); 1770 } else { 1771 pSRB->TargetStatus = TRM_SCSI_SELECT_TIMEOUT; 1772 goto disc1; 1773 } 1774 break; 1775 1776 case TRM_COMPLETED: 1777 disc1: 1778 /* 1779 * TRM_COMPLETED - remove id from mask of active tags 1780 */ 1781 pDCB->pActiveSRB = NULL; 1782 trm_FinishSRB(sc, pSRB); 1783 break; 1784 1785 default: 1786 break; 1787 } 1788 1789 trm_StartWaitingSRB(sc); 1790 } 1791 1792 /* 1793 * ------------------------------------------------------------ 1794 * Function : trm_Reselect 1795 * Purpose : 1796 * Inputs : 1797 * ------------------------------------------------------------ 1798 */ 1799 void 1800 trm_Reselect(struct trm_softc *sc) 1801 { 1802 const bus_space_handle_t ioh = sc->sc_iohandle; 1803 const bus_space_tag_t iot = sc->sc_iotag; 1804 struct trm_scsi_req_q *pSRB; 1805 struct trm_dcb *pDCB; 1806 u_int16_t RselTarLunId; 1807 u_int8_t target, lun; 1808 1809 #ifdef TRM_DEBUG0 1810 printf("%s: trm_Reselect\n", sc->sc_device.dv_xname); 1811 #endif 1812 1813 pDCB = sc->pActiveDCB; 1814 if (pDCB != NULL) { 1815 /* 1816 * Arbitration lost but Reselection win 1817 */ 1818 pSRB = pDCB->pActiveSRB; 1819 trm_RewaitSRB(sc, pSRB); 1820 } 1821 1822 /* 1823 * Read Reselected Target Id and LUN 1824 */ 1825 RselTarLunId = bus_space_read_2(iot, ioh, TRM_S1040_SCSI_TARGETID) & 0x1FFF; 1826 /* TODO XXXX: Make endian independent! */ 1827 target = RselTarLunId & 0xff; 1828 lun = (RselTarLunId >> 8) & 0xff; 1829 1830 #ifdef TRM_DEBUG0 1831 printf("%s: reselect - target = %d, lun = %d\n", 1832 sc->sc_device.dv_xname, target, lun); 1833 #endif 1834 1835 if ((target < TRM_MAX_TARGETS) && (lun < TRM_MAX_LUNS)) 1836 pDCB = sc->pDCB[target][lun]; 1837 else 1838 pDCB = NULL; 1839 1840 if (pDCB == NULL) 1841 printf("%s: reselect - target = %d, lun = %d not found\n", 1842 sc->sc_device.dv_xname, target, lun); 1843 1844 sc->pActiveDCB = pDCB; 1845 1846 /* TODO XXXX: This will crash if pDCB is ever NULL */ 1847 if ((pDCB->DCBFlag & TRM_USE_TAG_QUEUING) != 0) { 1848 pSRB = &sc->SRB[0]; 1849 pDCB->pActiveSRB = pSRB; 1850 } else { 1851 pSRB = pDCB->pActiveSRB; 1852 if (pSRB == NULL || (pSRB->SRBState != TRM_DISCONNECTED)) { 1853 /* 1854 * abort command 1855 */ 1856 pSRB = &sc->SRB[0]; 1857 pSRB->SRBState = TRM_UNEXPECT_RESEL; 1858 pDCB->pActiveSRB = pSRB; 1859 trm_EnableMsgOut(sc, MSG_ABORT); 1860 } else 1861 pSRB->SRBState = TRM_DATA_XFER; 1862 } 1863 pSRB->ScsiPhase = PH_BUS_FREE; /* SCSI bus free Phase */ 1864 1865 /* 1866 * Program HA ID, target ID, period and offset 1867 */ 1868 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_TARGETID, target); 1869 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_HOSTID, sc->sc_AdaptSCSIID); 1870 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_SYNC, pDCB->SyncPeriod); 1871 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_OFFSET, pDCB->SyncOffset); 1872 1873 /* 1874 * it's important for atn stop 1875 */ 1876 bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); 1877 DELAY(30); 1878 1879 /* 1880 * SCSI command 1881 * to rls the /ACK signal 1882 */ 1883 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_COMMAND, SCMD_MSGACCEPT); 1884 } 1885 1886 /* 1887 * ------------------------------------------------------------ 1888 * Function : trm_FinishSRB 1889 * Purpose : Complete execution of a SCSI command 1890 * Inputs : 1891 * ------------------------------------------------------------ 1892 */ 1893 void 1894 trm_FinishSRB(struct trm_softc *sc, struct trm_scsi_req_q *pSRB) 1895 { 1896 struct scsi_inquiry_data *ptr; 1897 struct scsi_sense_data *s1, *s2; 1898 struct scsi_xfer *xs = pSRB->xs; 1899 struct trm_dcb *pDCB = pSRB->pSRBDCB; 1900 int target, lun, intflag; 1901 1902 #ifdef TRM_DEBUG0 1903 printf("%s: trm_FinishSRB. sc = %p, pSRB = %p\n", 1904 sc->sc_device.dv_xname, sc, pSRB); 1905 #endif 1906 pDCB->DCBFlag &= ~TRM_QUEUE_FULL; 1907 1908 intflag = splbio(); 1909 if (pSRB->TagNumber != TRM_NO_TAG) { 1910 pSRB->pSRBDCB->TagMask &= ~(1 << pSRB->TagNumber); 1911 pSRB->TagNumber = TRM_NO_TAG; 1912 } 1913 /* SRB may have started & finished, or be waiting and timed out */ 1914 if ((pSRB->SRBFlag & TRM_ON_WAITING_SRB) != 0) { 1915 pSRB->SRBFlag &= ~TRM_ON_WAITING_SRB; 1916 TAILQ_REMOVE(&sc->waitingSRB, pSRB, link); 1917 } 1918 if ((pSRB->SRBFlag & TRM_ON_GOING_SRB) != 0) { 1919 pSRB->SRBFlag &= ~TRM_ON_GOING_SRB; 1920 TAILQ_REMOVE(&sc->goingSRB, pSRB, link); 1921 } 1922 splx(intflag); 1923 1924 if (xs == NULL) { 1925 return; 1926 } 1927 1928 timeout_del(&xs->stimeout); 1929 1930 xs->status = pSRB->TargetStatus; 1931 if (xs->datalen != 0) { 1932 bus_dmamap_sync(sc->sc_dmatag, pSRB->dmamapxfer, 1933 0, pSRB->dmamapxfer->dm_mapsize, 1934 (xs->flags & SCSI_DATA_IN) ? BUS_DMASYNC_POSTREAD : 1935 BUS_DMASYNC_POSTWRITE); 1936 bus_dmamap_unload(sc->sc_dmatag, pSRB->dmamapxfer); 1937 } 1938 1939 switch (xs->status) { 1940 case SCSI_INTERM_COND_MET: 1941 case SCSI_COND_MET: 1942 case SCSI_INTERM: 1943 case SCSI_OK: 1944 switch (pSRB->AdaptStatus) { 1945 case TRM_STATUS_GOOD: 1946 if ((pSRB->SRBFlag & TRM_PARITY_ERROR) != 0) { 1947 #ifdef TRM_DEBUG0 1948 sc_print_addr(xs->sc_link); 1949 printf(" trm_FinishSRB. TRM_PARITY_ERROR\n"); 1950 #endif 1951 xs->error = XS_DRIVER_STUFFUP; 1952 1953 } else if ((pSRB->SRBFlag & TRM_SCSI_TIMED_OUT) != 0) { 1954 if ((pSRB->SRBFlag & TRM_AUTO_REQSENSE) == 0) 1955 xs->error = XS_TIMEOUT; 1956 else { 1957 bzero(&xs->sense, sizeof(xs->sense)); 1958 xs->status = SCSI_CHECK; 1959 xs->error = XS_SENSE; 1960 } 1961 1962 } else if ((pSRB->SRBFlag & TRM_AUTO_REQSENSE) != 0) { 1963 s1 = &pSRB->scsisense; 1964 s2 = &xs->sense; 1965 1966 *s2 = *s1; 1967 1968 xs->status = SCSI_CHECK; 1969 xs->error = XS_SENSE; 1970 1971 } else 1972 xs->error = XS_NOERROR; 1973 break; 1974 1975 case TRM_OVER_UNDER_RUN: 1976 #ifdef TRM_DEBUG0 1977 sc_print_addr(xs->sc_link); 1978 printf("trm_FinishSRB. TRM_OVER_UNDER_RUN\n"); 1979 #endif 1980 xs->error = XS_DRIVER_STUFFUP; 1981 break; 1982 1983 default: 1984 #ifdef TRM_DEBUG0 1985 sc_print_addr(xs->sc_link); 1986 printf("trm_FinishSRB. AdaptStatus Error = 0x%02x\n", 1987 pSRB->AdaptStatus); 1988 #endif 1989 xs->error = XS_DRIVER_STUFFUP; 1990 break; 1991 } 1992 break; 1993 1994 case SCSI_TERMINATED: 1995 case SCSI_ACA_ACTIVE: 1996 case SCSI_CHECK: 1997 if ((pSRB->SRBFlag & TRM_AUTO_REQSENSE) != 0) 1998 xs->error = XS_DRIVER_STUFFUP; 1999 else { 2000 trm_RequestSense(sc, pSRB); 2001 return; 2002 } 2003 break; 2004 2005 case SCSI_QUEUE_FULL: 2006 /* this says no more until someone completes */ 2007 pDCB->DCBFlag |= TRM_QUEUE_FULL; 2008 trm_RewaitSRB(sc, pSRB); 2009 return; 2010 2011 case SCSI_RESV_CONFLICT: 2012 case SCSI_BUSY: 2013 xs->error = XS_BUSY; 2014 break; 2015 2016 case TRM_SCSI_UNEXP_BUS_FREE: 2017 xs->status = SCSI_OK; 2018 xs->error = XS_DRIVER_STUFFUP; 2019 break; 2020 2021 case TRM_SCSI_BUS_RST_DETECTED: 2022 xs->status = SCSI_OK; 2023 xs->error = XS_RESET; 2024 break; 2025 2026 case TRM_SCSI_SELECT_TIMEOUT: 2027 xs->status = SCSI_OK; 2028 xs->error = XS_SELTIMEOUT; 2029 break; 2030 2031 default: 2032 xs->error = XS_DRIVER_STUFFUP; 2033 break; 2034 } 2035 2036 target = xs->sc_link->target; 2037 lun = xs->sc_link->lun; 2038 2039 if ((xs->flags & SCSI_POLL) != 0) { 2040 2041 if (xs->cmd.opcode == INQUIRY && pDCB->sc_link == NULL) { 2042 2043 ptr = (struct scsi_inquiry_data *) xs->data; 2044 2045 if ((xs->error != XS_NOERROR) || 2046 ((ptr->device & SID_QUAL_BAD_LU) == SID_QUAL_BAD_LU)) { 2047 #ifdef TRM_DEBUG0 2048 sc_print_addr(xs->sc_link); 2049 printf("trm_FinishSRB NO Device\n"); 2050 #endif 2051 free(pDCB, M_DEVBUF, 0); 2052 sc->pDCB[target][lun] = NULL; 2053 pDCB = NULL; 2054 2055 } else 2056 pDCB->sc_link = xs->sc_link; 2057 } 2058 } 2059 2060 /* 2061 * Notify cmd done 2062 */ 2063 #ifdef TRM_DEBUG0 2064 if ((xs->error != 0) || (xs->status != 0) || 2065 ((xs->flags & SCSI_POLL) != 0)) { 2066 sc_print_addr(xs->sc_link); 2067 printf("trm_FinishSRB. xs->cmd.opcode = 0x%02x, xs->error = %d, xs->status = %d\n", 2068 xs->cmd.opcode, xs->error, xs->status); 2069 } 2070 #endif 2071 2072 if (ISSET(xs->flags, SCSI_POLL)) 2073 SET(xs->flags, ITSDONE); 2074 else 2075 scsi_done(xs); 2076 } 2077 2078 /* 2079 * ------------------------------------------------------------ 2080 * Function : trm_srb_reinit 2081 * Purpose : 2082 * Inputs : 2083 * ------------------------------------------------------------ 2084 */ 2085 void 2086 trm_srb_reinit(struct trm_softc *sc, struct trm_scsi_req_q *pSRB) 2087 { 2088 bzero(&pSRB->SegmentX[0], sizeof(pSRB->SegmentX)); 2089 bzero(&pSRB->CmdBlock[0], sizeof(pSRB->CmdBlock)); 2090 bzero(&pSRB->scsisense, sizeof(pSRB->scsisense)); 2091 2092 pSRB->SRBTotalXferLength = 0; 2093 pSRB->SRBSGCount = 0; 2094 pSRB->SRBSGIndex = 0; 2095 pSRB->SRBFlag = 0; 2096 2097 pSRB->SRBState = TRM_FREE; 2098 pSRB->AdaptStatus = TRM_STATUS_GOOD; 2099 pSRB->TargetStatus = SCSI_OK; 2100 pSRB->ScsiPhase = PH_BUS_FREE; /* SCSI bus free Phase */ 2101 2102 pSRB->xs = NULL; 2103 pSRB->pSRBDCB = NULL; 2104 } 2105 2106 /* 2107 * ------------------------------------------------------------ 2108 * Function : trm_srb_free 2109 * Purpose : 2110 * Inputs : 2111 * ------------------------------------------------------------ 2112 */ 2113 void 2114 trm_srb_free(void *xsc, void *xpSRB) 2115 { 2116 struct trm_softc *sc = xsc; 2117 struct trm_scsi_req_q *pSRB = xpSRB; 2118 2119 trm_srb_reinit(sc, pSRB); 2120 2121 if (pSRB != &sc->SRB[0]) { 2122 mtx_enter(&sc->sc_srb_mtx); 2123 TAILQ_INSERT_TAIL(&sc->freeSRB, pSRB, link); 2124 mtx_leave(&sc->sc_srb_mtx); 2125 } 2126 } 2127 2128 /* 2129 * ------------------------------------------------------------ 2130 * Function : trm_GoingSRB_Done 2131 * Purpose : 2132 * Inputs : 2133 * ------------------------------------------------------------ 2134 */ 2135 void 2136 trm_GoingSRB_Done(struct trm_softc *sc, struct trm_dcb *pDCB) 2137 { 2138 struct trm_scsi_req_q *pSRB, *pNextSRB; 2139 2140 /* ASSUME we are inside a splbio()/splx() pair */ 2141 2142 pSRB = TAILQ_FIRST(&sc->goingSRB); 2143 while (pSRB != NULL) { 2144 /* 2145 * Need to save pNextSRB because trm_FinishSRB() puts 2146 * pSRB in freeSRB queue, and thus its links no longer 2147 * point to members of the goingSRB queue. This is why 2148 * TAILQ_FOREACH() will not work for this traversal. 2149 */ 2150 pNextSRB = TAILQ_NEXT(pSRB, link); 2151 if (pDCB == NULL || pSRB->pSRBDCB == pDCB) { 2152 /* TODO XXXX: Is TIMED_OUT the best state to report? */ 2153 pSRB->SRBFlag |= TRM_SCSI_TIMED_OUT; 2154 trm_FinishSRB(sc, pSRB); 2155 } 2156 pSRB = pNextSRB; 2157 } 2158 } 2159 2160 /* 2161 * ------------------------------------------------------------ 2162 * Function : trm_ResetSCSIBus 2163 * Purpose : Reset the SCSI bus 2164 * Inputs : struct trm_softc * - 2165 * ------------------------------------------------------------ 2166 */ 2167 void 2168 trm_ResetSCSIBus(struct trm_softc *sc) 2169 { 2170 const bus_space_handle_t ioh = sc->sc_iohandle; 2171 const bus_space_tag_t iot = sc->sc_iotag; 2172 int intflag; 2173 2174 intflag = splbio(); 2175 2176 sc->sc_Flag |= RESET_DEV; 2177 2178 bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_RSTSCSI); 2179 while ((bus_space_read_2(iot, ioh, 2180 TRM_S1040_SCSI_INTSTATUS) & INT_SCSIRESET) == 0); 2181 2182 splx(intflag); 2183 } 2184 2185 /* 2186 * ------------------------------------------------------------ 2187 * Function : trm_ScsiRstDetect 2188 * Purpose : 2189 * Inputs : 2190 * ------------------------------------------------------------ 2191 */ 2192 void 2193 trm_ScsiRstDetect(struct trm_softc *sc) 2194 { 2195 const bus_space_handle_t ioh = sc->sc_iohandle; 2196 const bus_space_tag_t iot = sc->sc_iotag; 2197 int wlval; 2198 2199 #ifdef TRM_DEBUG0 2200 printf("%s: trm_ScsiRstDetect\n", sc->sc_device.dv_xname); 2201 #endif 2202 2203 wlval = 1000; 2204 /* 2205 * delay 1 sec 2206 */ 2207 while (--wlval != 0) 2208 DELAY(1000); 2209 2210 bus_space_write_1(iot, ioh, TRM_S1040_DMA_CONTROL, STOPDMAXFER); 2211 bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_CLRFIFO); 2212 2213 if ((sc->sc_Flag & RESET_DEV) != 0) 2214 sc->sc_Flag |= RESET_DONE; 2215 else { 2216 sc->sc_Flag |= RESET_DETECT; 2217 trm_ResetAllDevParam(sc); 2218 trm_RecoverSRB(sc); 2219 sc->pActiveDCB = NULL; 2220 sc->sc_Flag = 0; 2221 trm_StartWaitingSRB(sc); 2222 } 2223 } 2224 2225 /* 2226 * ------------------------------------------------------------ 2227 * Function : trm_RequestSense 2228 * Purpose : 2229 * Inputs : 2230 * ------------------------------------------------------------ 2231 */ 2232 void 2233 trm_RequestSense(struct trm_softc *sc, struct trm_scsi_req_q *pSRB) 2234 { 2235 pSRB->SRBFlag |= TRM_AUTO_REQSENSE; 2236 2237 /* 2238 * Status of initiator/target 2239 */ 2240 pSRB->AdaptStatus = TRM_STATUS_GOOD; 2241 pSRB->TargetStatus = SCSI_OK; 2242 /* 2243 * Status of initiator/target 2244 */ 2245 2246 pSRB->SegmentX[0].address = pSRB->scsisensePhyAddr; 2247 pSRB->SegmentX[0].length = sizeof(struct scsi_sense_data); 2248 pSRB->SRBTotalXferLength = sizeof(struct scsi_sense_data); 2249 pSRB->SRBSGCount = 1; 2250 pSRB->SRBSGIndex = 0; 2251 2252 bzero(&pSRB->CmdBlock[0], sizeof(pSRB->CmdBlock)); 2253 2254 pSRB->CmdBlock[0] = REQUEST_SENSE; 2255 pSRB->CmdBlock[1] = (pSRB->xs->sc_link->lun) << 5; 2256 pSRB->CmdBlock[4] = sizeof(struct scsi_sense_data); 2257 2258 pSRB->ScsiCmdLen = 6; 2259 2260 if ((pSRB->xs != NULL) && ((pSRB->xs->flags & SCSI_POLL) == 0)) 2261 timeout_add_msec(&pSRB->xs->stimeout, pSRB->xs->timeout); 2262 2263 if (trm_StartSRB(sc, pSRB) != 0) 2264 trm_RewaitSRB(sc, pSRB); 2265 } 2266 2267 /* 2268 * ------------------------------------------------------------ 2269 * Function : trm_EnableMsgOut 2270 * Purpose : set up MsgBuf to send out a single byte message 2271 * Inputs : 2272 * ------------------------------------------------------------ 2273 */ 2274 void 2275 trm_EnableMsgOut(struct trm_softc *sc, u_int8_t msg) 2276 { 2277 sc->MsgBuf[0] = msg; 2278 sc->MsgCnt = 1; 2279 2280 bus_space_write_2(sc->sc_iotag, sc->sc_iohandle, TRM_S1040_SCSI_CONTROL, DO_SETATN); 2281 } 2282 2283 /* 2284 * ------------------------------------------------------------ 2285 * Function : trm_linkSRB 2286 * Purpose : 2287 * Inputs : 2288 * ------------------------------------------------------------ 2289 */ 2290 void 2291 trm_linkSRB(struct trm_softc *sc) 2292 { 2293 struct trm_scsi_req_q *pSRB; 2294 int i, intflag; 2295 2296 intflag = splbio(); 2297 2298 for (i = 0; i < TRM_MAX_SRB_CNT; i++) { 2299 pSRB = &sc->SRB[i]; 2300 2301 pSRB->PhysSRB = sc->sc_dmamap_control->dm_segs[0].ds_addr 2302 + i * sizeof(struct trm_scsi_req_q); 2303 2304 pSRB->SRBSGPhyAddr = sc->sc_dmamap_control->dm_segs[0].ds_addr 2305 + i * sizeof(struct trm_scsi_req_q) 2306 + offsetof(struct trm_scsi_req_q, SegmentX); 2307 2308 pSRB->scsisensePhyAddr = sc->sc_dmamap_control->dm_segs[0].ds_addr 2309 + i * sizeof(struct trm_scsi_req_q) 2310 + offsetof(struct trm_scsi_req_q, scsisense); 2311 2312 /* 2313 * map all SRB space 2314 */ 2315 if (bus_dmamap_create(sc->sc_dmatag, TRM_MAX_PHYSG_BYTE, 2316 TRM_MAX_SG_LISTENTRY, TRM_MAX_PHYSG_BYTE, 0, 2317 BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, 2318 &pSRB->dmamapxfer) != 0) { 2319 printf("%s: unable to create DMA transfer map\n", 2320 sc->sc_device.dv_xname); 2321 splx(intflag); 2322 return; 2323 } 2324 2325 if (i > 0) 2326 /* We use sc->SRB[0] directly, so *don't* link it */ 2327 TAILQ_INSERT_TAIL(&sc->freeSRB, pSRB, link); 2328 #ifdef TRM_DEBUG0 2329 printf("pSRB = %p ", pSRB); 2330 #endif 2331 } 2332 #ifdef TRM_DEBUG0 2333 printf("\n "); 2334 #endif 2335 splx(intflag); 2336 } 2337 2338 /* 2339 * ------------------------------------------------------------ 2340 * Function : trm_initACB 2341 * Purpose : initialize the internal structures for a given SCSI host 2342 * Inputs : 2343 * ------------------------------------------------------------ 2344 */ 2345 void 2346 trm_initACB(struct trm_softc *sc, int unit) 2347 { 2348 const bus_space_handle_t ioh = sc->sc_iohandle; 2349 const bus_space_tag_t iot = sc->sc_iotag; 2350 struct trm_adapter_nvram *pEEpromBuf; 2351 struct trm_dcb *pDCB; 2352 int target, lun; 2353 2354 pEEpromBuf = &trm_eepromBuf[unit]; 2355 sc->sc_config = HCC_AUTOTERM | HCC_PARITY; 2356 2357 if ((bus_space_read_1(iot, ioh, TRM_S1040_GEN_STATUS) & WIDESCSI) != 0) 2358 sc->sc_config |= HCC_WIDE_CARD; 2359 2360 if ((pEEpromBuf->NvramChannelCfg & NAC_POWERON_SCSI_RESET) != 0) 2361 sc->sc_config |= HCC_SCSI_RESET; 2362 2363 TAILQ_INIT(&sc->freeSRB); 2364 TAILQ_INIT(&sc->waitingSRB); 2365 TAILQ_INIT(&sc->goingSRB); 2366 2367 mtx_init(&sc->sc_srb_mtx, IPL_BIO); 2368 scsi_iopool_init(&sc->sc_iopool, sc, trm_srb_alloc, trm_srb_free); 2369 2370 sc->pActiveDCB = NULL; 2371 sc->sc_AdapterUnit = unit; 2372 sc->sc_AdaptSCSIID = pEEpromBuf->NvramScsiId; 2373 sc->sc_TagMaxNum = 2 << pEEpromBuf->NvramMaxTag; 2374 sc->sc_Flag = 0; 2375 2376 /* 2377 * put all SRB's (except [0]) onto the freeSRB list 2378 */ 2379 trm_linkSRB(sc); 2380 2381 /* 2382 * allocate DCB array 2383 */ 2384 for (target = 0; target < TRM_MAX_TARGETS; target++) { 2385 if (target == sc->sc_AdaptSCSIID) 2386 continue; 2387 2388 for (lun = 0; lun < TRM_MAX_LUNS; lun++) { 2389 pDCB = (struct trm_dcb *)malloc(sizeof(struct trm_dcb), 2390 M_DEVBUF, M_NOWAIT | M_ZERO); 2391 sc->pDCB[target][lun] = pDCB; 2392 2393 if (pDCB == NULL) 2394 continue; 2395 2396 pDCB->target = target; 2397 pDCB->lun = lun; 2398 pDCB->pActiveSRB = NULL; 2399 } 2400 } 2401 2402 trm_reset(sc); 2403 } 2404 2405 /* 2406 * ------------------------------------------------------------ 2407 * Function : trm_write_all 2408 * Description : write pEEpromBuf 128 bytes to seeprom 2409 * Input : iot, ioh - chip's base address 2410 * Output : none 2411 * ------------------------------------------------------------ 2412 */ 2413 void 2414 trm_write_all(struct trm_adapter_nvram *pEEpromBuf, bus_space_tag_t iot, 2415 bus_space_handle_t ioh) 2416 { 2417 u_int8_t *bpEeprom = (u_int8_t *)pEEpromBuf; 2418 u_int8_t bAddr; 2419 2420 /* 2421 * Enable SEEPROM 2422 */ 2423 bus_space_write_1(iot, ioh, TRM_S1040_GEN_CONTROL, 2424 (bus_space_read_1(iot, ioh, TRM_S1040_GEN_CONTROL) | EN_EEPROM)); 2425 /* 2426 * Write enable 2427 */ 2428 trm_write_cmd(iot, ioh, 0x04, 0xFF); 2429 bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, 0); 2430 trm_wait_30us(iot, ioh); 2431 for (bAddr = 0; bAddr < 128; bAddr++, bpEeprom++) 2432 trm_set_data(iot, ioh, bAddr, *bpEeprom); 2433 /* 2434 * Write disable 2435 */ 2436 trm_write_cmd(iot, ioh, 0x04, 0x00); 2437 bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, 0); 2438 trm_wait_30us(iot, ioh); 2439 /* 2440 * Disable SEEPROM 2441 */ 2442 bus_space_write_1(iot, ioh, TRM_S1040_GEN_CONTROL, 2443 (bus_space_read_1(iot, ioh, TRM_S1040_GEN_CONTROL) & ~EN_EEPROM)); 2444 } 2445 2446 /* 2447 * ------------------------------------------------------------ 2448 * Function : trm_set_data 2449 * Description : write one byte to seeprom 2450 * Input : iot, ioh - chip's base address 2451 * bAddr - address of SEEPROM 2452 * bData - data of SEEPROM 2453 * Output : none 2454 * ------------------------------------------------------------ 2455 */ 2456 void 2457 trm_set_data(bus_space_tag_t iot, bus_space_handle_t ioh, u_int8_t bAddr, 2458 u_int8_t bData) 2459 { 2460 u_int8_t bSendData; 2461 int i; 2462 2463 /* 2464 * Send write command & address 2465 */ 2466 trm_write_cmd(iot, ioh, 0x05, bAddr); 2467 /* 2468 * Write data 2469 */ 2470 for (i = 0; i < 8; i++, bData <<= 1) { 2471 bSendData = NVR_SELECT; 2472 if ((bData & 0x80) != 0) { /* Start from bit 7 */ 2473 bSendData |= NVR_BITOUT; 2474 } 2475 bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, bSendData); 2476 trm_wait_30us(iot, ioh); 2477 bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, 2478 (bSendData | NVR_CLOCK)); 2479 trm_wait_30us(iot, ioh); 2480 } 2481 bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, NVR_SELECT); 2482 trm_wait_30us(iot, ioh); 2483 /* 2484 * Disable chip select 2485 */ 2486 bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, 0); 2487 trm_wait_30us(iot, ioh); 2488 bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, NVR_SELECT); 2489 trm_wait_30us(iot, ioh); 2490 /* 2491 * Wait for write ready 2492 */ 2493 for (;;) { 2494 bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, 2495 (NVR_SELECT | NVR_CLOCK)); 2496 trm_wait_30us(iot, ioh); 2497 bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, NVR_SELECT); 2498 trm_wait_30us(iot, ioh); 2499 if (bus_space_read_1(iot, ioh, TRM_S1040_GEN_NVRAM) & NVR_BITIN) 2500 break; 2501 } 2502 /* 2503 * Disable chip select 2504 */ 2505 bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, 0); 2506 } 2507 2508 /* 2509 * ------------------------------------------------------------ 2510 * Function : trm_read_all 2511 * Description : read seeprom 128 bytes to pEEpromBuf 2512 * Input : pEEpromBuf, iot, ioh - chip's base address 2513 * Output : none 2514 * ------------------------------------------------------------ 2515 */ 2516 void 2517 trm_read_all(struct trm_adapter_nvram *pEEpromBuf, bus_space_tag_t iot, 2518 bus_space_handle_t ioh) 2519 { 2520 u_int8_t *bpEeprom = (u_int8_t *)pEEpromBuf; 2521 u_int8_t bAddr; 2522 2523 /* 2524 * Enable SEEPROM 2525 */ 2526 bus_space_write_1(iot, ioh, TRM_S1040_GEN_CONTROL, 2527 (bus_space_read_1(iot, ioh, TRM_S1040_GEN_CONTROL) | EN_EEPROM)); 2528 2529 for (bAddr = 0; bAddr < 128; bAddr++, bpEeprom++) 2530 *bpEeprom = trm_get_data(iot, ioh, bAddr); 2531 2532 /* 2533 * Disable SEEPROM 2534 */ 2535 bus_space_write_1(iot, ioh, TRM_S1040_GEN_CONTROL, 2536 (bus_space_read_1(iot, ioh, TRM_S1040_GEN_CONTROL) & ~EN_EEPROM)); 2537 } 2538 2539 /* 2540 * ------------------------------------------------------------ 2541 * Function : trm_get_data 2542 * Description : read one byte from seeprom 2543 * Input : iot, ioh - chip's base address 2544 * bAddr - address of SEEPROM 2545 * Output : bData - data of SEEPROM 2546 * ------------------------------------------------------------ 2547 */ 2548 u_int8_t 2549 trm_get_data( bus_space_tag_t iot, bus_space_handle_t ioh, u_int8_t bAddr) 2550 { 2551 u_int8_t bReadData, bData; 2552 int i; 2553 2554 bData = 0; 2555 2556 /* 2557 * Send read command & address 2558 */ 2559 trm_write_cmd(iot, ioh, 0x06, bAddr); 2560 2561 for (i = 0; i < 8; i++) { 2562 /* 2563 * Read data 2564 */ 2565 bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, 2566 (NVR_SELECT | NVR_CLOCK)); 2567 trm_wait_30us(iot, ioh); 2568 bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, NVR_SELECT); 2569 /* 2570 * Get data bit while falling edge 2571 */ 2572 bReadData = bus_space_read_1(iot, ioh, TRM_S1040_GEN_NVRAM); 2573 bData <<= 1; 2574 if ((bReadData & NVR_BITIN) != 0) 2575 bData |= 1; 2576 trm_wait_30us(iot, ioh); 2577 } 2578 /* 2579 * Disable chip select 2580 */ 2581 bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, 0); 2582 2583 return bData; 2584 } 2585 2586 /* 2587 * ------------------------------------------------------------ 2588 * Function : trm_wait_30us 2589 * Description : wait 30 us 2590 * Input : iot, ioh - chip's base address 2591 * Output : none 2592 * ------------------------------------------------------------ 2593 */ 2594 void 2595 trm_wait_30us(bus_space_tag_t iot, bus_space_handle_t ioh) 2596 { 2597 bus_space_write_1(iot, ioh, TRM_S1040_GEN_TIMER, 5); 2598 2599 while ((bus_space_read_1(iot, ioh, TRM_S1040_GEN_STATUS) & GTIMEOUT) 2600 == 0); 2601 } 2602 2603 /* 2604 * ------------------------------------------------------------ 2605 * Function : trm_write_cmd 2606 * Description : write SB and Op Code into seeprom 2607 * Input : iot, ioh - chip's base address 2608 * bCmd - SB + Op Code 2609 * bAddr - address of SEEPROM 2610 * Output : none 2611 * ------------------------------------------------------------ 2612 */ 2613 void 2614 trm_write_cmd( bus_space_tag_t iot, bus_space_handle_t ioh, u_int8_t bCmd, 2615 u_int8_t bAddr) 2616 { 2617 u_int8_t bSendData; 2618 int i; 2619 2620 for (i = 0; i < 3; i++, bCmd <<= 1) { 2621 /* 2622 * Program SB + OP code 2623 */ 2624 bSendData = NVR_SELECT; 2625 if (bCmd & 0x04) /* Start from bit 2 */ 2626 bSendData |= NVR_BITOUT; 2627 bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, bSendData); 2628 trm_wait_30us(iot, ioh); 2629 bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, 2630 (bSendData | NVR_CLOCK)); 2631 trm_wait_30us(iot, ioh); 2632 } 2633 2634 for (i = 0; i < 7; i++, bAddr <<= 1) { 2635 /* 2636 * Program address 2637 */ 2638 bSendData = NVR_SELECT; 2639 if (bAddr & 0x40) { /* Start from bit 6 */ 2640 bSendData |= NVR_BITOUT; 2641 } 2642 bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, bSendData); 2643 trm_wait_30us(iot, ioh); 2644 bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, 2645 (bSendData | NVR_CLOCK)); 2646 trm_wait_30us(iot, ioh); 2647 } 2648 bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, NVR_SELECT); 2649 trm_wait_30us(iot, ioh); 2650 } 2651 2652 /* 2653 * ------------------------------------------------------------ 2654 * Function : trm_check_eeprom 2655 * Description : read eeprom 128 bytes to pEEpromBuf and check 2656 * checksum. If it is wrong, updated with default value. 2657 * Input : eeprom, iot, ioh - chip's base address 2658 * Output : none 2659 * ------------------------------------------------------------ 2660 */ 2661 void 2662 trm_check_eeprom(struct trm_adapter_nvram *pEEpromBuf, bus_space_tag_t iot, 2663 bus_space_handle_t ioh) 2664 { 2665 u_int32_t *dpEeprom = (u_int32_t *)pEEpromBuf->NvramTarget; 2666 u_int32_t dAddr; 2667 u_int16_t *wpEeprom = (u_int16_t *)pEEpromBuf; 2668 u_int16_t wAddr, wCheckSum; 2669 2670 #ifdef TRM_DEBUG0 2671 printf("\ntrm_check_eeprom\n"); 2672 #endif 2673 trm_read_all(pEEpromBuf, iot, ioh); 2674 wCheckSum = 0; 2675 for (wAddr = 0; wAddr < 64; wAddr++, wpEeprom++) 2676 wCheckSum += *wpEeprom; 2677 2678 if (wCheckSum != 0x1234) { 2679 #ifdef TRM_DEBUG0 2680 printf("TRM_S1040 EEPROM Check Sum ERROR (load default)\n"); 2681 #endif 2682 /* 2683 * Checksum error, load default 2684 */ 2685 pEEpromBuf->NvramSubVendorID[0] = (u_int8_t)PCI_VENDOR_TEKRAM2; 2686 pEEpromBuf->NvramSubVendorID[1] = (u_int8_t)(PCI_VENDOR_TEKRAM2 2687 >> 8); 2688 pEEpromBuf->NvramSubSysID[0] = (u_int8_t) 2689 PCI_PRODUCT_TEKRAM2_DC3X5U; 2690 pEEpromBuf->NvramSubSysID[1] = (u_int8_t) 2691 (PCI_PRODUCT_TEKRAM2_DC3X5U >> 8); 2692 pEEpromBuf->NvramSubClass = 0; 2693 pEEpromBuf->NvramVendorID[0] = (u_int8_t)PCI_VENDOR_TEKRAM2; 2694 pEEpromBuf->NvramVendorID[1] = (u_int8_t)(PCI_VENDOR_TEKRAM2 2695 >> 8); 2696 pEEpromBuf->NvramDeviceID[0] = (u_int8_t) 2697 PCI_PRODUCT_TEKRAM2_DC3X5U; 2698 pEEpromBuf->NvramDeviceID[1] = (u_int8_t) 2699 (PCI_PRODUCT_TEKRAM2_DC3X5U >> 8); 2700 pEEpromBuf->NvramReserved = 0; 2701 2702 for (dAddr = 0; dAddr < 16; dAddr++, dpEeprom++) 2703 /* 2704 * NvmTarCfg3,NvmTarCfg2,NvmTarPeriod,NvmTarCfg0 2705 */ 2706 *dpEeprom = 0x00000077; 2707 2708 /* 2709 * NvramMaxTag,NvramDelayTime,NvramChannelCfg,NvramScsiId 2710 */ 2711 *dpEeprom++ = 0x04000F07; 2712 2713 /* 2714 * NvramReserved1,NvramBootLun,NvramBootTarget,NvramReserved0 2715 */ 2716 *dpEeprom++ = 0x00000015; 2717 for (dAddr = 0; dAddr < 12; dAddr++, dpEeprom++) 2718 *dpEeprom = 0; 2719 2720 pEEpromBuf->NvramCheckSum = 0; 2721 for (wAddr = 0, wCheckSum =0; wAddr < 63; wAddr++, wpEeprom++) 2722 wCheckSum += *wpEeprom; 2723 2724 *wpEeprom = 0x1234 - wCheckSum; 2725 trm_write_all(pEEpromBuf, iot, ioh); 2726 } 2727 } 2728 2729 /* 2730 * ------------------------------------------------------------ 2731 * Function : trm_initAdapter 2732 * Purpose : initialize the SCSI chip ctrl registers 2733 * Inputs : psh - pointer to this host adapter's structure 2734 * ------------------------------------------------------------ 2735 */ 2736 void 2737 trm_initAdapter(struct trm_softc *sc) 2738 { 2739 const bus_space_handle_t ioh = sc->sc_iohandle; 2740 const bus_space_tag_t iot = sc->sc_iotag; 2741 u_int16_t wval; 2742 u_int8_t bval; 2743 2744 /* 2745 * program configuration 0 2746 */ 2747 if ((sc->sc_config & HCC_PARITY) != 0) { 2748 bval = PHASELATCH | INITIATOR | BLOCKRST | PARITYCHECK; 2749 } else { 2750 bval = PHASELATCH | INITIATOR | BLOCKRST; 2751 } 2752 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_CONFIG0, bval); 2753 /* 2754 * program configuration 1 2755 */ 2756 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_CONFIG1, 0x13); 2757 /* 2758 * 250ms selection timeout 2759 */ 2760 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_TIMEOUT, TRM_SEL_TIMEOUT); 2761 /* 2762 * Mask all the interrupt 2763 */ 2764 bus_space_write_1(iot, ioh, TRM_S1040_DMA_INTEN, 0); 2765 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_INTEN, 0); 2766 /* 2767 * Reset SCSI module 2768 */ 2769 bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_RSTMODULE); 2770 /* 2771 * program Host ID 2772 */ 2773 bval = sc->sc_AdaptSCSIID; 2774 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_HOSTID, bval); 2775 /* 2776 * set ansynchronous transfer 2777 */ 2778 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_OFFSET, 0); 2779 /* 2780 * Turn LED control off 2781 */ 2782 wval = bus_space_read_2(iot, ioh, TRM_S1040_GEN_CONTROL) & 0x7F; 2783 bus_space_write_2(iot, ioh, TRM_S1040_GEN_CONTROL, wval); 2784 /* 2785 * DMA config 2786 */ 2787 wval = bus_space_read_2(iot, ioh, TRM_S1040_DMA_CONFIG) | DMA_ENHANCE; 2788 bus_space_write_2(iot, ioh, TRM_S1040_DMA_CONFIG, wval); 2789 /* 2790 * Clear pending interrupt status 2791 */ 2792 bus_space_read_1(iot, ioh, TRM_S1040_SCSI_INTSTATUS); 2793 /* 2794 * Enable SCSI interrupts 2795 */ 2796 bus_space_write_1(iot, ioh, TRM_S1040_SCSI_INTEN, 2797 (EN_SELECT | EN_SELTIMEOUT | EN_DISCONNECT | EN_RESELECTED | 2798 EN_SCSIRESET | EN_BUSSERVICE | EN_CMDDONE)); 2799 bus_space_write_1(iot, ioh, TRM_S1040_DMA_INTEN, EN_SCSIINTR); 2800 } 2801 2802 /* 2803 * ------------------------------------------------------------ 2804 * Function : trm_init 2805 * Purpose : initialize the internal structures for a given SCSI host 2806 * Inputs : host - pointer to this host adapter's structure 2807 * Preconditions : when this function is called, the chip_type field of 2808 * the ACB structure MUST have been set. 2809 * ------------------------------------------------------------ 2810 */ 2811 int 2812 trm_init(struct trm_softc *sc, int unit) 2813 { 2814 const bus_space_handle_t ioh = sc->sc_iohandle; 2815 const bus_space_tag_t iot = sc->sc_iotag; 2816 bus_dma_segment_t seg; 2817 int error, rseg, all_srbs_size; 2818 2819 /* 2820 * EEPROM CHECKSUM 2821 */ 2822 trm_check_eeprom(&trm_eepromBuf[unit], iot, ioh); 2823 2824 /* 2825 * MEMORY ALLOCATE FOR ADAPTER CONTROL BLOCK 2826 */ 2827 /* 2828 * allocate the space for all SCSI control blocks (SRB) for DMA memory. 2829 */ 2830 all_srbs_size = TRM_MAX_SRB_CNT * sizeof(struct trm_scsi_req_q); 2831 2832 error = bus_dmamem_alloc(sc->sc_dmatag, all_srbs_size, NBPG, 0, &seg, 2833 1, &rseg, BUS_DMA_NOWAIT | BUS_DMA_ZERO); 2834 if (error != 0) { 2835 printf("%s: unable to allocate SCSI REQUEST BLOCKS, error = %d\n", 2836 sc->sc_device.dv_xname, error); 2837 /*errx(error, "%s: unable to allocate SCSI request blocks", 2838 sc->sc_device.dv_xname);*/ 2839 return -1; 2840 } 2841 2842 error = bus_dmamem_map(sc->sc_dmatag, &seg, rseg, all_srbs_size, 2843 (caddr_t *)&sc->SRB, BUS_DMA_NOWAIT|BUS_DMA_COHERENT); 2844 if (error != 0) { 2845 printf("%s: unable to map SCSI REQUEST BLOCKS, error = %d\n", 2846 sc->sc_device.dv_xname, error); 2847 /*errx(error, "unable to map SCSI request blocks");*/ 2848 return -1; 2849 } 2850 2851 error = bus_dmamap_create(sc->sc_dmatag, all_srbs_size, 1, 2852 all_srbs_size, 0, BUS_DMA_NOWAIT,&sc->sc_dmamap_control); 2853 if (error != 0) { 2854 printf("%s: unable to create SRB DMA maps, error = %d\n", 2855 sc->sc_device.dv_xname, error); 2856 /*errx(error, "unable to create SRB DMA maps");*/ 2857 return -1; 2858 } 2859 2860 error = bus_dmamap_load(sc->sc_dmatag, sc->sc_dmamap_control, 2861 sc->SRB, all_srbs_size, NULL, BUS_DMA_NOWAIT); 2862 if (error != 0) { 2863 printf("%s: unable to load SRB DMA maps, error = %d\n", 2864 sc->sc_device.dv_xname, error); 2865 /*errx(error, "unable to load SRB DMA maps");*/ 2866 return -1; 2867 } 2868 #ifdef TRM_DEBUG0 2869 printf("\n\n%s: all_srbs_size=%x\n", 2870 sc->sc_device.dv_xname, all_srbs_size); 2871 #endif 2872 trm_initACB(sc, unit); 2873 trm_initAdapter(sc); 2874 2875 return 0; 2876 } 2877 2878 /* ------------------------------------------------------------ 2879 * Function : trm_print_info 2880 * Purpose : Print the DCB negotiation information 2881 * Inputs : 2882 * ------------------------------------------------------------ 2883 */ 2884 void 2885 trm_print_info(struct trm_softc *sc, struct trm_dcb *pDCB) 2886 { 2887 int syncXfer, index; 2888 2889 index = pDCB->SyncPeriod & ~(WIDE_SYNC | ALT_SYNC); 2890 2891 printf("%s: target %d using ", sc->sc_device.dv_xname, pDCB->target); 2892 if ((pDCB->SyncPeriod & WIDE_SYNC) != 0) 2893 printf("16 bit "); 2894 else 2895 printf("8 bit "); 2896 2897 if (pDCB->SyncOffset == 0) 2898 printf("Asynchronous "); 2899 else { 2900 syncXfer = 100000 / (trm_clock_period[index] * 4); 2901 printf("%d.%01d MHz, Offset %d ", 2902 syncXfer / 100, syncXfer % 100, pDCB->SyncOffset); 2903 } 2904 printf("data transfers "); 2905 2906 if ((pDCB->DCBFlag & TRM_USE_TAG_QUEUING) != 0) 2907 printf("with Tag Queuing"); 2908 2909 printf("\n"); 2910 } 2911