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