aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2022-09-21 16:21:37 +0200
committerSimon Glass <sjg@chromium.org>2022-09-25 08:30:05 -0600
commitfc7a7ed3a6cd9ea03400e1356768e646ff00b043 (patch)
treebda6322ffa6a2c491298735361b41fe59bad7bc3
parent1377d448a26aa67907ae86a84d33c02c7c9b9dcd (diff)
downloadu-boot-fc7a7ed3a6cd9ea03400e1356768e646ff00b043.zip
u-boot-fc7a7ed3a6cd9ea03400e1356768e646ff00b043.tar.gz
u-boot-fc7a7ed3a6cd9ea03400e1356768e646ff00b043.tar.bz2
sandbox: Move buffer to scsi_emul_info
Move the buffer into this struct so it can be shared between different implementations. Signed-off-by: Simon Glass <sjg@chromium.org>
-rw-r--r--drivers/usb/emul/sandbox_flash.c41
-rw-r--r--include/scsi_emul.h5
2 files changed, 35 insertions, 11 deletions
diff --git a/drivers/usb/emul/sandbox_flash.c b/drivers/usb/emul/sandbox_flash.c
index e7abc0d..3a9db83 100644
--- a/drivers/usb/emul/sandbox_flash.c
+++ b/drivers/usb/emul/sandbox_flash.c
@@ -7,6 +7,7 @@
#include <common.h>
#include <dm.h>
#include <log.h>
+#include <malloc.h>
#include <os.h>
#include <scsi.h>
#include <scsi_emul.h>
@@ -22,6 +23,7 @@ enum {
SANDBOX_FLASH_EP_OUT = 1, /* endpoints */
SANDBOX_FLASH_EP_IN = 2,
SANDBOX_FLASH_BLOCK_LEN = 512,
+ SANDBOX_FLASH_BUF_SIZE = 512,
};
enum {
@@ -41,7 +43,6 @@ enum {
* @fd: File descriptor of backing file
* @file_size: Size of file in bytes
* @status_buff: Data buffer for outgoing status
- * @buff: Data buffer for outgoing data
*/
struct sandbox_flash_priv {
struct scsi_emul_info eminfo;
@@ -50,7 +51,6 @@ struct sandbox_flash_priv {
int fd;
loff_t file_size;
struct umass_bbb_csw status;
- u8 buff[512];
};
struct sandbox_flash_plat {
@@ -210,7 +210,7 @@ static void setup_response(struct sandbox_flash_priv *priv, void *resp,
csw->dCSWDataResidue = 0;
csw->bCSWStatus = CSWSTATUS_GOOD;
- assert(!resp || resp == priv->buff);
+ assert(!resp || resp == info->buff);
info->buff_used = size;
}
@@ -223,7 +223,7 @@ static void handle_read(struct sandbox_flash_priv *priv, ulong lba,
info->read_len = transfer_len;
if (priv->fd != -1) {
os_lseek(priv->fd, lba * SANDBOX_FLASH_BLOCK_LEN, OS_SEEK_SET);
- setup_response(priv, priv->buff,
+ setup_response(priv, info->buff,
transfer_len * SANDBOX_FLASH_BLOCK_LEN);
} else {
setup_fail_response(priv);
@@ -239,7 +239,7 @@ static int handle_ufi_command(struct sandbox_flash_plat *plat,
switch (*req->cmd) {
case SCSI_INQUIRY: {
- struct scsi_inquiry_resp *resp = (void *)priv->buff;
+ struct scsi_inquiry_resp *resp = (void *)info->buff;
info->alloc_len = req->cmd[4];
memset(resp, '\0', sizeof(*resp));
@@ -259,7 +259,7 @@ static int handle_ufi_command(struct sandbox_flash_plat *plat,
setup_response(priv, NULL, 0);
break;
case SCSI_RD_CAPAC: {
- struct scsi_read_capacity_resp *resp = (void *)priv->buff;
+ struct scsi_read_capacity_resp *resp = (void *)info->buff;
uint blocks;
if (priv->file_size)
@@ -342,9 +342,9 @@ static int sandbox_flash_bulk(struct udevice *dev, struct usb_device *udev,
} else {
if (info->alloc_len && len > info->alloc_len)
len = info->alloc_len;
- if (len > sizeof(priv->buff))
- len = sizeof(priv->buff);
- memcpy(buff, priv->buff, len);
+ if (len > SANDBOX_FLASH_BUF_SIZE)
+ len = SANDBOX_FLASH_BUF_SIZE;
+ memcpy(buff, info->buff, len);
info->phase = SCSIPH_STATUS;
}
return len;
@@ -394,10 +394,28 @@ static int sandbox_flash_probe(struct udevice *dev)
{
struct sandbox_flash_plat *plat = dev_get_plat(dev);
struct sandbox_flash_priv *priv = dev_get_priv(dev);
+ struct scsi_emul_info *info = &priv->eminfo;
+ int ret;
priv->fd = os_open(plat->pathname, OS_O_RDONLY);
- if (priv->fd != -1)
- return os_get_filesize(plat->pathname, &priv->file_size);
+ if (priv->fd != -1) {
+ ret = os_get_filesize(plat->pathname, &priv->file_size);
+ if (ret)
+ return log_msg_ret("sz", ret);
+ }
+ info->buff = malloc(SANDBOX_FLASH_BUF_SIZE);
+ if (!info->buff)
+ return log_ret(-ENOMEM);
+
+ return 0;
+}
+
+static int sandbox_flash_remove(struct udevice *dev)
+{
+ struct sandbox_flash_priv *priv = dev_get_priv(dev);
+ struct scsi_emul_info *info = &priv->eminfo;
+
+ free(info->buff);
return 0;
}
@@ -418,6 +436,7 @@ U_BOOT_DRIVER(usb_sandbox_flash) = {
.of_match = sandbox_usb_flash_ids,
.bind = sandbox_flash_bind,
.probe = sandbox_flash_probe,
+ .remove = sandbox_flash_remove,
.of_to_plat = sandbox_flash_of_to_plat,
.ops = &sandbox_usb_flash_ops,
.priv_auto = sizeof(struct sandbox_flash_priv),
diff --git a/include/scsi_emul.h b/include/scsi_emul.h
index dec78d2..f27c197 100644
--- a/include/scsi_emul.h
+++ b/include/scsi_emul.h
@@ -20,8 +20,13 @@
* @read_len: Number of bytes of data left in the current read command
* @alloc_len: Allocation length from the last incoming command
* @transfer_len: Transfer length from CBW header
+ * @buff: Data buffer for outgoing data
*/
struct scsi_emul_info {
+ /* provided by the caller: */
+ void *buff;
+
+ /* state maintained by the emulator: */
enum scsi_cmd_phase phase;
int buff_used;
int read_len;