| /* SPDX-License-Identifier: GPL-2.0+ */ |
| /* |
| * Emulation of enough SCSI commands to find and read from a unit |
| * |
| * Copyright 2022 Google LLC |
| * Written by Simon Glass <sjg@chromium.org> |
| * |
| * implementations of SCSI functions required so that CONFIG_SCSI can be enabled |
| * for sandbox |
| */ |
| |
| #ifndef __scsi_emul_h |
| #define __scsi_emul_h |
| |
| /** |
| * struct scsi_emul_info - information for emulating a SCSI device |
| * |
| * @vendor: Vendor name |
| * @product: Product name |
| * @block_size: Block size of device in bytes (normally 512) |
| * @file_size: Size of the backing file for this emulator, in bytes |
| * @seek_block: Seek position for file (block number) |
| * |
| * @phase: Current SCSI phase |
| * @buff_used: Number of bytes ready to transfer back to host |
| * @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; |
| const char *vendor; |
| const char *product; |
| int block_size; |
| loff_t file_size; |
| int seek_block; |
| |
| /* state maintained by the emulator: */ |
| enum scsi_cmd_phase phase; |
| int buff_used; |
| int read_len; |
| int write_len; |
| uint seek_pos; |
| int alloc_len; |
| uint transfer_len; |
| }; |
| |
| /** |
| * Return value from sb_scsi_emul_command() indicates that a read or write is |
| * being started |
| */ |
| enum { |
| SCSI_EMUL_DO_READ = 1, |
| SCSI_EMUL_DO_WRITE = 2, |
| }; |
| |
| /** |
| * sb_scsi_emul_command() - Process a SCSI command |
| * |
| * This sets up the response in info->buff and updates various other values |
| * in info. |
| * |
| * If SCSI_EMUL_DO_READ is returned then the caller should set up so that the |
| * backing file can be read, or return an error status if there is no file. |
| * |
| * @info: Emulation information |
| * @req: Request to process |
| * @len: Length of request in bytes |
| * @return SCSI_EMUL_DO_READ if a read has started, SCSI_EMUL_DO_WRITE if a |
| * write has started, 0 if some other operation has started, -ve if there |
| * was an error |
| */ |
| int sb_scsi_emul_command(struct scsi_emul_info *info, |
| const struct scsi_cmd *req, int len); |
| |
| #endif |