The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/smartpqi/smartpqi_structures.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright 2016-2021 Microchip Technology, Inc. and/or its subsidiaries.
    3  *
    4  * Redistribution and use in source and binary forms, with or without
    5  * modification, are permitted provided that the following conditions
    6  * are met:
    7  * 1. Redistributions of source code must retain the above copyright
    8  *    notice, this list of conditions and the following disclaimer.
    9  * 2. Redistributions in binary form must reproduce the above copyright
   10  *    notice, this list of conditions and the following disclaimer in the
   11  *    documentation and/or other materials provided with the distribution.
   12  *
   13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   14  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   16  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   17  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   18  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   19  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   20  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   21  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   22  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   23  * SUCH DAMAGE.
   24  */
   25 
   26 /* $FreeBSD$ */
   27 
   28 #ifndef _PQI_STRUCTURES_H
   29 #define _PQI_STRUCTURES_H
   30 
   31 struct bmic_host_wellness_driver_version {
   32         uint8_t         start_tag[4];
   33         uint8_t         driver_version_tag[2];
   34         uint16_t        driver_version_length;
   35         char            driver_version[32];
   36         uint8_t         end_tag[2];
   37 
   38 }OS_ATTRIBUTE_PACKED;
   39 
   40 struct bmic_host_wellness_time {
   41         uint8_t         start_tag[4];
   42         uint8_t         time_tag[2];
   43         uint16_t        time_length;
   44         uint8_t         hour;
   45         uint8_t         min;
   46         uint8_t         sec;
   47         uint8_t         reserved;
   48         uint8_t         month;
   49         uint8_t         day;
   50         uint8_t         century;
   51         uint8_t         year;
   52         uint8_t         dont_write_tag[2];
   53         uint8_t         end_tag[2];
   54 
   55 }OS_ATTRIBUTE_PACKED;
   56 
   57 /* As per PQI Spec pqi-2r00a , 6.2.2. */
   58 
   59 /* device capability register , for admin q table 24 */
   60 struct pqi_dev_adminq_cap {
   61         uint8_t         max_admin_ibq_elem;
   62         uint8_t         max_admin_obq_elem;
   63         uint8_t         admin_ibq_elem_len;
   64         uint8_t         admin_obq_elem_len;
   65         uint16_t        max_pqi_dev_reset_tmo;
   66         uint8_t         res[2];
   67 }OS_ATTRIBUTE_PACKED;
   68 
   69 /* admin q parameter reg , table 36 */
   70 struct admin_q_param {
   71         uint8_t         num_iq_elements;
   72         uint8_t         num_oq_elements;
   73         uint8_t         intr_msg_num;
   74         uint8_t         msix_disable;
   75 }OS_ATTRIBUTE_PACKED;
   76 
   77 struct pqi_registers {
   78         uint64_t                signature;
   79         uint64_t                admin_q_config;
   80         uint64_t                pqi_dev_adminq_cap;
   81         uint32_t                legacy_intr_status;
   82         uint32_t                legacy_intr_mask_set;
   83         uint32_t                legacy_intr_mask_clr;
   84         uint8_t                 res1[28];
   85         uint32_t                pqi_dev_status;
   86         uint8_t                 res2[4];
   87         uint64_t                admin_ibq_pi_offset;
   88         uint64_t                admin_obq_ci_offset;
   89         uint64_t                admin_ibq_elem_array_addr;
   90         uint64_t                admin_obq_elem_array_addr;
   91         uint64_t                admin_ibq_ci_addr;
   92         uint64_t                admin_obq_pi_addr;
   93         uint32_t                admin_q_param;
   94         uint8_t                 res3[4];
   95         uint32_t                pqi_dev_err;
   96         uint8_t                 res4[4];
   97         uint64_t                error_details;
   98         uint32_t                dev_reset;
   99         uint32_t                power_action;
  100         uint8_t                 res5[104];
  101 }OS_ATTRIBUTE_PACKED;
  102 
  103 /*
  104  * IOA controller registers
  105  * Mapped in PCIe BAR 0.
  106  */
  107 
  108 struct ioa_registers {
  109         uint8_t         res1[0x18];
  110         uint32_t        host_to_ioa_db_mask_clr;        /* 18h */
  111         uint8_t         res2[4];
  112         uint32_t        host_to_ioa_db;                 /* 20h */
  113         uint8_t         res3[4];
  114         uint32_t        host_to_ioa_db_clr;             /* 28h */
  115         uint8_t         res4[8];
  116         uint32_t        ioa_to_host_glob_int_mask;      /* 34h */
  117         uint8_t         res5[0x64];
  118         uint32_t        ioa_to_host_db;                 /* 9Ch */
  119         uint32_t        ioa_to_host_db_clr;             /* A0h */
  120         uint8_t         res6[4];
  121         uint32_t        ioa_to_host_db_mask;            /* A8h */
  122         uint32_t        ioa_to_host_db_mask_clr;        /* ACh */
  123         uint32_t        scratchpad0;                    /* B0h */
  124         uint32_t        scratchpad1;                    /* B4h */
  125         uint32_t        scratchpad2;                    /* B8h */
  126         uint32_t        scratchpad3_fw_status;          /* BCh */
  127         uint8_t         res7[8];
  128         uint32_t        scratchpad4;                    /* C8h */
  129         uint8_t         res8[0xf34];                    /* 0xC8 + 4 + 0xf34 = 1000h */
  130         uint32_t        mb[8];                          /* 1000h */
  131 }OS_ATTRIBUTE_PACKED;
  132 
  133 
  134 /* PQI Preferred settings */
  135 struct pqi_pref_settings {
  136         uint16_t        max_cmd_size;
  137         uint16_t        max_fib_size;
  138 }OS_ATTRIBUTE_PACKED;
  139 
  140 /* pqi capability by sis interface */
  141 struct pqi_cap {
  142         uint32_t        max_sg_elem;
  143         uint32_t        max_transfer_size;
  144         uint32_t        max_outstanding_io;
  145         uint32_t        conf_tab_off;
  146         uint32_t        conf_tab_sz;
  147 }OS_ATTRIBUTE_PACKED;
  148 
  149 struct pqi_conf_table {
  150         uint8_t         sign[8];                /* "CFGTABLE" */
  151         uint32_t        first_section_off;
  152 };
  153 
  154 struct pqi_conf_table_section_header {
  155         uint16_t        section_id;
  156         uint16_t        next_section_off;
  157 };
  158 
  159 struct pqi_conf_table_general_info {
  160         struct pqi_conf_table_section_header header;
  161         uint32_t        section_len;
  162         uint32_t        max_outstanding_req;
  163         uint32_t        max_sg_size;
  164         uint32_t        max_sg_per_req;
  165 };
  166 
  167 struct pqi_conf_table_debug {
  168         struct pqi_conf_table_section_header header;
  169         uint32_t        scratchpad;
  170 };
  171 
  172 struct pqi_conf_table_heartbeat {
  173         struct pqi_conf_table_section_header header;
  174         uint32_t        heartbeat_counter;
  175 };
  176 
  177 typedef union pqi_reset_reg {
  178         struct {
  179                 uint32_t reset_type : 3;
  180                 uint32_t reserved : 2;
  181                 uint32_t reset_action : 3;
  182                 uint32_t hold_in_pd1 : 1;
  183                 uint32_t reserved2 : 23;
  184         } bits;
  185         uint32_t all_bits;
  186 }pqi_reset_reg_t;
  187 
  188 /* Memory descriptor for DMA memory allocation */
  189 typedef struct dma_mem {
  190         void                    *virt_addr;
  191     dma_addr_t          dma_addr;
  192         uint32_t                size;
  193         uint32_t                align;
  194         char                    *tag;
  195         bus_dma_tag_t dma_tag;
  196         bus_dmamap_t dma_map;
  197 }dma_mem_t;
  198 
  199 /* Lock should be 8 byte aligned  */
  200 
  201 #ifndef LOCKFREE_STACK
  202 
  203 typedef struct pqi_taglist {
  204         uint32_t        max_elem;
  205         uint32_t        num_elem;
  206         uint32_t        head;
  207         uint32_t        tail;
  208         uint32_t        *elem_array;
  209         boolean_t       lockcreated;
  210         char            lockname[LOCKNAME_SIZE];
  211         OS_LOCK_T       lock    OS_ATTRIBUTE_ALIGNED(8);
  212 }pqi_taglist_t;
  213 
  214 #else   /* LOCKFREE_STACK */
  215 
  216 union head_list {
  217         struct {
  218                 uint32_t        seq_no; /* To avoid aba problem */
  219                 uint32_t        index;  /* Index at the top of the stack */
  220         }top;
  221         uint64_t        data;
  222 };
  223 /* lock-free stack used to push and pop the tag used for IO request */
  224 typedef struct  lockless_stack {
  225         uint32_t        *next_index_array;
  226         uint32_t        max_elem;/*No.of total elements*/
  227         uint32_t        num_elem;/*No.of present elements*/
  228         volatile union  head_list      head     OS_ATTRIBUTE_ALIGNED(8);
  229 }lockless_stack_t;
  230 
  231 #endif /* LOCKFREE_STACK */
  232 
  233 /*
  234  * PQI SGL descriptor layouts.
  235  */
  236 /*
  237  * SGL (Scatter Gather List) descriptor Codes
  238  */
  239 
  240 #define SGL_DESCRIPTOR_CODE_DATA_BLOCK                     0x0
  241 #define SGL_DESCRIPTOR_CODE_BIT_BUCKET                     0x1
  242 #define SGL_DESCRIPTOR_CODE_STANDARD_SEGMENT               0x2
  243 #define SGL_DESCRIPTOR_CODE_LAST_STANDARD_SEGMENT          0x3
  244 #define SGL_DESCRIPTOR_CODE_LAST_ALTERNATIVE_SGL_SEGMENT   0x4
  245 #define SGL_DESCRIPTOR_CODE_VENDOR_SPECIFIC                0xF
  246 
  247 typedef struct sgl_descriptor
  248 {
  249         uint64_t        addr;   /* !< Bytes 0-7.  The starting 64-bit memory byte address of the data block. */
  250         uint32_t        length; /* !< Bytes 8-11.  The length in bytes of the data block.  Set to 0x00000000 specifies that no data be transferred. */
  251         uint8_t         res[3]; /* !< Bytes 12-14. */
  252         uint8_t     zero : 4; /* !< Byte 15, Bits 0-3. */
  253         uint8_t     type : 4; /* !< Byte 15, Bits 4-7. sgl descriptor type */
  254 } sg_desc_t;
  255 
  256 /* PQI IUs */
  257 typedef struct iu_header
  258 {
  259         uint8_t         iu_type;
  260         uint8_t         comp_feature;
  261         uint16_t        iu_length;
  262 }OS_ATTRIBUTE_PACKED iu_header_t;
  263 
  264 
  265 typedef struct general_admin_request /* REPORT_PQI_DEVICE_CAPABILITY, REPORT_MANUFACTURER_INFO,  REPORT_OPERATIONAL_IQ,  REPORT_OPERATIONAL_OQ all same layout. */
  266 {
  267         iu_header_t     header;         /* !< Bytes 0-3. */
  268         uint16_t        res1;
  269         uint16_t        work;
  270         uint16_t        req_id;         /* !< Bytes 8-9. request identifier */
  271         uint8_t         fn_code;        /* !< Byte 10. which administrator function */
  272         union {
  273                 struct {
  274                         uint8_t         res2[33];       /* !< Bytes 11-43. function specific */
  275                         uint32_t        buf_size;       /* !< Bytes 44-47. size in bytes of the Data-In/Out Buffer */
  276                         sg_desc_t       sg_desc;        /* !< Bytes 48-63. SGL */
  277         } OS_ATTRIBUTE_PACKED general_func;
  278 
  279                 struct {
  280                         uint8_t         res1;
  281                         uint16_t        qid;
  282                         uint8_t         res2[2];
  283                         uint64_t        elem_arr_addr;
  284                         uint64_t        iq_ci_addr;
  285                         uint16_t        num_elem;
  286                         uint16_t        elem_len;
  287                         uint8_t         queue_proto;
  288                         uint8_t         arb_prio;
  289                         uint8_t         res3[22];
  290                         uint32_t        vend_specific;
  291         } OS_ATTRIBUTE_PACKED create_op_iq;
  292 
  293                 struct {
  294                         uint8_t         res1;
  295                         uint16_t        qid;
  296                         uint8_t         res2[2];
  297                         uint64_t        elem_arr_addr;
  298                         uint64_t        ob_pi_addr;
  299                         uint16_t        num_elem;
  300                         uint16_t        elem_len;
  301                         uint8_t         queue_proto;
  302                         uint8_t         res3[3];
  303                         uint16_t        intr_msg_num;
  304                         uint16_t        coales_count;
  305                         uint32_t        min_coales_time;
  306                         uint32_t        max_coales_time;
  307                         uint8_t         res4[8];
  308                         uint32_t        vend_specific;
  309         } OS_ATTRIBUTE_PACKED create_op_oq;
  310 
  311                 struct {
  312                         uint8_t         res1;
  313                         uint16_t        qid;
  314                         uint8_t         res2[50];
  315         } OS_ATTRIBUTE_PACKED delete_op_queue;
  316 
  317                 struct {
  318                         uint8_t         res1;
  319                         uint16_t        qid;
  320                         uint8_t         res2[46];
  321                         uint32_t        vend_specific;
  322         } OS_ATTRIBUTE_PACKED change_op_iq_prop;
  323 
  324     } OS_ATTRIBUTE_PACKED req_type;
  325 
  326 }OS_ATTRIBUTE_PACKED gen_adm_req_iu_t;
  327 
  328 
  329 typedef struct general_admin_response {
  330         iu_header_t     header;
  331         uint16_t        res1;
  332         uint16_t        work;
  333         uint16_t        req_id;
  334         uint8_t         fn_code;
  335         uint8_t         status;
  336         union {
  337                 struct {
  338                         uint8_t         status_desc[4];
  339                         uint64_t        pi_offset;
  340                         uint8_t         res[40];
  341         }  OS_ATTRIBUTE_PACKED  create_op_iq;
  342 
  343                 struct {
  344                         uint8_t         status_desc[4];
  345                         uint64_t        ci_offset;
  346                         uint8_t         res[40];
  347         }  OS_ATTRIBUTE_PACKED  create_op_oq;
  348     }  OS_ATTRIBUTE_PACKED  resp_type;
  349 } OS_ATTRIBUTE_PACKED gen_adm_resp_iu_t ;
  350 
  351 /*report and set Event config IU*/
  352 
  353 typedef struct pqi_event_config_request {
  354         iu_header_t     header;
  355         uint16_t                response_queue_id;      /* specifies the OQ where the response
  356                                                                       IU is to be delivered */
  357         uint8_t         work_area[2];   /* reserved for driver use */
  358         uint16_t            request_id;
  359         union {
  360                 uint16_t        reserved;           /* Report event config iu */
  361                 uint16_t        global_event_oq_id; /* Set event config iu */
  362         }iu_specific;
  363         uint32_t            buffer_length;
  364         sg_desc_t       sg_desc;
  365 }pqi_event_config_request_t;
  366 #if 0
  367 typedef struct pqi_set_event_config_request {
  368         iu_header_t  header;
  369         uint16_t        response_queue_id;  /* specifies the OQ where the response
  370                                                                                                         IU is to be delivered */
  371         uint8_t         work_area[2];   /* reserved for driver use */
  372         uint16_t        request_id;
  373         uint16_t        global_event_oq_id;
  374         uint32_t        buffer_length;
  375         sg_desc_t       sg_desc;
  376 }pqi_set_event_config_request_t;
  377 #endif
  378 
  379  /* Report/Set event config data-in/data-out buffer structure */
  380 
  381 #define PQI_MAX_EVENT_DESCRIPTORS 255
  382 
  383 struct pqi_event_descriptor {
  384         uint8_t         event_type;
  385         uint8_t         reserved;
  386         uint16_t        oq_id;
  387 };
  388 
  389 typedef struct pqi_event_config {
  390         uint8_t         reserved[2];
  391         uint8_t         num_event_descriptors;
  392         uint8_t         reserved1;
  393         struct          pqi_event_descriptor descriptors[PQI_MAX_EVENT_DESCRIPTORS];
  394 }pqi_event_config_t;
  395 
  396 /*management response IUs */
  397 typedef struct pqi_management_response{
  398         iu_header_t             header;
  399         uint16_t                reserved1;
  400         uint8_t                 work_area[2];
  401         uint16_t                req_id;
  402         uint8_t                 result;
  403         uint8_t                 reserved[5];
  404         uint64_t                result_data;
  405 }pqi_management_response_t;
  406   /*Event response IU*/
  407 typedef struct pqi_event_response {
  408         iu_header_t     header;
  409         uint16_t                reserved1;
  410         uint8_t                 work_area[2];
  411         uint8_t                 event_type;
  412         uint8_t                 reserved2 : 7;
  413         uint8_t                 request_acknowledge : 1;
  414         uint16_t                event_id;
  415         uint32_t                additional_event_id;
  416         uint8_t                 data[16];
  417 }pqi_event_response_t;
  418 
  419   /*event acknowledge IU*/
  420 typedef struct pqi_event_acknowledge_request {
  421         iu_header_t     header;
  422         uint16_t                reserved1;
  423         uint8_t                 work_area[2];
  424         uint8_t                 event_type;
  425         uint8_t                 reserved2;
  426         uint16_t                event_id;
  427         uint32_t                additional_event_id;
  428 }pqi_event_acknowledge_request_t;
  429 
  430 struct pqi_event {
  431         boolean_t       pending;
  432         uint8_t         event_type;
  433         uint16_t        event_id;
  434         uint32_t        additional_event_id;
  435 };
  436 
  437 typedef struct pqi_vendor_general_request {
  438         iu_header_t     header;
  439         uint16_t        response_queue_id;
  440         uint8_t         work_area[2];
  441         uint16_t        request_id;
  442         uint16_t        function_code;
  443         union {
  444                 struct {
  445                         uint16_t        first_section;
  446                         uint16_t        last_section;
  447                         uint8_t         reserved1[48];
  448                 } OS_ATTRIBUTE_PACKED config_table_update;
  449 
  450                 struct {
  451                         uint64_t        buffer_address;
  452                         uint32_t        buffer_length;
  453                         uint8_t         reserved2[40];
  454                 } OS_ATTRIBUTE_PACKED ofa_memory_allocation;
  455         } data;
  456 } OS_ATTRIBUTE_PACKED pqi_vendor_general_request_t;
  457 
  458 typedef struct pqi_vendor_general_response {
  459         iu_header_t     header;
  460         uint16_t        reserved1;
  461         uint8_t         work_area[2];
  462         uint16_t        request_id;
  463         uint16_t        function_code;
  464         uint16_t        status;
  465         uint8_t         reserved2[2];
  466 } OS_ATTRIBUTE_PACKED pqi_vendor_general_response_t;
  467 
  468 typedef struct op_q_params
  469 {
  470         uint8_t         fn_code;
  471         uint16_t        qid;
  472         uint16_t        num_elem;
  473         uint16_t        elem_len;
  474         uint16_t        int_msg_num;
  475 
  476 } OS_ATTRIBUTE_PACKED op_q_params;
  477 
  478 /* "Fixed Format Sense Data" (0x70 or 0x71)  (Table 45 in SPC5) */
  479 typedef struct sense_data_fixed {
  480         uint8_t  response_code : 7;      // Byte 0, 0x70 or 0x71
  481         uint8_t  valid : 1;              // Byte 0, bit 7
  482         uint8_t  byte_1;                 // Byte 1
  483         uint8_t  sense_key : 4;          // Byte 2, bit 0-3 (Key)
  484         uint8_t  byte_2_other : 4;       // Byte 2, bit 4-7
  485         uint32_t information;            // Byte 3-6, big-endian like block # in CDB
  486         uint8_t  addtnl_length;          // Byte 7
  487         uint8_t  cmd_specific[4];        // Byte 8-11
  488         uint8_t  sense_code;             // Byte 12 (ASC)
  489         uint8_t  sense_qual;             // Byte 13 (ASCQ)
  490         uint8_t  fru_code;               // Byte 14
  491         uint8_t  sense_key_specific[3];  // Byte 15-17
  492         uint8_t  addtnl_sense[1];        // Byte 18+
  493 } OS_ATTRIBUTE_PACKED sense_data_fixed_t;
  494 
  495 
  496 /* Generic Sense Data Descriptor (Table 29 in SPC5) */
  497 typedef struct descriptor_entry
  498 {
  499         uint8_t  desc_type;              // Byte 9/0
  500         uint8_t  desc_type_length;       // Byte 10/1
  501         union
  502         {
  503                 /* Sense data descriptor specific */
  504                 uint8_t bytes[1];
  505 
  506                 /* Information (Type 0) (Table 31 is SPC5) */
  507                 struct {
  508                         uint8_t  byte_2_rsvd : 7;  // Byte 11/2
  509                         uint8_t  valid : 1;        // Byte 11/2, bit 7
  510                         uint8_t  byte_3;           // Byte 12/3
  511                         uint8_t  information[8];   // Byte 13-20/4-11
  512                 } OS_ATTRIBUTE_PACKED type_0;
  513 
  514         }u;
  515 } OS_ATTRIBUTE_PACKED descriptor_entry_t;
  516 
  517 /* "Descriptor Format Sense Data" (0x72 or 0x73) (Table 28 in SPC5) */
  518 typedef struct sense_data_descriptor {
  519         uint8_t  response_code : 7;      // Byte 0, 0x72 or 0x73
  520         uint8_t  byte_0_rsvd: 1;         // Byte 0, bit 7
  521         uint8_t  sense_key : 4;          // Byte 1, bit 0-3 (Key)
  522         uint8_t  byte_1_other : 4;       // Byte 1, bit 4-7
  523         uint8_t  sense_code;             // Byte 2 (ASC)
  524         uint8_t  sense_qual;             // Byte 3 (ASCQ)
  525         uint8_t  byte4_6[3];             // Byte 4-6
  526         uint8_t  more_length;            // Byte 7
  527         descriptor_entry_t descriptor_list; // Bytes 8+
  528 
  529 } OS_ATTRIBUTE_PACKED sense_data_descriptor_t;
  530 
  531 typedef union sense_data_u
  532 {
  533         sense_data_fixed_t      fixed_format;
  534         sense_data_descriptor_t descriptor_format;
  535         uint8_t                 data[256];
  536 } sense_data_u_t;
  537 
  538 
  539 
  540 
  541 /* Driver will use this structure to interpret the error
  542    info element returned from a failed requests */
  543 typedef struct raid_path_error_info_elem {
  544         uint8_t         data_in_result;         /* !< Byte 0.  See SOP spec Table 77. */
  545         uint8_t         data_out_result;        /* !< Byte 1.  See SOP spec Table 78. */
  546         uint8_t         reserved[3];            /* !< Bytes 2-4. */
  547         uint8_t         status;                 /* !< Byte 5. See SAM-5 specification "Status" codes Table 40. Defined in Storport.h */
  548         uint16_t        status_qual;            /* !< Bytes 6-7. See SAM-5 specification Table 43. */
  549         uint16_t        sense_data_len;         /* !< Bytes 8-9. See SOP specification table 79. */
  550         uint16_t        resp_data_len;          /* !< Bytes 10-11. See SOP specification table 79. */
  551         uint32_t        data_in_transferred;    /* !< Bytes 12-15. If "dada_in_result = 0x01 (DATA_IN BUFFER UNDERFLOW)", Indicates the number of contiguous bytes starting with offset zero in Data-In buffer else Ignored. */
  552         uint32_t        data_out_transferred;   /* !< Bytes 16-19. If "data_out_result = 0x01 (DATA_OUT BUFFER UNDERFLOW)", Indicates the number of contiguous bytes starting with offset zero in Data-Out buffer else Ignored. */
  553         union
  554         {
  555                 sense_data_u_t sense_data;
  556                 uint8_t        data[256];              /* !< Bytes 20-275. Response Data buffer or Sense Data buffer but not both. */
  557         };
  558 }OS_ATTRIBUTE_PACKED raid_path_error_info_elem_t;
  559 
  560 #define PQI_ERROR_BUFFER_ELEMENT_LENGTH sizeof(raid_path_error_info_elem_t)
  561 
  562 typedef enum error_data_present
  563 {
  564    DATA_PRESENT_NO_DATA       = 0,   /* !< No data present in Data buffer. */
  565    DATA_PRESENT_RESPONSE_DATA = 1,   /* !< Response data is present in Data buffer. */
  566    DATA_PRESENT_SENSE_DATA    = 2    /* !< Sense data is present in Data buffer. */
  567 } error_data_present_t;
  568 
  569 typedef struct aio_path_error_info_elem
  570 {
  571         uint8_t         status;                 /* !< Byte 0.  See SAM-5 specification "SCSI Status" codes Table 40. Defined in Storport.h */
  572         uint8_t         service_resp;           /* !< Byte 1.  SCSI Service Response.  */
  573         uint8_t         data_pres;              /* !< Byte 2.  Bits [7:2] reserved. Bits [1:0] - 0=No data, 1=Response data, 2=Sense data. */
  574         uint8_t         reserved1;              /* !< Byte 3.  Reserved. */
  575         uint32_t        resd_count;             /* !< Bytes 4-7.  The residual data length in bytes. Need the original transfer size and if Status is OverRun or UnderRun. */
  576         uint16_t        data_len;               /* !< Bytes 8-9.  The amount of Sense data or Response data returned in Response/Sense Data buffer. */
  577         uint16_t        reserved2;              /* !< Bytes 10.  Reserved. */
  578         uint8_t         data[256];              /* !< Bytes 11-267. Response data buffer or Sense data buffer but not both. */
  579         uint8_t         padding[8];             /* !< Bytes 268-275.  Padding to make AIO_PATH_ERROR_INFO_ELEMENT = RAID_PATH_ERROR_INFO_ELEMENT */
  580 }OS_ATTRIBUTE_PACKED aio_path_error_info_elem_t;
  581 
  582 struct init_base_struct {
  583         uint32_t        revision;               /* revision of init structure */
  584         uint32_t        flags;                  /* reserved */
  585         uint32_t        err_buf_paddr_l;        /* lower 32 bits of physical address of error buffer */
  586         uint32_t        err_buf_paddr_h;        /* upper 32 bits of physical address of error buffer */
  587         uint32_t        err_buf_elem_len;       /* length of each element in error buffer (in bytes) */
  588         uint32_t        err_buf_num_elem;       /* number of elements in error buffer */
  589 }OS_ATTRIBUTE_PACKED;
  590 
  591 /* Queue details */
  592 typedef struct ib_queue {
  593         uint32_t        q_id;
  594         uint32_t        num_elem;
  595         uint32_t        elem_size;
  596         char            *array_virt_addr;
  597         dma_addr_t      array_dma_addr;
  598         uint32_t        pi_local;
  599         uint32_t        pi_register_offset;
  600         uint32_t        *pi_register_abs;
  601         uint32_t        *ci_virt_addr;
  602         dma_addr_t      ci_dma_addr;
  603         boolean_t       created;
  604         boolean_t       lockcreated;
  605         char            lockname[LOCKNAME_SIZE];
  606         OS_PQILOCK_T    lock    OS_ATTRIBUTE_ALIGNED(8);
  607 }ib_queue_t;
  608 
  609 typedef struct ob_queue {
  610         uint32_t        q_id;
  611         uint32_t        num_elem;
  612         uint32_t        elem_size;
  613         uint32_t        intr_msg_num;
  614         char            *array_virt_addr;
  615         dma_addr_t      array_dma_addr;
  616         uint32_t        ci_local;
  617         uint32_t        ci_register_offset;
  618         uint32_t        *ci_register_abs;
  619         uint32_t        *pi_virt_addr;
  620         dma_addr_t      pi_dma_addr;
  621         boolean_t       created;
  622 }ob_queue_t;
  623 
  624 typedef struct pqisrc_sg_desc{
  625         uint64_t        addr;
  626         uint32_t        len;
  627         uint32_t        flags;
  628 }sgt_t;
  629 
  630 
  631 typedef struct pqi_iu_layer_desc {
  632         uint8_t         ib_spanning_supported : 1;
  633         uint8_t         res1 : 7;
  634         uint8_t         res2[5];
  635         uint16_t        max_ib_iu_len;
  636         uint8_t         ob_spanning_supported : 1;
  637         uint8_t         res3 : 7;
  638         uint8_t         res4[5];
  639         uint16_t        max_ob_iu_len;
  640 }OS_ATTRIBUTE_PACKED pqi_iu_layer_desc_t;
  641 
  642 
  643 /* Response IU data */
  644 typedef struct pqi_device_capabilities {
  645         uint16_t        length;
  646         uint8_t         res1[6];
  647         uint8_t         ibq_arb_priority_support_bitmask;
  648         uint8_t         max_aw_a;
  649         uint8_t         max_aw_b;
  650         uint8_t         max_aw_c;
  651         uint8_t         max_arb_burst : 3;
  652         uint8_t         res2 : 4;
  653         uint8_t         iqa : 1;
  654         uint8_t         res3[2];
  655         uint8_t         iq_freeze : 1;
  656         uint8_t         res4 : 7;
  657         uint16_t        max_iqs;
  658         uint16_t        max_iq_elements;
  659         uint8_t         res5[4];
  660         uint16_t        max_iq_elem_len;
  661         uint16_t        min_iq_elem_len;
  662         uint8_t         res6[2];
  663         uint16_t        max_oqs;
  664         uint16_t        max_oq_elements;
  665         uint16_t        intr_coales_time_granularity;
  666         uint16_t        max_oq_elem_len;
  667         uint16_t        min_oq_elem_len;
  668         uint8_t         res7[24];
  669         pqi_iu_layer_desc_t iu_layer_desc[32];
  670 }OS_ATTRIBUTE_PACKED pqi_dev_cap_t;
  671 
  672 /* IO path */
  673 
  674 typedef struct pqi_aio_req {
  675         iu_header_t     header;
  676         uint16_t        response_queue_id;
  677         uint8_t         work_area[2];
  678         uint16_t        req_id;
  679         uint8_t         res1[2];
  680         uint32_t        nexus;
  681         uint32_t        buf_len;
  682         uint8_t         data_dir : 2;
  683         uint8_t         partial : 1;
  684         uint8_t         mem_type : 1;
  685         uint8_t         fence : 1;
  686         uint8_t         encrypt_enable : 1;
  687         uint8_t         res2 : 2;
  688         uint8_t         task_attr : 3;
  689         uint8_t         cmd_prio : 4;
  690         uint8_t         res3 : 1;
  691         uint16_t        encrypt_key_index;
  692         uint32_t        encrypt_twk_low;
  693         uint32_t        encrypt_twk_high;
  694         uint8_t         cdb[16];
  695         uint16_t        err_idx;
  696         uint8_t         num_sg;
  697         uint8_t         cdb_len;
  698         uint8_t         lun[8];
  699         uint8_t         res4[4];
  700         sgt_t           sg_desc[4];
  701 }OS_ATTRIBUTE_PACKED pqi_aio_req_t;
  702 
  703 
  704 typedef struct pqisrc_raid_request {
  705         iu_header_t header;
  706         uint16_t response_queue_id;     /* specifies the OQ where the response
  707                                            IU is to be delivered */
  708         uint8_t work_area[2];   /* reserved for driver use */
  709         uint16_t request_id;
  710         uint16_t nexus_id;
  711         uint32_t buffer_length;
  712         uint8_t lun_number[8];
  713         uint16_t protocol_spec;
  714         uint8_t data_direction : 2;
  715         uint8_t partial : 1;
  716         uint8_t reserved1 : 4;
  717         uint8_t fence : 1;
  718         uint16_t error_index;
  719         uint8_t reserved2;
  720         uint8_t task_attribute : 3;
  721         uint8_t command_priority : 4;
  722         uint8_t reserved3 : 1;
  723         uint8_t reserved4 : 2;
  724         uint8_t additional_cdb_bytes_usage : 3;
  725         uint8_t reserved5 : 3;
  726         uint8_t cdb[16];
  727         uint8_t reserved[12];
  728         uint32_t timeout_in_sec;
  729         sgt_t   sg_descriptors[4];
  730 } OS_ATTRIBUTE_PACKED pqisrc_raid_req_t;
  731 
  732 
  733 typedef struct pqi_raid_tmf_req {
  734         iu_header_t     header;
  735         uint16_t        resp_qid;
  736         uint8_t         work_area[2];
  737         uint16_t        req_id;
  738         uint16_t        nexus;
  739         uint8_t         res1[2];
  740         uint16_t        timeout_in_sec;
  741         uint8_t         lun[8];
  742         uint16_t        protocol_spec;
  743         uint16_t        obq_id_to_manage;
  744         uint16_t        req_id_to_manage;
  745         uint8_t         tmf;
  746         uint8_t         res2 : 7;
  747         uint8_t         fence : 1;
  748 } OS_ATTRIBUTE_PACKED pqi_raid_tmf_req_t;
  749 
  750 typedef struct pqi_aio_tmf_req {
  751         iu_header_t     header;
  752         uint16_t        resp_qid;
  753         uint8_t         work_area[2];
  754         uint16_t        req_id;
  755         uint16_t        res1;
  756         uint32_t        nexus;
  757         uint8_t         lun[8];
  758         uint32_t        req_id_to_manage;
  759         uint8_t         tmf;
  760         uint8_t         res2 : 7;
  761         uint8_t         fence : 1;
  762         uint16_t        error_idx;
  763 }OS_ATTRIBUTE_PACKED pqi_aio_tmf_req_t;
  764 
  765 typedef struct pqi_tmf_resp {
  766         iu_header_t     header;
  767         uint16_t        resp_qid;
  768         uint8_t         work_area[2];
  769         uint16_t        req_id;
  770         uint16_t        nexus;
  771         uint8_t         add_resp_info[3];
  772         uint8_t         resp_code;
  773 }pqi_tmf_resp_t;
  774 
  775 
  776 struct pqi_io_response {
  777         iu_header_t     header;
  778         uint16_t        queue_id;
  779         uint8_t         work_area[2];
  780         uint16_t        request_id;
  781         uint16_t        error_index;
  782         uint8_t         reserved[4];
  783 }OS_ATTRIBUTE_PACKED;
  784 
  785 
  786 struct pqi_enc_info {
  787         uint16_t        data_enc_key_index;
  788         uint32_t        encrypt_tweak_lower;
  789         uint32_t        encrypt_tweak_upper;
  790 };
  791 
  792 
  793 typedef struct pqi_scsi_device {
  794         device_type_t   devtype;                /* as reported by INQUIRY command */
  795         uint8_t device_type;            /* as reported by
  796                                            BMIC_IDENTIFY_PHYSICAL_DEVICE - only
  797                                            valid for devtype = TYPE_DISK */
  798         int     bus;
  799         int     target;
  800         int     lun;
  801         uint8_t flags;
  802         uint8_t scsi3addr[8];
  803         uint64_t        wwid;
  804         uint8_t is_physical_device : 1;
  805         uint8_t is_external_raid_device : 1;
  806         uint8_t target_lun_valid : 1;
  807         uint8_t expose_device : 1;
  808         uint8_t no_uld_attach : 1;
  809         uint8_t is_obdr_device : 1;
  810         uint8_t aio_enabled : 1;
  811         uint8_t device_gone : 1;
  812         uint8_t new_device : 1;
  813         uint8_t volume_offline : 1;
  814         uint8_t scsi_rescan : 1;
  815         uint8_t vendor[8];              /* bytes 8-15 of inquiry data */
  816         uint8_t model[16];              /* bytes 16-31 of inquiry data */
  817         uint64_t        sas_address;
  818         uint8_t raid_level;
  819         uint16_t        queue_depth;            /* max. queue_depth for this device */
  820         uint16_t        advertised_queue_depth;
  821         uint32_t        ioaccel_handle;
  822         uint8_t volume_status;
  823         uint8_t active_path_index;
  824         uint8_t path_map;
  825         uint8_t bay;
  826         uint8_t box[8];
  827         uint16_t        phys_connector[8];
  828         int     offload_config;         /* I/O accel RAID offload configured */
  829         int     offload_enabled;        /* I/O accel RAID offload enabled */
  830         int     offload_enabled_pending;
  831         int     offload_to_mirror;      /* Send next I/O accelerator RAID
  832                                            offload request to mirror drive. */
  833         struct raid_map *raid_map;      /* I/O accelerator RAID map */
  834 
  835         int     reset_in_progress;
  836         int     logical_unit_number;
  837         os_dev_info_t   *dip;                   /*os specific scsi device information*/
  838         boolean_t       invalid;
  839         boolean_t       path_destroyed;
  840         boolean_t       firmware_queue_depth_set;
  841         OS_ATOMIC64_T   active_requests;
  842 }pqi_scsi_dev_t;
  843 
  844 typedef struct pqisrc_softstate pqisrc_softstate_t;
  845 typedef struct pqi_firmware_feature pqi_firmware_feature_t;
  846 typedef void (*feature_status_fn)(pqisrc_softstate_t *softs,
  847         pqi_firmware_feature_t *firmware_feature);
  848 
  849 struct pqi_firmware_feature {
  850         char                    *feature_name;
  851         unsigned int            feature_bit;
  852         boolean_t               supported;
  853         boolean_t               enabled;
  854         feature_status_fn       feature_status;
  855 };
  856 
  857 struct pqi_conf_table_firmware_features {
  858         struct          pqi_conf_table_section_header header;
  859         uint16_t        num_elements;
  860         uint8_t         features_supported[];
  861 };
  862 
  863 struct pqi_conf_table_section_info {
  864         struct          pqisrc_softstate *softs;
  865         void            *section;
  866         uint32_t        section_offset;
  867         void            *section_addr;
  868 };
  869 
  870 struct sense_header_scsi {              /* See SPC-3 section 4.5 */
  871         uint8_t response_code;          /* permit: 0x0, 0x70, 0x71, 0x72, 0x73 */
  872         uint8_t sense_key;
  873         uint8_t asc;
  874         uint8_t ascq;
  875         uint8_t byte4;
  876         uint8_t byte5;
  877         uint8_t byte6;
  878         uint8_t additional_length;      /* always 0 for fixed sense format */
  879 }OS_ATTRIBUTE_PACKED;
  880 
  881 
  882 
  883 typedef struct report_lun_header {
  884         uint32_t list_length;
  885         uint8_t extended_response;
  886         uint8_t reserved[3];
  887 }OS_ATTRIBUTE_PACKED reportlun_header_t;
  888 
  889 
  890 typedef struct report_lun_ext_entry {
  891         uint8_t lunid[8];
  892         uint64_t wwid;
  893         uint8_t device_type;
  894         uint8_t device_flags;
  895         uint8_t lun_count;      /* number of LUNs in a multi-LUN device */
  896         uint8_t redundant_paths;
  897         uint32_t ioaccel_handle;
  898 }OS_ATTRIBUTE_PACKED reportlun_ext_entry_t;
  899 
  900 
  901 typedef struct report_lun_data_ext {
  902         reportlun_header_t header;
  903         reportlun_ext_entry_t lun_entries[1];
  904 }OS_ATTRIBUTE_PACKED reportlun_data_ext_t;
  905 
  906 typedef struct reportlun_queue_depth_entry {
  907         uint8_t logical_unit_num;
  908         uint8_t reserved_1:6;
  909         uint8_t address:2;
  910         uint8_t box_bus_num;
  911         uint8_t reserved_2:6;
  912         uint8_t mode:2;
  913         uint8_t bus_ident;
  914 
  915         /* Byte 5 */
  916         uint8_t queue_depth:7;
  917         uint8_t multiplier:1;
  918 
  919         /* Byte 6 */
  920         uint8_t drive_type_mix_flags;
  921         uint8_t level_2_bus:6;
  922         uint8_t level_2_mode:2;
  923         uint8_t unused_bytes[16];
  924 }OS_ATTRIBUTE_PACKED reportlun_queue_depth_entry_t;
  925 
  926 typedef struct reportlun_queue_depth_data {
  927         reportlun_header_t header;
  928         reportlun_queue_depth_entry_t lun_entries[1]; /* lun list with Queue Depth values for each lun */
  929 }OS_ATTRIBUTE_PACKED reportlun_queue_depth_data_t;
  930 
  931 typedef struct raidmap_data {
  932         uint32_t ioaccel_handle;
  933         uint8_t xor_mult[2];
  934         uint8_t reserved[2];
  935 }OS_ATTRIBUTE_PACKED raidmap_data_t;
  936 
  937 typedef struct raid_map {
  938         uint32_t        structure_size;         /* size of entire structure in bytes */
  939         uint32_t        volume_blk_size;        /* bytes / block in the volume */
  940         uint64_t        volume_blk_cnt;         /* logical blocks on the volume */
  941         uint8_t phys_blk_shift;         /* shift factor to convert between
  942                                            units of logical blocks and physical
  943                                            disk blocks */
  944         uint8_t parity_rotation_shift;  /* shift factor to convert between units
  945                                            of logical stripes and physical
  946                                            stripes */
  947         uint16_t        strip_size;             /* blocks used on each disk / stripe */
  948         uint64_t        disk_starting_blk;      /* first disk block used in volume */
  949         uint64_t        disk_blk_cnt;           /* disk blocks used by volume / disk */
  950         uint16_t        data_disks_per_row;     /* data disk entries / row in the map */
  951         uint16_t        metadata_disks_per_row; /* mirror/parity disk entries / row
  952                                            in the map */
  953         uint16_t        row_cnt;                /* rows in each layout map */
  954         uint16_t        layout_map_count;       /* layout maps (1 map per mirror/parity
  955                                            group) */
  956         uint16_t        flags;
  957         uint16_t        data_encryption_key_index;
  958         uint8_t reserved[16];
  959         raidmap_data_t dev_data[RAID_MAP_MAX_ENTRIES];
  960 }OS_ATTRIBUTE_PACKED pqisrc_raid_map_t;
  961 
  962 
  963 typedef struct bmic_ident_ctrl {
  964         uint8_t         conf_ld_count;
  965         uint32_t        conf_sign;
  966         uint8_t         fw_version[4];
  967         uint8_t         rom_fw_rev[4];
  968         uint8_t         hw_rev;
  969         uint8_t         reserved[140];
  970         uint16_t        extended_lun_count;
  971         uint8_t         reserved1[34];
  972         uint16_t        fw_build_number;
  973         uint8_t         reserved2[100];
  974         uint8_t         ctrl_mode;
  975         uint8_t         reserved3[32];
  976 }OS_ATTRIBUTE_PACKED bmic_ident_ctrl_t;
  977 
  978 typedef struct bmic_identify_physical_device {
  979         uint8_t scsi_bus;               /* SCSI Bus number on controller */
  980         uint8_t scsi_id;                /* SCSI ID on this bus */
  981         uint16_t        block_size;             /* sector size in bytes */
  982         uint32_t        total_blocks;           /* number for sectors on drive */
  983         uint32_t        reserved_blocks;        /* controller reserved (RIS) */
  984         uint8_t model[40];              /* Physical Drive Model */
  985         uint8_t serial_number[40];      /* Drive Serial Number */
  986         uint8_t firmware_revision[8];   /* drive firmware revision */
  987         uint8_t scsi_inquiry_bits;      /* inquiry byte 7 bits */
  988         uint8_t compaq_drive_stamp;     /* 0 means drive not stamped */
  989         uint8_t last_failure_reason;
  990         uint8_t flags;
  991         uint8_t more_flags;
  992         uint8_t scsi_lun;               /* SCSI LUN for phys drive */
  993         uint8_t yet_more_flags;
  994         uint8_t even_more_flags;
  995         uint32_t        spi_speed_rules;
  996         uint8_t phys_connector[2];      /* connector number on controller */
  997         uint8_t phys_box_on_bus;        /* phys enclosure this drive resides */
  998         uint8_t phys_bay_in_box;        /* phys drv bay this drive resides */
  999         uint32_t        rpm;                    /* drive rotational speed in RPM */
 1000         uint8_t device_type;            /* type of drive */
 1001         uint8_t sata_version;           /* only valid when device_type =
 1002                                            BMIC_DEVICE_TYPE_SATA */
 1003         uint64_t        big_total_block_count;
 1004         uint64_t        ris_starting_lba;
 1005         uint32_t        ris_size;
 1006         uint8_t wwid[20];
 1007         uint8_t controller_phy_map[32];
 1008         uint16_t        phy_count;
 1009         uint8_t phy_connected_dev_type[256];
 1010         uint8_t phy_to_drive_bay_num[256];
 1011         uint16_t        phy_to_attached_dev_index[256];
 1012         uint8_t box_index;
 1013         uint8_t reserved;
 1014         uint16_t        extra_physical_drive_flags;
 1015         uint8_t negotiated_link_rate[256];
 1016         uint8_t phy_to_phy_map[256];
 1017         uint8_t redundant_path_present_map;
 1018         uint8_t redundant_path_failure_map;
 1019         uint8_t active_path_number;
 1020         uint16_t        alternate_paths_phys_connector[8];
 1021         uint8_t alternate_paths_phys_box_on_port[8];
 1022         uint8_t multi_lun_device_lun_count;
 1023         uint8_t minimum_good_fw_revision[8];
 1024         uint8_t unique_inquiry_bytes[20];
 1025         uint8_t current_temperature_degreesC;
 1026         uint8_t temperature_threshold_degreesC;
 1027         uint8_t max_temperature_degreesC;
 1028         uint8_t logical_blocks_per_phys_block_exp;
 1029         uint16_t        current_queue_depth_limit;
 1030         uint8_t switch_name[10];
 1031         uint16_t        switch_port;
 1032         uint8_t alternate_paths_switch_name[40];
 1033         uint8_t alternate_paths_switch_port[8];
 1034         uint16_t        power_on_hours;
 1035         uint16_t        percent_endurance_used;
 1036         uint8_t drive_authentication;
 1037         uint8_t smart_carrier_authentication;
 1038         uint8_t smart_carrier_app_fw_version;
 1039         uint8_t smart_carrier_bootloader_fw_version;
 1040         uint8_t encryption_key_name[64];
 1041         uint32_t        misc_drive_flags;
 1042         uint16_t        dek_index;
 1043         uint8_t         padding[112];
 1044 }OS_ATTRIBUTE_PACKED bmic_ident_physdev_t;
 1045 
 1046 typedef struct pqisrc_bmic_flush_cache {
 1047         uint8_t disable_cache;
 1048         uint8_t power_action;
 1049         uint8_t ndu_flush_cache;
 1050         uint8_t halt_event;
 1051         uint8_t reserved[28];
 1052 } OS_ATTRIBUTE_PACKED pqisrc_bmic_flush_cache_t;
 1053 
 1054 /* for halt_event member of pqisrc_bmic_flush_cache_t */
 1055 enum pqisrc_flush_cache_event_type {
 1056         PQISRC_NONE_CACHE_FLUSH_ONLY = 0,
 1057         PQISRC_SHUTDOWN = 1,
 1058         PQISRC_HIBERNATE = 2,
 1059         PQISRC_SUSPEND = 3,
 1060         PQISRC_RESTART = 4
 1061 };
 1062 
 1063 struct request_container_block;
 1064 typedef void (*success_callback)(struct pqisrc_softstate *, struct request_container_block *);
 1065 typedef void (*error_callback)(struct pqisrc_softstate *, struct request_container_block *, uint16_t);
 1066 
 1067 /* Request container block */
 1068 typedef struct request_container_block {
 1069         void                    *req;
 1070         void                    *error_info;
 1071         REQUEST_STATUS_T        status;
 1072         uint32_t                tag;
 1073         sgt_t                   *sg_chain_virt;
 1074         dma_addr_t              sg_chain_dma;
 1075         uint32_t                data_dir;
 1076         pqi_scsi_dev_t          *dvp;
 1077         struct pqisrc_softstate *softs;
 1078         success_callback        success_cmp_callback;
 1079         error_callback          error_cmp_callback;
 1080         uint8_t                 *cdbp;
 1081         int                     cmdlen;
 1082         uint32_t                bcount; /* buffer size in byte */
 1083         uint32_t                ioaccel_handle;
 1084         boolean_t               encrypt_enable;
 1085         struct pqi_enc_info     enc_info;
 1086         ib_queue_t              *req_q;
 1087         int                     path;
 1088         int                     resp_qid;
 1089         boolean_t               req_pending;
 1090         boolean_t               timedout;
 1091         int                     tm_req;
 1092         int                     aio_retry;
 1093         int                     cm_flags;
 1094         void                    *cm_data; /* pointer to data in kernel space */
 1095         bus_dmamap_t            cm_datamap;
 1096         uint32_t                nseg;
 1097         union ccb               *cm_ccb;
 1098         sgt_t                   *sgt;   /* sg table */
 1099 
 1100 }rcb_t;
 1101 
 1102 typedef struct tid_pool {
 1103         int                     tid[PQI_MAX_PHYSICALS];
 1104         int                     index;
 1105 }tid_pool_t;
 1106 
 1107 struct pqisrc_softstate {
 1108         OS_SPECIFIC_T                   os_specific;
 1109         struct ioa_registers            *ioa_reg;
 1110         struct pqi_registers            *pqi_reg;
 1111         uint8_t                         *pci_mem_base_vaddr;
 1112         PCI_ACC_HANDLE_T                pci_mem_handle;
 1113         struct pqi_cap                  pqi_cap;
 1114         struct pqi_pref_settings        pref_settings;
 1115         char                            fw_version[11];
 1116         uint16_t                        fw_build_number;
 1117         uint32_t                        card;           /* index to aac_cards */
 1118         uint16_t                        vendid;         /* vendor id */
 1119         uint16_t                        subvendid;      /* sub vendor id */
 1120         uint16_t                        devid;          /* device id */
 1121         uint16_t                        subsysid;       /* sub system id */
 1122         controller_state_t              ctlr_state;
 1123         struct dma_mem                  err_buf_dma_mem;
 1124         struct dma_mem                  admin_queue_dma_mem;
 1125         struct dma_mem                  op_ibq_dma_mem;
 1126         struct dma_mem                  op_obq_dma_mem;
 1127         struct dma_mem                  event_q_dma_mem;
 1128         struct dma_mem                  sg_dma_desc[PQISRC_MAX_OUTSTANDING_REQ];
 1129         ib_queue_t                      admin_ib_queue;
 1130         ob_queue_t                      admin_ob_queue;
 1131         ob_queue_t                      event_q;
 1132         ob_queue_t                      op_ob_q[PQISRC_MAX_SUPPORTED_OP_OB_Q - 1];/* 1 event queue */
 1133         ib_queue_t                      op_raid_ib_q[PQISRC_MAX_SUPPORTED_OP_RAID_IB_Q];
 1134         ib_queue_t                      op_aio_ib_q[PQISRC_MAX_SUPPORTED_OP_AIO_IB_Q];
 1135         uint32_t                        max_outstanding_io;
 1136         uint32_t                        max_io_for_scsi_ml;
 1137         uint32_t                        num_op_raid_ibq;
 1138         uint32_t                        num_op_aio_ibq;
 1139         uint32_t                        num_op_obq;
 1140         uint32_t                        num_elem_per_op_ibq;
 1141         uint32_t                        num_elem_per_op_obq;
 1142         uint32_t                        ibq_elem_size;
 1143         uint32_t                        obq_elem_size;
 1144         pqi_dev_cap_t                   pqi_dev_cap;
 1145         uint16_t                        max_ib_iu_length_per_fw;
 1146         uint16_t                        max_ib_iu_length;
 1147         unsigned                        max_sg_per_iu;
 1148         uint8_t                         ib_spanning_supported : 1;
 1149         uint8_t                         ob_spanning_supported : 1;
 1150         pqi_event_config_t              event_config;
 1151         struct pqi_event                pending_events[PQI_NUM_SUPPORTED_EVENTS];
 1152         int                             intr_type;
 1153         int                             intr_count;
 1154         int                             num_cpus_online;
 1155         boolean_t                       share_opq_and_eventq;
 1156         rcb_t                           *rcb;
 1157 #ifndef LOCKFREE_STACK
 1158         pqi_taglist_t                   taglist;
 1159 #else
 1160         lockless_stack_t                taglist;
 1161 #endif /* LOCKFREE_STACK */
 1162         boolean_t                       devlist_lockcreated;
 1163         OS_LOCK_T                       devlist_lock    OS_ATTRIBUTE_ALIGNED(8);
 1164         char                            devlist_lock_name[LOCKNAME_SIZE];
 1165         pqi_scsi_dev_t                  *device_list[PQI_MAX_DEVICES][PQI_MAX_MULTILUN];
 1166         OS_SEMA_LOCK_T                  scan_lock;
 1167         uint8_t                         lun_count[PQI_MAX_DEVICES];
 1168         uint64_t                target_sas_addr[PQI_MAX_EXT_TARGETS];
 1169         uint64_t                        prev_heartbeat_count;
 1170         uint64_t                        *heartbeat_counter_abs_addr;
 1171         uint64_t                        heartbeat_counter_off;
 1172         uint8_t                 *fw_features_section_abs_addr;
 1173         uint64_t                        fw_features_section_off;
 1174         uint32_t                        bus_id;
 1175         uint32_t                        device_id;
 1176         uint32_t                        func_id;
 1177         char                            *os_name;
 1178         boolean_t                       ctrl_online;
 1179         uint8_t                         pqi_reset_quiesce_allowed : 1;
 1180         boolean_t                       ctrl_in_pqi_mode;
 1181         tid_pool_t                      tid_pool;
 1182         uint32_t                        adapterQDepth;
 1183         uint32_t                        dma_mem_consumed;
 1184         boolean_t                       timeout_in_passthrough;
 1185         boolean_t                       timeout_in_tmf;
 1186 };
 1187 
 1188 typedef struct vpd_logical_volume_status {
 1189         uint8_t         peripheral_info;
 1190         uint8_t         page_code;
 1191         uint8_t         reserved;
 1192         uint8_t         page_length;
 1193         uint8_t         volume_status;
 1194         uint8_t         reserved2[3];
 1195         uint32_t        flags;
 1196 }vpd_volume_status;
 1197 
 1198 #endif

Cache object: 09cbadbd05bb4e326efee6aeff5b3f24


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.