Merge branch 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelv...
[safe/jmp/linux-2.6] / drivers / scsi / bfa / bfa_fcxp_priv.h
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
30 struct 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
48 typedef 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  */
56 struct 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
72 struct 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
81 struct 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
137 void    bfa_fcxp_isr(struct bfa_s *bfa, struct bfi_msg_s *msg);
138 #endif /* __BFA_FCXP_PRIV_H__ */