root/drivers/scsi/bfa/bfa_svc.h

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

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. bfa_uf_get_frmbuf
  2. bfa_uf_get_frmlen

   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.
   4  * Copyright (c) 2014- QLogic Corporation.
   5  * All rights reserved
   6  * www.qlogic.com
   7  *
   8  * Linux driver for QLogic BR-series Fibre Channel Host Bus Adapter.
   9  */
  10 
  11 #ifndef __BFA_SVC_H__
  12 #define __BFA_SVC_H__
  13 
  14 #include "bfa_cs.h"
  15 #include "bfi_ms.h"
  16 
  17 
  18 /*
  19  * Scatter-gather DMA related defines
  20  */
  21 #define BFA_SGPG_MIN    (16)
  22 #define BFA_SGPG_MAX    (8192)
  23 
  24 /*
  25  * Alignment macro for SG page allocation
  26  */
  27 #define BFA_SGPG_ROUNDUP(_l) (((_l) + (sizeof(struct bfi_sgpg_s) - 1))  \
  28                               & ~(sizeof(struct bfi_sgpg_s) - 1))
  29 
  30 struct bfa_sgpg_wqe_s {
  31         struct list_head qe;    /*  queue sg page element       */
  32         int     nsgpg;          /*  pages to be allocated       */
  33         int     nsgpg_total;    /*  total pages required        */
  34         void    (*cbfn) (void *cbarg);  /*  callback function   */
  35         void    *cbarg;         /*  callback arg                */
  36         struct list_head sgpg_q;        /*  queue of alloced sgpgs      */
  37 };
  38 
  39 struct bfa_sgpg_s {
  40         struct list_head  qe;   /*  queue sg page element       */
  41         struct bfi_sgpg_s *sgpg;        /*  va of SG page               */
  42         union bfi_addr_u sgpg_pa;       /*  pa of SG page               */
  43 };
  44 
  45 /*
  46  * Given number of SG elements, BFA_SGPG_NPAGE() returns the number of
  47  * SG pages required.
  48  */
  49 #define BFA_SGPG_NPAGE(_nsges)  (((_nsges) / BFI_SGPG_DATA_SGES) + 1)
  50 
  51 /* Max SGPG dma segs required */
  52 #define BFA_SGPG_DMA_SEGS       \
  53         BFI_MEM_DMA_NSEGS(BFA_SGPG_MAX, (uint32_t)sizeof(struct bfi_sgpg_s))
  54 
  55 struct bfa_sgpg_mod_s {
  56         struct bfa_s *bfa;
  57         int             num_sgpgs;      /*  number of SG pages          */
  58         int             free_sgpgs;     /*  number of free SG pages     */
  59         struct list_head        sgpg_q;         /*  queue of free SG pages */
  60         struct list_head        sgpg_wait_q;    /*  wait queue for SG pages */
  61         struct bfa_mem_dma_s    dma_seg[BFA_SGPG_DMA_SEGS];
  62         struct bfa_mem_kva_s    kva_seg;
  63 };
  64 #define BFA_SGPG_MOD(__bfa)     (&(__bfa)->modules.sgpg_mod)
  65 #define BFA_MEM_SGPG_KVA(__bfa) (&(BFA_SGPG_MOD(__bfa)->kva_seg))
  66 
  67 bfa_status_t bfa_sgpg_malloc(struct bfa_s *bfa, struct list_head *sgpg_q,
  68                              int nsgpgs);
  69 void bfa_sgpg_mfree(struct bfa_s *bfa, struct list_head *sgpg_q, int nsgpgs);
  70 void bfa_sgpg_winit(struct bfa_sgpg_wqe_s *wqe,
  71                     void (*cbfn) (void *cbarg), void *cbarg);
  72 void bfa_sgpg_wait(struct bfa_s *bfa, struct bfa_sgpg_wqe_s *wqe, int nsgpgs);
  73 void bfa_sgpg_wcancel(struct bfa_s *bfa, struct bfa_sgpg_wqe_s *wqe);
  74 
  75 
  76 /*
  77  * FCXP related defines
  78  */
  79 #define BFA_FCXP_MIN            (1)
  80 #define BFA_FCXP_MAX            (256)
  81 #define BFA_FCXP_MAX_IBUF_SZ    (2 * 1024 + 256)
  82 #define BFA_FCXP_MAX_LBUF_SZ    (4 * 1024 + 256)
  83 
  84 /* Max FCXP dma segs required */
  85 #define BFA_FCXP_DMA_SEGS                                               \
  86         BFI_MEM_DMA_NSEGS(BFA_FCXP_MAX,                                 \
  87                 (u32)BFA_FCXP_MAX_IBUF_SZ + BFA_FCXP_MAX_LBUF_SZ)
  88 
  89 struct bfa_fcxp_mod_s {
  90         struct bfa_s      *bfa;         /* backpointer to BFA */
  91         struct bfa_fcxp_s *fcxp_list;   /* array of FCXPs */
  92         u16     num_fcxps;      /* max num FCXP requests */
  93         struct list_head fcxp_req_free_q; /* free FCXPs used for sending req */
  94         struct list_head fcxp_rsp_free_q; /* free FCXPs used for sending req */
  95         struct list_head fcxp_active_q; /* active FCXPs */
  96         struct list_head req_wait_q;    /* wait queue for free req_fcxp */
  97         struct list_head rsp_wait_q;    /* wait queue for free rsp_fcxp */
  98         struct list_head fcxp_req_unused_q;     /* unused req_fcxps */
  99         struct list_head fcxp_rsp_unused_q;     /* unused rsp_fcxps */
 100         u32     req_pld_sz;
 101         u32     rsp_pld_sz;
 102         struct bfa_mem_dma_s dma_seg[BFA_FCXP_DMA_SEGS];
 103         struct bfa_mem_kva_s kva_seg;
 104 };
 105 
 106 #define BFA_FCXP_MOD(__bfa)             (&(__bfa)->modules.fcxp_mod)
 107 #define BFA_FCXP_FROM_TAG(__mod, __tag) (&(__mod)->fcxp_list[__tag])
 108 #define BFA_MEM_FCXP_KVA(__bfa) (&(BFA_FCXP_MOD(__bfa)->kva_seg))
 109 
 110 typedef void    (*fcxp_send_cb_t) (struct bfa_s *ioc, struct bfa_fcxp_s *fcxp,
 111                                    void *cb_arg, bfa_status_t req_status,
 112                                    u32 rsp_len, u32 resid_len,
 113                                    struct fchs_s *rsp_fchs);
 114 
 115 typedef u64 (*bfa_fcxp_get_sgaddr_t) (void *bfad_fcxp, int sgeid);
 116 typedef u32 (*bfa_fcxp_get_sglen_t) (void *bfad_fcxp, int sgeid);
 117 typedef void (*bfa_cb_fcxp_send_t) (void *bfad_fcxp, struct bfa_fcxp_s *fcxp,
 118                                     void *cbarg, enum bfa_status req_status,
 119                                     u32 rsp_len, u32 resid_len,
 120                                     struct fchs_s *rsp_fchs);
 121 typedef void (*bfa_fcxp_alloc_cbfn_t) (void *cbarg, struct bfa_fcxp_s *fcxp);
 122 
 123 
 124 
 125 /*
 126  * Information needed for a FCXP request
 127  */
 128 struct bfa_fcxp_req_info_s {
 129         struct bfa_rport_s *bfa_rport;
 130                                         /* Pointer to the bfa rport that was
 131                                          * returned from bfa_rport_create().
 132                                          * This could be left NULL for WKA or
 133                                          * for FCXP interactions before the
 134                                          * rport nexus is established
 135                                          */
 136         struct fchs_s   fchs;   /*  request FC header structure */
 137         u8              cts;    /*  continuous sequence */
 138         u8              class;  /*  FC class for the request/response */
 139         u16     max_frmsz;      /*  max send frame size */
 140         u16     vf_id;  /*  vsan tag if applicable */
 141         u8              lp_tag; /*  lport tag */
 142         u32     req_tot_len;    /*  request payload total length */
 143 };
 144 
 145 struct bfa_fcxp_rsp_info_s {
 146         struct fchs_s   rsp_fchs;
 147                                 /* Response frame's FC header will
 148                                  * be sent back in this field */
 149         u8              rsp_timeout;
 150                                 /* timeout in seconds, 0-no response */
 151         u8              rsvd2[3];
 152         u32     rsp_maxlen;     /*  max response length expected */
 153 };
 154 
 155 struct bfa_fcxp_s {
 156         struct list_head        qe;             /*  fcxp queue element */
 157         bfa_sm_t        sm;             /*  state machine */
 158         void            *caller;        /*  driver or fcs */
 159         struct bfa_fcxp_mod_s *fcxp_mod;
 160         /*  back pointer to fcxp mod */
 161         u16     fcxp_tag;       /*  internal tag */
 162         struct bfa_fcxp_req_info_s req_info;
 163         /*  request info */
 164         struct bfa_fcxp_rsp_info_s rsp_info;
 165         /*  response info */
 166         u8      use_ireqbuf;    /*  use internal req buf */
 167         u8              use_irspbuf;    /*  use internal rsp buf */
 168         u32     nreq_sgles;     /*  num request SGLEs */
 169         u32     nrsp_sgles;     /*  num response SGLEs */
 170         struct list_head req_sgpg_q;    /*  SG pages for request buf */
 171         struct list_head req_sgpg_wqe;  /*  wait queue for req SG page */
 172         struct list_head rsp_sgpg_q;    /*  SG pages for response buf */
 173         struct list_head rsp_sgpg_wqe;  /*  wait queue for rsp SG page */
 174 
 175         bfa_fcxp_get_sgaddr_t req_sga_cbfn;
 176         /*  SG elem addr user function */
 177         bfa_fcxp_get_sglen_t req_sglen_cbfn;
 178         /*  SG elem len user function */
 179         bfa_fcxp_get_sgaddr_t rsp_sga_cbfn;
 180         /*  SG elem addr user function */
 181         bfa_fcxp_get_sglen_t rsp_sglen_cbfn;
 182         /*  SG elem len user function */
 183         bfa_cb_fcxp_send_t send_cbfn;   /*  send completion callback */
 184         void            *send_cbarg;    /*  callback arg */
 185         struct bfa_sge_s   req_sge[BFA_FCXP_MAX_SGES];
 186         /*  req SG elems */
 187         struct bfa_sge_s   rsp_sge[BFA_FCXP_MAX_SGES];
 188         /*  rsp SG elems */
 189         u8              rsp_status;     /*  comp: rsp status */
 190         u32     rsp_len;        /*  comp: actual response len */
 191         u32     residue_len;    /*  comp: residual rsp length */
 192         struct fchs_s   rsp_fchs;       /*  comp: response fchs */
 193         struct bfa_cb_qe_s    hcb_qe;   /*  comp: callback qelem */
 194         struct bfa_reqq_wait_s  reqq_wqe;
 195         bfa_boolean_t   reqq_waiting;
 196         bfa_boolean_t   req_rsp;        /* Used to track req/rsp fcxp */
 197 };
 198 
 199 struct bfa_fcxp_wqe_s {
 200         struct list_head                qe;
 201         bfa_fcxp_alloc_cbfn_t   alloc_cbfn;
 202         void            *alloc_cbarg;
 203         void            *caller;
 204         struct bfa_s    *bfa;
 205         int             nreq_sgles;
 206         int             nrsp_sgles;
 207         bfa_fcxp_get_sgaddr_t   req_sga_cbfn;
 208         bfa_fcxp_get_sglen_t    req_sglen_cbfn;
 209         bfa_fcxp_get_sgaddr_t   rsp_sga_cbfn;
 210         bfa_fcxp_get_sglen_t    rsp_sglen_cbfn;
 211 };
 212 
 213 #define BFA_FCXP_REQ_PLD(_fcxp)         (bfa_fcxp_get_reqbuf(_fcxp))
 214 #define BFA_FCXP_RSP_FCHS(_fcxp)        (&((_fcxp)->rsp_info.fchs))
 215 #define BFA_FCXP_RSP_PLD(_fcxp)         (bfa_fcxp_get_rspbuf(_fcxp))
 216 
 217 #define BFA_FCXP_REQ_PLD_PA(_fcxp)                                            \
 218         bfa_mem_get_dmabuf_pa((_fcxp)->fcxp_mod, (_fcxp)->fcxp_tag,           \
 219                 (_fcxp)->fcxp_mod->req_pld_sz + (_fcxp)->fcxp_mod->rsp_pld_sz)
 220 
 221 /* fcxp_buf = req_buf + rsp_buf :- add req_buf_sz to get to rsp_buf */
 222 #define BFA_FCXP_RSP_PLD_PA(_fcxp)                                             \
 223         (bfa_mem_get_dmabuf_pa((_fcxp)->fcxp_mod, (_fcxp)->fcxp_tag,           \
 224               (_fcxp)->fcxp_mod->req_pld_sz + (_fcxp)->fcxp_mod->rsp_pld_sz) + \
 225               (_fcxp)->fcxp_mod->req_pld_sz)
 226 
 227 void    bfa_fcxp_isr(struct bfa_s *bfa, struct bfi_msg_s *msg);
 228 
 229 
 230 /*
 231  * RPORT related defines
 232  */
 233 enum bfa_rport_event {
 234         BFA_RPORT_SM_CREATE     = 1,    /*  rport create event          */
 235         BFA_RPORT_SM_DELETE     = 2,    /*  deleting an existing rport  */
 236         BFA_RPORT_SM_ONLINE     = 3,    /*  rport is online             */
 237         BFA_RPORT_SM_OFFLINE    = 4,    /*  rport is offline            */
 238         BFA_RPORT_SM_FWRSP      = 5,    /*  firmware response           */
 239         BFA_RPORT_SM_HWFAIL     = 6,    /*  IOC h/w failure             */
 240         BFA_RPORT_SM_QOS_SCN    = 7,    /*  QoS SCN from firmware       */
 241         BFA_RPORT_SM_SET_SPEED  = 8,    /*  Set Rport Speed             */
 242         BFA_RPORT_SM_QRESUME    = 9,    /*  space in requeue queue      */
 243 };
 244 
 245 #define BFA_RPORT_MIN   4
 246 
 247 struct bfa_rport_mod_s {
 248         struct bfa_rport_s *rps_list;   /*  list of rports      */
 249         struct list_head        rp_free_q;      /*  free bfa_rports     */
 250         struct list_head        rp_active_q;    /*  free bfa_rports     */
 251         struct list_head        rp_unused_q;    /*  unused bfa rports  */
 252         u16     num_rports;     /*  number of rports    */
 253         struct bfa_mem_kva_s    kva_seg;
 254 };
 255 
 256 #define BFA_RPORT_MOD(__bfa)    (&(__bfa)->modules.rport_mod)
 257 #define BFA_MEM_RPORT_KVA(__bfa) (&(BFA_RPORT_MOD(__bfa)->kva_seg))
 258 
 259 /*
 260  * Convert rport tag to RPORT
 261  */
 262 #define BFA_RPORT_FROM_TAG(__bfa, _tag)                         \
 263         (BFA_RPORT_MOD(__bfa)->rps_list +                       \
 264          ((_tag) & (BFA_RPORT_MOD(__bfa)->num_rports - 1)))
 265 
 266 /*
 267  * protected functions
 268  */
 269 void    bfa_rport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg);
 270 void    bfa_rport_res_recfg(struct bfa_s *bfa, u16 num_rport_fw);
 271 
 272 /*
 273  *      BFA rport information.
 274  */
 275 struct bfa_rport_info_s {
 276         u16     max_frmsz;      /*  max rcv pdu size                */
 277         u32     pid:24, /*  remote port ID                  */
 278                 lp_tag:8;       /*  tag                     */
 279         u32     local_pid:24,   /*  local port ID                   */
 280                 cisc:8; /*  CIRO supported                  */
 281         u8      fc_class;       /*  supported FC classes. enum fc_cos */
 282         u8      vf_en;          /*  virtual fabric enable           */
 283         u16     vf_id;          /*  virtual fabric ID               */
 284         enum bfa_port_speed speed;      /*  Rport's current speed           */
 285 };
 286 
 287 /*
 288  * BFA rport data structure
 289  */
 290 struct bfa_rport_s {
 291         struct list_head        qe;     /*  queue element                   */
 292         bfa_sm_t        sm;             /*  state machine                   */
 293         struct bfa_s    *bfa;           /*  backpointer to BFA              */
 294         void            *rport_drv;     /*  fcs/driver rport object         */
 295         u16     fw_handle;      /*  firmware rport handle           */
 296         u16     rport_tag;      /*  BFA rport tag                   */
 297         u8      lun_mask;       /*  LUN mask flag                   */
 298         struct bfa_rport_info_s rport_info; /*  rport info from fcs/driver */
 299         struct bfa_reqq_wait_s reqq_wait; /*  to wait for room in reqq     */
 300         struct bfa_cb_qe_s hcb_qe;      /*  BFA callback qelem              */
 301         struct bfa_rport_hal_stats_s stats; /*  BFA rport statistics        */
 302         struct bfa_rport_qos_attr_s qos_attr;
 303         union a {
 304                 bfa_status_t    status; /*  f/w status */
 305                 void            *fw_msg; /*  QoS scn event                  */
 306         } event_arg;
 307 };
 308 #define BFA_RPORT_FC_COS(_rport)        ((_rport)->rport_info.fc_class)
 309 
 310 
 311 /*
 312  * UF - unsolicited receive related defines
 313  */
 314 
 315 #define BFA_UF_MIN      (4)
 316 #define BFA_UF_MAX      (256)
 317 
 318 struct bfa_uf_s {
 319         struct list_head        qe;     /*  queue element               */
 320         struct bfa_s            *bfa;   /*  bfa instance                */
 321         u16     uf_tag;         /*  identifying tag fw msgs     */
 322         u16     vf_id;
 323         u16     src_rport_handle;
 324         u16     rsvd;
 325         u8              *data_ptr;
 326         u16     data_len;       /*  actual receive length       */
 327         u16     pb_len;         /*  posted buffer length        */
 328         void            *buf_kva;       /*  buffer virtual address      */
 329         u64     buf_pa;         /*  buffer physical address     */
 330         struct bfa_cb_qe_s hcb_qe;      /*  comp: BFA comp qelem        */
 331         struct bfa_sge_s sges[BFI_SGE_INLINE_MAX];
 332 };
 333 
 334 /*
 335  *      Callback prototype for unsolicited frame receive handler.
 336  *
 337  * @param[in]           cbarg           callback arg for receive handler
 338  * @param[in]           uf              unsolicited frame descriptor
 339  *
 340  * @return None
 341  */
 342 typedef void (*bfa_cb_uf_recv_t) (void *cbarg, struct bfa_uf_s *uf);
 343 
 344 #define BFA_UF_BUFSZ    (2 * 1024 + 256)
 345 
 346 struct bfa_uf_buf_s {
 347         u8      d[BFA_UF_BUFSZ];
 348 };
 349 
 350 #define BFA_PER_UF_DMA_SZ       \
 351         (u32)BFA_ROUNDUP(sizeof(struct bfa_uf_buf_s), BFA_DMA_ALIGN_SZ)
 352 
 353 /* Max UF dma segs required */
 354 #define BFA_UF_DMA_SEGS BFI_MEM_DMA_NSEGS(BFA_UF_MAX, BFA_PER_UF_DMA_SZ)
 355 
 356 struct bfa_uf_mod_s {
 357         struct bfa_s *bfa;              /*  back pointer to BFA */
 358         struct bfa_uf_s *uf_list;       /*  array of UFs */
 359         u16     num_ufs;        /*  num unsolicited rx frames */
 360         struct list_head        uf_free_q;      /*  free UFs */
 361         struct list_head        uf_posted_q;    /*  UFs posted to IOC */
 362         struct list_head        uf_unused_q;    /*  unused UF's */
 363         struct bfi_uf_buf_post_s *uf_buf_posts;
 364         /*  pre-built UF post msgs */
 365         bfa_cb_uf_recv_t ufrecv;        /*  uf recv handler function */
 366         void            *cbarg;         /*  uf receive handler arg */
 367         struct bfa_mem_dma_s    dma_seg[BFA_UF_DMA_SEGS];
 368         struct bfa_mem_kva_s    kva_seg;
 369 };
 370 
 371 #define BFA_UF_MOD(__bfa)       (&(__bfa)->modules.uf_mod)
 372 #define BFA_MEM_UF_KVA(__bfa)   (&(BFA_UF_MOD(__bfa)->kva_seg))
 373 
 374 #define ufm_pbs_pa(_ufmod, _uftag)                                      \
 375         bfa_mem_get_dmabuf_pa(_ufmod, _uftag, BFA_PER_UF_DMA_SZ)
 376 
 377 void    bfa_uf_isr(struct bfa_s *bfa, struct bfi_msg_s *msg);
 378 void    bfa_uf_res_recfg(struct bfa_s *bfa, u16 num_uf_fw);
 379 
 380 /*
 381  * LPS - bfa lport login/logout service interface
 382  */
 383 struct bfa_lps_s {
 384         struct list_head        qe;     /*  queue element               */
 385         struct bfa_s    *bfa;           /*  parent bfa instance */
 386         bfa_sm_t        sm;             /*  finite state machine        */
 387         u8              bfa_tag;        /*  lport tag           */
 388         u8              fw_tag;         /*  lport fw tag                */
 389         u8              reqq;           /*  lport request queue */
 390         u8              alpa;           /*  ALPA for loop topologies    */
 391         u32     lp_pid;         /*  lport port ID               */
 392         bfa_boolean_t   fdisc;          /*  snd FDISC instead of FLOGI  */
 393         bfa_boolean_t   auth_en;        /*  enable authentication       */
 394         bfa_boolean_t   auth_req;       /*  authentication required     */
 395         bfa_boolean_t   npiv_en;        /*  NPIV is allowed by peer     */
 396         bfa_boolean_t   fport;          /*  attached peer is F_PORT     */
 397         bfa_boolean_t   brcd_switch;    /*  attached peer is brcd sw    */
 398         bfa_status_t    status;         /*  login status                */
 399         u16             pdusz;          /*  max receive PDU size        */
 400         u16             pr_bbcred;      /*  BB_CREDIT from peer         */
 401         u8              lsrjt_rsn;      /*  LSRJT reason                */
 402         u8              lsrjt_expl;     /*  LSRJT explanation           */
 403         u8              lun_mask;       /*  LUN mask flag               */
 404         wwn_t           pwwn;           /*  port wwn of lport           */
 405         wwn_t           nwwn;           /*  node wwn of lport           */
 406         wwn_t           pr_pwwn;        /*  port wwn of lport peer      */
 407         wwn_t           pr_nwwn;        /*  node wwn of lport peer      */
 408         mac_t           lp_mac;         /*  fpma/spma MAC for lport     */
 409         mac_t           fcf_mac;        /*  FCF MAC of lport            */
 410         struct bfa_reqq_wait_s  wqe;    /*  request wait queue element  */
 411         void            *uarg;          /*  user callback arg           */
 412         struct bfa_cb_qe_s hcb_qe;      /*  comp: callback qelem        */
 413         struct bfi_lps_login_rsp_s *loginrsp;
 414         bfa_eproto_status_t ext_status;
 415 };
 416 
 417 struct bfa_lps_mod_s {
 418         struct list_head                lps_free_q;
 419         struct list_head                lps_active_q;
 420         struct list_head                lps_login_q;
 421         struct bfa_lps_s        *lps_arr;
 422         int                     num_lps;
 423         struct bfa_mem_kva_s    kva_seg;
 424 };
 425 
 426 #define BFA_LPS_MOD(__bfa)              (&(__bfa)->modules.lps_mod)
 427 #define BFA_LPS_FROM_TAG(__mod, __tag)  (&(__mod)->lps_arr[__tag])
 428 #define BFA_MEM_LPS_KVA(__bfa)  (&(BFA_LPS_MOD(__bfa)->kva_seg))
 429 
 430 /*
 431  * external functions
 432  */
 433 void    bfa_lps_isr(struct bfa_s *bfa, struct bfi_msg_s *msg);
 434 
 435 
 436 /*
 437  * FCPORT related defines
 438  */
 439 
 440 #define BFA_FCPORT(_bfa)        (&((_bfa)->modules.port))
 441 
 442 /*
 443  * Link notification data structure
 444  */
 445 struct bfa_fcport_ln_s {
 446         struct bfa_fcport_s     *fcport;
 447         bfa_sm_t                sm;
 448         struct bfa_cb_qe_s      ln_qe;  /*  BFA callback queue elem for ln */
 449         enum bfa_port_linkstate ln_event; /*  ln event for callback */
 450 };
 451 
 452 struct bfa_fcport_trunk_s {
 453         struct bfa_trunk_attr_s attr;
 454 };
 455 
 456 /*
 457  * BFA FC port data structure
 458  */
 459 struct bfa_fcport_s {
 460         struct bfa_s            *bfa;   /*  parent BFA instance */
 461         bfa_sm_t                sm;     /*  port state machine */
 462         wwn_t                   nwwn;   /*  node wwn of physical port */
 463         wwn_t                   pwwn;   /*  port wwn of physical oprt */
 464         enum bfa_port_speed speed_sup;
 465         /*  supported speeds */
 466         enum bfa_port_speed speed;      /*  current speed */
 467         enum bfa_port_topology topology;        /*  current topology */
 468         u8                      rsvd[3];
 469         u8                      myalpa; /*  my ALPA in LOOP topology */
 470         u8                      alpabm_valid; /* alpa bitmap valid or not */
 471         struct fc_alpabm_s      alpabm; /* alpa bitmap */
 472         struct bfa_port_cfg_s   cfg;    /*  current port configuration */
 473         bfa_boolean_t           use_flash_cfg; /* get port cfg from flash */
 474         struct bfa_qos_attr_s  qos_attr;   /* QoS Attributes */
 475         struct bfa_qos_vc_attr_s qos_vc_attr;  /*  VC info from ELP */
 476         struct bfa_reqq_wait_s  reqq_wait;
 477         /*  to wait for room in reqq */
 478         struct bfa_reqq_wait_s  svcreq_wait;
 479         /*  to wait for room in reqq */
 480         struct bfa_reqq_wait_s  stats_reqq_wait;
 481         /*  to wait for room in reqq (stats) */
 482         void                    *event_cbarg;
 483         void                    (*event_cbfn) (void *cbarg,
 484                                                enum bfa_port_linkstate event);
 485         union {
 486                 union bfi_fcport_i2h_msg_u i2hmsg;
 487         } event_arg;
 488         void                    *bfad;  /*  BFA driver handle */
 489         struct bfa_fcport_ln_s  ln; /*  Link Notification */
 490         struct bfa_cb_qe_s      hcb_qe; /*  BFA callback queue elem */
 491         struct bfa_timer_s      timer;  /*  timer */
 492         u32             msgtag; /*  fimrware msg tag for reply */
 493         u8                      *stats_kva;
 494         u64             stats_pa;
 495         union bfa_fcport_stats_u *stats;
 496         bfa_status_t            stats_status; /*  stats/statsclr status */
 497         struct list_head        stats_pending_q;
 498         struct list_head        statsclr_pending_q;
 499         bfa_boolean_t           stats_qfull;
 500         time64_t                stats_reset_time; /*  stats reset time stamp */
 501         bfa_boolean_t           diag_busy; /*  diag busy status */
 502         bfa_boolean_t           beacon; /*  port beacon status */
 503         bfa_boolean_t           link_e2e_beacon; /*  link beacon status */
 504         struct bfa_fcport_trunk_s trunk;
 505         u16             fcoe_vlan;
 506         struct bfa_mem_dma_s    fcport_dma;
 507         bfa_boolean_t           stats_dma_ready;
 508         struct bfa_bbcr_attr_s  bbcr_attr;
 509         enum bfa_fec_state_s    fec_state;
 510 };
 511 
 512 #define BFA_FCPORT_MOD(__bfa)   (&(__bfa)->modules.fcport)
 513 #define BFA_MEM_FCPORT_DMA(__bfa) (&(BFA_FCPORT_MOD(__bfa)->fcport_dma))
 514 
 515 /*
 516  * protected functions
 517  */
 518 void bfa_fcport_init(struct bfa_s *bfa);
 519 void bfa_fcport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg);
 520 
 521 /*
 522  * bfa fcport API functions
 523  */
 524 bfa_status_t bfa_fcport_enable(struct bfa_s *bfa);
 525 bfa_status_t bfa_fcport_disable(struct bfa_s *bfa);
 526 bfa_status_t bfa_fcport_cfg_speed(struct bfa_s *bfa,
 527                                   enum bfa_port_speed speed);
 528 enum bfa_port_speed bfa_fcport_get_speed(struct bfa_s *bfa);
 529 bfa_status_t bfa_fcport_cfg_topology(struct bfa_s *bfa,
 530                                      enum bfa_port_topology topo);
 531 enum bfa_port_topology bfa_fcport_get_topology(struct bfa_s *bfa);
 532 enum bfa_port_topology bfa_fcport_get_cfg_topology(struct bfa_s *bfa);
 533 bfa_status_t bfa_fcport_cfg_hardalpa(struct bfa_s *bfa, u8 alpa);
 534 bfa_boolean_t bfa_fcport_get_hardalpa(struct bfa_s *bfa, u8 *alpa);
 535 u8 bfa_fcport_get_myalpa(struct bfa_s *bfa);
 536 bfa_status_t bfa_fcport_clr_hardalpa(struct bfa_s *bfa);
 537 bfa_status_t bfa_fcport_cfg_maxfrsize(struct bfa_s *bfa, u16 maxsize);
 538 u16 bfa_fcport_get_maxfrsize(struct bfa_s *bfa);
 539 u8 bfa_fcport_get_rx_bbcredit(struct bfa_s *bfa);
 540 void bfa_fcport_get_attr(struct bfa_s *bfa, struct bfa_port_attr_s *attr);
 541 wwn_t bfa_fcport_get_wwn(struct bfa_s *bfa, bfa_boolean_t node);
 542 void bfa_fcport_event_register(struct bfa_s *bfa,
 543                         void (*event_cbfn) (void *cbarg,
 544                         enum bfa_port_linkstate event), void *event_cbarg);
 545 bfa_boolean_t bfa_fcport_is_disabled(struct bfa_s *bfa);
 546 bfa_boolean_t bfa_fcport_is_dport(struct bfa_s *bfa);
 547 bfa_boolean_t bfa_fcport_is_ddport(struct bfa_s *bfa);
 548 bfa_status_t bfa_fcport_set_qos_bw(struct bfa_s *bfa,
 549                                    struct bfa_qos_bw_s *qos_bw);
 550 enum bfa_port_speed bfa_fcport_get_ratelim_speed(struct bfa_s *bfa);
 551 
 552 void bfa_fcport_set_tx_bbcredit(struct bfa_s *bfa, u16 tx_bbcredit);
 553 bfa_boolean_t     bfa_fcport_is_ratelim(struct bfa_s *bfa);
 554 void bfa_fcport_beacon(void *dev, bfa_boolean_t beacon,
 555                         bfa_boolean_t link_e2e_beacon);
 556 bfa_boolean_t   bfa_fcport_is_linkup(struct bfa_s *bfa);
 557 bfa_status_t bfa_fcport_get_stats(struct bfa_s *bfa,
 558                         struct bfa_cb_pending_q_s *cb);
 559 bfa_status_t bfa_fcport_clear_stats(struct bfa_s *bfa,
 560                         struct bfa_cb_pending_q_s *cb);
 561 bfa_boolean_t bfa_fcport_is_qos_enabled(struct bfa_s *bfa);
 562 bfa_boolean_t bfa_fcport_is_trunk_enabled(struct bfa_s *bfa);
 563 void bfa_fcport_dportenable(struct bfa_s *bfa);
 564 void bfa_fcport_dportdisable(struct bfa_s *bfa);
 565 bfa_status_t bfa_fcport_is_pbcdisabled(struct bfa_s *bfa);
 566 void bfa_fcport_cfg_faa(struct bfa_s *bfa, u8 state);
 567 bfa_status_t bfa_fcport_cfg_bbcr(struct bfa_s *bfa,
 568                         bfa_boolean_t on_off, u8 bb_scn);
 569 bfa_status_t bfa_fcport_get_bbcr_attr(struct bfa_s *bfa,
 570                         struct bfa_bbcr_attr_s *bbcr_attr);
 571 
 572 /*
 573  * bfa rport API functions
 574  */
 575 struct bfa_rport_s *bfa_rport_create(struct bfa_s *bfa, void *rport_drv);
 576 void bfa_rport_online(struct bfa_rport_s *rport,
 577                       struct bfa_rport_info_s *rport_info);
 578 void bfa_rport_speed(struct bfa_rport_s *rport, enum bfa_port_speed speed);
 579 void bfa_cb_rport_online(void *rport);
 580 void bfa_cb_rport_offline(void *rport);
 581 void bfa_cb_rport_qos_scn_flowid(void *rport,
 582                                  struct bfa_rport_qos_attr_s old_qos_attr,
 583                                  struct bfa_rport_qos_attr_s new_qos_attr);
 584 void bfa_cb_rport_scn_online(struct bfa_s *bfa);
 585 void bfa_cb_rport_scn_offline(struct bfa_s *bfa);
 586 void bfa_cb_rport_scn_no_dev(void *rp);
 587 void bfa_cb_rport_qos_scn_prio(void *rport,
 588                                struct bfa_rport_qos_attr_s old_qos_attr,
 589                                struct bfa_rport_qos_attr_s new_qos_attr);
 590 
 591 /*
 592  *      Rport LUN masking related
 593  */
 594 #define BFA_RPORT_TAG_INVALID   0xffff
 595 #define BFA_LP_TAG_INVALID      0xff
 596 void    bfa_rport_set_lunmask(struct bfa_s *bfa, struct bfa_rport_s *rp);
 597 void    bfa_rport_unset_lunmask(struct bfa_s *bfa, struct bfa_rport_s *rp);
 598 
 599 /*
 600  * bfa fcxp API functions
 601  */
 602 struct bfa_fcxp_s *bfa_fcxp_req_rsp_alloc(void *bfad_fcxp, struct bfa_s *bfa,
 603                                   int nreq_sgles, int nrsp_sgles,
 604                                   bfa_fcxp_get_sgaddr_t get_req_sga,
 605                                   bfa_fcxp_get_sglen_t get_req_sglen,
 606                                   bfa_fcxp_get_sgaddr_t get_rsp_sga,
 607                                   bfa_fcxp_get_sglen_t get_rsp_sglen,
 608                                   bfa_boolean_t req);
 609 void bfa_fcxp_req_rsp_alloc_wait(struct bfa_s *bfa, struct bfa_fcxp_wqe_s *wqe,
 610                                 bfa_fcxp_alloc_cbfn_t alloc_cbfn,
 611                                 void *cbarg, void *bfad_fcxp,
 612                                 int nreq_sgles, int nrsp_sgles,
 613                                 bfa_fcxp_get_sgaddr_t get_req_sga,
 614                                 bfa_fcxp_get_sglen_t get_req_sglen,
 615                                 bfa_fcxp_get_sgaddr_t get_rsp_sga,
 616                                 bfa_fcxp_get_sglen_t get_rsp_sglen,
 617                                 bfa_boolean_t req);
 618 void bfa_fcxp_walloc_cancel(struct bfa_s *bfa,
 619                             struct bfa_fcxp_wqe_s *wqe);
 620 void bfa_fcxp_discard(struct bfa_fcxp_s *fcxp);
 621 
 622 void *bfa_fcxp_get_reqbuf(struct bfa_fcxp_s *fcxp);
 623 void *bfa_fcxp_get_rspbuf(struct bfa_fcxp_s *fcxp);
 624 
 625 void bfa_fcxp_free(struct bfa_fcxp_s *fcxp);
 626 
 627 void bfa_fcxp_send(struct bfa_fcxp_s *fcxp, struct bfa_rport_s *rport,
 628                    u16 vf_id, u8 lp_tag,
 629                    bfa_boolean_t cts, enum fc_cos cos,
 630                    u32 reqlen, struct fchs_s *fchs,
 631                    bfa_cb_fcxp_send_t cbfn,
 632                    void *cbarg,
 633                    u32 rsp_maxlen, u8 rsp_timeout);
 634 bfa_status_t bfa_fcxp_abort(struct bfa_fcxp_s *fcxp);
 635 u32 bfa_fcxp_get_reqbufsz(struct bfa_fcxp_s *fcxp);
 636 u32 bfa_fcxp_get_maxrsp(struct bfa_s *bfa);
 637 void bfa_fcxp_res_recfg(struct bfa_s *bfa, u16 num_fcxp_fw);
 638 
 639 static inline void *
 640 bfa_uf_get_frmbuf(struct bfa_uf_s *uf)
 641 {
 642         return uf->data_ptr;
 643 }
 644 
 645 static inline   u16
 646 bfa_uf_get_frmlen(struct bfa_uf_s *uf)
 647 {
 648         return uf->data_len;
 649 }
 650 
 651 /*
 652  * bfa uf API functions
 653  */
 654 void bfa_uf_recv_register(struct bfa_s *bfa, bfa_cb_uf_recv_t ufrecv,
 655                           void *cbarg);
 656 void bfa_uf_free(struct bfa_uf_s *uf);
 657 
 658 /*
 659  * bfa lport service api
 660  */
 661 
 662 u32 bfa_lps_get_max_vport(struct bfa_s *bfa);
 663 struct bfa_lps_s *bfa_lps_alloc(struct bfa_s *bfa);
 664 void bfa_lps_delete(struct bfa_lps_s *lps);
 665 void bfa_lps_flogi(struct bfa_lps_s *lps, void *uarg, u8 alpa,
 666                    u16 pdusz, wwn_t pwwn, wwn_t nwwn,
 667                    bfa_boolean_t auth_en);
 668 void bfa_lps_fdisc(struct bfa_lps_s *lps, void *uarg, u16 pdusz,
 669                    wwn_t pwwn, wwn_t nwwn);
 670 void bfa_lps_fdisclogo(struct bfa_lps_s *lps);
 671 void bfa_lps_set_n2n_pid(struct bfa_lps_s *lps, u32 n2n_pid);
 672 u8 bfa_lps_get_fwtag(struct bfa_s *bfa, u8 lp_tag);
 673 u32 bfa_lps_get_base_pid(struct bfa_s *bfa);
 674 u8 bfa_lps_get_tag_from_pid(struct bfa_s *bfa, u32 pid);
 675 void bfa_cb_lps_flogi_comp(void *bfad, void *uarg, bfa_status_t status);
 676 void bfa_cb_lps_flogo_comp(void *bfad, void *uarg);
 677 void bfa_cb_lps_fdisc_comp(void *bfad, void *uarg, bfa_status_t status);
 678 void bfa_cb_lps_fdisclogo_comp(void *bfad, void *uarg);
 679 void bfa_cb_lps_cvl_event(void *bfad, void *uarg);
 680 
 681 /* FAA specific APIs */
 682 bfa_status_t bfa_faa_query(struct bfa_s *bfa, struct bfa_faa_attr_s *attr,
 683                         bfa_cb_iocfc_t cbfn, void *cbarg);
 684 
 685 /*
 686  *      FC DIAG data structure
 687  */
 688 struct bfa_fcdiag_qtest_s {
 689         struct bfa_diag_qtest_result_s *result;
 690         bfa_cb_diag_t   cbfn;
 691         void            *cbarg;
 692         struct bfa_timer_s      timer;
 693         u32     status;
 694         u32     count;
 695         u8      lock;
 696         u8      queue;
 697         u8      all;
 698         u8      timer_active;
 699 };
 700 
 701 struct bfa_fcdiag_lb_s {
 702         bfa_cb_diag_t   cbfn;
 703         void            *cbarg;
 704         void            *result;
 705         bfa_boolean_t   lock;
 706         u32        status;
 707 };
 708 
 709 struct bfa_dport_s {
 710         struct bfa_s    *bfa;           /* Back pointer to BFA  */
 711         bfa_sm_t        sm;             /* finite state machine */
 712         struct bfa_reqq_wait_s reqq_wait;
 713         bfa_cb_diag_t   cbfn;
 714         void            *cbarg;
 715         union bfi_diag_dport_msg_u i2hmsg;
 716         u8              test_state;     /* enum dport_test_state  */
 717         u8              dynamic;        /* boolean_t  */
 718         u8              rsvd[2];
 719         u32             lpcnt;
 720         u32             payload;        /* user defined payload pattern */
 721         wwn_t           rp_pwwn;
 722         wwn_t           rp_nwwn;
 723         struct bfa_diag_dport_result_s result;
 724 };
 725 
 726 struct bfa_fcdiag_s {
 727         struct bfa_s    *bfa;           /* Back pointer to BFA */
 728         struct bfa_trc_mod_s   *trcmod;
 729         struct bfa_fcdiag_lb_s lb;
 730         struct bfa_fcdiag_qtest_s qtest;
 731         struct bfa_dport_s      dport;
 732 };
 733 
 734 #define BFA_FCDIAG_MOD(__bfa)   (&(__bfa)->modules.fcdiag)
 735 
 736 void    bfa_fcdiag_intr(struct bfa_s *bfa, struct bfi_msg_s *msg);
 737 
 738 bfa_status_t    bfa_fcdiag_loopback(struct bfa_s *bfa,
 739                                 enum bfa_port_opmode opmode,
 740                                 enum bfa_port_speed speed, u32 lpcnt, u32 pat,
 741                                 struct bfa_diag_loopback_result_s *result,
 742                                 bfa_cb_diag_t cbfn, void *cbarg);
 743 bfa_status_t    bfa_fcdiag_queuetest(struct bfa_s *bfa, u32 ignore,
 744                         u32 queue, struct bfa_diag_qtest_result_s *result,
 745                         bfa_cb_diag_t cbfn, void *cbarg);
 746 bfa_status_t    bfa_fcdiag_lb_is_running(struct bfa_s *bfa);
 747 bfa_status_t    bfa_dport_enable(struct bfa_s *bfa, u32 lpcnt, u32 pat,
 748                                         bfa_cb_diag_t cbfn, void *cbarg);
 749 bfa_status_t    bfa_dport_disable(struct bfa_s *bfa, bfa_cb_diag_t cbfn,
 750                                   void *cbarg);
 751 bfa_status_t    bfa_dport_start(struct bfa_s *bfa, u32 lpcnt, u32 pat,
 752                                 bfa_cb_diag_t cbfn, void *cbarg);
 753 bfa_status_t    bfa_dport_show(struct bfa_s *bfa,
 754                                 struct bfa_diag_dport_result_s *result);
 755 
 756 #endif /* __BFA_SVC_H__ */

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