[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 04/35] megasas: fixup MFI_DCMD_LD_LIST_QUERY
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PULL 04/35] megasas: fixup MFI_DCMD_LD_LIST_QUERY |
Date: |
Fri, 31 Oct 2014 18:25:42 +0100 |
From: Hannes Reinecke <address@hidden>
The MFI_DCMD_LD_LIST_QUERY function is using a different format than
MFI_DCMD_LD_LIST, so we need to implement it differently.
Signed-off-by: Hannes Reinecke <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
---
hw/scsi/megasas.c | 37 ++++++++++++++++++++++++++++++++++---
hw/scsi/mfi.h | 7 +++++++
2 files changed, 41 insertions(+), 3 deletions(-)
diff --git a/hw/scsi/megasas.c b/hw/scsi/megasas.c
index 36a04f3..562c35b 100644
--- a/hw/scsi/megasas.c
+++ b/hw/scsi/megasas.c
@@ -1123,15 +1123,46 @@ static int megasas_dcmd_ld_get_list(MegasasState *s,
MegasasCmd *cmd)
static int megasas_dcmd_ld_list_query(MegasasState *s, MegasasCmd *cmd)
{
uint16_t flags;
+ struct mfi_ld_targetid_list info;
+ size_t dcmd_size = sizeof(info), resid;
+ uint32_t num_ld_disks = 0, max_ld_disks = s->fw_luns;
+ BusChild *kid;
/* mbox0 contains flags */
flags = le16_to_cpu(cmd->frame->dcmd.mbox[0]);
trace_megasas_dcmd_ld_list_query(cmd->index, flags);
- if (flags == MR_LD_QUERY_TYPE_ALL ||
- flags == MR_LD_QUERY_TYPE_EXPOSED_TO_HOST) {
- return megasas_dcmd_ld_get_list(s, cmd);
+ if (flags != MR_LD_QUERY_TYPE_ALL &&
+ flags != MR_LD_QUERY_TYPE_EXPOSED_TO_HOST) {
+ max_ld_disks = 0;
+ }
+
+ memset(&info, 0, dcmd_size);
+ if (cmd->iov_size < 12) {
+ trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size,
+ dcmd_size);
+ return MFI_STAT_INVALID_PARAMETER;
+ }
+ dcmd_size = sizeof(uint32_t) * 2 + 3;
+
+ if (megasas_is_jbod(s)) {
+ max_ld_disks = 0;
}
+ QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) {
+ SCSIDevice *sdev = DO_UPCAST(SCSIDevice, qdev, kid->child);
+ if (num_ld_disks >= max_ld_disks) {
+ break;
+ }
+ info.targetid[num_ld_disks] = sdev->lun;
+ num_ld_disks++;
+ dcmd_size++;
+ }
+ info.ld_count = cpu_to_le32(num_ld_disks);
+ info.size = dcmd_size;
+ trace_megasas_dcmd_ld_get_list(cmd->index, num_ld_disks, max_ld_disks);
+
+ resid = dma_buf_read((uint8_t *)&info, dcmd_size, &cmd->qsg);
+ cmd->iov_size = dcmd_size - resid;
return MFI_STAT_OK;
}
diff --git a/hw/scsi/mfi.h b/hw/scsi/mfi.h
index a3034f6..5050ce4 100644
--- a/hw/scsi/mfi.h
+++ b/hw/scsi/mfi.h
@@ -1111,6 +1111,13 @@ struct mfi_ld_list {
} ld_list[MFI_MAX_LD];
} QEMU_PACKED;
+struct mfi_ld_targetid_list {
+ uint32_t size;
+ uint32_t ld_count;
+ uint8_t pad[3];
+ uint8_t targetid[MFI_MAX_LD];
+} QEMU_PACKED;
+
enum mfi_ld_access {
MFI_LD_ACCESS_RW = 0,
MFI_LD_ACCSSS_RO = 2,
--
1.8.3.1
- [Qemu-devel] [PULL 00/35] Last batch of SCSI, KVM, ivshmem patches before soft freeze, Paolo Bonzini, 2014/10/31
- [Qemu-devel] [PULL 01/35] rules.mak: Allow .mo-objs and .mo-cflags in -y variables, Paolo Bonzini, 2014/10/31
- [Qemu-devel] [PULL 02/35] ui: Use the new ".mo-cflags" rule syntax for SDL_CFLAGS, Paolo Bonzini, 2014/10/31
- [Qemu-devel] [PULL 03/35] scsi: Rename scsi_*_length() to scsi_*_xfer(), add scsi_cdb_length(), Paolo Bonzini, 2014/10/31
- [Qemu-devel] [PULL 04/35] megasas: fixup MFI_DCMD_LD_LIST_QUERY,
Paolo Bonzini <=
- [Qemu-devel] [PULL 05/35] megasas: simplify trace event messages, Paolo Bonzini, 2014/10/31
- [Qemu-devel] [PULL 06/35] megasas: fixup device mapping, Paolo Bonzini, 2014/10/31
- [Qemu-devel] [PULL 07/35] megasas: add MegaRAID SAS 2108 emulation, Paolo Bonzini, 2014/10/31
- [Qemu-devel] [PULL 08/35] megasas: Fix typo in megasas_dcmd_ld_get_list(), Paolo Bonzini, 2014/10/31
- [Qemu-devel] [PULL 09/35] megasas: Decode register names, Paolo Bonzini, 2014/10/31
- [Qemu-devel] [PULL 10/35] megasas: Clear unit attention on initial reset, Paolo Bonzini, 2014/10/31
- [Qemu-devel] [PULL 11/35] megasas: Ignore duplicate init_firmware commands, Paolo Bonzini, 2014/10/31
- [Qemu-devel] [PULL 12/35] megasas: Implement DCMD_CLUSTER_RESET_LD, Paolo Bonzini, 2014/10/31
- [Qemu-devel] [PULL 13/35] megasas: Update queue logging, Paolo Bonzini, 2014/10/31
- [Qemu-devel] [PULL 14/35] megasas: Rework frame queueing algorithm, Paolo Bonzini, 2014/10/31