Lines Matching refs:mc

76 static void	mly_complete_rescan(struct mly_command *mc);
84 static void mly_complete_event(struct mly_command *mc);
88 static int mly_immediate_command(struct mly_command *mc);
89 static int mly_start(struct mly_command *mc);
94 static void mly_release_command(struct mly_command *mc);
98 static void mly_map_command(struct mly_command *mc);
99 static void mly_unmap_command(struct mly_command *mc);
107 static void mly_cam_complete(struct mly_command *mc);
116 static void mly_print_command(struct mly_command *mc);
117 static void mly_print_packet(struct mly_command *mc);
812 struct mly_command *mc;
822 if (mly_alloc_command(sc, &mc))
826 if ((mc->mc_data = malloc(sizeof(union mly_devinfo), M_DEVBUF, M_NOWAIT | M_ZERO)) == NULL) {
827 mly_release_command(mc);
830 mc->mc_flags |= MLY_CMD_DATAIN;
831 mc->mc_complete = mly_complete_rescan;
836 mci = (struct mly_command_ioctl *)&mc->mc_packet->ioctl;
842 mc->mc_length = mci->data_size = sizeof(struct mly_ioctl_getlogdevinfovalid);
847 mc->mc_length = mci->data_size = sizeof(struct mly_ioctl_getphysdevinfovalid);
859 if (mly_start(mc) != 0) {
860 mly_release_command(mc);
870 mly_complete_rescan(struct mly_command *mc)
872 struct mly_softc *sc = mc->mc_sc;
885 mci = (struct mly_command_ioctl *)&mc->mc_packet->ioctl;
899 if (mc->mc_status == 0) {
900 if (mc->mc_length == sizeof(*ldi)) {
901 ldi = (struct mly_ioctl_getlogdevinfovalid *)mc->mc_data;
915 } else if (mc->mc_length == sizeof(*pdi)) {
916 pdi = (struct mly_ioctl_getphysdevinfovalid *)mc->mc_data;
936 free(mc->mc_data, M_DEVBUF);
937 mly_release_command(mc);
1084 struct mly_command *mc;
1090 mc = NULL;
1091 if (mly_alloc_command(sc, &mc)) {
1097 mci = &mc->mc_packet->ioctl;
1109 if ((mc->mc_data = malloc(datasize, M_DEVBUF, M_NOWAIT)) == NULL) {
1113 mc->mc_flags |= MLY_CMD_DATAIN;
1115 mc->mc_data = *data;
1116 mc->mc_flags |= MLY_CMD_DATAOUT;
1118 mc->mc_length = datasize;
1119 mc->mc_packet->generic.data_size = datasize;
1123 if ((error = mly_immediate_command(mc)))
1127 *status = mc->mc_status;
1128 if ((mc->mc_sense > 0) && (sense_buffer != NULL)) {
1129 bcopy(mc->mc_packet, sense_buffer, mc->mc_sense);
1130 *sense_length = mc->mc_sense;
1136 *data = mc->mc_data;
1142 if (mc != NULL) {
1144 if (error && (mc->mc_data != NULL) && (*data == NULL))
1145 free(mc->mc_data, M_DEVBUF);
1146 mly_release_command(mc);
1186 struct mly_command *mc;
1194 if (mly_alloc_command(sc, &mc))
1198 if ((mc->mc_data = malloc(sizeof(struct mly_event), M_DEVBUF, M_NOWAIT | M_ZERO)) == NULL) {
1199 mly_release_command(mc);
1202 mc->mc_length = sizeof(struct mly_event);
1203 mc->mc_flags |= MLY_CMD_DATAIN;
1204 mc->mc_complete = mly_complete_event;
1212 mly_release_command(mc);
1225 mci = (struct mly_command_ioctl *)&mc->mc_packet->ioctl;
1245 if (mly_start(mc) != 0) {
1247 mly_release_command(mc);
1255 mly_complete_event(struct mly_command *mc)
1257 struct mly_softc *sc = mc->mc_sc;
1258 struct mly_event *me = (struct mly_event *)mc->mc_data;
1265 if (mc->mc_status == SCSI_STATUS_OK) {
1269 mly_release_command(mc);
1416 mly_immediate_command(struct mly_command *mc)
1418 struct mly_softc *sc = mc->mc_sc;
1425 if ((error = mly_start(mc))) {
1432 while(!(mc->mc_flags & MLY_CMD_COMPLETE)) {
1433 tsleep(mc, PRIBIO, "mlywait", 0);
1437 while(!(mc->mc_flags & MLY_CMD_COMPLETE)) {
1438 mly_done(mc->mc_sc);
1453 mly_start(struct mly_command *mc)
1455 struct mly_softc *sc = mc->mc_sc;
1464 mly_map_command(mc);
1465 mc->mc_packet->generic.command_id = mc->mc_slot;
1468 mc->mc_timestamp = time_second;
1484 mc->mc_flags |= MLY_CMD_BUSY;
1489 MLY_SET_MBOX(sc, sc->mly_command_mailbox, &mc->mc_packetphys);
1501 mc->mc_flags |= MLY_CMD_BUSY;
1504 bcopy(mc->mc_packet->mmbox.data, pkt->mmbox.data, sizeof(pkt->mmbox.data));
1509 pkt->mmbox.flag = mc->mc_packet->mmbox.flag;
1519 mly_enqueue_busy(mc);
1530 struct mly_command *mc;
1542 mc = &sc->mly_command[slot - MLY_SLOT_START];
1543 mc->mc_status = MLY_GET_REG(sc, sc->mly_status_mailbox + 2);
1544 mc->mc_sense = MLY_GET_REG(sc, sc->mly_status_mailbox + 3);
1545 mc->mc_resid = MLY_GET_REG4(sc, sc->mly_status_mailbox + 4);
1546 mly_remove_busy(mc);
1547 mc->mc_flags &= ~MLY_CMD_BUSY;
1548 mly_enqueue_complete(mc);
1571 mc = &sc->mly_command[slot - MLY_SLOT_START];
1572 mc->mc_status = sp->status.status;
1573 mc->mc_sense = sp->status.sense_length;
1574 mc->mc_resid = sp->status.residue;
1575 mly_remove_busy(mc);
1576 mc->mc_flags &= ~MLY_CMD_BUSY;
1577 mly_enqueue_complete(mc);
1609 struct mly_command *mc;
1610 void (* mc_complete)(struct mly_command *mc);
1618 while ((mc = mly_dequeue_complete(sc)) != NULL) {
1625 * order to later avoid dereferencing mc. (We would not expect to
1628 mly_unmap_command(mc);
1629 mc_complete = mc->mc_complete;
1630 mc->mc_flags |= MLY_CMD_COMPLETE;
1636 mc_complete(mc);
1638 wakeup(mc);
1660 struct mly_command *mc;
1664 if ((mc = mly_dequeue_free(sc)) == NULL)
1667 *mcp = mc;
1675 mly_release_command(struct mly_command *mc)
1683 mc->mc_data = NULL;
1684 mc->mc_flags = 0;
1685 mc->mc_complete = NULL;
1686 mc->mc_private = NULL;
1692 mc->mc_packet->generic.sense_buffer_address = mc->mc_packetphys;
1693 mc->mc_packet->generic.maximum_sense_size = sizeof(union mly_command_packet);
1695 mly_enqueue_free(mc);
1722 struct mly_command *mc;
1745 mc = &sc->mly_command[i];
1746 bzero(mc, sizeof(*mc));
1747 mc->mc_sc = sc;
1748 mc->mc_slot = MLY_SLOT_START + i;
1749 mc->mc_packet = sc->mly_packet + i;
1750 mc->mc_packetphys = sc->mly_packetphys + (i * sizeof(union mly_command_packet));
1751 if (!bus_dmamap_create(sc->mly_buffer_dmat, 0, &mc->mc_datamap))
1752 mly_release_command(mc);
1765 struct mly_command *mc;
1768 while (mly_alloc_command(sc, &mc) == 0)
1769 bus_dmamap_destroy(sc->mly_buffer_dmat, mc->mc_datamap);
1787 struct mly_command *mc = (struct mly_command *)arg;
1788 struct mly_softc *sc = mc->mc_sc;
1789 struct mly_command_generic *gen = &(mc->mc_packet->generic);
1800 tabofs = ((mc->mc_slot - MLY_SLOT_START) * MLY_MAX_SGENTRIES);
1824 struct mly_command *mc = (struct mly_command *)arg;
1830 ((segs[0].ds_addr + mc->mc_packet->scsi_large.cdb_length) % PAGE_SIZE))
1834 mc->mc_packet->scsi_large.cdb_physaddr = segs[0].ds_addr;
1842 mly_map_command(struct mly_command *mc)
1844 struct mly_softc *sc = mc->mc_sc;
1849 if (mc->mc_flags & MLY_CMD_MAPPED)
1853 if (mc->mc_data != NULL) {
1854 if (mc->mc_flags & MLY_CMD_CCB)
1855 bus_dmamap_load_ccb(sc->mly_buffer_dmat, mc->mc_datamap,
1856 mc->mc_data, mly_map_command_sg, mc, 0);
1858 bus_dmamap_load(sc->mly_buffer_dmat, mc->mc_datamap,
1859 mc->mc_data, mc->mc_length,
1860 mly_map_command_sg, mc, 0);
1861 if (mc->mc_flags & MLY_CMD_DATAIN)
1862 bus_dmamap_sync(sc->mly_buffer_dmat, mc->mc_datamap, BUS_DMASYNC_PREREAD);
1863 if (mc->mc_flags & MLY_CMD_DATAOUT)
1864 bus_dmamap_sync(sc->mly_buffer_dmat, mc->mc_datamap, BUS_DMASYNC_PREWRITE);
1866 mc->mc_flags |= MLY_CMD_MAPPED;
1873 mly_unmap_command(struct mly_command *mc)
1875 struct mly_softc *sc = mc->mc_sc;
1879 if (!(mc->mc_flags & MLY_CMD_MAPPED))
1883 if (mc->mc_data != NULL) {
1884 if (mc->mc_flags & MLY_CMD_DATAIN)
1885 bus_dmamap_sync(sc->mly_buffer_dmat, mc->mc_datamap, BUS_DMASYNC_POSTREAD);
1886 if (mc->mc_flags & MLY_CMD_DATAOUT)
1887 bus_dmamap_sync(sc->mly_buffer_dmat, mc->mc_datamap, BUS_DMASYNC_POSTWRITE);
1889 bus_dmamap_unload(sc->mly_buffer_dmat, mc->mc_datamap);
1891 mc->mc_flags &= ~MLY_CMD_MAPPED;
2173 struct mly_command *mc;
2223 if ((error = mly_alloc_command(sc, &mc))) {
2233 mc->mc_data = csio;
2234 mc->mc_length = csio->dxfer_len;
2235 mc->mc_complete = mly_cam_complete;
2236 mc->mc_private = csio;
2237 mc->mc_flags |= MLY_CMD_CCB;
2244 ss = &mc->mc_packet->scsi_small;
2273 if ((error = mly_start(mc))) {
2302 mly_cam_complete(struct mly_command *mc)
2304 struct mly_softc *sc = mc->mc_sc;
2305 struct ccb_scsiio *csio = (struct ccb_scsiio *)mc->mc_private;
2314 csio->scsi_status = mc->mc_status;
2315 switch(mc->mc_status) {
2343 debug(1, "SCSI_STATUS_CHECK_COND sense %d resid %d", mc->mc_sense, mc->mc_resid);
2346 bcopy(mc->mc_packet, &csio->sense_data, mc->mc_sense);
2347 csio->sense_len = mc->mc_sense;
2349 csio->resid = mc->mc_resid; /* XXX this is a signed value... */
2371 mly_release_command(mc);
2581 mly_print_command(struct mly_command *mc)
2583 struct mly_softc *sc = mc->mc_sc;
2585 mly_printf(sc, "COMMAND @ %p\n", mc);
2586 mly_printf(sc, " slot %d\n", mc->mc_slot);
2587 mly_printf(sc, " status 0x%x\n", mc->mc_status);
2588 mly_printf(sc, " sense len %d\n", mc->mc_sense);
2589 mly_printf(sc, " resid %d\n", mc->mc_resid);
2590 mly_printf(sc, " packet %p/0x%llx\n", mc->mc_packet, mc->mc_packetphys);
2591 if (mc->mc_packet != NULL)
2592 mly_print_packet(mc);
2593 mly_printf(sc, " data %p/%d\n", mc->mc_data, mc->mc_length);
2594 mly_printf(sc, " flags %b\n", mc->mc_flags, "\20\1busy\2complete\3slotted\4mapped\5datain\6dataout\n");
2595 mly_printf(sc, " complete %p\n", mc->mc_complete);
2596 mly_printf(sc, " private %p\n", mc->mc_private);
2603 mly_print_packet(struct mly_command *mc)
2605 struct mly_softc *sc = mc->mc_sc;
2606 struct mly_command_generic *ge = (struct mly_command_generic *)mc->mc_packet;
2607 struct mly_command_scsi_small *ss = (struct mly_command_scsi_small *)mc->mc_packet;
2608 struct mly_command_scsi_large *sl = (struct mly_command_scsi_large *)mc->mc_packet;
2609 struct mly_command_ioctl *io = (struct mly_command_ioctl *)mc->mc_packet;
2858 struct mly_command *mc;
2862 if (mly_alloc_command(sc, &mc)) {
2868 mc->mc_length = (uc->DataTransferLength >= 0) ? uc->DataTransferLength : -uc->DataTransferLength;
2869 if (mc->mc_length > 0) {
2870 if ((mc->mc_data = malloc(mc->mc_length, M_DEVBUF, M_NOWAIT)) == NULL) {
2876 mc->mc_flags |= MLY_CMD_DATAIN;
2877 bzero(mc->mc_data, mc->mc_length);
2880 mc->mc_flags |= MLY_CMD_DATAOUT;
2881 if ((error = copyin(uc->DataTransferBuffer, mc->mc_data, mc->mc_length)) != 0)
2886 bcopy(&uc->CommandMailbox, mc->mc_packet, sizeof(uc->CommandMailbox));
2889 mc->mc_complete = NULL;
2892 if ((error = mly_start(mc)) != 0)
2895 while (!(mc->mc_flags & MLY_CMD_COMPLETE))
2896 tsleep(mc, PRIBIO, "mlyioctl", 0);
2901 if ((error = copyout(mc->mc_data, uc->DataTransferBuffer, mc->mc_length)) != 0)
2905 if ((uc->RequestSenseLength > 0) && (mc->mc_sense > 0)) {
2906 if ((error = copyout(mc->mc_packet, uc->RequestSenseBuffer,
2907 min(uc->RequestSenseLength, mc->mc_sense))) != 0)
2912 uc->DataTransferLength = mc->mc_resid;
2913 uc->RequestSenseLength = min(uc->RequestSenseLength, mc->mc_sense);
2914 uc->CommandStatus = mc->mc_status;
2918 if (mc->mc_data != NULL)
2919 free(mc->mc_data, M_DEVBUF);
2920 if (mc != NULL)
2921 mly_release_command(mc);
2958 struct mly_command *mc;
2962 TAILQ_FOREACH(mc, &sc->mly_busy, mc_link) {
2963 if ((mc->mc_timestamp < deadline)) {
2965 "COMMAND %p TIMEOUT AFTER %d SECONDS\n", mc,
2966 (int)(time_second - mc->mc_timestamp));