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