1098ca2bdSWarner Losh /*- 24d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 3718cf2ccSPedro F. Giffuni * 41b760be4SAlexander Motin * Copyright (c) 2009-2020 Alexander Motin <mav@FreeBSD.org> 52df76c16SMatt Jacob * Copyright (c) 1997-2009 by Matthew Jacob 66054c3f6SMatt Jacob * All rights reserved. 76054c3f6SMatt Jacob * 86054c3f6SMatt Jacob * Redistribution and use in source and binary forms, with or without 96054c3f6SMatt Jacob * modification, are permitted provided that the following conditions 106054c3f6SMatt Jacob * are met: 116054c3f6SMatt Jacob * 12e48b2487SMatt Jacob * 1. Redistributions of source code must retain the above copyright 13e48b2487SMatt Jacob * notice, this list of conditions and the following disclaimer. 14e48b2487SMatt Jacob * 2. Redistributions in binary form must reproduce the above copyright 15e48b2487SMatt Jacob * notice, this list of conditions and the following disclaimer in the 16e48b2487SMatt Jacob * documentation and/or other materials provided with the distribution. 17e48b2487SMatt Jacob * 18e48b2487SMatt Jacob * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 196054c3f6SMatt Jacob * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 206054c3f6SMatt Jacob * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21e48b2487SMatt Jacob * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 22e48b2487SMatt Jacob * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 236054c3f6SMatt Jacob * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 246054c3f6SMatt Jacob * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 256054c3f6SMatt Jacob * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 266054c3f6SMatt Jacob * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 276054c3f6SMatt Jacob * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 286054c3f6SMatt Jacob * SUCH DAMAGE. 292df76c16SMatt Jacob * 30e48b2487SMatt Jacob */ 31cb8461c8SMatt Jacob 32e48b2487SMatt Jacob /* 33bafe4ceeSGordon Bergling * Mailbox and Queue Entry Definitions for Qlogic ISP SCSI adapters. 346054c3f6SMatt Jacob */ 356054c3f6SMatt Jacob #ifndef _ISPMBOX_H 366054c3f6SMatt Jacob #define _ISPMBOX_H 376054c3f6SMatt Jacob 386054c3f6SMatt Jacob /* 396054c3f6SMatt Jacob * Mailbox Command Opcodes 406054c3f6SMatt Jacob */ 416054c3f6SMatt Jacob #define MBOX_NO_OP 0x0000 426054c3f6SMatt Jacob #define MBOX_LOAD_RAM 0x0001 436054c3f6SMatt Jacob #define MBOX_EXEC_FIRMWARE 0x0002 4410ed63fcSJoerg Pulz #define MBOX_LOAD_FLASH_FIRMWARE 0x0003 456054c3f6SMatt Jacob #define MBOX_WRITE_RAM_WORD 0x0004 466054c3f6SMatt Jacob #define MBOX_READ_RAM_WORD 0x0005 476054c3f6SMatt Jacob #define MBOX_MAILBOX_REG_TEST 0x0006 486054c3f6SMatt Jacob #define MBOX_VERIFY_CHECKSUM 0x0007 496054c3f6SMatt Jacob #define MBOX_ABOUT_FIRMWARE 0x0008 50a4f3a2beSMatt Jacob #define MBOX_LOAD_RISC_RAM_2100 0x0009 5110ed63fcSJoerg Pulz #define MBOX_DUMP_RISC_RAM_2100 0x000a 5210ed63fcSJoerg Pulz #define MBOX_SECURE_FLASH_UPDATE 0x000a /* Secure Flash Update(28xx) */ 5310365e5aSMatt Jacob #define MBOX_LOAD_RISC_RAM 0x000b 54ec6d4d0fSAlexander Motin #define MBOX_DUMP_RISC_RAM 0x000c 558a97c03aSMatt Jacob #define MBOX_WRITE_RAM_WORD_EXTENDED 0x000d 566054c3f6SMatt Jacob #define MBOX_CHECK_FIRMWARE 0x000e 57b8941882SMatt Jacob #define MBOX_READ_RAM_WORD_EXTENDED 0x000f 586054c3f6SMatt Jacob #define MBOX_INIT_REQ_QUEUE 0x0010 596054c3f6SMatt Jacob #define MBOX_INIT_RES_QUEUE 0x0011 606054c3f6SMatt Jacob #define MBOX_EXECUTE_IOCB 0x0012 616054c3f6SMatt Jacob #define MBOX_WAKE_UP 0x0013 626054c3f6SMatt Jacob #define MBOX_STOP_FIRMWARE 0x0014 636054c3f6SMatt Jacob #define MBOX_ABORT 0x0015 646054c3f6SMatt Jacob #define MBOX_ABORT_DEVICE 0x0016 656054c3f6SMatt Jacob #define MBOX_ABORT_TARGET 0x0017 666054c3f6SMatt Jacob #define MBOX_BUS_RESET 0x0018 676054c3f6SMatt Jacob #define MBOX_STOP_QUEUE 0x0019 686054c3f6SMatt Jacob #define MBOX_START_QUEUE 0x001a 696054c3f6SMatt Jacob #define MBOX_SINGLE_STEP_QUEUE 0x001b 706054c3f6SMatt Jacob #define MBOX_ABORT_QUEUE 0x001c 716054c3f6SMatt Jacob #define MBOX_GET_DEV_QUEUE_STATUS 0x001d 726054c3f6SMatt Jacob /* 1e */ 736054c3f6SMatt Jacob #define MBOX_GET_FIRMWARE_STATUS 0x001f 746054c3f6SMatt Jacob #define MBOX_GET_INIT_SCSI_ID 0x0020 756054c3f6SMatt Jacob #define MBOX_GET_SELECT_TIMEOUT 0x0021 766054c3f6SMatt Jacob #define MBOX_GET_RETRY_COUNT 0x0022 776054c3f6SMatt Jacob #define MBOX_GET_TAG_AGE_LIMIT 0x0023 786054c3f6SMatt Jacob #define MBOX_GET_CLOCK_RATE 0x0024 796054c3f6SMatt Jacob #define MBOX_GET_ACT_NEG_STATE 0x0025 806054c3f6SMatt Jacob #define MBOX_GET_ASYNC_DATA_SETUP_TIME 0x0026 816054c3f6SMatt Jacob #define MBOX_GET_SBUS_PARAMS 0x0027 82dec19856SMatt Jacob #define MBOX_GET_PCI_PARAMS MBOX_GET_SBUS_PARAMS 836054c3f6SMatt Jacob #define MBOX_GET_TARGET_PARAMS 0x0028 846054c3f6SMatt Jacob #define MBOX_GET_DEV_QUEUE_PARAMS 0x0029 85a8234ad1SMatt Jacob #define MBOX_GET_RESET_DELAY_PARAMS 0x002a 866054c3f6SMatt Jacob /* 2b */ 876054c3f6SMatt Jacob /* 2c */ 886054c3f6SMatt Jacob /* 2d */ 896054c3f6SMatt Jacob /* 2e */ 906054c3f6SMatt Jacob /* 2f */ 916054c3f6SMatt Jacob #define MBOX_SET_INIT_SCSI_ID 0x0030 926054c3f6SMatt Jacob #define MBOX_SET_SELECT_TIMEOUT 0x0031 936054c3f6SMatt Jacob #define MBOX_SET_RETRY_COUNT 0x0032 946054c3f6SMatt Jacob #define MBOX_SET_TAG_AGE_LIMIT 0x0033 956054c3f6SMatt Jacob #define MBOX_SET_CLOCK_RATE 0x0034 96a8234ad1SMatt Jacob #define MBOX_SET_ACT_NEG_STATE 0x0035 976054c3f6SMatt Jacob #define MBOX_SET_ASYNC_DATA_SETUP_TIME 0x0036 986054c3f6SMatt Jacob #define MBOX_SET_SBUS_CONTROL_PARAMS 0x0037 996054c3f6SMatt Jacob #define MBOX_SET_PCI_PARAMETERS 0x0037 1006054c3f6SMatt Jacob #define MBOX_SET_TARGET_PARAMS 0x0038 1016054c3f6SMatt Jacob #define MBOX_SET_DEV_QUEUE_PARAMS 0x0039 102a8234ad1SMatt Jacob #define MBOX_SET_RESET_DELAY_PARAMS 0x003a 1036054c3f6SMatt Jacob /* 3b */ 1046054c3f6SMatt Jacob /* 3c */ 1056054c3f6SMatt Jacob /* 3d */ 1066054c3f6SMatt Jacob /* 3e */ 1076054c3f6SMatt Jacob /* 3f */ 1086054c3f6SMatt Jacob #define MBOX_RETURN_BIOS_BLOCK_ADDR 0x0040 1096054c3f6SMatt Jacob #define MBOX_WRITE_FOUR_RAM_WORDS 0x0041 1106054c3f6SMatt Jacob #define MBOX_EXEC_BIOS_IOCB 0x0042 111cbf57b47SMatt Jacob #define MBOX_SET_FW_FEATURES 0x004a 112cbf57b47SMatt Jacob #define MBOX_GET_FW_FEATURES 0x004b 113cbf57b47SMatt Jacob #define FW_FEATURE_FAST_POST 0x1 11475c1e828SMatt Jacob #define FW_FEATURE_LVD_NOTIFY 0x2 11575c1e828SMatt Jacob #define FW_FEATURE_RIO_32BIT 0x4 11675c1e828SMatt Jacob #define FW_FEATURE_RIO_16BIT 0x8 1176054c3f6SMatt Jacob 1187e4bd168SMatt Jacob #define MBOX_INIT_REQ_QUEUE_A64 0x0052 1197e4bd168SMatt Jacob #define MBOX_INIT_RES_QUEUE_A64 0x0053 1207e4bd168SMatt Jacob 121c507669aSMatt Jacob #define MBOX_ENABLE_TARGET_MODE 0x0055 12236195997SMatt Jacob #define ENABLE_TARGET_FLAG 0x8000 1238055acd8SMatt Jacob #define ENABLE_TQING_FLAG 0x0004 1248055acd8SMatt Jacob #define ENABLE_MANDATORY_DISC 0x0002 125c507669aSMatt Jacob #define MBOX_GET_TARGET_STATUS 0x0056 126762fa8a5SMatt Jacob 127c507669aSMatt Jacob /* These are for the ISP2X00 FC cards */ 128ec6d4d0fSAlexander Motin #define MBOX_WRITE_FC_SERDES_REG 0x0003 /* FC only */ 129ec6d4d0fSAlexander Motin #define MBOX_READ_FC_SERDES_REG 0x0004 /* FC only */ 130ec6d4d0fSAlexander Motin #define MBOX_GET_IO_STATUS 0x0012 131ec6d4d0fSAlexander Motin #define MBOX_SET_TRANSMIT_PARAMS 0x0019 132ec6d4d0fSAlexander Motin #define MBOX_SET_PORT_PARAMS 0x001a 133ec6d4d0fSAlexander Motin #define MBOX_LOAD_OP_FW_PARAMS 0x001b 134ec6d4d0fSAlexander Motin #define MBOX_INIT_MULTIPLE_QUEUE 0x001f 135c507669aSMatt Jacob #define MBOX_GET_LOOP_ID 0x0020 1362df76c16SMatt Jacob /* for 24XX cards, outgoing mailbox 7 has these values for F or FL topologies */ 1372df76c16SMatt Jacob #define ISP24XX_INORDER 0x0100 1382df76c16SMatt Jacob #define ISP24XX_NPIV_SAN 0x0400 1392df76c16SMatt Jacob #define ISP24XX_VSAN_SAN 0x1000 1402df76c16SMatt Jacob #define ISP24XX_FC_SP_SAN 0x2000 141ec6d4d0fSAlexander Motin #define MBOX_GET_TIMEOUT_PARAMS 0x0022 142c507669aSMatt Jacob #define MBOX_GET_FIRMWARE_OPTIONS 0x0028 143ec6d4d0fSAlexander Motin #define MBOX_GENERATE_SYSTEM_ERROR 0x002a 144ec6d4d0fSAlexander Motin #define MBOX_WRITE_SFP 0x0030 145ec6d4d0fSAlexander Motin #define MBOX_READ_SFP 0x0031 146ec6d4d0fSAlexander Motin #define MBOX_SET_TIMEOUT_PARAMS 0x0032 147c507669aSMatt Jacob #define MBOX_SET_FIRMWARE_OPTIONS 0x0038 148ec6d4d0fSAlexander Motin #define MBOX_GET_SET_FC_LED_CONF 0x003b 149ec6d4d0fSAlexander Motin #define MBOX_RESTART_NIC_FIRMWARE 0x003d /* FCoE only */ 150ec6d4d0fSAlexander Motin #define MBOX_ACCESS_CONTROL 0x003e 151ec6d4d0fSAlexander Motin #define MBOX_LOOP_PORT_BYPASS 0x0040 /* FC only */ 152ec6d4d0fSAlexander Motin #define MBOX_LOOP_PORT_ENABLE 0x0041 /* FC only */ 153c507669aSMatt Jacob #define MBOX_GET_RESOURCE_COUNT 0x0042 15410365e5aSMatt Jacob #define MBOX_REQUEST_OFFLINE_MODE 0x0043 155ec6d4d0fSAlexander Motin #define MBOX_DIAGNOSTIC_ECHO_TEST 0x0044 156ec6d4d0fSAlexander Motin #define MBOX_DIAGNOSTIC_LOOPBACK 0x0045 157c507669aSMatt Jacob #define MBOX_ENHANCED_GET_PDB 0x0047 1582df76c16SMatt Jacob #define MBOX_INIT_FIRMWARE_MULTI_ID 0x0048 /* 2400 only */ 1592df76c16SMatt Jacob #define MBOX_GET_VP_DATABASE 0x0049 /* 2400 only */ 1602df76c16SMatt Jacob #define MBOX_GET_VP_DATABASE_ENTRY 0x004a /* 2400 only */ 161ec6d4d0fSAlexander Motin #define MBOX_GET_FCF_LIST 0x0050 /* FCoE only */ 162ec6d4d0fSAlexander Motin #define MBOX_GET_DCBX_PARAMETERS 0x0051 /* FCoE only */ 163ec6d4d0fSAlexander Motin #define MBOX_HOST_MEMORY_COPY 0x0053 164c507669aSMatt Jacob #define MBOX_EXEC_COMMAND_IOCB_A64 0x0054 165ec6d4d0fSAlexander Motin #define MBOX_SEND_RNID 0x0057 166ec6d4d0fSAlexander Motin #define MBOX_SET_PARAMETERS 0x0059 167ec6d4d0fSAlexander Motin #define MBOX_GET_PARAMETERS 0x005a 168ec6d4d0fSAlexander Motin #define MBOX_DRIVER_HEARTBEAT 0x005B /* FC only */ 169ec6d4d0fSAlexander Motin #define MBOX_FW_HEARTBEAT 0x005C 170ec6d4d0fSAlexander Motin #define MBOX_GET_SET_DATA_RATE 0x005D /* >=23XX only */ 171ec6d4d0fSAlexander Motin #define MBGSD_GET_RATE 0 172ec6d4d0fSAlexander Motin #define MBGSD_SET_RATE 1 173ec6d4d0fSAlexander Motin #define MBGSD_SET_RATE_NOW 2 /* 24XX only */ 174ec6d4d0fSAlexander Motin #define MBGSD_1GB 0x00 175ec6d4d0fSAlexander Motin #define MBGSD_2GB 0x01 176ec6d4d0fSAlexander Motin #define MBGSD_AUTO 0x02 177ec6d4d0fSAlexander Motin #define MBGSD_4GB 0x03 /* 24XX only */ 178ec6d4d0fSAlexander Motin #define MBGSD_8GB 0x04 /* 25XX only */ 179ec6d4d0fSAlexander Motin #define MBGSD_16GB 0x05 /* 26XX only */ 18014e084adSAlexander Motin #define MBGSD_32GB 0x06 /* 27XX only */ 181407abff6SJoerg Pulz #define MBGSD_64GB 0x07 /* 28XX only */ 182ec6d4d0fSAlexander Motin #define MBGSD_10GB 0x13 /* 26XX only */ 183ec6d4d0fSAlexander Motin #define MBOX_SEND_RNFT 0x005e 184c507669aSMatt Jacob #define MBOX_INIT_FIRMWARE 0x0060 185c507669aSMatt Jacob #define MBOX_GET_INIT_CONTROL_BLOCK 0x0061 186c507669aSMatt Jacob #define MBOX_INIT_LIP 0x0062 187c507669aSMatt Jacob #define MBOX_GET_FC_AL_POSITION_MAP 0x0063 188c507669aSMatt Jacob #define MBOX_GET_PORT_DB 0x0064 189c507669aSMatt Jacob #define MBOX_CLEAR_ACA 0x0065 190c507669aSMatt Jacob #define MBOX_TARGET_RESET 0x0066 191c507669aSMatt Jacob #define MBOX_CLEAR_TASK_SET 0x0067 192c507669aSMatt Jacob #define MBOX_ABORT_TASK_SET 0x0068 193c507669aSMatt Jacob #define MBOX_GET_FW_STATE 0x0069 194c507669aSMatt Jacob #define MBOX_GET_PORT_NAME 0x006A 195c507669aSMatt Jacob #define MBOX_GET_LINK_STATUS 0x006B 196c507669aSMatt Jacob #define MBOX_INIT_LIP_RESET 0x006C 197ec6d4d0fSAlexander Motin #define MBOX_GET_LINK_STAT_PR_DATA_CNT 0x006D 198c507669aSMatt Jacob #define MBOX_SEND_SNS 0x006E 199c507669aSMatt Jacob #define MBOX_FABRIC_LOGIN 0x006F 200c507669aSMatt Jacob #define MBOX_SEND_CHANGE_REQUEST 0x0070 201c507669aSMatt Jacob #define MBOX_FABRIC_LOGOUT 0x0071 202c507669aSMatt Jacob #define MBOX_INIT_LIP_LOGIN 0x0072 203b6983e5fSAlexander Motin #define MBOX_GET_PORT_NODE_NAME_LIST 0x0075 204ec6d4d0fSAlexander Motin #define MBOX_SET_VENDOR_ID 0x0076 205ec6d4d0fSAlexander Motin #define MBOX_GET_XGMAC_STATS 0x007a 206b6983e5fSAlexander Motin #define MBOX_GET_ID_LIST 0x007C 207ec6d4d0fSAlexander Motin #define MBOX_SEND_LFA 0x007d 2088e62a8acSMatt Jacob #define MBOX_LUN_RESET 0x007E 209c507669aSMatt Jacob 2106054c3f6SMatt Jacob #define ISP2100_SET_PCI_PARAM 0x00ff 2116054c3f6SMatt Jacob 2126054c3f6SMatt Jacob /* 213478f8a96SJustin T. Gibbs * Mailbox Command Complete Status Codes 214478f8a96SJustin T. Gibbs */ 215478f8a96SJustin T. Gibbs #define MBOX_COMMAND_COMPLETE 0x4000 216478f8a96SJustin T. Gibbs #define MBOX_INVALID_COMMAND 0x4001 217478f8a96SJustin T. Gibbs #define MBOX_HOST_INTERFACE_ERROR 0x4002 218478f8a96SJustin T. Gibbs #define MBOX_TEST_FAILED 0x4003 219478f8a96SJustin T. Gibbs #define MBOX_COMMAND_ERROR 0x4005 220478f8a96SJustin T. Gibbs #define MBOX_COMMAND_PARAM_ERROR 0x4006 221eb76ec80SMatt Jacob #define MBOX_PORT_ID_USED 0x4007 222eb76ec80SMatt Jacob #define MBOX_LOOP_ID_USED 0x4008 223eb76ec80SMatt Jacob #define MBOX_ALL_IDS_USED 0x4009 224eb76ec80SMatt Jacob #define MBOX_NOT_LOGGED_IN 0x400A 2252e6beaf1SAlexander Motin #define MBOX_LINK_DOWN_ERROR 0x400B 2262e6beaf1SAlexander Motin #define MBOX_LOOPBACK_ERROR 0x400C 2272e6beaf1SAlexander Motin #define MBOX_CHECKSUM_ERROR 0x4010 2282e6beaf1SAlexander Motin #define MBOX_INVALID_PRODUCT_KEY 0x4020 22910365e5aSMatt Jacob /* pseudo mailbox completion codes */ 23010365e5aSMatt Jacob #define MBOX_REGS_BUSY 0x6000 /* registers in use */ 23110365e5aSMatt Jacob #define MBOX_TIMEOUT 0x6001 /* command timed out */ 23210365e5aSMatt Jacob 2332e6beaf1SAlexander Motin #define MBLOGALL 0xffffffff 2342e6beaf1SAlexander Motin #define MBLOGNONE 0x00000000 2352e6beaf1SAlexander Motin #define MBLOGMASK(x) (1 << (((x) - 1) & 0x1f)) 236478f8a96SJustin T. Gibbs 237478f8a96SJustin T. Gibbs /* 238478f8a96SJustin T. Gibbs * Asynchronous event status codes 239478f8a96SJustin T. Gibbs */ 240478f8a96SJustin T. Gibbs #define ASYNC_BUS_RESET 0x8001 241478f8a96SJustin T. Gibbs #define ASYNC_SYSTEM_ERROR 0x8002 242478f8a96SJustin T. Gibbs #define ASYNC_RQS_XFER_ERR 0x8003 243478f8a96SJustin T. Gibbs #define ASYNC_RSP_XFER_ERR 0x8004 2441b760be4SAlexander Motin #define ASYNC_ATIO_XFER_ERR 0x8005 245478f8a96SJustin T. Gibbs #define ASYNC_TIMEOUT_RESET 0x8006 246ff717ff3SMatt Jacob #define ASYNC_DEVICE_RESET 0x8007 247478f8a96SJustin T. Gibbs #define ASYNC_EXTMSG_UNDERRUN 0x800A 248478f8a96SJustin T. Gibbs #define ASYNC_SCAM_INT 0x800B 249478f8a96SJustin T. Gibbs #define ASYNC_HUNG_SCSI 0x800C 250478f8a96SJustin T. Gibbs #define ASYNC_KILLED_BUS 0x800D 251478f8a96SJustin T. Gibbs #define ASYNC_BUS_TRANSIT 0x800E /* LVD -> HVD, eg. */ 2524e432bf6SAlexander Motin #define ASYNC_LIP_OCCURRED 0x8010 /* FC only */ 253478f8a96SJustin T. Gibbs #define ASYNC_LOOP_UP 0x8011 254478f8a96SJustin T. Gibbs #define ASYNC_LOOP_DOWN 0x8012 2554e432bf6SAlexander Motin #define ASYNC_LOOP_RESET 0x8013 /* FC only */ 256ff717ff3SMatt Jacob #define ASYNC_PDB_CHANGED 0x8014 257478f8a96SJustin T. Gibbs #define ASYNC_CHANGE_NOTIFY 0x8015 258e2929f5fSAlexander Motin #define ASYNC_LIP_NOS_OLS_RECV 0x8016 /* FC only */ 2594e432bf6SAlexander Motin #define ASYNC_LIP_ERROR 0x8017 /* FC only */ 2604e432bf6SAlexander Motin #define ASYNC_AUTO_PLOGI_RJT 0x8018 26110365e5aSMatt Jacob #define ASYNC_SECURITY_UPDATE 0x801B 2621ee34f05SMatt Jacob #define ASYNC_CMD_CMPLT 0x8020 2631ee34f05SMatt Jacob #define ASYNC_CTIO_DONE 0x8021 264443e752dSMatt Jacob #define ASYNC_RIO32_1 0x8021 265443e752dSMatt Jacob #define ASYNC_RIO32_2 0x8022 2661ee34f05SMatt Jacob #define ASYNC_IP_XMIT_DONE 0x8022 2671ee34f05SMatt Jacob #define ASYNC_IP_RECV_DONE 0x8023 2681ee34f05SMatt Jacob #define ASYNC_IP_BROADCAST 0x8024 2691ee34f05SMatt Jacob #define ASYNC_IP_RCVQ_LOW 0x8025 2701ee34f05SMatt Jacob #define ASYNC_IP_RCVQ_EMPTY 0x8026 2711ee34f05SMatt Jacob #define ASYNC_IP_RECV_DONE_ALIGNED 0x8027 2724e432bf6SAlexander Motin #define ASYNC_ERR_LOGGING_DISABLED 0x8029 2734e432bf6SAlexander Motin #define ASYNC_PTPMODE 0x8030 /* FC only */ 274443e752dSMatt Jacob #define ASYNC_RIO16_1 0x8031 275443e752dSMatt Jacob #define ASYNC_RIO16_2 0x8032 276443e752dSMatt Jacob #define ASYNC_RIO16_3 0x8033 277443e752dSMatt Jacob #define ASYNC_RIO16_4 0x8034 278443e752dSMatt Jacob #define ASYNC_RIO16_5 0x8035 279c2e74673SMatt Jacob #define ASYNC_CONNMODE 0x8036 280c2e74673SMatt Jacob #define ISP_CONN_LOOP 1 281c2e74673SMatt Jacob #define ISP_CONN_PTP 2 282c2e74673SMatt Jacob #define ISP_CONN_BADLIP 3 283c2e74673SMatt Jacob #define ISP_CONN_FATAL 4 284c2e74673SMatt Jacob #define ISP_CONN_LOOPBACK 5 2854e432bf6SAlexander Motin #define ASYNC_P2P_INIT_ERR 0x8037 286443e752dSMatt Jacob #define ASYNC_RIOZIO_STALL 0x8040 /* there's a RIO/ZIO entry that hasn't been serviced */ 287443e752dSMatt Jacob #define ASYNC_RIO32_2_2200 0x8042 /* same as ASYNC_RIO32_2, but for 2100/2200 */ 28810365e5aSMatt Jacob #define ASYNC_RCV_ERR 0x8048 2894e432bf6SAlexander Motin /* 2904e432bf6SAlexander Motin * 2.01.31 2200 Only. Need Bit 13 in Mailbox 1 for Set Firmware Options 2914e432bf6SAlexander Motin * mailbox command to enable this. 2924e432bf6SAlexander Motin */ 2934e432bf6SAlexander Motin #define ASYNC_QFULL_SENT 0x8049 2944e432bf6SAlexander Motin #define ASYNC_RJT_SENT 0x8049 /* 24XX only */ 2954e432bf6SAlexander Motin #define ASYNC_SEL_CLASS2_P_RJT_SENT 0x804f 2964e432bf6SAlexander Motin #define ASYNC_FW_RESTART_COMPLETE 0x8060 2974e432bf6SAlexander Motin #define ASYNC_TEMPERATURE_ALERT 0x8070 2984e432bf6SAlexander Motin #define ASYNC_INTER_DRIVER_COMP 0x8100 /* FCoE only */ 2994e432bf6SAlexander Motin #define ASYNC_INTER_DRIVER_NOTIFY 0x8101 /* FCoE only */ 3004e432bf6SAlexander Motin #define ASYNC_INTER_DRIVER_TIME_EXT 0x8102 /* FCoE only */ 30114e084adSAlexander Motin #define ASYNC_TRANSCEIVER_INSERTION 0x8130 30214e084adSAlexander Motin #define ASYNC_TRANSCEIVER_REMOVAL 0x8131 3034e432bf6SAlexander Motin #define ASYNC_NIC_FW_STATE_CHANGE 0x8200 /* FCoE only */ 3044e432bf6SAlexander Motin #define ASYNC_AUTOLOAD_FW_COMPLETE 0x8400 3054e432bf6SAlexander Motin #define ASYNC_AUTOLOAD_FW_FAILURE 0x8401 30610365e5aSMatt Jacob 3071ee34f05SMatt Jacob /* 308e3ec25e2SMatt Jacob * Firmware Options. There are a lot of them. 309e3ec25e2SMatt Jacob * 310e3ec25e2SMatt Jacob * IFCOPTN - ISP Fibre Channel Option Word N 311e3ec25e2SMatt Jacob */ 312e3ec25e2SMatt Jacob #define IFCOPT1_EQFQASYNC (1 << 13) /* enable QFULL notification */ 313e3ec25e2SMatt Jacob #define IFCOPT1_EAABSRCVD (1 << 12) 314e3ec25e2SMatt Jacob #define IFCOPT1_RJTASYNC (1 << 11) /* enable 8018 notification */ 315e3ec25e2SMatt Jacob #define IFCOPT1_ENAPURE (1 << 10) 316e3ec25e2SMatt Jacob #define IFCOPT1_ENA8017 (1 << 7) 317e3ec25e2SMatt Jacob #define IFCOPT1_DISGPIO67 (1 << 6) 318e3ec25e2SMatt Jacob #define IFCOPT1_LIPLOSSIMM (1 << 5) 319e3ec25e2SMatt Jacob #define IFCOPT1_DISF7SWTCH (1 << 4) 320e3ec25e2SMatt Jacob #define IFCOPT1_CTIO_RETRY (1 << 3) 321e3ec25e2SMatt Jacob #define IFCOPT1_LIPASYNC (1 << 1) 322e3ec25e2SMatt Jacob #define IFCOPT1_LIPF8 (1 << 0) 323e3ec25e2SMatt Jacob 324e3ec25e2SMatt Jacob #define IFCOPT2_LOOPBACK (1 << 1) 325e3ec25e2SMatt Jacob #define IFCOPT2_ATIO3_ONLY (1 << 0) 326e3ec25e2SMatt Jacob 327e3ec25e2SMatt Jacob #define IFCOPT3_NOPRLI (1 << 4) /* disable automatic sending of PRLI on local loops */ 328e3ec25e2SMatt Jacob #define IFCOPT3_RNDASYNC (1 << 1) 3291ee34f05SMatt Jacob 33010365e5aSMatt Jacob /* 33110365e5aSMatt Jacob * All IOCB Queue entries are this size 33210365e5aSMatt Jacob */ 33310365e5aSMatt Jacob #define QENTRY_LEN 64 3340f99cb55SAlexander Motin #define QENTRY_MAX 255 335c2e74673SMatt Jacob 336478f8a96SJustin T. Gibbs /* 3376054c3f6SMatt Jacob * Command Structure Definitions 3386054c3f6SMatt Jacob */ 3396054c3f6SMatt Jacob 3406054c3f6SMatt Jacob typedef struct { 3411dae40ebSMatt Jacob uint32_t ds_base; 3421dae40ebSMatt Jacob uint32_t ds_basehi; 3431dae40ebSMatt Jacob uint32_t ds_count; 3441ee34f05SMatt Jacob } ispds64_t; 3451ee34f05SMatt Jacob 3466054c3f6SMatt Jacob typedef struct { 3471dae40ebSMatt Jacob uint8_t rqs_entry_type; 3481dae40ebSMatt Jacob uint8_t rqs_entry_count; 3491dae40ebSMatt Jacob uint8_t rqs_seqno; 3501dae40ebSMatt Jacob uint8_t rqs_flags; 3516054c3f6SMatt Jacob } isphdr_t; 3526054c3f6SMatt Jacob 3536054c3f6SMatt Jacob /* RQS Flag definitions */ 3545bcbd98cSAlexander Motin #define RQSFLAG_BADTYPE 0x04 3555bcbd98cSAlexander Motin #define RQSFLAG_BADPARAM 0x08 3562df76c16SMatt Jacob #define RQSFLAG_BADCOUNT 0x10 3572df76c16SMatt Jacob #define RQSFLAG_BADORDER 0x20 3582df76c16SMatt Jacob #define RQSFLAG_MASK 0x3f 3596054c3f6SMatt Jacob 3606054c3f6SMatt Jacob /* RQS entry_type definitions */ 361478f8a96SJustin T. Gibbs #define RQSTYPE_RESPONSE 0x03 362478f8a96SJustin T. Gibbs #define RQSTYPE_MARKER 0x04 363478f8a96SJustin T. Gibbs #define RQSTYPE_ATIO 0x06 /* Target Mode */ 364478f8a96SJustin T. Gibbs #define RQSTYPE_A64_CONT 0x0a 365478f8a96SJustin T. Gibbs #define RQSTYPE_NOTIFY 0x0d /* Target Mode */ 366478f8a96SJustin T. Gibbs #define RQSTYPE_NOTIFY_ACK 0x0e /* Target Mode */ 367478f8a96SJustin T. Gibbs #define RQSTYPE_STATUS_CONT 0x10 36810365e5aSMatt Jacob #define RQSTYPE_CTIO7 0x12 36910365e5aSMatt Jacob #define RQSTYPE_TSK_MGMT 0x14 3701ee34f05SMatt Jacob #define RQSTYPE_ATIO2 0x16 /* Target Mode */ 37110365e5aSMatt Jacob #define RQSTYPE_T7RQS 0x18 37210365e5aSMatt Jacob #define RQSTYPE_CT_PASSTHRU 0x29 373156c1ebeSAlexander Motin #define RQSTYPE_VP_CTRL 0x30 374156c1ebeSAlexander Motin #define RQSTYPE_VP_MODIFY 0x31 375156c1ebeSAlexander Motin #define RQSTYPE_RPT_ID_ACQ 0x32 37610365e5aSMatt Jacob #define RQSTYPE_ABORT_IO 0x33 377156c1ebeSAlexander Motin #define RQSTYPE_MBOX 0x39 37810365e5aSMatt Jacob #define RQSTYPE_T6RQS 0x48 379156c1ebeSAlexander Motin #define RQSTYPE_PUREX 0x51 38010365e5aSMatt Jacob #define RQSTYPE_LOGIN 0x52 381156c1ebeSAlexander Motin #define RQSTYPE_ELS_PASSTHRU 0x53 382156c1ebeSAlexander Motin #define RQSTYPE_ABTS_RCVD 0x54 383156c1ebeSAlexander Motin #define RQSTYPE_ABTS_RSP 0x55 3846054c3f6SMatt Jacob 38510365e5aSMatt Jacob typedef struct { 38610365e5aSMatt Jacob isphdr_t mrk_header; 38710365e5aSMatt Jacob uint32_t mrk_handle; 38810365e5aSMatt Jacob uint16_t mrk_nphdl; 38910365e5aSMatt Jacob uint8_t mrk_modifier; 39010365e5aSMatt Jacob uint8_t mrk_reserved0; 39110365e5aSMatt Jacob uint8_t mrk_reserved1; 39210365e5aSMatt Jacob uint8_t mrk_vphdl; 39310365e5aSMatt Jacob uint16_t mrk_reserved2; 39410365e5aSMatt Jacob uint8_t mrk_lun[8]; 39510365e5aSMatt Jacob uint8_t mrk_reserved3[40]; 39610365e5aSMatt Jacob } isp_marker_24xx_t; 39710365e5aSMatt Jacob 3983c0e51c7SMatt Jacob #define SYNC_DEVICE 0 3993c0e51c7SMatt Jacob #define SYNC_TARGET 1 4003c0e51c7SMatt Jacob #define SYNC_ALL 2 401e5265237SMatt Jacob #define SYNC_LIP 3 4023c0e51c7SMatt Jacob 403387d8239SMatt Jacob /* 404387d8239SMatt Jacob * ISP24XX structures 405387d8239SMatt Jacob */ 40610365e5aSMatt Jacob typedef struct { 40710365e5aSMatt Jacob isphdr_t req_header; 40810365e5aSMatt Jacob uint32_t req_handle; 40910365e5aSMatt Jacob uint16_t req_nphdl; 41010365e5aSMatt Jacob uint16_t req_time; 41110365e5aSMatt Jacob uint16_t req_seg_count; 41210365e5aSMatt Jacob uint16_t req_reserved; 41310365e5aSMatt Jacob uint8_t req_lun[8]; 41410365e5aSMatt Jacob uint8_t req_alen_datadir; 41510365e5aSMatt Jacob uint8_t req_task_management; 41610365e5aSMatt Jacob uint8_t req_task_attribute; 41710365e5aSMatt Jacob uint8_t req_crn; 41810365e5aSMatt Jacob uint8_t req_cdb[16]; 41910365e5aSMatt Jacob uint32_t req_dl; 42010365e5aSMatt Jacob uint16_t req_tidlo; 42110365e5aSMatt Jacob uint8_t req_tidhi; 42210365e5aSMatt Jacob uint8_t req_vpidx; 42310365e5aSMatt Jacob ispds64_t req_dataseg; 42410365e5aSMatt Jacob } ispreqt7_t; 42510365e5aSMatt Jacob 4262df76c16SMatt Jacob /* Task Management Request Function */ 4272df76c16SMatt Jacob typedef struct { 4282df76c16SMatt Jacob isphdr_t tmf_header; 4292df76c16SMatt Jacob uint32_t tmf_handle; 4302df76c16SMatt Jacob uint16_t tmf_nphdl; 4312df76c16SMatt Jacob uint8_t tmf_reserved0[2]; 4322df76c16SMatt Jacob uint16_t tmf_delay; 4332df76c16SMatt Jacob uint16_t tmf_timeout; 4342df76c16SMatt Jacob uint8_t tmf_lun[8]; 4352df76c16SMatt Jacob uint32_t tmf_flags; 4362df76c16SMatt Jacob uint8_t tmf_reserved1[20]; 4372df76c16SMatt Jacob uint16_t tmf_tidlo; 4382df76c16SMatt Jacob uint8_t tmf_tidhi; 4392df76c16SMatt Jacob uint8_t tmf_vpidx; 4402df76c16SMatt Jacob uint8_t tmf_reserved2[12]; 4412df76c16SMatt Jacob } isp24xx_tmf_t; 4422df76c16SMatt Jacob 4432df76c16SMatt Jacob #define ISP24XX_TMF_NOSEND 0x80000000 4442df76c16SMatt Jacob 4452df76c16SMatt Jacob #define ISP24XX_TMF_LUN_RESET 0x00000010 4462df76c16SMatt Jacob #define ISP24XX_TMF_ABORT_TASK_SET 0x00000008 4472df76c16SMatt Jacob #define ISP24XX_TMF_CLEAR_TASK_SET 0x00000004 4482df76c16SMatt Jacob #define ISP24XX_TMF_TARGET_RESET 0x00000002 4492df76c16SMatt Jacob #define ISP24XX_TMF_CLEAR_ACA 0x00000001 4502df76c16SMatt Jacob 45110365e5aSMatt Jacob /* I/O Abort Structure */ 45210365e5aSMatt Jacob typedef struct { 45310365e5aSMatt Jacob isphdr_t abrt_header; 45410365e5aSMatt Jacob uint32_t abrt_handle; 45510365e5aSMatt Jacob uint16_t abrt_nphdl; 45610365e5aSMatt Jacob uint16_t abrt_options; 45710365e5aSMatt Jacob uint32_t abrt_cmd_handle; 45818c74b22SAlexander Motin uint16_t abrt_queue_number; 45918c74b22SAlexander Motin uint8_t abrt_reserved[30]; 46010365e5aSMatt Jacob uint16_t abrt_tidlo; 46110365e5aSMatt Jacob uint8_t abrt_tidhi; 46210365e5aSMatt Jacob uint8_t abrt_vpidx; 46310365e5aSMatt Jacob uint8_t abrt_reserved1[12]; 46410365e5aSMatt Jacob } isp24xx_abrt_t; 4652df76c16SMatt Jacob 4662df76c16SMatt Jacob #define ISP24XX_ABRT_NOSEND 0x01 /* don't actually send ABTS */ 4672df76c16SMatt Jacob #define ISP24XX_ABRT_OKAY 0x00 /* in nphdl on return */ 46810365e5aSMatt Jacob #define ISP24XX_ABRT_ENXIO 0x31 /* in nphdl on return */ 46910365e5aSMatt Jacob 470126ec864SMatt Jacob #define ISP_CDSEG64 5 471126ec864SMatt Jacob typedef struct { 472126ec864SMatt Jacob isphdr_t req_header; 473126ec864SMatt Jacob ispds64_t req_dataseg[ISP_CDSEG64]; 474126ec864SMatt Jacob } ispcontreq64_t; 475126ec864SMatt Jacob 47610365e5aSMatt Jacob /* 47710365e5aSMatt Jacob * Status Continuation 47810365e5aSMatt Jacob */ 4794fd13c1bSMatt Jacob typedef struct { 4804fd13c1bSMatt Jacob isphdr_t req_header; 4811dae40ebSMatt Jacob uint8_t req_sense_data[60]; 4824fd13c1bSMatt Jacob } ispstatus_cont_t; 4834fd13c1bSMatt Jacob 4846054c3f6SMatt Jacob /* 48510365e5aSMatt Jacob * 24XX Type 0 status 48610365e5aSMatt Jacob */ 48710365e5aSMatt Jacob typedef struct { 48810365e5aSMatt Jacob isphdr_t req_header; 48910365e5aSMatt Jacob uint32_t req_handle; 49010365e5aSMatt Jacob uint16_t req_completion_status; 49110365e5aSMatt Jacob uint16_t req_oxid; 49210365e5aSMatt Jacob uint32_t req_resid; 49310365e5aSMatt Jacob uint16_t req_reserved0; 49410365e5aSMatt Jacob uint16_t req_state_flags; 49592b25384SAlexander Motin uint16_t req_retry_delay; /* aka Status Qualifier */ 49610365e5aSMatt Jacob uint16_t req_scsi_status; 49710365e5aSMatt Jacob uint32_t req_fcp_residual; 49810365e5aSMatt Jacob uint32_t req_sense_len; 49910365e5aSMatt Jacob uint32_t req_response_len; 50010365e5aSMatt Jacob uint8_t req_rsp_sense[28]; 50110365e5aSMatt Jacob } isp24xx_statusreq_t; 50210365e5aSMatt Jacob 50310365e5aSMatt Jacob /* 5040ecded8aSMatt Jacob * For Qlogic 2X00, the high order byte of SCSI status has 5056054c3f6SMatt Jacob * additional meaning. 5066054c3f6SMatt Jacob */ 50792b25384SAlexander Motin #define RQCS_CR 0x1000 /* Confirmation Request */ 50892b25384SAlexander Motin #define RQCS_RU 0x0800 /* Residual Under */ 50992b25384SAlexander Motin #define RQCS_RO 0x0400 /* Residual Over */ 510b6b6ad2fSMatt Jacob #define RQCS_RESID (RQCS_RU|RQCS_RO) 51192b25384SAlexander Motin #define RQCS_SV 0x0200 /* Sense Length Valid */ 51292b25384SAlexander Motin #define RQCS_RV 0x0100 /* FCP Response Length Valid */ 5136054c3f6SMatt Jacob 5146054c3f6SMatt Jacob /* 51510365e5aSMatt Jacob * CT Passthru IOCB 51610365e5aSMatt Jacob */ 51710365e5aSMatt Jacob typedef struct { 51810365e5aSMatt Jacob isphdr_t ctp_header; 51910365e5aSMatt Jacob uint32_t ctp_handle; 52010365e5aSMatt Jacob uint16_t ctp_status; 52110365e5aSMatt Jacob uint16_t ctp_nphdl; /* n-port handle */ 52210365e5aSMatt Jacob uint16_t ctp_cmd_cnt; /* Command DSD count */ 5232df76c16SMatt Jacob uint8_t ctp_vpidx; 5242df76c16SMatt Jacob uint8_t ctp_reserved0; 52510365e5aSMatt Jacob uint16_t ctp_time; 5262df76c16SMatt Jacob uint16_t ctp_reserved1; 52710365e5aSMatt Jacob uint16_t ctp_rsp_cnt; /* Response DSD count */ 5282df76c16SMatt Jacob uint16_t ctp_reserved2[5]; 52910365e5aSMatt Jacob uint32_t ctp_rsp_bcnt; /* Response byte count */ 53010365e5aSMatt Jacob uint32_t ctp_cmd_bcnt; /* Command byte count */ 53110365e5aSMatt Jacob ispds64_t ctp_dataseg[2]; 53210365e5aSMatt Jacob } isp_ct_pt_t; 53310365e5aSMatt Jacob 53410365e5aSMatt Jacob /* 5356054c3f6SMatt Jacob * Completion Status Codes. 5366054c3f6SMatt Jacob */ 5376054c3f6SMatt Jacob #define RQCS_COMPLETE 0x0000 5386054c3f6SMatt Jacob #define RQCS_DMA_ERROR 0x0002 539b760d2ecSAlexander Motin #define RQCS_TRANSPORT_ERROR 0x0003 5406054c3f6SMatt Jacob #define RQCS_RESET_OCCURRED 0x0004 5416054c3f6SMatt Jacob #define RQCS_ABORTED 0x0005 5426054c3f6SMatt Jacob #define RQCS_TIMEOUT 0x0006 5436054c3f6SMatt Jacob #define RQCS_DATA_OVERRUN 0x0007 544b760d2ecSAlexander Motin #define RQCS_DRE 0x0011 /* data reassembly error */ 545b760d2ecSAlexander Motin #define RQCS_TABORT 0x0013 /* aborted by target */ 546b6b6ad2fSMatt Jacob #define RQCS_DATA_UNDERRUN 0x0015 5476054c3f6SMatt Jacob #define RQCS_PORT_UNAVAILABLE 0x0028 5486054c3f6SMatt Jacob #define RQCS_PORT_LOGGED_OUT 0x0029 5496054c3f6SMatt Jacob #define RQCS_PORT_CHANGED 0x002A 5506054c3f6SMatt Jacob #define RQCS_PORT_BUSY 0x002B 551b760d2ecSAlexander Motin #define RQCS_ENOMEM 0x002C /* f/w resource unavailable */ 552b760d2ecSAlexander Motin #define RQCS_TMO 0x0030 /* task management overrun */ 553b6b6ad2fSMatt Jacob 554b6b6ad2fSMatt Jacob /* 5551b760be4SAlexander Motin * About Firmware returns an 'attribute' word. 5568055acd8SMatt Jacob */ 55710ed63fcSJoerg Pulz #define ISP_FW_ATTR_CLASS2 0x0001 55810ed63fcSJoerg Pulz #define ISP_FW_ATTR_IP 0x0002 55910ed63fcSJoerg Pulz #define ISP_FW_ATTR_MULTIID 0x0004 56010ed63fcSJoerg Pulz #define ISP_FW_ATTR_SB2 0x0008 56110ed63fcSJoerg Pulz #define ISP_FW_ATTR_T10CRC 0x0010 56210ed63fcSJoerg Pulz #define ISP_FW_ATTR_VI 0x0020 56310ed63fcSJoerg Pulz #define ISP_FW_ATTR_MQ 0x0040 56410ed63fcSJoerg Pulz #define ISP_FW_ATTR_MSIX 0x0080 56510ed63fcSJoerg Pulz #define ISP_FW_ATTR_FCOE 0x0800 56610ed63fcSJoerg Pulz #define ISP_FW_ATTR_VP0 0x1000 56710ed63fcSJoerg Pulz #define ISP_FW_ATTR_EXPFW 0x2000 56810ed63fcSJoerg Pulz #define ISP_FW_ATTR_HOTFW 0x4000 56910ed63fcSJoerg Pulz #define ISP_FW_ATTR_EXTNDED 0x8000 57010ed63fcSJoerg Pulz 57110ed63fcSJoerg Pulz #define ISP_FW_ATTR_H_EXTVP 0x0001 57210ed63fcSJoerg Pulz #define ISP_FW_ATTR_H_NVME_FB 0x0002 /* NVMe first burst */ 57310ed63fcSJoerg Pulz #define ISP_FW_ATTR_H_VN2VN 0x0004 /* Extended login */ 57410ed63fcSJoerg Pulz #define ISP_FW_ATTR_H_EXMOFF 0x0008 /* Exchange offload */ 57510ed63fcSJoerg Pulz #define ISP_FW_ATTR_H_NPMOFF 0x0010 57610ed63fcSJoerg Pulz #define ISP_FW_ATTR_H_DIFCHOP 0x0040 57710ed63fcSJoerg Pulz #define ISP_FW_ATTR_H_SRIOV 0x0200 57810ed63fcSJoerg Pulz #define ISP_FW_ATTR_H_NVME 0x0400 /* FC-NVMe */ 57910ed63fcSJoerg Pulz #define ISP_FW_ATTR_H_NVME_UP 0x4000 /* FC-NVMe updated */ 58010ed63fcSJoerg Pulz 58110ed63fcSJoerg Pulz #define ISP_FW_ATTR_E0_ASICTMP 0x0002 58210ed63fcSJoerg Pulz #define ISP_FW_ATTR_E0_ATIOMQ 0x0004 58310ed63fcSJoerg Pulz #define ISP_FW_ATTR_E0_EDIF 0x0020 /* Encryption of data in flight */ 58410ed63fcSJoerg Pulz #define ISP_FW_ATTR_E0_SCM 0x1000 /* Simplified Configuration and Management */ 58510ed63fcSJoerg Pulz #define ISP_FW_ATTR_E0_NVME2 0x2000 /* NVMe2 */ 5862df76c16SMatt Jacob 5879e7d423dSMatt Jacob /* 5889e7d423dSMatt Jacob * This is only true for 24XX cards with this f/w attribute 5899e7d423dSMatt Jacob */ 5902df76c16SMatt Jacob #define ISP_CAP_MULTI_ID(isp) \ 59110ed63fcSJoerg Pulz (isp->isp_fwattr & ISP_FW_ATTR_MULTIID) 5922df76c16SMatt Jacob #define ISP_GET_VPIDX(isp, tag) \ 5932df76c16SMatt Jacob (ISP_CAP_MULTI_ID(isp) ? tag : 0) 59408826086SAlexander Motin #define ISP_CAP_MSIX(isp) \ 59510ed63fcSJoerg Pulz (isp->isp_fwattr & ISP_FW_ATTR_MSIX) 59686a1e16dSAlexander Motin #define ISP_CAP_VP0(isp) \ 59710ed63fcSJoerg Pulz (isp->isp_fwattr & ISP_FW_ATTR_VP0) 5989e7d423dSMatt Jacob 5999e7d423dSMatt Jacob #define ISP_FCTAPE_ENABLED(isp, chan) \ 6001b760be4SAlexander Motin ((FCPARAM(isp, chan)->isp_xfwoptions & ICB2400_OPT2_FCTAPE) != 0) 6019e7d423dSMatt Jacob 6029e7d423dSMatt Jacob /* 6031b760be4SAlexander Motin * FC specific data structures 6046054c3f6SMatt Jacob */ 6056054c3f6SMatt Jacob 6066054c3f6SMatt Jacob /* 6076054c3f6SMatt Jacob * Initialization Control Block 6086054c3f6SMatt Jacob */ 60910365e5aSMatt Jacob 610478f8a96SJustin T. Gibbs #define ICB_VERSION1 1 6116054c3f6SMatt Jacob 61210365e5aSMatt Jacob /* 2400 F/W options */ 61310365e5aSMatt Jacob #define ICB2400_OPT1_BOTH_WWNS 0x00004000 61410365e5aSMatt Jacob #define ICB2400_OPT1_FULL_LOGIN 0x00002000 6151fc04cc0SAlexander Motin #define ICB2400_OPT1_PREV_ADDRESS 0x00000800 61610365e5aSMatt Jacob #define ICB2400_OPT1_SRCHDOWN 0x00000400 61710365e5aSMatt Jacob #define ICB2400_OPT1_NOLIP 0x00000200 61810365e5aSMatt Jacob #define ICB2400_OPT1_INI_DISABLE 0x00000020 61910365e5aSMatt Jacob #define ICB2400_OPT1_TGT_ENABLE 0x00000010 62010365e5aSMatt Jacob #define ICB2400_OPT1_FULL_DUPLEX 0x00000004 62110365e5aSMatt Jacob #define ICB2400_OPT1_FAIRNESS 0x00000002 62210365e5aSMatt Jacob #define ICB2400_OPT1_HARD_ADDRESS 0x00000001 62310365e5aSMatt Jacob 624b5024bfdSAlexander Motin #define ICB2400_OPT2_ENA_ATIOMQ 0x08000000 625b5024bfdSAlexander Motin #define ICB2400_OPT2_ENA_IHA 0x04000000 626b5024bfdSAlexander Motin #define ICB2400_OPT2_QOS 0x02000000 627b5024bfdSAlexander Motin #define ICB2400_OPT2_IOCBS 0x01000000 628b5024bfdSAlexander Motin #define ICB2400_OPT2_ENA_IHR 0x00400000 629b5024bfdSAlexander Motin #define ICB2400_OPT2_ENA_VMS 0x00200000 630b5024bfdSAlexander Motin #define ICB2400_OPT2_ENA_TA 0x00100000 631ad0ab753SMatt Jacob #define ICB2400_OPT2_TPRLIC 0x00004000 63210365e5aSMatt Jacob #define ICB2400_OPT2_FCTAPE 0x00001000 633ad0ab753SMatt Jacob #define ICB2400_OPT2_FCSP 0x00000800 63410365e5aSMatt Jacob #define ICB2400_OPT2_CLASS2_ACK0 0x00000200 63510365e5aSMatt Jacob #define ICB2400_OPT2_CLASS2 0x00000100 63610365e5aSMatt Jacob #define ICB2400_OPT2_NO_PLAY 0x00000080 63710365e5aSMatt Jacob #define ICB2400_OPT2_TOPO_MASK 0x00000070 63810365e5aSMatt Jacob #define ICB2400_OPT2_LOOP_ONLY 0x00000000 63910365e5aSMatt Jacob #define ICB2400_OPT2_PTP_ONLY 0x00000010 64010365e5aSMatt Jacob #define ICB2400_OPT2_LOOP_2_PTP 0x00000020 641ad0ab753SMatt Jacob #define ICB2400_OPT2_TIMER_MASK 0x0000000f 64210365e5aSMatt Jacob #define ICB2400_OPT2_ZIO 0x00000005 64310365e5aSMatt Jacob #define ICB2400_OPT2_ZIO1 0x00000006 64410365e5aSMatt Jacob 645b5024bfdSAlexander Motin #define ICB2400_OPT3_NO_CTXDIS 0x40000000 646b5024bfdSAlexander Motin #define ICB2400_OPT3_ENA_ETH_RESP 0x08000000 647b5024bfdSAlexander Motin #define ICB2400_OPT3_ENA_ETH_ATIO 0x04000000 648b5024bfdSAlexander Motin #define ICB2400_OPT3_ENA_MFCF 0x00020000 649218be0b2SAlexander Motin #define ICB2400_OPT3_SKIP_4GB 0x00010000 65010365e5aSMatt Jacob #define ICB2400_OPT3_RATE_MASK 0x0000E000 651218be0b2SAlexander Motin #define ICB2400_OPT3_RATE_1GB 0x00000000 652218be0b2SAlexander Motin #define ICB2400_OPT3_RATE_2GB 0x00002000 65310365e5aSMatt Jacob #define ICB2400_OPT3_RATE_AUTO 0x00004000 654218be0b2SAlexander Motin #define ICB2400_OPT3_RATE_4GB 0x00006000 655218be0b2SAlexander Motin #define ICB2400_OPT3_RATE_8GB 0x00008000 656218be0b2SAlexander Motin #define ICB2400_OPT3_RATE_16GB 0x0000A000 65714e084adSAlexander Motin #define ICB2400_OPT3_RATE_32GB 0x0000C000 658407abff6SJoerg Pulz #define ICB2400_OPT3_RATE_64GB 0x0000E000 65910365e5aSMatt Jacob #define ICB2400_OPT3_ENA_OOF_XFRDY 0x00000200 660b5024bfdSAlexander Motin #define ICB2400_OPT3_NO_N2N_LOGI 0x00000100 66110365e5aSMatt Jacob #define ICB2400_OPT3_NO_LOCAL_PLOGI 0x00000080 66210365e5aSMatt Jacob #define ICB2400_OPT3_ENA_OOF 0x00000040 66310365e5aSMatt Jacob /* note that a response size flag of zero is reserved! */ 66410365e5aSMatt Jacob #define ICB2400_OPT3_RSPSZ_MASK 0x00000030 66510365e5aSMatt Jacob #define ICB2400_OPT3_RSPSZ_12 0x00000010 66610365e5aSMatt Jacob #define ICB2400_OPT3_RSPSZ_24 0x00000020 66710365e5aSMatt Jacob #define ICB2400_OPT3_RSPSZ_32 0x00000030 66810365e5aSMatt Jacob #define ICB2400_OPT3_SOFTID 0x00000002 669478f8a96SJustin T. Gibbs 670478f8a96SJustin T. Gibbs #define ICB_MIN_FRMLEN 256 671478f8a96SJustin T. Gibbs #define ICB_MAX_FRMLEN 2112 6726054c3f6SMatt Jacob #define ICB_DFLT_FRMLEN 1024 673407abff6SJoerg Pulz #define ICB_DFLT_FRMLEN_28XX 2048 674fc9961b5SMatt Jacob #define ICB_DFLT_RDELAY 5 675fc9961b5SMatt Jacob #define ICB_DFLT_RCOUNT 3 676fc9961b5SMatt Jacob 677a46709e2SAlexander Motin #define ICB_LOGIN_TOV 10 678387d8239SMatt Jacob #define ICB_LUN_ENABLE_TOV 15 6799cd7268eSMatt Jacob 6809cd7268eSMatt Jacob 68110365e5aSMatt Jacob /* 68210365e5aSMatt Jacob * And somebody at QLogic had a great idea that you could just change 68310365e5aSMatt Jacob * the structure *and* keep the version number the same as the other cards. 68410365e5aSMatt Jacob */ 68510365e5aSMatt Jacob typedef struct { 68610365e5aSMatt Jacob uint16_t icb_version; 68710365e5aSMatt Jacob uint16_t icb_reserved0; 68810365e5aSMatt Jacob uint16_t icb_maxfrmlen; 68910365e5aSMatt Jacob uint16_t icb_execthrottle; 69010365e5aSMatt Jacob uint16_t icb_xchgcnt; 69110365e5aSMatt Jacob uint16_t icb_hardaddr; 69210365e5aSMatt Jacob uint8_t icb_portname[8]; 69310365e5aSMatt Jacob uint8_t icb_nodename[8]; 69410365e5aSMatt Jacob uint16_t icb_rspnsin; 69510365e5aSMatt Jacob uint16_t icb_rqstout; 69610365e5aSMatt Jacob uint16_t icb_retry_count; 69710365e5aSMatt Jacob uint16_t icb_priout; 69810365e5aSMatt Jacob uint16_t icb_rsltqlen; 69910365e5aSMatt Jacob uint16_t icb_rqstqlen; 70010365e5aSMatt Jacob uint16_t icb_ldn_nols; 70110365e5aSMatt Jacob uint16_t icb_prqstqlen; 70210365e5aSMatt Jacob uint16_t icb_rqstaddr[4]; 70310365e5aSMatt Jacob uint16_t icb_respaddr[4]; 70410365e5aSMatt Jacob uint16_t icb_priaddr[4]; 705b363245aSAlexander Motin uint16_t icb_msixresp; 706b363245aSAlexander Motin uint16_t icb_msixatio; 707b363245aSAlexander Motin uint16_t icb_reserved1[2]; 70810365e5aSMatt Jacob uint16_t icb_atio_in; 70910365e5aSMatt Jacob uint16_t icb_atioqlen; 71010365e5aSMatt Jacob uint16_t icb_atioqaddr[4]; 71110365e5aSMatt Jacob uint16_t icb_idelaytimer; 71210365e5aSMatt Jacob uint16_t icb_logintime; 71310365e5aSMatt Jacob uint32_t icb_fwoptions1; 71410365e5aSMatt Jacob uint32_t icb_fwoptions2; 71510365e5aSMatt Jacob uint32_t icb_fwoptions3; 716b363245aSAlexander Motin uint16_t icb_qos; 717b363245aSAlexander Motin uint16_t icb_reserved2[3]; 718b05f17a1SAlexander Motin uint8_t icb_enodemac[6]; 719b363245aSAlexander Motin uint16_t icb_disctime; 720b363245aSAlexander Motin uint16_t icb_reserved3[4]; 72110365e5aSMatt Jacob } isp_icb_2400_t; 722478f8a96SJustin T. Gibbs 723478f8a96SJustin T. Gibbs #define RQRSP_ADDR0015 0 724478f8a96SJustin T. Gibbs #define RQRSP_ADDR1631 1 725478f8a96SJustin T. Gibbs #define RQRSP_ADDR3247 2 726478f8a96SJustin T. Gibbs #define RQRSP_ADDR4863 3 727478f8a96SJustin T. Gibbs 7283c0e51c7SMatt Jacob 729478f8a96SJustin T. Gibbs #define ICB_NNM0 7 730478f8a96SJustin T. Gibbs #define ICB_NNM1 6 731478f8a96SJustin T. Gibbs #define ICB_NNM2 5 732478f8a96SJustin T. Gibbs #define ICB_NNM3 4 733478f8a96SJustin T. Gibbs #define ICB_NNM4 3 734478f8a96SJustin T. Gibbs #define ICB_NNM5 2 735478f8a96SJustin T. Gibbs #define ICB_NNM6 1 736478f8a96SJustin T. Gibbs #define ICB_NNM7 0 737478f8a96SJustin T. Gibbs 738478f8a96SJustin T. Gibbs #define MAKE_NODE_NAME_FROM_WWN(array, wwn) \ 7391dae40ebSMatt Jacob array[ICB_NNM0] = (uint8_t) ((wwn >> 0) & 0xff), \ 7401dae40ebSMatt Jacob array[ICB_NNM1] = (uint8_t) ((wwn >> 8) & 0xff), \ 7411dae40ebSMatt Jacob array[ICB_NNM2] = (uint8_t) ((wwn >> 16) & 0xff), \ 7421dae40ebSMatt Jacob array[ICB_NNM3] = (uint8_t) ((wwn >> 24) & 0xff), \ 7431dae40ebSMatt Jacob array[ICB_NNM4] = (uint8_t) ((wwn >> 32) & 0xff), \ 7441dae40ebSMatt Jacob array[ICB_NNM5] = (uint8_t) ((wwn >> 40) & 0xff), \ 7451dae40ebSMatt Jacob array[ICB_NNM6] = (uint8_t) ((wwn >> 48) & 0xff), \ 7461dae40ebSMatt Jacob array[ICB_NNM7] = (uint8_t) ((wwn >> 56) & 0xff) 7476054c3f6SMatt Jacob 748520b6299SMatt Jacob #define MAKE_WWN_FROM_NODE_NAME(wwn, array) \ 7491dae40ebSMatt Jacob wwn = ((uint64_t) array[ICB_NNM0]) | \ 7501dae40ebSMatt Jacob ((uint64_t) array[ICB_NNM1] << 8) | \ 7511dae40ebSMatt Jacob ((uint64_t) array[ICB_NNM2] << 16) | \ 7521dae40ebSMatt Jacob ((uint64_t) array[ICB_NNM3] << 24) | \ 7531dae40ebSMatt Jacob ((uint64_t) array[ICB_NNM4] << 32) | \ 7541dae40ebSMatt Jacob ((uint64_t) array[ICB_NNM5] << 40) | \ 7551dae40ebSMatt Jacob ((uint64_t) array[ICB_NNM6] << 48) | \ 7561dae40ebSMatt Jacob ((uint64_t) array[ICB_NNM7] << 56) 757520b6299SMatt Jacob 7582df76c16SMatt Jacob 7592df76c16SMatt Jacob /* 7602df76c16SMatt Jacob * For MULTI_ID firmware, this describes a 7612df76c16SMatt Jacob * virtual port entity for getting status. 7622df76c16SMatt Jacob */ 7632df76c16SMatt Jacob typedef struct { 7642df76c16SMatt Jacob uint16_t vp_port_status; 7652df76c16SMatt Jacob uint8_t vp_port_options; 7662df76c16SMatt Jacob uint8_t vp_port_loopid; 7672df76c16SMatt Jacob uint8_t vp_port_portname[8]; 7682df76c16SMatt Jacob uint8_t vp_port_nodename[8]; 7692df76c16SMatt Jacob uint16_t vp_port_portid_lo; /* not present when trailing icb */ 7702df76c16SMatt Jacob uint16_t vp_port_portid_hi; /* not present when trailing icb */ 7712df76c16SMatt Jacob } vp_port_info_t; 7722df76c16SMatt Jacob 773b5024bfdSAlexander Motin #define ICB2400_VPOPT_ENA_SNSLOGIN 0x00000040 /* Enable SNS Login and SCR for Virtual Ports */ 774b5024bfdSAlexander Motin #define ICB2400_VPOPT_TGT_DISABLE 0x00000020 /* Target Mode Disabled */ 775b5024bfdSAlexander Motin #define ICB2400_VPOPT_INI_ENABLE 0x00000010 /* Initiator Mode Enabled */ 776b5024bfdSAlexander Motin #define ICB2400_VPOPT_ENABLED 0x00000008 /* VP Enabled */ 777b5024bfdSAlexander Motin #define ICB2400_VPOPT_NOPLAY 0x00000004 /* ID Not Acquired */ 7781fc04cc0SAlexander Motin #define ICB2400_VPOPT_PREV_ADDRESS 0x00000002 /* Previously Assigned ID */ 779b5024bfdSAlexander Motin #define ICB2400_VPOPT_HARD_ADDRESS 0x00000001 /* Hard Assigned ID */ 7802df76c16SMatt Jacob 7812df76c16SMatt Jacob #define ICB2400_VPOPT_WRITE_SIZE 20 7822df76c16SMatt Jacob 7832df76c16SMatt Jacob /* 7842df76c16SMatt Jacob * For MULTI_ID firmware, we append this structure 7852df76c16SMatt Jacob * to the isp_icb_2400_t above, followed by a list 7862df76c16SMatt Jacob * structures that are *most* of the vp_port_info_t. 7872df76c16SMatt Jacob */ 7882df76c16SMatt Jacob typedef struct { 7892df76c16SMatt Jacob uint16_t vp_count; 7902df76c16SMatt Jacob uint16_t vp_global_options; 7912df76c16SMatt Jacob } isp_icb_2400_vpinfo_t; 7922df76c16SMatt Jacob 7932df76c16SMatt Jacob #define ICB2400_VPINFO_OFF 0x80 /* offset from start of ICB */ 7942df76c16SMatt Jacob #define ICB2400_VPINFO_PORT_OFF(chan) \ 795b5024bfdSAlexander Motin (ICB2400_VPINFO_OFF + \ 79600be964cSAlexander Motin sizeof (isp_icb_2400_vpinfo_t) + ((chan) * ICB2400_VPOPT_WRITE_SIZE)) 7972df76c16SMatt Jacob 798ad0ab753SMatt Jacob #define ICB2400_VPGOPT_FCA 0x01 /* Assume Clean Address bit in FLOGI ACC set (works only in static configurations) */ 799ad0ab753SMatt Jacob #define ICB2400_VPGOPT_MID_DISABLE 0x02 /* when set, connection mode2 will work with NPIV-capable switched */ 800ad0ab753SMatt Jacob #define ICB2400_VPGOPT_VP0_DECOUPLE 0x04 /* Allow VP0 decoupling if firmware supports it */ 801b5024bfdSAlexander Motin #define ICB2400_VPGOPT_SUSP_FDISK 0x10 /* Suspend FDISC for Enabled VPs */ 802b5024bfdSAlexander Motin #define ICB2400_VPGOPT_GEN_RIDA 0x20 /* Generate RIDA if FLOGI Fails */ 8032df76c16SMatt Jacob 8042df76c16SMatt Jacob typedef struct { 8052df76c16SMatt Jacob isphdr_t vp_ctrl_hdr; 8062df76c16SMatt Jacob uint32_t vp_ctrl_handle; 8072df76c16SMatt Jacob uint16_t vp_ctrl_index_fail; 8082df76c16SMatt Jacob uint16_t vp_ctrl_status; 8092df76c16SMatt Jacob uint16_t vp_ctrl_command; 8102df76c16SMatt Jacob uint16_t vp_ctrl_vp_count; 81186a1e16dSAlexander Motin uint16_t vp_ctrl_idmap[16]; 81286a1e16dSAlexander Motin uint16_t vp_ctrl_reserved[7]; 81386a1e16dSAlexander Motin uint16_t vp_ctrl_fcf_index; 8142df76c16SMatt Jacob } vp_ctrl_info_t; 8152df76c16SMatt Jacob 81686a1e16dSAlexander Motin #define VP_CTRL_CMD_ENABLE_VP 0x00 81786a1e16dSAlexander Motin #define VP_CTRL_CMD_DISABLE_VP 0x08 81886a1e16dSAlexander Motin #define VP_CTRL_CMD_DISABLE_VP_REINIT_LINK 0x09 81986a1e16dSAlexander Motin #define VP_CTRL_CMD_DISABLE_VP_LOGO 0x0A 82086a1e16dSAlexander Motin #define VP_CTRL_CMD_DISABLE_VP_LOGO_ALL 0x0B 8212df76c16SMatt Jacob 8222df76c16SMatt Jacob /* 8232df76c16SMatt Jacob * We can use this structure for modifying either one or two VP ports after initialization 8242df76c16SMatt Jacob */ 8252df76c16SMatt Jacob typedef struct { 8262df76c16SMatt Jacob isphdr_t vp_mod_hdr; 8272df76c16SMatt Jacob uint32_t vp_mod_hdl; 8282df76c16SMatt Jacob uint16_t vp_mod_reserved0; 8292df76c16SMatt Jacob uint16_t vp_mod_status; 8302df76c16SMatt Jacob uint8_t vp_mod_cmd; 8312df76c16SMatt Jacob uint8_t vp_mod_cnt; 8322df76c16SMatt Jacob uint8_t vp_mod_idx0; 8332df76c16SMatt Jacob uint8_t vp_mod_idx1; 8342df76c16SMatt Jacob struct { 8352df76c16SMatt Jacob uint8_t options; 8362df76c16SMatt Jacob uint8_t loopid; 8372df76c16SMatt Jacob uint16_t reserved1; 8382df76c16SMatt Jacob uint8_t wwpn[8]; 8392df76c16SMatt Jacob uint8_t wwnn[8]; 8402df76c16SMatt Jacob } vp_mod_ports[2]; 8412df76c16SMatt Jacob uint8_t vp_mod_reserved2[8]; 8422df76c16SMatt Jacob } vp_modify_t; 8432df76c16SMatt Jacob 8442df76c16SMatt Jacob #define VP_STS_OK 0x00 8452df76c16SMatt Jacob #define VP_STS_ERR 0x01 8462df76c16SMatt Jacob #define VP_CNT_ERR 0x02 8472df76c16SMatt Jacob #define VP_GEN_ERR 0x03 8482df76c16SMatt Jacob #define VP_IDX_ERR 0x04 8492df76c16SMatt Jacob #define VP_STS_BSY 0x05 8502df76c16SMatt Jacob 851b5024bfdSAlexander Motin #define VP_MODIFY 0x00 8522df76c16SMatt Jacob #define VP_MODIFY_ENA 0x01 853b5024bfdSAlexander Motin #define VP_MODIFY_OPT 0x02 854b5024bfdSAlexander Motin #define VP_RESUME 0x03 8552df76c16SMatt Jacob 856ff717ff3SMatt Jacob /* 85757c801f5SMatt Jacob * Port Data Base Element 85857c801f5SMatt Jacob */ 85957c801f5SMatt Jacob 86057c801f5SMatt Jacob #define SVC3_ROLE_MASK 0x30 861fc9961b5SMatt Jacob #define SVC3_ROLE_SHIFT 4 862fc9961b5SMatt Jacob 86310365e5aSMatt Jacob #define BITS2WORD_24XX(x) ((x)[0] << 16 | (x)[1] << 8 | (x)[2]) 86410365e5aSMatt Jacob 865029f13c6SMatt Jacob /* 86610365e5aSMatt Jacob * Port Data Base Element- 24XX cards 867029f13c6SMatt Jacob */ 868029f13c6SMatt Jacob typedef struct { 86910365e5aSMatt Jacob uint16_t pdb_flags; 87010365e5aSMatt Jacob uint8_t pdb_curstate; 87110365e5aSMatt Jacob uint8_t pdb_laststate; 87210365e5aSMatt Jacob uint8_t pdb_hardaddr_bits[4]; 87310365e5aSMatt Jacob uint8_t pdb_portid_bits[4]; 87410365e5aSMatt Jacob #define pdb_nxt_seqid_2400 pdb_portid_bits[3] 87510365e5aSMatt Jacob uint16_t pdb_retry_timer; 87610365e5aSMatt Jacob uint16_t pdb_handle; 87710365e5aSMatt Jacob uint16_t pdb_rcv_dsize; 87810365e5aSMatt Jacob uint16_t pdb_reserved0; 87910365e5aSMatt Jacob uint16_t pdb_prli_svc0; 88010365e5aSMatt Jacob uint16_t pdb_prli_svc3; 88110365e5aSMatt Jacob uint8_t pdb_portname[8]; 88210365e5aSMatt Jacob uint8_t pdb_nodename[8]; 88310365e5aSMatt Jacob uint8_t pdb_reserved1[24]; 88410365e5aSMatt Jacob } isp_pdb_24xx_t; 885029f13c6SMatt Jacob 88610365e5aSMatt Jacob #define PDB2400_TID_SUPPORTED 0x4000 88710365e5aSMatt Jacob #define PDB2400_FC_TAPE 0x0080 88810365e5aSMatt Jacob #define PDB2400_CLASS2_ACK0 0x0040 88910365e5aSMatt Jacob #define PDB2400_FCP_CONF 0x0020 89010365e5aSMatt Jacob #define PDB2400_CLASS2 0x0010 89110365e5aSMatt Jacob #define PDB2400_ADDR_VALID 0x0002 892029f13c6SMatt Jacob 893*137b004eSKenneth D. Merry /* 894*137b004eSKenneth D. Merry * For NVMe, the state is the high nibble. For FCP, the state is the low 895*137b004eSKenneth D. Merry * nibble. This appears to have changed with the 9.x firmware. 896*137b004eSKenneth D. Merry */ 8972df76c16SMatt Jacob #define PDB2400_STATE_PLOGI_PEND 0x03 8982df76c16SMatt Jacob #define PDB2400_STATE_PLOGI_DONE 0x04 8992df76c16SMatt Jacob #define PDB2400_STATE_PRLI_PEND 0x05 9002df76c16SMatt Jacob #define PDB2400_STATE_LOGGED_IN 0x06 9012df76c16SMatt Jacob #define PDB2400_STATE_PORT_UNAVAIL 0x07 9022df76c16SMatt Jacob #define PDB2400_STATE_PRLO_PEND 0x09 9032df76c16SMatt Jacob #define PDB2400_STATE_LOGO_PEND 0x0B 904*137b004eSKenneth D. Merry #define PDB2400_STATE_FCP_MASK 0x0f 905*137b004eSKenneth D. Merry #define PDB2400_STATE_NVME_SHIFT 4 9062df76c16SMatt Jacob 90710365e5aSMatt Jacob /* 90810365e5aSMatt Jacob * Common elements from the above two structures that are actually useful to us. 90910365e5aSMatt Jacob */ 91010365e5aSMatt Jacob typedef struct { 91110365e5aSMatt Jacob uint16_t handle; 9126f9dbc0eSKenneth D. Merry uint16_t prli_word0; 913387d8239SMatt Jacob uint16_t prli_word3; 914387d8239SMatt Jacob uint32_t : 8, 91510365e5aSMatt Jacob portid : 24; 91610365e5aSMatt Jacob uint8_t portname[8]; 91710365e5aSMatt Jacob uint8_t nodename[8]; 91810365e5aSMatt Jacob } isp_pdb_t; 91910365e5aSMatt Jacob 92010365e5aSMatt Jacob /* 921b6983e5fSAlexander Motin * Port and N-Port Handle List Element 922b6983e5fSAlexander Motin */ 923b6983e5fSAlexander Motin typedef struct { 924b6983e5fSAlexander Motin uint16_t pnhle_port_id_lo; 925b6983e5fSAlexander Motin uint16_t pnhle_port_id_hi; 926b6983e5fSAlexander Motin uint16_t pnhle_handle; 927b6983e5fSAlexander Motin uint16_t pnhle_reserved; 928b6983e5fSAlexander Motin } isp_pnhle_24xx_t; 929b6983e5fSAlexander Motin 930b6983e5fSAlexander Motin /* 9312df76c16SMatt Jacob * Port Database Changed Async Event information for 24XX cards 9322df76c16SMatt Jacob */ 93357b6261fSKenneth D. Merry /* N-Port Handle */ 93457b6261fSKenneth D. Merry #define PDB24XX_AE_GLOBAL 0xFFFF 93557b6261fSKenneth D. Merry 93657b6261fSKenneth D. Merry /* Reason Codes */ 9372df76c16SMatt Jacob #define PDB24XX_AE_OK 0x00 9382df76c16SMatt Jacob #define PDB24XX_AE_IMPL_LOGO_1 0x01 9392df76c16SMatt Jacob #define PDB24XX_AE_IMPL_LOGO_2 0x02 9402df76c16SMatt Jacob #define PDB24XX_AE_IMPL_LOGO_3 0x03 9412df76c16SMatt Jacob #define PDB24XX_AE_PLOGI_RCVD 0x04 9422df76c16SMatt Jacob #define PDB24XX_AE_PLOGI_RJT 0x05 9432df76c16SMatt Jacob #define PDB24XX_AE_PRLI_RCVD 0x06 9442df76c16SMatt Jacob #define PDB24XX_AE_PRLI_RJT 0x07 9452df76c16SMatt Jacob #define PDB24XX_AE_TPRLO 0x08 9462df76c16SMatt Jacob #define PDB24XX_AE_TPRLO_RJT 0x09 9472df76c16SMatt Jacob #define PDB24XX_AE_PRLO_RCVD 0x0a 9482df76c16SMatt Jacob #define PDB24XX_AE_LOGO_RCVD 0x0b 9492df76c16SMatt Jacob #define PDB24XX_AE_TOPO_CHG 0x0c 9502df76c16SMatt Jacob #define PDB24XX_AE_NPORT_CHG 0x0d 9512df76c16SMatt Jacob #define PDB24XX_AE_FLOGI_RJT 0x0e 9522df76c16SMatt Jacob #define PDB24XX_AE_BAD_FANN 0x0f 9532df76c16SMatt Jacob #define PDB24XX_AE_FLOGI_TIMO 0x10 9542df76c16SMatt Jacob #define PDB24XX_AE_ABX_LOGO 0x11 9552df76c16SMatt Jacob #define PDB24XX_AE_PLOGI_DONE 0x12 95657b6261fSKenneth D. Merry #define PDB24XX_AE_PRLI_DONE 0x13 9572df76c16SMatt Jacob #define PDB24XX_AE_OPN_1 0x14 9582df76c16SMatt Jacob #define PDB24XX_AE_OPN_2 0x15 9592df76c16SMatt Jacob #define PDB24XX_AE_TXERR 0x16 9602df76c16SMatt Jacob #define PDB24XX_AE_FORCED_LOGO 0x17 9612df76c16SMatt Jacob #define PDB24XX_AE_DISC_TIMO 0x18 9622df76c16SMatt Jacob 9632df76c16SMatt Jacob /* 96404697f7aSMatt Jacob * Genericized Port Login/Logout software structure 96504697f7aSMatt Jacob */ 96604697f7aSMatt Jacob typedef struct { 96704697f7aSMatt Jacob uint16_t handle; 9682df76c16SMatt Jacob uint16_t channel; 96904697f7aSMatt Jacob uint32_t 97004697f7aSMatt Jacob flags : 8, 97104697f7aSMatt Jacob portid : 24; 97204697f7aSMatt Jacob } isp_plcmd_t; 97304697f7aSMatt Jacob /* the flags to use are those for PLOGX_FLG_* below */ 97404697f7aSMatt Jacob 97504697f7aSMatt Jacob /* 97610365e5aSMatt Jacob * ISP24XX- Login/Logout Port IOCB 97710365e5aSMatt Jacob */ 97810365e5aSMatt Jacob typedef struct { 97910365e5aSMatt Jacob isphdr_t plogx_header; 98010365e5aSMatt Jacob uint32_t plogx_handle; 98110365e5aSMatt Jacob uint16_t plogx_status; 98210365e5aSMatt Jacob uint16_t plogx_nphdl; 98310365e5aSMatt Jacob uint16_t plogx_flags; 98410365e5aSMatt Jacob uint16_t plogx_vphdl; /* low 8 bits */ 98510365e5aSMatt Jacob uint16_t plogx_portlo; /* low 16 bits */ 98610365e5aSMatt Jacob uint16_t plogx_rspsz_porthi; 98710365e5aSMatt Jacob struct { 98810365e5aSMatt Jacob uint16_t lo16; 98910365e5aSMatt Jacob uint16_t hi16; 99010365e5aSMatt Jacob } plogx_ioparm[11]; 99110365e5aSMatt Jacob } isp_plogx_t; 99210365e5aSMatt Jacob 99310365e5aSMatt Jacob #define PLOGX_STATUS_OK 0x00 99410365e5aSMatt Jacob #define PLOGX_STATUS_UNAVAIL 0x28 99510365e5aSMatt Jacob #define PLOGX_STATUS_LOGOUT 0x29 99610365e5aSMatt Jacob #define PLOGX_STATUS_IOCBERR 0x31 99710365e5aSMatt Jacob 99810365e5aSMatt Jacob #define PLOGX_IOCBERR_NOLINK 0x01 99910365e5aSMatt Jacob #define PLOGX_IOCBERR_NOIOCB 0x02 100010365e5aSMatt Jacob #define PLOGX_IOCBERR_NOXGHG 0x03 100110365e5aSMatt Jacob #define PLOGX_IOCBERR_FAILED 0x04 /* further info in IOPARM 1 */ 100210365e5aSMatt Jacob #define PLOGX_IOCBERR_NOFABRIC 0x05 100310365e5aSMatt Jacob #define PLOGX_IOCBERR_NOTREADY 0x07 1004e6a86de2SAlexander Motin #define PLOGX_IOCBERR_NOLOGIN 0x09 /* further info in IOPARM 1 */ 100510365e5aSMatt Jacob #define PLOGX_IOCBERR_NOPCB 0x0a 100610365e5aSMatt Jacob #define PLOGX_IOCBERR_REJECT 0x18 /* further info in IOPARM 1 */ 100710365e5aSMatt Jacob #define PLOGX_IOCBERR_EINVAL 0x19 /* further info in IOPARM 1 */ 100810365e5aSMatt Jacob #define PLOGX_IOCBERR_PORTUSED 0x1a /* further info in IOPARM 1 */ 100910365e5aSMatt Jacob #define PLOGX_IOCBERR_HNDLUSED 0x1b /* further info in IOPARM 1 */ 101010365e5aSMatt Jacob #define PLOGX_IOCBERR_NOHANDLE 0x1c 101110365e5aSMatt Jacob #define PLOGX_IOCBERR_NOFLOGI 0x1f /* further info in IOPARM 1 */ 101210365e5aSMatt Jacob 101310365e5aSMatt Jacob #define PLOGX_FLG_CMD_MASK 0xf 101410365e5aSMatt Jacob #define PLOGX_FLG_CMD_PLOGI 0 101510365e5aSMatt Jacob #define PLOGX_FLG_CMD_PRLI 1 101610365e5aSMatt Jacob #define PLOGX_FLG_CMD_PDISC 2 101710365e5aSMatt Jacob #define PLOGX_FLG_CMD_LOGO 8 101810365e5aSMatt Jacob #define PLOGX_FLG_CMD_PRLO 9 101910365e5aSMatt Jacob #define PLOGX_FLG_CMD_TPRLO 10 102010365e5aSMatt Jacob 102110365e5aSMatt Jacob #define PLOGX_FLG_COND_PLOGI 0x10 /* if with PLOGI */ 102210365e5aSMatt Jacob #define PLOGX_FLG_IMPLICIT 0x10 /* if with LOGO, PRLO, TPRLO */ 102310365e5aSMatt Jacob #define PLOGX_FLG_SKIP_PRLI 0x20 /* if with PLOGI */ 102410365e5aSMatt Jacob #define PLOGX_FLG_IMPLICIT_LOGO_ALL 0x20 /* if with LOGO */ 102510365e5aSMatt Jacob #define PLOGX_FLG_EXPLICIT_LOGO 0x40 /* if with LOGO */ 102610365e5aSMatt Jacob #define PLOGX_FLG_COMMON_FEATURES 0x80 /* if with PLOGI */ 102710365e5aSMatt Jacob #define PLOGX_FLG_FREE_NPHDL 0x80 /* if with with LOGO */ 102810365e5aSMatt Jacob 102910365e5aSMatt Jacob #define PLOGX_FLG_CLASS2 0x100 /* if with PLOGI */ 103010365e5aSMatt Jacob #define PLOGX_FLG_FCP2_OVERRIDE 0x200 /* if with PRLOG, PRLI */ 103110365e5aSMatt Jacob 103210365e5aSMatt Jacob /* 10332df76c16SMatt Jacob * Report ID Acquisistion (24XX multi-id firmware) 10342df76c16SMatt Jacob */ 10352df76c16SMatt Jacob typedef struct { 10362df76c16SMatt Jacob isphdr_t ridacq_hdr; 10372df76c16SMatt Jacob uint32_t ridacq_handle; 10382df76c16SMatt Jacob uint8_t ridacq_vp_acquired; 10392df76c16SMatt Jacob uint8_t ridacq_vp_setup; 10402df76c16SMatt Jacob uint8_t ridacq_vp_index; 10412df76c16SMatt Jacob uint8_t ridacq_vp_status; 10422df76c16SMatt Jacob uint16_t ridacq_vp_port_lo; 10432df76c16SMatt Jacob uint8_t ridacq_vp_port_hi; 10442df76c16SMatt Jacob uint8_t ridacq_format; /* 0 or 1 */ 10452df76c16SMatt Jacob uint16_t ridacq_map[8]; 10462df76c16SMatt Jacob uint8_t ridacq_reserved1[32]; 10472df76c16SMatt Jacob } isp_ridacq_t; 10482df76c16SMatt Jacob 10492df76c16SMatt Jacob #define RIDACQ_STS_COMPLETE 0 10502df76c16SMatt Jacob #define RIDACQ_STS_UNACQUIRED 1 10516d53b0a7SAlexander Motin #define RIDACQ_STS_CHANGED 2 10526d53b0a7SAlexander Motin #define RIDACQ_STS_SNS_TIMEOUT 3 10536d53b0a7SAlexander Motin #define RIDACQ_STS_SNS_REJECTED 4 10546d53b0a7SAlexander Motin #define RIDACQ_STS_SCR_TIMEOUT 5 10556d53b0a7SAlexander Motin #define RIDACQ_STS_SCR_REJECTED 6 10562df76c16SMatt Jacob 10572df76c16SMatt Jacob /* 105810365e5aSMatt Jacob * Simple Name Server Data Structures 105910365e5aSMatt Jacob */ 1060029f13c6SMatt Jacob #define SNS_GA_NXT 0x100 1061029f13c6SMatt Jacob #define SNS_GPN_ID 0x112 1062029f13c6SMatt Jacob #define SNS_GNN_ID 0x113 1063a94fab67SAlexander Motin #define SNS_GFT_ID 0x117 10644a999c65SMatt Jacob #define SNS_GFF_ID 0x11F 1065029f13c6SMatt Jacob #define SNS_GID_FT 0x171 10663d792e60SAlexander Motin #define SNS_GID_PT 0x1A1 1067029f13c6SMatt Jacob #define SNS_RFT_ID 0x217 10687e53e7acSAlexander Motin #define SNS_RSPN_ID 0x218 106992056a05SAlexander Motin #define SNS_RFF_ID 0x21F 10707e53e7acSAlexander Motin #define SNS_RSNN_NN 0x239 1071fc9961b5SMatt Jacob typedef struct { 10721dae40ebSMatt Jacob uint16_t snscb_rblen; /* response buffer length (words) */ 107310365e5aSMatt Jacob uint16_t snscb_reserved0; 10741dae40ebSMatt Jacob uint16_t snscb_addr[4]; /* response buffer address */ 10751dae40ebSMatt Jacob uint16_t snscb_sblen; /* subcommand buffer length (words) */ 107610365e5aSMatt Jacob uint16_t snscb_reserved1; 1077756906b4SWarner Losh uint16_t snscb_data[]; /* variable data */ 1078fc9961b5SMatt Jacob } sns_screq_t; /* Subcommand Request Structure */ 1079fc9961b5SMatt Jacob 1080fc9961b5SMatt Jacob typedef struct { 10811dae40ebSMatt Jacob uint16_t snscb_rblen; /* response buffer length (words) */ 108210365e5aSMatt Jacob uint16_t snscb_reserved0; 10831dae40ebSMatt Jacob uint16_t snscb_addr[4]; /* response buffer address */ 10841dae40ebSMatt Jacob uint16_t snscb_sblen; /* subcommand buffer length (words) */ 108510365e5aSMatt Jacob uint16_t snscb_reserved1; 10861dae40ebSMatt Jacob uint16_t snscb_cmd; 108710365e5aSMatt Jacob uint16_t snscb_reserved2; 108810365e5aSMatt Jacob uint32_t snscb_reserved3; 10891dae40ebSMatt Jacob uint32_t snscb_port; 1090029f13c6SMatt Jacob } sns_ga_nxt_req_t; 1091029f13c6SMatt Jacob #define SNS_GA_NXT_REQ_SIZE (sizeof (sns_ga_nxt_req_t)) 1092029f13c6SMatt Jacob 1093a94fab67SAlexander Motin typedef struct { /* Used for GFT_ID, GFF_ID, etc. */ 10941dae40ebSMatt Jacob uint16_t snscb_rblen; /* response buffer length (words) */ 109510365e5aSMatt Jacob uint16_t snscb_reserved0; 10961dae40ebSMatt Jacob uint16_t snscb_addr[4]; /* response buffer address */ 10971dae40ebSMatt Jacob uint16_t snscb_sblen; /* subcommand buffer length (words) */ 109810365e5aSMatt Jacob uint16_t snscb_reserved1; 10991dae40ebSMatt Jacob uint16_t snscb_cmd; 1100a94fab67SAlexander Motin uint16_t snscb_mword_div_2; 110110365e5aSMatt Jacob uint32_t snscb_reserved3; 11021dae40ebSMatt Jacob uint32_t snscb_portid; 1103a94fab67SAlexander Motin } sns_gxx_id_req_t; 1104a94fab67SAlexander Motin #define SNS_GXX_ID_REQ_SIZE (sizeof (sns_gxx_id_req_t)) 1105029f13c6SMatt Jacob 1106029f13c6SMatt Jacob typedef struct { 11071dae40ebSMatt Jacob uint16_t snscb_rblen; /* response buffer length (words) */ 110810365e5aSMatt Jacob uint16_t snscb_reserved0; 11091dae40ebSMatt Jacob uint16_t snscb_addr[4]; /* response buffer address */ 11101dae40ebSMatt Jacob uint16_t snscb_sblen; /* subcommand buffer length (words) */ 111110365e5aSMatt Jacob uint16_t snscb_reserved1; 11121dae40ebSMatt Jacob uint16_t snscb_cmd; 11131dae40ebSMatt Jacob uint16_t snscb_mword_div_2; 111410365e5aSMatt Jacob uint32_t snscb_reserved3; 11151dae40ebSMatt Jacob uint32_t snscb_fc4_type; 1116029f13c6SMatt Jacob } sns_gid_ft_req_t; 1117029f13c6SMatt Jacob #define SNS_GID_FT_REQ_SIZE (sizeof (sns_gid_ft_req_t)) 1118029f13c6SMatt Jacob 1119029f13c6SMatt Jacob typedef struct { 11201dae40ebSMatt Jacob uint16_t snscb_rblen; /* response buffer length (words) */ 112110365e5aSMatt Jacob uint16_t snscb_reserved0; 11221dae40ebSMatt Jacob uint16_t snscb_addr[4]; /* response buffer address */ 11231dae40ebSMatt Jacob uint16_t snscb_sblen; /* subcommand buffer length (words) */ 112410365e5aSMatt Jacob uint16_t snscb_reserved1; 11251dae40ebSMatt Jacob uint16_t snscb_cmd; 1126a94fab67SAlexander Motin uint16_t snscb_mword_div_2; 1127a94fab67SAlexander Motin uint32_t snscb_reserved3; 1128a94fab67SAlexander Motin uint8_t snscb_port_type; 1129a94fab67SAlexander Motin uint8_t snscb_domain; 1130a94fab67SAlexander Motin uint8_t snscb_area; 1131a94fab67SAlexander Motin uint8_t snscb_flags; 1132a94fab67SAlexander Motin } sns_gid_pt_req_t; 1133a94fab67SAlexander Motin #define SNS_GID_PT_REQ_SIZE (sizeof (sns_gid_pt_req_t)) 1134a94fab67SAlexander Motin 1135a94fab67SAlexander Motin typedef struct { 1136a94fab67SAlexander Motin uint16_t snscb_rblen; /* response buffer length (words) */ 1137a94fab67SAlexander Motin uint16_t snscb_reserved0; 1138a94fab67SAlexander Motin uint16_t snscb_addr[4]; /* response buffer address */ 1139a94fab67SAlexander Motin uint16_t snscb_sblen; /* subcommand buffer length (words) */ 1140a94fab67SAlexander Motin uint16_t snscb_reserved1; 1141a94fab67SAlexander Motin uint16_t snscb_cmd; 114210365e5aSMatt Jacob uint16_t snscb_reserved2; 114310365e5aSMatt Jacob uint32_t snscb_reserved3; 11441dae40ebSMatt Jacob uint32_t snscb_port; 11451dae40ebSMatt Jacob uint32_t snscb_fc4_types[8]; 1146029f13c6SMatt Jacob } sns_rft_id_req_t; 1147029f13c6SMatt Jacob #define SNS_RFT_ID_REQ_SIZE (sizeof (sns_rft_id_req_t)) 1148029f13c6SMatt Jacob 1149029f13c6SMatt Jacob typedef struct { 1150029f13c6SMatt Jacob ct_hdr_t snscb_cthdr; 11511dae40ebSMatt Jacob uint8_t snscb_port_type; 11521dae40ebSMatt Jacob uint8_t snscb_port_id[3]; 11531dae40ebSMatt Jacob uint8_t snscb_portname[8]; 1154756906b4SWarner Losh uint16_t snscb_data[]; /* variable data */ 1155fc9961b5SMatt Jacob } sns_scrsp_t; /* Subcommand Response Structure */ 115657c801f5SMatt Jacob 1157eb76ec80SMatt Jacob typedef struct { 1158029f13c6SMatt Jacob ct_hdr_t snscb_cthdr; 11591dae40ebSMatt Jacob uint8_t snscb_port_type; 11601dae40ebSMatt Jacob uint8_t snscb_port_id[3]; 11611dae40ebSMatt Jacob uint8_t snscb_portname[8]; 11621dae40ebSMatt Jacob uint8_t snscb_pnlen; /* symbolic port name length */ 11631dae40ebSMatt Jacob uint8_t snscb_pname[255]; /* symbolic port name */ 11641dae40ebSMatt Jacob uint8_t snscb_nodename[8]; 11651dae40ebSMatt Jacob uint8_t snscb_nnlen; /* symbolic node name length */ 11661dae40ebSMatt Jacob uint8_t snscb_nname[255]; /* symbolic node name */ 11671dae40ebSMatt Jacob uint8_t snscb_ipassoc[8]; 11681dae40ebSMatt Jacob uint8_t snscb_ipaddr[16]; 11691dae40ebSMatt Jacob uint8_t snscb_svc_class[4]; 11701dae40ebSMatt Jacob uint8_t snscb_fc4_types[32]; 11711dae40ebSMatt Jacob uint8_t snscb_fpname[8]; 11721dae40ebSMatt Jacob uint8_t snscb_reserved; 11731dae40ebSMatt Jacob uint8_t snscb_hardaddr[3]; 1174029f13c6SMatt Jacob } sns_ga_nxt_rsp_t; /* Subcommand Response Structure */ 1175029f13c6SMatt Jacob #define SNS_GA_NXT_RESP_SIZE (sizeof (sns_ga_nxt_rsp_t)) 1176029f13c6SMatt Jacob 1177029f13c6SMatt Jacob typedef struct { 1178029f13c6SMatt Jacob ct_hdr_t snscb_cthdr; 11791dae40ebSMatt Jacob uint8_t snscb_wwn[8]; 1180029f13c6SMatt Jacob } sns_gxn_id_rsp_t; 1181029f13c6SMatt Jacob #define SNS_GXN_ID_RESP_SIZE (sizeof (sns_gxn_id_rsp_t)) 1182029f13c6SMatt Jacob 11834a999c65SMatt Jacob typedef struct { 11844a999c65SMatt Jacob ct_hdr_t snscb_cthdr; 1185a94fab67SAlexander Motin uint32_t snscb_fc4_types[8]; 1186a94fab67SAlexander Motin } sns_gft_id_rsp_t; 1187a94fab67SAlexander Motin #define SNS_GFT_ID_RESP_SIZE (sizeof (sns_gft_id_rsp_t)) 1188a94fab67SAlexander Motin 1189a94fab67SAlexander Motin typedef struct { 1190a94fab67SAlexander Motin ct_hdr_t snscb_cthdr; 11911dae40ebSMatt Jacob uint32_t snscb_fc4_features[32]; 11924a999c65SMatt Jacob } sns_gff_id_rsp_t; 11934a999c65SMatt Jacob #define SNS_GFF_ID_RESP_SIZE (sizeof (sns_gff_id_rsp_t)) 1194029f13c6SMatt Jacob 1195a94fab67SAlexander Motin typedef struct { /* Used for GID_FT, GID_PT, etc. */ 1196029f13c6SMatt Jacob ct_hdr_t snscb_cthdr; 1197029f13c6SMatt Jacob struct { 11981dae40ebSMatt Jacob uint8_t control; 11991dae40ebSMatt Jacob uint8_t portid[3]; 1200029f13c6SMatt Jacob } snscb_ports[1]; 1201a94fab67SAlexander Motin } sns_gid_xx_rsp_t; 1202a94fab67SAlexander Motin #define SNS_GID_XX_RESP_SIZE(x) ((sizeof (sns_gid_xx_rsp_t)) + ((x - 1) << 2)) 1203eb76ec80SMatt Jacob 120410365e5aSMatt Jacob /* 120510365e5aSMatt Jacob * Other Misc Structures 120610365e5aSMatt Jacob */ 120710365e5aSMatt Jacob 120810365e5aSMatt Jacob /* ELS Pass Through */ 120910365e5aSMatt Jacob typedef struct { 121010365e5aSMatt Jacob isphdr_t els_hdr; 121110365e5aSMatt Jacob uint32_t els_handle; 121210365e5aSMatt Jacob uint16_t els_status; 121310365e5aSMatt Jacob uint16_t els_nphdl; 121410365e5aSMatt Jacob uint16_t els_xmit_dsd_count; /* outgoing only */ 121510365e5aSMatt Jacob uint8_t els_vphdl; 121610365e5aSMatt Jacob uint8_t els_sof; 121710365e5aSMatt Jacob uint32_t els_rxid; 121810365e5aSMatt Jacob uint16_t els_recv_dsd_count; /* outgoing only */ 121910365e5aSMatt Jacob uint8_t els_opcode; 122010365e5aSMatt Jacob uint8_t els_reserved1; 122110365e5aSMatt Jacob uint8_t els_did_lo; 122210365e5aSMatt Jacob uint8_t els_did_mid; 122310365e5aSMatt Jacob uint8_t els_did_hi; 122410365e5aSMatt Jacob uint8_t els_reserved2; 122510365e5aSMatt Jacob uint16_t els_reserved3; 122610365e5aSMatt Jacob uint16_t els_ctl_flags; 122710365e5aSMatt Jacob union { 122810365e5aSMatt Jacob struct { 122910365e5aSMatt Jacob uint32_t _els_bytecnt; 123010365e5aSMatt Jacob uint32_t _els_subcode1; 123110365e5aSMatt Jacob uint32_t _els_subcode2; 123210365e5aSMatt Jacob uint8_t _els_reserved4[20]; 123310365e5aSMatt Jacob } in; 123410365e5aSMatt Jacob struct { 123510365e5aSMatt Jacob uint32_t _els_recv_bytecnt; 123610365e5aSMatt Jacob uint32_t _els_xmit_bytecnt; 123710365e5aSMatt Jacob uint32_t _els_xmit_dsd_length; 123810365e5aSMatt Jacob uint16_t _els_xmit_dsd_a1500; 123910365e5aSMatt Jacob uint16_t _els_xmit_dsd_a3116; 124010365e5aSMatt Jacob uint16_t _els_xmit_dsd_a4732; 124110365e5aSMatt Jacob uint16_t _els_xmit_dsd_a6348; 124210365e5aSMatt Jacob uint32_t _els_recv_dsd_length; 124310365e5aSMatt Jacob uint16_t _els_recv_dsd_a1500; 124410365e5aSMatt Jacob uint16_t _els_recv_dsd_a3116; 124510365e5aSMatt Jacob uint16_t _els_recv_dsd_a4732; 124610365e5aSMatt Jacob uint16_t _els_recv_dsd_a6348; 124710365e5aSMatt Jacob } out; 124810365e5aSMatt Jacob } inout; 124910365e5aSMatt Jacob #define els_bytecnt inout.in._els_bytecnt 125010365e5aSMatt Jacob #define els_subcode1 inout.in._els_subcode1 125110365e5aSMatt Jacob #define els_subcode2 inout.in._els_subcode2 125210365e5aSMatt Jacob #define els_reserved4 inout.in._els_reserved4 125310365e5aSMatt Jacob #define els_recv_bytecnt inout.out._els_recv_bytecnt 125410365e5aSMatt Jacob #define els_xmit_bytecnt inout.out._els_xmit_bytecnt 125510365e5aSMatt Jacob #define els_xmit_dsd_length inout.out._els_xmit_dsd_length 125610365e5aSMatt Jacob #define els_xmit_dsd_a1500 inout.out._els_xmit_dsd_a1500 125710365e5aSMatt Jacob #define els_xmit_dsd_a3116 inout.out._els_xmit_dsd_a3116 125810365e5aSMatt Jacob #define els_xmit_dsd_a4732 inout.out._els_xmit_dsd_a4732 125910365e5aSMatt Jacob #define els_xmit_dsd_a6348 inout.out._els_xmit_dsd_a6348 126010365e5aSMatt Jacob #define els_recv_dsd_length inout.out._els_recv_dsd_length 126110365e5aSMatt Jacob #define els_recv_dsd_a1500 inout.out._els_recv_dsd_a1500 126210365e5aSMatt Jacob #define els_recv_dsd_a3116 inout.out._els_recv_dsd_a3116 126310365e5aSMatt Jacob #define els_recv_dsd_a4732 inout.out._els_recv_dsd_a4732 126410365e5aSMatt Jacob #define els_recv_dsd_a6348 inout.out._els_recv_dsd_a6348 126510365e5aSMatt Jacob } els_t; 12662cad1d98SMatt Jacob 12672cad1d98SMatt Jacob /* 12682df76c16SMatt Jacob * Target Mode related definitions 12692df76c16SMatt Jacob */ 12702df76c16SMatt Jacob 12712df76c16SMatt Jacob /* 12722df76c16SMatt Jacob * ISP24XX Immediate Notify 12732df76c16SMatt Jacob */ 12742df76c16SMatt Jacob typedef struct { 12752df76c16SMatt Jacob isphdr_t in_header; 12762df76c16SMatt Jacob uint32_t in_reserved; 12772df76c16SMatt Jacob uint16_t in_nphdl; 12782df76c16SMatt Jacob uint16_t in_reserved1; 12792df76c16SMatt Jacob uint16_t in_flags; 12802df76c16SMatt Jacob uint16_t in_srr_rxid; 12812df76c16SMatt Jacob uint16_t in_status; 12822df76c16SMatt Jacob uint8_t in_status_subcode; 128337a7daacSAlexander Motin uint8_t in_fwhandle; 12842df76c16SMatt Jacob uint32_t in_rxid; 12852df76c16SMatt Jacob uint16_t in_srr_reloff_lo; 12862df76c16SMatt Jacob uint16_t in_srr_reloff_hi; 12872df76c16SMatt Jacob uint16_t in_srr_iu; 12882df76c16SMatt Jacob uint16_t in_srr_oxid; 12892df76c16SMatt Jacob /* 1290387d8239SMatt Jacob * If bit 2 is set in in_flags, the N-Port and 1291387d8239SMatt Jacob * handle tags are valid. If the received ELS is 12922df76c16SMatt Jacob * a LOGO, then these tags contain the N Port ID 12932df76c16SMatt Jacob * from the LOGO payload. If the received ELS 12942df76c16SMatt Jacob * request is TPRLO, these tags contain the 12952df76c16SMatt Jacob * Third Party Originator N Port ID. 12962df76c16SMatt Jacob */ 12972df76c16SMatt Jacob uint16_t in_nport_id_hi; 1298387d8239SMatt Jacob #define in_prli_options in_nport_id_hi 12992df76c16SMatt Jacob uint8_t in_nport_id_lo; 13002df76c16SMatt Jacob uint8_t in_reserved3; 13012df76c16SMatt Jacob uint16_t in_np_handle; 13022df76c16SMatt Jacob uint8_t in_reserved4[12]; 13032df76c16SMatt Jacob uint8_t in_reserved5; 13042df76c16SMatt Jacob uint8_t in_vpidx; 13052df76c16SMatt Jacob uint32_t in_reserved6; 13062df76c16SMatt Jacob uint16_t in_portid_lo; 13072df76c16SMatt Jacob uint8_t in_portid_hi; 13082df76c16SMatt Jacob uint8_t in_reserved7; 13092df76c16SMatt Jacob uint16_t in_reserved8; 13102df76c16SMatt Jacob uint16_t in_oxid; 13112df76c16SMatt Jacob } in_fcentry_24xx_t; 13122df76c16SMatt Jacob 13132df76c16SMatt Jacob #define IN24XX_FLAG_PUREX_IOCB 0x1 13142df76c16SMatt Jacob #define IN24XX_FLAG_GLOBAL_LOGOUT 0x2 13152df76c16SMatt Jacob #define IN24XX_FLAG_NPHDL_VALID 0x4 131637a7daacSAlexander Motin #define IN24XX_FLAG_N2N_PRLI 0x8 131737a7daacSAlexander Motin #define IN24XX_FLAG_PN_NN_VALID 0x10 13182df76c16SMatt Jacob 13192df76c16SMatt Jacob #define IN24XX_LIP_RESET 0x0E 13202df76c16SMatt Jacob #define IN24XX_LINK_RESET 0x0F 13212df76c16SMatt Jacob #define IN24XX_PORT_LOGOUT 0x29 13222df76c16SMatt Jacob #define IN24XX_PORT_CHANGED 0x2A 13232df76c16SMatt Jacob #define IN24XX_LINK_FAILED 0x2E 13242df76c16SMatt Jacob #define IN24XX_SRR_RCVD 0x45 13252df76c16SMatt Jacob #define IN24XX_ELS_RCVD 0x46 /* 13262df76c16SMatt Jacob * login-affectin ELS received- check 13272df76c16SMatt Jacob * subcode for specific opcode 13282df76c16SMatt Jacob */ 13292df76c16SMatt Jacob 13302df76c16SMatt Jacob /* 13312df76c16SMatt Jacob * For f/w > 4.0.25, these offsets in the Immediate Notify contain 13322df76c16SMatt Jacob * the WWNN/WWPN if the ELS is PLOGI, PDISC or ADISC. The WWN is in 13332df76c16SMatt Jacob * Big Endian format. 13342df76c16SMatt Jacob */ 133537a7daacSAlexander Motin #define IN24XX_PRLI_WWNN_OFF 0x18 133637a7daacSAlexander Motin #define IN24XX_PRLI_WWPN_OFF 0x28 13372df76c16SMatt Jacob #define IN24XX_PLOGI_WWNN_OFF 0x20 13382df76c16SMatt Jacob #define IN24XX_PLOGI_WWPN_OFF 0x28 13392df76c16SMatt Jacob 13402df76c16SMatt Jacob /* 13412df76c16SMatt Jacob * For f/w > 4.0.25, this offset in the Immediate Notify contain 13422df76c16SMatt Jacob * the WWPN if the ELS is LOGO. The WWN is in Big Endian format. 13432df76c16SMatt Jacob */ 13442df76c16SMatt Jacob #define IN24XX_LOGO_WWPN_OFF 0x28 13452df76c16SMatt Jacob 13462df76c16SMatt Jacob /* 13472df76c16SMatt Jacob * Immediate Notify Status Subcodes for IN24XX_PORT_LOGOUT 13482df76c16SMatt Jacob */ 13492df76c16SMatt Jacob #define IN24XX_PORT_LOGOUT_PDISC_TMO 0x00 13502df76c16SMatt Jacob #define IN24XX_PORT_LOGOUT_UXPR_DISC 0x01 13512df76c16SMatt Jacob #define IN24XX_PORT_LOGOUT_OWN_OPN 0x02 13522df76c16SMatt Jacob #define IN24XX_PORT_LOGOUT_OWN_OPN_SFT 0x03 13532df76c16SMatt Jacob #define IN24XX_PORT_LOGOUT_ABTS_TMO 0x04 13542df76c16SMatt Jacob #define IN24XX_PORT_LOGOUT_DISC_RJT 0x05 13552df76c16SMatt Jacob #define IN24XX_PORT_LOGOUT_LOGIN_NEEDED 0x06 13562df76c16SMatt Jacob #define IN24XX_PORT_LOGOUT_BAD_DISC 0x07 13572df76c16SMatt Jacob #define IN24XX_PORT_LOGOUT_LOST_ALPA 0x08 13582df76c16SMatt Jacob #define IN24XX_PORT_LOGOUT_XMIT_FAILURE 0x09 13592df76c16SMatt Jacob 13602df76c16SMatt Jacob /* 13612df76c16SMatt Jacob * Immediate Notify Status Subcodes for IN24XX_PORT_CHANGED 13622df76c16SMatt Jacob */ 13632df76c16SMatt Jacob #define IN24XX_PORT_CHANGED_BADFAN 0x00 13642df76c16SMatt Jacob #define IN24XX_PORT_CHANGED_TOPO_CHANGE 0x01 13652df76c16SMatt Jacob #define IN24XX_PORT_CHANGED_FLOGI_ACC 0x02 13662df76c16SMatt Jacob #define IN24XX_PORT_CHANGED_FLOGI_RJT 0x03 13672df76c16SMatt Jacob #define IN24XX_PORT_CHANGED_TIMEOUT 0x04 13682df76c16SMatt Jacob #define IN24XX_PORT_CHANGED_PORT_CHANGE 0x05 13692df76c16SMatt Jacob 13702df76c16SMatt Jacob /* 13712df76c16SMatt Jacob * ISP24XX Notify Acknowledge 13722df76c16SMatt Jacob */ 13731b760be4SAlexander Motin #define NA_OK 0x01 /* Notify Acknowledge Succeeded */ 13742df76c16SMatt Jacob typedef struct { 13752df76c16SMatt Jacob isphdr_t na_header; 13762df76c16SMatt Jacob uint32_t na_handle; 13772df76c16SMatt Jacob uint16_t na_nphdl; 13782df76c16SMatt Jacob uint16_t na_reserved1; 13792df76c16SMatt Jacob uint16_t na_flags; 13802df76c16SMatt Jacob uint16_t na_srr_rxid; 13812df76c16SMatt Jacob uint16_t na_status; 13822df76c16SMatt Jacob uint8_t na_status_subcode; 138337a7daacSAlexander Motin uint8_t na_fwhandle; 13842df76c16SMatt Jacob uint32_t na_rxid; 13852df76c16SMatt Jacob uint16_t na_srr_reloff_lo; 13862df76c16SMatt Jacob uint16_t na_srr_reloff_hi; 13872df76c16SMatt Jacob uint16_t na_srr_iu; 13882df76c16SMatt Jacob uint16_t na_srr_flags; 13892df76c16SMatt Jacob uint8_t na_reserved3[18]; 13902df76c16SMatt Jacob uint8_t na_reserved4; 13912df76c16SMatt Jacob uint8_t na_vpidx; 13922df76c16SMatt Jacob uint8_t na_srr_reject_vunique; 13932df76c16SMatt Jacob uint8_t na_srr_reject_explanation; 13942df76c16SMatt Jacob uint8_t na_srr_reject_code; 13952df76c16SMatt Jacob uint8_t na_reserved5; 13962df76c16SMatt Jacob uint8_t na_reserved6[6]; 13972df76c16SMatt Jacob uint16_t na_oxid; 13982df76c16SMatt Jacob } na_fcentry_24xx_t; 13992df76c16SMatt Jacob 14002df76c16SMatt Jacob /* 14012df76c16SMatt Jacob * 24XX ATIO Definition 14022df76c16SMatt Jacob * 14032df76c16SMatt Jacob * This is *quite* different from other entry types. 14042df76c16SMatt Jacob * First of all, it has its own queue it comes in on. 14052df76c16SMatt Jacob * 14062df76c16SMatt Jacob * Secondly, it doesn't have a normal header. 14072df76c16SMatt Jacob * 14082df76c16SMatt Jacob * Thirdly, it's just a passthru of the FCP CMND IU 14092df76c16SMatt Jacob * which is recorded in big endian mode. 14102df76c16SMatt Jacob */ 14112df76c16SMatt Jacob typedef struct { 14122df76c16SMatt Jacob uint8_t at_type; 14132df76c16SMatt Jacob uint8_t at_count; 14142df76c16SMatt Jacob /* 14152df76c16SMatt Jacob * Task attribute in high four bits, 14162df76c16SMatt Jacob * the rest is the FCP CMND IU Length. 14172df76c16SMatt Jacob * NB: the command can extend past the 14182df76c16SMatt Jacob * length for a single queue entry. 14192df76c16SMatt Jacob */ 14202df76c16SMatt Jacob uint16_t at_ta_len; 14212df76c16SMatt Jacob uint32_t at_rxid; 14222df76c16SMatt Jacob fc_hdr_t at_hdr; 14232df76c16SMatt Jacob fcp_cmnd_iu_t at_cmnd; 14242df76c16SMatt Jacob } at7_entry_t; 14252df76c16SMatt Jacob #define AT7_NORESRC_RXID 0xffffffff 14262df76c16SMatt Jacob 14272df76c16SMatt Jacob #define CT_HBA_RESET 0xffff /* pseudo error - command destroyed by HBA reset*/ 14282df76c16SMatt Jacob 14292df76c16SMatt Jacob /* 14302df76c16SMatt Jacob * ISP24XX CTIO 14312df76c16SMatt Jacob */ 14322df76c16SMatt Jacob #define MAXRESPLEN_24XX 24 14332df76c16SMatt Jacob typedef struct { 14342df76c16SMatt Jacob isphdr_t ct_header; 14352df76c16SMatt Jacob uint32_t ct_syshandle; 14362df76c16SMatt Jacob uint16_t ct_nphdl; /* status on returned CTIOs */ 14372df76c16SMatt Jacob uint16_t ct_timeout; 14382df76c16SMatt Jacob uint16_t ct_seg_count; 14392df76c16SMatt Jacob uint8_t ct_vpidx; 14402df76c16SMatt Jacob uint8_t ct_xflags; 14412df76c16SMatt Jacob uint16_t ct_iid_lo; /* low 16 bits of portid */ 14422df76c16SMatt Jacob uint8_t ct_iid_hi; /* hi 8 bits of portid */ 14432df76c16SMatt Jacob uint8_t ct_reserved; 14442df76c16SMatt Jacob uint32_t ct_rxid; 14452df76c16SMatt Jacob uint16_t ct_senselen; /* mode 1 only */ 14462df76c16SMatt Jacob uint16_t ct_flags; 1447387d8239SMatt Jacob uint32_t ct_resid; /* residual length */ 14482df76c16SMatt Jacob uint16_t ct_oxid; 14492df76c16SMatt Jacob uint16_t ct_scsi_status; /* modes 0 && 1 only */ 14502df76c16SMatt Jacob union { 14512df76c16SMatt Jacob struct { 14522df76c16SMatt Jacob uint32_t reloff; 14532df76c16SMatt Jacob uint32_t reserved0; 14542df76c16SMatt Jacob uint32_t ct_xfrlen; 14552df76c16SMatt Jacob uint32_t reserved1; 14562df76c16SMatt Jacob ispds64_t ds; 14572df76c16SMatt Jacob } m0; 14582df76c16SMatt Jacob struct { 14592df76c16SMatt Jacob uint16_t ct_resplen; 14602df76c16SMatt Jacob uint16_t reserved; 14612df76c16SMatt Jacob uint8_t ct_resp[MAXRESPLEN_24XX]; 14622df76c16SMatt Jacob } m1; 14632df76c16SMatt Jacob struct { 14642df76c16SMatt Jacob uint32_t reserved0; 14652df76c16SMatt Jacob uint32_t reserved1; 1466387d8239SMatt Jacob uint32_t ct_datalen; 1467387d8239SMatt Jacob uint32_t reserved2; 14682df76c16SMatt Jacob ispds64_t ct_fcp_rsp_iudata; 14692df76c16SMatt Jacob } m2; 14702df76c16SMatt Jacob } rsp; 14712df76c16SMatt Jacob } ct7_entry_t; 14722df76c16SMatt Jacob 14732df76c16SMatt Jacob /* 14742df76c16SMatt Jacob * ct_flags values for CTIO7 14752df76c16SMatt Jacob */ 14762df76c16SMatt Jacob #define CT7_NO_DATA 0x0000 1477387d8239SMatt Jacob #define CT7_DATA_OUT 0x0001 /* *from* initiator */ 1478387d8239SMatt Jacob #define CT7_DATA_IN 0x0002 /* *to* initiator */ 1479387d8239SMatt Jacob #define CT7_DATAMASK 0x3 14802df76c16SMatt Jacob #define CT7_DSD_ENABLE 0x0004 14812df76c16SMatt Jacob #define CT7_CONF_STSFD 0x0010 14822df76c16SMatt Jacob #define CT7_EXPLCT_CONF 0x0020 14832df76c16SMatt Jacob #define CT7_FLAG_MODE0 0x0000 14842df76c16SMatt Jacob #define CT7_FLAG_MODE1 0x0040 14852df76c16SMatt Jacob #define CT7_FLAG_MODE2 0x0080 14862df76c16SMatt Jacob #define CT7_FLAG_MMASK 0x00C0 14872df76c16SMatt Jacob #define CT7_NOACK 0x0100 14882df76c16SMatt Jacob #define CT7_TASK_ATTR_SHIFT 9 14892df76c16SMatt Jacob #define CT7_CONFIRM 0x2000 14902df76c16SMatt Jacob #define CT7_TERMINATE 0x4000 14912df76c16SMatt Jacob #define CT7_SENDSTATUS 0x8000 14922df76c16SMatt Jacob 14932df76c16SMatt Jacob /* 14942df76c16SMatt Jacob * Type 7 CTIO status codes 14952df76c16SMatt Jacob */ 14962df76c16SMatt Jacob #define CT7_OK 0x01 /* completed without error */ 14972df76c16SMatt Jacob #define CT7_ABORTED 0x02 /* aborted by host */ 14982df76c16SMatt Jacob #define CT7_ERR 0x04 /* see sense data for error */ 14992df76c16SMatt Jacob #define CT7_INVAL 0x06 /* request for disabled lun */ 15002df76c16SMatt Jacob #define CT7_INVRXID 0x08 /* Invalid RX_ID */ 15012df76c16SMatt Jacob #define CT7_DATA_OVER 0x09 /* Data Overrun */ 15022df76c16SMatt Jacob #define CT7_TIMEOUT 0x0B /* timed out */ 15032df76c16SMatt Jacob #define CT7_RESET 0x0E /* LIP Rset Received */ 15042df76c16SMatt Jacob #define CT7_BUS_ERROR 0x10 /* DMA PCI Error */ 15052df76c16SMatt Jacob #define CT7_REASSY_ERR 0x11 /* DMA reassembly error */ 15062df76c16SMatt Jacob #define CT7_DATA_UNDER 0x15 /* Data Underrun */ 15072df76c16SMatt Jacob #define CT7_PORTUNAVAIL 0x28 /* port not available */ 15082df76c16SMatt Jacob #define CT7_LOGOUT 0x29 /* port logout */ 15092df76c16SMatt Jacob #define CT7_PORTCHANGED 0x2A /* port changed */ 15102df76c16SMatt Jacob #define CT7_SRR 0x45 /* SRR Received */ 15112df76c16SMatt Jacob 15122df76c16SMatt Jacob /* 15132df76c16SMatt Jacob * Other 24XX related target IOCBs 15142df76c16SMatt Jacob */ 15152df76c16SMatt Jacob 15162df76c16SMatt Jacob /* 15172df76c16SMatt Jacob * ABTS Received 15182df76c16SMatt Jacob */ 15192df76c16SMatt Jacob typedef struct { 15202df76c16SMatt Jacob isphdr_t abts_header; 15212df76c16SMatt Jacob uint8_t abts_reserved0[6]; 15222df76c16SMatt Jacob uint16_t abts_nphdl; 15232df76c16SMatt Jacob uint16_t abts_reserved1; 15242df76c16SMatt Jacob uint16_t abts_sof; 15252df76c16SMatt Jacob uint32_t abts_rxid_abts; 15262df76c16SMatt Jacob uint16_t abts_did_lo; 15272df76c16SMatt Jacob uint8_t abts_did_hi; 15282df76c16SMatt Jacob uint8_t abts_r_ctl; 15292df76c16SMatt Jacob uint16_t abts_sid_lo; 15302df76c16SMatt Jacob uint8_t abts_sid_hi; 15312df76c16SMatt Jacob uint8_t abts_cs_ctl; 15322df76c16SMatt Jacob uint16_t abts_fs_ctl; 15332df76c16SMatt Jacob uint8_t abts_f_ctl; 15342df76c16SMatt Jacob uint8_t abts_type; 15352df76c16SMatt Jacob uint16_t abts_seq_cnt; 15362df76c16SMatt Jacob uint8_t abts_df_ctl; 15372df76c16SMatt Jacob uint8_t abts_seq_id; 15382df76c16SMatt Jacob uint16_t abts_rx_id; 15392df76c16SMatt Jacob uint16_t abts_ox_id; 15402df76c16SMatt Jacob uint32_t abts_param; 15412df76c16SMatt Jacob uint8_t abts_reserved2[16]; 15422df76c16SMatt Jacob uint32_t abts_rxid_task; 15432df76c16SMatt Jacob } abts_t; 15442df76c16SMatt Jacob 15452df76c16SMatt Jacob typedef struct { 15462df76c16SMatt Jacob isphdr_t abts_rsp_header; 15472df76c16SMatt Jacob uint32_t abts_rsp_handle; 15482df76c16SMatt Jacob uint16_t abts_rsp_status; 15492df76c16SMatt Jacob uint16_t abts_rsp_nphdl; 15502df76c16SMatt Jacob uint16_t abts_rsp_ctl_flags; 15512df76c16SMatt Jacob uint16_t abts_rsp_sof; 15522df76c16SMatt Jacob uint32_t abts_rsp_rxid_abts; 15532df76c16SMatt Jacob uint16_t abts_rsp_did_lo; 15542df76c16SMatt Jacob uint8_t abts_rsp_did_hi; 15552df76c16SMatt Jacob uint8_t abts_rsp_r_ctl; 15562df76c16SMatt Jacob uint16_t abts_rsp_sid_lo; 15572df76c16SMatt Jacob uint8_t abts_rsp_sid_hi; 15582df76c16SMatt Jacob uint8_t abts_rsp_cs_ctl; 15592df76c16SMatt Jacob uint16_t abts_rsp_f_ctl_lo; 15602df76c16SMatt Jacob uint8_t abts_rsp_f_ctl_hi; 15612df76c16SMatt Jacob uint8_t abts_rsp_type; 15622df76c16SMatt Jacob uint16_t abts_rsp_seq_cnt; 15632df76c16SMatt Jacob uint8_t abts_rsp_df_ctl; 15642df76c16SMatt Jacob uint8_t abts_rsp_seq_id; 15652df76c16SMatt Jacob uint16_t abts_rsp_rx_id; 15662df76c16SMatt Jacob uint16_t abts_rsp_ox_id; 15672df76c16SMatt Jacob uint32_t abts_rsp_param; 15682df76c16SMatt Jacob union { 15692df76c16SMatt Jacob struct { 15702df76c16SMatt Jacob uint16_t reserved; 15712df76c16SMatt Jacob uint8_t last_seq_id; 15722df76c16SMatt Jacob uint8_t seq_id_valid; 15732df76c16SMatt Jacob uint16_t aborted_rx_id; 15742df76c16SMatt Jacob uint16_t aborted_ox_id; 15752df76c16SMatt Jacob uint16_t high_seq_cnt; 15762df76c16SMatt Jacob uint16_t low_seq_cnt; 15772df76c16SMatt Jacob uint8_t reserved2[4]; 15782df76c16SMatt Jacob } ba_acc; 15792df76c16SMatt Jacob struct { 15802df76c16SMatt Jacob uint8_t vendor_unique; 15812df76c16SMatt Jacob uint8_t explanation; 15822df76c16SMatt Jacob uint8_t reason; 15832df76c16SMatt Jacob uint8_t reserved; 15842df76c16SMatt Jacob uint8_t reserved2[12]; 15852df76c16SMatt Jacob } ba_rjt; 15862df76c16SMatt Jacob struct { 15872df76c16SMatt Jacob uint8_t reserved[8]; 15882df76c16SMatt Jacob uint32_t subcode1; 15892df76c16SMatt Jacob uint32_t subcode2; 15902df76c16SMatt Jacob } rsp; 15912df76c16SMatt Jacob uint8_t reserved[16]; 15922df76c16SMatt Jacob } abts_rsp_payload; 15932df76c16SMatt Jacob uint32_t abts_rsp_rxid_task; 15942df76c16SMatt Jacob } abts_rsp_t; 15952df76c16SMatt Jacob 15962df76c16SMatt Jacob /* terminate this ABTS exchange */ 15972df76c16SMatt Jacob #define ISP24XX_ABTS_RSP_TERMINATE 0x01 15982df76c16SMatt Jacob 15992df76c16SMatt Jacob #define ISP24XX_ABTS_RSP_COMPLETE 0x00 16002df76c16SMatt Jacob #define ISP24XX_ABTS_RSP_RESET 0x04 16012df76c16SMatt Jacob #define ISP24XX_ABTS_RSP_ABORTED 0x05 16022df76c16SMatt Jacob #define ISP24XX_ABTS_RSP_TIMEOUT 0x06 16032df76c16SMatt Jacob #define ISP24XX_ABTS_RSP_INVXID 0x08 16042df76c16SMatt Jacob #define ISP24XX_ABTS_RSP_LOGOUT 0x29 16052df76c16SMatt Jacob #define ISP24XX_ABTS_RSP_SUBCODE 0x31 16062df76c16SMatt Jacob 16072df76c16SMatt Jacob #define ISP24XX_NO_TASK 0xffffffff 16082df76c16SMatt Jacob 16092df76c16SMatt Jacob /* 16102df76c16SMatt Jacob * Miscellaneous 16112df76c16SMatt Jacob * 16120f99cb55SAlexander Motin * This is the limit of the number of dma segments we can deal with based 16130f99cb55SAlexander Motin * not on the size of the segment counter (which is 16 bits), but on the 16140f99cb55SAlexander Motin * size of the number of queue entries field (which is 8 bits). We assume 16150f99cb55SAlexander Motin * one segment in the first queue entry, plus we can have 5 segments per 16160f99cb55SAlexander Motin * continuation entry, multiplied by maximum of continuation entries. 16172df76c16SMatt Jacob */ 16180f99cb55SAlexander Motin #define ISP_NSEG64_MAX (1 + (QENTRY_MAX - 1) * 5) 16192df76c16SMatt Jacob 16206054c3f6SMatt Jacob #endif /* _ISPMBOX_H */ 1621