← Documents Documentation/scsi/arcmsr_spec.rst GitHub 원문 ↗

Linux 6.18.37 · SCSI

Areca RAID Controller Firmware Specification

IOP331 Doorbell·PostQ·BIOS handshake와 Areca RS-232 관리 command, RAID·volume 구조체와 반환 status를 byte 단위로 설명합니다.

Source pathDocumentation/scsi/arcmsr_spec.rst
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

요약·해설

arcmsr_spec.rst:1-908

Areca IOP331 firmware와 Linux arcmsr driver 사이의 queue, register, 관리 protocol을 byte와 bit 위치까지 추적하는 규격입니다.

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 ===================
2 ARECA FIRMWARE SPEC
3 ===================
4
5 Usage of IOP331 adapter
6 =======================
7
8 (All In/Out is in IOP331's view)
9
10 1. Message 0
11 ------------
12
13 - InitThread message and return code
14
15 2. Doorbell is used for RS-232 emulation
16 ----------------------------------------
17
18 inDoorBell
19 bit0
20 data in ready
21 zDRIVER DATA WRITE OK)
22 bit1
23 data out has been read
24 (DRIVER DATA READ OK)
25
26 outDooeBell:
27 bit0
28 data out ready
29 (IOP331 DATA WRITE OK)
30 bit1
31 data in has been read
32 (IOP331 DATA READ OK)
33
34 3. Index Memory Usage
35 ---------------------
36
37 ============ ==========================================
38 offset 0xf00 for RS232 out (request buffer)
39 offset 0xe00 for RS232 in (scratch buffer)
40 offset 0xa00 for inbound message code message_rwbuffer
41 (driver send to IOP331)
42 offset 0xa00 for outbound message code message_rwbuffer
43 (IOP331 send to driver)
44 ============ ==========================================
45
46 4. RS-232 emulation
47 -------------------
48
49 Currently 128 byte buffer is used:
50
51 ============ =====================
52 1st uint32_t Data length (1--124)
53 Byte 4--127 Max 124 bytes of data
54 ============ =====================
55
56 5. PostQ
57 --------
58
59 All SCSI Command must be sent through postQ:
60
61 (inbound queue port)
62 Request frame must be 32 bytes aligned:
63
64 #bit27--bit31
65 flag for post ccb
66 #bit0--bit26
67 real address (bit27--bit31) of post arcmsr_cdb
68
69 ===== ===================
70 bit31 == ===============
71 0 256 bytes frame
72 1 512 bytes frame
73 == ===============
74 bit30 == ==============
75 0 normal request
76 1 BIOS request
77 == ==============
78 bit29 reserved
79 bit28 reserved
80 bit27 reserved
81 ===== ===================
82
83 (outbount queue port)
84 Request reply:
85
86 #bit27--bit31
87 flag for reply
88 #bit0--bit26
89 real address (bit27--bit31) of reply arcmsr_cdb
90
91 ===== =======================================================
92 bit31 must be 0 (for this type of reply)
93 bit30 reserved for BIOS handshake
94 bit29 reserved
95 bit28 == ===================================================
96 0 no error, ignore AdapStatus/DevStatus/SenseData
97 1 Error, error code in AdapStatus/DevStatus/SenseData
98 == ===================================================
99 bit27 reserved
100 ===== =======================================================
101
102 6. BIOS request
103 ---------------
104
105 All BIOS request is the same with request from PostQ
106
107 Except:
108
109 Request frame is sent from configuration space:
110
111 ============ ==========================
112 offset: 0x78 Request Frame (bit30 == 1)
113 offset: 0x18 writeonly to generate
114 IRQ to IOP331
115 ============ ==========================
116
117 Completion of request::
118
119 (bit30 == 0, bit28==err flag)
120
121 7. Definition of SGL entry (structure)
122 --------------------------------------
123
124 8. Message1 Out - Diag Status Code (????)
125 -----------------------------------------
126
127 9. Message0 message code
128 ------------------------
129
130 ====== =================================================================
131 0x00 NOP
132 0x01 Get Config
133 ->offset 0xa00 :for outbound message code message_rwbuffer
134 (IOP331 send to driver)
135
136 ===================== ==========================================
137 Signature 0x87974060(4)
138 Request len 0x00000200(4)
139 numbers of queue 0x00000100(4)
140 SDRAM Size 0x00000100(4)-->256 MB
141 IDE Channels 0x00000008(4)
142 vendor 40 bytes char
143 model 8 bytes char
144 FirmVer 16 bytes char
145 Device Map 16 bytes char
146 FirmwareVersion DWORD
147
148 - Added for checking of
149 new firmware capability
150 ===================== ==========================================
151 0x02 Set Config
152 ->offset 0xa00 :for inbound message code message_rwbuffer
153 (driver send to IOP331)
154
155 ========================= ==================
156 Signature 0x87974063(4)
157 UPPER32 of Request Frame (4)-->Driver Only
158 ========================= ==================
159 0x03 Reset (Abort all queued Command)
160 0x04 Stop Background Activity
161 0x05 Flush Cache
162 0x06 Start Background Activity
163 (re-start if background is halted)
164 0x07 Check If Host Command Pending
165 (Novell May Need This Function)
166 0x08 Set controller time
167 ->offset 0xa00 for inbound message code message_rwbuffer
168 (driver to IOP331)
169
170 ====== ==================
171 byte 0 0xaa <-- signature
172 byte 1 0x55 <-- signature
173 byte 2 year (04)
174 byte 3 month (1..12)
175 byte 4 date (1..31)
176 byte 5 hour (0..23)
177 byte 6 minute (0..59)
178 byte 7 second (0..59)
179 ====== ==================
180 ====== =================================================================
181
182
183 RS-232 Interface for Areca Raid Controller
184 ==========================================
185
186 The low level command interface is exclusive with VT100 terminal
187
188 1. Sequence of command execution
189 --------------------------------
190
191 (A) Header
192 3 bytes sequence (0x5E, 0x01, 0x61)
193
194 (B) Command block
195 variable length of data including length,
196 command code, data and checksum byte
197
198 (C) Return data
199 variable length of data
200
201 2. Command block
202 ----------------
203
204 (A) 1st byte
205 command block length (low byte)
206
207 (B) 2nd byte
208 command block length (high byte)
209
210 .. Note:: command block length shouldn't > 2040 bytes,
211 length excludes these two bytes
212
213 (C) 3rd byte
214 command code
215
216 (D) 4th and following bytes
217 variable length data bytes
218
219 depends on command code
220
221 (E) last byte
222 checksum byte (sum of 1st byte until last data byte)
223
224 3. Command code and associated data
225 -----------------------------------
226
227 The following are command code defined in raid controller Command
228 code 0x10--0x1? are used for system level management,
229 no password checking is needed and should be implemented in separate
230 well controlled utility and not for end user access.
231 Command code 0x20--0x?? always check the password,
232 password must be entered to enable these command::
233
234 enum
235 {
236 GUI_SET_SERIAL=0x10,
237 GUI_SET_VENDOR,
238 GUI_SET_MODEL,
239 GUI_IDENTIFY,
240 GUI_CHECK_PASSWORD,
241 GUI_LOGOUT,
242 GUI_HTTP,
243 GUI_SET_ETHERNET_ADDR,
244 GUI_SET_LOGO,
245 GUI_POLL_EVENT,
246 GUI_GET_EVENT,
247 GUI_GET_HW_MONITOR,
248 // GUI_QUICK_CREATE=0x20, (function removed)
249 GUI_GET_INFO_R=0x20,
250 GUI_GET_INFO_V,
251 GUI_GET_INFO_P,
252 GUI_GET_INFO_S,
253 GUI_CLEAR_EVENT,
254 GUI_MUTE_BEEPER=0x30,
255 GUI_BEEPER_SETTING,
256 GUI_SET_PASSWORD,
257 GUI_HOST_INTERFACE_MODE,
258 GUI_REBUILD_PRIORITY,
259 GUI_MAX_ATA_MODE,
260 GUI_RESET_CONTROLLER,
261 GUI_COM_PORT_SETTING,
262 GUI_NO_OPERATION,
263 GUI_DHCP_IP,
264 GUI_CREATE_PASS_THROUGH=0x40,
265 GUI_MODIFY_PASS_THROUGH,
266 GUI_DELETE_PASS_THROUGH,
267 GUI_IDENTIFY_DEVICE,
268 GUI_CREATE_RAIDSET=0x50,
269 GUI_DELETE_RAIDSET,
270 GUI_EXPAND_RAIDSET,
271 GUI_ACTIVATE_RAIDSET,
272 GUI_CREATE_HOT_SPARE,
273 GUI_DELETE_HOT_SPARE,
274 GUI_CREATE_VOLUME=0x60,
275 GUI_MODIFY_VOLUME,
276 GUI_DELETE_VOLUME,
277 GUI_START_CHECK_VOLUME,
278 GUI_STOP_CHECK_VOLUME
279 };
280
281 Command description
282 ^^^^^^^^^^^^^^^^^^^
283
284 GUI_SET_SERIAL
285 Set the controller serial#
286
287 ================ =============================================
288 byte 0,1 length
289 byte 2 command code 0x10
290 byte 3 password length (should be 0x0f)
291 byte 4-0x13 should be "ArEcATecHnoLogY"
292 byte 0x14--0x23 Serial number string (must be 16 bytes)
293 ================ =============================================
294
295 GUI_SET_VENDOR
296 Set vendor string for the controller
297
298 ================ =============================================
299 byte 0,1 length
300 byte 2 command code 0x11
301 byte 3 password length (should be 0x08)
302 byte 4-0x13 should be "ArEcAvAr"
303 byte 0x14--0x3B vendor string (must be 40 bytes)
304 ================ =============================================
305
306 GUI_SET_MODEL
307 Set the model name of the controller
308
309 ================ =============================================
310 byte 0,1 length
311 byte 2 command code 0x12
312 byte 3 password length (should be 0x08)
313 byte 4-0x13 should be "ArEcAvAr"
314 byte 0x14--0x1B model string (must be 8 bytes)
315 ================ =============================================
316
317 GUI_IDENTIFY
318 Identify device
319
320 ================ =============================================
321 byte 0,1 length
322 byte 2 command code 0x13
323 return "Areca RAID Subsystem "
324 ================ =============================================
325
326 GUI_CHECK_PASSWORD
327 Verify password
328
329 ================ =============================================
330 byte 0,1 length
331 byte 2 command code 0x14
332 byte 3 password length
333 byte 4-0x?? user password to be checked
334 ================ =============================================
335
336 GUI_LOGOUT
337 Logout GUI (force password checking on next command)
338
339 ================ =============================================
340 byte 0,1 length
341 byte 2 command code 0x15
342 ================ =============================================
343
344 GUI_HTTP
345 HTTP interface (reserved for Http proxy service)(0x16)
346
347 GUI_SET_ETHERNET_ADDR
348 Set the ethernet MAC address
349
350 ================ =============================================
351 byte 0,1 length
352 byte 2 command code 0x17
353 byte 3 password length (should be 0x08)
354 byte 4-0x13 should be "ArEcAvAr"
355 byte 0x14--0x19 Ethernet MAC address (must be 6 bytes)
356 ================ =============================================
357
358 GUI_SET_LOGO
359 Set logo in HTTP
360
361 ================ =============================================
362 byte 0,1 length
363 byte 2 command code 0x18
364 byte 3 Page# (0/1/2/3) (0xff --> clear OEM logo)
365 byte 4/5/6/7 0x55/0xaa/0xa5/0x5a
366 byte 8 TITLE.JPG data (each page must be 2000 bytes)
367
368 .. Note:: page0 1st 2 byte must be
369 actual length of the JPG file
370 ================ =============================================
371
372 GUI_POLL_EVENT
373 Poll If Event Log Changed
374
375 ================ =============================================
376 byte 0,1 length
377 byte 2 command code 0x19
378 ================ =============================================
379
380 GUI_GET_EVENT
381 Read Event
382
383 ================ =============================================
384 byte 0,1 length
385 byte 2 command code 0x1a
386 byte 3 Event Page (0:1st page/1/2/3:last page)
387 ================ =============================================
388
389 GUI_GET_HW_MONITOR
390 Get HW monitor data
391
392 ================ =============================================
393 byte 0,1 length
394 byte 2 command code 0x1b
395 byte 3 # of FANs(example 2)
396 byte 4 # of Voltage sensor(example 3)
397 byte 5 # of temperature sensor(example 2)
398 byte 6 # of power
399 byte 7/8 Fan#0 (RPM)
400 byte 9/10 Fan#1
401 byte 11/12 Voltage#0 original value in ``*1000``
402 byte 13/14 Voltage#0 value
403 byte 15/16 Voltage#1 org
404 byte 17/18 Voltage#1
405 byte 19/20 Voltage#2 org
406 byte 21/22 Voltage#2
407 byte 23 Temp#0
408 byte 24 Temp#1
409 byte 25 Power indicator (bit0 power#0,
410 bit1 power#1)
411 byte 26 UPS indicator
412 ================ =============================================
413
414 GUI_QUICK_CREATE
415 Quick create raid/volume set
416
417 ================ ==============================================
418 byte 0,1 length
419 byte 2 command code 0x20
420 byte 3/4/5/6 raw capacity
421 byte 7 raid level
422 byte 8 stripe size
423 byte 9 spare
424 byte 10/11/12/13 device mask (the devices to create raid/volume)
425 ================ ==============================================
426
427 This function is removed, application like
428 to implement quick create function
429
430 need to use GUI_CREATE_RAIDSET and GUI_CREATE_VOLUMESET function.
431
432 GUI_GET_INFO_R
433 Get Raid Set Information
434
435 ================ =============================================
436 byte 0,1 length
437 byte 2 command code 0x20
438 byte 3 raidset#
439 ================ =============================================
440
441 ::
442
443 typedef struct sGUI_RAIDSET
444 {
445 BYTE grsRaidSetName[16];
446 DWORD grsCapacity;
447 DWORD grsCapacityX;
448 DWORD grsFailMask;
449 BYTE grsDevArray[32];
450 BYTE grsMemberDevices;
451 BYTE grsNewMemberDevices;
452 BYTE grsRaidState;
453 BYTE grsVolumes;
454 BYTE grsVolumeList[16];
455 BYTE grsRes1;
456 BYTE grsRes2;
457 BYTE grsRes3;
458 BYTE grsFreeSegments;
459 DWORD grsRawStripes[8];
460 DWORD grsRes4;
461 DWORD grsRes5; // Total to 128 bytes
462 DWORD grsRes6; // Total to 128 bytes
463 } sGUI_RAIDSET, *pGUI_RAIDSET;
464
465 GUI_GET_INFO_V
466 Get Volume Set Information
467
468 ================ =============================================
469 byte 0,1 length
470 byte 2 command code 0x21
471 byte 3 volumeset#
472 ================ =============================================
473
474 ::
475
476 typedef struct sGUI_VOLUMESET
477 {
478 BYTE gvsVolumeName[16]; // 16
479 DWORD gvsCapacity;
480 DWORD gvsCapacityX;
481 DWORD gvsFailMask;
482 DWORD gvsStripeSize;
483 DWORD gvsNewFailMask;
484 DWORD gvsNewStripeSize;
485 DWORD gvsVolumeStatus;
486 DWORD gvsProgress; // 32
487 sSCSI_ATTR gvsScsi;
488 BYTE gvsMemberDisks;
489 BYTE gvsRaidLevel; // 8
490 BYTE gvsNewMemberDisks;
491 BYTE gvsNewRaidLevel;
492 BYTE gvsRaidSetNumber;
493 BYTE gvsRes0; // 4
494 BYTE gvsRes1[4]; // 64 bytes
495 } sGUI_VOLUMESET, *pGUI_VOLUMESET;
496
497 GUI_GET_INFO_P
498 Get Physical Drive Information
499
500 ================ =============================================
501 byte 0,1 length
502 byte 2 command code 0x22
503 byte 3 drive # (from 0 to max-channels - 1)
504 ================ =============================================
505
506 ::
507
508 typedef struct sGUI_PHY_DRV
509 {
510 BYTE gpdModelName[40];
511 BYTE gpdSerialNumber[20];
512 BYTE gpdFirmRev[8];
513 DWORD gpdCapacity;
514 DWORD gpdCapacityX; // Reserved for expansion
515 BYTE gpdDeviceState;
516 BYTE gpdPioMode;
517 BYTE gpdCurrentUdmaMode;
518 BYTE gpdUdmaMode;
519 BYTE gpdDriveSelect;
520 BYTE gpdRaidNumber; // 0xff if not belongs to a raid set
521 sSCSI_ATTR gpdScsi;
522 BYTE gpdReserved[40]; // Total to 128 bytes
523 } sGUI_PHY_DRV, *pGUI_PHY_DRV;
524
525 GUI_GET_INFO_S
526 Get System Information
527
528 ================ =============================================
529 byte 0,1 length
530 byte 2 command code 0x23
531 ================ =============================================
532
533 ::
534
535 typedef struct sCOM_ATTR
536 {
537 BYTE comBaudRate;
538 BYTE comDataBits;
539 BYTE comStopBits;
540 BYTE comParity;
541 BYTE comFlowControl;
542 } sCOM_ATTR, *pCOM_ATTR;
543 typedef struct sSYSTEM_INFO
544 {
545 BYTE gsiVendorName[40];
546 BYTE gsiSerialNumber[16];
547 BYTE gsiFirmVersion[16];
548 BYTE gsiBootVersion[16];
549 BYTE gsiMbVersion[16];
550 BYTE gsiModelName[8];
551 BYTE gsiLocalIp[4];
552 BYTE gsiCurrentIp[4];
553 DWORD gsiTimeTick;
554 DWORD gsiCpuSpeed;
555 DWORD gsiICache;
556 DWORD gsiDCache;
557 DWORD gsiScache;
558 DWORD gsiMemorySize;
559 DWORD gsiMemorySpeed;
560 DWORD gsiEvents;
561 BYTE gsiMacAddress[6];
562 BYTE gsiDhcp;
563 BYTE gsiBeeper;
564 BYTE gsiChannelUsage;
565 BYTE gsiMaxAtaMode;
566 BYTE gsiSdramEcc; // 1:if ECC enabled
567 BYTE gsiRebuildPriority;
568 sCOM_ATTR gsiComA; // 5 bytes
569 sCOM_ATTR gsiComB; // 5 bytes
570 BYTE gsiIdeChannels;
571 BYTE gsiScsiHostChannels;
572 BYTE gsiIdeHostChannels;
573 BYTE gsiMaxVolumeSet;
574 BYTE gsiMaxRaidSet;
575 BYTE gsiEtherPort; // 1:if ether net port supported
576 BYTE gsiRaid6Engine; // 1:Raid6 engine supported
577 BYTE gsiRes[75];
578 } sSYSTEM_INFO, *pSYSTEM_INFO;
579
580 GUI_CLEAR_EVENT
581 Clear System Event
582
583 ================ =============================================
584 byte 0,1 length
585 byte 2 command code 0x24
586 ================ =============================================
587
588 GUI_MUTE_BEEPER
589 Mute current beeper
590
591 ================ =============================================
592 byte 0,1 length
593 byte 2 command code 0x30
594 ================ =============================================
595 GUI_BEEPER_SETTING
596 Disable beeper
597
598 ================ =============================================
599 byte 0,1 length
600 byte 2 command code 0x31
601 byte 3 0->disable, 1->enable
602 ================ =============================================
603
604 GUI_SET_PASSWORD
605 Change password
606
607 ================ =============================================
608 byte 0,1 length
609 byte 2 command code 0x32
610 byte 3 pass word length ( must <= 15 )
611 byte 4 password (must be alpha-numerical)
612 ================ =============================================
613
614 GUI_HOST_INTERFACE_MODE
615 Set host interface mode
616
617 ================ =============================================
618 byte 0,1 length
619 byte 2 command code 0x33
620 byte 3 0->Independent, 1->cluster
621 ================ =============================================
622
623 GUI_REBUILD_PRIORITY
624 Set rebuild priority
625
626 ================ =============================================
627 byte 0,1 length
628 byte 2 command code 0x34
629 byte 3 0/1/2/3 (low->high)
630 ================ =============================================
631
632 GUI_MAX_ATA_MODE
633 Set maximum ATA mode to be used
634
635 ================ =============================================
636 byte 0,1 length
637 byte 2 command code 0x35
638 byte 3 0/1/2/3 (133/100/66/33)
639 ================ =============================================
640
641 GUI_RESET_CONTROLLER
642 Reset Controller
643
644 ================ =============================================
645 byte 0,1 length
646 byte 2 command code 0x36
647 * Response with VT100 screen (discard it)
648 ================ =============================================
649
650 GUI_COM_PORT_SETTING
651 COM port setting
652
653 ================ =================================================
654 byte 0,1 length
655 byte 2 command code 0x37
656 byte 3 0->COMA (term port),
657 1->COMB (debug port)
658 byte 4 0/1/2/3/4/5/6/7
659 (1200/2400/4800/9600/19200/38400/57600/115200)
660 byte 5 data bit
661 (0:7 bit, 1:8 bit must be 8 bit)
662 byte 6 stop bit (0:1, 1:2 stop bits)
663 byte 7 parity (0:none, 1:off, 2:even)
664 byte 8 flow control
665 (0:none, 1:xon/xoff, 2:hardware => must use none)
666 ================ =================================================
667
668 GUI_NO_OPERATION
669 No operation
670
671 ================ =============================================
672 byte 0,1 length
673 byte 2 command code 0x38
674 ================ =============================================
675
676 GUI_DHCP_IP
677 Set DHCP option and local IP address
678
679 ================ =============================================
680 byte 0,1 length
681 byte 2 command code 0x39
682 byte 3 0:dhcp disabled, 1:dhcp enabled
683 byte 4/5/6/7 IP address
684 ================ =============================================
685
686 GUI_CREATE_PASS_THROUGH
687 Create pass through disk
688
689 ================ =============================================
690 byte 0,1 length
691 byte 2 command code 0x40
692 byte 3 device #
693 byte 4 scsi channel (0/1)
694 byte 5 scsi id (0-->15)
695 byte 6 scsi lun (0-->7)
696 byte 7 tagged queue (1 enabled)
697 byte 8 cache mode (1 enabled)
698 byte 9 max speed (0/1/2/3/4,
699 async/20/40/80/160 for scsi)
700 (0/1/2/3/4, 33/66/100/133/150 for ide )
701 ================ =============================================
702
703 GUI_MODIFY_PASS_THROUGH
704 Modify pass through disk
705
706 ================ =============================================
707 byte 0,1 length
708 byte 2 command code 0x41
709 byte 3 device #
710 byte 4 scsi channel (0/1)
711 byte 5 scsi id (0-->15)
712 byte 6 scsi lun (0-->7)
713 byte 7 tagged queue (1 enabled)
714 byte 8 cache mode (1 enabled)
715 byte 9 max speed (0/1/2/3/4,
716 async/20/40/80/160 for scsi)
717 (0/1/2/3/4, 33/66/100/133/150 for ide )
718 ================ =============================================
719
720 GUI_DELETE_PASS_THROUGH
721 Delete pass through disk
722
723 ================ =============================================
724 byte 0,1 length
725 byte 2 command code 0x42
726 byte 3 device# to be deleted
727 ================ =============================================
728 GUI_IDENTIFY_DEVICE
729 Identify Device
730
731 ================ =============================================
732 byte 0,1 length
733 byte 2 command code 0x43
734 byte 3 Flash Method
735 (0:flash selected, 1:flash not selected)
736 byte 4/5/6/7 IDE device mask to be flashed
737 .. Note:: no response data available
738 ================ =============================================
739
740 GUI_CREATE_RAIDSET
741 Create Raid Set
742
743 ================ =============================================
744 byte 0,1 length
745 byte 2 command code 0x50
746 byte 3/4/5/6 device mask
747 byte 7-22 raidset name (if byte 7 == 0:use default)
748 ================ =============================================
749
750 GUI_DELETE_RAIDSET
751 Delete Raid Set
752
753 ================ =============================================
754 byte 0,1 length
755 byte 2 command code 0x51
756 byte 3 raidset#
757 ================ =============================================
758
759 GUI_EXPAND_RAIDSET
760 Expand Raid Set
761
762 ================ =============================================
763 byte 0,1 length
764 byte 2 command code 0x52
765 byte 3 raidset#
766 byte 4/5/6/7 device mask for expansion
767 byte 8/9/10 (8:0 no change, 1 change, 0xff:terminate,
768 9:new raid level,
769 10:new stripe size
770 0/1/2/3/4/5->4/8/16/32/64/128K )
771 byte 11/12/13 repeat for each volume in the raidset
772 ================ =============================================
773
774 GUI_ACTIVATE_RAIDSET
775 Activate incomplete raid set
776
777 ================ =============================================
778 byte 0,1 length
779 byte 2 command code 0x53
780 byte 3 raidset#
781 ================ =============================================
782
783 GUI_CREATE_HOT_SPARE
784 Create hot spare disk
785
786 ================ =============================================
787 byte 0,1 length
788 byte 2 command code 0x54
789 byte 3/4/5/6 device mask for hot spare creation
790 ================ =============================================
791
792 GUI_DELETE_HOT_SPARE
793 Delete hot spare disk
794
795 ================ =============================================
796 byte 0,1 length
797 byte 2 command code 0x55
798 byte 3/4/5/6 device mask for hot spare deletion
799 ================ =============================================
800
801 GUI_CREATE_VOLUME
802 Create volume set
803
804 ================ =============================================
805 byte 0,1 length
806 byte 2 command code 0x60
807 byte 3 raidset#
808 byte 4-19 volume set name
809 (if byte4 == 0, use default)
810 byte 20-27 volume capacity (blocks)
811 byte 28 raid level
812 byte 29 stripe size
813 (0/1/2/3/4/5->4/8/16/32/64/128K)
814 byte 30 channel
815 byte 31 ID
816 byte 32 LUN
817 byte 33 1 enable tag
818 byte 34 1 enable cache
819 byte 35 speed
820 (0/1/2/3/4->async/20/40/80/160 for scsi)
821 (0/1/2/3/4->33/66/100/133/150 for IDE )
822 byte 36 1 to select quick init
823 ================ =============================================
824
825 GUI_MODIFY_VOLUME
826 Modify volume Set
827
828 ================ =============================================
829 byte 0,1 length
830 byte 2 command code 0x61
831 byte 3 volumeset#
832 byte 4-19 new volume set name
833 (if byte4 == 0, not change)
834 byte 20-27 new volume capacity (reserved)
835 byte 28 new raid level
836 byte 29 new stripe size
837 (0/1/2/3/4/5->4/8/16/32/64/128K)
838 byte 30 new channel
839 byte 31 new ID
840 byte 32 new LUN
841 byte 33 1 enable tag
842 byte 34 1 enable cache
843 byte 35 speed
844 (0/1/2/3/4->async/20/40/80/160 for scsi)
845 (0/1/2/3/4->33/66/100/133/150 for IDE )
846 ================ =============================================
847
848 GUI_DELETE_VOLUME
849 Delete volume set
850
851 ================ =============================================
852 byte 0,1 length
853 byte 2 command code 0x62
854 byte 3 volumeset#
855 ================ =============================================
856
857 GUI_START_CHECK_VOLUME
858 Start volume consistency check
859
860 ================ =============================================
861 byte 0,1 length
862 byte 2 command code 0x63
863 byte 3 volumeset#
864 ================ =============================================
865
866 GUI_STOP_CHECK_VOLUME
867 Stop volume consistency check
868
869 ================ =============================================
870 byte 0,1 length
871 byte 2 command code 0x64
872 ================ =============================================
873
874 4. Returned data
875 ----------------
876
877 (A) Header
878 3 bytes sequence (0x5E, 0x01, 0x61)
879 (B) Length
880 2 bytes
881 (low byte 1st, excludes length and checksum byte)
882 (C)
883 status or data:
884
885 1) If length == 1 ==> 1 byte status code::
886
887 #define GUI_OK 0x41
888 #define GUI_RAIDSET_NOT_NORMAL 0x42
889 #define GUI_VOLUMESET_NOT_NORMAL 0x43
890 #define GUI_NO_RAIDSET 0x44
891 #define GUI_NO_VOLUMESET 0x45
892 #define GUI_NO_PHYSICAL_DRIVE 0x46
893 #define GUI_PARAMETER_ERROR 0x47
894 #define GUI_UNSUPPORTED_COMMAND 0x48
895 #define GUI_DISK_CONFIG_CHANGED 0x49
896 #define GUI_INVALID_PASSWORD 0x4a
897 #define GUI_NO_DISK_SPACE 0x4b
898 #define GUI_CHECKSUM_ERROR 0x4c
899 #define GUI_PASSWORD_REQUIRED 0x4d
900
901 2) If length > 1:
902
903 data block returned from controller
904 and the contents depends on the command code
905
906 (E) Checksum
907 checksum of length and status or data byte
908
909

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

IOP331 관점의 Doorbell과 Index Memory

1-45

이 규격은 Areca RAID controller의 IOP331 adapter가 host driver와 통신하는 firmware interface를 정의한다. 문서에서 inbound와 outbound는 모두 IOP331 관점이다. Message 0은 InitThread message와 반환 code를 전달하고 Doorbell bit는 RS-232 emulation buffer의 생산·소비 상태를 알린다.

`inDoorBell.bit0`은 driver가 입력 data를 썼음을, `bit1`은 driver가 출력 data를 읽었음을 뜻한다. 반대로 `outDooeBell.bit0`은 IOP331 출력 data 준비, `bit1`은 IOP331이 입력 data를 읽었음을 뜻한다. 원문의 `outDooeBell`과 `zDRIVER` 표기는 그대로 보존했다.

Index Memory에서 `0xf00`은 RS232 request 출력 buffer, `0xe00`은 RS232 입력 scratch buffer다. `0xa00`은 `message_rwbuffer`이며 inbound일 때 driver에서 IOP331으로, outbound일 때 IOP331에서 driver로 이동한다.

Doorbell bit 의미
RegisterBit의미
inDoorBellbit0Driver data 입력 준비
inDoorBellbit1Driver가 출력 data를 읽음
outDooeBellbit0IOP331 data 출력 준비
outDooeBellbit1IOP331이 입력 data를 읽음

IOP331 관점의 완료 신호입니다.

Index Memory 배치
Offset용도방향
0xf00RS232 request bufferIOP331 output
0xe00RS232 scratch bufferIOP331 input
0xa00Inbound message_rwbufferDriver -> IOP331
0xa00Outbound message_rwbufferIOP331 -> Driver

고정 offset별 buffer 용도입니다.

===================
ARECA FIRMWARE SPEC
===================

Usage of IOP331 adapter
=======================

(All In/Out is in IOP331's view)

1. Message 0
------------

- InitThread message and return code

2. Doorbell is used for RS-232 emulation
----------------------------------------

inDoorBell
    bit0
        data in ready
        zDRIVER DATA WRITE OK)
    bit1
        data out has been read
        (DRIVER DATA READ OK)

outDooeBell:
    bit0
        data out ready
        (IOP331 DATA WRITE OK)
    bit1
        data in has been read
        (IOP331 DATA READ OK)

3. Index Memory Usage
---------------------

============   ==========================================
offset 0xf00   for RS232 out (request buffer)
offset 0xe00   for RS232 in  (scratch buffer)
offset 0xa00   for inbound message code message_rwbuffer
               (driver send to IOP331)
offset 0xa00   for outbound message code message_rwbuffer
               (IOP331 send to driver)
============   ==========================================

RS-232 buffer, PostQ와 BIOS request

46-120

RS-232 emulation은 128-byte buffer를 쓴다. 첫 `uint32_t`가 1~124 범위의 data length이고 byte 4~127에 최대 124-byte payload를 둔다.

모든 SCSI command는 inbound PostQ로 보낸다. Request frame은 32-byte 정렬이어야 하며 queue word의 bit 0~26에는 `arcmsr_cdb` 실제 주소를, bit 27~31에는 flag를 싣는다. `bit31=0`은 256-byte frame, `1`은 512-byte frame이고 `bit30=0`은 normal, `1`은 BIOS request다. Bit 27~29는 reserved다.

Outbound queue reply도 bit 0~26으로 reply `arcmsr_cdb` 주소를 돌려준다. 이 reply 형식에서 bit31은 0이고 bit30은 BIOS handshake용이다. `bit28=0`이면 성공이므로 `AdapStatus`, `DevStatus`, `SenseData`를 무시하고, `bit28=1`이면 세 영역에서 error를 읽는다.

BIOS request의 내용은 PostQ request와 같지만 configuration space를 쓴다. Offset `0x78`에 bit30이 설정된 Request Frame을 두고 write-only offset `0x18`에 써서 IOP331 IRQ를 발생시킨다. Completion은 bit30을 0으로 돌리고 bit28을 error flag로 사용한다.

PostQ request flag
Bit의미
310 / 1256 / 512-byte frame
300 / 1Normal / BIOS request
29:27Reserved사용하지 않음
26:0AddressPosted arcmsr_cdb 주소

상위 flag와 하위 주소를 구분합니다.

PostQ reply flag
Bit의미
31반드시 0
30BIOS handshake 예약
29Reserved
280 성공, 1 상태·sense error
27Reserved

오류와 BIOS handshake를 해석합니다.

BIOS request 흐름
0x78 Request Frame, bit30=10x18 write로 IRQFirmware 실행Completion bit30=0bit28 error 확인

Configuration space 예외 경로입니다.

4. RS-232 emulation
-------------------

Currently 128 byte buffer is used:

============   =====================
1st uint32_t   Data length (1--124)
Byte 4--127    Max 124 bytes of data
============   =====================

5. PostQ
--------

All SCSI Command must be sent through postQ:

    (inbound queue port)
        Request frame must be 32 bytes aligned:

            #bit27--bit31
                flag for post ccb
            #bit0--bit26
                real address (bit27--bit31) of post arcmsr_cdb

                =====   ===================
                bit31   ==  ===============
                        0   256 bytes frame
                        1   512 bytes frame
                        ==  ===============
                bit30   ==  ==============
                        0   normal request
                        1   BIOS request
                        ==  ==============
                bit29   reserved
                bit28   reserved
                bit27   reserved
                =====   ===================

    (outbount queue port)
        Request reply:

            #bit27--bit31
                    flag for reply
            #bit0--bit26
                    real address (bit27--bit31) of reply arcmsr_cdb

                    =====   =======================================================
                    bit31   must be 0 (for this type of reply)
                    bit30   reserved for BIOS handshake
                    bit29   reserved
                    bit28   ==  ===================================================
                            0   no error, ignore AdapStatus/DevStatus/SenseData
                            1   Error, error code in AdapStatus/DevStatus/SenseData
                            ==  ===================================================
                    bit27   reserved
                    =====   =======================================================

6. BIOS request
---------------

All BIOS request is the same with request from PostQ

Except:

Request frame is sent from configuration space:

        ============   ==========================
        offset: 0x78   Request Frame (bit30 == 1)
        offset: 0x18   writeonly to generate
                       IRQ to IOP331
        ============   ==========================

Completion of request::

        (bit30 == 0, bit28==err flag)

SGL 자리와 Message 0 code

121-182

원문은 SGL entry 구조와 Message1 outbound diagnostic status code를 제목만 남기고 내용을 정의하지 않는다. 구현에서 빈 절을 임의로 보완하지 말고 firmware revision별 header를 확인해야 한다.

Message 0 code는 `0x00` NOP, `0x01` Get Config, `0x02` Set Config, `0x03` queued command 전체 reset, `0x04` background activity 정지, `0x05` cache flush, `0x06` background activity 재시작, `0x07` host command pending 확인, `0x08` controller time 설정이다.

Get Config는 outbound `0xa00`에서 signature `0x87974060`, request length `0x200`, queue 수 `0x100`, SDRAM 크기, IDE channel 수, vendor·model·firmware 문자열, device map과 `FirmwareVersion` DWORD를 반환한다. 마지막 값은 새 firmware capability 판별용이다.

Set Config는 inbound `0xa00`으로 signature `0x87974063`과 driver 전용 Request Frame 상위 32bit를 보낸다. Controller time packet은 `0xaa 0x55` signature 뒤에 year, month 1~12, date 1~31, hour 0~23, minute와 second 0~59를 둔다.

Message 0 command
CodeCommandData
0x00NOP없음
0x01Get ConfigOutbound 0xa00
0x02Set ConfigInbound 0xa00
0x03ResetQueued command abort
0x04 / 0x06Background stop / start상태 제어
0x05Flush CacheCache 동기화
0x07Host command pendingPending 확인
0x08Set controller time8-byte packet

Firmware control code와 data 방향입니다.

Get Config field
Field값 또는 크기
Signature0x87974060
Request len / queues0x200 / 0x100
SDRAM / IDE ChannelsDWORD / DWORD
vendor / model / FirmVer40 / 8 / 16 bytes
Device Map16 bytes
FirmwareVersionDWORD

고정 signature 뒤의 capability입니다.

7. Definition of SGL entry (structure)
--------------------------------------

8. Message1 Out - Diag Status Code (????)
-----------------------------------------

9. Message0 message code
------------------------

======  =================================================================
0x00    NOP
0x01    Get Config
        ->offset 0xa00 :for outbound message code message_rwbuffer
        (IOP331 send to driver)

        ===================== ==========================================
        Signature             0x87974060(4)
        Request len           0x00000200(4)
        numbers of queue      0x00000100(4)
        SDRAM Size            0x00000100(4)-->256 MB
        IDE Channels          0x00000008(4)
        vendor                40 bytes char
        model                 8 bytes char
        FirmVer               16 bytes char
        Device Map            16 bytes char
        FirmwareVersion       DWORD

                              - Added for checking of
                                new firmware capability
        ===================== ==========================================
0x02    Set Config
        ->offset 0xa00 :for inbound message code message_rwbuffer
        (driver send to IOP331)

        ========================= ==================
        Signature                 0x87974063(4)
        UPPER32 of Request Frame  (4)-->Driver Only
        ========================= ==================
0x03    Reset (Abort all queued Command)
0x04    Stop Background Activity
0x05    Flush Cache
0x06    Start Background Activity
        (re-start if background is halted)
0x07    Check If Host Command Pending
        (Novell May Need This Function)
0x08    Set controller time
        ->offset 0xa00   for inbound message code message_rwbuffer
        (driver to IOP331)

        ======   ==================
        byte 0   0xaa <-- signature
        byte 1   0x55 <-- signature
        byte 2   year (04)
        byte 3   month (1..12)
        byte 4   date (1..31)
        byte 5   hour (0..23)
        byte 6   minute (0..59)
        byte 7   second (0..59)
        ======   ==================
======  =================================================================

RS-232 command frame과 권한 범위

183-280

Areca low-level command interface는 VT100 terminal과 상호 배타적이다. Transaction은 3-byte header `0x5E, 0x01, 0x61`, 가변 command block, 가변 return data 순서다.

Command block의 byte 0과 1은 little-endian length이며 이 두 byte 자체는 길이에서 제외된다. 길이는 2040 byte를 넘을 수 없다. Byte 2는 command code, byte 3 이후는 command별 data, 마지막 byte는 첫 length byte부터 마지막 data byte까지 더한 checksum이다.

`0x10`대 system-level command는 password를 검사하지 않으므로 end-user tool에 직접 노출하지 말고 별도로 통제된 utility에서 구현해야 한다. `0x20` 이상 command는 password를 항상 검사하며 먼저 password를 입력해 활성화해야 한다.

Enum은 OEM·identity·event `0x10`대, 조회 `0x20`대, controller 설정 `0x30`대, pass-through `0x40`대, RAID set `0x50`대, volume `0x60`대로 나뉜다. 제거된 `GUI_QUICK_CREATE` 주석과 실제 `GUI_GET_INFO_R=0x20` 재사용을 혼동하지 않는다.

Command block
위치내용
Byte 0Length low
Byte 1Length high, 최대 2040
Byte 2Command code
Byte 3..NCommand별 data
마지막 byteLength부터 data까지 checksum

Length와 checksum 범위입니다.

Command family
범위대상Password
0x10-0x1bSystem·OEM·event검사 없음, 별도 통제
0x20-0x24정보 조회필요
0x30-0x39Controller 설정필요
0x40-0x43Pass-through필요
0x50-0x55RAID set·spare필요
0x60-0x64Volume·check필요

관리 대상과 인증 정책입니다.

RS-232 transaction
Header 수신Length 검사Code와 payload 해석Checksum 검증Command 실행Return frame

Frame 처리 순서입니다.

RS-232 Interface for Areca Raid Controller
==========================================

      The low level command interface is exclusive with VT100 terminal

1. Sequence of command execution
--------------------------------

        (A) Header
                3 bytes sequence (0x5E, 0x01, 0x61)

        (B) Command block
                variable length of data including length,
                command code, data and checksum byte

        (C) Return data
                variable length of data

2. Command block
----------------

        (A) 1st byte
                command block length (low byte)

        (B) 2nd byte
                command block length (high byte)

                .. Note:: command block length shouldn't > 2040 bytes,
                          length excludes these two bytes

        (C) 3rd byte
                command code

        (D) 4th and following bytes
                variable length data bytes

            depends on command code

        (E) last byte
            checksum byte (sum of 1st byte until last data byte)

3. Command code and associated data
-----------------------------------

The following are command code defined in raid controller Command
code 0x10--0x1? are used for system level management,
no password checking is needed and should be implemented in separate
well controlled utility and not for end user access.
Command code 0x20--0x?? always check the password,
password must be entered to enable these command::

        enum
        {
                GUI_SET_SERIAL=0x10,
                GUI_SET_VENDOR,
                GUI_SET_MODEL,
                GUI_IDENTIFY,
                GUI_CHECK_PASSWORD,
                GUI_LOGOUT,
                GUI_HTTP,
                GUI_SET_ETHERNET_ADDR,
                GUI_SET_LOGO,
                GUI_POLL_EVENT,
                GUI_GET_EVENT,
                GUI_GET_HW_MONITOR,
                //    GUI_QUICK_CREATE=0x20, (function removed)
                GUI_GET_INFO_R=0x20,
                GUI_GET_INFO_V,
                GUI_GET_INFO_P,
                GUI_GET_INFO_S,
                GUI_CLEAR_EVENT,
                GUI_MUTE_BEEPER=0x30,
                GUI_BEEPER_SETTING,
                GUI_SET_PASSWORD,
                GUI_HOST_INTERFACE_MODE,
                GUI_REBUILD_PRIORITY,
                GUI_MAX_ATA_MODE,
                GUI_RESET_CONTROLLER,
                GUI_COM_PORT_SETTING,
                GUI_NO_OPERATION,
                GUI_DHCP_IP,
                GUI_CREATE_PASS_THROUGH=0x40,
                GUI_MODIFY_PASS_THROUGH,
                GUI_DELETE_PASS_THROUGH,
                GUI_IDENTIFY_DEVICE,
                GUI_CREATE_RAIDSET=0x50,
                GUI_DELETE_RAIDSET,
                GUI_EXPAND_RAIDSET,
                GUI_ACTIVATE_RAIDSET,
                GUI_CREATE_HOT_SPARE,
                GUI_DELETE_HOT_SPARE,
                GUI_CREATE_VOLUME=0x60,
                GUI_MODIFY_VOLUME,
                GUI_DELETE_VOLUME,
                GUI_START_CHECK_VOLUME,
                GUI_STOP_CHECK_VOLUME
        };

OEM, 인증, event와 hardware monitor

281-413

`GUI_SET_SERIAL(0x10)`은 password length `0x0f`, token `ArEcATecHnoLogY`, 16-byte serial을 받는다. `GUI_SET_VENDOR(0x11)`과 `GUI_SET_MODEL(0x12)`은 length `0x08`과 token `ArEcAvAr` 뒤에 각각 40-byte vendor, 8-byte model을 둔다.

`GUI_IDENTIFY(0x13)`은 `Areca RAID Subsystem ` 문자열을 반환한다. `GUI_CHECK_PASSWORD(0x14)`는 byte 3 길이만큼 password를 검사하고 `GUI_LOGOUT(0x15)`은 다음 command부터 검사를 강제한다. `GUI_HTTP(0x16)`은 HTTP proxy용 reserved interface다.

`GUI_SET_ETHERNET_ADDR(0x17)`은 OEM token 뒤에 6-byte MAC을 둔다. `GUI_SET_LOGO(0x18)`는 page 0~3과 magic `55 aa a5 5a`, page당 2000-byte `TITLE.JPG`를 전송한다. Page `0xff`는 logo를 지우며 page 0의 첫 2 byte는 실제 JPG 길이다.

`GUI_POLL_EVENT(0x19)`는 log 변경 여부를 확인하고 `GUI_GET_EVENT(0x1a)`는 page 0~3을 읽는다. `GUI_GET_HW_MONITOR(0x1b)` 응답은 fan·voltage·temperature·power 개수, RPM, voltage 원값과 측정값, 온도, power bit, UPS indicator 순서다.

0x10대 command
CodeSymbolPayload
0x10SET_SERIALToken + 16-byte serial
0x11SET_VENDORToken + 40-byte vendor
0x12SET_MODELToken + 8-byte model
0x13IDENTIFYIdentity 반환
0x14 / 15PASSWORD / LOGOUT인증 session
0x16HTTPReserved
0x17SET_ETHERNET_ADDR6-byte MAC
0x18SET_LOGO4 pages
0x19 / 1aPOLL / GET_EVENTEvent
0x1bGET_HW_MONITORSensor block

고정 크기와 역할입니다.

Hardware monitor 응답
Byte
3-6Fan, voltage, temperature, power 개수
7-10Fan 0·1 RPM
11-22Voltage 0~2 원값·측정값
23-24Temperature 0·1
25Power 0·1 indicator
26UPS indicator

예시 byte 배치입니다.

Command description
^^^^^^^^^^^^^^^^^^^

GUI_SET_SERIAL
        Set the controller serial#

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x10
        byte 3            password length (should be 0x0f)
        byte 4-0x13       should be "ArEcATecHnoLogY"
        byte 0x14--0x23   Serial number string (must be 16 bytes)
        ================  =============================================

GUI_SET_VENDOR
        Set vendor string for the controller

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x11
        byte 3            password length (should be 0x08)
        byte 4-0x13       should be "ArEcAvAr"
        byte 0x14--0x3B   vendor string (must be 40 bytes)
        ================  =============================================

GUI_SET_MODEL
        Set the model name of the controller

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x12
        byte 3            password length (should be 0x08)
        byte 4-0x13       should be "ArEcAvAr"
        byte 0x14--0x1B   model string (must be 8 bytes)
        ================  =============================================

GUI_IDENTIFY
        Identify device

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x13
                            return "Areca RAID Subsystem "
        ================  =============================================

GUI_CHECK_PASSWORD
        Verify password

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x14
        byte 3            password length
        byte 4-0x??       user password to be checked
        ================  =============================================

GUI_LOGOUT
        Logout GUI (force password checking on next command)

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x15
        ================  =============================================

GUI_HTTP
        HTTP interface (reserved for Http proxy service)(0x16)

GUI_SET_ETHERNET_ADDR
        Set the ethernet MAC address

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x17
        byte 3            password length (should be 0x08)
        byte 4-0x13       should be "ArEcAvAr"
        byte 0x14--0x19   Ethernet MAC address (must be 6 bytes)
        ================  =============================================

GUI_SET_LOGO
        Set logo in HTTP

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x18
        byte 3            Page# (0/1/2/3) (0xff --> clear OEM logo)
        byte 4/5/6/7      0x55/0xaa/0xa5/0x5a
        byte 8            TITLE.JPG data (each page must be 2000 bytes)

                          .. Note:: page0 1st 2 byte must be
                                    actual length of the JPG file
        ================  =============================================

GUI_POLL_EVENT
        Poll If Event Log Changed

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x19
        ================  =============================================

GUI_GET_EVENT
        Read Event

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x1a
        byte 3            Event Page (0:1st page/1/2/3:last page)
        ================  =============================================

GUI_GET_HW_MONITOR
        Get HW monitor data

        ================  =============================================
        byte 0,1          length
        byte 2                   command code 0x1b
        byte 3                   # of FANs(example 2)
        byte 4                   # of Voltage sensor(example 3)
        byte 5                   # of temperature sensor(example 2)
        byte 6                   # of power
        byte 7/8          Fan#0 (RPM)
        byte 9/10         Fan#1
        byte 11/12           Voltage#0 original value in ``*1000``
        byte 13/14           Voltage#0 value
        byte 15/16           Voltage#1 org
        byte 17/18           Voltage#1
        byte 19/20           Voltage#2 org
        byte 21/22           Voltage#2
        byte 23           Temp#0
        byte 24           Temp#1
        byte 25           Power indicator (bit0   power#0,
                          bit1   power#1)
        byte 26           UPS indicator
        ================  =============================================

RAID·volume·drive·system 정보 구조체

414-579

제거된 `GUI_QUICK_CREATE`는 capacity, RAID level, stripe, spare, device mask를 받았지만 application은 `GUI_CREATE_RAIDSET`과 `GUI_CREATE_VOLUMESET` 조합을 사용해야 한다.

`GUI_GET_INFO_R(0x20)`은 `sGUI_RAIDSET`을 읽는다. 16-byte 이름, capacity, fail mask, 32개 device 배열, 현재·새 member 수, state, volume 수와 목록, free segment, raw stripe 8개와 reserved DWORD를 포함해 총 128 byte다.

`GUI_GET_INFO_V(0x21)`의 64-byte `sGUI_VOLUMESET`은 이름, 현재·확장 capacity, fail·stripe의 현재와 새 값, status, progress, `sSCSI_ATTR`, member 수·RAID level의 현재와 새 값, 소속 RAID set 번호를 담는다.

`GUI_GET_INFO_P(0x22)`의 128-byte `sGUI_PHY_DRV`는 40-byte model, 20-byte serial, 8-byte firmware, capacity, device·PIO·UDMA 상태, drive select, 소속 RAID 번호와 `sSCSI_ATTR`을 담는다. 소속 set이 없으면 `gpdRaidNumber=0xff`다.

`GUI_GET_INFO_S(0x23)`의 `sSYSTEM_INFO`에는 식별 문자열, local/current IP, tick·CPU·cache·memory·event 값, MAC, DHCP·beeper·ATA·ECC·rebuild 설정, 두 `sCOM_ATTR`, channel 수, 최대 volume/RAID set, Ethernet·RAID6 capability가 있다. `GUI_CLEAR_EVENT(0x24)`는 system event를 지운다.

정보 조회
Code입력반환
0x20raidset#sGUI_RAIDSET, 128 bytes
0x21volumeset#sGUI_VOLUMESET, 64 bytes
0x22drive#sGUI_PHY_DRV, 128 bytes
0x23없음sSYSTEM_INFO
0x24없음Event clear status

Index와 반환 구조입니다.

sSYSTEM_INFO 영역
영역대표 field
식별Vendor, serial, versions, model
NetworkLocal/current IP, MAC, DHCP
성능CPU, cache, memory
정책Beeper, ATA, ECC, rebuild
PortCOM A/B, IDE/SCSI channels
CapabilityMax sets, Ethernet, RAID6

Field를 기능별로 묶습니다.

GUI_QUICK_CREATE
        Quick create raid/volume set

        ================  ==============================================
        byte 0,1                 length
        byte 2                   command code 0x20
        byte 3/4/5/6             raw capacity
        byte 7                   raid level
        byte 8                   stripe size
        byte 9                   spare
        byte 10/11/12/13  device mask (the devices to create raid/volume)
        ================  ==============================================

    This function is removed, application like
    to implement quick create function

    need to use GUI_CREATE_RAIDSET and GUI_CREATE_VOLUMESET function.

GUI_GET_INFO_R
        Get Raid Set Information

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x20
        byte 3            raidset#
        ================  =============================================

        ::

            typedef struct sGUI_RAIDSET
            {
                    BYTE grsRaidSetName[16];
                    DWORD grsCapacity;
                    DWORD grsCapacityX;
                    DWORD grsFailMask;
                    BYTE grsDevArray[32];
                    BYTE grsMemberDevices;
                    BYTE grsNewMemberDevices;
                    BYTE grsRaidState;
                    BYTE grsVolumes;
                    BYTE grsVolumeList[16];
                    BYTE grsRes1;
                    BYTE grsRes2;
                    BYTE grsRes3;
                    BYTE grsFreeSegments;
                    DWORD grsRawStripes[8];
                    DWORD grsRes4;
                    DWORD grsRes5; //     Total to 128 bytes
                    DWORD grsRes6; //     Total to 128 bytes
            } sGUI_RAIDSET, *pGUI_RAIDSET;

GUI_GET_INFO_V
        Get Volume Set Information

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x21
        byte 3            volumeset#
        ================  =============================================

        ::

            typedef struct sGUI_VOLUMESET
            {
                    BYTE gvsVolumeName[16]; //     16
                    DWORD gvsCapacity;
                    DWORD gvsCapacityX;
                    DWORD gvsFailMask;
                    DWORD gvsStripeSize;
                    DWORD gvsNewFailMask;
                    DWORD gvsNewStripeSize;
                    DWORD gvsVolumeStatus;
                    DWORD gvsProgress; //     32
                    sSCSI_ATTR gvsScsi;
                    BYTE gvsMemberDisks;
                    BYTE gvsRaidLevel; //     8
                    BYTE gvsNewMemberDisks;
                    BYTE gvsNewRaidLevel;
                    BYTE gvsRaidSetNumber;
                    BYTE gvsRes0; //     4
                    BYTE gvsRes1[4]; //     64 bytes
            } sGUI_VOLUMESET, *pGUI_VOLUMESET;

GUI_GET_INFO_P
        Get Physical Drive Information

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x22
        byte 3            drive # (from 0 to max-channels - 1)
        ================  =============================================

        ::

            typedef struct sGUI_PHY_DRV
            {
                    BYTE gpdModelName[40];
                    BYTE gpdSerialNumber[20];
                    BYTE gpdFirmRev[8];
                    DWORD gpdCapacity;
                    DWORD gpdCapacityX; //     Reserved for expansion
                    BYTE gpdDeviceState;
                    BYTE gpdPioMode;
                    BYTE gpdCurrentUdmaMode;
                    BYTE gpdUdmaMode;
                    BYTE gpdDriveSelect;
                    BYTE gpdRaidNumber; //     0xff if not belongs to a raid set
                    sSCSI_ATTR gpdScsi;
                    BYTE gpdReserved[40]; //     Total to 128 bytes
            } sGUI_PHY_DRV, *pGUI_PHY_DRV;

GUI_GET_INFO_S
        Get System Information

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x23
        ================  =============================================

        ::

            typedef struct sCOM_ATTR
            {
                    BYTE comBaudRate;
                    BYTE comDataBits;
                    BYTE comStopBits;
                    BYTE comParity;
                    BYTE comFlowControl;
            } sCOM_ATTR, *pCOM_ATTR;
            typedef struct sSYSTEM_INFO
            {
                    BYTE gsiVendorName[40];
                    BYTE gsiSerialNumber[16];
                    BYTE gsiFirmVersion[16];
                    BYTE gsiBootVersion[16];
                    BYTE gsiMbVersion[16];
                    BYTE gsiModelName[8];
                    BYTE gsiLocalIp[4];
                    BYTE gsiCurrentIp[4];
                    DWORD gsiTimeTick;
                    DWORD gsiCpuSpeed;
                    DWORD gsiICache;
                    DWORD gsiDCache;
                    DWORD gsiScache;
                    DWORD gsiMemorySize;
                    DWORD gsiMemorySpeed;
                    DWORD gsiEvents;
                    BYTE gsiMacAddress[6];
                    BYTE gsiDhcp;
                    BYTE gsiBeeper;
                    BYTE gsiChannelUsage;
                    BYTE gsiMaxAtaMode;
                    BYTE gsiSdramEcc; //     1:if ECC enabled
                    BYTE gsiRebuildPriority;
                    sCOM_ATTR gsiComA; //     5 bytes
                    sCOM_ATTR gsiComB; //     5 bytes
                    BYTE gsiIdeChannels;
                    BYTE gsiScsiHostChannels;
                    BYTE gsiIdeHostChannels;
                    BYTE gsiMaxVolumeSet;
                    BYTE gsiMaxRaidSet;
                    BYTE gsiEtherPort; //     1:if ether net port supported
                    BYTE gsiRaid6Engine; //     1:Raid6 engine supported
                    BYTE gsiRes[75];
            } sSYSTEM_INFO, *pSYSTEM_INFO;

Beeper, password, interface와 통신 설정

580-685

`GUI_CLEAR_EVENT(0x24)`는 event를 지운다. `GUI_MUTE_BEEPER(0x30)`는 현재 beeper만 음소거하고 `GUI_BEEPER_SETTING(0x31)`은 byte 3의 0/1로 비활성화·활성화한다.

`GUI_SET_PASSWORD(0x32)`는 최대 15자의 영숫자 password를 설정한다. `GUI_HOST_INTERFACE_MODE(0x33)`은 0 independent, 1 cluster이고 `GUI_REBUILD_PRIORITY(0x34)`는 0~3 low-to-high다. `GUI_MAX_ATA_MODE(0x35)`의 0~3은 133/100/66/33이다.

`GUI_RESET_CONTROLLER(0x36)` 응답의 VT100 화면은 버린다. `GUI_COM_PORT_SETTING(0x37)`은 COMA terminal 또는 COMB debug, 1200~115200 baud, data·stop bit, parity, flow control을 설정한다. Data는 반드시 8bit, flow control은 none을 써야 한다.

`GUI_NO_OPERATION(0x38)`은 상태 변화가 없다. `GUI_DHCP_IP(0x39)`는 byte 3으로 DHCP를 끄거나 켜고 byte 4~7에 local IPv4 address를 둔다.

0x30대 설정
Code설정
0x30현재 beeper mute없음
0x31Beeper policy0 / 1
0x32Password영숫자 최대 15
0x33Host modeIndependent / cluster
0x34Rebuild priority0~3
0x35Maximum ATA133/100/66/33
0x36ResetVT100 폐기
0x37COMPort·baud·frame
0x38NOP없음
0x39DHCP/IPFlag + IPv4

Selector와 허용 값입니다.

COM port field
Byte의미
3COMA / COMB
41200~115200 selector
5Data bit, 반드시 8bit
61 / 2 stop bits
7Parity
8Flow control, 반드시 none

고정 제약을 포함합니다.

GUI_CLEAR_EVENT
        Clear System Event

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x24
        ================  =============================================

GUI_MUTE_BEEPER
        Mute current beeper

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x30
        ================  =============================================
GUI_BEEPER_SETTING
        Disable beeper

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x31
        byte 3            0->disable, 1->enable
        ================  =============================================

GUI_SET_PASSWORD
        Change password

        ================  =============================================
        byte 0,1          length
        byte 2                   command code 0x32
        byte 3                   pass word length ( must <= 15 )
        byte 4                   password (must be alpha-numerical)
        ================  =============================================

GUI_HOST_INTERFACE_MODE
        Set host interface mode

        ================  =============================================
        byte 0,1          length
        byte 2                   command code 0x33
        byte 3                   0->Independent, 1->cluster
        ================  =============================================

GUI_REBUILD_PRIORITY
        Set rebuild priority

        ================  =============================================
        byte 0,1          length
        byte 2                   command code 0x34
        byte 3                   0/1/2/3 (low->high)
        ================  =============================================

GUI_MAX_ATA_MODE
        Set maximum ATA mode to be used

        ================  =============================================
        byte 0,1          length
        byte 2                   command code 0x35
        byte 3                   0/1/2/3 (133/100/66/33)
        ================  =============================================

GUI_RESET_CONTROLLER
        Reset Controller

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x36
                          * Response with VT100 screen (discard it)
        ================  =============================================

GUI_COM_PORT_SETTING
        COM port setting

        ================  =================================================
        byte 0,1          length
        byte 2                   command code 0x37
        byte 3                   0->COMA (term port),
                          1->COMB (debug port)
        byte 4                   0/1/2/3/4/5/6/7
                          (1200/2400/4800/9600/19200/38400/57600/115200)
        byte 5                   data bit
                          (0:7 bit, 1:8 bit   must be 8 bit)
        byte 6                   stop bit (0:1, 1:2 stop bits)
        byte 7                   parity (0:none, 1:off, 2:even)
        byte 8                   flow control
                          (0:none, 1:xon/xoff, 2:hardware => must use none)
        ================  =================================================

GUI_NO_OPERATION
        No operation

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x38
        ================  =============================================

GUI_DHCP_IP
        Set DHCP option and local IP address

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x39
        byte 3            0:dhcp disabled, 1:dhcp enabled
        byte 4/5/6/7      IP address
        ================  =============================================

Pass-through disk와 device 식별

686-739

`GUI_CREATE_PASS_THROUGH(0x40)`과 `GUI_MODIFY_PASS_THROUGH(0x41)`은 같은 payload를 쓴다. Byte 3은 device, 4는 SCSI channel 0/1, 5는 ID 0~15, 6은 LUN 0~7, 7은 tagged queue, 8은 cache, 9는 최대 속도다.

속도 selector 0~4는 SCSI에서 async/20/40/80/160이고 IDE에서는 33/66/100/133/150이다. 같은 숫자를 interface 종류 없이 해석하면 안 된다.

`GUI_DELETE_PASS_THROUGH(0x42)`는 byte 3 device를 삭제한다. `GUI_IDENTIFY_DEVICE(0x43)`은 byte 3에서 0이면 선택 device를 flash하고 1이면 선택하지 않으며 byte 4~7의 IDE mask를 쓴다. Response data는 없다.

Pass-through payload
ByteField
3DeviceNumber
4SCSI channel0 / 1
5SCSI ID0~15
6SCSI LUN0~7
7Tagged queue1 enable
8Cache1 enable
9SpeedInterface별 0~4

Create와 modify의 공통 layout입니다.

0x40대 command
CodeSymbol동작
0x40CREATE_PASS_THROUGH생성
0x41MODIFY_PASS_THROUGH수정
0x42DELETE_PASS_THROUGH삭제
0x43IDENTIFY_DEVICEMask flash, 응답 없음

동작을 구분합니다.

GUI_CREATE_PASS_THROUGH
        Create pass through disk

        ================  =============================================
        byte 0,1          length
        byte 2                   command code 0x40
        byte 3                   device #
        byte 4                   scsi channel (0/1)
        byte 5                   scsi id (0-->15)
        byte 6                   scsi lun (0-->7)
        byte 7                   tagged queue (1   enabled)
        byte 8                   cache mode (1   enabled)
        byte 9                   max speed (0/1/2/3/4,
                          async/20/40/80/160 for scsi)
                          (0/1/2/3/4, 33/66/100/133/150 for ide  )
        ================  =============================================

GUI_MODIFY_PASS_THROUGH
        Modify pass through disk

        ================  =============================================
        byte 0,1          length
        byte 2                   command code 0x41
        byte 3                   device #
        byte 4                   scsi channel (0/1)
        byte 5                   scsi id (0-->15)
        byte 6                   scsi lun (0-->7)
        byte 7                   tagged queue (1   enabled)
        byte 8                   cache mode (1   enabled)
        byte 9                   max speed (0/1/2/3/4,
                          async/20/40/80/160 for scsi)
                          (0/1/2/3/4, 33/66/100/133/150 for ide  )
        ================  =============================================

GUI_DELETE_PASS_THROUGH
        Delete pass through disk

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x42
        byte 3            device# to be deleted
        ================  =============================================
GUI_IDENTIFY_DEVICE
        Identify Device

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x43
        byte 3            Flash Method
                          (0:flash selected, 1:flash not selected)
        byte 4/5/6/7      IDE device mask to be flashed
                          .. Note:: no response data available
        ================  =============================================

RAID set 확장과 hot spare

740-800

`GUI_CREATE_RAIDSET(0x50)`은 byte 3~6 device mask와 byte 7~22 이름으로 set을 만든다. 이름 첫 byte가 0이면 기본값이다. `GUI_DELETE_RAIDSET(0x51)`과 `GUI_ACTIVATE_RAIDSET(0x53)`은 byte 3의 raidset 번호를 삭제하거나 incomplete set을 활성화한다.

`GUI_EXPAND_RAIDSET(0x52)`은 raidset 번호, 확장 mask, volume별 3-byte tuple을 받는다. 첫 byte는 0 유지, 1 변경, `0xff` 종료이고 다음은 새 RAID level, 마지막은 stripe selector 0~5, 즉 4/8/16/32/64/128K다. Byte 11부터 각 volume에 반복한다.

`GUI_CREATE_HOT_SPARE(0x54)`와 `GUI_DELETE_HOT_SPARE(0x55)`는 byte 3~6 mask의 disk를 hot spare로 만들거나 해제한다.

RAID set command
Code동작Payload
0x50CreateMask + name
0x51Deleteraidset#
0x52Expandraidset# + mask + tuples
0x53Activateraidset#
0x54Create spareMask
0x55Delete spareMask

Selector와 payload입니다.

RAID set 확장
Raidset 선택Device maskChange flag새 RAID levelStripe 4~128K다음 volume 또는 종료

Volume tuple 순회입니다.

GUI_CREATE_RAIDSET
        Create Raid Set

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x50
        byte 3/4/5/6      device mask
        byte 7-22         raidset name (if byte 7 == 0:use default)
        ================  =============================================

GUI_DELETE_RAIDSET
        Delete Raid Set

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x51
        byte 3            raidset#
        ================  =============================================

GUI_EXPAND_RAIDSET
        Expand Raid Set

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x52
        byte 3            raidset#
        byte 4/5/6/7      device mask for expansion
        byte 8/9/10       (8:0 no change, 1 change, 0xff:terminate,
                          9:new raid level,
                          10:new stripe size
                          0/1/2/3/4/5->4/8/16/32/64/128K )
        byte 11/12/13     repeat for each volume in the raidset
        ================  =============================================

GUI_ACTIVATE_RAIDSET
        Activate incomplete raid set

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x53
        byte 3            raidset#
        ================  =============================================

GUI_CREATE_HOT_SPARE
        Create hot spare disk

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x54
        byte 3/4/5/6      device mask for hot spare creation
        ================  =============================================

GUI_DELETE_HOT_SPARE
        Delete hot spare disk

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x55
        byte 3/4/5/6      device mask for hot spare deletion
        ================  =============================================

Volume 생성·수정·삭제와 consistency check

801-873

`GUI_CREATE_VOLUME(0x60)`은 raidset 번호, 16-byte 이름, byte 20~27 block capacity, RAID level, stripe, channel·ID·LUN, tag·cache, interface별 speed, quick initialization flag를 받는다. 이름 첫 byte가 0이면 기본 이름이다.

`GUI_MODIFY_VOLUME(0x61)`은 volumeset 번호와 새 속성을 같은 위치에 둔다. 이름 첫 byte가 0이면 유지하고 capacity field는 reserved다. RAID level, stripe, channel, ID, LUN, tag, cache, speed를 갱신한다.

Stripe selector 0~5는 4/8/16/32/64/128K다. Speed 0~4는 SCSI에서 async/20/40/80/160, IDE에서 33/66/100/133/150이다.

`GUI_DELETE_VOLUME(0x62)`는 지정 volumeset을 삭제한다. `GUI_START_CHECK_VOLUME(0x63)`은 consistency check를 시작하고 `GUI_STOP_CHECK_VOLUME(0x64)`은 진행 중인 check를 중지한다.

Volume command
CodeSymbol대상
0x60CREATE_VOLUMERaidset + 새 속성
0x61MODIFY_VOLUMEVolumeset + 변경
0x62DELETE_VOLUMEvolumeset#
0x63START_CHECKvolumeset#
0x64STOP_CHECK현재 check

생명 주기와 검사입니다.

Volume create layout
ByteField
3raidset#
4-19Name
20-27Capacity blocks
28-29RAID / stripe
30-32Channel / ID / LUN
33-34Tag / cache
35Speed
36Quick init

Field 범위입니다.

GUI_CREATE_VOLUME
        Create volume set

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x60
        byte 3            raidset#
        byte 4-19         volume set name
                          (if byte4 == 0, use default)
        byte 20-27        volume capacity (blocks)
        byte 28           raid level
        byte 29           stripe size
                          (0/1/2/3/4/5->4/8/16/32/64/128K)
        byte 30           channel
        byte 31           ID
        byte 32           LUN
        byte 33           1 enable tag
        byte 34           1 enable cache
        byte 35           speed
                          (0/1/2/3/4->async/20/40/80/160 for scsi)
                          (0/1/2/3/4->33/66/100/133/150 for IDE  )
        byte 36           1 to select quick init
        ================  =============================================

GUI_MODIFY_VOLUME
        Modify volume Set

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x61
        byte 3            volumeset#
        byte 4-19         new volume set name
                          (if byte4 == 0, not change)
        byte 20-27        new volume capacity (reserved)
        byte 28           new raid level
        byte 29           new stripe size
                          (0/1/2/3/4/5->4/8/16/32/64/128K)
        byte 30           new channel
        byte 31           new ID
        byte 32           new LUN
        byte 33           1 enable tag
        byte 34           1 enable cache
        byte 35           speed
                          (0/1/2/3/4->async/20/40/80/160 for scsi)
                          (0/1/2/3/4->33/66/100/133/150 for IDE  )
        ================  =============================================

GUI_DELETE_VOLUME
        Delete volume set

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x62
        byte 3            volumeset#
        ================  =============================================

GUI_START_CHECK_VOLUME
        Start volume consistency check

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x63
        byte 3            volumeset#
        ================  =============================================

GUI_STOP_CHECK_VOLUME
        Stop volume consistency check

        ================  =============================================
        byte 0,1          length
        byte 2            command code 0x64
        ================  =============================================

Return frame과 GUI status code

874-908

응답은 request와 같은 header `0x5E, 0x01, 0x61`로 시작한다. 다음 2 byte는 low-byte 우선 length이며 length와 checksum byte 자체는 길이에서 제외한다.

Length가 1이면 payload는 status code다. `GUI_OK(0x41)`부터 RAID·volume 상태 이상, object 부재, parameter·command·password·space·checksum error와 password required를 `0x42`~`0x4d`로 표현한다. Length가 1보다 크면 command별 data block이다.

마지막 checksum은 length와 status 또는 data byte를 대상으로 계산한다. Parser는 header, length, payload 종류, checksum 순서로 검증한 뒤 status를 상위 error로 변환한다.

GUI status
CodeSymbol의미
0x41GUI_OK성공
0x42GUI_RAIDSET_NOT_NORMALRAID set 비정상
0x43GUI_VOLUMESET_NOT_NORMALVolume 비정상
0x44GUI_NO_RAIDSETRAID set 없음
0x45GUI_NO_VOLUMESETVolume 없음
0x46GUI_NO_PHYSICAL_DRIVEDrive 없음
0x47GUI_PARAMETER_ERRORParameter 오류
0x48GUI_UNSUPPORTED_COMMANDCommand 미지원
0x49GUI_DISK_CONFIG_CHANGEDDisk 구성 변경
0x4aGUI_INVALID_PASSWORDPassword 오류
0x4bGUI_NO_DISK_SPACE공간 없음
0x4cGUI_CHECKSUM_ERRORChecksum 오류
0x4dGUI_PASSWORD_REQUIREDPassword 필요

단일-byte 반환 code 전체입니다.

Return frame 검증
Header 확인Length 읽기Length=1 statusLength>1 dataChecksum결과 반환

Length에 따라 payload를 구분합니다.

4. Returned data
----------------

(A) Header
    3 bytes sequence (0x5E, 0x01, 0x61)
(B) Length
    2 bytes
    (low byte 1st, excludes length and checksum byte)
(C)
    status or data:

        1) If length == 1 ==> 1 byte status code::

                #define GUI_OK                    0x41
                #define GUI_RAIDSET_NOT_NORMAL    0x42
                #define GUI_VOLUMESET_NOT_NORMAL  0x43
                #define GUI_NO_RAIDSET            0x44
                #define GUI_NO_VOLUMESET          0x45
                #define GUI_NO_PHYSICAL_DRIVE     0x46
                #define GUI_PARAMETER_ERROR       0x47
                #define GUI_UNSUPPORTED_COMMAND   0x48
                #define GUI_DISK_CONFIG_CHANGED   0x49
                #define GUI_INVALID_PASSWORD      0x4a
                #define GUI_NO_DISK_SPACE         0x4b
                #define GUI_CHECKSUM_ERROR        0x4c
                #define GUI_PASSWORD_REQUIRED     0x4d

        2) If length > 1:

                data block returned from controller
                and the contents depends on the command code

(E) Checksum
    checksum of length and status or data byte