1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /* Copyright 2015 QLogic Corporation */
  23 
  24 /*
  25  * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
  26  */
  27 
  28 #ifndef _QL_API_H
  29 #define _QL_API_H
  30 
  31 /*
  32  * ISP2xxx Solaris Fibre Channel Adapter (FCA) driver header file.
  33  *
  34  * ***********************************************************************
  35  * *                                                                    **
  36  * *                            NOTICE                                  **
  37  * *            COPYRIGHT (C) 1996-2015 QLOGIC CORPORATION              **
  38  * *                    ALL RIGHTS RESERVED                             **
  39  * *                                                                    **
  40  * ***********************************************************************
  41  *
  42  */
  43 
  44 #ifdef  __cplusplus
  45 extern "C" {
  46 #endif
  47 
  48 /* OS include files. */
  49 #include <sys/scsi/scsi_types.h>
  50 #include <sys/byteorder.h>
  51 #include <sys/pci.h>
  52 #include <sys/utsname.h>
  53 #include <sys/file.h>
  54 #include <sys/param.h>
  55 #include <sys/time.h>
  56 #include <sys/ddifm.h>
  57 #include <sys/sunddi.h>
  58 #include <sys/fm/protocol.h>
  59 #include <sys/fm/io/ddi.h>
  60 #include <ql_open.h>
  61 
  62 #ifdef __x86
  63 #include <sys/x86_archext.h>
  64 #endif
  65 
  66 #include <sys/fibre-channel/fc.h>
  67 #include <sys/fibre-channel/impl/fc_fcaif.h>
  68 
  69 #ifndef DDI_INTR_TYPE_FIXED
  70 #define DDI_INTR_TYPE_FIXED     0x1
  71 #endif
  72 #ifndef DDI_INTR_TYPE_MSI
  73 #define DDI_INTR_TYPE_MSI       0x2
  74 #endif
  75 #ifndef DDI_INTR_TYPE_MSIX
  76 #define DDI_INTR_TYPE_MSIX      0x4
  77 #endif
  78 #ifndef DDI_INTR_FLAG_BLOCK
  79 #define DDI_INTR_FLAG_BLOCK     0x100
  80 #endif
  81 #ifndef DDI_INTR_ALLOC_NORMAL
  82 #define DDI_INTR_ALLOC_NORMAL   0
  83 #endif
  84 #ifndef DDI_INTR_ALLOC_STRICT
  85 #define DDI_INTR_ALLOC_STRICT   1
  86 #endif
  87 
  88 #define PCI_PCIE_DEVICE_CONTROL         0x8     /* Device control reg offset */
  89 #define PCI_MSI_CONTROL                 0x2     /* MSI Control reg offset */
  90 #define PCI_MSI_MSG_ADDR                0x4     /* MSI Msg Addr reg offset */
  91 #define PCI_MSI_MSG_UPPER_ADDR          0x8     /* MSI MSI Msg Upper Addr reg */
  92 /* offset */
  93 #define PCI_MSI_MSG_DATA                0xc     /* MSI Msg Data reg offset */
  94 #define PCI_MSI_X_CONTROL               0x2     /* MSI-X Control reg offset */
  95 #define MSI_X_TABLE_SIZE_MASK           0x7ff   /* MSI-X Table Size mask */
  96 
  97 #define PCIE_EXT_CAP_PTR                0x100
  98 #define PCIE_EXT_CAP_NEXT_SHIFT         20
  99 #define PCIE_EXT_CAP_ID_SRIOV           0x0010  /* SRIOV capabilities offset */
 100 #define PCIE_EXT_CAP_SRIOV_TOTAL_VFS    0xe
 101 #define PCIE_SRIOV_PAGE_SIZE_MULTIPLIER 4096
 102 
 103 /*
 104  * NPIV defines
 105  */
 106 #ifndef FC_NPIV_FDISC_FAILED
 107 #define FC_NPIV_FDISC_FAILED    0x45
 108 #endif
 109 #ifndef FC_NPIV_FDISC_WWN_INUSE
 110 #define FC_NPIV_FDISC_WWN_INUSE 0x46
 111 #endif
 112 #ifndef FC_NPIV_NOT_SUPPORTED
 113 #define FC_NPIV_NOT_SUPPORTED   0x47
 114 #endif
 115 #ifndef FC_NPIV_WRONG_TOPOLOGY
 116 #define FC_NPIV_WRONG_TOPOLOGY  0x48
 117 #endif
 118 #ifndef FC_NPIV_NPIV_BOUND
 119 #define FC_NPIV_NPIV_BOUND      0x49
 120 #endif
 121 #ifndef FC_HBA_PORTSPEED_32GBIT
 122 #define FC_HBA_PORTSPEED_32GBIT 64
 123 #endif
 124 
 125 #pragma weak ddi_intr_get_supported_types
 126 #pragma weak ddi_intr_get_nintrs
 127 #pragma weak ddi_intr_alloc
 128 #pragma weak ddi_intr_free
 129 #pragma weak ddi_intr_get_pri
 130 #pragma weak ddi_intr_add_handler
 131 #pragma weak ddi_intr_dup_handler
 132 #pragma weak ddi_intr_get_navail
 133 #pragma weak ddi_intr_block_disable
 134 #pragma weak ddi_intr_block_enable
 135 #pragma weak ddi_intr_disable
 136 #pragma weak ddi_intr_enable
 137 #pragma weak ddi_intr_get_cap
 138 #pragma weak ddi_intr_remove_handler
 139 extern int ddi_intr_get_supported_types();
 140 extern int ddi_intr_get_nintrs();
 141 extern int ddi_intr_alloc();
 142 extern int ddi_intr_free();
 143 extern int ddi_intr_get_pri();
 144 extern int ddi_intr_add_handler();
 145 extern int ddi_intr_dup_handler();
 146 extern int ddi_intr_get_navail();
 147 extern int ddi_intr_block_disable();
 148 extern int ddi_intr_block_enable();
 149 extern int ddi_intr_disable();
 150 extern int ddi_intr_enable();
 151 extern int ddi_intr_get_cap();
 152 extern int ddi_intr_remove_handler();
 153 
 154 #define QL_CLEAR_DMA_HANDLE(x)  ((ddi_dma_impl_t *)x)->dmai_fault_notify = 0; \
 155                                 ((ddi_dma_impl_t *)x)->dmai_fault_check = 0; \
 156                                 ((ddi_dma_impl_t *)x)->dmai_fault    = 0
 157 
 158 #ifndef FC_STATE_1GBIT_SPEED
 159 #define FC_STATE_1GBIT_SPEED    0x0100  /* 1 Gbit/sec */
 160 #endif
 161 #ifndef FC_STATE_2GBIT_SPEED
 162 #define FC_STATE_2GBIT_SPEED    0x0400  /* 2 Gbit/sec */
 163 #endif
 164 #ifndef FC_STATE_4GBIT_SPEED
 165 #define FC_STATE_4GBIT_SPEED    0x0500  /* 4 Gbit/sec */
 166 #endif
 167 #ifndef FC_STATE_8GBIT_SPEED
 168 #define FC_STATE_8GBIT_SPEED    0x0700  /* 8 Gbit/sec */
 169 #endif
 170 #ifndef FC_STATE_10GBIT_SPEED
 171 #define FC_STATE_10GBIT_SPEED   0x0600  /* 10 Gbit/sec */
 172 #endif
 173 #ifndef FC_STATE_16GBIT_SPEED
 174 #define FC_STATE_16GBIT_SPEED   0x0800  /* 16 Gbit/sec */
 175 #endif
 176 #ifndef FC_STATE_32GBIT_SPEED
 177 #define FC_STATE_32GBIT_SPEED   0x1000  /* 32 Gbit/sec */
 178 #endif
 179 
 180 /*
 181  * Data bit definitions.
 182  */
 183 #define BIT_0   0x1
 184 #define BIT_1   0x2
 185 #define BIT_2   0x4
 186 #define BIT_3   0x8
 187 #define BIT_4   0x10
 188 #define BIT_5   0x20
 189 #define BIT_6   0x40
 190 #define BIT_7   0x80
 191 #define BIT_8   0x100
 192 #define BIT_9   0x200
 193 #define BIT_10  0x400
 194 #define BIT_11  0x800
 195 #define BIT_12  0x1000
 196 #define BIT_13  0x2000
 197 #define BIT_14  0x4000
 198 #define BIT_15  0x8000
 199 #define BIT_16  0x10000
 200 #define BIT_17  0x20000
 201 #define BIT_18  0x40000
 202 #define BIT_19  0x80000
 203 #define BIT_20  0x100000
 204 #define BIT_21  0x200000
 205 #define BIT_22  0x400000
 206 #define BIT_23  0x800000
 207 #define BIT_24  0x1000000
 208 #define BIT_25  0x2000000
 209 #define BIT_26  0x4000000
 210 #define BIT_27  0x8000000
 211 #define BIT_28  0x10000000
 212 #define BIT_29  0x20000000
 213 #define BIT_30  0x40000000
 214 #define BIT_31  0x80000000
 215 #define BIT_32  0x100000000
 216 #define BIT_33  0x200000000
 217 #define BIT_34  0x400000000
 218 #define BIT_35  0x800000000
 219 #define BIT_36  0x1000000000
 220 #define BIT_37  0x2000000000
 221 #define BIT_38  0x4000000000
 222 #define BIT_39  0x8000000000
 223 #define BIT_40  0x10000000000
 224 #define BIT_41  0x20000000000
 225 #define BIT_42  0x40000000000
 226 #define BIT_43  0x80000000000
 227 #define BIT_44  0x100000000000
 228 #define BIT_45  0x200000000000
 229 #define BIT_46  0x400000000000
 230 #define BIT_47  0x800000000000
 231 #define BIT_48  0x1000000000000
 232 #define BIT_49  0x2000000000000
 233 #define BIT_50  0x4000000000000
 234 #define BIT_51  0x8000000000000
 235 #define BIT_52  0x10000000000000
 236 #define BIT_53  0x20000000000000
 237 #define BIT_54  0x40000000000000
 238 #define BIT_55  0x80000000000000
 239 #define BIT_56  0x100000000000000
 240 #define BIT_57  0x200000000000000
 241 #define BIT_58  0x400000000000000
 242 #define BIT_59  0x800000000000000
 243 #define BIT_60  0x1000000000000000
 244 #define BIT_61  0x2000000000000000
 245 #define BIT_62  0x4000000000000000
 246 #define BIT_63  0x8000000000000000
 247 
 248 /*
 249  *  Local Macro Definitions.
 250  */
 251 #ifndef TRUE
 252 #define TRUE    B_TRUE
 253 #endif
 254 
 255 #ifndef FALSE
 256 #define FALSE   B_FALSE
 257 #endif
 258 
 259 /*
 260  * I/O register
 261  */
 262 #define RD_REG_BYTE(ha, addr) \
 263         (uint8_t)ddi_get8(ha->dev_handle, (uint8_t *)(addr))
 264 #define RD_REG_WORD(ha, addr) \
 265         (uint16_t)ddi_get16(ha->dev_handle, (uint16_t *)(addr))
 266 #define RD_REG_DWORD(ha, addr) \
 267         (uint32_t)ddi_get32(ha->dev_handle, (uint32_t *)(addr))
 268 #define RD_REG_DDWORD(ha, addr) \
 269         (uint64_t)ddi_get64(ha->dev_handle, (uint64_t *)(addr))
 270 
 271 #define WRT_REG_BYTE(ha, addr, data) \
 272         ddi_put8(ha->dev_handle, (uint8_t *)(addr), (uint8_t)(data))
 273 #define WRT_REG_WORD(ha, addr, data) \
 274         ddi_put16(ha->dev_handle, (uint16_t *)(addr), (uint16_t)(data))
 275 #define WRT_REG_DWORD(ha, addr, data) \
 276         ddi_put32(ha->dev_handle, (uint32_t *)(addr), (uint32_t)(data))
 277 #define WRT_REG_DDWORD(ha, addr, data) \
 278         ddi_put64(ha->dev_handle, (uint64_t *)(addr), (uint64_t)(data))
 279 
 280 #define RD8_IO_REG(ha, regname) \
 281         RD_REG_BYTE(ha, (ha->iobase + ha->reg_off->regname))
 282 #define RD16_IO_REG(ha, regname) \
 283         RD_REG_WORD(ha, (ha->iobase + ha->reg_off->regname))
 284 #define RD32_IO_REG(ha, regname) \
 285         RD_REG_DWORD(ha, (ha->iobase + ha->reg_off->regname))
 286 
 287 #define WRT8_IO_REG(ha, regname, data) \
 288         WRT_REG_BYTE(ha, (ha->iobase + ha->reg_off->regname), (data))
 289 #define WRT16_IO_REG(ha, regname, data) \
 290         WRT_REG_WORD(ha, (ha->iobase + ha->reg_off->regname), (data))
 291 #define WRT32_IO_REG(ha, regname, data) \
 292         WRT_REG_DWORD(ha, (ha->iobase + ha->reg_off->regname), (data))
 293 
 294 #define RD_IOREG_BYTE(ha, addr) \
 295         (uint8_t)ddi_get8(ha->iomap_dev_handle, (uint8_t *)(addr))
 296 #define RD_IOREG_WORD(ha, addr) \
 297         (uint16_t)ddi_get16(ha->iomap_dev_handle, (uint16_t *)(addr))
 298 #define RD_IOREG_DWORD(ha, addr) \
 299         (uint32_t)ddi_get32(ha->iomap_dev_handle, (uint32_t *)(addr))
 300 
 301 #define WRT_IOREG_BYTE(ha, addr, data) \
 302         ddi_put8(ha->iomap_dev_handle, (uint8_t *)addr, (uint8_t)(data))
 303 #define WRT_IOREG_WORD(ha, addr, data) \
 304         ddi_put16(ha->iomap_dev_handle, (uint16_t *)addr, (uint16_t)(data))
 305 #define WRT_IOREG_DWORD(ha, addr, data) \
 306         ddi_put32(ha->iomap_dev_handle, (uint32_t *)addr, (uint32_t)(data))
 307 
 308 #define RD8_IOMAP_REG(ha, regname) \
 309         RD_IOREG_BYTE(ha, (ha->iomap_iobase + ha->reg_off->regname))
 310 #define RD16_IOMAP_REG(ha, regname) \
 311         RD_IOREG_WORD(ha, (ha->iomap_iobase + ha->reg_off->regname))
 312 #define RD32_IOMAP_REG(ha, regname) \
 313         RD_IOREG_DWORD(ha, (ha->iomap_iobase + ha->reg_off->regname))
 314 
 315 #define WRT8_IOMAP_REG(ha, regname, data) \
 316         WRT_IOREG_BYTE(ha, (ha->iomap_iobase + ha->reg_off->regname), (data))
 317 #define WRT16_IOMAP_REG(ha, regname, data) \
 318         WRT_IOREG_WORD(ha, (ha->iomap_iobase + ha->reg_off->regname), (data))
 319 #define WRT32_IOMAP_REG(ha, regname, data) \
 320         WRT_IOREG_DWORD(ha, (ha->iomap_iobase + ha->reg_off->regname), (data))
 321 
 322 #define RD8_MBAR_REG(ha, ofst) \
 323         (uint8_t)ddi_get8(ha->mbar_dev_handle, \
 324         (uint8_t *)(ha->mbar + (ofst)))
 325 #define RD16_MBAR_REG(ha, ofst) \
 326         (uint16_t)ddi_get16(ha->mbar_dev_handle, \
 327         (uint16_t *)(ha->mbar + (ofst)))
 328 #define RD32_MBAR_REG(ha, ofst) \
 329         (uint32_t)ddi_get32(ha->mbar_dev_handle, \
 330         (uint32_t *)(ha->mbar + (ofst)))
 331 #define RD64_MBAR_REG(ha, ofst) \
 332         (uint64_t)ddi_get64(ha->mbar_dev_handle, \
 333         (uint64_t *)(ha->mbar + (ofst)))
 334 
 335 #define WR8_MBAR_REG(ha, ofst, data) \
 336         ddi_put8(ha->mbar_dev_handle, \
 337         (uint8_t *)(ha->mbar + (ofst)), \
 338         (uint8_t)(data))
 339 #define WR16_MBAR_REG(ha, ofst, data) \
 340         ddi_put16(ha->mbar_dev_handle, \
 341         (uint16_t *)(ha->mbar + (ofst)), \
 342         (uint16_t)(data))
 343 #define WR32_MBAR_REG(ha, ofst, data) \
 344         ddi_put32(ha->mbar_dev_handle, \
 345         (uint32_t *)(ha->mbar + (ofst)), \
 346         (uint32_t)(data))
 347 #define WR64_MBAR_REG(ha, ofst, data) \
 348         ddi_put64(ha->mbar_dev_handle, \
 349         (uint64_t *)(ha->mbar + (ofst)), \
 350         (uint64_t)(data))
 351 
 352 /*
 353  * FCA definitions
 354  */
 355 #define MAX_LUNS        16384
 356 #define QL_FCA_BRAND    0x0fca2200
 357 
 358 /* Following to be removed when defined by OS. */
 359 /* ************************************************************************ */
 360 #define LA_ELS_FARP_REQ         0x54
 361 #define LA_ELS_FARP_REPLY       0x55
 362 #define LA_ELS_LPC              0x71
 363 #define LA_ELS_LSTS             0x72
 364 
 365 typedef struct {
 366         ls_code_t ls_code;
 367         uint8_t rsvd[3];
 368         uint8_t port_control;
 369         uint8_t lpb[16];
 370         uint8_t lpe[16];
 371 } ql_lpc_t;
 372 
 373 typedef struct {
 374         ls_code_t ls_code;
 375 } ql_acc_rjt_t;
 376 
 377 typedef fc_linit_resp_t ql_lpc_resp_t;
 378 typedef fc_scr_resp_t ql_rscn_resp_t;
 379 
 380 typedef struct {
 381         uint16_t    class_valid_svc_opt;
 382         uint16_t    initiator_ctl;
 383         uint16_t    recipient_ctl;
 384         uint16_t    rcv_data_size;
 385         uint16_t    conc_sequences;
 386         uint16_t    n_port_end_to_end_credit;
 387         uint16_t    open_sequences_per_exch;
 388         uint16_t    unused;
 389 } class_svc_param_t;
 390 
 391 typedef struct {
 392         uint8_t    type;
 393         uint8_t    rsvd;
 394         uint16_t    process_assoc_flags;
 395         uint32_t    originator_process;
 396         uint32_t    responder_process;
 397         uint32_t    process_flags;
 398 } prli_svc_param_t;
 399 /* *********************************************************************** */
 400 
 401 /*
 402  * Fibre Channel device definitions.
 403  */
 404 #define MAX_22_FIBRE_DEVICES    256
 405 #define MAX_24_FIBRE_DEVICES    2048
 406 #define MAX_24_VIRTUAL_PORTS    127
 407 #define MAX_25_VIRTUAL_PORTS    254
 408 #define MAX_27_VIRTUAL_PORTS    252
 409 #define MAX_8021_VIRTUAL_PORTS  63
 410 #define MAX_81XX_VIRTUAL_PORTS  254
 411 #define MAX_83_VIRTUAL_PORTS    254
 412 
 413 #define LAST_LOCAL_LOOP_ID               0x7d
 414 #define FL_PORT_LOOP_ID                  0x7e /* FFFFFE Fabric F_Port */
 415 #define SWITCH_FABRIC_CONTROLLER_LOOP_ID 0x7f /* FFFFFD Fabric Controller */
 416 #define SIMPLE_NAME_SERVER_LOOP_ID       0x80 /* FFFFFC Directory Server */
 417 #define SNS_FIRST_LOOP_ID                0x81
 418 #define SNS_LAST_LOOP_ID                 0xfe
 419 #define IP_BROADCAST_LOOP_ID             0xff /* FFFFFF Broadcast */
 420 #define BROADCAST_ADDR                   0xffffff /* FFFFFF Broadcast */
 421 
 422 /*
 423  * Fibre Channel 24xx device definitions.
 424  */
 425 #define LAST_N_PORT_HDL         0x7ef
 426 #define SNS_24XX_HDL            0x7FC   /* SNS FFFFFCh */
 427 #define SFC_24XX_HDL            0x7FD   /* fabric controller FFFFFDh */
 428 #define FL_PORT_24XX_HDL        0x7FE   /* F_Port FFFFFEh */
 429 #define BROADCAST_24XX_HDL      0x7FF   /* IP broadcast FFFFFFh */
 430 
 431 /* Loop ID's used as flags, must be higher than any valid Loop ID */
 432 #define PORT_NO_LOOP_ID         0x8000  /* Device does not have loop ID. */
 433 #define PORT_LOST_ID            0x4000  /* Device has been lost. */
 434 
 435 /* Fibre Channel Topoploy. */
 436 #define QL_N_PORT               BIT_0
 437 #define QL_NL_PORT              BIT_1
 438 #define QL_F_PORT               BIT_2
 439 #define QL_FL_PORT              BIT_3
 440 #define QL_LOOP_CONNECTION      (QL_NL_PORT | QL_FL_PORT)
 441 #define QL_P2P_CONNECTION       (QL_F_PORT | QL_N_PORT)
 442 #define QL_FABRIC_CONNECTION    (QL_F_PORT | QL_FL_PORT)
 443 
 444 /* Timeout timer counts in seconds (must greater than 1 second). */
 445 #define WATCHDOG_TIME           5                       /* 0 - 255 */
 446 #define PORT_RETRY_TIME         2                       /* 0 - 255 */
 447 #define LOOP_DOWN_TIMER_OFF     0
 448 #define LOOP_DOWN_TIMER_START   240                     /* 0 - 255 */
 449 #define LOOP_DOWN_TIMER_END     1
 450 #define LOOP_DOWN_RESET         (LOOP_DOWN_TIMER_START - 45)    /* 0 - 255 */
 451 #define R_A_TOV_DEFAULT         20                      /* 0 - 65535 */
 452 #define IDLE_CHECK_TIMER        300                     /* 0 - 65535 */
 453 #define MAX_DEVICE_LOST_RETRY   16                      /* 0 - 255 */
 454 #define TIMEOUT_THRESHOLD       16                      /* 0 - 255 */
 455 
 456 /* Maximum outstanding commands in ISP queues (1-4095) */
 457 #define OSC_INDEX_MASK          0xfff
 458 #define OSC_INDEX_SHIFT         12
 459 
 460 /* Maximum unsolicited buffers (1-65535) */
 461 #define QL_UB_LIMIT     256
 462 
 463 /* ISP request, response and receive buffer entry counts */
 464 #define REQUEST_ENTRY_CNT       512     /* Request entries (205-65535) */
 465 #define RESPONSE_ENTRY_CNT      256     /* Response entries (1-65535) */
 466 #define RCVBUF_CONTAINER_CNT    64      /* Rcv buffer containers (8-1024) */
 467 
 468 /*
 469  * ISP request, response, mailbox and receive buffer queue sizes
 470  */
 471 #define SHADOW_ENTRY_SIZE       4
 472 #define REQUEST_ENTRY_SIZE      64
 473 #define REQUEST_QUEUE_SIZE      (REQUEST_ENTRY_SIZE * REQUEST_ENTRY_CNT)
 474 
 475 #define RESPONSE_ENTRY_SIZE     64
 476 #define RESPONSE_QUEUE_SIZE     (RESPONSE_ENTRY_SIZE * RESPONSE_ENTRY_CNT)
 477 
 478 #define RCVBUF_CONTAINER_SIZE   12
 479 #define RCVBUF_QUEUE_SIZE       (RCVBUF_CONTAINER_SIZE * RCVBUF_CONTAINER_CNT)
 480 
 481 /*
 482  * DMA attributes definitions.
 483  */
 484 #define QL_DMA_LOW_ADDRESS              (uint64_t)0
 485 #define QL_DMA_HIGH_64BIT_ADDRESS       (uint64_t)0xffffffffffffffff
 486 #define QL_DMA_HIGH_32BIT_ADDRESS       (uint64_t)0xffffffff
 487 #define QL_DMA_XFER_COUNTER             (uint64_t)0xffffffff
 488 #define QL_DMA_ADDRESS_ALIGNMENT        (uint64_t)8
 489 #define QL_DMA_ALIGN_8_BYTE_BOUNDARY    (uint64_t)BIT_3
 490 #define QL_DMA_RING_ADDRESS_ALIGNMENT   (uint64_t)64
 491 #define QL_DMA_ALIGN_64_BYTE_BOUNDARY   (uint64_t)BIT_6
 492 #define QL_DMA_BURSTSIZES               0xff
 493 #define QL_DMA_MIN_XFER_SIZE            1
 494 #define QL_DMA_MAX_XFER_SIZE            (uint64_t)0xffffffff
 495 #define QL_DMA_SEGMENT_BOUNDARY         (uint64_t)0xffffffff
 496 
 497 #ifdef __sparc
 498 #define QL_DMA_SG_LIST_LENGTH   1
 499 #define QL_FCSM_CMD_SGLLEN      1
 500 #define QL_FCSM_RSP_SGLLEN      1
 501 #define QL_FCIP_CMD_SGLLEN      1
 502 #define QL_FCIP_RSP_SGLLEN      1
 503 #define QL_FCP_CMD_SGLLEN       1
 504 #define QL_FCP_RSP_SGLLEN       1
 505 #else
 506 #define QL_DMA_SG_LIST_LENGTH   1024
 507 #define QL_FCSM_CMD_SGLLEN      1
 508 #define QL_FCSM_RSP_SGLLEN      6
 509 /*
 510  * QL_FCIP_CMD_SGLLEN needs to be increased as we changed the max fcip packet
 511  * size to about 64K. With this, we need to increase the maximum number of
 512  * scatter-gather elements allowable from the existing 7. We want it to be more
 513  * like 17 (max fragments for an fcip packet that is unaligned). (64K / 4K) + 1
 514  * or whatever. Otherwise the DMA breakup routines will give bad results.
 515  */
 516 #define QL_FCIP_CMD_SGLLEN      17
 517 #define QL_FCIP_RSP_SGLLEN      1
 518 #define QL_FCP_CMD_SGLLEN       1
 519 #define QL_FCP_RSP_SGLLEN       1
 520 #endif
 521 
 522 #ifndef DDI_DMA_RELAXED_ORDERING
 523 #define DDI_DMA_RELAXED_ORDERING        0x400
 524 #endif
 525 
 526 #define QL_DMA_GRANULARITY      1
 527 #define QL_DMA_XFER_FLAGS       0
 528 
 529 typedef union {
 530         uint64_t size64;        /* 1 X 64 bit number */
 531         uint32_t size32[2];     /* 2 x 32 bit number */
 532         uint16_t size16[4];     /* 4 x 16 bit number */
 533         uint8_t  size8[8];      /* 8 x  8 bit number */
 534 } conv_num_t;
 535 
 536 /*
 537  *  Device register offsets.
 538  */
 539 #define MAX_MBOX_COUNT          32
 540 typedef struct {
 541         uint16_t flash_address; /* Flash BIOS address */
 542         uint16_t flash_data;    /* Flash BIOS data */
 543         uint16_t ctrl_status;   /* Control/Status */
 544         uint16_t ictrl;         /* Interrupt control */
 545         uint16_t istatus;       /* Interrupt status */
 546         uint16_t semaphore;     /* Semaphore */
 547         uint16_t nvram;         /* NVRAM register. */
 548         uint16_t req_in;                /* for 2200 MBX 4 Write */
 549         uint16_t req_out;       /* for 2200 MBX 4 read */
 550         uint16_t resp_in;       /* for 2200 MBX 5 Read */
 551         uint16_t resp_out;      /* for 2200 MBX 5 Write */
 552         uint16_t risc2host;
 553         uint16_t mbox_cnt;      /* Number of mailboxes */
 554         uint16_t mailbox_in[MAX_MBOX_COUNT]; /* Mailbox registers */
 555         uint16_t mailbox_out[MAX_MBOX_COUNT]; /* Mailbox registers */
 556         uint16_t fpm_diag_config;
 557         uint16_t pcr;           /* Processor Control Register. */
 558         uint16_t mctr;          /* Memory Configuration and Timing. */
 559         uint16_t fb_cmd;
 560         uint16_t hccr;          /* Host command & control register. */
 561         uint16_t gpiod;         /* GPIO Data register. */
 562         uint16_t gpioe;         /* GPIO Enable register. */
 563         uint16_t host_to_host_sema;     /* 2312 resource lock register */
 564         uint16_t pri_req_in;    /* 2400 */
 565         uint16_t pri_req_out;   /* 2400 */
 566         uint16_t atio_req_in;   /* 2400 */
 567         uint16_t atio_req_out;  /* 2400 */
 568         uint16_t io_base_addr;  /* 2400 */
 569         uint16_t nx_host_int;   /* NetXen */
 570         uint16_t nx_risc_int;   /* NetXen */
 571 } reg_off_t;
 572 
 573 /*
 574  * Multi-Queue, Mem BAR 2 definition.
 575  */
 576 #define MBAR2_REQ_IN            0x0
 577 #define MBAR2_REQ_OUT           0x4
 578 #define MBAR2_RESP_IN           0x8
 579 #define MBAR2_RESP_OUT          0xc
 580 #define MBAR2_MULTI_Q_MAX       256
 581 #define MBAR2_REG_OFFSET        4096
 582 
 583 /*
 584  * Mbox-8 read maximum debounce count.
 585  * Reading Mbox-8 could be debouncing, before getting stable value.
 586  * This is the recommended driver fix from Qlogic along with firmware fix.
 587  * During testing, maximum count did not cross 3.
 588  */
 589 #define QL_MAX_DEBOUNCE 10
 590 
 591 /*
 592  * Control Status register definitions
 593  */
 594 #define ISP_FUNC_NUM_MASK       (BIT_15 | BIT_14)
 595 #define ISP_FLASH_64K_BANK      BIT_3   /* Flash BIOS 64K Bank Select */
 596 #define ISP_FLASH_ENABLE        BIT_1   /* Flash BIOS Read/Write enable */
 597 #define ISP_RESET               BIT_0   /* ISP soft reset */
 598 
 599 /*
 600  * Control Status 24xx register definitions
 601  */
 602 #define FLASH_NVRAM_ACCESS_ERROR        BIT_18
 603 #define DMA_ACTIVE                      BIT_17
 604 #define DMA_SHUTDOWN                    BIT_16
 605 #define FUNCTION_NUMBER                 BIT_15
 606 
 607 #define MWB_4096_BYTES                  (BIT_5 | BIT_4)
 608 #define MWB_2048_BYTES                  BIT_5
 609 #define MWB_1024_BYTES                  BIT_4
 610 #define MWB_512_BYTES                   0
 611 
 612 /*
 613  * Interrupt Control register definitions
 614  */
 615 #define ISP_EN_INT              BIT_15  /* ISP enable interrupts. */
 616 #define ISP_EN_RISC             BIT_3   /* ISP enable RISC interrupts. */
 617 
 618 /*
 619  * Interrupt Status register definitions
 620  */
 621 #define RISC_INT                BIT_3   /* RISC interrupt */
 622 
 623 /*
 624  * NetXen Host/Risc Interrupt register definitions
 625  */
 626 #define NX_MBX_CMD              BIT_0   /* Mailbox command present */
 627 #define NX_RISC_INT             BIT_0   /* RISC interrupt present */
 628 
 629 /*
 630  * NVRAM register definitions.
 631  */
 632 #define NV_DESELECT             0
 633 #define NV_CLOCK                BIT_0
 634 #define NV_SELECT               BIT_1
 635 #define NV_DATA_OUT             BIT_2
 636 #define NV_DATA_IN              BIT_3
 637 #define NV_PR_ENABLE            BIT_13  /* protection register enable */
 638 #define NV_WR_ENABLE            BIT_14  /* write enable */
 639 #define NV_BUSY                 BIT_15
 640 
 641 /*
 642  * Flash/NVRAM 24xx definitions
 643  */
 644 #define FLASH_DATA_FLAG         BIT_31
 645 #define FLASH_CONF_ADDR         0x7FFD0000
 646 #define FLASH_24_25_DATA_ADDR   0x7FF00000
 647 #define FLASH_8100_DATA_ADDR    0x7F800000
 648 #define FLASH_8300_DATA_ADDR    0x7F800000
 649 #define FLASH_2700_DATA_ADDR    0x7F800000
 650 #define FLASH_ADDR_MASK         0x7FFF0000
 651 
 652 #define NVRAM_CONF_ADDR         0x7FFF0000
 653 #define NVRAM_DATA_ADDR         0x7FFE0000
 654 
 655 #define NVRAM_2200_FUNC0_ADDR           0x0
 656 #define NVRAM_2300_FUNC0_ADDR           0x0
 657 #define NVRAM_2300_FUNC1_ADDR           0x80
 658 #define NVRAM_2400_FUNC0_ADDR           0x80
 659 #define NVRAM_2400_FUNC1_ADDR           0x180
 660 #define NVRAM_2500_FUNC0_ADDR           0x48080
 661 #define NVRAM_2500_FUNC1_ADDR           0x48180
 662 #define NVRAM_8100_FUNC0_ADDR           0xD0080
 663 #define NVRAM_8100_FUNC1_ADDR           0xD0180
 664 #define NVRAM_8021_FUNC0_ADDR           0xF0080
 665 #define NVRAM_8021_FUNC1_ADDR           0xF0180
 666 #define NVRAM_8300_FC_FUNC0_ADDR        0x270080
 667 #define NVRAM_8300_FC_FUNC1_ADDR        0x270180
 668 #define NVRAM_8300_FCOE_FUNC0_ADDR      0x274080
 669 #define NVRAM_8300_FCOE_FUNC1_ADDR      0x274180
 670 #define NVRAM_2700_FUNC0_ADDR           0x270080
 671 #define NVRAM_2700_FUNC1_ADDR           0x270180
 672 #define NVRAM_2700_FUNC2_ADDR           0x270280
 673 #define NVRAM_2700_FUNC3_ADDR           0x270380
 674 
 675 #define VPD_2400_FUNC0_ADDR             0
 676 #define VPD_2400_FUNC1_ADDR             0x100
 677 #define VPD_2500_FUNC0_ADDR             0x48000
 678 #define VPD_2500_FUNC1_ADDR             0x48100
 679 #define VPD_8100_FUNC0_ADDR             0xD0000
 680 #define VPD_8100_FUNC1_ADDR             0xD0400
 681 #define VPD_8021_FUNC0_ADDR             0xFA300
 682 #define VPD_8021_FUNC1_ADDR             0xFA300
 683 #define VPD_8300_FC_FUNC0_ADDR          0x270000
 684 #define VPD_8300_FC_FUNC1_ADDR          0x270100
 685 #define VPD_8300_FCOE_FUNC0_ADDR        0xFA300
 686 #define VPD_8300_FCOE_FUNC1_ADDR        0xFA300
 687 #define VPD_2700_FUNC0_ADDR             0x270000
 688 #define VPD_2700_FUNC1_ADDR             0x270100
 689 #define VPD_2700_FUNC2_ADDR             0x270200
 690 #define VPD_2700_FUNC3_ADDR             0x270300
 691 #define VPD_SIZE                        0x80
 692 
 693 #define FLASH_2200_FIRMWARE_ADDR        0x20000
 694 #define FLASH_2300_FIRMWARE_ADDR        0x20000
 695 #define FLASH_2400_FIRMWARE_ADDR        0x20000
 696 #define FLASH_2500_FIRMWARE_ADDR        0x20000
 697 #define FLASH_8100_FIRMWARE_ADDR        0xA0000
 698 #define FLASH_8021_FIRMWARE_ADDR        0x40000
 699 #define FLASH_8021_FIRMWARE_SIZE        0x80000
 700 #define FLASH_8300_FC_FIRMWARE_ADDR     0x240000
 701 #define FLASH_8300_FCOE_FIRMWARE_ADDR   0x220000
 702 #define FLASH_8300_FIRMWARE_SIZE        0x20000
 703 #define FLASH_2700_FIRMWARE_ADDR        0x240000
 704 #define FLASH_2700_FIRMWARE_SIZE        0x20000
 705 
 706 #define FLASH_8021_BOOTLOADER_ADDR      0x4000
 707 #define FLASH_8021_BOOTLOADER_SIZE      0x8000
 708 #define FLASH_8300_BOOTLOADER_ADDR      0x4000
 709 #define FLASH_8300_BOOTLOADER_SIZE      0x8000
 710 
 711 #define FLASH_2200_BOOT_CODE_ADDR       0
 712 #define FLASH_2300_BOOT_CODE_ADDR       0
 713 #define FLASH_2400_BOOT_CODE_ADDR       0
 714 #define FLASH_2500_BOOT_CODE_ADDR       0
 715 #define FLASH_2700_BOOT_CODE_ADDR       0x200000
 716 #define FLASH_8100_BOOT_CODE_ADDR       0x80000
 717 #define FLASH_8021_BOOT_CODE_ADDR       0x20000
 718 #define FLASH_8300_BOOT_CODE_ADDR       0x200000
 719 
 720 #define BEACON_8300_FC_FUNC0_ADDR       0x00201320
 721 #define BEACON_8300_FC_FUNC1_ADDR       0x00201328
 722 #define BEACON_8300_FCOE_FUNC0_ADDR     0x00201324
 723 #define BEACON_8300_FCOE_FUNC1_ADDR     0x0020132c
 724 #define BEACON_2700_FUNC0_ADDR          0x00201320
 725 #define BEACON_2700_FUNC1_ADDR          0x00201328
 726 #define BEACON_2700_FUNC2_ADDR          0x00201330
 727 #define BEACON_2700_FUNC3_ADDR          0x00201338
 728 
 729 #define FLASH_2400_ERRLOG_START_ADDR_0  0
 730 #define FLASH_2400_ERRLOG_START_ADDR_1  0
 731 #define FLASH_2500_ERRLOG_START_ADDR_0  0x54000
 732 #define FLASH_2500_ERRLOG_START_ADDR_1  0x54400
 733 #define FLASH_8100_ERRLOG_START_ADDR_0  0xDC000
 734 #define FLASH_8100_ERRLOG_START_ADDR_1  0xDC400
 735 #define FLASH_8300_ERRLOG_START_ADDR_0  0x280000
 736 #define FLASH_8300_ERRLOG_START_ADDR_1  0x280400
 737 #define FLASH_ERRLOG_SIZE               0x200
 738 #define FLASH_ERRLOG_ENTRY_SIZE         4
 739 
 740 #define FLASH_2400_DESCRIPTOR_TABLE     0
 741 #define FLASH_2500_DESCRIPTOR_TABLE     0x50000
 742 #define FLASH_8100_DESCRIPTOR_TABLE     0xD8000
 743 #define FLASH_8021_DESCRIPTOR_TABLE     0
 744 #define FLASH_8300_DESCRIPTOR_TABLE     0xFC000
 745 #define FLASH_2700_DESCRIPTOR_TABLE     0xFC000
 746 
 747 #define FLASH_2400_LAYOUT_TABLE         0x11400
 748 #define FLASH_2500_LAYOUT_TABLE         0x50400
 749 #define FLASH_8100_LAYOUT_TABLE         0xD8400
 750 #define FLASH_8021_LAYOUT_TABLE         0xFC400
 751 #define FLASH_8300_LAYOUT_TABLE         0xFC400
 752 #define FLASH_2700_LAYOUT_TABLE         0xFC400
 753 
 754 /*
 755  * Flash Error Log Event Codes.
 756  */
 757 #define FLASH_ERRLOG_AEN_8002           0x8002
 758 #define FLASH_ERRLOG_AEN_8003           0x8003
 759 #define FLASH_ERRLOG_AEN_8004           0x8004
 760 #define FLASH_ERRLOG_RESET_ERR          0xF00B
 761 #define FLASH_ERRLOG_ISP_ERR            0xF020
 762 #define FLASH_ERRLOG_PARITY_ERR         0xF022
 763 #define FLASH_ERRLOG_NVRAM_CHKSUM_ERR   0xF023
 764 #define FLASH_ERRLOG_FLASH_FW_ERR       0xF024
 765 
 766 #define VPD_TAG_END             0x78
 767 #define VPD_TAG_CHKSUM          "RV"
 768 #define VPD_TAG_SN              "SN"
 769 #define VPD_TAG_PN              "PN"
 770 #define VPD_TAG_PRODID          "\x82"
 771 #define VPD_TAG_LRT             0x90
 772 #define VPD_TAG_LRTC            0x91
 773 
 774 /*
 775  * RISC to Host Status register definitions.
 776  */
 777 #define RH_RISC_INT             BIT_15          /* RISC to Host Intrpt Req */
 778 #define RH_RISC_PAUSED          BIT_8           /* RISC Paused bit. */
 779 
 780 /*
 781  * RISC to Host Status register status field definitions.
 782  */
 783 #define ROM_MBX_SUCCESS         0x01
 784 #define ROM_MBX_ERR             0x02
 785 #define MBX_SUCCESS             0x10
 786 #define MBX_ERR                 0x11
 787 #define ASYNC_EVENT             0x12
 788 #define RESP_UPDATE             0x13
 789 #define MULTI_Q_RSP_UPDATE      0x14
 790 #define SCSI_FAST_POST_16       0x15
 791 #define SCSI_FAST_POST_32       0x16
 792 #define CTIO_FAST_POST          0x17
 793 #define IP_FAST_POST_XMT        0x18
 794 #define IP_FAST_POST_RCV        0x19
 795 #define IP_FAST_POST_BRD        0x1a
 796 #define IP_FAST_POST_RCV_ALN    0x1b
 797 #define ATIO_UPDATE             0x1c
 798 #define ATIO_RESP_UPDATE        0x1d
 799 
 800 /*
 801  * HCCR commands.
 802  */
 803 #define HC_RESET_RISC           0x1000  /* Reset RISC */
 804 #define HC_PAUSE_RISC           0x2000  /* Pause RISC */
 805 #define HC_RELEASE_RISC         0x3000  /* Release RISC from reset. */
 806 #define HC_DISABLE_PARITY_PAUSE 0x4001  /* qla2200/2300 - disable parity err */
 807                                         /* RISC pause. */
 808 #define HC_SET_HOST_INT         0x5000  /* Set host interrupt */
 809 #define HC_CLR_HOST_INT         0x6000  /* Clear HOST interrupt */
 810 #define HC_CLR_RISC_INT         0x7000  /* Clear RISC interrupt */
 811 #define HC_HOST_INT             BIT_7   /* Host interrupt bit */
 812 #define HC_RISC_PAUSE           BIT_5   /* Pause mode bit */
 813 
 814 /*
 815  * HCCR commands for 24xx and 25xx.
 816  */
 817 #define HC24_RESET_RISC         0x10000000      /* Reset RISC */
 818 #define HC24_CLEAR_RISC_RESET   0x20000000      /* Release RISC from reset. */
 819 #define HC24_PAUSE_RISC         0x30000000      /* Pause RISC */
 820 #define HC24_RELEASE_PAUSE      0x40000000      /* Release RISC from pause */
 821 #define HC24_SET_HOST_INT       0x50000000      /* Set host interrupt */
 822 #define HC24_CLR_HOST_INT       0x60000000      /* Clear HOST interrupt */
 823 #define HC24_CLR_RISC_INT       0xA0000000      /* Clear RISC interrupt */
 824 #define HC24_HOST_INT           BIT_6           /* Host to RISC intrpt bit */
 825 #define HC24_RISC_RESET         BIT_5           /* RISC Reset mode bit. */
 826 
 827 /*
 828  * ISP Initialization Control Blocks.
 829  * Little endian except where noted.
 830  */
 831 #define ICB_VERSION             1
 832 typedef struct ql_init_cb {
 833         uint8_t version;
 834         uint8_t reserved;
 835 
 836         /*
 837          * LSB BIT 0  = enable_hard_loop_id
 838          * LSB BIT 1  = enable_fairness
 839          * LSB BIT 2  = enable_full_duplex
 840          * LSB BIT 3  = enable_fast_posting
 841          * LSB BIT 4  = enable_target_mode
 842          * LSB BIT 5  = disable_initiator_mode
 843          * LSB BIT 6  = enable_adisc
 844          * LSB BIT 7  = enable_target_inquiry_data
 845          *
 846          * MSB BIT 0  = enable_port_update_ae
 847          * MSB BIT 1  = disable_initial_lip
 848          * MSB BIT 2  = enable_decending_soft_assign
 849          * MSB BIT 3  = previous_assigned_addressing
 850          * MSB BIT 4  = enable_stop_q_on_full
 851          * MSB BIT 5  = enable_full_login_on_lip
 852          * MSB BIT 6  = enable_node_name
 853          * MSB BIT 7  = extended_control_block
 854          */
 855         uint8_t firmware_options[2];
 856 
 857         uint8_t max_frame_length[2];
 858         uint8_t max_iocb_allocation[2];
 859         uint8_t execution_throttle[2];
 860         uint8_t login_retry_count;
 861         uint8_t retry_delay;                    /* unused */
 862         uint8_t port_name[8];                   /* Big endian. */
 863         uint8_t hard_address[2];                /* option bit 0 */
 864         uint8_t inquiry;                        /* option bit 7 */
 865         uint8_t login_timeout;
 866         uint8_t node_name[8];                   /* Big endian */
 867         uint8_t request_q_outpointer[2];
 868         uint8_t response_q_inpointer[2];
 869         uint8_t request_q_length[2];
 870         uint8_t response_q_length[2];
 871         uint8_t request_q_address[8];
 872         uint8_t response_q_address[8];
 873         uint8_t lun_enables[2];
 874         uint8_t command_resouce_count;
 875         uint8_t immediate_notify_resouce_count;
 876         uint8_t timeout[2];
 877         uint8_t reserved_2[2];
 878 
 879         /*
 880          * LSB BIT 0 = Timer operation mode bit 0
 881          * LSB BIT 1 = Timer operation mode bit 1
 882          * LSB BIT 2 = Timer operation mode bit 2
 883          * LSB BIT 3 = Timer operation mode bit 3
 884          * LSB BIT 4 = P2P Connection option bit 0
 885          * LSB BIT 5 = P2P Connection option bit 1
 886          * LSB BIT 6 = P2P Connection option bit 2
 887          * LSB BIT 7 = Enable Non part on LIHA failure
 888          *
 889          * MSB BIT 0 = Enable class 2
 890          * MSB BIT 1 = Enable ACK0
 891          * MSB BIT 2 =
 892          * MSB BIT 3 =
 893          * MSB BIT 4 = FC Tape Enable
 894          * MSB BIT 5 = Enable FC Confirm
 895          * MSB BIT 6 = Enable CRN
 896          * MSB BIT 7 =
 897          */
 898         uint8_t add_fw_opt[2];
 899 
 900         uint8_t response_accumulation_timer;
 901         uint8_t interrupt_delay_timer;
 902 
 903         /*
 904          * LSB BIT 0 = Enable Read xfr_rdy
 905          * LSB BIT 1 = Soft ID only
 906          * LSB BIT 2 =
 907          * LSB BIT 3 =
 908          * LSB BIT 4 = FCP RSP Payload [0]
 909          * LSB BIT 5 = FCP RSP Payload [1] / Sbus enable - 2200
 910          * LSB BIT 6 =
 911          * LSB BIT 7 =
 912          *
 913          * MSB BIT 0 = Sbus enable - 2300
 914          * MSB BIT 1 =
 915          * MSB BIT 2 =
 916          * MSB BIT 3 =
 917          * MSB BIT 4 =
 918          * MSB BIT 5 = enable 50 ohm termination
 919          * MSB BIT 6 = Data Rate (2300 only)
 920          * MSB BIT 7 = Data Rate (2300 only)
 921          */
 922         uint8_t special_options[2];
 923 
 924         uint8_t reserved_3[26];
 925 } ql_init_cb_t;
 926 
 927 /*
 928  * Virtual port definition.
 929  */
 930 typedef struct ql_vp_cfg {
 931         uint8_t reserved[2];
 932         uint8_t options;
 933         uint8_t hard_prev_addr;
 934         uint8_t port_name[8];
 935         uint8_t node_name[8];
 936 } ql_vp_cfg_t;
 937 
 938 /*
 939  * VP options.
 940  */
 941 #define VPO_ENABLE_SNS_LOGIN_SCR        BIT_6
 942 #define VPO_TARGET_MODE_DISABLED        BIT_5
 943 #define VPO_INITIATOR_MODE_ENABLED      BIT_4
 944 #define VPO_ENABLED                     BIT_3
 945 #define VPO_ID_NOT_ACQUIRED             BIT_2
 946 #define VPO_PREVIOUSLY_ASSIGNED_ID      BIT_1
 947 #define VPO_HARD_ASSIGNED_ID            BIT_0
 948 
 949 #define ICB_24XX_VERSION        1
 950 typedef struct ql_init_24xx_cb {
 951         uint8_t version[2];
 952         uint8_t reserved_1[2];
 953         uint8_t max_frame_length[2];
 954         uint8_t execution_throttle[2];
 955         uint8_t exchange_count[2];
 956         uint8_t hard_address[2];
 957         uint8_t port_name[8];   /* Big endian. */
 958         uint8_t node_name[8];   /* Big endian. */
 959 
 960         uint8_t response_q_inpointer[2];
 961         uint8_t request_q_outpointer[2];
 962 
 963         uint8_t login_retry_count[2];
 964 
 965         uint8_t prio_request_q_outpointer[2];
 966 
 967         uint8_t response_q_length[2];
 968         uint8_t request_q_length[2];
 969 
 970         uint8_t link_down_on_nos[2];
 971 
 972         uint8_t prio_request_q_length[2];
 973         uint8_t request_q_address[8];
 974         uint8_t response_q_address[8];
 975         uint8_t prio_request_q_address[8];
 976         uint8_t msi_x_vector[2];
 977         uint8_t reserved_2[6];
 978         uint8_t atio_q_inpointer[2];
 979         uint8_t atio_q_length[2];
 980         uint8_t atio_q_address[8];
 981 
 982         uint8_t interrupt_delay_timer[2];       /* 100us per */
 983         uint8_t login_timeout[2];
 984         /*
 985          * BIT 0  = Hard Assigned Loop ID
 986          * BIT 1  = Enable Fairness
 987          * BIT 2  = Enable Full-Duplex
 988          * BIT 3  = Reserved
 989          * BIT 4  = Target Mode Enable
 990          * BIT 5  = Initiator Mode Disable
 991          * BIT 6  = Reserved
 992          * BIT 7  = Reserved
 993          *
 994          * BIT 8  = Reserved
 995          * BIT 9  = Disable Initial LIP
 996          * BIT 10 = Descending Loop ID Search
 997          * BIT 11 = Previous Assigned Loop ID
 998          * BIT 12 = Reserved
 999          * BIT 13 = Full Login after LIP
1000          * BIT 14 = Node Name Option
1001          * BIT 15-31 = Reserved
1002          */
1003         uint8_t firmware_options_1[4];
1004 
1005         /*
1006          * BIT 0  = Operation Mode bit 0
1007          * BIT 1  = Operation Mode bit 1
1008          * BIT 2  = Operation Mode bit 2
1009          * BIT 3  = Operation Mode bit 3
1010          * BIT 4  = Connection Options bit 0
1011          * BIT 5  = Connection Options bit 1
1012          * BIT 6  = Connection Options bit 2
1013          * BIT 7  = Enable Non part on LIHA failure
1014          *
1015          * BIT 8  = Enable Class 2
1016          * BIT 9  = Enable ACK0
1017          * BIT 10 = Reserved
1018          * BIT 11 = Enable FC-SP Security
1019          * BIT 12 = FC Tape Enable
1020          * BIT 13 = Reserved
1021          * BIT 14 = Target PRLI Control
1022          * BIT 15 = Reserved
1023          *
1024          * BIT 16  = Enable Emulated MSIX
1025          * BIT 17  = Reserved
1026          * BIT 18  = Enable Alternate Device Number
1027          * BIT 19  = Enable Alternate Bus Number
1028          * BIT 20  = Enable Translated Address
1029          * BIT 21  = Enable VM Security
1030          * BIT 22  = Enable Interrupt Handshake
1031          * BIT 23  = Enable Multiple Queue
1032          *
1033          * BIT 24  = IOCB Security
1034          * BIT 25  = qos
1035          * BIT 26-31 = Reserved
1036          */
1037         uint8_t firmware_options_2[4];
1038 
1039         /*
1040          * BIT 0  = Reserved
1041          * BIT 1  = Soft ID only
1042          * BIT 2  = Reserved
1043          * BIT 3  = Reserved
1044          * BIT 4  = FCP RSP Payload bit 0
1045          * BIT 5  = FCP RSP Payload bit 1
1046          * BIT 6  = Enable Rec Out-of-Order data frame handling
1047          * BIT 7  = Disable Automatic PLOGI on Local Loop
1048          *
1049          * BIT 8  = Reserved
1050          * BIT 9  = Enable Out-of-Order FCP_XFER_RDY relative
1051          *          offset handling
1052          * BIT 10 = Reserved
1053          * BIT 11 = Reserved
1054          * BIT 12 = Reserved
1055          * BIT 13 = Data Rate bit 0
1056          * BIT 14 = Data Rate bit 1
1057          * BIT 15 = Data Rate bit 2
1058          *
1059          * BIT 16 = 75-ohm Termination Select
1060          * BIT 17 = Enable Multiple FCFs
1061          * BIT 18 = MAC Addressing Mode
1062          * BIT 19 = MAC Addressing Mode
1063          * BIT 20 = MAC Addressing Mode
1064          * BIT 21 = Ethernet Data Rate
1065          * BIT 22 = Ethernet Data Rate
1066          * BIT 23 = Ethernet Data Rate
1067          *
1068          * BIT 24 = Ethernet Data Rate
1069          * BIT 25 = Ethernet Data Rate
1070          * BIT 26 = Enable Ethernet Header ATIO Queue
1071          * BIT 27 = Enable Ethernet Header Response Queue
1072          * BIT 28 = SPMA Selection
1073          * BIT 29 = SPMA Selection
1074          * BIT 30 = Reserved
1075          * BIT 31 = Reserved
1076          */
1077         uint8_t firmware_options_3[4];
1078 
1079         uint8_t qos[2];
1080         uint8_t rid[2];
1081 
1082         uint8_t reserved_3[4];
1083 
1084         uint8_t enode_mac_addr[6];
1085 
1086         uint8_t reserved_4[10];
1087 
1088         /*
1089          * Multi-ID firmware.
1090          */
1091         uint8_t vp_count[2];
1092 
1093         /*
1094          * BIT 1  = Allows mode 2 connection option
1095          */
1096         uint8_t         global_vp_option[2];
1097 
1098         ql_vp_cfg_t     vpc[MAX_25_VIRTUAL_PORTS + 1];
1099 
1100         /*
1101          * Extended Initialization Control Block
1102          */
1103         ql_ext_icb_8100_t       ext_blk;
1104 } ql_init_24xx_cb_t;
1105 
1106 typedef union ql_comb_init_cb {
1107         ql_init_cb_t            cb;
1108         ql_init_24xx_cb_t       cb24;
1109 } ql_comb_init_cb_t;
1110 
1111 /*
1112  * ISP IP Initialization Control Block.
1113  * Little endian except where noted.
1114  */
1115 #define IP_ICB_VERSION  1
1116 typedef struct ql_ip_init_cb {
1117         uint8_t version;
1118         uint8_t reserved;
1119 
1120         /*
1121          * LSB BIT 0  = receive_buffer_address_length
1122          * LSB BIT 1  = fast post broadcast received
1123          * LSB BIT 2  = allow out of receive buffers AE
1124          */
1125         uint8_t ip_firmware_options[2];
1126         uint8_t ip_header_size[2];
1127         uint8_t mtu_size[2];                    /* max value is 65280 */
1128         uint8_t buf_size[2];
1129         uint8_t reserved_1[8];
1130         uint8_t queue_size[2];                  /* 8-1024 */
1131         uint8_t low_water_mark[2];
1132         uint8_t queue_address[8];
1133         uint8_t queue_inpointer[2];
1134         uint8_t fast_post_reg_count[2];         /* 0-14 */
1135         uint8_t cc[2];
1136         uint8_t reserved_2[28];
1137 } ql_ip_init_cb_t;
1138 
1139 #define IP_ICB_24XX_VERSION     1
1140 typedef struct ql_ip_init_24xx_cb {
1141         uint8_t version;
1142         uint8_t reserved;
1143         /*
1144          * LSB BIT 2  = allow out of receive buffers AE
1145          */
1146         uint8_t ip_firmware_options[2];
1147         uint8_t ip_header_size[2];
1148         uint8_t mtu_size[2];
1149         uint8_t buf_size[2];
1150         uint8_t reserved_1[10];
1151         uint8_t low_water_mark[2];
1152         uint8_t reserved_3[12];
1153         uint8_t cc[2];
1154         uint8_t reserved_2[28];
1155 } ql_ip_init_24xx_cb_t;
1156 
1157 typedef union ql_comb_ip_init_cb {
1158         ql_ip_init_cb_t         cb;
1159         ql_ip_init_24xx_cb_t    cb24;
1160 } ql_comb_ip_init_cb_t;
1161 
1162 /*
1163  * f/w module table
1164  */
1165 struct fw_table {
1166         uint32_t        fw_class;
1167         int8_t          *fw_version;
1168 };
1169 
1170 /*
1171  * DMA memory type.
1172  */
1173 typedef enum mem_alloc_type {
1174         UNKNOWN_MEMORY,
1175         TASK_MEMORY,
1176         LITTLE_ENDIAN_DMA,
1177         BIG_ENDIAN_DMA,
1178         KERNEL_MEM,
1179         NO_SWAP_DMA
1180 } mem_alloc_type_t;
1181 
1182 /*
1183  * DMA memory alignment type.
1184  */
1185 typedef enum men_align_type {
1186         QL_DMA_DATA_ALIGN,
1187         QL_DMA_RING_ALIGN,
1188 } mem_alignment_t;
1189 
1190 /*
1191  * DMA memory object.
1192  */
1193 typedef struct dma_mem {
1194         uint64_t                alignment;
1195         void                    *bp;
1196         ddi_dma_cookie_t        *cookies;
1197         ddi_acc_handle_t        acc_handle;
1198         ddi_dma_handle_t        dma_handle;
1199         ddi_dma_cookie_t        cookie;
1200         uint32_t                max_cookie_count;
1201         uint32_t                cookie_count;
1202         uint32_t                size;
1203         uint32_t                memflags;
1204         mem_alloc_type_t        type;
1205         uint32_t                flags;          /* Solaris DMA flags. */
1206 } dma_mem_t;
1207 
1208 /*
1209  * 24 bit port ID type definition.
1210  */
1211 typedef union {
1212         struct {
1213                 uint8_t d_id[3];
1214                 uint8_t rsvd_1;
1215         }r;
1216 
1217         uint32_t        b24 : 24;
1218 
1219 #if defined(_BIT_FIELDS_LTOH)
1220         struct {
1221                 uint8_t al_pa;
1222                 uint8_t area;
1223                 uint8_t domain;
1224                 uint8_t rsvd_1;
1225         }b;
1226 #elif defined(_BIT_FIELDS_HTOL)
1227         struct {
1228                 uint8_t domain;
1229                 uint8_t area;
1230                 uint8_t al_pa;
1231                 uint8_t rsvd_1;
1232         }b;
1233 #else
1234 #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
1235 #endif
1236 } port_id_t;
1237 
1238 /*
1239  * Link list definitions.
1240  */
1241 typedef struct ql_link {
1242         struct ql_link  *prev;
1243         struct ql_link  *next;
1244         void            *base_address;
1245         struct ql_head  *head;  /* the queue this link is on */
1246 } ql_link_t;
1247 
1248 typedef struct ql_head {
1249         ql_link_t       *first;
1250         ql_link_t       *last;
1251 } ql_head_t;
1252 
1253 /*
1254  * ISP request queue context
1255  */
1256 typedef struct ql_request_q {
1257         struct cmd_entry        *req_ring_ptr;
1258         dma_mem_t               req_ring;
1259         uint32_t                *req_out_shadow_ptr;
1260         uint32_t                req_out_shadow_ofst;
1261         uint32_t                mbar_req_in;
1262         uint32_t                mbar_req_out;
1263         uint16_t                req_ring_index;
1264         uint16_t                req_entry_cnt;
1265         uint16_t                req_q_cnt;      /* # of available entries. */
1266         uint16_t                req_q_number;
1267 } ql_request_q_t;
1268 
1269 /*
1270  * ISP response queue context
1271  */
1272 typedef struct ql_response_q {
1273         struct ql_srb           *status_srb;
1274         struct sts_entry        *rsp_ring_ptr;
1275         dma_mem_t               rsp_ring;
1276         kmutex_t                intr_mutex;
1277         uint32_t                *rsp_in_shadow_ptr;
1278         uint32_t                rsp_in_shadow_ofst;
1279         uint32_t                mbar_rsp_in;
1280         uint32_t                mbar_rsp_out;
1281         uint16_t                rsp_ring_index;
1282         uint16_t                rsp_entry_cnt;
1283         uint16_t                isp_rsp_index;
1284         uint16_t                rsp_q_number;
1285         uint16_t                msi_x_vector;
1286 } ql_response_q_t;
1287 
1288 /*
1289  * This is the per-command structure
1290  */
1291 typedef struct ql_srb {
1292         /* Command link. */
1293         ql_link_t               cmd;
1294 
1295         /* Watchdog link and timer. */
1296         ql_link_t               wdg;
1297         time_t                  wdg_q_time;
1298         time_t                  init_wdg_q_time;
1299         uint16_t                isp_timeout;
1300 
1301         /* FCA and FC Transport data. */
1302         fc_packet_t             *pkt;
1303         struct ql_adapter_state *ha;
1304         uint32_t                magic_number;
1305 
1306         /* unsolicited buffer context. */
1307         dma_mem_t               ub_buffer;
1308         uint32_t                ub_type;
1309         uint32_t                ub_size;
1310 
1311         /* FCP command. */
1312         fcp_cmd_t               *fcp;
1313 
1314         /* Request sense. */
1315         uint32_t                request_sense_length;
1316         caddr_t                 request_sense_ptr;
1317 
1318         /* Device queue pointer. */
1319         struct ql_lun           *lun_queue;
1320 
1321         /* Command state/status flags. */
1322         volatile uint32_t       flags;
1323 
1324         /* Command IOCB context. */
1325         void                    (*iocb)(struct ql_adapter_state *,
1326             ql_request_q_t *, struct ql_srb *, void *);
1327         struct cmd_entry        *request_ring_ptr;
1328         uint32_t                handle;
1329         uint16_t                req_q_number;
1330         uint16_t                req_cnt;
1331         uint8_t                 retry_count;
1332         uint8_t                 rsp_q_number;
1333         dma_mem_t               sg_dma;
1334 } ql_srb_t;
1335 
1336 #define SRB_ISP_STARTED         BIT_0 /* Command sent to ISP. */
1337 #define SRB_ISP_COMPLETED       BIT_1 /* ISP finished with command. */
1338 #define SRB_RETRY               BIT_2 /* Driver retrying command. */
1339 #define SRB_POLL                BIT_3 /* Poll for completion. */
1340 
1341 #define SRB_WATCHDOG_ENABLED    BIT_4 /* Command on watchdog list. */
1342 #define SRB_ELS_PKT             BIT_5 /* Extended Link Services pkt */
1343 #define SRB_UB_IN_FCA           BIT_6 /* FCA holds unsolicited buffer */
1344 #define SRB_UB_IN_ISP           BIT_7 /* ISP holds unsolicited buffer */
1345 
1346 #define SRB_UB_CALLBACK         BIT_8 /* Unsolicited callback needed. */
1347 #define SRB_UB_RSCN             BIT_9 /* Unsolicited RSCN callback. */
1348 #define SRB_UB_FCP              BIT_10 /* Unsolicited RSCN callback. */
1349 #define SRB_FCP_CMD_PKT         BIT_11 /* FCP command type packet. */
1350 
1351 #define SRB_FCP_DATA_PKT        BIT_12 /* FCP data type packet. */
1352 #define SRB_FCP_RSP_PKT         BIT_13 /* FCP response type packet. */
1353 #define SRB_IP_PKT              BIT_14 /* IP type packet. */
1354 #define SRB_GENERIC_SERVICES_PKT BIT_15 /* Generic services type packet */
1355 
1356 #define SRB_COMMAND_TIMEOUT     BIT_16 /* Command timed out. */
1357 #define SRB_ABORTING            BIT_17 /* SRB aborting. */
1358 #define SRB_IN_DEVICE_QUEUE     BIT_18 /* In Device Queue */
1359 #define SRB_IN_TOKEN_ARRAY      BIT_19 /* In Token Array */
1360 
1361 #define SRB_UB_FREE_REQUESTED   BIT_20 /* UB Free requested */
1362 #define SRB_UB_ACQUIRED         BIT_21 /* UB selected for upcall */
1363 #define SRB_MS_PKT              BIT_22 /* Management Service pkt */
1364 
1365 /*
1366  * This byte will be used to define flags for the LUN on the target.
1367  * Presently, we have untagged-command as one flag. Others can be
1368  * added later, if needed.
1369  */
1370 typedef struct tgt_lun_flags {
1371         uint8_t
1372                 untagged_pending:1,
1373                 unused_bits:7;
1374 } tgt_lun_flags_t;
1375 
1376 #define QL_IS_UNTAGGED_PENDING(q, lun_num) \
1377         ((q->lun_flags[lun_num].untagged_pending == TRUE) ? 1 : 0)
1378 #define QL_SET_UNTAGGED_PENDING(q, lun_num) \
1379         (q->lun_flags[lun_num].untagged_pending = TRUE)
1380 #define QL_CLEAR_UNTAGGED_PENDING(q, lun_num) \
1381         (q->lun_flags[lun_num].untagged_pending = FALSE)
1382 
1383 /*
1384  * Fibre Channel LUN Queue structure
1385  */
1386 typedef struct ql_lun {
1387         /* Head command link. */
1388         ql_head_t               cmd;
1389 
1390         struct ql_target        *target_queue;
1391 
1392         uint32_t                flags;
1393 
1394         /* LUN execution throttle. */
1395         uint16_t                lun_outcnt;
1396 
1397         /* LUN number as reported by REPORT LUNS */
1398         uint16_t                lun_no;
1399 
1400         /*
1401          * Logical unit number in SCSI3 format, also
1402          * referred to as FCP lun or FCP entity address.
1403          */
1404         uint64_t                lun_addr;
1405 
1406         ql_link_t               link;
1407 } ql_lun_t;
1408 
1409 /*
1410  * LUN Queue flags
1411  */
1412 #define LQF_UNTAGGED_PENDING    BIT_0
1413 
1414 /*
1415  * SCSI standard defined lun addressing methods.
1416  */
1417 #define QL_LUN_AM_MASK          0xC0    /* Address Method Mask */
1418 #define QL_LUN_AM_PDEV          0x00    /* Peripheral device AM */
1419 #define QL_LUN_AM_FLAT          0x40    /* Flat space AM */
1420 #define QL_LUN_AM_LUN           0x80    /* Logical unit AM */
1421 #define QL_LUN_AM_EFLAT         0xC0    /* Extended flat space AM */
1422 #define QL_LUN_AM_ELUN          0xC0    /* Extended logical unit AM */
1423 
1424 /*
1425  * Fibre Channel Device Queue structure
1426  */
1427 typedef struct ql_target {
1428         /* Device queue lock. */
1429         kmutex_t                mutex;
1430 
1431         volatile uint32_t       flags;
1432         port_id_t               d_id;
1433         uint16_t                loop_id;
1434         volatile uint16_t       outcnt;         /* # of cmds running in ISP */
1435         uint32_t                iidma_rate;
1436 
1437         /* Device link. */
1438         ql_link_t               device;
1439 
1440         /* Head watchdog link. */
1441         ql_head_t               wdg;
1442 
1443         /* Unsolicited buffer IP data. */
1444         uint32_t                ub_frame_ro;
1445         uint16_t                ub_sequence_length;
1446         uint16_t                ub_loop_id;
1447         uint8_t                 ub_total_seg_cnt;
1448         uint8_t                 ub_seq_cnt;
1449         uint8_t                 ub_seq_id;
1450 
1451         /* Port down retry counter. */
1452         uint16_t                port_down_retry_count;
1453         uint16_t                qfull_retry_count;
1454 
1455         /* logout sent state */
1456         uint8_t                 logout_sent;
1457 
1458         /* Data from Port database matches machine type. */
1459         uint8_t                 master_state;
1460         uint8_t                 slave_state;
1461         port_id_t               hard_addr;
1462         uint8_t                 port_name[8];
1463         uint8_t                 node_name[8];
1464         uint16_t                cmn_features;
1465         uint16_t                conc_sequences;
1466         uint16_t                relative_offset;
1467         uint16_t                class3_recipient_ctl;
1468         uint16_t                class3_rcv_data_size;
1469         uint16_t                class3_conc_sequences;
1470         uint16_t                class3_open_sequences_per_exch;
1471         uint16_t                prli_payload_length;
1472         uint16_t                prli_svc_param_word_0;
1473         uint16_t                prli_svc_param_word_3;
1474 
1475         /* LUN context. */
1476         ql_head_t               lun_queues;
1477         ql_lun_t                *last_lun_queue;
1478 } ql_tgt_t;
1479 
1480 /*
1481  * Target Queue flags
1482  */
1483 #define TQF_TAPE_DEVICE         BIT_0
1484 #define TQF_QUEUE_SUSPENDED     BIT_1  /* Queue suspended. */
1485 #define TQF_FABRIC_DEVICE       BIT_2
1486 #define TQF_INITIATOR_DEVICE    BIT_3
1487 #define TQF_RSCN_RCVD           BIT_4
1488 #define TQF_NEED_AUTHENTICATION BIT_5
1489 #define TQF_PLOGI_PROGRS        BIT_6
1490 #define TQF_IIDMA_NEEDED        BIT_7
1491 #define TQF_LOGIN_NEEDED        BIT_8
1492 
1493 /*
1494  * Tempoary N_Port information
1495  */
1496 typedef struct ql_n_port_info {
1497         uint16_t        n_port_handle;
1498         uint8_t         port_name[8];   /* Big endian. */
1499         uint8_t         node_name[8];   /* Big endian. */
1500         port_id_t       d_id;
1501 } ql_n_port_info_t;
1502 
1503 /*
1504  * iiDMA
1505  */
1506 #define IIDMA_RATE_INIT         0xffffffff      /* init state */
1507 #define IIDMA_RATE_NDEF         0xfffffffe      /* not defined in conf file */
1508 #define IIDMA_RATE_1GB          0x0
1509 #define IIDMA_RATE_2GB          0x1
1510 #define IIDMA_RATE_AUTO         0x2
1511 #define IIDMA_RATE_4GB          0x3
1512 #define IIDMA_RATE_8GB          0x4
1513 #define IIDMA_RATE_16GB         0x5
1514 #define IIDMA_RATE_32GB         0x6
1515 #define IIDMA_RATE_10GB         0x13
1516 #define IIDMA_RATE_MAX          IIDMA_RATE_10GB
1517 
1518 /*
1519  * Kernel statistic structure definitions.
1520  */
1521 typedef struct ql_device_stat {
1522         int logouts_recvd;
1523         int task_mgmt_failures;
1524         int data_ro_mismatches;
1525         int dl_len_mismatches;
1526 } ql_device_stat_t;
1527 
1528 typedef struct ql_adapter_24xx_stat {
1529         int version;                    /* version of this struct */
1530         int lip_count;                  /* lips forced  */
1531         int ncmds;                      /* outstanding commands */
1532         ql_adapter_revlvl_t revlvl;     /* adapter revision levels */
1533         ql_device_stat_t d_stats[MAX_24_FIBRE_DEVICES]; /* per device stats */
1534 } ql_adapter_stat_t;
1535 
1536 /*
1537  * Firmware code segment.
1538  */
1539 #define MAX_RISC_CODE_SEGMENTS 3
1540 typedef struct fw_code {
1541         caddr_t                 code;
1542         uint32_t                addr;
1543         uint32_t                length;
1544 } ql_fw_code_t;
1545 
1546 /* diagnostic els ECHO defines */
1547 #define QL_ECHO_CMD             0x10000000      /* echo opcode */
1548 #define QL_ECHO_CMD_LENGTH      220             /* command length */
1549 
1550 /* DUMP state flags. */
1551 #define QL_DUMPING              BIT_0
1552 #define QL_DUMP_VALID           BIT_1
1553 #define QL_DUMP_UPLOADED        BIT_2
1554 
1555 #define QL_LOG_ENTRIES  256             /* max # of EL entries */
1556 #define QL_LOG_LENGTH   128             /* max # of bytes in each EL entry */
1557 
1558 typedef struct ql_trace_entry {
1559         timespec_t      hs_time;        /* high resolution timestamp */
1560         char            buf[QL_LOG_LENGTH];
1561 } ql_trace_entry_t;
1562 
1563 /* per instance based extended logging trace descriptor */
1564 typedef struct el_trace_desc {
1565         kmutex_t        mutex;
1566         uint32_t        nentries; /* max number of entries */
1567         uint16_t        nindex; /* next index to fill */
1568         uint32_t        start;  /* starting point */
1569         uint32_t        end;    /* ending point */
1570         uint32_t        csize;  /* current filled queue size */
1571         uint32_t        count;  /* sequence number */
1572         size_t          trace_buffer_size;
1573         ql_trace_entry_t *trace_buffer;
1574 } ql_trace_desc_t;
1575 
1576 /*
1577  * NVRAM cache descriptor.
1578  */
1579 typedef struct nvram_cache_desc {
1580         uint32_t        valid;
1581         uint32_t        size;
1582         void            *cache;
1583 } nvram_cache_desc_t;
1584 
1585 /*
1586  * Plogi retry parameters
1587  */
1588 typedef struct plogi_params_desc {
1589         uint32_t        retry_cnt;
1590         uint32_t        retry_dly_usec;
1591 } plogi_params_desc_t;
1592 
1593 /*
1594  * ql attach progress indication
1595  */
1596 #define QL_SOFT_STATE_ALLOCED           BIT_0
1597 #define QL_REGS_MAPPED                  BIT_1
1598 #define QL_HBA_BUFFER_SETUP             BIT_2
1599 #define QL_MUTEX_CV_INITED              BIT_3
1600 #define QL_INTR_ADDED                   BIT_4
1601 #define QL_CONFIG_SPACE_SETUP           BIT_5
1602 #define QL_TASK_DAEMON_STARTED          BIT_6
1603 #define QL_KSTAT_CREATED                BIT_7
1604 #define QL_MINOR_NODE_CREATED           BIT_8
1605 #define QL_FCA_TRAN_ALLOCED             BIT_9
1606 #define QL_FCA_ATTACH_DONE              BIT_10
1607 #define QL_IOMAP_IOBASE_MAPPED          BIT_11
1608 #define QL_N_PORT_INFO_CREATED          BIT_12
1609 #define QL_DB_IOBASE_MAPPED             BIT_13
1610 #define QL_FCA_INIT_FM                  BIT_14
1611 #define QL_NVRAM_CACHE_CREATED          BIT_15
1612 #define QL_PLOGI_PARAMS_CREATED         BIT_16
1613 
1614 /* Device queue head list size (based on AL_PA address). */
1615 #define DEVICE_HEAD_LIST_SIZE   0x81
1616 
1617 struct legacy_intr_set {
1618         uint32_t        int_vec_bit;
1619         uint32_t        tgt_status_reg;
1620         uint32_t        tgt_mask_reg;
1621         uint32_t        pci_int_reg;
1622 };
1623 
1624 /* Returned Mailbox registers. */
1625 typedef struct ql_mbx_data {
1626         uint16_t        mb[MAX_MBOX_COUNT];
1627 } ql_mbx_data_t;
1628 
1629 typedef struct ql_ledstate {
1630         uint32_t        BeaconState;
1631         uint32_t        LEDflags;
1632         uint32_t        flags;
1633         uint32_t        led_blink_on;
1634         uint32_t        select;
1635         ql_mbx_data_t   cfg;
1636 } ql_ledstate_t;
1637 
1638 /*
1639  * Adapter state structure.
1640  */
1641 typedef struct ql_adapter_state {
1642         ql_link_t               hba;
1643 
1644         kmutex_t                mutex;
1645         volatile uint64_t       flags;                  /* State flags. */
1646         uint32_t                state;
1647         port_id_t               d_id;
1648         uint16_t                loop_id;
1649         uint16_t                sfp_stat;
1650         uint16_t                idle_timer;
1651         uint16_t                r_a_tov;            /* 2 * R_A_TOV + 5 */
1652         uint8_t                 topology;
1653         uint8_t                 bbcr_runtime;
1654         uint8_t                 bbcr_initial;
1655         uint8_t                 loop_down_abort_time;
1656         uint8_t                 port_retry_timer;
1657         uint8_t                 loop_down_timer;
1658         uint8_t                 watchdog_timer;
1659 
1660         /* Task Daemon context. */
1661         ql_head_t               unsol_callback_queue;
1662         ddi_taskq_t             *driver_thread_taskq;
1663         kmutex_t                task_daemon_mutex;
1664         kcondvar_t              cv_task_daemon;
1665         kcondvar_t              cv_dr_suspended;
1666         volatile uint64_t       task_daemon_flags;
1667         uint32_t                driver_thread_awake;
1668         uint64_t                df;
1669         uint64_t                sf;
1670         uint64_t                cf;
1671 
1672         /* Completion thread context */
1673         ddi_taskq_t             *completion_taskq;
1674         ql_head_t               comp_q;
1675         kmutex_t                comp_q_mutex;
1676         kcondvar_t              cv_comp_thread;
1677         uint8_t                 comp_thds_active;
1678         uint8_t                 comp_thds_awake;
1679         uint8_t                 completion_thds;
1680 
1681         /* Interrupt context. */
1682         ddi_iblock_cookie_t     iblock_cookie;
1683         ddi_intr_handle_t       *htable;
1684         uint32_t                hsize;
1685         int32_t                 intr_cnt;
1686         void                    *intr_pri;
1687         int32_t                 intr_cap;
1688         uint32_t                iflags;
1689         volatile uint8_t        intr_claimed;
1690         uint8_t                 mq_msix_vectors;
1691         uint8_t                 interrupt_count;
1692 
1693         /* Outstanding ISP commands. */
1694         ql_head_t               pending_cmds;
1695         ql_srb_t                **outstanding_cmds;
1696         uint16_t                osc_index;
1697         uint16_t                osc_max_cnt;
1698 
1699         /* ISP request queue context. */
1700         kmutex_t                req_ring_mutex;
1701         ql_request_q_t          *req_q[2];
1702 
1703         /* ISP response queue context. */
1704         ql_response_q_t         **rsp_queues;
1705         uint32_t                rsp_queues_size;
1706         uint8_t                 rsp_queues_cnt;
1707         uint8_t                 rsp_q_number;
1708         uint8_t                 io_min_rsp_q_number;
1709 
1710         /* IP receive buffer queue context. */
1711         ql_tgt_t                *rcv_dev_q;
1712         dma_mem_t               rcv_ring;
1713         struct rcvbuf           *rcvbuf_ring_ptr;
1714         uint16_t                rcvbuf_ring_index;
1715 
1716         /* Mailbox context. */
1717         kmutex_t                mbx_mutex;
1718         struct mbx_cmd          *mcp;
1719         kcondvar_t              cv_mbx_wait;
1720         kcondvar_t              cv_mbx_intr;
1721         volatile uint8_t        mailbox_flags;
1722 
1723         /* Unsolicited buffer data. */
1724         uint16_t                ub_outcnt;
1725         uint8_t                 ub_seq_id;
1726         uint8_t                 ub_command_count;
1727         uint8_t                 ub_notify_count;
1728         uint32_t                ub_allocated;
1729         kmutex_t                ub_mutex;
1730         kcondvar_t              cv_ub;
1731         fc_unsol_buf_t          **ub_array;
1732 
1733         /* Head of device queue list. */
1734         ql_head_t               *dev;
1735 
1736         /* Kernel statistics. */
1737         kstat_t                 *k_stats;
1738         ql_adapter_stat_t       *adapter_stats;
1739 
1740         /* PCI context */
1741         ddi_acc_handle_t        pci_handle;     /* config space */
1742         ddi_acc_handle_t        dev_handle;
1743         caddr_t                 iobase;
1744         ddi_acc_handle_t        iomap_dev_handle;
1745         caddr_t                 iomap_iobase;
1746         ddi_acc_handle_t        mbar_dev_handle;
1747         caddr_t                 mbar;
1748         uint32_t                mbar_size;
1749         uint32_t                mbar_queue_offset;
1750         uint16_t                device_id;
1751         uint16_t                subsys_id;
1752         uint16_t                subven_id;
1753         uint16_t                ven_id;
1754         uint16_t                pci_max_read_req;
1755         uint8_t                 rev_id;
1756         uint8_t                 pci_function_number;
1757 
1758         /* Solaris adapter configuration data */
1759         dev_info_t              *dip;
1760         fc_fca_tran_t           *tran;
1761         uint32_t                instance;
1762         int8_t                  *devpath;
1763         uint32_t                fru_hba_index;
1764         uint32_t                fru_port_index;
1765         uint8_t                 adapInfo[18];
1766 
1767         /* Adapter context */
1768         la_els_logi_t           loginparams;
1769         fc_fca_bind_info_t      bind_info;
1770         ddi_modhandle_t         fw_module;
1771         uint32_t                fw_major_version;
1772         uint32_t                fw_minor_version;
1773         uint32_t                fw_subminor_version;
1774         uint32_t                fw_attributes;
1775         uint32_t                fw_ext_attributes;
1776         uint32_t                fw_ext_memory_end;
1777         uint32_t                fw_ext_memory_size;
1778         uint32_t                fw_shared_ram_start;
1779         uint32_t                fw_shared_ram_end;
1780         uint32_t                fw_ddr_ram_start;
1781         uint32_t                fw_ddr_ram_end;
1782         uint32_t                parity_pause_errors;
1783         boolean_t               log_parity_pause;
1784         uint32_t                fw_class;
1785         uint16_t                fw_state[7];
1786         uint16_t                rom_status;
1787         ql_ledstate_t           ledstate;
1788         uint16_t                parity_hccr_err;
1789         uint32_t                parity_stat_err;
1790         reg_off_t               *reg_off;
1791         caddr_t                 risc_code;
1792         uint32_t                risc_code_size;
1793         ql_fw_code_t            risc_fw[MAX_RISC_CODE_SEGMENTS];
1794         uint32_t                risc_dump_size;
1795         void                    (*fcp_cmd)(struct ql_adapter_state *,
1796                                 ql_request_q_t *, ql_srb_t *, void *);
1797         void                    (*ip_cmd)(struct ql_adapter_state *,
1798                                 ql_request_q_t *, ql_srb_t *, void *);
1799         void                    (*ms_cmd)(struct ql_adapter_state *,
1800                                 ql_request_q_t *, ql_srb_t *, void *);
1801         void                    (*els_cmd)(struct ql_adapter_state *,
1802                                 ql_request_q_t *, ql_srb_t *, void *);
1803         uint8_t                 cmd_segs;
1804         uint8_t                 cmd_cont_segs;
1805 
1806         /* NVRAM configuration data */
1807         uint64_t                cfg_flags;
1808         ql_comb_init_cb_t       init_ctrl_blk;
1809         ql_comb_ip_init_cb_t    ip_init_ctrl_blk;
1810         uint32_t                fw_transfer_size;
1811         uint16_t                adapter_features;
1812         uint16_t                execution_throttle;
1813         uint16_t                port_down_retry_count;
1814         uint16_t                serdes_param[4];
1815         uint16_t                maximum_luns_per_target;
1816         uint8_t                 port_down_retry_delay;
1817         uint8_t                 qfull_retry_count;
1818         uint8_t                 qfull_retry_delay;
1819         uint8_t                 loop_reset_delay;
1820 
1821         /* Power management context. */
1822         kmutex_t                pm_mutex;
1823         uint32_t                pm_busy;
1824         uint8_t                 power_level;
1825         uint8_t                 pm_capable;
1826         uint8_t                 config_saved;
1827         uint8_t                 lip_on_panic;
1828 
1829         /* sbus card data */
1830         caddr_t                 sbus_fpga_iobase;
1831         ddi_acc_handle_t        sbus_fpga_dev_handle;
1832         ddi_acc_handle_t        sbus_config_handle;
1833         caddr_t                 sbus_config_base;
1834 
1835         /* XIOCTL context pointer. */
1836         struct ql_xioctl        *xioctl;
1837 
1838         struct ql_fcache        *fcache;
1839         int8_t                  *vcache;
1840         nvram_cache_desc_t      *nvram_cache;
1841 
1842         /* f/w dump mutex */
1843         uint32_t                ql_dump_size;
1844         uint32_t                ql_dump_state;
1845         void                    *ql_dump_ptr;
1846         kmutex_t                dump_mutex;
1847 
1848         uint8_t                 fwwait;
1849 
1850         dma_mem_t               fwexttracebuf;          /* extended trace  */
1851         dma_mem_t               fwfcetracebuf;          /* event trace */
1852         ql_mbx_data_t           fw_fce_trace_enable;
1853         uint32_t                fwfcetraceopt;
1854         uint32_t                flash_errlog_start;     /* 32bit word addr */
1855         uint32_t                flash_errlog_ptr;       /* 32bit word addr */
1856         uint8_t                 send_plogi_timer;
1857 
1858         /* Plogi retry parameters */
1859         plogi_params_desc_t     *plogi_params;
1860 
1861         /* Virtual port context. */
1862         fca_port_attrs_t        *pi_attrs;
1863         struct ql_adapter_state *pha;
1864         struct ql_adapter_state *vp_next;
1865         uint8_t                 vp_index;
1866         uint8_t                 max_vports;
1867 
1868         uint16_t                free_loop_id;
1869 
1870         /* Tempoary N_Port information */
1871         struct ql_n_port_info   *n_port;
1872 
1873         ql_trace_desc_t         *ql_trace_desc;
1874 
1875         uint32_t                flash_data_addr;
1876         uint32_t                flash_fw_addr;
1877         uint32_t                flash_golden_fw_addr;
1878         uint32_t                boot_code_addr;
1879         uint32_t                flash_vpd_addr;
1880         uint32_t                flash_nvram_addr;
1881         uint32_t                flash_desc_addr;
1882         uint32_t                mpi_capability_list;
1883         uint8_t                 phy_fw_major_version;
1884         uint8_t                 phy_fw_minor_version;
1885         uint8_t                 phy_fw_subminor_version;
1886         uint8_t                 mpi_fw_major_version;
1887         uint8_t                 mpi_fw_minor_version;
1888         uint8_t                 mpi_fw_subminor_version;
1889 
1890         uint16_t                idc_mb[8];
1891         uint8_t                 idc_restart_timer;
1892 
1893         /* VLAN ID and MAC address */
1894         uint8_t                 fcoe_vnport_mac[6];
1895         uint16_t                fabric_params;
1896         uint16_t                fcoe_vlan_id;
1897         uint16_t                fcoe_fcf_idx;
1898 
1899         /* NetXen context */
1900         ddi_acc_handle_t        db_dev_handle;
1901         caddr_t                 db_iobase;
1902         caddr_t                 nx_pcibase;     /* BAR0 base I/O address */
1903         uint32_t                qdr_sn_window;
1904         uint32_t                *nx_req_in;
1905         caddr_t                 db_read;
1906         uint32_t                pci_bus_addr;
1907         struct legacy_intr_set  nx_legacy_intr;
1908         uint32_t                bootloader_size;
1909         uint32_t                bootloader_addr;
1910         uint32_t                flash_fw_size;
1911         uint32_t                dev_state;
1912         uint32_t                fw_heartbeat_counter;
1913         dma_mem_t               dmp_template;
1914         uint32_t                md_capture_mask;
1915         uint32_t                md_capture_size;
1916         uint16_t                iidma_rate;
1917         uint8_t                 function_number;
1918         uint8_t                 timeout_cnt;
1919         uint8_t                 seconds_since_last_heartbeat;
1920 
1921         /* default dma attributes */
1922         ddi_dma_attr_t          bit32_io_dma_attr;
1923         ddi_dma_attr_t          bit64_io_dma_attr;
1924 
1925         ddi_dma_attr_t          io_dma_attr;
1926         ddi_dma_attr_t          fcsm_cmd_dma_attr;
1927         ddi_dma_attr_t          fcsm_rsp_dma_attr;
1928         ddi_dma_attr_t          fcip_cmd_dma_attr;
1929         ddi_dma_attr_t          fcip_rsp_dma_attr;
1930         ddi_dma_attr_t          fcp_cmd_dma_attr;
1931         ddi_dma_attr_t          fcp_rsp_dma_attr;
1932         ddi_dma_attr_t          fcp_data_dma_attr;
1933 
1934         int                     fm_capabilities;
1935         uint16_t                errlog[4];
1936 } ql_adapter_state_t;
1937 
1938 /*
1939  * adapter state flags
1940  */
1941 #define FCA_BOUND                       (uint64_t)BIT_0
1942 #define QL_OPENED                       (uint64_t)BIT_1
1943 #define ONLINE                          (uint64_t)BIT_2
1944 #define INTERRUPTS_ENABLED              (uint64_t)BIT_3
1945 
1946 #define ABORT_CMDS_LOOP_DOWN_TMO        (uint64_t)BIT_4
1947 #define POINT_TO_POINT                  (uint64_t)BIT_5
1948 #define IP_ENABLED                      (uint64_t)BIT_6
1949 #define IP_INITIALIZED                  (uint64_t)BIT_7
1950 
1951 #define MENLO_LOGIN_OPERATIONAL         (uint64_t)BIT_8
1952 #define ADAPTER_SUSPENDED               (uint64_t)BIT_9
1953 #define FW_DUMP_NEEDED                  (uint64_t)BIT_10
1954 #define PARITY_ERROR                    (uint64_t)BIT_11
1955 
1956 #define FLASH_ERRLOG_MARKER             (uint64_t)BIT_12
1957 #define VP_ENABLED                      (uint64_t)BIT_13
1958 #define FDISC_ENABLED                   (uint64_t)BIT_14
1959 #define MULTI_QUEUE                     (uint64_t)BIT_15
1960 
1961 #define MPI_RESET_NEEDED                (uint64_t)BIT_16
1962 #define VP_ID_NOT_ACQUIRED              (uint64_t)BIT_17
1963 #define IDC_STALL_NEEDED                (uint64_t)BIT_18
1964 #define POLL_INTR                       (uint64_t)BIT_19
1965 
1966 #define IDC_RESTART_NEEDED              (uint64_t)BIT_20
1967 #define IDC_ACK_NEEDED                  (uint64_t)BIT_21
1968 #define LOOPBACK_ACTIVE                 (uint64_t)BIT_22
1969 #define QUEUE_SHADOW_PTRS               (uint64_t)BIT_23
1970 
1971 #define NO_INTR_HANDSHAKE               (uint64_t)BIT_24
1972 #define COMP_THD_TERMINATE              (uint64_t)BIT_25
1973 #define DISABLE_NIC_FW_DMP              (uint64_t)BIT_26
1974 #define MULTI_CHIP_ADAPTER              (uint64_t)BIT_27
1975 
1976 /*
1977  * task daemon flags
1978  */
1979 #define TASK_DAEMON_STOP_FLG            (uint64_t)BIT_0
1980 #define TASK_DAEMON_SLEEPING_FLG        (uint64_t)BIT_1
1981 #define TASK_DAEMON_ALIVE_FLG           (uint64_t)BIT_2
1982 #define TASK_DAEMON_IDLE_CHK_FLG        (uint64_t)BIT_3
1983 
1984 #define SUSPENDED_WAKEUP_FLG            (uint64_t)BIT_4
1985 #define FC_STATE_CHANGE                 (uint64_t)BIT_5
1986 #define NEED_UNSOLICITED_BUFFERS        (uint64_t)BIT_6
1987 #define MARKER_NEEDED                   (uint64_t)BIT_7
1988 
1989 #define MARKER_ACTIVE                   (uint64_t)BIT_8
1990 #define ISP_ABORT_NEEDED                (uint64_t)BIT_9
1991 #define ABORT_ISP_ACTIVE                (uint64_t)BIT_10
1992 #define LOOP_RESYNC_NEEDED              (uint64_t)BIT_11
1993 
1994 #define LOOP_RESYNC_ACTIVE              (uint64_t)BIT_12
1995 #define LOOP_DOWN                       (uint64_t)BIT_13
1996 #define DRIVER_STALL                    (uint64_t)BIT_14
1997 #define COMMAND_WAIT_NEEDED             (uint64_t)BIT_15
1998 
1999 #define COMMAND_WAIT_ACTIVE             (uint64_t)BIT_16
2000 #define STATE_ONLINE                    (uint64_t)BIT_17
2001 #define ABORT_QUEUES_NEEDED             (uint64_t)BIT_18
2002 #define TASK_DAEMON_STALLED_FLG         (uint64_t)BIT_19
2003 
2004 #define SEND_PLOGI                      (uint64_t)BIT_20
2005 #define FIRMWARE_UP                     (uint64_t)BIT_21
2006 #define IDC_POLL_NEEDED                 (uint64_t)BIT_22
2007 #define FIRMWARE_LOADED                 (uint64_t)BIT_23
2008 
2009 #define RSCN_UPDATE_NEEDED              (uint64_t)BIT_24
2010 #define HANDLE_PORT_BYPASS_CHANGE       (uint64_t)BIT_25
2011 #define PORT_RETRY_NEEDED               (uint64_t)BIT_26
2012 #define TASK_DAEMON_POWERING_DOWN       (uint64_t)BIT_27
2013 
2014 #define TD_IIDMA_NEEDED                 (uint64_t)BIT_28
2015 #define WATCHDOG_NEEDED                 (uint64_t)BIT_29
2016 #define LED_BLINK                       (uint64_t)BIT_30
2017 
2018 #define DTF_EL_MSG_SKIP_FLGS    (IDC_POLL_NEEDED | WATCHDOG_NEEDED | \
2019     TASK_DAEMON_IDLE_CHK_FLG | LED_BLINK)
2020 /*
2021  * Mailbox flags
2022  */
2023 #define MBX_WANT_FLG                            BIT_0
2024 #define MBX_BUSY_FLG                            BIT_1
2025 #define MBX_INTERRUPT                           BIT_2
2026 #define MBX_ABORT                               BIT_3
2027 
2028 /*
2029  * Configuration flags
2030  */
2031 #define CFG_CTRL_27XX                           (uint64_t)BIT_0
2032 #define CFG_ENABLE_64BIT_ADDRESSING             (uint64_t)BIT_1
2033 #define CFG_ENABLE_LIP_RESET                    (uint64_t)BIT_2
2034 #define CFG_ENABLE_FULL_LIP_LOGIN               (uint64_t)BIT_3
2035 
2036 #define CFG_ENABLE_TARGET_RESET                 (uint64_t)BIT_4
2037 #define CFG_ENABLE_LINK_DOWN_REPORTING          (uint64_t)BIT_5
2038 #define CFG_LR_SUPPORT                          (uint64_t)BIT_6
2039 #define CFG_ENABLE_FCP_2_SUPPORT                (uint64_t)BIT_7
2040 
2041 #define CFG_CTRL_83XX                           (uint64_t)BIT_8
2042 #define CFG_SBUS_CARD                           (uint64_t)BIT_9
2043 #define CFG_CTRL_23XX                           (uint64_t)BIT_10
2044 #define CFG_CTRL_63XX                           (uint64_t)BIT_11
2045 
2046 #define CFG_CTRL_22XX                           (uint64_t)BIT_12
2047 #define CFG_CTRL_24XX                           (uint64_t)BIT_13
2048 #define CFG_CTRL_25XX                           (uint64_t)BIT_14
2049 #define CFG_ENABLE_EXTENDED_LOGGING             (uint64_t)BIT_15
2050 
2051 #define CFG_DISABLE_RISC_CODE_LOAD              (uint64_t)BIT_16
2052 #define CFG_SET_CACHE_LINE_SIZE_1               (uint64_t)BIT_17
2053 #define CFG_CTRL_MENLO                          (uint64_t)BIT_18
2054 #define CFG_EXT_FW_INTERFACE                    (uint64_t)BIT_19
2055 
2056 #define CFG_LOAD_FLASH_FW                       (uint64_t)BIT_20
2057 #define CFG_DUMP_MAILBOX_TIMEOUT                (uint64_t)BIT_21
2058 #define CFG_DUMP_ISP_SYSTEM_ERROR               (uint64_t)BIT_22
2059 #define CFG_DUMP_DRIVER_COMMAND_TIMEOUT         (uint64_t)BIT_23
2060 
2061 #define CFG_DUMP_LOOP_OFFLINE_TIMEOUT           (uint64_t)BIT_24
2062 #define CFG_ENABLE_FWEXTTRACE                   (uint64_t)BIT_25
2063 #define CFG_ENABLE_FWFCETRACE                   (uint64_t)BIT_26
2064 #define CFG_CTRL_80XX                           (uint64_t)BIT_27
2065 
2066 #define CFG_CTRL_81XX                           (uint64_t)BIT_28
2067 #define CFG_CTRL_82XX                           (uint64_t)BIT_29
2068 #define CFG_FAST_TIMEOUT                        (uint64_t)BIT_30
2069 
2070 #define CFG_CTRL_2363           (CFG_CTRL_23XX | CFG_CTRL_63XX)
2071 #define CFG_CTRL_2425           (CFG_CTRL_24XX | CFG_CTRL_25XX)
2072 #define CFG_CTRL_2783           (CFG_CTRL_27XX | CFG_CTRL_83XX)
2073 #define CFG_CTRL_8081           (CFG_CTRL_80XX | CFG_CTRL_81XX)
2074 #define CFG_CTRL_278083         (CFG_CTRL_80XX | CFG_CTRL_2783)
2075 #define CFG_CTRL_27808183       (CFG_CTRL_8081 | CFG_CTRL_2783)
2076 #define CFG_CTRL_2527808183     (CFG_CTRL_25XX | CFG_CTRL_27808183)
2077 #define CFG_CTRL_252780818283   (CFG_CTRL_82XX | CFG_CTRL_2527808183)
2078 
2079 #define CFG_ISP_FW_TYPE_1       (CFG_CTRL_22XX | CFG_CTRL_2363)
2080 #define CFG_ISP_FW_TYPE_2       (CFG_CTRL_24XX | CFG_CTRL_252780818283)
2081 #define CFG_FCIP_TYPE_1         (CFG_CTRL_22XX | CFG_CTRL_23XX)
2082 #define CFG_FCIP_SUPPORT        (CFG_FCIP_TYPE_1 | CFG_CTRL_24XX)
2083 #define CFG_FCOE_SUPPORT        (CFG_CTRL_82XX | CFG_CTRL_8081)
2084 #define CFG_N2N_SUPPORT         (CFG_CTRL_2425 | CFG_CTRL_2783)
2085 #define CFG_FC_TYPE_1           (CFG_CTRL_22XX | CFG_CTRL_2363)
2086 #define CFG_FC_TYPE_2           (CFG_CTRL_2425 | CFG_CTRL_2783)
2087 #define CFG_FC_TYPE             (CFG_FC_TYPE_1 | CFG_FC_TYPE_2)
2088 #define CFG_NO_INTR_HSHAKE_SUP  (CFG_CTRL_27808183)
2089 #define CFG_MWB_4096_SUPPORT    (CFG_CTRL_2425 | CFG_CTRL_81XX)
2090 #define CFG_IIDMA_SUPPORT       (CFG_CTRL_8081 | CFG_FC_TYPE_2)
2091 #define CFG_FLASH_ACC_SUPPORT   (CFG_CTRL_27808183)
2092 #define CFG_FLASH_DMA_SUPPORT   (CFG_CTRL_2527808183)
2093 #define CFG_LOOP_POINT_SUPPORT  (CFG_CTRL_8081)
2094 #define CFG_LB_ECHO_SUPPORT     (CFG_CTRL_2363 | CFG_ISP_FW_TYPE_2)
2095 #define CFG_SET_LEDS_SUPPORT    (CFG_CTRL_2363 | CFG_ISP_FW_TYPE_2)
2096 #define CFG_SERDES_SUPPORT      (CFG_CTRL_2783)
2097 #define CFG_BBCR_SUPPORT        (CFG_CTRL_2783)
2098 #define CFG_MSI_SUPPORT         (CFG_CTRL_2425 | CFG_CTRL_81XX | CFG_CTRL_82XX)
2099 
2100 
2101 #define CFG_IST(ha, cfgflags)   (ha->cfg_flags & (cfgflags))
2102 
2103 /*
2104  * Interrupt configuration flags
2105  */
2106 #define IFLG_INTR_LEGACY                        BIT_0
2107 #define IFLG_INTR_FIXED                         BIT_1
2108 #define IFLG_INTR_MSI                           BIT_2
2109 #define IFLG_INTR_MSIX                          BIT_3
2110 
2111 #define IFLG_INTR_AIF   (IFLG_INTR_MSI | IFLG_INTR_FIXED | IFLG_INTR_MSIX)
2112 
2113 /*
2114  * Macros to help code, maintain, etc.
2115  */
2116 #define LSB(x)          (uint8_t)(x)
2117 #define MSB(x)          (uint8_t)((uint16_t)(x) >> 8)
2118 #define MSW(x)          (uint16_t)((uint32_t)(x) >> 16)
2119 #define LSW(x)          (uint16_t)(x)
2120 #define LSD(x)          (uint32_t)(x)
2121 #define MSD(x)          (uint32_t)((uint64_t)(x) >> 32)
2122 
2123 #define LONG_TO_LLONG(lsl, msl) (uint64_t)((uint64_t)(msl) << 32 | \
2124         (uint32_t)(lsl))
2125 #define SHORT_TO_LONG(lsw, msw) (uint32_t)((uint32_t)msw << 16 | (uint16_t)lsw)
2126 #define CHAR_TO_SHORT(lsb, msb) (uint16_t)((uint16_t)msb << 8 | (uint8_t)lsb)
2127 #define CHAR_TO_LONG(lsb, b1, b2, msb) \
2128         (uint32_t)(SHORT_TO_LONG(CHAR_TO_SHORT(lsb, b1), \
2129         CHAR_TO_SHORT(b2, msb)))
2130 
2131 /* Little endian machine correction defines. */
2132 #ifdef _LITTLE_ENDIAN
2133 #define LITTLE_ENDIAN_16(x)
2134 #define LITTLE_ENDIAN_24(x)
2135 #define LITTLE_ENDIAN_32(x)
2136 #define LITTLE_ENDIAN_64(x)
2137 #define LITTLE_ENDIAN(bp, bytes)
2138 #define BIG_ENDIAN_16(x)        ql_chg_endian((uint8_t *)x, 2)
2139 #define BIG_ENDIAN_24(x)        ql_chg_endian((uint8_t *)x, 3)
2140 #define BIG_ENDIAN_32(x)        ql_chg_endian((uint8_t *)x, 4)
2141 #define BIG_ENDIAN_64(x)        ql_chg_endian((uint8_t *)x, 8)
2142 #define BIG_ENDIAN(bp, bytes)   ql_chg_endian((uint8_t *)bp, bytes)
2143 #endif /* _LITTLE_ENDIAN */
2144 
2145 /* Big endian machine correction defines. */
2146 #ifdef _BIG_ENDIAN
2147 #define LITTLE_ENDIAN_16(x)             ql_chg_endian((uint8_t *)x, 2)
2148 #define LITTLE_ENDIAN_24(x)             ql_chg_endian((uint8_t *)x, 3)
2149 #define LITTLE_ENDIAN_32(x)             ql_chg_endian((uint8_t *)x, 4)
2150 #define LITTLE_ENDIAN_64(x)             ql_chg_endian((uint8_t *)x, 8)
2151 #define LITTLE_ENDIAN(bp, bytes)        ql_chg_endian((uint8_t *)bp, bytes)
2152 #define BIG_ENDIAN_16(x)
2153 #define BIG_ENDIAN_24(x)
2154 #define BIG_ENDIAN_32(x)
2155 #define BIG_ENDIAN_64(x)
2156 #define BIG_ENDIAN(bp, bytes)
2157 #endif /* _BIG_ENDIAN */
2158 
2159 #define LOCAL_LOOP_ID(x)        (x <= LAST_LOCAL_LOOP_ID)
2160 
2161 #define FABRIC_LOOP_ID(x)       (x == FL_PORT_LOOP_ID || \
2162     x == SIMPLE_NAME_SERVER_LOOP_ID)
2163 
2164 #define SNS_LOOP_ID(x)          (x >= SNS_FIRST_LOOP_ID && \
2165     x <= SNS_LAST_LOOP_ID)
2166 
2167 #define BROADCAST_LOOP_ID(x)    (x == IP_BROADCAST_LOOP_ID)
2168 
2169 #define VALID_LOOP_ID(x)        (LOCAL_LOOP_ID(x) || SNS_LOOP_ID(x) || \
2170     FABRIC_LOOP_ID(x) || BROADCAST_LOOP_ID(x))
2171 
2172 #define VALID_N_PORT_HDL(x)     (x <= LAST_N_PORT_HDL || \
2173         (x >= SNS_24XX_HDL && x <= BROADCAST_24XX_HDL))
2174 
2175 #define VALID_DEVICE_ID(ha, x)  (CFG_IST(ha, CFG_ISP_FW_TYPE_2) ? \
2176         VALID_N_PORT_HDL(x) : VALID_LOOP_ID(x))
2177 
2178 #define VALID_TARGET_ID(ha, x)  (CFG_IST(ha, CFG_ISP_FW_TYPE_2) ? \
2179         (x <= LAST_N_PORT_HDL) : (LOCAL_LOOP_ID(x) || SNS_LOOP_ID(x)))
2180 
2181 #define RESERVED_LOOP_ID(ha, x) (CFG_IST(ha, CFG_ISP_FW_TYPE_2) ? \
2182         (x > LAST_N_PORT_HDL && x <= FL_PORT_24XX_HDL) : \
2183         (x >= FL_PORT_LOOP_ID && x <= SIMPLE_NAME_SERVER_LOOP_ID))
2184 
2185 #define QL_LOOP_TRANSITION      (MARKER_NEEDED | MARKER_ACTIVE | \
2186                                 ISP_ABORT_NEEDED | ABORT_ISP_ACTIVE | \
2187                                 LOOP_RESYNC_NEEDED | LOOP_RESYNC_ACTIVE | \
2188                                 COMMAND_WAIT_NEEDED | COMMAND_WAIT_ACTIVE)
2189 
2190 #define LOOP_RECONFIGURE(ha)    (ha->task_daemon_flags & (QL_LOOP_TRANSITION | \
2191                                 DRIVER_STALL))
2192 
2193 #define DRIVER_SUSPENDED(ha)    (ha->task_daemon_flags & (LOOP_DOWN | \
2194                                 QL_LOOP_TRANSITION | DRIVER_STALL))
2195 
2196 #define LOOP_NOT_READY(ha)      (ha->task_daemon_flags & (QL_LOOP_TRANSITION | \
2197                                 LOOP_DOWN))
2198 
2199 #define LOOP_READY(ha)          (LOOP_NOT_READY(ha) == 0)
2200 
2201 #define QL_TASK_PENDING(ha)     ( \
2202     ha->task_daemon_flags & (QL_LOOP_TRANSITION | ABORT_QUEUES_NEEDED | \
2203     PORT_RETRY_NEEDED) || ha->unsol_callback_queue.first != NULL)
2204 
2205 #define QL_DAEMON_NOT_ACTIVE(ha)        ( \
2206         !(ha->task_daemon_flags & TASK_DAEMON_ALIVE_FLG) || \
2207         ha->task_daemon_flags & (TASK_DAEMON_SLEEPING_FLG | \
2208         TASK_DAEMON_STOP_FLG))
2209 
2210 #define QL_ABORTED_SRB(ha)      ((ql_srb_t *)ha)
2211 
2212 #define INTERRUPT_PENDING(ha)   (CFG_IST(ha, CFG_CTRL_82XX) ? \
2213                                 RD32_IO_REG(ha, nx_risc_int) & NX_RISC_INT : \
2214                                 RD16_IO_REG(ha, istatus) & RISC_INT)
2215 /*
2216  * Locking Macro Definitions
2217  */
2218 #define GLOBAL_STATE_LOCK()             mutex_enter(&ql_global_mutex)
2219 #define GLOBAL_STATE_UNLOCK()           mutex_exit(&ql_global_mutex)
2220 
2221 #define GLOBAL_TIMER_LOCK()             mutex_enter(&ql_global_timer_mutex)
2222 #define GLOBAL_TIMER_UNLOCK()           mutex_exit(&ql_global_timer_mutex)
2223 
2224 #define TRY_DEVICE_QUEUE_LOCK(q)        mutex_tryenter(&q->mutex)
2225 #define DEVICE_QUEUE_LOCK(q)            mutex_enter(&q->mutex)
2226 #define DEVICE_QUEUE_UNLOCK(q)          mutex_exit(&q->mutex)
2227 
2228 #define TRY_MBX_REGISTER_LOCK(ha)       mutex_tryenter(&ha->pha->mbx_mutex)
2229 #define MBX_REGISTER_LOCK_OWNER(ha)     mutex_owner(&ha->pha->mbx_mutex)
2230 #define MBX_REGISTER_LOCK(ha)           mutex_enter(&ha->pha->mbx_mutex)
2231 #define MBX_REGISTER_UNLOCK(ha)         mutex_exit(&ha->pha->mbx_mutex)
2232 
2233 #define INTR_LOCK(ha)                   ql_intr_lock(ha->pha)
2234 #define INTR_UNLOCK(ha)                 ql_intr_unlock(ha->pha)
2235 
2236 #define INDX_INTR_LOCK(ha, i)   mutex_enter(&ha->pha->rsp_queues[i]->intr_mutex)
2237 #define INDX_INTR_UNLOCK(ha, i) mutex_exit(&ha->pha->rsp_queues[i]->intr_mutex)
2238 
2239 #define TASK_DAEMON_LOCK(ha)            mutex_enter(&ha->pha->task_daemon_mutex)
2240 #define TASK_DAEMON_UNLOCK(ha)          mutex_exit(&ha->pha->task_daemon_mutex)
2241 
2242 #define REQUEST_RING_LOCK(ha)           mutex_enter(&ha->pha->req_ring_mutex)
2243 #define REQUEST_RING_UNLOCK(ha)         mutex_exit(&ha->pha->req_ring_mutex)
2244 
2245 #define COMP_Q_LOCK(ha)                 mutex_enter(&ha->pha->comp_q_mutex)
2246 #define COMP_Q_UNLOCK(ha)               mutex_exit(&ha->pha->comp_q_mutex)
2247 
2248 #define ADAPTER_STATE_LOCK(ha)          mutex_enter(&ha->pha->mutex)
2249 #define ADAPTER_STATE_UNLOCK(ha)        mutex_exit(&ha->pha->mutex)
2250 
2251 #define QL_DUMP_LOCK(ha)                mutex_enter(&ha->pha->dump_mutex)
2252 #define QL_DUMP_UNLOCK(ha)              mutex_exit(&ha->pha->dump_mutex)
2253 
2254 #define QL_PM_LOCK(ha)                  mutex_enter(&ha->pha->pm_mutex)
2255 #define QL_PM_UNLOCK(ha)                mutex_exit(&ha->pha->pm_mutex)
2256 
2257 #define QL_UB_LOCK(ha)                  mutex_enter(&ha->pha->ub_mutex)
2258 #define QL_UB_UNLOCK(ha)                mutex_exit(&ha->pha->ub_mutex)
2259 
2260 #define GLOBAL_HW_LOCK()                mutex_enter(&ql_global_hw_mutex)
2261 #define GLOBAL_HW_UNLOCK()              mutex_exit(&ql_global_hw_mutex)
2262 
2263 /*
2264  * PCI power management control/status register location
2265  */
2266 #define QL_PM_CS_REG                    0x48
2267 
2268 /*
2269  * ql component
2270  */
2271 #define QL_POWER_COMPONENT              0
2272 
2273 typedef struct ql_config_space {
2274         uint16_t        chs_command;
2275         uint8_t         chs_cache_line_size;
2276         uint8_t         chs_latency_timer;
2277         uint8_t         chs_header_type;
2278         uint8_t         chs_sec_latency_timer;
2279         uint8_t         chs_bridge_control;
2280         uint32_t        chs_base0;
2281         uint32_t        chs_base1;
2282         uint32_t        chs_base2;
2283         uint32_t        chs_base3;
2284         uint32_t        chs_base4;
2285         uint32_t        chs_base5;
2286 } ql_config_space_t;
2287 
2288 #ifdef  USE_DDI_INTERFACES
2289 
2290 #define QL_SAVE_CONFIG_REGS(dip)                pci_save_config_regs(dip)
2291 #define QL_RESTORE_CONFIG_REGS(dip)             pci_restore_config_regs(dip)
2292 
2293 #else /* USE_DDI_INTERFACES */
2294 
2295 #define QL_SAVE_CONFIG_REGS(dip)                ql_save_config_regs(dip)
2296 #define QL_RESTORE_CONFIG_REGS(dip)             ql_restore_config_regs(dip)
2297 
2298 #endif /* USE_DDI_INTERFACES */
2299 
2300 /*
2301  * QL local function return status codes
2302  */
2303 #define QL_SUCCESS                      0x4000
2304 #define QL_INVALID_COMMAND              0x4001
2305 #define QL_INTERFACE_ERROR              0x4002
2306 #define QL_TEST_FAILED                  0x4003
2307 #define QL_COMMAND_ERROR                0x4005
2308 #define QL_PARAMETER_ERROR              0x4006
2309 #define QL_PORT_ID_USED                 0x4007
2310 #define QL_LOOP_ID_USED                 0x4008
2311 #define QL_ALL_IDS_IN_USE               0x4009
2312 #define QL_NOT_LOGGED_IN                0x400A
2313 #define QL_LOOP_DOWN                    0x400B
2314 #define QL_LOOP_BACK_ERROR              0x400C
2315 #define QL_CHECKSUM_ERROR               0x4010
2316 #define QL_CONSUMED                     0x4011
2317 
2318 #define QL_FUNCTION_TIMEOUT             0x100
2319 #define QL_FUNCTION_PARAMETER_ERROR     0x101
2320 #define QL_FUNCTION_FAILED              0x102
2321 #define QL_MEMORY_ALLOC_FAILED          0x103
2322 #define QL_FABRIC_NOT_INITIALIZED       0x104
2323 #define QL_LOCK_TIMEOUT                 0x105
2324 #define QL_ABORTED                      0x106
2325 #define QL_FUNCTION_SUSPENDED           0x107
2326 #define QL_END_OF_DATA                  0x108
2327 #define QL_IP_UNSUPPORTED               0x109
2328 #define QL_PM_ERROR                     0x10a
2329 #define QL_DATA_EXISTS                  0x10b
2330 #define QL_NOT_SUPPORTED                0x10c
2331 #define QL_MEMORY_FULL                  0x10d
2332 #define QL_FW_NOT_SUPPORTED             0x10e
2333 #define QL_FWMODLOAD_FAILED             0x10f
2334 #define QL_FWSYM_NOT_FOUND              0x110
2335 #define QL_LOGIN_NOT_SUPPORTED          0x111
2336 
2337 /*
2338  * SBus card FPGA register offsets.
2339  */
2340 #define FPGA_CONF               0x100
2341 #define FPGA_EEPROM_LOADDR      0x102
2342 #define FPGA_EEPROM_HIADDR      0x104
2343 #define FPGA_EEPROM_DATA        0x106
2344 #define FPGA_REVISION           0x108
2345 
2346 #define SBUS_FLASH_WRITE_ENABLE 0x0080
2347 #define QL_SBUS_FCODE_SIZE      0x30000
2348 #define QL_FCODE_OFFSET         0
2349 #define QL_FPGA_SIZE            0x40000
2350 #define QL_FPGA_OFFSET          0x40000
2351 
2352 #define READ_PORT_ID(addr)      ((uint32_t)((((uint32_t)((addr)[0])) << 16) | \
2353                                         (((uint32_t)((addr)[1])) << 8) | \
2354                                         (((uint32_t)((addr)[2])))))
2355 #define READ_PORT_NAME(addr) ((u_longlong_t)((((uint64_t)((addr)[0])) << 56) | \
2356                                         (((uint64_t)((addr)[1])) << 48) | \
2357                                         (((uint64_t)((addr)[2])) << 40) | \
2358                                         (((uint64_t)((addr)[3])) << 32) | \
2359                                         (((uint64_t)((addr)[4])) << 24) | \
2360                                         (((uint64_t)((addr)[5])) << 16) | \
2361                                         (((uint64_t)((addr)[6])) << 8) | \
2362                                         (((uint64_t)((addr)[7])))))
2363 /*
2364  * Structure used to associate cmds with strings which describe them.
2365  */
2366 typedef struct cmd_table_entry {
2367         uint16_t cmd;
2368         char    *string;
2369 } cmd_table_t;
2370 
2371 /*
2372  * ELS command table initializer
2373  */
2374 #define ELS_CMD_TABLE()                                 \
2375 {                                                       \
2376         {LA_ELS_RJT, "LA_ELS_RJT"},                     \
2377         {LA_ELS_ACC, "LA_ELS_ACC"},                     \
2378         {LA_ELS_PLOGI, "LA_ELS_PLOGI"},                 \
2379         {LA_ELS_PDISC, "LA_ELS_PDISC"},                 \
2380         {LA_ELS_FLOGI, "LA_ELS_FLOGI"},                 \
2381         {LA_ELS_FDISC, "LA_ELS_FDISC"},                 \
2382         {LA_ELS_LOGO, "LA_ELS_LOGO"},                   \
2383         {LA_ELS_PRLI, "LA_ELS_PRLI"},                   \
2384         {LA_ELS_PRLO, "LA_ELS_PRLO"},                   \
2385         {LA_ELS_ADISC, "LA_ELS_ADISC"},                 \
2386         {LA_ELS_LINIT, "LA_ELS_LINIT"},                 \
2387         {LA_ELS_LPC, "LA_ELS_LPC"},                     \
2388         {LA_ELS_LSTS, "LA_ELS_LSTS"},                   \
2389         {LA_ELS_SCR, "LA_ELS_SCR"},                     \
2390         {LA_ELS_RSCN, "LA_ELS_RSCN"},                   \
2391         {LA_ELS_FARP_REQ, "LA_ELS_FARP_REQ"},           \
2392         {LA_ELS_FARP_REPLY, "LA_ELS_FARP_REPLY"},       \
2393         {LA_ELS_RLS, "LA_ELS_RLS"},                     \
2394         {LA_ELS_RNID, "LA_ELS_RNID"},                   \
2395         {NULL, NULL}                                    \
2396 }
2397 
2398 /*
2399  * ELS Passthru IOCB data segment descriptor.
2400  */
2401 typedef struct data_seg_desc {
2402         uint32_t addr[2];
2403         uint32_t length;
2404 } data_seg_desc_t;
2405 
2406 /*
2407  * ELS descriptor used to abstract the hosts fibre channel packet
2408  * from the ISP ELS code.
2409  */
2410 typedef struct els_desc {
2411         uint8_t                 els;            /* the ELS command code */
2412         ddi_acc_handle_t        els_handle;
2413         uint16_t                n_port_handle;
2414         port_id_t               d_id;
2415         port_id_t               s_id;
2416         uint16_t                control_flags;
2417         uint32_t                cmd_byte_count;
2418         uint32_t                rsp_byte_count;
2419         data_seg_desc_t         tx_dsd;         /* FC frame payload */
2420         data_seg_desc_t         rx_dsd;         /* ELS resp payload buffer */
2421 } els_descriptor_t;
2422 
2423 typedef struct prli_svc_pram_resp_page {
2424         uint8_t         type_code;
2425         uint8_t         type_code_ext;
2426         uint16_t        prli_resp_flags;
2427         uint32_t        orig_process_associator;
2428         uint32_t        resp_process_associator;
2429         uint32_t        common_parameters;
2430 } prli_svc_pram_resp_page_t;
2431 
2432 /*
2433  * PRLI accept Service Parameter Page Word 3
2434  */
2435 #define PRLI_W3_WRITE_FCP_XFR_RDY_DISABLED      BIT_0
2436 #define PRLI_W3_READ_FCP_XFR_RDY_DISABLED       BIT_1
2437 #define PRLI_W3_OBSOLETE_BIT_2                  BIT_2
2438 #define PRLI_W3_OBSOLETE_BIT_3                  BIT_3
2439 #define PRLI_W3_TARGET_FUNCTION                 BIT_4
2440 #define PRLI_W3_INITIATOR_FUNCTION              BIT_5
2441 #define PRLI_W3_DATA_OVERLAY_ALLOWED            BIT_6
2442 #define PRLI_W3_CONFIRMED_COMP_ALLOWED          BIT_7
2443 #define PRLI_W3_RETRY                           BIT_8
2444 #define PRLI_W3_TASK_RETRY_ID_REQUESTED         BIT_9
2445 
2446 typedef struct prli_acc_resp {
2447         uint8_t                         ls_code;
2448         uint8_t                         page_length;
2449         uint16_t                        payload_length;
2450         struct prli_svc_pram_resp_page  svc_params;
2451 } prli_acc_resp_t;
2452 
2453 #define EL_TRACE_BUF_SIZE               8192
2454 
2455 #define QL_PORT_ID_MASK                 0xffffff
2456 
2457 #define QL_PLOGI_RETRY_CNT              (5)
2458 #define QL_PLOGI_RETRY_DLY_USEC         (10 * MILLISEC)
2459 
2460 /*
2461  * Global Data in ql_api.c source file.
2462  */
2463 extern void             *ql_state;              /* for soft state routine */
2464 extern uint32_t         ql_os_release_level;
2465 extern ql_head_t        ql_hba;
2466 extern kmutex_t         ql_global_mutex;
2467 extern kmutex_t         ql_global_hw_mutex;
2468 extern kmutex_t         ql_global_el_mutex;
2469 extern uint8_t          ql_ip_fast_post_count;
2470 extern uint32_t         ql_ip_buffer_count;
2471 extern uint32_t         ql_ip_low_water;
2472 extern uint8_t          ql_alpa_to_index[];
2473 extern uint32_t         ql_gfru_hba_index;
2474 extern uint32_t         ql_enable_ets;
2475 extern uint16_t         ql_osc_wait_count;
2476 
2477 /*
2478  * Global Function Prototypes in ql_api.c source file.
2479  */
2480 void ql_chg_endian(uint8_t *, size_t);
2481 void ql_populate_hba_fru_details(ql_adapter_state_t *, fc_fca_port_info_t *);
2482 void ql_setup_fruinfo(ql_adapter_state_t *);
2483 uint16_t ql_pci_config_get16(ql_adapter_state_t *, off_t);
2484 uint32_t ql_pci_config_get32(ql_adapter_state_t *, off_t);
2485 void ql_pci_config_put8(ql_adapter_state_t *, off_t, uint8_t);
2486 void ql_pci_config_put16(ql_adapter_state_t *, off_t, uint16_t);
2487 void ql_delay(ql_adapter_state_t *, clock_t);
2488 void ql_awaken_task_daemon(ql_adapter_state_t *, ql_srb_t *, uint64_t,
2489     uint64_t);
2490 int ql_abort_device(ql_adapter_state_t *, ql_tgt_t *, int);
2491 int ql_binary_fw_dump(ql_adapter_state_t *, int);
2492 void ql_done(ql_link_t *, boolean_t);
2493 int ql_24xx_flash_id(ql_adapter_state_t *);
2494 int ql_24xx_load_flash(ql_adapter_state_t *, uint8_t *, uint32_t, uint32_t);
2495 int ql_poll_flash(ql_adapter_state_t *, uint32_t, uint8_t);
2496 void ql_flash_disable(ql_adapter_state_t *);
2497 void ql_flash_enable(ql_adapter_state_t *);
2498 int ql_erase_flash(ql_adapter_state_t *, int);
2499 void ql_write_flash_byte(ql_adapter_state_t *, uint32_t, uint8_t);
2500 uint8_t ql_read_flash_byte(ql_adapter_state_t *, uint32_t);
2501 int ql_24xx_read_flash(ql_adapter_state_t *, uint32_t, uint32_t *);
2502 int ql_24xx_write_flash(ql_adapter_state_t *, uint32_t, uint32_t);
2503 fc_unsol_buf_t *ql_get_unsolicited_buffer(ql_adapter_state_t *, uint32_t);
2504 int ql_dump_firmware(ql_adapter_state_t *);
2505 size_t ql_ascii_fw_dump(ql_adapter_state_t *, caddr_t);
2506 void ql_add_link_b(ql_head_t *, ql_link_t *);
2507 void ql_add_link_t(ql_head_t *, ql_link_t *);
2508 void ql_remove_link(ql_head_t *, ql_link_t *);
2509 void ql_next(ql_adapter_state_t *, ql_lun_t *);
2510 void ql_send_logo(ql_adapter_state_t *, ql_tgt_t *, ql_head_t *);
2511 void ql_cthdr_endian(ddi_acc_handle_t, caddr_t, boolean_t);
2512 ql_tgt_t *ql_d_id_to_queue(ql_adapter_state_t *, port_id_t);
2513 ql_tgt_t *ql_loop_id_to_queue(ql_adapter_state_t *, uint16_t);
2514 void ql_cmd_wait(ql_adapter_state_t *);
2515 void ql_loop_online(ql_adapter_state_t *);
2516 ql_tgt_t *ql_dev_init(ql_adapter_state_t *, port_id_t, uint16_t);
2517 int ql_ub_frame_hdr(ql_adapter_state_t *, ql_tgt_t *, uint16_t, ql_head_t *);
2518 void ql_rcv_rscn_els(ql_adapter_state_t *, uint16_t *, ql_head_t *);
2519 int ql_stall_driver(ql_adapter_state_t *, uint32_t);
2520 void ql_restart_driver(ql_adapter_state_t *);
2521 int ql_load_flash(ql_adapter_state_t *, uint8_t *, uint32_t);
2522 int ql_get_dma_mem(ql_adapter_state_t *, dma_mem_t *, uint32_t,
2523     mem_alloc_type_t, mem_alignment_t);
2524 void ql_free_dma_resource(ql_adapter_state_t *, dma_mem_t *);
2525 int ql_alloc_phys(ql_adapter_state_t *, dma_mem_t *, int);
2526 void ql_free_phys(ql_adapter_state_t *, dma_mem_t *);
2527 void ql_24xx_protect_flash(ql_adapter_state_t *);
2528 uint8_t ql_pci_config_get8(ql_adapter_state_t *, off_t);
2529 void ql_pci_config_put32(ql_adapter_state_t *, off_t, uint32_t);
2530 int ql_24xx_unprotect_flash(ql_adapter_state_t *);
2531 char *els_cmd_text(int);
2532 char *mbx_cmd_text(int);
2533 char *cmd_text(cmd_table_t *, int);
2534 uint32_t ql_fwmodule_resolve(ql_adapter_state_t *);
2535 void ql_port_state(ql_adapter_state_t *, uint32_t, uint32_t);
2536 void ql_isp_els_handle_cmd_endian(ql_adapter_state_t *ha, ql_srb_t *srb);
2537 void ql_isp_els_handle_rsp_endian(ql_adapter_state_t *ha, ql_srb_t *srb);
2538 void ql_isp_els_handle_endian(ql_adapter_state_t *ha, uint8_t *ptr,
2539     uint8_t ls_code);
2540 void ql_el_trace_alloc(ql_adapter_state_t *);
2541 void ql_el_trace_dealloc(ql_adapter_state_t *);
2542 int ql_nvram_cache_desc_ctor(ql_adapter_state_t *);
2543 int ql_nvram_cache_desc_dtor(ql_adapter_state_t *);
2544 int ql_plogi_params_desc_ctor(ql_adapter_state_t *);
2545 int ql_plogi_params_desc_dtor(ql_adapter_state_t *);
2546 int ql_wwn_cmp(ql_adapter_state_t *, la_wwn_t *, la_wwn_t *);
2547 void ql_dev_free(ql_adapter_state_t *, ql_tgt_t *);
2548 void ql_restart_queues(ql_adapter_state_t *);
2549 void ql_abort_queues(ql_adapter_state_t *);
2550 void ql_requeue_pending_cmds(ql_adapter_state_t *, ql_tgt_t *);
2551 void ql_toggle_loop_state(ql_adapter_state_t *);
2552 void ql_els_24xx_iocb(ql_adapter_state_t *, ql_request_q_t *, ql_srb_t *,
2553     void *);
2554 int ql_get_cap_ofst(ql_adapter_state_t *, uint8_t);
2555 void ql_intr_lock(ql_adapter_state_t *);
2556 void ql_intr_unlock(ql_adapter_state_t *);
2557 void ql_io_comp(ql_srb_t *sp);
2558 uint64_t ql_get_lun_addr(ql_tgt_t *, uint16_t);
2559 int ql_2700_get_flash_dmp_template(ql_adapter_state_t *);
2560 int ql_2700_get_module_dmp_template(ql_adapter_state_t *);
2561 
2562 #ifdef  __cplusplus
2563 }
2564 #endif
2565 
2566 #endif /* _QL_API_H */