linux/drivers/scsi/bfa/bfa_fcs.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
   3 * All rights reserved
   4 * www.brocade.com
   5 *
   6 * Linux driver for Brocade Fibre Channel Host Bus Adapter.
   7 *
   8 * This program is free software; you can redistribute it and/or modify it
   9 * under the terms of the GNU General Public License (GPL) Version 2 as
  10 * published by the Free Software Foundation
  11 *
  12 * This program is distributed in the hope that it will be useful, but
  13 * WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15 * General Public License for more details.
  16 */
  17
  18#ifndef __BFA_FCS_H__
  19#define __BFA_FCS_H__
  20
  21#include "bfa_cs.h"
  22#include "bfa_defs.h"
  23#include "bfa_defs_fcs.h"
  24#include "bfa_modules.h"
  25#include "bfa_fc.h"
  26
  27#define BFA_FCS_OS_STR_LEN              64
  28
  29/*
  30 *  lps_pvt BFA LPS private functions
  31 */
  32
  33enum bfa_lps_event {
  34        BFA_LPS_SM_LOGIN        = 1,    /* login request from user      */
  35        BFA_LPS_SM_LOGOUT       = 2,    /* logout request from user     */
  36        BFA_LPS_SM_FWRSP        = 3,    /* f/w response to login/logout */
  37        BFA_LPS_SM_RESUME       = 4,    /* space present in reqq queue  */
  38        BFA_LPS_SM_DELETE       = 5,    /* lps delete from user         */
  39        BFA_LPS_SM_OFFLINE      = 6,    /* Link is offline              */
  40        BFA_LPS_SM_RX_CVL       = 7,    /* Rx clear virtual link        */
  41        BFA_LPS_SM_SET_N2N_PID  = 8,    /* Set assigned PID for n2n */
  42};
  43
  44
  45/*
  46 * !!! Only append to the enums defined here to avoid any versioning
  47 * !!! needed between trace utility and driver version
  48 */
  49enum {
  50        BFA_TRC_FCS_FCS         = 1,
  51        BFA_TRC_FCS_PORT        = 2,
  52        BFA_TRC_FCS_RPORT       = 3,
  53        BFA_TRC_FCS_FCPIM       = 4,
  54};
  55
  56
  57struct bfa_fcs_s;
  58
  59#define __fcs_min_cfg(__fcs)       ((__fcs)->min_cfg)
  60
  61#define BFA_FCS_BRCD_SWITCH_OUI  0x051e
  62#define N2N_LOCAL_PID       0x010000
  63#define N2N_REMOTE_PID          0x020000
  64#define BFA_FCS_RETRY_TIMEOUT 2000
  65#define BFA_FCS_PID_IS_WKA(pid)  ((bfa_ntoh3b(pid) > 0xFFF000) ?  1 : 0)
  66
  67
  68
  69struct bfa_fcs_lport_ns_s {
  70        bfa_sm_t        sm;             /*  state machine */
  71        struct bfa_timer_s timer;
  72        struct bfa_fcs_lport_s *port;   /*  parent port */
  73        struct bfa_fcxp_s *fcxp;
  74        struct bfa_fcxp_wqe_s fcxp_wqe;
  75};
  76
  77
  78struct bfa_fcs_lport_scn_s {
  79        bfa_sm_t        sm;             /*  state machine */
  80        struct bfa_timer_s timer;
  81        struct bfa_fcs_lport_s *port;   /*  parent port */
  82        struct bfa_fcxp_s *fcxp;
  83        struct bfa_fcxp_wqe_s fcxp_wqe;
  84};
  85
  86
  87struct bfa_fcs_lport_fdmi_s {
  88        bfa_sm_t        sm;             /*  state machine */
  89        struct bfa_timer_s timer;
  90        struct bfa_fcs_lport_ms_s *ms;  /*  parent ms */
  91        struct bfa_fcxp_s *fcxp;
  92        struct bfa_fcxp_wqe_s fcxp_wqe;
  93        u8      retry_cnt;      /*  retry count */
  94        u8      rsvd[3];
  95};
  96
  97
  98struct bfa_fcs_lport_ms_s {
  99        bfa_sm_t        sm;             /*  state machine */
 100        struct bfa_timer_s timer;
 101        struct bfa_fcs_lport_s *port;   /*  parent port */
 102        struct bfa_fcxp_s *fcxp;
 103        struct bfa_fcxp_wqe_s fcxp_wqe;
 104        struct bfa_fcs_lport_fdmi_s fdmi;       /*  FDMI component of MS */
 105        u8         retry_cnt;   /*  retry count */
 106        u8      rsvd[3];
 107};
 108
 109
 110struct bfa_fcs_lport_fab_s {
 111        struct bfa_fcs_lport_ns_s ns;   /*  NS component of port */
 112        struct bfa_fcs_lport_scn_s scn; /*  scn component of port */
 113        struct bfa_fcs_lport_ms_s ms;   /*  MS component of port */
 114};
 115
 116#define MAX_ALPA_COUNT  127
 117
 118struct bfa_fcs_lport_loop_s {
 119        u8         num_alpa;    /*  Num of ALPA entries in the map */
 120        u8         alpa_pos_map[MAX_ALPA_COUNT];        /*  ALPA Positional
 121                                                         *Map */
 122        struct bfa_fcs_lport_s *port;   /*  parent port */
 123};
 124
 125struct bfa_fcs_lport_n2n_s {
 126        u32        rsvd;
 127        __be16     reply_oxid;  /*  ox_id from the req flogi to be
 128                                         *used in flogi acc */
 129        wwn_t           rem_port_wwn;   /*  Attached port's wwn */
 130};
 131
 132
 133union bfa_fcs_lport_topo_u {
 134        struct bfa_fcs_lport_fab_s pfab;
 135        struct bfa_fcs_lport_loop_s ploop;
 136        struct bfa_fcs_lport_n2n_s pn2n;
 137};
 138
 139
 140struct bfa_fcs_lport_s {
 141        struct list_head         qe;    /*  used by port/vport */
 142        bfa_sm_t               sm;      /*  state machine */
 143        struct bfa_fcs_fabric_s *fabric;        /*  parent fabric */
 144        struct bfa_lport_cfg_s  port_cfg;       /*  port configuration */
 145        struct bfa_timer_s link_timer;  /*  timer for link offline */
 146        u32        pid:24;      /*  FC address */
 147        u8         lp_tag;              /*  lport tag */
 148        u16        num_rports;  /*  Num of r-ports */
 149        struct list_head         rport_q; /*  queue of discovered r-ports */
 150        struct bfa_fcs_s *fcs;  /*  FCS instance */
 151        union bfa_fcs_lport_topo_u port_topo;   /*  fabric/loop/n2n details */
 152        struct bfad_port_s *bfad_port;  /*  driver peer instance */
 153        struct bfa_fcs_vport_s *vport;  /*  NULL for base ports */
 154        struct bfa_fcxp_s *fcxp;
 155        struct bfa_fcxp_wqe_s fcxp_wqe;
 156        struct bfa_lport_stats_s stats;
 157        struct bfa_wc_s        wc;      /*  waiting counter for events */
 158};
 159#define BFA_FCS_GET_HAL_FROM_PORT(port)  (port->fcs->bfa)
 160#define BFA_FCS_GET_NS_FROM_PORT(port)  (&port->port_topo.pfab.ns)
 161#define BFA_FCS_GET_SCN_FROM_PORT(port)  (&port->port_topo.pfab.scn)
 162#define BFA_FCS_GET_MS_FROM_PORT(port)  (&port->port_topo.pfab.ms)
 163#define BFA_FCS_GET_FDMI_FROM_PORT(port)  (&port->port_topo.pfab.ms.fdmi)
 164#define BFA_FCS_VPORT_IS_INITIATOR_MODE(port) \
 165                (port->port_cfg.roles & BFA_LPORT_ROLE_FCP_IM)
 166
 167/*
 168 * forward declaration
 169 */
 170struct bfad_vf_s;
 171
 172enum bfa_fcs_fabric_type {
 173        BFA_FCS_FABRIC_UNKNOWN = 0,
 174        BFA_FCS_FABRIC_SWITCHED = 1,
 175        BFA_FCS_FABRIC_N2N = 2,
 176};
 177
 178
 179struct bfa_fcs_fabric_s {
 180        struct list_head   qe;          /*  queue element */
 181        bfa_sm_t         sm;            /*  state machine */
 182        struct bfa_fcs_s *fcs;          /*  FCS instance */
 183        struct bfa_fcs_lport_s  bport;  /*  base logical port */
 184        enum bfa_fcs_fabric_type fab_type; /*  fabric type */
 185        enum bfa_port_type oper_type;   /*  current link topology */
 186        u8         is_vf;               /*  is virtual fabric? */
 187        u8         is_npiv;     /*  is NPIV supported ? */
 188        u8         is_auth;     /*  is Security/Auth supported ? */
 189        u16        bb_credit;   /*  BB credit from fabric */
 190        u16        vf_id;               /*  virtual fabric ID */
 191        u16        num_vports;  /*  num vports */
 192        u16        rsvd;
 193        struct list_head         vport_q;       /*  queue of virtual ports */
 194        struct list_head         vf_q;  /*  queue of virtual fabrics */
 195        struct bfad_vf_s      *vf_drv;  /*  driver vf structure */
 196        struct bfa_timer_s link_timer;  /*  Link Failure timer. Vport */
 197        wwn_t           fabric_name;    /*  attached fabric name */
 198        bfa_boolean_t   auth_reqd;      /*  authentication required     */
 199        struct bfa_timer_s delay_timer; /*  delay timer         */
 200        union {
 201                u16        swp_vfid;/*  switch port VF id               */
 202        } event_arg;
 203        struct bfa_wc_s        wc;      /*  wait counter for delete     */
 204        struct bfa_vf_stats_s   stats;  /*  fabric/vf stats             */
 205        struct bfa_lps_s        *lps;   /*  lport login services        */
 206        u8      fabric_ip_addr[BFA_FCS_FABRIC_IPADDR_SZ];
 207                                        /*  attached fabric's ip addr  */
 208};
 209
 210#define bfa_fcs_fabric_npiv_capable(__f)    ((__f)->is_npiv)
 211#define bfa_fcs_fabric_is_switched(__f)                 \
 212        ((__f)->fab_type == BFA_FCS_FABRIC_SWITCHED)
 213
 214/*
 215 *   The design calls for a single implementation of base fabric and vf.
 216 */
 217#define bfa_fcs_vf_t struct bfa_fcs_fabric_s
 218
 219struct bfa_vf_event_s {
 220        u32        undefined;
 221};
 222
 223struct bfa_fcs_s;
 224struct bfa_fcs_fabric_s;
 225
 226/*
 227 * @todo : need to move to a global config file.
 228 * Maximum Rports supported per port (physical/logical).
 229 */
 230#define BFA_FCS_MAX_RPORTS_SUPP  256    /* @todo : tentative value */
 231
 232#define bfa_fcs_lport_t struct bfa_fcs_lport_s
 233
 234/*
 235 * Symbolic Name related defines
 236 *  Total bytes 255.
 237 *  Physical Port's symbolic name 128 bytes.
 238 *  For Vports, Vport's symbolic name is appended to the Physical port's
 239 *  Symbolic Name.
 240 *
 241 *  Physical Port's symbolic name Format : (Total 128 bytes)
 242 *  Adapter Model number/name : 12 bytes
 243 *  Driver Version     : 10 bytes
 244 *  Host Machine Name  : 30 bytes
 245 *  Host OS Info           : 48 bytes
 246 *  Host OS PATCH Info : 16 bytes
 247 *  ( remaining 12 bytes reserved to be used for separator)
 248 */
 249#define BFA_FCS_PORT_SYMBNAME_SEPARATOR                 " | "
 250
 251#define BFA_FCS_PORT_SYMBNAME_MODEL_SZ                  12
 252#define BFA_FCS_PORT_SYMBNAME_VERSION_SZ                10
 253#define BFA_FCS_PORT_SYMBNAME_MACHINENAME_SZ            30
 254#define BFA_FCS_PORT_SYMBNAME_OSINFO_SZ                 48
 255#define BFA_FCS_PORT_SYMBNAME_OSPATCH_SZ                16
 256
 257/* bb_scn value in 2^bb_scn */
 258#define BFA_FCS_PORT_DEF_BB_SCN                         3
 259
 260/*
 261 * Get FC port ID for a logical port.
 262 */
 263#define bfa_fcs_lport_get_fcid(_lport)  ((_lport)->pid)
 264#define bfa_fcs_lport_get_pwwn(_lport)  ((_lport)->port_cfg.pwwn)
 265#define bfa_fcs_lport_get_nwwn(_lport)  ((_lport)->port_cfg.nwwn)
 266#define bfa_fcs_lport_get_psym_name(_lport)     ((_lport)->port_cfg.sym_name)
 267#define bfa_fcs_lport_is_initiator(_lport)                      \
 268        ((_lport)->port_cfg.roles & BFA_LPORT_ROLE_FCP_IM)
 269#define bfa_fcs_lport_get_nrports(_lport)       \
 270        ((_lport) ? (_lport)->num_rports : 0)
 271
 272static inline struct bfad_port_s *
 273bfa_fcs_lport_get_drvport(struct bfa_fcs_lport_s *port)
 274{
 275        return port->bfad_port;
 276}
 277
 278#define bfa_fcs_lport_get_opertype(_lport)      ((_lport)->fabric->oper_type)
 279#define bfa_fcs_lport_get_fabric_name(_lport)   ((_lport)->fabric->fabric_name)
 280#define bfa_fcs_lport_get_fabric_ipaddr(_lport)         \
 281                ((_lport)->fabric->fabric_ip_addr)
 282
 283/*
 284 * bfa fcs port public functions
 285 */
 286
 287bfa_boolean_t   bfa_fcs_lport_is_online(struct bfa_fcs_lport_s *port);
 288struct bfa_fcs_lport_s *bfa_fcs_get_base_port(struct bfa_fcs_s *fcs);
 289void bfa_fcs_lport_get_rports(struct bfa_fcs_lport_s *port,
 290                              wwn_t rport_wwns[], int *nrports);
 291
 292wwn_t bfa_fcs_lport_get_rport(struct bfa_fcs_lport_s *port, wwn_t wwn,
 293                              int index, int nrports, bfa_boolean_t bwwn);
 294
 295struct bfa_fcs_lport_s *bfa_fcs_lookup_port(struct bfa_fcs_s *fcs,
 296                                            u16 vf_id, wwn_t lpwwn);
 297
 298void bfa_fcs_lport_get_info(struct bfa_fcs_lport_s *port,
 299                            struct bfa_lport_info_s *port_info);
 300void bfa_fcs_lport_get_attr(struct bfa_fcs_lport_s *port,
 301                            struct bfa_lport_attr_s *port_attr);
 302void bfa_fcs_lport_get_stats(struct bfa_fcs_lport_s *fcs_port,
 303                             struct bfa_lport_stats_s *port_stats);
 304void bfa_fcs_lport_clear_stats(struct bfa_fcs_lport_s *fcs_port);
 305enum bfa_port_speed bfa_fcs_lport_get_rport_max_speed(
 306                        struct bfa_fcs_lport_s *port);
 307
 308/* MS FCS routines */
 309void bfa_fcs_lport_ms_init(struct bfa_fcs_lport_s *port);
 310void bfa_fcs_lport_ms_offline(struct bfa_fcs_lport_s *port);
 311void bfa_fcs_lport_ms_online(struct bfa_fcs_lport_s *port);
 312void bfa_fcs_lport_ms_fabric_rscn(struct bfa_fcs_lport_s *port);
 313
 314/* FDMI FCS routines */
 315void bfa_fcs_lport_fdmi_init(struct bfa_fcs_lport_ms_s *ms);
 316void bfa_fcs_lport_fdmi_offline(struct bfa_fcs_lport_ms_s *ms);
 317void bfa_fcs_lport_fdmi_online(struct bfa_fcs_lport_ms_s *ms);
 318void bfa_fcs_lport_uf_recv(struct bfa_fcs_lport_s *lport, struct fchs_s *fchs,
 319                                     u16 len);
 320void bfa_fcs_lport_attach(struct bfa_fcs_lport_s *lport, struct bfa_fcs_s *fcs,
 321                        u16 vf_id, struct bfa_fcs_vport_s *vport);
 322void bfa_fcs_lport_init(struct bfa_fcs_lport_s *lport,
 323                                struct bfa_lport_cfg_s *port_cfg);
 324void            bfa_fcs_lport_online(struct bfa_fcs_lport_s *port);
 325void            bfa_fcs_lport_offline(struct bfa_fcs_lport_s *port);
 326void            bfa_fcs_lport_delete(struct bfa_fcs_lport_s *port);
 327struct bfa_fcs_rport_s *bfa_fcs_lport_get_rport_by_pid(
 328                struct bfa_fcs_lport_s *port, u32 pid);
 329struct bfa_fcs_rport_s *bfa_fcs_lport_get_rport_by_pwwn(
 330                struct bfa_fcs_lport_s *port, wwn_t pwwn);
 331struct bfa_fcs_rport_s *bfa_fcs_lport_get_rport_by_nwwn(
 332                struct bfa_fcs_lport_s *port, wwn_t nwwn);
 333void            bfa_fcs_lport_add_rport(struct bfa_fcs_lport_s *port,
 334                                       struct bfa_fcs_rport_s *rport);
 335void            bfa_fcs_lport_del_rport(struct bfa_fcs_lport_s *port,
 336                                       struct bfa_fcs_rport_s *rport);
 337void            bfa_fcs_lport_ns_init(struct bfa_fcs_lport_s *vport);
 338void            bfa_fcs_lport_ns_offline(struct bfa_fcs_lport_s *vport);
 339void            bfa_fcs_lport_ns_online(struct bfa_fcs_lport_s *vport);
 340void            bfa_fcs_lport_ns_query(struct bfa_fcs_lport_s *port);
 341void            bfa_fcs_lport_scn_init(struct bfa_fcs_lport_s *vport);
 342void            bfa_fcs_lport_scn_offline(struct bfa_fcs_lport_s *vport);
 343void            bfa_fcs_lport_scn_online(struct bfa_fcs_lport_s *vport);
 344void            bfa_fcs_lport_scn_process_rscn(struct bfa_fcs_lport_s *port,
 345                                              struct fchs_s *rx_frame, u32 len);
 346
 347struct bfa_fcs_vport_s {
 348        struct list_head                qe;             /*  queue elem  */
 349        bfa_sm_t                sm;             /*  state machine       */
 350        bfa_fcs_lport_t         lport;          /*  logical port        */
 351        struct bfa_timer_s      timer;
 352        struct bfad_vport_s     *vport_drv;     /*  Driver private      */
 353        struct bfa_vport_stats_s vport_stats;   /*  vport statistics    */
 354        struct bfa_lps_s        *lps;           /*  Lport login service*/
 355        int                     fdisc_retries;
 356};
 357
 358#define bfa_fcs_vport_get_port(vport)                   \
 359        ((struct bfa_fcs_lport_s  *)(&vport->port))
 360
 361/*
 362 * bfa fcs vport public functions
 363 */
 364bfa_status_t bfa_fcs_vport_create(struct bfa_fcs_vport_s *vport,
 365                                  struct bfa_fcs_s *fcs, u16 vf_id,
 366                                  struct bfa_lport_cfg_s *port_cfg,
 367                                  struct bfad_vport_s *vport_drv);
 368bfa_status_t bfa_fcs_pbc_vport_create(struct bfa_fcs_vport_s *vport,
 369                                      struct bfa_fcs_s *fcs, u16 vf_id,
 370                                      struct bfa_lport_cfg_s *port_cfg,
 371                                      struct bfad_vport_s *vport_drv);
 372bfa_boolean_t bfa_fcs_is_pbc_vport(struct bfa_fcs_vport_s *vport);
 373bfa_status_t bfa_fcs_vport_delete(struct bfa_fcs_vport_s *vport);
 374bfa_status_t bfa_fcs_vport_start(struct bfa_fcs_vport_s *vport);
 375bfa_status_t bfa_fcs_vport_stop(struct bfa_fcs_vport_s *vport);
 376void bfa_fcs_vport_get_attr(struct bfa_fcs_vport_s *vport,
 377                            struct bfa_vport_attr_s *vport_attr);
 378struct bfa_fcs_vport_s *bfa_fcs_vport_lookup(struct bfa_fcs_s *fcs,
 379                                             u16 vf_id, wwn_t vpwwn);
 380void bfa_fcs_vport_cleanup(struct bfa_fcs_vport_s *vport);
 381void bfa_fcs_vport_online(struct bfa_fcs_vport_s *vport);
 382void bfa_fcs_vport_offline(struct bfa_fcs_vport_s *vport);
 383void bfa_fcs_vport_delete_comp(struct bfa_fcs_vport_s *vport);
 384void bfa_fcs_vport_fcs_delete(struct bfa_fcs_vport_s *vport);
 385void bfa_fcs_vport_stop_comp(struct bfa_fcs_vport_s *vport);
 386
 387#define BFA_FCS_RPORT_DEF_DEL_TIMEOUT   90      /* in secs */
 388#define BFA_FCS_RPORT_MAX_RETRIES       (5)
 389
 390/*
 391 * forward declarations
 392 */
 393struct bfad_rport_s;
 394
 395struct bfa_fcs_itnim_s;
 396struct bfa_fcs_tin_s;
 397struct bfa_fcs_iprp_s;
 398
 399/* Rport Features (RPF) */
 400struct bfa_fcs_rpf_s {
 401        bfa_sm_t        sm;     /*  state machine */
 402        struct bfa_fcs_rport_s *rport;  /*  parent rport */
 403        struct bfa_timer_s      timer;  /*  general purpose timer */
 404        struct bfa_fcxp_s       *fcxp;  /*  FCXP needed for discarding */
 405        struct bfa_fcxp_wqe_s   fcxp_wqe; /*  fcxp wait queue element */
 406        int     rpsc_retries;   /*  max RPSC retry attempts */
 407        enum bfa_port_speed     rpsc_speed;
 408        /*  Current Speed from RPSC. O if RPSC fails */
 409        enum bfa_port_speed     assigned_speed;
 410        /*
 411         * Speed assigned by the user.  will be used if RPSC is
 412         * not supported by the rport.
 413         */
 414};
 415
 416struct bfa_fcs_rport_s {
 417        struct list_head        qe;     /*  used by port/vport */
 418        struct bfa_fcs_lport_s *port;   /*  parent FCS port */
 419        struct bfa_fcs_s        *fcs;   /*  fcs instance */
 420        struct bfad_rport_s     *rp_drv;        /*  driver peer instance */
 421        u32     pid;    /*  port ID of rport */
 422        u16     maxfrsize;      /*  maximum frame size */
 423        __be16  reply_oxid;     /*  OX_ID of inbound requests */
 424        enum fc_cos     fc_cos; /*  FC classes of service supp */
 425        bfa_boolean_t   cisc;   /*  CISC capable device */
 426        bfa_boolean_t   prlo;   /*  processing prlo or LOGO */
 427        bfa_boolean_t   plogi_pending;  /* Rx Plogi Pending */
 428        wwn_t   pwwn;   /*  port wwn of rport */
 429        wwn_t   nwwn;   /*  node wwn of rport */
 430        struct bfa_rport_symname_s psym_name; /*  port symbolic name  */
 431        bfa_sm_t        sm;             /*  state machine */
 432        struct bfa_timer_s timer;       /*  general purpose timer */
 433        struct bfa_fcs_itnim_s *itnim;  /*  ITN initiator mode role */
 434        struct bfa_fcs_tin_s *tin;      /*  ITN initiator mode role */
 435        struct bfa_fcs_iprp_s *iprp;    /*  IP/FC role */
 436        struct bfa_rport_s *bfa_rport;  /*  BFA Rport */
 437        struct bfa_fcxp_s *fcxp;        /*  FCXP needed for discarding */
 438        int     plogi_retries;  /*  max plogi retry attempts */
 439        int     ns_retries;     /*  max NS query retry attempts */
 440        struct bfa_fcxp_wqe_s   fcxp_wqe; /*  fcxp wait queue element */
 441        struct bfa_rport_stats_s stats; /*  rport stats */
 442        enum bfa_rport_function scsi_function;  /*  Initiator/Target */
 443        struct bfa_fcs_rpf_s rpf;       /* Rport features module */
 444};
 445
 446static inline struct bfa_rport_s *
 447bfa_fcs_rport_get_halrport(struct bfa_fcs_rport_s *rport)
 448{
 449        return rport->bfa_rport;
 450}
 451
 452/*
 453 * bfa fcs rport API functions
 454 */
 455void bfa_fcs_rport_get_attr(struct bfa_fcs_rport_s *rport,
 456                        struct bfa_rport_attr_s *attr);
 457struct bfa_fcs_rport_s *bfa_fcs_rport_lookup(struct bfa_fcs_lport_s *port,
 458                                             wwn_t rpwwn);
 459struct bfa_fcs_rport_s *bfa_fcs_rport_lookup_by_nwwn(
 460        struct bfa_fcs_lport_s *port, wwn_t rnwwn);
 461void bfa_fcs_rport_set_del_timeout(u8 rport_tmo);
 462
 463void bfa_fcs_rport_uf_recv(struct bfa_fcs_rport_s *rport,
 464         struct fchs_s *fchs, u16 len);
 465void bfa_fcs_rport_scn(struct bfa_fcs_rport_s *rport);
 466
 467struct bfa_fcs_rport_s *bfa_fcs_rport_create(struct bfa_fcs_lport_s *port,
 468         u32 pid);
 469void bfa_fcs_rport_start(struct bfa_fcs_lport_s *port, struct fchs_s *rx_fchs,
 470                         struct fc_logi_s *plogi_rsp);
 471void bfa_fcs_rport_plogi_create(struct bfa_fcs_lport_s *port,
 472                                struct fchs_s *rx_fchs,
 473                                struct fc_logi_s *plogi);
 474void bfa_fcs_rport_plogi(struct bfa_fcs_rport_s *rport, struct fchs_s *fchs,
 475                         struct fc_logi_s *plogi);
 476void bfa_fcs_rport_prlo(struct bfa_fcs_rport_s *rport, __be16 ox_id);
 477
 478void bfa_fcs_rport_itntm_ack(struct bfa_fcs_rport_s *rport);
 479void bfa_fcs_rport_fcptm_offline_done(struct bfa_fcs_rport_s *rport);
 480int  bfa_fcs_rport_get_state(struct bfa_fcs_rport_s *rport);
 481struct bfa_fcs_rport_s *bfa_fcs_rport_create_by_wwn(
 482                        struct bfa_fcs_lport_s *port, wwn_t wwn);
 483void  bfa_fcs_rpf_init(struct bfa_fcs_rport_s *rport);
 484void  bfa_fcs_rpf_rport_online(struct bfa_fcs_rport_s *rport);
 485void  bfa_fcs_rpf_rport_offline(struct bfa_fcs_rport_s *rport);
 486
 487/*
 488 * forward declarations
 489 */
 490struct bfad_itnim_s;
 491
 492struct bfa_fcs_itnim_s {
 493        bfa_sm_t                sm;             /*  state machine */
 494        struct bfa_fcs_rport_s  *rport;         /*  parent remote rport  */
 495        struct bfad_itnim_s     *itnim_drv;     /*  driver peer instance */
 496        struct bfa_fcs_s        *fcs;           /*  fcs instance        */
 497        struct bfa_timer_s      timer;          /*  timer functions     */
 498        struct bfa_itnim_s      *bfa_itnim;     /*  BFA itnim struct    */
 499        u32             prli_retries;   /*  max prli retry attempts */
 500        bfa_boolean_t           seq_rec;        /*  seq recovery support */
 501        bfa_boolean_t           rec_support;    /*  REC supported       */
 502        bfa_boolean_t           conf_comp;      /*  FCP_CONF    support */
 503        bfa_boolean_t           task_retry_id;  /*  task retry id supp  */
 504        struct bfa_fcxp_wqe_s   fcxp_wqe;       /*  wait qelem for fcxp  */
 505        struct bfa_fcxp_s       *fcxp;          /*  FCXP in use */
 506        struct bfa_itnim_stats_s        stats;  /*  itn statistics      */
 507};
 508#define bfa_fcs_fcxp_alloc(__fcs)       \
 509        bfa_fcxp_alloc(NULL, (__fcs)->bfa, 0, 0, NULL, NULL, NULL, NULL)
 510
 511#define bfa_fcs_fcxp_alloc_wait(__bfa, __wqe, __alloc_cbfn, __alloc_cbarg) \
 512        bfa_fcxp_alloc_wait(__bfa, __wqe, __alloc_cbfn, __alloc_cbarg, \
 513                                        NULL, 0, 0, NULL, NULL, NULL, NULL)
 514
 515static inline struct bfad_port_s *
 516bfa_fcs_itnim_get_drvport(struct bfa_fcs_itnim_s *itnim)
 517{
 518        return itnim->rport->port->bfad_port;
 519}
 520
 521
 522static inline struct bfa_fcs_lport_s *
 523bfa_fcs_itnim_get_port(struct bfa_fcs_itnim_s *itnim)
 524{
 525        return itnim->rport->port;
 526}
 527
 528
 529static inline wwn_t
 530bfa_fcs_itnim_get_nwwn(struct bfa_fcs_itnim_s *itnim)
 531{
 532        return itnim->rport->nwwn;
 533}
 534
 535
 536static inline wwn_t
 537bfa_fcs_itnim_get_pwwn(struct bfa_fcs_itnim_s *itnim)
 538{
 539        return itnim->rport->pwwn;
 540}
 541
 542
 543static inline u32
 544bfa_fcs_itnim_get_fcid(struct bfa_fcs_itnim_s *itnim)
 545{
 546        return itnim->rport->pid;
 547}
 548
 549
 550static inline   u32
 551bfa_fcs_itnim_get_maxfrsize(struct bfa_fcs_itnim_s *itnim)
 552{
 553        return itnim->rport->maxfrsize;
 554}
 555
 556
 557static inline   enum fc_cos
 558bfa_fcs_itnim_get_cos(struct bfa_fcs_itnim_s *itnim)
 559{
 560        return itnim->rport->fc_cos;
 561}
 562
 563
 564static inline struct bfad_itnim_s *
 565bfa_fcs_itnim_get_drvitn(struct bfa_fcs_itnim_s *itnim)
 566{
 567        return itnim->itnim_drv;
 568}
 569
 570
 571static inline struct bfa_itnim_s *
 572bfa_fcs_itnim_get_halitn(struct bfa_fcs_itnim_s *itnim)
 573{
 574        return itnim->bfa_itnim;
 575}
 576
 577/*
 578 * bfa fcs FCP Initiator mode API functions
 579 */
 580void bfa_fcs_itnim_get_attr(struct bfa_fcs_itnim_s *itnim,
 581                            struct bfa_itnim_attr_s *attr);
 582void bfa_fcs_itnim_get_stats(struct bfa_fcs_itnim_s *itnim,
 583                             struct bfa_itnim_stats_s *stats);
 584struct bfa_fcs_itnim_s *bfa_fcs_itnim_lookup(struct bfa_fcs_lport_s *port,
 585                                             wwn_t rpwwn);
 586bfa_status_t bfa_fcs_itnim_attr_get(struct bfa_fcs_lport_s *port, wwn_t rpwwn,
 587                                    struct bfa_itnim_attr_s *attr);
 588bfa_status_t bfa_fcs_itnim_stats_get(struct bfa_fcs_lport_s *port, wwn_t rpwwn,
 589                                     struct bfa_itnim_stats_s *stats);
 590bfa_status_t bfa_fcs_itnim_stats_clear(struct bfa_fcs_lport_s *port,
 591                                       wwn_t rpwwn);
 592struct bfa_fcs_itnim_s *bfa_fcs_itnim_create(struct bfa_fcs_rport_s *rport);
 593void bfa_fcs_itnim_delete(struct bfa_fcs_itnim_s *itnim);
 594void bfa_fcs_itnim_rport_offline(struct bfa_fcs_itnim_s *itnim);
 595void bfa_fcs_itnim_rport_online(struct bfa_fcs_itnim_s *itnim);
 596bfa_status_t bfa_fcs_itnim_get_online_state(struct bfa_fcs_itnim_s *itnim);
 597void bfa_fcs_itnim_is_initiator(struct bfa_fcs_itnim_s *itnim);
 598void bfa_fcs_fcpim_uf_recv(struct bfa_fcs_itnim_s *itnim,
 599                        struct fchs_s *fchs, u16 len);
 600
 601#define BFA_FCS_FDMI_SUPP_SPEEDS_4G     (FDMI_TRANS_SPEED_1G  | \
 602                                FDMI_TRANS_SPEED_2G |           \
 603                                FDMI_TRANS_SPEED_4G)
 604
 605#define BFA_FCS_FDMI_SUPP_SPEEDS_8G     (FDMI_TRANS_SPEED_1G  | \
 606                                FDMI_TRANS_SPEED_2G |           \
 607                                FDMI_TRANS_SPEED_4G |           \
 608                                FDMI_TRANS_SPEED_8G)
 609
 610#define BFA_FCS_FDMI_SUPP_SPEEDS_16G    (FDMI_TRANS_SPEED_2G  | \
 611                                FDMI_TRANS_SPEED_4G |           \
 612                                FDMI_TRANS_SPEED_8G |           \
 613                                FDMI_TRANS_SPEED_16G)
 614
 615#define BFA_FCS_FDMI_SUPP_SPEEDS_10G    FDMI_TRANS_SPEED_10G
 616
 617/*
 618 * HBA Attribute Block : BFA internal representation. Note : Some variable
 619 * sizes have been trimmed to suit BFA For Ex : Model will be "Brocade". Based
 620 * on this the size has been reduced to 16 bytes from the standard's 64 bytes.
 621 */
 622struct bfa_fcs_fdmi_hba_attr_s {
 623        wwn_t           node_name;
 624        u8         manufacturer[64];
 625        u8         serial_num[64];
 626        u8         model[16];
 627        u8         model_desc[256];
 628        u8         hw_version[8];
 629        u8         driver_version[8];
 630        u8         option_rom_ver[BFA_VERSION_LEN];
 631        u8         fw_version[8];
 632        u8         os_name[256];
 633        __be32        max_ct_pyld;
 634};
 635
 636/*
 637 * Port Attribute Block
 638 */
 639struct bfa_fcs_fdmi_port_attr_s {
 640        u8         supp_fc4_types[32];  /* supported FC4 types */
 641        __be32        supp_speed;       /* supported speed */
 642        __be32        curr_speed;       /* current Speed */
 643        __be32        max_frm_size;     /* max frame size */
 644        u8         os_device_name[256]; /* OS device Name */
 645        u8         host_name[256];      /* host name */
 646};
 647
 648struct bfa_fcs_stats_s {
 649        struct {
 650                u32     untagged; /*  untagged receive frames */
 651                u32     tagged; /*  tagged receive frames */
 652                u32     vfid_unknown;   /*  VF id is unknown */
 653        } uf;
 654};
 655
 656struct bfa_fcs_driver_info_s {
 657        u8       version[BFA_VERSION_LEN];              /* Driver Version */
 658        u8       host_machine_name[BFA_FCS_OS_STR_LEN];
 659        u8       host_os_name[BFA_FCS_OS_STR_LEN]; /* OS name and version */
 660        u8       host_os_patch[BFA_FCS_OS_STR_LEN]; /* patch or service pack */
 661        u8       os_device_name[BFA_FCS_OS_STR_LEN]; /* Driver Device Name */
 662};
 663
 664struct bfa_fcs_s {
 665        struct bfa_s      *bfa; /*  corresponding BFA bfa instance */
 666        struct bfad_s         *bfad; /*  corresponding BDA driver instance */
 667        struct bfa_trc_mod_s  *trcmod;  /*  tracing module */
 668        bfa_boolean_t   vf_enabled;     /*  VF mode is enabled */
 669        bfa_boolean_t   fdmi_enabled;   /*  FDMI is enabled */
 670        bfa_boolean_t   bbscn_enabled;  /*  Driver Config Parameter */
 671        bfa_boolean_t   bbscn_flogi_rjt;/*  FLOGI reject due to BB_SCN */
 672        bfa_boolean_t min_cfg;          /* min cfg enabled/disabled */
 673        u16     port_vfid;      /*  port default VF ID */
 674        struct bfa_fcs_driver_info_s driver_info;
 675        struct bfa_fcs_fabric_s fabric; /*  base fabric state machine */
 676        struct bfa_fcs_stats_s  stats;  /*  FCS statistics */
 677        struct bfa_wc_s         wc;     /*  waiting counter */
 678        int                     fcs_aen_seq;
 679};
 680
 681/*
 682 *  fcs_fabric_sm fabric state machine functions
 683 */
 684
 685/*
 686 * Fabric state machine events
 687 */
 688enum bfa_fcs_fabric_event {
 689        BFA_FCS_FABRIC_SM_CREATE        = 1,    /*  create from driver        */
 690        BFA_FCS_FABRIC_SM_DELETE        = 2,    /*  delete from driver        */
 691        BFA_FCS_FABRIC_SM_LINK_DOWN     = 3,    /*  link down from port      */
 692        BFA_FCS_FABRIC_SM_LINK_UP       = 4,    /*  link up from port         */
 693        BFA_FCS_FABRIC_SM_CONT_OP       = 5,    /*  flogi/auth continue op   */
 694        BFA_FCS_FABRIC_SM_RETRY_OP      = 6,    /*  flogi/auth retry op      */
 695        BFA_FCS_FABRIC_SM_NO_FABRIC     = 7,    /*  from flogi/auth           */
 696        BFA_FCS_FABRIC_SM_PERF_EVFP     = 8,    /*  from flogi/auth           */
 697        BFA_FCS_FABRIC_SM_ISOLATE       = 9,    /*  from EVFP processing     */
 698        BFA_FCS_FABRIC_SM_NO_TAGGING    = 10,   /*  no VFT tagging from EVFP */
 699        BFA_FCS_FABRIC_SM_DELAYED       = 11,   /*  timeout delay event      */
 700        BFA_FCS_FABRIC_SM_AUTH_FAILED   = 12,   /*  auth failed       */
 701        BFA_FCS_FABRIC_SM_AUTH_SUCCESS  = 13,   /*  auth successful           */
 702        BFA_FCS_FABRIC_SM_DELCOMP       = 14,   /*  all vports deleted event */
 703        BFA_FCS_FABRIC_SM_LOOPBACK      = 15,   /*  Received our own FLOGI   */
 704        BFA_FCS_FABRIC_SM_START         = 16,   /*  from driver       */
 705};
 706
 707/*
 708 *  fcs_rport_sm FCS rport state machine events
 709 */
 710
 711enum rport_event {
 712        RPSM_EVENT_PLOGI_SEND   = 1,    /*  new rport; start with PLOGI */
 713        RPSM_EVENT_PLOGI_RCVD   = 2,    /*  Inbound PLOGI from remote port */
 714        RPSM_EVENT_PLOGI_COMP   = 3,    /*  PLOGI completed to rport    */
 715        RPSM_EVENT_LOGO_RCVD    = 4,    /*  LOGO from remote device     */
 716        RPSM_EVENT_LOGO_IMP     = 5,    /*  implicit logo for SLER      */
 717        RPSM_EVENT_FCXP_SENT    = 6,    /*  Frame from has been sent    */
 718        RPSM_EVENT_DELETE       = 7,    /*  RPORT delete request        */
 719        RPSM_EVENT_SCN          = 8,    /*  state change notification   */
 720        RPSM_EVENT_ACCEPTED     = 9,    /*  Good response from remote device */
 721        RPSM_EVENT_FAILED       = 10,   /*  Request to rport failed.    */
 722        RPSM_EVENT_TIMEOUT      = 11,   /*  Rport SM timeout event      */
 723        RPSM_EVENT_HCB_ONLINE  = 12,    /*  BFA rport online callback   */
 724        RPSM_EVENT_HCB_OFFLINE = 13,    /*  BFA rport offline callback  */
 725        RPSM_EVENT_FC4_OFFLINE = 14,    /*  FC-4 offline complete       */
 726        RPSM_EVENT_ADDRESS_CHANGE = 15, /*  Rport's PID has changed     */
 727        RPSM_EVENT_ADDRESS_DISC = 16,   /*  Need to Discover rport's PID */
 728        RPSM_EVENT_PRLO_RCVD   = 17,    /*  PRLO from remote device     */
 729        RPSM_EVENT_PLOGI_RETRY = 18,    /*  Retry PLOGI continuously */
 730};
 731
 732/*
 733 * bfa fcs API functions
 734 */
 735void bfa_fcs_attach(struct bfa_fcs_s *fcs, struct bfa_s *bfa,
 736                    struct bfad_s *bfad,
 737                    bfa_boolean_t min_cfg);
 738void bfa_fcs_init(struct bfa_fcs_s *fcs);
 739void bfa_fcs_pbc_vport_init(struct bfa_fcs_s *fcs);
 740void bfa_fcs_update_cfg(struct bfa_fcs_s *fcs);
 741void bfa_fcs_driver_info_init(struct bfa_fcs_s *fcs,
 742                              struct bfa_fcs_driver_info_s *driver_info);
 743void bfa_fcs_exit(struct bfa_fcs_s *fcs);
 744
 745/*
 746 * bfa fcs vf public functions
 747 */
 748bfa_fcs_vf_t *bfa_fcs_vf_lookup(struct bfa_fcs_s *fcs, u16 vf_id);
 749void bfa_fcs_vf_get_ports(bfa_fcs_vf_t *vf, wwn_t vpwwn[], int *nports);
 750
 751/*
 752 * fabric protected interface functions
 753 */
 754void bfa_fcs_fabric_attach(struct bfa_fcs_s *fcs);
 755void bfa_fcs_fabric_modinit(struct bfa_fcs_s *fcs);
 756void bfa_fcs_fabric_modexit(struct bfa_fcs_s *fcs);
 757void bfa_fcs_fabric_link_up(struct bfa_fcs_fabric_s *fabric);
 758void bfa_fcs_fabric_link_down(struct bfa_fcs_fabric_s *fabric);
 759void bfa_fcs_fabric_addvport(struct bfa_fcs_fabric_s *fabric,
 760        struct bfa_fcs_vport_s *vport);
 761void bfa_fcs_fabric_delvport(struct bfa_fcs_fabric_s *fabric,
 762        struct bfa_fcs_vport_s *vport);
 763struct bfa_fcs_vport_s *bfa_fcs_fabric_vport_lookup(
 764                struct bfa_fcs_fabric_s *fabric, wwn_t pwwn);
 765void bfa_fcs_fabric_modstart(struct bfa_fcs_s *fcs);
 766void bfa_fcs_fabric_uf_recv(struct bfa_fcs_fabric_s *fabric,
 767                struct fchs_s *fchs, u16 len);
 768void    bfa_fcs_fabric_psymb_init(struct bfa_fcs_fabric_s *fabric);
 769void bfa_fcs_fabric_set_fabric_name(struct bfa_fcs_fabric_s *fabric,
 770               wwn_t fabric_name);
 771u16 bfa_fcs_fabric_get_switch_oui(struct bfa_fcs_fabric_s *fabric);
 772void bfa_fcs_uf_attach(struct bfa_fcs_s *fcs);
 773void bfa_fcs_port_attach(struct bfa_fcs_s *fcs);
 774void bfa_fcs_fabric_sm_online(struct bfa_fcs_fabric_s *fabric,
 775                        enum bfa_fcs_fabric_event event);
 776void bfa_fcs_fabric_sm_loopback(struct bfa_fcs_fabric_s *fabric,
 777                        enum bfa_fcs_fabric_event event);
 778void bfa_fcs_fabric_sm_auth_failed(struct bfa_fcs_fabric_s *fabric,
 779                        enum bfa_fcs_fabric_event event);
 780
 781/*
 782 * BFA FCS callback interfaces
 783 */
 784
 785/*
 786 * fcb Main fcs callbacks
 787 */
 788
 789struct bfad_port_s;
 790struct bfad_vf_s;
 791struct bfad_vport_s;
 792struct bfad_rport_s;
 793
 794/*
 795 * lport callbacks
 796 */
 797struct bfad_port_s *bfa_fcb_lport_new(struct bfad_s *bfad,
 798                                      struct bfa_fcs_lport_s *port,
 799                                      enum bfa_lport_role roles,
 800                                      struct bfad_vf_s *vf_drv,
 801                                      struct bfad_vport_s *vp_drv);
 802void bfa_fcb_lport_delete(struct bfad_s *bfad, enum bfa_lport_role roles,
 803                          struct bfad_vf_s *vf_drv,
 804                          struct bfad_vport_s *vp_drv);
 805
 806/*
 807 * vport callbacks
 808 */
 809void bfa_fcb_pbc_vport_create(struct bfad_s *bfad, struct bfi_pbc_vport_s);
 810
 811/*
 812 * rport callbacks
 813 */
 814bfa_status_t bfa_fcb_rport_alloc(struct bfad_s *bfad,
 815                                 struct bfa_fcs_rport_s **rport,
 816                                 struct bfad_rport_s **rport_drv);
 817
 818/*
 819 * itnim callbacks
 820 */
 821void bfa_fcb_itnim_alloc(struct bfad_s *bfad, struct bfa_fcs_itnim_s **itnim,
 822                         struct bfad_itnim_s **itnim_drv);
 823void bfa_fcb_itnim_free(struct bfad_s *bfad,
 824                        struct bfad_itnim_s *itnim_drv);
 825void bfa_fcb_itnim_online(struct bfad_itnim_s *itnim_drv);
 826void bfa_fcb_itnim_offline(struct bfad_itnim_s *itnim_drv);
 827
 828#endif /* __BFA_FCS_H__ */
 829