File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / smartmontools / dev_areca.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Mon Jul 22 01:17:35 2013 UTC (10 years, 10 months ago) by misho
Branches: smartmontools, elwix, MAIN
CVS tags: v6_2, v6_1p0, v6_1, HEAD
6.1

    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,v 1.1.1.1 2013/07/22 01:17:35 misho Exp $"
   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>