]>
Commit | Line | Data |
---|---|---|
1377d448 SG |
1 | /* SPDX-License-Identifier: GPL-2.0+ */ |
2 | /* | |
3 | * Emulation of enough SCSI commands to find and read from a unit | |
4 | * | |
5 | * Copyright 2022 Google LLC | |
6 | * Written by Simon Glass <[email protected]> | |
7 | * | |
8 | * implementations of SCSI functions required so that CONFIG_SCSI can be enabled | |
9 | * for sandbox | |
10 | */ | |
11 | ||
12 | #ifndef __scsi_emul_h | |
13 | #define __scsi_emul_h | |
14 | ||
15 | /** | |
16 | * struct scsi_emul_info - information for emulating a SCSI device | |
17 | * | |
0c12d9dd SG |
18 | * @vendor: Vendor name |
19 | * @product: Product name | |
a3718f1e | 20 | * @block_size: Block size of device in bytes (normally 512) |
f148ad1b | 21 | * @file_size: Size of the backing file for this emulator, in bytes |
02cea114 | 22 | * @seek_block: Seek position for file (block number) |
0c12d9dd | 23 | * |
1377d448 SG |
24 | * @phase: Current SCSI phase |
25 | * @buff_used: Number of bytes ready to transfer back to host | |
26 | * @read_len: Number of bytes of data left in the current read command | |
27 | * @alloc_len: Allocation length from the last incoming command | |
28 | * @transfer_len: Transfer length from CBW header | |
fc7a7ed3 | 29 | * @buff: Data buffer for outgoing data |
1377d448 SG |
30 | */ |
31 | struct scsi_emul_info { | |
fc7a7ed3 SG |
32 | /* provided by the caller: */ |
33 | void *buff; | |
0c12d9dd SG |
34 | const char *vendor; |
35 | const char *product; | |
a3718f1e | 36 | int block_size; |
f148ad1b | 37 | loff_t file_size; |
02cea114 | 38 | int seek_block; |
fc7a7ed3 SG |
39 | |
40 | /* state maintained by the emulator: */ | |
1377d448 SG |
41 | enum scsi_cmd_phase phase; |
42 | int buff_used; | |
43 | int read_len; | |
2ff3db3a | 44 | int write_len; |
02cea114 | 45 | uint seek_pos; |
1377d448 SG |
46 | int alloc_len; |
47 | uint transfer_len; | |
48 | }; | |
49 | ||
2ff3db3a SG |
50 | /** |
51 | * Return value from sb_scsi_emul_command() indicates that a read or write is | |
52 | * being started | |
53 | */ | |
54 | enum { | |
55 | SCSI_EMUL_DO_READ = 1, | |
56 | SCSI_EMUL_DO_WRITE = 2, | |
57 | }; | |
02cea114 SG |
58 | |
59 | /** | |
60 | * sb_scsi_emul_command() - Process a SCSI command | |
61 | * | |
62 | * This sets up the response in info->buff and updates various other values | |
63 | * in info. | |
64 | * | |
65 | * If SCSI_EMUL_DO_READ is returned then the caller should set up so that the | |
66 | * backing file can be read, or return an error status if there is no file. | |
67 | * | |
68 | * @info: Emulation information | |
69 | * @req: Request to process | |
70 | * @len: Length of request in bytes | |
2ff3db3a SG |
71 | * @return SCSI_EMUL_DO_READ if a read has started, SCSI_EMUL_DO_WRITE if a |
72 | * write has started, 0 if some other operation has started, -ve if there | |
73 | * was an error | |
02cea114 SG |
74 | */ |
75 | int sb_scsi_emul_command(struct scsi_emul_info *info, | |
76 | const struct scsi_cmd *req, int len); | |
77 | ||
1377d448 | 78 | #endif |