Merge branch 'for-rmk' of git://git.marvell.com/orion
[linux-2.6] / Documentation / scsi / arcmsr_spec.txt
1 *******************************************************************************
2 **                            ARECA FIRMWARE SPEC
3 *******************************************************************************
4 **      Usage of IOP331 adapter
5 **      (All In/Out is in IOP331's view)
6 **      1. Message 0 --> InitThread message and return code
7 **      2. Doorbell is used for RS-232 emulation
8 **              inDoorBell :    bit0 -- data in ready
9 **                      (DRIVER DATA WRITE OK)
10 **                              bit1 -- data out has been read
11 **                      (DRIVER DATA READ OK)
12 **              outDooeBell:    bit0 -- data out ready
13 **                      (IOP331 DATA WRITE OK)
14 **                              bit1 -- data in has been read
15 **                      (IOP331 DATA READ OK)
16 **      3. Index Memory Usage
17 **      offset 0xf00 : for RS232 out (request buffer)
18 **      offset 0xe00 : for RS232 in  (scratch buffer)
19 **      offset 0xa00 : for inbound message code message_rwbuffer
20 **                      (driver send to IOP331)
21 **      offset 0xa00 : for outbound message code message_rwbuffer
22 **                      (IOP331 send to driver)
23 **      4. RS-232 emulation
24 **              Currently 128 byte buffer is used
25 **                      1st uint32_t : Data length (1--124)
26 **                      Byte 4--127  : Max 124 bytes of data
27 **      5. PostQ
28 **      All SCSI Command must be sent through postQ:
29 **      (inbound queue port)    Request frame must be 32 bytes aligned
30 **      #bit27--bit31 => flag for post ccb
31 **      #bit0--bit26  => real address (bit27--bit31) of post arcmsr_cdb
32 **              bit31 :
33 **                      0 : 256 bytes frame
34 **                      1 : 512 bytes frame
35 **              bit30 :
36 **                      0 : normal request
37 **                      1 : BIOS request
38 **              bit29 : reserved
39 **              bit28 : reserved
40 **              bit27 : reserved
41 **  ---------------------------------------------------------------------------
42 **      (outbount queue port)   Request reply
43 **      #bit27--bit31
44 **              => flag for reply
45 **      #bit0--bit26
46 **              => real address (bit27--bit31) of reply arcmsr_cdb
47 **                      bit31 : must be 0 (for this type of reply)
48 **                      bit30 : reserved for BIOS handshake
49 **                      bit29 : reserved
50 **                      bit28 :
51 **                      0 : no error, ignore AdapStatus/DevStatus/SenseData
52 **                      1 : Error, error code in AdapStatus/DevStatus/SenseData
53 **                      bit27 : reserved
54 **      6. BIOS request
55 **              All BIOS request is the same with request from PostQ
56 **              Except :
57 **                      Request frame is sent from configuration space
58 **              offset: 0x78 : Request Frame (bit30 == 1)
59 **              offset: 0x18 : writeonly to generate
60 **                                      IRQ to IOP331
61 **              Completion of request:
62 **                      (bit30 == 0, bit28==err flag)
63 **      7. Definition of SGL entry (structure)
64 **      8. Message1 Out - Diag Status Code (????)
65 **      9. Message0 message code :
66 **              0x00 : NOP
67 **              0x01 : Get Config
68 **              ->offset 0xa00 :for outbound message code message_rwbuffer
69 **              (IOP331 send to driver)
70 **              Signature             0x87974060(4)
71 **              Request len           0x00000200(4)
72 **              numbers of queue      0x00000100(4)
73 **              SDRAM Size            0x00000100(4)-->256 MB
74 **              IDE Channels          0x00000008(4)
75 **              vendor                40 bytes char
76 **              model                  8 bytes char
77 **              FirmVer               16 bytes char
78 **              Device Map            16 bytes char
79 **              FirmwareVersion DWORD <== Added for checking of
80 **                                              new firmware capability
81 **              0x02 : Set Config
82 **              ->offset 0xa00 :for inbound message code message_rwbuffer
83 **              (driver send to IOP331)
84 **              Signature             0x87974063(4)
85 **              UPPER32 of Request Frame  (4)-->Driver Only
86 **              0x03 : Reset (Abort all queued Command)
87 **              0x04 : Stop Background Activity
88 **              0x05 : Flush Cache
89 **              0x06 : Start Background Activity
90 **                      (re-start if background is halted)
91 **              0x07 : Check If Host Command Pending
92 **                      (Novell May Need This Function)
93 **              0x08 : Set controller time
94 **              ->offset 0xa00 : for inbound message code message_rwbuffer
95 **              (driver to IOP331)
96 **              byte 0 : 0xaa <-- signature
97 **              byte 1 : 0x55 <-- signature
98 **              byte 2 : year (04)
99 **              byte 3 : month (1..12)
100 **              byte 4 : date (1..31)
101 **              byte 5 : hour (0..23)
102 **              byte 6 : minute (0..59)
103 **              byte 7 : second (0..59)
104 *******************************************************************************
105 *******************************************************************************
106 **              RS-232 Interface for Areca Raid Controller
107 **      The low level command interface is exclusive with VT100 terminal
108 **  --------------------------------------------------------------------
109 **      1. Sequence of command execution
110 **  --------------------------------------------------------------------
111 **      (A) Header : 3 bytes sequence (0x5E, 0x01, 0x61)
112 **      (B) Command block : variable length of data including length,
113 **              command code, data and checksum byte
114 **      (C) Return data : variable length of data
115 **  --------------------------------------------------------------------
116 **    2. Command block
117 **  --------------------------------------------------------------------
118 **      (A) 1st byte : command block length (low byte)
119 **      (B) 2nd byte : command block length (high byte)
120 **                note ..command block length shouldn't > 2040 bytes,
121 **              length excludes these two bytes
122 **      (C) 3rd byte : command code
123 **      (D) 4th and following bytes : variable length data bytes
124 **              depends on command code
125 **      (E) last byte : checksum byte (sum of 1st byte until last data byte)
126 **  --------------------------------------------------------------------
127 **    3. Command code and associated data
128 **  --------------------------------------------------------------------
129 **      The following are command code defined in raid controller Command
130 **      code 0x10--0x1? are used for system level management,
131 **      no password checking is needed and should be implemented in separate
132 **      well controlled utility and not for end user access.
133 **      Command code 0x20--0x?? always check the password,
134 **      password must be entered to enable these command.
135 **      enum
136 **      {
137 **              GUI_SET_SERIAL=0x10,
138 **              GUI_SET_VENDOR,
139 **              GUI_SET_MODEL,
140 **              GUI_IDENTIFY,
141 **              GUI_CHECK_PASSWORD,
142 **              GUI_LOGOUT,
143 **              GUI_HTTP,
144 **              GUI_SET_ETHERNET_ADDR,
145 **              GUI_SET_LOGO,
146 **              GUI_POLL_EVENT,
147 **              GUI_GET_EVENT,
148 **              GUI_GET_HW_MONITOR,
149 **              //    GUI_QUICK_CREATE=0x20, (function removed)
150 **              GUI_GET_INFO_R=0x20,
151 **              GUI_GET_INFO_V,
152 **              GUI_GET_INFO_P,
153 **              GUI_GET_INFO_S,
154 **              GUI_CLEAR_EVENT,
155 **              GUI_MUTE_BEEPER=0x30,
156 **              GUI_BEEPER_SETTING,
157 **              GUI_SET_PASSWORD,
158 **              GUI_HOST_INTERFACE_MODE,
159 **              GUI_REBUILD_PRIORITY,
160 **              GUI_MAX_ATA_MODE,
161 **              GUI_RESET_CONTROLLER,
162 **              GUI_COM_PORT_SETTING,
163 **              GUI_NO_OPERATION,
164 **              GUI_DHCP_IP,
165 **              GUI_CREATE_PASS_THROUGH=0x40,
166 **              GUI_MODIFY_PASS_THROUGH,
167 **              GUI_DELETE_PASS_THROUGH,
168 **              GUI_IDENTIFY_DEVICE,
169 **              GUI_CREATE_RAIDSET=0x50,
170 **              GUI_DELETE_RAIDSET,
171 **              GUI_EXPAND_RAIDSET,
172 **              GUI_ACTIVATE_RAIDSET,
173 **              GUI_CREATE_HOT_SPARE,
174 **              GUI_DELETE_HOT_SPARE,
175 **              GUI_CREATE_VOLUME=0x60,
176 **              GUI_MODIFY_VOLUME,
177 **              GUI_DELETE_VOLUME,
178 **              GUI_START_CHECK_VOLUME,
179 **              GUI_STOP_CHECK_VOLUME
180 **      };
181 **    Command description :
182 **      GUI_SET_SERIAL : Set the controller serial#
183 **              byte 0,1        : length
184 **              byte 2          : command code 0x10
185 **              byte 3          : password length (should be 0x0f)
186 **              byte 4-0x13     : should be "ArEcATecHnoLogY"
187 **              byte 0x14--0x23 : Serial number string (must be 16 bytes)
188 **      GUI_SET_VENDOR : Set vendor string for the controller
189 **              byte 0,1        : length
190 **              byte 2          : command code 0x11
191 **              byte 3          : password length (should be 0x08)
192 **              byte 4-0x13     : should be "ArEcAvAr"
193 **              byte 0x14--0x3B : vendor string (must be 40 bytes)
194 **      GUI_SET_MODEL : Set the model name of the controller
195 **              byte 0,1        : length
196 **              byte 2          : command code 0x12
197 **              byte 3          : password length (should be 0x08)
198 **              byte 4-0x13     : should be "ArEcAvAr"
199 **              byte 0x14--0x1B : model string (must be 8 bytes)
200 **      GUI_IDENTIFY : Identify device
201 **              byte 0,1        : length
202 **              byte 2          : command code 0x13
203 **                                return "Areca RAID Subsystem "
204 **      GUI_CHECK_PASSWORD : Verify password
205 **              byte 0,1        : length
206 **              byte 2          : command code 0x14
207 **              byte 3          : password length
208 **              byte 4-0x??     : user password to be checked
209 **      GUI_LOGOUT : Logout GUI (force password checking on next command)
210 **              byte 0,1        : length
211 **              byte 2          : command code 0x15
212 **      GUI_HTTP : HTTP interface (reserved for Http proxy service)(0x16)
213 **
214 **      GUI_SET_ETHERNET_ADDR : Set the ethernet MAC address
215 **              byte 0,1        : length
216 **              byte 2          : command code 0x17
217 **              byte 3          : password length (should be 0x08)
218 **              byte 4-0x13     : should be "ArEcAvAr"
219 **              byte 0x14--0x19 : Ethernet MAC address (must be 6 bytes)
220 **      GUI_SET_LOGO : Set logo in HTTP
221 **              byte 0,1        : length
222 **              byte 2          : command code 0x18
223 **              byte 3          : Page# (0/1/2/3) (0xff --> clear OEM logo)
224 **              byte 4/5/6/7    : 0x55/0xaa/0xa5/0x5a
225 **              byte 8          : TITLE.JPG data (each page must be 2000 bytes)
226 **                                note page0 1st 2 byte must be
227 **                                      actual length of the JPG file
228 **      GUI_POLL_EVENT : Poll If Event Log Changed
229 **              byte 0,1        : length
230 **              byte 2          : command code 0x19
231 **      GUI_GET_EVENT : Read Event
232 **              byte 0,1        : length
233 **              byte 2          : command code 0x1a
234 **              byte 3          : Event Page (0:1st page/1/2/3:last page)
235 **      GUI_GET_HW_MONITOR : Get HW monitor data
236 **              byte 0,1        : length
237 **              byte 2                  : command code 0x1b
238 **              byte 3                  : # of FANs(example 2)
239 **              byte 4                  : # of Voltage sensor(example 3)
240 **              byte 5                  : # of temperature sensor(example 2)
241 **              byte 6                  : # of power
242 **              byte 7/8        : Fan#0 (RPM)
243 **              byte 9/10       : Fan#1
244 **              byte 11/12              : Voltage#0 original value in *1000
245 **              byte 13/14              : Voltage#0 value
246 **              byte 15/16              : Voltage#1 org
247 **              byte 17/18              : Voltage#1
248 **              byte 19/20              : Voltage#2 org
249 **              byte 21/22              : Voltage#2
250 **              byte 23                 : Temp#0
251 **              byte 24                 : Temp#1
252 **              byte 25                 : Power indicator (bit0 : power#0,
253 **                                               bit1 : power#1)
254 **              byte 26                 : UPS indicator
255 **      GUI_QUICK_CREATE : Quick create raid/volume set
256 **          byte 0,1        : length
257 **          byte 2          : command code 0x20
258 **          byte 3/4/5/6    : raw capacity
259 **          byte 7                      : raid level
260 **          byte 8                      : stripe size
261 **          byte 9                      : spare
262 **          byte 10/11/12/13: device mask (the devices to create raid/volume)
263 **              This function is removed, application like
264 **              to implement quick create function
265 **      need to use GUI_CREATE_RAIDSET and GUI_CREATE_VOLUMESET function.
266 **      GUI_GET_INFO_R : Get Raid Set Information
267 **              byte 0,1        : length
268 **              byte 2          : command code 0x20
269 **              byte 3          : raidset#
270 **      typedef struct sGUI_RAIDSET
271 **      {
272 **              BYTE grsRaidSetName[16];
273 **              DWORD grsCapacity;
274 **              DWORD grsCapacityX;
275 **              DWORD grsFailMask;
276 **              BYTE grsDevArray[32];
277 **              BYTE grsMemberDevices;
278 **              BYTE grsNewMemberDevices;
279 **              BYTE grsRaidState;
280 **              BYTE grsVolumes;
281 **              BYTE grsVolumeList[16];
282 **              BYTE grsRes1;
283 **              BYTE grsRes2;
284 **              BYTE grsRes3;
285 **              BYTE grsFreeSegments;
286 **              DWORD grsRawStripes[8];
287 **              DWORD grsRes4;
288 **              DWORD grsRes5; //     Total to 128 bytes
289 **              DWORD grsRes6; //     Total to 128 bytes
290 **      } sGUI_RAIDSET, *pGUI_RAIDSET;
291 **      GUI_GET_INFO_V : Get Volume Set Information
292 **              byte 0,1        : length
293 **              byte 2          : command code 0x21
294 **              byte 3          : volumeset#
295 **      typedef struct sGUI_VOLUMESET
296 **      {
297 **              BYTE gvsVolumeName[16]; //     16
298 **              DWORD gvsCapacity;
299 **              DWORD gvsCapacityX;
300 **              DWORD gvsFailMask;
301 **              DWORD gvsStripeSize;
302 **              DWORD gvsNewFailMask;
303 **              DWORD gvsNewStripeSize;
304 **              DWORD gvsVolumeStatus;
305 **              DWORD gvsProgress; //     32
306 **              sSCSI_ATTR gvsScsi;
307 **              BYTE gvsMemberDisks;
308 **              BYTE gvsRaidLevel; //     8
309 **              BYTE gvsNewMemberDisks;
310 **              BYTE gvsNewRaidLevel;
311 **              BYTE gvsRaidSetNumber;
312 **              BYTE gvsRes0; //     4
313 **              BYTE gvsRes1[4]; //     64 bytes
314 **      } sGUI_VOLUMESET, *pGUI_VOLUMESET;
315 **      GUI_GET_INFO_P : Get Physical Drive Information
316 **              byte 0,1        : length
317 **              byte 2          : command code 0x22
318 **              byte 3          : drive # (from 0 to max-channels - 1)
319 **      typedef struct sGUI_PHY_DRV
320 **      {
321 **              BYTE gpdModelName[40];
322 **              BYTE gpdSerialNumber[20];
323 **              BYTE gpdFirmRev[8];
324 **              DWORD gpdCapacity;
325 **              DWORD gpdCapacityX; //     Reserved for expansion
326 **              BYTE gpdDeviceState;
327 **              BYTE gpdPioMode;
328 **              BYTE gpdCurrentUdmaMode;
329 **              BYTE gpdUdmaMode;
330 **              BYTE gpdDriveSelect;
331 **              BYTE gpdRaidNumber; //     0xff if not belongs to a raid set
332 **              sSCSI_ATTR gpdScsi;
333 **              BYTE gpdReserved[40]; //     Total to 128 bytes
334 **      } sGUI_PHY_DRV, *pGUI_PHY_DRV;
335 **      GUI_GET_INFO_S : Get System Information
336 **              byte 0,1        : length
337 **              byte 2          : command code 0x23
338 **      typedef struct sCOM_ATTR
339 **      {
340 **              BYTE comBaudRate;
341 **              BYTE comDataBits;
342 **              BYTE comStopBits;
343 **              BYTE comParity;
344 **              BYTE comFlowControl;
345 **      } sCOM_ATTR, *pCOM_ATTR;
346 **      typedef struct sSYSTEM_INFO
347 **      {
348 **              BYTE gsiVendorName[40];
349 **              BYTE gsiSerialNumber[16];
350 **              BYTE gsiFirmVersion[16];
351 **              BYTE gsiBootVersion[16];
352 **              BYTE gsiMbVersion[16];
353 **              BYTE gsiModelName[8];
354 **              BYTE gsiLocalIp[4];
355 **              BYTE gsiCurrentIp[4];
356 **              DWORD gsiTimeTick;
357 **              DWORD gsiCpuSpeed;
358 **              DWORD gsiICache;
359 **              DWORD gsiDCache;
360 **              DWORD gsiScache;
361 **              DWORD gsiMemorySize;
362 **              DWORD gsiMemorySpeed;
363 **              DWORD gsiEvents;
364 **              BYTE gsiMacAddress[6];
365 **              BYTE gsiDhcp;
366 **              BYTE gsiBeeper;
367 **              BYTE gsiChannelUsage;
368 **              BYTE gsiMaxAtaMode;
369 **              BYTE gsiSdramEcc; //     1:if ECC enabled
370 **              BYTE gsiRebuildPriority;
371 **              sCOM_ATTR gsiComA; //     5 bytes
372 **              sCOM_ATTR gsiComB; //     5 bytes
373 **              BYTE gsiIdeChannels;
374 **              BYTE gsiScsiHostChannels;
375 **              BYTE gsiIdeHostChannels;
376 **              BYTE gsiMaxVolumeSet;
377 **              BYTE gsiMaxRaidSet;
378 **              BYTE gsiEtherPort; //     1:if ether net port supported
379 **              BYTE gsiRaid6Engine; //     1:Raid6 engine supported
380 **              BYTE gsiRes[75];
381 **      } sSYSTEM_INFO, *pSYSTEM_INFO;
382 **      GUI_CLEAR_EVENT : Clear System Event
383 **              byte 0,1        : length
384 **              byte 2          : command code 0x24
385 **      GUI_MUTE_BEEPER : Mute current beeper
386 **              byte 0,1        : length
387 **              byte 2          : command code 0x30
388 **      GUI_BEEPER_SETTING : Disable beeper
389 **              byte 0,1        : length
390 **              byte 2          : command code 0x31
391 **              byte 3          : 0->disable, 1->enable
392 **      GUI_SET_PASSWORD : Change password
393 **              byte 0,1        : length
394 **              byte 2                  : command code 0x32
395 **              byte 3                  : pass word length ( must <= 15 )
396 **              byte 4                  : password (must be alpha-numerical)
397 **      GUI_HOST_INTERFACE_MODE : Set host interface mode
398 **              byte 0,1        : length
399 **              byte 2                  : command code 0x33
400 **              byte 3                  : 0->Independent, 1->cluster
401 **      GUI_REBUILD_PRIORITY : Set rebuild priority
402 **              byte 0,1        : length
403 **              byte 2                  : command code 0x34
404 **              byte 3                  : 0/1/2/3 (low->high)
405 **      GUI_MAX_ATA_MODE : Set maximum ATA mode to be used
406 **              byte 0,1        : length
407 **              byte 2                  : command code 0x35
408 **              byte 3                  : 0/1/2/3 (133/100/66/33)
409 **      GUI_RESET_CONTROLLER : Reset Controller
410 **              byte 0,1        : length
411 **              byte 2          : command code 0x36
412 **                            *Response with VT100 screen (discard it)
413 **      GUI_COM_PORT_SETTING : COM port setting
414 **              byte 0,1        : length
415 **              byte 2                  : command code 0x37
416 **              byte 3                  : 0->COMA (term port),
417 **                                        1->COMB (debug port)
418 **              byte 4                  : 0/1/2/3/4/5/6/7
419 **                      (1200/2400/4800/9600/19200/38400/57600/115200)
420 **              byte 5                  : data bit
421 **                                      (0:7 bit, 1:8 bit : must be 8 bit)
422 **              byte 6                  : stop bit (0:1, 1:2 stop bits)
423 **              byte 7                  : parity (0:none, 1:off, 2:even)
424 **              byte 8                  : flow control
425 **                      (0:none, 1:xon/xoff, 2:hardware => must use none)
426 **      GUI_NO_OPERATION : No operation
427 **              byte 0,1        : length
428 **              byte 2          : command code 0x38
429 **      GUI_DHCP_IP : Set DHCP option and local IP address
430 **              byte 0,1        : length
431 **              byte 2          : command code 0x39
432 **              byte 3          : 0:dhcp disabled, 1:dhcp enabled
433 **              byte 4/5/6/7    : IP address
434 **      GUI_CREATE_PASS_THROUGH : Create pass through disk
435 **              byte 0,1        : length
436 **              byte 2                  : command code 0x40
437 **              byte 3                  : device #
438 **              byte 4                  : scsi channel (0/1)
439 **              byte 5                  : scsi id (0-->15)
440 **              byte 6                  : scsi lun (0-->7)
441 **              byte 7                  : tagged queue (1 : enabled)
442 **              byte 8                  : cache mode (1 : enabled)
443 **              byte 9                  : max speed (0/1/2/3/4,
444 **                      async/20/40/80/160 for scsi)
445 **                      (0/1/2/3/4, 33/66/100/133/150 for ide  )
446 **      GUI_MODIFY_PASS_THROUGH : Modify pass through disk
447 **              byte 0,1        : length
448 **              byte 2                  : command code 0x41
449 **              byte 3                  : device #
450 **              byte 4                  : scsi channel (0/1)
451 **              byte 5                  : scsi id (0-->15)
452 **              byte 6                  : scsi lun (0-->7)
453 **              byte 7                  : tagged queue (1 : enabled)
454 **              byte 8                  : cache mode (1 : enabled)
455 **              byte 9                  : max speed (0/1/2/3/4,
456 **                                      async/20/40/80/160 for scsi)
457 **                      (0/1/2/3/4, 33/66/100/133/150 for ide  )
458 **      GUI_DELETE_PASS_THROUGH : Delete pass through disk
459 **              byte 0,1        : length
460 **              byte 2          : command code 0x42
461 **              byte 3          : device# to be deleted
462 **      GUI_IDENTIFY_DEVICE : Identify Device
463 **              byte 0,1        : length
464 **              byte 2          : command code 0x43
465 **              byte 3          : Flash Method
466 **                              (0:flash selected, 1:flash not selected)
467 **              byte 4/5/6/7    : IDE device mask to be flashed
468 **                           note .... no response data available
469 **      GUI_CREATE_RAIDSET : Create Raid Set
470 **              byte 0,1        : length
471 **              byte 2          : command code 0x50
472 **              byte 3/4/5/6    : device mask
473 **              byte 7-22       : raidset name (if byte 7 == 0:use default)
474 **      GUI_DELETE_RAIDSET : Delete Raid Set
475 **              byte 0,1        : length
476 **              byte 2          : command code 0x51
477 **              byte 3          : raidset#
478 **      GUI_EXPAND_RAIDSET : Expand Raid Set
479 **              byte 0,1        : length
480 **              byte 2          : command code 0x52
481 **              byte 3          : raidset#
482 **              byte 4/5/6/7    : device mask for expansion
483 **              byte 8/9/10     : (8:0 no change, 1 change, 0xff:terminate,
484 **                              9:new raid level,
485 **                              10:new stripe size
486 **                              0/1/2/3/4/5->4/8/16/32/64/128K )
487 **              byte 11/12/13   : repeat for each volume in the raidset
488 **      GUI_ACTIVATE_RAIDSET : Activate incomplete raid set
489 **              byte 0,1        : length
490 **              byte 2          : command code 0x53
491 **              byte 3          : raidset#
492 **      GUI_CREATE_HOT_SPARE : Create hot spare disk
493 **              byte 0,1        : length
494 **              byte 2          : command code 0x54
495 **              byte 3/4/5/6    : device mask for hot spare creation
496 **      GUI_DELETE_HOT_SPARE : Delete hot spare disk
497 **              byte 0,1        : length
498 **              byte 2          : command code 0x55
499 **              byte 3/4/5/6    : device mask for hot spare deletion
500 **      GUI_CREATE_VOLUME : Create volume set
501 **              byte 0,1        : length
502 **              byte 2          : command code 0x60
503 **              byte 3          : raidset#
504 **              byte 4-19       : volume set name
505 **                              (if byte4 == 0, use default)
506 **              byte 20-27      : volume capacity (blocks)
507 **              byte 28                 : raid level
508 **              byte 29                 : stripe size
509 **                              (0/1/2/3/4/5->4/8/16/32/64/128K)
510 **              byte 30                 : channel
511 **              byte 31                 : ID
512 **              byte 32                 : LUN
513 **              byte 33                 : 1 enable tag
514 **              byte 34                 : 1 enable cache
515 **              byte 35                 : speed
516 **              (0/1/2/3/4->async/20/40/80/160 for scsi)
517 **              (0/1/2/3/4->33/66/100/133/150 for IDE  )
518 **              byte 36                 : 1 to select quick init
519 **
520 **      GUI_MODIFY_VOLUME : Modify volume Set
521 **              byte 0,1        : length
522 **              byte 2          : command code 0x61
523 **              byte 3          : volumeset#
524 **              byte 4-19       : new volume set name
525 **              (if byte4 == 0, not change)
526 **              byte 20-27      : new volume capacity (reserved)
527 **              byte 28                 : new raid level
528 **              byte 29                 : new stripe size
529 **              (0/1/2/3/4/5->4/8/16/32/64/128K)
530 **              byte 30                 : new channel
531 **              byte 31                 : new ID
532 **              byte 32                 : new LUN
533 **              byte 33                 : 1 enable tag
534 **              byte 34                 : 1 enable cache
535 **              byte 35                 : speed
536 **              (0/1/2/3/4->async/20/40/80/160 for scsi)
537 **              (0/1/2/3/4->33/66/100/133/150 for IDE  )
538 **      GUI_DELETE_VOLUME : Delete volume set
539 **              byte 0,1        : length
540 **              byte 2          : command code 0x62
541 **              byte 3          : volumeset#
542 **      GUI_START_CHECK_VOLUME : Start volume consistency check
543 **              byte 0,1        : length
544 **              byte 2          : command code 0x63
545 **              byte 3          : volumeset#
546 **      GUI_STOP_CHECK_VOLUME : Stop volume consistency check
547 **              byte 0,1        : length
548 **              byte 2          : command code 0x64
549 ** ---------------------------------------------------------------------
550 **    4. Returned data
551 ** ---------------------------------------------------------------------
552 **      (A) Header          : 3 bytes sequence (0x5E, 0x01, 0x61)
553 **      (B) Length          : 2 bytes
554 **                      (low byte 1st, excludes length and checksum byte)
555 **      (C) status or data  :
556 **           <1> If length == 1 ==> 1 byte status code
557 **              #define GUI_OK                    0x41
558 **              #define GUI_RAIDSET_NOT_NORMAL    0x42
559 **              #define GUI_VOLUMESET_NOT_NORMAL  0x43
560 **              #define GUI_NO_RAIDSET            0x44
561 **              #define GUI_NO_VOLUMESET          0x45
562 **              #define GUI_NO_PHYSICAL_DRIVE     0x46
563 **              #define GUI_PARAMETER_ERROR       0x47
564 **              #define GUI_UNSUPPORTED_COMMAND   0x48
565 **              #define GUI_DISK_CONFIG_CHANGED   0x49
566 **              #define GUI_INVALID_PASSWORD      0x4a
567 **              #define GUI_NO_DISK_SPACE         0x4b
568 **              #define GUI_CHECKSUM_ERROR        0x4c
569 **              #define GUI_PASSWORD_REQUIRED     0x4d
570 **           <2> If length > 1 ==>
571 **              data block returned from controller
572 **              and the contents depends on the command code
573 **      (E) Checksum        : checksum of length and status or data byte
574 **************************************************************************