637 lines
16 KiB
C
637 lines
16 KiB
C
/* $OpenBSD: qlereg.h,v 1.9 2014/04/20 09:49:23 jmatthew Exp $ */
|
|
|
|
/*
|
|
* Copyright (c) 2013, 2014 Jonathan Matthew <jmatthew@openbsd.org>
|
|
*
|
|
* Permission to use, copy, modify, and distribute this software for any
|
|
* purpose with or without fee is hereby granted, provided that the above
|
|
* copyright notice and this permission notice appear in all copies.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
*/
|
|
|
|
/* firmware loading */
|
|
#define QLE_2400_CODE_ORG 0x00100000
|
|
|
|
/* interrupt types */
|
|
#define QLE_INT_TYPE_MBOX 1
|
|
#define QLE_INT_TYPE_ASYNC 2
|
|
#define QLE_INT_TYPE_IO 3
|
|
#define QLE_INT_TYPE_OTHER 4
|
|
|
|
/* 24xx interrupt status codes */
|
|
#define QLE_24XX_INT_ROM_MBOX 0x01
|
|
#define QLE_24XX_INT_ROM_MBOX_FAIL 0x02
|
|
#define QLE_24XX_INT_MBOX 0x10
|
|
#define QLE_24XX_INT_MBOX_FAIL 0x11
|
|
#define QLE_24XX_INT_ASYNC 0x12
|
|
#define QLE_24XX_INT_RSPQ 0x13
|
|
|
|
/* ISP registers */
|
|
#define QLE_FLASH_NVRAM_ADDR 0x000
|
|
#define QLE_FLASH_NVRAM_DATA 0x004
|
|
#define QLE_CTRL_STATUS 0x008
|
|
#define QLE_INT_CTRL 0x00C
|
|
#define QLE_INT_STATUS 0x010
|
|
#define QLE_REQ_IN 0x01C
|
|
#define QLE_REQ_OUT 0x020
|
|
#define QLE_RESP_IN 0x024
|
|
#define QLE_RESP_OUT 0x028
|
|
#define QLE_PRI_REQ_IN 0x02C
|
|
#define QLE_PRI_REQ_OUT 0x030
|
|
#define QLE_RISC_STATUS 0x044
|
|
#define QLE_HOST_CMD_CTRL 0x048
|
|
#define QLE_GPIO_DATA 0x04C
|
|
#define QLE_GPIO_ENABLE 0x050
|
|
#define QLE_HOST_SEMAPHORE 0x058
|
|
|
|
/* mailbox base moves around between generations */
|
|
#define QLE_MBOX_BASE_24XX 0x080
|
|
|
|
/* QLE_CTRL_STATUS */
|
|
#define QLE_CTRL_DMA_ACTIVE 0x00020000
|
|
#define QLE_CTRL_DMA_SHUTDOWN 0x00010000
|
|
#define QLE_CTRL_RESET 0x00000001
|
|
|
|
/* QLE_INT_STATUS */
|
|
#define QLE_RISC_INT_REQ 0x00000008
|
|
|
|
/* QLE_INT_CTRL */
|
|
#define QLE_INT_CTRL_ENABLE 0x00000008
|
|
|
|
/* QLE_RISC_STATUS */
|
|
#define QLE_INT_INFO_SHIFT 16
|
|
#define QLE_RISC_HOST_INT_REQ 0x00008000
|
|
#define QLE_RISC_PAUSED 0x00000100
|
|
#define QLE_INT_STATUS_MASK 0x000000FF
|
|
|
|
/* QLE_HOST_CMD_CTRL write */
|
|
#define QLE_HOST_CMD_SHIFT 28
|
|
#define QLE_HOST_CMD_NOP 0x0
|
|
#define QLE_HOST_CMD_RESET 0x1
|
|
#define QLE_HOST_CMD_CLEAR_RESET 0x2
|
|
#define QLE_HOST_CMD_PAUSE 0x3
|
|
#define QLE_HOST_CMD_RELEASE 0x4
|
|
#define QLE_HOST_CMD_SET_HOST_INT 0x5
|
|
#define QLE_HOST_CMD_CLR_HOST_INT 0x6
|
|
#define QLE_HOST_CMD_CLR_RISC_INT 0xA
|
|
|
|
/* QLE_HOST_CMD_CTRL read */
|
|
#define QLE_HOST_STATUS_ERROR_SHIFT 12
|
|
#define QLE_HOST_STATUS_HOST_INT 0x00000040
|
|
#define QLE_HOST_STATUS_RISC_RESET 0x00000020
|
|
|
|
/* QLE_HOST_SEMAPHORE */
|
|
#define QLE_HOST_SEMAPHORE_LOCK 0x00000001
|
|
|
|
|
|
/* QLE_MBOX_BASE (reg 0) read */
|
|
#define QLE_MBOX_HAS_STATUS 0x4000
|
|
#define QLE_MBOX_COMPLETE 0x4000
|
|
#define QLE_MBOX_INVALID 0x4001
|
|
#define QLE_MBOX_INTF_ERROR 0x4002
|
|
#define QLE_MBOX_TEST_FAILED 0x4003
|
|
#define QLE_MBOX_CMD_ERROR 0x4005
|
|
#define QLE_MBOX_CMD_PARAM 0x4006
|
|
#define QLE_MBOX_LINK_DOWN 0x400B
|
|
#define QLE_MBOX_DIAG_ERROR 0x400C
|
|
#define QLE_MBOX_CSUM_ERROR 0x4010
|
|
#define QLE_ASYNC_SYSTEM_ERROR 0x8002
|
|
#define QLE_ASYNC_REQ_XFER_ERROR 0x8003
|
|
#define QLE_ASYNC_RSP_XFER_ERROR 0x8004
|
|
#define QLE_ASYNC_LIP_OCCURRED 0x8010
|
|
#define QLE_ASYNC_LOOP_UP 0x8011
|
|
#define QLE_ASYNC_LOOP_DOWN 0x8012
|
|
#define QLE_ASYNC_LIP_RESET 0x8013
|
|
#define QLE_ASYNC_PORT_DB_CHANGE 0x8014
|
|
#define QLE_ASYNC_CHANGE_NOTIFY 0x8015
|
|
#define QLE_ASYNC_LIP_F8 0x8016
|
|
#define QLE_ASYNC_LOOP_INIT_ERROR 0x8017
|
|
#define QLE_ASYNC_POINT_TO_POINT 0x8030
|
|
#define QLE_ASYNC_ZIO_RESP_UPDATE 0x8040
|
|
#define QLE_ASYNC_RECV_ERROR 0x8048
|
|
#define QLE_ASYNC_LOGIN_RJT_SENT 0x8049
|
|
|
|
|
|
/* QLE_MBOX_BASE (reg 0) write */
|
|
#define QLE_MBOX_NOP 0x0000
|
|
#define QLE_MBOX_EXEC_FIRMWARE 0x0002
|
|
#define QLE_MBOX_REGISTER_TEST 0x0006
|
|
#define QLE_MBOX_VERIFY_CSUM 0x0007
|
|
#define QLE_MBOX_ABOUT_FIRMWARE 0x0008
|
|
#define QLE_MBOX_LOAD_RISC_RAM 0x000B
|
|
#define QLE_MBOX_INIT_RISC_RAM 0x000E
|
|
#define QLE_MBOX_READ_RISC_RAM 0x000F
|
|
#define QLE_MBOX_GET_IO_STATUS 0x0012
|
|
#define QLE_MBOX_STOP_FIRMWARE 0x0014
|
|
#define QLE_MBOX_GET_ID 0x0020
|
|
#define QLE_MBOX_SET_FIRMWARE_OPTIONS 0x0038
|
|
#define QLE_MBOX_PLOGO 0x0056
|
|
#define QLE_MBOX_DATA_RATE 0x005D
|
|
#define QLE_MBOX_INIT_FIRMWARE 0x0060
|
|
#define QLE_MBOX_GET_INIT_CB 0x0061
|
|
#define QLE_MBOX_GET_FC_AL_POS 0x0063
|
|
#define QLE_MBOX_GET_PORT_DB 0x0064
|
|
#define QLE_MBOX_GET_FIRMWARE_STATE 0x0069
|
|
#define QLE_MBOX_GET_PORT_NAME 0x006A
|
|
#define QLE_MBOX_GET_LINK_STATUS 0x006B
|
|
#define QLE_MBOX_SEND_CHANGE_REQ 0x0070
|
|
#define QLE_MBOX_LINK_INIT 0x0072
|
|
#define QLE_MBOX_GET_PORT_NAME_LIST 0x0075
|
|
|
|
#define QLE_MBOX_COUNT 32
|
|
|
|
/* nvram layout */
|
|
struct qle_nvram {
|
|
u_int8_t id[4];
|
|
u_int16_t nvram_version;
|
|
u_int16_t reserved_0;
|
|
|
|
u_int16_t version;
|
|
u_int16_t reserved_1;
|
|
u_int16_t frame_payload_size;
|
|
u_int16_t execution_throttle;
|
|
u_int16_t exchg_count;
|
|
u_int16_t hard_address;
|
|
|
|
u_int64_t port_name;
|
|
u_int64_t node_name;
|
|
|
|
u_int16_t login_retry;
|
|
u_int16_t link_down_on_nos;
|
|
u_int16_t int_delay_timer;
|
|
u_int16_t login_timeout;
|
|
|
|
u_int32_t fwoptions1;
|
|
u_int32_t fwoptions2;
|
|
u_int32_t fwoptions3;
|
|
|
|
u_int16_t serial_options[4];
|
|
|
|
u_int16_t reserved_2[96];
|
|
|
|
u_int32_t host_p;
|
|
|
|
u_int64_t alt_port_name;
|
|
u_int64_t alt_node_name;
|
|
|
|
u_int64_t boot_port_name;
|
|
u_int16_t boot_lun;
|
|
u_int16_t reserved_3;
|
|
|
|
u_int64_t alt1_boot_port_name;
|
|
u_int16_t alt1_boot_lun;
|
|
u_int16_t reserved_4;
|
|
|
|
u_int64_t alt2_boot_port_name;
|
|
u_int16_t alt2_boot_lun;
|
|
u_int16_t reserved_5;
|
|
|
|
u_int64_t alt3_boot_port_name;
|
|
u_int16_t alt3_boot_lun;
|
|
u_int16_t reserved_6;
|
|
|
|
u_int32_t efi_param;
|
|
|
|
u_int8_t reset_delay;
|
|
u_int8_t reserved_7;
|
|
u_int16_t reserved_8;
|
|
|
|
u_int16_t boot_id_num;
|
|
u_int16_t reserved_9;
|
|
|
|
u_int16_t max_luns_per_target;
|
|
u_int16_t reserved_10;
|
|
|
|
u_int16_t port_down_retry_count;
|
|
u_int16_t link_down_timeout;
|
|
|
|
u_int16_t fcode_param;
|
|
u_int16_t reserved_11[3];
|
|
|
|
u_int8_t prev_drv_ver_major;
|
|
u_int8_t prev_drv_ver_submajor;
|
|
u_int8_t prev_drv_ver_minor;
|
|
u_int8_t prev_drv_ver_subminor;
|
|
|
|
u_int16_t prev_bios_ver_major;
|
|
u_int16_t prev_bios_ver_minor;
|
|
|
|
u_int16_t prev_efi_ver_major;
|
|
u_int16_t prev_efi_ver_minor;
|
|
|
|
u_int16_t prev_fw_ver_major;
|
|
u_int8_t prev_fw_ver_minor;
|
|
u_int8_t prev_fw_ver_subminor;
|
|
|
|
u_int16_t reserved_12[56];
|
|
|
|
u_int8_t model_namep[16];
|
|
|
|
u_int16_t reserved_13[2];
|
|
|
|
u_int16_t pcie_table_sig;
|
|
u_int16_t pcie_table_offset;
|
|
u_int16_t subsystem_vendor_id;
|
|
u_int16_t subsystem_device_id;
|
|
|
|
u_int32_t checksum;
|
|
} __packed __aligned(4);
|
|
|
|
/* init firmware control block */
|
|
#define QLE_ICB_VERSION 1
|
|
|
|
#define QLE_ICB_FW1_HARD_ADDR 0x0001
|
|
#define QLE_ICB_FW1_FAIRNESS 0x0002
|
|
#define QLE_ICB_FW1_FULL_DUPLEX 0x0004
|
|
#define QLE_ICB_FW1_TARGET_MODE 0x0010
|
|
#define QLE_ICB_FW1_DISABLE_INITIATOR 0x0020
|
|
#define QLE_ICB_FW1_DISABLE_INIT_LIP 0x0200
|
|
#define QLE_ICB_FW1_DESC_LOOP_ID 0x0400
|
|
#define QLE_ICB_FW1_PREV_LOOP_ID 0x0800
|
|
#define QLE_ICB_FW1_LOGIN_AFTER_LIP 0x2000
|
|
#define QLE_ICB_FW1_NAME_OPTION 0x4000
|
|
|
|
#define QLE_ICB_FW2_LOOP_ONLY 0x0000
|
|
#define QLE_ICB_FW2_PTP_ONLY 0x0010
|
|
#define QLE_ICB_FW2_LOOP_PTP 0x0020
|
|
#define QLE_ICB_FW2_ZIO_DISABLED 0x0000
|
|
#define QLE_ICB_FW2_ZIO5_ENABLED 0x0005
|
|
#define QLE_ICB_FW2_ZIO6_ENABLED 0x0006
|
|
#define QLE_ICB_FW2_HARD_ADDR_ONLY 0x0080
|
|
|
|
#define QLE_ICB_FW3_SOFT_ID_ONLY 0x0002
|
|
#define QLE_ICB_FW3_FCP_RSP_12_0 0x0010
|
|
#define QLE_ICB_FW3_FCP_RSP_24_0 0x0020
|
|
#define QLE_ICB_FW3_FCP_RSP_32_BYTES 0x0030
|
|
#define QLE_ICB_FW3_ENABLE_OOO 0x0040
|
|
#define QLE_ICB_FW3_NO_AUTO_PLOGI 0x0080
|
|
#define QLE_ICB_FW3_ENABLE_OOO_RDY 0x0200
|
|
#define QLE_ICB_FW3_1GBPS 0x0000
|
|
#define QLE_ICB_FW3_2GBPS 0x2000
|
|
#define QLE_ICB_FW3_AUTONEG 0x4000
|
|
#define QLE_ICB_FW3_4GBPS 0x6000
|
|
#define QLE_ICB_FW3_50_OHMS 0x8000
|
|
|
|
|
|
struct qle_init_cb {
|
|
u_int16_t icb_version;
|
|
u_int16_t icb_reserved;
|
|
u_int16_t icb_max_frame_len;
|
|
u_int16_t icb_exec_throttle;
|
|
u_int16_t icb_exchange_count;
|
|
u_int16_t icb_hardaddr;
|
|
u_int64_t icb_portname;
|
|
u_int64_t icb_nodename;
|
|
u_int16_t icb_resp_in;
|
|
u_int16_t icb_req_out;
|
|
u_int16_t icb_login_retry;
|
|
u_int16_t icb_pri_req_out;
|
|
u_int16_t icb_resp_queue_len;
|
|
u_int16_t icb_req_queue_len;
|
|
u_int16_t icb_link_down_nos;
|
|
u_int16_t icb_pri_req_queue_len;
|
|
u_int32_t icb_req_queue_addr_lo;
|
|
u_int32_t icb_req_queue_addr_hi;
|
|
u_int32_t icb_resp_queue_addr_lo;
|
|
u_int32_t icb_resp_queue_addr_hi;
|
|
u_int32_t icb_pri_req_queue_addr_lo;
|
|
u_int32_t icb_pri_req_queue_addr_hi;
|
|
u_int8_t icb_reserved2[8];
|
|
u_int16_t icb_atio_queue_in;
|
|
u_int16_t icb_atio_queue_len;
|
|
u_int64_t icb_atio_queue_addr;
|
|
u_int16_t icb_int_delay;
|
|
u_int16_t icb_login_timeout;
|
|
u_int32_t icb_fwoptions1;
|
|
u_int32_t icb_fwoptions2;
|
|
u_int32_t icb_fwoptions3;
|
|
u_int8_t icb_reserved3[24];
|
|
} __packed __aligned(4);
|
|
|
|
#define QLE_FW_OPTION1_ASYNC_LIP_F8 0x0001
|
|
#define QLE_FW_OPTION1_ASYNC_LIP_RESET 0x0002
|
|
#define QLE_FW_OPTION1_SYNC_LOSS_LIP 0x0010
|
|
#define QLE_FW_OPTION1_ASYNC_LIP_ERROR 0x0080
|
|
#define QLE_FW_OPTION1_ASYNC_LOGIN_RJT 0x0800
|
|
|
|
#define QLE_FW_OPTION3_EMERG_IOCB 0x0001
|
|
#define QLE_FW_OPTION3_ASYNC_RND_ERROR 0x0002
|
|
|
|
/* topology types returned from QLE_MBOX_GET_LOOP_ID */
|
|
#define QLE_TOPO_NL_PORT 0
|
|
#define QLE_TOPO_FL_PORT 1
|
|
#define QLE_TOPO_N_PORT 2
|
|
#define QLE_TOPO_F_PORT 3
|
|
#define QLE_TOPO_N_PORT_NO_TARGET 4
|
|
|
|
|
|
struct qle_get_port_db {
|
|
u_int16_t flags;
|
|
u_int8_t current_login_state;
|
|
u_int8_t stable_login_state;
|
|
u_int8_t adisc_addr[3];
|
|
u_int8_t reserved;
|
|
u_int8_t port_id[3];
|
|
u_int8_t sequence_id;
|
|
u_int16_t retry_timer;
|
|
u_int16_t nport_handle;
|
|
u_int16_t recv_data_size;
|
|
u_int16_t reserved2;
|
|
u_int16_t prli_svc_word0;
|
|
u_int16_t prli_svc_word3;
|
|
u_int64_t port_name;
|
|
u_int64_t node_name;
|
|
u_int8_t reserved3[24];
|
|
} __packed __aligned(4);
|
|
|
|
struct qle_port_name_list {
|
|
u_int64_t port_name;
|
|
u_int16_t loopid;
|
|
u_int16_t reserved;
|
|
} __packed;
|
|
|
|
#define QLE_SVC3_TARGET_ROLE 0x0010
|
|
|
|
/* fabric name server commands */
|
|
#define QLE_SNS_GA_NXT 0x0100
|
|
#define QLE_SNS_GID_FT 0x0171
|
|
#define QLE_SNS_RFT_ID 0x0217
|
|
|
|
#define QLE_FC4_SCSI 8
|
|
|
|
#define QLE_LS_REJECT 0x8001
|
|
#define QLE_LS_ACCEPT 0x8002
|
|
|
|
struct qle_ct_cmd_hdr {
|
|
u_int8_t ct_revision;
|
|
u_int8_t ct_id[3];
|
|
u_int8_t ct_gs_type;
|
|
u_int8_t ct_gs_subtype;
|
|
u_int8_t ct_gs_options;
|
|
u_int8_t ct_gs_reserved;
|
|
} __packed __aligned(4);
|
|
|
|
struct qle_ct_ga_nxt_req {
|
|
struct qle_ct_cmd_hdr header;
|
|
u_int16_t subcmd;
|
|
u_int16_t max_word;
|
|
u_int32_t reserved3;
|
|
u_int32_t port_id;
|
|
} __packed __aligned(4);
|
|
|
|
struct qle_ct_ga_nxt_resp {
|
|
struct qle_ct_cmd_hdr header;
|
|
u_int16_t response;
|
|
u_int16_t residual;
|
|
u_int8_t fragment_id;
|
|
u_int8_t reason_code;
|
|
u_int8_t explanation_code;
|
|
u_int8_t vendor_unique;
|
|
|
|
u_int32_t port_type_id;
|
|
u_int64_t port_name;
|
|
u_int8_t sym_port_name_len;
|
|
u_int8_t sym_port_name[255];
|
|
u_int64_t node_name;
|
|
u_int8_t sym_node_name_len;
|
|
u_int8_t sym_node_name[255];
|
|
u_int64_t initial_assoc;
|
|
u_int8_t node_ip_addr[16];
|
|
u_int32_t cos;
|
|
u_int32_t fc4_types[8];
|
|
u_int8_t ip_addr[16];
|
|
u_int64_t fabric_port_name;
|
|
u_int32_t hard_address;
|
|
} __packed __aligned(4);
|
|
|
|
struct qle_ct_rft_id_req {
|
|
struct qle_ct_cmd_hdr header;
|
|
u_int16_t subcmd;
|
|
u_int16_t max_word;
|
|
u_int32_t reserved3;
|
|
u_int32_t port_id;
|
|
u_int32_t fc4_types[8];
|
|
} __packed __aligned(4);
|
|
|
|
struct qle_ct_rft_id_resp {
|
|
struct qle_ct_cmd_hdr header;
|
|
u_int16_t response;
|
|
u_int16_t residual;
|
|
u_int8_t fragment_id;
|
|
u_int8_t reason_code;
|
|
u_int8_t explanation_code;
|
|
u_int8_t vendor_unique;
|
|
} __packed __aligned(4);
|
|
|
|
/* available handle ranges */
|
|
#define QLE_MIN_HANDLE 0x81
|
|
#define QLE_MAX_HANDLE 0x7EF
|
|
|
|
#define QLE_F_PORT_HANDLE 0x7FE
|
|
#define QLE_FABRIC_CTRL_HANDLE 0x7FD
|
|
#define QLE_SNS_HANDLE 0x7FC
|
|
#define QLE_IP_BCAST_HANDLE 0xFFF
|
|
|
|
/* IOCB types */
|
|
#define QLE_IOCB_STATUS 0x03
|
|
#define QLE_IOCB_MARKER 0x04
|
|
#define QLE_IOCB_STATUS_CONT 0x10
|
|
#define QLE_IOCB_CMD_TYPE_7 0x18
|
|
#define QLE_IOCB_CT_PASSTHROUGH 0x29
|
|
#define QLE_IOCB_MAILBOX 0x39
|
|
#define QLE_IOCB_CMD_TYPE_6 0x48
|
|
#define QLE_IOCB_PLOGX 0x52
|
|
|
|
#define QLE_REQ_FLAG_CONT 0x01
|
|
#define QLE_REQ_FLAG_FULL 0x02
|
|
#define QLE_REQ_FLAG_BAD_HDR 0x04
|
|
#define QLE_REQ_FLAG_BAD_PKT 0x08
|
|
|
|
#define QLE_RESP_FLAG_INVALID_COUNT 0x10
|
|
#define QLE_RESP_FLAG_INVALID_ORDER 0x20
|
|
#define QLE_RESP_FLAG_DMA_ERR 0x40
|
|
#define QLE_RESP_FLAG_RESERVED 0x80
|
|
|
|
#define QLE_IOCB_CTRL_FLAG_WRITE 0x0001
|
|
#define QLE_IOCB_CTRL_FLAG_READ 0x0002
|
|
#define QLE_IOCB_CTRL_FLAG_EXT_SEG 0x0004
|
|
|
|
#define QLE_IOCB_SEGS_PER_CMD 2
|
|
|
|
#define QLE_IOCB_MARKER_SYNC_ALL 2
|
|
|
|
struct qle_iocb_seg {
|
|
u_int32_t seg_addr_lo;
|
|
u_int32_t seg_addr_hi;
|
|
u_int32_t seg_len;
|
|
} __packed __aligned(4);
|
|
|
|
struct qle_iocb_status {
|
|
u_int8_t entry_type; /* QLE_IOCB_STATUS */
|
|
u_int8_t entry_count;
|
|
u_int8_t seqno;
|
|
u_int8_t flags;
|
|
|
|
u_int32_t handle;
|
|
u_int16_t completion;
|
|
u_int16_t ox_id;
|
|
u_int32_t resid;
|
|
u_int16_t reserved;
|
|
u_int16_t state_flags;
|
|
u_int16_t reserved2;
|
|
u_int16_t scsi_status;
|
|
u_int32_t fcp_rsp_resid;
|
|
u_int32_t fcp_sense_len;
|
|
|
|
u_int32_t fcp_rsp_len;
|
|
u_int8_t data[28];
|
|
} __packed __aligned(64);
|
|
|
|
/* completion */
|
|
#define QLE_IOCB_STATUS_COMPLETE 0x0000
|
|
#define QLE_IOCB_STATUS_DMA_ERROR 0x0002
|
|
#define QLE_IOCB_STATUS_RESET 0x0004
|
|
#define QLE_IOCB_STATUS_ABORTED 0x0005
|
|
#define QLE_IOCB_STATUS_TIMEOUT 0x0006
|
|
#define QLE_IOCB_STATUS_DATA_OVERRUN 0x0007
|
|
#define QLE_IOCB_STATUS_DATA_UNDERRUN 0x0015
|
|
#define QLE_IOCB_STATUS_QUEUE_FULL 0x001C
|
|
#define QLE_IOCB_STATUS_PORT_UNAVAIL 0x0028
|
|
#define QLE_IOCB_STATUS_PORT_LOGGED_OUT 0x0029
|
|
#define QLE_IOCB_STATUS_PORT_CHANGED 0x002A
|
|
#define QLE_IOCB_STATUS_PORT_BUSY 0x002B
|
|
|
|
#define QLE_SCSI_STATUS_FCP_LEN_VALID 0x0100
|
|
#define QLE_SCSI_STATUS_SENSE_VALID 0x0200
|
|
#define QLE_SCSI_STATUS_RESID_OVER 0x0400
|
|
#define QLE_SCSI_STATUS_RESID_UNDER 0x0800
|
|
|
|
|
|
struct qle_iocb_marker {
|
|
u_int8_t entry_type; /* QLE_IOCB_MARKER */
|
|
u_int8_t entry_count;
|
|
u_int8_t seqno;
|
|
u_int8_t flags;
|
|
|
|
u_int32_t handle;
|
|
u_int8_t reserved;
|
|
u_int8_t target;
|
|
u_int8_t modifier;
|
|
u_int8_t vp_index;
|
|
u_int16_t marker_flags;
|
|
u_int16_t lun;
|
|
u_int8_t reserved2[48];
|
|
} __packed __aligned(64);
|
|
|
|
struct qle_iocb_status_cont {
|
|
u_int8_t entry_type; /* QLE_IOCB_STATUS_CONT */
|
|
u_int8_t entry_count;
|
|
u_int8_t seqno;
|
|
u_int8_t flags;
|
|
|
|
u_int8_t sense[44];
|
|
} __packed __aligned(64);
|
|
|
|
struct qle_iocb_req6 {
|
|
u_int8_t entry_type; /* QLE_IOCB_CMD_TYPE_6 */
|
|
u_int8_t entry_count;
|
|
u_int8_t seqno;
|
|
u_int8_t flags;
|
|
|
|
u_int32_t req_handle;
|
|
u_int16_t req_nport_handle;
|
|
u_int16_t req_timeout;
|
|
u_int16_t req_data_seg_count;
|
|
u_int16_t req_resp_seg_count;
|
|
|
|
u_int16_t req_fcp_lun[4];
|
|
|
|
u_int16_t req_ctrl_flags;
|
|
u_int16_t req_fcp_cmnd_len;
|
|
|
|
u_int32_t req_fcp_cmnd_addr_lo;
|
|
u_int32_t req_fcp_cmnd_addr_hi;
|
|
|
|
u_int32_t req_resp_seg_addr_lo;
|
|
u_int32_t req_resp_seg_addr_hi;
|
|
|
|
u_int32_t req_data_len;
|
|
|
|
u_int32_t req_target_id;
|
|
struct qle_iocb_seg req_data_seg;
|
|
} __packed __aligned(64);
|
|
|
|
struct qle_fcp_cmnd {
|
|
u_int16_t fcp_lun[4];
|
|
u_int8_t fcp_crn;
|
|
u_int8_t fcp_task_attr;
|
|
u_int8_t fcp_task_mgmt;
|
|
u_int8_t fcp_add_cdb_len;
|
|
|
|
u_int8_t fcp_cdb[52];
|
|
/* 64 bytes total */
|
|
} __packed __aligned(64);
|
|
|
|
struct qle_iocb_ct_passthrough {
|
|
u_int8_t entry_type; /* QLE_IOCB_CT_PASSTHROUGH */
|
|
u_int8_t entry_count;
|
|
u_int8_t seqno;
|
|
u_int8_t flags;
|
|
|
|
u_int32_t req_handle;
|
|
u_int16_t req_status;
|
|
u_int16_t req_nport_handle;
|
|
u_int16_t req_dsd_count;
|
|
u_int8_t req_vp_index;
|
|
u_int8_t req_reserved;
|
|
u_int16_t req_timeout;
|
|
u_int16_t req_reserved2;
|
|
u_int16_t req_resp_dsd_count;
|
|
u_int16_t req_reserved3[5];
|
|
u_int32_t req_resp_byte_count;
|
|
u_int32_t req_cmd_byte_count;
|
|
struct qle_iocb_seg req_cmd_seg;
|
|
struct qle_iocb_seg req_resp_seg;
|
|
} __packed __aligned(64);
|
|
|
|
#define QLE_PLOGX_LOGIN 0x0000
|
|
#define QLE_PLOGX_LOGIN_COND 0x0010
|
|
|
|
#define QLE_PLOGX_LOGOUT 0x0008
|
|
#define QLE_PLOGX_LOGOUT_IMPLICIT 0x0010
|
|
#define QLE_PLOGX_LOGOUT_ALL 0x0020
|
|
#define QLE_PLOGX_LOGOUT_EXPLICIT 0x0040
|
|
#define QLE_PLOGX_LOGOUT_FREE_HANDLE 0x0080
|
|
|
|
#define QLE_PLOGX_PORT_UNAVAILABLE 0x28
|
|
#define QLE_PLOGX_PORT_LOGGED_OUT 0x29
|
|
#define QLE_PLOGX_ERROR 0x31
|
|
|
|
#define QLE_PLOGX_ERROR_PORT_ID_USED 0x1A
|
|
#define QLE_PLOGX_ERROR_HANDLE_USED 0x1B
|
|
#define QLE_PLOGX_ERROR_NO_HANDLE 0x1C
|
|
|
|
struct qle_iocb_plogx {
|
|
u_int8_t entry_type; /* QLE_IOCB_PLOGX */
|
|
u_int8_t entry_count;
|
|
u_int8_t seqno;
|
|
u_int8_t flags;
|
|
|
|
u_int32_t req_handle;
|
|
u_int16_t req_status;
|
|
u_int16_t req_nport_handle;
|
|
u_int16_t req_flags;
|
|
u_int8_t req_vp_index;
|
|
u_int8_t req_reserved;
|
|
u_int16_t req_port_id_lo;
|
|
u_int8_t req_port_id_hi;
|
|
u_int8_t req_rspsize;
|
|
u_int32_t req_ioparms[11];
|
|
} __packed __aligned(64);
|