18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright(c) 2007 Intel Corporation. All rights reserved. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Maintained at www.Open-FCoE.org 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#ifndef _LIBFC_H_ 98c2ecf20Sopenharmony_ci#define _LIBFC_H_ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <linux/timer.h> 128c2ecf20Sopenharmony_ci#include <linux/if.h> 138c2ecf20Sopenharmony_ci#include <linux/percpu.h> 148c2ecf20Sopenharmony_ci#include <linux/refcount.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#include <scsi/scsi_transport.h> 178c2ecf20Sopenharmony_ci#include <scsi/scsi_transport_fc.h> 188c2ecf20Sopenharmony_ci#include <scsi/scsi_bsg_fc.h> 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#include <scsi/fc/fc_fcp.h> 218c2ecf20Sopenharmony_ci#include <scsi/fc/fc_ns.h> 228c2ecf20Sopenharmony_ci#include <scsi/fc/fc_ms.h> 238c2ecf20Sopenharmony_ci#include <scsi/fc/fc_els.h> 248c2ecf20Sopenharmony_ci#include <scsi/fc/fc_gs.h> 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci#include <scsi/fc_frame.h> 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci#define FC_FC4_PROV_SIZE (FC_TYPE_FCP + 1) /* size of tables */ 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci/* 318c2ecf20Sopenharmony_ci * libfc error codes 328c2ecf20Sopenharmony_ci */ 338c2ecf20Sopenharmony_ci#define FC_NO_ERR 0 /* no error */ 348c2ecf20Sopenharmony_ci#define FC_EX_TIMEOUT 1 /* Exchange timeout */ 358c2ecf20Sopenharmony_ci#define FC_EX_CLOSED 2 /* Exchange closed */ 368c2ecf20Sopenharmony_ci#define FC_EX_ALLOC_ERR 3 /* Exchange allocation failed */ 378c2ecf20Sopenharmony_ci#define FC_EX_XMIT_ERR 4 /* Exchange transmit failed */ 388c2ecf20Sopenharmony_ci#define FC_EX_ELS_RJT 5 /* ELS rejected */ 398c2ecf20Sopenharmony_ci#define FC_EX_INV_LOGIN 6 /* Login not completed */ 408c2ecf20Sopenharmony_ci#define FC_EX_SEQ_ERR 6 /* Exchange sequence error */ 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci/** 438c2ecf20Sopenharmony_ci * enum fc_lport_state - Local port states 448c2ecf20Sopenharmony_ci * @LPORT_ST_DISABLED: Disabled 458c2ecf20Sopenharmony_ci * @LPORT_ST_FLOGI: Fabric login (FLOGI) sent 468c2ecf20Sopenharmony_ci * @LPORT_ST_DNS: Waiting for name server remote port to become ready 478c2ecf20Sopenharmony_ci * @LPORT_ST_RPN_ID: Register port name by ID (RPN_ID) sent 488c2ecf20Sopenharmony_ci * @LPORT_ST_RFT_ID: Register Fibre Channel types by ID (RFT_ID) sent 498c2ecf20Sopenharmony_ci * @LPORT_ST_RFF_ID: Register FC-4 Features by ID (RFF_ID) sent 508c2ecf20Sopenharmony_ci * @LPORT_ST_FDMI: Waiting for mgmt server rport to become ready 518c2ecf20Sopenharmony_ci * @LPORT_ST_RHBA: 528c2ecf20Sopenharmony_ci * @LPORT_ST_SCR: State Change Register (SCR) sent 538c2ecf20Sopenharmony_ci * @LPORT_ST_READY: Ready for use 548c2ecf20Sopenharmony_ci * @LPORT_ST_LOGO: Local port logout (LOGO) sent 558c2ecf20Sopenharmony_ci * @LPORT_ST_RESET: Local port reset 568c2ecf20Sopenharmony_ci */ 578c2ecf20Sopenharmony_cienum fc_lport_state { 588c2ecf20Sopenharmony_ci LPORT_ST_DISABLED = 0, 598c2ecf20Sopenharmony_ci LPORT_ST_FLOGI, 608c2ecf20Sopenharmony_ci LPORT_ST_DNS, 618c2ecf20Sopenharmony_ci LPORT_ST_RNN_ID, 628c2ecf20Sopenharmony_ci LPORT_ST_RSNN_NN, 638c2ecf20Sopenharmony_ci LPORT_ST_RSPN_ID, 648c2ecf20Sopenharmony_ci LPORT_ST_RFT_ID, 658c2ecf20Sopenharmony_ci LPORT_ST_RFF_ID, 668c2ecf20Sopenharmony_ci LPORT_ST_FDMI, 678c2ecf20Sopenharmony_ci LPORT_ST_RHBA, 688c2ecf20Sopenharmony_ci LPORT_ST_RPA, 698c2ecf20Sopenharmony_ci LPORT_ST_DHBA, 708c2ecf20Sopenharmony_ci LPORT_ST_DPRT, 718c2ecf20Sopenharmony_ci LPORT_ST_SCR, 728c2ecf20Sopenharmony_ci LPORT_ST_READY, 738c2ecf20Sopenharmony_ci LPORT_ST_LOGO, 748c2ecf20Sopenharmony_ci LPORT_ST_RESET 758c2ecf20Sopenharmony_ci}; 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_cienum fc_disc_event { 788c2ecf20Sopenharmony_ci DISC_EV_NONE = 0, 798c2ecf20Sopenharmony_ci DISC_EV_SUCCESS, 808c2ecf20Sopenharmony_ci DISC_EV_FAILED 818c2ecf20Sopenharmony_ci}; 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci/** 848c2ecf20Sopenharmony_ci * enum fc_rport_state - Remote port states 858c2ecf20Sopenharmony_ci * @RPORT_ST_INIT: Initialized 868c2ecf20Sopenharmony_ci * @RPORT_ST_FLOGI: Waiting for FLOGI completion for point-to-multipoint 878c2ecf20Sopenharmony_ci * @RPORT_ST_PLOGI_WAIT: Waiting for peer to login for point-to-multipoint 888c2ecf20Sopenharmony_ci * @RPORT_ST_PLOGI: Waiting for PLOGI completion 898c2ecf20Sopenharmony_ci * @RPORT_ST_PRLI: Waiting for PRLI completion 908c2ecf20Sopenharmony_ci * @RPORT_ST_RTV: Waiting for RTV completion 918c2ecf20Sopenharmony_ci * @RPORT_ST_READY: Ready for use 928c2ecf20Sopenharmony_ci * @RPORT_ST_ADISC: Discover Address sent 938c2ecf20Sopenharmony_ci * @RPORT_ST_DELETE: Remote port being deleted 948c2ecf20Sopenharmony_ci*/ 958c2ecf20Sopenharmony_cienum fc_rport_state { 968c2ecf20Sopenharmony_ci RPORT_ST_INIT, 978c2ecf20Sopenharmony_ci RPORT_ST_FLOGI, 988c2ecf20Sopenharmony_ci RPORT_ST_PLOGI_WAIT, 998c2ecf20Sopenharmony_ci RPORT_ST_PLOGI, 1008c2ecf20Sopenharmony_ci RPORT_ST_PRLI, 1018c2ecf20Sopenharmony_ci RPORT_ST_RTV, 1028c2ecf20Sopenharmony_ci RPORT_ST_READY, 1038c2ecf20Sopenharmony_ci RPORT_ST_ADISC, 1048c2ecf20Sopenharmony_ci RPORT_ST_DELETE, 1058c2ecf20Sopenharmony_ci}; 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci/** 1088c2ecf20Sopenharmony_ci * struct fc_disc_port - temporary discovery port to hold rport identifiers 1098c2ecf20Sopenharmony_ci * @lp: Fibre Channel host port instance 1108c2ecf20Sopenharmony_ci * @peers: Node for list management during discovery and RSCN processing 1118c2ecf20Sopenharmony_ci * @rport_work: Work struct for starting the rport state machine 1128c2ecf20Sopenharmony_ci * @port_id: Port ID of the discovered port 1138c2ecf20Sopenharmony_ci */ 1148c2ecf20Sopenharmony_cistruct fc_disc_port { 1158c2ecf20Sopenharmony_ci struct fc_lport *lp; 1168c2ecf20Sopenharmony_ci struct list_head peers; 1178c2ecf20Sopenharmony_ci struct work_struct rport_work; 1188c2ecf20Sopenharmony_ci u32 port_id; 1198c2ecf20Sopenharmony_ci}; 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ci/** 1228c2ecf20Sopenharmony_ci * enum fc_rport_event - Remote port events 1238c2ecf20Sopenharmony_ci * @RPORT_EV_NONE: No event 1248c2ecf20Sopenharmony_ci * @RPORT_EV_READY: Remote port is ready for use 1258c2ecf20Sopenharmony_ci * @RPORT_EV_FAILED: State machine failed, remote port is not ready 1268c2ecf20Sopenharmony_ci * @RPORT_EV_STOP: Remote port has been stopped 1278c2ecf20Sopenharmony_ci * @RPORT_EV_LOGO: Remote port logout (LOGO) sent 1288c2ecf20Sopenharmony_ci */ 1298c2ecf20Sopenharmony_cienum fc_rport_event { 1308c2ecf20Sopenharmony_ci RPORT_EV_NONE = 0, 1318c2ecf20Sopenharmony_ci RPORT_EV_READY, 1328c2ecf20Sopenharmony_ci RPORT_EV_FAILED, 1338c2ecf20Sopenharmony_ci RPORT_EV_STOP, 1348c2ecf20Sopenharmony_ci RPORT_EV_LOGO 1358c2ecf20Sopenharmony_ci}; 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_cistruct fc_rport_priv; 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_ci/** 1408c2ecf20Sopenharmony_ci * struct fc_rport_operations - Operations for a remote port 1418c2ecf20Sopenharmony_ci * @event_callback: Function to be called for remote port events 1428c2ecf20Sopenharmony_ci */ 1438c2ecf20Sopenharmony_cistruct fc_rport_operations { 1448c2ecf20Sopenharmony_ci void (*event_callback)(struct fc_lport *, struct fc_rport_priv *, 1458c2ecf20Sopenharmony_ci enum fc_rport_event); 1468c2ecf20Sopenharmony_ci}; 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_ci/** 1498c2ecf20Sopenharmony_ci * struct fc_rport_libfc_priv - libfc internal information about a remote port 1508c2ecf20Sopenharmony_ci * @local_port: The associated local port 1518c2ecf20Sopenharmony_ci * @rp_state: Indicates READY for I/O or DELETE when blocked 1528c2ecf20Sopenharmony_ci * @flags: REC and RETRY supported flags 1538c2ecf20Sopenharmony_ci * @e_d_tov: Error detect timeout value (in msec) 1548c2ecf20Sopenharmony_ci * @r_a_tov: Resource allocation timeout value (in msec) 1558c2ecf20Sopenharmony_ci */ 1568c2ecf20Sopenharmony_cistruct fc_rport_libfc_priv { 1578c2ecf20Sopenharmony_ci struct fc_lport *local_port; 1588c2ecf20Sopenharmony_ci enum fc_rport_state rp_state; 1598c2ecf20Sopenharmony_ci u16 flags; 1608c2ecf20Sopenharmony_ci #define FC_RP_FLAGS_REC_SUPPORTED (1 << 0) 1618c2ecf20Sopenharmony_ci #define FC_RP_FLAGS_RETRY (1 << 1) 1628c2ecf20Sopenharmony_ci #define FC_RP_STARTED (1 << 2) 1638c2ecf20Sopenharmony_ci #define FC_RP_FLAGS_CONF_REQ (1 << 3) 1648c2ecf20Sopenharmony_ci unsigned int e_d_tov; 1658c2ecf20Sopenharmony_ci unsigned int r_a_tov; 1668c2ecf20Sopenharmony_ci}; 1678c2ecf20Sopenharmony_ci 1688c2ecf20Sopenharmony_ci/** 1698c2ecf20Sopenharmony_ci * struct fc_rport_priv - libfc remote port and discovery info 1708c2ecf20Sopenharmony_ci * @local_port: The associated local port 1718c2ecf20Sopenharmony_ci * @rport: The FC transport remote port 1728c2ecf20Sopenharmony_ci * @kref: Reference counter 1738c2ecf20Sopenharmony_ci * @rp_state: Enumeration that tracks progress of PLOGI, PRLI, 1748c2ecf20Sopenharmony_ci * and RTV exchanges 1758c2ecf20Sopenharmony_ci * @ids: The remote port identifiers and roles 1768c2ecf20Sopenharmony_ci * @flags: STARTED, REC and RETRY_SUPPORTED flags 1778c2ecf20Sopenharmony_ci * @max_seq: Maximum number of concurrent sequences 1788c2ecf20Sopenharmony_ci * @disc_id: The discovery identifier 1798c2ecf20Sopenharmony_ci * @maxframe_size: The maximum frame size 1808c2ecf20Sopenharmony_ci * @retries: The retry count for the current state 1818c2ecf20Sopenharmony_ci * @major_retries: The retry count for the entire PLOGI/PRLI state machine 1828c2ecf20Sopenharmony_ci * @e_d_tov: Error detect timeout value (in msec) 1838c2ecf20Sopenharmony_ci * @r_a_tov: Resource allocation timeout value (in msec) 1848c2ecf20Sopenharmony_ci * @rp_mutex: The mutex that protects the remote port 1858c2ecf20Sopenharmony_ci * @retry_work: Handle for retries 1868c2ecf20Sopenharmony_ci * @event_callback: Callback when READY, FAILED or LOGO states complete 1878c2ecf20Sopenharmony_ci * @prli_count: Count of open PRLI sessions in providers 1888c2ecf20Sopenharmony_ci * @rcu: Structure used for freeing in an RCU-safe manner 1898c2ecf20Sopenharmony_ci */ 1908c2ecf20Sopenharmony_cistruct fc_rport_priv { 1918c2ecf20Sopenharmony_ci struct fc_lport *local_port; 1928c2ecf20Sopenharmony_ci struct fc_rport *rport; 1938c2ecf20Sopenharmony_ci struct kref kref; 1948c2ecf20Sopenharmony_ci enum fc_rport_state rp_state; 1958c2ecf20Sopenharmony_ci struct fc_rport_identifiers ids; 1968c2ecf20Sopenharmony_ci u16 flags; 1978c2ecf20Sopenharmony_ci u16 max_seq; 1988c2ecf20Sopenharmony_ci u16 disc_id; 1998c2ecf20Sopenharmony_ci u16 maxframe_size; 2008c2ecf20Sopenharmony_ci unsigned int retries; 2018c2ecf20Sopenharmony_ci unsigned int major_retries; 2028c2ecf20Sopenharmony_ci unsigned int e_d_tov; 2038c2ecf20Sopenharmony_ci unsigned int r_a_tov; 2048c2ecf20Sopenharmony_ci struct mutex rp_mutex; 2058c2ecf20Sopenharmony_ci struct delayed_work retry_work; 2068c2ecf20Sopenharmony_ci enum fc_rport_event event; 2078c2ecf20Sopenharmony_ci struct fc_rport_operations *ops; 2088c2ecf20Sopenharmony_ci struct list_head peers; 2098c2ecf20Sopenharmony_ci struct work_struct event_work; 2108c2ecf20Sopenharmony_ci u32 supported_classes; 2118c2ecf20Sopenharmony_ci u16 prli_count; 2128c2ecf20Sopenharmony_ci struct rcu_head rcu; 2138c2ecf20Sopenharmony_ci u16 sp_features; 2148c2ecf20Sopenharmony_ci u8 spp_type; 2158c2ecf20Sopenharmony_ci void (*lld_event_callback)(struct fc_lport *, 2168c2ecf20Sopenharmony_ci struct fc_rport_priv *, 2178c2ecf20Sopenharmony_ci enum fc_rport_event); 2188c2ecf20Sopenharmony_ci}; 2198c2ecf20Sopenharmony_ci 2208c2ecf20Sopenharmony_ci/** 2218c2ecf20Sopenharmony_ci * struct fc_stats - fc stats structure 2228c2ecf20Sopenharmony_ci * @SecondsSinceLastReset: Seconds since the last reset 2238c2ecf20Sopenharmony_ci * @TxFrames: Number of transmitted frames 2248c2ecf20Sopenharmony_ci * @TxWords: Number of transmitted words 2258c2ecf20Sopenharmony_ci * @RxFrames: Number of received frames 2268c2ecf20Sopenharmony_ci * @RxWords: Number of received words 2278c2ecf20Sopenharmony_ci * @ErrorFrames: Number of received error frames 2288c2ecf20Sopenharmony_ci * @DumpedFrames: Number of dumped frames 2298c2ecf20Sopenharmony_ci * @FcpPktAllocFails: Number of fcp packet allocation failures 2308c2ecf20Sopenharmony_ci * @FcpPktAborts: Number of fcp packet aborts 2318c2ecf20Sopenharmony_ci * @FcpFrameAllocFails: Number of fcp frame allocation failures 2328c2ecf20Sopenharmony_ci * @LinkFailureCount: Number of link failures 2338c2ecf20Sopenharmony_ci * @LossOfSignalCount: Number for signal losses 2348c2ecf20Sopenharmony_ci * @InvalidTxWordCount: Number of invalid transmitted words 2358c2ecf20Sopenharmony_ci * @InvalidCRCCount: Number of invalid CRCs 2368c2ecf20Sopenharmony_ci * @InputRequests: Number of input requests 2378c2ecf20Sopenharmony_ci * @OutputRequests: Number of output requests 2388c2ecf20Sopenharmony_ci * @ControlRequests: Number of control requests 2398c2ecf20Sopenharmony_ci * @InputBytes: Number of received bytes 2408c2ecf20Sopenharmony_ci * @OutputBytes: Number of transmitted bytes 2418c2ecf20Sopenharmony_ci * @VLinkFailureCount: Number of virtual link failures 2428c2ecf20Sopenharmony_ci * @MissDiscAdvCount: Number of missing FIP discovery advertisement 2438c2ecf20Sopenharmony_ci */ 2448c2ecf20Sopenharmony_cistruct fc_stats { 2458c2ecf20Sopenharmony_ci u64 SecondsSinceLastReset; 2468c2ecf20Sopenharmony_ci u64 TxFrames; 2478c2ecf20Sopenharmony_ci u64 TxWords; 2488c2ecf20Sopenharmony_ci u64 RxFrames; 2498c2ecf20Sopenharmony_ci u64 RxWords; 2508c2ecf20Sopenharmony_ci u64 ErrorFrames; 2518c2ecf20Sopenharmony_ci u64 DumpedFrames; 2528c2ecf20Sopenharmony_ci u64 FcpPktAllocFails; 2538c2ecf20Sopenharmony_ci u64 FcpPktAborts; 2548c2ecf20Sopenharmony_ci u64 FcpFrameAllocFails; 2558c2ecf20Sopenharmony_ci u64 LinkFailureCount; 2568c2ecf20Sopenharmony_ci u64 LossOfSignalCount; 2578c2ecf20Sopenharmony_ci u64 InvalidTxWordCount; 2588c2ecf20Sopenharmony_ci u64 InvalidCRCCount; 2598c2ecf20Sopenharmony_ci u64 InputRequests; 2608c2ecf20Sopenharmony_ci u64 OutputRequests; 2618c2ecf20Sopenharmony_ci u64 ControlRequests; 2628c2ecf20Sopenharmony_ci u64 InputBytes; 2638c2ecf20Sopenharmony_ci u64 OutputBytes; 2648c2ecf20Sopenharmony_ci u64 VLinkFailureCount; 2658c2ecf20Sopenharmony_ci u64 MissDiscAdvCount; 2668c2ecf20Sopenharmony_ci}; 2678c2ecf20Sopenharmony_ci 2688c2ecf20Sopenharmony_ci/** 2698c2ecf20Sopenharmony_ci * struct fc_seq_els_data - ELS data used for passing ELS specific responses 2708c2ecf20Sopenharmony_ci * @reason: The reason for rejection 2718c2ecf20Sopenharmony_ci * @explan: The explanation of the rejection 2728c2ecf20Sopenharmony_ci * 2738c2ecf20Sopenharmony_ci * Mainly used by the exchange manager layer. 2748c2ecf20Sopenharmony_ci */ 2758c2ecf20Sopenharmony_cistruct fc_seq_els_data { 2768c2ecf20Sopenharmony_ci enum fc_els_rjt_reason reason; 2778c2ecf20Sopenharmony_ci enum fc_els_rjt_explan explan; 2788c2ecf20Sopenharmony_ci}; 2798c2ecf20Sopenharmony_ci 2808c2ecf20Sopenharmony_ci/** 2818c2ecf20Sopenharmony_ci * struct fc_fcp_pkt - FCP request structure (one for each scsi_cmnd request) 2828c2ecf20Sopenharmony_ci * @lp: The associated local port 2838c2ecf20Sopenharmony_ci * @state: The state of the I/O 2848c2ecf20Sopenharmony_ci * @ref_cnt: Reference count 2858c2ecf20Sopenharmony_ci * @scsi_pkt_lock: Lock to protect the SCSI packet (must be taken before the 2868c2ecf20Sopenharmony_ci * host_lock if both are to be held at the same time) 2878c2ecf20Sopenharmony_ci * @cmd: The SCSI command (set and clear with the host_lock held) 2888c2ecf20Sopenharmony_ci * @list: Tracks queued commands (accessed with the host_lock held) 2898c2ecf20Sopenharmony_ci * @timer: The command timer 2908c2ecf20Sopenharmony_ci * @tm_done: Completion indicator 2918c2ecf20Sopenharmony_ci * @wait_for_comp: Indicator to wait for completion of the I/O (in jiffies) 2928c2ecf20Sopenharmony_ci * @data_len: The length of the data 2938c2ecf20Sopenharmony_ci * @cdb_cmd: The CDB command 2948c2ecf20Sopenharmony_ci * @xfer_len: The transfer length 2958c2ecf20Sopenharmony_ci * @xfer_ddp: Indicates if this transfer used DDP (XID of the exchange 2968c2ecf20Sopenharmony_ci * will be set here if DDP was setup) 2978c2ecf20Sopenharmony_ci * @xfer_contig_end: The offset into the buffer if the buffer is contiguous 2988c2ecf20Sopenharmony_ci * (Tx and Rx) 2998c2ecf20Sopenharmony_ci * @max_payload: The maximum payload size (in bytes) 3008c2ecf20Sopenharmony_ci * @io_status: SCSI result (upper 24 bits) 3018c2ecf20Sopenharmony_ci * @cdb_status: CDB status 3028c2ecf20Sopenharmony_ci * @status_code: FCP I/O status 3038c2ecf20Sopenharmony_ci * @scsi_comp_flags: Completion flags (bit 3 Underrun bit 2: overrun) 3048c2ecf20Sopenharmony_ci * @req_flags: Request flags (bit 0: read bit:1 write) 3058c2ecf20Sopenharmony_ci * @scsi_resid: SCSI residule length 3068c2ecf20Sopenharmony_ci * @rport: The remote port that the SCSI command is targeted at 3078c2ecf20Sopenharmony_ci * @seq_ptr: The sequence that will carry the SCSI command 3088c2ecf20Sopenharmony_ci * @recov_retry: Number of recovery retries 3098c2ecf20Sopenharmony_ci * @recov_seq: The sequence for REC or SRR 3108c2ecf20Sopenharmony_ci */ 3118c2ecf20Sopenharmony_cistruct fc_fcp_pkt { 3128c2ecf20Sopenharmony_ci spinlock_t scsi_pkt_lock; 3138c2ecf20Sopenharmony_ci refcount_t ref_cnt; 3148c2ecf20Sopenharmony_ci 3158c2ecf20Sopenharmony_ci /* SCSI command and data transfer information */ 3168c2ecf20Sopenharmony_ci u32 data_len; 3178c2ecf20Sopenharmony_ci 3188c2ecf20Sopenharmony_ci /* SCSI I/O related information */ 3198c2ecf20Sopenharmony_ci struct scsi_cmnd *cmd; 3208c2ecf20Sopenharmony_ci struct list_head list; 3218c2ecf20Sopenharmony_ci 3228c2ecf20Sopenharmony_ci /* Housekeeping information */ 3238c2ecf20Sopenharmony_ci struct fc_lport *lp; 3248c2ecf20Sopenharmony_ci u8 state; 3258c2ecf20Sopenharmony_ci 3268c2ecf20Sopenharmony_ci /* SCSI/FCP return status */ 3278c2ecf20Sopenharmony_ci u8 cdb_status; 3288c2ecf20Sopenharmony_ci u8 status_code; 3298c2ecf20Sopenharmony_ci u8 scsi_comp_flags; 3308c2ecf20Sopenharmony_ci u32 io_status; 3318c2ecf20Sopenharmony_ci u32 req_flags; 3328c2ecf20Sopenharmony_ci u32 scsi_resid; 3338c2ecf20Sopenharmony_ci 3348c2ecf20Sopenharmony_ci /* Transport related veriables */ 3358c2ecf20Sopenharmony_ci size_t xfer_len; 3368c2ecf20Sopenharmony_ci struct fcp_cmnd cdb_cmd; 3378c2ecf20Sopenharmony_ci u32 xfer_contig_end; 3388c2ecf20Sopenharmony_ci u16 max_payload; 3398c2ecf20Sopenharmony_ci u16 xfer_ddp; 3408c2ecf20Sopenharmony_ci 3418c2ecf20Sopenharmony_ci /* Associated structures */ 3428c2ecf20Sopenharmony_ci struct fc_rport *rport; 3438c2ecf20Sopenharmony_ci struct fc_seq *seq_ptr; 3448c2ecf20Sopenharmony_ci 3458c2ecf20Sopenharmony_ci /* Timeout/error related information */ 3468c2ecf20Sopenharmony_ci struct timer_list timer; 3478c2ecf20Sopenharmony_ci int wait_for_comp; 3488c2ecf20Sopenharmony_ci int timer_delay; 3498c2ecf20Sopenharmony_ci u32 recov_retry; 3508c2ecf20Sopenharmony_ci struct fc_seq *recov_seq; 3518c2ecf20Sopenharmony_ci struct completion tm_done; 3528c2ecf20Sopenharmony_ci} ____cacheline_aligned_in_smp; 3538c2ecf20Sopenharmony_ci 3548c2ecf20Sopenharmony_ci/* 3558c2ecf20Sopenharmony_ci * Structure and function definitions for managing Fibre Channel Exchanges 3568c2ecf20Sopenharmony_ci * and Sequences 3578c2ecf20Sopenharmony_ci * 3588c2ecf20Sopenharmony_ci * fc_exch holds state for one exchange and links to its active sequence. 3598c2ecf20Sopenharmony_ci * 3608c2ecf20Sopenharmony_ci * fc_seq holds the state for an individual sequence. 3618c2ecf20Sopenharmony_ci */ 3628c2ecf20Sopenharmony_ci 3638c2ecf20Sopenharmony_cistruct fc_exch_mgr; 3648c2ecf20Sopenharmony_cistruct fc_exch_mgr_anchor; 3658c2ecf20Sopenharmony_ciextern u16 fc_cpu_mask; /* cpu mask for possible cpus */ 3668c2ecf20Sopenharmony_ci 3678c2ecf20Sopenharmony_ci/** 3688c2ecf20Sopenharmony_ci * struct fc_seq - FC sequence 3698c2ecf20Sopenharmony_ci * @id: The sequence ID 3708c2ecf20Sopenharmony_ci * @ssb_stat: Status flags for the sequence status block (SSB) 3718c2ecf20Sopenharmony_ci * @cnt: Number of frames sent so far 3728c2ecf20Sopenharmony_ci * @rec_data: FC-4 value for REC 3738c2ecf20Sopenharmony_ci */ 3748c2ecf20Sopenharmony_cistruct fc_seq { 3758c2ecf20Sopenharmony_ci u8 id; 3768c2ecf20Sopenharmony_ci u16 ssb_stat; 3778c2ecf20Sopenharmony_ci u16 cnt; 3788c2ecf20Sopenharmony_ci u32 rec_data; 3798c2ecf20Sopenharmony_ci}; 3808c2ecf20Sopenharmony_ci 3818c2ecf20Sopenharmony_ci#define FC_EX_DONE (1 << 0) /* ep is completed */ 3828c2ecf20Sopenharmony_ci#define FC_EX_RST_CLEANUP (1 << 1) /* reset is forcing completion */ 3838c2ecf20Sopenharmony_ci#define FC_EX_QUARANTINE (1 << 2) /* exch is quarantined */ 3848c2ecf20Sopenharmony_ci 3858c2ecf20Sopenharmony_ci/** 3868c2ecf20Sopenharmony_ci * struct fc_exch - Fibre Channel Exchange 3878c2ecf20Sopenharmony_ci * @em: Exchange manager 3888c2ecf20Sopenharmony_ci * @pool: Exchange pool 3898c2ecf20Sopenharmony_ci * @state: The exchange's state 3908c2ecf20Sopenharmony_ci * @xid: The exchange ID 3918c2ecf20Sopenharmony_ci * @ex_list: Handle used by the EM to track free exchanges 3928c2ecf20Sopenharmony_ci * @ex_lock: Lock that protects the exchange 3938c2ecf20Sopenharmony_ci * @ex_refcnt: Reference count 3948c2ecf20Sopenharmony_ci * @timeout_work: Handle for timeout handler 3958c2ecf20Sopenharmony_ci * @lp: The local port that this exchange is on 3968c2ecf20Sopenharmony_ci * @oxid: Originator's exchange ID 3978c2ecf20Sopenharmony_ci * @rxid: Responder's exchange ID 3988c2ecf20Sopenharmony_ci * @oid: Originator's FCID 3998c2ecf20Sopenharmony_ci * @sid: Source FCID 4008c2ecf20Sopenharmony_ci * @did: Destination FCID 4018c2ecf20Sopenharmony_ci * @esb_stat: ESB exchange status 4028c2ecf20Sopenharmony_ci * @r_a_tov: Resouce allocation time out value (in msecs) 4038c2ecf20Sopenharmony_ci * @seq_id: The next sequence ID to use 4048c2ecf20Sopenharmony_ci * @encaps: encapsulation information for lower-level driver 4058c2ecf20Sopenharmony_ci * @f_ctl: F_CTL flags for the sequence 4068c2ecf20Sopenharmony_ci * @fh_type: The frame type 4078c2ecf20Sopenharmony_ci * @class: The class of service 4088c2ecf20Sopenharmony_ci * @seq: The sequence in use on this exchange 4098c2ecf20Sopenharmony_ci * @resp_active: Number of tasks that are concurrently executing @resp(). 4108c2ecf20Sopenharmony_ci * @resp_task: If @resp_active > 0, either the task executing @resp(), the 4118c2ecf20Sopenharmony_ci * task that has been interrupted to execute the soft-IRQ 4128c2ecf20Sopenharmony_ci * executing @resp() or NULL if more than one task is executing 4138c2ecf20Sopenharmony_ci * @resp concurrently. 4148c2ecf20Sopenharmony_ci * @resp_wq: Waitqueue for the tasks waiting on @resp_active. 4158c2ecf20Sopenharmony_ci * @resp: Callback for responses on this exchange 4168c2ecf20Sopenharmony_ci * @destructor: Called when destroying the exchange 4178c2ecf20Sopenharmony_ci * @arg: Passed as a void pointer to the resp() callback 4188c2ecf20Sopenharmony_ci * 4198c2ecf20Sopenharmony_ci * Locking notes: The ex_lock protects following items: 4208c2ecf20Sopenharmony_ci * state, esb_stat, f_ctl, seq.ssb_stat 4218c2ecf20Sopenharmony_ci * seq_id 4228c2ecf20Sopenharmony_ci * sequence allocation 4238c2ecf20Sopenharmony_ci */ 4248c2ecf20Sopenharmony_cistruct fc_exch { 4258c2ecf20Sopenharmony_ci spinlock_t ex_lock; 4268c2ecf20Sopenharmony_ci atomic_t ex_refcnt; 4278c2ecf20Sopenharmony_ci enum fc_class class; 4288c2ecf20Sopenharmony_ci struct fc_exch_mgr *em; 4298c2ecf20Sopenharmony_ci struct fc_exch_pool *pool; 4308c2ecf20Sopenharmony_ci struct list_head ex_list; 4318c2ecf20Sopenharmony_ci struct fc_lport *lp; 4328c2ecf20Sopenharmony_ci u32 esb_stat; 4338c2ecf20Sopenharmony_ci u8 state; 4348c2ecf20Sopenharmony_ci u8 fh_type; 4358c2ecf20Sopenharmony_ci u8 seq_id; 4368c2ecf20Sopenharmony_ci u8 encaps; 4378c2ecf20Sopenharmony_ci u16 xid; 4388c2ecf20Sopenharmony_ci u16 oxid; 4398c2ecf20Sopenharmony_ci u16 rxid; 4408c2ecf20Sopenharmony_ci u32 oid; 4418c2ecf20Sopenharmony_ci u32 sid; 4428c2ecf20Sopenharmony_ci u32 did; 4438c2ecf20Sopenharmony_ci u32 r_a_tov; 4448c2ecf20Sopenharmony_ci u32 f_ctl; 4458c2ecf20Sopenharmony_ci struct fc_seq seq; 4468c2ecf20Sopenharmony_ci int resp_active; 4478c2ecf20Sopenharmony_ci struct task_struct *resp_task; 4488c2ecf20Sopenharmony_ci wait_queue_head_t resp_wq; 4498c2ecf20Sopenharmony_ci void (*resp)(struct fc_seq *, struct fc_frame *, void *); 4508c2ecf20Sopenharmony_ci void *arg; 4518c2ecf20Sopenharmony_ci void (*destructor)(struct fc_seq *, void *); 4528c2ecf20Sopenharmony_ci struct delayed_work timeout_work; 4538c2ecf20Sopenharmony_ci} ____cacheline_aligned_in_smp; 4548c2ecf20Sopenharmony_ci#define fc_seq_exch(sp) container_of(sp, struct fc_exch, seq) 4558c2ecf20Sopenharmony_ci 4568c2ecf20Sopenharmony_ci 4578c2ecf20Sopenharmony_cistruct libfc_function_template { 4588c2ecf20Sopenharmony_ci /* 4598c2ecf20Sopenharmony_ci * Interface to send a FC frame 4608c2ecf20Sopenharmony_ci * 4618c2ecf20Sopenharmony_ci * STATUS: REQUIRED 4628c2ecf20Sopenharmony_ci */ 4638c2ecf20Sopenharmony_ci int (*frame_send)(struct fc_lport *, struct fc_frame *); 4648c2ecf20Sopenharmony_ci 4658c2ecf20Sopenharmony_ci /* 4668c2ecf20Sopenharmony_ci * Interface to send ELS/CT frames 4678c2ecf20Sopenharmony_ci * 4688c2ecf20Sopenharmony_ci * STATUS: OPTIONAL 4698c2ecf20Sopenharmony_ci */ 4708c2ecf20Sopenharmony_ci struct fc_seq *(*elsct_send)(struct fc_lport *, u32 did, 4718c2ecf20Sopenharmony_ci struct fc_frame *, unsigned int op, 4728c2ecf20Sopenharmony_ci void (*resp)(struct fc_seq *, 4738c2ecf20Sopenharmony_ci struct fc_frame *, void *arg), 4748c2ecf20Sopenharmony_ci void *arg, u32 timer_msec); 4758c2ecf20Sopenharmony_ci 4768c2ecf20Sopenharmony_ci /* 4778c2ecf20Sopenharmony_ci * Sets up the DDP context for a given exchange id on the given 4788c2ecf20Sopenharmony_ci * scatterlist if LLD supports DDP for large receive. 4798c2ecf20Sopenharmony_ci * 4808c2ecf20Sopenharmony_ci * STATUS: OPTIONAL 4818c2ecf20Sopenharmony_ci */ 4828c2ecf20Sopenharmony_ci int (*ddp_setup)(struct fc_lport *, u16, struct scatterlist *, 4838c2ecf20Sopenharmony_ci unsigned int); 4848c2ecf20Sopenharmony_ci /* 4858c2ecf20Sopenharmony_ci * Completes the DDP transfer and returns the length of data DDPed 4868c2ecf20Sopenharmony_ci * for the given exchange id. 4878c2ecf20Sopenharmony_ci * 4888c2ecf20Sopenharmony_ci * STATUS: OPTIONAL 4898c2ecf20Sopenharmony_ci */ 4908c2ecf20Sopenharmony_ci int (*ddp_done)(struct fc_lport *, u16); 4918c2ecf20Sopenharmony_ci /* 4928c2ecf20Sopenharmony_ci * Sets up the DDP context for a given exchange id on the given 4938c2ecf20Sopenharmony_ci * scatterlist if LLD supports DDP for target. 4948c2ecf20Sopenharmony_ci * 4958c2ecf20Sopenharmony_ci * STATUS: OPTIONAL 4968c2ecf20Sopenharmony_ci */ 4978c2ecf20Sopenharmony_ci int (*ddp_target)(struct fc_lport *, u16, struct scatterlist *, 4988c2ecf20Sopenharmony_ci unsigned int); 4998c2ecf20Sopenharmony_ci /* 5008c2ecf20Sopenharmony_ci * Allow LLD to fill its own Link Error Status Block 5018c2ecf20Sopenharmony_ci * 5028c2ecf20Sopenharmony_ci * STATUS: OPTIONAL 5038c2ecf20Sopenharmony_ci */ 5048c2ecf20Sopenharmony_ci void (*get_lesb)(struct fc_lport *, struct fc_els_lesb *lesb); 5058c2ecf20Sopenharmony_ci 5068c2ecf20Sopenharmony_ci /* 5078c2ecf20Sopenharmony_ci * Reset an exchange manager, completing all sequences and exchanges. 5088c2ecf20Sopenharmony_ci * If s_id is non-zero, reset only exchanges originating from that FID. 5098c2ecf20Sopenharmony_ci * If d_id is non-zero, reset only exchanges sending to that FID. 5108c2ecf20Sopenharmony_ci * 5118c2ecf20Sopenharmony_ci * STATUS: OPTIONAL 5128c2ecf20Sopenharmony_ci */ 5138c2ecf20Sopenharmony_ci void (*exch_mgr_reset)(struct fc_lport *, u32 s_id, u32 d_id); 5148c2ecf20Sopenharmony_ci 5158c2ecf20Sopenharmony_ci /* 5168c2ecf20Sopenharmony_ci * Set the local port FC_ID. 5178c2ecf20Sopenharmony_ci * 5188c2ecf20Sopenharmony_ci * This may be provided by the LLD to allow it to be 5198c2ecf20Sopenharmony_ci * notified when the local port is assigned a FC-ID. 5208c2ecf20Sopenharmony_ci * 5218c2ecf20Sopenharmony_ci * The frame, if non-NULL, is the incoming frame with the 5228c2ecf20Sopenharmony_ci * FLOGI LS_ACC or FLOGI, and may contain the granted MAC 5238c2ecf20Sopenharmony_ci * address for the LLD. The frame pointer may be NULL if 5248c2ecf20Sopenharmony_ci * no MAC is associated with this assignment (LOGO or PLOGI). 5258c2ecf20Sopenharmony_ci * 5268c2ecf20Sopenharmony_ci * If FC_ID is non-zero, r_a_tov and e_d_tov must be valid. 5278c2ecf20Sopenharmony_ci * 5288c2ecf20Sopenharmony_ci * Note: this is called with the local port mutex held. 5298c2ecf20Sopenharmony_ci * 5308c2ecf20Sopenharmony_ci * STATUS: OPTIONAL 5318c2ecf20Sopenharmony_ci */ 5328c2ecf20Sopenharmony_ci void (*lport_set_port_id)(struct fc_lport *, u32 port_id, 5338c2ecf20Sopenharmony_ci struct fc_frame *); 5348c2ecf20Sopenharmony_ci 5358c2ecf20Sopenharmony_ci /* 5368c2ecf20Sopenharmony_ci * Callback routine after the remote port is logged in 5378c2ecf20Sopenharmony_ci * 5388c2ecf20Sopenharmony_ci * STATUS: OPTIONAL 5398c2ecf20Sopenharmony_ci */ 5408c2ecf20Sopenharmony_ci void (*rport_event_callback)(struct fc_lport *, 5418c2ecf20Sopenharmony_ci struct fc_rport_priv *, 5428c2ecf20Sopenharmony_ci enum fc_rport_event); 5438c2ecf20Sopenharmony_ci 5448c2ecf20Sopenharmony_ci /* 5458c2ecf20Sopenharmony_ci * Send a fcp cmd from fsp pkt. 5468c2ecf20Sopenharmony_ci * Called with the SCSI host lock unlocked and irqs disabled. 5478c2ecf20Sopenharmony_ci * 5488c2ecf20Sopenharmony_ci * The resp handler is called when FCP_RSP received. 5498c2ecf20Sopenharmony_ci * 5508c2ecf20Sopenharmony_ci * STATUS: OPTIONAL 5518c2ecf20Sopenharmony_ci */ 5528c2ecf20Sopenharmony_ci int (*fcp_cmd_send)(struct fc_lport *, struct fc_fcp_pkt *, 5538c2ecf20Sopenharmony_ci void (*resp)(struct fc_seq *, struct fc_frame *, 5548c2ecf20Sopenharmony_ci void *)); 5558c2ecf20Sopenharmony_ci 5568c2ecf20Sopenharmony_ci /* 5578c2ecf20Sopenharmony_ci * Cleanup the FCP layer, used during link down and reset 5588c2ecf20Sopenharmony_ci * 5598c2ecf20Sopenharmony_ci * STATUS: OPTIONAL 5608c2ecf20Sopenharmony_ci */ 5618c2ecf20Sopenharmony_ci void (*fcp_cleanup)(struct fc_lport *); 5628c2ecf20Sopenharmony_ci 5638c2ecf20Sopenharmony_ci /* 5648c2ecf20Sopenharmony_ci * Abort all I/O on a local port 5658c2ecf20Sopenharmony_ci * 5668c2ecf20Sopenharmony_ci * STATUS: OPTIONAL 5678c2ecf20Sopenharmony_ci */ 5688c2ecf20Sopenharmony_ci void (*fcp_abort_io)(struct fc_lport *); 5698c2ecf20Sopenharmony_ci 5708c2ecf20Sopenharmony_ci /* 5718c2ecf20Sopenharmony_ci * Receive a request for the discovery layer. 5728c2ecf20Sopenharmony_ci * 5738c2ecf20Sopenharmony_ci * STATUS: OPTIONAL 5748c2ecf20Sopenharmony_ci */ 5758c2ecf20Sopenharmony_ci void (*disc_recv_req)(struct fc_lport *, struct fc_frame *); 5768c2ecf20Sopenharmony_ci 5778c2ecf20Sopenharmony_ci /* 5788c2ecf20Sopenharmony_ci * Start discovery for a local port. 5798c2ecf20Sopenharmony_ci * 5808c2ecf20Sopenharmony_ci * STATUS: OPTIONAL 5818c2ecf20Sopenharmony_ci */ 5828c2ecf20Sopenharmony_ci void (*disc_start)(void (*disc_callback)(struct fc_lport *, 5838c2ecf20Sopenharmony_ci enum fc_disc_event), 5848c2ecf20Sopenharmony_ci struct fc_lport *); 5858c2ecf20Sopenharmony_ci 5868c2ecf20Sopenharmony_ci /* 5878c2ecf20Sopenharmony_ci * Stop discovery for a given lport. This will remove 5888c2ecf20Sopenharmony_ci * all discovered rports 5898c2ecf20Sopenharmony_ci * 5908c2ecf20Sopenharmony_ci * STATUS: OPTIONAL 5918c2ecf20Sopenharmony_ci */ 5928c2ecf20Sopenharmony_ci void (*disc_stop) (struct fc_lport *); 5938c2ecf20Sopenharmony_ci 5948c2ecf20Sopenharmony_ci /* 5958c2ecf20Sopenharmony_ci * Stop discovery for a given lport. This will block 5968c2ecf20Sopenharmony_ci * until all discovered rports are deleted from the 5978c2ecf20Sopenharmony_ci * FC transport class 5988c2ecf20Sopenharmony_ci * 5998c2ecf20Sopenharmony_ci * STATUS: OPTIONAL 6008c2ecf20Sopenharmony_ci */ 6018c2ecf20Sopenharmony_ci void (*disc_stop_final) (struct fc_lport *); 6028c2ecf20Sopenharmony_ci}; 6038c2ecf20Sopenharmony_ci 6048c2ecf20Sopenharmony_ci/** 6058c2ecf20Sopenharmony_ci * struct fc_disc - Discovery context 6068c2ecf20Sopenharmony_ci * @retry_count: Number of retries 6078c2ecf20Sopenharmony_ci * @pending: 1 if discovery is pending, 0 if not 6088c2ecf20Sopenharmony_ci * @requested: 1 if discovery has been requested, 0 if not 6098c2ecf20Sopenharmony_ci * @seq_count: Number of sequences used for discovery 6108c2ecf20Sopenharmony_ci * @buf_len: Length of the discovery buffer 6118c2ecf20Sopenharmony_ci * @disc_id: Discovery ID 6128c2ecf20Sopenharmony_ci * @rports: List of discovered remote ports 6138c2ecf20Sopenharmony_ci * @priv: Private pointer for use by discovery code 6148c2ecf20Sopenharmony_ci * @disc_mutex: Mutex that protects the discovery context 6158c2ecf20Sopenharmony_ci * @partial_buf: Partial name buffer (if names are returned 6168c2ecf20Sopenharmony_ci * in multiple frames) 6178c2ecf20Sopenharmony_ci * @disc_work: handle for delayed work context 6188c2ecf20Sopenharmony_ci * @disc_callback: Callback routine called when discovery completes 6198c2ecf20Sopenharmony_ci */ 6208c2ecf20Sopenharmony_cistruct fc_disc { 6218c2ecf20Sopenharmony_ci unsigned char retry_count; 6228c2ecf20Sopenharmony_ci unsigned char pending; 6238c2ecf20Sopenharmony_ci unsigned char requested; 6248c2ecf20Sopenharmony_ci unsigned short seq_count; 6258c2ecf20Sopenharmony_ci unsigned char buf_len; 6268c2ecf20Sopenharmony_ci u16 disc_id; 6278c2ecf20Sopenharmony_ci 6288c2ecf20Sopenharmony_ci struct list_head rports; 6298c2ecf20Sopenharmony_ci void *priv; 6308c2ecf20Sopenharmony_ci struct mutex disc_mutex; 6318c2ecf20Sopenharmony_ci struct fc_gpn_ft_resp partial_buf; 6328c2ecf20Sopenharmony_ci struct delayed_work disc_work; 6338c2ecf20Sopenharmony_ci 6348c2ecf20Sopenharmony_ci void (*disc_callback)(struct fc_lport *, 6358c2ecf20Sopenharmony_ci enum fc_disc_event); 6368c2ecf20Sopenharmony_ci}; 6378c2ecf20Sopenharmony_ci 6388c2ecf20Sopenharmony_ci/* 6398c2ecf20Sopenharmony_ci * Local port notifier and events. 6408c2ecf20Sopenharmony_ci */ 6418c2ecf20Sopenharmony_ciextern struct blocking_notifier_head fc_lport_notifier_head; 6428c2ecf20Sopenharmony_cienum fc_lport_event { 6438c2ecf20Sopenharmony_ci FC_LPORT_EV_ADD, 6448c2ecf20Sopenharmony_ci FC_LPORT_EV_DEL, 6458c2ecf20Sopenharmony_ci}; 6468c2ecf20Sopenharmony_ci 6478c2ecf20Sopenharmony_ci/** 6488c2ecf20Sopenharmony_ci * struct fc_lport - Local port 6498c2ecf20Sopenharmony_ci * @host: The SCSI host associated with a local port 6508c2ecf20Sopenharmony_ci * @ema_list: Exchange manager anchor list 6518c2ecf20Sopenharmony_ci * @dns_rdata: The directory server remote port 6528c2ecf20Sopenharmony_ci * @ms_rdata: The management server remote port 6538c2ecf20Sopenharmony_ci * @ptp_rdata: Point to point remote port 6548c2ecf20Sopenharmony_ci * @scsi_priv: FCP layer internal data 6558c2ecf20Sopenharmony_ci * @disc: Discovery context 6568c2ecf20Sopenharmony_ci * @vports: Child vports if N_Port 6578c2ecf20Sopenharmony_ci * @vport: Parent vport if VN_Port 6588c2ecf20Sopenharmony_ci * @tt: Libfc function template 6598c2ecf20Sopenharmony_ci * @link_up: Link state (1 = link up, 0 = link down) 6608c2ecf20Sopenharmony_ci * @qfull: Queue state (1 queue is full, 0 queue is not full) 6618c2ecf20Sopenharmony_ci * @state: Identifies the state 6628c2ecf20Sopenharmony_ci * @boot_time: Timestamp indicating when the local port came online 6638c2ecf20Sopenharmony_ci * @host_stats: SCSI host statistics 6648c2ecf20Sopenharmony_ci * @stats: FC local port stats (TODO separate libfc LLD stats) 6658c2ecf20Sopenharmony_ci * @retry_count: Number of retries in the current state 6668c2ecf20Sopenharmony_ci * @port_id: FC Port ID 6678c2ecf20Sopenharmony_ci * @wwpn: World Wide Port Name 6688c2ecf20Sopenharmony_ci * @wwnn: World Wide Node Name 6698c2ecf20Sopenharmony_ci * @service_params: Common service parameters 6708c2ecf20Sopenharmony_ci * @e_d_tov: Error detection timeout value 6718c2ecf20Sopenharmony_ci * @r_a_tov: Resouce allocation timeout value 6728c2ecf20Sopenharmony_ci * @rnid_gen: RNID information 6738c2ecf20Sopenharmony_ci * @sg_supp: Indicates if scatter gather is supported 6748c2ecf20Sopenharmony_ci * @seq_offload: Indicates if sequence offload is supported 6758c2ecf20Sopenharmony_ci * @crc_offload: Indicates if CRC offload is supported 6768c2ecf20Sopenharmony_ci * @lro_enabled: Indicates if large receive offload is supported 6778c2ecf20Sopenharmony_ci * @does_npiv: Supports multiple vports 6788c2ecf20Sopenharmony_ci * @npiv_enabled: Switch/fabric allows NPIV 6798c2ecf20Sopenharmony_ci * @mfs: The maximum Fibre Channel payload size 6808c2ecf20Sopenharmony_ci * @max_retry_count: The maximum retry attempts 6818c2ecf20Sopenharmony_ci * @max_rport_retry_count: The maximum remote port retry attempts 6828c2ecf20Sopenharmony_ci * @rport_priv_size: Size needed by driver after struct fc_rport_priv 6838c2ecf20Sopenharmony_ci * @lro_xid: The maximum XID for LRO 6848c2ecf20Sopenharmony_ci * @lso_max: The maximum large offload send size 6858c2ecf20Sopenharmony_ci * @fcts: FC-4 type mask 6868c2ecf20Sopenharmony_ci * @lp_mutex: Mutex to protect the local port 6878c2ecf20Sopenharmony_ci * @list: Linkage on list of vport peers 6888c2ecf20Sopenharmony_ci * @retry_work: Handle to local port for delayed retry context 6898c2ecf20Sopenharmony_ci * @prov: Pointers available for use by passive FC-4 providers 6908c2ecf20Sopenharmony_ci * @lport_list: Linkage on module-wide list of local ports 6918c2ecf20Sopenharmony_ci */ 6928c2ecf20Sopenharmony_cistruct fc_lport { 6938c2ecf20Sopenharmony_ci /* Associations */ 6948c2ecf20Sopenharmony_ci struct Scsi_Host *host; 6958c2ecf20Sopenharmony_ci struct list_head ema_list; 6968c2ecf20Sopenharmony_ci struct fc_rport_priv *dns_rdata; 6978c2ecf20Sopenharmony_ci struct fc_rport_priv *ms_rdata; 6988c2ecf20Sopenharmony_ci struct fc_rport_priv *ptp_rdata; 6998c2ecf20Sopenharmony_ci void *scsi_priv; 7008c2ecf20Sopenharmony_ci struct fc_disc disc; 7018c2ecf20Sopenharmony_ci 7028c2ecf20Sopenharmony_ci /* Virtual port information */ 7038c2ecf20Sopenharmony_ci struct list_head vports; 7048c2ecf20Sopenharmony_ci struct fc_vport *vport; 7058c2ecf20Sopenharmony_ci 7068c2ecf20Sopenharmony_ci /* Operational Information */ 7078c2ecf20Sopenharmony_ci struct libfc_function_template tt; 7088c2ecf20Sopenharmony_ci u8 link_up; 7098c2ecf20Sopenharmony_ci u8 qfull; 7108c2ecf20Sopenharmony_ci u16 vlan; 7118c2ecf20Sopenharmony_ci enum fc_lport_state state; 7128c2ecf20Sopenharmony_ci unsigned long boot_time; 7138c2ecf20Sopenharmony_ci struct fc_host_statistics host_stats; 7148c2ecf20Sopenharmony_ci struct fc_stats __percpu *stats; 7158c2ecf20Sopenharmony_ci u8 retry_count; 7168c2ecf20Sopenharmony_ci 7178c2ecf20Sopenharmony_ci /* Fabric information */ 7188c2ecf20Sopenharmony_ci u32 port_id; 7198c2ecf20Sopenharmony_ci u64 wwpn; 7208c2ecf20Sopenharmony_ci u64 wwnn; 7218c2ecf20Sopenharmony_ci unsigned int service_params; 7228c2ecf20Sopenharmony_ci unsigned int e_d_tov; 7238c2ecf20Sopenharmony_ci unsigned int r_a_tov; 7248c2ecf20Sopenharmony_ci struct fc_els_rnid_gen rnid_gen; 7258c2ecf20Sopenharmony_ci 7268c2ecf20Sopenharmony_ci /* Capabilities */ 7278c2ecf20Sopenharmony_ci u32 sg_supp:1; 7288c2ecf20Sopenharmony_ci u32 seq_offload:1; 7298c2ecf20Sopenharmony_ci u32 crc_offload:1; 7308c2ecf20Sopenharmony_ci u32 lro_enabled:1; 7318c2ecf20Sopenharmony_ci u32 does_npiv:1; 7328c2ecf20Sopenharmony_ci u32 npiv_enabled:1; 7338c2ecf20Sopenharmony_ci u32 point_to_multipoint:1; 7348c2ecf20Sopenharmony_ci u32 fdmi_enabled:1; 7358c2ecf20Sopenharmony_ci u32 mfs; 7368c2ecf20Sopenharmony_ci u8 max_retry_count; 7378c2ecf20Sopenharmony_ci u8 max_rport_retry_count; 7388c2ecf20Sopenharmony_ci u16 rport_priv_size; 7398c2ecf20Sopenharmony_ci u16 link_speed; 7408c2ecf20Sopenharmony_ci u16 link_supported_speeds; 7418c2ecf20Sopenharmony_ci u16 lro_xid; 7428c2ecf20Sopenharmony_ci unsigned int lso_max; 7438c2ecf20Sopenharmony_ci struct fc_ns_fts fcts; 7448c2ecf20Sopenharmony_ci 7458c2ecf20Sopenharmony_ci /* Miscellaneous */ 7468c2ecf20Sopenharmony_ci struct mutex lp_mutex; 7478c2ecf20Sopenharmony_ci struct list_head list; 7488c2ecf20Sopenharmony_ci struct delayed_work retry_work; 7498c2ecf20Sopenharmony_ci void *prov[FC_FC4_PROV_SIZE]; 7508c2ecf20Sopenharmony_ci struct list_head lport_list; 7518c2ecf20Sopenharmony_ci}; 7528c2ecf20Sopenharmony_ci 7538c2ecf20Sopenharmony_ci/** 7548c2ecf20Sopenharmony_ci * struct fc4_prov - FC-4 provider registration 7558c2ecf20Sopenharmony_ci * @prli: Handler for incoming PRLI 7568c2ecf20Sopenharmony_ci * @prlo: Handler for session reset 7578c2ecf20Sopenharmony_ci * @recv: Handler for incoming request 7588c2ecf20Sopenharmony_ci * @module: Pointer to module. May be NULL. 7598c2ecf20Sopenharmony_ci */ 7608c2ecf20Sopenharmony_cistruct fc4_prov { 7618c2ecf20Sopenharmony_ci int (*prli)(struct fc_rport_priv *, u32 spp_len, 7628c2ecf20Sopenharmony_ci const struct fc_els_spp *spp_in, 7638c2ecf20Sopenharmony_ci struct fc_els_spp *spp_out); 7648c2ecf20Sopenharmony_ci void (*prlo)(struct fc_rport_priv *); 7658c2ecf20Sopenharmony_ci void (*recv)(struct fc_lport *, struct fc_frame *); 7668c2ecf20Sopenharmony_ci struct module *module; 7678c2ecf20Sopenharmony_ci}; 7688c2ecf20Sopenharmony_ci 7698c2ecf20Sopenharmony_ci/* 7708c2ecf20Sopenharmony_ci * Register FC-4 provider with libfc. 7718c2ecf20Sopenharmony_ci */ 7728c2ecf20Sopenharmony_ciint fc_fc4_register_provider(enum fc_fh_type type, struct fc4_prov *); 7738c2ecf20Sopenharmony_civoid fc_fc4_deregister_provider(enum fc_fh_type type, struct fc4_prov *); 7748c2ecf20Sopenharmony_ci 7758c2ecf20Sopenharmony_ci/* 7768c2ecf20Sopenharmony_ci * FC_LPORT HELPER FUNCTIONS 7778c2ecf20Sopenharmony_ci *****************************/ 7788c2ecf20Sopenharmony_ci 7798c2ecf20Sopenharmony_ci/** 7808c2ecf20Sopenharmony_ci * fc_lport_test_ready() - Determine if a local port is in the READY state 7818c2ecf20Sopenharmony_ci * @lport: The local port to test 7828c2ecf20Sopenharmony_ci */ 7838c2ecf20Sopenharmony_cistatic inline int fc_lport_test_ready(struct fc_lport *lport) 7848c2ecf20Sopenharmony_ci{ 7858c2ecf20Sopenharmony_ci return lport->state == LPORT_ST_READY; 7868c2ecf20Sopenharmony_ci} 7878c2ecf20Sopenharmony_ci 7888c2ecf20Sopenharmony_ci/** 7898c2ecf20Sopenharmony_ci * fc_set_wwnn() - Set the World Wide Node Name of a local port 7908c2ecf20Sopenharmony_ci * @lport: The local port whose WWNN is to be set 7918c2ecf20Sopenharmony_ci * @wwnn: The new WWNN 7928c2ecf20Sopenharmony_ci */ 7938c2ecf20Sopenharmony_cistatic inline void fc_set_wwnn(struct fc_lport *lport, u64 wwnn) 7948c2ecf20Sopenharmony_ci{ 7958c2ecf20Sopenharmony_ci lport->wwnn = wwnn; 7968c2ecf20Sopenharmony_ci} 7978c2ecf20Sopenharmony_ci 7988c2ecf20Sopenharmony_ci/** 7998c2ecf20Sopenharmony_ci * fc_set_wwpn() - Set the World Wide Port Name of a local port 8008c2ecf20Sopenharmony_ci * @lport: The local port whose WWPN is to be set 8018c2ecf20Sopenharmony_ci * @wwpn: The new WWPN 8028c2ecf20Sopenharmony_ci */ 8038c2ecf20Sopenharmony_cistatic inline void fc_set_wwpn(struct fc_lport *lport, u64 wwpn) 8048c2ecf20Sopenharmony_ci{ 8058c2ecf20Sopenharmony_ci lport->wwpn = wwpn; 8068c2ecf20Sopenharmony_ci} 8078c2ecf20Sopenharmony_ci 8088c2ecf20Sopenharmony_ci/** 8098c2ecf20Sopenharmony_ci * fc_lport_state_enter() - Change a local port's state 8108c2ecf20Sopenharmony_ci * @lport: The local port whose state is to change 8118c2ecf20Sopenharmony_ci * @state: The new state 8128c2ecf20Sopenharmony_ci */ 8138c2ecf20Sopenharmony_cistatic inline void fc_lport_state_enter(struct fc_lport *lport, 8148c2ecf20Sopenharmony_ci enum fc_lport_state state) 8158c2ecf20Sopenharmony_ci{ 8168c2ecf20Sopenharmony_ci if (state != lport->state) 8178c2ecf20Sopenharmony_ci lport->retry_count = 0; 8188c2ecf20Sopenharmony_ci lport->state = state; 8198c2ecf20Sopenharmony_ci} 8208c2ecf20Sopenharmony_ci 8218c2ecf20Sopenharmony_ci/** 8228c2ecf20Sopenharmony_ci * fc_lport_init_stats() - Allocate per-CPU statistics for a local port 8238c2ecf20Sopenharmony_ci * @lport: The local port whose statistics are to be initialized 8248c2ecf20Sopenharmony_ci */ 8258c2ecf20Sopenharmony_cistatic inline int fc_lport_init_stats(struct fc_lport *lport) 8268c2ecf20Sopenharmony_ci{ 8278c2ecf20Sopenharmony_ci lport->stats = alloc_percpu(struct fc_stats); 8288c2ecf20Sopenharmony_ci if (!lport->stats) 8298c2ecf20Sopenharmony_ci return -ENOMEM; 8308c2ecf20Sopenharmony_ci return 0; 8318c2ecf20Sopenharmony_ci} 8328c2ecf20Sopenharmony_ci 8338c2ecf20Sopenharmony_ci/** 8348c2ecf20Sopenharmony_ci * fc_lport_free_stats() - Free memory for a local port's statistics 8358c2ecf20Sopenharmony_ci * @lport: The local port whose statistics are to be freed 8368c2ecf20Sopenharmony_ci */ 8378c2ecf20Sopenharmony_cistatic inline void fc_lport_free_stats(struct fc_lport *lport) 8388c2ecf20Sopenharmony_ci{ 8398c2ecf20Sopenharmony_ci free_percpu(lport->stats); 8408c2ecf20Sopenharmony_ci} 8418c2ecf20Sopenharmony_ci 8428c2ecf20Sopenharmony_ci/** 8438c2ecf20Sopenharmony_ci * lport_priv() - Return the private data from a local port 8448c2ecf20Sopenharmony_ci * @lport: The local port whose private data is to be retreived 8458c2ecf20Sopenharmony_ci */ 8468c2ecf20Sopenharmony_cistatic inline void *lport_priv(const struct fc_lport *lport) 8478c2ecf20Sopenharmony_ci{ 8488c2ecf20Sopenharmony_ci return (void *)(lport + 1); 8498c2ecf20Sopenharmony_ci} 8508c2ecf20Sopenharmony_ci 8518c2ecf20Sopenharmony_ci/** 8528c2ecf20Sopenharmony_ci * libfc_host_alloc() - Allocate a Scsi_Host with room for a local port and 8538c2ecf20Sopenharmony_ci * LLD private data 8548c2ecf20Sopenharmony_ci * @sht: The SCSI host template 8558c2ecf20Sopenharmony_ci * @priv_size: Size of private data 8568c2ecf20Sopenharmony_ci * 8578c2ecf20Sopenharmony_ci * Returns: libfc lport 8588c2ecf20Sopenharmony_ci */ 8598c2ecf20Sopenharmony_cistatic inline struct fc_lport * 8608c2ecf20Sopenharmony_cilibfc_host_alloc(struct scsi_host_template *sht, int priv_size) 8618c2ecf20Sopenharmony_ci{ 8628c2ecf20Sopenharmony_ci struct fc_lport *lport; 8638c2ecf20Sopenharmony_ci struct Scsi_Host *shost; 8648c2ecf20Sopenharmony_ci 8658c2ecf20Sopenharmony_ci shost = scsi_host_alloc(sht, sizeof(*lport) + priv_size); 8668c2ecf20Sopenharmony_ci if (!shost) 8678c2ecf20Sopenharmony_ci return NULL; 8688c2ecf20Sopenharmony_ci lport = shost_priv(shost); 8698c2ecf20Sopenharmony_ci lport->host = shost; 8708c2ecf20Sopenharmony_ci INIT_LIST_HEAD(&lport->ema_list); 8718c2ecf20Sopenharmony_ci INIT_LIST_HEAD(&lport->vports); 8728c2ecf20Sopenharmony_ci return lport; 8738c2ecf20Sopenharmony_ci} 8748c2ecf20Sopenharmony_ci 8758c2ecf20Sopenharmony_ci/* 8768c2ecf20Sopenharmony_ci * FC_FCP HELPER FUNCTIONS 8778c2ecf20Sopenharmony_ci *****************************/ 8788c2ecf20Sopenharmony_cistatic inline bool fc_fcp_is_read(const struct fc_fcp_pkt *fsp) 8798c2ecf20Sopenharmony_ci{ 8808c2ecf20Sopenharmony_ci if (fsp && fsp->cmd) 8818c2ecf20Sopenharmony_ci return fsp->cmd->sc_data_direction == DMA_FROM_DEVICE; 8828c2ecf20Sopenharmony_ci return false; 8838c2ecf20Sopenharmony_ci} 8848c2ecf20Sopenharmony_ci 8858c2ecf20Sopenharmony_ci/* 8868c2ecf20Sopenharmony_ci * LOCAL PORT LAYER 8878c2ecf20Sopenharmony_ci *****************************/ 8888c2ecf20Sopenharmony_ciint fc_lport_init(struct fc_lport *); 8898c2ecf20Sopenharmony_ciint fc_lport_destroy(struct fc_lport *); 8908c2ecf20Sopenharmony_ciint fc_fabric_logoff(struct fc_lport *); 8918c2ecf20Sopenharmony_ciint fc_fabric_login(struct fc_lport *); 8928c2ecf20Sopenharmony_civoid __fc_linkup(struct fc_lport *); 8938c2ecf20Sopenharmony_civoid fc_linkup(struct fc_lport *); 8948c2ecf20Sopenharmony_civoid __fc_linkdown(struct fc_lport *); 8958c2ecf20Sopenharmony_civoid fc_linkdown(struct fc_lport *); 8968c2ecf20Sopenharmony_civoid fc_vport_setlink(struct fc_lport *); 8978c2ecf20Sopenharmony_civoid fc_vports_linkchange(struct fc_lport *); 8988c2ecf20Sopenharmony_ciint fc_lport_config(struct fc_lport *); 8998c2ecf20Sopenharmony_ciint fc_lport_reset(struct fc_lport *); 9008c2ecf20Sopenharmony_civoid fc_lport_recv(struct fc_lport *lport, struct fc_frame *fp); 9018c2ecf20Sopenharmony_ciint fc_set_mfs(struct fc_lport *, u32 mfs); 9028c2ecf20Sopenharmony_cistruct fc_lport *libfc_vport_create(struct fc_vport *, int privsize); 9038c2ecf20Sopenharmony_cistruct fc_lport *fc_vport_id_lookup(struct fc_lport *, u32 port_id); 9048c2ecf20Sopenharmony_ciint fc_lport_bsg_request(struct bsg_job *); 9058c2ecf20Sopenharmony_civoid fc_lport_set_local_id(struct fc_lport *, u32 port_id); 9068c2ecf20Sopenharmony_civoid fc_lport_iterate(void (*func)(struct fc_lport *, void *), void *); 9078c2ecf20Sopenharmony_ci 9088c2ecf20Sopenharmony_ci/* 9098c2ecf20Sopenharmony_ci * REMOTE PORT LAYER 9108c2ecf20Sopenharmony_ci *****************************/ 9118c2ecf20Sopenharmony_civoid fc_rport_terminate_io(struct fc_rport *); 9128c2ecf20Sopenharmony_cistruct fc_rport_priv *fc_rport_lookup(const struct fc_lport *lport, 9138c2ecf20Sopenharmony_ci u32 port_id); 9148c2ecf20Sopenharmony_cistruct fc_rport_priv *fc_rport_create(struct fc_lport *, u32); 9158c2ecf20Sopenharmony_civoid fc_rport_destroy(struct kref *kref); 9168c2ecf20Sopenharmony_ciint fc_rport_login(struct fc_rport_priv *rdata); 9178c2ecf20Sopenharmony_ciint fc_rport_logoff(struct fc_rport_priv *rdata); 9188c2ecf20Sopenharmony_civoid fc_rport_recv_req(struct fc_lport *lport, struct fc_frame *fp); 9198c2ecf20Sopenharmony_civoid fc_rport_flush_queue(void); 9208c2ecf20Sopenharmony_ci 9218c2ecf20Sopenharmony_ci/* 9228c2ecf20Sopenharmony_ci * DISCOVERY LAYER 9238c2ecf20Sopenharmony_ci *****************************/ 9248c2ecf20Sopenharmony_civoid fc_disc_init(struct fc_lport *); 9258c2ecf20Sopenharmony_civoid fc_disc_config(struct fc_lport *, void *); 9268c2ecf20Sopenharmony_ci 9278c2ecf20Sopenharmony_cistatic inline struct fc_lport *fc_disc_lport(struct fc_disc *disc) 9288c2ecf20Sopenharmony_ci{ 9298c2ecf20Sopenharmony_ci return container_of(disc, struct fc_lport, disc); 9308c2ecf20Sopenharmony_ci} 9318c2ecf20Sopenharmony_ci 9328c2ecf20Sopenharmony_ci/* 9338c2ecf20Sopenharmony_ci * FCP LAYER 9348c2ecf20Sopenharmony_ci *****************************/ 9358c2ecf20Sopenharmony_ciint fc_fcp_init(struct fc_lport *); 9368c2ecf20Sopenharmony_civoid fc_fcp_destroy(struct fc_lport *); 9378c2ecf20Sopenharmony_ci 9388c2ecf20Sopenharmony_ci/* 9398c2ecf20Sopenharmony_ci * SCSI INTERACTION LAYER 9408c2ecf20Sopenharmony_ci *****************************/ 9418c2ecf20Sopenharmony_ciint fc_queuecommand(struct Scsi_Host *, struct scsi_cmnd *); 9428c2ecf20Sopenharmony_ciint fc_eh_abort(struct scsi_cmnd *); 9438c2ecf20Sopenharmony_ciint fc_eh_device_reset(struct scsi_cmnd *); 9448c2ecf20Sopenharmony_ciint fc_eh_host_reset(struct scsi_cmnd *); 9458c2ecf20Sopenharmony_ciint fc_slave_alloc(struct scsi_device *); 9468c2ecf20Sopenharmony_ci 9478c2ecf20Sopenharmony_ci/* 9488c2ecf20Sopenharmony_ci * ELS/CT interface 9498c2ecf20Sopenharmony_ci *****************************/ 9508c2ecf20Sopenharmony_ciint fc_elsct_init(struct fc_lport *); 9518c2ecf20Sopenharmony_cistruct fc_seq *fc_elsct_send(struct fc_lport *, u32 did, 9528c2ecf20Sopenharmony_ci struct fc_frame *, 9538c2ecf20Sopenharmony_ci unsigned int op, 9548c2ecf20Sopenharmony_ci void (*resp)(struct fc_seq *, 9558c2ecf20Sopenharmony_ci struct fc_frame *, 9568c2ecf20Sopenharmony_ci void *arg), 9578c2ecf20Sopenharmony_ci void *arg, u32 timer_msec); 9588c2ecf20Sopenharmony_civoid fc_lport_flogi_resp(struct fc_seq *, struct fc_frame *, void *); 9598c2ecf20Sopenharmony_civoid fc_lport_logo_resp(struct fc_seq *, struct fc_frame *, void *); 9608c2ecf20Sopenharmony_civoid fc_fill_reply_hdr(struct fc_frame *, const struct fc_frame *, 9618c2ecf20Sopenharmony_ci enum fc_rctl, u32 parm_offset); 9628c2ecf20Sopenharmony_civoid fc_fill_hdr(struct fc_frame *, const struct fc_frame *, 9638c2ecf20Sopenharmony_ci enum fc_rctl, u32 f_ctl, u16 seq_cnt, u32 parm_offset); 9648c2ecf20Sopenharmony_ci 9658c2ecf20Sopenharmony_ci 9668c2ecf20Sopenharmony_ci/* 9678c2ecf20Sopenharmony_ci * EXCHANGE MANAGER LAYER 9688c2ecf20Sopenharmony_ci *****************************/ 9698c2ecf20Sopenharmony_ciint fc_exch_init(struct fc_lport *); 9708c2ecf20Sopenharmony_civoid fc_exch_update_stats(struct fc_lport *lport); 9718c2ecf20Sopenharmony_cistruct fc_seq *fc_exch_seq_send(struct fc_lport *lport, 9728c2ecf20Sopenharmony_ci struct fc_frame *fp, 9738c2ecf20Sopenharmony_ci void (*resp)(struct fc_seq *, 9748c2ecf20Sopenharmony_ci struct fc_frame *fp, 9758c2ecf20Sopenharmony_ci void *arg), 9768c2ecf20Sopenharmony_ci void (*destructor)(struct fc_seq *, void *), 9778c2ecf20Sopenharmony_ci void *arg, u32 timer_msec); 9788c2ecf20Sopenharmony_civoid fc_seq_els_rsp_send(struct fc_frame *, enum fc_els_cmd, 9798c2ecf20Sopenharmony_ci struct fc_seq_els_data *); 9808c2ecf20Sopenharmony_cistruct fc_seq *fc_seq_start_next(struct fc_seq *sp); 9818c2ecf20Sopenharmony_civoid fc_seq_set_resp(struct fc_seq *sp, 9828c2ecf20Sopenharmony_ci void (*resp)(struct fc_seq *, struct fc_frame *, void *), 9838c2ecf20Sopenharmony_ci void *arg); 9848c2ecf20Sopenharmony_cistruct fc_seq *fc_seq_assign(struct fc_lport *lport, struct fc_frame *fp); 9858c2ecf20Sopenharmony_civoid fc_seq_release(struct fc_seq *sp); 9868c2ecf20Sopenharmony_cistruct fc_exch_mgr_anchor *fc_exch_mgr_add(struct fc_lport *, 9878c2ecf20Sopenharmony_ci struct fc_exch_mgr *, 9888c2ecf20Sopenharmony_ci bool (*match)(struct fc_frame *)); 9898c2ecf20Sopenharmony_civoid fc_exch_mgr_del(struct fc_exch_mgr_anchor *); 9908c2ecf20Sopenharmony_ciint fc_exch_mgr_list_clone(struct fc_lport *src, struct fc_lport *dst); 9918c2ecf20Sopenharmony_cistruct fc_exch_mgr *fc_exch_mgr_alloc(struct fc_lport *, enum fc_class class, 9928c2ecf20Sopenharmony_ci u16 min_xid, u16 max_xid, 9938c2ecf20Sopenharmony_ci bool (*match)(struct fc_frame *)); 9948c2ecf20Sopenharmony_civoid fc_exch_mgr_free(struct fc_lport *); 9958c2ecf20Sopenharmony_civoid fc_exch_recv(struct fc_lport *, struct fc_frame *); 9968c2ecf20Sopenharmony_civoid fc_exch_mgr_reset(struct fc_lport *, u32 s_id, u32 d_id); 9978c2ecf20Sopenharmony_ciint fc_seq_send(struct fc_lport *lport, struct fc_seq *sp, struct fc_frame *fp); 9988c2ecf20Sopenharmony_ciint fc_seq_exch_abort(const struct fc_seq *, unsigned int timer_msec); 9998c2ecf20Sopenharmony_civoid fc_exch_done(struct fc_seq *sp); 10008c2ecf20Sopenharmony_ci 10018c2ecf20Sopenharmony_ci/* 10028c2ecf20Sopenharmony_ci * Functions for fc_functions_template 10038c2ecf20Sopenharmony_ci */ 10048c2ecf20Sopenharmony_civoid fc_get_host_speed(struct Scsi_Host *); 10058c2ecf20Sopenharmony_civoid fc_get_host_port_state(struct Scsi_Host *); 10068c2ecf20Sopenharmony_civoid fc_set_rport_loss_tmo(struct fc_rport *, u32 timeout); 10078c2ecf20Sopenharmony_cistruct fc_host_statistics *fc_get_host_stats(struct Scsi_Host *); 10088c2ecf20Sopenharmony_ci 10098c2ecf20Sopenharmony_ci#endif /* _LIBFC_H_ */ 1010