]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/smartpqi/smartpqi_structures.h
pmic: rockchip: Split the driver in rk805 and rk808
[FreeBSD/FreeBSD.git] / sys / dev / smartpqi / smartpqi_structures.h
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 commmand */
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