Lines Matching defs:mly

1 /*	$NetBSD: mly.c,v 1.56 2021/09/03 22:33:17 andvar Exp $	*/
58 * from FreeBSD: mly.c,v 1.8 2001/07/14 00:12:22 msmith Exp
66 * o Make mly->mly_btl a hash, then MLY_BTL_RESCAN becomes a SIMPLEQ.
73 __KERNEL_RCSID(0, "$NetBSD: mly.c,v 1.56 2021/09/03 22:33:17 andvar Exp $");
157 CFATTACH_DECL_NEW(mly, sizeof(struct mly_softc),
281 struct mly_softc *mly;
295 mly = device_private(self);
296 mly->mly_dv = self;
302 mly->mly_dmat = pa->pa_dmat;
303 mly->mly_hwif = ident->hwif;
335 mly->mly_iot = memt;
336 mly->mly_ioh = memh;
338 mly->mly_iot = iot;
339 mly->mly_ioh = ioh;
360 mly->mly_ih = pci_intr_establish_xname(pc, ih, IPL_BIO, mly_intr, mly,
362 if (mly->mly_ih == NULL) {
376 switch (mly->mly_hwif) {
378 mly->mly_doorbell_true = 0x00;
379 mly->mly_cmd_mailbox = MLY_I960RX_COMMAND_MAILBOX;
380 mly->mly_status_mailbox = MLY_I960RX_STATUS_MAILBOX;
381 mly->mly_idbr = MLY_I960RX_IDBR;
382 mly->mly_odbr = MLY_I960RX_ODBR;
383 mly->mly_error_status = MLY_I960RX_ERROR_STATUS;
384 mly->mly_interrupt_status = MLY_I960RX_INTERRUPT_STATUS;
385 mly->mly_interrupt_mask = MLY_I960RX_INTERRUPT_MASK;
389 mly->mly_doorbell_true = 0xff;
390 mly->mly_cmd_mailbox = MLY_STRONGARM_COMMAND_MAILBOX;
391 mly->mly_status_mailbox = MLY_STRONGARM_STATUS_MAILBOX;
392 mly->mly_idbr = MLY_STRONGARM_IDBR;
393 mly->mly_odbr = MLY_STRONGARM_ODBR;
394 mly->mly_error_status = MLY_STRONGARM_ERROR_STATUS;
395 mly->mly_interrupt_status = MLY_STRONGARM_INTERRUPT_STATUS;
396 mly->mly_interrupt_mask = MLY_STRONGARM_INTERRUPT_MASK;
403 rv = mly_dmamem_alloc(mly, MLY_SGL_SIZE * MLY_MAX_CCBS,
404 &mly->mly_sg_dmamap, (void **)&mly->mly_sg,
405 &mly->mly_sg_busaddr, &mly->mly_sg_seg);
416 rv = mly_dmamem_alloc(mly, sizeof(struct mly_mmbox),
417 &mly->mly_mmbox_dmamap, (void **)&mly->mly_mmbox,
418 &mly->mly_mmbox_busaddr, &mly->mly_mmbox_seg);
428 SLIST_INIT(&mly->mly_ccb_free);
429 SIMPLEQ_INIT(&mly->mly_ccb_queue);
434 mly_outb(mly, mly->mly_interrupt_mask, MLY_INTERRUPT_MASK_DISABLE);
441 if (mly_fwhandshake(mly)) {
451 if (mly_alloc_ccbs(mly)) {
456 if (mly_get_controllerinfo(mly)) {
460 mly_release_ccbs(mly);
461 if (mly_alloc_ccbs(mly)) {
471 if (mly_get_eventstatus(mly)) {
479 if (mly_enable_mmbox(mly)) {
487 mi = mly->mly_controllerinfo;
508 memset(&mly->mly_btl, 0, sizeof(mly->mly_btl));
510 mly->mly_nchans = mly->mly_controllerinfo->physical_channels_present +
511 mly->mly_controllerinfo->virtual_channels_present;
516 adapt = &mly->mly_adapt;
519 adapt->adapt_nchannels = mly->mly_nchans;
520 adapt->adapt_openings = mly->mly_ncmds - MLY_CCBS_RESV;
521 adapt->adapt_max_periph = mly->mly_ncmds - MLY_CCBS_RESV;
526 for (i = 0; i < mly->mly_nchans; i++) {
527 chan = &mly->mly_chans[i];
534 chan->chan_id = mly->mly_controllerparam->initiator_id;
542 mly_outb(mly, mly->mly_interrupt_mask, MLY_INTERRUPT_MASK_ENABLE);
547 mly->mly_state |= MLY_STATE_INITOK;
548 rv = kthread_create(PRI_NONE, 0, NULL, mly_thread, mly,
549 &mly->mly_thread, "%s", device_xname(self));
556 mly_release_ccbs(mly);
558 mly_dmamem_free(mly, sizeof(struct mly_mmbox),
559 mly->mly_mmbox_dmamap, (void *)mly->mly_mmbox,
560 &mly->mly_mmbox_seg);
562 mly_dmamem_free(mly, MLY_SGL_SIZE * MLY_MAX_CCBS,
563 mly->mly_sg_dmamap, (void *)mly->mly_sg,
564 &mly->mly_sg_seg);
571 mly_scan_channel(struct mly_softc *mly, int bus)
577 if (!mly_scan_btl(mly, bus, target)) {
578 tsleep(&mly->mly_btl[bus][target], PRIBIO, "mlyscan",
586 * Shut down all configured `mly' devices.
591 struct mly_softc *mly;
595 if ((mly = device_lookup_private(&mly_cd, i)) == NULL)
598 if (mly_flush(mly))
599 aprint_error_dev(mly->mly_dv, "unable to flush cache\n");
608 mly_get_controllerinfo(struct mly_softc *mly)
618 rv = mly_ioctl(mly, &mci, (void **)&mly->mly_controllerinfo,
619 sizeof(*mly->mly_controllerinfo), NULL, NULL);
628 rv = mly_ioctl(mly, &mci, (void **)&mly->mly_controllerparam,
629 sizeof(*mly->mly_controllerparam), NULL, NULL);
640 mly_scan_btl(struct mly_softc *mly, int bus, int target)
646 if (target == mly->mly_controllerparam->initiator_id) {
647 mly->mly_btl[bus][target].mb_flags = MLY_BTL_PROTECTED;
652 if ((mly->mly_btl[bus][target].mb_flags & MLY_BTL_SCANNING) != 0)
656 if ((rv = mly_ccb_alloc(mly, &mc)) != 0)
674 if (MLY_BUS_IS_VIRTUAL(mly, bus)) {
678 _lto3l(MLY_LOGADDR(0, MLY_LOGDEV_ID(mly, bus, target)),
690 if ((rv = mly_ccb_map(mly, mc)) != 0) {
692 mly_ccb_free(mly, mc);
696 mly->mly_btl[bus][target].mb_flags |= MLY_BTL_SCANNING;
697 mly_ccb_enqueue(mly, mc);
705 mly_complete_rescan(struct mly_softc *mly, struct mly_ccb *mc)
715 mly_ccb_unmap(mly, mc);
726 bus = MLY_LOGDEV_BUS(mly, MLY_LOGADDR_DEV(tmp));
727 target = MLY_LOGDEV_TARGET(mly, MLY_LOGADDR_DEV(tmp));
733 btlp = &mly->mly_btl[bus][target];
747 if (MLY_LOGDEV_BUS(mly, tmp) != bus ||
748 MLY_LOGDEV_TARGET(mly, tmp) != target) {
752 device_xname(mly->mly_dv), bus, target,
753 MLY_LOGDEV_BUS(mly, tmp),
754 MLY_LOGDEV_TARGET(mly, tmp));
769 device_xname(mly->mly_dv),
786 printf("%s: BTL rescan result invalid\n", device_xname(mly->mly_dv));
801 mly_get_xfer_mode(mly, bus, &xm);
809 mly_ccb_free(mly, mc);
816 mly_get_eventstatus(struct mly_softc *mly)
827 rv = mly_ioctl(mly, &mci, (void *)&mh, sizeof(*mh), NULL, NULL);
832 mly->mly_event_change = le32toh(mh->change_counter);
833 mly->mly_event_waiting = le32toh(mh->next_event);
834 mly->mly_event_counter = le32toh(mh->next_event);
837 memcpy(&mly->mly_mmbox->mmm_health.status, mh, sizeof(*mh));
839 bus_dmamap_sync(mly->mly_dmat, mly->mly_mmbox_dmamap,
841 sizeof(mly->mly_mmbox->mmm_health),
852 mly_enable_mmbox(struct mly_softc *mly)
864 tmp = mly->mly_mmbox_busaddr + offsetof(struct mly_mmbox, mmm_command);
867 tmp = mly->mly_mmbox_busaddr + offsetof(struct mly_mmbox, mmm_status);
870 tmp = mly->mly_mmbox_busaddr + offsetof(struct mly_mmbox, mmm_health);
880 rv = mly_ioctl(mly, &mci, NULL, 0, NULL, NULL);
884 mly->mly_state |= MLY_STATE_MMBOX_ACTIVE;
892 mly_flush(struct mly_softc *mly)
903 return (mly_ioctl(mly, &mci, NULL, 0, NULL, NULL));
914 mly_ioctl(struct mly_softc *mly, struct mly_cmd_ioctl *ioctl, void **data,
924 if ((rv = mly_ccb_alloc(mly, &mc)) != 0)
954 if ((rv = mly_ccb_map(mly, mc)) != 0)
956 rv = mly_ccb_poll(mly, mc, 30000);
958 mly_ccb_unmap(mly, mc);
987 mly_ccb_free(mly, mc);
997 mly_check_event(struct mly_softc *mly)
1000 bus_dmamap_sync(mly->mly_dmat, mly->mly_mmbox_dmamap,
1002 sizeof(mly->mly_mmbox->mmm_health),
1011 if (le32toh(mly->mly_mmbox->mmm_health.status.change_counter) !=
1012 mly->mly_event_change) {
1013 mly->mly_event_change =
1014 le32toh(mly->mly_mmbox->mmm_health.status.change_counter);
1015 mly->mly_event_waiting =
1016 le32toh(mly->mly_mmbox->mmm_health.status.next_event);
1019 wakeup(&mly->mly_event_change);
1022 bus_dmamap_sync(mly->mly_dmat, mly->mly_mmbox_dmamap,
1024 sizeof(mly->mly_mmbox->mmm_health),
1027 if (mly->mly_event_counter != mly->mly_event_waiting)
1028 mly_fetch_event(mly);
1036 mly_fetch_event(struct mly_softc *mly)
1044 if (mly_ccb_alloc(mly, &mc))
1061 if (mly->mly_event_counter == mly->mly_event_waiting) {
1064 mly_ccb_free(mly, mc);
1067 event = mly->mly_event_counter++;
1089 if (mly_ccb_map(mly, mc) != 0)
1091 mly_ccb_enqueue(mly, mc);
1095 printf("%s: couldn't fetch event %u\n", device_xname(mly->mly_dv), event);
1097 mly_ccb_free(mly, mc);
1104 mly_complete_event(struct mly_softc *mly, struct mly_ccb *mc)
1109 mly_ccb_unmap(mly, mc);
1110 mly_ccb_free(mly, mc);
1114 mly_process_event(mly, me);
1116 aprint_error_dev(mly->mly_dv, "unable to fetch event; status = 0x%x\n",
1122 mly_check_event(mly);
1130 mly_process_event(struct mly_softc *mly, struct mly_event *me)
1179 printf("%s: physical device %d:%d %s\n", device_xname(mly->mly_dv),
1182 mly->mly_btl[me->channel][me->target].mb_flags |=
1191 bus = MLY_LOGDEV_BUS(mly, me->lun);
1192 target = MLY_LOGDEV_TARGET(mly, me->lun);
1193 printf("%s: logical device %d:%d %s\n", device_xname(mly->mly_dv),
1196 mly->mly_btl[bus][target].mb_flags |= MLY_BTL_RESCAN;
1215 printf("%s: physical device %d:%d %s\n", device_xname(mly->mly_dv),
1218 device_xname(mly->mly_dv), SSD_SENSE_KEY(ssd->flags),
1221 device_xname(mly->mly_dv), ssd->info[0], ssd->info[1],
1226 mly->mly_btl[me->channel][me->target].mb_flags |=
1231 printf("%s: ", device_xname(mly->mly_dv));
1236 printf("%s: controller %s\n", device_xname(mly->mly_dv), tp);
1240 printf("%s: %s - %d\n", device_xname(mly->mly_dv), tp, event);
1255 struct mly_softc *mly;
1259 mly = (struct mly_softc *)cookie;
1263 mly_check_event(mly);
1268 for (bus = 0; bus < mly->mly_nchans && !done; bus++) {
1271 btl = &mly->mly_btl[bus][target];
1274 mly_scan_btl(mly, bus, target);
1293 mly_ccb_poll(struct mly_softc *mly, struct mly_ccb *mc, int timo)
1297 if ((rv = mly_ccb_submit(mly, mc)) != 0)
1303 mly_intr(mly);
1315 mly_ccb_wait(struct mly_softc *mly, struct mly_ccb *mc, int timo)
1319 mly_ccb_enqueue(mly, mc);
1338 mly_ccb_enqueue(struct mly_softc *mly, struct mly_ccb *mc)
1345 SIMPLEQ_INSERT_TAIL(&mly->mly_ccb_queue, mc, mc_link.simpleq);
1347 while ((mc = SIMPLEQ_FIRST(&mly->mly_ccb_queue)) != NULL) {
1348 if (mly_ccb_submit(mly, mc))
1350 SIMPLEQ_REMOVE_HEAD(&mly->mly_ccb_queue, mc_link.simpleq);
1360 mly_ccb_submit(struct mly_softc *mly, struct mly_ccb *mc)
1367 bus_dmamap_sync(mly->mly_dmat, mly->mly_pkt_dmamap,
1368 mc->mc_packetphys - mly->mly_pkt_busaddr,
1377 if ((mly->mly_state & MLY_STATE_MMBOX_ACTIVE) == 0) {
1381 if (mly_idbr_true(mly, MLY_HM_CMDSENT)) {
1389 mly_outl(mly, mly->mly_cmd_mailbox,
1391 mly_outl(mly, mly->mly_cmd_mailbox + 4,
1393 mly_outb(mly, mly->mly_idbr, MLY_HM_CMDSENT);
1395 pkt = &mly->mly_mmbox->mmm_command[mly->mly_mmbox_cmd_idx];
1396 off = (char *)pkt - (char *)mly->mly_mmbox;
1398 bus_dmamap_sync(mly->mly_dmat, mly->mly_mmbox_dmamap,
1399 off, sizeof(mly->mly_mmbox->mmm_command[0]),
1415 bus_dmamap_sync(mly->mly_dmat, mly->mly_mmbox_dmamap,
1416 off, sizeof(mly->mly_mmbox->mmm_command[0]),
1420 mly_outb(mly, mly->mly_idbr, MLY_AM_CMDSENT);
1421 mly->mly_mmbox_cmd_idx =
1422 (mly->mly_mmbox_cmd_idx + 1) % MLY_MMBOX_COMMANDS;
1439 struct mly_softc *mly;
1441 mly = cookie;
1447 if (mly_odbr_true(mly, MLY_HM_STSREADY)) {
1448 slot = mly_inw(mly, mly->mly_status_mailbox);
1451 mc = mly->mly_ccbs + (slot - MLY_SLOT_START);
1453 mly_inb(mly, mly->mly_status_mailbox + 2);
1455 mly_inb(mly, mly->mly_status_mailbox + 3);
1457 mly_inl(mly, mly->mly_status_mailbox + 4);
1459 mly_ccb_complete(mly, mc);
1463 device_xname(mly->mly_dv), slot);
1467 mly_outb(mly, mly->mly_odbr, MLY_HM_STSREADY);
1468 mly_outb(mly, mly->mly_idbr, MLY_HM_STSACK);
1475 if (mly_odbr_true(mly, MLY_AM_STSREADY)) {
1477 sp = &mly->mly_mmbox->mmm_status[mly->mly_mmbox_sts_idx];
1478 off = (char *)sp - (char *)mly->mly_mmbox;
1480 bus_dmamap_sync(mly->mly_dmat, mly->mly_mmbox_dmamap,
1481 off, sizeof(mly->mly_mmbox->mmm_command[0]),
1491 mc = mly->mly_ccbs + (slot - MLY_SLOT_START);
1495 mly_ccb_complete(mly, mc);
1502 "slot %u at %d\n", device_xname(mly->mly_dv),
1503 slot, mly->mly_mmbox_sts_idx);
1508 mly->mly_mmbox_sts_idx =
1509 (mly->mly_mmbox_sts_idx + 1) % MLY_MMBOX_STATUS;
1513 mly_outb(mly, mly->mly_odbr, MLY_AM_STSREADY);
1520 if (forus && ! SIMPLEQ_EMPTY(&mly->mly_ccb_queue))
1521 mly_ccb_enqueue(mly, NULL);
1530 mly_ccb_complete(struct mly_softc *mly, struct mly_ccb *mc)
1534 bus_dmamap_sync(mly->mly_dmat, mly->mly_pkt_dmamap,
1535 mc->mc_packetphys - mly->mly_pkt_busaddr,
1546 (*complete)(mly, mc);
1555 mly_ccb_alloc(struct mly_softc *mly, struct mly_ccb **mcp)
1561 mc = SLIST_FIRST(&mly->mly_ccb_free);
1563 SLIST_REMOVE_HEAD(&mly->mly_ccb_free, mc_link.slist);
1574 mly_ccb_free(struct mly_softc *mly, struct mly_ccb *mc)
1598 SLIST_INSERT_HEAD(&mly->mly_ccb_free, mc, mc_link.slist);
1611 mly_alloc_ccbs(struct mly_softc *mly)
1616 if (mly->mly_controllerinfo == NULL)
1617 mly->mly_ncmds = MLY_CCBS_RESV;
1619 i = le16toh(mly->mly_controllerinfo->maximum_parallel_commands);
1620 mly->mly_ncmds = uimin(MLY_MAX_CCBS, i);
1627 rv = mly_dmamem_alloc(mly,
1628 mly->mly_ncmds * sizeof(union mly_cmd_packet),
1629 &mly->mly_pkt_dmamap, (void **)&mly->mly_pkt,
1630 &mly->mly_pkt_busaddr, &mly->mly_pkt_seg);
1634 mly->mly_ccbs = malloc(sizeof(struct mly_ccb) * mly->mly_ncmds,
1637 for (i = 0; i < mly->mly_ncmds; i++) {
1638 mc = mly->mly_ccbs + i;
1640 mc->mc_packet = mly->mly_pkt + i;
1641 mc->mc_packetphys = mly->mly_pkt_busaddr +
1644 rv = bus_dmamap_create(mly->mly_dmat, MLY_MAX_XFER,
1649 mly_release_ccbs(mly);
1653 mly_ccb_free(mly, mc);
1665 mly_release_ccbs(struct mly_softc *mly)
1670 while (mly_ccb_alloc(mly, &mc) == 0)
1671 bus_dmamap_destroy(mly->mly_dmat, mc->mc_datamap);
1674 free(mly->mly_ccbs, M_DEVBUF);
1677 mly_dmamem_free(mly, mly->mly_ncmds * sizeof(union mly_cmd_packet),
1678 mly->mly_pkt_dmamap, (void *)mly->mly_pkt, &mly->mly_pkt_seg);
1685 mly_ccb_map(struct mly_softc *mly, struct mly_ccb *mc)
1703 rv = bus_dmamap_load(mly->mly_dmat, mc->mc_datamap, mc->mc_data,
1721 sg = mly->mly_sg + mc->mc_sgoff;
1725 htole64(mly->mly_sg_busaddr +
1747 bus_dmamap_sync(mly->mly_dmat, mc->mc_datamap, 0, mc->mc_length, flg);
1755 bus_dmamap_sync(mly->mly_dmat, mly->mly_sg_dmamap, mc->mc_sgoff,
1765 mly_ccb_unmap(struct mly_softc *mly, struct mly_ccb *mc)
1780 bus_dmamap_sync(mly->mly_dmat, mc->mc_datamap, 0, mc->mc_length, flg);
1781 bus_dmamap_unload(mly->mly_dmat, mc->mc_datamap);
1786 bus_dmamap_sync(mly->mly_dmat, mly->mly_sg_dmamap, mc->mc_sgoff,
1813 struct mly_softc *mly;
1817 mly = device_private(chan->chan_adapter->adapt_dev);
1823 btl = &mly->mly_btl[chan->chan_channel][periph->periph_target];
1841 printf("%s: cmd too large\n", device_xname(mly->mly_dv));
1848 if (mly_ccb_alloc(mly, &mc)) {
1895 if (mly_ccb_map(mly, mc) != 0) {
1897 mly_ccb_free(mly, mc);
1907 if (mly_ccb_poll(mly, mc, xs->timeout + 5000)) {
1910 mly_ccb_unmap(mly, mc);
1911 mly_ccb_free(mly, mc);
1915 mly_ccb_enqueue(mly, mc);
1930 mly_get_xfer_mode(mly, chan->chan_channel, arg);
1939 mly_scsipi_complete(struct mly_softc *mly, struct mly_ccb *mc)
1959 mly_ccb_unmap(mly, mc);
1971 btl = &mly->mly_btl[chan->chan_channel][target];
2005 device_xname(mly->mly_dv), xs->status);
2010 mly_ccb_free(mly, mc);
2018 mly_get_xfer_mode(struct mly_softc *mly, int bus, struct scsipi_xfer_mode *xm)
2023 btl = &mly->mly_btl[bus][xm->xm_target];
2060 scsipi_async_event(&mly->mly_chans[bus], ASYNC_EVENT_XFER_MODE, xm);
2070 struct mly_softc *mly;
2073 mly = device_private(chan->chan_adapter->adapt_dev);
2077 mly_scan_channel(mly, chan->chan_channel);
2092 mly_fwhandshake(struct mly_softc *mly)
2100 mly_outb(mly, mly->mly_idbr, MLY_HM_STSACK);
2104 if (!mly_idbr_true(mly, MLY_HM_STSACK))
2108 device_xname(mly->mly_dv));
2114 while (mly_idbr_true(mly, MLY_HM_STSACK)) {
2116 if (!mly_error_valid(mly))
2119 error = mly_inb(mly, mly->mly_error_status) & ~MLY_MSG_EMPTY;
2120 (void)mly_inb(mly, mly->mly_cmd_mailbox);
2121 (void)mly_inb(mly, mly->mly_cmd_mailbox + 1);
2127 device_xname(mly->mly_dv));
2134 device_xname(mly->mly_dv));
2136 device_xname(mly->mly_dv));
2141 device_xname(mly->mly_dv));
2146 device_xname(mly->mly_dv));
2151 device_xname(mly->mly_dv));
2156 device_xname(mly->mly_dv), error);
2183 mly_dmamem_alloc(struct mly_softc *mly, int size, bus_dmamap_t *dmamap,
2190 if ((rv = bus_dmamem_alloc(mly->mly_dmat, size, PAGE_SIZE, 0,
2192 aprint_error_dev(mly->mly_dv, "dmamem_alloc = %d\n", rv);
2198 if ((rv = bus_dmamem_map(mly->mly_dmat, seg, 1, size, kva,
2200 aprint_error_dev(mly->mly_dv, "dmamem_map = %d\n", rv);
2206 if ((rv = bus_dmamap_create(mly->mly_dmat, size, size, 1, 0,
2208 aprint_error_dev(mly->mly_dv, "dmamap_create = %d\n", rv);
2214 if ((rv = bus_dmamap_load(mly->mly_dmat, *dmamap, *kva, size,
2216 aprint_error_dev(mly->mly_dv, "dmamap_load = %d\n", rv);
2226 bus_dmamap_destroy(mly->mly_dmat, *dmamap);
2228 bus_dmamem_unmap(mly->mly_dmat, *kva, size);
2230 bus_dmamem_free(mly->mly_dmat, seg, 1);
2239 mly_dmamem_free(struct mly_softc *mly, int size, bus_dmamap_t dmamap,
2243 bus_dmamap_unload(mly->mly_dmat, dmamap);
2244 bus_dmamap_destroy(mly->mly_dmat, dmamap);
2245 bus_dmamem_unmap(mly->mly_dmat, kva, size);
2246 bus_dmamem_free(mly->mly_dmat, seg, 1);
2256 struct mly_softc *mly;
2258 if ((mly = device_lookup_private(&mly_cd, minor(dev))) == NULL)
2260 if ((mly->mly_state & MLY_STATE_INITOK) == 0)
2262 if ((mly->mly_state & MLY_STATE_OPEN) != 0)
2265 mly->mly_state |= MLY_STATE_OPEN;
2276 struct mly_softc *mly;
2278 mly = device_lookup_private(&mly_cd, minor(dev));
2279 mly->mly_state &= ~MLY_STATE_OPEN;
2290 struct mly_softc *mly;
2293 mly = device_lookup_private(&mly_cd, minor(dev));
2302 rv = mly_user_command(mly, (void *)data);
2305 rv = mly_user_health(mly, (void *)data);
2325 mly_user_command(struct mly_softc *mly, struct mly_user_command *uc)
2330 if ((rv = mly_ccb_alloc(mly, &mc)) != 0)
2364 if ((rv = mly_ccb_map(mly, mc)) != 0)
2372 if ((rv = mly_ccb_wait(mly, mc, 60000)) != 0)
2399 mly_ccb_unmap(mly, mc);
2402 mly_ccb_free(mly, mc);
2414 mly_user_health(struct mly_softc *mly, struct mly_user_health *uh)
2426 if (mly->mly_event_change == mh.change_counter)
2427 rv = tsleep(&mly->mly_event_change, PRIBIO | PCATCH,
2436 rv = copyout(&mly->mly_mmbox->mmm_health.status,