root/include/scsi/libfc.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. fc_lport_test_ready
  2. fc_set_wwnn
  3. fc_set_wwpn
  4. fc_lport_state_enter
  5. fc_lport_init_stats
  6. fc_lport_free_stats
  7. lport_priv
  8. libfc_host_alloc
  9. fc_fcp_is_read
  10. fc_disc_lport

   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.org
   6  */
   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 codes
  32  */
  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 states
  44  * @LPORT_ST_DISABLED: Disabled
  45  * @LPORT_ST_FLOGI:    Fabric login (FLOGI) sent
  46  * @LPORT_ST_DNS:      Waiting for name server remote port to become ready
  47  * @LPORT_ST_RPN_ID:   Register port name by ID (RPN_ID) sent
  48  * @LPORT_ST_RFT_ID:   Register Fibre Channel types by ID (RFT_ID) sent
  49  * @LPORT_ST_RFF_ID:   Register FC-4 Features by ID (RFF_ID) sent
  50  * @LPORT_ST_FDMI:     Waiting for mgmt server rport to become ready
  51  * @LPORT_ST_RHBA:
  52  * @LPORT_ST_SCR:      State Change Register (SCR) sent
  53  * @LPORT_ST_READY:    Ready for use
  54  * @LPORT_ST_LOGO:     Local port logout (LOGO) sent
  55  * @LPORT_ST_RESET:    Local port reset
  56  */
  57 enum fc_lport_state {
  58         LPORT_ST_DISABLED = 0,
  59         LPORT_ST_FLOGI,
  60         LPORT_ST_DNS,
  61         LPORT_ST_RNN_ID,
  62         LPORT_ST_RSNN_NN,
  63         LPORT_ST_RSPN_ID,
  64         LPORT_ST_RFT_ID,
  65         LPORT_ST_RFF_ID,
  66         LPORT_ST_FDMI,
  67         LPORT_ST_RHBA,
  68         LPORT_ST_RPA,
  69         LPORT_ST_DHBA,
  70         LPORT_ST_DPRT,
  71         LPORT_ST_SCR,
  72         LPORT_ST_READY,
  73         LPORT_ST_LOGO,
  74         LPORT_ST_RESET
  75 };
  76 
  77 enum fc_disc_event {
  78         DISC_EV_NONE = 0,
  79         DISC_EV_SUCCESS,
  80         DISC_EV_FAILED
  81 };
  82 
  83 /**
  84  * enum fc_rport_state - Remote port states
  85  * @RPORT_ST_INIT:    Initialized
  86  * @RPORT_ST_FLOGI:   Waiting for FLOGI completion for point-to-multipoint
  87  * @RPORT_ST_PLOGI_WAIT:   Waiting for peer to login for point-to-multipoint
  88  * @RPORT_ST_PLOGI:   Waiting for PLOGI completion
  89  * @RPORT_ST_PRLI:    Waiting for PRLI completion
  90  * @RPORT_ST_RTV:     Waiting for RTV completion
  91  * @RPORT_ST_READY:   Ready for use
  92  * @RPORT_ST_ADISC:   Discover Address sent
  93  * @RPORT_ST_DELETE:  Remote port being deleted
  94 */
  95 enum fc_rport_state {
  96         RPORT_ST_INIT,
  97         RPORT_ST_FLOGI,
  98         RPORT_ST_PLOGI_WAIT,
  99         RPORT_ST_PLOGI,
 100         RPORT_ST_PRLI,
 101         RPORT_ST_RTV,
 102         RPORT_ST_READY,
 103         RPORT_ST_ADISC,
 104         RPORT_ST_DELETE,
 105 };
 106 
 107 /**
 108  * struct fc_disc_port - temporary discovery port to hold rport identifiers
 109  * @lp:         Fibre Channel host port instance
 110  * @peers:      Node for list management during discovery and RSCN processing
 111  * @rport_work: Work struct for starting the rport state machine
 112  * @port_id:    Port ID of the discovered port
 113  */
 114 struct fc_disc_port {
 115         struct fc_lport    *lp;
 116         struct list_head   peers;
 117         struct work_struct rport_work;
 118         u32                port_id;
 119 };
 120 
 121 /**
 122  * enum fc_rport_event - Remote port events
 123  * @RPORT_EV_NONE:   No event
 124  * @RPORT_EV_READY:  Remote port is ready for use
 125  * @RPORT_EV_FAILED: State machine failed, remote port is not ready
 126  * @RPORT_EV_STOP:   Remote port has been stopped
 127  * @RPORT_EV_LOGO:   Remote port logout (LOGO) sent
 128  */
 129 enum fc_rport_event {
 130         RPORT_EV_NONE = 0,
 131         RPORT_EV_READY,
 132         RPORT_EV_FAILED,
 133         RPORT_EV_STOP,
 134         RPORT_EV_LOGO
 135 };
 136 
 137 struct fc_rport_priv;
 138 
 139 /**
 140  * struct fc_rport_operations - Operations for a remote port
 141  * @event_callback: Function to be called for remote port events
 142  */
 143 struct fc_rport_operations {
 144         void (*event_callback)(struct fc_lport *, struct fc_rport_priv *,
 145                                enum fc_rport_event);
 146 };
 147 
 148 /**
 149  * struct fc_rport_libfc_priv - libfc internal information about a remote port
 150  * @local_port: The associated local port
 151  * @rp_state:   Indicates READY for I/O or DELETE when blocked
 152  * @flags:      REC and RETRY supported flags
 153  * @e_d_tov:    Error detect timeout value (in msec)
 154  * @r_a_tov:    Resource allocation timeout value (in msec)
 155  */
 156 struct fc_rport_libfc_priv {
 157         struct fc_lport            *local_port;
 158         enum fc_rport_state        rp_state;
 159         u16                        flags;
 160         #define FC_RP_FLAGS_REC_SUPPORTED       (1 << 0)
 161         #define FC_RP_FLAGS_RETRY               (1 << 1)
 162         #define FC_RP_STARTED                   (1 << 2)
 163         #define FC_RP_FLAGS_CONF_REQ            (1 << 3)
 164         unsigned int               e_d_tov;
 165         unsigned int               r_a_tov;
 166 };
 167 
 168 /**
 169  * struct fc_rport_priv - libfc remote port and discovery info
 170  * @local_port:     The associated local port
 171  * @rport:          The FC transport remote port
 172  * @kref:           Reference counter
 173  * @rp_state:       Enumeration that tracks progress of PLOGI, PRLI,
 174  *                  and RTV exchanges
 175  * @ids:            The remote port identifiers and roles
 176  * @flags:          STARTED, REC and RETRY_SUPPORTED flags
 177  * @max_seq:        Maximum number of concurrent sequences
 178  * @disc_id:        The discovery identifier
 179  * @maxframe_size:  The maximum frame size
 180  * @retries:        The retry count for the current state
 181  * @major_retries:  The retry count for the entire PLOGI/PRLI state machine
 182  * @e_d_tov:        Error detect timeout value (in msec)
 183  * @r_a_tov:        Resource allocation timeout value (in msec)
 184  * @rp_mutex:       The mutex that protects the remote port
 185  * @retry_work:     Handle for retries
 186  * @event_callback: Callback when READY, FAILED or LOGO states complete
 187  * @prli_count:     Count of open PRLI sessions in providers
 188  * @rcu:            Structure used for freeing in an RCU-safe manner
 189  */
 190 struct fc_rport_priv {
 191         struct fc_lport             *local_port;
 192         struct fc_rport             *rport;
 193         struct kref                 kref;
 194         enum fc_rport_state         rp_state;
 195         struct fc_rport_identifiers ids;
 196         u16                         flags;
 197         u16                         max_seq;
 198         u16                         disc_id;
 199         u16                         maxframe_size;
 200         unsigned int                retries;
 201         unsigned int                major_retries;
 202         unsigned int                e_d_tov;
 203         unsigned int                r_a_tov;
 204         struct mutex                rp_mutex;
 205         struct delayed_work         retry_work;
 206         enum fc_rport_event         event;
 207         struct fc_rport_operations  *ops;
 208         struct list_head            peers;
 209         struct work_struct          event_work;
 210         u32                         supported_classes;
 211         u16                         prli_count;
 212         struct rcu_head             rcu;
 213         u16                         sp_features;
 214         u8                          spp_type;
 215         void                        (*lld_event_callback)(struct fc_lport *,
 216                                                       struct fc_rport_priv *,
 217                                                       enum fc_rport_event);
 218 };
 219 
 220 /**
 221  * struct fc_stats - fc stats structure
 222  * @SecondsSinceLastReset: Seconds since the last reset
 223  * @TxFrames:              Number of transmitted frames
 224  * @TxWords:               Number of transmitted words
 225  * @RxFrames:              Number of received frames
 226  * @RxWords:               Number of received words
 227  * @ErrorFrames:           Number of received error frames
 228  * @DumpedFrames:          Number of dumped frames
 229  * @FcpPktAllocFails:      Number of fcp packet allocation failures
 230  * @FcpPktAborts:          Number of fcp packet aborts
 231  * @FcpFrameAllocFails:    Number of fcp frame allocation failures
 232  * @LinkFailureCount:      Number of link failures
 233  * @LossOfSignalCount:     Number for signal losses
 234  * @InvalidTxWordCount:    Number of invalid transmitted words
 235  * @InvalidCRCCount:       Number of invalid CRCs
 236  * @InputRequests:         Number of input requests
 237  * @OutputRequests:        Number of output requests
 238  * @ControlRequests:       Number of control requests
 239  * @InputBytes:            Number of received bytes
 240  * @OutputBytes:           Number of transmitted bytes
 241  * @VLinkFailureCount:     Number of virtual link failures
 242  * @MissDiscAdvCount:      Number of missing FIP discovery advertisement
 243  */
 244 struct fc_stats {
 245         u64             SecondsSinceLastReset;
 246         u64             TxFrames;
 247         u64             TxWords;
 248         u64             RxFrames;
 249         u64             RxWords;
 250         u64             ErrorFrames;
 251         u64             DumpedFrames;
 252         u64             FcpPktAllocFails;
 253         u64             FcpPktAborts;
 254         u64             FcpFrameAllocFails;
 255         u64             LinkFailureCount;
 256         u64             LossOfSignalCount;
 257         u64             InvalidTxWordCount;
 258         u64             InvalidCRCCount;
 259         u64             InputRequests;
 260         u64             OutputRequests;
 261         u64             ControlRequests;
 262         u64             InputBytes;
 263         u64             OutputBytes;
 264         u64             VLinkFailureCount;
 265         u64             MissDiscAdvCount;
 266 };
 267 
 268 /**
 269  * struct fc_seq_els_data - ELS data used for passing ELS specific responses
 270  * @reason: The reason for rejection
 271  * @explan: The explanation of the rejection
 272  *
 273  * Mainly used by the exchange manager layer.
 274  */
 275 struct fc_seq_els_data {
 276         enum fc_els_rjt_reason reason;
 277         enum fc_els_rjt_explan explan;
 278 };
 279 
 280 /**
 281  * struct fc_fcp_pkt - FCP request structure (one for each scsi_cmnd request)
 282  * @lp:              The associated local port
 283  * @state:           The state of the I/O
 284  * @ref_cnt:         Reference count
 285  * @scsi_pkt_lock:   Lock to protect the SCSI packet (must be taken before the
 286  *                   host_lock if both are to be held at the same time)
 287  * @cmd:             The SCSI command (set and clear with the host_lock held)
 288  * @list:            Tracks queued commands (accessed with the host_lock held)
 289  * @timer:           The command timer
 290  * @tm_done:         Completion indicator
 291  * @wait_for_comp:   Indicator to wait for completion of the I/O (in jiffies)
 292  * @data_len:        The length of the data
 293  * @cdb_cmd:         The CDB command
 294  * @xfer_len:        The transfer length
 295  * @xfer_ddp:        Indicates if this transfer used DDP (XID of the exchange
 296  *                   will be set here if DDP was setup)
 297  * @xfer_contig_end: The offset into the buffer if the buffer is contiguous
 298  *                   (Tx and Rx)
 299  * @max_payload:     The maximum payload size (in bytes)
 300  * @io_status:       SCSI result (upper 24 bits)
 301  * @cdb_status:      CDB status
 302  * @status_code:     FCP I/O status
 303  * @scsi_comp_flags: Completion flags (bit 3 Underrun bit 2: overrun)
 304  * @req_flags:       Request flags (bit 0: read bit:1 write)
 305  * @scsi_resid:      SCSI residule length
 306  * @rport:           The remote port that the SCSI command is targeted at
 307  * @seq_ptr:         The sequence that will carry the SCSI command
 308  * @recov_retry:     Number of recovery retries
 309  * @recov_seq:       The sequence for REC or SRR
 310  */
 311 struct fc_fcp_pkt {
 312         spinlock_t        scsi_pkt_lock;
 313         refcount_t        ref_cnt;
 314 
 315         /* SCSI command and data transfer information */
 316         u32               data_len;
 317 
 318         /* SCSI I/O related information */
 319         struct scsi_cmnd  *cmd;
 320         struct list_head  list;
 321 
 322         /* Housekeeping information */
 323         struct fc_lport   *lp;
 324         u8                state;
 325 
 326         /* SCSI/FCP return status */
 327         u8                cdb_status;
 328         u8                status_code;
 329         u8                scsi_comp_flags;
 330         u32               io_status;
 331         u32               req_flags;
 332         u32               scsi_resid;
 333 
 334         /* Transport related veriables */
 335         size_t            xfer_len;
 336         struct fcp_cmnd   cdb_cmd;
 337         u32               xfer_contig_end;
 338         u16               max_payload;
 339         u16               xfer_ddp;
 340 
 341         /* Associated structures */
 342         struct fc_rport   *rport;
 343         struct fc_seq     *seq_ptr;
 344 
 345         /* Timeout/error related information */
 346         struct timer_list timer;
 347         int               wait_for_comp;
 348         int               timer_delay;
 349         u32               recov_retry;
 350         struct fc_seq     *recov_seq;
 351         struct completion tm_done;
 352 } ____cacheline_aligned_in_smp;
 353 
 354 /*
 355  * Structure and function definitions for managing Fibre Channel Exchanges
 356  * and Sequences
 357  *
 358  * fc_exch holds state for one exchange and links to its active sequence.
 359  *
 360  * fc_seq holds the state for an individual sequence.
 361  */
 362 
 363 struct fc_exch_mgr;
 364 struct fc_exch_mgr_anchor;
 365 extern u16 fc_cpu_mask; /* cpu mask for possible cpus */
 366 
 367 /**
 368  * struct fc_seq - FC sequence
 369  * @id:       The sequence ID
 370  * @ssb_stat: Status flags for the sequence status block (SSB)
 371  * @cnt:      Number of frames sent so far
 372  * @rec_data: FC-4 value for REC
 373  */
 374 struct fc_seq {
 375         u8  id;
 376         u16 ssb_stat;
 377         u16 cnt;
 378         u32 rec_data;
 379 };
 380 
 381 #define FC_EX_DONE              (1 << 0) /* ep is completed */
 382 #define FC_EX_RST_CLEANUP       (1 << 1) /* reset is forcing completion */
 383 #define FC_EX_QUARANTINE        (1 << 2) /* exch is quarantined */
 384 
 385 /**
 386  * struct fc_exch - Fibre Channel Exchange
 387  * @em:           Exchange manager
 388  * @pool:         Exchange pool
 389  * @state:        The exchange's state
 390  * @xid:          The exchange ID
 391  * @ex_list:      Handle used by the EM to track free exchanges
 392  * @ex_lock:      Lock that protects the exchange
 393  * @ex_refcnt:    Reference count
 394  * @timeout_work: Handle for timeout handler
 395  * @lp:           The local port that this exchange is on
 396  * @oxid:         Originator's exchange ID
 397  * @rxid:         Responder's exchange ID
 398  * @oid:          Originator's FCID
 399  * @sid:          Source FCID
 400  * @did:          Destination FCID
 401  * @esb_stat:     ESB exchange status
 402  * @r_a_tov:      Resouce allocation time out value (in msecs)
 403  * @seq_id:       The next sequence ID to use
 404  * @encaps:       encapsulation information for lower-level driver
 405  * @f_ctl:        F_CTL flags for the sequence
 406  * @fh_type:      The frame type
 407  * @class:        The class of service
 408  * @seq:          The sequence in use on this exchange
 409  * @resp_active:  Number of tasks that are concurrently executing @resp().
 410  * @resp_task:    If @resp_active > 0, either the task executing @resp(), the
 411  *                task that has been interrupted to execute the soft-IRQ
 412  *                executing @resp() or NULL if more than one task is executing
 413  *                @resp concurrently.
 414  * @resp_wq:      Waitqueue for the tasks waiting on @resp_active.
 415  * @resp:         Callback for responses on this exchange
 416  * @destructor:   Called when destroying the exchange
 417  * @arg:          Passed as a void pointer to the resp() callback
 418  *
 419  * Locking notes: The ex_lock protects following items:
 420  *      state, esb_stat, f_ctl, seq.ssb_stat
 421  *      seq_id
 422  *      sequence allocation
 423  */
 424 struct fc_exch {
 425         spinlock_t          ex_lock;
 426         atomic_t            ex_refcnt;
 427         enum fc_class       class;
 428         struct fc_exch_mgr  *em;
 429         struct fc_exch_pool *pool;
 430         struct list_head    ex_list;
 431         struct fc_lport     *lp;
 432         u32                 esb_stat;
 433         u8                  state;
 434         u8                  fh_type;
 435         u8                  seq_id;
 436         u8                  encaps;
 437         u16                 xid;
 438         u16                 oxid;
 439         u16                 rxid;
 440         u32                 oid;
 441         u32                 sid;
 442         u32                 did;
 443         u32                 r_a_tov;
 444         u32                 f_ctl;
 445         struct fc_seq       seq;
 446         int                 resp_active;
 447         struct task_struct  *resp_task;
 448         wait_queue_head_t   resp_wq;
 449         void                (*resp)(struct fc_seq *, struct fc_frame *, void *);
 450         void                *arg;
 451         void                (*destructor)(struct fc_seq *, void *);
 452         struct delayed_work timeout_work;
 453 } ____cacheline_aligned_in_smp;
 454 #define fc_seq_exch(sp) container_of(sp, struct fc_exch, seq)
 455 
 456 
 457 struct libfc_function_template {
 458         /*
 459          * Interface to send a FC frame
 460          *
 461          * STATUS: REQUIRED
 462          */
 463         int (*frame_send)(struct fc_lport *, struct fc_frame *);
 464 
 465         /*
 466          * Interface to send ELS/CT frames
 467          *
 468          * STATUS: OPTIONAL
 469          */
 470         struct fc_seq *(*elsct_send)(struct fc_lport *, u32 did,
 471                                      struct fc_frame *, unsigned int op,
 472                                      void (*resp)(struct fc_seq *,
 473                                              struct fc_frame *, void *arg),
 474                                      void *arg, u32 timer_msec);
 475 
 476         /*
 477          * Sets up the DDP context for a given exchange id on the given
 478          * scatterlist if LLD supports DDP for large receive.
 479          *
 480          * STATUS: OPTIONAL
 481          */
 482         int (*ddp_setup)(struct fc_lport *, u16, struct scatterlist *,
 483                          unsigned int);
 484         /*
 485          * Completes the DDP transfer and returns the length of data DDPed
 486          * for the given exchange id.
 487          *
 488          * STATUS: OPTIONAL
 489          */
 490         int (*ddp_done)(struct fc_lport *, u16);
 491         /*
 492          * Sets up the DDP context for a given exchange id on the given
 493          * scatterlist if LLD supports DDP for target.
 494          *
 495          * STATUS: OPTIONAL
 496          */
 497         int (*ddp_target)(struct fc_lport *, u16, struct scatterlist *,
 498                           unsigned int);
 499         /*
 500          * Allow LLD to fill its own Link Error Status Block
 501          *
 502          * STATUS: OPTIONAL
 503          */
 504         void (*get_lesb)(struct fc_lport *, struct fc_els_lesb *lesb);
 505 
 506         /*
 507          * Reset an exchange manager, completing all sequences and exchanges.
 508          * If s_id is non-zero, reset only exchanges originating from that FID.
 509          * If d_id is non-zero, reset only exchanges sending to that FID.
 510          *
 511          * STATUS: OPTIONAL
 512          */
 513         void (*exch_mgr_reset)(struct fc_lport *, u32 s_id, u32 d_id);
 514 
 515         /*
 516          * Set the local port FC_ID.
 517          *
 518          * This may be provided by the LLD to allow it to be
 519          * notified when the local port is assigned a FC-ID.
 520          *
 521          * The frame, if non-NULL, is the incoming frame with the
 522          * FLOGI LS_ACC or FLOGI, and may contain the granted MAC
 523          * address for the LLD.  The frame pointer may be NULL if
 524          * no MAC is associated with this assignment (LOGO or PLOGI).
 525          *
 526          * If FC_ID is non-zero, r_a_tov and e_d_tov must be valid.
 527          *
 528          * Note: this is called with the local port mutex held.
 529          *
 530          * STATUS: OPTIONAL
 531          */
 532         void (*lport_set_port_id)(struct fc_lport *, u32 port_id,
 533                                   struct fc_frame *);
 534 
 535         /*
 536          * Callback routine after the remote port is logged in
 537          *
 538          * STATUS: OPTIONAL
 539          */
 540         void (*rport_event_callback)(struct fc_lport *,
 541                                      struct fc_rport_priv *,
 542                                      enum fc_rport_event);
 543 
 544         /*
 545          * Send a fcp cmd from fsp pkt.
 546          * Called with the SCSI host lock unlocked and irqs disabled.
 547          *
 548          * The resp handler is called when FCP_RSP received.
 549          *
 550          * STATUS: OPTIONAL
 551          */
 552         int (*fcp_cmd_send)(struct fc_lport *, struct fc_fcp_pkt *,
 553                             void (*resp)(struct fc_seq *, struct fc_frame *,
 554                                          void *));
 555 
 556         /*
 557          * Cleanup the FCP layer, used during link down and reset
 558          *
 559          * STATUS: OPTIONAL
 560          */
 561         void (*fcp_cleanup)(struct fc_lport *);
 562 
 563         /*
 564          * Abort all I/O on a local port
 565          *
 566          * STATUS: OPTIONAL
 567          */
 568         void (*fcp_abort_io)(struct fc_lport *);
 569 
 570         /*
 571          * Receive a request for the discovery layer.
 572          *
 573          * STATUS: OPTIONAL
 574          */
 575         void (*disc_recv_req)(struct fc_lport *, struct fc_frame *);
 576 
 577         /*
 578          * Start discovery for a local port.
 579          *
 580          * STATUS: OPTIONAL
 581          */
 582         void (*disc_start)(void (*disc_callback)(struct fc_lport *,
 583                                                  enum fc_disc_event),
 584                            struct fc_lport *);
 585 
 586         /*
 587          * Stop discovery for a given lport. This will remove
 588          * all discovered rports
 589          *
 590          * STATUS: OPTIONAL
 591          */
 592         void (*disc_stop) (struct fc_lport *);
 593 
 594         /*
 595          * Stop discovery for a given lport. This will block
 596          * until all discovered rports are deleted from the
 597          * FC transport class
 598          *
 599          * STATUS: OPTIONAL
 600          */
 601         void (*disc_stop_final) (struct fc_lport *);
 602 };
 603 
 604 /**
 605  * struct fc_disc - Discovery context
 606  * @retry_count:   Number of retries
 607  * @pending:       1 if discovery is pending, 0 if not
 608  * @requested:     1 if discovery has been requested, 0 if not
 609  * @seq_count:     Number of sequences used for discovery
 610  * @buf_len:       Length of the discovery buffer
 611  * @disc_id:       Discovery ID
 612  * @rports:        List of discovered remote ports
 613  * @priv:          Private pointer for use by discovery code
 614  * @disc_mutex:    Mutex that protects the discovery context
 615  * @partial_buf:   Partial name buffer (if names are returned
 616  *                 in multiple frames)
 617  * @disc_work:     handle for delayed work context
 618  * @disc_callback: Callback routine called when discovery completes
 619  */
 620 struct fc_disc {
 621         unsigned char         retry_count;
 622         unsigned char         pending;
 623         unsigned char         requested;
 624         unsigned short        seq_count;
 625         unsigned char         buf_len;
 626         u16                   disc_id;
 627 
 628         struct list_head      rports;
 629         void                  *priv;
 630         struct mutex          disc_mutex;
 631         struct fc_gpn_ft_resp partial_buf;
 632         struct delayed_work   disc_work;
 633 
 634         void (*disc_callback)(struct fc_lport *,
 635                               enum fc_disc_event);
 636 };
 637 
 638 /*
 639  * Local port notifier and events.
 640  */
 641 extern struct blocking_notifier_head fc_lport_notifier_head;
 642 enum fc_lport_event {
 643         FC_LPORT_EV_ADD,
 644         FC_LPORT_EV_DEL,
 645 };
 646 
 647 /**
 648  * struct fc_lport - Local port
 649  * @host:                  The SCSI host associated with a local port
 650  * @ema_list:              Exchange manager anchor list
 651  * @dns_rdata:             The directory server remote port
 652  * @ms_rdata:              The management server remote port
 653  * @ptp_rdata:             Point to point remote port
 654  * @scsi_priv:             FCP layer internal data
 655  * @disc:                  Discovery context
 656  * @vports:                Child vports if N_Port
 657  * @vport:                 Parent vport if VN_Port
 658  * @tt:                    Libfc function template
 659  * @link_up:               Link state (1 = link up, 0 = link down)
 660  * @qfull:                 Queue state (1 queue is full, 0 queue is not full)
 661  * @state:                 Identifies the state
 662  * @boot_time:             Timestamp indicating when the local port came online
 663  * @host_stats:            SCSI host statistics
 664  * @stats:                 FC local port stats (TODO separate libfc LLD stats)
 665  * @retry_count:           Number of retries in the current state
 666  * @port_id:               FC Port ID
 667  * @wwpn:                  World Wide Port Name
 668  * @wwnn:                  World Wide Node Name
 669  * @service_params:        Common service parameters
 670  * @e_d_tov:               Error detection timeout value
 671  * @r_a_tov:               Resouce allocation timeout value
 672  * @rnid_gen:              RNID information
 673  * @sg_supp:               Indicates if scatter gather is supported
 674  * @seq_offload:           Indicates if sequence offload is supported
 675  * @crc_offload:           Indicates if CRC offload is supported
 676  * @lro_enabled:           Indicates if large receive offload is supported
 677  * @does_npiv:             Supports multiple vports
 678  * @npiv_enabled:          Switch/fabric allows NPIV
 679  * @mfs:                   The maximum Fibre Channel payload size
 680  * @max_retry_count:       The maximum retry attempts
 681  * @max_rport_retry_count: The maximum remote port retry attempts
 682  * @rport_priv_size:       Size needed by driver after struct fc_rport_priv
 683  * @lro_xid:               The maximum XID for LRO
 684  * @lso_max:               The maximum large offload send size
 685  * @fcts:                  FC-4 type mask
 686  * @lp_mutex:              Mutex to protect the local port
 687  * @list:                  Linkage on list of vport peers
 688  * @retry_work:            Handle to local port for delayed retry context
 689  * @prov:                  Pointers available for use by passive FC-4 providers
 690  * @lport_list:            Linkage on module-wide list of local ports
 691  */
 692 struct fc_lport {
 693         /* Associations */
 694         struct Scsi_Host               *host;
 695         struct list_head               ema_list;
 696         struct fc_rport_priv           *dns_rdata;
 697         struct fc_rport_priv           *ms_rdata;
 698         struct fc_rport_priv           *ptp_rdata;
 699         void                           *scsi_priv;
 700         struct fc_disc                 disc;
 701 
 702         /* Virtual port information */
 703         struct list_head               vports;
 704         struct fc_vport                *vport;
 705 
 706         /* Operational Information */
 707         struct libfc_function_template tt;
 708         u8                             link_up;
 709         u8                             qfull;
 710         u16                            vlan;
 711         enum fc_lport_state            state;
 712         unsigned long                  boot_time;
 713         struct fc_host_statistics      host_stats;
 714         struct fc_stats __percpu       *stats;
 715         u8                             retry_count;
 716 
 717         /* Fabric information */
 718         u32                            port_id;
 719         u64                            wwpn;
 720         u64                            wwnn;
 721         unsigned int                   service_params;
 722         unsigned int                   e_d_tov;
 723         unsigned int                   r_a_tov;
 724         struct fc_els_rnid_gen         rnid_gen;
 725 
 726         /* Capabilities */
 727         u32                            sg_supp:1;
 728         u32                            seq_offload:1;
 729         u32                            crc_offload:1;
 730         u32                            lro_enabled:1;
 731         u32                            does_npiv:1;
 732         u32                            npiv_enabled:1;
 733         u32                            point_to_multipoint:1;
 734         u32                            fdmi_enabled:1;
 735         u32                            mfs;
 736         u8                             max_retry_count;
 737         u8                             max_rport_retry_count;
 738         u16                            rport_priv_size;
 739         u16                            link_speed;
 740         u16                            link_supported_speeds;
 741         u16                            lro_xid;
 742         unsigned int                   lso_max;
 743         struct fc_ns_fts               fcts;
 744 
 745         /* Miscellaneous */
 746         struct mutex                   lp_mutex;
 747         struct list_head               list;
 748         struct delayed_work            retry_work;
 749         void                           *prov[FC_FC4_PROV_SIZE];
 750         struct list_head               lport_list;
 751 };
 752 
 753 /**
 754  * struct fc4_prov - FC-4 provider registration
 755  * @prli:               Handler for incoming PRLI
 756  * @prlo:               Handler for session reset
 757  * @recv:               Handler for incoming request
 758  * @module:             Pointer to module.  May be NULL.
 759  */
 760 struct fc4_prov {
 761         int (*prli)(struct fc_rport_priv *, u32 spp_len,
 762                     const struct fc_els_spp *spp_in,
 763                     struct fc_els_spp *spp_out);
 764         void (*prlo)(struct fc_rport_priv *);
 765         void (*recv)(struct fc_lport *, struct fc_frame *);
 766         struct module *module;
 767 };
 768 
 769 /*
 770  * Register FC-4 provider with libfc.
 771  */
 772 int fc_fc4_register_provider(enum fc_fh_type type, struct fc4_prov *);
 773 void fc_fc4_deregister_provider(enum fc_fh_type type, struct fc4_prov *);
 774 
 775 /*
 776  * FC_LPORT HELPER FUNCTIONS
 777  *****************************/
 778 
 779 /**
 780  * fc_lport_test_ready() - Determine if a local port is in the READY state
 781  * @lport: The local port to test
 782  */
 783 static inline int fc_lport_test_ready(struct fc_lport *lport)
 784 {
 785         return lport->state == LPORT_ST_READY;
 786 }
 787 
 788 /**
 789  * fc_set_wwnn() - Set the World Wide Node Name of a local port
 790  * @lport: The local port whose WWNN is to be set
 791  * @wwnn:  The new WWNN
 792  */
 793 static inline void fc_set_wwnn(struct fc_lport *lport, u64 wwnn)
 794 {
 795         lport->wwnn = wwnn;
 796 }
 797 
 798 /**
 799  * fc_set_wwpn() - Set the World Wide Port Name of a local port
 800  * @lport: The local port whose WWPN is to be set
 801  * @wwpn:  The new WWPN
 802  */
 803 static inline void fc_set_wwpn(struct fc_lport *lport, u64 wwpn)
 804 {
 805         lport->wwpn = wwpn;
 806 }
 807 
 808 /**
 809  * fc_lport_state_enter() - Change a local port's state
 810  * @lport: The local port whose state is to change
 811  * @state: The new state
 812  */
 813 static inline void fc_lport_state_enter(struct fc_lport *lport,
 814                                         enum fc_lport_state state)
 815 {
 816         if (state != lport->state)
 817                 lport->retry_count = 0;
 818         lport->state = state;
 819 }
 820 
 821 /**
 822  * fc_lport_init_stats() - Allocate per-CPU statistics for a local port
 823  * @lport: The local port whose statistics are to be initialized
 824  */
 825 static inline int fc_lport_init_stats(struct fc_lport *lport)
 826 {
 827         lport->stats = alloc_percpu(struct fc_stats);
 828         if (!lport->stats)
 829                 return -ENOMEM;
 830         return 0;
 831 }
 832 
 833 /**
 834  * fc_lport_free_stats() - Free memory for a local port's statistics
 835  * @lport: The local port whose statistics are to be freed
 836  */
 837 static inline void fc_lport_free_stats(struct fc_lport *lport)
 838 {
 839         free_percpu(lport->stats);
 840 }
 841 
 842 /**
 843  * lport_priv() - Return the private data from a local port
 844  * @lport: The local port whose private data is to be retreived
 845  */
 846 static inline void *lport_priv(const struct fc_lport *lport)
 847 {
 848         return (void *)(lport + 1);
 849 }
 850 
 851 /**
 852  * libfc_host_alloc() - Allocate a Scsi_Host with room for a local port and
 853  *                      LLD private data
 854  * @sht:       The SCSI host template
 855  * @priv_size: Size of private data
 856  *
 857  * Returns: libfc lport
 858  */
 859 static inline struct fc_lport *
 860 libfc_host_alloc(struct scsi_host_template *sht, int priv_size)
 861 {
 862         struct fc_lport *lport;
 863         struct Scsi_Host *shost;
 864 
 865         shost = scsi_host_alloc(sht, sizeof(*lport) + priv_size);
 866         if (!shost)
 867                 return NULL;
 868         lport = shost_priv(shost);
 869         lport->host = shost;
 870         INIT_LIST_HEAD(&lport->ema_list);
 871         INIT_LIST_HEAD(&lport->vports);
 872         return lport;
 873 }
 874 
 875 /*
 876  * FC_FCP HELPER FUNCTIONS
 877  *****************************/
 878 static inline bool fc_fcp_is_read(const struct fc_fcp_pkt *fsp)
 879 {
 880         if (fsp && fsp->cmd)
 881                 return fsp->cmd->sc_data_direction == DMA_FROM_DEVICE;
 882         return false;
 883 }
 884 
 885 /*
 886  * LOCAL PORT LAYER
 887  *****************************/
 888 int fc_lport_init(struct fc_lport *);
 889 int fc_lport_destroy(struct fc_lport *);
 890 int fc_fabric_logoff(struct fc_lport *);
 891 int fc_fabric_login(struct fc_lport *);
 892 void __fc_linkup(struct fc_lport *);
 893 void fc_linkup(struct fc_lport *);
 894 void __fc_linkdown(struct fc_lport *);
 895 void fc_linkdown(struct fc_lport *);
 896 void fc_vport_setlink(struct fc_lport *);
 897 void fc_vports_linkchange(struct fc_lport *);
 898 int fc_lport_config(struct fc_lport *);
 899 int fc_lport_reset(struct fc_lport *);
 900 void fc_lport_recv(struct fc_lport *lport, struct fc_frame *fp);
 901 int fc_set_mfs(struct fc_lport *, u32 mfs);
 902 struct fc_lport *libfc_vport_create(struct fc_vport *, int privsize);
 903 struct fc_lport *fc_vport_id_lookup(struct fc_lport *, u32 port_id);
 904 int fc_lport_bsg_request(struct bsg_job *);
 905 void fc_lport_set_local_id(struct fc_lport *, u32 port_id);
 906 void fc_lport_iterate(void (*func)(struct fc_lport *, void *), void *);
 907 
 908 /*
 909  * REMOTE PORT LAYER
 910  *****************************/
 911 void fc_rport_terminate_io(struct fc_rport *);
 912 struct fc_rport_priv *fc_rport_lookup(const struct fc_lport *lport,
 913                                       u32 port_id);
 914 struct fc_rport_priv *fc_rport_create(struct fc_lport *, u32);
 915 void fc_rport_destroy(struct kref *kref);
 916 int fc_rport_login(struct fc_rport_priv *rdata);
 917 int fc_rport_logoff(struct fc_rport_priv *rdata);
 918 void fc_rport_recv_req(struct fc_lport *lport, struct fc_frame *fp);
 919 void fc_rport_flush_queue(void);
 920 
 921 /*
 922  * DISCOVERY LAYER
 923  *****************************/
 924 void fc_disc_init(struct fc_lport *);
 925 void fc_disc_config(struct fc_lport *, void *);
 926 
 927 static inline struct fc_lport *fc_disc_lport(struct fc_disc *disc)
 928 {
 929         return container_of(disc, struct fc_lport, disc);
 930 }
 931 
 932 /*
 933  * FCP LAYER
 934  *****************************/
 935 int fc_fcp_init(struct fc_lport *);
 936 void fc_fcp_destroy(struct fc_lport *);
 937 
 938 /*
 939  * SCSI INTERACTION LAYER
 940  *****************************/
 941 int fc_queuecommand(struct Scsi_Host *, struct scsi_cmnd *);
 942 int fc_eh_abort(struct scsi_cmnd *);
 943 int fc_eh_device_reset(struct scsi_cmnd *);
 944 int fc_eh_host_reset(struct scsi_cmnd *);
 945 int fc_slave_alloc(struct scsi_device *);
 946 
 947 /*
 948  * ELS/CT interface
 949  *****************************/
 950 int fc_elsct_init(struct fc_lport *);
 951 struct fc_seq *fc_elsct_send(struct fc_lport *, u32 did,
 952                                     struct fc_frame *,
 953                                     unsigned int op,
 954                                     void (*resp)(struct fc_seq *,
 955                                                  struct fc_frame *,
 956                                                  void *arg),
 957                                     void *arg, u32 timer_msec);
 958 void fc_lport_flogi_resp(struct fc_seq *, struct fc_frame *, void *);
 959 void fc_lport_logo_resp(struct fc_seq *, struct fc_frame *, void *);
 960 void fc_fill_reply_hdr(struct fc_frame *, const struct fc_frame *,
 961                        enum fc_rctl, u32 parm_offset);
 962 void fc_fill_hdr(struct fc_frame *, const struct fc_frame *,
 963                  enum fc_rctl, u32 f_ctl, u16 seq_cnt, u32 parm_offset);
 964 
 965 
 966 /*
 967  * EXCHANGE MANAGER LAYER
 968  *****************************/
 969 int fc_exch_init(struct fc_lport *);
 970 void fc_exch_update_stats(struct fc_lport *lport);
 971 struct fc_seq *fc_exch_seq_send(struct fc_lport *lport,
 972                                 struct fc_frame *fp,
 973                                 void (*resp)(struct fc_seq *,
 974                                              struct fc_frame *fp,
 975                                              void *arg),
 976                                 void (*destructor)(struct fc_seq *, void *),
 977                                 void *arg, u32 timer_msec);
 978 void fc_seq_els_rsp_send(struct fc_frame *, enum fc_els_cmd,
 979                          struct fc_seq_els_data *);
 980 struct fc_seq *fc_seq_start_next(struct fc_seq *sp);
 981 void fc_seq_set_resp(struct fc_seq *sp,
 982                      void (*resp)(struct fc_seq *, struct fc_frame *, void *),
 983                      void *arg);
 984 struct fc_seq *fc_seq_assign(struct fc_lport *lport, struct fc_frame *fp);
 985 void fc_seq_release(struct fc_seq *sp);
 986 struct fc_exch_mgr_anchor *fc_exch_mgr_add(struct fc_lport *,
 987                                            struct fc_exch_mgr *,
 988                                            bool (*match)(struct fc_frame *));
 989 void fc_exch_mgr_del(struct fc_exch_mgr_anchor *);
 990 int fc_exch_mgr_list_clone(struct fc_lport *src, struct fc_lport *dst);
 991 struct fc_exch_mgr *fc_exch_mgr_alloc(struct fc_lport *, enum fc_class class,
 992                                       u16 min_xid, u16 max_xid,
 993                                       bool (*match)(struct fc_frame *));
 994 void fc_exch_mgr_free(struct fc_lport *);
 995 void fc_exch_recv(struct fc_lport *, struct fc_frame *);
 996 void fc_exch_mgr_reset(struct fc_lport *, u32 s_id, u32 d_id);
 997 int fc_seq_send(struct fc_lport *lport, struct fc_seq *sp, struct fc_frame *fp);
 998 int fc_seq_exch_abort(const struct fc_seq *, unsigned int timer_msec);
 999 void fc_exch_done(struct fc_seq *sp);
1000 
1001 /*
1002  * Functions for fc_functions_template
1003  */
1004 void fc_get_host_speed(struct Scsi_Host *);
1005 void fc_get_host_port_state(struct Scsi_Host *);
1006 void fc_set_rport_loss_tmo(struct fc_rport *, u32 timeout);
1007 struct fc_host_statistics *fc_get_host_stats(struct Scsi_Host *);
1008 
1009 #endif /* _LIBFC_H_ */

/* [<][>][^][v][top][bottom][index][help] */