scsi_periph: use synchronous command.
* The call waited anyway, so there is no reason to make it async.
This commit is contained in:
@@ -122,9 +122,6 @@ status_t
|
|||||||
periph_trim_device(scsi_periph_device_info *device, scsi_ccb *request,
|
periph_trim_device(scsi_periph_device_info *device, scsi_ccb *request,
|
||||||
scsi_block_range* ranges, uint32 rangeCount)
|
scsi_block_range* ranges, uint32 rangeCount)
|
||||||
{
|
{
|
||||||
err_res res;
|
|
||||||
int retries = 0;
|
|
||||||
|
|
||||||
size_t unmapBlockSize = (rangeCount - 1)
|
size_t unmapBlockSize = (rangeCount - 1)
|
||||||
* sizeof(scsi_unmap_block_descriptor)
|
* sizeof(scsi_unmap_block_descriptor)
|
||||||
+ sizeof(scsi_unmap_parameter_list);
|
+ sizeof(scsi_unmap_parameter_list);
|
||||||
@@ -155,35 +152,27 @@ periph_trim_device(scsi_periph_device_info *device, scsi_ccb *request,
|
|||||||
ranges[i].size / device->block_size);
|
ranges[i].size / device->block_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
request->flags = SCSI_DIR_OUT;
|
||||||
request->flags = SCSI_DIR_OUT;
|
request->sort = ranges[0].offset / device->block_size;
|
||||||
request->sort = ranges[0].offset / device->block_size;
|
request->timeout = device->std_timeout;
|
||||||
request->timeout = device->std_timeout;
|
|
||||||
|
|
||||||
scsi_cmd_unmap* cmd = (scsi_cmd_unmap*)request->cdb;
|
scsi_cmd_unmap* cmd = (scsi_cmd_unmap*)request->cdb;
|
||||||
|
|
||||||
memset(cmd, 0, sizeof(*cmd));
|
memset(cmd, 0, sizeof(*cmd));
|
||||||
cmd->opcode = SCSI_OP_UNMAP;
|
cmd->opcode = SCSI_OP_UNMAP;
|
||||||
cmd->length = B_HOST_TO_BENDIAN_INT16(unmapBlockSize);
|
cmd->length = B_HOST_TO_BENDIAN_INT16(unmapBlockSize);
|
||||||
|
|
||||||
request->data = (uint8*)unmapBlocks;
|
request->data = (uint8*)unmapBlocks;
|
||||||
request->data_length = unmapBlockSize;
|
request->data_length = unmapBlockSize;
|
||||||
|
|
||||||
request->cdb_length = sizeof(*cmd);
|
request->cdb_length = sizeof(*cmd);
|
||||||
|
|
||||||
device->scsi->async_io(request);
|
status_t status = periph_safe_exec(device, request);
|
||||||
|
|
||||||
acquire_sem(request->completion_sem);
|
|
||||||
|
|
||||||
// ask generic peripheral layer what to do now
|
|
||||||
res = periph_check_error(device, request);
|
|
||||||
} while ((res.action == err_act_retry && retries++ < 3)
|
|
||||||
|| (res.action == err_act_many_retries && retries++ < 30));
|
|
||||||
|
|
||||||
// peripheral layer only creates "read" error
|
// peripheral layer only creates "read" error
|
||||||
if (res.error_code == B_DEV_READ_ERROR)
|
if (status == B_DEV_READ_ERROR)
|
||||||
return B_DEV_WRITE_ERROR;
|
return B_DEV_WRITE_ERROR;
|
||||||
|
|
||||||
return res.error_code;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user