linux/include/scsi/libfc.h
<<
>>
Prefs
   1/*
   2 * Copyright(c) 2007 Intel Corporation. All rights reserved.
   3 *
   4 * This program is free software; you can redistribute it and/or modify it
   5 * under the terms and conditions of the GNU General Public License,
   6 * version 2, as published by the Free Software Foundation.
   7 *
   8 * This program is distributed in the hope it will be useful, but WITHOUT
   9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  11 * more details.
  12 *
  13 * You should have received a copy of the GNU General Public License along with
  14 * this program; if not, write to the Free Software Foundation, Inc.,
  15 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
  16 *
  17 * Maintained at www.Open-FCoE.org
  18 */
  19
  20#ifndef _LIBFC_H_
  21#define _LIBFC_H_
  22
  23#include <linux/timer.h>
  24#include <linux/if.h>
  25#include <linux/percpu.h>
  26
  27#include <scsi/scsi_transport.h>
  28#include <scsi/scsi_transport_fc.h>
  29
  30#include <scsi/fc/fc_fcp.h>
  31#include <scsi/fc/fc_ns.h>
  32#include <scsi/fc/fc_els.h>
  33#include <scsi/fc/fc_gs.h>
  34
  35#include <scsi/fc_frame.h>
  36
  37#define FC_LIBFC_LOGGING 0x01 /* General logging, not categorized */
  38#define FC_LPORT_LOGGING 0x02 /* lport layer logging */
  39#define FC_DISC_LOGGING  0x04 /* discovery layer logging */
  40#define FC_RPORT_LOGGING 0x08 /* rport layer logging */
  41#define FC_FCP_LOGGING   0x10 /* I/O path logging */
  42#define FC_EM_LOGGING    0x20 /* Exchange Manager logging */
  43#define FC_EXCH_LOGGING  0x40 /* Exchange/Sequence logging */
  44#define FC_SCSI_LOGGING  0x80 /* SCSI logging (mostly error handling) */
  45
  46extern unsigned int fc_debug_logging;
  47
  48#define FC_CHECK_LOGGING(LEVEL, CMD)                            \
  49do {                                                            \
  50        if (unlikely(fc_debug_logging & LEVEL))                 \
  51                do {                                            \
  52                        CMD;                                    \
  53                } while (0);                                    \
  54} while (0)
  55
  56#define FC_LIBFC_DBG(fmt, args...)                                      \
  57        FC_CHECK_LOGGING(FC_LIBFC_LOGGING,                              \
  58                         printk(KERN_INFO "libfc: " fmt, ##args))
  59
  60#define FC_LPORT_DBG(lport, fmt, args...)                               \
  61        FC_CHECK_LOGGING(FC_LPORT_LOGGING,                              \
  62                         printk(KERN_INFO "host%u: lport %6x: " fmt,    \
  63                                (lport)->host->host_no,                 \
  64                                fc_host_port_id((lport)->host), ##args))
  65
  66#define FC_DISC_DBG(disc, fmt, args...)                                 \
  67        FC_CHECK_LOGGING(FC_DISC_LOGGING,                               \
  68                         printk(KERN_INFO "host%u: disc: " fmt,         \
  69                                (disc)->lport->host->host_no,           \
  70                                ##args))
  71
  72#define FC_RPORT_ID_DBG(lport, port_id, fmt, args...)                   \
  73        FC_CHECK_LOGGING(FC_RPORT_LOGGING,                              \
  74                         printk(KERN_INFO "host%u: rport %6x: " fmt,    \
  75                                (lport)->host->host_no,                 \
  76                                (port_id), ##args))
  77
  78#define FC_RPORT_DBG(rdata, fmt, args...)                               \
  79        FC_RPORT_ID_DBG((rdata)->local_port, (rdata)->ids.port_id, fmt, ##args)
  80
  81#define FC_FCP_DBG(pkt, fmt, args...)                                   \
  82        FC_CHECK_LOGGING(FC_FCP_LOGGING,                                \
  83                         printk(KERN_INFO "host%u: fcp: %6x: " fmt,     \
  84                                (pkt)->lp->host->host_no,               \
  85                                pkt->rport->port_id, ##args))
  86
  87#define FC_EXCH_DBG(exch, fmt, args...)                                 \
  88        FC_CHECK_LOGGING(FC_EXCH_LOGGING,                               \
  89                         printk(KERN_INFO "host%u: xid %4x: " fmt,      \
  90                                (exch)->lp->host->host_no,              \
  91                                exch->xid, ##args))
  92
  93#define FC_SCSI_DBG(lport, fmt, args...)                                \
  94        FC_CHECK_LOGGING(FC_SCSI_LOGGING,                               \
  95                         printk(KERN_INFO "host%u: scsi: " fmt,         \
  96                                (lport)->host->host_no, ##args))
  97
  98/*
  99 * libfc error codes
 100 */
 101#define FC_NO_ERR       0       /* no error */
 102#define FC_EX_TIMEOUT   1       /* Exchange timeout */
 103#define FC_EX_CLOSED    2       /* Exchange closed */
 104
 105/* some helpful macros */
 106
 107#define ntohll(x) be64_to_cpu(x)
 108#define htonll(x) cpu_to_be64(x)
 109
 110#define ntoh24(p) (((p)[0] << 16) | ((p)[1] << 8) | ((p)[2]))
 111
 112#define hton24(p, v)    do {                    \
 113                p[0] = (((v) >> 16) & 0xFF);    \
 114                p[1] = (((v) >> 8) & 0xFF);     \
 115                p[2] = ((v) & 0xFF);            \
 116        } while (0)
 117
 118/*
 119 * FC HBA status
 120 */
 121enum fc_lport_state {
 122        LPORT_ST_DISABLED = 0,
 123        LPORT_ST_FLOGI,
 124        LPORT_ST_DNS,
 125        LPORT_ST_RPN_ID,
 126        LPORT_ST_RFT_ID,
 127        LPORT_ST_SCR,
 128        LPORT_ST_READY,
 129        LPORT_ST_LOGO,
 130        LPORT_ST_RESET
 131};
 132
 133enum fc_disc_event {
 134        DISC_EV_NONE = 0,
 135        DISC_EV_SUCCESS,
 136        DISC_EV_FAILED
 137};
 138
 139enum fc_rport_state {
 140        RPORT_ST_INIT,          /* initialized */
 141        RPORT_ST_PLOGI,         /* waiting for PLOGI completion */
 142        RPORT_ST_PRLI,          /* waiting for PRLI completion */
 143        RPORT_ST_RTV,           /* waiting for RTV completion */
 144        RPORT_ST_READY,         /* ready for use */
 145        RPORT_ST_LOGO,          /* port logout sent */
 146        RPORT_ST_ADISC,         /* Discover Address sent */
 147        RPORT_ST_DELETE,        /* port being deleted */
 148};
 149
 150/**
 151 * struct fc_disc_port - temporary discovery port to hold rport identifiers
 152 * @lp:         Fibre Channel host port instance
 153 * @peers:      Node for list management during discovery and RSCN processing
 154 * @rport_work: Work struct for starting the rport state machine
 155 * @port_id:    Port ID of the discovered port
 156 */
 157struct fc_disc_port {
 158        struct fc_lport             *lp;
 159        struct list_head            peers;
 160        struct work_struct          rport_work;
 161        u32                         port_id;
 162};
 163
 164enum fc_rport_event {
 165        RPORT_EV_NONE = 0,
 166        RPORT_EV_READY,
 167        RPORT_EV_FAILED,
 168        RPORT_EV_STOP,
 169        RPORT_EV_LOGO
 170};
 171
 172struct fc_rport_priv;
 173
 174struct fc_rport_operations {
 175        void (*event_callback)(struct fc_lport *, struct fc_rport_priv *,
 176                               enum fc_rport_event);
 177};
 178
 179/**
 180 * struct fc_rport_libfc_priv - libfc internal information about a remote port
 181 * @local_port: Fibre Channel host port instance
 182 * @rp_state: indicates READY for I/O or DELETE when blocked.
 183 * @flags: REC and RETRY supported flags
 184 * @e_d_tov: error detect timeout value (in msec)
 185 * @r_a_tov: resource allocation timeout value (in msec)
 186 */
 187struct fc_rport_libfc_priv {
 188        struct fc_lport            *local_port;
 189        enum fc_rport_state        rp_state;
 190        u16                        flags;
 191        #define FC_RP_FLAGS_REC_SUPPORTED       (1 << 0)
 192        #define FC_RP_FLAGS_RETRY               (1 << 1)
 193        unsigned int               e_d_tov;
 194        unsigned int               r_a_tov;
 195};
 196
 197/**
 198 * struct fc_rport_priv - libfc rport and discovery info about a remote port
 199 * @local_port: Fibre Channel host port instance
 200 * @rport: transport remote port
 201 * @kref: reference counter
 202 * @rp_state: state tracks progress of PLOGI, PRLI, and RTV exchanges
 203 * @ids: remote port identifiers and roles
 204 * @flags: REC and RETRY supported flags
 205 * @max_seq: maximum number of concurrent sequences
 206 * @disc_id: discovery identifier
 207 * @maxframe_size: maximum frame size
 208 * @retries: retry count in current state
 209 * @e_d_tov: error detect timeout value (in msec)
 210 * @r_a_tov: resource allocation timeout value (in msec)
 211 * @rp_mutex: mutex protects rport
 212 * @retry_work:
 213 * @event_callback: Callback for rport READY, FAILED or LOGO
 214 */
 215struct fc_rport_priv {
 216        struct fc_lport            *local_port;
 217        struct fc_rport            *rport;
 218        struct kref                kref;
 219        enum fc_rport_state        rp_state;
 220        struct fc_rport_identifiers ids;
 221        u16                        flags;
 222        u16                        max_seq;
 223        u16                        disc_id;
 224        u16                        maxframe_size;
 225        unsigned int               retries;
 226        unsigned int               e_d_tov;
 227        unsigned int               r_a_tov;
 228        struct mutex               rp_mutex;
 229        struct delayed_work        retry_work;
 230        enum fc_rport_event        event;
 231        struct fc_rport_operations *ops;
 232        struct list_head           peers;
 233        struct work_struct         event_work;
 234        u32                        supported_classes;
 235};
 236
 237/*
 238 * fcoe stats structure
 239 */
 240struct fcoe_dev_stats {
 241        u64             SecondsSinceLastReset;
 242        u64             TxFrames;
 243        u64             TxWords;
 244        u64             RxFrames;
 245        u64             RxWords;
 246        u64             ErrorFrames;
 247        u64             DumpedFrames;
 248        u64             LinkFailureCount;
 249        u64             LossOfSignalCount;
 250        u64             InvalidTxWordCount;
 251        u64             InvalidCRCCount;
 252        u64             InputRequests;
 253        u64             OutputRequests;
 254        u64             ControlRequests;
 255        u64             InputMegabytes;
 256        u64             OutputMegabytes;
 257};
 258
 259/*
 260 * els data is used for passing ELS respone specific
 261 * data to send ELS response mainly using infomation
 262 * in exchange and sequence in EM layer.
 263 */
 264struct fc_seq_els_data {
 265        struct fc_frame *fp;
 266        enum fc_els_rjt_reason reason;
 267        enum fc_els_rjt_explan explan;
 268};
 269
 270/*
 271 * FCP request structure, one for each scsi cmd request
 272 */
 273struct fc_fcp_pkt {
 274        /*
 275         * housekeeping stuff
 276         */
 277        struct fc_lport *lp;    /* handle to hba struct */
 278        u16             state;          /* scsi_pkt state state */
 279        u16             tgt_flags;      /* target flags  */
 280        atomic_t        ref_cnt;        /* fcp pkt ref count */
 281        spinlock_t      scsi_pkt_lock;  /* Must be taken before the host lock
 282                                         * if both are held at the same time */
 283        /*
 284         * SCSI I/O related stuff
 285         */
 286        struct scsi_cmnd *cmd;          /* scsi command pointer. set/clear
 287                                         * under host lock */
 288        struct list_head list;          /* tracks queued commands. access under
 289                                         * host lock */
 290        /*
 291         * timeout related stuff
 292         */
 293        struct timer_list timer;        /* command timer */
 294        struct completion tm_done;
 295        int     wait_for_comp;
 296        unsigned long   start_time;     /* start jiffie */
 297        unsigned long   end_time;       /* end jiffie */
 298        unsigned long   last_pkt_time;   /* jiffies of last frame received */
 299
 300        /*
 301         * scsi cmd and data transfer information
 302         */
 303        u32             data_len;
 304        /*
 305         * transport related veriables
 306         */
 307        struct fcp_cmnd cdb_cmd;
 308        size_t          xfer_len;
 309        u16             xfer_ddp;       /* this xfer is ddped */
 310        u32             xfer_contig_end; /* offset of end of contiguous xfer */
 311        u16             max_payload;    /* max payload size in bytes */
 312
 313        /*
 314         * scsi/fcp return status
 315         */
 316        u32             io_status;      /* SCSI result upper 24 bits */
 317        u8              cdb_status;
 318        u8              status_code;    /* FCP I/O status */
 319        /* bit 3 Underrun bit 2: overrun */
 320        u8              scsi_comp_flags;
 321        u32             req_flags;      /* bit 0: read bit:1 write */
 322        u32             scsi_resid;     /* residule length */
 323
 324        struct fc_rport *rport;         /* remote port pointer */
 325        struct fc_seq   *seq_ptr;       /* current sequence pointer */
 326        /*
 327         * Error Processing
 328         */
 329        u8              recov_retry;    /* count of recovery retries */
 330        struct fc_seq   *recov_seq;     /* sequence for REC or SRR */
 331};
 332/*
 333 * FC_FCP HELPER FUNCTIONS
 334 *****************************/
 335static inline bool fc_fcp_is_read(const struct fc_fcp_pkt *fsp)
 336{
 337        if (fsp && fsp->cmd)
 338                return fsp->cmd->sc_data_direction == DMA_FROM_DEVICE;
 339        return false;
 340}
 341
 342/*
 343 * Structure and function definitions for managing Fibre Channel Exchanges
 344 * and Sequences
 345 *
 346 * fc_exch holds state for one exchange and links to its active sequence.
 347 *
 348 * fc_seq holds the state for an individual sequence.
 349 */
 350
 351struct fc_exch_mgr;
 352struct fc_exch_mgr_anchor;
 353extern u16      fc_cpu_mask;    /* cpu mask for possible cpus */
 354
 355/*
 356 * Sequence.
 357 */
 358struct fc_seq {
 359        u8      id;             /* seq ID */
 360        u16     ssb_stat;       /* status flags for sequence status block */
 361        u16     cnt;            /* frames sent so far on sequence */
 362        u32     rec_data;       /* FC-4 value for REC */
 363};
 364
 365#define FC_EX_DONE              (1 << 0) /* ep is completed */
 366#define FC_EX_RST_CLEANUP       (1 << 1) /* reset is forcing completion */
 367
 368/*
 369 * Exchange.
 370 *
 371 * Locking notes: The ex_lock protects following items:
 372 *      state, esb_stat, f_ctl, seq.ssb_stat
 373 *      seq_id
 374 *      sequence allocation
 375 */
 376struct fc_exch {
 377        struct fc_exch_mgr *em;         /* exchange manager */
 378        struct fc_exch_pool *pool;      /* per cpu exches pool */
 379        u32             state;          /* internal driver state */
 380        u16             xid;            /* our exchange ID */
 381        struct list_head        ex_list;        /* free or busy list linkage */
 382        spinlock_t      ex_lock;        /* lock covering exchange state */
 383        atomic_t        ex_refcnt;      /* reference counter */
 384        struct delayed_work timeout_work; /* timer for upper level protocols */
 385        struct fc_lport *lp;            /* fc device instance */
 386        u16             oxid;           /* originator's exchange ID */
 387        u16             rxid;           /* responder's exchange ID */
 388        u32             oid;            /* originator's FCID */
 389        u32             sid;            /* source FCID */
 390        u32             did;            /* destination FCID */
 391        u32             esb_stat;       /* exchange status for ESB */
 392        u32             r_a_tov;        /* r_a_tov from rport (msec) */
 393        u8              seq_id;         /* next sequence ID to use */
 394        u32             f_ctl;          /* F_CTL flags for sequences */
 395        u8              fh_type;        /* frame type */
 396        enum fc_class   class;          /* class of service */
 397        struct fc_seq   seq;            /* single sequence */
 398        /*
 399         * Handler for responses to this current exchange.
 400         */
 401        void            (*resp)(struct fc_seq *, struct fc_frame *, void *);
 402        void            (*destructor)(struct fc_seq *, void *);
 403        /*
 404         * arg is passed as void pointer to exchange
 405         * resp and destructor handlers
 406         */
 407        void            *arg;
 408};
 409#define fc_seq_exch(sp) container_of(sp, struct fc_exch, seq)
 410
 411struct libfc_function_template {
 412
 413        /*
 414         * Interface to send a FC frame
 415         *
 416         * STATUS: REQUIRED
 417         */
 418        int (*frame_send)(struct fc_lport *lp, struct fc_frame *fp);
 419
 420        /*
 421         * Interface to send ELS/CT frames
 422         *
 423         * STATUS: OPTIONAL
 424         */
 425        struct fc_seq *(*elsct_send)(struct fc_lport *lport,
 426                                     u32 did,
 427                                     struct fc_frame *fp,
 428                                     unsigned int op,
 429                                     void (*resp)(struct fc_seq *,
 430                                             struct fc_frame *fp,
 431                                             void *arg),
 432                                     void *arg, u32 timer_msec);
 433
 434        /*
 435         * Send the FC frame payload using a new exchange and sequence.
 436         *
 437         * The frame pointer with some of the header's fields must be
 438         * filled before calling exch_seq_send(), those fields are,
 439         *
 440         * - routing control
 441         * - FC port did
 442         * - FC port sid
 443         * - FC header type
 444         * - frame control
 445         * - parameter or relative offset
 446         *
 447         * The exchange response handler is set in this routine to resp()
 448         * function pointer. It can be called in two scenarios: if a timeout
 449         * occurs or if a response frame is received for the exchange. The
 450         * fc_frame pointer in response handler will also indicate timeout
 451         * as error using IS_ERR related macros.
 452         *
 453         * The exchange destructor handler is also set in this routine.
 454         * The destructor handler is invoked by EM layer when exchange
 455         * is about to free, this can be used by caller to free its
 456         * resources along with exchange free.
 457         *
 458         * The arg is passed back to resp and destructor handler.
 459         *
 460         * The timeout value (in msec) for an exchange is set if non zero
 461         * timer_msec argument is specified. The timer is canceled when
 462         * it fires or when the exchange is done. The exchange timeout handler
 463         * is registered by EM layer.
 464         *
 465         * STATUS: OPTIONAL
 466         */
 467        struct fc_seq *(*exch_seq_send)(struct fc_lport *lp,
 468                                        struct fc_frame *fp,
 469                                        void (*resp)(struct fc_seq *sp,
 470                                                     struct fc_frame *fp,
 471                                                     void *arg),
 472                                        void (*destructor)(struct fc_seq *sp,
 473                                                           void *arg),
 474                                        void *arg, unsigned int 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 *lp, u16 xid,
 483                         struct scatterlist *sgl, unsigned int sgc);
 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 *lp, u16 xid);
 491        /*
 492         * Send a frame using an existing sequence and exchange.
 493         *
 494         * STATUS: OPTIONAL
 495         */
 496        int (*seq_send)(struct fc_lport *lp, struct fc_seq *sp,
 497                        struct fc_frame *fp);
 498
 499        /*
 500         * Send an ELS response using infomation from a previous
 501         * exchange and sequence.
 502         *
 503         * STATUS: OPTIONAL
 504         */
 505        void (*seq_els_rsp_send)(struct fc_seq *sp, enum fc_els_cmd els_cmd,
 506                                 struct fc_seq_els_data *els_data);
 507
 508        /*
 509         * Abort an exchange and sequence. Generally called because of a
 510         * exchange timeout or an abort from the upper layer.
 511         *
 512         * A timer_msec can be specified for abort timeout, if non-zero
 513         * timer_msec value is specified then exchange resp handler
 514         * will be called with timeout error if no response to abort.
 515         *
 516         * STATUS: OPTIONAL
 517         */
 518        int (*seq_exch_abort)(const struct fc_seq *req_sp,
 519                              unsigned int timer_msec);
 520
 521        /*
 522         * Indicate that an exchange/sequence tuple is complete and the memory
 523         * allocated for the related objects may be freed.
 524         *
 525         * STATUS: OPTIONAL
 526         */
 527        void (*exch_done)(struct fc_seq *sp);
 528
 529        /*
 530         * Start a new sequence on the same exchange/sequence tuple.
 531         *
 532         * STATUS: OPTIONAL
 533         */
 534        struct fc_seq *(*seq_start_next)(struct fc_seq *sp);
 535
 536        /*
 537         * Reset an exchange manager, completing all sequences and exchanges.
 538         * If s_id is non-zero, reset only exchanges originating from that FID.
 539         * If d_id is non-zero, reset only exchanges sending to that FID.
 540         *
 541         * STATUS: OPTIONAL
 542         */
 543        void (*exch_mgr_reset)(struct fc_lport *,
 544                               u32 s_id, u32 d_id);
 545
 546        /*
 547         * Flush the rport work queue. Generally used before shutdown.
 548         *
 549         * STATUS: OPTIONAL
 550         */
 551        void (*rport_flush_queue)(void);
 552
 553        /*
 554         * Receive a frame for a local port.
 555         *
 556         * STATUS: OPTIONAL
 557         */
 558        void (*lport_recv)(struct fc_lport *lp, struct fc_seq *sp,
 559                           struct fc_frame *fp);
 560
 561        /*
 562         * Reset the local port.
 563         *
 564         * STATUS: OPTIONAL
 565         */
 566        int (*lport_reset)(struct fc_lport *);
 567
 568        /*
 569         * Create a remote port with a given port ID
 570         *
 571         * STATUS: OPTIONAL
 572         */
 573        struct fc_rport_priv *(*rport_create)(struct fc_lport *, u32);
 574
 575        /*
 576         * Initiates the RP state machine. It is called from the LP module.
 577         * This function will issue the following commands to the N_Port
 578         * identified by the FC ID provided.
 579         *
 580         * - PLOGI
 581         * - PRLI
 582         * - RTV
 583         *
 584         * STATUS: OPTIONAL
 585         */
 586        int (*rport_login)(struct fc_rport_priv *);
 587
 588        /*
 589         * Logoff, and remove the rport from the transport if
 590         * it had been added. This will send a LOGO to the target.
 591         *
 592         * STATUS: OPTIONAL
 593         */
 594        int (*rport_logoff)(struct fc_rport_priv *);
 595
 596        /*
 597         * Recieve a request from a remote port.
 598         *
 599         * STATUS: OPTIONAL
 600         */
 601        void (*rport_recv_req)(struct fc_seq *, struct fc_frame *,
 602                               struct fc_lport *);
 603
 604        /*
 605         * lookup an rport by it's port ID.
 606         *
 607         * STATUS: OPTIONAL
 608         */
 609        struct fc_rport_priv *(*rport_lookup)(const struct fc_lport *, u32);
 610
 611        /*
 612         * Destroy an rport after final kref_put().
 613         * The argument is a pointer to the kref inside the fc_rport_priv.
 614         */
 615        void (*rport_destroy)(struct kref *);
 616
 617        /*
 618         * Send a fcp cmd from fsp pkt.
 619         * Called with the SCSI host lock unlocked and irqs disabled.
 620         *
 621         * The resp handler is called when FCP_RSP received.
 622         *
 623         * STATUS: OPTIONAL
 624         */
 625        int (*fcp_cmd_send)(struct fc_lport *lp, struct fc_fcp_pkt *fsp,
 626                            void (*resp)(struct fc_seq *, struct fc_frame *fp,
 627                                         void *arg));
 628
 629        /*
 630         * Cleanup the FCP layer, used durring link down and reset
 631         *
 632         * STATUS: OPTIONAL
 633         */
 634        void (*fcp_cleanup)(struct fc_lport *lp);
 635
 636        /*
 637         * Abort all I/O on a local port
 638         *
 639         * STATUS: OPTIONAL
 640         */
 641        void (*fcp_abort_io)(struct fc_lport *lp);
 642
 643        /*
 644         * Receive a request for the discovery layer.
 645         *
 646         * STATUS: OPTIONAL
 647         */
 648        void (*disc_recv_req)(struct fc_seq *,
 649                              struct fc_frame *, struct fc_lport *);
 650
 651        /*
 652         * Start discovery for a local port.
 653         *
 654         * STATUS: OPTIONAL
 655         */
 656        void (*disc_start)(void (*disc_callback)(struct fc_lport *,
 657                                                 enum fc_disc_event),
 658                           struct fc_lport *);
 659
 660        /*
 661         * Stop discovery for a given lport. This will remove
 662         * all discovered rports
 663         *
 664         * STATUS: OPTIONAL
 665         */
 666        void (*disc_stop) (struct fc_lport *);
 667
 668        /*
 669         * Stop discovery for a given lport. This will block
 670         * until all discovered rports are deleted from the
 671         * FC transport class
 672         *
 673         * STATUS: OPTIONAL
 674         */
 675        void (*disc_stop_final) (struct fc_lport *);
 676};
 677
 678/* information used by the discovery layer */
 679struct fc_disc {
 680        unsigned char           retry_count;
 681        unsigned char           pending;
 682        unsigned char           requested;
 683        unsigned short          seq_count;
 684        unsigned char           buf_len;
 685        u16                     disc_id;
 686
 687        void (*disc_callback)(struct fc_lport *,
 688                              enum fc_disc_event);
 689
 690        struct list_head         rports;
 691        struct fc_lport         *lport;
 692        struct mutex            disc_mutex;
 693        struct fc_gpn_ft_resp   partial_buf;    /* partial name buffer */
 694        struct delayed_work     disc_work;
 695};
 696
 697struct fc_lport {
 698        struct list_head list;
 699
 700        /* Associations */
 701        struct Scsi_Host        *host;
 702        struct list_head        ema_list;
 703        struct fc_rport_priv    *dns_rp;
 704        struct fc_rport_priv    *ptp_rp;
 705        void                    *scsi_priv;
 706        struct fc_disc          disc;
 707
 708        /* Operational Information */
 709        struct libfc_function_template tt;
 710        u8                      link_up;
 711        u8                      qfull;
 712        enum fc_lport_state     state;
 713        unsigned long           boot_time;
 714
 715        struct fc_host_statistics host_stats;
 716        struct fcoe_dev_stats   *dev_stats;
 717
 718        u64                     wwpn;
 719        u64                     wwnn;
 720        u8                      retry_count;
 721
 722        /* Capabilities */
 723        u32                     sg_supp:1;      /* scatter gather supported */
 724        u32                     seq_offload:1;  /* seq offload supported */
 725        u32                     crc_offload:1;  /* crc offload supported */
 726        u32                     lro_enabled:1;  /* large receive offload */
 727        u32                     mfs;            /* max FC payload size */
 728        unsigned int            service_params;
 729        unsigned int            e_d_tov;
 730        unsigned int            r_a_tov;
 731        u8                      max_retry_count;
 732        u8                      max_rport_retry_count;
 733        u16                     link_speed;
 734        u16                     link_supported_speeds;
 735        u16                     lro_xid;        /* max xid for fcoe lro */
 736        unsigned int            lso_max;        /* max large send size */
 737        struct fc_ns_fts        fcts;           /* FC-4 type masks */
 738        struct fc_els_rnid_gen  rnid_gen;       /* RNID information */
 739
 740        /* Semaphores */
 741        struct mutex lp_mutex;
 742
 743        /* Miscellaneous */
 744        struct delayed_work     retry_work;
 745        struct delayed_work     disc_work;
 746};
 747
 748/*
 749 * FC_LPORT HELPER FUNCTIONS
 750 *****************************/
 751static inline int fc_lport_test_ready(struct fc_lport *lp)
 752{
 753        return lp->state == LPORT_ST_READY;
 754}
 755
 756static inline void fc_set_wwnn(struct fc_lport *lp, u64 wwnn)
 757{
 758        lp->wwnn = wwnn;
 759}
 760
 761static inline void fc_set_wwpn(struct fc_lport *lp, u64 wwnn)
 762{
 763        lp->wwpn = wwnn;
 764}
 765
 766static inline void fc_lport_state_enter(struct fc_lport *lp,
 767                                        enum fc_lport_state state)
 768{
 769        if (state != lp->state)
 770                lp->retry_count = 0;
 771        lp->state = state;
 772}
 773
 774static inline int fc_lport_init_stats(struct fc_lport *lp)
 775{
 776        /* allocate per cpu stats block */
 777        lp->dev_stats = alloc_percpu(struct fcoe_dev_stats);
 778        if (!lp->dev_stats)
 779                return -ENOMEM;
 780        return 0;
 781}
 782
 783static inline void fc_lport_free_stats(struct fc_lport *lp)
 784{
 785        free_percpu(lp->dev_stats);
 786}
 787
 788static inline struct fcoe_dev_stats *fc_lport_get_stats(struct fc_lport *lp)
 789{
 790        return per_cpu_ptr(lp->dev_stats, smp_processor_id());
 791}
 792
 793static inline void *lport_priv(const struct fc_lport *lp)
 794{
 795        return (void *)(lp + 1);
 796}
 797
 798/**
 799 * libfc_host_alloc() - Allocate a Scsi_Host with room for the fc_lport
 800 * @sht: ptr to the scsi host templ
 801 * @priv_size: size of private data after fc_lport
 802 *
 803 * Returns: ptr to Scsi_Host
 804 */
 805static inline struct Scsi_Host *
 806libfc_host_alloc(struct scsi_host_template *sht, int priv_size)
 807{
 808        return scsi_host_alloc(sht, sizeof(struct fc_lport) + priv_size);
 809}
 810
 811/*
 812 * LOCAL PORT LAYER
 813 *****************************/
 814int fc_lport_init(struct fc_lport *lp);
 815
 816/*
 817 * Destroy the specified local port by finding and freeing all
 818 * fc_rports associated with it and then by freeing the fc_lport
 819 * itself.
 820 */
 821int fc_lport_destroy(struct fc_lport *lp);
 822
 823/*
 824 * Logout the specified local port from the fabric
 825 */
 826int fc_fabric_logoff(struct fc_lport *lp);
 827
 828/*
 829 * Initiate the LP state machine. This handler will use fc_host_attr
 830 * to store the FLOGI service parameters, so fc_host_attr must be
 831 * initialized before calling this handler.
 832 */
 833int fc_fabric_login(struct fc_lport *lp);
 834
 835/*
 836 * The link is up for the given local port.
 837 */
 838void fc_linkup(struct fc_lport *);
 839
 840/*
 841 * Link is down for the given local port.
 842 */
 843void fc_linkdown(struct fc_lport *);
 844
 845/*
 846 * Configure the local port.
 847 */
 848int fc_lport_config(struct fc_lport *);
 849
 850/*
 851 * Reset the local port.
 852 */
 853int fc_lport_reset(struct fc_lport *);
 854
 855/*
 856 * Set the mfs or reset
 857 */
 858int fc_set_mfs(struct fc_lport *lp, u32 mfs);
 859
 860
 861/*
 862 * REMOTE PORT LAYER
 863 *****************************/
 864int fc_rport_init(struct fc_lport *lp);
 865void fc_rport_terminate_io(struct fc_rport *rp);
 866
 867/*
 868 * DISCOVERY LAYER
 869 *****************************/
 870int fc_disc_init(struct fc_lport *lp);
 871
 872
 873/*
 874 * SCSI LAYER
 875 *****************************/
 876/*
 877 * Initialize the SCSI block of libfc
 878 */
 879int fc_fcp_init(struct fc_lport *);
 880
 881/*
 882 * This section provides an API which allows direct interaction
 883 * with the SCSI-ml. Each of these functions satisfies a function
 884 * pointer defined in Scsi_Host and therefore is always called
 885 * directly from the SCSI-ml.
 886 */
 887int fc_queuecommand(struct scsi_cmnd *sc_cmd,
 888                    void (*done)(struct scsi_cmnd *));
 889
 890/*
 891 * complete processing of a fcp packet
 892 *
 893 * This function may sleep if a fsp timer is pending.
 894 * The host lock must not be held by caller.
 895 */
 896void fc_fcp_complete(struct fc_fcp_pkt *fsp);
 897
 898/*
 899 * Send an ABTS frame to the target device. The sc_cmd argument
 900 * is a pointer to the SCSI command to be aborted.
 901 */
 902int fc_eh_abort(struct scsi_cmnd *sc_cmd);
 903
 904/*
 905 * Reset a LUN by sending send the tm cmd to the target.
 906 */
 907int fc_eh_device_reset(struct scsi_cmnd *sc_cmd);
 908
 909/*
 910 * Reset the host adapter.
 911 */
 912int fc_eh_host_reset(struct scsi_cmnd *sc_cmd);
 913
 914/*
 915 * Check rport status.
 916 */
 917int fc_slave_alloc(struct scsi_device *sdev);
 918
 919/*
 920 * Adjust the queue depth.
 921 */
 922int fc_change_queue_depth(struct scsi_device *sdev, int qdepth);
 923
 924/*
 925 * Change the tag type.
 926 */
 927int fc_change_queue_type(struct scsi_device *sdev, int tag_type);
 928
 929/*
 930 * Free memory pools used by the FCP layer.
 931 */
 932void fc_fcp_destroy(struct fc_lport *);
 933
 934/*
 935 * Set up direct-data placement for this I/O request
 936 */
 937void fc_fcp_ddp_setup(struct fc_fcp_pkt *fsp, u16 xid);
 938
 939/*
 940 * ELS/CT interface
 941 *****************************/
 942/*
 943 * Initializes ELS/CT interface
 944 */
 945int fc_elsct_init(struct fc_lport *lp);
 946
 947
 948/*
 949 * EXCHANGE MANAGER LAYER
 950 *****************************/
 951/*
 952 * Initializes Exchange Manager related
 953 * function pointers in struct libfc_function_template.
 954 */
 955int fc_exch_init(struct fc_lport *lp);
 956
 957/*
 958 * Adds Exchange Manager (EM) mp to lport.
 959 *
 960 * Adds specified mp to lport using struct fc_exch_mgr_anchor,
 961 * the struct fc_exch_mgr_anchor allows same EM sharing by
 962 * more than one lport with their specified match function,
 963 * the match function is used in allocating exchange from
 964 * added mp.
 965 */
 966struct fc_exch_mgr_anchor *fc_exch_mgr_add(struct fc_lport *lport,
 967                                           struct fc_exch_mgr *mp,
 968                                           bool (*match)(struct fc_frame *));
 969
 970/*
 971 * Deletes Exchange Manager (EM) from lport by removing
 972 * its anchor ema from lport.
 973 *
 974 * If removed anchor ema was the last user of its associated EM
 975 * then also destroys associated EM.
 976 */
 977void fc_exch_mgr_del(struct fc_exch_mgr_anchor *ema);
 978
 979/*
 980 * Allocates an Exchange Manager (EM).
 981 *
 982 * The EM manages exchanges for their allocation and
 983 * free, also allows exchange lookup for received
 984 * frame.
 985 *
 986 * The class is used for initializing FC class of
 987 * allocated exchange from EM.
 988 *
 989 * The min_xid and max_xid will limit new
 990 * exchange ID (XID) within this range for
 991 * a new exchange.
 992 * The LLD may choose to have multiple EMs,
 993 * e.g. one EM instance per CPU receive thread in LLD.
 994 *
 995 * Specified match function is used in allocating exchanges
 996 * from newly allocated EM.
 997 */
 998struct fc_exch_mgr *fc_exch_mgr_alloc(struct fc_lport *lp,
 999                                      enum fc_class class,
1000                                      u16 min_xid,
1001                                      u16 max_xid,
1002                                      bool (*match)(struct fc_frame *));
1003
1004/*
1005 * Free all exchange managers of a lport.
1006 */
1007void fc_exch_mgr_free(struct fc_lport *lport);
1008
1009/*
1010 * Receive a frame on specified local port and exchange manager.
1011 */
1012void fc_exch_recv(struct fc_lport *lp, struct fc_frame *fp);
1013
1014/*
1015 * This function is for exch_seq_send function pointer in
1016 * struct libfc_function_template, see comment block on
1017 * exch_seq_send for description of this function.
1018 */
1019struct fc_seq *fc_exch_seq_send(struct fc_lport *lp,
1020                                struct fc_frame *fp,
1021                                void (*resp)(struct fc_seq *sp,
1022                                             struct fc_frame *fp,
1023                                             void *arg),
1024                                void (*destructor)(struct fc_seq *sp,
1025                                                   void *arg),
1026                                void *arg, u32 timer_msec);
1027
1028/*
1029 * send a frame using existing sequence and exchange.
1030 */
1031int fc_seq_send(struct fc_lport *lp, struct fc_seq *sp, struct fc_frame *fp);
1032
1033/*
1034 * Send ELS response using mainly infomation
1035 * in exchange and sequence in EM layer.
1036 */
1037void fc_seq_els_rsp_send(struct fc_seq *sp, enum fc_els_cmd els_cmd,
1038                         struct fc_seq_els_data *els_data);
1039
1040/*
1041 * This function is for seq_exch_abort function pointer in
1042 * struct libfc_function_template, see comment block on
1043 * seq_exch_abort for description of this function.
1044 */
1045int fc_seq_exch_abort(const struct fc_seq *req_sp, unsigned int timer_msec);
1046
1047/*
1048 * Indicate that an exchange/sequence tuple is complete and the memory
1049 * allocated for the related objects may be freed.
1050 */
1051void fc_exch_done(struct fc_seq *sp);
1052
1053/*
1054 * Allocate a new exchange and sequence pair.
1055 */
1056struct fc_exch *fc_exch_alloc(struct fc_lport *lport, struct fc_frame *fp);
1057/*
1058 * Start a new sequence on the same exchange as the supplied sequence.
1059 */
1060struct fc_seq *fc_seq_start_next(struct fc_seq *sp);
1061
1062
1063/*
1064 * Reset all EMs of a lport, releasing its all sequences and
1065 * exchanges. If sid is non-zero, then reset only exchanges
1066 * we sourced from that FID. If did is non-zero, reset only
1067 * exchanges destined to that FID.
1068 */
1069void fc_exch_mgr_reset(struct fc_lport *, u32 s_id, u32 d_id);
1070
1071/*
1072 * Functions for fc_functions_template
1073 */
1074void fc_get_host_speed(struct Scsi_Host *shost);
1075void fc_get_host_port_type(struct Scsi_Host *shost);
1076void fc_get_host_port_state(struct Scsi_Host *shost);
1077void fc_set_rport_loss_tmo(struct fc_rport *rport, u32 timeout);
1078struct fc_host_statistics *fc_get_host_stats(struct Scsi_Host *);
1079
1080/*
1081 * module setup functions.
1082 */
1083int fc_setup_exch_mgr(void);
1084void fc_destroy_exch_mgr(void);
1085int fc_setup_rport(void);
1086void fc_destroy_rport(void);
1087
1088/*
1089 * Internal libfc functions.
1090 */
1091const char *fc_els_resp_type(struct fc_frame *);
1092
1093#endif /* _LIBFC_H_ */
1094