lib_scsi: configurable size of read/write buffer

This commit is contained in:
Andrey Gusakov 2025-02-13 17:37:20 +03:00
parent 63b50e410c
commit 874ac6c0f8
2 changed files with 14 additions and 6 deletions

View File

@ -363,19 +363,23 @@ static bool data_read_write10(SCSITarget *scsip, const uint8_t *cmd) {
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;
for (i=0; i<req.blk_cnt; i++) {
while (i < req.blk_cnt) {
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, 1);
tr->transmit(tr, buf, bs);
blkRead(blkdev, req.first_lba + i, buf, n);
tr->transmit(tr, buf, bs * n);
}
else {
// TODO: block error handling
tr->receive(tr, buf, bs);
blkWrite(blkdev, req.first_lba + i, buf, 1);
tr->receive(tr, buf, bs * n);
blkWrite(blkdev, req.first_lba + i, buf, n);
}
i += n;
}
}
return SCSI_SUCCESS;

View File

@ -229,9 +229,13 @@ typedef struct {
*/
BaseBlockDevice *blkdev;
/**
* @brief Pointer to data buffer for single block.
* @brief Pointer to data buffer.
*/
uint8_t *blkbuf;
/**
* brief Size of data buffer.
*/
uint32_t blkbufsize;
/**
* @brief Pointer to SCSI inquiry response object.
*/