]>
Commit | Line | Data |
---|---|---|
ee38a438 GI |
1 | /* |
2 | * dev_areca.h | |
3 | * | |
4 | * Home page of code is: http://smartmontools.sourceforge.net | |
5 | * | |
6 | * Copyright (C) 2012 Hank Wu <hank@areca.com.tw> | |
7 | * | |
8 | * This program is free software; you can redistribute it and/or modify | |
9 | * it under the terms of the GNU General Public License as published by | |
10 | * the Free Software Foundation; either version 2, or (at your option) | |
11 | * any later version. | |
12 | * | |
13 | * You should have received a copy of the GNU General Public License | |
14 | * (for example COPYING); If not, see <http://www.gnu.org/licenses/>. | |
15 | * | |
16 | */ | |
17 | ||
18 | #ifndef DEV_ARECA_H | |
19 | #define DEV_ARECA_H | |
20 | ||
d2e702cf | 21 | #define DEV_ARECA_H_CVSID "$Id: dev_areca.h 3854 2013-09-12 05:36:20Z chrfranke $" |
ee38a438 GI |
22 | |
23 | ///////////////////////////////////////////////////////////////////////////// | |
24 | /// Areca RAID support | |
25 | ||
26 | /* GENERIC ARECA IO CONTROL CODE*/ | |
27 | enum _GENERIC_ARCMSR_CMDS | |
28 | { | |
29 | ARCMSR_READ_RQBUFFER = 0, | |
30 | ARCMSR_WRITE_WQBUFFER, | |
31 | ARCMSR_CLEAR_RQBUFFER, | |
32 | ARCMSR_CLEAR_WQBUFFER, | |
33 | ARCMSR_RETURN_CODE_3F, | |
34 | ARCMSR_CMD_TOTAL | |
35 | }; | |
36 | ||
37 | #define ARECA_SIG_STR "ARCMSR" | |
38 | ||
39 | #if defined(_WIN32) || defined(__CYGWIN__) | |
40 | #define ARCMSR_IOCTL_READ_RQBUFFER 0x90002004 | |
41 | #define ARCMSR_IOCTL_WRITE_WQBUFFER 0x90002008 | |
42 | #define ARCMSR_IOCTL_CLEAR_RQBUFFER 0x9000200C | |
43 | #define ARCMSR_IOCTL_CLEAR_WQBUFFER 0x90002010 | |
44 | #define ARCMSR_IOCTL_RETURN_CODE_3F 0x90002018 | |
45 | #elif defined(__linux__) | |
46 | /*DeviceType*/ | |
47 | #define ARECA_SATA_RAID 0x90000000 | |
48 | /*FunctionCode*/ | |
49 | #define FUNCTION_READ_RQBUFFER 0x0801 | |
50 | #define FUNCTION_WRITE_WQBUFFER 0x0802 | |
51 | #define FUNCTION_CLEAR_RQBUFFER 0x0803 | |
52 | #define FUNCTION_CLEAR_WQBUFFER 0x0804 | |
53 | #define FUNCTION_RETURN_CODE_3F 0x0806 | |
54 | ||
55 | /* ARECA IO CONTROL CODE*/ | |
56 | #define ARCMSR_IOCTL_READ_RQBUFFER (ARECA_SATA_RAID | FUNCTION_READ_RQBUFFER) | |
57 | #define ARCMSR_IOCTL_WRITE_WQBUFFER (ARECA_SATA_RAID | FUNCTION_WRITE_WQBUFFER) | |
58 | #define ARCMSR_IOCTL_CLEAR_RQBUFFER (ARECA_SATA_RAID | FUNCTION_CLEAR_RQBUFFER) | |
59 | #define ARCMSR_IOCTL_CLEAR_WQBUFFER (ARECA_SATA_RAID | FUNCTION_CLEAR_WQBUFFER) | |
60 | #define ARCMSR_IOCTL_RETURN_CODE_3F (ARECA_SATA_RAID | FUNCTION_RETURN_CODE_3F) | |
d2e702cf | 61 | #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) |
ee38a438 GI |
62 | #include <sys/ioctl.h> // _IOWR |
63 | ||
64 | /*FunctionCode*/ | |
65 | #define FUNCTION_READ_RQBUFFER 0x0801 | |
66 | #define FUNCTION_WRITE_WQBUFFER 0x0802 | |
67 | #define FUNCTION_CLEAR_RQBUFFER 0x0803 | |
68 | #define FUNCTION_CLEAR_WQBUFFER 0x0804 | |
69 | #define FUNCTION_RETURN_CODE_3F 0x0806 | |
70 | ||
71 | /* ARECA IO CONTROL CODE*/ | |
72 | #define ARCMSR_IOCTL_READ_RQBUFFER _IOWR('F', FUNCTION_READ_RQBUFFER, sSRB_BUFFER) | |
73 | #define ARCMSR_IOCTL_WRITE_WQBUFFER _IOWR('F', FUNCTION_WRITE_WQBUFFER, sSRB_BUFFER) | |
74 | #define ARCMSR_IOCTL_CLEAR_RQBUFFER _IOWR('F', FUNCTION_CLEAR_RQBUFFER, sSRB_BUFFER) | |
75 | #define ARCMSR_IOCTL_CLEAR_WQBUFFER _IOWR('F', FUNCTION_CLEAR_WQBUFFER, sSRB_BUFFER) | |
76 | #define ARCMSR_IOCTL_RETURN_CODE_3F _IOWR('F', FUNCTION_RETURN_CODE_3F, sSRB_BUFFER) | |
77 | #endif | |
78 | ||
79 | ||
80 | // The SRB_IO_CONTROL & SRB_BUFFER structures are used to communicate(to/from) to areca driver | |
81 | typedef struct _ARCMSR_IO_HDR | |
82 | { | |
83 | unsigned int HeaderLength; | |
84 | unsigned char Signature[8]; | |
85 | unsigned int Timeout; | |
86 | unsigned int ControlCode; | |
87 | unsigned int ReturnCode; | |
88 | unsigned int Length; | |
89 | } sARCMSR_IO_HDR; | |
90 | ||
91 | typedef struct _SRB_BUFFER | |
92 | { | |
93 | sARCMSR_IO_HDR srbioctl; | |
94 | unsigned char ioctldatabuffer[1032]; // the buffer to put the command data to/from firmware | |
95 | } sSRB_BUFFER; | |
96 | ||
97 | class generic_areca_device : | |
98 | virtual public smart_device | |
99 | { | |
100 | public: | |
101 | generic_areca_device(smart_interface * intf, const char * dev_name, int disknum, int encnum = 1); | |
102 | ~generic_areca_device() throw(); | |
103 | ||
104 | ///////////////////////////////////////////////////////////////////// | |
105 | // OS-dependent functions | |
106 | virtual bool arcmsr_lock() = 0; | |
107 | virtual bool arcmsr_unlock() = 0; | |
108 | virtual int arcmsr_do_scsi_io(struct scsi_cmnd_io * iop) = 0; | |
109 | ||
110 | ///////////////////////////////////////////////////////////////////// | |
111 | // OS-independent functions | |
112 | virtual int arcmsr_command_handler(unsigned long arcmsr_cmd, unsigned char *data, int data_len); | |
113 | virtual int arcmsr_ui_handler(unsigned char *areca_packet, int areca_packet_len, unsigned char *result); | |
114 | virtual bool arcmsr_probe(); | |
115 | virtual int arcmsr_get_dev_type(); | |
116 | virtual int arcmsr_get_controller_type(); | |
117 | virtual bool arcmsr_scsi_pass_through(scsi_cmnd_io * iop); | |
118 | virtual bool arcmsr_ata_pass_through(const ata_cmd_in & in, ata_cmd_out & out); | |
119 | ||
120 | protected: | |
121 | generic_areca_device() : smart_device(never_called) | |
122 | { | |
123 | } | |
124 | ||
125 | void set_disknum(int disknum) | |
126 | {m_disknum = disknum;} | |
127 | ||
128 | void set_encnum(int encnum) | |
129 | {m_encnum = encnum;} | |
130 | ||
131 | int get_disknum() | |
132 | {return m_disknum;} | |
133 | ||
134 | int get_encnum() | |
135 | {return m_encnum;} | |
136 | ||
137 | private: | |
138 | int m_disknum; ///< Disk number. | |
139 | int m_encnum; ///< Enclosure number. | |
140 | }; | |
141 | ||
142 | // SATA(ATA) device behind Areca RAID Controller | |
143 | class areca_ata_device | |
144 | : public ata_device, | |
145 | public generic_areca_device | |
146 | { | |
147 | public: | |
148 | areca_ata_device(smart_interface * intf, const char * dev_name, int disknum, int encnum = 1); | |
149 | ~areca_ata_device() throw(); | |
150 | bool arcmsr_lock() { return true; } | |
151 | bool arcmsr_unlock() { return true; } | |
152 | int arcmsr_do_scsi_io(struct scsi_cmnd_io * /* iop */) | |
153 | { | |
154 | return -1; | |
155 | } | |
156 | protected: | |
157 | areca_ata_device(): smart_device(never_called) | |
158 | { | |
159 | } | |
160 | virtual bool ata_pass_through(const ata_cmd_in & in, ata_cmd_out & out); | |
161 | }; | |
162 | ||
163 | // SAS(SCSI) device behind Areca RAID Controller | |
164 | class areca_scsi_device | |
165 | : public scsi_device, | |
166 | public generic_areca_device | |
167 | { | |
168 | public: | |
169 | areca_scsi_device(smart_interface * intf, const char * dev_name, int disknum, int encnum = 1); | |
170 | ~areca_scsi_device() throw(); | |
171 | bool arcmsr_lock() { return true; } | |
172 | bool arcmsr_unlock() { return true; } | |
173 | int arcmsr_do_scsi_io(struct scsi_cmnd_io * /* iop */) | |
174 | { | |
175 | return -1; | |
176 | } | |
177 | protected: | |
178 | areca_scsi_device(): smart_device(never_called) | |
179 | { | |
180 | } | |
181 | virtual bool scsi_pass_through(scsi_cmnd_io * iop); | |
182 | }; | |
183 | ||
184 | #endif |