19
19
#include "vendor.h"
20
20
#include "diagnostic.h"
21
21
22
+ #include <string.h>
23
+
22
24
// Callback after the DATA OUT phase is complete.
23
25
static void doAssignDiskParameters (void )
24
26
{
@@ -45,8 +47,83 @@ int scsiVendorCommand()
45
47
int commandHandled = 1 ;
46
48
47
49
uint8_t command = scsiDev .cdb [0 ];
50
+ uint8_t alloc_length = scsiDev .cdb [4 ];
51
+
52
+ // iomega sense command
53
+ if (command == 0x06 && scsiDev .target -> cfg -> deviceType == S2S_CFG_ZIP100 )
54
+ {
55
+ int subcommand = scsiDev .cdb [2 ];
56
+ scsiDev .phase = DATA_IN ;
57
+
58
+ // byte 0 is the page
59
+ scsiDev .data [0 ] = subcommand ;
60
+
61
+ if (subcommand == 0x1 )
62
+ {
63
+ // page is 86 bytes in length
64
+ scsiDev .dataLen = alloc_length < 0x58 ? alloc_length : 0x58 ;
65
+ memset (& scsiDev .data [1 ], 0xff , scsiDev .dataLen );
66
+ // byte 1 is the page length minus pagecode and length
67
+ scsiDev .data [1 ] = scsiDev .dataLen - 2 ;
68
+
69
+ scsiDev .data [2 ] = 1 ;
70
+ scsiDev .data [3 ] = 0 ;
71
+ scsiDev .data [4 ] = 0 ;
72
+ scsiDev .data [5 ] = 0 ;
73
+ scsiDev .data [6 ] = 0x5 ;
74
+ scsiDev .data [7 ] = 0xdc ;
75
+ scsiDev .data [8 ] = 0x6 ;
76
+ scsiDev .data [9 ] = 0xc ;
77
+ scsiDev .data [10 ] = 0x5 ;
78
+ scsiDev .data [11 ] = 0xdc ;
79
+ scsiDev .data [12 ] = 0x6 ;
80
+ scsiDev .data [13 ] = 0xc ;
81
+ scsiDev .data [14 ] = 0 ;
82
+ }
83
+ else if (subcommand == 0x2 ) {
84
+ // page is 61 bytes in length
85
+ scsiDev .dataLen = alloc_length < 0x3f ? alloc_length : 0x3f ;
86
+ memset (& scsiDev .data [1 ], 0 , scsiDev .dataLen );
87
+ // byte 1 is the page length minus pagecode and length
88
+ scsiDev .data [1 ] = scsiDev .dataLen - 2 ;
89
+
90
+ scsiDev .data [3 ] = 2 ;
91
+ scsiDev .data [6 ] = 0x2 ;
92
+ scsiDev .data [7 ] = 0xff ;
93
+ scsiDev .data [8 ] = 0xff ;
94
+ scsiDev .data [11 ] = 0x2 ;
48
95
49
- if (command == 0xC0 )
96
+ // this has something to do with the format/disk life
97
+ // currently this makes it 100%
98
+ scsiDev .data [14 ] = 0x7e ;
99
+ scsiDev .data [18 ] = 0x7e ;
100
+
101
+ // byte 21 is the read/write/password settings
102
+ // 5 = password for R/W
103
+ // 3 = password for W
104
+ // 2 = RO
105
+ // 0 = RW
106
+ scsiDev .data [20 ] = 0 ;
107
+
108
+ // set a serial number ABCDEFGHIJKLMNO
109
+ // starts at byte 25 and is 15 bytes long
110
+ for (int i = 0 ; i < 20 ; i ++ ) {
111
+ scsiDev .data [25 + i ] = i + 0x41 ;
112
+ }
113
+
114
+ scsiDev .data [0x3e ] = 1 ;
115
+ }
116
+ else
117
+ {
118
+ // anything else is an illegal command
119
+ scsiDev .status = CHECK_CONDITION ;
120
+ scsiDev .target -> sense .code = ILLEGAL_REQUEST ;
121
+ scsiDev .target -> sense .asc = LOGICAL_UNIT_NOT_SUPPORTED ;
122
+ scsiDev .phase = STATUS ;
123
+ }
124
+
125
+ }
126
+ else if (command == 0xC0 )
50
127
{
51
128
// Define flexible disk format
52
129
// OMTI-5204 controller
0 commit comments