dpt.c revision 1.18 1 /* $NetBSD: dpt.c,v 1.18 2000/02/12 19:12:54 thorpej Exp $ */
2
3 /*-
4 * Copyright (c) 1997, 1998, 1999, 2000 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Andy Doran, Charles M. Hannum and by Jason R. Thorpe of the Numerical
9 * Aerospace Simulation Facility, NASA Ames Research Center.
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. All advertising materials mentioning features or use of this software
20 * must display the following acknowledgement:
21 * This product includes software developed by the NetBSD
22 * Foundation, Inc. and its contributors.
23 * 4. Neither the name of The NetBSD Foundation nor the names of its
24 * contributors may be used to endorse or promote products derived
25 * from this software without specific prior written permission.
26 *
27 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
28 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
29 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
31 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37 * POSSIBILITY OF SUCH DAMAGE.
38 */
39
40 /*
41 * Portions of this code fall under the following copyright:
42 *
43 * Originally written by Julian Elischer (julian (at) tfs.com)
44 * for TRW Financial Systems for use under the MACH(2.5) operating system.
45 *
46 * TRW Financial Systems, in accordance with their agreement with Carnegie
47 * Mellon University, makes this software available to CMU to distribute
48 * or use in any manner that they see fit as long as this message is kept with
49 * the software. For this reason TFS also grants any other persons or
50 * organisations permission to use or modify this software.
51 *
52 * TFS supplies this software to be publicly redistributed
53 * on the understanding that TFS is not responsible for the correct
54 * functioning of this software in any circumstances.
55 */
56
57 /*
58 * Driver for DPT EATA SCSI adapters.
59 *
60 * TODO:
61 *
62 * o Need a front-end for (newer) ISA boards.
63 * o Handle older firmware better.
64 * o Find a bunch of different firmware EEPROMs and try them out.
65 * o Test with a bunch of different boards.
66 * o dpt_readcfg() should not be using CP_PIO_GETCFG.
67 * o An interface to userland applications.
68 * o Some sysctls or a utility (eg dptctl(8)) to control parameters.
69 */
70
71 #include <sys/cdefs.h>
72 __KERNEL_RCSID(0, "$NetBSD: dpt.c,v 1.18 2000/02/12 19:12:54 thorpej Exp $");
73
74 #include <sys/param.h>
75 #include <sys/systm.h>
76 #include <sys/kernel.h>
77 #include <sys/device.h>
78 #include <sys/queue.h>
79 #include <sys/proc.h>
80 #include <sys/buf.h>
81 #include <sys/endian.h>
82
83 #include <machine/bswap.h>
84 #include <machine/bus.h>
85
86 #include <dev/scsipi/scsi_all.h>
87 #include <dev/scsipi/scsipi_all.h>
88 #include <dev/scsipi/scsiconf.h>
89
90 #include <dev/ic/dptreg.h>
91 #include <dev/ic/dptvar.h>
92
93 /* A default for our link struct */
94 static struct scsipi_device dpt_dev = {
95 NULL, /* Use default error handler */
96 NULL, /* have a queue, served by this */
97 NULL, /* have no async handler */
98 NULL, /* Use default 'done' routine */
99 };
100
101 static char *dpt_cname[] = {
102 "PM3334", "SmartRAID IV",
103 "PM3332", "SmartRAID IV",
104 "PM2144", "SmartCache IV",
105 "PM2044", "SmartCache IV",
106 "PM2142", "SmartCache IV",
107 "PM2042", "SmartCache IV",
108 "PM2041", "SmartCache IV",
109 "PM3224", "SmartRAID III",
110 "PM3222", "SmartRAID III",
111 "PM3021", "SmartRAID III",
112 "PM2124", "SmartCache III",
113 "PM2024", "SmartCache III",
114 "PM2122", "SmartCache III",
115 "PM2022", "SmartCache III",
116 "PM2021", "SmartCache III",
117 "SK2012", "SmartCache Plus",
118 "SK2011", "SmartCache Plus",
119 NULL, "unknown adapter, please report using send-pr(1)",
120 };
121
122 /*
123 * Handle an interrupt from the HBA.
124 */
125 int
126 dpt_intr(xxx_sc)
127 void *xxx_sc;
128 {
129 struct dpt_softc *sc;
130 struct dpt_ccb *ccb;
131 struct eata_sp *sp;
132 static int moretimo;
133 int more;
134
135 sc = xxx_sc;
136 sp = sc->sc_statpack;
137 more = 0;
138
139 #ifdef DEBUG
140 if ((dpt_inb(sc, HA_AUX_STATUS) & HA_AUX_INTR) == 0)
141 printf("%s: spurious intr\n", sc->sc_dv.dv_xname);
142 #endif
143
144 /* Don't get stalled by HA_ST_MORE */
145 if (moretimo < DPT_MORE_TIMEOUT / 100)
146 moretimo = 0;
147
148 for (;;) {
149 /*
150 * HBA might have interrupted while we were dealing with the
151 * last completed command, since we ACK before we deal; keep
152 * polling. If no interrupt is signalled, but the HBA has
153 * indicated that more data will be available soon, hang
154 * around.
155 */
156 if ((dpt_inb(sc, HA_AUX_STATUS) & HA_AUX_INTR) == 0) {
157 if (more != 0 && moretimo++ < DPT_MORE_TIMEOUT / 100) {
158 DELAY(10);
159 continue;
160 }
161 break;
162 }
163
164 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap_ccb, sc->sc_spoff,
165 sizeof(struct eata_sp), BUS_DMASYNC_POSTREAD);
166
167 /* Might have looped before HBA can reset HBA_AUX_INTR */
168 if (sp->sp_ccbid == -1) {
169 DELAY(50);
170 #ifdef DIAGNOSTIC
171 printf("%s: slow reset of HA_AUX_STATUS?",
172 sc->sc_dv.dv_xname);
173 #endif
174 if ((dpt_inb(sc, HA_AUX_STATUS) & HA_AUX_INTR) == 0)
175 return (0);
176 #ifdef DIAGNOSTIC
177 printf("%s: was a slow reset of HA_AUX_STATUS",
178 sc->sc_dv.dv_xname);
179 #endif
180 /* Re-sync DMA map */
181 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap_ccb,
182 sc->sc_spoff, sizeof(struct eata_sp),
183 BUS_DMASYNC_POSTREAD);
184 }
185
186 /* Make sure CCB ID from status packet is realistic */
187 if (sp->sp_ccbid >= 0 && sp->sp_ccbid < sc->sc_nccbs) {
188 /* Sync up DMA map and cache cmd status */
189 ccb = sc->sc_ccbs + sp->sp_ccbid;
190
191 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap_ccb,
192 CCB_OFF(sc, ccb), sizeof(struct dpt_ccb),
193 BUS_DMASYNC_POSTWRITE);
194
195 ccb->ccb_hba_status = sp->sp_hba_status & 0x7F;
196 ccb->ccb_scsi_status = sp->sp_scsi_status;
197
198 /*
199 * Ack the interrupt and process the CCB. If this
200 * is a private CCB it's up to dpt_poll() to notice.
201 */
202 sp->sp_ccbid = -1;
203 ccb->ccb_flg |= CCB_INTR;
204 more = dpt_inb(sc, HA_STATUS) & HA_ST_MORE;
205 if ((ccb->ccb_flg & CCB_PRIVATE) == 0)
206 dpt_done_ccb(sc, ccb);
207 } else {
208 printf("%s: bogus status (returned CCB id %d)\n",
209 sc->sc_dv.dv_xname, sp->sp_ccbid);
210
211 /* Ack the interrupt */
212 sp->sp_ccbid = -1;
213 more = dpt_inb(sc, HA_STATUS) & HA_ST_MORE;
214 }
215
216 /* Don't get stalled by HA_ST_MORE */
217 if (moretimo < DPT_MORE_TIMEOUT / 100)
218 moretimo = 0;
219 }
220
221 return (0);
222 }
223
224 /*
225 * Initialize and attach the HBA. This is the entry point from bus
226 * specific probe-and-attach code.
227 */
228 void
229 dpt_init(sc, intrstr)
230 struct dpt_softc *sc;
231 const char *intrstr;
232 {
233 struct eata_inquiry_data *ei;
234 int i, j, error, rseg, mapsize;
235 bus_dma_segment_t seg;
236 struct eata_cfg *ec;
237 char model[16];
238
239 ec = &sc->sc_ec;
240
241 /* Allocate the CCB/status packet/scratch DMA map and load */
242 sc->sc_nccbs = min(be16toh(*(int16_t *)ec->ec_queuedepth), DPT_MAX_CCBS);
243 sc->sc_spoff = sc->sc_nccbs * sizeof(struct dpt_ccb);
244 sc->sc_scroff = sc->sc_spoff + sizeof(struct eata_sp);
245 sc->sc_scrlen = 256; /* XXX */
246 mapsize = sc->sc_nccbs * sizeof(struct dpt_ccb) + sc->sc_scrlen +
247 sizeof(struct eata_sp);
248
249 if ((error = bus_dmamem_alloc(sc->sc_dmat, mapsize, NBPG, 0,
250 &seg, 1, &rseg, BUS_DMA_NOWAIT)) != 0) {
251 printf("%s: unable to allocate CCBs, error = %d\n",
252 sc->sc_dv.dv_xname, error);
253 return;
254 }
255
256 if ((error = bus_dmamem_map(sc->sc_dmat, &seg, rseg, mapsize,
257 (caddr_t *)&sc->sc_ccbs, BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) != 0) {
258 printf("%s: unable to map CCBs, error = %d\n",
259 sc->sc_dv.dv_xname, error);
260 return;
261 }
262
263 if ((error = bus_dmamap_create(sc->sc_dmat, mapsize, mapsize, 1, 0,
264 BUS_DMA_NOWAIT, &sc->sc_dmamap_ccb)) != 0) {
265 printf("%s: unable to create CCB DMA map, error = %d\n",
266 sc->sc_dv.dv_xname, error);
267 return;
268 }
269
270 if ((error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmamap_ccb,
271 sc->sc_ccbs, mapsize, NULL, BUS_DMA_NOWAIT)) != 0) {
272 printf("%s: unable to load CCB DMA map, error = %d\n",
273 sc->sc_dv.dv_xname, error);
274 return;
275 }
276
277 sc->sc_statpack = (struct eata_sp *)((caddr_t)sc->sc_ccbs +
278 sc->sc_spoff);
279 sc->sc_sppa = sc->sc_dmamap_ccb->dm_segs[0].ds_addr + sc->sc_spoff;
280 sc->sc_scr = (caddr_t)sc->sc_ccbs + sc->sc_scroff;
281 sc->sc_scrpa = sc->sc_dmamap_ccb->dm_segs[0].ds_addr + sc->sc_scroff;
282 sc->sc_statpack->sp_ccbid = -1;
283
284 /* Initialize the CCBs */
285 TAILQ_INIT(&sc->sc_free_ccb);
286 i = dpt_create_ccbs(sc, sc->sc_ccbs, sc->sc_nccbs);
287
288 if (i == 0) {
289 printf("%s: unable to create CCBs\n", sc->sc_dv.dv_xname);
290 return;
291 } else if (i != sc->sc_nccbs) {
292 printf("%s: %d/%d CCBs created!\n", sc->sc_dv.dv_xname, i,
293 sc->sc_nccbs);
294 sc->sc_nccbs = i;
295 }
296
297 /* Set shutdownhook before we start any device activity */
298 sc->sc_sdh = shutdownhook_establish(dpt_shutdown, sc);
299
300 /* Get the page 0 inquiry data from the HBA */
301 dpt_hba_inquire(sc, &ei);
302
303 /*
304 * dpt0 at pci0 dev 12 function 0: DPT SmartRAID III (PM3224A/9X-R)
305 * dpt0: interrupting at irq 10
306 * dpt0: 64 queued commands, 1 channel(s), adapter on ID(s) 7
307 */
308 for (i = 0; ei->ei_vendor[i] != ' ' && i < 8; i++)
309 ;
310 ei->ei_vendor[i] = '\0';
311
312 for (i = 0; ei->ei_model[i] != ' ' && i < 7; i++)
313 model[i] = ei->ei_model[i];
314 for (j = 0; ei->ei_suffix[j] != ' ' && j < 7; j++)
315 model[i++] = ei->ei_model[i];
316 model[i] = '\0';
317
318 /* Find the cannonical name for the board */
319 for (i = 0; dpt_cname[i] != NULL; i += 2)
320 if (memcmp(ei->ei_model, dpt_cname[i], 6) == 0)
321 break;
322
323 printf("%s %s (%s)\n", ei->ei_vendor, dpt_cname[i + 1], model);
324
325 if (intrstr != NULL)
326 printf("%s: interrupting at %s\n", sc->sc_dv.dv_xname, intrstr);
327
328 printf("%s: %d queued commands, %d channel(s), adapter on ID(s)",
329 sc->sc_dv.dv_xname, sc->sc_nccbs, ec->ec_maxchannel + 1);
330
331 for (i = 0; i <= ec->ec_maxchannel; i++)
332 printf(" %d", ec->ec_hba[3 - i]);
333 printf("\n");
334
335 /* Reset the SCSI bus */
336 if (dpt_cmd(sc, NULL, 0, CP_IMMEDIATE, CPI_BUS_RESET))
337 panic("%s: dpt_cmd failed", sc->sc_dv.dv_xname);
338 DELAY(20000);
339
340 /* Fill in the adapter, each link and attach in turn */
341 sc->sc_adapter.scsipi_cmd = dpt_scsi_cmd;
342 sc->sc_adapter.scsipi_minphys = dpt_minphys;
343
344 for (i = 0; i <= ec->ec_maxchannel; i++) {
345 struct scsipi_link *link;
346
347 sc->sc_hbaid[i] = ec->ec_hba[3 - i];
348 link = &sc->sc_link[i];
349 link->scsipi_scsi.channel = i;
350 link->scsipi_scsi.adapter_target = sc->sc_hbaid[i];
351 link->scsipi_scsi.max_lun = ec->ec_maxlun;
352 link->scsipi_scsi.max_target = ec->ec_maxtarget;
353 link->type = BUS_SCSI;
354 link->device = &dpt_dev;
355 link->adapter = &sc->sc_adapter;
356 link->adapter_softc = sc;
357 link->openings = sc->sc_nccbs;
358 config_found(&sc->sc_dv, link, scsiprint);
359 }
360 }
361
362 /*
363 * Our 'shutdownhook' to cleanly shut down the HBA. The HBA must flush
364 * all data from it's cache and mark array groups as clean.
365 */
366 void
367 dpt_shutdown(xxx_sc)
368 void *xxx_sc;
369 {
370 struct dpt_softc *sc;
371
372 sc = xxx_sc;
373 printf("shutting down %s...", sc->sc_dv.dv_xname);
374 dpt_cmd(sc, NULL, 0, CP_IMMEDIATE, CPI_POWEROFF_WARN);
375 DELAY(5000*1000);
376 printf(" done\n");
377 }
378
379 /*
380 * Send an EATA command to the HBA.
381 */
382 int
383 dpt_cmd(sc, cp, addr, eatacmd, icmd)
384 struct dpt_softc *sc;
385 struct eata_cp *cp;
386 u_int32_t addr;
387 int eatacmd, icmd;
388 {
389 int i;
390
391 for (i = 20000; i; i--) {
392 if ((dpt_inb(sc, HA_AUX_STATUS) & HA_AUX_BUSY) == 0)
393 break;
394 DELAY(50);
395 }
396
397 /* Not the most graceful way to handle this */
398 if (i == 0) {
399 printf("%s: HBA timeout on EATA command issue; aborting\n",
400 sc->sc_dv.dv_xname);
401 return (-1);
402 }
403
404 if (cp == NULL)
405 addr = 0;
406
407 dpt_outl(sc, HA_DMA_BASE, (u_int32_t)addr);
408
409 if (eatacmd == CP_IMMEDIATE) {
410 if (cp == NULL) {
411 /* XXX should really pass meaningful values */
412 dpt_outb(sc, HA_ICMD_CODE2, 0);
413 dpt_outb(sc, HA_ICMD_CODE1, 0);
414 }
415 dpt_outb(sc, HA_ICMD, icmd);
416 }
417
418 dpt_outb(sc, HA_COMMAND, eatacmd);
419 return (0);
420 }
421
422 /*
423 * Wait for the HBA status register to reach a specific state.
424 */
425 int
426 dpt_wait(sc, mask, state, ms)
427 struct dpt_softc *sc;
428 u_int8_t mask, state;
429 int ms;
430 {
431
432 for (ms *= 10; ms; ms--) {
433 if ((dpt_inb(sc, HA_STATUS) & mask) == state)
434 return (0);
435 DELAY(100);
436 }
437 return (-1);
438 }
439
440 /*
441 * Wait for the specified CCB to finish. This is used when we may not be
442 * able to sleep and/or interrupts are disabled (eg autoconfiguration).
443 * The timeout value from the CCB is used. This should only be used for
444 * CCB_PRIVATE requests; otherwise the CCB will get recycled before we get
445 * a look at it.
446 */
447 int
448 dpt_poll(sc, ccb)
449 struct dpt_softc *sc;
450 struct dpt_ccb *ccb;
451 {
452 int i;
453
454 #ifdef DEBUG
455 if ((ccb->ccb_flg & CCB_PRIVATE) == 0)
456 panic("dpt_poll: called for non-CCB_PRIVATE request\n");
457 #endif
458
459 if ((ccb->ccb_flg & CCB_INTR) != 0)
460 return (0);
461
462 for (i = ccb->ccb_timeout * 20; i; i--) {
463 if ((dpt_inb(sc, HA_AUX_STATUS) & HA_AUX_INTR) != 0) {
464 dpt_intr(sc);
465 if ((ccb->ccb_flg & CCB_INTR) != 0)
466 return (0);
467 }
468 DELAY(50);
469 }
470
471 return (-1);
472 }
473
474 /*
475 * Read the EATA configuration from the HBA and perform some sanity checks.
476 */
477 int
478 dpt_readcfg(sc)
479 struct dpt_softc *sc;
480 {
481 struct eata_cfg *ec;
482 int i, j, stat;
483 u_int16_t *p;
484
485 ec = &sc->sc_ec;
486
487 /* Older firmware may puke if we talk to it too soon after reset */
488 dpt_outb(sc, HA_COMMAND, CP_RESET);
489 DELAY(750000);
490
491 for (i = 1000; i; i--) {
492 if ((dpt_inb(sc, HA_STATUS) & HA_ST_READY) != 0)
493 break;
494 DELAY(2000);
495 }
496
497 if (i == 0) {
498 printf("%s: HBA not ready after reset (hba status:%02x)\n",
499 sc->sc_dv.dv_xname, dpt_inb(sc, HA_STATUS));
500 return (-1);
501 }
502
503 while((((stat = dpt_inb(sc, HA_STATUS))
504 != (HA_ST_READY|HA_ST_SEEK_COMPLETE))
505 && (stat != (HA_ST_READY|HA_ST_SEEK_COMPLETE|HA_ST_ERROR))
506 && (stat != (HA_ST_READY|HA_ST_SEEK_COMPLETE|HA_ST_ERROR|HA_ST_DRQ)))
507 || (dpt_wait(sc, HA_ST_BUSY, 0, 2000))) {
508 /* RAID drives still spinning up? */
509 if((dpt_inb(sc, HA_ERROR) != 'D')
510 || (dpt_inb(sc, HA_ERROR + 1) != 'P')
511 || (dpt_inb(sc, HA_ERROR + 2) != 'T')) {
512 printf("%s: HBA not ready\n", sc->sc_dv.dv_xname);
513 return (-1);
514 }
515 }
516
517 /*
518 * Issue the read-config command and wait for the data to appear.
519 * XXX we shouldn't be doing this with PIO, but it makes it a lot
520 * easier as no DMA setup is required.
521 */
522 dpt_outb(sc, HA_COMMAND, CP_PIO_GETCFG);
523 memset(ec, 0, sizeof(*ec));
524 i = ((int)&((struct eata_cfg *)0)->ec_cfglen +
525 sizeof(ec->ec_cfglen)) >> 1;
526 p = (u_int16_t *)ec;
527
528 if (dpt_wait(sc, 0xFF, HA_ST_DATA_RDY, 2000)) {
529 printf("%s: cfg data didn't appear (hba status:%02x)\n",
530 sc->sc_dv.dv_xname, dpt_inb(sc, HA_STATUS));
531 return (-1);
532 }
533
534 /* Begin reading */
535 while (i--)
536 *p++ = dpt_inw(sc, HA_DATA);
537
538 if ((i = ec->ec_cfglen) > (sizeof(struct eata_cfg)
539 - (int)(&(((struct eata_cfg *)0L)->ec_cfglen))
540 - sizeof(ec->ec_cfglen)))
541 i = sizeof(struct eata_cfg)
542 - (int)(&(((struct eata_cfg *)0L)->ec_cfglen))
543 - sizeof(ec->ec_cfglen);
544
545 j = i + (int)(&(((struct eata_cfg *)0L)->ec_cfglen)) +
546 sizeof(ec->ec_cfglen);
547 i >>= 1;
548
549 while (i--)
550 *p++ = dpt_inw(sc, HA_DATA);
551
552 /* Flush until we have read 512 bytes. */
553 i = (512 - j + 1) >> 1;
554 while (i--)
555 dpt_inw(sc, HA_DATA);
556
557 /* Defaults for older Firmware */
558 if (p <= (u_short *)&ec->ec_hba[DPT_MAX_CHANNELS - 1])
559 ec->ec_hba[DPT_MAX_CHANNELS - 1] = 7;
560
561 if ((dpt_inb(sc, HA_STATUS) & HA_ST_ERROR) != 0) {
562 printf("%s: HBA error\n", sc->sc_dv.dv_xname);
563 return (-1);
564 }
565
566 if (memcmp(ec->ec_eatasig, "EATA", 4) != 0) {
567 printf("%s: EATA signature mismatch\n", sc->sc_dv.dv_xname);
568 return (-1);
569 }
570
571 if (!ec->ec_hbavalid) {
572 printf("%s: ec_hba field invalid\n", sc->sc_dv.dv_xname);
573 return (-1);
574 }
575
576 if (!ec->ec_dmasupported) {
577 printf("%s: DMA not supported\n", sc->sc_dv.dv_xname);
578 return (-1);
579 }
580
581 return (0);
582 }
583
584 /*
585 * Adjust the size of each I/O before it passes to the SCSI layer.
586 */
587 void
588 dpt_minphys(bp)
589 struct buf *bp;
590 {
591
592 if (bp->b_bcount > DPT_MAX_XFER)
593 bp->b_bcount = DPT_MAX_XFER;
594 minphys(bp);
595 }
596
597 /*
598 * Put a CCB onto the freelist.
599 */
600 void
601 dpt_free_ccb(sc, ccb)
602 struct dpt_softc *sc;
603 struct dpt_ccb *ccb;
604 {
605 int s;
606
607 s = splbio();
608 ccb->ccb_flg = 0;
609 TAILQ_INSERT_HEAD(&sc->sc_free_ccb, ccb, ccb_chain);
610
611 /* Wake anybody waiting for a free ccb */
612 if (ccb->ccb_chain.tqe_next == 0)
613 wakeup(&sc->sc_free_ccb);
614 splx(s);
615 }
616
617 /*
618 * Initialize the specified CCB.
619 */
620 int
621 dpt_init_ccb(sc, ccb)
622 struct dpt_softc *sc;
623 struct dpt_ccb *ccb;
624 {
625 int error;
626
627 /* Create the DMA map for this CCB's data */
628 error = bus_dmamap_create(sc->sc_dmat, DPT_MAX_XFER, DPT_SG_SIZE,
629 DPT_MAX_XFER, 0, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW,
630 &ccb->ccb_dmamap_xfer);
631
632 if (error) {
633 printf("%s: can't create ccb dmamap (%d)\n",
634 sc->sc_dv.dv_xname, error);
635 return (error);
636 }
637
638 ccb->ccb_flg = 0;
639 ccb->ccb_ccbpa = sc->sc_dmamap_ccb->dm_segs[0].ds_addr +
640 CCB_OFF(sc, ccb);
641 return (0);
642 }
643
644 /*
645 * Create a set of CCBs and add them to the free list.
646 */
647 int
648 dpt_create_ccbs(sc, ccbstore, count)
649 struct dpt_softc *sc;
650 struct dpt_ccb *ccbstore;
651 int count;
652 {
653 struct dpt_ccb *ccb;
654 int i, error;
655
656 memset(ccbstore, 0, sizeof(struct dpt_ccb) * count);
657
658 for (i = 0, ccb = ccbstore; i < count; i++, ccb++) {
659 if ((error = dpt_init_ccb(sc, ccb)) != 0) {
660 printf("%s: unable to init ccb, error = %d\n",
661 sc->sc_dv.dv_xname, error);
662 break;
663 }
664 ccb->ccb_id = i;
665 TAILQ_INSERT_TAIL(&sc->sc_free_ccb, ccb, ccb_chain);
666 }
667
668 return (i);
669 }
670
671 /*
672 * Get a free ccb. If there are none, see if we can allocate a new one. If
673 * none are available right now and we are permitted to sleep, then wait
674 * until one becomes free, otherwise return an error.
675 */
676 struct dpt_ccb *
677 dpt_alloc_ccb(sc, flg)
678 struct dpt_softc *sc;
679 int flg;
680 {
681 struct dpt_ccb *ccb;
682 int s;
683
684 s = splbio();
685
686 for (;;) {
687 ccb = TAILQ_FIRST(&sc->sc_free_ccb);
688 if (ccb) {
689 TAILQ_REMOVE(&sc->sc_free_ccb, ccb, ccb_chain);
690 break;
691 }
692 if ((flg & XS_CTL_NOSLEEP) != 0) {
693 splx(s);
694 return (NULL);
695 }
696 tsleep(&sc->sc_free_ccb, PRIBIO, "dptccb", 0);
697 }
698
699 ccb->ccb_flg |= CCB_ALLOC;
700 splx(s);
701 return (ccb);
702 }
703
704 /*
705 * We have a CCB which has been processed by the HBA, now we look to see how
706 * the operation went. CCBs marked with CCB_PRIVATE are not automatically
707 * passed here by dpt_intr().
708 */
709 void
710 dpt_done_ccb(sc, ccb)
711 struct dpt_softc *sc;
712 struct dpt_ccb *ccb;
713 {
714 struct scsipi_sense_data *s1, *s2;
715 struct scsipi_xfer *xs;
716 bus_dma_tag_t dmat;
717
718 dmat = sc->sc_dmat;
719 xs = ccb->ccb_xs;
720
721 SC_DEBUG(xs->sc_link, SDEV_DB2, ("dpt_done_ccb\n"));
722
723 /*
724 * If we were a data transfer, unload the map that described the
725 * data buffer.
726 */
727 if (xs->datalen) {
728 bus_dmamap_sync(dmat, ccb->ccb_dmamap_xfer, 0,
729 ccb->ccb_dmamap_xfer->dm_mapsize,
730 (xs->xs_control & XS_CTL_DATA_IN) ? BUS_DMASYNC_POSTREAD :
731 BUS_DMASYNC_POSTWRITE);
732 bus_dmamap_unload(dmat, ccb->ccb_dmamap_xfer);
733 }
734
735 /*
736 * Otherwise, put the results of the operation into the xfer and
737 * call whoever started it.
738 */
739 #ifdef DIAGNOSTIC
740 if ((ccb->ccb_flg & CCB_ALLOC) == 0) {
741 panic("%s: done ccb not allocated!\n", sc->sc_dv.dv_xname);
742 return;
743 }
744 #endif
745
746 if (xs->error == XS_NOERROR) {
747 if (ccb->ccb_hba_status != HA_NO_ERROR) {
748 switch (ccb->ccb_hba_status) {
749 case HA_ERROR_SEL_TO:
750 xs->error = XS_SELTIMEOUT;
751 break;
752 case HA_ERROR_RESET:
753 xs->error = XS_RESET;
754 break;
755 default: /* Other scsi protocol messes */
756 printf("%s: HBA status %x\n",
757 sc->sc_dv.dv_xname, ccb->ccb_hba_status);
758 xs->error = XS_DRIVER_STUFFUP;
759 }
760 } else if (ccb->ccb_scsi_status != SCSI_OK) {
761 switch (ccb->ccb_scsi_status) {
762 case SCSI_CHECK:
763 s1 = &ccb->ccb_sense;
764 s2 = &xs->sense.scsi_sense;
765 *s2 = *s1;
766 xs->error = XS_SENSE;
767 break;
768 case SCSI_BUSY:
769 xs->error = XS_BUSY;
770 break;
771 default:
772 printf("%s: SCSI status %x\n",
773 sc->sc_dv.dv_xname, ccb->ccb_scsi_status);
774 xs->error = XS_DRIVER_STUFFUP;
775 }
776 } else
777 xs->resid = 0;
778
779 xs->status = ccb->ccb_scsi_status;
780 }
781
782 /* Free up the CCB and mark the command as done */
783 dpt_free_ccb(sc, ccb);
784 xs->xs_status |= XS_STS_DONE;
785 scsipi_done(xs);
786
787 /*
788 * If there are entries in the software queue, try to run the first
789 * one. We should be more or less guaranteed to succeed, since we
790 * just freed an CCB. NOTE: dpt_scsi_cmd() relies on our calling it
791 * with the first entry in the queue.
792 */
793 if ((xs = TAILQ_FIRST(&sc->sc_queue)) != NULL)
794 dpt_scsi_cmd(xs);
795 }
796
797 /*
798 * Start a SCSI command.
799 */
800 int
801 dpt_scsi_cmd(xs)
802 struct scsipi_xfer *xs;
803 {
804 int error, i, flags, s, fromqueue, dontqueue, nowait;
805 struct scsipi_link *sc_link;
806 struct dpt_softc *sc;
807 struct dpt_ccb *ccb;
808 struct eata_sg *sg;
809 struct eata_cp *cp;
810 bus_dma_tag_t dmat;
811 bus_dmamap_t xfer;
812
813 sc_link = xs->sc_link;
814 flags = xs->xs_control;
815 sc = sc_link->adapter_softc;
816 dmat = sc->sc_dmat;
817 fromqueue = 0;
818 dontqueue = 0;
819 nowait = 0;
820
821 SC_DEBUG(sc_link, SDEV_DB2, ("dpt_scsi_cmd\n"));
822
823 /* Protect the queue */
824 s = splbio();
825
826 /*
827 * If we're running the queue from dpt_done_ccb(), we've been called
828 * with the first queue entry as our argument.
829 */
830 if (xs == TAILQ_FIRST(&sc->sc_queue)) {
831 TAILQ_REMOVE(&sc->sc_queue, xs, adapter_q);
832 fromqueue = 1;
833 nowait = 1;
834 } else {
835 /* Cmds must be no more than 12 bytes for us */
836 if (xs->cmdlen > 12) {
837 splx(s);
838 xs->error = XS_DRIVER_STUFFUP;
839 return (COMPLETE);
840 }
841
842 /* XXX we can't reset devices just yet */
843 if ((flags & XS_CTL_RESET) != 0) {
844 xs->error = XS_DRIVER_STUFFUP;
845 return (COMPLETE);
846 }
847
848 /* Polled requests can't be queued for later */
849 dontqueue = flags & XS_CTL_POLL;
850
851 /* If there are jobs in the queue, run them first */
852 if (TAILQ_FIRST(&sc->sc_queue) != NULL) {
853 /*
854 * If we can't queue we abort, since we must
855 * preserve the queue order.
856 */
857 if (dontqueue) {
858 splx(s);
859 xs->error = XS_DRIVER_STUFFUP;
860 return (TRY_AGAIN_LATER);
861 }
862
863 /* Swap with the first queue entry. */
864 TAILQ_INSERT_TAIL(&sc->sc_queue, xs, adapter_q);
865 xs = TAILQ_FIRST(&sc->sc_queue);
866 TAILQ_REMOVE(&sc->sc_queue, xs, adapter_q);
867 fromqueue = 1;
868 }
869 }
870
871 /* Get a CCB */
872 if (nowait)
873 flags |= XS_CTL_NOSLEEP;
874 if ((ccb = dpt_alloc_ccb(sc, flags)) == NULL) {
875 /* If we can't queue, we lose */
876 if (dontqueue) {
877 splx(s);
878 xs->error = XS_DRIVER_STUFFUP;
879 return (TRY_AGAIN_LATER);
880 }
881
882 /*
883 * Stuff request into the queue, in front if we came off
884 * it in the first place.
885 */
886 if (fromqueue)
887 TAILQ_INSERT_HEAD(&sc->sc_queue, xs, adapter_q);
888 else
889 TAILQ_INSERT_TAIL(&sc->sc_queue, xs, adapter_q);
890 splx(s);
891 return (SUCCESSFULLY_QUEUED);
892 }
893
894 splx(s);
895
896 ccb->ccb_xs = xs;
897 ccb->ccb_timeout = xs->timeout;
898
899 cp = &ccb->ccb_eata_cp;
900 memcpy(&cp->cp_scsi_cmd, xs->cmd, xs->cmdlen);
901 cp->cp_ccbid = ccb->ccb_id;
902 cp->cp_id = sc_link->scsipi_scsi.target;
903 cp->cp_lun = sc_link->scsipi_scsi.lun;
904 cp->cp_channel = sc_link->scsipi_scsi.channel;
905 cp->cp_senselen = sizeof(ccb->ccb_sense);
906 cp->cp_stataddr = htobe32(sc->sc_sppa);
907 cp->cp_dispri = 1;
908 cp->cp_identify = 1;
909 cp->cp_autosense = 1;
910 cp->cp_datain = ((flags & XS_CTL_DATA_IN) != 0);
911 cp->cp_dataout = ((flags & XS_CTL_DATA_OUT) != 0);
912 cp->cp_interpret = (sc->sc_hbaid[sc_link->scsipi_scsi.channel] ==
913 sc_link->scsipi_scsi.target);
914
915 /* Synchronous xfers musn't write-back through the cache */
916 if (xs->bp != NULL && (xs->bp->b_flags & (B_ASYNC | B_READ)) == 0)
917 cp->cp_nocache = 1;
918 else
919 cp->cp_nocache = 0;
920
921 cp->cp_senseaddr = htobe32(sc->sc_dmamap_ccb->dm_segs[0].ds_addr +
922 CCB_OFF(sc, ccb) + offsetof(struct dpt_ccb, ccb_sense));
923
924 if (xs->datalen != 0) {
925 xfer = ccb->ccb_dmamap_xfer;
926 #ifdef TFS
927 if ((flags & XS_CTL_DATA_UIO) != 0) {
928 error = bus_dmamap_load_uio(dmat, xfer,
929 (struct uio *)xs->data, (flags & XS_CTL_NOSLEEP) ?
930 BUS_DMA_NOWAIT : BUS_DMA_WAITOK);
931 } else
932 #endif /*TFS */
933 {
934 error = bus_dmamap_load(dmat, xfer, xs->data,
935 xs->datalen, NULL, (flags & XS_CTL_NOSLEEP) ?
936 BUS_DMA_NOWAIT : BUS_DMA_WAITOK);
937 }
938
939 if (error) {
940 printf("%s: dpt_scsi_cmd: ", sc->sc_dv.dv_xname);
941 if (error == EFBIG)
942 printf("more than %d dma segs\n", DPT_SG_SIZE);
943 else
944 printf("error %d loading dma map\n", error);
945
946 xs->error = XS_DRIVER_STUFFUP;
947 dpt_free_ccb(sc, ccb);
948 return (COMPLETE);
949 }
950
951 bus_dmamap_sync(dmat, xfer, 0, xfer->dm_mapsize,
952 (flags & XS_CTL_DATA_IN) ? BUS_DMASYNC_PREREAD :
953 BUS_DMASYNC_PREWRITE);
954
955 /* Don't bother using scatter/gather for just 1 segment */
956 if (xfer->dm_nsegs == 1) {
957 cp->cp_dataaddr = htobe32(xfer->dm_segs[0].ds_addr);
958 cp->cp_datalen = htobe32(xfer->dm_segs[0].ds_len);
959 cp->cp_scatter = 0;
960 } else {
961 /*
962 * Load the hardware scatter/gather map with the
963 * contents of the DMA map.
964 */
965 sg = ccb->ccb_sg;
966 for (i = 0; i < xfer->dm_nsegs; i++, sg++) {
967 sg->sg_addr = htobe32(xfer->dm_segs[i].ds_addr);
968 sg->sg_len = htobe32(xfer->dm_segs[i].ds_len);
969 }
970 cp->cp_dataaddr = htobe32(CCB_OFF(sc, ccb) +
971 sc->sc_dmamap_ccb->dm_segs[0].ds_addr +
972 offsetof(struct dpt_ccb, ccb_sg));
973 cp->cp_datalen = htobe32(i * sizeof(struct eata_sg));
974 cp->cp_scatter = 1;
975 }
976 } else {
977 cp->cp_dataaddr = 0;
978 cp->cp_datalen = 0;
979 cp->cp_scatter = 0;
980 }
981
982 /* Sync up CCB and status packet */
983 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap_ccb, CCB_OFF(sc, ccb),
984 sizeof(struct dpt_ccb), BUS_DMASYNC_PREWRITE);
985 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap_ccb, sc->sc_spoff,
986 sizeof(struct eata_sp), BUS_DMASYNC_PREREAD);
987
988 /*
989 * Start the command. If we are polling on completion, mark it
990 * private so that dpt_intr/dpt_done_ccb don't recycle the CCB
991 * without us noticing.
992 */
993 if (dontqueue != 0)
994 ccb->ccb_flg |= CCB_PRIVATE;
995
996 if (dpt_cmd(sc, &ccb->ccb_eata_cp, ccb->ccb_ccbpa, CP_DMA_CMD, 0)) {
997 printf("%s: dpt_cmd failed\n", sc->sc_dv.dv_xname);
998 xs->error = XS_DRIVER_STUFFUP;
999 dpt_free_ccb(sc, ccb);
1000 return (TRY_AGAIN_LATER);
1001 }
1002
1003 if (dontqueue == 0)
1004 return (SUCCESSFULLY_QUEUED);
1005
1006 /* Don't wait longer than this single command wants to wait */
1007 if (dpt_poll(sc, ccb)) {
1008 dpt_timeout(ccb);
1009 /* Wait for abort to complete */
1010 if (dpt_poll(sc, ccb))
1011 dpt_timeout(ccb);
1012 }
1013
1014 dpt_done_ccb(sc, ccb);
1015 return (COMPLETE);
1016 }
1017
1018 /*
1019 * Specified CCB has timed out, abort it.
1020 */
1021 void
1022 dpt_timeout(arg)
1023 void *arg;
1024 {
1025 struct scsipi_link *sc_link;
1026 struct scsipi_xfer *xs;
1027 struct dpt_softc *sc;
1028 struct dpt_ccb *ccb;
1029 int s;
1030
1031 ccb = arg;
1032 xs = ccb->ccb_xs;
1033 sc_link = xs->sc_link;
1034 sc = sc_link->adapter_softc;
1035
1036 scsi_print_addr(sc_link);
1037 printf("timed out (status:%02x aux status:%02x)",
1038 dpt_inb(sc, HA_STATUS), dpt_inb(sc, HA_AUX_STATUS));
1039
1040 s = splbio();
1041
1042 if ((ccb->ccb_flg & CCB_ABORT) != 0) {
1043 /* Abort timed out, reset the HBA */
1044 printf(" AGAIN, resetting HBA\n");
1045 dpt_outb(sc, HA_COMMAND, CP_RESET);
1046 DELAY(750000);
1047 } else {
1048 /* Abort the operation that has timed out */
1049 printf("\n");
1050 ccb->ccb_xs->error = XS_TIMEOUT;
1051 ccb->ccb_timeout = DPT_ABORT_TIMEOUT;
1052 ccb->ccb_flg |= CCB_ABORT;
1053 /* Start the abort */
1054 if (dpt_cmd(sc, &ccb->ccb_eata_cp, ccb->ccb_ccbpa,
1055 CP_IMMEDIATE, CPI_SPEC_ABORT))
1056 printf("%s: dpt_cmd failed\n", sc->sc_dv.dv_xname);
1057 }
1058
1059 splx(s);
1060 }
1061
1062 #ifdef DEBUG
1063 /*
1064 * Dump the contents of an EATA status packet.
1065 */
1066 void
1067 dpt_dump_sp(sp)
1068 struct eata_sp *sp;
1069 {
1070 int i;
1071
1072 printf("\thba_status\t%02x\n", sp->sp_hba_status);
1073 printf("\tscsi_status\t%02x\n", sp->sp_scsi_status);
1074 printf("\tinv_residue\t%d\n", sp->sp_inv_residue);
1075 printf("\tccbid\t\t%d\n", sp->sp_ccbid);
1076 printf("\tid_message\t%d\n", sp->sp_id_message);
1077 printf("\tque_message\t%d\n", sp->sp_que_message);
1078 printf("\ttag_message\t%d\n", sp->sp_tag_message);
1079 printf("\tmessages\t");
1080
1081 for (i = 0; i < 9; i++)
1082 printf("%d ", sp->sp_messages[i]);
1083
1084 printf("\n");
1085 }
1086 #endif /* DEBUG */
1087
1088 /*
1089 * Get inquiry data from the adapter.
1090 */
1091 void
1092 dpt_hba_inquire(sc, ei)
1093 struct dpt_softc *sc;
1094 struct eata_inquiry_data **ei;
1095 {
1096 struct dpt_ccb *ccb;
1097 struct eata_cp *cp;
1098 bus_dma_tag_t dmat;
1099
1100 *ei = (struct eata_inquiry_data *)sc->sc_scr;
1101 dmat = sc->sc_dmat;
1102
1103 /* Get a CCB and mark as private */
1104 if ((ccb = dpt_alloc_ccb(sc, 0)) == NULL)
1105 panic("%s: no CCB for inquiry", sc->sc_dv.dv_xname);
1106
1107 ccb->ccb_flg |= CCB_PRIVATE;
1108 ccb->ccb_timeout = 200;
1109
1110 /* Put all the arguments into the CCB */
1111 cp = &ccb->ccb_eata_cp;
1112 cp->cp_ccbid = ccb->ccb_id;
1113 cp->cp_id = sc->sc_hbaid[0];
1114 cp->cp_lun = 0;
1115 cp->cp_channel = 0;
1116 cp->cp_senselen = sizeof(ccb->ccb_sense);
1117 cp->cp_stataddr = htobe32(sc->sc_sppa);
1118 cp->cp_dispri = 1;
1119 cp->cp_identify = 1;
1120 cp->cp_autosense = 0;
1121 cp->cp_interpret = 1;
1122 cp->cp_nocache = 0;
1123 cp->cp_datain = 1;
1124 cp->cp_dataout = 0;
1125 cp->cp_senseaddr = 0;
1126 cp->cp_dataaddr = htobe32(sc->sc_scrpa);
1127 cp->cp_datalen = htobe32(sizeof(struct eata_inquiry_data));
1128 cp->cp_scatter = 0;
1129
1130 /* Put together the SCSI inquiry command */
1131 memset(&cp->cp_scsi_cmd, 0, 12); /* XXX */
1132 cp->cp_scsi_cmd = INQUIRY;
1133 cp->cp_len = sizeof(struct eata_inquiry_data);
1134
1135 /* Sync up CCB, status packet and scratch area */
1136 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap_ccb, CCB_OFF(sc, ccb),
1137 sizeof(struct dpt_ccb), BUS_DMASYNC_PREWRITE);
1138 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap_ccb, sc->sc_spoff,
1139 sizeof(struct eata_sp), BUS_DMASYNC_PREREAD);
1140 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap_ccb, sc->sc_scroff,
1141 sizeof(struct eata_inquiry_data), BUS_DMASYNC_PREREAD);
1142
1143 /* Start the command and poll on completion */
1144 if (dpt_cmd(sc, &ccb->ccb_eata_cp, ccb->ccb_ccbpa, CP_DMA_CMD, 0))
1145 panic("%s: dpt_cmd failed", sc->sc_dv.dv_xname);
1146
1147 if (dpt_poll(sc, ccb))
1148 panic("%s: inquiry timed out", sc->sc_dv.dv_xname);
1149
1150 if (ccb->ccb_hba_status != HA_NO_ERROR ||
1151 ccb->ccb_scsi_status != SCSI_OK)
1152 panic("%s: inquiry failed (hba:%02x scsi:%02x)",
1153 sc->sc_dv.dv_xname, ccb->ccb_hba_status,
1154 ccb->ccb_scsi_status);
1155
1156 /* Sync up the DMA map and free CCB, returning */
1157 bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap_ccb, sc->sc_scroff,
1158 sizeof(struct eata_inquiry_data), BUS_DMASYNC_POSTREAD);
1159 dpt_free_ccb(sc, ccb);
1160 }
1161