linux/drivers/scsi/bfa/bfa_fcxp_priv.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2005-2009 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_FCXP_PRIV_H__
  19#define __BFA_FCXP_PRIV_H__
  20
  21#include <cs/bfa_sm.h>
  22#include <protocol/fc.h>
  23#include <bfa_svc.h>
  24#include <bfi/bfi_fcxp.h>
  25
  26#define BFA_FCXP_MIN            (1)
  27#define BFA_FCXP_MAX_IBUF_SZ    (2 * 1024 + 256)
  28#define BFA_FCXP_MAX_LBUF_SZ    (4 * 1024 + 256)
  29
  30struct bfa_fcxp_mod_s {
  31        struct bfa_s      *bfa;         /*  backpointer to BFA */
  32        struct bfa_fcxp_s *fcxp_list;   /*  array of FCXPs */
  33        u16        num_fcxps;   /*  max num FCXP requests */
  34        struct list_head fcxp_free_q;   /*  free FCXPs */
  35        struct list_head fcxp_active_q; /*  active FCXPs */
  36        void    *req_pld_list_kva;      /*  list of FCXP req pld */
  37        u64 req_pld_list_pa;    /*  list of FCXP req pld */
  38        void *rsp_pld_list_kva;         /*  list of FCXP resp pld */
  39        u64 rsp_pld_list_pa;    /*  list of FCXP resp pld */
  40        struct list_head  wait_q;               /*  wait queue for free fcxp */
  41        u32     req_pld_sz;
  42        u32     rsp_pld_sz;
  43};
  44
  45#define BFA_FCXP_MOD(__bfa)             (&(__bfa)->modules.fcxp_mod)
  46#define BFA_FCXP_FROM_TAG(__mod, __tag) (&(__mod)->fcxp_list[__tag])
  47
  48typedef void    (*fcxp_send_cb_t) (struct bfa_s *ioc, struct bfa_fcxp_s *fcxp,
  49                                   void *cb_arg, bfa_status_t req_status,
  50                                   u32 rsp_len, u32 resid_len,
  51                                   struct fchs_s *rsp_fchs);
  52
  53/**
  54 * Information needed for a FCXP request
  55 */
  56struct bfa_fcxp_req_info_s {
  57        struct bfa_rport_s *bfa_rport;  /*  Pointer to the bfa rport that was
  58                                         *returned from bfa_rport_create().
  59                                         *This could be left NULL for WKA or for
  60                                         *FCXP interactions before the rport
  61                                         *nexus is established
  62                                         */
  63        struct fchs_s   fchs;   /*  request FC header structure */
  64        u8 cts;         /*  continous sequence */
  65        u8 class;               /*  FC class for the request/response */
  66        u16 max_frmsz;  /*  max send frame size */
  67        u16 vf_id;              /*  vsan tag if applicable */
  68        u8      lp_tag;         /*  lport tag */
  69        u32 req_tot_len;        /*  request payload total length */
  70};
  71
  72struct bfa_fcxp_rsp_info_s {
  73        struct fchs_s rsp_fchs;         /*  Response frame's FC header will
  74                                         * be *sent back in this field */
  75        u8         rsp_timeout; /*  timeout in seconds, 0-no response
  76                                         */
  77        u8         rsvd2[3];
  78        u32        rsp_maxlen;  /*  max response length expected */
  79};
  80
  81struct bfa_fcxp_s {
  82        struct list_head        qe;             /*  fcxp queue element */
  83        bfa_sm_t        sm;             /*  state machine */
  84        void            *caller;        /*  driver or fcs */
  85        struct bfa_fcxp_mod_s *fcxp_mod;
  86                                        /*  back pointer to fcxp mod */
  87        u16        fcxp_tag;    /*  internal tag */
  88        struct bfa_fcxp_req_info_s req_info;
  89                                        /*  request info */
  90        struct bfa_fcxp_rsp_info_s rsp_info;
  91                                        /*  response info */
  92        u8      use_ireqbuf;    /*  use internal req buf */
  93        u8         use_irspbuf; /*  use internal rsp buf */
  94        u32        nreq_sgles;  /*  num request SGLEs */
  95        u32        nrsp_sgles;  /*  num response SGLEs */
  96        struct list_head req_sgpg_q;    /*  SG pages for request buf */
  97        struct list_head req_sgpg_wqe;  /*  wait queue for req SG page */
  98        struct list_head rsp_sgpg_q;    /*  SG pages for response buf */
  99        struct list_head rsp_sgpg_wqe;  /*  wait queue for rsp SG page */
 100
 101        bfa_fcxp_get_sgaddr_t req_sga_cbfn;
 102                                        /*  SG elem addr user function */
 103        bfa_fcxp_get_sglen_t req_sglen_cbfn;
 104                                        /*  SG elem len user function */
 105        bfa_fcxp_get_sgaddr_t rsp_sga_cbfn;
 106                                        /*  SG elem addr user function */
 107        bfa_fcxp_get_sglen_t rsp_sglen_cbfn;
 108                                        /*  SG elem len user function */
 109        bfa_cb_fcxp_send_t send_cbfn;   /*  send completion callback */
 110        void            *send_cbarg;    /*  callback arg */
 111        struct bfa_sge_s   req_sge[BFA_FCXP_MAX_SGES];
 112                                        /*  req SG elems */
 113        struct bfa_sge_s   rsp_sge[BFA_FCXP_MAX_SGES];
 114                                        /*  rsp SG elems */
 115        u8         rsp_status;  /*  comp: rsp status */
 116        u32        rsp_len;     /*  comp: actual response len */
 117        u32        residue_len; /*  comp: residual rsp length */
 118        struct fchs_s          rsp_fchs;        /*  comp: response fchs */
 119        struct bfa_cb_qe_s    hcb_qe;   /*  comp: callback qelem */
 120        struct bfa_reqq_wait_s  reqq_wqe;
 121        bfa_boolean_t   reqq_waiting;
 122};
 123
 124#define BFA_FCXP_REQ_PLD(_fcxp)         (bfa_fcxp_get_reqbuf(_fcxp))
 125
 126#define BFA_FCXP_RSP_FCHS(_fcxp)        (&((_fcxp)->rsp_info.fchs))
 127#define BFA_FCXP_RSP_PLD(_fcxp)         (bfa_fcxp_get_rspbuf(_fcxp))
 128
 129#define BFA_FCXP_REQ_PLD_PA(_fcxp)                                      \
 130        ((_fcxp)->fcxp_mod->req_pld_list_pa +                           \
 131                ((_fcxp)->fcxp_mod->req_pld_sz  * (_fcxp)->fcxp_tag))
 132
 133#define BFA_FCXP_RSP_PLD_PA(_fcxp)                                      \
 134        ((_fcxp)->fcxp_mod->rsp_pld_list_pa +                           \
 135                ((_fcxp)->fcxp_mod->rsp_pld_sz * (_fcxp)->fcxp_tag))
 136
 137void    bfa_fcxp_isr(struct bfa_s *bfa, struct bfi_msg_s *msg);
 138#endif /* __BFA_FCXP_PRIV_H__ */
 139