Lines Matching +full:broken +full:- +full:gen2

5  * Copyright (c) 2009-2012 Hannes Reinecke, SUSE Labs
23 #include "hw/qdev-properties.h"
25 #include "system/block-backend.h"
31 #include "qemu/hw-version.h"
135 #define TYPE_MEGASAS_BASE "megasas-base"
137 #define TYPE_MEGASAS_GEN2 "megasas-gen2"
147 if ((s->intr_mask & MEGASAS_INTR_DISABLED_MASK) != in DECLARE_OBJ_CHECKERS()
156 return s->flags & MEGASAS_MASK_USE_QUEUE64; in megasas_use_queue64()
161 return s->msix != ON_OFF_AUTO_OFF; in megasas_use_msix()
166 return s->flags & MEGASAS_MASK_USE_JBOD; in megasas_is_jbod()
172 PCIDevice *pci = &s->parent_obj; in megasas_frame_set_cmd_status()
180 PCIDevice *pci = &s->parent_obj; in megasas_frame_set_scsi_status()
206 PCIDevice *pci = &s->parent_obj; in megasas_frame_get_context()
217 return cmd->flags & MFI_FRAME_IEEE_SGL; in megasas_frame_is_ieee_sgl()
222 return cmd->flags & MFI_FRAME_SGL64; in megasas_frame_is_sgl64()
227 return cmd->flags & MFI_FRAME_SENSE64; in megasas_frame_is_sense64()
236 addr = le64_to_cpu(sgl->sg_skinny->addr); in megasas_sgl_get_addr()
238 addr = le64_to_cpu(sgl->sg64->addr); in megasas_sgl_get_addr()
240 addr = le32_to_cpu(sgl->sg32->addr); in megasas_sgl_get_addr()
251 len = le32_to_cpu(sgl->sg_skinny->len); in megasas_sgl_get_len()
253 len = le32_to_cpu(sgl->sg64->len); in megasas_sgl_get_len()
255 len = le32_to_cpu(sgl->sg32->len); in megasas_sgl_get_len()
273 if (next >= (uint8_t *)cmd->frame + cmd->pa_size) { in megasas_sgl_next()
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()
292 return -1; 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()
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()
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()
323 return -1; in megasas_map_sgl()
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()
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()
372 sense_len = scsi_req_get_sense(cmd->req, sense_buf, in megasas_copy_sense()
454 index = s->reply_queue_head; in megasas_lookup_frame()
456 while (num < s->fw_cmds && index < MEGASAS_MAX_FRAMES) { in megasas_lookup_frame()
457 if (s->frames[index].pa && s->frames[index].pa == frame) { in megasas_lookup_frame()
458 cmd = &s->frames[index]; in megasas_lookup_frame()
461 index = megasas_next_index(s, index, s->fw_cmds); in megasas_lookup_frame()
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()
496 while (index < s->fw_cmds) { in megasas_enqueue_frame()
497 index = find_next_zero_bit(s->frame_map, s->fw_cmds, index); in megasas_enqueue_frame()
498 if (!s->frames[index].pa) in megasas_enqueue_frame()
503 if (index >= s->fw_cmds) { in megasas_enqueue_frame()
508 cmd = &s->frames[index]; in megasas_enqueue_frame()
509 set_bit(index, s->frame_map); 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()
520 s->event_count++; 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()
530 s->busy++; in megasas_enqueue_frame()
532 if (s->consumer_pa) { in megasas_enqueue_frame()
533 ldl_le_pci_dma(pcid, s->consumer_pa, &s->reply_queue_tail, in megasas_enqueue_frame()
536 trace_megasas_qf_enqueue(cmd->index, cmd->count, cmd->context, in megasas_enqueue_frame()
537 s->reply_queue_head, s->reply_queue_tail, s->busy); in megasas_enqueue_frame()
549 s->busy--; in megasas_complete_frame()
550 if (s->reply_queue_pa) { in megasas_complete_frame()
557 queue_offset = s->reply_queue_head * sizeof(uint64_t); in megasas_complete_frame()
558 stq_le_pci_dma(pci_dev, s->reply_queue_pa + queue_offset, in megasas_complete_frame()
561 queue_offset = s->reply_queue_head * sizeof(uint32_t); in megasas_complete_frame()
562 stl_le_pci_dma(pci_dev, s->reply_queue_pa + queue_offset, in megasas_complete_frame()
565 ldl_le_pci_dma(pci_dev, s->consumer_pa, &s->reply_queue_tail, attrs); in megasas_complete_frame()
566 trace_megasas_qf_complete(context, s->reply_queue_head, in megasas_complete_frame()
567 s->reply_queue_tail, s->busy); in megasas_complete_frame()
572 ldl_le_pci_dma(pci_dev, s->consumer_pa, &s->reply_queue_tail, attrs); in megasas_complete_frame()
573 tail = s->reply_queue_head; in megasas_complete_frame()
574 s->reply_queue_head = megasas_next_index(s, tail, s->fw_cmds); in megasas_complete_frame()
575 trace_megasas_qf_update(s->reply_queue_head, s->reply_queue_tail, in megasas_complete_frame()
576 s->busy); in megasas_complete_frame()
577 stl_le_pci_dma(pci_dev, s->producer_pa, s->reply_queue_head, attrs); in megasas_complete_frame()
586 s->doorbell++; in megasas_complete_frame()
587 if (s->doorbell == 1) { in megasas_complete_frame()
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()
615 for (i = 0; i < s->fw_cmds; i++) { in megasas_reset_frames()
616 cmd = &s->frames[i]; in megasas_reset_frames()
617 if (cmd->pa) { in megasas_reset_frames()
621 bitmap_zero(s->frame_map, MEGASAS_MAX_FRAMES); in megasas_reset_frames()
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()
645 if (s->reply_queue_pa) { in megasas_init_firmware()
646 trace_megasas_initq_mapped(s->reply_queue_pa); in megasas_init_firmware()
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()
656 s->event_count++; in megasas_init_firmware()
660 s->reply_queue_len = le32_to_cpu(initq->rq_entries) & 0xFFFF; in megasas_init_firmware()
661 if (s->reply_queue_len > s->fw_cmds) { in megasas_init_firmware()
662 trace_megasas_initq_mismatch(s->reply_queue_len, s->fw_cmds); in megasas_init_firmware()
663 s->event_count++; in megasas_init_firmware()
667 pa_lo = le32_to_cpu(initq->rq_addr_lo); in megasas_init_firmware()
668 pa_hi = le32_to_cpu(initq->rq_addr_hi); in megasas_init_firmware()
669 s->reply_queue_pa = ((uint64_t) pa_hi << 32) | pa_lo; in megasas_init_firmware()
670 pa_lo = le32_to_cpu(initq->ci_addr_lo); in megasas_init_firmware()
671 pa_hi = le32_to_cpu(initq->ci_addr_hi); in megasas_init_firmware()
672 s->consumer_pa = ((uint64_t) pa_hi << 32) | pa_lo; in megasas_init_firmware()
673 pa_lo = le32_to_cpu(initq->pi_addr_lo); in megasas_init_firmware()
674 pa_hi = le32_to_cpu(initq->pi_addr_hi); in megasas_init_firmware()
675 s->producer_pa = ((uint64_t) pa_hi << 32) | pa_lo; in megasas_init_firmware()
676 ldl_le_pci_dma(pcid, s->producer_pa, &s->reply_queue_head, attrs); in megasas_init_firmware()
677 s->reply_queue_head %= MEGASAS_MAX_FRAMES; in megasas_init_firmware()
678 ldl_le_pci_dma(pcid, s->consumer_pa, &s->reply_queue_tail, attrs); in megasas_init_firmware()
679 s->reply_queue_tail %= MEGASAS_MAX_FRAMES; in megasas_init_firmware()
680 flags = le32_to_cpu(initq->flags); in megasas_init_firmware()
682 s->flags |= MEGASAS_MASK_USE_QUEUE64; in megasas_init_firmware()
684 trace_megasas_init_queue((unsigned long)s->reply_queue_pa, in megasas_init_firmware()
685 s->reply_queue_len, s->reply_queue_head, in megasas_init_firmware()
686 s->reply_queue_tail, flags); in megasas_init_firmware()
688 s->fw_state = MFI_FWSTATE_OPERATIONAL; in megasas_init_firmware()
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()
710 return -EINVAL; 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()
722 trace_megasas_finish_dcmd(cmd->index, iov_size); in megasas_finish_dcmd()
724 if (iov_size > cmd->iov_size) { in megasas_finish_dcmd()
726 cmd->frame->dcmd.sgl.sg_skinny->len = cpu_to_le32(iov_size); 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()
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()
753 info.pci.vendor = cpu_to_le16(pci_class->vendor_id); in megasas_ctrl_get_info()
754 info.pci.device = cpu_to_le16(pci_class->device_id); in megasas_ctrl_get_info()
755 info.pci.subvendor = cpu_to_le16(pci_class->subsystem_vendor_id); in megasas_ctrl_get_info()
756 info.pci.subdevice = cpu_to_le16(pci_class->subsystem_id); in megasas_ctrl_get_info()
771 QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) { in megasas_ctrl_get_info()
772 SCSIDevice *sdev = SCSI_DEVICE(kid->child); in megasas_ctrl_get_info()
776 pd_id = ((sdev->id & 0xFF) << 8) | (sdev->lun & 0xFF); in megasas_ctrl_get_info()
783 memcpy(info.product_name, base_class->product_name, 24); in megasas_ctrl_get_info()
784 snprintf(info.serial_number, 32, "%s", s->hba_serial); in megasas_ctrl_get_info()
785 snprintf(info.package_version, 0x60, "%s-QEMU", qemu_hw_version()); in megasas_ctrl_get_info()
787 snprintf(info.image_component[0].version, 10, "%s-QEMU", in megasas_ctrl_get_info()
788 base_class->product_version); in megasas_ctrl_get_info()
792 if (pci_dev->has_rom) { in megasas_ctrl_get_info()
796 ptr = memory_region_get_ram_ptr(&pci_dev->rom); in megasas_ctrl_get_info()
809 info.max_cmds = cpu_to_le16(s->fw_cmds); in megasas_ctrl_get_info()
810 info.max_sg_elements = cpu_to_le16(s->fw_sge); in megasas_ctrl_get_info()
831 info.max_strips_per_io = cpu_to_le16(s->fw_sge); 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()
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()
874 info.sas_addr = cpu_to_le64(s->sas_addr); 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()
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()
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()
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()
952 info.newest_seq_num = cpu_to_le32(s->event_count); in megasas_event_info()
953 info.shutdown_seq_num = cpu_to_le32(s->shutdown_event); in megasas_event_info()
954 info.boot_seq_num = cpu_to_le32(s->boot_event); in megasas_event_info()
956 dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg, in megasas_event_info()
958 cmd->iov_size -= residual; in megasas_event_info()
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()
973 s->event_locale = event.members.locale; in megasas_event_wait()
974 s->event_class = event.members.class; in megasas_event_wait()
975 s->event_cmd = cmd; in megasas_event_wait()
977 s->busy--; in megasas_event_wait()
978 cmd->iov_size = sizeof(struct mfi_evt_detail); in megasas_event_wait()
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()
1003 QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) { in megasas_dcmd_pd_get_list()
1004 SCSIDevice *sdev = SCSI_DEVICE(kid->child); in megasas_dcmd_pd_get_list()
1010 pd_id = ((sdev->id & 0xFF) << 8) | (sdev->lun & 0xFF); in megasas_dcmd_pd_get_list()
1014 info.addr[num_pd_disks].slot_number = sdev->id & 0xFF; in megasas_dcmd_pd_get_list()
1015 info.addr[num_pd_disks].scsi_dev_type = sdev->type; 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()
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()
1052 struct mfi_pd_info *info = cmd->iov_buf; in megasas_pd_get_info_submit()
1055 uint16_t pd_id = ((sdev->id & 0xFF) << 8) | (lun & 0xFF); 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()
1063 info->inquiry_data[0] = 0x7f; /* Force PQual 0x3, PType 0x1f */ in megasas_pd_get_info_submit()
1064 info->vpd_page83[0] = 0x7f; in megasas_pd_get_info_submit()
1065 megasas_setup_inquiry(cmdbuf, 0, sizeof(info->inquiry_data)); 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()
1082 } else if (info->inquiry_data[0] != 0x7f && info->vpd_page83[0] == 0x7f) { in megasas_pd_get_info_submit()
1083 megasas_setup_inquiry(cmdbuf, 0x83, sizeof(info->vpd_page83)); 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()
1100 if ((info->inquiry_data[0] >> 5) == 0) { in megasas_pd_get_info_submit()
1101 if (megasas_is_jbod(cmd->state)) { in megasas_pd_get_info_submit()
1102 info->fw_state = cpu_to_le16(MFI_PD_STATE_SYSTEM); in megasas_pd_get_info_submit()
1104 info->fw_state = cpu_to_le16(MFI_PD_STATE_ONLINE); in megasas_pd_get_info_submit()
1107 info->fw_state = cpu_to_le16(MFI_PD_STATE_OFFLINE); in megasas_pd_get_info_submit()
1110 info->ref.v.device_id = cpu_to_le16(pd_id); in megasas_pd_get_info_submit()
1111 info->state.ddf.pd_type = cpu_to_le16(MFI_PD_DDF_TYPE_IN_VD| in megasas_pd_get_info_submit()
1113 blk_get_geometry(sdev->conf.blk, &pd_size); in megasas_pd_get_info_submit()
1114 info->raw_size = cpu_to_le64(pd_size); in megasas_pd_get_info_submit()
1115 info->non_coerced_size = cpu_to_le64(pd_size); in megasas_pd_get_info_submit()
1116 info->coerced_size = cpu_to_le64(pd_size); in megasas_pd_get_info_submit()
1117 info->encl_device_id = 0xFFFF; in megasas_pd_get_info_submit()
1118 info->slot_number = (sdev->id & 0xFF); in megasas_pd_get_info_submit()
1119 info->path_info.count = 1; in megasas_pd_get_info_submit()
1120 info->path_info.sas_addr[0] = in megasas_pd_get_info_submit()
1122 info->connected_port_bitmap = 0x1; in megasas_pd_get_info_submit()
1123 info->device_speed = 1; in megasas_pd_get_info_submit()
1124 info->link_speed = 1; 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()
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()
1150 sdev = scsi_device_find(&s->bus, 0, target_id, lun_id); in megasas_dcmd_pd_get_info()
1151 trace_megasas_dcmd_pd_get_info(cmd->index, pd_id); in megasas_dcmd_pd_get_info()
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()
1184 QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) { in megasas_dcmd_ld_get_list()
1185 SCSIDevice *sdev = SCSI_DEVICE(kid->child); in megasas_dcmd_ld_get_list()
1191 blk_get_geometry(sdev->conf.blk, &ld_size); in megasas_dcmd_ld_get_list()
1192 info.ld_list[num_ld_disks].ld.v.target_id = sdev->id; 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()
1212 uint32_t num_ld_disks = 0, max_ld_disks = s->fw_luns; in megasas_dcmd_ld_list_query()
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()
1237 QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) { in megasas_dcmd_ld_list_query()
1238 SCSIDevice *sdev = SCSI_DEVICE(kid->child); in megasas_dcmd_ld_list_query()
1243 info.targetid[num_ld_disks] = sdev->lun; 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()
1260 struct mfi_ld_info *info = cmd->iov_buf; in megasas_ld_get_info_submit()
1265 uint16_t sdev_id = ((sdev->id & 0xFF) << 8) | (lun & 0xFF); 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()
1271 megasas_setup_inquiry(cdb, 0x83, sizeof(info->vpd_page83)); 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()
1290 info->ld_config.params.state = MFI_LD_STATE_OPTIMAL; in megasas_ld_get_info_submit()
1291 info->ld_config.properties.ld.v.target_id = lun; in megasas_ld_get_info_submit()
1292 info->ld_config.params.stripe_size = 3; in megasas_ld_get_info_submit()
1293 info->ld_config.params.num_drives = 1; in megasas_ld_get_info_submit()
1294 info->ld_config.params.is_consistent = 1; in megasas_ld_get_info_submit()
1296 blk_get_geometry(sdev->conf.blk, &ld_size); in megasas_ld_get_info_submit()
1297 info->size = cpu_to_le64(ld_size); in megasas_ld_get_info_submit()
1298 memset(info->ld_config.span, 0, sizeof(info->ld_config.span)); in megasas_ld_get_info_submit()
1299 info->ld_config.span[0].start_block = 0; in megasas_ld_get_info_submit()
1300 info->ld_config.span[0].num_blocks = info->size; in megasas_ld_get_info_submit()
1301 info->ld_config.span[0].array_ref = cpu_to_le16(sdev_id); 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()
1316 uint32_t max_ld_disks = s->fw_luns; in megasas_dcmd_ld_get_info()
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()
1333 sdev = scsi_device_find(&s->bus, 0, ld_id, 0); in megasas_dcmd_ld_get_info()
1351 if (cmd->iov_size > 4096) { in megasas_dcmd_cfg_read()
1355 QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) { in megasas_dcmd_cfg_read()
1361 * - One array per SCSI device in megasas_dcmd_cfg_read()
1362 * - One logical drive per SCSI device in megasas_dcmd_cfg_read()
1365 info->array_count = num_pd_disks; in megasas_dcmd_cfg_read()
1366 info->array_size = sizeof(struct mfi_array) * num_pd_disks; in megasas_dcmd_cfg_read()
1367 info->log_drv_count = num_pd_disks; in megasas_dcmd_cfg_read()
1368 info->log_drv_size = sizeof(struct mfi_ld_config) * num_pd_disks; in megasas_dcmd_cfg_read()
1369 info->spares_count = 0; in megasas_dcmd_cfg_read()
1370 info->spares_size = sizeof(struct mfi_spare); in megasas_dcmd_cfg_read()
1371 info->size = sizeof(struct mfi_config_data) + info->array_size + in megasas_dcmd_cfg_read()
1372 info->log_drv_size; in megasas_dcmd_cfg_read()
1373 if (info->size > 4096) { in megasas_dcmd_cfg_read()
1380 QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) { in megasas_dcmd_cfg_read()
1381 SCSIDevice *sdev = SCSI_DEVICE(kid->child); in megasas_dcmd_cfg_read()
1382 uint16_t sdev_id = ((sdev->id & 0xFF) << 8) | (sdev->lun & 0xFF); in megasas_dcmd_cfg_read()
1389 blk_get_geometry(sdev->conf.blk, &pd_size); in megasas_dcmd_cfg_read()
1390 array->size = cpu_to_le64(pd_size); in megasas_dcmd_cfg_read()
1391 array->num_drives = 1; in megasas_dcmd_cfg_read()
1392 array->array_ref = cpu_to_le16(sdev_id); in megasas_dcmd_cfg_read()
1393 array->pd[0].ref.v.device_id = cpu_to_le16(sdev_id); in megasas_dcmd_cfg_read()
1394 array->pd[0].ref.v.seq_num = 0; in megasas_dcmd_cfg_read()
1395 array->pd[0].fw_state = MFI_PD_STATE_ONLINE; in megasas_dcmd_cfg_read()
1396 array->pd[0].encl.pd = 0xFF; in megasas_dcmd_cfg_read()
1397 array->pd[0].encl.slot = (sdev->id & 0xFF); in megasas_dcmd_cfg_read()
1399 array->pd[i].ref.v.device_id = 0xFFFF; in megasas_dcmd_cfg_read()
1400 array->pd[i].ref.v.seq_num = 0; in megasas_dcmd_cfg_read()
1401 array->pd[i].fw_state = MFI_PD_STATE_UNCONFIGURED_GOOD; in megasas_dcmd_cfg_read()
1402 array->pd[i].encl.pd = 0xFF; in megasas_dcmd_cfg_read()
1403 array->pd[i].encl.slot = 0xFF; in megasas_dcmd_cfg_read()
1408 ld->properties.ld.v.target_id = sdev->id; in megasas_dcmd_cfg_read()
1409 ld->properties.default_cache_policy = MR_LD_CACHE_READ_AHEAD | in megasas_dcmd_cfg_read()
1411 ld->properties.current_cache_policy = MR_LD_CACHE_READ_AHEAD | in megasas_dcmd_cfg_read()
1413 ld->params.state = MFI_LD_STATE_OPTIMAL; in megasas_dcmd_cfg_read()
1414 ld->params.stripe_size = 3; in megasas_dcmd_cfg_read()
1415 ld->params.num_drives = 1; in megasas_dcmd_cfg_read()
1416 ld->params.span_depth = 1; in megasas_dcmd_cfg_read()
1417 ld->params.is_consistent = 1; in megasas_dcmd_cfg_read()
1418 ld->span[0].start_block = 0; in megasas_dcmd_cfg_read()
1419 ld->span[0].num_blocks = cpu_to_le64(pd_size); in megasas_dcmd_cfg_read()
1420 ld->span[0].array_ref = cpu_to_le16(sdev_id); 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()
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()
1471 s->fw_state = MFI_FWSTATE_READY; in megasas_ctrl_shutdown()
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()
1484 for (i = 0; i < s->fw_cmds; i++) { in megasas_cluster_reset_ld()
1485 MegasasCmd *tmp_cmd = &s->frames[i]; in megasas_cluster_reset_ld()
1486 if (tmp_cmd->req && tmp_cmd->req->dev->id == target_id) { in megasas_cluster_reset_ld()
1487 SCSIDevice *d = tmp_cmd->req->dev; in megasas_cluster_reset_ld()
1488 device_cold_reset(&d->qdev); in megasas_cluster_reset_ld()
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()
1511 trace_megasas_dcmd_dummy(cmd->index, cmd->iov_size); in megasas_dcmd_dummy()
1612 { -1, NULL, NULL }
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()
1626 while (cmdptr->opcode != -1 && cmdptr->opcode != cmd->dcmd_opcode) { in megasas_handle_dcmd()
1629 len = cmd->iov_size; in megasas_handle_dcmd()
1630 if (cmdptr->opcode == -1) { in megasas_handle_dcmd()
1631 trace_megasas_dcmd_unhandled(cmd->index, cmd->dcmd_opcode, len); 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()
1647 int lun = req->lun; in megasas_finish_internal_dcmd()
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()
1673 len = scsi_req_enqueue(cmd->req); in megasas_enqueue_req()
1675 len = -len; 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()
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()
1723 sdev = scsi_device_find(&s->bus, 0, target_id, lun_id); 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()
1740 cmd->frame->header.scsi_status = CHECK_CONDITION; in megasas_handle_scsi()
1741 s->event_count++; in megasas_handle_scsi()
1745 if (megasas_map_sgl(s, cmd, &cmd->frame->pass.sgl)) { in megasas_handle_scsi()
1747 cmd->frame->header.scsi_status = CHECK_CONDITION; in megasas_handle_scsi()
1748 s->event_count++; 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()
1757 cmd->frame->header.scsi_status = BUSY; in megasas_handle_scsi()
1758 s->event_count++; 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()
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()
1795 sdev = scsi_device_find(&s->bus, 0, target_id, lun_id); in megasas_handle_io()
1798 trace_megasas_handle_io(cmd->index, in megasas_handle_io()
1802 trace_megasas_io_target_not_present(cmd->index, in megasas_handle_io()
1807 cmd->iov_size = lba_count * sdev->blocksize; in megasas_handle_io()
1808 if (megasas_map_sgl(s, cmd, &cmd->frame->io.sgl)) { in megasas_handle_io()
1810 cmd->frame->header.scsi_status = CHECK_CONDITION; in megasas_handle_io()
1811 s->event_count++; in megasas_handle_io()
1816 cmd->req = scsi_req_new(sdev, cmd->index, in megasas_handle_io()
1818 if (!cmd->req) { in megasas_handle_io()
1822 cmd->frame->header.scsi_status = BUSY; in megasas_handle_io()
1823 s->event_count++; in megasas_handle_io()
1829 trace_megasas_io_write_start(cmd->index, lba_start, lba_count, len); in megasas_handle_io()
1831 trace_megasas_io_read_start(cmd->index, lba_start, lba_count, len); in megasas_handle_io()
1839 MegasasCmd *cmd = req->hba_private; in megasas_get_sg_list()
1841 if (cmd->dcmd_opcode != -1) { in megasas_get_sg_list()
1844 return &cmd->qsg; in megasas_get_sg_list()
1850 MegasasCmd *cmd = req->hba_private; in megasas_xfer_complete()
1853 trace_megasas_io_complete(cmd->index, len); in megasas_xfer_complete()
1855 if (cmd->dcmd_opcode != -1) { in megasas_xfer_complete()
1861 if (cmd->dcmd_opcode == MFI_DCMD_PD_GET_INFO && cmd->iov_buf) { in megasas_xfer_complete()
1862 struct mfi_pd_info *info = cmd->iov_buf; in megasas_xfer_complete()
1864 if (info->inquiry_data[0] == 0x7f) { in megasas_xfer_complete()
1865 memset(info->inquiry_data, 0, sizeof(info->inquiry_data)); in megasas_xfer_complete()
1866 memcpy(info->inquiry_data, buf, len); in megasas_xfer_complete()
1867 } else if (info->vpd_page83[0] == 0x7f) { in megasas_xfer_complete()
1868 memset(info->vpd_page83, 0, sizeof(info->vpd_page83)); in megasas_xfer_complete()
1869 memcpy(info->vpd_page83, buf, len); in megasas_xfer_complete()
1872 } else if (cmd->dcmd_opcode == MFI_DCMD_LD_GET_INFO) { in megasas_xfer_complete()
1873 struct mfi_ld_info *info = cmd->iov_buf; in megasas_xfer_complete()
1875 if (cmd->iov_buf) { in megasas_xfer_complete()
1876 memcpy(info->vpd_page83, buf, sizeof(info->vpd_page83)); in megasas_xfer_complete()
1884 MegasasCmd *cmd = req->hba_private; in megasas_command_complete()
1887 trace_megasas_command_complete(cmd->index, req->status, residual); in megasas_command_complete()
1889 if (req->io_canceled) { in megasas_command_complete()
1893 if (cmd->dcmd_opcode != -1) { in megasas_command_complete()
1902 trace_megasas_scsi_complete(cmd->index, req->status, in megasas_command_complete()
1903 cmd->iov_size, req->cmd.xfer); in megasas_command_complete()
1904 if (req->status != GOOD) { in megasas_command_complete()
1907 if (req->status == CHECK_CONDITION) { in megasas_command_complete()
1911 cmd->frame->header.scsi_status = req->status; in megasas_command_complete()
1913 cmd->frame->header.cmd_status = cmd_status; in megasas_command_complete()
1919 MegasasCmd *cmd = req->hba_private; in megasas_command_cancelled()
1924 cmd->frame->header.cmd_status = MFI_STAT_SCSI_IO_FAILED; in megasas_command_cancelled()
1930 uint64_t abort_ctx = le64_to_cpu(cmd->frame->abort.abort_context); in megasas_handle_abort()
1934 addr_hi = le32_to_cpu(cmd->frame->abort.abort_mfi_addr_hi); in megasas_handle_abort()
1935 addr_lo = le32_to_cpu(cmd->frame->abort.abort_mfi_addr_lo); in megasas_handle_abort()
1940 trace_megasas_abort_no_cmd(cmd->index, abort_ctx); in megasas_handle_abort()
1941 s->event_count++; in megasas_handle_abort()
1947 if (abort_cmd->context != abort_ctx) { in megasas_handle_abort()
1948 trace_megasas_abort_invalid_context(cmd->index, abort_cmd->context, in megasas_handle_abort()
1949 abort_cmd->index); in megasas_handle_abort()
1950 s->event_count++; in megasas_handle_abort()
1953 trace_megasas_abort_frame(cmd->index, abort_cmd->index); in megasas_handle_abort()
1955 if (!s->event_cmd || abort_cmd != s->event_cmd) { in megasas_handle_abort()
1956 s->event_cmd = NULL; in megasas_handle_abort()
1958 s->event_count++; in megasas_handle_abort()
1983 s->event_count++; in megasas_handle_frame()
1986 frame_cmd = cmd->frame->header.frame_cmd; in megasas_handle_frame()
2006 trace_megasas_unhandled_frame_cmd(cmd->index, frame_cmd); in megasas_handle_frame()
2007 s->event_count++; in megasas_handle_frame()
2011 if (cmd->frame) { in megasas_handle_frame()
2012 cmd->frame->header.cmd_status = frame_status; in megasas_handle_frame()
2017 megasas_complete_frame(s, cmd->context); in megasas_handle_frame()
2037 (s->fw_state & MFI_FWSTATE_MASK) | in megasas_mmio_read()
2038 ((s->fw_sge & 0xff) << 16) | in megasas_mmio_read()
2039 (s->fw_cmds & 0xFFFF); in megasas_mmio_read()
2044 if (megasas_intr_enabled(s) && s->doorbell) { in megasas_mmio_read()
2045 retval = base_class->osts; in megasas_mmio_read()
2050 retval = s->intr_mask; in megasas_mmio_read()
2054 retval = s->doorbell ? 1 : 0; in megasas_mmio_read()
2058 retval = s->diag; in megasas_mmio_read()
2088 for (i = 0; i < s->fw_cmds; i++) { in megasas_mmio_write()
2089 megasas_abort_command(&s->frames[i]); in megasas_mmio_write()
2101 s->fw_state = MFI_FWSTATE_FAULT; in megasas_mmio_write()
2106 s->intr_mask = val; in megasas_mmio_write()
2128 s->doorbell = 0; in megasas_mmio_write()
2139 s->frame_hi = val; in megasas_mmio_write()
2149 s->frame_hi = 0; in megasas_mmio_write()
2153 frame_addr |= ((uint64_t)s->frame_hi << 32); in megasas_mmio_write()
2154 s->frame_hi = 0; in megasas_mmio_write()
2161 if (adp_reset_seq[s->adp_reset++] == val) { in megasas_mmio_write()
2162 if (s->adp_reset == 6) { in megasas_mmio_write()
2163 s->adp_reset = 0; in megasas_mmio_write()
2164 s->diag = MFI_DIAG_WRITE_ENABLE; in megasas_mmio_write()
2167 s->adp_reset = 0; in megasas_mmio_write()
2168 s->diag = 0; in megasas_mmio_write()
2174 if ((s->diag & MFI_DIAG_WRITE_ENABLE) && in megasas_mmio_write()
2176 s->diag |= MFI_DIAG_RESET_ADP; in megasas_mmio_write()
2178 s->adp_reset = 0; in megasas_mmio_write()
2179 s->diag = 0; in megasas_mmio_write()
2247 trace_megasas_reset(s->fw_state); in megasas_soft_reset()
2248 for (i = 0; i < s->fw_cmds; i++) { in megasas_soft_reset()
2249 cmd = &s->frames[i]; in megasas_soft_reset()
2252 if (s->fw_state == MFI_FWSTATE_READY) { in megasas_soft_reset()
2260 QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) { in megasas_soft_reset()
2261 SCSIDevice *sdev = SCSI_DEVICE(kid->child); in megasas_soft_reset()
2263 sdev->unit_attention = SENSE_CODE(NO_SENSE); in megasas_soft_reset()
2268 s->reply_queue_len = s->fw_cmds; in megasas_soft_reset()
2269 s->reply_queue_pa = 0; in megasas_soft_reset()
2270 s->consumer_pa = 0; in megasas_soft_reset()
2271 s->producer_pa = 0; in megasas_soft_reset()
2272 s->fw_state = MFI_FWSTATE_READY; in megasas_soft_reset()
2273 s->doorbell = 0; in megasas_soft_reset()
2274 s->intr_mask = MEGASAS_INTR_DISABLED_MASK; in megasas_soft_reset()
2275 s->frame_hi = 0; in megasas_soft_reset()
2276 s->flags &= ~MEGASAS_MASK_USE_QUEUE64; in megasas_soft_reset()
2277 s->event_count++; in megasas_soft_reset()
2278 s->boot_event = s->event_count; in megasas_soft_reset()
2307 .name = "megasas-gen2",
2329 msix_uninit(d, &s->mmio_io, &s->mmio_io); in megasas_scsi_uninit()
2355 pci_conf = dev->config; in megasas_scsi_realize()
2362 if (s->msi != ON_OFF_AUTO_OFF) { in megasas_scsi_realize()
2364 /* Any error other than -ENOTSUP(board's MSI support is broken) in megasas_scsi_realize()
2366 assert(!ret || ret == -ENOTSUP); in megasas_scsi_realize()
2367 if (ret && s->msi == ON_OFF_AUTO_ON) { in megasas_scsi_realize()
2375 s->msi = ON_OFF_AUTO_OFF; in megasas_scsi_realize()
2380 memory_region_init_io(&s->mmio_io, OBJECT(s), &megasas_mmio_ops, s, in megasas_scsi_realize()
2381 "megasas-mmio", 0x4000); in megasas_scsi_realize()
2382 memory_region_init_io(&s->port_io, OBJECT(s), &megasas_port_ops, s, in megasas_scsi_realize()
2383 "megasas-io", 256); in megasas_scsi_realize()
2384 memory_region_init_io(&s->queue_io, OBJECT(s), &megasas_queue_ops, s, in megasas_scsi_realize()
2385 "megasas-queue", 0x40000); in megasas_scsi_realize()
2388 msix_init(dev, 15, &s->mmio_io, b->mmio_bar, 0x2000, in megasas_scsi_realize()
2389 &s->mmio_io, b->mmio_bar, 0x3800, 0x68, NULL)) { in megasas_scsi_realize()
2391 s->msix = ON_OFF_AUTO_OFF; in megasas_scsi_realize()
2399 pci_register_bar(dev, b->ioport_bar, in megasas_scsi_realize()
2400 PCI_BASE_ADDRESS_SPACE_IO, &s->port_io); in megasas_scsi_realize()
2401 pci_register_bar(dev, b->mmio_bar, bar_type, &s->mmio_io); in megasas_scsi_realize()
2402 pci_register_bar(dev, 3, bar_type, &s->queue_io); in megasas_scsi_realize()
2408 s->fw_state = MFI_FWSTATE_READY; in megasas_scsi_realize()
2409 if (!s->sas_addr) { in megasas_scsi_realize()
2410 s->sas_addr = ((NAA_LOCALLY_ASSIGNED_ID << 24) | in megasas_scsi_realize()
2412 s->sas_addr |= pci_dev_bus_num(dev) << 16; in megasas_scsi_realize()
2413 s->sas_addr |= PCI_SLOT(dev->devfn) << 8; in megasas_scsi_realize()
2414 s->sas_addr |= PCI_FUNC(dev->devfn); in megasas_scsi_realize()
2416 if (!s->hba_serial) { in megasas_scsi_realize()
2417 s->hba_serial = g_strdup(MEGASAS_HBA_SERIAL); in megasas_scsi_realize()
2420 sge = s->fw_sge + MFI_PASS_FRAME_SIZE; in megasas_scsi_realize()
2426 s->fw_sge = sge - MFI_PASS_FRAME_SIZE; in megasas_scsi_realize()
2428 if (s->fw_cmds > MEGASAS_MAX_FRAMES) { in megasas_scsi_realize()
2429 s->fw_cmds = MEGASAS_MAX_FRAMES; in megasas_scsi_realize()
2431 trace_megasas_init(s->fw_sge, s->fw_cmds, in megasas_scsi_realize()
2435 s->fw_luns = MFI_MAX_SYS_PDS; in megasas_scsi_realize()
2437 s->fw_luns = MFI_MAX_LD; in megasas_scsi_realize()
2439 s->producer_pa = 0; in megasas_scsi_realize()
2440 s->consumer_pa = 0; in megasas_scsi_realize()
2441 for (i = 0; i < s->fw_cmds; i++) { in megasas_scsi_realize()
2442 s->frames[i].index = i; in megasas_scsi_realize()
2443 s->frames[i].context = -1; in megasas_scsi_realize()
2444 s->frames[i].pa = 0; in megasas_scsi_realize()
2445 s->frames[i].state = s; in megasas_scsi_realize()
2448 scsi_bus_init(&s->bus, sizeof(s->bus), DEVICE(dev), &megasas_scsi_info); in megasas_scsi_realize()
2514 .product_name = "LSI MegaRAID SAS 9260-8i",
2538 pc->realize = megasas_scsi_realize; in megasas_class_init()
2539 pc->exit = megasas_scsi_uninit; in megasas_class_init()
2540 pc->vendor_id = PCI_VENDOR_ID_LSI_LOGIC; in megasas_class_init()
2541 pc->device_id = info->device_id; in megasas_class_init()
2542 pc->subsystem_vendor_id = PCI_VENDOR_ID_LSI_LOGIC; in megasas_class_init()
2543 pc->subsystem_id = info->subsystem_id; in megasas_class_init()
2544 pc->class_id = PCI_CLASS_STORAGE_RAID; in megasas_class_init()
2545 e->mmio_bar = info->mmio_bar; in megasas_class_init()
2546 e->ioport_bar = info->ioport_bar; in megasas_class_init()
2547 e->osts = info->osts; in megasas_class_init()
2548 e->product_name = info->product_name; in megasas_class_init()
2549 e->product_version = info->product_version; in megasas_class_init()
2550 device_class_set_props_n(dc, info->props, info->props_count); in megasas_class_init()
2552 dc->vmsd = info->vmsd; in megasas_class_init()
2553 set_bit(DEVICE_CATEGORY_STORAGE, dc->categories); in megasas_class_init()
2554 dc->desc = info->desc; in megasas_class_init()
2574 type_info.name = info->name; in megasas_register_types()
2578 type_info.interfaces = info->interfaces; in megasas_register_types()