|
@@ -750,6 +750,7 @@ static int megasas_ctrl_get_info(MegasasState *s, MegasasCmd *cmd)
|
|
|
size_t dcmd_size = sizeof(info);
|
|
|
BusChild *kid;
|
|
|
int num_pd_disks = 0;
|
|
|
+ dma_addr_t residual;
|
|
|
|
|
|
memset(&info, 0x0, dcmd_size);
|
|
|
if (cmd->iov_size < dcmd_size) {
|
|
@@ -860,7 +861,9 @@ static int megasas_ctrl_get_info(MegasasState *s, MegasasCmd *cmd)
|
|
|
MFI_INFO_PDMIX_SATA |
|
|
|
MFI_INFO_PDMIX_LD);
|
|
|
|
|
|
- cmd->iov_size -= dma_buf_read(&info, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
|
|
|
+ dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg,
|
|
|
+ MEMTXATTRS_UNSPECIFIED);
|
|
|
+ cmd->iov_size -= residual;
|
|
|
return MFI_STAT_OK;
|
|
|
}
|
|
|
|
|
@@ -868,6 +871,7 @@ static int megasas_mfc_get_defaults(MegasasState *s, MegasasCmd *cmd)
|
|
|
{
|
|
|
struct mfi_defaults info;
|
|
|
size_t dcmd_size = sizeof(struct mfi_defaults);
|
|
|
+ dma_addr_t residual;
|
|
|
|
|
|
memset(&info, 0x0, dcmd_size);
|
|
|
if (cmd->iov_size < dcmd_size) {
|
|
@@ -890,7 +894,9 @@ static int megasas_mfc_get_defaults(MegasasState *s, MegasasCmd *cmd)
|
|
|
info.disable_preboot_cli = 1;
|
|
|
info.cluster_disable = 1;
|
|
|
|
|
|
- cmd->iov_size -= dma_buf_read(&info, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
|
|
|
+ dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg,
|
|
|
+ MEMTXATTRS_UNSPECIFIED);
|
|
|
+ cmd->iov_size -= residual;
|
|
|
return MFI_STAT_OK;
|
|
|
}
|
|
|
|
|
@@ -898,6 +904,7 @@ static int megasas_dcmd_get_bios_info(MegasasState *s, MegasasCmd *cmd)
|
|
|
{
|
|
|
struct mfi_bios_data info;
|
|
|
size_t dcmd_size = sizeof(info);
|
|
|
+ dma_addr_t residual;
|
|
|
|
|
|
memset(&info, 0x0, dcmd_size);
|
|
|
if (cmd->iov_size < dcmd_size) {
|
|
@@ -911,7 +918,9 @@ static int megasas_dcmd_get_bios_info(MegasasState *s, MegasasCmd *cmd)
|
|
|
info.expose_all_drives = 1;
|
|
|
}
|
|
|
|
|
|
- cmd->iov_size -= dma_buf_read(&info, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
|
|
|
+ dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg,
|
|
|
+ MEMTXATTRS_UNSPECIFIED);
|
|
|
+ cmd->iov_size -= residual;
|
|
|
return MFI_STAT_OK;
|
|
|
}
|
|
|
|
|
@@ -919,10 +928,13 @@ static int megasas_dcmd_get_fw_time(MegasasState *s, MegasasCmd *cmd)
|
|
|
{
|
|
|
uint64_t fw_time;
|
|
|
size_t dcmd_size = sizeof(fw_time);
|
|
|
+ dma_addr_t residual;
|
|
|
|
|
|
fw_time = cpu_to_le64(megasas_fw_time());
|
|
|
|
|
|
- cmd->iov_size -= dma_buf_read(&fw_time, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
|
|
|
+ dma_buf_read(&fw_time, dcmd_size, &residual, &cmd->qsg,
|
|
|
+ MEMTXATTRS_UNSPECIFIED);
|
|
|
+ cmd->iov_size -= residual;
|
|
|
return MFI_STAT_OK;
|
|
|
}
|
|
|
|
|
@@ -942,6 +954,7 @@ static int megasas_event_info(MegasasState *s, MegasasCmd *cmd)
|
|
|
{
|
|
|
struct mfi_evt_log_state info;
|
|
|
size_t dcmd_size = sizeof(info);
|
|
|
+ dma_addr_t residual;
|
|
|
|
|
|
memset(&info, 0, dcmd_size);
|
|
|
|
|
@@ -949,7 +962,9 @@ static int megasas_event_info(MegasasState *s, MegasasCmd *cmd)
|
|
|
info.shutdown_seq_num = cpu_to_le32(s->shutdown_event);
|
|
|
info.boot_seq_num = cpu_to_le32(s->boot_event);
|
|
|
|
|
|
- cmd->iov_size -= dma_buf_read(&info, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
|
|
|
+ dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg,
|
|
|
+ MEMTXATTRS_UNSPECIFIED);
|
|
|
+ cmd->iov_size -= residual;
|
|
|
return MFI_STAT_OK;
|
|
|
}
|
|
|
|
|
@@ -979,6 +994,7 @@ static int megasas_dcmd_pd_get_list(MegasasState *s, MegasasCmd *cmd)
|
|
|
size_t dcmd_size = sizeof(info);
|
|
|
BusChild *kid;
|
|
|
uint32_t offset, dcmd_limit, num_pd_disks = 0, max_pd_disks;
|
|
|
+ dma_addr_t residual;
|
|
|
|
|
|
memset(&info, 0, dcmd_size);
|
|
|
offset = 8;
|
|
@@ -1018,7 +1034,9 @@ static int megasas_dcmd_pd_get_list(MegasasState *s, MegasasCmd *cmd)
|
|
|
info.size = cpu_to_le32(offset);
|
|
|
info.count = cpu_to_le32(num_pd_disks);
|
|
|
|
|
|
- cmd->iov_size -= dma_buf_read(&info, offset, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
|
|
|
+ dma_buf_read(&info, offset, &residual, &cmd->qsg,
|
|
|
+ MEMTXATTRS_UNSPECIFIED);
|
|
|
+ cmd->iov_size -= residual;
|
|
|
return MFI_STAT_OK;
|
|
|
}
|
|
|
|
|
@@ -1113,8 +1131,9 @@ static int megasas_pd_get_info_submit(SCSIDevice *sdev, int lun,
|
|
|
info->connected_port_bitmap = 0x1;
|
|
|
info->device_speed = 1;
|
|
|
info->link_speed = 1;
|
|
|
- residual = dma_buf_read(cmd->iov_buf, dcmd_size, &cmd->qsg,
|
|
|
- MEMTXATTRS_UNSPECIFIED);
|
|
|
+ dma_buf_read(cmd->iov_buf, dcmd_size, &residual, &cmd->qsg,
|
|
|
+ MEMTXATTRS_UNSPECIFIED);
|
|
|
+ cmd->iov_size -= residual;
|
|
|
g_free(cmd->iov_buf);
|
|
|
cmd->iov_size = dcmd_size - residual;
|
|
|
cmd->iov_buf = NULL;
|
|
@@ -1187,8 +1206,8 @@ static int megasas_dcmd_ld_get_list(MegasasState *s, MegasasCmd *cmd)
|
|
|
info.ld_count = cpu_to_le32(num_ld_disks);
|
|
|
trace_megasas_dcmd_ld_get_list(cmd->index, num_ld_disks, max_ld_disks);
|
|
|
|
|
|
- residual = dma_buf_read(&info, dcmd_size, &cmd->qsg,
|
|
|
- MEMTXATTRS_UNSPECIFIED);
|
|
|
+ dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg,
|
|
|
+ MEMTXATTRS_UNSPECIFIED);
|
|
|
cmd->iov_size = dcmd_size - residual;
|
|
|
return MFI_STAT_OK;
|
|
|
}
|
|
@@ -1238,8 +1257,8 @@ static int megasas_dcmd_ld_list_query(MegasasState *s, MegasasCmd *cmd)
|
|
|
info.size = dcmd_size;
|
|
|
trace_megasas_dcmd_ld_get_list(cmd->index, num_ld_disks, max_ld_disks);
|
|
|
|
|
|
- residual = dma_buf_read(&info, dcmd_size, &cmd->qsg,
|
|
|
- MEMTXATTRS_UNSPECIFIED);
|
|
|
+ dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg,
|
|
|
+ MEMTXATTRS_UNSPECIFIED);
|
|
|
cmd->iov_size = dcmd_size - residual;
|
|
|
return MFI_STAT_OK;
|
|
|
}
|
|
@@ -1290,8 +1309,8 @@ static int megasas_ld_get_info_submit(SCSIDevice *sdev, int lun,
|
|
|
info->ld_config.span[0].num_blocks = info->size;
|
|
|
info->ld_config.span[0].array_ref = cpu_to_le16(sdev_id);
|
|
|
|
|
|
- residual = dma_buf_read(cmd->iov_buf, dcmd_size, &cmd->qsg,
|
|
|
- MEMTXATTRS_UNSPECIFIED);
|
|
|
+ dma_buf_read(cmd->iov_buf, dcmd_size, &residual, &cmd->qsg,
|
|
|
+ MEMTXATTRS_UNSPECIFIED);
|
|
|
g_free(cmd->iov_buf);
|
|
|
cmd->iov_size = dcmd_size - residual;
|
|
|
cmd->iov_buf = NULL;
|
|
@@ -1336,6 +1355,7 @@ static int megasas_dcmd_cfg_read(MegasasState *s, MegasasCmd *cmd)
|
|
|
struct mfi_config_data *info;
|
|
|
int num_pd_disks = 0, array_offset, ld_offset;
|
|
|
BusChild *kid;
|
|
|
+ dma_addr_t residual;
|
|
|
|
|
|
if (cmd->iov_size > 4096) {
|
|
|
return MFI_STAT_INVALID_PARAMETER;
|
|
@@ -1410,7 +1430,9 @@ static int megasas_dcmd_cfg_read(MegasasState *s, MegasasCmd *cmd)
|
|
|
ld_offset += sizeof(struct mfi_ld_config);
|
|
|
}
|
|
|
|
|
|
- cmd->iov_size -= dma_buf_read(data, info->size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
|
|
|
+ dma_buf_read(data, info->size, &residual, &cmd->qsg,
|
|
|
+ MEMTXATTRS_UNSPECIFIED);
|
|
|
+ cmd->iov_size -= residual;
|
|
|
return MFI_STAT_OK;
|
|
|
}
|
|
|
|
|
@@ -1418,6 +1440,7 @@ static int megasas_dcmd_get_properties(MegasasState *s, MegasasCmd *cmd)
|
|
|
{
|
|
|
struct mfi_ctrl_props info;
|
|
|
size_t dcmd_size = sizeof(info);
|
|
|
+ dma_addr_t residual;
|
|
|
|
|
|
memset(&info, 0x0, dcmd_size);
|
|
|
if (cmd->iov_size < dcmd_size) {
|
|
@@ -1440,7 +1463,9 @@ static int megasas_dcmd_get_properties(MegasasState *s, MegasasCmd *cmd)
|
|
|
info.ecc_bucket_leak_rate = cpu_to_le16(1440);
|
|
|
info.expose_encl_devices = 1;
|
|
|
|
|
|
- cmd->iov_size -= dma_buf_read(&info, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
|
|
|
+ dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg,
|
|
|
+ MEMTXATTRS_UNSPECIFIED);
|
|
|
+ cmd->iov_size -= residual;
|
|
|
return MFI_STAT_OK;
|
|
|
}
|
|
|
|
|
@@ -1485,7 +1510,7 @@ static int megasas_dcmd_set_properties(MegasasState *s, MegasasCmd *cmd)
|
|
|
dcmd_size);
|
|
|
return MFI_STAT_INVALID_PARAMETER;
|
|
|
}
|
|
|
- dma_buf_write(&info, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
|
|
|
+ dma_buf_write(&info, dcmd_size, NULL, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
|
|
|
trace_megasas_dcmd_unsupported(cmd->index, cmd->iov_size);
|
|
|
return MFI_STAT_OK;
|
|
|
}
|