Fix for VMS 5.5-2 for incorrect Inquiry command allocation lengths
[SCSI2SD-V6.git] / include / scsi2sd.h
1 //      Copyright (C) 2014 Michael McMaster <michael@codesrc.com>
2 //
3 //      This file is part of SCSI2SD.
4 //
5 //      SCSI2SD is free software: you can redistribute it and/or modify
6 //      it under the terms of the GNU General Public License as published by
7 //      the Free Software Foundation, either version 3 of the License, or
8 //      (at your option) any later version.
9 //
10 //      SCSI2SD is distributed in the hope that it will be useful,
11 //      but WITHOUT ANY WARRANTY; without even the implied warranty of
12 //      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 //      GNU General Public License for more details.
14 //
15 //      You should have received a copy of the GNU General Public License
16 //      along with SCSI2SD.  If not, see <http://www.gnu.org/licenses/>.
17 #ifndef scsi2sd_h
18 #define scsi2sd_h
19
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23
24 /* Common type definitions shared between the firmware and config tools
25
26         The configuration data is now stored on the SD card, occupying the
27         last 2 sectors.
28
29         BoardConfig
30         TargetConfig (disk 0)
31         TargetConfig (disk 1)
32         TargetConfig (disk 2)
33         TargetConfig (disk 3)
34         TargetConfig (disk 4)
35         TargetConfig (disk 5)
36         TargetConfig (disk 6)
37
38 */
39
40 #include "stdint.h"
41
42 #define S2S_MAX_TARGETS 7
43 #define S2S_CFG_SIZE (S2S_MAX_TARGETS * sizeof(S2S_TargetCfg) + sizeof(S2S_BoardCfg))
44
45 typedef enum
46 {
47         S2S_CFG_TARGET_ID_BITS = 0x07,
48         S2S_CFG_TARGET_ENABLED = 0x80
49 } S2S_CFG_TARGET_FLAGS;
50
51 typedef enum
52 {
53         S2S_CFG_ENABLE_UNIT_ATTENTION = 1,
54         S2S_CFG_ENABLE_PARITY = 2,
55         S2S_CFG_ENABLE_SCSI2 = 4,
56         S2S_CFG_DISABLE_GLITCH = 8,
57         S2S_CFG_ENABLE_CACHE = 16,
58         S2S_CFG_ENABLE_DISCONNECT = 32,
59         S2S_CFG_ENABLE_SEL_LATCH = 64,
60         S2S_CFG_MAP_LUNS_TO_IDS = 128
61 } S2S_CFG_FLAGS;
62
63 typedef enum
64 {
65         S2S_CFG_ENABLE_TERMINATOR = 1
66 } S2S_CFG_FLAGS6;
67
68 typedef enum
69 {
70         S2S_CFG_FIXED,
71         S2S_CFG_REMOVEABLE,
72         S2S_CFG_OPTICAL,
73         S2S_CFG_FLOPPY_14MB,
74         S2S_CFG_MO,
75         S2S_CFG_SEQUENTIAL
76
77 } S2S_CFG_TYPE;
78
79 typedef enum
80 {
81         S2S_CFG_QUIRKS_NONE = 0,
82         S2S_CFG_QUIRKS_APPLE = 1,
83         S2S_CFG_QUIRKS_OMTI = 2,
84         S2S_CFG_QUIRKS_XEBEC = 4,
85         S2S_CFG_QUIRKS_VMS = 8
86 } S2S_CFG_QUIRKS;
87
88 typedef enum
89 {
90         S2S_CFG_SPEED_NoLimit,
91         S2S_CFG_SPEED_ASYNC_15,
92         S2S_CFG_SPEED_ASYNC_33,
93         S2S_CFG_SPEED_ASYNC_50,
94         S2S_CFG_SPEED_SYNC_5,
95         S2S_CFG_SPEED_SYNC_10,
96         S2S_CFG_SPEED_TURBO
97 } S2S_CFG_SPEED;
98
99 typedef struct __attribute__((packed))
100 {
101         // bits 7 -> 3 = S2S_CFG_TARGET_FLAGS
102         // bits 2 -> 0 = target SCSI ID.
103         uint8_t scsiId;
104
105         uint8_t deviceType; // S2S_CFG_TYPE
106         uint8_t flagsDEPRECATED; // S2S_CFG_FLAGS, removed in v4.5
107         uint8_t deviceTypeModifier; // Used in INQUIRY response.
108
109         uint32_t sdSectorStart;
110         uint32_t scsiSectors;
111
112         uint16_t bytesPerSector;
113
114         // Max allowed by legacy IBM-PC bios is 6 bits (63)
115         uint16_t sectorsPerTrack;
116
117         // MS-Dos up to 7.10 will crash on >= 256 heads.
118         uint16_t headsPerCylinder;
119
120
121         char vendor[8];
122         char prodId[16];
123         char revision[4];
124         char serial[16];
125
126         uint16_t quirks; // S2S_CFG_QUIRKS
127
128         uint8_t reserved[64]; // Pad out to 128 bytes for main section.
129 } S2S_TargetCfg;
130
131 typedef struct __attribute__((packed))
132 {
133         char magic[4]; // 'BCFG'
134         uint8_t flags; // S2S_CFG_FLAGS
135         uint8_t startupDelay; // Seconds.
136         uint8_t selectionDelay; // milliseconds. 255 = auto
137         uint8_t flags6; // S2S_CFG_FLAGS6
138
139         uint8_t scsiSpeed;
140
141         uint8_t reserved[119]; // Pad out to 128 bytes
142 } S2S_BoardCfg;
143
144 typedef enum
145 {
146         S2S_CMD_NONE, // Invalid
147
148         // Command content:
149         // uint8_t S2S_CFG_PING
150         // Response:
151         // S2S_CFG_STATUS
152         S2S_CMD_PING,
153
154         // Command content:
155         // uint8_t S2S_CFG_WRITEFLASH
156         // uint8_t[256] flashData
157         // uint8_t flashArray
158         // uint8_t flashRow
159         // Response:
160         // S2S_CFG_STATUS
161         S2S_CMD_WRITEFLASH,
162
163         // Command content:
164         // uint8_t S2S_CFG_READFLASH
165         // uint8_t flashArray
166         // uint8_t flashRow
167         // Response:
168         // 256 bytes of flash
169         S2S_CMD_READFLASH,
170
171         // Command content:
172         // uint8_t S2S_CFG_REBOOT
173         // Response: None.
174         S2S_CMD_REBOOT,
175
176         // Command content:
177         // uint8_t S2S_CFG_INFO
178         // Response:
179         // uint8_t[16] CSD
180         // uint8_t[16] CID
181         S2S_CMD_SDINFO,
182
183         // Command content:
184         // uint8_t S2S_CFG_SCSITEST
185         // Response:
186         // S2S_CFG_STATUS
187         // uint8_t result code (0 = passed)
188         S2S_CMD_SCSITEST,
189
190         // Command content:
191         // uint8_t S2S_CFG_DEVINFO
192         // Response:
193         // uint16_t protocol version (MSB)
194         // uint16_t firmware version (MSB)
195         // uint32_t SD capacity(MSB)
196         S2S_CMD_DEVINFO,
197
198         // Command content:
199         // uint8_t S2S_CFG_SD_WRITE
200         // uint32_t Sector Number (MSB)
201         // uint8_t[512] data
202         // Response:
203         // S2S_CFG_STATUS
204         S2S_CMD_SD_WRITE,
205
206         // Command content:
207         // uint8_t S2S_CFG_SD_READ
208         // uint32_t Sector Number (MSB)
209         // Response:
210         // 512 bytes of data
211         S2S_CMD_SD_READ,
212
213         // Command content:
214         // uint8_t S2S_CFG_DEBUG
215         // Response:
216         S2S_CMD_DEBUG,
217 } S2S_COMMAND;
218
219 typedef enum
220 {
221         S2S_CFG_STATUS_GOOD,
222         S2S_CFG_STATUS_ERR,
223         S2S_CFG_STATUS_BUSY
224 } S2S_CFG_STATUS;
225
226
227
228
229 #ifdef __cplusplus
230 } // extern "C"
231
232         #include <type_traits>
233         static_assert(
234                 std::is_pod<S2S_TargetCfg>::value, "Misuse of TargetConfig struct"
235                 );
236         static_assert(
237                 sizeof(S2S_TargetCfg) == 128,
238                 "TargetConfig struct size mismatch"
239                 );
240
241         static_assert(
242                 std::is_pod<S2S_BoardCfg>::value, "Misuse of BoardConfig struct"
243                 );
244         static_assert(
245                 sizeof(S2S_BoardCfg) == 128,
246                 "BoardConfig struct size mismatch"
247                 );
248
249 #endif
250
251 #endif