Annotation of embedaddon/smartmontools/os_freebsd.h, revision 1.1

1.1     ! misho       1: /*
        !             2:  * os_freebsd.h
        !             3:  *
        !             4:  * Home page of code is: http://smartmontools.sourceforge.net
        !             5:  *
        !             6:  * Copyright (C) 2003-8 Eduard Martinescu <smartmontools-support@lists.sourceforge.net>
        !             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, write to the Free
        !            15:  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
        !            16:  *
        !            17:  * This code was originally developed as a Senior Thesis by Michael Cornwell
        !            18:  * at the Concurrent Systems Laboratory (now part of the Storage Systems
        !            19:  * Research Center), Jack Baskin School of Engineering, University of
        !            20:  * California, Santa Cruz. http://ssrc.soe.ucsc.edu/
        !            21:  *
        !            22:  */
        !            23: 
        !            24: /*-
        !            25:  * Copyright (c) 2000 Michael Smith
        !            26:  * Copyright (c) 2003 Paul Saab
        !            27:  * Copyright (c) 2003 Vinod Kashyap
        !            28:  * Copyright (c) 2000 BSDi
        !            29:  * All rights reserved.
        !            30:  *
        !            31:  * Redistribution and use in source and binary forms, with or without
        !            32:  * modification, are permitted provided that the following conditions
        !            33:  * are met:
        !            34:  * 1. Redistributions of source code must retain the above copyright
        !            35:  *    notice, this list of conditions and the following disclaimer.
        !            36:  * 2. Redistributions in binary form must reproduce the above copyright
        !            37:  *    notice, this list of conditions and the following disclaimer in the
        !            38:  *    documentation and/or other materials provided with the distribution.
        !            39:  *
        !            40:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
        !            41:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            42:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            43:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
        !            44:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            45:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            46:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            47:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            48:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            49:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            50:  * SUCH DAMAGE.
        !            51:  *
        !            52:  */
        !            53: 
        !            54: /*
        !            55:  * Copyright (c) 2004-05 Applied Micro Circuits Corporation.
        !            56:  * Copyright (c) 2004-05 Vinod Kashyap
        !            57:  * All rights reserved.
        !            58:  *
        !            59:  * Redistribution and use in source and binary forms, with or without
        !            60:  * modification, are permitted provided that the following conditions
        !            61:  * are met:
        !            62:  * 1. Redistributions of source code must retain the above copyright
        !            63:  *    notice, this list of conditions and the following disclaimer.
        !            64:  * 2. Redistributions in binary form must reproduce the above copyright
        !            65:  *    notice, this list of conditions and the following disclaimer in the
        !            66:  *    documentation and/or other materials provided with the distribution.
        !            67:  *
        !            68:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
        !            69:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            70:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            71:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
        !            72:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            73:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            74:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            75:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            76:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            77:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            78:  * SUCH DAMAGE.
        !            79:  *
        !            80:  */
        !            81: 
        !            82: #ifndef OS_FREEBSD_H_
        !            83: #define OS_FREEBSD_H_
        !            84: 
        !            85: #define OS_FREEBSD_H_CVSID "$Id: os_freebsd.h 3266 2011-02-21 16:33:04Z chrfranke $"
        !            86: 
        !            87: #define MAX_NUM_DEV 26
        !            88: 
        !            89: #ifdef  HAVE_SYS_TWEREG_H
        !            90: #include <sys/twereg.h>
        !            91: #else
        !            92: /**
        !            93:  *  The following cut out of twereg.h
        !            94:  *
        !            95:  */
        !            96: #if __FreeBSD_version < 500040
        !            97: #define __packed __attribute__((__packed__))
        !            98: #endif
        !            99: 
        !           100: #define TWE_MAX_SGL_LENGTH             62
        !           101: #define TWE_MAX_ATA_SGL_LENGTH         60
        !           102: #define TWE_OP_ATA_PASSTHROUGH         0x11
        !           103: 
        !           104: /* scatter/gather list entry */
        !           105: typedef struct
        !           106: {
        !           107:     u_int32_t  address;
        !           108:     u_int32_t  length;
        !           109: } __packed TWE_SG_Entry;
        !           110: 
        !           111: typedef struct {
        !           112:     u_int8_t   opcode:5;               /* TWE_OP_INITCONNECTION */
        !           113:     u_int8_t   res1:3;         
        !           114:     u_int8_t   size;
        !           115:     u_int8_t   request_id;
        !           116:     u_int8_t   res2:4;
        !           117:     u_int8_t   host_id:4;
        !           118:     u_int8_t   status;
        !           119:     u_int8_t   flags;
        !           120:     u_int16_t  message_credits;
        !           121:     u_int32_t  response_queue_pointer;
        !           122: } __packed TWE_Command_INITCONNECTION;
        !           123: 
        !           124: typedef struct
        !           125: {
        !           126:     u_int8_t   opcode:5;               /* TWE_OP_READ/TWE_OP_WRITE */
        !           127:     u_int8_t   res1:3;
        !           128:     u_int8_t   size;
        !           129:     u_int8_t   request_id;
        !           130:     u_int8_t   unit:4;
        !           131:     u_int8_t   host_id:4;
        !           132:     u_int8_t   status;
        !           133:     u_int8_t   flags;
        !           134:     u_int16_t  block_count;
        !           135:     u_int32_t  lba;
        !           136:     TWE_SG_Entry sgl[TWE_MAX_SGL_LENGTH];
        !           137: } __packed TWE_Command_IO;
        !           138: 
        !           139: typedef struct
        !           140: {
        !           141:     u_int8_t   opcode:5;               /* TWE_OP_HOTSWAP */
        !           142:     u_int8_t   res1:3;
        !           143:     u_int8_t   size;
        !           144:     u_int8_t   request_id;
        !           145:     u_int8_t   unit:4;
        !           146:     u_int8_t   host_id:4;
        !           147:     u_int8_t   status;
        !           148:     u_int8_t   flags;
        !           149:     u_int8_t   action;
        !           150: #define TWE_OP_HOTSWAP_REMOVE          0x00    /* remove assumed-degraded unit */
        !           151: #define TWE_OP_HOTSWAP_ADD_CBOD                0x01    /* add CBOD to empty port */
        !           152: #define TWE_OP_HOTSWAP_ADD_SPARE       0x02    /* add spare to empty port */
        !           153:     u_int8_t   aport;
        !           154: } __packed TWE_Command_HOTSWAP;
        !           155: 
        !           156: typedef struct
        !           157: {
        !           158:     u_int8_t   opcode:5;               /* TWE_OP_SETATAFEATURE */
        !           159:     u_int8_t   res1:3;
        !           160:     u_int8_t   size;
        !           161:     u_int8_t   request_id;
        !           162:     u_int8_t   unit:4;
        !           163:     u_int8_t   host_id:4;
        !           164:     u_int8_t   status;
        !           165:     u_int8_t   flags;
        !           166:     u_int8_t   feature;
        !           167: #define TWE_OP_SETATAFEATURE_WCE       0x02
        !           168: #define TWE_OP_SETATAFEATURE_DIS_WCE   0x82
        !           169:     u_int8_t   feature_mode;
        !           170:     u_int16_t  all_units;
        !           171:     u_int16_t  persistence;
        !           172: } __packed TWE_Command_SETATAFEATURE;
        !           173: 
        !           174: typedef struct
        !           175: {
        !           176:     u_int8_t   opcode:5;               /* TWE_OP_CHECKSTATUS */
        !           177:     u_int8_t   res1:3;
        !           178:     u_int8_t   size;
        !           179:     u_int8_t   request_id;
        !           180:     u_int8_t   unit:4;
        !           181:     u_int8_t   res2:4;
        !           182:     u_int8_t   status;
        !           183:     u_int8_t   flags;
        !           184:     u_int16_t  target_status;          /* set low byte to target request's ID */
        !           185: } __packed TWE_Command_CHECKSTATUS;
        !           186: 
        !           187: typedef struct
        !           188: {
        !           189:     u_int8_t   opcode:5;               /* TWE_OP_GETPARAM, TWE_OP_SETPARAM */
        !           190:     u_int8_t   res1:3;
        !           191:     u_int8_t   size;
        !           192:     u_int8_t   request_id;
        !           193:     u_int8_t   unit:4;
        !           194:     u_int8_t   host_id:4;
        !           195:     u_int8_t   status;
        !           196:     u_int8_t   flags;
        !           197:     u_int16_t  param_count;
        !           198:     TWE_SG_Entry sgl[TWE_MAX_SGL_LENGTH];
        !           199: } __packed TWE_Command_PARAM;
        !           200: 
        !           201: typedef struct
        !           202: {
        !           203:     u_int8_t   opcode:5;               /* TWE_OP_REBUILDUNIT */
        !           204:     u_int8_t   res1:3;
        !           205:     u_int8_t   size;
        !           206:     u_int8_t   request_id;
        !           207:     u_int8_t   src_unit:4;
        !           208:     u_int8_t   host_id:4;
        !           209:     u_int8_t   status;
        !           210:     u_int8_t   flags;
        !           211:     u_int8_t   action:7;
        !           212: #define TWE_OP_REBUILDUNIT_NOP         0
        !           213: #define TWE_OP_REBUILDUNIT_STOP                2       /* stop all rebuilds */
        !           214: #define TWE_OP_REBUILDUNIT_START       4       /* start rebuild with lowest unit */
        !           215: #define TWE_OP_REBUILDUNIT_STARTUNIT   5       /* rebuild src_unit (not supported) */
        !           216:     u_int8_t   cs:1;                           /* request state change on src_unit */
        !           217:     u_int8_t   logical_subunit;                /* for RAID10 rebuild of logical subunit */
        !           218: } __packed TWE_Command_REBUILDUNIT;
        !           219: 
        !           220: typedef struct
        !           221: {
        !           222:     u_int8_t   opcode:5;
        !           223:     u_int8_t   sgl_offset:3;
        !           224:     u_int8_t   size;
        !           225:     u_int8_t   request_id;
        !           226:     u_int8_t   unit;
        !           227:     u_int8_t   status;
        !           228:     u_int8_t   flags;
        !           229:     u_int16_t  param;
        !           230:     u_int16_t  features;
        !           231:     u_int16_t  sector_count;
        !           232:     u_int16_t  sector_num;
        !           233:     u_int16_t  cylinder_lo;
        !           234:     u_int16_t  cylinder_hi;
        !           235:     u_int8_t   drive_head;
        !           236:     u_int8_t   command;
        !           237:     TWE_SG_Entry sgl[TWE_MAX_ATA_SGL_LENGTH];
        !           238: } __packed TWE_Command_ATA;
        !           239: 
        !           240: typedef struct
        !           241: {
        !           242:     u_int8_t   opcode:5;
        !           243:     u_int8_t   sgl_offset:3;
        !           244:     u_int8_t   size;
        !           245:     u_int8_t   request_id;
        !           246:     u_int8_t   unit:4;
        !           247:     u_int8_t   host_id:4;
        !           248:     u_int8_t   status;
        !           249:     u_int8_t   flags;
        !           250: #define TWE_FLAGS_SUCCESS      0x00
        !           251: #define TWE_FLAGS_INFORMATIONAL        0x01
        !           252: #define TWE_FLAGS_WARNING      0x02
        !           253: #define TWE_FLAGS_FATAL                0x03
        !           254: #define TWE_FLAGS_PERCENTAGE   (1<<8)  /* bits 0-6 indicate completion percentage */
        !           255:     u_int16_t  count;                  /* block count, parameter count, message credits */
        !           256: } __packed TWE_Command_Generic;
        !           257: 
        !           258: /* command packet - must be TWE_ALIGNMENT aligned */
        !           259: typedef union
        !           260: {
        !           261:     TWE_Command_INITCONNECTION initconnection;
        !           262:     TWE_Command_IO             io;
        !           263:     TWE_Command_PARAM          param;
        !           264:     TWE_Command_CHECKSTATUS    checkstatus;
        !           265:     TWE_Command_REBUILDUNIT    rebuildunit;
        !           266:     TWE_Command_SETATAFEATURE  setatafeature;
        !           267:     TWE_Command_ATA            ata;
        !           268:     TWE_Command_Generic                generic;
        !           269:     u_int8_t                   pad[512];
        !           270: } TWE_Command;
        !           271: 
        !           272: /* response queue entry */
        !           273: typedef union
        !           274: {
        !           275:     struct 
        !           276:     {
        !           277:        u_int32_t       undefined_1:4;
        !           278:        u_int32_t       response_id:8;
        !           279:        u_int32_t       undefined_2:20;
        !           280:     } u;
        !           281:     u_int32_t  value;
        !           282: } TWE_Response_Queue;
        !           283: 
        !           284: #endif
        !           285: 
        !           286: #ifdef  HAVE_SYS_TWEIO_H
        !           287: #include <sys/tweio.h>
        !           288: #else
        !           289: /*
        !           290:  * Following cut out of tweio.h
        !           291:  *
        !           292:  */
        !           293: /*
        !           294:  * User-space command
        !           295:  *
        !           296:  * Note that the command's scatter/gather list will be computed by the
        !           297:  * driver, and cannot be filled in by the consumer.
        !           298:  */
        !           299: struct twe_usercommand {
        !           300:     TWE_Command        tu_command;     /* command ready for the controller */
        !           301:     void       *tu_data;       /* pointer to data in userspace */
        !           302:     size_t     tu_size;        /* userspace data length */
        !           303: };
        !           304: 
        !           305: #define TWEIO_COMMAND          _IOWR('T', 100, struct twe_usercommand)
        !           306: 
        !           307: #endif
        !           308: 
        !           309: #ifdef  HAVE_SYS_TW_OSL_IOCTL_H
        !           310: #include <sys/tw_osl_ioctl.h>
        !           311: #else
        !           312: /*
        !           313:  * Following cut out of tw_osl_types.h
        !           314:  *
        !           315:  */
        !           316: 
        !           317: typedef void                   TW_VOID;
        !           318: typedef char                   TW_INT8;
        !           319: typedef unsigned char          TW_UINT8;
        !           320: typedef short                  TW_INT16;
        !           321: typedef unsigned short         TW_UINT16;
        !           322: typedef int                    TW_INT32;
        !           323: typedef unsigned int           TW_UINT32;
        !           324: typedef long long              TW_INT64;
        !           325: typedef unsigned long long     TW_UINT64;
        !           326: 
        !           327: /*
        !           328:  * Following cut out of tw_cl_share.h
        !           329:  *
        !           330:  */
        !           331: 
        !           332: #pragma pack(1)
        !           333: 
        !           334: struct tw_cl_event_packet {
        !           335:        TW_UINT32       sequence_id;
        !           336:        TW_UINT32       time_stamp_sec;
        !           337:        TW_UINT16       aen_code;
        !           338:        TW_UINT8        severity;
        !           339:        TW_UINT8        retrieved;
        !           340:        TW_UINT8        repeat_count;
        !           341:        TW_UINT8        parameter_len;
        !           342:        TW_UINT8        parameter_data[98];
        !           343:        TW_UINT32       event_src;
        !           344:        TW_UINT8        severity_str[20];
        !           345: };
        !           346: 
        !           347: #pragma pack()
        !           348: 
        !           349: /*
        !           350:  * Following cut out of tw_cl_fwif.h
        !           351:  *
        !           352:  */
        !           353: 
        !           354: #define TWA_FW_CMD_ATA_PASSTHROUGH             0x11
        !           355: 
        !           356: #define TWA_SENSE_DATA_LENGTH          18
        !           357: 
        !           358: #pragma pack(1)
        !           359: /* 7000 structures. */
        !           360: struct tw_cl_command_init_connect {
        !           361:        TW_UINT8        res1__opcode;   /* 3:5 */
        !           362:        TW_UINT8        size;
        !           363:        TW_UINT8        request_id;
        !           364:        TW_UINT8        res2;
        !           365:        TW_UINT8        status;
        !           366:        TW_UINT8        flags;
        !           367:        TW_UINT16       message_credits;
        !           368:        TW_UINT32       features;
        !           369:        TW_UINT16       fw_srl;
        !           370:        TW_UINT16       fw_arch_id;
        !           371:        TW_UINT16       fw_branch;
        !           372:        TW_UINT16       fw_build;
        !           373:        TW_UINT32       result;
        !           374: };
        !           375: 
        !           376: 
        !           377: /* Structure for downloading firmware onto the controller. */
        !           378: struct tw_cl_command_download_firmware {
        !           379:        TW_UINT8        sgl_off__opcode;/* 3:5 */
        !           380:        TW_UINT8        size;
        !           381:        TW_UINT8        request_id;
        !           382:        TW_UINT8        unit;
        !           383:        TW_UINT8        status;
        !           384:        TW_UINT8        flags;
        !           385:        TW_UINT16       param;
        !           386:        TW_UINT8        sgl[1];
        !           387: };
        !           388: 
        !           389: 
        !           390: /* Structure for hard resetting the controller. */
        !           391: struct tw_cl_command_reset_firmware {
        !           392:        TW_UINT8        res1__opcode;   /* 3:5 */
        !           393:        TW_UINT8        size;
        !           394:        TW_UINT8        request_id;
        !           395:        TW_UINT8        unit;
        !           396:        TW_UINT8        status;
        !           397:        TW_UINT8        flags;
        !           398:        TW_UINT8        res2;
        !           399:        TW_UINT8        param;
        !           400: };
        !           401: 
        !           402: 
        !           403: /* Structure for sending get/set param commands. */
        !           404: struct tw_cl_command_param {
        !           405:        TW_UINT8        sgl_off__opcode;/* 3:5 */
        !           406:        TW_UINT8        size;
        !           407:        TW_UINT8        request_id;
        !           408:        TW_UINT8        host_id__unit;  /* 4:4 */
        !           409:        TW_UINT8        status;
        !           410:        TW_UINT8        flags;
        !           411:        TW_UINT16       param_count;
        !           412:        TW_UINT8        sgl[1];
        !           413: };
        !           414: 
        !           415: 
        !           416: /* Generic command packet. */
        !           417: struct tw_cl_command_generic {
        !           418:        TW_UINT8        sgl_off__opcode;/* 3:5 */
        !           419:        TW_UINT8        size;
        !           420:        TW_UINT8        request_id;
        !           421:        TW_UINT8        host_id__unit;  /* 4:4 */
        !           422:        TW_UINT8        status;
        !           423:        TW_UINT8        flags;
        !           424:        TW_UINT16       count;  /* block cnt, parameter cnt, message credits */
        !           425: };
        !           426: 
        !           427: 
        !           428: /* Command packet header. */
        !           429: struct tw_cl_command_header {
        !           430:        TW_UINT8        sense_data[TWA_SENSE_DATA_LENGTH];
        !           431:        struct {
        !           432:                TW_INT8         reserved[4];
        !           433:                TW_UINT16       error;
        !           434:                TW_UINT8        padding;
        !           435:                TW_UINT8        res__severity;  /* 5:3 */
        !           436:        } status_block;
        !           437:        TW_UINT8        err_specific_desc[98];
        !           438:        struct {
        !           439:                TW_UINT8        size_header;
        !           440:                TW_UINT16       reserved;
        !           441:                TW_UINT8        size_sense;
        !           442:        } header_desc;
        !           443: };
        !           444: 
        !           445: 
        !           446: /* 7000 Command packet. */
        !           447: union tw_cl_command_7k {
        !           448:        struct tw_cl_command_init_connect       init_connect;
        !           449:        struct tw_cl_command_download_firmware  download_fw;
        !           450:        struct tw_cl_command_reset_firmware     reset_fw;
        !           451:        struct tw_cl_command_param              param;
        !           452:        struct tw_cl_command_generic            generic;
        !           453:        TW_UINT8        padding[1024 - sizeof(struct tw_cl_command_header)];
        !           454: };
        !           455: 
        !           456: 
        !           457: /* 9000 Command Packet. */
        !           458: struct tw_cl_command_9k {
        !           459:        TW_UINT8        res__opcode;    /* 3:5 */
        !           460:        TW_UINT8        unit;
        !           461:        TW_UINT16       lun_l4__req_id; /* 4:12 */
        !           462:        TW_UINT8        status;
        !           463:        TW_UINT8        sgl_offset; /* offset (in bytes) to sg_list, from the
        !           464:                                        end of sgl_entries */
        !           465:        TW_UINT16       lun_h4__sgl_entries;
        !           466:        TW_UINT8        cdb[16];
        !           467:        TW_UINT8        sg_list[872];/* total struct size =
        !           468:                                        1024-sizeof(cmd_hdr) */
        !           469: };
        !           470: 
        !           471: 
        !           472: /* Full command packet. */
        !           473: struct tw_cl_command_packet {
        !           474:        struct tw_cl_command_header     cmd_hdr;
        !           475:        union {
        !           476:                union tw_cl_command_7k  cmd_pkt_7k;
        !           477:                struct tw_cl_command_9k cmd_pkt_9k;
        !           478:        } command;
        !           479: };
        !           480: 
        !           481: #pragma pack()
        !           482: 
        !           483: /*
        !           484:  * Following cut out of tw_cl_ioctl.h
        !           485:  *
        !           486:  */
        !           487: 
        !           488: #pragma pack(1)
        !           489: 
        !           490: /* Structure used to handle GET/RELEASE LOCK ioctls. */
        !           491: struct tw_cl_lock_packet {
        !           492:        TW_UINT32       timeout_msec;
        !           493:        TW_UINT32       time_remaining_msec;
        !           494:        TW_UINT32       force_flag;
        !           495: };
        !           496: 
        !           497: 
        !           498: /* Structure used to handle GET COMPATIBILITY INFO ioctl. */
        !           499: struct tw_cl_compatibility_packet {
        !           500:        TW_UINT8        driver_version[32];/* driver version */
        !           501:        TW_UINT16       working_srl;    /* driver & firmware negotiated srl */
        !           502:        TW_UINT16       working_branch; /* branch # of the firmware that the
        !           503:                                        driver is compatible with */
        !           504:        TW_UINT16       working_build;  /* build # of the firmware that the
        !           505:                                        driver is compatible with */
        !           506: };
        !           507: 
        !           508: 
        !           509: /* Driver understandable part of the ioctl packet built by the API. */
        !           510: struct tw_cl_driver_packet {
        !           511:        TW_UINT32       control_code;
        !           512:        TW_UINT32       status;
        !           513:        TW_UINT32       unique_id;
        !           514:        TW_UINT32       sequence_id;
        !           515:        TW_UINT32       os_status;
        !           516:        TW_UINT32       buffer_length;
        !           517: };
        !           518: 
        !           519: #pragma pack()
        !           520: 
        !           521: /*
        !           522:  * Following cut out of tw_osl_ioctl.h
        !           523:  *
        !           524:  */
        !           525: 
        !           526: #pragma pack(1)
        !           527: /*
        !           528:  * We need the structure below to ensure that the first byte of
        !           529:  * data_buf is not overwritten by the kernel, after we return
        !           530:  * from the ioctl call.  Note that cmd_pkt has been reduced
        !           531:  * to an array of 1024 bytes even though it's actually 2048 bytes
        !           532:  * in size.  This is because, we don't expect requests from user
        !           533:  * land requiring 2048 (273 sg elements) byte cmd pkts.
        !           534:  */
        !           535: typedef struct tw_osli_ioctl_no_data_buf {
        !           536:        struct tw_cl_driver_packet      driver_pkt;
        !           537:        TW_VOID                         *pdata; /* points to data_buf */
        !           538:        TW_INT8                         padding[488 - sizeof(TW_VOID *)];
        !           539:        struct tw_cl_command_packet     cmd_pkt;
        !           540: } TW_OSLI_IOCTL_NO_DATA_BUF;
        !           541: 
        !           542: #pragma pack()
        !           543: 
        !           544: #define TW_OSL_IOCTL_FIRMWARE_PASS_THROUGH             \
        !           545:        _IOWR('T', 202, TW_OSLI_IOCTL_NO_DATA_BUF)
        !           546: 
        !           547: #pragma pack(1)
        !           548: 
        !           549: typedef struct tw_osli_ioctl_with_payload {
        !           550:        struct tw_cl_driver_packet      driver_pkt;
        !           551:        TW_INT8                         padding[488];
        !           552:        struct tw_cl_command_packet     cmd_pkt;
        !           553:        union {
        !           554:                struct tw_cl_event_packet               event_pkt;
        !           555:                struct tw_cl_lock_packet                lock_pkt;
        !           556:                struct tw_cl_compatibility_packet       compat_pkt;
        !           557:                TW_INT8                                 data_buf[1];
        !           558:        } payload;
        !           559: } TW_OSLI_IOCTL_WITH_PAYLOAD;
        !           560: 
        !           561: #pragma pack()
        !           562: 
        !           563: #endif
        !           564: 
        !           565: #define HPT_CTL_CODE(x) (x+0xFF00)
        !           566: #define HPT_IOCTL_GET_CHANNEL_INFO          HPT_CTL_CODE(3)
        !           567: #define HPT_IOCTL_GET_CHANNEL_INFO_V2       HPT_CTL_CODE(53)
        !           568: #define HPT_IOCTL_IDE_PASS_THROUGH          HPT_CTL_CODE(24)
        !           569: 
        !           570: #define HPT_READ 1
        !           571: #define HPT_WRITE 2
        !           572: 
        !           573: #define HPT_IOCTL_MAGIC   0xA1B2C3D4
        !           574: 
        !           575: #define MAXDEV_PER_CHANNEL 2
        !           576: #define PMPORT_PER_CHANNEL 15 /* max devices connected to this channel via pmport */
        !           577: 
        !           578: #pragma pack(1)
        !           579: typedef struct _HPT_CHANNEL_INFO {
        !           580:   unsigned int reserve1;
        !           581:   unsigned int reserve2;
        !           582:   unsigned int devices[MAXDEV_PER_CHANNEL];
        !           583: } HPT_CHANNEL_INFO, *PHPT_CHANNEL_INFO;
        !           584: 
        !           585: typedef struct _HPT_CHANNEL_INFO_V2 {
        !           586:   unsigned int reserve1;
        !           587:   unsigned int reserve2;
        !           588:   unsigned int devices[PMPORT_PER_CHANNEL];
        !           589: } HPT_CHANNEL_INFO_V2, *PHPT_CHANNEL_INFO_V2;
        !           590: 
        !           591: typedef struct _HPT_IOCTL_PARAM {
        !           592:   unsigned int magic;     /* used to check if it's a valid ioctl packet */
        !           593:   unsigned int ctrl_code; /* operation control code */
        !           594:   void* in;               /* input data buffer */
        !           595:   unsigned int in_size;   /* size of input data buffer */
        !           596:   void* out;              /* output data buffer */
        !           597:   unsigned int out_size;  /* size of output data buffer */
        !           598:   void* returned_size;    /* count of chars returned */
        !           599: } HPT_IOCTL_PARAM, *PHPT_IOCTL_PARAM;
        !           600: #define HPT_DO_IOCONTROL       _IOW('H', 0, HPT_IOCTL_PARAM)
        !           601: 
        !           602: typedef struct _HPT_PASS_THROUGH_HEADER {
        !           603:   unsigned int id;          /* disk ID */
        !           604:   unsigned char feature;
        !           605:   unsigned char sectorcount;
        !           606:   unsigned char lbalow;
        !           607:   unsigned char lbamid;
        !           608:   unsigned char lbahigh;
        !           609:   unsigned char driverhead;
        !           610:   unsigned char command;
        !           611:   unsigned char sectors;    /* data size in sectors, if the command has data transfer */
        !           612:   unsigned char protocol;   /* HPT_(READ,WRITE) or zero for non-DATA */
        !           613:   unsigned char reserve[3];
        !           614: }
        !           615: HPT_PASS_THROUGH_HEADER, *PHPT_PASS_THROUGH_HEADER;
        !           616: #pragma pack()
        !           617: 
        !           618: #ifndef __unused
        !           619: #define __unused __attribute__ ((__unused__))
        !           620: #endif
        !           621: 
        !           622: #endif /* OS_FREEBSD_H_ */

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