2 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
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.
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
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.
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
34 * $FreeBSD: src/sys/dev/aac/aacvar.h,v 1.47 2005/10/08 15:55:09 scottl Exp $
44 #define AAC_ROUNDUP(x, y) (((x) + (y) - 1) / (y) * (y))
46 #define AAC_TYPE_DEVO 1
47 #define AAC_TYPE_ALPHA 2
48 #define AAC_TYPE_BETA 3
49 #define AAC_TYPE_RELEASE 4
51 #ifndef AAC_DRIVER_BUILD
52 #define AAC_DRIVER_BUILD 1
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
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)
69 #define AAC_MAX_ADAPTERS 64
71 /* Definitions for mode sense */
72 #ifndef SD_MODE_SENSE_PAGE3_CODE
73 #define SD_MODE_SENSE_PAGE3_CODE 0x03
76 #ifndef SD_MODE_SENSE_PAGE4_CODE
77 #define SD_MODE_SENSE_PAGE4_CODE 0x04
80 #ifndef SCMD_SYNCHRONIZE_CACHE
81 #define SCMD_SYNCHRONIZE_CACHE 0x35
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.
88 #define AAC_AIFQ_LENGTH 64
91 #define AAC_IMMEDIATE_TIMEOUT 30 /* seconds */
93 #define AAC_IMMEDIATE_TIMEOUT 60 /* seconds */
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 */
99 /* Adapter hardware interface types */
100 #define AAC_HWIF_UNKNOWN 0
101 #define AAC_HWIF_I960RX 1
102 #define AAC_HWIF_RKT 2
104 #define AAC_TYPE_UNKNOWN 0
105 #define AAC_TYPE_SCSI 1
106 #define AAC_TYPE_SATA 2
107 #define AAC_TYPE_SAS 3
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)
115 * Internal events that will be handled serially by aac_event_thread()
117 #define AAC_EVENT_AIF (1 << 0)
118 #define AAC_EVENT_TIMEOUT (1 << 1)
119 #define AAC_EVENT_SYNCTICK (1 << 2)
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
128 AAC_CMDQ_SYNC
, /* sync FIB queue */
129 AAC_CMDQ_ASYNC
, /* async FIB queue */
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)
142 struct aac_cmd_queue
{
143 struct aac_cmd
*q_head
; /* also as the header of aac_cmd */
144 struct aac_cmd
*q_tail
;
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 */
160 #define AAC_DEV_LD 0 /* logical device */
161 #define AAC_DEV_PD 1 /* physical device */
164 #define AAC_DFLAG_VALID (1 << 0)
165 #define AAC_DFLAG_CONFIGURING (1 << 1)
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)
172 * Device config change events
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 */
187 int ncmds
[AAC_CMDQ_NUM
]; /* outstanding cmds of the device */
188 int throttle
[AAC_CMDQ_NUM
]; /* hold IO cmds for the device */
191 /* Array description */
192 struct aac_container
{
193 struct aac_device dev
;
195 uint32_t cid
; /* container id */
196 uint32_t uid
; /* container uid */
197 uint64_t size
; /* in block */
200 uint8_t reset
; /* container is being reseted */
203 /* Non-DASD phys. device descrption, eg. CDROM or tape */
205 struct aac_device dev
;
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.
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 */
227 * Scatter-gather list structure defined by HBA hardware
230 uint32_t bcount
; /* byte count */
232 uint32_t ad32
; /* 32 bit address */
236 } ad64
; /* 64 bit address */
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)
256 struct aac_softstate
;
257 typedef void (*aac_cmd_fib_t
)(struct aac_softstate
*, struct aac_cmd
*);
261 * Note: should be the first member for aac_cmd_queue to work
264 struct aac_cmd
*next
;
265 struct aac_cmd
*prev
;
267 struct scsi_pkt
*pkt
;
270 uint32_t timeout
; /* time when the cmd should have completed */
272 ddi_dma_handle_t buf_dma_handle
;
274 /* For non-aligned buffer and SRB */
276 ddi_acc_handle_t abh
;
278 /* Data transfer state */
279 ddi_dma_cookie_t cookie
;
285 uint32_t bcount
; /* buffer size in byte */
286 struct aac_sge
*sgt
; /* sg table */
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
*);
293 struct aac_slot
*slotp
; /* slot used by this command */
294 struct aac_device
*dvp
; /* target device */
296 /* FIB for this IO command */
297 int fib_size
; /* size of the FIB xferred to/from the card */
298 struct aac_fib
*fibp
;
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)
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)
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.
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 */
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);
351 #define AAC_CTXFLAG_FILLED 0x01 /* aifq's full for this ctx */
352 #define AAC_CTXFLAG_RESETED 0x02
354 struct aac_fib_context
{
357 int ctx_filled
; /* aifq is full for this fib context */
360 struct aac_fib_context
*next
, *prev
;
363 #define AAC_VENDOR_LEN 8
364 #define AAC_PRODUCT_LEN 16
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 */
384 dev_info_t
*devinfo_p
;
385 scsi_hba_tran_t
*hba_tran
;
387 int legacy
; /* legacy device naming */
388 uint32_t dma_max
; /* for buf breakup */
391 ddi_dma_attr_t buf_dma_attr
;
392 ddi_dma_attr_t addr_dma_attr
;
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
;
401 struct aac_interface aac_if
; /* adapter hardware interface */
403 struct aac_cmd sync_ac
; /* sync FIB */
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
;
411 /* Old Comm. interface: message queues */
412 struct aac_queue_table
*qtablep
;
413 struct aac_queue_entry
*qentries
[AAC_QUEUE_COUNT
];
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) */
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 */
424 ddi_softintr_t softint_id
; /* soft intr */
427 int state
; /* driver state */
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 */
437 * Each aac command flows through wait(or wait_sync) queue,
438 * busy queue, and complete queue sequentially.
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 */
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
;
451 kcondvar_t event
; /* for ioctl_send_fib() and sync IO */
452 kcondvar_t sync_fib_cv
; /* for sync_fib_slot_bind/release */
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 */
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 */
468 /* Internal events handling */
471 kthread_t
*event_thread
; /* for AIF & timeout */
472 kcondvar_t event_wait_cv
;
473 kcondvar_t event_disp_cv
;
476 kmutex_t aifq_mutex
; /* for AIF queue aifq */
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 */
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 */
492 uint_t intr_pri
; /* Interrupt priority */
493 int intr_cap
; /* Interrupt capabilities */
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 */
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
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
}))
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
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
532 * Flags for FIB print
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
540 #define AACDB_FLAGS_FIB_HEADER 0x00000010
542 #define AACDB_FLAGS_FIB_TIMEOUT 0x00000100
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
*);
549 #define AACDB_PRINT(s, lev, ...) { \
550 if (aac_dbflag_on((s), AACDB_FLAGS_MISC)) \
551 aac_printf((s), (lev), __VA_ARGS__); }
553 #define AACDB_PRINT_IOCTL(s, ...) { \
554 if (aac_dbflag_on((s), AACDB_FLAGS_IOCTL)) \
555 aac_printf((s), CE_NOTE, __VA_ARGS__); }
557 #define AACDB_PRINT_TRAN(s, ...) { \
558 if (aac_dbflag_on((s), AACDB_FLAGS_SCMD)) \
559 aac_printf((s), CE_NOTE, __VA_ARGS__); }
561 #define DBCALLED(s, n) { \
562 if (aac_dbflag_on((s), AACDB_FLAGS_FUNC ## n)) \
563 aac_printf((s), CE_NOTE, "--- %s() called ---", __func__); }
565 #define AACDB_PRINT_SCMD(s, x) { \
566 if (aac_dbflag_on((s), AACDB_FLAGS_SCMD)) aac_print_scmd((s), (x)); }
568 #define AACDB_PRINT_AIF(s, x) { \
569 if (aac_dbflag_on((s), AACDB_FLAGS_AIF)) aac_print_aif((s), (x)); }
571 #define AACDB_PRINT_FIB(s, x) { \
572 if (aac_dbflag_on((s), AACDB_FLAGS_FIB)) aac_print_fib((s), (x)); }
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)