iop.c revision 1.82 1 /* $NetBSD: iop.c,v 1.82 2012/10/27 17:18:17 chs Exp $ */
2
3 /*-
4 * Copyright (c) 2000, 2001, 2002, 2007 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Andrew Doran.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32 /*
33 * Support for I2O IOPs (intelligent I/O processors).
34 */
35
36 #include <sys/cdefs.h>
37 __KERNEL_RCSID(0, "$NetBSD: iop.c,v 1.82 2012/10/27 17:18:17 chs Exp $");
38
39 #include "iop.h"
40
41 #include <sys/param.h>
42 #include <sys/systm.h>
43 #include <sys/kernel.h>
44 #include <sys/device.h>
45 #include <sys/queue.h>
46 #include <sys/proc.h>
47 #include <sys/malloc.h>
48 #include <sys/ioctl.h>
49 #include <sys/endian.h>
50 #include <sys/conf.h>
51 #include <sys/kthread.h>
52 #include <sys/kauth.h>
53 #include <sys/bus.h>
54
55 #include <dev/i2o/i2o.h>
56 #include <dev/i2o/iopio.h>
57 #include <dev/i2o/iopreg.h>
58 #include <dev/i2o/iopvar.h>
59
60 #include "locators.h"
61
62 #define POLL(ms, cond) \
63 do { \
64 int xi; \
65 for (xi = (ms) * 10; xi; xi--) { \
66 if (cond) \
67 break; \
68 DELAY(100); \
69 } \
70 } while (/* CONSTCOND */0);
71
72 #ifdef I2ODEBUG
73 #define DPRINTF(x) printf x
74 #else
75 #define DPRINTF(x)
76 #endif
77
78 #define IOP_ICTXHASH_NBUCKETS 16
79 #define IOP_ICTXHASH(ictx) (&iop_ictxhashtbl[(ictx) & iop_ictxhash])
80
81 #define IOP_MAX_SEGS (((IOP_MAX_XFER + PAGE_SIZE - 1) / PAGE_SIZE) + 1)
82
83 #define IOP_TCTX_SHIFT 12
84 #define IOP_TCTX_MASK ((1 << IOP_TCTX_SHIFT) - 1)
85
86 static LIST_HEAD(, iop_initiator) *iop_ictxhashtbl;
87 static u_long iop_ictxhash;
88 static void *iop_sdh;
89 static struct i2o_systab *iop_systab;
90 static int iop_systab_size;
91
92 extern struct cfdriver iop_cd;
93
94 dev_type_open(iopopen);
95 dev_type_close(iopclose);
96 dev_type_ioctl(iopioctl);
97
98 const struct cdevsw iop_cdevsw = {
99 iopopen, iopclose, noread, nowrite, iopioctl,
100 nostop, notty, nopoll, nommap, nokqfilter, D_OTHER,
101 };
102
103 #define IC_CONFIGURE 0x01
104 #define IC_PRIORITY 0x02
105
106 static struct iop_class {
107 u_short ic_class;
108 u_short ic_flags;
109 const char *ic_caption;
110 } const iop_class[] = {
111 {
112 I2O_CLASS_EXECUTIVE,
113 0,
114 "executive"
115 },
116 {
117 I2O_CLASS_DDM,
118 0,
119 "device driver module"
120 },
121 {
122 I2O_CLASS_RANDOM_BLOCK_STORAGE,
123 IC_CONFIGURE | IC_PRIORITY,
124 "random block storage"
125 },
126 {
127 I2O_CLASS_SEQUENTIAL_STORAGE,
128 IC_CONFIGURE | IC_PRIORITY,
129 "sequential storage"
130 },
131 {
132 I2O_CLASS_LAN,
133 IC_CONFIGURE | IC_PRIORITY,
134 "LAN port"
135 },
136 {
137 I2O_CLASS_WAN,
138 IC_CONFIGURE | IC_PRIORITY,
139 "WAN port"
140 },
141 {
142 I2O_CLASS_FIBRE_CHANNEL_PORT,
143 IC_CONFIGURE,
144 "fibrechannel port"
145 },
146 {
147 I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL,
148 0,
149 "fibrechannel peripheral"
150 },
151 {
152 I2O_CLASS_SCSI_PERIPHERAL,
153 0,
154 "SCSI peripheral"
155 },
156 {
157 I2O_CLASS_ATE_PORT,
158 IC_CONFIGURE,
159 "ATE port"
160 },
161 {
162 I2O_CLASS_ATE_PERIPHERAL,
163 0,
164 "ATE peripheral"
165 },
166 {
167 I2O_CLASS_FLOPPY_CONTROLLER,
168 IC_CONFIGURE,
169 "floppy controller"
170 },
171 {
172 I2O_CLASS_FLOPPY_DEVICE,
173 0,
174 "floppy device"
175 },
176 {
177 I2O_CLASS_BUS_ADAPTER_PORT,
178 IC_CONFIGURE,
179 "bus adapter port"
180 },
181 };
182
183 static const char * const iop_status[] = {
184 "success",
185 "abort (dirty)",
186 "abort (no data transfer)",
187 "abort (partial transfer)",
188 "error (dirty)",
189 "error (no data transfer)",
190 "error (partial transfer)",
191 "undefined error code",
192 "process abort (dirty)",
193 "process abort (no data transfer)",
194 "process abort (partial transfer)",
195 "transaction error",
196 };
197
198 static inline u_int32_t iop_inl(struct iop_softc *, int);
199 static inline void iop_outl(struct iop_softc *, int, u_int32_t);
200
201 static inline u_int32_t iop_inl_msg(struct iop_softc *, int);
202 static inline void iop_outl_msg(struct iop_softc *, int, u_int32_t);
203
204 static void iop_config_interrupts(device_t);
205 static void iop_configure_devices(struct iop_softc *, int, int);
206 static void iop_devinfo(int, char *, size_t);
207 static int iop_print(void *, const char *);
208 static void iop_shutdown(void *);
209
210 static void iop_adjqparam(struct iop_softc *, int);
211 static int iop_handle_reply(struct iop_softc *, u_int32_t);
212 static int iop_hrt_get(struct iop_softc *);
213 static int iop_hrt_get0(struct iop_softc *, struct i2o_hrt *, int);
214 static void iop_intr_event(device_t, struct iop_msg *, void *);
215 static int iop_lct_get0(struct iop_softc *, struct i2o_lct *, int,
216 u_int32_t);
217 static void iop_msg_poll(struct iop_softc *, struct iop_msg *, int);
218 static void iop_msg_wait(struct iop_softc *, struct iop_msg *, int);
219 static int iop_ofifo_init(struct iop_softc *);
220 static int iop_passthrough(struct iop_softc *, struct ioppt *,
221 struct proc *);
222 static void iop_reconf_thread(void *);
223 static void iop_release_mfa(struct iop_softc *, u_int32_t);
224 static int iop_reset(struct iop_softc *);
225 static int iop_sys_enable(struct iop_softc *);
226 static int iop_systab_set(struct iop_softc *);
227 static void iop_tfn_print(struct iop_softc *, struct i2o_fault_notify *);
228
229 #ifdef I2ODEBUG
230 static void iop_reply_print(struct iop_softc *, struct i2o_reply *);
231 #endif
232
233 static inline u_int32_t
234 iop_inl(struct iop_softc *sc, int off)
235 {
236
237 bus_space_barrier(sc->sc_iot, sc->sc_ioh, off, 4,
238 BUS_SPACE_BARRIER_WRITE | BUS_SPACE_BARRIER_READ);
239 return (bus_space_read_4(sc->sc_iot, sc->sc_ioh, off));
240 }
241
242 static inline void
243 iop_outl(struct iop_softc *sc, int off, u_int32_t val)
244 {
245
246 bus_space_write_4(sc->sc_iot, sc->sc_ioh, off, val);
247 bus_space_barrier(sc->sc_iot, sc->sc_ioh, off, 4,
248 BUS_SPACE_BARRIER_WRITE);
249 }
250
251 static inline u_int32_t
252 iop_inl_msg(struct iop_softc *sc, int off)
253 {
254
255 bus_space_barrier(sc->sc_msg_iot, sc->sc_msg_ioh, off, 4,
256 BUS_SPACE_BARRIER_WRITE | BUS_SPACE_BARRIER_READ);
257 return (bus_space_read_4(sc->sc_msg_iot, sc->sc_msg_ioh, off));
258 }
259
260 static inline void
261 iop_outl_msg(struct iop_softc *sc, int off, u_int32_t val)
262 {
263
264 bus_space_write_4(sc->sc_msg_iot, sc->sc_msg_ioh, off, val);
265 bus_space_barrier(sc->sc_msg_iot, sc->sc_msg_ioh, off, 4,
266 BUS_SPACE_BARRIER_WRITE);
267 }
268
269 /*
270 * Initialise the IOP and our interface.
271 */
272 void
273 iop_init(struct iop_softc *sc, const char *intrstr)
274 {
275 struct iop_msg *im;
276 int rv, i, j, state, nsegs;
277 u_int32_t mask;
278 char ident[64];
279
280 state = 0;
281
282 printf("I2O adapter");
283
284 mutex_init(&sc->sc_intrlock, MUTEX_DEFAULT, IPL_VM);
285 mutex_init(&sc->sc_conflock, MUTEX_DEFAULT, IPL_NONE);
286 cv_init(&sc->sc_confcv, "iopconf");
287
288 if (iop_ictxhashtbl == NULL) {
289 iop_ictxhashtbl = hashinit(IOP_ICTXHASH_NBUCKETS, HASH_LIST,
290 true, &iop_ictxhash);
291 }
292
293 /* Disable interrupts at the IOP. */
294 mask = iop_inl(sc, IOP_REG_INTR_MASK);
295 iop_outl(sc, IOP_REG_INTR_MASK, mask | IOP_INTR_OFIFO);
296
297 /* Allocate a scratch DMA map for small miscellaneous shared data. */
298 if (bus_dmamap_create(sc->sc_dmat, PAGE_SIZE, 1, PAGE_SIZE, 0,
299 BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &sc->sc_scr_dmamap) != 0) {
300 aprint_error_dev(sc->sc_dev, "cannot create scratch dmamap\n");
301 return;
302 }
303
304 if (bus_dmamem_alloc(sc->sc_dmat, PAGE_SIZE, PAGE_SIZE, 0,
305 sc->sc_scr_seg, 1, &nsegs, BUS_DMA_NOWAIT) != 0) {
306 aprint_error_dev(sc->sc_dev, "cannot alloc scratch dmamem\n");
307 goto bail_out;
308 }
309 state++;
310
311 if (bus_dmamem_map(sc->sc_dmat, sc->sc_scr_seg, nsegs, PAGE_SIZE,
312 &sc->sc_scr, 0)) {
313 aprint_error_dev(sc->sc_dev, "cannot map scratch dmamem\n");
314 goto bail_out;
315 }
316 state++;
317
318 if (bus_dmamap_load(sc->sc_dmat, sc->sc_scr_dmamap, sc->sc_scr,
319 PAGE_SIZE, NULL, BUS_DMA_NOWAIT)) {
320 aprint_error_dev(sc->sc_dev, "cannot load scratch dmamap\n");
321 goto bail_out;
322 }
323 state++;
324
325 #ifdef I2ODEBUG
326 /* So that our debug checks don't choke. */
327 sc->sc_framesize = 128;
328 #endif
329
330 /* Avoid syncing the reply map until it's set up. */
331 sc->sc_curib = 0x123;
332
333 /* Reset the adapter and request status. */
334 if ((rv = iop_reset(sc)) != 0) {
335 aprint_error_dev(sc->sc_dev, "not responding (reset)\n");
336 goto bail_out;
337 }
338
339 if ((rv = iop_status_get(sc, 1)) != 0) {
340 aprint_error_dev(sc->sc_dev, "not responding (get status)\n");
341 goto bail_out;
342 }
343
344 sc->sc_flags |= IOP_HAVESTATUS;
345 iop_strvis(sc, sc->sc_status.productid, sizeof(sc->sc_status.productid),
346 ident, sizeof(ident));
347 printf(" <%s>\n", ident);
348
349 #ifdef I2ODEBUG
350 printf("%s: orgid=0x%04x version=%d\n",
351 device_xname(sc->sc_dev),
352 le16toh(sc->sc_status.orgid),
353 (le32toh(sc->sc_status.segnumber) >> 12) & 15);
354 printf("%s: type want have cbase\n", device_xname(sc->sc_dev));
355 printf("%s: mem %04x %04x %08x\n", device_xname(sc->sc_dev),
356 le32toh(sc->sc_status.desiredprivmemsize),
357 le32toh(sc->sc_status.currentprivmemsize),
358 le32toh(sc->sc_status.currentprivmembase));
359 printf("%s: i/o %04x %04x %08x\n", device_xname(sc->sc_dev),
360 le32toh(sc->sc_status.desiredpriviosize),
361 le32toh(sc->sc_status.currentpriviosize),
362 le32toh(sc->sc_status.currentpriviobase));
363 #endif
364
365 sc->sc_maxob = le32toh(sc->sc_status.maxoutboundmframes);
366 if (sc->sc_maxob > IOP_MAX_OUTBOUND)
367 sc->sc_maxob = IOP_MAX_OUTBOUND;
368 sc->sc_maxib = le32toh(sc->sc_status.maxinboundmframes);
369 if (sc->sc_maxib > IOP_MAX_INBOUND)
370 sc->sc_maxib = IOP_MAX_INBOUND;
371 sc->sc_framesize = le16toh(sc->sc_status.inboundmframesize) << 2;
372 if (sc->sc_framesize > IOP_MAX_MSG_SIZE)
373 sc->sc_framesize = IOP_MAX_MSG_SIZE;
374
375 #if defined(I2ODEBUG) || defined(DIAGNOSTIC)
376 if (sc->sc_framesize < IOP_MIN_MSG_SIZE) {
377 aprint_error_dev(sc->sc_dev, "frame size too small (%d)\n",
378 sc->sc_framesize);
379 goto bail_out;
380 }
381 #endif
382
383 /* Allocate message wrappers. */
384 im = malloc(sizeof(*im) * sc->sc_maxib, M_DEVBUF, M_NOWAIT|M_ZERO);
385 if (im == NULL) {
386 aprint_error_dev(sc->sc_dev, "memory allocation failure\n");
387 goto bail_out;
388 }
389 state++;
390 sc->sc_ims = im;
391 SLIST_INIT(&sc->sc_im_freelist);
392
393 for (i = 0; i < sc->sc_maxib; i++, im++) {
394 rv = bus_dmamap_create(sc->sc_dmat, IOP_MAX_XFER,
395 IOP_MAX_SEGS, IOP_MAX_XFER, 0,
396 BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW,
397 &im->im_xfer[0].ix_map);
398 if (rv != 0) {
399 aprint_error_dev(sc->sc_dev, "couldn't create dmamap (%d)", rv);
400 goto bail_out3;
401 }
402
403 im->im_tctx = i;
404 SLIST_INSERT_HEAD(&sc->sc_im_freelist, im, im_chain);
405 cv_init(&im->im_cv, "iopmsg");
406 }
407
408 /* Initialise the IOP's outbound FIFO. */
409 if (iop_ofifo_init(sc) != 0) {
410 aprint_error_dev(sc->sc_dev, "unable to init oubound FIFO\n");
411 goto bail_out3;
412 }
413
414 /*
415 * Defer further configuration until (a) interrupts are working and
416 * (b) we have enough information to build the system table.
417 */
418 config_interrupts(sc->sc_dev, iop_config_interrupts);
419
420 /* Configure shutdown hook before we start any device activity. */
421 if (iop_sdh == NULL)
422 iop_sdh = shutdownhook_establish(iop_shutdown, NULL);
423
424 /* Ensure interrupts are enabled at the IOP. */
425 mask = iop_inl(sc, IOP_REG_INTR_MASK);
426 iop_outl(sc, IOP_REG_INTR_MASK, mask & ~IOP_INTR_OFIFO);
427
428 if (intrstr != NULL)
429 printf("%s: interrupting at %s\n", device_xname(sc->sc_dev),
430 intrstr);
431
432 #ifdef I2ODEBUG
433 printf("%s: queue depths: inbound %d/%d, outbound %d/%d\n",
434 device_xname(sc->sc_dev), sc->sc_maxib,
435 le32toh(sc->sc_status.maxinboundmframes),
436 sc->sc_maxob, le32toh(sc->sc_status.maxoutboundmframes));
437 #endif
438
439 return;
440
441 bail_out3:
442 if (state > 3) {
443 for (j = 0; j < i; j++)
444 bus_dmamap_destroy(sc->sc_dmat,
445 sc->sc_ims[j].im_xfer[0].ix_map);
446 free(sc->sc_ims, M_DEVBUF);
447 }
448 bail_out:
449 if (state > 2)
450 bus_dmamap_unload(sc->sc_dmat, sc->sc_scr_dmamap);
451 if (state > 1)
452 bus_dmamem_unmap(sc->sc_dmat, sc->sc_scr, PAGE_SIZE);
453 if (state > 0)
454 bus_dmamem_free(sc->sc_dmat, sc->sc_scr_seg, nsegs);
455 bus_dmamap_destroy(sc->sc_dmat, sc->sc_scr_dmamap);
456 }
457
458 /*
459 * Perform autoconfiguration tasks.
460 */
461 static void
462 iop_config_interrupts(device_t self)
463 {
464 struct iop_attach_args ia;
465 struct iop_softc *sc, *iop;
466 struct i2o_systab_entry *ste;
467 int rv, i, niop;
468 int locs[IOPCF_NLOCS];
469
470 sc = device_private(self);
471 mutex_enter(&sc->sc_conflock);
472
473 LIST_INIT(&sc->sc_iilist);
474
475 printf("%s: configuring...\n", device_xname(sc->sc_dev));
476
477 if (iop_hrt_get(sc) != 0) {
478 printf("%s: unable to retrieve HRT\n", device_xname(sc->sc_dev));
479 mutex_exit(&sc->sc_conflock);
480 return;
481 }
482
483 /*
484 * Build the system table.
485 */
486 if (iop_systab == NULL) {
487 for (i = 0, niop = 0; i < iop_cd.cd_ndevs; i++) {
488 if ((iop = device_lookup_private(&iop_cd, i)) == NULL)
489 continue;
490 if ((iop->sc_flags & IOP_HAVESTATUS) == 0)
491 continue;
492 if (iop_status_get(iop, 1) != 0) {
493 aprint_error_dev(sc->sc_dev, "unable to retrieve status\n");
494 iop->sc_flags &= ~IOP_HAVESTATUS;
495 continue;
496 }
497 niop++;
498 }
499 if (niop == 0) {
500 mutex_exit(&sc->sc_conflock);
501 return;
502 }
503
504 i = sizeof(struct i2o_systab_entry) * (niop - 1) +
505 sizeof(struct i2o_systab);
506 iop_systab_size = i;
507 iop_systab = malloc(i, M_DEVBUF, M_NOWAIT|M_ZERO);
508
509 iop_systab->numentries = niop;
510 iop_systab->version = I2O_VERSION_11;
511
512 for (i = 0, ste = iop_systab->entry; i < iop_cd.cd_ndevs; i++) {
513 if ((iop = device_lookup_private(&iop_cd, i)) == NULL)
514 continue;
515 if ((iop->sc_flags & IOP_HAVESTATUS) == 0)
516 continue;
517
518 ste->orgid = iop->sc_status.orgid;
519 ste->iopid = device_unit(iop->sc_dev) + 2;
520 ste->segnumber =
521 htole32(le32toh(iop->sc_status.segnumber) & ~4095);
522 ste->iopcaps = iop->sc_status.iopcaps;
523 ste->inboundmsgframesize =
524 iop->sc_status.inboundmframesize;
525 ste->inboundmsgportaddresslow =
526 htole32(iop->sc_memaddr + IOP_REG_IFIFO);
527 ste++;
528 }
529 }
530
531 /*
532 * Post the system table to the IOP and bring it to the OPERATIONAL
533 * state.
534 */
535 if (iop_systab_set(sc) != 0) {
536 aprint_error_dev(sc->sc_dev, "unable to set system table\n");
537 mutex_exit(&sc->sc_conflock);
538 return;
539 }
540 if (iop_sys_enable(sc) != 0) {
541 aprint_error_dev(sc->sc_dev, "unable to enable system\n");
542 mutex_exit(&sc->sc_conflock);
543 return;
544 }
545
546 /*
547 * Set up an event handler for this IOP.
548 */
549 sc->sc_eventii.ii_dv = self;
550 sc->sc_eventii.ii_intr = iop_intr_event;
551 sc->sc_eventii.ii_flags = II_NOTCTX | II_UTILITY;
552 sc->sc_eventii.ii_tid = I2O_TID_IOP;
553 iop_initiator_register(sc, &sc->sc_eventii);
554
555 rv = iop_util_eventreg(sc, &sc->sc_eventii,
556 I2O_EVENT_EXEC_RESOURCE_LIMITS |
557 I2O_EVENT_EXEC_CONNECTION_FAIL |
558 I2O_EVENT_EXEC_ADAPTER_FAULT |
559 I2O_EVENT_EXEC_POWER_FAIL |
560 I2O_EVENT_EXEC_RESET_PENDING |
561 I2O_EVENT_EXEC_RESET_IMMINENT |
562 I2O_EVENT_EXEC_HARDWARE_FAIL |
563 I2O_EVENT_EXEC_XCT_CHANGE |
564 I2O_EVENT_EXEC_DDM_AVAILIBILITY |
565 I2O_EVENT_GEN_DEVICE_RESET |
566 I2O_EVENT_GEN_STATE_CHANGE |
567 I2O_EVENT_GEN_GENERAL_WARNING);
568 if (rv != 0) {
569 aprint_error_dev(sc->sc_dev, "unable to register for events");
570 mutex_exit(&sc->sc_conflock);
571 return;
572 }
573
574 /*
575 * Attempt to match and attach a product-specific extension.
576 */
577 ia.ia_class = I2O_CLASS_ANY;
578 ia.ia_tid = I2O_TID_IOP;
579 locs[IOPCF_TID] = I2O_TID_IOP;
580 config_found_sm_loc(self, "iop", locs, &ia, iop_print,
581 config_stdsubmatch);
582
583 /*
584 * Start device configuration.
585 */
586 if ((rv = iop_reconfigure(sc, 0)) == -1)
587 aprint_error_dev(sc->sc_dev, "configure failed (%d)\n", rv);
588
589
590 sc->sc_flags |= IOP_ONLINE;
591 rv = kthread_create(PRI_NONE, 0, NULL, iop_reconf_thread, sc,
592 &sc->sc_reconf_thread, "%s", device_xname(sc->sc_dev));
593 mutex_exit(&sc->sc_conflock);
594 if (rv != 0) {
595 aprint_error_dev(sc->sc_dev, "unable to create reconfiguration thread (%d)", rv);
596 return;
597 }
598 }
599
600 /*
601 * Reconfiguration thread; listens for LCT change notification, and
602 * initiates re-configuration if received.
603 */
604 static void
605 iop_reconf_thread(void *cookie)
606 {
607 struct iop_softc *sc;
608 struct lwp *l;
609 struct i2o_lct lct;
610 u_int32_t chgind;
611 int rv;
612
613 sc = cookie;
614 chgind = sc->sc_chgind + 1;
615 l = curlwp;
616
617 for (;;) {
618 DPRINTF(("%s: async reconfig: requested 0x%08x\n",
619 device_xname(sc->sc_dev), chgind));
620
621 rv = iop_lct_get0(sc, &lct, sizeof(lct), chgind);
622
623 DPRINTF(("%s: async reconfig: notified (0x%08x, %d)\n",
624 device_xname(sc->sc_dev), le32toh(lct.changeindicator), rv));
625
626 mutex_enter(&sc->sc_conflock);
627 if (rv == 0) {
628 iop_reconfigure(sc, le32toh(lct.changeindicator));
629 chgind = sc->sc_chgind + 1;
630 }
631 (void)cv_timedwait(&sc->sc_confcv, &sc->sc_conflock, hz * 5);
632 mutex_exit(&sc->sc_conflock);
633 }
634 }
635
636 /*
637 * Reconfigure: find new and removed devices.
638 */
639 int
640 iop_reconfigure(struct iop_softc *sc, u_int chgind)
641 {
642 struct iop_msg *im;
643 struct i2o_hba_bus_scan mf;
644 struct i2o_lct_entry *le;
645 struct iop_initiator *ii, *nextii;
646 int rv, tid, i;
647
648 KASSERT(mutex_owned(&sc->sc_conflock));
649
650 /*
651 * If the reconfiguration request isn't the result of LCT change
652 * notification, then be more thorough: ask all bus ports to scan
653 * their busses. Wait up to 5 minutes for each bus port to complete
654 * the request.
655 */
656 if (chgind == 0) {
657 if ((rv = iop_lct_get(sc)) != 0) {
658 DPRINTF(("iop_reconfigure: unable to read LCT\n"));
659 return (rv);
660 }
661
662 le = sc->sc_lct->entry;
663 for (i = 0; i < sc->sc_nlctent; i++, le++) {
664 if ((le16toh(le->classid) & 4095) !=
665 I2O_CLASS_BUS_ADAPTER_PORT)
666 continue;
667 tid = le16toh(le->localtid) & 4095;
668
669 im = iop_msg_alloc(sc, IM_WAIT);
670
671 mf.msgflags = I2O_MSGFLAGS(i2o_hba_bus_scan);
672 mf.msgfunc = I2O_MSGFUNC(tid, I2O_HBA_BUS_SCAN);
673 mf.msgictx = IOP_ICTX;
674 mf.msgtctx = im->im_tctx;
675
676 DPRINTF(("%s: scanning bus %d\n", device_xname(sc->sc_dev),
677 tid));
678
679 rv = iop_msg_post(sc, im, &mf, 5*60*1000);
680 iop_msg_free(sc, im);
681 #ifdef I2ODEBUG
682 if (rv != 0)
683 aprint_error_dev(sc->sc_dev, "bus scan failed\n");
684 #endif
685 }
686 } else if (chgind <= sc->sc_chgind) {
687 DPRINTF(("%s: LCT unchanged (async)\n", device_xname(sc->sc_dev)));
688 return (0);
689 }
690
691 /* Re-read the LCT and determine if it has changed. */
692 if ((rv = iop_lct_get(sc)) != 0) {
693 DPRINTF(("iop_reconfigure: unable to re-read LCT\n"));
694 return (rv);
695 }
696 DPRINTF(("%s: %d LCT entries\n", device_xname(sc->sc_dev), sc->sc_nlctent));
697
698 chgind = le32toh(sc->sc_lct->changeindicator);
699 if (chgind == sc->sc_chgind) {
700 DPRINTF(("%s: LCT unchanged\n", device_xname(sc->sc_dev)));
701 return (0);
702 }
703 DPRINTF(("%s: LCT changed\n", device_xname(sc->sc_dev)));
704 sc->sc_chgind = chgind;
705
706 if (sc->sc_tidmap != NULL)
707 free(sc->sc_tidmap, M_DEVBUF);
708 sc->sc_tidmap = malloc(sc->sc_nlctent * sizeof(struct iop_tidmap),
709 M_DEVBUF, M_NOWAIT|M_ZERO);
710
711 /* Allow 1 queued command per device while we're configuring. */
712 iop_adjqparam(sc, 1);
713
714 /*
715 * Match and attach child devices. We configure high-level devices
716 * first so that any claims will propagate throughout the LCT,
717 * hopefully masking off aliased devices as a result.
718 *
719 * Re-reading the LCT at this point is a little dangerous, but we'll
720 * trust the IOP (and the operator) to behave itself...
721 */
722 iop_configure_devices(sc, IC_CONFIGURE | IC_PRIORITY,
723 IC_CONFIGURE | IC_PRIORITY);
724 if ((rv = iop_lct_get(sc)) != 0) {
725 DPRINTF(("iop_reconfigure: unable to re-read LCT\n"));
726 }
727 iop_configure_devices(sc, IC_CONFIGURE | IC_PRIORITY,
728 IC_CONFIGURE);
729
730 for (ii = LIST_FIRST(&sc->sc_iilist); ii != NULL; ii = nextii) {
731 nextii = LIST_NEXT(ii, ii_list);
732
733 /* Detach devices that were configured, but are now gone. */
734 for (i = 0; i < sc->sc_nlctent; i++)
735 if (ii->ii_tid == sc->sc_tidmap[i].it_tid)
736 break;
737 if (i == sc->sc_nlctent ||
738 (sc->sc_tidmap[i].it_flags & IT_CONFIGURED) == 0) {
739 config_detach(ii->ii_dv, DETACH_FORCE);
740 continue;
741 }
742
743 /*
744 * Tell initiators that existed before the re-configuration
745 * to re-configure.
746 */
747 if (ii->ii_reconfig == NULL)
748 continue;
749 if ((rv = (*ii->ii_reconfig)(ii->ii_dv)) != 0)
750 aprint_error_dev(sc->sc_dev, "%s failed reconfigure (%d)\n",
751 device_xname(ii->ii_dv), rv);
752 }
753
754 /* Re-adjust queue parameters and return. */
755 if (sc->sc_nii != 0)
756 iop_adjqparam(sc, (sc->sc_maxib - sc->sc_nuii - IOP_MF_RESERVE)
757 / sc->sc_nii);
758
759 return (0);
760 }
761
762 /*
763 * Configure I2O devices into the system.
764 */
765 static void
766 iop_configure_devices(struct iop_softc *sc, int mask, int maskval)
767 {
768 struct iop_attach_args ia;
769 struct iop_initiator *ii;
770 const struct i2o_lct_entry *le;
771 device_t dv;
772 int i, j, nent;
773 u_int usertid;
774 int locs[IOPCF_NLOCS];
775
776 nent = sc->sc_nlctent;
777 for (i = 0, le = sc->sc_lct->entry; i < nent; i++, le++) {
778 sc->sc_tidmap[i].it_tid = le16toh(le->localtid) & 4095;
779
780 /* Ignore the device if it's in use. */
781 usertid = le32toh(le->usertid) & 4095;
782 if (usertid != I2O_TID_NONE && usertid != I2O_TID_HOST)
783 continue;
784
785 ia.ia_class = le16toh(le->classid) & 4095;
786 ia.ia_tid = sc->sc_tidmap[i].it_tid;
787
788 /* Ignore uninteresting devices. */
789 for (j = 0; j < sizeof(iop_class) / sizeof(iop_class[0]); j++)
790 if (iop_class[j].ic_class == ia.ia_class)
791 break;
792 if (j < sizeof(iop_class) / sizeof(iop_class[0]) &&
793 (iop_class[j].ic_flags & mask) != maskval)
794 continue;
795
796 /*
797 * Try to configure the device only if it's not already
798 * configured.
799 */
800 LIST_FOREACH(ii, &sc->sc_iilist, ii_list) {
801 if (ia.ia_tid == ii->ii_tid) {
802 sc->sc_tidmap[i].it_flags |= IT_CONFIGURED;
803 strcpy(sc->sc_tidmap[i].it_dvname,
804 device_xname(ii->ii_dv));
805 break;
806 }
807 }
808 if (ii != NULL)
809 continue;
810
811 locs[IOPCF_TID] = ia.ia_tid;
812
813 dv = config_found_sm_loc(sc->sc_dev, "iop", locs, &ia,
814 iop_print, config_stdsubmatch);
815 if (dv != NULL) {
816 sc->sc_tidmap[i].it_flags |= IT_CONFIGURED;
817 strcpy(sc->sc_tidmap[i].it_dvname, device_xname(dv));
818 }
819 }
820 }
821
822 /*
823 * Adjust queue parameters for all child devices.
824 */
825 static void
826 iop_adjqparam(struct iop_softc *sc, int mpi)
827 {
828 struct iop_initiator *ii;
829
830 LIST_FOREACH(ii, &sc->sc_iilist, ii_list)
831 if (ii->ii_adjqparam != NULL)
832 (*ii->ii_adjqparam)(ii->ii_dv, mpi);
833 }
834
835 static void
836 iop_devinfo(int class, char *devinfo, size_t l)
837 {
838 int i;
839
840 for (i = 0; i < sizeof(iop_class) / sizeof(iop_class[0]); i++)
841 if (class == iop_class[i].ic_class)
842 break;
843
844 if (i == sizeof(iop_class) / sizeof(iop_class[0]))
845 snprintf(devinfo, l, "device (class 0x%x)", class);
846 else
847 strlcpy(devinfo, iop_class[i].ic_caption, l);
848 }
849
850 static int
851 iop_print(void *aux, const char *pnp)
852 {
853 struct iop_attach_args *ia;
854 char devinfo[256];
855
856 ia = aux;
857
858 if (pnp != NULL) {
859 iop_devinfo(ia->ia_class, devinfo, sizeof(devinfo));
860 aprint_normal("%s at %s", devinfo, pnp);
861 }
862 aprint_normal(" tid %d", ia->ia_tid);
863 return (UNCONF);
864 }
865
866 /*
867 * Shut down all configured IOPs.
868 */
869 static void
870 iop_shutdown(void *junk)
871 {
872 struct iop_softc *sc;
873 int i;
874
875 printf("shutting down iop devices...");
876
877 for (i = 0; i < iop_cd.cd_ndevs; i++) {
878 if ((sc = device_lookup_private(&iop_cd, i)) == NULL)
879 continue;
880 if ((sc->sc_flags & IOP_ONLINE) == 0)
881 continue;
882
883 iop_simple_cmd(sc, I2O_TID_IOP, I2O_EXEC_SYS_QUIESCE, IOP_ICTX,
884 0, 5000);
885
886 if (le16toh(sc->sc_status.orgid) != I2O_ORG_AMI) {
887 /*
888 * Some AMI firmware revisions will go to sleep and
889 * never come back after this.
890 */
891 iop_simple_cmd(sc, I2O_TID_IOP, I2O_EXEC_IOP_CLEAR,
892 IOP_ICTX, 0, 1000);
893 }
894 }
895
896 /* Wait. Some boards could still be flushing, stupidly enough. */
897 delay(5000*1000);
898 printf(" done\n");
899 }
900
901 /*
902 * Retrieve IOP status.
903 */
904 int
905 iop_status_get(struct iop_softc *sc, int nosleep)
906 {
907 struct i2o_exec_status_get mf;
908 struct i2o_status *st;
909 paddr_t pa;
910 int rv, i;
911
912 pa = sc->sc_scr_dmamap->dm_segs[0].ds_addr;
913 st = (struct i2o_status *)sc->sc_scr;
914
915 mf.msgflags = I2O_MSGFLAGS(i2o_exec_status_get);
916 mf.msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_STATUS_GET);
917 mf.reserved[0] = 0;
918 mf.reserved[1] = 0;
919 mf.reserved[2] = 0;
920 mf.reserved[3] = 0;
921 mf.addrlow = (u_int32_t)pa;
922 mf.addrhigh = (u_int32_t)((u_int64_t)pa >> 32);
923 mf.length = sizeof(sc->sc_status);
924
925 bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*st),
926 BUS_DMASYNC_PREWRITE);
927 memset(st, 0, sizeof(*st));
928 bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*st),
929 BUS_DMASYNC_POSTWRITE);
930
931 if ((rv = iop_post(sc, (u_int32_t *)&mf)) != 0)
932 return (rv);
933
934 for (i = 100; i != 0; i--) {
935 bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0,
936 sizeof(*st), BUS_DMASYNC_POSTREAD);
937 if (st->syncbyte == 0xff)
938 break;
939 if (nosleep)
940 DELAY(100*1000);
941 else
942 kpause("iopstat", false, hz / 10, NULL);
943 }
944
945 if (st->syncbyte != 0xff) {
946 aprint_error_dev(sc->sc_dev, "STATUS_GET timed out\n");
947 rv = EIO;
948 } else {
949 memcpy(&sc->sc_status, st, sizeof(sc->sc_status));
950 rv = 0;
951 }
952
953 return (rv);
954 }
955
956 /*
957 * Initialize and populate the IOP's outbound FIFO.
958 */
959 static int
960 iop_ofifo_init(struct iop_softc *sc)
961 {
962 bus_addr_t addr;
963 bus_dma_segment_t seg;
964 struct i2o_exec_outbound_init *mf;
965 int i, rseg, rv;
966 u_int32_t mb[IOP_MAX_MSG_SIZE / sizeof(u_int32_t)], *sw;
967
968 sw = (u_int32_t *)sc->sc_scr;
969
970 mf = (struct i2o_exec_outbound_init *)mb;
971 mf->msgflags = I2O_MSGFLAGS(i2o_exec_outbound_init);
972 mf->msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_OUTBOUND_INIT);
973 mf->msgictx = IOP_ICTX;
974 mf->msgtctx = 0;
975 mf->pagesize = PAGE_SIZE;
976 mf->flags = IOP_INIT_CODE | ((sc->sc_framesize >> 2) << 16);
977
978 /*
979 * The I2O spec says that there are two SGLs: one for the status
980 * word, and one for a list of discarded MFAs. It continues to say
981 * that if you don't want to get the list of MFAs, an IGNORE SGL is
982 * necessary; this isn't the case (and is in fact a bad thing).
983 */
984 mb[sizeof(*mf) / sizeof(u_int32_t) + 0] = sizeof(*sw) |
985 I2O_SGL_SIMPLE | I2O_SGL_END_BUFFER | I2O_SGL_END;
986 mb[sizeof(*mf) / sizeof(u_int32_t) + 1] =
987 (u_int32_t)sc->sc_scr_dmamap->dm_segs[0].ds_addr;
988 mb[0] += 2 << 16;
989
990 bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*sw),
991 BUS_DMASYNC_POSTWRITE);
992 *sw = 0;
993 bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*sw),
994 BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
995
996 if ((rv = iop_post(sc, mb)) != 0)
997 return (rv);
998
999 POLL(5000,
1000 (bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*sw),
1001 BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD),
1002 *sw == htole32(I2O_EXEC_OUTBOUND_INIT_COMPLETE)));
1003
1004 if (*sw != htole32(I2O_EXEC_OUTBOUND_INIT_COMPLETE)) {
1005 aprint_error_dev(sc->sc_dev, "outbound FIFO init failed (%d)\n",
1006 le32toh(*sw));
1007 return (EIO);
1008 }
1009
1010 /* Allocate DMA safe memory for the reply frames. */
1011 if (sc->sc_rep_phys == 0) {
1012 sc->sc_rep_size = sc->sc_maxob * sc->sc_framesize;
1013
1014 rv = bus_dmamem_alloc(sc->sc_dmat, sc->sc_rep_size, PAGE_SIZE,
1015 0, &seg, 1, &rseg, BUS_DMA_NOWAIT);
1016 if (rv != 0) {
1017 aprint_error_dev(sc->sc_dev, "DMA alloc = %d\n",
1018 rv);
1019 return (rv);
1020 }
1021
1022 rv = bus_dmamem_map(sc->sc_dmat, &seg, rseg, sc->sc_rep_size,
1023 &sc->sc_rep, BUS_DMA_NOWAIT | BUS_DMA_COHERENT);
1024 if (rv != 0) {
1025 aprint_error_dev(sc->sc_dev, "DMA map = %d\n", rv);
1026 return (rv);
1027 }
1028
1029 rv = bus_dmamap_create(sc->sc_dmat, sc->sc_rep_size, 1,
1030 sc->sc_rep_size, 0, BUS_DMA_NOWAIT, &sc->sc_rep_dmamap);
1031 if (rv != 0) {
1032 aprint_error_dev(sc->sc_dev, "DMA create = %d\n", rv);
1033 return (rv);
1034 }
1035
1036 rv = bus_dmamap_load(sc->sc_dmat, sc->sc_rep_dmamap,
1037 sc->sc_rep, sc->sc_rep_size, NULL, BUS_DMA_NOWAIT);
1038 if (rv != 0) {
1039 aprint_error_dev(sc->sc_dev, "DMA load = %d\n", rv);
1040 return (rv);
1041 }
1042
1043 sc->sc_rep_phys = sc->sc_rep_dmamap->dm_segs[0].ds_addr;
1044
1045 /* Now safe to sync the reply map. */
1046 sc->sc_curib = 0;
1047 }
1048
1049 /* Populate the outbound FIFO. */
1050 for (i = sc->sc_maxob, addr = sc->sc_rep_phys; i != 0; i--) {
1051 iop_outl(sc, IOP_REG_OFIFO, (u_int32_t)addr);
1052 addr += sc->sc_framesize;
1053 }
1054
1055 return (0);
1056 }
1057
1058 /*
1059 * Read the specified number of bytes from the IOP's hardware resource table.
1060 */
1061 static int
1062 iop_hrt_get0(struct iop_softc *sc, struct i2o_hrt *hrt, int size)
1063 {
1064 struct iop_msg *im;
1065 int rv;
1066 struct i2o_exec_hrt_get *mf;
1067 u_int32_t mb[IOP_MAX_MSG_SIZE / sizeof(u_int32_t)];
1068
1069 im = iop_msg_alloc(sc, IM_WAIT);
1070 mf = (struct i2o_exec_hrt_get *)mb;
1071 mf->msgflags = I2O_MSGFLAGS(i2o_exec_hrt_get);
1072 mf->msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_HRT_GET);
1073 mf->msgictx = IOP_ICTX;
1074 mf->msgtctx = im->im_tctx;
1075
1076 iop_msg_map(sc, im, mb, hrt, size, 0, NULL);
1077 rv = iop_msg_post(sc, im, mb, 30000);
1078 iop_msg_unmap(sc, im);
1079 iop_msg_free(sc, im);
1080 return (rv);
1081 }
1082
1083 /*
1084 * Read the IOP's hardware resource table.
1085 */
1086 static int
1087 iop_hrt_get(struct iop_softc *sc)
1088 {
1089 struct i2o_hrt hrthdr, *hrt;
1090 int size, rv;
1091
1092 rv = iop_hrt_get0(sc, &hrthdr, sizeof(hrthdr));
1093 if (rv != 0)
1094 return (rv);
1095
1096 DPRINTF(("%s: %d hrt entries\n", device_xname(sc->sc_dev),
1097 le16toh(hrthdr.numentries)));
1098
1099 size = sizeof(struct i2o_hrt) +
1100 (le16toh(hrthdr.numentries) - 1) * sizeof(struct i2o_hrt_entry);
1101 hrt = (struct i2o_hrt *)malloc(size, M_DEVBUF, M_NOWAIT);
1102
1103 if ((rv = iop_hrt_get0(sc, hrt, size)) != 0) {
1104 free(hrt, M_DEVBUF);
1105 return (rv);
1106 }
1107
1108 if (sc->sc_hrt != NULL)
1109 free(sc->sc_hrt, M_DEVBUF);
1110 sc->sc_hrt = hrt;
1111 return (0);
1112 }
1113
1114 /*
1115 * Request the specified number of bytes from the IOP's logical
1116 * configuration table. If a change indicator is specified, this
1117 * is a verbatim notification request, so the caller is prepared
1118 * to wait indefinitely.
1119 */
1120 static int
1121 iop_lct_get0(struct iop_softc *sc, struct i2o_lct *lct, int size,
1122 u_int32_t chgind)
1123 {
1124 struct iop_msg *im;
1125 struct i2o_exec_lct_notify *mf;
1126 int rv;
1127 u_int32_t mb[IOP_MAX_MSG_SIZE / sizeof(u_int32_t)];
1128
1129 im = iop_msg_alloc(sc, IM_WAIT);
1130 memset(lct, 0, size);
1131
1132 mf = (struct i2o_exec_lct_notify *)mb;
1133 mf->msgflags = I2O_MSGFLAGS(i2o_exec_lct_notify);
1134 mf->msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_LCT_NOTIFY);
1135 mf->msgictx = IOP_ICTX;
1136 mf->msgtctx = im->im_tctx;
1137 mf->classid = I2O_CLASS_ANY;
1138 mf->changeindicator = chgind;
1139
1140 #ifdef I2ODEBUG
1141 printf("iop_lct_get0: reading LCT");
1142 if (chgind != 0)
1143 printf(" (async)");
1144 printf("\n");
1145 #endif
1146
1147 iop_msg_map(sc, im, mb, lct, size, 0, NULL);
1148 rv = iop_msg_post(sc, im, mb, (chgind == 0 ? 120*1000 : 0));
1149 iop_msg_unmap(sc, im);
1150 iop_msg_free(sc, im);
1151 return (rv);
1152 }
1153
1154 /*
1155 * Read the IOP's logical configuration table.
1156 */
1157 int
1158 iop_lct_get(struct iop_softc *sc)
1159 {
1160 int esize, size, rv;
1161 struct i2o_lct *lct;
1162
1163 esize = le32toh(sc->sc_status.expectedlctsize);
1164 lct = (struct i2o_lct *)malloc(esize, M_DEVBUF, M_WAITOK);
1165 if (lct == NULL)
1166 return (ENOMEM);
1167
1168 if ((rv = iop_lct_get0(sc, lct, esize, 0)) != 0) {
1169 free(lct, M_DEVBUF);
1170 return (rv);
1171 }
1172
1173 size = le16toh(lct->tablesize) << 2;
1174 if (esize != size) {
1175 free(lct, M_DEVBUF);
1176 lct = (struct i2o_lct *)malloc(size, M_DEVBUF, M_WAITOK);
1177 if (lct == NULL)
1178 return (ENOMEM);
1179
1180 if ((rv = iop_lct_get0(sc, lct, size, 0)) != 0) {
1181 free(lct, M_DEVBUF);
1182 return (rv);
1183 }
1184 }
1185
1186 /* Swap in the new LCT. */
1187 if (sc->sc_lct != NULL)
1188 free(sc->sc_lct, M_DEVBUF);
1189 sc->sc_lct = lct;
1190 sc->sc_nlctent = ((le16toh(sc->sc_lct->tablesize) << 2) -
1191 sizeof(struct i2o_lct) + sizeof(struct i2o_lct_entry)) /
1192 sizeof(struct i2o_lct_entry);
1193 return (0);
1194 }
1195
1196 /*
1197 * Post a SYS_ENABLE message to the adapter.
1198 */
1199 int
1200 iop_sys_enable(struct iop_softc *sc)
1201 {
1202 struct iop_msg *im;
1203 struct i2o_msg mf;
1204 int rv;
1205
1206 im = iop_msg_alloc(sc, IM_WAIT | IM_NOSTATUS);
1207
1208 mf.msgflags = I2O_MSGFLAGS(i2o_msg);
1209 mf.msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_SYS_ENABLE);
1210 mf.msgictx = IOP_ICTX;
1211 mf.msgtctx = im->im_tctx;
1212
1213 rv = iop_msg_post(sc, im, &mf, 30000);
1214 if (rv == 0) {
1215 if ((im->im_flags & IM_FAIL) != 0)
1216 rv = ENXIO;
1217 else if (im->im_reqstatus == I2O_STATUS_SUCCESS ||
1218 (im->im_reqstatus == I2O_STATUS_ERROR_NO_DATA_XFER &&
1219 im->im_detstatus == I2O_DSC_INVALID_REQUEST))
1220 rv = 0;
1221 else
1222 rv = EIO;
1223 }
1224
1225 iop_msg_free(sc, im);
1226 return (rv);
1227 }
1228
1229 /*
1230 * Request the specified parameter group from the target. If an initiator
1231 * is specified (a) don't wait for the operation to complete, but instead
1232 * let the initiator's interrupt handler deal with the reply and (b) place a
1233 * pointer to the parameter group op in the wrapper's `im_dvcontext' field.
1234 */
1235 int
1236 iop_field_get_all(struct iop_softc *sc, int tid, int group, void *buf,
1237 int size, struct iop_initiator *ii)
1238 {
1239 struct iop_msg *im;
1240 struct i2o_util_params_op *mf;
1241 int rv;
1242 struct iop_pgop *pgop;
1243 u_int32_t mb[IOP_MAX_MSG_SIZE / sizeof(u_int32_t)];
1244
1245 im = iop_msg_alloc(sc, (ii == NULL ? IM_WAIT : 0) | IM_NOSTATUS);
1246 if ((pgop = malloc(sizeof(*pgop), M_DEVBUF, M_WAITOK)) == NULL) {
1247 iop_msg_free(sc, im);
1248 return (ENOMEM);
1249 }
1250 im->im_dvcontext = pgop;
1251
1252 mf = (struct i2o_util_params_op *)mb;
1253 mf->msgflags = I2O_MSGFLAGS(i2o_util_params_op);
1254 mf->msgfunc = I2O_MSGFUNC(tid, I2O_UTIL_PARAMS_GET);
1255 mf->msgictx = IOP_ICTX;
1256 mf->msgtctx = im->im_tctx;
1257 mf->flags = 0;
1258
1259 pgop->olh.count = htole16(1);
1260 pgop->olh.reserved = htole16(0);
1261 pgop->oat.operation = htole16(I2O_PARAMS_OP_FIELD_GET);
1262 pgop->oat.fieldcount = htole16(0xffff);
1263 pgop->oat.group = htole16(group);
1264
1265 memset(buf, 0, size);
1266 iop_msg_map(sc, im, mb, pgop, sizeof(*pgop), 1, NULL);
1267 iop_msg_map(sc, im, mb, buf, size, 0, NULL);
1268 rv = iop_msg_post(sc, im, mb, (ii == NULL ? 30000 : 0));
1269
1270 /* Detect errors; let partial transfers to count as success. */
1271 if (ii == NULL && rv == 0) {
1272 if (im->im_reqstatus == I2O_STATUS_ERROR_PARTIAL_XFER &&
1273 im->im_detstatus == I2O_DSC_UNKNOWN_ERROR)
1274 rv = 0;
1275 else
1276 rv = (im->im_reqstatus != 0 ? EIO : 0);
1277
1278 if (rv != 0)
1279 printf("%s: FIELD_GET failed for tid %d group %d\n",
1280 device_xname(sc->sc_dev), tid, group);
1281 }
1282
1283 if (ii == NULL || rv != 0) {
1284 iop_msg_unmap(sc, im);
1285 iop_msg_free(sc, im);
1286 free(pgop, M_DEVBUF);
1287 }
1288
1289 return (rv);
1290 }
1291
1292 /*
1293 * Set a single field in a scalar parameter group.
1294 */
1295 int
1296 iop_field_set(struct iop_softc *sc, int tid, int group, void *buf,
1297 int size, int field)
1298 {
1299 struct iop_msg *im;
1300 struct i2o_util_params_op *mf;
1301 struct iop_pgop *pgop;
1302 int rv, totsize;
1303 u_int32_t mb[IOP_MAX_MSG_SIZE / sizeof(u_int32_t)];
1304
1305 totsize = sizeof(*pgop) + size;
1306
1307 im = iop_msg_alloc(sc, IM_WAIT);
1308 if ((pgop = malloc(totsize, M_DEVBUF, M_WAITOK)) == NULL) {
1309 iop_msg_free(sc, im);
1310 return (ENOMEM);
1311 }
1312
1313 mf = (struct i2o_util_params_op *)mb;
1314 mf->msgflags = I2O_MSGFLAGS(i2o_util_params_op);
1315 mf->msgfunc = I2O_MSGFUNC(tid, I2O_UTIL_PARAMS_SET);
1316 mf->msgictx = IOP_ICTX;
1317 mf->msgtctx = im->im_tctx;
1318 mf->flags = 0;
1319
1320 pgop->olh.count = htole16(1);
1321 pgop->olh.reserved = htole16(0);
1322 pgop->oat.operation = htole16(I2O_PARAMS_OP_FIELD_SET);
1323 pgop->oat.fieldcount = htole16(1);
1324 pgop->oat.group = htole16(group);
1325 pgop->oat.fields[0] = htole16(field);
1326 memcpy(pgop + 1, buf, size);
1327
1328 iop_msg_map(sc, im, mb, pgop, totsize, 1, NULL);
1329 rv = iop_msg_post(sc, im, mb, 30000);
1330 if (rv != 0)
1331 aprint_error_dev(sc->sc_dev, "FIELD_SET failed for tid %d group %d\n",
1332 tid, group);
1333
1334 iop_msg_unmap(sc, im);
1335 iop_msg_free(sc, im);
1336 free(pgop, M_DEVBUF);
1337 return (rv);
1338 }
1339
1340 /*
1341 * Delete all rows in a tablular parameter group.
1342 */
1343 int
1344 iop_table_clear(struct iop_softc *sc, int tid, int group)
1345 {
1346 struct iop_msg *im;
1347 struct i2o_util_params_op *mf;
1348 struct iop_pgop pgop;
1349 u_int32_t mb[IOP_MAX_MSG_SIZE / sizeof(u_int32_t)];
1350 int rv;
1351
1352 im = iop_msg_alloc(sc, IM_WAIT);
1353
1354 mf = (struct i2o_util_params_op *)mb;
1355 mf->msgflags = I2O_MSGFLAGS(i2o_util_params_op);
1356 mf->msgfunc = I2O_MSGFUNC(tid, I2O_UTIL_PARAMS_SET);
1357 mf->msgictx = IOP_ICTX;
1358 mf->msgtctx = im->im_tctx;
1359 mf->flags = 0;
1360
1361 pgop.olh.count = htole16(1);
1362 pgop.olh.reserved = htole16(0);
1363 pgop.oat.operation = htole16(I2O_PARAMS_OP_TABLE_CLEAR);
1364 pgop.oat.fieldcount = htole16(0);
1365 pgop.oat.group = htole16(group);
1366 pgop.oat.fields[0] = htole16(0);
1367
1368 iop_msg_map(sc, im, mb, &pgop, sizeof(pgop), 1, NULL);
1369 rv = iop_msg_post(sc, im, mb, 30000);
1370 if (rv != 0)
1371 aprint_error_dev(sc->sc_dev, "TABLE_CLEAR failed for tid %d group %d\n",
1372 tid, group);
1373
1374 iop_msg_unmap(sc, im);
1375 iop_msg_free(sc, im);
1376 return (rv);
1377 }
1378
1379 /*
1380 * Add a single row to a tabular parameter group. The row can have only one
1381 * field.
1382 */
1383 int
1384 iop_table_add_row(struct iop_softc *sc, int tid, int group, void *buf,
1385 int size, int row)
1386 {
1387 struct iop_msg *im;
1388 struct i2o_util_params_op *mf;
1389 struct iop_pgop *pgop;
1390 int rv, totsize;
1391 u_int32_t mb[IOP_MAX_MSG_SIZE / sizeof(u_int32_t)];
1392
1393 totsize = sizeof(*pgop) + sizeof(u_int16_t) * 2 + size;
1394
1395 im = iop_msg_alloc(sc, IM_WAIT);
1396 if ((pgop = malloc(totsize, M_DEVBUF, M_WAITOK)) == NULL) {
1397 iop_msg_free(sc, im);
1398 return (ENOMEM);
1399 }
1400
1401 mf = (struct i2o_util_params_op *)mb;
1402 mf->msgflags = I2O_MSGFLAGS(i2o_util_params_op);
1403 mf->msgfunc = I2O_MSGFUNC(tid, I2O_UTIL_PARAMS_SET);
1404 mf->msgictx = IOP_ICTX;
1405 mf->msgtctx = im->im_tctx;
1406 mf->flags = 0;
1407
1408 pgop->olh.count = htole16(1);
1409 pgop->olh.reserved = htole16(0);
1410 pgop->oat.operation = htole16(I2O_PARAMS_OP_ROW_ADD);
1411 pgop->oat.fieldcount = htole16(1);
1412 pgop->oat.group = htole16(group);
1413 pgop->oat.fields[0] = htole16(0); /* FieldIdx */
1414 pgop->oat.fields[1] = htole16(1); /* RowCount */
1415 pgop->oat.fields[2] = htole16(row); /* KeyValue */
1416 memcpy(&pgop->oat.fields[3], buf, size);
1417
1418 iop_msg_map(sc, im, mb, pgop, totsize, 1, NULL);
1419 rv = iop_msg_post(sc, im, mb, 30000);
1420 if (rv != 0)
1421 aprint_error_dev(sc->sc_dev, "ADD_ROW failed for tid %d group %d row %d\n",
1422 tid, group, row);
1423
1424 iop_msg_unmap(sc, im);
1425 iop_msg_free(sc, im);
1426 free(pgop, M_DEVBUF);
1427 return (rv);
1428 }
1429
1430 /*
1431 * Execute a simple command (no parameters).
1432 */
1433 int
1434 iop_simple_cmd(struct iop_softc *sc, int tid, int function, int ictx,
1435 int async, int timo)
1436 {
1437 struct iop_msg *im;
1438 struct i2o_msg mf;
1439 int rv, fl;
1440
1441 fl = (async != 0 ? IM_WAIT : IM_POLL);
1442 im = iop_msg_alloc(sc, fl);
1443
1444 mf.msgflags = I2O_MSGFLAGS(i2o_msg);
1445 mf.msgfunc = I2O_MSGFUNC(tid, function);
1446 mf.msgictx = ictx;
1447 mf.msgtctx = im->im_tctx;
1448
1449 rv = iop_msg_post(sc, im, &mf, timo);
1450 iop_msg_free(sc, im);
1451 return (rv);
1452 }
1453
1454 /*
1455 * Post the system table to the IOP.
1456 */
1457 static int
1458 iop_systab_set(struct iop_softc *sc)
1459 {
1460 struct i2o_exec_sys_tab_set *mf;
1461 struct iop_msg *im;
1462 bus_space_handle_t bsh;
1463 bus_addr_t boo;
1464 u_int32_t mema[2], ioa[2];
1465 int rv;
1466 u_int32_t mb[IOP_MAX_MSG_SIZE / sizeof(u_int32_t)];
1467
1468 im = iop_msg_alloc(sc, IM_WAIT);
1469
1470 mf = (struct i2o_exec_sys_tab_set *)mb;
1471 mf->msgflags = I2O_MSGFLAGS(i2o_exec_sys_tab_set);
1472 mf->msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_SYS_TAB_SET);
1473 mf->msgictx = IOP_ICTX;
1474 mf->msgtctx = im->im_tctx;
1475 mf->iopid = (device_unit(sc->sc_dev) + 2) << 12;
1476 mf->segnumber = 0;
1477
1478 mema[1] = sc->sc_status.desiredprivmemsize;
1479 ioa[1] = sc->sc_status.desiredpriviosize;
1480
1481 if (mema[1] != 0) {
1482 rv = bus_space_alloc(sc->sc_bus_memt, 0, 0xffffffff,
1483 le32toh(mema[1]), PAGE_SIZE, 0, 0, &boo, &bsh);
1484 mema[0] = htole32(boo);
1485 if (rv != 0) {
1486 aprint_error_dev(sc->sc_dev, "can't alloc priv mem space, err = %d\n", rv);
1487 mema[0] = 0;
1488 mema[1] = 0;
1489 }
1490 }
1491
1492 if (ioa[1] != 0) {
1493 rv = bus_space_alloc(sc->sc_bus_iot, 0, 0xffff,
1494 le32toh(ioa[1]), 0, 0, 0, &boo, &bsh);
1495 ioa[0] = htole32(boo);
1496 if (rv != 0) {
1497 aprint_error_dev(sc->sc_dev, "can't alloc priv i/o space, err = %d\n", rv);
1498 ioa[0] = 0;
1499 ioa[1] = 0;
1500 }
1501 }
1502
1503 iop_msg_map(sc, im, mb, iop_systab, iop_systab_size, 1, NULL);
1504 iop_msg_map(sc, im, mb, mema, sizeof(mema), 1, NULL);
1505 iop_msg_map(sc, im, mb, ioa, sizeof(ioa), 1, NULL);
1506 rv = iop_msg_post(sc, im, mb, 5000);
1507 iop_msg_unmap(sc, im);
1508 iop_msg_free(sc, im);
1509 return (rv);
1510 }
1511
1512 /*
1513 * Reset the IOP. Must be called with interrupts disabled.
1514 */
1515 static int
1516 iop_reset(struct iop_softc *sc)
1517 {
1518 u_int32_t mfa, *sw;
1519 struct i2o_exec_iop_reset mf;
1520 int rv;
1521 paddr_t pa;
1522
1523 sw = (u_int32_t *)sc->sc_scr;
1524 pa = sc->sc_scr_dmamap->dm_segs[0].ds_addr;
1525
1526 mf.msgflags = I2O_MSGFLAGS(i2o_exec_iop_reset);
1527 mf.msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_IOP_RESET);
1528 mf.reserved[0] = 0;
1529 mf.reserved[1] = 0;
1530 mf.reserved[2] = 0;
1531 mf.reserved[3] = 0;
1532 mf.statuslow = (u_int32_t)pa;
1533 mf.statushigh = (u_int32_t)((u_int64_t)pa >> 32);
1534
1535 bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*sw),
1536 BUS_DMASYNC_POSTWRITE);
1537 *sw = htole32(0);
1538 bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*sw),
1539 BUS_DMASYNC_PREWRITE|BUS_DMASYNC_PREREAD);
1540
1541 if ((rv = iop_post(sc, (u_int32_t *)&mf)))
1542 return (rv);
1543
1544 POLL(2500,
1545 (bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*sw),
1546 BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD), *sw != 0));
1547 if (*sw != htole32(I2O_RESET_IN_PROGRESS)) {
1548 aprint_error_dev(sc->sc_dev, "reset rejected, status 0x%x\n",
1549 le32toh(*sw));
1550 return (EIO);
1551 }
1552
1553 /*
1554 * IOP is now in the INIT state. Wait no more than 10 seconds for
1555 * the inbound queue to become responsive.
1556 */
1557 POLL(10000, (mfa = iop_inl(sc, IOP_REG_IFIFO)) != IOP_MFA_EMPTY);
1558 if (mfa == IOP_MFA_EMPTY) {
1559 aprint_error_dev(sc->sc_dev, "reset failed\n");
1560 return (EIO);
1561 }
1562
1563 iop_release_mfa(sc, mfa);
1564 return (0);
1565 }
1566
1567 /*
1568 * Register a new initiator. Must be called with the configuration lock
1569 * held.
1570 */
1571 void
1572 iop_initiator_register(struct iop_softc *sc, struct iop_initiator *ii)
1573 {
1574 static int ictxgen;
1575
1576 /* 0 is reserved (by us) for system messages. */
1577 ii->ii_ictx = ++ictxgen;
1578
1579 /*
1580 * `Utility initiators' don't make it onto the per-IOP initiator list
1581 * (which is used only for configuration), but do get one slot on
1582 * the inbound queue.
1583 */
1584 if ((ii->ii_flags & II_UTILITY) == 0) {
1585 LIST_INSERT_HEAD(&sc->sc_iilist, ii, ii_list);
1586 sc->sc_nii++;
1587 } else
1588 sc->sc_nuii++;
1589
1590 cv_init(&ii->ii_cv, "iopevt");
1591
1592 mutex_spin_enter(&sc->sc_intrlock);
1593 LIST_INSERT_HEAD(IOP_ICTXHASH(ii->ii_ictx), ii, ii_hash);
1594 mutex_spin_exit(&sc->sc_intrlock);
1595 }
1596
1597 /*
1598 * Unregister an initiator. Must be called with the configuration lock
1599 * held.
1600 */
1601 void
1602 iop_initiator_unregister(struct iop_softc *sc, struct iop_initiator *ii)
1603 {
1604
1605 if ((ii->ii_flags & II_UTILITY) == 0) {
1606 LIST_REMOVE(ii, ii_list);
1607 sc->sc_nii--;
1608 } else
1609 sc->sc_nuii--;
1610
1611 mutex_spin_enter(&sc->sc_intrlock);
1612 LIST_REMOVE(ii, ii_hash);
1613 mutex_spin_exit(&sc->sc_intrlock);
1614
1615 cv_destroy(&ii->ii_cv);
1616 }
1617
1618 /*
1619 * Handle a reply frame from the IOP.
1620 */
1621 static int
1622 iop_handle_reply(struct iop_softc *sc, u_int32_t rmfa)
1623 {
1624 struct iop_msg *im;
1625 struct i2o_reply *rb;
1626 struct i2o_fault_notify *fn;
1627 struct iop_initiator *ii;
1628 u_int off, ictx, tctx, status, size;
1629
1630 KASSERT(mutex_owned(&sc->sc_intrlock));
1631
1632 off = (int)(rmfa - sc->sc_rep_phys);
1633 rb = (struct i2o_reply *)((char *)sc->sc_rep + off);
1634
1635 /* Perform reply queue DMA synchronisation. */
1636 bus_dmamap_sync(sc->sc_dmat, sc->sc_rep_dmamap, off,
1637 sc->sc_framesize, BUS_DMASYNC_POSTREAD);
1638
1639 #ifdef I2ODEBUG
1640 if ((le32toh(rb->msgflags) & I2O_MSGFLAGS_64BIT) != 0)
1641 panic("iop_handle_reply: 64-bit reply");
1642 #endif
1643 /*
1644 * Find the initiator.
1645 */
1646 ictx = le32toh(rb->msgictx);
1647 if (ictx == IOP_ICTX)
1648 ii = NULL;
1649 else {
1650 ii = LIST_FIRST(IOP_ICTXHASH(ictx));
1651 for (; ii != NULL; ii = LIST_NEXT(ii, ii_hash))
1652 if (ii->ii_ictx == ictx)
1653 break;
1654 if (ii == NULL) {
1655 #ifdef I2ODEBUG
1656 iop_reply_print(sc, rb);
1657 #endif
1658 aprint_error_dev(sc->sc_dev, "WARNING: bad ictx returned (%x)\n",
1659 ictx);
1660 return (-1);
1661 }
1662 }
1663
1664 /*
1665 * If we received a transport failure notice, we've got to dig the
1666 * transaction context (if any) out of the original message frame,
1667 * and then release the original MFA back to the inbound FIFO.
1668 */
1669 if ((rb->msgflags & I2O_MSGFLAGS_FAIL) != 0) {
1670 status = I2O_STATUS_SUCCESS;
1671
1672 fn = (struct i2o_fault_notify *)rb;
1673 tctx = iop_inl_msg(sc, fn->lowmfa + 12);
1674 iop_release_mfa(sc, fn->lowmfa);
1675 iop_tfn_print(sc, fn);
1676 } else {
1677 status = rb->reqstatus;
1678 tctx = le32toh(rb->msgtctx);
1679 }
1680
1681 if (ii == NULL || (ii->ii_flags & II_NOTCTX) == 0) {
1682 /*
1683 * This initiator tracks state using message wrappers.
1684 *
1685 * Find the originating message wrapper, and if requested
1686 * notify the initiator.
1687 */
1688 im = sc->sc_ims + (tctx & IOP_TCTX_MASK);
1689 if ((tctx & IOP_TCTX_MASK) > sc->sc_maxib ||
1690 (im->im_flags & IM_ALLOCED) == 0 ||
1691 tctx != im->im_tctx) {
1692 aprint_error_dev(sc->sc_dev, "WARNING: bad tctx returned (0x%08x, %p)\n", tctx, im);
1693 if (im != NULL)
1694 aprint_error_dev(sc->sc_dev, "flags=0x%08x tctx=0x%08x\n",
1695 im->im_flags, im->im_tctx);
1696 #ifdef I2ODEBUG
1697 if ((rb->msgflags & I2O_MSGFLAGS_FAIL) == 0)
1698 iop_reply_print(sc, rb);
1699 #endif
1700 return (-1);
1701 }
1702
1703 if ((rb->msgflags & I2O_MSGFLAGS_FAIL) != 0)
1704 im->im_flags |= IM_FAIL;
1705
1706 #ifdef I2ODEBUG
1707 if ((im->im_flags & IM_REPLIED) != 0)
1708 panic("%s: dup reply", device_xname(sc->sc_dev));
1709 #endif
1710 im->im_flags |= IM_REPLIED;
1711
1712 #ifdef I2ODEBUG
1713 if (status != I2O_STATUS_SUCCESS)
1714 iop_reply_print(sc, rb);
1715 #endif
1716 im->im_reqstatus = status;
1717 im->im_detstatus = le16toh(rb->detail);
1718
1719 /* Copy the reply frame, if requested. */
1720 if (im->im_rb != NULL) {
1721 size = (le32toh(rb->msgflags) >> 14) & ~3;
1722 #ifdef I2ODEBUG
1723 if (size > sc->sc_framesize)
1724 panic("iop_handle_reply: reply too large");
1725 #endif
1726 memcpy(im->im_rb, rb, size);
1727 }
1728
1729 /* Notify the initiator. */
1730 if ((im->im_flags & IM_WAIT) != 0)
1731 cv_broadcast(&im->im_cv);
1732 else if ((im->im_flags & (IM_POLL | IM_POLL_INTR)) != IM_POLL) {
1733 if (ii != NULL) {
1734 mutex_spin_exit(&sc->sc_intrlock);
1735 (*ii->ii_intr)(ii->ii_dv, im, rb);
1736 mutex_spin_enter(&sc->sc_intrlock);
1737 }
1738 }
1739 } else {
1740 /*
1741 * This initiator discards message wrappers.
1742 *
1743 * Simply pass the reply frame to the initiator.
1744 */
1745 if (ii != NULL) {
1746 mutex_spin_exit(&sc->sc_intrlock);
1747 (*ii->ii_intr)(ii->ii_dv, NULL, rb);
1748 mutex_spin_enter(&sc->sc_intrlock);
1749 }
1750 }
1751
1752 return (status);
1753 }
1754
1755 /*
1756 * Handle an interrupt from the IOP.
1757 */
1758 int
1759 iop_intr(void *arg)
1760 {
1761 struct iop_softc *sc;
1762 u_int32_t rmfa;
1763
1764 sc = arg;
1765
1766 mutex_spin_enter(&sc->sc_intrlock);
1767
1768 if ((iop_inl(sc, IOP_REG_INTR_STATUS) & IOP_INTR_OFIFO) == 0) {
1769 mutex_spin_exit(&sc->sc_intrlock);
1770 return (0);
1771 }
1772
1773 for (;;) {
1774 /* Double read to account for IOP bug. */
1775 if ((rmfa = iop_inl(sc, IOP_REG_OFIFO)) == IOP_MFA_EMPTY) {
1776 rmfa = iop_inl(sc, IOP_REG_OFIFO);
1777 if (rmfa == IOP_MFA_EMPTY)
1778 break;
1779 }
1780 iop_handle_reply(sc, rmfa);
1781 iop_outl(sc, IOP_REG_OFIFO, rmfa);
1782 }
1783
1784 mutex_spin_exit(&sc->sc_intrlock);
1785 return (1);
1786 }
1787
1788 /*
1789 * Handle an event signalled by the executive.
1790 */
1791 static void
1792 iop_intr_event(device_t dv, struct iop_msg *im, void *reply)
1793 {
1794 struct i2o_util_event_register_reply *rb;
1795 u_int event;
1796
1797 rb = reply;
1798
1799 if ((rb->msgflags & I2O_MSGFLAGS_FAIL) != 0)
1800 return;
1801
1802 event = le32toh(rb->event);
1803 printf("%s: event 0x%08x received\n", device_xname(dv), event);
1804 }
1805
1806 /*
1807 * Allocate a message wrapper.
1808 */
1809 struct iop_msg *
1810 iop_msg_alloc(struct iop_softc *sc, int flags)
1811 {
1812 struct iop_msg *im;
1813 static u_int tctxgen;
1814 int i;
1815
1816 #ifdef I2ODEBUG
1817 if ((flags & IM_SYSMASK) != 0)
1818 panic("iop_msg_alloc: system flags specified");
1819 #endif
1820
1821 mutex_spin_enter(&sc->sc_intrlock);
1822 im = SLIST_FIRST(&sc->sc_im_freelist);
1823 #if defined(DIAGNOSTIC) || defined(I2ODEBUG)
1824 if (im == NULL)
1825 panic("iop_msg_alloc: no free wrappers");
1826 #endif
1827 SLIST_REMOVE_HEAD(&sc->sc_im_freelist, im_chain);
1828 mutex_spin_exit(&sc->sc_intrlock);
1829
1830 im->im_tctx = (im->im_tctx & IOP_TCTX_MASK) | tctxgen;
1831 tctxgen += (1 << IOP_TCTX_SHIFT);
1832 im->im_flags = flags | IM_ALLOCED;
1833 im->im_rb = NULL;
1834 i = 0;
1835 do {
1836 im->im_xfer[i++].ix_size = 0;
1837 } while (i < IOP_MAX_MSG_XFERS);
1838
1839 return (im);
1840 }
1841
1842 /*
1843 * Free a message wrapper.
1844 */
1845 void
1846 iop_msg_free(struct iop_softc *sc, struct iop_msg *im)
1847 {
1848
1849 #ifdef I2ODEBUG
1850 if ((im->im_flags & IM_ALLOCED) == 0)
1851 panic("iop_msg_free: wrapper not allocated");
1852 #endif
1853
1854 im->im_flags = 0;
1855 mutex_spin_enter(&sc->sc_intrlock);
1856 SLIST_INSERT_HEAD(&sc->sc_im_freelist, im, im_chain);
1857 mutex_spin_exit(&sc->sc_intrlock);
1858 }
1859
1860 /*
1861 * Map a data transfer. Write a scatter-gather list into the message frame.
1862 */
1863 int
1864 iop_msg_map(struct iop_softc *sc, struct iop_msg *im, u_int32_t *mb,
1865 void *xferaddr, int xfersize, int out, struct proc *up)
1866 {
1867 bus_dmamap_t dm;
1868 bus_dma_segment_t *ds;
1869 struct iop_xfer *ix;
1870 u_int rv, i, nsegs, flg, off, xn;
1871 u_int32_t *p;
1872
1873 for (xn = 0, ix = im->im_xfer; xn < IOP_MAX_MSG_XFERS; xn++, ix++)
1874 if (ix->ix_size == 0)
1875 break;
1876
1877 #ifdef I2ODEBUG
1878 if (xfersize == 0)
1879 panic("iop_msg_map: null transfer");
1880 if (xfersize > IOP_MAX_XFER)
1881 panic("iop_msg_map: transfer too large");
1882 if (xn == IOP_MAX_MSG_XFERS)
1883 panic("iop_msg_map: too many xfers");
1884 #endif
1885
1886 /*
1887 * Only the first DMA map is static.
1888 */
1889 if (xn != 0) {
1890 rv = bus_dmamap_create(sc->sc_dmat, IOP_MAX_XFER,
1891 IOP_MAX_SEGS, IOP_MAX_XFER, 0,
1892 BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &ix->ix_map);
1893 if (rv != 0)
1894 return (rv);
1895 }
1896
1897 dm = ix->ix_map;
1898 rv = bus_dmamap_load(sc->sc_dmat, dm, xferaddr, xfersize, up,
1899 (up == NULL ? BUS_DMA_NOWAIT : 0));
1900 if (rv != 0)
1901 goto bad;
1902
1903 /*
1904 * How many SIMPLE SG elements can we fit in this message?
1905 */
1906 off = mb[0] >> 16;
1907 p = mb + off;
1908 nsegs = ((sc->sc_framesize >> 2) - off) >> 1;
1909
1910 if (dm->dm_nsegs > nsegs) {
1911 bus_dmamap_unload(sc->sc_dmat, ix->ix_map);
1912 rv = EFBIG;
1913 DPRINTF(("iop_msg_map: too many segs\n"));
1914 goto bad;
1915 }
1916
1917 nsegs = dm->dm_nsegs;
1918 xfersize = 0;
1919
1920 /*
1921 * Write out the SG list.
1922 */
1923 if (out)
1924 flg = I2O_SGL_SIMPLE | I2O_SGL_DATA_OUT;
1925 else
1926 flg = I2O_SGL_SIMPLE;
1927
1928 for (i = nsegs, ds = dm->dm_segs; i > 1; i--, p += 2, ds++) {
1929 p[0] = (u_int32_t)ds->ds_len | flg;
1930 p[1] = (u_int32_t)ds->ds_addr;
1931 xfersize += ds->ds_len;
1932 }
1933
1934 p[0] = (u_int32_t)ds->ds_len | flg | I2O_SGL_END_BUFFER;
1935 p[1] = (u_int32_t)ds->ds_addr;
1936 xfersize += ds->ds_len;
1937
1938 /* Fix up the transfer record, and sync the map. */
1939 ix->ix_flags = (out ? IX_OUT : IX_IN);
1940 ix->ix_size = xfersize;
1941 bus_dmamap_sync(sc->sc_dmat, ix->ix_map, 0, xfersize,
1942 out ? BUS_DMASYNC_PREWRITE : BUS_DMASYNC_PREREAD);
1943
1944 /*
1945 * If this is the first xfer we've mapped for this message, adjust
1946 * the SGL offset field in the message header.
1947 */
1948 if ((im->im_flags & IM_SGLOFFADJ) == 0) {
1949 mb[0] += (mb[0] >> 12) & 0xf0;
1950 im->im_flags |= IM_SGLOFFADJ;
1951 }
1952 mb[0] += (nsegs << 17);
1953 return (0);
1954
1955 bad:
1956 if (xn != 0)
1957 bus_dmamap_destroy(sc->sc_dmat, ix->ix_map);
1958 return (rv);
1959 }
1960
1961 /*
1962 * Map a block I/O data transfer (different in that there's only one per
1963 * message maximum, and PAGE addressing may be used). Write a scatter
1964 * gather list into the message frame.
1965 */
1966 int
1967 iop_msg_map_bio(struct iop_softc *sc, struct iop_msg *im, u_int32_t *mb,
1968 void *xferaddr, int xfersize, int out)
1969 {
1970 bus_dma_segment_t *ds;
1971 bus_dmamap_t dm;
1972 struct iop_xfer *ix;
1973 u_int rv, i, nsegs, off, slen, tlen, flg;
1974 paddr_t saddr, eaddr;
1975 u_int32_t *p;
1976
1977 #ifdef I2ODEBUG
1978 if (xfersize == 0)
1979 panic("iop_msg_map_bio: null transfer");
1980 if (xfersize > IOP_MAX_XFER)
1981 panic("iop_msg_map_bio: transfer too large");
1982 if ((im->im_flags & IM_SGLOFFADJ) != 0)
1983 panic("iop_msg_map_bio: SGLOFFADJ");
1984 #endif
1985
1986 ix = im->im_xfer;
1987 dm = ix->ix_map;
1988 rv = bus_dmamap_load(sc->sc_dmat, dm, xferaddr, xfersize, NULL,
1989 BUS_DMA_NOWAIT | BUS_DMA_STREAMING);
1990 if (rv != 0)
1991 return (rv);
1992
1993 off = mb[0] >> 16;
1994 nsegs = ((sc->sc_framesize >> 2) - off) >> 1;
1995
1996 /*
1997 * If the transfer is highly fragmented and won't fit using SIMPLE
1998 * elements, use PAGE_LIST elements instead. SIMPLE elements are
1999 * potentially more efficient, both for us and the IOP.
2000 */
2001 if (dm->dm_nsegs > nsegs) {
2002 nsegs = 1;
2003 p = mb + off + 1;
2004
2005 /* XXX This should be done with a bus_space flag. */
2006 for (i = dm->dm_nsegs, ds = dm->dm_segs; i > 0; i--, ds++) {
2007 slen = ds->ds_len;
2008 saddr = ds->ds_addr;
2009
2010 while (slen > 0) {
2011 eaddr = (saddr + PAGE_SIZE) & ~(PAGE_SIZE - 1);
2012 tlen = min(eaddr - saddr, slen);
2013 slen -= tlen;
2014 *p++ = le32toh(saddr);
2015 saddr = eaddr;
2016 nsegs++;
2017 }
2018 }
2019
2020 mb[off] = xfersize | I2O_SGL_PAGE_LIST | I2O_SGL_END_BUFFER |
2021 I2O_SGL_END;
2022 if (out)
2023 mb[off] |= I2O_SGL_DATA_OUT;
2024 } else {
2025 p = mb + off;
2026 nsegs = dm->dm_nsegs;
2027
2028 if (out)
2029 flg = I2O_SGL_SIMPLE | I2O_SGL_DATA_OUT;
2030 else
2031 flg = I2O_SGL_SIMPLE;
2032
2033 for (i = nsegs, ds = dm->dm_segs; i > 1; i--, p += 2, ds++) {
2034 p[0] = (u_int32_t)ds->ds_len | flg;
2035 p[1] = (u_int32_t)ds->ds_addr;
2036 }
2037
2038 p[0] = (u_int32_t)ds->ds_len | flg | I2O_SGL_END_BUFFER |
2039 I2O_SGL_END;
2040 p[1] = (u_int32_t)ds->ds_addr;
2041 nsegs <<= 1;
2042 }
2043
2044 /* Fix up the transfer record, and sync the map. */
2045 ix->ix_flags = (out ? IX_OUT : IX_IN);
2046 ix->ix_size = xfersize;
2047 bus_dmamap_sync(sc->sc_dmat, ix->ix_map, 0, xfersize,
2048 out ? BUS_DMASYNC_PREWRITE : BUS_DMASYNC_PREREAD);
2049
2050 /*
2051 * Adjust the SGL offset and total message size fields. We don't
2052 * set IM_SGLOFFADJ, since it's used only for SIMPLE elements.
2053 */
2054 mb[0] += ((off << 4) + (nsegs << 16));
2055 return (0);
2056 }
2057
2058 /*
2059 * Unmap all data transfers associated with a message wrapper.
2060 */
2061 void
2062 iop_msg_unmap(struct iop_softc *sc, struct iop_msg *im)
2063 {
2064 struct iop_xfer *ix;
2065 int i;
2066
2067 #ifdef I2ODEBUG
2068 if (im->im_xfer[0].ix_size == 0)
2069 panic("iop_msg_unmap: no transfers mapped");
2070 #endif
2071
2072 for (ix = im->im_xfer, i = 0;;) {
2073 bus_dmamap_sync(sc->sc_dmat, ix->ix_map, 0, ix->ix_size,
2074 ix->ix_flags & IX_OUT ? BUS_DMASYNC_POSTWRITE :
2075 BUS_DMASYNC_POSTREAD);
2076 bus_dmamap_unload(sc->sc_dmat, ix->ix_map);
2077
2078 /* Only the first DMA map is static. */
2079 if (i != 0)
2080 bus_dmamap_destroy(sc->sc_dmat, ix->ix_map);
2081 if ((++ix)->ix_size == 0)
2082 break;
2083 if (++i >= IOP_MAX_MSG_XFERS)
2084 break;
2085 }
2086 }
2087
2088 /*
2089 * Post a message frame to the IOP's inbound queue.
2090 */
2091 int
2092 iop_post(struct iop_softc *sc, u_int32_t *mb)
2093 {
2094 u_int32_t mfa;
2095
2096 #ifdef I2ODEBUG
2097 if ((mb[0] >> 16) > (sc->sc_framesize >> 2))
2098 panic("iop_post: frame too large");
2099 #endif
2100
2101 mutex_spin_enter(&sc->sc_intrlock);
2102
2103 /* Allocate a slot with the IOP. */
2104 if ((mfa = iop_inl(sc, IOP_REG_IFIFO)) == IOP_MFA_EMPTY)
2105 if ((mfa = iop_inl(sc, IOP_REG_IFIFO)) == IOP_MFA_EMPTY) {
2106 mutex_spin_exit(&sc->sc_intrlock);
2107 aprint_error_dev(sc->sc_dev, "mfa not forthcoming\n");
2108 return (EAGAIN);
2109 }
2110
2111 /* Perform reply buffer DMA synchronisation. */
2112 if (sc->sc_rep_size != 0) {
2113 bus_dmamap_sync(sc->sc_dmat, sc->sc_rep_dmamap, 0,
2114 sc->sc_rep_size, BUS_DMASYNC_PREREAD);
2115 }
2116
2117 /* Copy out the message frame. */
2118 bus_space_write_region_4(sc->sc_msg_iot, sc->sc_msg_ioh, mfa, mb,
2119 mb[0] >> 16);
2120 bus_space_barrier(sc->sc_msg_iot, sc->sc_msg_ioh, mfa,
2121 (mb[0] >> 14) & ~3, BUS_SPACE_BARRIER_WRITE);
2122
2123 /* Post the MFA back to the IOP. */
2124 iop_outl(sc, IOP_REG_IFIFO, mfa);
2125
2126 mutex_spin_exit(&sc->sc_intrlock);
2127 return (0);
2128 }
2129
2130 /*
2131 * Post a message to the IOP and deal with completion.
2132 */
2133 int
2134 iop_msg_post(struct iop_softc *sc, struct iop_msg *im, void *xmb, int timo)
2135 {
2136 u_int32_t *mb;
2137 int rv;
2138
2139 mb = xmb;
2140
2141 /* Terminate the scatter/gather list chain. */
2142 if ((im->im_flags & IM_SGLOFFADJ) != 0)
2143 mb[(mb[0] >> 16) - 2] |= I2O_SGL_END;
2144
2145 if ((rv = iop_post(sc, mb)) != 0)
2146 return (rv);
2147
2148 if ((im->im_flags & (IM_POLL | IM_WAIT)) != 0) {
2149 if ((im->im_flags & IM_POLL) != 0)
2150 iop_msg_poll(sc, im, timo);
2151 else
2152 iop_msg_wait(sc, im, timo);
2153
2154 mutex_spin_enter(&sc->sc_intrlock);
2155 if ((im->im_flags & IM_REPLIED) != 0) {
2156 if ((im->im_flags & IM_NOSTATUS) != 0)
2157 rv = 0;
2158 else if ((im->im_flags & IM_FAIL) != 0)
2159 rv = ENXIO;
2160 else if (im->im_reqstatus != I2O_STATUS_SUCCESS)
2161 rv = EIO;
2162 else
2163 rv = 0;
2164 } else
2165 rv = EBUSY;
2166 mutex_spin_exit(&sc->sc_intrlock);
2167 } else
2168 rv = 0;
2169
2170 return (rv);
2171 }
2172
2173 /*
2174 * Spin until the specified message is replied to.
2175 */
2176 static void
2177 iop_msg_poll(struct iop_softc *sc, struct iop_msg *im, int timo)
2178 {
2179 u_int32_t rmfa;
2180
2181 mutex_spin_enter(&sc->sc_intrlock);
2182
2183 for (timo *= 10; timo != 0; timo--) {
2184 if ((iop_inl(sc, IOP_REG_INTR_STATUS) & IOP_INTR_OFIFO) != 0) {
2185 /* Double read to account for IOP bug. */
2186 rmfa = iop_inl(sc, IOP_REG_OFIFO);
2187 if (rmfa == IOP_MFA_EMPTY)
2188 rmfa = iop_inl(sc, IOP_REG_OFIFO);
2189 if (rmfa != IOP_MFA_EMPTY) {
2190 iop_handle_reply(sc, rmfa);
2191
2192 /*
2193 * Return the reply frame to the IOP's
2194 * outbound FIFO.
2195 */
2196 iop_outl(sc, IOP_REG_OFIFO, rmfa);
2197 }
2198 }
2199 if ((im->im_flags & IM_REPLIED) != 0)
2200 break;
2201 mutex_spin_exit(&sc->sc_intrlock);
2202 DELAY(100);
2203 mutex_spin_enter(&sc->sc_intrlock);
2204 }
2205
2206 if (timo == 0) {
2207 #ifdef I2ODEBUG
2208 printf("%s: poll - no reply\n", device_xname(sc->sc_dev));
2209 if (iop_status_get(sc, 1) != 0)
2210 printf("iop_msg_poll: unable to retrieve status\n");
2211 else
2212 printf("iop_msg_poll: IOP state = %d\n",
2213 (le32toh(sc->sc_status.segnumber) >> 16) & 0xff);
2214 #endif
2215 }
2216
2217 mutex_spin_exit(&sc->sc_intrlock);
2218 }
2219
2220 /*
2221 * Sleep until the specified message is replied to.
2222 */
2223 static void
2224 iop_msg_wait(struct iop_softc *sc, struct iop_msg *im, int timo)
2225 {
2226 int rv;
2227
2228 mutex_spin_enter(&sc->sc_intrlock);
2229 if ((im->im_flags & IM_REPLIED) != 0) {
2230 mutex_spin_exit(&sc->sc_intrlock);
2231 return;
2232 }
2233 rv = cv_timedwait(&im->im_cv, &sc->sc_intrlock, mstohz(timo));
2234 mutex_spin_exit(&sc->sc_intrlock);
2235
2236 #ifdef I2ODEBUG
2237 if (rv != 0) {
2238 printf("iop_msg_wait: tsleep() == %d\n", rv);
2239 if (iop_status_get(sc, 0) != 0)
2240 printf("iop_msg_wait: unable to retrieve status\n");
2241 else
2242 printf("iop_msg_wait: IOP state = %d\n",
2243 (le32toh(sc->sc_status.segnumber) >> 16) & 0xff);
2244 }
2245 #endif
2246 }
2247
2248 /*
2249 * Release an unused message frame back to the IOP's inbound fifo.
2250 */
2251 static void
2252 iop_release_mfa(struct iop_softc *sc, u_int32_t mfa)
2253 {
2254
2255 /* Use the frame to issue a no-op. */
2256 iop_outl_msg(sc, mfa, I2O_VERSION_11 | (4 << 16));
2257 iop_outl_msg(sc, mfa + 4, I2O_MSGFUNC(I2O_TID_IOP, I2O_UTIL_NOP));
2258 iop_outl_msg(sc, mfa + 8, 0);
2259 iop_outl_msg(sc, mfa + 12, 0);
2260
2261 iop_outl(sc, IOP_REG_IFIFO, mfa);
2262 }
2263
2264 #ifdef I2ODEBUG
2265 /*
2266 * Dump a reply frame header.
2267 */
2268 static void
2269 iop_reply_print(struct iop_softc *sc, struct i2o_reply *rb)
2270 {
2271 u_int function, detail;
2272 const char *statusstr;
2273
2274 function = (le32toh(rb->msgfunc) >> 24) & 0xff;
2275 detail = le16toh(rb->detail);
2276
2277 printf("%s: reply:\n", device_xname(sc->sc_dev));
2278
2279 if (rb->reqstatus < sizeof(iop_status) / sizeof(iop_status[0]))
2280 statusstr = iop_status[rb->reqstatus];
2281 else
2282 statusstr = "undefined error code";
2283
2284 printf("%s: function=0x%02x status=0x%02x (%s)\n",
2285 device_xname(sc->sc_dev), function, rb->reqstatus, statusstr);
2286 printf("%s: detail=0x%04x ictx=0x%08x tctx=0x%08x\n",
2287 device_xname(sc->sc_dev), detail, le32toh(rb->msgictx),
2288 le32toh(rb->msgtctx));
2289 printf("%s: tidi=%d tidt=%d flags=0x%02x\n", device_xname(sc->sc_dev),
2290 (le32toh(rb->msgfunc) >> 12) & 4095, le32toh(rb->msgfunc) & 4095,
2291 (le32toh(rb->msgflags) >> 8) & 0xff);
2292 }
2293 #endif
2294
2295 /*
2296 * Dump a transport failure reply.
2297 */
2298 static void
2299 iop_tfn_print(struct iop_softc *sc, struct i2o_fault_notify *fn)
2300 {
2301
2302 printf("%s: WARNING: transport failure:\n", device_xname(sc->sc_dev));
2303
2304 printf("%s: ictx=0x%08x tctx=0x%08x\n", device_xname(sc->sc_dev),
2305 le32toh(fn->msgictx), le32toh(fn->msgtctx));
2306 printf("%s: failurecode=0x%02x severity=0x%02x\n",
2307 device_xname(sc->sc_dev), fn->failurecode, fn->severity);
2308 printf("%s: highestver=0x%02x lowestver=0x%02x\n",
2309 device_xname(sc->sc_dev), fn->highestver, fn->lowestver);
2310 }
2311
2312 /*
2313 * Translate an I2O ASCII field into a C string.
2314 */
2315 void
2316 iop_strvis(struct iop_softc *sc, const char *src, int slen, char *dst, int dlen)
2317 {
2318 int hc, lc, i, nit;
2319
2320 dlen--;
2321 lc = 0;
2322 hc = 0;
2323 i = 0;
2324
2325 /*
2326 * DPT use NUL as a space, whereas AMI use it as a terminator. The
2327 * spec has nothing to say about it. Since AMI fields are usually
2328 * filled with junk after the terminator, ...
2329 */
2330 nit = (le16toh(sc->sc_status.orgid) != I2O_ORG_DPT);
2331
2332 while (slen-- != 0 && dlen-- != 0) {
2333 if (nit && *src == '\0')
2334 break;
2335 else if (*src <= 0x20 || *src >= 0x7f) {
2336 if (hc)
2337 dst[i++] = ' ';
2338 } else {
2339 hc = 1;
2340 dst[i++] = *src;
2341 lc = i;
2342 }
2343 src++;
2344 }
2345
2346 dst[lc] = '\0';
2347 }
2348
2349 /*
2350 * Retrieve the DEVICE_IDENTITY parameter group from the target and dump it.
2351 */
2352 int
2353 iop_print_ident(struct iop_softc *sc, int tid)
2354 {
2355 struct {
2356 struct i2o_param_op_results pr;
2357 struct i2o_param_read_results prr;
2358 struct i2o_param_device_identity di;
2359 } __packed p;
2360 char buf[32];
2361 int rv;
2362
2363 rv = iop_field_get_all(sc, tid, I2O_PARAM_DEVICE_IDENTITY, &p,
2364 sizeof(p), NULL);
2365 if (rv != 0)
2366 return (rv);
2367
2368 iop_strvis(sc, p.di.vendorinfo, sizeof(p.di.vendorinfo), buf,
2369 sizeof(buf));
2370 printf(" <%s, ", buf);
2371 iop_strvis(sc, p.di.productinfo, sizeof(p.di.productinfo), buf,
2372 sizeof(buf));
2373 printf("%s, ", buf);
2374 iop_strvis(sc, p.di.revlevel, sizeof(p.di.revlevel), buf, sizeof(buf));
2375 printf("%s>", buf);
2376
2377 return (0);
2378 }
2379
2380 /*
2381 * Claim or unclaim the specified TID.
2382 */
2383 int
2384 iop_util_claim(struct iop_softc *sc, struct iop_initiator *ii, int release,
2385 int flags)
2386 {
2387 struct iop_msg *im;
2388 struct i2o_util_claim mf;
2389 int rv, func;
2390
2391 func = release ? I2O_UTIL_CLAIM_RELEASE : I2O_UTIL_CLAIM;
2392 im = iop_msg_alloc(sc, IM_WAIT);
2393
2394 /* We can use the same structure, as they're identical. */
2395 mf.msgflags = I2O_MSGFLAGS(i2o_util_claim);
2396 mf.msgfunc = I2O_MSGFUNC(ii->ii_tid, func);
2397 mf.msgictx = ii->ii_ictx;
2398 mf.msgtctx = im->im_tctx;
2399 mf.flags = flags;
2400
2401 rv = iop_msg_post(sc, im, &mf, 5000);
2402 iop_msg_free(sc, im);
2403 return (rv);
2404 }
2405
2406 /*
2407 * Perform an abort.
2408 */
2409 int iop_util_abort(struct iop_softc *sc, struct iop_initiator *ii, int func,
2410 int tctxabort, int flags)
2411 {
2412 struct iop_msg *im;
2413 struct i2o_util_abort mf;
2414 int rv;
2415
2416 im = iop_msg_alloc(sc, IM_WAIT);
2417
2418 mf.msgflags = I2O_MSGFLAGS(i2o_util_abort);
2419 mf.msgfunc = I2O_MSGFUNC(ii->ii_tid, I2O_UTIL_ABORT);
2420 mf.msgictx = ii->ii_ictx;
2421 mf.msgtctx = im->im_tctx;
2422 mf.flags = (func << 24) | flags;
2423 mf.tctxabort = tctxabort;
2424
2425 rv = iop_msg_post(sc, im, &mf, 5000);
2426 iop_msg_free(sc, im);
2427 return (rv);
2428 }
2429
2430 /*
2431 * Enable or disable reception of events for the specified device.
2432 */
2433 int iop_util_eventreg(struct iop_softc *sc, struct iop_initiator *ii, int mask)
2434 {
2435 struct i2o_util_event_register mf;
2436
2437 mf.msgflags = I2O_MSGFLAGS(i2o_util_event_register);
2438 mf.msgfunc = I2O_MSGFUNC(ii->ii_tid, I2O_UTIL_EVENT_REGISTER);
2439 mf.msgictx = ii->ii_ictx;
2440 mf.msgtctx = 0;
2441 mf.eventmask = mask;
2442
2443 /* This message is replied to only when events are signalled. */
2444 return (iop_post(sc, (u_int32_t *)&mf));
2445 }
2446
2447 int
2448 iopopen(dev_t dev, int flag, int mode, struct lwp *l)
2449 {
2450 struct iop_softc *sc;
2451
2452 if ((sc = device_lookup_private(&iop_cd, minor(dev))) == NULL)
2453 return (ENXIO);
2454 if ((sc->sc_flags & IOP_ONLINE) == 0)
2455 return (ENXIO);
2456 if ((sc->sc_flags & IOP_OPEN) != 0)
2457 return (EBUSY);
2458 sc->sc_flags |= IOP_OPEN;
2459
2460 return (0);
2461 }
2462
2463 int
2464 iopclose(dev_t dev, int flag, int mode,
2465 struct lwp *l)
2466 {
2467 struct iop_softc *sc;
2468
2469 sc = device_lookup_private(&iop_cd, minor(dev));
2470 sc->sc_flags &= ~IOP_OPEN;
2471
2472 return (0);
2473 }
2474
2475 int
2476 iopioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
2477 {
2478 struct iop_softc *sc;
2479 struct iovec *iov;
2480 int rv, i;
2481
2482 sc = device_lookup_private(&iop_cd, minor(dev));
2483 rv = 0;
2484
2485 switch (cmd) {
2486 case IOPIOCPT:
2487 rv = kauth_authorize_device_passthru(l->l_cred, dev,
2488 KAUTH_REQ_DEVICE_RAWIO_PASSTHRU_ALL, data);
2489 if (rv)
2490 return (rv);
2491
2492 return (iop_passthrough(sc, (struct ioppt *)data, l->l_proc));
2493
2494 case IOPIOCGSTATUS:
2495 iov = (struct iovec *)data;
2496 i = sizeof(struct i2o_status);
2497 if (i > iov->iov_len)
2498 i = iov->iov_len;
2499 else
2500 iov->iov_len = i;
2501 if ((rv = iop_status_get(sc, 0)) == 0)
2502 rv = copyout(&sc->sc_status, iov->iov_base, i);
2503 return (rv);
2504
2505 case IOPIOCGLCT:
2506 case IOPIOCGTIDMAP:
2507 case IOPIOCRECONFIG:
2508 break;
2509
2510 default:
2511 #if defined(DIAGNOSTIC) || defined(I2ODEBUG)
2512 printf("%s: unknown ioctl %lx\n", device_xname(sc->sc_dev), cmd);
2513 #endif
2514 return (ENOTTY);
2515 }
2516
2517 mutex_enter(&sc->sc_conflock);
2518
2519 switch (cmd) {
2520 case IOPIOCGLCT:
2521 iov = (struct iovec *)data;
2522 i = le16toh(sc->sc_lct->tablesize) << 2;
2523 if (i > iov->iov_len)
2524 i = iov->iov_len;
2525 else
2526 iov->iov_len = i;
2527 rv = copyout(sc->sc_lct, iov->iov_base, i);
2528 break;
2529
2530 case IOPIOCRECONFIG:
2531 rv = iop_reconfigure(sc, 0);
2532 break;
2533
2534 case IOPIOCGTIDMAP:
2535 iov = (struct iovec *)data;
2536 i = sizeof(struct iop_tidmap) * sc->sc_nlctent;
2537 if (i > iov->iov_len)
2538 i = iov->iov_len;
2539 else
2540 iov->iov_len = i;
2541 rv = copyout(sc->sc_tidmap, iov->iov_base, i);
2542 break;
2543 }
2544
2545 mutex_exit(&sc->sc_conflock);
2546 return (rv);
2547 }
2548
2549 static int
2550 iop_passthrough(struct iop_softc *sc, struct ioppt *pt, struct proc *p)
2551 {
2552 struct iop_msg *im;
2553 struct i2o_msg *mf;
2554 struct ioppt_buf *ptb;
2555 int rv, i, mapped;
2556
2557 mf = NULL;
2558 im = NULL;
2559 mapped = 1;
2560
2561 if (pt->pt_msglen > sc->sc_framesize ||
2562 pt->pt_msglen < sizeof(struct i2o_msg) ||
2563 pt->pt_nbufs > IOP_MAX_MSG_XFERS ||
2564 pt->pt_nbufs < 0 ||
2565 #if 0
2566 pt->pt_replylen < 0 ||
2567 #endif
2568 pt->pt_timo < 1000 || pt->pt_timo > 5*60*1000)
2569 return (EINVAL);
2570
2571 for (i = 0; i < pt->pt_nbufs; i++)
2572 if (pt->pt_bufs[i].ptb_datalen > IOP_MAX_XFER) {
2573 rv = ENOMEM;
2574 goto bad;
2575 }
2576
2577 mf = malloc(sc->sc_framesize, M_DEVBUF, M_WAITOK);
2578 if (mf == NULL)
2579 return (ENOMEM);
2580
2581 if ((rv = copyin(pt->pt_msg, mf, pt->pt_msglen)) != 0)
2582 goto bad;
2583
2584 im = iop_msg_alloc(sc, IM_WAIT | IM_NOSTATUS);
2585 im->im_rb = (struct i2o_reply *)mf;
2586 mf->msgictx = IOP_ICTX;
2587 mf->msgtctx = im->im_tctx;
2588
2589 for (i = 0; i < pt->pt_nbufs; i++) {
2590 ptb = &pt->pt_bufs[i];
2591 rv = iop_msg_map(sc, im, (u_int32_t *)mf, ptb->ptb_data,
2592 ptb->ptb_datalen, ptb->ptb_out != 0, p);
2593 if (rv != 0)
2594 goto bad;
2595 mapped = 1;
2596 }
2597
2598 if ((rv = iop_msg_post(sc, im, mf, pt->pt_timo)) != 0)
2599 goto bad;
2600
2601 i = (le32toh(im->im_rb->msgflags) >> 14) & ~3;
2602 if (i > sc->sc_framesize)
2603 i = sc->sc_framesize;
2604 if (i > pt->pt_replylen)
2605 i = pt->pt_replylen;
2606 rv = copyout(im->im_rb, pt->pt_reply, i);
2607
2608 bad:
2609 if (mapped != 0)
2610 iop_msg_unmap(sc, im);
2611 if (im != NULL)
2612 iop_msg_free(sc, im);
2613 if (mf != NULL)
2614 free(mf, M_DEVBUF);
2615 return (rv);
2616 }
2617