Annotation of embedaddon/smartmontools/dev_areca.h, revision 1.1.1.1

1.1       misho       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: 
                     21: #define DEV_ARECA_H_CVSID "$Id: dev_areca.h 3763 2013-01-31 22:25:25Z chrfranke $"
                     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)
                     61: #elif defined(__FreeBSD__)
                     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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>