brintos

brintos / linux-shallow public Read only

0
0
Text · 31.6 KiB · 4a9b416 Raw
1031 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Copyright(c) 2007 Intel Corporation. All rights reserved.4 *5 * Maintained at www.Open-FCoE.org6 */7 8#ifndef _LIBFC_H_9#define _LIBFC_H_10 11#include <linux/timer.h>12#include <linux/if.h>13#include <linux/percpu.h>14#include <linux/refcount.h>15 16#include <scsi/scsi_transport.h>17#include <scsi/scsi_transport_fc.h>18#include <scsi/scsi_bsg_fc.h>19 20#include <scsi/fc/fc_fcp.h>21#include <scsi/fc/fc_ns.h>22#include <scsi/fc/fc_ms.h>23#include <scsi/fc/fc_els.h>24#include <scsi/fc/fc_gs.h>25 26#include <scsi/fc_frame.h>27 28#define	FC_FC4_PROV_SIZE	(FC_TYPE_FCP + 1)	/* size of tables */29 30/*31 * libfc error codes32 */33#define	FC_NO_ERR	0	/* no error */34#define	FC_EX_TIMEOUT	1	/* Exchange timeout */35#define	FC_EX_CLOSED	2	/* Exchange closed */36#define FC_EX_ALLOC_ERR	3	/* Exchange allocation failed */37#define FC_EX_XMIT_ERR	4	/* Exchange transmit failed */38#define FC_EX_ELS_RJT	5	/* ELS rejected */39#define FC_EX_INV_LOGIN	6	/* Login not completed */40#define FC_EX_SEQ_ERR	6	/* Exchange sequence error */41 42/**43 * enum fc_lport_state - Local port states44 * @LPORT_ST_DISABLED: Disabled45 * @LPORT_ST_FLOGI:    Fabric login (FLOGI) sent46 * @LPORT_ST_DNS:      Waiting for name server remote port to become ready47 * @LPORT_ST_RNN_ID:   Register port name by ID (RNN_ID) sent48 * @LPORT_ST_RSNN_NN:  Waiting for host symbolic node name49 * @LPORT_ST_RSPN_ID:  Waiting for host symbolic port name50 * @LPORT_ST_RFT_ID:   Register Fibre Channel types by ID (RFT_ID) sent51 * @LPORT_ST_RFF_ID:   Register FC-4 Features by ID (RFF_ID) sent52 * @LPORT_ST_FDMI:     Waiting for mgmt server rport to become ready53 * @LPORT_ST_RHBA:     Register HBA54 * @LPORT_ST_RPA:      Register Port Attributes55 * @LPORT_ST_DHBA:     Deregister HBA56 * @LPORT_ST_DPRT:     Deregister Port57 * @LPORT_ST_SCR:      State Change Register (SCR) sent58 * @LPORT_ST_READY:    Ready for use59 * @LPORT_ST_LOGO:     Local port logout (LOGO) sent60 * @LPORT_ST_RESET:    Local port reset61 */62enum fc_lport_state {63	LPORT_ST_DISABLED = 0,64	LPORT_ST_FLOGI,65	LPORT_ST_DNS,66	LPORT_ST_RNN_ID,67	LPORT_ST_RSNN_NN,68	LPORT_ST_RSPN_ID,69	LPORT_ST_RFT_ID,70	LPORT_ST_RFF_ID,71	LPORT_ST_FDMI,72	LPORT_ST_RHBA,73	LPORT_ST_RPA,74	LPORT_ST_DHBA,75	LPORT_ST_DPRT,76	LPORT_ST_SCR,77	LPORT_ST_READY,78	LPORT_ST_LOGO,79	LPORT_ST_RESET80};81 82enum fc_disc_event {83	DISC_EV_NONE = 0,84	DISC_EV_SUCCESS,85	DISC_EV_FAILED86};87 88/**89 * enum fc_rport_state - Remote port states90 * @RPORT_ST_INIT:    Initialized91 * @RPORT_ST_FLOGI:   Waiting for FLOGI completion for point-to-multipoint92 * @RPORT_ST_PLOGI_WAIT:   Waiting for peer to login for point-to-multipoint93 * @RPORT_ST_PLOGI:   Waiting for PLOGI completion94 * @RPORT_ST_PRLI:    Waiting for PRLI completion95 * @RPORT_ST_RTV:     Waiting for RTV completion96 * @RPORT_ST_READY:   Ready for use97 * @RPORT_ST_ADISC:   Discover Address sent98 * @RPORT_ST_DELETE:  Remote port being deleted99*/100enum fc_rport_state {101	RPORT_ST_INIT,102	RPORT_ST_FLOGI,103	RPORT_ST_PLOGI_WAIT,104	RPORT_ST_PLOGI,105	RPORT_ST_PRLI,106	RPORT_ST_RTV,107	RPORT_ST_READY,108	RPORT_ST_ADISC,109	RPORT_ST_DELETE,110};111 112/**113 * struct fc_disc_port - temporary discovery port to hold rport identifiers114 * @lp:         Fibre Channel host port instance115 * @peers:      Node for list management during discovery and RSCN processing116 * @rport_work: Work struct for starting the rport state machine117 * @port_id:    Port ID of the discovered port118 */119struct fc_disc_port {120	struct fc_lport    *lp;121	struct list_head   peers;122	struct work_struct rport_work;123	u32		   port_id;124};125 126/**127 * enum fc_rport_event - Remote port events128 * @RPORT_EV_NONE:   No event129 * @RPORT_EV_READY:  Remote port is ready for use130 * @RPORT_EV_FAILED: State machine failed, remote port is not ready131 * @RPORT_EV_STOP:   Remote port has been stopped132 * @RPORT_EV_LOGO:   Remote port logout (LOGO) sent133 */134enum fc_rport_event {135	RPORT_EV_NONE = 0,136	RPORT_EV_READY,137	RPORT_EV_FAILED,138	RPORT_EV_STOP,139	RPORT_EV_LOGO140};141 142struct fc_rport_priv;143 144/**145 * struct fc_rport_operations - Operations for a remote port146 * @event_callback: Function to be called for remote port events147 */148struct fc_rport_operations {149	void (*event_callback)(struct fc_lport *, struct fc_rport_priv *,150			       enum fc_rport_event);151};152 153/**154 * struct fc_rport_libfc_priv - libfc internal information about a remote port155 * @local_port: The associated local port156 * @rp_state:   Indicates READY for I/O or DELETE when blocked157 * @flags:      REC and RETRY supported flags158 * @e_d_tov:    Error detect timeout value (in msec)159 * @r_a_tov:    Resource allocation timeout value (in msec)160 */161struct fc_rport_libfc_priv {162	struct fc_lport		   *local_port;163	enum fc_rport_state	   rp_state;164	u16			   flags;165	#define FC_RP_FLAGS_REC_SUPPORTED	(1 << 0)166	#define FC_RP_FLAGS_RETRY		(1 << 1)167	#define FC_RP_STARTED			(1 << 2)168	#define FC_RP_FLAGS_CONF_REQ		(1 << 3)169	unsigned int		   e_d_tov;170	unsigned int		   r_a_tov;171};172 173/**174 * struct fc_rport_priv - libfc remote port and discovery info175 * @local_port:     The associated local port176 * @rport:          The FC transport remote port177 * @kref:           Reference counter178 * @rp_state:       Enumeration that tracks progress of PLOGI, PRLI,179 *                  and RTV exchanges180 * @ids:            The remote port identifiers and roles181 * @flags:          STARTED, REC and RETRY_SUPPORTED flags182 * @max_seq:        Maximum number of concurrent sequences183 * @disc_id:        The discovery identifier184 * @maxframe_size:  The maximum frame size185 * @retries:        The retry count for the current state186 * @major_retries:  The retry count for the entire PLOGI/PRLI state machine187 * @e_d_tov:        Error detect timeout value (in msec)188 * @r_a_tov:        Resource allocation timeout value (in msec)189 * @rp_mutex:       The mutex that protects the remote port190 * @retry_work:     Handle for retries191 * @lld_event_callback: Callback when READY, FAILED or LOGO states complete192 * @prli_count:     Count of open PRLI sessions in providers193 * @rcu:	    Structure used for freeing in an RCU-safe manner194 */195struct fc_rport_priv {196	struct fc_lport		    *local_port;197	struct fc_rport		    *rport;198	struct kref		    kref;199	enum fc_rport_state	    rp_state;200	struct fc_rport_identifiers ids;201	u16			    flags;202	u16			    max_seq;203	u16			    disc_id;204	u16			    maxframe_size;205	unsigned int		    retries;206	unsigned int		    major_retries;207	unsigned int		    e_d_tov;208	unsigned int		    r_a_tov;209	struct mutex		    rp_mutex;210	struct delayed_work	    retry_work;211	enum fc_rport_event	    event;212	struct fc_rport_operations  *ops;213	struct list_head	    peers;214	struct work_struct	    event_work;215	u32			    supported_classes;216	u16			    prli_count;217	struct rcu_head		    rcu;218	u16			    sp_features;219	u8			    spp_type;220	void			    (*lld_event_callback)(struct fc_lport *,221						      struct fc_rport_priv *,222						      enum fc_rport_event);223};224 225/**226 * struct fc_stats - fc stats structure227 * @SecondsSinceLastReset: Seconds since the last reset228 * @TxFrames:              Number of transmitted frames229 * @TxWords:               Number of transmitted words230 * @RxFrames:              Number of received frames231 * @RxWords:               Number of received words232 * @ErrorFrames:           Number of received error frames233 * @DumpedFrames:          Number of dumped frames234 * @FcpPktAllocFails:      Number of fcp packet allocation failures235 * @FcpPktAborts:          Number of fcp packet aborts236 * @FcpFrameAllocFails:    Number of fcp frame allocation failures237 * @LinkFailureCount:      Number of link failures238 * @LossOfSignalCount:     Number for signal losses239 * @InvalidTxWordCount:    Number of invalid transmitted words240 * @InvalidCRCCount:       Number of invalid CRCs241 * @InputRequests:         Number of input requests242 * @OutputRequests:        Number of output requests243 * @ControlRequests:       Number of control requests244 * @InputBytes:            Number of received bytes245 * @OutputBytes:           Number of transmitted bytes246 * @VLinkFailureCount:     Number of virtual link failures247 * @MissDiscAdvCount:      Number of missing FIP discovery advertisement248 */249struct fc_stats {250	u64		SecondsSinceLastReset;251	u64		TxFrames;252	u64		TxWords;253	u64		RxFrames;254	u64		RxWords;255	u64		ErrorFrames;256	u64		DumpedFrames;257	u64		FcpPktAllocFails;258	u64		FcpPktAborts;259	u64		FcpFrameAllocFails;260	u64		LinkFailureCount;261	u64		LossOfSignalCount;262	u64		InvalidTxWordCount;263	u64		InvalidCRCCount;264	u64		InputRequests;265	u64		OutputRequests;266	u64		ControlRequests;267	u64		InputBytes;268	u64		OutputBytes;269	u64		VLinkFailureCount;270	u64		MissDiscAdvCount;271};272 273/**274 * struct fc_seq_els_data - ELS data used for passing ELS specific responses275 * @reason: The reason for rejection276 * @explan: The explanation of the rejection277 *278 * Mainly used by the exchange manager layer.279 */280struct fc_seq_els_data {281	enum fc_els_rjt_reason reason;282	enum fc_els_rjt_explan explan;283};284 285/**286 * struct fc_fcp_pkt - FCP request structure (one for each scsi_cmnd request)287 * @lp:              The associated local port288 * @state:           The state of the I/O289 * @ref_cnt:         Reference count290 * @scsi_pkt_lock:   Lock to protect the SCSI packet (must be taken before the291 *                   host_lock if both are to be held at the same time)292 * @cmd:             The SCSI command (set and clear with the host_lock held)293 * @list:            Tracks queued commands (accessed with the host_lock held)294 * @timer:           The command timer295 * @tm_done:         Completion indicator296 * @wait_for_comp:   Indicator to wait for completion of the I/O (in jiffies)297 * @timer_delay:     FCP packet timer delay in jiffies298 * @data_len:        The length of the data299 * @cdb_cmd:         The CDB command300 * @xfer_len:        The transfer length301 * @xfer_ddp:        Indicates if this transfer used DDP (XID of the exchange302 *                   will be set here if DDP was setup)303 * @xfer_contig_end: The offset into the buffer if the buffer is contiguous304 *                   (Tx and Rx)305 * @max_payload:     The maximum payload size (in bytes)306 * @io_status:       SCSI result (upper 24 bits)307 * @cdb_status:      CDB status308 * @status_code:     FCP I/O status309 * @scsi_comp_flags: Completion flags (bit 3 Underrun bit 2: overrun)310 * @req_flags:       Request flags (bit 0: read bit:1 write)311 * @scsi_resid:      SCSI residule length312 * @rport:           The remote port that the SCSI command is targeted at313 * @seq_ptr:         The sequence that will carry the SCSI command314 * @recov_retry:     Number of recovery retries315 * @recov_seq:       The sequence for REC or SRR316 */317struct fc_fcp_pkt {318	spinlock_t	  scsi_pkt_lock;319	refcount_t	  ref_cnt;320 321	/* SCSI command and data transfer information */322	u32		  data_len;323 324	/* SCSI I/O related information */325	struct scsi_cmnd  *cmd;326	struct list_head  list;327 328	/* Housekeeping information */329	struct fc_lport   *lp;330	u8		  state;331 332	/* SCSI/FCP return status */333	u8		  cdb_status;334	u8		  status_code;335	u8		  scsi_comp_flags;336	u32		  io_status;337	u32		  req_flags;338	u32		  scsi_resid;339 340	/* Transport related veriables */341	size_t		  xfer_len;342	struct fcp_cmnd   cdb_cmd;343	u32		  xfer_contig_end;344	u16		  max_payload;345	u16		  xfer_ddp;346 347	/* Associated structures */348	struct fc_rport	  *rport;349	struct fc_seq	  *seq_ptr;350 351	/* Timeout/error related information */352	struct timer_list timer;353	int		  wait_for_comp;354	int		  timer_delay;355	u32		  recov_retry;356	struct fc_seq	  *recov_seq;357	struct completion tm_done;358} ____cacheline_aligned_in_smp;359 360/*361 * @fsp should be tested and set under the scsi_pkt_queue lock362 */363struct libfc_cmd_priv {364	struct fc_fcp_pkt *fsp;365	u32 resid_len;366	u8 status;367};368 369/*370 * Structure and function definitions for managing Fibre Channel Exchanges371 * and Sequences372 *373 * fc_exch holds state for one exchange and links to its active sequence.374 *375 * fc_seq holds the state for an individual sequence.376 */377 378struct fc_exch_mgr;379struct fc_exch_mgr_anchor;380extern u16 fc_cpu_mask;	/* cpu mask for possible cpus */381 382/**383 * struct fc_seq - FC sequence384 * @id:       The sequence ID385 * @ssb_stat: Status flags for the sequence status block (SSB)386 * @cnt:      Number of frames sent so far387 * @rec_data: FC-4 value for REC388 */389struct fc_seq {390	u8  id;391	u16 ssb_stat;392	u16 cnt;393	u32 rec_data;394};395 396#define FC_EX_DONE		(1 << 0) /* ep is completed */397#define FC_EX_RST_CLEANUP	(1 << 1) /* reset is forcing completion */398#define FC_EX_QUARANTINE	(1 << 2) /* exch is quarantined */399 400/**401 * struct fc_exch - Fibre Channel Exchange402 * @em:           Exchange manager403 * @pool:         Exchange pool404 * @state:        The exchange's state405 * @xid:          The exchange ID406 * @ex_list:      Handle used by the EM to track free exchanges407 * @ex_lock:      Lock that protects the exchange408 * @ex_refcnt:    Reference count409 * @timeout_work: Handle for timeout handler410 * @lp:           The local port that this exchange is on411 * @oxid:         Originator's exchange ID412 * @rxid:         Responder's exchange ID413 * @oid:          Originator's FCID414 * @sid:          Source FCID415 * @did:          Destination FCID416 * @esb_stat:     ESB exchange status417 * @r_a_tov:      Resource allocation time out value (in msecs)418 * @seq_id:       The next sequence ID to use419 * @encaps:       encapsulation information for lower-level driver420 * @f_ctl:        F_CTL flags for the sequence421 * @fh_type:      The frame type422 * @class:        The class of service423 * @seq:          The sequence in use on this exchange424 * @resp_active:  Number of tasks that are concurrently executing @resp().425 * @resp_task:    If @resp_active > 0, either the task executing @resp(), the426 *                task that has been interrupted to execute the soft-IRQ427 *                executing @resp() or NULL if more than one task is executing428 *                @resp concurrently.429 * @resp_wq:      Waitqueue for the tasks waiting on @resp_active.430 * @resp:         Callback for responses on this exchange431 * @destructor:   Called when destroying the exchange432 * @arg:          Passed as a void pointer to the resp() callback433 *434 * Locking notes: The ex_lock protects following items:435 *	state, esb_stat, f_ctl, seq.ssb_stat436 *	seq_id437 *	sequence allocation438 */439struct fc_exch {440	spinlock_t	    ex_lock;441	atomic_t	    ex_refcnt;442	enum fc_class	    class;443	struct fc_exch_mgr  *em;444	struct fc_exch_pool *pool;445	struct list_head    ex_list;446	struct fc_lport	    *lp;447	u32		    esb_stat;448	u8		    state;449	u8		    fh_type;450	u8		    seq_id;451	u8		    encaps;452	u16		    xid;453	u16		    oxid;454	u16		    rxid;455	u32		    oid;456	u32		    sid;457	u32		    did;458	u32		    r_a_tov;459	u32		    f_ctl;460	struct fc_seq       seq;461	int		    resp_active;462	struct task_struct  *resp_task;463	wait_queue_head_t   resp_wq;464	void		    (*resp)(struct fc_seq *, struct fc_frame *, void *);465	void		    *arg;466	void		    (*destructor)(struct fc_seq *, void *);467	struct delayed_work timeout_work;468} ____cacheline_aligned_in_smp;469#define	fc_seq_exch(sp) container_of(sp, struct fc_exch, seq)470 471 472struct libfc_function_template {473	/*474	 * Interface to send a FC frame475	 *476	 * STATUS: REQUIRED477	 */478	int (*frame_send)(struct fc_lport *, struct fc_frame *);479 480	/*481	 * Interface to send ELS/CT frames482	 *483	 * STATUS: OPTIONAL484	 */485	struct fc_seq *(*elsct_send)(struct fc_lport *, u32 did,486				     struct fc_frame *, unsigned int op,487				     void (*resp)(struct fc_seq *,488					     struct fc_frame *, void *arg),489				     void *arg, u32 timer_msec);490 491	/*492	 * Sets up the DDP context for a given exchange id on the given493	 * scatterlist if LLD supports DDP for large receive.494	 *495	 * STATUS: OPTIONAL496	 */497	int (*ddp_setup)(struct fc_lport *, u16, struct scatterlist *,498			 unsigned int);499	/*500	 * Completes the DDP transfer and returns the length of data DDPed501	 * for the given exchange id.502	 *503	 * STATUS: OPTIONAL504	 */505	int (*ddp_done)(struct fc_lport *, u16);506	/*507	 * Sets up the DDP context for a given exchange id on the given508	 * scatterlist if LLD supports DDP for target.509	 *510	 * STATUS: OPTIONAL511	 */512	int (*ddp_target)(struct fc_lport *, u16, struct scatterlist *,513			  unsigned int);514	/*515	 * Allow LLD to fill its own Link Error Status Block516	 *517	 * STATUS: OPTIONAL518	 */519	void (*get_lesb)(struct fc_lport *, struct fc_els_lesb *lesb);520 521	/*522	 * Reset an exchange manager, completing all sequences and exchanges.523	 * If s_id is non-zero, reset only exchanges originating from that FID.524	 * If d_id is non-zero, reset only exchanges sending to that FID.525	 *526	 * STATUS: OPTIONAL527	 */528	void (*exch_mgr_reset)(struct fc_lport *, u32 s_id, u32 d_id);529 530	/*531	 * Set the local port FC_ID.532	 *533	 * This may be provided by the LLD to allow it to be534	 * notified when the local port is assigned a FC-ID.535	 *536	 * The frame, if non-NULL, is the incoming frame with the537	 * FLOGI LS_ACC or FLOGI, and may contain the granted MAC538	 * address for the LLD.  The frame pointer may be NULL if539	 * no MAC is associated with this assignment (LOGO or PLOGI).540	 *541	 * If FC_ID is non-zero, r_a_tov and e_d_tov must be valid.542	 *543	 * Note: this is called with the local port mutex held.544	 *545	 * STATUS: OPTIONAL546	 */547	void (*lport_set_port_id)(struct fc_lport *, u32 port_id,548				  struct fc_frame *);549 550	/*551	 * Callback routine after the remote port is logged in552	 *553	 * STATUS: OPTIONAL554	 */555	void (*rport_event_callback)(struct fc_lport *,556				     struct fc_rport_priv *,557				     enum fc_rport_event);558 559	/*560	 * Send a fcp cmd from fsp pkt.561	 * Called with the SCSI host lock unlocked and irqs disabled.562	 *563	 * The resp handler is called when FCP_RSP received.564	 *565	 * STATUS: OPTIONAL566	 */567	int (*fcp_cmd_send)(struct fc_lport *, struct fc_fcp_pkt *,568			    void (*resp)(struct fc_seq *, struct fc_frame *,569					 void *));570 571	/*572	 * Cleanup the FCP layer, used during link down and reset573	 *574	 * STATUS: OPTIONAL575	 */576	void (*fcp_cleanup)(struct fc_lport *);577 578	/*579	 * Abort all I/O on a local port580	 *581	 * STATUS: OPTIONAL582	 */583	void (*fcp_abort_io)(struct fc_lport *);584 585	/*586	 * Receive a request for the discovery layer.587	 *588	 * STATUS: OPTIONAL589	 */590	void (*disc_recv_req)(struct fc_lport *, struct fc_frame *);591 592	/*593	 * Start discovery for a local port.594	 *595	 * STATUS: OPTIONAL596	 */597	void (*disc_start)(void (*disc_callback)(struct fc_lport *,598						 enum fc_disc_event),599			   struct fc_lport *);600 601	/*602	 * Stop discovery for a given lport. This will remove603	 * all discovered rports604	 *605	 * STATUS: OPTIONAL606	 */607	void (*disc_stop) (struct fc_lport *);608 609	/*610	 * Stop discovery for a given lport. This will block611	 * until all discovered rports are deleted from the612	 * FC transport class613	 *614	 * STATUS: OPTIONAL615	 */616	void (*disc_stop_final) (struct fc_lport *);617};618 619/**620 * struct fc_disc - Discovery context621 * @retry_count:   Number of retries622 * @pending:       1 if discovery is pending, 0 if not623 * @requested:     1 if discovery has been requested, 0 if not624 * @seq_count:     Number of sequences used for discovery625 * @buf_len:       Length of the discovery buffer626 * @disc_id:       Discovery ID627 * @rports:        List of discovered remote ports628 * @priv:          Private pointer for use by discovery code629 * @disc_mutex:    Mutex that protects the discovery context630 * @partial_buf:   Partial name buffer (if names are returned631 *                 in multiple frames)632 * @disc_work:     handle for delayed work context633 * @disc_callback: Callback routine called when discovery completes634 */635struct fc_disc {636	unsigned char	      retry_count;637	unsigned char	      pending;638	unsigned char	      requested;639	unsigned short	      seq_count;640	unsigned char	      buf_len;641	u16		      disc_id;642 643	struct list_head      rports;644	void		      *priv;645	struct mutex	      disc_mutex;646	struct fc_gpn_ft_resp partial_buf;647	struct delayed_work   disc_work;648 649	void (*disc_callback)(struct fc_lport *,650			      enum fc_disc_event);651};652 653/*654 * Local port notifier and events.655 */656extern struct blocking_notifier_head fc_lport_notifier_head;657enum fc_lport_event {658	FC_LPORT_EV_ADD,659	FC_LPORT_EV_DEL,660};661 662/**663 * struct fc_lport - Local port664 * @host:                  The SCSI host associated with a local port665 * @ema_list:              Exchange manager anchor list666 * @dns_rdata:             The directory server remote port667 * @ms_rdata:		   The management server remote port668 * @ptp_rdata:             Point to point remote port669 * @scsi_priv:             FCP layer internal data670 * @disc:                  Discovery context671 * @vports:                Child vports if N_Port672 * @vport:                 Parent vport if VN_Port673 * @tt:                    Libfc function template674 * @link_up:               Link state (1 = link up, 0 = link down)675 * @qfull:                 Queue state (1 queue is full, 0 queue is not full)676 * @state:                 Identifies the state677 * @boot_time:             Timestamp indicating when the local port came online678 * @host_stats:            SCSI host statistics679 * @stats:                 FC local port stats (TODO separate libfc LLD stats)680 * @retry_count:           Number of retries in the current state681 * @port_id:               FC Port ID682 * @wwpn:                  World Wide Port Name683 * @wwnn:                  World Wide Node Name684 * @service_params:        Common service parameters685 * @e_d_tov:               Error detection timeout value686 * @r_a_tov:               Resource allocation timeout value687 * @rnid_gen:              RNID information688 * @sg_supp:               Indicates if scatter gather is supported689 * @seq_offload:           Indicates if sequence offload is supported690 * @crc_offload:           Indicates if CRC offload is supported691 * @lro_enabled:           Indicates if large receive offload is supported692 * @does_npiv:             Supports multiple vports693 * @npiv_enabled:          Switch/fabric allows NPIV694 * @mfs:                   The maximum Fibre Channel payload size695 * @max_retry_count:       The maximum retry attempts696 * @max_rport_retry_count: The maximum remote port retry attempts697 * @rport_priv_size:       Size needed by driver after struct fc_rport_priv698 * @lro_xid:               The maximum XID for LRO699 * @lso_max:               The maximum large offload send size700 * @fcts:                  FC-4 type mask701 * @lp_mutex:              Mutex to protect the local port702 * @list:                  Linkage on list of vport peers703 * @retry_work:            Handle to local port for delayed retry context704 * @prov:		   Pointers available for use by passive FC-4 providers705 * @lport_list:            Linkage on module-wide list of local ports706 */707struct fc_lport {708	/* Associations */709	struct Scsi_Host	       *host;710	struct list_head	       ema_list;711	struct fc_rport_priv	       *dns_rdata;712	struct fc_rport_priv	       *ms_rdata;713	struct fc_rport_priv	       *ptp_rdata;714	void			       *scsi_priv;715	struct fc_disc		       disc;716 717	/* Virtual port information */718	struct list_head	       vports;719	struct fc_vport		       *vport;720 721	/* Operational Information */722	struct libfc_function_template tt;723	u8			       link_up;724	u8			       qfull;725	u16			       vlan;726	enum fc_lport_state	       state;727	unsigned long		       boot_time;728	struct fc_host_statistics      host_stats;729	struct fc_stats	__percpu       *stats;730	u8			       retry_count;731 732	/* Fabric information */733	u32			       port_id;734	u64			       wwpn;735	u64			       wwnn;736	unsigned int		       service_params;737	unsigned int		       e_d_tov;738	unsigned int		       r_a_tov;739	struct fc_els_rnid_gen	       rnid_gen;740 741	/* Capabilities */742	u32			       sg_supp:1;743	u32			       seq_offload:1;744	u32			       crc_offload:1;745	u32			       lro_enabled:1;746	u32			       does_npiv:1;747	u32			       npiv_enabled:1;748	u32			       point_to_multipoint:1;749	u32			       fdmi_enabled:1;750	u32			       mfs;751	u8			       max_retry_count;752	u8			       max_rport_retry_count;753	u16			       rport_priv_size;754	u16			       link_speed;755	u16			       link_supported_speeds;756	u16			       lro_xid;757	unsigned int		       lso_max;758	struct fc_ns_fts	       fcts;759 760	/* Miscellaneous */761	struct mutex		       lp_mutex;762	struct list_head	       list;763	struct delayed_work	       retry_work;764	void			       *prov[FC_FC4_PROV_SIZE];765	struct list_head	       lport_list;766};767 768/**769 * struct fc4_prov - FC-4 provider registration770 * @prli:               Handler for incoming PRLI771 * @prlo:               Handler for session reset772 * @recv:		Handler for incoming request773 * @module:		Pointer to module.  May be NULL.774 */775struct fc4_prov {776	int (*prli)(struct fc_rport_priv *, u32 spp_len,777		    const struct fc_els_spp *spp_in,778		    struct fc_els_spp *spp_out);779	void (*prlo)(struct fc_rport_priv *);780	void (*recv)(struct fc_lport *, struct fc_frame *);781	struct module *module;782};783 784/*785 * Register FC-4 provider with libfc.786 */787int fc_fc4_register_provider(enum fc_fh_type type, struct fc4_prov *);788void fc_fc4_deregister_provider(enum fc_fh_type type, struct fc4_prov *);789 790/*791 * FC_LPORT HELPER FUNCTIONS792 *****************************/793 794/**795 * fc_lport_test_ready() - Determine if a local port is in the READY state796 * @lport: The local port to test797 *798 * Returns: %true if local port is in the READY state, %false otherwise799 */800static inline int fc_lport_test_ready(struct fc_lport *lport)801{802	return lport->state == LPORT_ST_READY;803}804 805/**806 * fc_set_wwnn() - Set the World Wide Node Name of a local port807 * @lport: The local port whose WWNN is to be set808 * @wwnn:  The new WWNN809 */810static inline void fc_set_wwnn(struct fc_lport *lport, u64 wwnn)811{812	lport->wwnn = wwnn;813}814 815/**816 * fc_set_wwpn() - Set the World Wide Port Name of a local port817 * @lport: The local port whose WWPN is to be set818 * @wwpn:  The new WWPN819 */820static inline void fc_set_wwpn(struct fc_lport *lport, u64 wwpn)821{822	lport->wwpn = wwpn;823}824 825/**826 * fc_lport_state_enter() - Change a local port's state827 * @lport: The local port whose state is to change828 * @state: The new state829 */830static inline void fc_lport_state_enter(struct fc_lport *lport,831					enum fc_lport_state state)832{833	if (state != lport->state)834		lport->retry_count = 0;835	lport->state = state;836}837 838/**839 * fc_lport_init_stats() - Allocate per-CPU statistics for a local port840 * @lport: The local port whose statistics are to be initialized841 *842 * Returns: %0 on success, %-ENOMEM on failure843 */844static inline int fc_lport_init_stats(struct fc_lport *lport)845{846	lport->stats = alloc_percpu(struct fc_stats);847	if (!lport->stats)848		return -ENOMEM;849	return 0;850}851 852/**853 * fc_lport_free_stats() - Free memory for a local port's statistics854 * @lport: The local port whose statistics are to be freed855 */856static inline void fc_lport_free_stats(struct fc_lport *lport)857{858	free_percpu(lport->stats);859}860 861/**862 * lport_priv() - Return the private data from a local port863 * @lport: The local port whose private data is to be retrieved864 *865 * Returns: the local port's private data pointer866 */867static inline void *lport_priv(const struct fc_lport *lport)868{869	return (void *)(lport + 1);870}871 872/**873 * libfc_host_alloc() - Allocate a Scsi_Host with room for a local port and874 *                      LLD private data875 * @sht:       The SCSI host template876 * @priv_size: Size of private data877 *878 * Returns: libfc lport879 */880static inline struct fc_lport *881libfc_host_alloc(const struct scsi_host_template *sht, int priv_size)882{883	struct fc_lport *lport;884	struct Scsi_Host *shost;885 886	shost = scsi_host_alloc(sht, sizeof(*lport) + priv_size);887	if (!shost)888		return NULL;889	lport = shost_priv(shost);890	lport->host = shost;891	INIT_LIST_HEAD(&lport->ema_list);892	INIT_LIST_HEAD(&lport->vports);893	return lport;894}895 896/*897 * FC_FCP HELPER FUNCTIONS898 *****************************/899static inline bool fc_fcp_is_read(const struct fc_fcp_pkt *fsp)900{901	if (fsp && fsp->cmd)902		return fsp->cmd->sc_data_direction == DMA_FROM_DEVICE;903	return false;904}905 906/*907 * LOCAL PORT LAYER908 *****************************/909int fc_lport_init(struct fc_lport *);910int fc_lport_destroy(struct fc_lport *);911int fc_fabric_logoff(struct fc_lport *);912int fc_fabric_login(struct fc_lport *);913void __fc_linkup(struct fc_lport *);914void fc_linkup(struct fc_lport *);915void __fc_linkdown(struct fc_lport *);916void fc_linkdown(struct fc_lport *);917void fc_vport_setlink(struct fc_lport *);918void fc_vports_linkchange(struct fc_lport *);919int fc_lport_config(struct fc_lport *);920int fc_lport_reset(struct fc_lport *);921void fc_lport_recv(struct fc_lport *lport, struct fc_frame *fp);922int fc_set_mfs(struct fc_lport *, u32 mfs);923struct fc_lport *libfc_vport_create(struct fc_vport *, int privsize);924struct fc_lport *fc_vport_id_lookup(struct fc_lport *, u32 port_id);925int fc_lport_bsg_request(struct bsg_job *);926void fc_lport_set_local_id(struct fc_lport *, u32 port_id);927void fc_lport_iterate(void (*func)(struct fc_lport *, void *), void *);928 929/*930 * REMOTE PORT LAYER931 *****************************/932void fc_rport_terminate_io(struct fc_rport *);933struct fc_rport_priv *fc_rport_lookup(const struct fc_lport *lport,934				      u32 port_id);935struct fc_rport_priv *fc_rport_create(struct fc_lport *, u32);936void fc_rport_destroy(struct kref *kref);937int fc_rport_login(struct fc_rport_priv *rdata);938int fc_rport_logoff(struct fc_rport_priv *rdata);939void fc_rport_recv_req(struct fc_lport *lport, struct fc_frame *fp);940void fc_rport_flush_queue(void);941 942/*943 * DISCOVERY LAYER944 *****************************/945void fc_disc_init(struct fc_lport *);946void fc_disc_config(struct fc_lport *, void *);947 948static inline struct fc_lport *fc_disc_lport(struct fc_disc *disc)949{950	return container_of(disc, struct fc_lport, disc);951}952 953/*954 * FCP LAYER955 *****************************/956int fc_fcp_init(struct fc_lport *);957void fc_fcp_destroy(struct fc_lport *);958 959/*960 * SCSI INTERACTION LAYER961 *****************************/962int fc_queuecommand(struct Scsi_Host *, struct scsi_cmnd *);963int fc_eh_abort(struct scsi_cmnd *);964int fc_eh_device_reset(struct scsi_cmnd *);965int fc_eh_host_reset(struct scsi_cmnd *);966int fc_slave_alloc(struct scsi_device *);967 968/*969 * ELS/CT interface970 *****************************/971int fc_elsct_init(struct fc_lport *);972struct fc_seq *fc_elsct_send(struct fc_lport *, u32 did,973				    struct fc_frame *,974				    unsigned int op,975				    void (*resp)(struct fc_seq *,976						 struct fc_frame *,977						 void *arg),978				    void *arg, u32 timer_msec);979void fc_lport_flogi_resp(struct fc_seq *, struct fc_frame *, void *);980void fc_lport_logo_resp(struct fc_seq *, struct fc_frame *, void *);981void fc_fill_reply_hdr(struct fc_frame *, const struct fc_frame *,982		       enum fc_rctl, u32 parm_offset);983void fc_fill_hdr(struct fc_frame *, const struct fc_frame *,984		 enum fc_rctl, u32 f_ctl, u16 seq_cnt, u32 parm_offset);985 986 987/*988 * EXCHANGE MANAGER LAYER989 *****************************/990int fc_exch_init(struct fc_lport *);991void fc_exch_update_stats(struct fc_lport *lport);992struct fc_seq *fc_exch_seq_send(struct fc_lport *lport,993				struct fc_frame *fp,994				void (*resp)(struct fc_seq *,995					     struct fc_frame *fp,996					     void *arg),997				void (*destructor)(struct fc_seq *, void *),998				void *arg, u32 timer_msec);999void fc_seq_els_rsp_send(struct fc_frame *, enum fc_els_cmd,1000			 struct fc_seq_els_data *);1001struct fc_seq *fc_seq_start_next(struct fc_seq *sp);1002void fc_seq_set_resp(struct fc_seq *sp,1003		     void (*resp)(struct fc_seq *, struct fc_frame *, void *),1004		     void *arg);1005struct fc_seq *fc_seq_assign(struct fc_lport *lport, struct fc_frame *fp);1006void fc_seq_release(struct fc_seq *sp);1007struct fc_exch_mgr_anchor *fc_exch_mgr_add(struct fc_lport *,1008					   struct fc_exch_mgr *,1009					   bool (*match)(struct fc_frame *));1010void fc_exch_mgr_del(struct fc_exch_mgr_anchor *);1011int fc_exch_mgr_list_clone(struct fc_lport *src, struct fc_lport *dst);1012struct fc_exch_mgr *fc_exch_mgr_alloc(struct fc_lport *, enum fc_class class,1013				      u16 min_xid, u16 max_xid,1014				      bool (*match)(struct fc_frame *));1015void fc_exch_mgr_free(struct fc_lport *);1016void fc_exch_recv(struct fc_lport *, struct fc_frame *);1017void fc_exch_mgr_reset(struct fc_lport *, u32 s_id, u32 d_id);1018int fc_seq_send(struct fc_lport *lport, struct fc_seq *sp, struct fc_frame *fp);1019int fc_seq_exch_abort(const struct fc_seq *, unsigned int timer_msec);1020void fc_exch_done(struct fc_seq *sp);1021 1022/*1023 * Functions for fc_functions_template1024 */1025void fc_get_host_speed(struct Scsi_Host *);1026void fc_get_host_port_state(struct Scsi_Host *);1027void fc_set_rport_loss_tmo(struct fc_rport *, u32 timeout);1028struct fc_host_statistics *fc_get_host_stats(struct Scsi_Host *);1029 1030#endif /* _LIBFC_H_ */1031