From 874ac6c0f8cdd8ecfd6730d17c71969eef7b9e13 Mon Sep 17 00:00:00 2001 From: Andrey Gusakov Date: Thu, 13 Feb 2025 17:37:20 +0300 Subject: [PATCH] lib_scsi: configurable size of read/write buffer --- os/various/lib_scsi.c | 14 +++++++++----- os/various/lib_scsi.h | 6 +++++- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/os/various/lib_scsi.c b/os/various/lib_scsi.c index 720a90fa..64bd7b5b 100644 --- a/os/various/lib_scsi.c +++ b/os/various/lib_scsi.c @@ -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) ? (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; diff --git a/os/various/lib_scsi.h b/os/various/lib_scsi.h index e7677e09..b878eeea 100644 --- a/os/various/lib_scsi.h +++ b/os/various/lib_scsi.h @@ -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. */