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