xref: /illumos-gate/usr/src/uts/common/io/aac/aac.h (revision 27954b0d964ffcb749cf19296906e7fecdf3da1b)
1 /*
2  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
3  */
4 
5 /*
6  * Copyright 2005-06 Adaptec, Inc.
7  * Copyright (c) 2005-06 Adaptec Inc., Achim Leubner
8  * Copyright (c) 2000 Michael Smith
9  * Copyright (c) 2001 Scott Long
10  * Copyright (c) 2000 BSDi
11  * All rights reserved.
12  *
13  * Redistribution and use in source and binary forms, with or without
14  * modification, are permitted provided that the following conditions
15  * are met:
16  * 1. Redistributions of source code must retain the above copyright
17  *    notice, this list of conditions and the following disclaimer.
18  * 2. Redistributions in binary form must reproduce the above copyright
19  *    notice, this list of conditions and the following disclaimer in the
20  *    documentation and/or other materials provided with the distribution.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  *
34  *    $FreeBSD: src/sys/dev/aac/aacvar.h,v 1.47 2005/10/08 15:55:09 scottl Exp $
35  */
36 
37 #ifndef	_AAC_H_
38 #define	_AAC_H_
39 
40 #ifdef	__cplusplus
41 extern "C" {
42 #endif
43 
44 #define	AAC_ROUNDUP(x, y)		(((x) + (y) - 1) / (y) * (y))
45 
46 #define	AAC_TYPE_DEVO			1
47 #define	AAC_TYPE_ALPHA			2
48 #define	AAC_TYPE_BETA			3
49 #define	AAC_TYPE_RELEASE		4
50 
51 #ifndef	AAC_DRIVER_BUILD
52 #define	AAC_DRIVER_BUILD		1
53 #endif
54 
55 #define	AAC_DRIVER_MAJOR_VERSION	2
56 #define	AAC_DRIVER_MINOR_VERSION	2
57 #define	AAC_DRIVER_BUGFIX_LEVEL		11
58 #define	AAC_DRIVER_TYPE			AAC_TYPE_RELEASE
59 
60 #define	STR(s)				# s
61 #define	AAC_VERSION(a, b, c)		STR(a.b.c)
62 #define	AAC_DRIVER_VERSION		AAC_VERSION(AAC_DRIVER_MAJOR_VERSION, \
63 					AAC_DRIVER_MINOR_VERSION, \
64 					AAC_DRIVER_BUGFIX_LEVEL)
65 
66 #define	AACOK				0
67 #define	AACERR				-1
68 
69 #define	AAC_MAX_ADAPTERS		64
70 
71 /* Definitions for mode sense */
72 #ifndef	SD_MODE_SENSE_PAGE3_CODE
73 #define	SD_MODE_SENSE_PAGE3_CODE	0x03
74 #endif
75 
76 #ifndef	SD_MODE_SENSE_PAGE4_CODE
77 #define	SD_MODE_SENSE_PAGE4_CODE	0x04
78 #endif
79 
80 #ifndef	SCMD_SYNCHRONIZE_CACHE
81 #define	SCMD_SYNCHRONIZE_CACHE		0x35
82 #endif
83 
84 /*
85  * The controller reports status events in AIFs. We hang on to a number of
86  * these in order to pass them out to user-space management tools.
87  */
88 #define	AAC_AIFQ_LENGTH			64
89 
90 #ifdef __x86
91 #define	AAC_IMMEDIATE_TIMEOUT		30	/* seconds */
92 #else
93 #define	AAC_IMMEDIATE_TIMEOUT		60	/* seconds */
94 #endif
95 #define	AAC_FWUP_TIMEOUT		180	/* wait up to 3 minutes */
96 #define	AAC_IOCTL_TIMEOUT		900	/* wait up to 15 minutes */
97 #define	AAC_SYNC_TIMEOUT		900	/* wait up to 15 minutes */
98 
99 /* Adapter hardware interface types */
100 #define	AAC_HWIF_UNKNOWN		0
101 #define	AAC_HWIF_I960RX			1
102 #define	AAC_HWIF_RKT			2
103 
104 #define	AAC_TYPE_UNKNOWN		0
105 #define	AAC_TYPE_SCSI			1
106 #define	AAC_TYPE_SATA			2
107 #define	AAC_TYPE_SAS			3
108 
109 #define	AAC_LS32(d)			((uint32_t)((d) & 0xffffffffull))
110 #define	AAC_MS32(d)			((uint32_t)((d) >> 32))
111 #define	AAC_LO32(p64)			((uint32_t *)(p64))
112 #define	AAC_HI32(p64)			((uint32_t *)(p64) + 1)
113 
114 /*
115  * Internal events that will be handled serially by aac_event_thread()
116  */
117 #define	AAC_EVENT_AIF			(1 << 0)
118 #define	AAC_EVENT_TIMEOUT		(1 << 1)
119 #define	AAC_EVENT_SYNCTICK		(1 << 2)
120 
121 /*
122  * AAC_CMDQ_SYNC should be 0 and AAC_CMDQ_ASYNC be 1 for Sync FIB io
123  * to be served before async FIB io, see aac_start_waiting_io().
124  * So that io requests sent by interactive userland commands get
125  * responded asap.
126  */
127 enum aac_cmdq {
128 	AAC_CMDQ_SYNC,	/* sync FIB queue */
129 	AAC_CMDQ_ASYNC,	/* async FIB queue */
130 	AAC_CMDQ_NUM
131 };
132 
133 /*
134  * IO command flags
135  */
136 #define	AAC_IOCMD_SYNC		(1 << AAC_CMDQ_SYNC)
137 #define	AAC_IOCMD_ASYNC		(1 << AAC_CMDQ_ASYNC)
138 #define	AAC_IOCMD_OUTSTANDING	(1 << AAC_CMDQ_NUM)
139 #define	AAC_IOCMD_ALL		(AAC_IOCMD_SYNC | AAC_IOCMD_ASYNC | \
140 				AAC_IOCMD_OUTSTANDING)
141 
142 struct aac_cmd_queue {
143 	struct aac_cmd *q_head; /* also as the header of aac_cmd */
144 	struct aac_cmd *q_tail;
145 };
146 
147 struct aac_card_type {
148 	uint16_t vendor;	/* PCI Vendor ID */
149 	uint16_t device;	/* PCI Device ID */
150 	uint16_t subvendor;	/* PCI Subsystem Vendor ID */
151 	uint16_t subsys;	/* PCI Subsystem ID */
152 	uint16_t hwif;		/* card chip type: i960 or Rocket */
153 	uint16_t quirks;	/* card odd limits */
154 	uint16_t type;		/* hard drive type */
155 	char *vid;		/* ASCII data for INQUIRY command vendor id */
156 	char *desc;		/* ASCII data for INQUIRY command product id */
157 };
158 
159 /* Device types */
160 #define	AAC_DEV_LD		0	/* logical device */
161 #define	AAC_DEV_PD		1	/* physical device */
162 
163 /* Device flags */
164 #define	AAC_DFLAG_VALID		(1 << 0)
165 #define	AAC_DFLAG_CONFIGURING	(1 << 1)
166 
167 #define	AAC_DEV_IS_VALID(dvp)	((dvp)->flags & AAC_DFLAG_VALID)
168 #define	AAC_P2VTGT(softs, bus, tgt) \
169 		((softs)->tgt_max * (bus) + (tgt) + AAC_MAX_LD)
170 
171 /*
172  * Device config change events
173  */
174 enum aac_cfg_event {
175 	AAC_CFG_NULL_NOEXIST = 0,	/* No change with no device */
176 	AAC_CFG_NULL_EXIST,		/* No change but have device */
177 	AAC_CFG_ADD,			/* Device added */
178 	AAC_CFG_DELETE,			/* Device deleted */
179 	AAC_CFG_CHANGE			/* Device changed */
180 };
181 
182 struct aac_device {
183 	int flags;
184 
185 	uint8_t type;
186 	dev_info_t *dip;
187 	int ncmds[AAC_CMDQ_NUM];	/* outstanding cmds of the device */
188 	int throttle[AAC_CMDQ_NUM];	/* hold IO cmds for the device */
189 };
190 
191 /* Array description */
192 struct aac_container {
193 	struct aac_device dev;
194 
195 	uint32_t cid;		/* container id */
196 	uint32_t uid;		/* container uid */
197 	uint64_t size;		/* in block */
198 	uint8_t locked;
199 	uint8_t deleted;
200 	uint8_t reset;		/* container is being reseted */
201 };
202 
203 /* Non-DASD phys. device descrption, eg. CDROM or tape */
204 struct aac_nondasd {
205 	struct aac_device dev;
206 
207 	uint32_t bus;
208 	uint32_t tid;
209 };
210 
211 /*
212  * The firmware can support a lot of outstanding commands. Each aac_slot
213  * is corresponding to one of such commands. It records the command and
214  * associated DMA resource for FIB command.
215  */
216 struct aac_slot {
217 	struct aac_slot *next;	/* next slot in the free slot list */
218 	int index;		/* index of this slot */
219 	ddi_acc_handle_t fib_acc_handle;
220 	ddi_dma_handle_t fib_dma_handle;
221 	uint64_t fib_phyaddr;	/* physical address of FIB memory */
222 	struct aac_cmd *acp;	/* command using this slot */
223 	struct aac_fib *fibp;	/* virtual address of FIB memory */
224 };
225 
226 /*
227  * Scatter-gather list structure defined by HBA hardware
228  */
229 struct aac_sge {
230 	uint32_t bcount;	/* byte count */
231 	union {
232 		uint32_t ad32;	/* 32 bit address */
233 		struct {
234 			uint32_t lo;
235 			uint32_t hi;
236 		} ad64;		/* 64 bit address */
237 	} addr;
238 };
239 
240 /* aac_cmd flags */
241 #define	AAC_CMD_CONSISTENT		(1 << 0)
242 #define	AAC_CMD_DMA_PARTIAL		(1 << 1)
243 #define	AAC_CMD_DMA_VALID		(1 << 2)
244 #define	AAC_CMD_BUF_READ		(1 << 3)
245 #define	AAC_CMD_BUF_WRITE		(1 << 4)
246 #define	AAC_CMD_SYNC			(1 << 5) /* use sync FIB */
247 #define	AAC_CMD_NO_INTR			(1 << 6) /* poll IO, no intr */
248 #define	AAC_CMD_NO_CB			(1 << 7) /* sync IO, no callback */
249 #define	AAC_CMD_NTAG			(1 << 8)
250 #define	AAC_CMD_CMPLT			(1 << 9) /* cmd exec'ed by driver/fw */
251 #define	AAC_CMD_ABORT			(1 << 10)
252 #define	AAC_CMD_TIMEOUT			(1 << 11)
253 #define	AAC_CMD_ERR			(1 << 12)
254 #define	AAC_CMD_IN_SYNC_SLOT		(1 << 13)
255 
256 struct aac_softstate;
257 typedef void (*aac_cmd_fib_t)(struct aac_softstate *, struct aac_cmd *);
258 
259 struct aac_cmd {
260 	/*
261 	 * Note: should be the first member for aac_cmd_queue to work
262 	 * correctly.
263 	 */
264 	struct aac_cmd *next;
265 	struct aac_cmd *prev;
266 
267 	struct scsi_pkt *pkt;
268 	int cmdlen;
269 	int flags;
270 	uint32_t timeout; /* time when the cmd should have completed */
271 	struct buf *bp;
272 	ddi_dma_handle_t buf_dma_handle;
273 
274 	/* For non-aligned buffer and SRB */
275 	caddr_t abp;
276 	ddi_acc_handle_t abh;
277 
278 	/* Data transfer state */
279 	ddi_dma_cookie_t cookie;
280 	uint_t left_cookien;
281 	uint_t cur_win;
282 	uint_t total_nwin;
283 	size_t total_xfer;
284 	uint64_t blkno;
285 	uint32_t bcount;	/* buffer size in byte */
286 	struct aac_sge *sgt;	/* sg table */
287 
288 	/* FIB construct function */
289 	aac_cmd_fib_t aac_cmd_fib;
290 	/* Call back function for completed command */
291 	void (*ac_comp)(struct aac_softstate *, struct aac_cmd *);
292 
293 	struct aac_slot *slotp;	/* slot used by this command */
294 	struct aac_device *dvp;	/* target device */
295 
296 	/* FIB for this IO command */
297 	int fib_size; /* size of the FIB xferred to/from the card */
298 	struct aac_fib *fibp;
299 
300 #ifdef DEBUG
301 	uint32_t fib_flags;
302 #endif
303 };
304 
305 /* Flags for attach tracking */
306 #define	AAC_ATTACH_SOFTSTATE_ALLOCED	(1 << 0)
307 #define	AAC_ATTACH_CARD_DETECTED	(1 << 1)
308 #define	AAC_ATTACH_PCI_MEM_MAPPED	(1 << 2)
309 #define	AAC_ATTACH_KMUTEX_INITED	(1 << 3)
310 #define	AAC_ATTACH_SCSI_TRAN_SETUP	(1 << 4)
311 #define	AAC_ATTACH_COMM_SPACE_SETUP	(1 << 5)
312 #define	AAC_ATTACH_CREATE_DEVCTL	(1 << 6)
313 #define	AAC_ATTACH_CREATE_SCSI		(1 << 7)
314 
315 /* Driver running states */
316 #define	AAC_STATE_STOPPED	0
317 #define	AAC_STATE_RUN		(1 << 0)
318 #define	AAC_STATE_RESET		(1 << 1)
319 #define	AAC_STATE_QUIESCED	(1 << 2)
320 #define	AAC_STATE_DEAD		(1 << 3)
321 #define	AAC_STATE_INTR		(1 << 4)
322 
323 /*
324  * Flags for aac firmware
325  * Note: Quirks are only valid for the older cards. These cards only supported
326  * old comm. Thus they are not valid for any cards that support new comm.
327  */
328 #define	AAC_FLAGS_SG_64BIT	(1 << 0) /* Use 64-bit S/G addresses */
329 #define	AAC_FLAGS_4GB_WINDOW	(1 << 1) /* Can access host mem 2-4GB range */
330 #define	AAC_FLAGS_NO4GB	(1 << 2)	/* quirk: FIB addresses must reside */
331 					/*	  between 0x2000 & 0x7FFFFFFF */
332 #define	AAC_FLAGS_256FIBS	(1 << 3) /* quirk: Can only do 256 commands */
333 #define	AAC_FLAGS_NEW_COMM	(1 << 4) /* New comm. interface supported */
334 #define	AAC_FLAGS_RAW_IO	(1 << 5) /* Raw I/O interface */
335 #define	AAC_FLAGS_ARRAY_64BIT	(1 << 6) /* 64-bit array size */
336 #define	AAC_FLAGS_LBA_64BIT	(1 << 7) /* 64-bit LBA supported */
337 #define	AAC_FLAGS_17SG		(1 << 8) /* quirk: 17 scatter gather maximum */
338 #define	AAC_FLAGS_34SG		(1 << 9) /* quirk: 34 scatter gather maximum */
339 #define	AAC_FLAGS_NONDASD	(1 << 10) /* non-DASD device supported */
340 #define	AAC_FLAGS_BRKUP		(1 << 11) /* pkt breakup support */
341 #define	AAC_FLAGS_JBOD		(1 << 12) /* JBOD mode support */
342 
343 struct aac_softstate;
344 struct aac_interface {
345 	int (*aif_get_fwstatus)(struct aac_softstate *);
346 	int (*aif_get_mailbox)(struct aac_softstate *, int);
347 	void (*aif_set_mailbox)(struct aac_softstate *, uint32_t,
348 	    uint32_t, uint32_t, uint32_t, uint32_t);
349 };
350 
351 #define	AAC_CTXFLAG_FILLED	0x01	/* aifq's full for this ctx */
352 #define	AAC_CTXFLAG_RESETED	0x02
353 
354 struct aac_fib_context {
355 	uint32_t unique;
356 	int ctx_idx;
357 	int ctx_filled;		/* aifq is full for this fib context */
358 	int ctx_flags;
359 	int ctx_overrun;
360 	struct aac_fib_context *next, *prev;
361 };
362 
363 #define	AAC_VENDOR_LEN		8
364 #define	AAC_PRODUCT_LEN		16
365 
366 struct aac_softstate {
367 	int card;		/* index to aac_cards */
368 	uint16_t hwif;		/* card chip type: i960 or Rocket */
369 	uint16_t vendid;	/* vendor id */
370 	uint16_t subvendid;	/* sub vendor id */
371 	uint16_t devid;		/* device id */
372 	uint16_t subsysid;	/* sub system id */
373 	char vendor_name[AAC_VENDOR_LEN + 1];
374 	char product_name[AAC_PRODUCT_LEN + 1];
375 	uint32_t support_opt;	/* firmware features */
376 	uint32_t support_opt2;
377 	uint32_t feature_bits;
378 	uint32_t atu_size;	/* actual size of PCI mem space */
379 	uint32_t map_size;	/* mapped PCI mem space size */
380 	uint32_t map_size_min;	/* minimum size of PCI mem that must be */
381 				/* mapped to address the card */
382 	int flags;		/* firmware features enabled */
383 	int instance;
384 	dev_info_t *devinfo_p;
385 	scsi_hba_tran_t *hba_tran;
386 	int slen;
387 	int legacy;		/* legacy device naming */
388 	uint32_t dma_max;	/* for buf breakup */
389 
390 	/* DMA attributes */
391 	ddi_dma_attr_t buf_dma_attr;
392 	ddi_dma_attr_t addr_dma_attr;
393 
394 	/* PCI spaces */
395 	ddi_device_acc_attr_t acc_attr;
396 	ddi_device_acc_attr_t reg_attr;
397 	ddi_acc_handle_t pci_mem_handle;
398 	uint8_t *pci_mem_base_vaddr;
399 	uint32_t pci_mem_base_paddr;
400 
401 	struct aac_interface aac_if;	/* adapter hardware interface */
402 
403 	struct aac_cmd sync_ac;		/* sync FIB */
404 
405 	/* Communication space */
406 	struct aac_comm_space *comm_space;
407 	ddi_acc_handle_t comm_space_acc_handle;
408 	ddi_dma_handle_t comm_space_dma_handle;
409 	uint32_t comm_space_phyaddr;
410 
411 	/* Old Comm. interface: message queues */
412 	struct aac_queue_table *qtablep;
413 	struct aac_queue_entry *qentries[AAC_QUEUE_COUNT];
414 
415 	/* New Comm. interface */
416 	uint32_t aac_max_fibs;		/* max. FIB count */
417 	uint32_t aac_max_fib_size;	/* max. FIB size */
418 	uint32_t aac_sg_tablesize;	/* max. sg count from host */
419 	uint32_t aac_max_sectors;	/* max. I/O size from host (blocks) */
420 
421 	aac_cmd_fib_t aac_cmd_fib;	/* IO cmd FIB construct function */
422 	aac_cmd_fib_t aac_cmd_fib_scsi;	/* SRB construct function */
423 
424 	ddi_softintr_t softint_id;	/* soft intr */
425 
426 	kmutex_t io_lock;
427 	int state;			/* driver state */
428 
429 	struct aac_container containers[AAC_MAX_LD];
430 	int container_count;		/* max container id + 1 */
431 	struct aac_nondasd *nondasds;
432 	uint32_t bus_max;		/* max FW buses exposed */
433 	uint32_t tgt_max;		/* max FW target per bus */
434 
435 	/*
436 	 * Command queues
437 	 * Each aac command flows through wait(or wait_sync) queue,
438 	 * busy queue, and complete queue sequentially.
439 	 */
440 	struct aac_cmd_queue q_wait[AAC_CMDQ_NUM];
441 	struct aac_cmd_queue q_busy;	/* outstanding cmd queue */
442 	kmutex_t q_comp_mutex;
443 	struct aac_cmd_queue q_comp;	/* completed io requests */
444 
445 	/* I/O slots and FIBs */
446 	int total_slots;		/* total slots allocated */
447 	int total_fibs;			/* total FIBs allocated */
448 	struct aac_slot *io_slot;	/* static list for allocated slots */
449 	struct aac_slot *free_io_slot_head;
450 
451 	kcondvar_t event;		/* for ioctl_send_fib() and sync IO */
452 	kcondvar_t sync_fib_cv;		/* for sync_fib_slot_bind/release */
453 
454 	int bus_ncmds[AAC_CMDQ_NUM];	/* total outstanding async cmds */
455 	int bus_throttle[AAC_CMDQ_NUM];	/* hold IO cmds for the bus */
456 	int ndrains;			/* number of draining threads */
457 	timeout_id_t drain_timeid;	/* for outstanding cmd drain */
458 	kcondvar_t drain_cv;		/* for quiesce drain */
459 
460 	/* Internal timer */
461 	kmutex_t time_mutex;
462 	timeout_id_t timeout_id;	/* for timeout daemon */
463 	uint32_t timebase;		/* internal timer in seconds */
464 	uint32_t time_sync;		/* next time to sync with firmware */
465 	uint32_t time_out;		/* next time to check timeout */
466 	uint32_t time_throttle;		/* next time to restore throttle */
467 
468 	/* Internal events handling */
469 	kmutex_t ev_lock;
470 	int events;
471 	kthread_t *event_thread;	/* for AIF & timeout */
472 	kcondvar_t event_wait_cv;
473 	kcondvar_t event_disp_cv;
474 
475 	/* AIF */
476 	kmutex_t aifq_mutex;		/* for AIF queue aifq */
477 	kcondvar_t aifq_cv;
478 	union aac_fib_align aifq[AAC_AIFQ_LENGTH];
479 	int aifq_idx;			/* slot for next new AIF */
480 	int aifq_wrap;			/* AIF queue has ever been wrapped */
481 	struct aac_fib_context aifctx;	/* sys aif ctx */
482 	struct aac_fib_context *fibctx_p;
483 	int devcfg_wait_on;		/* AIF event waited for rescan */
484 
485 	int fm_capabilities;
486 
487 	/* MSI specific fields */
488 	ddi_intr_handle_t *htable;	/* For array of interrupts */
489 	int intr_type;			/* What type of interrupt */
490 	int intr_cnt;			/* # of intrs count returned */
491 	int intr_size;
492 	uint_t intr_pri;		/* Interrupt priority   */
493 	int intr_cap;			/* Interrupt capabilities */
494 
495 #ifdef DEBUG
496 	/* UART trace printf variables */
497 	uint32_t debug_flags;		/* debug print flags bitmap */
498 	uint32_t debug_fib_flags;	/* debug FIB print flags bitmap */
499 	uint32_t debug_fw_flags;	/* FW debug flags */
500 	uint32_t debug_buf_offset;	/* offset from DPMEM start */
501 	uint32_t debug_buf_size;	/* FW debug buffer size in bytes */
502 	uint32_t debug_header_size;	/* size of debug header */
503 #endif
504 };
505 
506 /*
507  * The following data are kept stable because they are only written at driver
508  * initialization, and we do not allow them changed otherwise even at driver
509  * re-initialization.
510  */
511 _NOTE(SCHEME_PROTECTS_DATA("stable data", aac_softstate::{flags slen \
512     buf_dma_attr pci_mem_handle pci_mem_base_vaddr \
513     comm_space_acc_handle comm_space_dma_handle aac_max_fib_size \
514     aac_sg_tablesize aac_cmd_fib aac_cmd_fib_scsi debug_flags bus_max tgt_max}))
515 
516 #ifdef DEBUG
517 
518 #define	AACDB_FLAGS_MASK		0x0000ffff
519 #define	AACDB_FLAGS_KERNEL_PRINT	0x00000001
520 #define	AACDB_FLAGS_FW_PRINT		0x00000002
521 #define	AACDB_FLAGS_NO_HEADERS		0x00000004
522 
523 #define	AACDB_FLAGS_MISC		0x00000010
524 #define	AACDB_FLAGS_FUNC1		0x00000020
525 #define	AACDB_FLAGS_FUNC2		0x00000040
526 #define	AACDB_FLAGS_SCMD		0x00000080
527 #define	AACDB_FLAGS_AIF			0x00000100
528 #define	AACDB_FLAGS_FIB			0x00000200
529 #define	AACDB_FLAGS_IOCTL		0x00000400
530 
531 /*
532  * Flags for FIB print
533  */
534 /* FIB sources */
535 #define	AACDB_FLAGS_FIB_SCMD		0x00000001
536 #define	AACDB_FLAGS_FIB_IOCTL		0x00000002
537 #define	AACDB_FLAGS_FIB_SRB		0x00000004
538 #define	AACDB_FLAGS_FIB_SYNC		0x00000008
539 /* FIB components */
540 #define	AACDB_FLAGS_FIB_HEADER		0x00000010
541 /* FIB states */
542 #define	AACDB_FLAGS_FIB_TIMEOUT		0x00000100
543 
544 extern uint32_t aac_debug_flags;
545 extern int aac_dbflag_on(struct aac_softstate *, int);
546 extern void aac_printf(struct aac_softstate *, uint_t, const char *, ...);
547 extern void aac_print_fib(struct aac_softstate *, struct aac_slot *);
548 
549 #define	AACDB_PRINT(s, lev, ...) { \
550 	if (aac_dbflag_on((s), AACDB_FLAGS_MISC)) \
551 		aac_printf((s), (lev), __VA_ARGS__); }
552 
553 #define	AACDB_PRINT_IOCTL(s, ...) { \
554 	if (aac_dbflag_on((s), AACDB_FLAGS_IOCTL)) \
555 		aac_printf((s), CE_NOTE, __VA_ARGS__); }
556 
557 #define	AACDB_PRINT_TRAN(s, ...) { \
558 	if (aac_dbflag_on((s), AACDB_FLAGS_SCMD)) \
559 		aac_printf((s), CE_NOTE, __VA_ARGS__); }
560 
561 #define	DBCALLED(s, n) { \
562 	if (aac_dbflag_on((s), AACDB_FLAGS_FUNC ## n)) \
563 		aac_printf((s), CE_NOTE, "--- %s() called ---", __func__); }
564 
565 #define	AACDB_PRINT_SCMD(s, x) { \
566 	if (aac_dbflag_on((s), AACDB_FLAGS_SCMD)) aac_print_scmd((s), (x)); }
567 
568 #define	AACDB_PRINT_AIF(s, x) { \
569 	if (aac_dbflag_on((s), AACDB_FLAGS_AIF)) aac_print_aif((s), (x)); }
570 
571 #define	AACDB_PRINT_FIB(s, x) { \
572 	if (aac_dbflag_on((s), AACDB_FLAGS_FIB)) aac_print_fib((s), (x)); }
573 
574 #else /* DEBUG */
575 
576 #define	AACDB_PRINT(s, lev, ...)
577 #define	AACDB_PRINT_IOCTL(s, ...)
578 #define	AACDB_PRINT_TRAN(s, ...)
579 #define	AACDB_PRINT_FIB(s, x)
580 #define	AACDB_PRINT_SCMD(s, x)
581 #define	AACDB_PRINT_AIF(s, x)
582 #define	DBCALLED(s, n)
583 
584 #endif /* DEBUG */
585 
586 #ifdef	__cplusplus
587 }
588 #endif
589 
590 #endif /* _AAC_H_ */
591