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