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