Lines Matching refs:cmd

185 static inline const char *mfi_frame_desc(unsigned int cmd)  in mfi_frame_desc()  argument
192 if (cmd < ARRAY_SIZE(mfi_frame_descs)) { in mfi_frame_desc()
193 return mfi_frame_descs[cmd]; in mfi_frame_desc()
215 static bool megasas_frame_is_ieee_sgl(MegasasCmd *cmd) in megasas_frame_is_ieee_sgl() argument
217 return cmd->flags & MFI_FRAME_IEEE_SGL; in megasas_frame_is_ieee_sgl()
220 static bool megasas_frame_is_sgl64(MegasasCmd *cmd) in megasas_frame_is_sgl64() argument
222 return cmd->flags & MFI_FRAME_SGL64; in megasas_frame_is_sgl64()
225 static bool megasas_frame_is_sense64(MegasasCmd *cmd) in megasas_frame_is_sense64() argument
227 return cmd->flags & MFI_FRAME_SENSE64; in megasas_frame_is_sense64()
230 static uint64_t megasas_sgl_get_addr(MegasasCmd *cmd, in megasas_sgl_get_addr() argument
235 if (megasas_frame_is_ieee_sgl(cmd)) { in megasas_sgl_get_addr()
237 } else if (megasas_frame_is_sgl64(cmd)) { in megasas_sgl_get_addr()
245 static uint32_t megasas_sgl_get_len(MegasasCmd *cmd, in megasas_sgl_get_len() argument
250 if (megasas_frame_is_ieee_sgl(cmd)) { in megasas_sgl_get_len()
252 } else if (megasas_frame_is_sgl64(cmd)) { in megasas_sgl_get_len()
260 static union mfi_sgl *megasas_sgl_next(MegasasCmd *cmd, in megasas_sgl_next() argument
265 if (megasas_frame_is_ieee_sgl(cmd)) { in megasas_sgl_next()
267 } else if (megasas_frame_is_sgl64(cmd)) { in megasas_sgl_next()
273 if (next >= (uint8_t *)cmd->frame + cmd->pa_size) { in megasas_sgl_next()
281 static int megasas_map_sgl(MegasasState *s, MegasasCmd *cmd, union mfi_sgl *sgl) in megasas_map_sgl() argument
287 cmd->flags = le16_to_cpu(cmd->frame->header.flags); in megasas_map_sgl()
288 iov_count = cmd->frame->header.sge_count; in megasas_map_sgl()
290 trace_megasas_iovec_sgl_overflow(cmd->index, iov_count, in megasas_map_sgl()
294 pci_dma_sglist_init(&cmd->qsg, PCI_DEVICE(s), iov_count); in megasas_map_sgl()
299 trace_megasas_iovec_sgl_underflow(cmd->index, i); in megasas_map_sgl()
302 iov_pa = megasas_sgl_get_addr(cmd, sgl); in megasas_map_sgl()
303 iov_size_p = megasas_sgl_get_len(cmd, sgl); in megasas_map_sgl()
305 trace_megasas_iovec_sgl_invalid(cmd->index, i, in megasas_map_sgl()
309 qemu_sglist_add(&cmd->qsg, iov_pa, iov_size_p); in megasas_map_sgl()
310 sgl = megasas_sgl_next(cmd, sgl); in megasas_map_sgl()
313 if (cmd->iov_size > iov_size) { in megasas_map_sgl()
314 trace_megasas_iovec_overflow(cmd->index, iov_size, cmd->iov_size); in megasas_map_sgl()
316 } else if (cmd->iov_size < iov_size) { in megasas_map_sgl()
317 trace_megasas_iovec_underflow(cmd->index, iov_size, cmd->iov_size); in megasas_map_sgl()
319 cmd->iov_offset = 0; in megasas_map_sgl()
322 qemu_sglist_destroy(&cmd->qsg); in megasas_map_sgl()
329 static int megasas_build_sense(MegasasCmd *cmd, uint8_t *sense_ptr, in megasas_build_sense() argument
332 PCIDevice *pcid = PCI_DEVICE(cmd->state); in megasas_build_sense()
337 frame_sense_len = cmd->frame->header.sense_len; in megasas_build_sense()
342 pa_lo = le32_to_cpu(cmd->frame->pass.sense_addr_lo); in megasas_build_sense()
343 if (megasas_frame_is_sense64(cmd)) { in megasas_build_sense()
344 pa_hi = le32_to_cpu(cmd->frame->pass.sense_addr_hi); in megasas_build_sense()
348 cmd->frame->header.sense_len = sense_len; in megasas_build_sense()
353 static void megasas_write_sense(MegasasCmd *cmd, SCSISense sense) in megasas_write_sense() argument
364 megasas_build_sense(cmd, sense_buf, sense_len); in megasas_write_sense()
367 static void megasas_copy_sense(MegasasCmd *cmd) in megasas_copy_sense() argument
372 sense_len = scsi_req_get_sense(cmd->req, sense_buf, in megasas_copy_sense()
374 megasas_build_sense(cmd, sense_buf, sense_len); in megasas_copy_sense()
451 MegasasCmd *cmd = NULL; in megasas_lookup_frame() local
458 cmd = &s->frames[index]; in megasas_lookup_frame()
465 return cmd; in megasas_lookup_frame()
468 static void megasas_unmap_frame(MegasasState *s, MegasasCmd *cmd) in megasas_unmap_frame() argument
472 if (cmd->pa_size) { in megasas_unmap_frame()
473 pci_dma_unmap(p, cmd->frame, cmd->pa_size, 0, 0); in megasas_unmap_frame()
475 cmd->frame = NULL; in megasas_unmap_frame()
476 cmd->pa = 0; in megasas_unmap_frame()
477 cmd->pa_size = 0; in megasas_unmap_frame()
478 qemu_sglist_destroy(&cmd->qsg); in megasas_unmap_frame()
479 clear_bit(cmd->index, s->frame_map); in megasas_unmap_frame()
490 MegasasCmd *cmd = NULL; in megasas_enqueue_frame() local
508 cmd = &s->frames[index]; in megasas_enqueue_frame()
512 cmd->pa = frame; in megasas_enqueue_frame()
514 cmd->frame = pci_dma_map(pcid, frame, &frame_size_p, 0); in megasas_enqueue_frame()
515 if (!cmd->frame || frame_size_p != frame_size) { in megasas_enqueue_frame()
516 trace_megasas_qf_map_failed(cmd->index, (unsigned long)frame); in megasas_enqueue_frame()
517 if (cmd->frame) { in megasas_enqueue_frame()
518 megasas_unmap_frame(s, cmd); in megasas_enqueue_frame()
523 cmd->pa_size = frame_size_p; in megasas_enqueue_frame()
524 cmd->context = context; in megasas_enqueue_frame()
526 cmd->context &= (uint64_t)0xFFFFFFFF; in megasas_enqueue_frame()
528 cmd->count = count; in megasas_enqueue_frame()
529 cmd->dcmd_opcode = -1; in megasas_enqueue_frame()
536 trace_megasas_qf_enqueue(cmd->index, cmd->count, cmd->context, in megasas_enqueue_frame()
539 return cmd; in megasas_enqueue_frame()
597 static void megasas_complete_command(MegasasCmd *cmd) in megasas_complete_command() argument
599 cmd->iov_size = 0; in megasas_complete_command()
600 cmd->iov_offset = 0; in megasas_complete_command()
602 cmd->req->hba_private = NULL; in megasas_complete_command()
603 scsi_req_unref(cmd->req); in megasas_complete_command()
604 cmd->req = NULL; in megasas_complete_command()
606 megasas_unmap_frame(cmd->state, cmd); in megasas_complete_command()
607 megasas_complete_frame(cmd->state, cmd->context); in megasas_complete_command()
613 MegasasCmd *cmd; in megasas_reset_frames() local
616 cmd = &s->frames[i]; in megasas_reset_frames()
617 if (cmd->pa) { in megasas_reset_frames()
618 megasas_unmap_frame(s, cmd); in megasas_reset_frames()
624 static void megasas_abort_command(MegasasCmd *cmd) in megasas_abort_command() argument
627 if (cmd->dcmd_opcode != -1) { in megasas_abort_command()
630 if (cmd->req != NULL) { in megasas_abort_command()
631 scsi_req_cancel(cmd->req); in megasas_abort_command()
635 static int megasas_init_firmware(MegasasState *s, MegasasCmd *cmd) in megasas_init_firmware() argument
649 pa_lo = le32_to_cpu(cmd->frame->init.qinfo_new_addr_lo); in megasas_init_firmware()
650 pa_hi = le32_to_cpu(cmd->frame->init.qinfo_new_addr_hi); in megasas_init_firmware()
655 trace_megasas_initq_map_failed(cmd->index); in megasas_init_firmware()
696 static int megasas_map_dcmd(MegasasState *s, MegasasCmd *cmd) in megasas_map_dcmd() argument
701 cmd->flags = le16_to_cpu(cmd->frame->header.flags); in megasas_map_dcmd()
702 iov_count = cmd->frame->header.sge_count; in megasas_map_dcmd()
704 trace_megasas_dcmd_zero_sge(cmd->index); in megasas_map_dcmd()
705 cmd->iov_size = 0; in megasas_map_dcmd()
708 trace_megasas_dcmd_invalid_sge(cmd->index, iov_count); in megasas_map_dcmd()
709 cmd->iov_size = 0; in megasas_map_dcmd()
712 iov_pa = megasas_sgl_get_addr(cmd, &cmd->frame->dcmd.sgl); in megasas_map_dcmd()
713 iov_size = megasas_sgl_get_len(cmd, &cmd->frame->dcmd.sgl); in megasas_map_dcmd()
714 pci_dma_sglist_init(&cmd->qsg, PCI_DEVICE(s), 1); in megasas_map_dcmd()
715 qemu_sglist_add(&cmd->qsg, iov_pa, iov_size); in megasas_map_dcmd()
716 cmd->iov_size = iov_size; in megasas_map_dcmd()
720 static void megasas_finish_dcmd(MegasasCmd *cmd, uint32_t iov_size) in megasas_finish_dcmd() argument
722 trace_megasas_finish_dcmd(cmd->index, iov_size); in megasas_finish_dcmd()
724 if (iov_size > cmd->iov_size) { in megasas_finish_dcmd()
725 if (megasas_frame_is_ieee_sgl(cmd)) { in megasas_finish_dcmd()
726 cmd->frame->dcmd.sgl.sg_skinny->len = cpu_to_le32(iov_size); in megasas_finish_dcmd()
727 } else if (megasas_frame_is_sgl64(cmd)) { in megasas_finish_dcmd()
728 cmd->frame->dcmd.sgl.sg64->len = cpu_to_le32(iov_size); in megasas_finish_dcmd()
730 cmd->frame->dcmd.sgl.sg32->len = cpu_to_le32(iov_size); in megasas_finish_dcmd()
735 static int megasas_ctrl_get_info(MegasasState *s, MegasasCmd *cmd) in megasas_ctrl_get_info() argument
747 if (cmd->iov_size < dcmd_size) { in megasas_ctrl_get_info()
748 trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size, in megasas_ctrl_get_info()
855 dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg, in megasas_ctrl_get_info()
857 cmd->iov_size -= residual; in megasas_ctrl_get_info()
861 static int megasas_mfc_get_defaults(MegasasState *s, MegasasCmd *cmd) in megasas_mfc_get_defaults() argument
868 if (cmd->iov_size < dcmd_size) { in megasas_mfc_get_defaults()
869 trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size, in megasas_mfc_get_defaults()
888 dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg, in megasas_mfc_get_defaults()
890 cmd->iov_size -= residual; in megasas_mfc_get_defaults()
894 static int megasas_dcmd_get_bios_info(MegasasState *s, MegasasCmd *cmd) in megasas_dcmd_get_bios_info() argument
901 if (cmd->iov_size < dcmd_size) { in megasas_dcmd_get_bios_info()
902 trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size, in megasas_dcmd_get_bios_info()
912 dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg, in megasas_dcmd_get_bios_info()
914 cmd->iov_size -= residual; in megasas_dcmd_get_bios_info()
918 static int megasas_dcmd_get_fw_time(MegasasState *s, MegasasCmd *cmd) in megasas_dcmd_get_fw_time() argument
926 dma_buf_read(&fw_time, dcmd_size, &residual, &cmd->qsg, in megasas_dcmd_get_fw_time()
928 cmd->iov_size -= residual; in megasas_dcmd_get_fw_time()
932 static int megasas_dcmd_set_fw_time(MegasasState *s, MegasasCmd *cmd) in megasas_dcmd_set_fw_time() argument
937 memcpy(&fw_time, cmd->frame->dcmd.mbox, sizeof(fw_time)); in megasas_dcmd_set_fw_time()
939 trace_megasas_dcmd_set_fw_time(cmd->index, fw_time); in megasas_dcmd_set_fw_time()
944 static int megasas_event_info(MegasasState *s, MegasasCmd *cmd) in megasas_event_info() argument
956 dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg, in megasas_event_info()
958 cmd->iov_size -= residual; in megasas_event_info()
962 static int megasas_event_wait(MegasasState *s, MegasasCmd *cmd) in megasas_event_wait() argument
966 if (cmd->iov_size < sizeof(struct mfi_evt_detail)) { in megasas_event_wait()
967 trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size, in megasas_event_wait()
971 s->event_count = cpu_to_le32(cmd->frame->dcmd.mbox[0]); in megasas_event_wait()
972 event.word = cpu_to_le32(cmd->frame->dcmd.mbox[4]); in megasas_event_wait()
975 s->event_cmd = cmd; in megasas_event_wait()
978 cmd->iov_size = sizeof(struct mfi_evt_detail); in megasas_event_wait()
982 static int megasas_dcmd_pd_get_list(MegasasState *s, MegasasCmd *cmd) in megasas_dcmd_pd_get_list() argument
993 if (cmd->iov_size < dcmd_limit) { in megasas_dcmd_pd_get_list()
994 trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size, in megasas_dcmd_pd_get_list()
999 max_pd_disks = (cmd->iov_size - offset) / sizeof(struct mfi_pd_address); in megasas_dcmd_pd_get_list()
1022 trace_megasas_dcmd_pd_get_list(cmd->index, num_pd_disks, in megasas_dcmd_pd_get_list()
1028 dma_buf_read(&info, offset, &residual, &cmd->qsg, in megasas_dcmd_pd_get_list()
1030 cmd->iov_size -= residual; in megasas_dcmd_pd_get_list()
1034 static int megasas_dcmd_pd_list_query(MegasasState *s, MegasasCmd *cmd) in megasas_dcmd_pd_list_query() argument
1039 flags = le16_to_cpu(cmd->frame->dcmd.mbox[0]); in megasas_dcmd_pd_list_query()
1040 trace_megasas_dcmd_pd_list_query(cmd->index, flags); in megasas_dcmd_pd_list_query()
1043 return megasas_dcmd_pd_get_list(s, cmd); in megasas_dcmd_pd_list_query()
1050 MegasasCmd *cmd) in megasas_pd_get_info_submit() argument
1052 struct mfi_pd_info *info = cmd->iov_buf; in megasas_pd_get_info_submit()
1060 if (!cmd->iov_buf) { in megasas_pd_get_info_submit()
1061 cmd->iov_buf = g_malloc0(dcmd_size); in megasas_pd_get_info_submit()
1062 info = cmd->iov_buf; in megasas_pd_get_info_submit()
1066 cmd->req = scsi_req_new(sdev, cmd->index, lun, cmdbuf, sizeof(cmdbuf), cmd); in megasas_pd_get_info_submit()
1067 if (!cmd->req) { in megasas_pd_get_info_submit()
1068 trace_megasas_dcmd_req_alloc_failed(cmd->index, in megasas_pd_get_info_submit()
1070 g_free(cmd->iov_buf); in megasas_pd_get_info_submit()
1071 cmd->iov_buf = NULL; in megasas_pd_get_info_submit()
1074 trace_megasas_dcmd_internal_submit(cmd->index, in megasas_pd_get_info_submit()
1076 len = scsi_req_enqueue(cmd->req); in megasas_pd_get_info_submit()
1078 cmd->iov_size = len; in megasas_pd_get_info_submit()
1079 scsi_req_continue(cmd->req); in megasas_pd_get_info_submit()
1084 cmd->req = scsi_req_new(sdev, cmd->index, lun, cmdbuf, sizeof(cmdbuf), cmd); in megasas_pd_get_info_submit()
1085 if (!cmd->req) { in megasas_pd_get_info_submit()
1086 trace_megasas_dcmd_req_alloc_failed(cmd->index, in megasas_pd_get_info_submit()
1090 trace_megasas_dcmd_internal_submit(cmd->index, in megasas_pd_get_info_submit()
1092 len = scsi_req_enqueue(cmd->req); in megasas_pd_get_info_submit()
1094 cmd->iov_size = len; in megasas_pd_get_info_submit()
1095 scsi_req_continue(cmd->req); in megasas_pd_get_info_submit()
1101 if (megasas_is_jbod(cmd->state)) { in megasas_pd_get_info_submit()
1125 dma_buf_read(cmd->iov_buf, dcmd_size, &residual, &cmd->qsg, in megasas_pd_get_info_submit()
1127 cmd->iov_size -= residual; in megasas_pd_get_info_submit()
1128 g_free(cmd->iov_buf); in megasas_pd_get_info_submit()
1129 cmd->iov_size = dcmd_size - residual; in megasas_pd_get_info_submit()
1130 cmd->iov_buf = NULL; in megasas_pd_get_info_submit()
1134 static int megasas_dcmd_pd_get_info(MegasasState *s, MegasasCmd *cmd) in megasas_dcmd_pd_get_info() argument
1142 if (cmd->iov_size < dcmd_size) { in megasas_dcmd_pd_get_info()
1147 pd_id = le16_to_cpu(cmd->frame->dcmd.mbox[0]); in megasas_dcmd_pd_get_info()
1151 trace_megasas_dcmd_pd_get_info(cmd->index, pd_id); in megasas_dcmd_pd_get_info()
1155 retval = megasas_pd_get_info_submit(sdev, pd_id, cmd); in megasas_dcmd_pd_get_info()
1161 static int megasas_dcmd_ld_get_list(MegasasState *s, MegasasCmd *cmd) in megasas_dcmd_ld_get_list() argument
1171 if (cmd->iov_size > dcmd_size) { in megasas_dcmd_ld_get_list()
1172 trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size, in megasas_dcmd_ld_get_list()
1177 max_ld_disks = (cmd->iov_size - 8) / 16; in megasas_dcmd_ld_get_list()
1198 trace_megasas_dcmd_ld_get_list(cmd->index, num_ld_disks, max_ld_disks); in megasas_dcmd_ld_get_list()
1200 dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg, in megasas_dcmd_ld_get_list()
1202 cmd->iov_size = dcmd_size - residual; in megasas_dcmd_ld_get_list()
1206 static int megasas_dcmd_ld_list_query(MegasasState *s, MegasasCmd *cmd) in megasas_dcmd_ld_list_query() argument
1216 flags = le16_to_cpu(cmd->frame->dcmd.mbox[0]); in megasas_dcmd_ld_list_query()
1217 trace_megasas_dcmd_ld_list_query(cmd->index, flags); in megasas_dcmd_ld_list_query()
1224 if (cmd->iov_size < 12) { in megasas_dcmd_ld_list_query()
1225 trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size, in megasas_dcmd_ld_list_query()
1230 max_ld_disks = cmd->iov_size - dcmd_size; in megasas_dcmd_ld_list_query()
1249 trace_megasas_dcmd_ld_get_list(cmd->index, num_ld_disks, max_ld_disks); in megasas_dcmd_ld_list_query()
1251 dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg, in megasas_dcmd_ld_list_query()
1253 cmd->iov_size = dcmd_size - residual; in megasas_dcmd_ld_list_query()
1258 MegasasCmd *cmd) in megasas_ld_get_info_submit() argument
1260 struct mfi_ld_info *info = cmd->iov_buf; in megasas_ld_get_info_submit()
1268 if (!cmd->iov_buf) { in megasas_ld_get_info_submit()
1269 cmd->iov_buf = g_malloc0(dcmd_size); in megasas_ld_get_info_submit()
1270 info = cmd->iov_buf; in megasas_ld_get_info_submit()
1272 cmd->req = scsi_req_new(sdev, cmd->index, lun, cdb, sizeof(cdb), cmd); in megasas_ld_get_info_submit()
1273 if (!cmd->req) { in megasas_ld_get_info_submit()
1274 trace_megasas_dcmd_req_alloc_failed(cmd->index, in megasas_ld_get_info_submit()
1276 g_free(cmd->iov_buf); in megasas_ld_get_info_submit()
1277 cmd->iov_buf = NULL; in megasas_ld_get_info_submit()
1280 trace_megasas_dcmd_internal_submit(cmd->index, in megasas_ld_get_info_submit()
1282 len = scsi_req_enqueue(cmd->req); in megasas_ld_get_info_submit()
1284 cmd->iov_size = len; in megasas_ld_get_info_submit()
1285 scsi_req_continue(cmd->req); in megasas_ld_get_info_submit()
1303 dma_buf_read(cmd->iov_buf, dcmd_size, &residual, &cmd->qsg, in megasas_ld_get_info_submit()
1305 g_free(cmd->iov_buf); in megasas_ld_get_info_submit()
1306 cmd->iov_size = dcmd_size - residual; in megasas_ld_get_info_submit()
1307 cmd->iov_buf = NULL; in megasas_ld_get_info_submit()
1311 static int megasas_dcmd_ld_get_info(MegasasState *s, MegasasCmd *cmd) in megasas_dcmd_ld_get_info() argument
1320 if (cmd->iov_size < dcmd_size) { in megasas_dcmd_ld_get_info()
1325 ld_id = le16_to_cpu(cmd->frame->dcmd.mbox[0]); in megasas_dcmd_ld_get_info()
1326 trace_megasas_dcmd_ld_get_info(cmd->index, ld_id); in megasas_dcmd_ld_get_info()
1337 retval = megasas_ld_get_info_submit(sdev, ld_id, cmd); in megasas_dcmd_ld_get_info()
1343 static int megasas_dcmd_cfg_read(MegasasState *s, MegasasCmd *cmd) in megasas_dcmd_cfg_read() argument
1351 if (cmd->iov_size > 4096) { in megasas_dcmd_cfg_read()
1424 dma_buf_read(data, info->size, &residual, &cmd->qsg, in megasas_dcmd_cfg_read()
1426 cmd->iov_size -= residual; in megasas_dcmd_cfg_read()
1430 static int megasas_dcmd_get_properties(MegasasState *s, MegasasCmd *cmd) in megasas_dcmd_get_properties() argument
1437 if (cmd->iov_size < dcmd_size) { in megasas_dcmd_get_properties()
1438 trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size, in megasas_dcmd_get_properties()
1457 dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg, in megasas_dcmd_get_properties()
1459 cmd->iov_size -= residual; in megasas_dcmd_get_properties()
1463 static int megasas_cache_flush(MegasasState *s, MegasasCmd *cmd) in megasas_cache_flush() argument
1469 static int megasas_ctrl_shutdown(MegasasState *s, MegasasCmd *cmd) in megasas_ctrl_shutdown() argument
1476 static int megasas_cluster_reset_ld(MegasasState *s, MegasasCmd *cmd) in megasas_cluster_reset_ld() argument
1482 target_id = le16_to_cpu(cmd->frame->dcmd.mbox[0]); in megasas_cluster_reset_ld()
1483 trace_megasas_dcmd_reset_ld(cmd->index, target_id); in megasas_cluster_reset_ld()
1494 static int megasas_dcmd_set_properties(MegasasState *s, MegasasCmd *cmd) in megasas_dcmd_set_properties() argument
1499 if (cmd->iov_size < dcmd_size) { in megasas_dcmd_set_properties()
1500 trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size, in megasas_dcmd_set_properties()
1504 dma_buf_write(&info, dcmd_size, NULL, &cmd->qsg, MEMTXATTRS_UNSPECIFIED); in megasas_dcmd_set_properties()
1505 trace_megasas_dcmd_unsupported(cmd->index, cmd->iov_size); in megasas_dcmd_set_properties()
1509 static int megasas_dcmd_dummy(MegasasState *s, MegasasCmd *cmd) in megasas_dcmd_dummy() argument
1511 trace_megasas_dcmd_dummy(cmd->index, cmd->iov_size); in megasas_dcmd_dummy()
1518 int (*func)(MegasasState *s, MegasasCmd *cmd);
1615 static int megasas_handle_dcmd(MegasasState *s, MegasasCmd *cmd) in megasas_handle_dcmd() argument
1621 cmd->dcmd_opcode = le32_to_cpu(cmd->frame->dcmd.opcode); in megasas_handle_dcmd()
1622 trace_megasas_handle_dcmd(cmd->index, cmd->dcmd_opcode); in megasas_handle_dcmd()
1623 if (megasas_map_dcmd(s, cmd) < 0) { in megasas_handle_dcmd()
1626 while (cmdptr->opcode != -1 && cmdptr->opcode != cmd->dcmd_opcode) { in megasas_handle_dcmd()
1629 len = cmd->iov_size; in megasas_handle_dcmd()
1631 trace_megasas_dcmd_unhandled(cmd->index, cmd->dcmd_opcode, len); in megasas_handle_dcmd()
1632 retval = megasas_dcmd_dummy(s, cmd); in megasas_handle_dcmd()
1634 trace_megasas_dcmd_enter(cmd->index, cmdptr->desc, len); in megasas_handle_dcmd()
1635 retval = cmdptr->func(s, cmd); in megasas_handle_dcmd()
1638 megasas_finish_dcmd(cmd, len); in megasas_handle_dcmd()
1643 static int megasas_finish_internal_dcmd(MegasasCmd *cmd, in megasas_finish_internal_dcmd() argument
1649 trace_megasas_dcmd_internal_finish(cmd->index, cmd->dcmd_opcode, lun); in megasas_finish_internal_dcmd()
1650 cmd->iov_size -= residual; in megasas_finish_internal_dcmd()
1651 switch (cmd->dcmd_opcode) { in megasas_finish_internal_dcmd()
1653 retval = megasas_pd_get_info_submit(req->dev, lun, cmd); in megasas_finish_internal_dcmd()
1656 retval = megasas_ld_get_info_submit(req->dev, lun, cmd); in megasas_finish_internal_dcmd()
1659 trace_megasas_dcmd_internal_invalid(cmd->index, cmd->dcmd_opcode); in megasas_finish_internal_dcmd()
1664 megasas_finish_dcmd(cmd, cmd->iov_size); in megasas_finish_internal_dcmd()
1669 static int megasas_enqueue_req(MegasasCmd *cmd, bool is_write) in megasas_enqueue_req() argument
1673 len = scsi_req_enqueue(cmd->req); in megasas_enqueue_req()
1678 if (len > cmd->iov_size) { in megasas_enqueue_req()
1680 trace_megasas_iov_write_overflow(cmd->index, len, in megasas_enqueue_req()
1681 cmd->iov_size); in megasas_enqueue_req()
1683 trace_megasas_iov_read_overflow(cmd->index, len, in megasas_enqueue_req()
1684 cmd->iov_size); in megasas_enqueue_req()
1687 if (len < cmd->iov_size) { in megasas_enqueue_req()
1689 trace_megasas_iov_write_underflow(cmd->index, len, in megasas_enqueue_req()
1690 cmd->iov_size); in megasas_enqueue_req()
1692 trace_megasas_iov_read_underflow(cmd->index, len, in megasas_enqueue_req()
1693 cmd->iov_size); in megasas_enqueue_req()
1695 cmd->iov_size = len; in megasas_enqueue_req()
1697 scsi_req_continue(cmd->req); in megasas_enqueue_req()
1702 static int megasas_handle_scsi(MegasasState *s, MegasasCmd *cmd, in megasas_handle_scsi() argument
1711 cdb = cmd->frame->pass.cdb; in megasas_handle_scsi()
1712 target_id = cmd->frame->header.target_id; in megasas_handle_scsi()
1713 lun_id = cmd->frame->header.lun_id; in megasas_handle_scsi()
1714 cdb_len = cmd->frame->header.cdb_len; in megasas_handle_scsi()
1725 cmd->iov_size = le32_to_cpu(cmd->frame->header.data_len); in megasas_handle_scsi()
1727 target_id, lun_id, sdev, cmd->iov_size); in megasas_handle_scsi()
1739 megasas_write_sense(cmd, SENSE_CODE(INVALID_OPCODE)); in megasas_handle_scsi()
1740 cmd->frame->header.scsi_status = CHECK_CONDITION; in megasas_handle_scsi()
1745 if (megasas_map_sgl(s, cmd, &cmd->frame->pass.sgl)) { in megasas_handle_scsi()
1746 megasas_write_sense(cmd, SENSE_CODE(TARGET_FAILURE)); in megasas_handle_scsi()
1747 cmd->frame->header.scsi_status = CHECK_CONDITION; in megasas_handle_scsi()
1752 cmd->req = scsi_req_new(sdev, cmd->index, lun_id, cdb, cdb_len, cmd); in megasas_handle_scsi()
1753 if (!cmd->req) { in megasas_handle_scsi()
1756 megasas_write_sense(cmd, SENSE_CODE(NO_SENSE)); in megasas_handle_scsi()
1757 cmd->frame->header.scsi_status = BUSY; in megasas_handle_scsi()
1762 is_write = (cmd->req->cmd.mode == SCSI_XFER_TO_DEV); in megasas_handle_scsi()
1763 if (cmd->iov_size) { in megasas_handle_scsi()
1765 trace_megasas_scsi_write_start(cmd->index, cmd->iov_size); in megasas_handle_scsi()
1767 trace_megasas_scsi_read_start(cmd->index, cmd->iov_size); in megasas_handle_scsi()
1770 trace_megasas_scsi_nodata(cmd->index); in megasas_handle_scsi()
1772 megasas_enqueue_req(cmd, is_write); in megasas_handle_scsi()
1776 static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd) in megasas_handle_io() argument
1786 lba_count = le32_to_cpu(cmd->frame->io.header.data_len); in megasas_handle_io()
1787 lba_start_lo = le32_to_cpu(cmd->frame->io.lba_lo); in megasas_handle_io()
1788 lba_start_hi = le32_to_cpu(cmd->frame->io.lba_hi); in megasas_handle_io()
1791 target_id = cmd->frame->header.target_id; in megasas_handle_io()
1792 lun_id = cmd->frame->header.lun_id; in megasas_handle_io()
1793 cdb_len = cmd->frame->header.cdb_len; in megasas_handle_io()
1799 trace_megasas_handle_io(cmd->index, in megasas_handle_io()
1803 trace_megasas_io_target_not_present(cmd->index, in megasas_handle_io()
1811 megasas_write_sense(cmd, SENSE_CODE(INVALID_OPCODE)); in megasas_handle_io()
1812 cmd->frame->header.scsi_status = CHECK_CONDITION; in megasas_handle_io()
1817 cmd->iov_size = lba_count * sdev->blocksize; in megasas_handle_io()
1818 if (megasas_map_sgl(s, cmd, &cmd->frame->io.sgl)) { in megasas_handle_io()
1819 megasas_write_sense(cmd, SENSE_CODE(TARGET_FAILURE)); in megasas_handle_io()
1820 cmd->frame->header.scsi_status = CHECK_CONDITION; in megasas_handle_io()
1826 cmd->req = scsi_req_new(sdev, cmd->index, in megasas_handle_io()
1827 lun_id, cdb, cdb_len, cmd); in megasas_handle_io()
1828 if (!cmd->req) { in megasas_handle_io()
1831 megasas_write_sense(cmd, SENSE_CODE(NO_SENSE)); in megasas_handle_io()
1832 cmd->frame->header.scsi_status = BUSY; in megasas_handle_io()
1836 len = megasas_enqueue_req(cmd, is_write); in megasas_handle_io()
1839 trace_megasas_io_write_start(cmd->index, lba_start, lba_count, len); in megasas_handle_io()
1841 trace_megasas_io_read_start(cmd->index, lba_start, lba_count, len); in megasas_handle_io()
1849 MegasasCmd *cmd = req->hba_private; in megasas_get_sg_list() local
1851 if (cmd->dcmd_opcode != -1) { in megasas_get_sg_list()
1854 return &cmd->qsg; in megasas_get_sg_list()
1860 MegasasCmd *cmd = req->hba_private; in megasas_xfer_complete() local
1863 trace_megasas_io_complete(cmd->index, len); in megasas_xfer_complete()
1865 if (cmd->dcmd_opcode != -1) { in megasas_xfer_complete()
1871 if (cmd->dcmd_opcode == MFI_DCMD_PD_GET_INFO && cmd->iov_buf) { in megasas_xfer_complete()
1872 struct mfi_pd_info *info = cmd->iov_buf; in megasas_xfer_complete()
1882 } else if (cmd->dcmd_opcode == MFI_DCMD_LD_GET_INFO) { in megasas_xfer_complete()
1883 struct mfi_ld_info *info = cmd->iov_buf; in megasas_xfer_complete()
1885 if (cmd->iov_buf) { in megasas_xfer_complete()
1894 MegasasCmd *cmd = req->hba_private; in megasas_command_complete() local
1897 trace_megasas_command_complete(cmd->index, req->status, residual); in megasas_command_complete()
1903 if (cmd->dcmd_opcode != -1) { in megasas_command_complete()
1907 cmd_status = megasas_finish_internal_dcmd(cmd, req, residual); in megasas_command_complete()
1912 trace_megasas_scsi_complete(cmd->index, req->status, in megasas_command_complete()
1913 cmd->iov_size, req->cmd.xfer); in megasas_command_complete()
1918 megasas_copy_sense(cmd); in megasas_command_complete()
1921 cmd->frame->header.scsi_status = req->status; in megasas_command_complete()
1923 cmd->frame->header.cmd_status = cmd_status; in megasas_command_complete()
1924 megasas_complete_command(cmd); in megasas_command_complete()
1929 MegasasCmd *cmd = req->hba_private; in megasas_command_cancelled() local
1931 if (!cmd) { in megasas_command_cancelled()
1934 cmd->frame->header.cmd_status = MFI_STAT_SCSI_IO_FAILED; in megasas_command_cancelled()
1935 megasas_complete_command(cmd); in megasas_command_cancelled()
1938 static int megasas_handle_abort(MegasasState *s, MegasasCmd *cmd) in megasas_handle_abort() argument
1940 uint64_t abort_ctx = le64_to_cpu(cmd->frame->abort.abort_context); in megasas_handle_abort()
1944 addr_hi = le32_to_cpu(cmd->frame->abort.abort_mfi_addr_hi); in megasas_handle_abort()
1945 addr_lo = le32_to_cpu(cmd->frame->abort.abort_mfi_addr_lo); in megasas_handle_abort()
1950 trace_megasas_abort_no_cmd(cmd->index, abort_ctx); in megasas_handle_abort()
1958 trace_megasas_abort_invalid_context(cmd->index, abort_cmd->context, in megasas_handle_abort()
1963 trace_megasas_abort_frame(cmd->index, abort_cmd->index); in megasas_handle_abort()
1978 MegasasCmd *cmd; in megasas_handle_frame() local
1986 cmd = megasas_enqueue_frame(s, frame_addr, frame_context, frame_count); in megasas_handle_frame()
1987 if (!cmd) { in megasas_handle_frame()
1996 frame_cmd = cmd->frame->header.frame_cmd; in megasas_handle_frame()
1999 frame_status = megasas_init_firmware(s, cmd); in megasas_handle_frame()
2002 frame_status = megasas_handle_dcmd(s, cmd); in megasas_handle_frame()
2005 frame_status = megasas_handle_abort(s, cmd); in megasas_handle_frame()
2009 frame_status = megasas_handle_scsi(s, cmd, frame_cmd); in megasas_handle_frame()
2013 frame_status = megasas_handle_io(s, cmd, frame_cmd); in megasas_handle_frame()
2016 trace_megasas_unhandled_frame_cmd(cmd->index, frame_cmd); in megasas_handle_frame()
2021 if (cmd->frame) { in megasas_handle_frame()
2022 cmd->frame->header.cmd_status = frame_status; in megasas_handle_frame()
2026 megasas_unmap_frame(s, cmd); in megasas_handle_frame()
2027 megasas_complete_frame(s, cmd->context); in megasas_handle_frame()
2255 MegasasCmd *cmd; in megasas_soft_reset() local
2259 cmd = &s->frames[i]; in megasas_soft_reset()
2260 megasas_abort_command(cmd); in megasas_soft_reset()