Lines Matching refs:mc
78 static void mly_complete_rescan(struct mly_command *mc);
86 static void mly_complete_event(struct mly_command *mc);
90 static int mly_immediate_command(struct mly_command *mc);
91 static int mly_start(struct mly_command *mc);
97 static void mly_release_command(struct mly_command *mc);
101 static void mly_map_command(struct mly_command *mc);
102 static void mly_unmap_command(struct mly_command *mc);
110 static void mly_cam_complete(struct mly_command *mc);
119 static void mly_print_command(struct mly_command *mc);
120 static void mly_print_packet(struct mly_command *mc);
841 struct mly_command *mc; in mly_rescan_btl() local
851 if (mly_alloc_command(sc, &mc)) in mly_rescan_btl()
855 if ((mc->mc_data = malloc(sizeof(union mly_devinfo), M_DEVBUF, M_NOWAIT | M_ZERO)) == NULL) { in mly_rescan_btl()
856 mly_release_command(mc); in mly_rescan_btl()
859 mc->mc_flags |= MLY_CMD_DATAIN; in mly_rescan_btl()
860 mc->mc_complete = mly_complete_rescan; in mly_rescan_btl()
865 mci = (struct mly_command_ioctl *)&mc->mc_packet->ioctl; in mly_rescan_btl()
871 mc->mc_length = mci->data_size = sizeof(struct mly_ioctl_getlogdevinfovalid); in mly_rescan_btl()
876 mc->mc_length = mci->data_size = sizeof(struct mly_ioctl_getphysdevinfovalid); in mly_rescan_btl()
888 if (mly_start(mc) != 0) { in mly_rescan_btl()
889 mly_release_command(mc); in mly_rescan_btl()
899 mly_complete_rescan(struct mly_command *mc) in mly_complete_rescan() argument
901 struct mly_softc *sc = mc->mc_sc; in mly_complete_rescan()
914 mci = (struct mly_command_ioctl *)&mc->mc_packet->ioctl; in mly_complete_rescan()
928 if (mc->mc_status == 0) { in mly_complete_rescan()
929 if (mc->mc_length == sizeof(*ldi)) { in mly_complete_rescan()
930 ldi = (struct mly_ioctl_getlogdevinfovalid *)mc->mc_data; in mly_complete_rescan()
944 } else if (mc->mc_length == sizeof(*pdi)) { in mly_complete_rescan()
945 pdi = (struct mly_ioctl_getphysdevinfovalid *)mc->mc_data; in mly_complete_rescan()
965 free(mc->mc_data, M_DEVBUF); in mly_complete_rescan()
966 mly_release_command(mc); in mly_complete_rescan()
1113 struct mly_command *mc; in mly_ioctl() local
1120 mc = NULL; in mly_ioctl()
1121 if (mly_alloc_command(sc, &mc)) { in mly_ioctl()
1127 mci = &mc->mc_packet->ioctl; in mly_ioctl()
1139 if ((mc->mc_data = malloc(datasize, M_DEVBUF, M_NOWAIT)) == NULL) { in mly_ioctl()
1143 mc->mc_flags |= MLY_CMD_DATAIN; in mly_ioctl()
1145 mc->mc_data = *data; in mly_ioctl()
1146 mc->mc_flags |= MLY_CMD_DATAOUT; in mly_ioctl()
1148 mc->mc_length = datasize; in mly_ioctl()
1149 mc->mc_packet->generic.data_size = datasize; in mly_ioctl()
1153 if ((error = mly_immediate_command(mc))) in mly_ioctl()
1157 *status = mc->mc_status; in mly_ioctl()
1158 if ((mc->mc_sense > 0) && (sense_buffer != NULL)) { in mly_ioctl()
1159 bcopy(mc->mc_packet, sense_buffer, mc->mc_sense); in mly_ioctl()
1160 *sense_length = mc->mc_sense; in mly_ioctl()
1166 *data = mc->mc_data; in mly_ioctl()
1172 if (mc != NULL) { in mly_ioctl()
1174 if (error && (mc->mc_data != NULL) && (*data == NULL)) in mly_ioctl()
1175 free(mc->mc_data, M_DEVBUF); in mly_ioctl()
1176 mly_release_command(mc); in mly_ioctl()
1216 struct mly_command *mc; in mly_fetch_event() local
1223 if (mly_alloc_command(sc, &mc)) in mly_fetch_event()
1227 if ((mc->mc_data = malloc(sizeof(struct mly_event), M_DEVBUF, M_NOWAIT | M_ZERO)) == NULL) { in mly_fetch_event()
1228 mly_release_command(mc); in mly_fetch_event()
1231 mc->mc_length = sizeof(struct mly_event); in mly_fetch_event()
1232 mc->mc_flags |= MLY_CMD_DATAIN; in mly_fetch_event()
1233 mc->mc_complete = mly_complete_event; in mly_fetch_event()
1240 mly_release_command(mc); in mly_fetch_event()
1251 mci = (struct mly_command_ioctl *)&mc->mc_packet->ioctl; in mly_fetch_event()
1271 if (mly_start(mc) != 0) { in mly_fetch_event()
1273 mly_release_command(mc); in mly_fetch_event()
1281 mly_complete_event(struct mly_command *mc) in mly_complete_event() argument
1283 struct mly_softc *sc = mc->mc_sc; in mly_complete_event()
1284 struct mly_event *me = (struct mly_event *)mc->mc_data; in mly_complete_event()
1291 if (mc->mc_status == SCSI_STATUS_OK) { in mly_complete_event()
1295 mly_release_command(mc); in mly_complete_event()
1442 mly_immediate_command(struct mly_command *mc) in mly_immediate_command() argument
1444 struct mly_softc *sc = mc->mc_sc; in mly_immediate_command()
1450 if ((error = mly_start(mc))) { in mly_immediate_command()
1456 while(!(mc->mc_flags & MLY_CMD_COMPLETE)) { in mly_immediate_command()
1457 mtx_sleep(mc, &sc->mly_lock, PRIBIO, "mlywait", 0); in mly_immediate_command()
1461 while(!(mc->mc_flags & MLY_CMD_COMPLETE)) { in mly_immediate_command()
1462 mly_done(mc->mc_sc); in mly_immediate_command()
1476 mly_start(struct mly_command *mc) in mly_start() argument
1478 struct mly_softc *sc = mc->mc_sc; in mly_start()
1487 mly_map_command(mc); in mly_start()
1488 mc->mc_packet->generic.command_id = mc->mc_slot; in mly_start()
1491 mc->mc_timestamp = time_second; in mly_start()
1504 mc->mc_flags |= MLY_CMD_BUSY; in mly_start()
1509 MLY_SET_MBOX(sc, sc->mly_command_mailbox, &mc->mc_packetphys); in mly_start()
1520 mc->mc_flags |= MLY_CMD_BUSY; in mly_start()
1523 bcopy(mc->mc_packet->mmbox.data, pkt->mmbox.data, sizeof(pkt->mmbox.data)); in mly_start()
1527 pkt->mmbox.flag = mc->mc_packet->mmbox.flag; in mly_start()
1536 mly_enqueue_busy(mc); in mly_start()
1546 struct mly_command *mc; in mly_done() local
1558 mc = &sc->mly_command[slot - MLY_SLOT_START]; in mly_done()
1559 mc->mc_status = MLY_GET_REG(sc, sc->mly_status_mailbox + 2); in mly_done()
1560 mc->mc_sense = MLY_GET_REG(sc, sc->mly_status_mailbox + 3); in mly_done()
1561 mc->mc_resid = MLY_GET_REG4(sc, sc->mly_status_mailbox + 4); in mly_done()
1562 mly_remove_busy(mc); in mly_done()
1563 mc->mc_flags &= ~MLY_CMD_BUSY; in mly_done()
1564 mly_enqueue_complete(mc); in mly_done()
1587 mc = &sc->mly_command[slot - MLY_SLOT_START]; in mly_done()
1588 mc->mc_status = sp->status.status; in mly_done()
1589 mc->mc_sense = sp->status.sense_length; in mly_done()
1590 mc->mc_resid = sp->status.residue; in mly_done()
1591 mly_remove_busy(mc); in mly_done()
1592 mc->mc_flags &= ~MLY_CMD_BUSY; in mly_done()
1593 mly_enqueue_complete(mc); in mly_done()
1633 struct mly_command *mc; in mly_complete() local
1634 void (* mc_complete)(struct mly_command *mc); in mly_complete()
1641 while ((mc = mly_dequeue_complete(sc)) != NULL) { in mly_complete()
1651 mly_unmap_command(mc); in mly_complete()
1652 mc_complete = mc->mc_complete; in mly_complete()
1653 mc->mc_flags |= MLY_CMD_COMPLETE; in mly_complete()
1659 mc_complete(mc); in mly_complete()
1661 wakeup(mc); in mly_complete()
1683 struct mly_command *mc; in mly_alloc_command() local
1687 if ((mc = mly_dequeue_free(sc)) == NULL) in mly_alloc_command()
1690 *mcp = mc; in mly_alloc_command()
1698 mly_release_command(struct mly_command *mc) in mly_release_command() argument
1706 mc->mc_data = NULL; in mly_release_command()
1707 mc->mc_flags = 0; in mly_release_command()
1708 mc->mc_complete = NULL; in mly_release_command()
1709 mc->mc_private = NULL; in mly_release_command()
1715 mc->mc_packet->generic.sense_buffer_address = mc->mc_packetphys; in mly_release_command()
1716 mc->mc_packet->generic.maximum_sense_size = sizeof(union mly_command_packet); in mly_release_command()
1718 mly_enqueue_free(mc); in mly_release_command()
1745 struct mly_command *mc; in mly_alloc_commands() local
1768 mc = &sc->mly_command[i]; in mly_alloc_commands()
1769 bzero(mc, sizeof(*mc)); in mly_alloc_commands()
1770 mc->mc_sc = sc; in mly_alloc_commands()
1771 mc->mc_slot = MLY_SLOT_START + i; in mly_alloc_commands()
1772 mc->mc_packet = sc->mly_packet + i; in mly_alloc_commands()
1773 mc->mc_packetphys = sc->mly_packetphys + (i * sizeof(union mly_command_packet)); in mly_alloc_commands()
1774 if (!bus_dmamap_create(sc->mly_buffer_dmat, 0, &mc->mc_datamap)) in mly_alloc_commands()
1775 mly_release_command(mc); in mly_alloc_commands()
1788 struct mly_command *mc; in mly_release_commands() local
1791 while (mly_alloc_command(sc, &mc) == 0) in mly_release_commands()
1792 bus_dmamap_destroy(sc->mly_buffer_dmat, mc->mc_datamap); in mly_release_commands()
1810 struct mly_command *mc = (struct mly_command *)arg; in mly_map_command_sg() local
1811 struct mly_softc *sc = mc->mc_sc; in mly_map_command_sg()
1812 struct mly_command_generic *gen = &(mc->mc_packet->generic); in mly_map_command_sg()
1823 tabofs = ((mc->mc_slot - MLY_SLOT_START) * MLY_MAX_SGENTRIES); in mly_map_command_sg()
1847 struct mly_command *mc = (struct mly_command *)arg;
1853 ((segs[0].ds_addr + mc->mc_packet->scsi_large.cdb_length) % PAGE_SIZE))
1857 mc->mc_packet->scsi_large.cdb_physaddr = segs[0].ds_addr;
1865 mly_map_command(struct mly_command *mc) in mly_map_command() argument
1867 struct mly_softc *sc = mc->mc_sc; in mly_map_command()
1872 if (mc->mc_flags & MLY_CMD_MAPPED) in mly_map_command()
1876 if (mc->mc_data != NULL) { in mly_map_command()
1877 if (mc->mc_flags & MLY_CMD_CCB) in mly_map_command()
1878 bus_dmamap_load_ccb(sc->mly_buffer_dmat, mc->mc_datamap, in mly_map_command()
1879 mc->mc_data, mly_map_command_sg, mc, 0); in mly_map_command()
1881 bus_dmamap_load(sc->mly_buffer_dmat, mc->mc_datamap, in mly_map_command()
1882 mc->mc_data, mc->mc_length, in mly_map_command()
1883 mly_map_command_sg, mc, 0); in mly_map_command()
1884 if (mc->mc_flags & MLY_CMD_DATAIN) in mly_map_command()
1885 bus_dmamap_sync(sc->mly_buffer_dmat, mc->mc_datamap, BUS_DMASYNC_PREREAD); in mly_map_command()
1886 if (mc->mc_flags & MLY_CMD_DATAOUT) in mly_map_command()
1887 bus_dmamap_sync(sc->mly_buffer_dmat, mc->mc_datamap, BUS_DMASYNC_PREWRITE); in mly_map_command()
1889 mc->mc_flags |= MLY_CMD_MAPPED; in mly_map_command()
1896 mly_unmap_command(struct mly_command *mc) in mly_unmap_command() argument
1898 struct mly_softc *sc = mc->mc_sc; in mly_unmap_command()
1902 if (!(mc->mc_flags & MLY_CMD_MAPPED)) in mly_unmap_command()
1906 if (mc->mc_data != NULL) { in mly_unmap_command()
1907 if (mc->mc_flags & MLY_CMD_DATAIN) in mly_unmap_command()
1908 bus_dmamap_sync(sc->mly_buffer_dmat, mc->mc_datamap, BUS_DMASYNC_POSTREAD); in mly_unmap_command()
1909 if (mc->mc_flags & MLY_CMD_DATAOUT) in mly_unmap_command()
1910 bus_dmamap_sync(sc->mly_buffer_dmat, mc->mc_datamap, BUS_DMASYNC_POSTWRITE); in mly_unmap_command()
1912 bus_dmamap_unload(sc->mly_buffer_dmat, mc->mc_datamap); in mly_unmap_command()
1914 mc->mc_flags &= ~MLY_CMD_MAPPED; in mly_unmap_command()
2205 struct mly_command *mc; in mly_cam_action_io() local
2254 if ((error = mly_alloc_command(sc, &mc))) { in mly_cam_action_io()
2262 mc->mc_data = csio; in mly_cam_action_io()
2263 mc->mc_length = csio->dxfer_len; in mly_cam_action_io()
2264 mc->mc_complete = mly_cam_complete; in mly_cam_action_io()
2265 mc->mc_private = csio; in mly_cam_action_io()
2266 mc->mc_flags |= MLY_CMD_CCB; in mly_cam_action_io()
2273 ss = &mc->mc_packet->scsi_small; in mly_cam_action_io()
2302 if ((error = mly_start(mc))) { in mly_cam_action_io()
2329 mly_cam_complete(struct mly_command *mc) in mly_cam_complete() argument
2331 struct mly_softc *sc = mc->mc_sc; in mly_cam_complete()
2332 struct ccb_scsiio *csio = (struct ccb_scsiio *)mc->mc_private; in mly_cam_complete()
2340 csio->scsi_status = mc->mc_status; in mly_cam_complete()
2341 switch(mc->mc_status) { in mly_cam_complete()
2369 debug(1, "SCSI_STATUS_CHECK_COND sense %d resid %d", mc->mc_sense, mc->mc_resid); in mly_cam_complete()
2372 bcopy(mc->mc_packet, &csio->sense_data, mc->mc_sense); in mly_cam_complete()
2373 csio->sense_len = mc->mc_sense; in mly_cam_complete()
2375 csio->resid = mc->mc_resid; /* XXX this is a signed value... */ in mly_cam_complete()
2395 mly_release_command(mc); in mly_cam_complete()
2605 mly_print_command(struct mly_command *mc) in mly_print_command() argument
2607 struct mly_softc *sc = mc->mc_sc; in mly_print_command()
2609 mly_printf(sc, "COMMAND @ %p\n", mc); in mly_print_command()
2610 mly_printf(sc, " slot %d\n", mc->mc_slot); in mly_print_command()
2611 mly_printf(sc, " status 0x%x\n", mc->mc_status); in mly_print_command()
2612 mly_printf(sc, " sense len %d\n", mc->mc_sense); in mly_print_command()
2613 mly_printf(sc, " resid %d\n", mc->mc_resid); in mly_print_command()
2614 mly_printf(sc, " packet %p/0x%llx\n", mc->mc_packet, mc->mc_packetphys); in mly_print_command()
2615 if (mc->mc_packet != NULL) in mly_print_command()
2616 mly_print_packet(mc); in mly_print_command()
2617 mly_printf(sc, " data %p/%d\n", mc->mc_data, mc->mc_length); in mly_print_command()
2618 …mly_printf(sc, " flags %b\n", mc->mc_flags, "\20\1busy\2complete\3slotted\4mapped\5datain\6da… in mly_print_command()
2619 mly_printf(sc, " complete %p\n", mc->mc_complete); in mly_print_command()
2620 mly_printf(sc, " private %p\n", mc->mc_private); in mly_print_command()
2627 mly_print_packet(struct mly_command *mc) in mly_print_packet() argument
2629 struct mly_softc *sc = mc->mc_sc; in mly_print_packet()
2630 struct mly_command_generic *ge = (struct mly_command_generic *)mc->mc_packet; in mly_print_packet()
2631 struct mly_command_scsi_small *ss = (struct mly_command_scsi_small *)mc->mc_packet; in mly_print_packet()
2632 struct mly_command_scsi_large *sl = (struct mly_command_scsi_large *)mc->mc_packet; in mly_print_packet()
2633 struct mly_command_ioctl *io = (struct mly_command_ioctl *)mc->mc_packet; in mly_print_packet()
2886 struct mly_command *mc; in mly_user_command() local
2891 if (mly_alloc_command(sc, &mc)) { in mly_user_command()
2898 … mc->mc_length = (uc->DataTransferLength >= 0) ? uc->DataTransferLength : -uc->DataTransferLength; in mly_user_command()
2899 if (mc->mc_length > 0) { in mly_user_command()
2900 if ((mc->mc_data = malloc(mc->mc_length, M_DEVBUF, M_NOWAIT)) == NULL) { in mly_user_command()
2906 mc->mc_flags |= MLY_CMD_DATAIN; in mly_user_command()
2907 bzero(mc->mc_data, mc->mc_length); in mly_user_command()
2910 mc->mc_flags |= MLY_CMD_DATAOUT; in mly_user_command()
2911 if ((error = copyin(uc->DataTransferBuffer, mc->mc_data, mc->mc_length)) != 0) in mly_user_command()
2916 bcopy(&uc->CommandMailbox, mc->mc_packet, sizeof(uc->CommandMailbox)); in mly_user_command()
2919 mc->mc_complete = NULL; in mly_user_command()
2923 if ((error = mly_start(mc)) != 0) { in mly_user_command()
2927 while (!(mc->mc_flags & MLY_CMD_COMPLETE)) in mly_user_command()
2928 mtx_sleep(mc, &sc->mly_lock, PRIBIO, "mlyioctl", 0); in mly_user_command()
2933 if ((error = copyout(mc->mc_data, uc->DataTransferBuffer, mc->mc_length)) != 0) in mly_user_command()
2937 if ((uc->RequestSenseLength > 0) && (mc->mc_sense > 0)) { in mly_user_command()
2938 if ((error = copyout(mc->mc_packet, uc->RequestSenseBuffer, in mly_user_command()
2939 min(uc->RequestSenseLength, mc->mc_sense))) != 0) in mly_user_command()
2944 uc->DataTransferLength = mc->mc_resid; in mly_user_command()
2945 uc->RequestSenseLength = min(uc->RequestSenseLength, mc->mc_sense); in mly_user_command()
2946 uc->CommandStatus = mc->mc_status; in mly_user_command()
2950 if (mc->mc_data != NULL) in mly_user_command()
2951 free(mc->mc_data, M_DEVBUF); in mly_user_command()
2953 mly_release_command(mc); in mly_user_command()
2993 struct mly_command *mc; in mly_timeout() local
2999 TAILQ_FOREACH(mc, &sc->mly_busy, mc_link) { in mly_timeout()
3000 if ((mc->mc_timestamp < deadline)) { in mly_timeout()
3002 "COMMAND %p TIMEOUT AFTER %d SECONDS\n", mc, in mly_timeout()
3003 (int)(time_second - mc->mc_timestamp)); in mly_timeout()