xref: /freebsd/sys/dev/smartpqi/smartpqi_defines.h (revision 190cef3d)
1 /*-
2  * Copyright (c) 2018 Microsemi Corporation.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  */
26 
27 /* $FreeBSD$ */
28 
29 #ifndef _PQI_DEFINES_H
30 #define _PQI_DEFINES_H
31 
32 #define PQI_STATUS_FAILURE			-1
33 #define PQI_STATUS_TIMEOUT			-2
34 #define PQI_STATUS_QFULL			-3
35 #define PQI_STATUS_SUCCESS			0
36 
37 #define PQISRC_CMD_TIMEOUT_CNT			1200000 /* 500usec * 1200000 = 5 min  */
38 #define PQI_CMND_COMPLETE_TMO			1000 /* in millisecond  */
39 
40 #define	INVALID_ELEM				0xffff
41 #ifndef MIN
42 #define MIN(a,b)                                ((a) < (b) ? (a) : (b))
43 #endif
44 
45 #ifndef MAX
46 #define MAX(a,b)                                ((a) > (b) ? (a) : (b))
47 #endif
48 
49 #define PQISRC_ROUNDUP(x, y)			(((x) + (y) - 1) / (y) * (y))
50 #define PQISRC_DIV_ROUND_UP(x, y)		(((x) + (y) - 1) / (y))
51 
52 #define ALIGN_BOUNDARY(a, n)	{	\
53 		if (a % n)	\
54 			a = a + (n - a % n);	\
55 	}
56 
57 /* Busy wait timeout on a condition */
58 #define	COND_BUSYWAIT(cond, timeout /* in millisecond */) { \
59 		if (!(cond)) { \
60 			while (timeout) { \
61 				OS_BUSYWAIT(1000); \
62 				if (cond) \
63 					break; \
64 				timeout--; \
65 			} \
66 		} \
67 	}
68 
69 /* Wait timeout on a condition*/
70 #define	COND_WAIT(cond, timeout /* in millisecond */) { \
71 		if (!(cond)) { \
72 			while (timeout) { \
73 				OS_SLEEP(1000); \
74 				if (cond) \
75 					break; \
76 				timeout--; \
77 			} \
78 		} \
79 	}
80 
81 #define FILL_QUEUE_ARRAY_ADDR(q,virt,dma) { 	\
82 			q->array_virt_addr = virt;	\
83 			q->array_dma_addr = dma;	\
84 		}
85 
86 #define	true	1
87 #define false	0
88 
89 enum INTR_TYPE {
90 	LOCK_INTR,
91 	LOCK_SLEEP
92 };
93 
94 #define LOCKNAME_SIZE		32
95 
96 #define INTR_TYPE_NONE		0x0
97 #define INTR_TYPE_FIXED		0x1
98 #define INTR_TYPE_MSI		0x2
99 #define INTR_TYPE_MSIX		0x4
100 #define SIS_ENABLE_MSIX		0x40
101 #define SIS_ENABLE_INTX		0x80
102 #define PQISRC_LEGACY_INTX_MASK	0x1
103 
104 #define DMA_TO_VIRT(mem)	((mem)->virt_addr)
105 #define DMA_PHYS_LOW(mem)	(((mem)->dma_addr)  & 0x00000000ffffffff)
106 #define DMA_PHYS_HIGH(mem)	((((mem)->dma_addr) & 0xffffffff00000000) >> 32)
107 
108 
109 typedef enum REQUEST_STATUS {
110 	REQUEST_SUCCESS = 0,
111 	REQUEST_PENDING = -1,
112 	REQUEST_FAILED = -2,
113 }REQUEST_STATUS_T;
114 
115 typedef enum IO_PATH {
116 	AIO_PATH,
117 	RAID_PATH
118 }IO_PATH_T;
119 
120 typedef enum device_type
121 {
122 	DISK_DEVICE,
123 	TAPE_DEVICE,
124 	ROM_DEVICE = 5,
125 	SES_DEVICE,
126 	CONTROLLER_DEVICE,
127 	MEDIUM_CHANGER_DEVICE,
128 	RAID_DEVICE = 0x0c,
129 	ENCLOSURE_DEVICE,
130 	ZBC_DEVICE = 0x14
131 } device_type_t;
132 
133 typedef enum controller_state {
134 	PQI_UP_RUNNING,
135 	PQI_BUS_RESET,
136 }controller_state_t;
137 
138 
139 #define PQISRC_MAX_MSIX_SUPPORTED		64
140 
141 /* SIS Specific */
142 #define PQISRC_INIT_STRUCT_REVISION		9
143 #define	PQISRC_SECTOR_SIZE			512
144 #define	PQISRC_BLK_SIZE				PQISRC_SECTOR_SIZE
145 #define	PQISRC_DEFAULT_DMA_ALIGN		4
146 #define	PQISRC_DMA_ALIGN_MASK			(PQISRC_DEFAULT_DMA_ALIGN - 1)
147 #define PQISRC_ERR_BUF_DMA_ALIGN		32
148 #define PQISRC_ERR_BUF_ELEM_SIZE		MAX(sizeof(raid_path_error_info_elem_t),sizeof(aio_path_error_info_elem_t))
149 #define	PQISRC_INIT_STRUCT_DMA_ALIGN		16
150 
151 #define SIS_CMD_GET_ADAPTER_PROPERTIES		0x19
152 #define SIS_CMD_GET_COMM_PREFERRED_SETTINGS	0x26
153 #define SIS_CMD_GET_PQI_CAPABILITIES		0x3000
154 #define SIS_CMD_INIT_BASE_STRUCT_ADDRESS	0x1b
155 
156 #define SIS_SUPPORT_EXT_OPT			0x00800000
157 #define SIS_SUPPORT_PQI				0x00000004
158 #define SIS_SUPPORT_PQI_RESET_QUIESCE		0x00000008
159 
160 #define SIS_PQI_RESET_QUIESCE			0x1000000
161 
162 #define SIS_STATUS_OK_TIMEOUT			120000	/* in milli sec, 5 sec */
163 
164 #define SIS_CMD_COMPLETE_TIMEOUT   		30000  /* in milli sec, 30 secs */
165 #define SIS_POLL_START_WAIT_TIME		20000  /* in micro sec, 20 milli sec */
166 #define SIS_DB_BIT_CLEAR_TIMEOUT_CNT		120000	/* 500usec * 120000 = 60 sec */
167 
168 #define SIS_ENABLE_TIMEOUT			3000
169 #define REENABLE_SIS				0x1
170 #define TRIGGER_NMI_SIS				0x800000
171 /*SIS Register status defines */
172 
173 #define PQI_CTRL_KERNEL_UP_AND_RUNNING		0x80
174 #define PQI_CTRL_KERNEL_PANIC			0x100
175 
176 #define SIS_CTL_TO_HOST_DB_DISABLE_ALL		0xFFFFFFFF
177 #define SIS_CTL_TO_HOST_DB_CLEAR		0x00001000
178 #define	SIS_CMD_SUBMIT				0x00000200  /* Bit 9 */
179 #define SIS_CMD_COMPLETE			0x00001000  /* Bit 12 */
180 #define SIS_CMD_STATUS_SUCCESS			0x1
181 
182 /* PQI specific */
183 
184 /* defines */
185 #define PQISRC_PQI_REG_OFFSET				0x4000
186 #define	PQISRC_MAX_OUTSTANDING_REQ			4096
187 #define	PQISRC_MAX_ADMIN_IB_QUEUE_ELEM_NUM		16
188 #define	PQISRC_MAX_ADMIN_OB_QUEUE_ELEM_NUM		16
189 
190 
191 
192 #define PQI_MIN_OP_IB_QUEUE_ID				1
193 #define PQI_OP_EVENT_QUEUE_ID				1
194 #define PQI_MIN_OP_OB_QUEUE_ID				2
195 
196 #define	PQISRC_MAX_SUPPORTED_OP_IB_Q		128
197 #define PQISRC_MAX_SUPPORTED_OP_RAID_IB_Q	(PQISRC_MAX_SUPPORTED_OP_IB_Q / 2)
198 #define PQISRC_MAX_SUPPORTED_OP_AIO_IB_Q	(PQISRC_MAX_SUPPORTED_OP_RAID_IB_Q)
199 #define	PQISRC_MAX_OP_IB_QUEUE_ELEM_NUM		(PQISRC_MAX_OUTSTANDING_REQ / PQISRC_MAX_SUPPORTED_OP_IB_Q)
200 #define	PQISRC_MAX_OP_OB_QUEUE_ELEM_NUM		PQISRC_MAX_OUTSTANDING_REQ
201 #define	PQISRC_MIN_OP_OB_QUEUE_ELEM_NUM		2
202 #define	PQISRC_MAX_SUPPORTED_OP_OB_Q		64
203 #define PQISRC_OP_MAX_IBQ_ELEM_SIZE		8 /* 8 * 16  = 128 bytes */
204 #define PQISRC_OP_MIN_IBQ_ELEM_SIZE		2 /* 2 * 16  = 32 bytes */
205 #define PQISRC_OP_OBQ_ELEM_SIZE			1 /* 16 bytes */
206 #define PQISRC_ADMIN_IBQ_ELEM_SIZE		2 /* 2 * 16  = 32 bytes */
207 #define PQISRC_INTR_COALSC_GRAN			0
208 #define PQISRC_PROTO_BIT_MASK			0
209 #define PQISRC_SGL_SUPPORTED_BIT_MASK		0
210 
211 #define PQISRC_NUM_EVENT_Q_ELEM			32
212 #define PQISRC_EVENT_Q_ELEM_SIZE		32
213 
214 /* PQI Registers state status */
215 
216 #define PQI_RESET_ACTION_RESET			0x1
217 #define PQI_RESET_ACTION_COMPLETED		0x2
218 #define PQI_RESET_TYPE_NO_RESET			0x0
219 #define PQI_RESET_TYPE_SOFT_RESET		0x1
220 #define PQI_RESET_TYPE_FIRM_RESET		0x2
221 #define PQI_RESET_TYPE_HARD_RESET		0x3
222 
223 #define PQI_RESET_POLL_INTERVAL 		100000 /*100 msec*/
224 
225 enum pqisrc_ctrl_mode{
226 	CTRL_SIS_MODE = 0,
227 	CTRL_PQI_MODE
228 };
229 
230 /* PQI device performing internal initialization (e.g., POST). */
231 #define PQI_DEV_STATE_POWER_ON_AND_RESET	0x0
232 /* Upon entry to this state PQI device initialization begins. */
233 #define PQI_DEV_STATE_PQI_STATUS_AVAILABLE	0x1
234 /* PQI device Standard registers are available to the driver. */
235 #define PQI_DEV_STATE_ALL_REGISTERS_READY	0x2
236 /* PQI device is initialized and ready to process any PCI transactions. */
237 #define PQI_DEV_STATE_ADMIN_QUEUE_PAIR_READY	0x3
238 /* The PQI Device Error register indicates the error. */
239 #define PQI_DEV_STATE_ERROR			0x4
240 
241 #define PQI_DEV_STATE_AT_INIT			( PQI_DEV_STATE_PQI_STATUS_AVAILABLE | \
242 						  PQI_DEV_STATE_ALL_REGISTERS_READY | \
243 						  PQI_DEV_STATE_ADMIN_QUEUE_PAIR_READY )
244 
245 #define PQISRC_PQI_DEVICE_SIGNATURE		"PQI DREG"
246 #define	PQI_ADMINQ_ELEM_ARRAY_ALIGN		64
247 #define	PQI_ADMINQ_CI_PI_ALIGN			64
248 #define	PQI_OPQ_ELEM_ARRAY_ALIGN		64
249 #define	PQI_OPQ_CI_PI_ALIGN				4
250 #define	PQI_ADDR_ALIGN_MASK_64			0x3F /* lsb 6 bits */
251 #define	PQI_ADDR_ALIGN_MASK_4			0x3  /* lsb 2 bits */
252 
253 #define	PQISRC_PQIMODE_READY_TIMEOUT   		(30 * 1000 ) /* 30 secs */
254 #define	PQISRC_MODE_READY_POLL_INTERVAL		1000 /* 1 msec */
255 
256 #define PRINT_PQI_SIGNATURE(sign)		{ int i = 0; \
257 						  char si[9]; \
258 						  for(i=0;i<8;i++) \
259 							si[i] = *((char *)&(sign)+i); \
260 						  si[i] = '\0'; \
261 						  DBG_INFO("Signature is %s",si); \
262 						}
263 #define PQI_CONF_TABLE_MAX_LEN		((uint16_t)~0)
264 #define PQI_CONF_TABLE_SIGNATURE	"CFGTABLE"
265 
266 /* PQI configuration table section IDs */
267 #define PQI_CONF_TABLE_SECTION_GENERAL_INFO		0
268 #define PQI_CONF_TABLE_SECTION_FIRMWARE_FEATURES	1
269 #define PQI_CONF_TABLE_SECTION_FIRMWARE_ERRATA		2
270 #define PQI_CONF_TABLE_SECTION_DEBUG			3
271 #define PQI_CONF_TABLE_SECTION_HEARTBEAT		4
272 
273 #define CTRLR_HEARTBEAT_CNT(softs)		LE_64(PCI_MEM_GET64(softs, softs->heartbeat_counter_abs_addr, softs->heartbeat_counter_off))
274 #define	PQI_NEW_HEARTBEAT_MECHANISM(softs)	1
275 
276  /* pqi-2r00a table 36 */
277 #define PQI_ADMIN_QUEUE_MSIX_DISABLE		(0x80000000)
278 #define PQI_ADMIN_QUEUE_MSIX_ENABLE		(0 << 31)
279 
280 #define	PQI_ADMIN_QUEUE_CONF_FUNC_CREATE_Q_PAIR	0x01
281 #define	PQI_ADMIN_QUEUE_CONF_FUNC_DEL_Q_PAIR	0x02
282 #define	PQI_ADMIN_QUEUE_CONF_FUNC_STATUS_IDLE	0x00
283 #define PQISRC_ADMIN_QUEUE_CREATE_TIMEOUT	1000  /* in miLLI sec, 1 sec, 100 ms is standard */
284 #define PQISRC_ADMIN_QUEUE_DELETE_TIMEOUT	100  /* 100 ms is standard */
285 #define	PQISRC_ADMIN_CMD_RESP_TIMEOUT		3000 /* 3 sec  */
286 #define PQISRC_RAIDPATH_CMD_TIMEOUT		30000 /* 30 sec */
287 
288 #define REPORT_PQI_DEV_CAP_DATA_BUF_SIZE   	sizeof(pqi_dev_cap_t)
289 #define REPORT_MANUFACTURER_INFO_DATA_BUF_SIZE	0x80   /* Data buffer size specified in bytes 0-1 of data buffer.  128 bytes. */
290 /* PQI IUs */
291 /* Admin IU request length not including header. */
292 #define	PQI_STANDARD_IU_LENGTH			0x003C  /* 60 bytes. */
293 #define PQI_IU_TYPE_GENERAL_ADMIN_REQUEST	0x60
294 #define PQI_IU_TYPE_GENERAL_ADMIN_RESPONSE	0xe0
295 
296 /* PQI / Vendor specific IU */
297 #define	PQI_FUNCTION_REPORT_DEV_CAP				0x00
298 #define PQI_REQUEST_IU_TASK_MANAGEMENT				0x13
299 #define PQI_IU_TYPE_RAID_PATH_IO_REQUEST			0x14
300 #define PQI_IU_TYPE_AIO_PATH_IO_REQUEST				0x15
301 #define PQI_REQUEST_IU_GENERAL_ADMIN				0x60
302 #define PQI_REQUEST_IU_REPORT_VENDOR_EVENT_CONFIG		0x72
303 #define PQI_REQUEST_IU_SET_VENDOR_EVENT_CONFIG			0x73
304 #define PQI_RESPONSE_IU_GENERAL_MANAGEMENT			0x81
305 #define PQI_RESPONSE_IU_TASK_MANAGEMENT				0x93
306 #define PQI_RESPONSE_IU_GENERAL_ADMIN				0xe0
307 
308 #define PQI_RESPONSE_IU_RAID_PATH_IO_SUCCESS			0xf0
309 #define PQI_RESPONSE_IU_AIO_PATH_IO_SUCCESS			0xf1
310 #define PQI_RESPONSE_IU_RAID_PATH_IO_ERROR			0xf2
311 #define PQI_RESPONSE_IU_AIO_PATH_IO_ERROR			0xf3
312 #define PQI_RESPONSE_IU_AIO_PATH_IS_OFF				0xf4
313 #define PQI_REQUEST_IU_ACKNOWLEDGE_VENDOR_EVENT			0xf6
314 #define PQI_REQUEST_HEADER_LENGTH				4
315 #define PQI_FUNCTION_CREATE_OPERATIONAL_IQ			0x10
316 #define PQI_FUNCTION_CREATE_OPERATIONAL_OQ			0x11
317 #define PQI_FUNCTION_DELETE_OPERATIONAL_IQ			0x12
318 #define PQI_FUNCTION_DELETE_OPERATIONAL_OQ			0x13
319 #define PQI_FUNCTION_CHANGE_OPERATIONAL_IQ_PROP			0x14
320 #define PQI_CHANGE_OP_IQ_PROP_ASSIGN_AIO			1
321 
322 #define PQI_DEFAULT_IB_QUEUE					0
323 /* Interface macros */
324 
325 #define GET_FW_STATUS(softs) \
326         (PCI_MEM_GET32(softs, &softs->ioa_reg->scratchpad3_fw_status, LEGACY_SIS_OMR))
327 
328 #define SIS_IS_KERNEL_PANIC(softs) \
329 	(GET_FW_STATUS(softs) & PQI_CTRL_KERNEL_PANIC)
330 
331 #define SIS_IS_KERNEL_UP(softs) \
332 	(GET_FW_STATUS(softs) & PQI_CTRL_KERNEL_UP_AND_RUNNING)
333 
334 #define PQI_GET_CTRL_MODE(softs) \
335 	(PCI_MEM_GET32(softs, &softs->ioa_reg->scratchpad0, LEGACY_SIS_SCR0))
336 
337 #define PQI_SAVE_CTRL_MODE(softs, mode) \
338 	PCI_MEM_PUT32(softs, &softs->ioa_reg->scratchpad0, LEGACY_SIS_SCR0, mode)
339 
340 #define PQISRC_MAX_TARGETID			1024
341 #define PQISRC_MAX_TARGETLUN			64
342 
343 /* Vendor specific IU Type for Event config Cmds */
344 #define PQI_REQUEST_IU_REPORT_EVENT_CONFIG		0x72
345 #define PQI_REQUEST_IU_SET_EVENT_CONFIG			0x73
346 #define PQI_REQUEST_IU_ACKNOWLEDGE_VENDOR_EVENT		0xf6
347 #define PQI_RESPONSE_IU_GENERAL_MANAGEMENT		0x81
348 #define	PQI_MANAGEMENT_CMD_RESP_TIMEOUT			3000
349 #define	PQISRC_EVENT_ACK_RESP_TIMEOUT			1000
350 
351 
352 /* Supported Event types by controller */
353 #define PQI_NUM_SUPPORTED_EVENTS		7
354 
355 #define PQI_EVENT_TYPE_HOTPLUG			0x1
356 #define PQI_EVENT_TYPE_HARDWARE			0x2
357 #define PQI_EVENT_TYPE_PHYSICAL_DEVICE		0x4
358 #define PQI_EVENT_TYPE_LOGICAL_DEVICE		0x5
359 #define PQI_EVENT_TYPE_AIO_STATE_CHANGE		0xfd
360 #define PQI_EVENT_TYPE_AIO_CONFIG_CHANGE	0xfe
361 #define PQI_EVENT_TYPE_HEARTBEAT		0xff
362 
363 /* for indexing into the pending_events[] field of struct pqisrc_softstate */
364 #define PQI_EVENT_HEARTBEAT		0
365 #define PQI_EVENT_HOTPLUG		1
366 #define PQI_EVENT_HARDWARE		2
367 #define PQI_EVENT_PHYSICAL_DEVICE	3
368 #define PQI_EVENT_LOGICAL_DEVICE	4
369 #define PQI_EVENT_AIO_STATE_CHANGE	5
370 #define PQI_EVENT_AIO_CONFIG_CHANGE	6
371 
372 #define PQI_MAX_HEARTBEAT_REQUESTS	5
373 
374 
375 /* Device flags */
376 #define	PQISRC_DFLAG_VALID			(1 << 0)
377 #define	PQISRC_DFLAG_CONFIGURING		(1 << 1)
378 
379 #define MAX_EMBEDDED_SG_IN_FIRST_IU		4
380 #define MAX_EMBEDDED_SG_IN_IU			8
381 #define SG_FLAG_LAST				0x40000000
382 #define SG_FLAG_CHAIN				0x80000000
383 
384 #define IN_PQI_RESET(softs)			(softs->ctlr_state & PQI_BUS_RESET)
385 #define DEV_GONE(dev)				(!dev || (dev->invalid == true))
386 #define IS_AIO_PATH(dev)				(dev->aio_enabled)
387 #define IS_RAID_PATH(dev)				(!dev->aio_enabled)
388 
389 #define DEV_RESET(dvp)                          (dvp->reset_in_progress)
390 
391 /* SOP data direction flags */
392 #define SOP_DATA_DIR_NONE			0x00
393 #define SOP_DATA_DIR_FROM_DEVICE		0x01
394 #define SOP_DATA_DIR_TO_DEVICE			0x02
395 #define SOP_DATA_DIR_BIDIRECTIONAL		0x03
396 #define SOP_PARTIAL_DATA_BUFFER			0x04
397 
398 #define PQISRC_DMA_VALID			(1 << 0)
399 #define PQISRC_CMD_NO_INTR			(1 << 1)
400 
401 #define SOP_TASK_ATTRIBUTE_SIMPLE		0
402 #define SOP_TASK_ATTRIBUTE_HEAD_OF_QUEUE	1
403 #define SOP_TASK_ATTRIBUTE_ORDERED		2
404 #define SOP_TASK_ATTRIBUTE_ACA			4
405 
406 #define SOP_TASK_MANAGEMENT_FUNCTION_COMPLETE           0x0
407 #define SOP_TASK_MANAGEMENT_FUNCTION_REJECTED           0x4
408 #define SOP_TASK_MANAGEMENT_FUNCTION_FAILED		0x5
409 #define SOP_TASK_MANAGEMENT_FUNCTION_SUCCEEDED          0x8
410 #define SOP_TASK_MANAGEMENT_FUNCTION_ABORT_TASK		0x01
411 #define SOP_TASK_MANAGEMENT_FUNCTION_ABORT_TASK_SET	0x02
412 #define SOP_TASK_MANAGEMENT_LUN_RESET			0x8
413 
414 
415 /* Additional CDB bytes  */
416 #define PQI_ADDITIONAL_CDB_BYTES_0		0	/* 16 byte CDB */
417 #define PQI_ADDITIONAL_CDB_BYTES_4		1	/* 20 byte CDB */
418 #define PQI_ADDITIONAL_CDB_BYTES_8		2	/* 24 byte CDB */
419 #define PQI_ADDITIONAL_CDB_BYTES_12		3	/* 28 byte CDB */
420 #define PQI_ADDITIONAL_CDB_BYTES_16		4	/* 32 byte CDB */
421 
422 #define PQI_PROTOCOL_SOP			0x0
423 
424 #define PQI_AIO_STATUS_GOOD			0x0
425 #define PQI_AIO_STATUS_CHECK_CONDITION		0x2
426 #define PQI_AIO_STATUS_CONDITION_MET		0x4
427 #define PQI_AIO_STATUS_DEVICE_BUSY		0x8
428 #define PQI_AIO_STATUS_INT_GOOD			0x10
429 #define PQI_AIO_STATUS_INT_COND_MET		0x14
430 #define PQI_AIO_STATUS_RESERV_CONFLICT		0x18
431 #define PQI_AIO_STATUS_CMD_TERMINATED		0x22
432 #define PQI_AIO_STATUS_QUEUE_FULL		0x28
433 #define PQI_AIO_STATUS_TASK_ABORTED		0x40
434 #define PQI_AIO_STATUS_UNDERRUN			0x51
435 #define PQI_AIO_STATUS_OVERRUN			0x75
436 /* Status when Target Failure */
437 #define PQI_AIO_STATUS_IO_ERROR			0x1
438 #define PQI_AIO_STATUS_IO_ABORTED		0x2
439 #define PQI_AIO_STATUS_IO_NO_DEVICE		0x3
440 #define PQI_AIO_STATUS_INVALID_DEVICE		0x4
441 #define PQI_AIO_STATUS_AIO_PATH_DISABLED	0xe
442 
443 /* Service Response */
444 #define PQI_AIO_SERV_RESPONSE_COMPLETE			0
445 #define PQI_AIO_SERV_RESPONSE_FAILURE			1
446 #define PQI_AIO_SERV_RESPONSE_TMF_COMPLETE		2
447 #define PQI_AIO_SERV_RESPONSE_TMF_SUCCEEDED		3
448 #define PQI_AIO_SERV_RESPONSE_TMF_REJECTED		4
449 #define PQI_AIO_SERV_RESPONSE_TMF_INCORRECT_LUN		5
450 
451 #define PQI_TMF_WAIT_DELAY				10000000	/* 10 seconds */
452 
453 #define PQI_RAID_STATUS_GOOD				PQI_AIO_STATUS_GOOD
454 #define PQI_RAID_STATUS_CHECK_CONDITION			PQI_AIO_STATUS_CHECK_CONDITION
455 #define PQI_RAID_STATUS_CONDITION_MET			PQI_AIO_STATUS_CONDITION_MET
456 #define PQI_RAID_STATUS_DEVICE_BUSY			PQI_AIO_STATUS_DEVICE_BUSY
457 #define PQI_RAID_STATUS_INT_GOOD			PQI_AIO_STATUS_INT_GOOD
458 #define PQI_RAID_STATUS_INT_COND_MET			PQI_AIO_STATUS_INT_COND_MET
459 #define PQI_RAID_STATUS_RESERV_CONFLICT			PQI_AIO_STATUS_RESERV_CONFLICT
460 #define PQI_RAID_STATUS_CMD_TERMINATED			PQI_AIO_STATUS_CMD_TERMINATED
461 #define PQI_RAID_STATUS_QUEUE_FULL			PQI_AIO_STATUS_QUEUE_FULL
462 #define PQI_RAID_STATUS_TASK_ABORTED			PQI_AIO_STATUS_TASK_ABORTED
463 #define PQI_RAID_STATUS_UNDERRUN			PQI_AIO_STATUS_UNDERRUN
464 #define PQI_RAID_STATUS_OVERRUN				PQI_AIO_STATUS_OVERRUN
465 
466 /* VPD inquiry pages */
467 #define SCSI_VPD_SUPPORTED_PAGES	0x0	/* standard page */
468 #define SCSI_VPD_DEVICE_ID		0x83	/* standard page */
469 #define SA_VPD_PHYS_DEVICE_ID		0xc0	/* vendor-specific page */
470 #define SA_VPD_LV_DEVICE_GEOMETRY	0xc1	/* vendor-specific page */
471 #define SA_VPD_LV_IOACCEL_STATUS	0xc2	/* vendor-specific page */
472 #define SA_VPD_LV_STATUS		0xc3	/* vendor-specific page */
473 
474 #define VPD_PAGE			(1 << 8)
475 
476 
477 /* logical volume states */
478 #define SA_LV_OK					0x0
479 #define SA_LV_NOT_AVAILABLE				0xb
480 #define SA_LV_UNDERGOING_ERASE				0xf
481 #define SA_LV_UNDERGOING_RPI				0x12
482 #define SA_LV_PENDING_RPI				0x13
483 #define SA_LV_ENCRYPTED_NO_KEY				0x14
484 #define SA_LV_PLAINTEXT_IN_ENCRYPT_ONLY_CONTROLLER	0x15
485 #define SA_LV_UNDERGOING_ENCRYPTION			0x16
486 #define SA_LV_UNDERGOING_ENCRYPTION_REKEYING		0x17
487 #define SA_LV_ENCRYPTED_IN_NON_ENCRYPTED_CONTROLLER	0x18
488 #define SA_LV_PENDING_ENCRYPTION			0x19
489 #define SA_LV_PENDING_ENCRYPTION_REKEYING		0x1a
490 #define SA_LV_STATUS_VPD_UNSUPPORTED			0xff
491 
492 /*
493  * assume worst case: SATA queue depth of 31 minus 4 internal firmware commands
494  */
495 #define PQI_PHYSICAL_DISK_DEFAULT_MAX_QUEUE_DEPTH	27
496 
497 /* 0 = no limit */
498 #define PQI_LOGICAL_DISK_DEFAULT_MAX_QUEUE_DEPTH	0
499 
500 
501 
502 #define RAID_CTLR_LUNID		"\0\0\0\0\0\0\0\0"
503 
504 #define SA_CACHE_FLUSH		0x1
505 #define SA_INQUIRY		0x12
506 #define SA_REPORT_LOG		0xc2	/* Report Logical LUNs */
507 #define SA_REPORT_PHYS		0xc3	/* Report Physical LUNs */
508 #define SA_CISS_READ		0xc0
509 #define SA_GET_RAID_MAP		0xc8
510 
511 #define SA_REPORT_LOG_EXTENDED		0x1
512 #define SA_REPORT_PHYS_EXTENDED		0x2
513 
514 #define SA_CACHE_FLUSH_BUF_LEN		4
515 
516 #define REPORT_LUN_DEV_FLAG_AIO_ENABLED 		0x8
517 #define PQI_MAX_TRANSFER_SIZE				(4 * 1024U * 1024U)
518 #define RAID_MAP_MAX_ENTRIES				1024
519 #define RAID_MAP_ENCRYPTION_ENABLED			0x1
520 #define PQI_PHYSICAL_DISK_DEFAULT_MAX_QUEUE_DEPTH	27
521 
522 #define ASC_LUN_NOT_READY				0x4
523 #define ASCQ_LUN_NOT_READY_FORMAT_IN_PROGRESS		0x4
524 #define ASCQ_LUN_NOT_READY_INITIALIZING_CMD_REQ		0x2
525 
526 
527 #define OBDR_SIG_OFFSET		43
528 #define OBDR_TAPE_SIG		"$DR-10"
529 #define OBDR_SIG_LEN		(sizeof(OBDR_TAPE_SIG) - 1)
530 #define OBDR_TAPE_INQ_SIZE	(OBDR_SIG_OFFSET + OBDR_SIG_LEN)
531 
532 
533 #define IOACCEL_STATUS_BYTE	4
534 #define OFFLOAD_CONFIGURED_BIT	0x1
535 #define OFFLOAD_ENABLED_BIT	0x2
536 
537 #define PQI_RAID_DATA_IN_OUT_GOOD		0x0
538 #define PQI_RAID_DATA_IN_OUT_UNDERFLOW		0x1
539 #define PQI_RAID_DATA_IN_OUT_UNSOLICITED_ABORT	0xf3
540 #define PQI_RAID_DATA_IN_OUT_ABORTED		0xf4
541 
542 #define PQI_PHYSICAL_DEVICE_BUS		0
543 #define PQI_RAID_VOLUME_BUS		1
544 #define PQI_HBA_BUS			2
545 #define PQI_EXTERNAL_RAID_VOLUME_BUS	3
546 #define PQI_MAX_BUS			PQI_EXTERNAL_RAID_VOLUME_BUS
547 
548 #define TEST_UNIT_READY		0x00
549 #define SCSI_VPD_HEADER_LENGTH	64
550 
551 
552 #define PQI_MAX_MULTILUN	256
553 #define PQI_MAX_LOGICALS	64
554 #define PQI_MAX_PHYSICALS	1024
555 #define	PQI_MAX_DEVICES		(PQI_MAX_LOGICALS + PQI_MAX_PHYSICALS + 1) /* 1 for controller device entry */
556 #define PQI_MAX_EXT_TARGETS	32
557 
558 #define PQI_CTLR_INDEX		(PQI_MAX_DEVICES - 1)
559 #define PQI_PD_INDEX(t)		(t + PQI_MAX_LOGICALS)
560 
561 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
562 #define MAX_TARGET_DEVICES 1024
563 
564 #define PQI_NO_MEM	2
565 
566 typedef enum pqisrc_device_status {
567 	DEVICE_NOT_FOUND,
568 	DEVICE_CHANGED,
569 	DEVICE_UNCHANGED,
570 } device_status_t;
571 
572 #define SA_RAID_0			0
573 #define SA_RAID_4			1
574 #define SA_RAID_1			2	/* also used for RAID 10 */
575 #define SA_RAID_5			3	/* also used for RAID 50 */
576 #define SA_RAID_51			4
577 #define SA_RAID_6			5	/* also used for RAID 60 */
578 #define SA_RAID_ADM			6	/* also used for RAID 1+0 ADM */
579 #define SA_RAID_MAX			SA_RAID_ADM
580 #define SA_RAID_UNKNOWN			0xff
581 
582 /* BMIC commands */
583 #define BMIC_IDENTIFY_CONTROLLER		0x11
584 #define BMIC_IDENTIFY_PHYSICAL_DEVICE		0x15
585 #define BMIC_READ				0x26
586 #define BMIC_WRITE				0x27
587 #define BMIC_SENSE_CONTROLLER_PARAMETERS	0x64
588 #define BMIC_SENSE_SUBSYSTEM_INFORMATION	0x66
589 #define BMIC_CACHE_FLUSH			0xc2
590 #define BMIC_FLASH_FIRMWARE			0xf7
591 #define BMIC_WRITE_HOST_WELLNESS		0xa5
592 
593 
594 #define MASKED_DEVICE(lunid)			((lunid)[3] & 0xC0)
595 #define BMIC_GET_LEVEL_2_BUS(lunid)		((lunid)[7] & 0x3F)
596 #define BMIC_GET_LEVEL_TWO_TARGET(lunid)	((lunid)[6])
597 #define BMIC_GET_DRIVE_NUMBER(lunid)		\
598 	(((BMIC_GET_LEVEL_2_BUS((lunid)) - 1) << 8) +	\
599 	BMIC_GET_LEVEL_TWO_TARGET((lunid)))
600 #define NON_DISK_PHYS_DEV(rle)			\
601 	(((reportlun_ext_entry_t *)(rle))->device_flags & 0x1)
602 
603 #define NO_TIMEOUT		((unsigned long) -1)
604 
605 #define BMIC_DEVICE_TYPE_SATA	0x1
606 
607 /* No of IO slots required for internal requests */
608 #define PQI_RESERVED_IO_SLOTS_SYNC_REQUESTS	3
609 #define PQI_RESERVED_IO_SLOTS_TMF		1
610 #define PQI_RESERVED_IO_SLOTS_CNT		(PQI_NUM_SUPPORTED_EVENTS + \
611 						PQI_RESERVED_IO_SLOTS_TMF + \
612 						PQI_RESERVED_IO_SLOTS_SYNC_REQUESTS)
613 
614 static inline uint16_t GET_LE16(const uint8_t *p)
615 {
616 	return p[0] | p[1] << 8;
617 }
618 
619 static inline uint32_t GET_LE32(const uint8_t *p)
620 {
621 	return p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24;
622 }
623 
624 static inline uint64_t GET_LE64(const uint8_t *p)
625 {
626 	return (((uint64_t)GET_LE32(p + 4) << 32) |
627 		GET_LE32(p));
628 }
629 
630 static inline uint16_t GET_BE16(const uint8_t *p)
631 {
632         return p[0] << 8 | p[1];
633 }
634 
635 static inline uint32_t GET_BE32(const uint8_t *p)
636 {
637         return p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];
638 }
639 
640 static inline uint64_t GET_BE64(const uint8_t *p)
641 {
642         return (((uint64_t)GET_BE32(p) << 32) |
643                GET_BE32(p + 4));
644 }
645 
646 static inline void PUT_BE16(uint16_t val, uint8_t *p)
647 {
648         *p++ = val >> 8;
649         *p++ = val;
650 }
651 
652 static inline void PUT_BE32(uint32_t val, uint8_t *p)
653 {
654         PUT_BE16(val >> 16, p);
655         PUT_BE16(val, p + 2);
656 }
657 
658 static inline void PUT_BE64(uint64_t val, uint8_t *p)
659 {
660         PUT_BE32(val >> 32, p);
661         PUT_BE32(val, p + 4);
662 }
663 
664 
665 #define OS_FREEBSD
666 #define SIS_POLL_WAIT
667 
668 #define OS_ATTRIBUTE_PACKED         __attribute__((__packed__))
669 #define OS_ATTRIBUTE_ALIGNED(n)     __attribute__((aligned(n)))
670 
671 
672 /* Management Interface */
673 #define CCISS_IOC_MAGIC		'C'
674 #define SMARTPQI_IOCTL_BASE     'M'
675 #define CCISS_GETDRIVVER       _IOWR(SMARTPQI_IOCTL_BASE, 0, driver_info)
676 #define CCISS_GETPCIINFO       _IOWR(SMARTPQI_IOCTL_BASE, 1, pqi_pci_info_t)
677 #define SMARTPQI_PASS_THRU     _IOWR(SMARTPQI_IOCTL_BASE, 2, IOCTL_Command_struct)
678 #define CCISS_PASSTHRU         _IOWR('C', 210, IOCTL_Command_struct)
679 #define CCISS_REGNEWD          _IO(CCISS_IOC_MAGIC, 14)
680 
681 /*IOCTL  pci_info structure */
682 typedef struct pqi_pci_info
683 {
684        unsigned char   bus;
685        unsigned char   dev_fn;
686        unsigned short  domain;
687        uint32_t        board_id;
688        uint32_t        chip_id;
689 }pqi_pci_info_t;
690 
691 typedef struct _driver_info
692 {
693 	unsigned char 	major_version;
694 	unsigned char 	minor_version;
695 	unsigned char 	release_version;
696 	unsigned long 	build_revision;
697 	unsigned long 	max_targets;
698 	unsigned long 	max_io;
699 	unsigned long 	max_transfer_length;
700 }driver_info, *pdriver_info;
701 
702 typedef uint8_t *passthru_buf_type_t;
703 
704 
705 #define PQISRC_DRIVER_MAJOR		1
706 #define PQISRC_DRIVER_MINOR		0
707 #define PQISRC_DRIVER_RELEASE		3
708 #define PQISRC_DRIVER_REVISION		239
709 
710 #define STR(s)                          # s
711 #define PQISRC_VERSION(a, b, c, d)      STR(a.b.c-d)
712 #define PQISRC_DRIVER_VERSION           PQISRC_VERSION(PQISRC_DRIVER_MAJOR, \
713                                         PQISRC_DRIVER_MINOR, \
714                                         PQISRC_DRIVER_RELEASE, \
715                                         PQISRC_DRIVER_REVISION)
716 
717 /* End Management interface */
718 
719 #ifdef ASSERT
720 #undef ASSERT
721 #endif
722 
723 #define ASSERT(cond) {\
724         	if (!(cond)) { \
725 			printf("Assertion failed at file %s line %d\n",__FILE__,__LINE__);	\
726 		}	\
727 		}
728 
729 
730 #define PQI_MAX_MSIX            64      /* vectors */
731 #define PQI_MSI_CTX_SIZE        sizeof(pqi_intr_ctx)+1
732 #define IS_POLLING_REQUIRED(softs)	if (cold) {\
733 					pqisrc_process_event_intr_src(softs, 0);\
734 					pqisrc_process_response_queue(softs, 1);\
735 				}
736 
737 #define OS_GET_TASK_ATTR(rcb)		os_get_task_attr(rcb)
738 #define OS_FW_HEARTBEAT_TIMER_INTERVAL (5)
739 
740 typedef struct PCI_ACC_HANDLE {
741         bus_space_tag_t         pqi_btag;
742         bus_space_handle_t      pqi_bhandle;
743 } PCI_ACC_HANDLE_T;
744 
745 /*
746  * Legacy SIS Register definitions for the Adaptec PMC SRC/SRCv/smartraid adapters.
747  */
748 /* accessible via BAR0 */
749 #define LEGACY_SIS_IOAR		0x18	/* IOA->host interrupt register */
750 #define LEGACY_SIS_IDBR		0x20	/* inbound doorbell register */
751 #define LEGACY_SIS_IISR		0x24	/* inbound interrupt status register */
752 #define LEGACY_SIS_OIMR		0x34	/* outbound interrupt mask register */
753 #define LEGACY_SIS_ODBR_R	0x9c	/* outbound doorbell register read */
754 #define LEGACY_SIS_ODBR_C	0xa0	/* outbound doorbell register clear */
755 
756 #define LEGACY_SIS_SCR0		0xb0	/* scratchpad 0 */
757 #define LEGACY_SIS_OMR		0xbc	/* outbound message register */
758 #define LEGACY_SIS_IQUE64_L	0xc0	/* inbound queue address 64-bit (low) */
759 #define LEGACY_SIS_IQUE64_H	0xc4	/* inbound queue address 64-bit (high)*/
760 #define LEGACY_SIS_ODBR_MSI	0xc8	/* MSI register for sync./AIF */
761 #define LEGACY_SIS_IQN_L	0xd0	/* inbound queue native mode (low) */
762 #define LEGACY_SIS_IQN_H	0xd4	/* inbound queue native mode (high)*/
763 #define LEGACY_SIS_MAILBOX	0x7fc60	/* mailbox (20 bytes) */
764 #define LEGACY_SIS_SRCV_MAILBOX	0x1000	/* mailbox (20 bytes) */
765 
766 #define LEGACY_SIS_ODR_SHIFT 	12	/* outbound doorbell shift */
767 #define LEGACY_SIS_IDR_SHIFT 	9	/* inbound doorbell shift */
768 
769 
770 /*
771  * PQI Register definitions for the smartraid adapters
772  */
773 /* accessible via BAR0 */
774 #define PQI_SIGNATURE                  0x4000
775 #define PQI_ADMINQ_CONFIG              0x4008
776 #define PQI_ADMINQ_CAP                 0x4010
777 #define PQI_LEGACY_INTR_STATUS         0x4018
778 #define PQI_LEGACY_INTR_MASK_SET       0x401C
779 #define PQI_LEGACY_INTR_MASK_CLR       0x4020
780 #define PQI_DEV_STATUS                 0x4040
781 #define PQI_ADMIN_IBQ_PI_OFFSET        0x4048
782 #define PQI_ADMIN_OBQ_CI_OFFSET        0x4050
783 #define PQI_ADMIN_IBQ_ELEM_ARRAY_ADDR  0x4058
784 #define PQI_ADMIN_OBQ_ELEM_ARRAY_ADDR  0x4060
785 #define PQI_ADMIN_IBQ_CI_ADDR          0x4068
786 #define PQI_ADMIN_OBQ_PI_ADDR          0x4070
787 #define PQI_ADMINQ_PARAM               0x4078
788 #define PQI_DEV_ERR                    0x4080
789 #define PQI_DEV_ERR_DETAILS            0x4088
790 #define PQI_DEV_RESET                  0x4090
791 #define PQI_POWER_ACTION               0x4094
792 
793 /* Busy wait micro seconds */
794 #define OS_BUSYWAIT(x) DELAY(x)
795 #define OS_SLEEP(timeout)	\
796 	DELAY(timeout);
797 
798 #define OS_HOST_WELLNESS_TIMEOUT	(24 * 3600)
799 
800 
801 #define LE_16(x) htole16(x)
802 #define LE_32(x) htole32(x)
803 #define LE_64(x) htole64(x)
804 #define BE_16(x) htobe16(x)
805 #define BE_32(x) htobe32(x)
806 #define BE_64(x) htobe64(x)
807 
808 #define PQI_HWIF_SRCV           0
809 #define PQI_HWIF_UNKNOWN        -1
810 
811 
812 #define SMART_STATE_SUSPEND     	(1<<0)
813 #define SMART_STATE_UNUSED0     	(1<<1)
814 #define SMART_STATE_INTERRUPTS_ON       (1<<2)
815 #define SMART_STATE_AIF_SLEEPER 	(1<<3)
816 #define SMART_STATE_RESET               (1<<4)
817 
818 #define PQI_FLAG_BUSY 			(1<<0)
819 #define PQI_MSI_ENABLED 		(1<<1)
820 #define PQI_SIM_REGISTERED 		(1<<2)
821 #define PQI_MTX_INIT	 		(1<<3)
822 
823 
824 #define PQI_CMD_MAPPED 			(1<<2)
825 
826 /* Interrupt context to get oq_id */
827 typedef struct pqi_intr_ctx {
828         int 	 oq_id;
829         device_t pqi_dev;
830 }pqi_intr_ctx_t;
831 
832 typedef uint8_t os_dev_info_t;
833 
834 typedef struct OS_SPECIFIC {
835 	device_t                pqi_dev;
836 	struct resource		*pqi_regs_res0; /* reg. if. window */
837 	int			pqi_regs_rid0;		/* resource ID */
838 	bus_dma_tag_t		pqi_parent_dmat;	/* parent DMA tag */
839 	bus_dma_tag_t           pqi_buffer_dmat;
840 
841 	/* controller hardware interface */
842 	int			pqi_hwif;
843 	struct resource         *pqi_irq[PQI_MAX_MSIX];  /* interrupt */
844 	int                     pqi_irq_rid[PQI_MAX_MSIX];
845 	void                    *intrcookie[PQI_MAX_MSIX];
846 	bool                    intr_registered[PQI_MAX_MSIX];
847 	bool			msi_enabled;            /* MSI/MSI-X enabled */
848 	pqi_intr_ctx_t		*msi_ctx;
849 	int			oq_id;
850 	int			pqi_state;
851 	uint32_t		pqi_flags;
852 	struct mtx              cam_lock;
853 	struct mtx              map_lock;
854 	int                     mtx_init;
855 	int                     sim_registered;
856 	struct cam_devq         *devq;
857 	struct cam_sim          *sim;
858 	struct cam_path         *path;
859 	struct task		event_task;
860 	struct cdev             *cdev;
861 	struct callout_handle   wellness_periodic;	/* periodic event handling */
862 	struct callout_handle   heartbeat_timeout_id;	/* heart beat event handling */
863 	eventhandler_tag        eh;
864 } OS_SPECIFIC_T;
865 
866 typedef bus_addr_t dma_addr_t;
867 
868 /* Atomic */
869 typedef volatile uint64_t OS_ATOMIC64_T;
870 #define OS_ATOMIC64_SET(_softs, target, val)	atomic_set_long(&(_softs)->target, val)
871 #define OS_ATOMIC64_READ(_softs, target)	atomic_load_acq_64(&(_softs)->target)
872 #define OS_ATOMIC64_INC(_softs, target)		atomic_add_64(&(_softs)->target, 1)
873 
874 /* Register access macros */
875 #define PCI_MEM_GET32( _softs, _absaddr, _offset ) \
876     bus_space_read_4(_softs->pci_mem_handle.pqi_btag, \
877         _softs->pci_mem_handle.pqi_bhandle, _offset)
878 
879 #define PCI_MEM_GET64( _softs, _absaddr, _offset ) \
880     bus_space_read_8(_softs->pci_mem_handle.pqi_btag, \
881         _softs->pci_mem_handle.pqi_bhandle, _offset)
882 
883 #define PCI_MEM_PUT32( _softs, _absaddr, _offset, _val ) \
884     bus_space_write_4(_softs->pci_mem_handle.pqi_btag, \
885         _softs->pci_mem_handle.pqi_bhandle, _offset, _val)
886 
887 #define PCI_MEM_PUT64( _softs, _absaddr, _offset, _val ) \
888     bus_space_write_8(_softs->pci_mem_handle.pqi_btag, \
889         _softs->pci_mem_handle.pqi_bhandle, _offset, _val)
890 
891 #define PCI_MEM_GET_BUF(_softs, _absaddr, _offset, buf, size) \
892 	bus_space_read_region_1(_softs->pci_mem_handle.pqi_btag,\
893 	_softs->pci_mem_handle.pqi_bhandle, _offset, buf, size)
894 
895 /* Lock */
896 typedef struct mtx OS_LOCK_T;
897 typedef struct sema OS_SEMA_LOCK_T;
898 
899 #define	OS_PQILOCK_T OS_LOCK_T
900 
901 #define OS_ACQUIRE_SPINLOCK(_lock) mtx_lock_spin(_lock)
902 #define OS_RELEASE_SPINLOCK(_lock) mtx_unlock_spin(_lock)
903 
904 #define OS_INIT_PQILOCK(_softs,_lock,_lockname) os_init_spinlock(_softs,_lock,_lockname)
905 #define OS_UNINIT_PQILOCK(_lock) os_uninit_spinlock(_lock)
906 
907 #define PQI_LOCK(_lock) OS_ACQUIRE_SPINLOCK(_lock)
908 #define PQI_UNLOCK(_lock) OS_RELEASE_SPINLOCK(_lock)
909 
910 #define OS_GET_CDBP(rcb)	((rcb->cm_ccb->ccb_h.flags & CAM_CDB_POINTER) ? rcb->cm_ccb->csio.cdb_io.cdb_ptr : rcb->cm_ccb->csio.cdb_io.cdb_bytes)
911 #define GET_SCSI_BUFFLEN(rcb)	(rcb->cm_ccb->csio.dxfer_len)
912 
913 #define OS_GET_IO_QINDEX(softs,rcb)	curcpu % softs->num_op_obq
914 #define OS_GET_IO_RESP_QID(softs,rcb)	(softs->op_ob_q[(OS_GET_IO_QINDEX(softs,rcb))].q_id)
915 #define OS_GET_IO_REQ_QINDEX(softs,rcb)	OS_GET_IO_QINDEX(softs,rcb)
916 #define OS_GET_TMF_RESP_QID		OS_GET_IO_RESP_QID
917 #define OS_GET_TMF_REQ_QINDEX		OS_GET_IO_REQ_QINDEX
918 
919 /* check request type */
920 #define is_internal_req(rcb)	(!(rcb)->cm_ccb)
921 
922 /* sg elements addr, len, flags */
923 #define OS_GET_IO_SG_COUNT(rcb)		rcb->nseg
924 #define OS_GET_IO_SG_ADDR(rcb,i)	rcb->sgt[i].addr
925 #define OS_GET_IO_SG_LEN(rcb,i)		rcb->sgt[i].len
926 
927 /* scsi commands used in pqilib for RAID bypass*/
928 #define SCMD_READ_6	READ_6
929 #define SCMD_WRITE_6	WRITE_6
930 #define SCMD_READ_10	READ_10
931 #define SCMD_WRITE_10	WRITE_10
932 #define SCMD_READ_12	READ_12
933 #define SCMD_WRITE_12	WRITE_12
934 #define SCMD_READ_16	READ_16
935 #define SCMD_WRITE_16	WRITE_16
936 
937 /* Debug facility */
938 
939 #define PQISRC_LOG_LEVEL  0x60
940 
941 static int logging_level  = PQISRC_LOG_LEVEL;
942 
943 #define	PQISRC_FLAGS_MASK		0x0000ffff
944 #define	PQISRC_FLAGS_INIT 		0x00000001
945 #define	PQISRC_FLAGS_INFO 		0x00000002
946 #define	PQISRC_FLAGS_FUNC		0x00000004
947 #define	PQISRC_FLAGS_TRACEIO		0x00000008
948 #define	PQISRC_FLAGS_DISC		0x00000010
949 #define	PQISRC_FLAGS_WARN		0x00000020
950 #define	PQISRC_FLAGS_ERROR		0x00000040
951 
952 
953 #define	DBG_INIT(fmt,args...)						\
954 		do {							\
955 			if (logging_level & PQISRC_FLAGS_INIT) { 	\
956 				printf("[INIT]:[ %s ] [ %d ]"fmt,__func__,__LINE__,##args);			\
957 			}						\
958 		}while(0);
959 
960 #define	DBG_INFO(fmt,args...)						\
961 		do {							\
962 			if (logging_level & PQISRC_FLAGS_INFO) { 	\
963 				printf("[INFO]:[ %s ] [ %d ]"fmt,__func__,__LINE__,##args);			\
964 			}						\
965 		}while(0);
966 
967 #define	DBG_FUNC(fmt,args...)						\
968 		do {							\
969 			if (logging_level & PQISRC_FLAGS_FUNC) { 	\
970 				printf("[FUNC]:[ %s ] [ %d ]"fmt,__func__,__LINE__,##args);			\
971 			}						\
972 		}while(0);
973 
974 #define	DBG_TRACEIO(fmt,args...)					\
975 		do {							\
976 			if (logging_level & PQISRC_FLAGS_TRACEIO) { 	\
977 				printf("[TRACEIO]:[ %s ] [ %d ]"fmt,__func__,__LINE__,##args);			\
978 			}						\
979 		}while(0);
980 
981 #define	DBG_DISC(fmt,args...)						\
982 		do {							\
983 			if (logging_level & PQISRC_FLAGS_DISC) { 	\
984 				printf("[DISC]:[ %s ] [ %d ]"fmt,__func__,__LINE__,##args);			\
985 			}						\
986 		}while(0);
987 
988 #define	DBG_WARN(fmt,args...)						\
989 		do {							\
990 			if (logging_level & PQISRC_FLAGS_WARN) { 	\
991 				printf("[WARN]:[%u:%u.%u][CPU %d][%s][%d]:"fmt,softs->bus_id,softs->device_id,softs->func_id,curcpu,__func__,__LINE__,##args);\
992 			}						\
993 		}while(0);
994 
995 #define	DBG_ERR(fmt,args...)						\
996 		do {							\
997 			if (logging_level & PQISRC_FLAGS_ERROR) { 	\
998 				printf("[ERROR]::[%u:%u.%u][CPU %d][%s][%d]:"fmt,softs->bus_id,softs->device_id,softs->func_id,curcpu,__func__,__LINE__,##args); \
999 			}						\
1000 		}while(0);
1001 #define	DBG_IO(fmt,args...)						\
1002 		do {							\
1003 			if (logging_level & PQISRC_FLAGS_TRACEIO) { 	\
1004 				printf("[IO]:[ %s ] [ %d ]"fmt,__func__,__LINE__,##args);			\
1005 			}						\
1006 		}while(0);
1007 
1008 #define	DBG_ERR_BTL(device,fmt,args...)						\
1009 		do {							\
1010 			if (logging_level & PQISRC_FLAGS_ERROR) { 	\
1011 				printf("[ERROR]::[%u:%u.%u][%u,%u,%u][CPU %d][%s][%d]:"fmt, softs->bus_id, softs->device_id, softs->func_id, device->bus, device->target, device->lun,curcpu,__func__,__LINE__,##args); \
1012 			}						\
1013 		}while(0);
1014 
1015 #define	DBG_WARN_BTL(device,fmt,args...)						\
1016 		do {							\
1017 			if (logging_level & PQISRC_FLAGS_WARN) { 	\
1018 				printf("[WARN]:[%u:%u.%u][%u,%u,%u][CPU %d][%s][%d]:"fmt, softs->bus_id, softs->device_id, softs->func_id, device->bus, device->target, device->lun,curcpu,__func__,__LINE__,##args);\
1019 			}						\
1020 		}while(0);
1021 
1022 #endif // _PQI_DEFINES_H
1023