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);
842 struct mly_command *mc; in mly_rescan_btl() local
852 if (mly_alloc_command(sc, &mc)) in mly_rescan_btl()
856 if ((mc->mc_data = malloc(sizeof(union mly_devinfo), M_DEVBUF, M_NOWAIT | M_ZERO)) == NULL) { in mly_rescan_btl()
857 mly_release_command(mc); in mly_rescan_btl()
860 mc->mc_flags |= MLY_CMD_DATAIN; in mly_rescan_btl()
861 mc->mc_complete = mly_complete_rescan; in mly_rescan_btl()
866 mci = (struct mly_command_ioctl *)&mc->mc_packet->ioctl; in mly_rescan_btl()
872 mc->mc_length = mci->data_size = sizeof(struct mly_ioctl_getlogdevinfovalid); in mly_rescan_btl()
877 mc->mc_length = mci->data_size = sizeof(struct mly_ioctl_getphysdevinfovalid); in mly_rescan_btl()
889 if (mly_start(mc) != 0) { in mly_rescan_btl()
890 mly_release_command(mc); in mly_rescan_btl()
900 mly_complete_rescan(struct mly_command *mc) in mly_complete_rescan() argument
902 struct mly_softc *sc = mc->mc_sc; in mly_complete_rescan()
915 mci = (struct mly_command_ioctl *)&mc->mc_packet->ioctl; in mly_complete_rescan()
929 if (mc->mc_status == 0) { in mly_complete_rescan()
930 if (mc->mc_length == sizeof(*ldi)) { in mly_complete_rescan()
931 ldi = (struct mly_ioctl_getlogdevinfovalid *)mc->mc_data; in mly_complete_rescan()
945 } else if (mc->mc_length == sizeof(*pdi)) { in mly_complete_rescan()
946 pdi = (struct mly_ioctl_getphysdevinfovalid *)mc->mc_data; in mly_complete_rescan()
966 free(mc->mc_data, M_DEVBUF); in mly_complete_rescan()
967 mly_release_command(mc); in mly_complete_rescan()
1114 struct mly_command *mc; in mly_ioctl() local
1121 mc = NULL; in mly_ioctl()
1122 if (mly_alloc_command(sc, &mc)) { in mly_ioctl()
1128 mci = &mc->mc_packet->ioctl; in mly_ioctl()
1140 if ((mc->mc_data = malloc(datasize, M_DEVBUF, M_NOWAIT)) == NULL) { in mly_ioctl()
1144 mc->mc_flags |= MLY_CMD_DATAIN; in mly_ioctl()
1146 mc->mc_data = *data; in mly_ioctl()
1147 mc->mc_flags |= MLY_CMD_DATAOUT; in mly_ioctl()
1149 mc->mc_length = datasize; in mly_ioctl()
1150 mc->mc_packet->generic.data_size = datasize; in mly_ioctl()
1154 if ((error = mly_immediate_command(mc))) in mly_ioctl()
1158 *status = mc->mc_status; in mly_ioctl()
1159 if ((mc->mc_sense > 0) && (sense_buffer != NULL)) { in mly_ioctl()
1160 bcopy(mc->mc_packet, sense_buffer, mc->mc_sense); in mly_ioctl()
1161 *sense_length = mc->mc_sense; in mly_ioctl()
1167 *data = mc->mc_data; in mly_ioctl()
1173 if (mc != NULL) { in mly_ioctl()
1175 if (error && (mc->mc_data != NULL) && (*data == NULL)) in mly_ioctl()
1176 free(mc->mc_data, M_DEVBUF); in mly_ioctl()
1177 mly_release_command(mc); in mly_ioctl()
1217 struct mly_command *mc; in mly_fetch_event() local
1224 if (mly_alloc_command(sc, &mc)) in mly_fetch_event()
1228 if ((mc->mc_data = malloc(sizeof(struct mly_event), M_DEVBUF, M_NOWAIT | M_ZERO)) == NULL) { in mly_fetch_event()
1229 mly_release_command(mc); in mly_fetch_event()
1232 mc->mc_length = sizeof(struct mly_event); in mly_fetch_event()
1233 mc->mc_flags |= MLY_CMD_DATAIN; in mly_fetch_event()
1234 mc->mc_complete = mly_complete_event; in mly_fetch_event()
1241 mly_release_command(mc); in mly_fetch_event()
1252 mci = (struct mly_command_ioctl *)&mc->mc_packet->ioctl; in mly_fetch_event()
1272 if (mly_start(mc) != 0) { in mly_fetch_event()
1274 mly_release_command(mc); in mly_fetch_event()
1282 mly_complete_event(struct mly_command *mc) in mly_complete_event() argument
1284 struct mly_softc *sc = mc->mc_sc; in mly_complete_event()
1285 struct mly_event *me = (struct mly_event *)mc->mc_data; in mly_complete_event()
1292 if (mc->mc_status == SCSI_STATUS_OK) { in mly_complete_event()
1296 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()
1650 mly_unmap_command(mc); in mly_complete()
1651 mc_complete = mc->mc_complete; in mly_complete()
1652 mc->mc_flags |= MLY_CMD_COMPLETE; in mly_complete()
1658 mc_complete(mc); in mly_complete()
1660 wakeup(mc); in mly_complete()
1682 struct mly_command *mc; in mly_alloc_command() local
1686 if ((mc = mly_dequeue_free(sc)) == NULL) in mly_alloc_command()
1689 *mcp = mc; in mly_alloc_command()
1697 mly_release_command(struct mly_command *mc) in mly_release_command() argument
1705 mc->mc_data = NULL; in mly_release_command()
1706 mc->mc_flags = 0; in mly_release_command()
1707 mc->mc_complete = NULL; in mly_release_command()
1708 mc->mc_private = NULL; in mly_release_command()
1714 mc->mc_packet->generic.sense_buffer_address = mc->mc_packetphys; in mly_release_command()
1715 mc->mc_packet->generic.maximum_sense_size = sizeof(union mly_command_packet); in mly_release_command()
1717 mly_enqueue_free(mc); in mly_release_command()
1744 struct mly_command *mc; in mly_alloc_commands() local
1767 mc = &sc->mly_command[i]; in mly_alloc_commands()
1768 bzero(mc, sizeof(*mc)); in mly_alloc_commands()
1769 mc->mc_sc = sc; in mly_alloc_commands()
1770 mc->mc_slot = MLY_SLOT_START + i; in mly_alloc_commands()
1771 mc->mc_packet = sc->mly_packet + i; in mly_alloc_commands()
1772 mc->mc_packetphys = sc->mly_packetphys + (i * sizeof(union mly_command_packet)); in mly_alloc_commands()
1773 if (!bus_dmamap_create(sc->mly_buffer_dmat, 0, &mc->mc_datamap)) in mly_alloc_commands()
1774 mly_release_command(mc); in mly_alloc_commands()
1787 struct mly_command *mc; in mly_release_commands() local
1790 while (mly_alloc_command(sc, &mc) == 0) in mly_release_commands()
1791 bus_dmamap_destroy(sc->mly_buffer_dmat, mc->mc_datamap); in mly_release_commands()
1808 struct mly_command *mc = (struct mly_command *)arg; in mly_map_command_sg() local
1809 struct mly_softc *sc = mc->mc_sc; in mly_map_command_sg()
1810 struct mly_command_generic *gen = &(mc->mc_packet->generic); in mly_map_command_sg()
1821 tabofs = ((mc->mc_slot - MLY_SLOT_START) * MLY_MAX_SGENTRIES); in mly_map_command_sg()
1845 struct mly_command *mc = (struct mly_command *)arg;
1851 ((segs[0].ds_addr + mc->mc_packet->scsi_large.cdb_length) % PAGE_SIZE))
1855 mc->mc_packet->scsi_large.cdb_physaddr = segs[0].ds_addr;
1863 mly_map_command(struct mly_command *mc) in mly_map_command() argument
1865 struct mly_softc *sc = mc->mc_sc; in mly_map_command()
1870 if (mc->mc_flags & MLY_CMD_MAPPED) in mly_map_command()
1874 if (mc->mc_data != NULL) { in mly_map_command()
1875 if (mc->mc_flags & MLY_CMD_CCB) in mly_map_command()
1876 bus_dmamap_load_ccb(sc->mly_buffer_dmat, mc->mc_datamap, in mly_map_command()
1877 mc->mc_data, mly_map_command_sg, mc, 0); in mly_map_command()
1879 bus_dmamap_load(sc->mly_buffer_dmat, mc->mc_datamap, in mly_map_command()
1880 mc->mc_data, mc->mc_length, in mly_map_command()
1881 mly_map_command_sg, mc, 0); in mly_map_command()
1882 if (mc->mc_flags & MLY_CMD_DATAIN) in mly_map_command()
1883 bus_dmamap_sync(sc->mly_buffer_dmat, mc->mc_datamap, BUS_DMASYNC_PREREAD); in mly_map_command()
1884 if (mc->mc_flags & MLY_CMD_DATAOUT) in mly_map_command()
1885 bus_dmamap_sync(sc->mly_buffer_dmat, mc->mc_datamap, BUS_DMASYNC_PREWRITE); in mly_map_command()
1887 mc->mc_flags |= MLY_CMD_MAPPED; in mly_map_command()
1894 mly_unmap_command(struct mly_command *mc) in mly_unmap_command() argument
1896 struct mly_softc *sc = mc->mc_sc; in mly_unmap_command()
1900 if (!(mc->mc_flags & MLY_CMD_MAPPED)) in mly_unmap_command()
1904 if (mc->mc_data != NULL) { in mly_unmap_command()
1905 if (mc->mc_flags & MLY_CMD_DATAIN) in mly_unmap_command()
1906 bus_dmamap_sync(sc->mly_buffer_dmat, mc->mc_datamap, BUS_DMASYNC_POSTREAD); in mly_unmap_command()
1907 if (mc->mc_flags & MLY_CMD_DATAOUT) in mly_unmap_command()
1908 bus_dmamap_sync(sc->mly_buffer_dmat, mc->mc_datamap, BUS_DMASYNC_POSTWRITE); in mly_unmap_command()
1910 bus_dmamap_unload(sc->mly_buffer_dmat, mc->mc_datamap); in mly_unmap_command()
1912 mc->mc_flags &= ~MLY_CMD_MAPPED; in mly_unmap_command()
2200 struct mly_command *mc; in mly_cam_action_io() local
2249 if ((error = mly_alloc_command(sc, &mc))) { in mly_cam_action_io()
2257 mc->mc_data = csio; in mly_cam_action_io()
2258 mc->mc_length = csio->dxfer_len; in mly_cam_action_io()
2259 mc->mc_complete = mly_cam_complete; in mly_cam_action_io()
2260 mc->mc_private = csio; in mly_cam_action_io()
2261 mc->mc_flags |= MLY_CMD_CCB; in mly_cam_action_io()
2268 ss = &mc->mc_packet->scsi_small; in mly_cam_action_io()
2297 if ((error = mly_start(mc))) { in mly_cam_action_io()
2324 mly_cam_complete(struct mly_command *mc) in mly_cam_complete() argument
2326 struct mly_softc *sc = mc->mc_sc; in mly_cam_complete()
2327 struct ccb_scsiio *csio = (struct ccb_scsiio *)mc->mc_private; in mly_cam_complete()
2335 csio->scsi_status = mc->mc_status; in mly_cam_complete()
2336 switch(mc->mc_status) { in mly_cam_complete()
2364 debug(1, "SCSI_STATUS_CHECK_COND sense %d resid %d", mc->mc_sense, mc->mc_resid); in mly_cam_complete()
2367 bcopy(mc->mc_packet, &csio->sense_data, mc->mc_sense); in mly_cam_complete()
2368 csio->sense_len = mc->mc_sense; in mly_cam_complete()
2370 csio->resid = mc->mc_resid; /* XXX this is a signed value... */ in mly_cam_complete()
2390 mly_release_command(mc); in mly_cam_complete()
2600 mly_print_command(struct mly_command *mc) in mly_print_command() argument
2602 struct mly_softc *sc = mc->mc_sc; in mly_print_command()
2604 mly_printf(sc, "COMMAND @ %p\n", mc); in mly_print_command()
2605 mly_printf(sc, " slot %d\n", mc->mc_slot); in mly_print_command()
2606 mly_printf(sc, " status 0x%x\n", mc->mc_status); in mly_print_command()
2607 mly_printf(sc, " sense len %d\n", mc->mc_sense); in mly_print_command()
2608 mly_printf(sc, " resid %d\n", mc->mc_resid); in mly_print_command()
2609 mly_printf(sc, " packet %p/0x%llx\n", mc->mc_packet, mc->mc_packetphys); in mly_print_command()
2610 if (mc->mc_packet != NULL) in mly_print_command()
2611 mly_print_packet(mc); in mly_print_command()
2612 mly_printf(sc, " data %p/%d\n", mc->mc_data, mc->mc_length); in mly_print_command()
2613 …mly_printf(sc, " flags %b\n", mc->mc_flags, "\20\1busy\2complete\3slotted\4mapped\5datain\6da… in mly_print_command()
2614 mly_printf(sc, " complete %p\n", mc->mc_complete); in mly_print_command()
2615 mly_printf(sc, " private %p\n", mc->mc_private); in mly_print_command()
2622 mly_print_packet(struct mly_command *mc) in mly_print_packet() argument
2624 struct mly_softc *sc = mc->mc_sc; in mly_print_packet()
2625 struct mly_command_generic *ge = (struct mly_command_generic *)mc->mc_packet; in mly_print_packet()
2626 struct mly_command_scsi_small *ss = (struct mly_command_scsi_small *)mc->mc_packet; in mly_print_packet()
2627 struct mly_command_scsi_large *sl = (struct mly_command_scsi_large *)mc->mc_packet; in mly_print_packet()
2628 struct mly_command_ioctl *io = (struct mly_command_ioctl *)mc->mc_packet; in mly_print_packet()
2880 struct mly_command *mc; in mly_user_command() local
2885 if (mly_alloc_command(sc, &mc)) { in mly_user_command()
2892 … mc->mc_length = (uc->DataTransferLength >= 0) ? uc->DataTransferLength : -uc->DataTransferLength; in mly_user_command()
2893 if (mc->mc_length > 0) { in mly_user_command()
2894 if ((mc->mc_data = malloc(mc->mc_length, M_DEVBUF, M_NOWAIT)) == NULL) { in mly_user_command()
2900 mc->mc_flags |= MLY_CMD_DATAIN; in mly_user_command()
2901 bzero(mc->mc_data, mc->mc_length); in mly_user_command()
2904 mc->mc_flags |= MLY_CMD_DATAOUT; in mly_user_command()
2905 if ((error = copyin(uc->DataTransferBuffer, mc->mc_data, mc->mc_length)) != 0) in mly_user_command()
2910 bcopy(&uc->CommandMailbox, mc->mc_packet, sizeof(uc->CommandMailbox)); in mly_user_command()
2913 mc->mc_complete = NULL; in mly_user_command()
2917 if ((error = mly_start(mc)) != 0) { in mly_user_command()
2921 while (!(mc->mc_flags & MLY_CMD_COMPLETE)) in mly_user_command()
2922 mtx_sleep(mc, &sc->mly_lock, PRIBIO, "mlyioctl", 0); in mly_user_command()
2927 if ((error = copyout(mc->mc_data, uc->DataTransferBuffer, mc->mc_length)) != 0) in mly_user_command()
2931 if ((uc->RequestSenseLength > 0) && (mc->mc_sense > 0)) { in mly_user_command()
2932 if ((error = copyout(mc->mc_packet, uc->RequestSenseBuffer, in mly_user_command()
2933 min(uc->RequestSenseLength, mc->mc_sense))) != 0) in mly_user_command()
2938 uc->DataTransferLength = mc->mc_resid; in mly_user_command()
2939 uc->RequestSenseLength = min(uc->RequestSenseLength, mc->mc_sense); in mly_user_command()
2940 uc->CommandStatus = mc->mc_status; in mly_user_command()
2944 if (mc->mc_data != NULL) in mly_user_command()
2945 free(mc->mc_data, M_DEVBUF); in mly_user_command()
2947 mly_release_command(mc); in mly_user_command()
2987 struct mly_command *mc; in mly_timeout() local
2993 TAILQ_FOREACH(mc, &sc->mly_busy, mc_link) { in mly_timeout()
2994 if ((mc->mc_timestamp < deadline)) { in mly_timeout()
2996 "COMMAND %p TIMEOUT AFTER %d SECONDS\n", mc, in mly_timeout()
2997 (int)(time_second - mc->mc_timestamp)); in mly_timeout()