1 /* $NetBSD: trm.c,v 1.35 2013/11/24 18:02:08 bouyer Exp $ */ 2 /*- 3 * Copyright (c) 2002 Izumi Tsutsui. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 /* 27 * Device Driver for Tekram DC395U/UW/F, DC315/U 28 * PCI SCSI Bus Master Host Adapter 29 * (SCSI chip set used Tekram ASIC TRM-S1040) 30 * 31 * Copyright (c) 2001 Rui-Xiang Guo 32 * All rights reserved. 33 * 34 * Redistribution and use in source and binary forms, with or without 35 * modification, are permitted provided that the following conditions 36 * are met: 37 * 1. Redistributions of source code must retain the above copyright 38 * notice, this list of conditions and the following disclaimer. 39 * 2. Redistributions in binary form must reproduce the above copyright 40 * notice, this list of conditions and the following disclaimer in the 41 * documentation and/or other materials provided with the distribution. 42 * 3. The name of the author may not be used to endorse or promote products 43 * derived from this software without specific prior written permission. 44 * 45 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 46 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 47 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 48 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 49 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 50 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 51 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 52 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 53 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 54 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 55 */ 56 /* 57 * Ported from 58 * dc395x_trm.c 59 * 60 * Written for NetBSD 1.4.x by 61 * Erich Chen (erich@tekram.com.tw) 62 * 63 * Provided by 64 * (C)Copyright 1995-1999 Tekram Technology Co., Ltd. All rights reserved. 65 */ 66 67 #include <sys/cdefs.h> 68 __KERNEL_RCSID(0, "$NetBSD: trm.c,v 1.35 2013/11/24 18:02:08 bouyer Exp $"); 69 70 /* #define TRM_DEBUG */ 71 #ifdef TRM_DEBUG 72 int trm_debug = 1; 73 #define DPRINTF(arg) if (trm_debug > 0) printf arg; 74 #else 75 #define DPRINTF(arg) 76 #endif 77 78 #include <sys/param.h> 79 #include <sys/systm.h> 80 #include <sys/malloc.h> 81 #include <sys/buf.h> 82 #include <sys/kernel.h> 83 #include <sys/device.h> 84 #include <sys/queue.h> 85 86 #include <sys/bus.h> 87 #include <sys/intr.h> 88 89 #include <dev/scsipi/scsi_spc.h> 90 #include <dev/scsipi/scsi_all.h> 91 #include <dev/scsipi/scsi_message.h> 92 #include <dev/scsipi/scsipi_all.h> 93 #include <dev/scsipi/scsiconf.h> 94 95 #include <dev/pci/pcidevs.h> 96 #include <dev/pci/pcireg.h> 97 #include <dev/pci/pcivar.h> 98 #include <dev/pci/trmreg.h> 99 100 /* 101 * feature of chip set MAX value 102 */ 103 #define TRM_MAX_TARGETS 16 104 #define TRM_MAX_LUNS 8 105 #define TRM_MAX_SG_ENTRIES (MAXPHYS / PAGE_SIZE + 1) 106 #define TRM_MAX_SRB 32 /* XXX */ 107 #define TRM_MAX_TAG TRM_MAX_SRB /* XXX */ 108 #define TRM_MAX_OFFSET 15 109 #define TRM_MAX_PERIOD 125 110 111 /* 112 * Segment Entry 113 */ 114 struct trm_sg_entry { 115 uint32_t address; 116 uint32_t length; 117 }; 118 119 #define TRM_SG_SIZE (sizeof(struct trm_sg_entry) * TRM_MAX_SG_ENTRIES) 120 121 /* 122 ********************************************************************** 123 * The SEEPROM structure for TRM_S1040 124 ********************************************************************** 125 */ 126 struct nvram_target { 127 uint8_t config0; /* Target configuration byte 0 */ 128 #define NTC_DO_WIDE_NEGO 0x20 /* Wide negotiate */ 129 #define NTC_DO_TAG_QUEUING 0x10 /* Enable SCSI tagged queuing */ 130 #define NTC_DO_SEND_START 0x08 /* Send start command SPINUP */ 131 #define NTC_DO_DISCONNECT 0x04 /* Enable SCSI disconnect */ 132 #define NTC_DO_SYNC_NEGO 0x02 /* Sync negotiation */ 133 #define NTC_DO_PARITY_CHK 0x01 /* Parity check enable */ 134 uint8_t period; /* Target period */ 135 uint8_t config2; /* Target configuration byte 2 */ 136 uint8_t config3; /* Target configuration byte 3 */ 137 }; 138 139 struct trm_nvram { 140 uint8_t subvendor_id[2]; /* 0,1 Sub Vendor ID */ 141 uint8_t subsys_id[2]; /* 2,3 Sub System ID */ 142 uint8_t subclass; /* 4 Sub Class */ 143 uint8_t vendor_id[2]; /* 5,6 Vendor ID */ 144 uint8_t device_id[2]; /* 7,8 Device ID */ 145 uint8_t reserved0; /* 9 Reserved */ 146 struct nvram_target target[TRM_MAX_TARGETS]; 147 /* 10,11,12,13 148 * 14,15,16,17 149 * .... 150 * 70,71,72,73 */ 151 uint8_t scsi_id; /* 74 Host Adapter SCSI ID */ 152 uint8_t channel_cfg; /* 75 Channel configuration */ 153 #define NAC_SCANLUN 0x20 /* Include LUN as BIOS device */ 154 #define NAC_DO_PARITY_CHK 0x08 /* Parity check enable */ 155 #define NAC_POWERON_SCSI_RESET 0x04 /* Power on reset enable */ 156 #define NAC_GREATER_1G 0x02 /* > 1G support enable */ 157 #define NAC_GT2DRIVES 0x01 /* Support more than 2 drives */ 158 uint8_t delay_time; /* 76 Power on delay time */ 159 uint8_t max_tag; /* 77 Maximum tags */ 160 uint8_t reserved1; /* 78 */ 161 uint8_t boot_target; /* 79 */ 162 uint8_t boot_lun; /* 80 */ 163 uint8_t reserved2; /* 81 */ 164 uint8_t reserved3[44]; /* 82,..125 */ 165 uint8_t checksum0; /* 126 */ 166 uint8_t checksum1; /* 127 */ 167 #define TRM_NVRAM_CKSUM 0x1234 168 }; 169 170 /* Nvram Initiater bits definition */ 171 #define MORE2_DRV 0x00000001 172 #define GREATER_1G 0x00000002 173 #define RST_SCSI_BUS 0x00000004 174 #define ACTIVE_NEGATION 0x00000008 175 #define NO_SEEK 0x00000010 176 #define LUN_CHECK 0x00000020 177 178 #define trm_eeprom_wait() DELAY(30) 179 180 /* 181 *----------------------------------------------------------------------- 182 * SCSI Request Block 183 *----------------------------------------------------------------------- 184 */ 185 struct trm_srb { 186 TAILQ_ENTRY(trm_srb) next; 187 188 struct trm_sg_entry *sgentry; 189 struct scsipi_xfer *xs; /* scsipi_xfer for this cmd */ 190 bus_dmamap_t dmap; 191 bus_size_t sgoffset; /* Xfer buf offset */ 192 193 uint32_t buflen; /* Total xfer length */ 194 uint32_t sgaddr; /* SGList physical starting address */ 195 196 int sgcnt; 197 int sgindex; 198 199 int hastat; /* Host Adapter Status */ 200 #define H_STATUS_GOOD 0x00 201 #define H_SEL_TIMEOUT 0x11 202 #define H_OVER_UNDER_RUN 0x12 203 #define H_UNEXP_BUS_FREE 0x13 204 #define H_TARGET_PHASE_F 0x14 205 #define H_INVALID_CCB_OP 0x16 206 #define H_LINK_CCB_BAD 0x17 207 #define H_BAD_TARGET_DIR 0x18 208 #define H_DUPLICATE_CCB 0x19 209 #define H_BAD_CCB_OR_SG 0x1A 210 #define H_ABORT 0xFF 211 int tastat; /* Target SCSI Status Byte */ 212 int flag; /* SRBFlag */ 213 #define AUTO_REQSENSE 0x0001 214 #define PARITY_ERROR 0x0002 215 #define SRB_TIMEOUT 0x0004 216 217 int cmdlen; /* SCSI command length */ 218 uint8_t cmd[12]; /* SCSI command */ 219 220 uint8_t tag[2]; 221 }; 222 223 /* 224 * some info about each target and lun on the SCSI bus 225 */ 226 struct trm_linfo { 227 int used; /* number of slots in use */ 228 int avail; /* where to start scanning */ 229 int busy; /* lun in use */ 230 struct trm_srb *untagged; 231 struct trm_srb *queued[TRM_MAX_TAG]; 232 }; 233 234 struct trm_tinfo { 235 u_int flag; /* Sync mode ? (1 sync):(0 async) */ 236 #define SYNC_NEGO_ENABLE 0x0001 237 #define SYNC_NEGO_DOING 0x0002 238 #define SYNC_NEGO_DONE 0x0004 239 #define WIDE_NEGO_ENABLE 0x0008 240 #define WIDE_NEGO_DOING 0x0010 241 #define WIDE_NEGO_DONE 0x0020 242 #define USE_TAG_QUEUING 0x0040 243 #define NO_RESELECT 0x0080 244 struct trm_linfo *linfo[TRM_MAX_LUNS]; 245 246 uint8_t config0; /* Target Config */ 247 uint8_t period; /* Max Period for nego. */ 248 uint8_t synctl; /* Sync control for reg. */ 249 uint8_t offset; /* Sync offset for reg. and nego.(low nibble) */ 250 }; 251 252 /* 253 *----------------------------------------------------------------------- 254 * Adapter Control Block 255 *----------------------------------------------------------------------- 256 */ 257 struct trm_softc { 258 device_t sc_dev; 259 260 bus_space_tag_t sc_iot; 261 bus_space_handle_t sc_ioh; 262 bus_dma_tag_t sc_dmat; 263 bus_dmamap_t sc_dmamap; /* Map the control structures */ 264 265 struct trm_srb *sc_actsrb; 266 struct trm_tinfo sc_tinfo[TRM_MAX_TARGETS]; 267 268 TAILQ_HEAD(, trm_srb) sc_freesrb, 269 sc_readysrb; 270 struct trm_srb *sc_srb; /* SRB array */ 271 272 struct trm_sg_entry *sc_sglist; 273 274 int sc_maxid; 275 /* 276 * Link to the generic SCSI driver 277 */ 278 struct scsipi_channel sc_channel; 279 struct scsipi_adapter sc_adapter; 280 281 int sc_id; /* Adapter SCSI Target ID */ 282 283 int sc_state; /* SRB State */ 284 #define TRM_IDLE 0 285 #define TRM_WAIT 1 286 #define TRM_READY 2 287 #define TRM_MSGOUT 3 /* arbitration+msg_out 1st byte */ 288 #define TRM_MSGIN 4 289 #define TRM_EXTEND_MSGIN 5 290 #define TRM_COMMAND 6 291 #define TRM_START 7 /* arbitration+msg_out+command_out */ 292 #define TRM_DISCONNECTED 8 293 #define TRM_DATA_XFER 9 294 #define TRM_XFERPAD 10 295 #define TRM_STATUS 11 296 #define TRM_COMPLETED 12 297 #define TRM_ABORT_SENT 13 298 #define TRM_UNEXPECT_RESEL 14 299 300 int sc_phase; /* SCSI phase */ 301 int sc_config; 302 #define HCC_WIDE_CARD 0x01 303 #define HCC_SCSI_RESET 0x02 304 #define HCC_PARITY 0x04 305 #define HCC_AUTOTERM 0x08 306 #define HCC_LOW8TERM 0x10 307 #define HCC_UP8TERM 0x20 308 309 int sc_flag; 310 #define RESET_DEV 0x01 311 #define RESET_DETECT 0x02 312 #define RESET_DONE 0x04 313 #define WAIT_TAGMSG 0x08 /* XXX */ 314 315 int sc_msgcnt; 316 317 int resel_target; /* XXX */ 318 int resel_lun; /* XXX */ 319 320 uint8_t *sc_msg; 321 uint8_t sc_msgbuf[6]; 322 }; 323 324 /* 325 * SCSI Status codes not defined in scsi_all.h 326 */ 327 #define SCSI_COND_MET 0x04 /* Condition Met */ 328 #define SCSI_INTERM_COND_MET 0x14 /* Intermediate condition met */ 329 #define SCSI_UNEXP_BUS_FREE 0xFD /* Unexpected Bus Free */ 330 #define SCSI_BUS_RST_DETECT 0xFE /* SCSI Bus Reset detected */ 331 #define SCSI_SEL_TIMEOUT 0xFF /* Selection Timeout */ 332 333 static int trm_match(device_t, cfdata_t, void *); 334 static void trm_attach(device_t, device_t, void *); 335 336 static int trm_init(struct trm_softc *); 337 338 static void trm_scsipi_request(struct scsipi_channel *, scsipi_adapter_req_t, 339 void *); 340 static void trm_update_xfer_mode(struct trm_softc *, int); 341 static void trm_sched(struct trm_softc *); 342 static int trm_select(struct trm_softc *, struct trm_srb *); 343 static void trm_reset(struct trm_softc *); 344 static void trm_timeout(void *); 345 static int trm_intr(void *); 346 347 static void trm_dataout_phase0(struct trm_softc *, int); 348 static void trm_datain_phase0(struct trm_softc *, int); 349 static void trm_status_phase0(struct trm_softc *); 350 static void trm_msgin_phase0(struct trm_softc *); 351 static void trm_command_phase1(struct trm_softc *); 352 static void trm_status_phase1(struct trm_softc *); 353 static void trm_msgout_phase1(struct trm_softc *); 354 static void trm_msgin_phase1(struct trm_softc *); 355 356 static void trm_dataio_xfer(struct trm_softc *, int); 357 static void trm_disconnect(struct trm_softc *); 358 static void trm_reselect(struct trm_softc *); 359 static void trm_done(struct trm_softc *, struct trm_srb *); 360 static int trm_request_sense(struct trm_softc *, struct trm_srb *); 361 static void trm_dequeue(struct trm_softc *, struct trm_srb *); 362 363 static void trm_scsi_reset_detect(struct trm_softc *); 364 static void trm_reset_scsi_bus(struct trm_softc *); 365 366 static void trm_check_eeprom(struct trm_softc *, struct trm_nvram *); 367 static void trm_eeprom_read_all(struct trm_softc *, struct trm_nvram *); 368 static void trm_eeprom_write_all(struct trm_softc *, struct trm_nvram *); 369 static void trm_eeprom_set_data(struct trm_softc *, uint8_t, uint8_t); 370 static void trm_eeprom_write_cmd(struct trm_softc *, uint8_t, uint8_t); 371 static uint8_t trm_eeprom_get_data(struct trm_softc *, uint8_t); 372 373 CFATTACH_DECL_NEW(trm, sizeof(struct trm_softc), 374 trm_match, trm_attach, NULL, NULL); 375 376 /* real period: */ 377 static const uint8_t trm_clock_period[] = { 378 12, /* 48 ns 20.0 MB/sec */ 379 18, /* 72 ns 13.3 MB/sec */ 380 25, /* 100 ns 10.0 MB/sec */ 381 31, /* 124 ns 8.0 MB/sec */ 382 37, /* 148 ns 6.6 MB/sec */ 383 43, /* 172 ns 5.7 MB/sec */ 384 50, /* 200 ns 5.0 MB/sec */ 385 62 /* 248 ns 4.0 MB/sec */ 386 }; 387 #define NPERIOD __arraycount(trm_clock_period) 388 389 static int 390 trm_match(device_t parent, cfdata_t cf, void *aux) 391 { 392 struct pci_attach_args *pa = aux; 393 394 if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_TEKRAM2) 395 switch (PCI_PRODUCT(pa->pa_id)) { 396 case PCI_PRODUCT_TEKRAM2_DC315: 397 return 1; 398 } 399 return 0; 400 } 401 402 /* 403 * attach and init a host adapter 404 */ 405 static void 406 trm_attach(device_t parent, device_t self, void *aux) 407 { 408 struct trm_softc *sc = device_private(self); 409 struct pci_attach_args *const pa = aux; 410 bus_space_tag_t iot; 411 bus_space_handle_t ioh; 412 pci_intr_handle_t ih; 413 pcireg_t command; 414 const char *intrstr; 415 int fl = 0; 416 417 sc->sc_dev = self; 418 419 /* 420 * Some cards do not allow memory mapped accesses 421 * pa_pc: chipset tag 422 * pa_tag: pci tag 423 */ 424 command = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG); 425 if ((command & (PCI_COMMAND_IO_ENABLE | PCI_COMMAND_MASTER_ENABLE)) != 426 (PCI_COMMAND_IO_ENABLE | PCI_COMMAND_MASTER_ENABLE)) { 427 command |= PCI_COMMAND_IO_ENABLE | PCI_COMMAND_MASTER_ENABLE; 428 pci_conf_write(pa->pa_pc, pa->pa_tag, 429 PCI_COMMAND_STATUS_REG, command); 430 } 431 /* 432 * mask for get correct base address of pci IO port 433 */ 434 if (command & PCI_COMMAND_MEM_ENABLE) { 435 fl = pci_mapreg_map(pa, TRM_BAR_MMIO, PCI_MAPREG_TYPE_MEM, 0, &iot, 436 &ioh, NULL, NULL); 437 } 438 if (fl != 0) { 439 aprint_verbose_dev(self, "couldn't map MMIO registers, tryion PIO\n"); 440 if ((fl = pci_mapreg_map(pa, TRM_BAR_PIO, PCI_MAPREG_TYPE_IO, 0, 441 &iot, &ioh, NULL, NULL)) != 0) { 442 aprint_error(": unable to map registers (%d)\n", fl); 443 return; 444 } 445 } 446 /* 447 * test checksum of eeprom.. & initialize softc... 448 */ 449 sc->sc_iot = iot; 450 sc->sc_ioh = ioh; 451 sc->sc_dmat = pa->pa_dmat; 452 453 if (trm_init(sc) != 0) { 454 /* 455 * Error during initialization! 456 */ 457 return; 458 } 459 /* 460 * Now try to attach all the sub-devices 461 */ 462 if ((sc->sc_config & HCC_WIDE_CARD) != 0) 463 aprint_normal(": Tekram DC395UW/F (TRM-S1040) Fast40 " 464 "Ultra Wide SCSI Adapter\n"); 465 else 466 aprint_normal(": Tekram DC395U, DC315/U (TRM-S1040) Fast20 " 467 "Ultra SCSI Adapter\n"); 468 469 /* 470 * Now tell the generic SCSI layer about our bus. 471 * map and establish interrupt 472 */ 473 if (pci_intr_map(pa, &ih)) { 474 aprint_error_dev(self, "couldn't map interrupt\n"); 475 return; 476 } 477 intrstr = pci_intr_string(pa->pa_pc, ih); 478 479 if (pci_intr_establish(pa->pa_pc, ih, IPL_BIO, trm_intr, sc) == NULL) { 480 aprint_error_dev(self, "couldn't establish interrupt"); 481 if (intrstr != NULL) 482 aprint_error(" at %s", intrstr); 483 aprint_error("\n"); 484 return; 485 } 486 if (intrstr != NULL) 487 aprint_normal_dev(self, "interrupting at %s\n", intrstr); 488 489 sc->sc_adapter.adapt_dev = self; 490 sc->sc_adapter.adapt_nchannels = 1; 491 sc->sc_adapter.adapt_openings = TRM_MAX_SRB; 492 sc->sc_adapter.adapt_max_periph = TRM_MAX_SRB; 493 sc->sc_adapter.adapt_request = trm_scsipi_request; 494 sc->sc_adapter.adapt_minphys = minphys; 495 496 sc->sc_channel.chan_adapter = &sc->sc_adapter; 497 sc->sc_channel.chan_bustype = &scsi_bustype; 498 sc->sc_channel.chan_channel = 0; 499 sc->sc_channel.chan_ntargets = sc->sc_maxid + 1; 500 sc->sc_channel.chan_nluns = 8; 501 sc->sc_channel.chan_id = sc->sc_id; 502 503 config_found(self, &sc->sc_channel, scsiprint); 504 } 505 506 /* 507 * initialize the internal structures for a given SCSI host 508 */ 509 static int 510 trm_init(struct trm_softc *sc) 511 { 512 bus_space_tag_t iot = sc->sc_iot; 513 bus_space_handle_t ioh = sc->sc_ioh; 514 bus_dma_segment_t seg; 515 struct trm_nvram eeprom; 516 struct trm_srb *srb; 517 struct trm_tinfo *ti; 518 struct nvram_target *tconf; 519 int error, rseg, all_sgsize; 520 int i, target; 521 uint8_t bval; 522 523 DPRINTF(("\n")); 524 525 /* 526 * allocate the space for all SCSI control blocks (SRB) for DMA memory 527 */ 528 all_sgsize = TRM_MAX_SRB * TRM_SG_SIZE; 529 if ((error = bus_dmamem_alloc(sc->sc_dmat, all_sgsize, PAGE_SIZE, 530 0, &seg, 1, &rseg, BUS_DMA_NOWAIT)) != 0) { 531 aprint_error(": unable to allocate SCSI REQUEST BLOCKS, " 532 "error = %d\n", error); 533 return 1; 534 } 535 if ((error = bus_dmamem_map(sc->sc_dmat, &seg, rseg, 536 all_sgsize, (void **) &sc->sc_sglist, 537 BUS_DMA_NOWAIT | BUS_DMA_COHERENT)) != 0) { 538 aprint_error(": unable to map SCSI REQUEST BLOCKS, " 539 "error = %d\n", error); 540 return 1; 541 } 542 if ((error = bus_dmamap_create(sc->sc_dmat, all_sgsize, 1, 543 all_sgsize, 0, BUS_DMA_NOWAIT, &sc->sc_dmamap)) != 0) { 544 aprint_error(": unable to create SRB DMA maps, " 545 "error = %d\n", error); 546 return 1; 547 } 548 if ((error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmamap, 549 sc->sc_sglist, all_sgsize, NULL, BUS_DMA_NOWAIT)) != 0) { 550 aprint_error(": unable to load SRB DMA maps, " 551 "error = %d\n", error); 552 return 1; 553 } 554 DPRINTF(("all_sgsize=%x\n", all_sgsize)); 555 memset(sc->sc_sglist, 0, all_sgsize); 556 557 /* 558 * EEPROM CHECKSUM 559 */ 560 trm_check_eeprom(sc, &eeprom); 561 562 sc->sc_maxid = 7; 563 sc->sc_config = HCC_AUTOTERM | HCC_PARITY; 564 if (bus_space_read_1(iot, ioh, TRM_GEN_STATUS) & WIDESCSI) { 565 sc->sc_config |= HCC_WIDE_CARD; 566 sc->sc_maxid = 15; 567 } 568 if (eeprom.channel_cfg & NAC_POWERON_SCSI_RESET) 569 sc->sc_config |= HCC_SCSI_RESET; 570 571 sc->sc_actsrb = NULL; 572 sc->sc_id = eeprom.scsi_id; 573 sc->sc_flag = 0; 574 575 /* 576 * initialize and link all device's SRB queues of this adapter 577 */ 578 TAILQ_INIT(&sc->sc_freesrb); 579 TAILQ_INIT(&sc->sc_readysrb); 580 581 sc->sc_srb = malloc(sizeof(struct trm_srb) * TRM_MAX_SRB, 582 M_DEVBUF, M_NOWAIT|M_ZERO); 583 DPRINTF(("all SRB size=%zx\n", sizeof(struct trm_srb) * TRM_MAX_SRB)); 584 if (sc->sc_srb == NULL) { 585 aprint_error(": can not allocate SRB\n"); 586 return 1; 587 } 588 589 for (i = 0, srb = sc->sc_srb; i < TRM_MAX_SRB; i++) { 590 srb->sgentry = sc->sc_sglist + TRM_MAX_SG_ENTRIES * i; 591 srb->sgoffset = TRM_SG_SIZE * i; 592 srb->sgaddr = sc->sc_dmamap->dm_segs[0].ds_addr + srb->sgoffset; 593 /* 594 * map all SRB space to SRB_array 595 */ 596 if (bus_dmamap_create(sc->sc_dmat, 597 MAXPHYS, TRM_MAX_SG_ENTRIES, MAXPHYS, 0, 598 BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &srb->dmap)) { 599 aprint_error(": unable to create DMA transfer map.\n"); 600 free(sc->sc_srb, M_DEVBUF); 601 return 1; 602 } 603 TAILQ_INSERT_TAIL(&sc->sc_freesrb, srb, next); 604 srb++; 605 } 606 607 /* 608 * initialize all target info structures 609 */ 610 for (target = 0; target < TRM_MAX_TARGETS; target++) { 611 ti = &sc->sc_tinfo[target]; 612 ti->synctl = 0; 613 ti->offset = 0; 614 tconf = &eeprom.target[target]; 615 ti->config0 = tconf->config0; 616 ti->period = trm_clock_period[tconf->period & 0x07]; 617 ti->flag = 0; 618 if ((ti->config0 & NTC_DO_DISCONNECT) != 0) { 619 #ifdef notyet 620 if ((ti->config0 & NTC_DO_TAG_QUEUING) != 0) 621 ti->flag |= USE_TAG_QUEUING; 622 #endif 623 } else 624 ti->flag |= NO_RESELECT; 625 626 DPRINTF(("target %d: config0 = 0x%02x, period = 0x%02x", 627 target, ti->config0, ti->period)); 628 DPRINTF((", flag = 0x%02x\n", ti->flag)); 629 } 630 631 /* program configuration 0 */ 632 bval = PHASELATCH | INITIATOR | BLOCKRST; 633 if ((sc->sc_config & HCC_PARITY) != 0) 634 bval |= PARITYCHECK; 635 bus_space_write_1(iot, ioh, TRM_SCSI_CONFIG0, bval); 636 637 /* program configuration 1 */ 638 bus_space_write_1(iot, ioh, TRM_SCSI_CONFIG1, 639 ACTIVE_NEG | ACTIVE_NEGPLUS); 640 641 /* 250ms selection timeout */ 642 bus_space_write_1(iot, ioh, TRM_SCSI_TIMEOUT, SEL_TIMEOUT); 643 644 /* Mask all interrupts */ 645 bus_space_write_1(iot, ioh, TRM_DMA_INTEN, 0); 646 bus_space_write_1(iot, ioh, TRM_SCSI_INTEN, 0); 647 648 /* Reset SCSI module */ 649 bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_RSTMODULE); 650 651 /* program Host ID */ 652 bus_space_write_1(iot, ioh, TRM_SCSI_HOSTID, sc->sc_id); 653 654 /* set asynchronous transfer */ 655 bus_space_write_1(iot, ioh, TRM_SCSI_OFFSET, 0); 656 657 /* Turn LED control off */ 658 bus_space_write_2(iot, ioh, TRM_GEN_CONTROL, 659 bus_space_read_2(iot, ioh, TRM_GEN_CONTROL) & ~EN_LED); 660 661 /* DMA config */ 662 bus_space_write_2(iot, ioh, TRM_DMA_CONFIG, 663 bus_space_read_2(iot, ioh, TRM_DMA_CONFIG) | DMA_ENHANCE); 664 665 /* Clear pending interrupt status */ 666 (void)bus_space_read_1(iot, ioh, TRM_SCSI_INTSTATUS); 667 668 /* Enable SCSI interrupt */ 669 bus_space_write_1(iot, ioh, TRM_SCSI_INTEN, 670 EN_SELECT | EN_SELTIMEOUT | EN_DISCONNECT | EN_RESELECTED | 671 EN_SCSIRESET | EN_BUSSERVICE | EN_CMDDONE); 672 bus_space_write_1(iot, ioh, TRM_DMA_INTEN, EN_SCSIINTR); 673 674 trm_reset(sc); 675 676 return 0; 677 } 678 679 /* 680 * enqueues a SCSI command 681 * called by the higher level SCSI driver 682 */ 683 static void 684 trm_scsipi_request(struct scsipi_channel *chan, scsipi_adapter_req_t req, 685 void *arg) 686 { 687 bus_space_tag_t iot; 688 bus_space_handle_t ioh; 689 struct trm_softc *sc; 690 struct trm_srb *srb; 691 struct scsipi_xfer *xs; 692 int error, i, s; 693 694 sc = device_private(chan->chan_adapter->adapt_dev); 695 iot = sc->sc_iot; 696 ioh = sc->sc_ioh; 697 698 switch (req) { 699 case ADAPTER_REQ_RUN_XFER: 700 xs = arg; 701 DPRINTF(("trm_scsipi_request.....\n")); 702 DPRINTF(("target= %d lun= %d\n", xs->xs_periph->periph_target, 703 xs->xs_periph->periph_lun)); 704 if (xs->xs_control & XS_CTL_RESET) { 705 trm_reset(sc); 706 xs->error = XS_RESET; 707 return; 708 } 709 if (xs->xs_status & XS_STS_DONE) { 710 printf("%s: Is it done?\n", device_xname(sc->sc_dev)); 711 xs->xs_status &= ~XS_STS_DONE; 712 } 713 714 s = splbio(); 715 716 /* Get SRB */ 717 srb = TAILQ_FIRST(&sc->sc_freesrb); 718 if (srb != NULL) { 719 TAILQ_REMOVE(&sc->sc_freesrb, srb, next); 720 } else { 721 xs->error = XS_RESOURCE_SHORTAGE; 722 scsipi_done(xs); 723 splx(s); 724 return; 725 } 726 727 srb->xs = xs; 728 srb->cmdlen = xs->cmdlen; 729 memcpy(srb->cmd, xs->cmd, xs->cmdlen); 730 731 if (xs->xs_control & (XS_CTL_DATA_IN | XS_CTL_DATA_OUT)) { 732 if ((error = bus_dmamap_load(sc->sc_dmat, srb->dmap, 733 xs->data, xs->datalen, NULL, 734 ((xs->xs_control & XS_CTL_NOSLEEP) ? 735 BUS_DMA_NOWAIT : BUS_DMA_WAITOK) | 736 BUS_DMA_STREAMING | 737 ((xs->xs_control & XS_CTL_DATA_IN) ? 738 BUS_DMA_READ : BUS_DMA_WRITE))) != 0) { 739 printf("%s: DMA transfer map unable to load, " 740 "error = %d\n", device_xname(sc->sc_dev), 741 error); 742 xs->error = XS_DRIVER_STUFFUP; 743 /* 744 * free SRB 745 */ 746 TAILQ_INSERT_TAIL(&sc->sc_freesrb, srb, next); 747 splx(s); 748 return; 749 } 750 bus_dmamap_sync(sc->sc_dmat, srb->dmap, 0, 751 srb->dmap->dm_mapsize, 752 (xs->xs_control & XS_CTL_DATA_IN) ? 753 BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE); 754 755 /* Set up the scatter gather list */ 756 for (i = 0; i < srb->dmap->dm_nsegs; i++) { 757 srb->sgentry[i].address = 758 htole32(srb->dmap->dm_segs[i].ds_addr); 759 srb->sgentry[i].length = 760 htole32(srb->dmap->dm_segs[i].ds_len); 761 } 762 srb->buflen = xs->datalen; 763 srb->sgcnt = srb->dmap->dm_nsegs; 764 } else { 765 srb->sgentry[0].address = 0; 766 srb->sgentry[0].length = 0; 767 srb->buflen = 0; 768 srb->sgcnt = 0; 769 } 770 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap, 771 srb->sgoffset, TRM_SG_SIZE, BUS_DMASYNC_PREWRITE); 772 773 sc->sc_phase = PH_BUS_FREE; /* SCSI bus free Phase */ 774 775 srb->sgindex = 0; 776 srb->hastat = 0; 777 srb->tastat = 0; 778 srb->flag = 0; 779 780 TAILQ_INSERT_TAIL(&sc->sc_readysrb, srb, next); 781 if (sc->sc_actsrb == NULL) 782 trm_sched(sc); 783 splx(s); 784 785 if ((xs->xs_control & XS_CTL_POLL) != 0) { 786 int timeout = xs->timeout; 787 788 s = splbio(); 789 do { 790 while (--timeout) { 791 DELAY(1000); 792 if (bus_space_read_2(iot, ioh, 793 TRM_SCSI_STATUS) & SCSIINTERRUPT) 794 break; 795 } 796 if (timeout == 0) { 797 trm_timeout(srb); 798 break; 799 } else 800 trm_intr(sc); 801 } while ((xs->xs_status & XS_STS_DONE) == 0); 802 splx(s); 803 } 804 return; 805 806 case ADAPTER_REQ_GROW_RESOURCES: 807 /* XXX Not supported. */ 808 return; 809 810 case ADAPTER_REQ_SET_XFER_MODE: 811 { 812 struct trm_tinfo *ti; 813 struct scsipi_xfer_mode *xm; 814 815 xm = arg; 816 ti = &sc->sc_tinfo[xm->xm_target]; 817 ti->flag &= ~(SYNC_NEGO_ENABLE|WIDE_NEGO_ENABLE); 818 819 #ifdef notyet 820 if ((xm->xm_mode & PERIPH_CAP_TQING) != 0) 821 ti->flag |= USE_TAG_QUEUING; 822 else 823 #endif 824 ti->flag &= ~USE_TAG_QUEUING; 825 826 if ((xm->xm_mode & PERIPH_CAP_WIDE16) != 0 && 827 (sc->sc_config & HCC_WIDE_CARD) != 0 && 828 (ti->config0 & NTC_DO_WIDE_NEGO) != 0) { 829 ti->flag |= WIDE_NEGO_ENABLE; 830 ti->flag &= ~WIDE_NEGO_DONE; 831 } 832 833 if ((xm->xm_mode & PERIPH_CAP_SYNC) != 0 && 834 (ti->config0 & NTC_DO_SYNC_NEGO) != 0) { 835 ti->flag |= SYNC_NEGO_ENABLE; 836 ti->flag &= ~SYNC_NEGO_DONE; 837 ti->period = trm_clock_period[0]; 838 } 839 840 /* 841 * If we're not going to negotiate, send the 842 * notification now, since it won't happen later. 843 */ 844 if ((ti->flag & (WIDE_NEGO_DONE|SYNC_NEGO_DONE)) == 845 (WIDE_NEGO_DONE|SYNC_NEGO_DONE)) 846 trm_update_xfer_mode(sc, xm->xm_target); 847 848 return; 849 } 850 } 851 } 852 853 static void 854 trm_update_xfer_mode(struct trm_softc *sc, int target) 855 { 856 struct scsipi_xfer_mode xm; 857 struct trm_tinfo *ti; 858 859 ti = &sc->sc_tinfo[target]; 860 xm.xm_target = target; 861 xm.xm_mode = 0; 862 xm.xm_period = 0; 863 xm.xm_offset = 0; 864 865 if ((ti->synctl & WIDE_SYNC) != 0) 866 xm.xm_mode |= PERIPH_CAP_WIDE16; 867 868 if (ti->period > 0) { 869 xm.xm_mode |= PERIPH_CAP_SYNC; 870 xm.xm_period = ti->period; 871 xm.xm_offset = ti->offset; 872 } 873 874 #ifdef notyet 875 if ((ti->flag & USE_TAG_QUEUING) != 0) 876 xm.xm_mode |= PERIPH_CAP_TQING; 877 #endif 878 879 scsipi_async_event(&sc->sc_channel, ASYNC_EVENT_XFER_MODE, &xm); 880 } 881 882 static void 883 trm_sched(struct trm_softc *sc) 884 { 885 struct trm_srb *srb; 886 struct scsipi_periph *periph; 887 struct trm_tinfo *ti; 888 struct trm_linfo *li; 889 int s, lun, tag; 890 891 DPRINTF(("trm_sched...\n")); 892 893 TAILQ_FOREACH(srb, &sc->sc_readysrb, next) { 894 periph = srb->xs->xs_periph; 895 ti = &sc->sc_tinfo[periph->periph_target]; 896 lun = periph->periph_lun; 897 898 /* select type of tag for this command */ 899 if ((ti->flag & NO_RESELECT) != 0 || 900 (ti->flag & USE_TAG_QUEUING) == 0 || 901 (srb->flag & AUTO_REQSENSE) != 0 || 902 (srb->xs->xs_control & XS_CTL_REQSENSE) != 0) 903 tag = 0; 904 else 905 tag = srb->xs->xs_tag_type; 906 #if 0 907 /* XXX use tags for polled commands? */ 908 if (srb->xs->xs_control & XS_CTL_POLL) 909 tag = 0; 910 #endif 911 912 s = splbio(); 913 li = ti->linfo[lun]; 914 if (li == NULL) { 915 /* initialize lun info */ 916 if ((li = malloc(sizeof(*li), M_DEVBUF, 917 M_NOWAIT|M_ZERO)) == NULL) { 918 splx(s); 919 continue; 920 } 921 ti->linfo[lun] = li; 922 } 923 924 if (tag == 0) { 925 /* try to issue this srb as an un-tagged command */ 926 if (li->untagged == NULL) 927 li->untagged = srb; 928 } 929 if (li->untagged != NULL) { 930 tag = 0; 931 if (li->busy != 1 && li->used == 0) { 932 /* we need to issue the untagged command now */ 933 srb = li->untagged; 934 periph = srb->xs->xs_periph; 935 } else { 936 /* not ready yet */ 937 splx(s); 938 continue; 939 } 940 } 941 srb->tag[0] = tag; 942 if (tag != 0) { 943 li->queued[srb->xs->xs_tag_id] = srb; 944 srb->tag[1] = srb->xs->xs_tag_id; 945 li->used++; 946 } 947 948 if (li->untagged != NULL && li->busy != 1) { 949 li->busy = 1; 950 TAILQ_REMOVE(&sc->sc_readysrb, srb, next); 951 sc->sc_actsrb = srb; 952 trm_select(sc, srb); 953 splx(s); 954 break; 955 } 956 if (li->untagged == NULL && tag != 0) { 957 TAILQ_REMOVE(&sc->sc_readysrb, srb, next); 958 sc->sc_actsrb = srb; 959 trm_select(sc, srb); 960 splx(s); 961 break; 962 } else 963 splx(s); 964 } 965 } 966 967 static int 968 trm_select(struct trm_softc *sc, struct trm_srb *srb) 969 { 970 bus_space_tag_t iot = sc->sc_iot; 971 bus_space_handle_t ioh = sc->sc_ioh; 972 struct scsipi_periph *periph = srb->xs->xs_periph; 973 int target = periph->periph_target; 974 int lun = periph->periph_lun; 975 struct trm_tinfo *ti = &sc->sc_tinfo[target]; 976 uint8_t scsicmd; 977 978 DPRINTF(("trm_select.....\n")); 979 980 if ((srb->xs->xs_control & XS_CTL_POLL) == 0) { 981 callout_reset(&srb->xs->xs_callout, mstohz(srb->xs->timeout), 982 trm_timeout, srb); 983 } 984 985 bus_space_write_1(iot, ioh, TRM_SCSI_HOSTID, sc->sc_id); 986 bus_space_write_1(iot, ioh, TRM_SCSI_TARGETID, target); 987 bus_space_write_1(iot, ioh, TRM_SCSI_SYNC, ti->synctl); 988 bus_space_write_1(iot, ioh, TRM_SCSI_OFFSET, ti->offset); 989 /* Flush FIFO */ 990 bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_CLRFIFO); 991 DELAY(10); 992 993 sc->sc_phase = PH_BUS_FREE; /* initial phase */ 994 995 DPRINTF(("cmd = 0x%02x\n", srb->cmd[0])); 996 997 if (((ti->flag & WIDE_NEGO_ENABLE) && 998 (ti->flag & WIDE_NEGO_DONE) == 0) || 999 ((ti->flag & SYNC_NEGO_ENABLE) && 1000 (ti->flag & SYNC_NEGO_DONE) == 0)) { 1001 sc->sc_state = TRM_MSGOUT; 1002 bus_space_write_1(iot, ioh, TRM_SCSI_FIFO, 1003 MSG_IDENTIFY(lun, 0)); 1004 bus_space_write_multi_1(iot, ioh, 1005 TRM_SCSI_FIFO, srb->cmd, srb->cmdlen); 1006 /* it's important for atn stop */ 1007 bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, 1008 DO_DATALATCH | DO_HWRESELECT); 1009 /* SCSI command */ 1010 bus_space_write_1(iot, ioh, TRM_SCSI_COMMAND, SCMD_SEL_ATNSTOP); 1011 DPRINTF(("select with SEL_ATNSTOP\n")); 1012 return 0; 1013 } 1014 1015 if (srb->tag[0] != 0) { 1016 /* Send identify message */ 1017 bus_space_write_1(iot, ioh, TRM_SCSI_FIFO, 1018 MSG_IDENTIFY(lun, 1)); 1019 /* Send Tag id */ 1020 bus_space_write_1(iot, ioh, TRM_SCSI_FIFO, srb->tag[0]); 1021 bus_space_write_1(iot, ioh, TRM_SCSI_FIFO, srb->tag[1]); 1022 scsicmd = SCMD_SEL_ATN3; 1023 DPRINTF(("select with SEL_ATN3\n")); 1024 } else { 1025 /* Send identify message */ 1026 bus_space_write_1(iot, ioh, TRM_SCSI_FIFO, 1027 MSG_IDENTIFY(lun, 1028 (ti->flag & NO_RESELECT) == 0 && 1029 (srb->flag & AUTO_REQSENSE) == 0 && 1030 (srb->xs->xs_control & XS_CTL_REQSENSE) == 0)); 1031 scsicmd = SCMD_SEL_ATN; 1032 DPRINTF(("select with SEL_ATN\n")); 1033 } 1034 sc->sc_state = TRM_START; 1035 1036 /* 1037 * Send CDB ..command block... 1038 */ 1039 bus_space_write_multi_1(iot, ioh, TRM_SCSI_FIFO, srb->cmd, srb->cmdlen); 1040 1041 /* 1042 * If trm_select returns 0: current interrupt status 1043 * is interrupt enable. It's said that SCSI processor is 1044 * unoccupied. 1045 */ 1046 sc->sc_phase = PH_BUS_FREE; /* SCSI bus free Phase */ 1047 /* SCSI command */ 1048 bus_space_write_1(iot, ioh, TRM_SCSI_COMMAND, scsicmd); 1049 return 0; 1050 } 1051 1052 /* 1053 * perform a hard reset on the SCSI bus (and TRM_S1040 chip). 1054 */ 1055 static void 1056 trm_reset(struct trm_softc *sc) 1057 { 1058 bus_space_tag_t iot = sc->sc_iot; 1059 bus_space_handle_t ioh = sc->sc_ioh; 1060 int s; 1061 1062 DPRINTF(("trm_reset.........\n")); 1063 1064 s = splbio(); 1065 1066 /* disable SCSI and DMA interrupt */ 1067 bus_space_write_1(iot, ioh, TRM_DMA_INTEN, 0); 1068 bus_space_write_1(iot, ioh, TRM_SCSI_INTEN, 0); 1069 1070 trm_reset_scsi_bus(sc); 1071 DELAY(100000); 1072 1073 /* Enable SCSI interrupt */ 1074 bus_space_write_1(iot, ioh, TRM_SCSI_INTEN, 1075 EN_SELECT | EN_SELTIMEOUT | EN_DISCONNECT | EN_RESELECTED | 1076 EN_SCSIRESET | EN_BUSSERVICE | EN_CMDDONE); 1077 1078 /* Enable DMA interrupt */ 1079 bus_space_write_1(iot, ioh, TRM_DMA_INTEN, EN_SCSIINTR); 1080 1081 /* Clear DMA FIFO */ 1082 bus_space_write_1(iot, ioh, TRM_DMA_CONTROL, CLRXFIFO); 1083 1084 /* Clear SCSI FIFO */ 1085 bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_CLRFIFO); 1086 1087 sc->sc_actsrb = NULL; 1088 sc->sc_flag = 0; /* RESET_DETECT, RESET_DONE, RESET_DEV */ 1089 1090 splx(s); 1091 } 1092 1093 static void 1094 trm_timeout(void *arg) 1095 { 1096 struct trm_srb *srb = (struct trm_srb *)arg; 1097 struct scsipi_xfer *xs; 1098 struct scsipi_periph *periph; 1099 struct trm_softc *sc; 1100 int s; 1101 1102 if (srb == NULL) { 1103 printf("trm_timeout called with srb == NULL\n"); 1104 return; 1105 } 1106 1107 xs = srb->xs; 1108 if (xs == NULL) { 1109 printf("trm_timeout called with xs == NULL\n"); 1110 return; 1111 } 1112 1113 periph = xs->xs_periph; 1114 scsipi_printaddr(xs->xs_periph); 1115 printf("SCSI OpCode 0x%02x timed out\n", xs->cmd->opcode); 1116 1117 sc = device_private(periph->periph_channel->chan_adapter->adapt_dev); 1118 1119 trm_reset_scsi_bus(sc); 1120 s = splbio(); 1121 srb->flag |= SRB_TIMEOUT; 1122 trm_done(sc, srb); 1123 /* XXX needs more.. */ 1124 splx(s); 1125 } 1126 1127 /* 1128 * Catch an interrupt from the adapter 1129 * Process pending device interrupts. 1130 */ 1131 static int 1132 trm_intr(void *arg) 1133 { 1134 bus_space_tag_t iot; 1135 bus_space_handle_t ioh; 1136 struct trm_softc *sc; 1137 int intstat, stat; 1138 1139 DPRINTF(("trm_intr......\n")); 1140 sc = arg; 1141 if (sc == NULL) 1142 return 0; 1143 1144 iot = sc->sc_iot; 1145 ioh = sc->sc_ioh; 1146 1147 stat = bus_space_read_2(iot, ioh, TRM_SCSI_STATUS); 1148 if ((stat & SCSIINTERRUPT) == 0) 1149 return 0; 1150 1151 DPRINTF(("stat = %04x, ", stat)); 1152 intstat = bus_space_read_1(iot, ioh, TRM_SCSI_INTSTATUS); 1153 1154 DPRINTF(("intstat=%02x, ", intstat)); 1155 if (intstat & (INT_SELTIMEOUT | INT_DISCONNECT)) { 1156 DPRINTF(("\n")); 1157 trm_disconnect(sc); 1158 return 1; 1159 } 1160 if (intstat & INT_RESELECTED) { 1161 DPRINTF(("\n")); 1162 trm_reselect(sc); 1163 return 1; 1164 } 1165 if (intstat & INT_SCSIRESET) { 1166 DPRINTF(("\n")); 1167 trm_scsi_reset_detect(sc); 1168 return 1; 1169 } 1170 if (intstat & (INT_BUSSERVICE | INT_CMDDONE)) { 1171 DPRINTF(("sc->sc_phase = %2d, sc->sc_state = %2d\n", 1172 sc->sc_phase, sc->sc_state)); 1173 /* 1174 * software sequential machine 1175 */ 1176 1177 /* 1178 * call phase0 functions... "phase entry" handle 1179 * every phase before start transfer 1180 */ 1181 switch (sc->sc_phase) { 1182 case PH_DATA_OUT: 1183 trm_dataout_phase0(sc, stat); 1184 break; 1185 case PH_DATA_IN: 1186 trm_datain_phase0(sc, stat); 1187 break; 1188 case PH_COMMAND: 1189 break; 1190 case PH_STATUS: 1191 trm_status_phase0(sc); 1192 stat = PH_BUS_FREE; 1193 break; 1194 case PH_MSG_OUT: 1195 if (sc->sc_state == TRM_UNEXPECT_RESEL || 1196 sc->sc_state == TRM_ABORT_SENT) 1197 stat = PH_BUS_FREE; 1198 break; 1199 case PH_MSG_IN: 1200 trm_msgin_phase0(sc); 1201 stat = PH_BUS_FREE; 1202 break; 1203 case PH_BUS_FREE: 1204 break; 1205 default: 1206 printf("%s: unexpected phase in trm_intr() phase0\n", 1207 device_xname(sc->sc_dev)); 1208 break; 1209 } 1210 1211 sc->sc_phase = stat & PHASEMASK; 1212 1213 switch (sc->sc_phase) { 1214 case PH_DATA_OUT: 1215 trm_dataio_xfer(sc, XFERDATAOUT); 1216 break; 1217 case PH_DATA_IN: 1218 trm_dataio_xfer(sc, XFERDATAIN); 1219 break; 1220 case PH_COMMAND: 1221 trm_command_phase1(sc); 1222 break; 1223 case PH_STATUS: 1224 trm_status_phase1(sc); 1225 break; 1226 case PH_MSG_OUT: 1227 trm_msgout_phase1(sc); 1228 break; 1229 case PH_MSG_IN: 1230 trm_msgin_phase1(sc); 1231 break; 1232 case PH_BUS_FREE: 1233 break; 1234 default: 1235 printf("%s: unexpected phase in trm_intr() phase1\n", 1236 device_xname(sc->sc_dev)); 1237 break; 1238 } 1239 1240 return 1; 1241 } 1242 return 0; 1243 } 1244 1245 static void 1246 trm_msgout_phase1(struct trm_softc *sc) 1247 { 1248 bus_space_tag_t iot = sc->sc_iot; 1249 bus_space_handle_t ioh = sc->sc_ioh; 1250 struct trm_srb *srb; 1251 struct scsipi_periph *periph; 1252 struct trm_tinfo *ti; 1253 1254 bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_CLRFIFO); 1255 1256 srb = sc->sc_actsrb; 1257 1258 /* message out phase */ 1259 if (srb != NULL) { 1260 periph = srb->xs->xs_periph; 1261 ti = &sc->sc_tinfo[periph->periph_target]; 1262 1263 if ((ti->flag & WIDE_NEGO_DOING) == 0 && 1264 (ti->flag & WIDE_NEGO_ENABLE)) { 1265 /* send WDTR */ 1266 ti->flag &= ~SYNC_NEGO_DONE; 1267 1268 sc->sc_msgbuf[0] = MSG_IDENTIFY(periph->periph_lun, 0); 1269 sc->sc_msgbuf[1] = MSG_EXTENDED; 1270 sc->sc_msgbuf[2] = MSG_EXT_WDTR_LEN; 1271 sc->sc_msgbuf[3] = MSG_EXT_WDTR; 1272 sc->sc_msgbuf[4] = MSG_EXT_WDTR_BUS_16_BIT; 1273 sc->sc_msgcnt = 5; 1274 1275 ti->flag |= WIDE_NEGO_DOING; 1276 } else if ((ti->flag & SYNC_NEGO_DOING) == 0 && 1277 (ti->flag & SYNC_NEGO_ENABLE)) { 1278 /* send SDTR */ 1279 int cnt = 0; 1280 1281 if ((ti->flag & WIDE_NEGO_DONE) == 0) 1282 sc->sc_msgbuf[cnt++] = 1283 MSG_IDENTIFY(periph->periph_lun, 0); 1284 1285 sc->sc_msgbuf[cnt++] = MSG_EXTENDED; 1286 sc->sc_msgbuf[cnt++] = MSG_EXT_SDTR_LEN; 1287 sc->sc_msgbuf[cnt++] = MSG_EXT_SDTR; 1288 sc->sc_msgbuf[cnt++] = ti->period; 1289 sc->sc_msgbuf[cnt++] = TRM_MAX_OFFSET; 1290 sc->sc_msgcnt = cnt; 1291 ti->flag |= SYNC_NEGO_DOING; 1292 } 1293 } 1294 if (sc->sc_msgcnt == 0) { 1295 sc->sc_msgbuf[0] = MSG_ABORT; 1296 sc->sc_msgcnt = 1; 1297 sc->sc_state = TRM_ABORT_SENT; 1298 } 1299 1300 DPRINTF(("msgout: cnt = %d, ", sc->sc_msgcnt)); 1301 DPRINTF(("msgbuf = %02x %02x %02x %02x %02x %02x\n", 1302 sc->sc_msgbuf[0], sc->sc_msgbuf[1], sc->sc_msgbuf[2], 1303 sc->sc_msgbuf[3], sc->sc_msgbuf[4], sc->sc_msgbuf[5])); 1304 1305 bus_space_write_multi_1(iot, ioh, TRM_SCSI_FIFO, 1306 sc->sc_msgbuf, sc->sc_msgcnt); 1307 sc->sc_msgcnt = 0; 1308 memset(sc->sc_msgbuf, 0, sizeof(sc->sc_msgbuf)); 1309 1310 /* it's important for atn stop */ 1311 bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_DATALATCH); 1312 1313 /* 1314 * SCSI command 1315 */ 1316 bus_space_write_1(iot, ioh, TRM_SCSI_COMMAND, SCMD_FIFO_OUT); 1317 } 1318 1319 static void 1320 trm_command_phase1(struct trm_softc *sc) 1321 { 1322 bus_space_tag_t iot = sc->sc_iot; 1323 bus_space_handle_t ioh = sc->sc_ioh; 1324 struct trm_srb *srb; 1325 1326 srb = sc->sc_actsrb; 1327 if (srb == NULL) { 1328 DPRINTF(("trm_command_phase1: no active srb\n")); 1329 return; 1330 } 1331 1332 bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_CLRATN | DO_CLRFIFO); 1333 bus_space_write_multi_1(iot, ioh, TRM_SCSI_FIFO, srb->cmd, srb->cmdlen); 1334 1335 sc->sc_state = TRM_COMMAND; 1336 /* it's important for atn stop */ 1337 bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_DATALATCH); 1338 1339 /* 1340 * SCSI command 1341 */ 1342 bus_space_write_1(iot, ioh, TRM_SCSI_COMMAND, SCMD_FIFO_OUT); 1343 } 1344 1345 static void 1346 trm_dataout_phase0(struct trm_softc *sc, int stat) 1347 { 1348 bus_space_tag_t iot = sc->sc_iot; 1349 bus_space_handle_t ioh = sc->sc_ioh; 1350 struct trm_srb *srb; 1351 struct scsipi_periph *periph; 1352 struct trm_tinfo *ti; 1353 struct trm_sg_entry *sg; 1354 int sgindex; 1355 uint32_t xferlen, leftcnt = 0; 1356 1357 if (sc->sc_state == TRM_XFERPAD) 1358 return; 1359 1360 srb = sc->sc_actsrb; 1361 if (srb == NULL) { 1362 DPRINTF(("trm_dataout_phase0: no active srb\n")); 1363 return; 1364 } 1365 periph = srb->xs->xs_periph; 1366 ti = &sc->sc_tinfo[periph->periph_target]; 1367 1368 if ((stat & PARITYERROR) != 0) 1369 srb->flag |= PARITY_ERROR; 1370 1371 if ((stat & SCSIXFERDONE) == 0) { 1372 /* 1373 * when data transfer from DMA FIFO to SCSI FIFO 1374 * if there was some data left in SCSI FIFO 1375 */ 1376 leftcnt = bus_space_read_1(iot, ioh, TRM_SCSI_FIFOCNT) & 1377 SCSI_FIFOCNT_MASK; 1378 if (ti->synctl & WIDE_SYNC) 1379 /* 1380 * if WIDE scsi SCSI FIFOCNT unit is word 1381 * so need to * 2 1382 */ 1383 leftcnt <<= 1; 1384 } 1385 /* 1386 * calculate all the residue data that was not yet transferred 1387 * SCSI transfer counter + left in SCSI FIFO data 1388 * 1389 * .....TRM_SCSI_XCNT (24bits) 1390 * The counter always decrements by one for every SCSI 1391 * byte transfer. 1392 * .....TRM_SCSI_FIFOCNT ( 5bits) 1393 * The counter is SCSI FIFO offset counter 1394 */ 1395 leftcnt += bus_space_read_4(iot, ioh, TRM_SCSI_XCNT); 1396 if (leftcnt == 1) { 1397 leftcnt = 0; 1398 bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_CLRFIFO); 1399 } 1400 if ((leftcnt == 0) || (stat & SCSIXFERCNT_2_ZERO)) { 1401 while ((bus_space_read_1(iot, ioh, TRM_DMA_STATUS) & 1402 DMAXFERCOMP) == 0) 1403 ; /* XXX needs timeout */ 1404 1405 srb->buflen = 0; 1406 } else { 1407 /* Update SG list */ 1408 1409 /* 1410 * if transfer not yet complete 1411 * there were some data residue in SCSI FIFO or 1412 * SCSI transfer counter not empty 1413 */ 1414 if (srb->buflen != leftcnt) { 1415 /* data that had transferred length */ 1416 xferlen = srb->buflen - leftcnt; 1417 1418 /* next time to be transferred length */ 1419 srb->buflen = leftcnt; 1420 1421 /* 1422 * parsing from last time disconnect sgindex 1423 */ 1424 sg = srb->sgentry + srb->sgindex; 1425 for (sgindex = srb->sgindex; 1426 sgindex < srb->sgcnt; 1427 sgindex++, sg++) { 1428 /* 1429 * find last time which SG transfer 1430 * be disconnect 1431 */ 1432 if (xferlen >= le32toh(sg->length)) 1433 xferlen -= le32toh(sg->length); 1434 else { 1435 /* 1436 * update last time 1437 * disconnected SG list 1438 */ 1439 /* residue data length */ 1440 sg->length = 1441 htole32(le32toh(sg->length) 1442 - xferlen); 1443 /* residue data pointer */ 1444 sg->address = 1445 htole32(le32toh(sg->address) 1446 + xferlen); 1447 srb->sgindex = sgindex; 1448 break; 1449 } 1450 } 1451 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap, 1452 srb->sgoffset, TRM_SG_SIZE, BUS_DMASYNC_PREWRITE); 1453 } 1454 } 1455 bus_space_write_1(iot, ioh, TRM_DMA_CONTROL, STOPDMAXFER); 1456 } 1457 1458 static void 1459 trm_datain_phase0(struct trm_softc *sc, int stat) 1460 { 1461 bus_space_tag_t iot = sc->sc_iot; 1462 bus_space_handle_t ioh = sc->sc_ioh; 1463 struct trm_srb *srb; 1464 struct trm_sg_entry *sg; 1465 int sgindex; 1466 uint32_t xferlen, leftcnt = 0; 1467 1468 if (sc->sc_state == TRM_XFERPAD) 1469 return; 1470 1471 srb = sc->sc_actsrb; 1472 if (srb == NULL) { 1473 DPRINTF(("trm_datain_phase0: no active srb\n")); 1474 return; 1475 } 1476 1477 if (stat & PARITYERROR) 1478 srb->flag |= PARITY_ERROR; 1479 1480 leftcnt += bus_space_read_4(iot, ioh, TRM_SCSI_XCNT); 1481 if ((leftcnt == 0) || (stat & SCSIXFERCNT_2_ZERO)) { 1482 while ((bus_space_read_1(iot, ioh, TRM_DMA_STATUS) & 1483 DMAXFERCOMP) == 0) 1484 ; /* XXX needs timeout */ 1485 1486 srb->buflen = 0; 1487 } else { /* phase changed */ 1488 /* 1489 * parsing the case: 1490 * when a transfer not yet complete 1491 * but be disconnected by upper layer 1492 * if transfer not yet complete 1493 * there were some data residue in SCSI FIFO or 1494 * SCSI transfer counter not empty 1495 */ 1496 if (srb->buflen != leftcnt) { 1497 /* 1498 * data that had transferred length 1499 */ 1500 xferlen = srb->buflen - leftcnt; 1501 1502 /* 1503 * next time to be transferred length 1504 */ 1505 srb->buflen = leftcnt; 1506 1507 /* 1508 * parsing from last time disconnect sgindex 1509 */ 1510 sg = srb->sgentry + srb->sgindex; 1511 for (sgindex = srb->sgindex; 1512 sgindex < srb->sgcnt; 1513 sgindex++, sg++) { 1514 /* 1515 * find last time which SG transfer 1516 * be disconnect 1517 */ 1518 if (xferlen >= le32toh(sg->length)) 1519 xferlen -= le32toh(sg->length); 1520 else { 1521 /* 1522 * update last time 1523 * disconnected SG list 1524 */ 1525 /* residue data length */ 1526 sg->length = 1527 htole32(le32toh(sg->length) 1528 - xferlen); 1529 /* residue data pointer */ 1530 sg->address = 1531 htole32(le32toh(sg->address) 1532 + xferlen); 1533 srb->sgindex = sgindex; 1534 break; 1535 } 1536 } 1537 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap, 1538 srb->sgoffset, TRM_SG_SIZE, BUS_DMASYNC_PREWRITE); 1539 } 1540 } 1541 } 1542 1543 static void 1544 trm_dataio_xfer(struct trm_softc *sc, int iodir) 1545 { 1546 bus_space_tag_t iot = sc->sc_iot; 1547 bus_space_handle_t ioh = sc->sc_ioh; 1548 struct trm_srb *srb; 1549 struct scsipi_periph *periph; 1550 struct trm_tinfo *ti; 1551 1552 srb = sc->sc_actsrb; 1553 if (srb == NULL) { 1554 DPRINTF(("trm_dataio_xfer: no active srb\n")); 1555 return; 1556 } 1557 periph = srb->xs->xs_periph; 1558 ti = &sc->sc_tinfo[periph->periph_target]; 1559 1560 if (srb->sgindex < srb->sgcnt) { 1561 if (srb->buflen > 0) { 1562 /* 1563 * load what physical address of Scatter/Gather 1564 * list table want to be transfer 1565 */ 1566 sc->sc_state = TRM_DATA_XFER; 1567 bus_space_write_4(iot, ioh, TRM_DMA_XHIGHADDR, 0); 1568 bus_space_write_4(iot, ioh, TRM_DMA_XLOWADDR, 1569 srb->sgaddr + 1570 srb->sgindex * sizeof(struct trm_sg_entry)); 1571 /* 1572 * load how many bytes in the Scatter/Gather list table 1573 */ 1574 bus_space_write_4(iot, ioh, TRM_DMA_XCNT, 1575 (srb->sgcnt - srb->sgindex) 1576 * sizeof(struct trm_sg_entry)); 1577 /* 1578 * load total xfer length (24bits) max value 16Mbyte 1579 */ 1580 bus_space_write_4(iot, ioh, TRM_SCSI_XCNT, srb->buflen); 1581 /* Start DMA transfer */ 1582 bus_space_write_1(iot, ioh, TRM_DMA_COMMAND, 1583 iodir | SGXFER); 1584 bus_space_write_1(iot, ioh, TRM_DMA_CONTROL, 1585 STARTDMAXFER); 1586 1587 /* Start SCSI transfer */ 1588 /* it's important for atn stop */ 1589 bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, 1590 DO_DATALATCH); 1591 1592 /* 1593 * SCSI command 1594 */ 1595 bus_space_write_1(iot, ioh, TRM_SCSI_COMMAND, 1596 (iodir == XFERDATAOUT) ? 1597 SCMD_DMA_OUT : SCMD_DMA_IN); 1598 } else { /* xfer pad */ 1599 if (srb->sgcnt) { 1600 srb->hastat = H_OVER_UNDER_RUN; 1601 } 1602 bus_space_write_4(iot, ioh, TRM_SCSI_XCNT, 1603 (ti->synctl & WIDE_SYNC) ? 2 : 1); 1604 1605 if (iodir == XFERDATAOUT) 1606 bus_space_write_2(iot, ioh, TRM_SCSI_FIFO, 0); 1607 else 1608 (void)bus_space_read_2(iot, ioh, TRM_SCSI_FIFO); 1609 1610 sc->sc_state = TRM_XFERPAD; 1611 /* it's important for atn stop */ 1612 bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, 1613 DO_DATALATCH); 1614 1615 /* 1616 * SCSI command 1617 */ 1618 bus_space_write_1(iot, ioh, TRM_SCSI_COMMAND, 1619 (iodir == XFERDATAOUT) ? 1620 SCMD_FIFO_OUT : SCMD_FIFO_IN); 1621 } 1622 } 1623 } 1624 1625 static void 1626 trm_status_phase0(struct trm_softc *sc) 1627 { 1628 bus_space_tag_t iot = sc->sc_iot; 1629 bus_space_handle_t ioh = sc->sc_ioh; 1630 struct trm_srb *srb; 1631 1632 srb = sc->sc_actsrb; 1633 if (srb == NULL) { 1634 DPRINTF(("trm_status_phase0: no active srb\n")); 1635 return; 1636 } 1637 srb->tastat = bus_space_read_1(iot, ioh, TRM_SCSI_FIFO); 1638 sc->sc_state = TRM_COMPLETED; 1639 /* it's important for atn stop */ 1640 bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_DATALATCH); 1641 1642 /* 1643 * SCSI command 1644 */ 1645 bus_space_write_1(iot, ioh, TRM_SCSI_COMMAND, SCMD_MSGACCEPT); 1646 } 1647 1648 static void 1649 trm_status_phase1(struct trm_softc *sc) 1650 { 1651 bus_space_tag_t iot = sc->sc_iot; 1652 bus_space_handle_t ioh = sc->sc_ioh; 1653 1654 if (bus_space_read_1(iot, ioh, TRM_DMA_COMMAND) & XFERDATAIN) { 1655 if ((bus_space_read_1(iot, ioh, TRM_SCSI_FIFOCNT) 1656 & SCSI_FIFO_EMPTY) == 0) 1657 bus_space_write_2(iot, ioh, 1658 TRM_SCSI_CONTROL, DO_CLRFIFO); 1659 if ((bus_space_read_1(iot, ioh, TRM_DMA_FIFOSTATUS) 1660 & DMA_FIFO_EMPTY) == 0) 1661 bus_space_write_1(iot, ioh, TRM_DMA_CONTROL, CLRXFIFO); 1662 } else { 1663 if ((bus_space_read_1(iot, ioh, TRM_DMA_FIFOSTATUS) 1664 & DMA_FIFO_EMPTY) == 0) 1665 bus_space_write_1(iot, ioh, TRM_DMA_CONTROL, CLRXFIFO); 1666 if ((bus_space_read_1(iot, ioh, TRM_SCSI_FIFOCNT) 1667 & SCSI_FIFO_EMPTY) == 0) 1668 bus_space_write_2(iot, ioh, 1669 TRM_SCSI_CONTROL, DO_CLRFIFO); 1670 } 1671 sc->sc_state = TRM_STATUS; 1672 /* it's important for atn stop */ 1673 bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_DATALATCH); 1674 1675 /* 1676 * SCSI command 1677 */ 1678 bus_space_write_1(iot, ioh, TRM_SCSI_COMMAND, SCMD_COMP); 1679 } 1680 1681 static void 1682 trm_msgin_phase0(struct trm_softc *sc) 1683 { 1684 bus_space_tag_t iot = sc->sc_iot; 1685 bus_space_handle_t ioh = sc->sc_ioh; 1686 struct trm_srb *srb; 1687 struct scsipi_periph *periph; 1688 struct trm_tinfo *ti; 1689 int index; 1690 uint8_t msgin_code; 1691 1692 msgin_code = bus_space_read_1(iot, ioh, TRM_SCSI_FIFO); 1693 if (sc->sc_state != TRM_EXTEND_MSGIN) { 1694 DPRINTF(("msgin: code = %02x\n", msgin_code)); 1695 switch (msgin_code) { 1696 case MSG_DISCONNECT: 1697 sc->sc_state = TRM_DISCONNECTED; 1698 break; 1699 1700 case MSG_SAVEDATAPOINTER: 1701 break; 1702 1703 case MSG_EXTENDED: 1704 case MSG_SIMPLE_Q_TAG: 1705 case MSG_HEAD_OF_Q_TAG: 1706 case MSG_ORDERED_Q_TAG: 1707 sc->sc_state = TRM_EXTEND_MSGIN; 1708 /* extended message (01h) */ 1709 sc->sc_msgbuf[0] = msgin_code; 1710 1711 sc->sc_msgcnt = 1; 1712 /* extended message length (n) */ 1713 sc->sc_msg = &sc->sc_msgbuf[1]; 1714 1715 break; 1716 case MSG_MESSAGE_REJECT: 1717 /* Reject message */ 1718 srb = sc->sc_actsrb; 1719 if (srb == NULL) { 1720 DPRINTF(("trm_msgin_phase0: " 1721 " message reject without actsrb\n")); 1722 break; 1723 } 1724 periph = srb->xs->xs_periph; 1725 ti = &sc->sc_tinfo[periph->periph_target]; 1726 1727 if (ti->flag & WIDE_NEGO_ENABLE) { 1728 /* do wide nego reject */ 1729 ti->flag |= WIDE_NEGO_DONE; 1730 ti->flag &= 1731 ~(SYNC_NEGO_DONE | WIDE_NEGO_ENABLE); 1732 if ((ti->flag & SYNC_NEGO_ENABLE) && 1733 (ti->flag & SYNC_NEGO_DONE) == 0) { 1734 /* Set ATN, in case ATN was clear */ 1735 sc->sc_state = TRM_MSGOUT; 1736 bus_space_write_2(iot, ioh, 1737 TRM_SCSI_CONTROL, DO_SETATN); 1738 } else 1739 /* Clear ATN */ 1740 bus_space_write_2(iot, ioh, 1741 TRM_SCSI_CONTROL, DO_CLRATN); 1742 } else if (ti->flag & SYNC_NEGO_ENABLE) { 1743 /* do sync nego reject */ 1744 bus_space_write_2(iot, ioh, 1745 TRM_SCSI_CONTROL, DO_CLRATN); 1746 if (ti->flag & SYNC_NEGO_DOING) { 1747 ti->flag &=~(SYNC_NEGO_ENABLE | 1748 SYNC_NEGO_DONE); 1749 ti->synctl = 0; 1750 ti->offset = 0; 1751 bus_space_write_1(iot, ioh, 1752 TRM_SCSI_SYNC, ti->synctl); 1753 bus_space_write_1(iot, ioh, 1754 TRM_SCSI_OFFSET, ti->offset); 1755 } 1756 } 1757 break; 1758 1759 case MSG_IGN_WIDE_RESIDUE: 1760 bus_space_write_4(iot, ioh, TRM_SCSI_XCNT, 1); 1761 (void)bus_space_read_1(iot, ioh, TRM_SCSI_FIFO); 1762 break; 1763 1764 default: 1765 /* 1766 * Restore data pointer message 1767 * Save data pointer message 1768 * Completion message 1769 * NOP message 1770 */ 1771 break; 1772 } 1773 } else { 1774 /* 1775 * when extend message in: sc->sc_state = TRM_EXTEND_MSGIN 1776 * Parsing incoming extented messages 1777 */ 1778 *sc->sc_msg++ = msgin_code; 1779 sc->sc_msgcnt++; 1780 1781 DPRINTF(("extended_msgin: cnt = %d, ", sc->sc_msgcnt)); 1782 DPRINTF(("msgbuf = %02x %02x %02x %02x %02x %02x\n", 1783 sc->sc_msgbuf[0], sc->sc_msgbuf[1], sc->sc_msgbuf[2], 1784 sc->sc_msgbuf[3], sc->sc_msgbuf[4], sc->sc_msgbuf[5])); 1785 1786 switch (sc->sc_msgbuf[0]) { 1787 case MSG_SIMPLE_Q_TAG: 1788 case MSG_HEAD_OF_Q_TAG: 1789 case MSG_ORDERED_Q_TAG: 1790 /* 1791 * is QUEUE tag message : 1792 * 1793 * byte 0: 1794 * HEAD QUEUE TAG (20h) 1795 * ORDERED QUEUE TAG (21h) 1796 * SIMPLE QUEUE TAG (22h) 1797 * byte 1: 1798 * Queue tag (00h - FFh) 1799 */ 1800 if (sc->sc_msgcnt == 2 && sc->sc_actsrb == NULL) { 1801 /* XXX XXX XXX */ 1802 struct trm_linfo *li; 1803 int tagid; 1804 1805 sc->sc_flag &= ~WAIT_TAGMSG; 1806 tagid = sc->sc_msgbuf[1]; 1807 ti = &sc->sc_tinfo[sc->resel_target]; 1808 li = ti->linfo[sc->resel_lun]; 1809 srb = li->queued[tagid]; 1810 if (srb != NULL) { 1811 sc->sc_actsrb = srb; 1812 sc->sc_state = TRM_DATA_XFER; 1813 break; 1814 } else { 1815 printf("%s: invalid tag id\n", 1816 device_xname(sc->sc_dev)); 1817 } 1818 1819 sc->sc_state = TRM_UNEXPECT_RESEL; 1820 sc->sc_msgbuf[0] = MSG_ABORT_TAG; 1821 sc->sc_msgcnt = 1; 1822 bus_space_write_2(iot, ioh, 1823 TRM_SCSI_CONTROL, DO_SETATN); 1824 } else 1825 sc->sc_state = TRM_IDLE; 1826 break; 1827 1828 case MSG_EXTENDED: 1829 srb = sc->sc_actsrb; 1830 if (srb == NULL) { 1831 DPRINTF(("trm_msgin_phase0: " 1832 "extended message without actsrb\n")); 1833 break; 1834 } 1835 periph = srb->xs->xs_periph; 1836 ti = &sc->sc_tinfo[periph->periph_target]; 1837 1838 if (sc->sc_msgbuf[2] == MSG_EXT_WDTR && 1839 sc->sc_msgcnt == 4) { 1840 /* 1841 * is Wide data xfer Extended message : 1842 * ====================================== 1843 * WIDE DATA TRANSFER REQUEST 1844 * ====================================== 1845 * byte 0 : Extended message (01h) 1846 * byte 1 : Extended message length (02h) 1847 * byte 2 : WIDE DATA TRANSFER code (03h) 1848 * byte 3 : Transfer width exponent 1849 */ 1850 if (sc->sc_msgbuf[1] != MSG_EXT_WDTR_LEN) { 1851 /* Length is wrong, reject it */ 1852 ti->flag &= ~(WIDE_NEGO_ENABLE | 1853 WIDE_NEGO_DONE); 1854 sc->sc_state = TRM_MSGOUT; 1855 sc->sc_msgbuf[0] = MSG_MESSAGE_REJECT; 1856 sc->sc_msgcnt = 1; 1857 bus_space_write_2(iot, ioh, 1858 TRM_SCSI_CONTROL, DO_SETATN); 1859 break; 1860 } 1861 1862 if ((ti->flag & WIDE_NEGO_ENABLE) == 0) 1863 sc->sc_msgbuf[3] = 1864 MSG_EXT_WDTR_BUS_8_BIT; 1865 1866 if (sc->sc_msgbuf[3] > 1867 MSG_EXT_WDTR_BUS_32_BIT) { 1868 /* reject_msg: */ 1869 ti->flag &= ~(WIDE_NEGO_ENABLE | 1870 WIDE_NEGO_DONE); 1871 sc->sc_state = TRM_MSGOUT; 1872 sc->sc_msgbuf[0] = MSG_MESSAGE_REJECT; 1873 sc->sc_msgcnt = 1; 1874 bus_space_write_2(iot, ioh, 1875 TRM_SCSI_CONTROL, DO_SETATN); 1876 break; 1877 } 1878 if (sc->sc_msgbuf[3] == MSG_EXT_WDTR_BUS_32_BIT) 1879 /* do 16 bits */ 1880 sc->sc_msgbuf[3] = 1881 MSG_EXT_WDTR_BUS_16_BIT; 1882 if ((ti->flag & WIDE_NEGO_DONE) == 0) { 1883 ti->flag |= WIDE_NEGO_DONE; 1884 ti->flag &= ~(SYNC_NEGO_DONE | 1885 WIDE_NEGO_ENABLE); 1886 if (sc->sc_msgbuf[3] != 1887 MSG_EXT_WDTR_BUS_8_BIT) 1888 /* is Wide data xfer */ 1889 ti->synctl |= WIDE_SYNC; 1890 trm_update_xfer_mode(sc, 1891 periph->periph_target); 1892 } 1893 1894 sc->sc_state = TRM_MSGOUT; 1895 bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, 1896 DO_SETATN); 1897 break; 1898 1899 } else if (sc->sc_msgbuf[2] == MSG_EXT_SDTR && 1900 sc->sc_msgcnt == 5) { 1901 /* 1902 * is 8bit transfer Extended message : 1903 * ================================= 1904 * SYNCHRONOUS DATA TRANSFER REQUEST 1905 * ================================= 1906 * byte 0 : Extended message (01h) 1907 * byte 1 : Extended message length (03) 1908 * byte 2 : SYNC DATA TRANSFER code (01h) 1909 * byte 3 : Transfer period factor 1910 * byte 4 : REQ/ACK offset 1911 */ 1912 if (sc->sc_msgbuf[1] != MSG_EXT_SDTR_LEN) { 1913 /* reject_msg */ 1914 sc->sc_state = TRM_MSGOUT; 1915 sc->sc_msgbuf[0] = MSG_MESSAGE_REJECT; 1916 sc->sc_msgcnt = 1; 1917 bus_space_write_2(iot, ioh, 1918 TRM_SCSI_CONTROL, DO_SETATN); 1919 break; 1920 } 1921 1922 if ((ti->flag & SYNC_NEGO_DONE) == 0) { 1923 ti->flag &= 1924 ~(SYNC_NEGO_ENABLE|SYNC_NEGO_DOING); 1925 ti->flag |= SYNC_NEGO_DONE; 1926 if (sc->sc_msgbuf[3] >= TRM_MAX_PERIOD) 1927 sc->sc_msgbuf[3] = 0; 1928 if (sc->sc_msgbuf[4] > TRM_MAX_OFFSET) 1929 sc->sc_msgbuf[4] = 1930 TRM_MAX_OFFSET; 1931 1932 if (sc->sc_msgbuf[3] == 0 || 1933 sc->sc_msgbuf[4] == 0) { 1934 /* set async */ 1935 ti->synctl = 0; 1936 ti->offset = 0; 1937 } else { 1938 /* set sync */ 1939 /* Transfer period factor */ 1940 ti->period = sc->sc_msgbuf[3]; 1941 /* REQ/ACK offset */ 1942 ti->offset = sc->sc_msgbuf[4]; 1943 for (index = 0; 1944 index < NPERIOD; 1945 index++) 1946 if (ti->period <= 1947 trm_clock_period[ 1948 index]) 1949 break; 1950 1951 ti->synctl |= ALT_SYNC | index; 1952 } 1953 /* 1954 * program SCSI control register 1955 */ 1956 bus_space_write_1(iot, ioh, 1957 TRM_SCSI_SYNC, ti->synctl); 1958 bus_space_write_1(iot, ioh, 1959 TRM_SCSI_OFFSET, ti->offset); 1960 trm_update_xfer_mode(sc, 1961 periph->periph_target); 1962 } 1963 sc->sc_state = TRM_IDLE; 1964 } 1965 break; 1966 default: 1967 break; 1968 } 1969 } 1970 1971 /* it's important for atn stop */ 1972 bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_DATALATCH); 1973 1974 /* 1975 * SCSI command 1976 */ 1977 bus_space_write_1(iot, ioh, TRM_SCSI_COMMAND, SCMD_MSGACCEPT); 1978 } 1979 1980 static void 1981 trm_msgin_phase1(struct trm_softc *sc) 1982 { 1983 bus_space_tag_t iot = sc->sc_iot; 1984 bus_space_handle_t ioh = sc->sc_ioh; 1985 1986 bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_CLRFIFO); 1987 bus_space_write_4(iot, ioh, TRM_SCSI_XCNT, 1); 1988 if (sc->sc_state != TRM_MSGIN && sc->sc_state != TRM_EXTEND_MSGIN) { 1989 sc->sc_state = TRM_MSGIN; 1990 } 1991 1992 /* it's important for atn stop */ 1993 bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_DATALATCH); 1994 1995 /* 1996 * SCSI command 1997 */ 1998 bus_space_write_1(iot, ioh, TRM_SCSI_COMMAND, SCMD_FIFO_IN); 1999 } 2000 2001 static void 2002 trm_disconnect(struct trm_softc *sc) 2003 { 2004 bus_space_tag_t iot = sc->sc_iot; 2005 bus_space_handle_t ioh = sc->sc_ioh; 2006 struct trm_srb *srb; 2007 int s; 2008 2009 s = splbio(); 2010 2011 srb = sc->sc_actsrb; 2012 DPRINTF(("trm_disconnect...............\n")); 2013 2014 if (srb == NULL) { 2015 DPRINTF(("trm_disconnect: no active srb\n")); 2016 DELAY(1000); /* 1 msec */ 2017 2018 bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, 2019 DO_CLRFIFO | DO_HWRESELECT); 2020 return; 2021 } 2022 sc->sc_phase = PH_BUS_FREE; /* SCSI bus free Phase */ 2023 bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, 2024 DO_CLRFIFO | DO_HWRESELECT); 2025 DELAY(100); 2026 2027 switch (sc->sc_state) { 2028 case TRM_UNEXPECT_RESEL: 2029 sc->sc_state = TRM_IDLE; 2030 break; 2031 2032 case TRM_ABORT_SENT: 2033 goto finish; 2034 2035 case TRM_START: 2036 case TRM_MSGOUT: 2037 { 2038 /* Selection time out - discard all LUNs if empty */ 2039 struct scsipi_periph *periph; 2040 struct trm_tinfo *ti; 2041 struct trm_linfo *li; 2042 int lun; 2043 2044 DPRINTF(("selection timeout\n")); 2045 2046 srb->tastat = SCSI_SEL_TIMEOUT; /* XXX Ok? */ 2047 2048 periph = srb->xs->xs_periph; 2049 ti = &sc->sc_tinfo[periph->periph_target]; 2050 for (lun = 0; lun < TRM_MAX_LUNS; lun++) { 2051 li = ti->linfo[lun]; 2052 if (li != NULL && 2053 li->untagged == NULL && li->used == 0) { 2054 ti->linfo[lun] = NULL; 2055 free(li, M_DEVBUF); 2056 } 2057 } 2058 } 2059 goto finish; 2060 2061 case TRM_DISCONNECTED: 2062 sc->sc_actsrb = NULL; 2063 sc->sc_state = TRM_IDLE; 2064 goto sched; 2065 2066 case TRM_COMPLETED: 2067 goto finish; 2068 } 2069 2070 out: 2071 splx(s); 2072 return; 2073 2074 finish: 2075 sc->sc_state = TRM_IDLE; 2076 trm_done(sc, srb); 2077 goto out; 2078 2079 sched: 2080 trm_sched(sc); 2081 goto out; 2082 } 2083 2084 static void 2085 trm_reselect(struct trm_softc *sc) 2086 { 2087 bus_space_tag_t iot = sc->sc_iot; 2088 bus_space_handle_t ioh = sc->sc_ioh; 2089 struct trm_tinfo *ti; 2090 struct trm_linfo *li; 2091 int target, lun; 2092 2093 DPRINTF(("trm_reselect.................\n")); 2094 2095 if (sc->sc_actsrb != NULL) { 2096 /* arbitration lost but reselection win */ 2097 sc->sc_state = TRM_READY; 2098 target = sc->sc_actsrb->xs->xs_periph->periph_target; 2099 ti = &sc->sc_tinfo[target]; 2100 } else { 2101 /* Read Reselected Target Id and LUN */ 2102 target = bus_space_read_1(iot, ioh, TRM_SCSI_TARGETID); 2103 lun = bus_space_read_1(iot, ioh, TRM_SCSI_IDMSG) & 0x07; 2104 ti = &sc->sc_tinfo[target]; 2105 li = ti->linfo[lun]; 2106 DPRINTF(("target = %d, lun = %d\n", target, lun)); 2107 2108 /* 2109 * Check to see if we are running an un-tagged command. 2110 * Otherwise ack the IDENTIFY and wait for a tag message. 2111 */ 2112 if (li != NULL) { 2113 if (li->untagged != NULL && li->busy) { 2114 sc->sc_actsrb = li->untagged; 2115 sc->sc_state = TRM_DATA_XFER; 2116 } else { 2117 sc->resel_target = target; 2118 sc->resel_lun = lun; 2119 /* XXX XXX XXX */ 2120 sc->sc_flag |= WAIT_TAGMSG; 2121 } 2122 } 2123 2124 if ((ti->flag & USE_TAG_QUEUING) == 0 && 2125 sc->sc_actsrb == NULL) { 2126 printf("%s: reselect from target %d lun %d " 2127 "without nexus; sending abort\n", 2128 device_xname(sc->sc_dev), target, lun); 2129 sc->sc_state = TRM_UNEXPECT_RESEL; 2130 sc->sc_msgbuf[0] = MSG_ABORT_TAG; 2131 sc->sc_msgcnt = 1; 2132 bus_space_write_2(iot, ioh, 2133 TRM_SCSI_CONTROL, DO_SETATN); 2134 } 2135 } 2136 sc->sc_phase = PH_BUS_FREE; /* SCSI bus free Phase */ 2137 /* 2138 * Program HA ID, target ID, period and offset 2139 */ 2140 /* target ID */ 2141 bus_space_write_1(iot, ioh, TRM_SCSI_TARGETID, target); 2142 2143 /* host ID */ 2144 bus_space_write_1(iot, ioh, TRM_SCSI_HOSTID, sc->sc_id); 2145 2146 /* period */ 2147 bus_space_write_1(iot, ioh, TRM_SCSI_SYNC, ti->synctl); 2148 2149 /* offset */ 2150 bus_space_write_1(iot, ioh, TRM_SCSI_OFFSET, ti->offset); 2151 2152 /* it's important for atn stop */ 2153 bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_DATALATCH); 2154 /* 2155 * SCSI command 2156 */ 2157 /* to rls the /ACK signal */ 2158 bus_space_write_1(iot, ioh, TRM_SCSI_COMMAND, SCMD_MSGACCEPT); 2159 } 2160 2161 /* 2162 * Complete execution of a SCSI command 2163 * Signal completion to the generic SCSI driver 2164 */ 2165 static void 2166 trm_done(struct trm_softc *sc, struct trm_srb *srb) 2167 { 2168 struct scsipi_xfer *xs = srb->xs; 2169 2170 DPRINTF(("trm_done..................\n")); 2171 2172 if (xs == NULL) 2173 return; 2174 2175 if ((xs->xs_control & XS_CTL_POLL) == 0) 2176 callout_stop(&xs->xs_callout); 2177 2178 if (xs->xs_control & (XS_CTL_DATA_IN | XS_CTL_DATA_OUT) || 2179 srb->flag & AUTO_REQSENSE) { 2180 bus_dmamap_sync(sc->sc_dmat, srb->dmap, 0, 2181 srb->dmap->dm_mapsize, 2182 ((xs->xs_control & XS_CTL_DATA_IN) || 2183 (srb->flag & AUTO_REQSENSE)) ? 2184 BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE); 2185 bus_dmamap_unload(sc->sc_dmat, srb->dmap); 2186 } 2187 2188 /* 2189 * target status 2190 */ 2191 xs->status = srb->tastat; 2192 2193 DPRINTF(("xs->status = 0x%02x\n", xs->status)); 2194 2195 switch (xs->status) { 2196 case SCSI_OK: 2197 /* 2198 * process initiator status...... 2199 * Adapter (initiator) status 2200 */ 2201 if ((srb->hastat & H_OVER_UNDER_RUN) != 0) { 2202 printf("%s: over/under run error\n", 2203 device_xname(sc->sc_dev)); 2204 srb->tastat = 0; 2205 /* Illegal length (over/under run) */ 2206 xs->error = XS_DRIVER_STUFFUP; 2207 } else if ((srb->flag & PARITY_ERROR) != 0) { 2208 printf("%s: parity error\n", device_xname(sc->sc_dev)); 2209 /* Driver failed to perform operation */ 2210 xs->error = XS_DRIVER_STUFFUP; /* XXX */ 2211 } else if ((srb->flag & SRB_TIMEOUT) != 0) { 2212 xs->resid = srb->buflen; 2213 xs->error = XS_TIMEOUT; 2214 } else { 2215 /* No error */ 2216 xs->resid = srb->buflen; 2217 srb->hastat = 0; 2218 if (srb->flag & AUTO_REQSENSE) { 2219 /* there is no error, (sense is invalid) */ 2220 xs->error = XS_SENSE; 2221 } else { 2222 srb->tastat = 0; 2223 xs->error = XS_NOERROR; 2224 } 2225 } 2226 break; 2227 2228 case SCSI_CHECK: 2229 if ((srb->flag & AUTO_REQSENSE) != 0 || 2230 trm_request_sense(sc, srb) != 0) { 2231 printf("%s: request sense failed\n", 2232 device_xname(sc->sc_dev)); 2233 xs->error = XS_DRIVER_STUFFUP; 2234 break; 2235 } 2236 xs->error = XS_SENSE; 2237 return; 2238 2239 case SCSI_SEL_TIMEOUT: 2240 srb->hastat = H_SEL_TIMEOUT; 2241 srb->tastat = 0; 2242 xs->error = XS_SELTIMEOUT; 2243 break; 2244 2245 case SCSI_QUEUE_FULL: 2246 case SCSI_BUSY: 2247 xs->error = XS_BUSY; 2248 break; 2249 2250 case SCSI_RESV_CONFLICT: 2251 DPRINTF(("%s: target reserved at ", device_xname(sc->sc_dev))); 2252 DPRINTF(("%s %d\n", __FILE__, __LINE__)); 2253 xs->error = XS_BUSY; 2254 break; 2255 2256 default: 2257 srb->hastat = 0; 2258 printf("%s: trm_done(): unknown status = %02x\n", 2259 device_xname(sc->sc_dev), xs->status); 2260 xs->error = XS_DRIVER_STUFFUP; 2261 break; 2262 } 2263 2264 trm_dequeue(sc, srb); 2265 if (srb == sc->sc_actsrb) { 2266 sc->sc_actsrb = NULL; 2267 trm_sched(sc); 2268 } 2269 2270 TAILQ_INSERT_TAIL(&sc->sc_freesrb, srb, next); 2271 2272 /* Notify cmd done */ 2273 scsipi_done(xs); 2274 } 2275 2276 static int 2277 trm_request_sense(struct trm_softc *sc, struct trm_srb *srb) 2278 { 2279 struct scsipi_xfer *xs; 2280 struct scsipi_periph *periph; 2281 struct trm_tinfo *ti; 2282 struct trm_linfo *li; 2283 struct scsi_request_sense *ss = (struct scsi_request_sense *)srb->cmd; 2284 int error; 2285 2286 DPRINTF(("trm_request_sense...\n")); 2287 2288 xs = srb->xs; 2289 periph = xs->xs_periph; 2290 2291 srb->flag |= AUTO_REQSENSE; 2292 2293 /* Status of initiator/target */ 2294 srb->hastat = 0; 2295 srb->tastat = 0; 2296 2297 memset(ss, 0, sizeof(*ss)); 2298 ss->opcode = SCSI_REQUEST_SENSE; 2299 ss->byte2 = periph->periph_lun << SCSI_CMD_LUN_SHIFT; 2300 ss->length = sizeof(struct scsi_sense_data); 2301 2302 srb->buflen = sizeof(struct scsi_sense_data); 2303 srb->sgcnt = 1; 2304 srb->sgindex = 0; 2305 srb->cmdlen = sizeof(struct scsi_request_sense); 2306 2307 if ((error = bus_dmamap_load(sc->sc_dmat, srb->dmap, 2308 &xs->sense.scsi_sense, srb->buflen, NULL, 2309 BUS_DMA_READ|BUS_DMA_NOWAIT)) != 0) { 2310 return error; 2311 } 2312 bus_dmamap_sync(sc->sc_dmat, srb->dmap, 0, 2313 srb->buflen, BUS_DMASYNC_PREREAD); 2314 2315 srb->sgentry[0].address = htole32(srb->dmap->dm_segs[0].ds_addr); 2316 srb->sgentry[0].length = htole32(sizeof(struct scsi_sense_data)); 2317 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap, srb->sgoffset, 2318 TRM_SG_SIZE, BUS_DMASYNC_PREWRITE); 2319 2320 ti = &sc->sc_tinfo[periph->periph_target]; 2321 li = ti->linfo[periph->periph_lun]; 2322 if (li->busy > 0) 2323 li->busy = 0; 2324 trm_dequeue(sc, srb); 2325 li->untagged = srb; /* must be executed first to fix C/A */ 2326 li->busy = 2; 2327 2328 if (srb == sc->sc_actsrb) 2329 trm_select(sc, srb); 2330 else { 2331 TAILQ_INSERT_HEAD(&sc->sc_readysrb, srb, next); 2332 if (sc->sc_actsrb == NULL) 2333 trm_sched(sc); 2334 } 2335 return 0; 2336 } 2337 2338 static void 2339 trm_dequeue(struct trm_softc *sc, struct trm_srb *srb) 2340 { 2341 struct scsipi_periph *periph; 2342 struct trm_tinfo *ti; 2343 struct trm_linfo *li; 2344 2345 periph = srb->xs->xs_periph; 2346 ti = &sc->sc_tinfo[periph->periph_target]; 2347 li = ti->linfo[periph->periph_lun]; 2348 2349 if (li->untagged == srb) { 2350 li->busy = 0; 2351 li->untagged = NULL; 2352 } 2353 if (srb->tag[0] != 0 && li->queued[srb->tag[1]] != NULL) { 2354 li->queued[srb->tag[1]] = NULL; 2355 li->used--; 2356 } 2357 } 2358 2359 static void 2360 trm_reset_scsi_bus(struct trm_softc *sc) 2361 { 2362 bus_space_tag_t iot = sc->sc_iot; 2363 bus_space_handle_t ioh = sc->sc_ioh; 2364 int timeout, s; 2365 2366 DPRINTF(("trm_reset_scsi_bus.........\n")); 2367 2368 s = splbio(); 2369 2370 sc->sc_flag |= RESET_DEV; 2371 bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_RSTSCSI); 2372 for (timeout = 20000; timeout >= 0; timeout--) { 2373 DELAY(1); 2374 if ((bus_space_read_2(iot, ioh, TRM_SCSI_INTSTATUS) & 2375 INT_SCSIRESET) == 0) 2376 break; 2377 } 2378 if (timeout == 0) 2379 printf(": scsibus reset timeout\n"); 2380 2381 splx(s); 2382 } 2383 2384 static void 2385 trm_scsi_reset_detect(struct trm_softc *sc) 2386 { 2387 bus_space_tag_t iot = sc->sc_iot; 2388 bus_space_handle_t ioh = sc->sc_ioh; 2389 int s; 2390 2391 DPRINTF(("trm_scsi_reset_detect...............\n")); 2392 DELAY(1000000); /* delay 1 sec */ 2393 2394 s = splbio(); 2395 2396 bus_space_write_1(iot, ioh, TRM_DMA_CONTROL, STOPDMAXFER); 2397 bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_CLRFIFO); 2398 2399 if (sc->sc_flag & RESET_DEV) { 2400 sc->sc_flag |= RESET_DONE; 2401 } else { 2402 sc->sc_flag |= RESET_DETECT; 2403 sc->sc_actsrb = NULL; 2404 sc->sc_flag = 0; 2405 trm_sched(sc); 2406 } 2407 splx(s); 2408 } 2409 2410 /* 2411 * read seeprom 128 bytes to struct eeprom and check checksum. 2412 * If it is wrong, update with default value. 2413 */ 2414 static void 2415 trm_check_eeprom(struct trm_softc *sc, struct trm_nvram *eeprom) 2416 { 2417 struct nvram_target *target; 2418 uint16_t *ep; 2419 uint16_t chksum; 2420 int i; 2421 2422 DPRINTF(("trm_check_eeprom......\n")); 2423 trm_eeprom_read_all(sc, eeprom); 2424 ep = (uint16_t *)eeprom; 2425 chksum = 0; 2426 for (i = 0; i < 64; i++) 2427 chksum += le16toh(*ep++); 2428 2429 if (chksum != TRM_NVRAM_CKSUM) { 2430 DPRINTF(("TRM_S1040 EEPROM Check Sum ERROR (load default).\n")); 2431 /* 2432 * Checksum error, load default 2433 */ 2434 eeprom->subvendor_id[0] = PCI_VENDOR_TEKRAM2 & 0xFF; 2435 eeprom->subvendor_id[1] = PCI_VENDOR_TEKRAM2 >> 8; 2436 eeprom->subsys_id[0] = PCI_PRODUCT_TEKRAM2_DC315 & 0xFF; 2437 eeprom->subsys_id[1] = PCI_PRODUCT_TEKRAM2_DC315 >> 8; 2438 eeprom->subclass = 0x00; 2439 eeprom->vendor_id[0] = PCI_VENDOR_TEKRAM2 & 0xFF; 2440 eeprom->vendor_id[1] = PCI_VENDOR_TEKRAM2 >> 8; 2441 eeprom->device_id[0] = PCI_PRODUCT_TEKRAM2_DC315 & 0xFF; 2442 eeprom->device_id[1] = PCI_PRODUCT_TEKRAM2_DC315 >> 8; 2443 eeprom->reserved0 = 0x00; 2444 2445 for (i = 0, target = eeprom->target; 2446 i < TRM_MAX_TARGETS; 2447 i++, target++) { 2448 target->config0 = 0x77; 2449 target->period = 0x00; 2450 target->config2 = 0x00; 2451 target->config3 = 0x00; 2452 } 2453 2454 eeprom->scsi_id = 7; 2455 eeprom->channel_cfg = 0x0F; 2456 eeprom->delay_time = 0; 2457 eeprom->max_tag = 4; 2458 eeprom->reserved1 = 0x15; 2459 eeprom->boot_target = 0; 2460 eeprom->boot_lun = 0; 2461 eeprom->reserved2 = 0; 2462 memset(eeprom->reserved3, 0, sizeof(eeprom->reserved3)); 2463 2464 chksum = 0; 2465 ep = (uint16_t *)eeprom; 2466 for (i = 0; i < 63; i++) 2467 chksum += le16toh(*ep++); 2468 2469 chksum = TRM_NVRAM_CKSUM - chksum; 2470 eeprom->checksum0 = chksum & 0xFF; 2471 eeprom->checksum1 = chksum >> 8; 2472 2473 trm_eeprom_write_all(sc, eeprom); 2474 } 2475 } 2476 2477 /* 2478 * write struct eeprom 128 bytes to seeprom 2479 */ 2480 static void 2481 trm_eeprom_write_all(struct trm_softc *sc, struct trm_nvram *eeprom) 2482 { 2483 bus_space_tag_t iot = sc->sc_iot; 2484 bus_space_handle_t ioh = sc->sc_ioh; 2485 uint8_t *sbuf = (uint8_t *)eeprom; 2486 uint8_t addr; 2487 2488 /* Enable SEEPROM */ 2489 bus_space_write_1(iot, ioh, TRM_GEN_CONTROL, 2490 bus_space_read_1(iot, ioh, TRM_GEN_CONTROL) | EN_EEPROM); 2491 2492 /* 2493 * Write enable 2494 */ 2495 trm_eeprom_write_cmd(sc, 0x04, 0xFF); 2496 bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, 0); 2497 trm_eeprom_wait(); 2498 2499 for (addr = 0; addr < 128; addr++, sbuf++) 2500 trm_eeprom_set_data(sc, addr, *sbuf); 2501 2502 /* 2503 * Write disable 2504 */ 2505 trm_eeprom_write_cmd(sc, 0x04, 0x00); 2506 bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, 0); 2507 trm_eeprom_wait(); 2508 2509 /* Disable SEEPROM */ 2510 bus_space_write_1(iot, ioh, TRM_GEN_CONTROL, 2511 bus_space_read_1(iot, ioh, TRM_GEN_CONTROL) & ~EN_EEPROM); 2512 } 2513 2514 /* 2515 * write one byte to seeprom 2516 */ 2517 static void 2518 trm_eeprom_set_data(struct trm_softc *sc, uint8_t addr, uint8_t data) 2519 { 2520 bus_space_tag_t iot = sc->sc_iot; 2521 bus_space_handle_t ioh = sc->sc_ioh; 2522 int i; 2523 uint8_t send; 2524 2525 /* 2526 * Send write command & address 2527 */ 2528 trm_eeprom_write_cmd(sc, 0x05, addr); 2529 /* 2530 * Write data 2531 */ 2532 for (i = 0; i < 8; i++, data <<= 1) { 2533 send = NVR_SELECT; 2534 if (data & 0x80) /* Start from bit 7 */ 2535 send |= NVR_BITOUT; 2536 2537 bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, send); 2538 trm_eeprom_wait(); 2539 bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, send | NVR_CLOCK); 2540 trm_eeprom_wait(); 2541 } 2542 bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, NVR_SELECT); 2543 trm_eeprom_wait(); 2544 /* 2545 * Disable chip select 2546 */ 2547 bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, 0); 2548 trm_eeprom_wait(); 2549 bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, NVR_SELECT); 2550 trm_eeprom_wait(); 2551 /* 2552 * Wait for write ready 2553 */ 2554 for (;;) { 2555 bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, 2556 NVR_SELECT | NVR_CLOCK); 2557 trm_eeprom_wait(); 2558 bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, NVR_SELECT); 2559 trm_eeprom_wait(); 2560 if (bus_space_read_1(iot, ioh, TRM_GEN_NVRAM) & NVR_BITIN) 2561 break; 2562 } 2563 /* 2564 * Disable chip select 2565 */ 2566 bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, 0); 2567 } 2568 2569 /* 2570 * read seeprom 128 bytes to struct eeprom 2571 */ 2572 static void 2573 trm_eeprom_read_all(struct trm_softc *sc, struct trm_nvram *eeprom) 2574 { 2575 bus_space_tag_t iot = sc->sc_iot; 2576 bus_space_handle_t ioh = sc->sc_ioh; 2577 uint8_t *sbuf = (uint8_t *)eeprom; 2578 uint8_t addr; 2579 2580 /* 2581 * Enable SEEPROM 2582 */ 2583 bus_space_write_1(iot, ioh, TRM_GEN_CONTROL, 2584 bus_space_read_1(iot, ioh, TRM_GEN_CONTROL) | EN_EEPROM); 2585 2586 for (addr = 0; addr < 128; addr++) 2587 *sbuf++ = trm_eeprom_get_data(sc, addr); 2588 2589 /* 2590 * Disable SEEPROM 2591 */ 2592 bus_space_write_1(iot, ioh, TRM_GEN_CONTROL, 2593 bus_space_read_1(iot, ioh, TRM_GEN_CONTROL) & ~EN_EEPROM); 2594 } 2595 2596 /* 2597 * read one byte from seeprom 2598 */ 2599 static uint8_t 2600 trm_eeprom_get_data(struct trm_softc *sc, uint8_t addr) 2601 { 2602 bus_space_tag_t iot = sc->sc_iot; 2603 bus_space_handle_t ioh = sc->sc_ioh; 2604 int i; 2605 uint8_t read, data = 0; 2606 2607 /* 2608 * Send read command & address 2609 */ 2610 trm_eeprom_write_cmd(sc, 0x06, addr); 2611 2612 for (i = 0; i < 8; i++) { /* Read data */ 2613 bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, 2614 NVR_SELECT | NVR_CLOCK); 2615 trm_eeprom_wait(); 2616 bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, NVR_SELECT); 2617 /* 2618 * Get data bit while falling edge 2619 */ 2620 read = bus_space_read_1(iot, ioh, TRM_GEN_NVRAM); 2621 data <<= 1; 2622 if (read & NVR_BITIN) 2623 data |= 1; 2624 2625 trm_eeprom_wait(); 2626 } 2627 /* 2628 * Disable chip select 2629 */ 2630 bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, 0); 2631 return data; 2632 } 2633 2634 /* 2635 * write SB and Op Code into seeprom 2636 */ 2637 static void 2638 trm_eeprom_write_cmd(struct trm_softc *sc, uint8_t cmd, uint8_t addr) 2639 { 2640 bus_space_tag_t iot = sc->sc_iot; 2641 bus_space_handle_t ioh = sc->sc_ioh; 2642 int i; 2643 uint8_t send; 2644 2645 /* Program SB+OP code */ 2646 for (i = 0; i < 3; i++, cmd <<= 1) { 2647 send = NVR_SELECT; 2648 if (cmd & 0x04) /* Start from bit 2 */ 2649 send |= NVR_BITOUT; 2650 2651 bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, send); 2652 trm_eeprom_wait(); 2653 bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, send | NVR_CLOCK); 2654 trm_eeprom_wait(); 2655 } 2656 2657 /* Program address */ 2658 for (i = 0; i < 7; i++, addr <<= 1) { 2659 send = NVR_SELECT; 2660 if (addr & 0x40) /* Start from bit 6 */ 2661 send |= NVR_BITOUT; 2662 2663 bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, send); 2664 trm_eeprom_wait(); 2665 bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, send | NVR_CLOCK); 2666 trm_eeprom_wait(); 2667 } 2668 bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, NVR_SELECT); 2669 trm_eeprom_wait(); 2670 } 2671