]>
git.proxmox.com Git - mirror_smartmontools-debian.git/blob - dev_areca.h
4 * Home page of code is: http://www.smartmontools.org
6 * Copyright (C) 2012 Hank Wu <hank@areca.com.tw>
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)
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/>.
21 #define DEV_ARECA_H_CVSID "$Id: dev_areca.h 4146 2015-10-17 12:12:49Z chrfranke $"
23 /////////////////////////////////////////////////////////////////////////////
24 /// Areca RAID support
26 /* GENERIC ARECA IO CONTROL CODE*/
27 enum _GENERIC_ARCMSR_CMDS
29 ARCMSR_READ_RQBUFFER
= 0,
30 ARCMSR_WRITE_WQBUFFER
,
31 ARCMSR_CLEAR_RQBUFFER
,
32 ARCMSR_CLEAR_WQBUFFER
,
33 ARCMSR_RETURN_CODE_3F
,
37 #define ARECA_SIG_STR "ARCMSR"
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__)
47 #define ARECA_SATA_RAID 0x90000000
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
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)
61 #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
62 #include <sys/ioctl.h> // _IOWR
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
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)
80 // The SRB_IO_CONTROL & SRB_BUFFER structures are used to communicate(to/from) to areca driver
81 typedef struct _ARCMSR_IO_HDR
83 unsigned int HeaderLength
;
84 unsigned char Signature
[8];
86 unsigned int ControlCode
;
87 unsigned int ReturnCode
;
91 typedef struct _SRB_BUFFER
93 sARCMSR_IO_HDR srbioctl
;
94 unsigned char ioctldatabuffer
[1032]; // the buffer to put the command data to/from firmware
97 class generic_areca_device
:
98 virtual public smart_device
101 generic_areca_device(smart_interface
* intf
, const char * dev_name
, int disknum
, int encnum
= 1);
102 ~generic_areca_device() throw();
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;
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
);
121 generic_areca_device()
122 : smart_device(never_called
),
123 m_disknum(-1), m_encnum(-1)
126 void set_disknum(int disknum
)
127 {m_disknum
= disknum
;}
129 void set_encnum(int encnum
)
139 int m_disknum
; ///< Disk number.
140 int m_encnum
; ///< Enclosure number.
143 // SATA(ATA) device behind Areca RAID Controller
144 class areca_ata_device
146 public generic_areca_device
149 areca_ata_device(smart_interface
* intf
, const char * dev_name
, int disknum
, int encnum
= 1);
150 ~areca_ata_device() throw();
151 bool arcmsr_lock() { return true; }
152 bool arcmsr_unlock() { return true; }
153 int arcmsr_do_scsi_io(struct scsi_cmnd_io
* /* iop */)
158 areca_ata_device(): smart_device(never_called
)
161 virtual bool ata_pass_through(const ata_cmd_in
& in
, ata_cmd_out
& out
);
164 // SAS(SCSI) device behind Areca RAID Controller
165 class areca_scsi_device
166 : public scsi_device
,
167 public generic_areca_device
170 areca_scsi_device(smart_interface
* intf
, const char * dev_name
, int disknum
, int encnum
= 1);
171 ~areca_scsi_device() throw();
172 bool arcmsr_lock() { return true; }
173 bool arcmsr_unlock() { return true; }
174 int arcmsr_do_scsi_io(struct scsi_cmnd_io
* /* iop */)
179 areca_scsi_device(): smart_device(never_called
)
182 virtual bool scsi_pass_through(scsi_cmnd_io
* iop
);