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
|