scsi_lib: divide data_read_write_10 into two functions
This commit is contained in:
parent
2f52cc19db
commit
f11b5c52f3
|
@ -340,7 +340,7 @@ static bool data_overflow(SCSITarget *scsip, const data_request_t *req) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief SCSI read/write (10) command handler.
|
* @brief SCSI read (10) command handler.
|
||||||
*
|
*
|
||||||
* @param[in] scsip pointer to @p SCSITarget structure
|
* @param[in] scsip pointer to @p SCSITarget structure
|
||||||
* @param[in] cmd pointer to SCSI command data
|
* @param[in] cmd pointer to SCSI command data
|
||||||
|
@ -349,7 +349,45 @@ static bool data_overflow(SCSITarget *scsip, const data_request_t *req) {
|
||||||
*
|
*
|
||||||
* @notapi
|
* @notapi
|
||||||
*/
|
*/
|
||||||
static bool data_read_write10(SCSITarget *scsip, const uint8_t *cmd) {
|
static bool data_read10(SCSITarget *scsip, const uint8_t *cmd) {
|
||||||
|
data_request_t req = decode_data_request(cmd);
|
||||||
|
|
||||||
|
if (data_overflow(scsip, &req)) {
|
||||||
|
return SCSI_FAILED;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const SCSITransport *tr = scsip->config->transport;
|
||||||
|
BaseBlockDevice *blkdev = scsip->config->blkdev;
|
||||||
|
BlockDeviceInfo bdi;
|
||||||
|
blkGetInfo(blkdev, &bdi);
|
||||||
|
size_t bs = bdi.blk_size;
|
||||||
|
uint8_t *buf = scsip->config->blkbuf;
|
||||||
|
uint32_t n_bufs = scsip->config->blkbufsize / bs;
|
||||||
|
|
||||||
|
size_t i = 0;
|
||||||
|
while (i < req.blk_cnt) {
|
||||||
|
size_t n = n_bufs > (req.blk_cnt - i) ? (req.blk_cnt - i) : n_bufs;
|
||||||
|
|
||||||
|
// TODO: block error handling
|
||||||
|
blkRead(blkdev, req.first_lba + i, buf, n);
|
||||||
|
tr->transmit(tr, buf, bs * n);
|
||||||
|
i += n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return SCSI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SCSI write (10) command handler.
|
||||||
|
*
|
||||||
|
* @param[in] scsip pointer to @p SCSITarget structure
|
||||||
|
* @param[in] cmd pointer to SCSI command data
|
||||||
|
*
|
||||||
|
* @return The operation status.
|
||||||
|
*
|
||||||
|
* @notapi
|
||||||
|
*/
|
||||||
|
static bool data_write10(SCSITarget *scsip, const uint8_t *cmd) {
|
||||||
|
|
||||||
data_request_t req = decode_data_request(cmd);
|
data_request_t req = decode_data_request(cmd);
|
||||||
|
|
||||||
|
@ -369,16 +407,9 @@ static bool data_read_write10(SCSITarget *scsip, const uint8_t *cmd) {
|
||||||
while (i < req.blk_cnt) {
|
while (i < req.blk_cnt) {
|
||||||
size_t n = n_bufs > (req.blk_cnt - i) ? (req.blk_cnt - i) : n_bufs;
|
size_t n = n_bufs > (req.blk_cnt - i) ? (req.blk_cnt - i) : n_bufs;
|
||||||
|
|
||||||
if (cmd[0] == SCSI_CMD_READ_10) {
|
|
||||||
// TODO: block error handling
|
|
||||||
blkRead(blkdev, req.first_lba + i, buf, n);
|
|
||||||
tr->transmit(tr, buf, bs * n);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// TODO: block error handling
|
// TODO: block error handling
|
||||||
tr->receive(tr, buf, bs * n);
|
tr->receive(tr, buf, bs * n);
|
||||||
blkWrite(blkdev, req.first_lba + i, buf, n);
|
blkWrite(blkdev, req.first_lba + i, buf, n);
|
||||||
}
|
|
||||||
i += n;
|
i += n;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -448,12 +479,12 @@ bool scsiExecCmd(SCSITarget *scsip, const uint8_t *cmd) {
|
||||||
|
|
||||||
case SCSI_CMD_READ_10:
|
case SCSI_CMD_READ_10:
|
||||||
dbgprintf("SCSI_CMD_READ_10\r\n");
|
dbgprintf("SCSI_CMD_READ_10\r\n");
|
||||||
ret = data_read_write10(scsip, cmd);
|
ret = data_read10(scsip, cmd);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SCSI_CMD_WRITE_10:
|
case SCSI_CMD_WRITE_10:
|
||||||
dbgprintf("SCSI_CMD_WRITE_10\r\n");
|
dbgprintf("SCSI_CMD_WRITE_10\r\n");
|
||||||
ret = data_read_write10(scsip, cmd);
|
ret = data_write10(scsip, cmd);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SCSI_CMD_TEST_UNIT_READY:
|
case SCSI_CMD_TEST_UNIT_READY:
|
||||||
|
|
Loading…
Reference in New Issue