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