12d70c103SNicholas Bellinger /* 22d70c103SNicholas Bellinger * Copyright (C) 2004 - 2010 Vladislav Bolkhovitin <vst@vlnb.net> 32d70c103SNicholas Bellinger * Copyright (C) 2004 - 2005 Leonid Stoljar 42d70c103SNicholas Bellinger * Copyright (C) 2006 Nathaniel Clark <nate@misrule.us> 52d70c103SNicholas Bellinger * Copyright (C) 2007 - 2010 ID7 Ltd. 62d70c103SNicholas Bellinger * 72d70c103SNicholas Bellinger * Forward port and refactoring to modern qla2xxx and target/configfs 82d70c103SNicholas Bellinger * 92d70c103SNicholas Bellinger * Copyright (C) 2010-2011 Nicholas A. Bellinger <nab@kernel.org> 102d70c103SNicholas Bellinger * 112d70c103SNicholas Bellinger * Additional file for the target driver support. 122d70c103SNicholas Bellinger * 132d70c103SNicholas Bellinger * This program is free software; you can redistribute it and/or 142d70c103SNicholas Bellinger * modify it under the terms of the GNU General Public License 152d70c103SNicholas Bellinger * as published by the Free Software Foundation; either version 2 162d70c103SNicholas Bellinger * of the License, or (at your option) any later version. 172d70c103SNicholas Bellinger * 182d70c103SNicholas Bellinger * This program is distributed in the hope that it will be useful, 192d70c103SNicholas Bellinger * but WITHOUT ANY WARRANTY; without even the implied warranty of 202d70c103SNicholas Bellinger * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 212d70c103SNicholas Bellinger * GNU General Public License for more details. 222d70c103SNicholas Bellinger */ 232d70c103SNicholas Bellinger /* 242d70c103SNicholas Bellinger * This is the global def file that is useful for including from the 252d70c103SNicholas Bellinger * target portion. 262d70c103SNicholas Bellinger */ 272d70c103SNicholas Bellinger 282d70c103SNicholas Bellinger #ifndef __QLA_TARGET_H 292d70c103SNicholas Bellinger #define __QLA_TARGET_H 302d70c103SNicholas Bellinger 312d70c103SNicholas Bellinger #include "qla_def.h" 322d70c103SNicholas Bellinger 332d70c103SNicholas Bellinger /* 342d70c103SNicholas Bellinger * Must be changed on any change in any initiator visible interfaces or 352d70c103SNicholas Bellinger * data in the target add-on 362d70c103SNicholas Bellinger */ 372d70c103SNicholas Bellinger #define QLA2XXX_TARGET_MAGIC 269 382d70c103SNicholas Bellinger 392d70c103SNicholas Bellinger /* 402d70c103SNicholas Bellinger * Must be changed on any change in any target visible interfaces or 412d70c103SNicholas Bellinger * data in the initiator 422d70c103SNicholas Bellinger */ 432d70c103SNicholas Bellinger #define QLA2XXX_INITIATOR_MAGIC 57222 442d70c103SNicholas Bellinger 452d70c103SNicholas Bellinger #define QLA2XXX_INI_MODE_STR_EXCLUSIVE "exclusive" 462d70c103SNicholas Bellinger #define QLA2XXX_INI_MODE_STR_DISABLED "disabled" 472d70c103SNicholas Bellinger #define QLA2XXX_INI_MODE_STR_ENABLED "enabled" 482d70c103SNicholas Bellinger 492d70c103SNicholas Bellinger #define QLA2XXX_INI_MODE_EXCLUSIVE 0 502d70c103SNicholas Bellinger #define QLA2XXX_INI_MODE_DISABLED 1 512d70c103SNicholas Bellinger #define QLA2XXX_INI_MODE_ENABLED 2 522d70c103SNicholas Bellinger 532d70c103SNicholas Bellinger #define QLA2XXX_COMMAND_COUNT_INIT 250 542d70c103SNicholas Bellinger #define QLA2XXX_IMMED_NOTIFY_COUNT_INIT 250 552d70c103SNicholas Bellinger 562d70c103SNicholas Bellinger /* 572d70c103SNicholas Bellinger * Used to mark which completion handles (for RIO Status's) are for CTIO's 582d70c103SNicholas Bellinger * vs. regular (non-target) info. This is checked for in 592d70c103SNicholas Bellinger * qla2x00_process_response_queue() to see if a handle coming back in a 602d70c103SNicholas Bellinger * multi-complete should come to the tgt driver or be handled there by qla2xxx 612d70c103SNicholas Bellinger */ 622d70c103SNicholas Bellinger #define CTIO_COMPLETION_HANDLE_MARK BIT_29 638d93f550SChad Dupuis #if (CTIO_COMPLETION_HANDLE_MARK <= DEFAULT_OUTSTANDING_COMMANDS) 648d93f550SChad Dupuis #error "CTIO_COMPLETION_HANDLE_MARK not larger than " 658d93f550SChad Dupuis "DEFAULT_OUTSTANDING_COMMANDS" 662d70c103SNicholas Bellinger #endif 672d70c103SNicholas Bellinger #define HANDLE_IS_CTIO_COMP(h) (h & CTIO_COMPLETION_HANDLE_MARK) 682d70c103SNicholas Bellinger 692d70c103SNicholas Bellinger /* Used to mark CTIO as intermediate */ 702d70c103SNicholas Bellinger #define CTIO_INTERMEDIATE_HANDLE_MARK BIT_30 712d70c103SNicholas Bellinger 722d70c103SNicholas Bellinger #ifndef OF_SS_MODE_0 732d70c103SNicholas Bellinger /* 742d70c103SNicholas Bellinger * ISP target entries - Flags bit definitions. 752d70c103SNicholas Bellinger */ 762d70c103SNicholas Bellinger #define OF_SS_MODE_0 0 772d70c103SNicholas Bellinger #define OF_SS_MODE_1 1 782d70c103SNicholas Bellinger #define OF_SS_MODE_2 2 792d70c103SNicholas Bellinger #define OF_SS_MODE_3 3 802d70c103SNicholas Bellinger 812d70c103SNicholas Bellinger #define OF_EXPL_CONF BIT_5 /* Explicit Confirmation Requested */ 822d70c103SNicholas Bellinger #define OF_DATA_IN BIT_6 /* Data in to initiator */ 832d70c103SNicholas Bellinger /* (data from target to initiator) */ 842d70c103SNicholas Bellinger #define OF_DATA_OUT BIT_7 /* Data out from initiator */ 852d70c103SNicholas Bellinger /* (data from initiator to target) */ 862d70c103SNicholas Bellinger #define OF_NO_DATA (BIT_7 | BIT_6) 872d70c103SNicholas Bellinger #define OF_INC_RC BIT_8 /* Increment command resource count */ 882d70c103SNicholas Bellinger #define OF_FAST_POST BIT_9 /* Enable mailbox fast posting. */ 892d70c103SNicholas Bellinger #define OF_CONF_REQ BIT_13 /* Confirmation Requested */ 902d70c103SNicholas Bellinger #define OF_TERM_EXCH BIT_14 /* Terminate exchange */ 912d70c103SNicholas Bellinger #define OF_SSTS BIT_15 /* Send SCSI status */ 922d70c103SNicholas Bellinger #endif 932d70c103SNicholas Bellinger 942d70c103SNicholas Bellinger #ifndef QLA_TGT_DATASEGS_PER_CMD32 952d70c103SNicholas Bellinger #define QLA_TGT_DATASEGS_PER_CMD32 3 962d70c103SNicholas Bellinger #define QLA_TGT_DATASEGS_PER_CONT32 7 972d70c103SNicholas Bellinger #define QLA_TGT_MAX_SG32(ql) \ 982d70c103SNicholas Bellinger (((ql) > 0) ? (QLA_TGT_DATASEGS_PER_CMD32 + \ 992d70c103SNicholas Bellinger QLA_TGT_DATASEGS_PER_CONT32*((ql) - 1)) : 0) 1002d70c103SNicholas Bellinger 1012d70c103SNicholas Bellinger #define QLA_TGT_DATASEGS_PER_CMD64 2 1022d70c103SNicholas Bellinger #define QLA_TGT_DATASEGS_PER_CONT64 5 1032d70c103SNicholas Bellinger #define QLA_TGT_MAX_SG64(ql) \ 1042d70c103SNicholas Bellinger (((ql) > 0) ? (QLA_TGT_DATASEGS_PER_CMD64 + \ 1052d70c103SNicholas Bellinger QLA_TGT_DATASEGS_PER_CONT64*((ql) - 1)) : 0) 1062d70c103SNicholas Bellinger #endif 1072d70c103SNicholas Bellinger 1082d70c103SNicholas Bellinger #ifndef QLA_TGT_DATASEGS_PER_CMD_24XX 1092d70c103SNicholas Bellinger #define QLA_TGT_DATASEGS_PER_CMD_24XX 1 1102d70c103SNicholas Bellinger #define QLA_TGT_DATASEGS_PER_CONT_24XX 5 1112d70c103SNicholas Bellinger #define QLA_TGT_MAX_SG_24XX(ql) \ 1122d70c103SNicholas Bellinger (min(1270, ((ql) > 0) ? (QLA_TGT_DATASEGS_PER_CMD_24XX + \ 1132d70c103SNicholas Bellinger QLA_TGT_DATASEGS_PER_CONT_24XX*((ql) - 1)) : 0)) 1142d70c103SNicholas Bellinger #endif 1152d70c103SNicholas Bellinger #endif 1162d70c103SNicholas Bellinger 1172d70c103SNicholas Bellinger #define GET_TARGET_ID(ha, iocb) ((HAS_EXTENDED_IDS(ha)) \ 1182d70c103SNicholas Bellinger ? le16_to_cpu((iocb)->u.isp2x.target.extended) \ 1192d70c103SNicholas Bellinger : (uint16_t)(iocb)->u.isp2x.target.id.standard) 1202d70c103SNicholas Bellinger 1212d70c103SNicholas Bellinger #ifndef IMMED_NOTIFY_TYPE 1222d70c103SNicholas Bellinger #define IMMED_NOTIFY_TYPE 0x0D /* Immediate notify entry. */ 1232d70c103SNicholas Bellinger /* 1242d70c103SNicholas Bellinger * ISP queue - immediate notify entry structure definition. 1252d70c103SNicholas Bellinger * This is sent by the ISP to the Target driver. 1262d70c103SNicholas Bellinger * This IOCB would have report of events sent by the 1272d70c103SNicholas Bellinger * initiator, that needs to be handled by the target 1282d70c103SNicholas Bellinger * driver immediately. 1292d70c103SNicholas Bellinger */ 1302d70c103SNicholas Bellinger struct imm_ntfy_from_isp { 1312d70c103SNicholas Bellinger uint8_t entry_type; /* Entry type. */ 1322d70c103SNicholas Bellinger uint8_t entry_count; /* Entry count. */ 1332d70c103SNicholas Bellinger uint8_t sys_define; /* System defined. */ 1342d70c103SNicholas Bellinger uint8_t entry_status; /* Entry Status. */ 1352d70c103SNicholas Bellinger union { 1362d70c103SNicholas Bellinger struct { 1372d70c103SNicholas Bellinger uint32_t sys_define_2; /* System defined. */ 1382d70c103SNicholas Bellinger target_id_t target; 1392d70c103SNicholas Bellinger uint16_t lun; 1402d70c103SNicholas Bellinger uint8_t target_id; 1412d70c103SNicholas Bellinger uint8_t reserved_1; 1422d70c103SNicholas Bellinger uint16_t status_modifier; 1432d70c103SNicholas Bellinger uint16_t status; 1442d70c103SNicholas Bellinger uint16_t task_flags; 1452d70c103SNicholas Bellinger uint16_t seq_id; 1462d70c103SNicholas Bellinger uint16_t srr_rx_id; 1472d70c103SNicholas Bellinger uint32_t srr_rel_offs; 1482d70c103SNicholas Bellinger uint16_t srr_ui; 1492d70c103SNicholas Bellinger #define SRR_IU_DATA_IN 0x1 1502d70c103SNicholas Bellinger #define SRR_IU_DATA_OUT 0x5 1512d70c103SNicholas Bellinger #define SRR_IU_STATUS 0x7 1522d70c103SNicholas Bellinger uint16_t srr_ox_id; 1532d70c103SNicholas Bellinger uint8_t reserved_2[28]; 1542d70c103SNicholas Bellinger } isp2x; 1552d70c103SNicholas Bellinger struct { 1562d70c103SNicholas Bellinger uint32_t reserved; 1572d70c103SNicholas Bellinger uint16_t nport_handle; 1582d70c103SNicholas Bellinger uint16_t reserved_2; 1592d70c103SNicholas Bellinger uint16_t flags; 1602d70c103SNicholas Bellinger #define NOTIFY24XX_FLAGS_GLOBAL_TPRLO BIT_1 1612d70c103SNicholas Bellinger #define NOTIFY24XX_FLAGS_PUREX_IOCB BIT_0 1622d70c103SNicholas Bellinger uint16_t srr_rx_id; 1632d70c103SNicholas Bellinger uint16_t status; 1642d70c103SNicholas Bellinger uint8_t status_subcode; 165aa230bc5SArun Easi uint8_t fw_handle; 1662d70c103SNicholas Bellinger uint32_t exchange_address; 1672d70c103SNicholas Bellinger uint32_t srr_rel_offs; 1682d70c103SNicholas Bellinger uint16_t srr_ui; 1692d70c103SNicholas Bellinger uint16_t srr_ox_id; 1702d70c103SNicholas Bellinger uint8_t reserved_4[19]; 1712d70c103SNicholas Bellinger uint8_t vp_index; 1722d70c103SNicholas Bellinger uint32_t reserved_5; 1732d70c103SNicholas Bellinger uint8_t port_id[3]; 1742d70c103SNicholas Bellinger uint8_t reserved_6; 1752d70c103SNicholas Bellinger } isp24; 1762d70c103SNicholas Bellinger } u; 1772d70c103SNicholas Bellinger uint16_t reserved_7; 1782d70c103SNicholas Bellinger uint16_t ox_id; 1792d70c103SNicholas Bellinger } __packed; 1802d70c103SNicholas Bellinger #endif 1812d70c103SNicholas Bellinger 1822d70c103SNicholas Bellinger #ifndef NOTIFY_ACK_TYPE 1832d70c103SNicholas Bellinger #define NOTIFY_ACK_TYPE 0x0E /* Notify acknowledge entry. */ 1842d70c103SNicholas Bellinger /* 1852d70c103SNicholas Bellinger * ISP queue - notify acknowledge entry structure definition. 1862d70c103SNicholas Bellinger * This is sent to the ISP from the target driver. 1872d70c103SNicholas Bellinger */ 1882d70c103SNicholas Bellinger struct nack_to_isp { 1892d70c103SNicholas Bellinger uint8_t entry_type; /* Entry type. */ 1902d70c103SNicholas Bellinger uint8_t entry_count; /* Entry count. */ 1912d70c103SNicholas Bellinger uint8_t sys_define; /* System defined. */ 1922d70c103SNicholas Bellinger uint8_t entry_status; /* Entry Status. */ 1932d70c103SNicholas Bellinger union { 1942d70c103SNicholas Bellinger struct { 1952d70c103SNicholas Bellinger uint32_t sys_define_2; /* System defined. */ 1962d70c103SNicholas Bellinger target_id_t target; 1972d70c103SNicholas Bellinger uint8_t target_id; 1982d70c103SNicholas Bellinger uint8_t reserved_1; 1992d70c103SNicholas Bellinger uint16_t flags; 2002d70c103SNicholas Bellinger uint16_t resp_code; 2012d70c103SNicholas Bellinger uint16_t status; 2022d70c103SNicholas Bellinger uint16_t task_flags; 2032d70c103SNicholas Bellinger uint16_t seq_id; 2042d70c103SNicholas Bellinger uint16_t srr_rx_id; 2052d70c103SNicholas Bellinger uint32_t srr_rel_offs; 2062d70c103SNicholas Bellinger uint16_t srr_ui; 2072d70c103SNicholas Bellinger uint16_t srr_flags; 2082d70c103SNicholas Bellinger uint16_t srr_reject_code; 2092d70c103SNicholas Bellinger uint8_t srr_reject_vendor_uniq; 2102d70c103SNicholas Bellinger uint8_t srr_reject_code_expl; 2112d70c103SNicholas Bellinger uint8_t reserved_2[24]; 2122d70c103SNicholas Bellinger } isp2x; 2132d70c103SNicholas Bellinger struct { 2142d70c103SNicholas Bellinger uint32_t handle; 2152d70c103SNicholas Bellinger uint16_t nport_handle; 2162d70c103SNicholas Bellinger uint16_t reserved_1; 2172d70c103SNicholas Bellinger uint16_t flags; 2182d70c103SNicholas Bellinger uint16_t srr_rx_id; 2192d70c103SNicholas Bellinger uint16_t status; 2202d70c103SNicholas Bellinger uint8_t status_subcode; 221aa230bc5SArun Easi uint8_t fw_handle; 2222d70c103SNicholas Bellinger uint32_t exchange_address; 2232d70c103SNicholas Bellinger uint32_t srr_rel_offs; 2242d70c103SNicholas Bellinger uint16_t srr_ui; 2252d70c103SNicholas Bellinger uint16_t srr_flags; 2262d70c103SNicholas Bellinger uint8_t reserved_4[19]; 2272d70c103SNicholas Bellinger uint8_t vp_index; 2282d70c103SNicholas Bellinger uint8_t srr_reject_vendor_uniq; 2292d70c103SNicholas Bellinger uint8_t srr_reject_code_expl; 2302d70c103SNicholas Bellinger uint8_t srr_reject_code; 2312d70c103SNicholas Bellinger uint8_t reserved_5[5]; 2322d70c103SNicholas Bellinger } isp24; 2332d70c103SNicholas Bellinger } u; 2342d70c103SNicholas Bellinger uint8_t reserved[2]; 2352d70c103SNicholas Bellinger uint16_t ox_id; 2362d70c103SNicholas Bellinger } __packed; 2372d70c103SNicholas Bellinger #define NOTIFY_ACK_SRR_FLAGS_ACCEPT 0 2382d70c103SNicholas Bellinger #define NOTIFY_ACK_SRR_FLAGS_REJECT 1 2392d70c103SNicholas Bellinger 2402d70c103SNicholas Bellinger #define NOTIFY_ACK_SRR_REJECT_REASON_UNABLE_TO_PERFORM 0x9 2412d70c103SNicholas Bellinger 2422d70c103SNicholas Bellinger #define NOTIFY_ACK_SRR_FLAGS_REJECT_EXPL_NO_EXPL 0 2432d70c103SNicholas Bellinger #define NOTIFY_ACK_SRR_FLAGS_REJECT_EXPL_UNABLE_TO_SUPPLY_DATA 0x2a 2442d70c103SNicholas Bellinger 2452d70c103SNicholas Bellinger #define NOTIFY_ACK_SUCCESS 0x01 2462d70c103SNicholas Bellinger #endif 2472d70c103SNicholas Bellinger 2482d70c103SNicholas Bellinger #ifndef ACCEPT_TGT_IO_TYPE 2492d70c103SNicholas Bellinger #define ACCEPT_TGT_IO_TYPE 0x16 /* Accept target I/O entry. */ 2502d70c103SNicholas Bellinger #endif 2512d70c103SNicholas Bellinger 2522d70c103SNicholas Bellinger #ifndef CONTINUE_TGT_IO_TYPE 2532d70c103SNicholas Bellinger #define CONTINUE_TGT_IO_TYPE 0x17 2542d70c103SNicholas Bellinger /* 2552d70c103SNicholas Bellinger * ISP queue - Continue Target I/O (CTIO) entry for status mode 0 structure. 2562d70c103SNicholas Bellinger * This structure is sent to the ISP 2xxx from target driver. 2572d70c103SNicholas Bellinger */ 2582d70c103SNicholas Bellinger struct ctio_to_2xxx { 2592d70c103SNicholas Bellinger uint8_t entry_type; /* Entry type. */ 2602d70c103SNicholas Bellinger uint8_t entry_count; /* Entry count. */ 2612d70c103SNicholas Bellinger uint8_t sys_define; /* System defined. */ 2622d70c103SNicholas Bellinger uint8_t entry_status; /* Entry Status. */ 2632d70c103SNicholas Bellinger uint32_t handle; /* System defined handle */ 2642d70c103SNicholas Bellinger target_id_t target; 2652d70c103SNicholas Bellinger uint16_t rx_id; 2662d70c103SNicholas Bellinger uint16_t flags; 2672d70c103SNicholas Bellinger uint16_t status; 2682d70c103SNicholas Bellinger uint16_t timeout; /* 0 = 30 seconds, 0xFFFF = disable */ 2692d70c103SNicholas Bellinger uint16_t dseg_count; /* Data segment count. */ 2702d70c103SNicholas Bellinger uint32_t relative_offset; 2712d70c103SNicholas Bellinger uint32_t residual; 2722d70c103SNicholas Bellinger uint16_t reserved_1[3]; 2732d70c103SNicholas Bellinger uint16_t scsi_status; 2742d70c103SNicholas Bellinger uint32_t transfer_length; 2752d70c103SNicholas Bellinger uint32_t dseg_0_address; /* Data segment 0 address. */ 2762d70c103SNicholas Bellinger uint32_t dseg_0_length; /* Data segment 0 length. */ 2772d70c103SNicholas Bellinger uint32_t dseg_1_address; /* Data segment 1 address. */ 2782d70c103SNicholas Bellinger uint32_t dseg_1_length; /* Data segment 1 length. */ 2792d70c103SNicholas Bellinger uint32_t dseg_2_address; /* Data segment 2 address. */ 2802d70c103SNicholas Bellinger uint32_t dseg_2_length; /* Data segment 2 length. */ 2812d70c103SNicholas Bellinger } __packed; 2822d70c103SNicholas Bellinger #define ATIO_PATH_INVALID 0x07 2832d70c103SNicholas Bellinger #define ATIO_CANT_PROV_CAP 0x16 2842d70c103SNicholas Bellinger #define ATIO_CDB_VALID 0x3D 2852d70c103SNicholas Bellinger 2862d70c103SNicholas Bellinger #define ATIO_EXEC_READ BIT_1 2872d70c103SNicholas Bellinger #define ATIO_EXEC_WRITE BIT_0 2882d70c103SNicholas Bellinger #endif 2892d70c103SNicholas Bellinger 2902d70c103SNicholas Bellinger #ifndef CTIO_A64_TYPE 2912d70c103SNicholas Bellinger #define CTIO_A64_TYPE 0x1F 2922d70c103SNicholas Bellinger #define CTIO_SUCCESS 0x01 2932d70c103SNicholas Bellinger #define CTIO_ABORTED 0x02 2942d70c103SNicholas Bellinger #define CTIO_INVALID_RX_ID 0x08 2952d70c103SNicholas Bellinger #define CTIO_TIMEOUT 0x0B 2962d70c103SNicholas Bellinger #define CTIO_LIP_RESET 0x0E 2972d70c103SNicholas Bellinger #define CTIO_TARGET_RESET 0x17 2982d70c103SNicholas Bellinger #define CTIO_PORT_UNAVAILABLE 0x28 2992d70c103SNicholas Bellinger #define CTIO_PORT_LOGGED_OUT 0x29 3002d70c103SNicholas Bellinger #define CTIO_PORT_CONF_CHANGED 0x2A 3012d70c103SNicholas Bellinger #define CTIO_SRR_RECEIVED 0x45 3022d70c103SNicholas Bellinger #endif 3032d70c103SNicholas Bellinger 3042d70c103SNicholas Bellinger #ifndef CTIO_RET_TYPE 3052d70c103SNicholas Bellinger #define CTIO_RET_TYPE 0x17 /* CTIO return entry */ 3062d70c103SNicholas Bellinger #define ATIO_TYPE7 0x06 /* Accept target I/O entry for 24xx */ 3072d70c103SNicholas Bellinger 3082d70c103SNicholas Bellinger struct fcp_hdr { 3092d70c103SNicholas Bellinger uint8_t r_ctl; 3102d70c103SNicholas Bellinger uint8_t d_id[3]; 3112d70c103SNicholas Bellinger uint8_t cs_ctl; 3122d70c103SNicholas Bellinger uint8_t s_id[3]; 3132d70c103SNicholas Bellinger uint8_t type; 3142d70c103SNicholas Bellinger uint8_t f_ctl[3]; 3152d70c103SNicholas Bellinger uint8_t seq_id; 3162d70c103SNicholas Bellinger uint8_t df_ctl; 3172d70c103SNicholas Bellinger uint16_t seq_cnt; 3182d70c103SNicholas Bellinger uint16_t ox_id; 3192d70c103SNicholas Bellinger uint16_t rx_id; 3202d70c103SNicholas Bellinger uint32_t parameter; 3212d70c103SNicholas Bellinger } __packed; 3222d70c103SNicholas Bellinger 3232d70c103SNicholas Bellinger struct fcp_hdr_le { 3242d70c103SNicholas Bellinger uint8_t d_id[3]; 3252d70c103SNicholas Bellinger uint8_t r_ctl; 3262d70c103SNicholas Bellinger uint8_t s_id[3]; 3272d70c103SNicholas Bellinger uint8_t cs_ctl; 3282d70c103SNicholas Bellinger uint8_t f_ctl[3]; 3292d70c103SNicholas Bellinger uint8_t type; 3302d70c103SNicholas Bellinger uint16_t seq_cnt; 3312d70c103SNicholas Bellinger uint8_t df_ctl; 3322d70c103SNicholas Bellinger uint8_t seq_id; 3332d70c103SNicholas Bellinger uint16_t rx_id; 3342d70c103SNicholas Bellinger uint16_t ox_id; 3352d70c103SNicholas Bellinger uint32_t parameter; 3362d70c103SNicholas Bellinger } __packed; 3372d70c103SNicholas Bellinger 3382d70c103SNicholas Bellinger #define F_CTL_EXCH_CONTEXT_RESP BIT_23 3392d70c103SNicholas Bellinger #define F_CTL_SEQ_CONTEXT_RESIP BIT_22 3402d70c103SNicholas Bellinger #define F_CTL_LAST_SEQ BIT_20 3412d70c103SNicholas Bellinger #define F_CTL_END_SEQ BIT_19 3422d70c103SNicholas Bellinger #define F_CTL_SEQ_INITIATIVE BIT_16 3432d70c103SNicholas Bellinger 3442d70c103SNicholas Bellinger #define R_CTL_BASIC_LINK_SERV 0x80 3452d70c103SNicholas Bellinger #define R_CTL_B_ACC 0x4 3462d70c103SNicholas Bellinger #define R_CTL_B_RJT 0x5 3472d70c103SNicholas Bellinger 3482d70c103SNicholas Bellinger struct atio7_fcp_cmnd { 3492d70c103SNicholas Bellinger uint64_t lun; 3502d70c103SNicholas Bellinger uint8_t cmnd_ref; 3512d70c103SNicholas Bellinger uint8_t task_attr:3; 3522d70c103SNicholas Bellinger uint8_t reserved:5; 3532d70c103SNicholas Bellinger uint8_t task_mgmt_flags; 3542d70c103SNicholas Bellinger #define FCP_CMND_TASK_MGMT_CLEAR_ACA 6 3552d70c103SNicholas Bellinger #define FCP_CMND_TASK_MGMT_TARGET_RESET 5 3562d70c103SNicholas Bellinger #define FCP_CMND_TASK_MGMT_LU_RESET 4 3572d70c103SNicholas Bellinger #define FCP_CMND_TASK_MGMT_CLEAR_TASK_SET 2 3582d70c103SNicholas Bellinger #define FCP_CMND_TASK_MGMT_ABORT_TASK_SET 1 3592d70c103SNicholas Bellinger uint8_t wrdata:1; 3602d70c103SNicholas Bellinger uint8_t rddata:1; 3612d70c103SNicholas Bellinger uint8_t add_cdb_len:6; 3622d70c103SNicholas Bellinger uint8_t cdb[16]; 3632d70c103SNicholas Bellinger /* 3642d70c103SNicholas Bellinger * add_cdb is optional and can absent from struct atio7_fcp_cmnd. Size 4 3652d70c103SNicholas Bellinger * only to make sizeof(struct atio7_fcp_cmnd) be as expected by 3662d70c103SNicholas Bellinger * BUILD_BUG_ON in qlt_init(). 3672d70c103SNicholas Bellinger */ 3682d70c103SNicholas Bellinger uint8_t add_cdb[4]; 3692d70c103SNicholas Bellinger /* uint32_t data_length; */ 3702d70c103SNicholas Bellinger } __packed; 3712d70c103SNicholas Bellinger 3722d70c103SNicholas Bellinger /* 3732d70c103SNicholas Bellinger * ISP queue - Accept Target I/O (ATIO) type entry IOCB structure. 3742d70c103SNicholas Bellinger * This is sent from the ISP to the target driver. 3752d70c103SNicholas Bellinger */ 3762d70c103SNicholas Bellinger struct atio_from_isp { 3772d70c103SNicholas Bellinger union { 3782d70c103SNicholas Bellinger struct { 3792d70c103SNicholas Bellinger uint16_t entry_hdr; 3802d70c103SNicholas Bellinger uint8_t sys_define; /* System defined. */ 3812d70c103SNicholas Bellinger uint8_t entry_status; /* Entry Status. */ 3822d70c103SNicholas Bellinger uint32_t sys_define_2; /* System defined. */ 3832d70c103SNicholas Bellinger target_id_t target; 3842d70c103SNicholas Bellinger uint16_t rx_id; 3852d70c103SNicholas Bellinger uint16_t flags; 3862d70c103SNicholas Bellinger uint16_t status; 3872d70c103SNicholas Bellinger uint8_t command_ref; 3882d70c103SNicholas Bellinger uint8_t task_codes; 3892d70c103SNicholas Bellinger uint8_t task_flags; 3902d70c103SNicholas Bellinger uint8_t execution_codes; 3912d70c103SNicholas Bellinger uint8_t cdb[MAX_CMDSZ]; 3922d70c103SNicholas Bellinger uint32_t data_length; 3932d70c103SNicholas Bellinger uint16_t lun; 3942d70c103SNicholas Bellinger uint8_t initiator_port_name[WWN_SIZE]; /* on qla23xx */ 3952d70c103SNicholas Bellinger uint16_t reserved_32[6]; 3962d70c103SNicholas Bellinger uint16_t ox_id; 3972d70c103SNicholas Bellinger } isp2x; 3982d70c103SNicholas Bellinger struct { 3992d70c103SNicholas Bellinger uint16_t entry_hdr; 4002d70c103SNicholas Bellinger uint8_t fcp_cmnd_len_low; 4012d70c103SNicholas Bellinger uint8_t fcp_cmnd_len_high:4; 4022d70c103SNicholas Bellinger uint8_t attr:4; 4032d70c103SNicholas Bellinger uint32_t exchange_addr; 4042d70c103SNicholas Bellinger #define ATIO_EXCHANGE_ADDRESS_UNKNOWN 0xFFFFFFFF 4052d70c103SNicholas Bellinger struct fcp_hdr fcp_hdr; 4062d70c103SNicholas Bellinger struct atio7_fcp_cmnd fcp_cmnd; 4072d70c103SNicholas Bellinger } isp24; 4082d70c103SNicholas Bellinger struct { 4092d70c103SNicholas Bellinger uint8_t entry_type; /* Entry type. */ 4102d70c103SNicholas Bellinger uint8_t entry_count; /* Entry count. */ 4112d70c103SNicholas Bellinger uint8_t data[58]; 4122d70c103SNicholas Bellinger uint32_t signature; 4132d70c103SNicholas Bellinger #define ATIO_PROCESSED 0xDEADDEAD /* Signature */ 4142d70c103SNicholas Bellinger } raw; 4152d70c103SNicholas Bellinger } u; 4162d70c103SNicholas Bellinger } __packed; 4172d70c103SNicholas Bellinger 4182d70c103SNicholas Bellinger #define CTIO_TYPE7 0x12 /* Continue target I/O entry (for 24xx) */ 4192d70c103SNicholas Bellinger 4202d70c103SNicholas Bellinger /* 4212d70c103SNicholas Bellinger * ISP queue - Continue Target I/O (ATIO) type 7 entry (for 24xx) structure. 4222d70c103SNicholas Bellinger * This structure is sent to the ISP 24xx from the target driver. 4232d70c103SNicholas Bellinger */ 4242d70c103SNicholas Bellinger 4252d70c103SNicholas Bellinger struct ctio7_to_24xx { 4262d70c103SNicholas Bellinger uint8_t entry_type; /* Entry type. */ 4272d70c103SNicholas Bellinger uint8_t entry_count; /* Entry count. */ 4282d70c103SNicholas Bellinger uint8_t sys_define; /* System defined. */ 4292d70c103SNicholas Bellinger uint8_t entry_status; /* Entry Status. */ 4302d70c103SNicholas Bellinger uint32_t handle; /* System defined handle */ 4312d70c103SNicholas Bellinger uint16_t nport_handle; 4322d70c103SNicholas Bellinger #define CTIO7_NHANDLE_UNRECOGNIZED 0xFFFF 4332d70c103SNicholas Bellinger uint16_t timeout; 4342d70c103SNicholas Bellinger uint16_t dseg_count; /* Data segment count. */ 4352d70c103SNicholas Bellinger uint8_t vp_index; 4362d70c103SNicholas Bellinger uint8_t add_flags; 4372d70c103SNicholas Bellinger uint8_t initiator_id[3]; 4382d70c103SNicholas Bellinger uint8_t reserved; 4392d70c103SNicholas Bellinger uint32_t exchange_addr; 4402d70c103SNicholas Bellinger union { 4412d70c103SNicholas Bellinger struct { 4422d70c103SNicholas Bellinger uint16_t reserved1; 4432d70c103SNicholas Bellinger uint16_t flags; 4442d70c103SNicholas Bellinger uint32_t residual; 4452d70c103SNicholas Bellinger uint16_t ox_id; 4462d70c103SNicholas Bellinger uint16_t scsi_status; 4472d70c103SNicholas Bellinger uint32_t relative_offset; 4482d70c103SNicholas Bellinger uint32_t reserved2; 4492d70c103SNicholas Bellinger uint32_t transfer_length; 4502d70c103SNicholas Bellinger uint32_t reserved3; 4512d70c103SNicholas Bellinger /* Data segment 0 address. */ 4522d70c103SNicholas Bellinger uint32_t dseg_0_address[2]; 4532d70c103SNicholas Bellinger /* Data segment 0 length. */ 4542d70c103SNicholas Bellinger uint32_t dseg_0_length; 4552d70c103SNicholas Bellinger } status0; 4562d70c103SNicholas Bellinger struct { 4572d70c103SNicholas Bellinger uint16_t sense_length; 4582d70c103SNicholas Bellinger uint16_t flags; 4592d70c103SNicholas Bellinger uint32_t residual; 4602d70c103SNicholas Bellinger uint16_t ox_id; 4612d70c103SNicholas Bellinger uint16_t scsi_status; 4622d70c103SNicholas Bellinger uint16_t response_len; 4632d70c103SNicholas Bellinger uint16_t reserved; 4642d70c103SNicholas Bellinger uint8_t sense_data[24]; 4652d70c103SNicholas Bellinger } status1; 4662d70c103SNicholas Bellinger } u; 4672d70c103SNicholas Bellinger } __packed; 4682d70c103SNicholas Bellinger 4692d70c103SNicholas Bellinger /* 4702d70c103SNicholas Bellinger * ISP queue - CTIO type 7 from ISP 24xx to target driver 4712d70c103SNicholas Bellinger * returned entry structure. 4722d70c103SNicholas Bellinger */ 4732d70c103SNicholas Bellinger struct ctio7_from_24xx { 4742d70c103SNicholas Bellinger uint8_t entry_type; /* Entry type. */ 4752d70c103SNicholas Bellinger uint8_t entry_count; /* Entry count. */ 4762d70c103SNicholas Bellinger uint8_t sys_define; /* System defined. */ 4772d70c103SNicholas Bellinger uint8_t entry_status; /* Entry Status. */ 4782d70c103SNicholas Bellinger uint32_t handle; /* System defined handle */ 4792d70c103SNicholas Bellinger uint16_t status; 4802d70c103SNicholas Bellinger uint16_t timeout; 4812d70c103SNicholas Bellinger uint16_t dseg_count; /* Data segment count. */ 4822d70c103SNicholas Bellinger uint8_t vp_index; 4832d70c103SNicholas Bellinger uint8_t reserved1[5]; 4842d70c103SNicholas Bellinger uint32_t exchange_address; 4852d70c103SNicholas Bellinger uint16_t reserved2; 4862d70c103SNicholas Bellinger uint16_t flags; 4872d70c103SNicholas Bellinger uint32_t residual; 4882d70c103SNicholas Bellinger uint16_t ox_id; 4892d70c103SNicholas Bellinger uint16_t reserved3; 4902d70c103SNicholas Bellinger uint32_t relative_offset; 4912d70c103SNicholas Bellinger uint8_t reserved4[24]; 4922d70c103SNicholas Bellinger } __packed; 4932d70c103SNicholas Bellinger 4942d70c103SNicholas Bellinger /* CTIO7 flags values */ 4952d70c103SNicholas Bellinger #define CTIO7_FLAGS_SEND_STATUS BIT_15 4962d70c103SNicholas Bellinger #define CTIO7_FLAGS_TERMINATE BIT_14 4972d70c103SNicholas Bellinger #define CTIO7_FLAGS_CONFORM_REQ BIT_13 4982d70c103SNicholas Bellinger #define CTIO7_FLAGS_DONT_RET_CTIO BIT_8 4992d70c103SNicholas Bellinger #define CTIO7_FLAGS_STATUS_MODE_0 0 5002d70c103SNicholas Bellinger #define CTIO7_FLAGS_STATUS_MODE_1 BIT_6 5012d70c103SNicholas Bellinger #define CTIO7_FLAGS_EXPLICIT_CONFORM BIT_5 5022d70c103SNicholas Bellinger #define CTIO7_FLAGS_CONFIRM_SATISF BIT_4 5032d70c103SNicholas Bellinger #define CTIO7_FLAGS_DSD_PTR BIT_2 5042d70c103SNicholas Bellinger #define CTIO7_FLAGS_DATA_IN BIT_1 5052d70c103SNicholas Bellinger #define CTIO7_FLAGS_DATA_OUT BIT_0 5062d70c103SNicholas Bellinger 5072d70c103SNicholas Bellinger #define ELS_PLOGI 0x3 5082d70c103SNicholas Bellinger #define ELS_FLOGI 0x4 5092d70c103SNicholas Bellinger #define ELS_LOGO 0x5 5102d70c103SNicholas Bellinger #define ELS_PRLI 0x20 5112d70c103SNicholas Bellinger #define ELS_PRLO 0x21 5122d70c103SNicholas Bellinger #define ELS_TPRLO 0x24 5132d70c103SNicholas Bellinger #define ELS_PDISC 0x50 5142d70c103SNicholas Bellinger #define ELS_ADISC 0x52 5152d70c103SNicholas Bellinger 5162d70c103SNicholas Bellinger /* 5172d70c103SNicholas Bellinger * ISP queue - ABTS received/response entries structure definition for 24xx. 5182d70c103SNicholas Bellinger */ 5192d70c103SNicholas Bellinger #define ABTS_RECV_24XX 0x54 /* ABTS received (for 24xx) */ 5202d70c103SNicholas Bellinger #define ABTS_RESP_24XX 0x55 /* ABTS responce (for 24xx) */ 5212d70c103SNicholas Bellinger 5222d70c103SNicholas Bellinger /* 5232d70c103SNicholas Bellinger * ISP queue - ABTS received IOCB entry structure definition for 24xx. 5242d70c103SNicholas Bellinger * The ABTS BLS received from the wire is sent to the 5252d70c103SNicholas Bellinger * target driver by the ISP 24xx. 5262d70c103SNicholas Bellinger * The IOCB is placed on the response queue. 5272d70c103SNicholas Bellinger */ 5282d70c103SNicholas Bellinger struct abts_recv_from_24xx { 5292d70c103SNicholas Bellinger uint8_t entry_type; /* Entry type. */ 5302d70c103SNicholas Bellinger uint8_t entry_count; /* Entry count. */ 5312d70c103SNicholas Bellinger uint8_t sys_define; /* System defined. */ 5322d70c103SNicholas Bellinger uint8_t entry_status; /* Entry Status. */ 5332d70c103SNicholas Bellinger uint8_t reserved_1[6]; 5342d70c103SNicholas Bellinger uint16_t nport_handle; 5352d70c103SNicholas Bellinger uint8_t reserved_2[2]; 5362d70c103SNicholas Bellinger uint8_t vp_index; 5372d70c103SNicholas Bellinger uint8_t reserved_3:4; 5382d70c103SNicholas Bellinger uint8_t sof_type:4; 5392d70c103SNicholas Bellinger uint32_t exchange_address; 5402d70c103SNicholas Bellinger struct fcp_hdr_le fcp_hdr_le; 5412d70c103SNicholas Bellinger uint8_t reserved_4[16]; 5422d70c103SNicholas Bellinger uint32_t exchange_addr_to_abort; 5432d70c103SNicholas Bellinger } __packed; 5442d70c103SNicholas Bellinger 5452d70c103SNicholas Bellinger #define ABTS_PARAM_ABORT_SEQ BIT_0 5462d70c103SNicholas Bellinger 5472d70c103SNicholas Bellinger struct ba_acc_le { 5482d70c103SNicholas Bellinger uint16_t reserved; 5492d70c103SNicholas Bellinger uint8_t seq_id_last; 5502d70c103SNicholas Bellinger uint8_t seq_id_valid; 5512d70c103SNicholas Bellinger #define SEQ_ID_VALID 0x80 5522d70c103SNicholas Bellinger #define SEQ_ID_INVALID 0x00 5532d70c103SNicholas Bellinger uint16_t rx_id; 5542d70c103SNicholas Bellinger uint16_t ox_id; 5552d70c103SNicholas Bellinger uint16_t high_seq_cnt; 5562d70c103SNicholas Bellinger uint16_t low_seq_cnt; 5572d70c103SNicholas Bellinger } __packed; 5582d70c103SNicholas Bellinger 5592d70c103SNicholas Bellinger struct ba_rjt_le { 5602d70c103SNicholas Bellinger uint8_t vendor_uniq; 5612d70c103SNicholas Bellinger uint8_t reason_expl; 5622d70c103SNicholas Bellinger uint8_t reason_code; 5632d70c103SNicholas Bellinger #define BA_RJT_REASON_CODE_INVALID_COMMAND 0x1 5642d70c103SNicholas Bellinger #define BA_RJT_REASON_CODE_UNABLE_TO_PERFORM 0x9 5652d70c103SNicholas Bellinger uint8_t reserved; 5662d70c103SNicholas Bellinger } __packed; 5672d70c103SNicholas Bellinger 5682d70c103SNicholas Bellinger /* 5692d70c103SNicholas Bellinger * ISP queue - ABTS Response IOCB entry structure definition for 24xx. 5702d70c103SNicholas Bellinger * The ABTS response to the ABTS received is sent by the 5712d70c103SNicholas Bellinger * target driver to the ISP 24xx. 5722d70c103SNicholas Bellinger * The IOCB is placed on the request queue. 5732d70c103SNicholas Bellinger */ 5742d70c103SNicholas Bellinger struct abts_resp_to_24xx { 5752d70c103SNicholas Bellinger uint8_t entry_type; /* Entry type. */ 5762d70c103SNicholas Bellinger uint8_t entry_count; /* Entry count. */ 5772d70c103SNicholas Bellinger uint8_t sys_define; /* System defined. */ 5782d70c103SNicholas Bellinger uint8_t entry_status; /* Entry Status. */ 5792d70c103SNicholas Bellinger uint32_t handle; 5802d70c103SNicholas Bellinger uint16_t reserved_1; 5812d70c103SNicholas Bellinger uint16_t nport_handle; 5822d70c103SNicholas Bellinger uint16_t control_flags; 5832d70c103SNicholas Bellinger #define ABTS_CONTR_FLG_TERM_EXCHG BIT_0 5842d70c103SNicholas Bellinger uint8_t vp_index; 5852d70c103SNicholas Bellinger uint8_t reserved_3:4; 5862d70c103SNicholas Bellinger uint8_t sof_type:4; 5872d70c103SNicholas Bellinger uint32_t exchange_address; 5882d70c103SNicholas Bellinger struct fcp_hdr_le fcp_hdr_le; 5892d70c103SNicholas Bellinger union { 5902d70c103SNicholas Bellinger struct ba_acc_le ba_acct; 5912d70c103SNicholas Bellinger struct ba_rjt_le ba_rjt; 5922d70c103SNicholas Bellinger } __packed payload; 5932d70c103SNicholas Bellinger uint32_t reserved_4; 5942d70c103SNicholas Bellinger uint32_t exchange_addr_to_abort; 5952d70c103SNicholas Bellinger } __packed; 5962d70c103SNicholas Bellinger 5972d70c103SNicholas Bellinger /* 5982d70c103SNicholas Bellinger * ISP queue - ABTS Response IOCB from ISP24xx Firmware entry structure. 5992d70c103SNicholas Bellinger * The ABTS response with completion status to the ABTS response 6002d70c103SNicholas Bellinger * (sent by the target driver to the ISP 24xx) is sent by the 6012d70c103SNicholas Bellinger * ISP24xx firmware to the target driver. 6022d70c103SNicholas Bellinger * The IOCB is placed on the response queue. 6032d70c103SNicholas Bellinger */ 6042d70c103SNicholas Bellinger struct abts_resp_from_24xx_fw { 6052d70c103SNicholas Bellinger uint8_t entry_type; /* Entry type. */ 6062d70c103SNicholas Bellinger uint8_t entry_count; /* Entry count. */ 6072d70c103SNicholas Bellinger uint8_t sys_define; /* System defined. */ 6082d70c103SNicholas Bellinger uint8_t entry_status; /* Entry Status. */ 6092d70c103SNicholas Bellinger uint32_t handle; 6102d70c103SNicholas Bellinger uint16_t compl_status; 6112d70c103SNicholas Bellinger #define ABTS_RESP_COMPL_SUCCESS 0 6122d70c103SNicholas Bellinger #define ABTS_RESP_COMPL_SUBCODE_ERROR 0x31 6132d70c103SNicholas Bellinger uint16_t nport_handle; 6142d70c103SNicholas Bellinger uint16_t reserved_1; 6152d70c103SNicholas Bellinger uint8_t reserved_2; 6162d70c103SNicholas Bellinger uint8_t reserved_3:4; 6172d70c103SNicholas Bellinger uint8_t sof_type:4; 6182d70c103SNicholas Bellinger uint32_t exchange_address; 6192d70c103SNicholas Bellinger struct fcp_hdr_le fcp_hdr_le; 6202d70c103SNicholas Bellinger uint8_t reserved_4[8]; 6212d70c103SNicholas Bellinger uint32_t error_subcode1; 6222d70c103SNicholas Bellinger #define ABTS_RESP_SUBCODE_ERR_ABORTED_EXCH_NOT_TERM 0x1E 6232d70c103SNicholas Bellinger uint32_t error_subcode2; 6242d70c103SNicholas Bellinger uint32_t exchange_addr_to_abort; 6252d70c103SNicholas Bellinger } __packed; 6262d70c103SNicholas Bellinger 6272d70c103SNicholas Bellinger /********************************************************************\ 6282d70c103SNicholas Bellinger * Type Definitions used by initiator & target halves 6292d70c103SNicholas Bellinger \********************************************************************/ 6302d70c103SNicholas Bellinger 6312d70c103SNicholas Bellinger struct qla_tgt_mgmt_cmd; 6322d70c103SNicholas Bellinger struct qla_tgt_sess; 6332d70c103SNicholas Bellinger 6342d70c103SNicholas Bellinger /* 6352d70c103SNicholas Bellinger * This structure provides a template of function calls that the 6362d70c103SNicholas Bellinger * target driver (from within qla_target.c) can issue to the 6372d70c103SNicholas Bellinger * target module (tcm_qla2xxx). 6382d70c103SNicholas Bellinger */ 6392d70c103SNicholas Bellinger struct qla_tgt_func_tmpl { 6402d70c103SNicholas Bellinger 6412d70c103SNicholas Bellinger int (*handle_cmd)(struct scsi_qla_host *, struct qla_tgt_cmd *, 6422d70c103SNicholas Bellinger unsigned char *, uint32_t, int, int, int); 64343381ce8SChristoph Hellwig void (*handle_data)(struct qla_tgt_cmd *); 6442d70c103SNicholas Bellinger int (*handle_tmr)(struct qla_tgt_mgmt_cmd *, uint32_t, uint8_t, 6452d70c103SNicholas Bellinger uint32_t); 6462d70c103SNicholas Bellinger void (*free_cmd)(struct qla_tgt_cmd *); 6472d70c103SNicholas Bellinger void (*free_mcmd)(struct qla_tgt_mgmt_cmd *); 6482d70c103SNicholas Bellinger void (*free_session)(struct qla_tgt_sess *); 6492d70c103SNicholas Bellinger 6502d70c103SNicholas Bellinger int (*check_initiator_node_acl)(struct scsi_qla_host *, unsigned char *, 6512d70c103SNicholas Bellinger void *, uint8_t *, uint16_t); 652c8292d1dSRoland Dreier void (*update_sess)(struct qla_tgt_sess *, port_id_t, uint16_t, bool); 6532d70c103SNicholas Bellinger struct qla_tgt_sess *(*find_sess_by_loop_id)(struct scsi_qla_host *, 6542d70c103SNicholas Bellinger const uint16_t); 6552d70c103SNicholas Bellinger struct qla_tgt_sess *(*find_sess_by_s_id)(struct scsi_qla_host *, 6562d70c103SNicholas Bellinger const uint8_t *); 6572d70c103SNicholas Bellinger void (*clear_nacl_from_fcport_map)(struct qla_tgt_sess *); 6582d70c103SNicholas Bellinger void (*put_sess)(struct qla_tgt_sess *); 6592d70c103SNicholas Bellinger void (*shutdown_sess)(struct qla_tgt_sess *); 6602d70c103SNicholas Bellinger }; 6612d70c103SNicholas Bellinger 6622d70c103SNicholas Bellinger int qla2x00_wait_for_hba_online(struct scsi_qla_host *); 6632d70c103SNicholas Bellinger 6642d70c103SNicholas Bellinger #include <target/target_core_base.h> 6652d70c103SNicholas Bellinger 6662d70c103SNicholas Bellinger #define QLA_TGT_TIMEOUT 10 /* in seconds */ 6672d70c103SNicholas Bellinger 6682d70c103SNicholas Bellinger #define QLA_TGT_MAX_HW_PENDING_TIME 60 /* in seconds */ 6692d70c103SNicholas Bellinger 6702d70c103SNicholas Bellinger /* Immediate notify status constants */ 6712d70c103SNicholas Bellinger #define IMM_NTFY_LIP_RESET 0x000E 6722d70c103SNicholas Bellinger #define IMM_NTFY_LIP_LINK_REINIT 0x000F 6732d70c103SNicholas Bellinger #define IMM_NTFY_IOCB_OVERFLOW 0x0016 6742d70c103SNicholas Bellinger #define IMM_NTFY_ABORT_TASK 0x0020 6752d70c103SNicholas Bellinger #define IMM_NTFY_PORT_LOGOUT 0x0029 6762d70c103SNicholas Bellinger #define IMM_NTFY_PORT_CONFIG 0x002A 6772d70c103SNicholas Bellinger #define IMM_NTFY_GLBL_TPRLO 0x002D 6782d70c103SNicholas Bellinger #define IMM_NTFY_GLBL_LOGO 0x002E 6792d70c103SNicholas Bellinger #define IMM_NTFY_RESOURCE 0x0034 6802d70c103SNicholas Bellinger #define IMM_NTFY_MSG_RX 0x0036 6812d70c103SNicholas Bellinger #define IMM_NTFY_SRR 0x0045 6822d70c103SNicholas Bellinger #define IMM_NTFY_ELS 0x0046 6832d70c103SNicholas Bellinger 6842d70c103SNicholas Bellinger /* Immediate notify task flags */ 6852d70c103SNicholas Bellinger #define IMM_NTFY_TASK_MGMT_SHIFT 8 6862d70c103SNicholas Bellinger 6872d70c103SNicholas Bellinger #define QLA_TGT_CLEAR_ACA 0x40 6882d70c103SNicholas Bellinger #define QLA_TGT_TARGET_RESET 0x20 6892d70c103SNicholas Bellinger #define QLA_TGT_LUN_RESET 0x10 6902d70c103SNicholas Bellinger #define QLA_TGT_CLEAR_TS 0x04 6912d70c103SNicholas Bellinger #define QLA_TGT_ABORT_TS 0x02 6922d70c103SNicholas Bellinger #define QLA_TGT_ABORT_ALL_SESS 0xFFFF 6932d70c103SNicholas Bellinger #define QLA_TGT_ABORT_ALL 0xFFFE 6942d70c103SNicholas Bellinger #define QLA_TGT_NEXUS_LOSS_SESS 0xFFFD 6952d70c103SNicholas Bellinger #define QLA_TGT_NEXUS_LOSS 0xFFFC 6962d70c103SNicholas Bellinger 6972d70c103SNicholas Bellinger /* Notify Acknowledge flags */ 6982d70c103SNicholas Bellinger #define NOTIFY_ACK_RES_COUNT BIT_8 6992d70c103SNicholas Bellinger #define NOTIFY_ACK_CLEAR_LIP_RESET BIT_5 7002d70c103SNicholas Bellinger #define NOTIFY_ACK_TM_RESP_CODE_VALID BIT_4 7012d70c103SNicholas Bellinger 7022d70c103SNicholas Bellinger /* Command's states */ 7032d70c103SNicholas Bellinger #define QLA_TGT_STATE_NEW 0 /* New command + target processing */ 7042d70c103SNicholas Bellinger #define QLA_TGT_STATE_NEED_DATA 1 /* target needs data to continue */ 7052d70c103SNicholas Bellinger #define QLA_TGT_STATE_DATA_IN 2 /* Data arrived + target processing */ 7062d70c103SNicholas Bellinger #define QLA_TGT_STATE_PROCESSED 3 /* target done processing */ 7072d70c103SNicholas Bellinger #define QLA_TGT_STATE_ABORTED 4 /* Command aborted */ 7082d70c103SNicholas Bellinger 7092d70c103SNicholas Bellinger /* Special handles */ 7102d70c103SNicholas Bellinger #define QLA_TGT_NULL_HANDLE 0 7112d70c103SNicholas Bellinger #define QLA_TGT_SKIP_HANDLE (0xFFFFFFFF & ~CTIO_COMPLETION_HANDLE_MARK) 7122d70c103SNicholas Bellinger 7132d70c103SNicholas Bellinger /* ATIO task_codes field */ 7142d70c103SNicholas Bellinger #define ATIO_SIMPLE_QUEUE 0 7152d70c103SNicholas Bellinger #define ATIO_HEAD_OF_QUEUE 1 7162d70c103SNicholas Bellinger #define ATIO_ORDERED_QUEUE 2 7172d70c103SNicholas Bellinger #define ATIO_ACA_QUEUE 4 7182d70c103SNicholas Bellinger #define ATIO_UNTAGGED 5 7192d70c103SNicholas Bellinger 7202d70c103SNicholas Bellinger /* TM failed response codes, see FCP (9.4.11 FCP_RSP_INFO) */ 7212d70c103SNicholas Bellinger #define FC_TM_SUCCESS 0 7222d70c103SNicholas Bellinger #define FC_TM_BAD_FCP_DATA 1 7232d70c103SNicholas Bellinger #define FC_TM_BAD_CMD 2 7242d70c103SNicholas Bellinger #define FC_TM_FCP_DATA_MISMATCH 3 7252d70c103SNicholas Bellinger #define FC_TM_REJECT 4 7262d70c103SNicholas Bellinger #define FC_TM_FAILED 5 7272d70c103SNicholas Bellinger 7282d70c103SNicholas Bellinger /* 7292d70c103SNicholas Bellinger * Error code of qlt_pre_xmit_response() meaning that cmd's exchange was 7302d70c103SNicholas Bellinger * terminated, so no more actions is needed and success should be returned 7312d70c103SNicholas Bellinger * to target. 7322d70c103SNicholas Bellinger */ 7332d70c103SNicholas Bellinger #define QLA_TGT_PRE_XMIT_RESP_CMD_ABORTED 0x1717 7342d70c103SNicholas Bellinger 7352d70c103SNicholas Bellinger #if (BITS_PER_LONG > 32) || defined(CONFIG_HIGHMEM64G) 7362d70c103SNicholas Bellinger #define pci_dma_lo32(a) (a & 0xffffffff) 7372d70c103SNicholas Bellinger #define pci_dma_hi32(a) ((((a) >> 16)>>16) & 0xffffffff) 7382d70c103SNicholas Bellinger #else 7392d70c103SNicholas Bellinger #define pci_dma_lo32(a) (a & 0xffffffff) 7402d70c103SNicholas Bellinger #define pci_dma_hi32(a) 0 7412d70c103SNicholas Bellinger #endif 7422d70c103SNicholas Bellinger 7432d70c103SNicholas Bellinger #define QLA_TGT_SENSE_VALID(sense) ((sense != NULL) && \ 7442d70c103SNicholas Bellinger (((const uint8_t *)(sense))[0] & 0x70) == 0x70) 7452d70c103SNicholas Bellinger 7462d70c103SNicholas Bellinger struct qla_port_24xx_data { 7472d70c103SNicholas Bellinger uint8_t port_name[WWN_SIZE]; 7482d70c103SNicholas Bellinger uint16_t loop_id; 7492d70c103SNicholas Bellinger uint16_t reserved; 7502d70c103SNicholas Bellinger }; 7512d70c103SNicholas Bellinger 7522d70c103SNicholas Bellinger struct qla_tgt { 7532d70c103SNicholas Bellinger struct scsi_qla_host *vha; 7542d70c103SNicholas Bellinger struct qla_hw_data *ha; 7552d70c103SNicholas Bellinger 7562d70c103SNicholas Bellinger /* 7572d70c103SNicholas Bellinger * To sync between IRQ handlers and qlt_target_release(). Needed, 7582d70c103SNicholas Bellinger * because req_pkt() can drop/reaquire HW lock inside. Protected by 7592d70c103SNicholas Bellinger * HW lock. 7602d70c103SNicholas Bellinger */ 7612d70c103SNicholas Bellinger int irq_cmd_count; 7622d70c103SNicholas Bellinger 7632d70c103SNicholas Bellinger int datasegs_per_cmd, datasegs_per_cont, sg_tablesize; 7642d70c103SNicholas Bellinger 7652d70c103SNicholas Bellinger /* Target's flags, serialized by pha->hardware_lock */ 7662d70c103SNicholas Bellinger unsigned int tgt_enable_64bit_addr:1; /* 64-bits PCI addr enabled */ 7672d70c103SNicholas Bellinger unsigned int link_reinit_iocb_pending:1; 7682d70c103SNicholas Bellinger 7692d70c103SNicholas Bellinger /* 7702d70c103SNicholas Bellinger * Protected by tgt_mutex AND hardware_lock for writing and tgt_mutex 7712d70c103SNicholas Bellinger * OR hardware_lock for reading. 7722d70c103SNicholas Bellinger */ 7732d70c103SNicholas Bellinger int tgt_stop; /* the target mode driver is being stopped */ 7742d70c103SNicholas Bellinger int tgt_stopped; /* the target mode driver has been stopped */ 7752d70c103SNicholas Bellinger 7762d70c103SNicholas Bellinger /* Count of sessions refering qla_tgt. Protected by hardware_lock. */ 7772d70c103SNicholas Bellinger int sess_count; 7782d70c103SNicholas Bellinger 7792d70c103SNicholas Bellinger /* Protected by hardware_lock. Addition also protected by tgt_mutex. */ 7802d70c103SNicholas Bellinger struct list_head sess_list; 7812d70c103SNicholas Bellinger 7822d70c103SNicholas Bellinger /* Protected by hardware_lock */ 7832d70c103SNicholas Bellinger struct list_head del_sess_list; 7842d70c103SNicholas Bellinger struct delayed_work sess_del_work; 7852d70c103SNicholas Bellinger 7862d70c103SNicholas Bellinger spinlock_t sess_work_lock; 7872d70c103SNicholas Bellinger struct list_head sess_works_list; 7882d70c103SNicholas Bellinger struct work_struct sess_work; 7892d70c103SNicholas Bellinger 7902d70c103SNicholas Bellinger struct imm_ntfy_from_isp link_reinit_iocb; 7912d70c103SNicholas Bellinger wait_queue_head_t waitQ; 7922d70c103SNicholas Bellinger int notify_ack_expected; 7932d70c103SNicholas Bellinger int abts_resp_expected; 7942d70c103SNicholas Bellinger int modify_lun_expected; 7952d70c103SNicholas Bellinger 7962d70c103SNicholas Bellinger int ctio_srr_id; 7972d70c103SNicholas Bellinger int imm_srr_id; 7982d70c103SNicholas Bellinger spinlock_t srr_lock; 7992d70c103SNicholas Bellinger struct list_head srr_ctio_list; 8002d70c103SNicholas Bellinger struct list_head srr_imm_list; 8012d70c103SNicholas Bellinger struct work_struct srr_work; 8022d70c103SNicholas Bellinger 8032d70c103SNicholas Bellinger atomic_t tgt_global_resets_count; 8042d70c103SNicholas Bellinger 8052d70c103SNicholas Bellinger struct list_head tgt_list_entry; 8062d70c103SNicholas Bellinger }; 8072d70c103SNicholas Bellinger 808*51a07f84SNicholas Bellinger struct qla_tgt_sess_op { 809*51a07f84SNicholas Bellinger struct scsi_qla_host *vha; 810*51a07f84SNicholas Bellinger struct atio_from_isp atio; 811*51a07f84SNicholas Bellinger struct work_struct work; 812*51a07f84SNicholas Bellinger }; 813*51a07f84SNicholas Bellinger 8142d70c103SNicholas Bellinger /* 8152d70c103SNicholas Bellinger * Equivilant to IT Nexus (Initiator-Target) 8162d70c103SNicholas Bellinger */ 8172d70c103SNicholas Bellinger struct qla_tgt_sess { 8182d70c103SNicholas Bellinger uint16_t loop_id; 8192d70c103SNicholas Bellinger port_id_t s_id; 8202d70c103SNicholas Bellinger 8212d70c103SNicholas Bellinger unsigned int conf_compl_supported:1; 8222d70c103SNicholas Bellinger unsigned int deleted:1; 8232d70c103SNicholas Bellinger unsigned int local:1; 8242d70c103SNicholas Bellinger 8252d70c103SNicholas Bellinger struct se_session *se_sess; 8262d70c103SNicholas Bellinger struct scsi_qla_host *vha; 8272d70c103SNicholas Bellinger struct qla_tgt *tgt; 8282d70c103SNicholas Bellinger 8292d70c103SNicholas Bellinger struct list_head sess_list_entry; 8302d70c103SNicholas Bellinger unsigned long expires; 8312d70c103SNicholas Bellinger struct list_head del_list_entry; 8322d70c103SNicholas Bellinger 8332d70c103SNicholas Bellinger uint8_t port_name[WWN_SIZE]; 8342d70c103SNicholas Bellinger struct work_struct free_work; 8352d70c103SNicholas Bellinger }; 8362d70c103SNicholas Bellinger 8372d70c103SNicholas Bellinger struct qla_tgt_cmd { 8382d70c103SNicholas Bellinger struct qla_tgt_sess *sess; 8392d70c103SNicholas Bellinger int state; 8402d70c103SNicholas Bellinger struct se_cmd se_cmd; 8412d70c103SNicholas Bellinger struct work_struct free_work; 8422d70c103SNicholas Bellinger struct work_struct work; 8432d70c103SNicholas Bellinger /* Sense buffer that will be mapped into outgoing status */ 8442d70c103SNicholas Bellinger unsigned char sense_buffer[TRANSPORT_SENSE_BUFFER]; 8452d70c103SNicholas Bellinger 8462d70c103SNicholas Bellinger /* to save extra sess dereferences */ 8472d70c103SNicholas Bellinger unsigned int conf_compl_supported:1; 8482d70c103SNicholas Bellinger unsigned int sg_mapped:1; 8492d70c103SNicholas Bellinger unsigned int free_sg:1; 8502d70c103SNicholas Bellinger unsigned int aborted:1; /* Needed in case of SRR */ 8512d70c103SNicholas Bellinger unsigned int write_data_transferred:1; 8522d70c103SNicholas Bellinger 8532d70c103SNicholas Bellinger struct scatterlist *sg; /* cmd data buffer SG vector */ 8542d70c103SNicholas Bellinger int sg_cnt; /* SG segments count */ 8552d70c103SNicholas Bellinger int bufflen; /* cmd buffer length */ 8562d70c103SNicholas Bellinger int offset; 8572d70c103SNicholas Bellinger uint32_t tag; 8582d70c103SNicholas Bellinger uint32_t unpacked_lun; 8592d70c103SNicholas Bellinger enum dma_data_direction dma_data_direction; 8602d70c103SNicholas Bellinger 8612d70c103SNicholas Bellinger uint16_t loop_id; /* to save extra sess dereferences */ 8622d70c103SNicholas Bellinger struct qla_tgt *tgt; /* to save extra sess dereferences */ 8632d70c103SNicholas Bellinger struct scsi_qla_host *vha; 8642d70c103SNicholas Bellinger 8652d70c103SNicholas Bellinger struct atio_from_isp atio; 8662d70c103SNicholas Bellinger }; 8672d70c103SNicholas Bellinger 8682d70c103SNicholas Bellinger struct qla_tgt_sess_work_param { 8692d70c103SNicholas Bellinger struct list_head sess_works_list_entry; 8702d70c103SNicholas Bellinger 8712d70c103SNicholas Bellinger #define QLA_TGT_SESS_WORK_ABORT 1 8722d70c103SNicholas Bellinger #define QLA_TGT_SESS_WORK_TM 2 8732d70c103SNicholas Bellinger int type; 8742d70c103SNicholas Bellinger 8752d70c103SNicholas Bellinger union { 8762d70c103SNicholas Bellinger struct abts_recv_from_24xx abts; 8772d70c103SNicholas Bellinger struct imm_ntfy_from_isp tm_iocb; 8782d70c103SNicholas Bellinger struct atio_from_isp tm_iocb2; 8792d70c103SNicholas Bellinger }; 8802d70c103SNicholas Bellinger }; 8812d70c103SNicholas Bellinger 8822d70c103SNicholas Bellinger struct qla_tgt_mgmt_cmd { 8832d70c103SNicholas Bellinger uint8_t tmr_func; 8842d70c103SNicholas Bellinger uint8_t fc_tm_rsp; 8852d70c103SNicholas Bellinger struct qla_tgt_sess *sess; 8862d70c103SNicholas Bellinger struct se_cmd se_cmd; 8872d70c103SNicholas Bellinger struct work_struct free_work; 8882d70c103SNicholas Bellinger unsigned int flags; 8892d70c103SNicholas Bellinger #define QLA24XX_MGMT_SEND_NACK 1 8902d70c103SNicholas Bellinger union { 8912d70c103SNicholas Bellinger struct atio_from_isp atio; 8922d70c103SNicholas Bellinger struct imm_ntfy_from_isp imm_ntfy; 8932d70c103SNicholas Bellinger struct abts_recv_from_24xx abts; 8942d70c103SNicholas Bellinger } __packed orig_iocb; 8952d70c103SNicholas Bellinger }; 8962d70c103SNicholas Bellinger 8972d70c103SNicholas Bellinger struct qla_tgt_prm { 8982d70c103SNicholas Bellinger struct qla_tgt_cmd *cmd; 8992d70c103SNicholas Bellinger struct qla_tgt *tgt; 9002d70c103SNicholas Bellinger void *pkt; 9012d70c103SNicholas Bellinger struct scatterlist *sg; /* cmd data buffer SG vector */ 9022d70c103SNicholas Bellinger int seg_cnt; 9032d70c103SNicholas Bellinger int req_cnt; 9042d70c103SNicholas Bellinger uint16_t rq_result; 9052d70c103SNicholas Bellinger uint16_t scsi_status; 9062d70c103SNicholas Bellinger unsigned char *sense_buffer; 9072d70c103SNicholas Bellinger int sense_buffer_len; 9082d70c103SNicholas Bellinger int residual; 9092d70c103SNicholas Bellinger int add_status_pkt; 9102d70c103SNicholas Bellinger }; 9112d70c103SNicholas Bellinger 9122d70c103SNicholas Bellinger struct qla_tgt_srr_imm { 9132d70c103SNicholas Bellinger struct list_head srr_list_entry; 9142d70c103SNicholas Bellinger int srr_id; 9152d70c103SNicholas Bellinger struct imm_ntfy_from_isp imm_ntfy; 9162d70c103SNicholas Bellinger }; 9172d70c103SNicholas Bellinger 9182d70c103SNicholas Bellinger struct qla_tgt_srr_ctio { 9192d70c103SNicholas Bellinger struct list_head srr_list_entry; 9202d70c103SNicholas Bellinger int srr_id; 9212d70c103SNicholas Bellinger struct qla_tgt_cmd *cmd; 9222d70c103SNicholas Bellinger }; 9232d70c103SNicholas Bellinger 9242d70c103SNicholas Bellinger #define QLA_TGT_XMIT_DATA 1 9252d70c103SNicholas Bellinger #define QLA_TGT_XMIT_STATUS 2 9262d70c103SNicholas Bellinger #define QLA_TGT_XMIT_ALL (QLA_TGT_XMIT_STATUS|QLA_TGT_XMIT_DATA) 9272d70c103SNicholas Bellinger 9282d70c103SNicholas Bellinger 9292d70c103SNicholas Bellinger extern struct qla_tgt_data qla_target; 9302d70c103SNicholas Bellinger /* 9312d70c103SNicholas Bellinger * Internal function prototypes 9322d70c103SNicholas Bellinger */ 9332d70c103SNicholas Bellinger void qlt_disable_vha(struct scsi_qla_host *); 9342d70c103SNicholas Bellinger 9352d70c103SNicholas Bellinger /* 9362d70c103SNicholas Bellinger * Function prototypes for qla_target.c logic used by qla2xxx LLD code. 9372d70c103SNicholas Bellinger */ 9382d70c103SNicholas Bellinger extern int qlt_add_target(struct qla_hw_data *, struct scsi_qla_host *); 9392d70c103SNicholas Bellinger extern int qlt_remove_target(struct qla_hw_data *, struct scsi_qla_host *); 94049a47f2cSNicholas Bellinger extern int qlt_lport_register(void *, u64, u64, u64, 94149a47f2cSNicholas Bellinger int (*callback)(struct scsi_qla_host *, void *, u64, u64)); 9422d70c103SNicholas Bellinger extern void qlt_lport_deregister(struct scsi_qla_host *); 9432d70c103SNicholas Bellinger extern void qlt_unreg_sess(struct qla_tgt_sess *); 9442d70c103SNicholas Bellinger extern void qlt_fc_port_added(struct scsi_qla_host *, fc_port_t *); 9452d70c103SNicholas Bellinger extern void qlt_fc_port_deleted(struct scsi_qla_host *, fc_port_t *); 9462d70c103SNicholas Bellinger extern void qlt_set_mode(struct scsi_qla_host *ha); 9472d70c103SNicholas Bellinger extern void qlt_clear_mode(struct scsi_qla_host *ha); 9482d70c103SNicholas Bellinger extern int __init qlt_init(void); 9492d70c103SNicholas Bellinger extern void qlt_exit(void); 9502d70c103SNicholas Bellinger extern void qlt_update_vp_map(struct scsi_qla_host *, int); 9512d70c103SNicholas Bellinger 9522d70c103SNicholas Bellinger /* 9532d70c103SNicholas Bellinger * This macro is used during early initializations when host->active_mode 9542d70c103SNicholas Bellinger * is not set. Right now, ha value is ignored. 9552d70c103SNicholas Bellinger */ 9562d70c103SNicholas Bellinger #define QLA_TGT_MODE_ENABLED() (ql2x_ini_mode != QLA2XXX_INI_MODE_ENABLED) 957aa230bc5SArun Easi extern int ql2x_ini_mode; 9582d70c103SNicholas Bellinger 9592d70c103SNicholas Bellinger static inline bool qla_tgt_mode_enabled(struct scsi_qla_host *ha) 9602d70c103SNicholas Bellinger { 9612d70c103SNicholas Bellinger return ha->host->active_mode & MODE_TARGET; 9622d70c103SNicholas Bellinger } 9632d70c103SNicholas Bellinger 9642d70c103SNicholas Bellinger static inline bool qla_ini_mode_enabled(struct scsi_qla_host *ha) 9652d70c103SNicholas Bellinger { 9662d70c103SNicholas Bellinger return ha->host->active_mode & MODE_INITIATOR; 9672d70c103SNicholas Bellinger } 9682d70c103SNicholas Bellinger 9692d70c103SNicholas Bellinger static inline void qla_reverse_ini_mode(struct scsi_qla_host *ha) 9702d70c103SNicholas Bellinger { 9712d70c103SNicholas Bellinger if (ha->host->active_mode & MODE_INITIATOR) 9722d70c103SNicholas Bellinger ha->host->active_mode &= ~MODE_INITIATOR; 9732d70c103SNicholas Bellinger else 9742d70c103SNicholas Bellinger ha->host->active_mode |= MODE_INITIATOR; 9752d70c103SNicholas Bellinger } 9762d70c103SNicholas Bellinger 9772d70c103SNicholas Bellinger /* 9782d70c103SNicholas Bellinger * Exported symbols from qla_target.c LLD logic used by qla2xxx code.. 9792d70c103SNicholas Bellinger */ 9802d70c103SNicholas Bellinger extern void qlt_24xx_atio_pkt_all_vps(struct scsi_qla_host *, 9812d70c103SNicholas Bellinger struct atio_from_isp *); 9822d70c103SNicholas Bellinger extern void qlt_response_pkt_all_vps(struct scsi_qla_host *, response_t *); 9832d70c103SNicholas Bellinger extern int qlt_rdy_to_xfer(struct qla_tgt_cmd *); 9842d70c103SNicholas Bellinger extern int qlt_xmit_response(struct qla_tgt_cmd *, int, uint8_t); 9852d70c103SNicholas Bellinger extern void qlt_xmit_tm_rsp(struct qla_tgt_mgmt_cmd *); 9862d70c103SNicholas Bellinger extern void qlt_free_mcmd(struct qla_tgt_mgmt_cmd *); 9872d70c103SNicholas Bellinger extern void qlt_free_cmd(struct qla_tgt_cmd *cmd); 9882d70c103SNicholas Bellinger extern void qlt_async_event(uint16_t, struct scsi_qla_host *, uint16_t *); 9892d70c103SNicholas Bellinger extern void qlt_enable_vha(struct scsi_qla_host *); 9902d70c103SNicholas Bellinger extern void qlt_vport_create(struct scsi_qla_host *, struct qla_hw_data *); 9912d70c103SNicholas Bellinger extern void qlt_rff_id(struct scsi_qla_host *, struct ct_sns_req *); 9922d70c103SNicholas Bellinger extern void qlt_init_atio_q_entries(struct scsi_qla_host *); 9932d70c103SNicholas Bellinger extern void qlt_24xx_process_atio_queue(struct scsi_qla_host *); 994aa230bc5SArun Easi extern void qlt_24xx_config_rings(struct scsi_qla_host *); 9952d70c103SNicholas Bellinger extern void qlt_24xx_config_nvram_stage1(struct scsi_qla_host *, 9962d70c103SNicholas Bellinger struct nvram_24xx *); 9972d70c103SNicholas Bellinger extern void qlt_24xx_config_nvram_stage2(struct scsi_qla_host *, 9982d70c103SNicholas Bellinger struct init_cb_24xx *); 999aa230bc5SArun Easi extern void qlt_81xx_config_nvram_stage2(struct scsi_qla_host *, 1000aa230bc5SArun Easi struct init_cb_81xx *); 1001aa230bc5SArun Easi extern void qlt_81xx_config_nvram_stage1(struct scsi_qla_host *, 1002aa230bc5SArun Easi struct nvram_81xx *); 10032d70c103SNicholas Bellinger extern int qlt_24xx_process_response_error(struct scsi_qla_host *, 10042d70c103SNicholas Bellinger struct sts_entry_24xx *); 10052d70c103SNicholas Bellinger extern void qlt_modify_vp_config(struct scsi_qla_host *, 10062d70c103SNicholas Bellinger struct vp_config_entry_24xx *); 10072d70c103SNicholas Bellinger extern void qlt_probe_one_stage1(struct scsi_qla_host *, struct qla_hw_data *); 10082d70c103SNicholas Bellinger extern int qlt_mem_alloc(struct qla_hw_data *); 10092d70c103SNicholas Bellinger extern void qlt_mem_free(struct qla_hw_data *); 10103c231bdaSNicholas Bellinger extern int qlt_stop_phase1(struct qla_tgt *); 10112d70c103SNicholas Bellinger extern void qlt_stop_phase2(struct qla_tgt *); 1012aa230bc5SArun Easi extern irqreturn_t qla83xx_msix_atio_q(int, void *); 1013aa230bc5SArun Easi extern void qlt_83xx_iospace_config(struct qla_hw_data *); 10142d70c103SNicholas Bellinger 10152d70c103SNicholas Bellinger #endif /* __QLA_TARGET_H */ 1016