1 /* SPDX-License-Identifier: GPL-2.0-only */
3 * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.
4 * Copyright (c) 2014- QLogic Corporation.
8 * Linux driver for QLogic BR-series Fibre Channel Host Bus Adapter.
11 * fcbuild.h - FC link service frame building and parsing routines
19 #include "bfa_defs_fcs.h"
22 * Utility Macros/functions
25 #define wwn_is_equal(_wwn1, _wwn2) \
26 (memcmp(&(_wwn1), &(_wwn2), sizeof(wwn_t)) == 0)
28 #define fc_roundup(_l, _s) (((_l) + ((_s) - 1)) & ~((_s) - 1))
31 * Given the fc response length, this routine will return
32 * the length of the actual payload bytes following the CT header.
34 * Assumes the input response length does not include the crc, eof, etc.
37 fc_get_ctresp_pyld_len(u32 resp_len
)
39 return resp_len
- sizeof(struct ct_hdr_s
);
43 * Convert bfa speed to rpsc speed value.
45 static inline enum bfa_port_speed
46 fc_rpsc_operspeed_to_bfa_speed(enum fc_rpsc_op_speed speed
)
50 case RPSC_OP_SPEED_1G
:
51 return BFA_PORT_SPEED_1GBPS
;
53 case RPSC_OP_SPEED_2G
:
54 return BFA_PORT_SPEED_2GBPS
;
56 case RPSC_OP_SPEED_4G
:
57 return BFA_PORT_SPEED_4GBPS
;
59 case RPSC_OP_SPEED_8G
:
60 return BFA_PORT_SPEED_8GBPS
;
62 case RPSC_OP_SPEED_16G
:
63 return BFA_PORT_SPEED_16GBPS
;
65 case RPSC_OP_SPEED_10G
:
66 return BFA_PORT_SPEED_10GBPS
;
69 return BFA_PORT_SPEED_UNKNOWN
;
74 * Convert RPSC speed to bfa speed value.
76 static inline enum fc_rpsc_op_speed
77 fc_bfa_speed_to_rpsc_operspeed(enum bfa_port_speed op_speed
)
81 case BFA_PORT_SPEED_1GBPS
:
82 return RPSC_OP_SPEED_1G
;
84 case BFA_PORT_SPEED_2GBPS
:
85 return RPSC_OP_SPEED_2G
;
87 case BFA_PORT_SPEED_4GBPS
:
88 return RPSC_OP_SPEED_4G
;
90 case BFA_PORT_SPEED_8GBPS
:
91 return RPSC_OP_SPEED_8G
;
93 case BFA_PORT_SPEED_16GBPS
:
94 return RPSC_OP_SPEED_16G
;
96 case BFA_PORT_SPEED_10GBPS
:
97 return RPSC_OP_SPEED_10G
;
100 return RPSC_OP_SPEED_NOT_EST
;
104 enum fc_parse_status
{
106 FC_PARSE_FAILURE
= 1,
110 FC_PARSE_PWWN_NOT_EQUAL
,
111 FC_PARSE_NWWN_NOT_EQUAL
,
114 FC_PARSE_OPAFLAG_INVAL
,
115 FC_PARSE_RPAFLAG_INVAL
,
121 struct fc_templates_s
{
122 struct fchs_s fc_els_req
;
123 struct fchs_s fc_bls_req
;
124 struct fc_logi_s plogi
;
128 void fcbuild_init(void);
130 u16
fc_flogi_build(struct fchs_s
*fchs
, struct fc_logi_s
*flogi
,
131 u32 s_id
, u16 ox_id
, wwn_t port_name
, wwn_t node_name
,
132 u16 pdu_size
, u8 set_npiv
, u8 set_auth
,
133 u16 local_bb_credits
);
135 u16
fc_fdisc_build(struct fchs_s
*buf
, struct fc_logi_s
*flogi
, u32 s_id
,
136 u16 ox_id
, wwn_t port_name
, wwn_t node_name
,
139 u16
fc_flogi_acc_build(struct fchs_s
*fchs
, struct fc_logi_s
*flogi
,
140 u32 s_id
, __be16 ox_id
,
141 wwn_t port_name
, wwn_t node_name
,
143 u16 local_bb_credits
, u8 bb_scn
);
145 u16
fc_plogi_build(struct fchs_s
*fchs
, void *pld
, u32 d_id
,
146 u32 s_id
, u16 ox_id
, wwn_t port_name
,
147 wwn_t node_name
, u16 pdu_size
, u16 bb_cr
);
149 enum fc_parse_status
fc_plogi_parse(struct fchs_s
*fchs
);
151 u16
fc_abts_build(struct fchs_s
*buf
, u32 d_id
, u32 s_id
,
154 enum fc_parse_status
fc_abts_rsp_parse(struct fchs_s
*buf
, int len
);
156 u16
fc_rrq_build(struct fchs_s
*buf
, struct fc_rrq_s
*rrq
, u32 d_id
,
157 u32 s_id
, u16 ox_id
, u16 rrq_oxid
);
159 u16
fc_rspnid_build(struct fchs_s
*fchs
, void *pld
, u32 s_id
,
160 u16 ox_id
, u8
*name
);
161 u16
fc_rsnn_nn_build(struct fchs_s
*fchs
, void *pld
, u32 s_id
,
162 wwn_t node_name
, u8
*name
);
164 u16
fc_rftid_build(struct fchs_s
*fchs
, void *pld
, u32 s_id
,
165 u16 ox_id
, enum bfa_lport_role role
);
167 u16
fc_rftid_build_sol(struct fchs_s
*fchs
, void *pyld
, u32 s_id
,
168 u16 ox_id
, u8
*fc4_bitmap
,
171 u16
fc_rffid_build(struct fchs_s
*fchs
, void *pyld
, u32 s_id
,
172 u16 ox_id
, u8 fc4_type
, u8 fc4_ftrs
);
174 u16
fc_gidpn_build(struct fchs_s
*fchs
, void *pyld
, u32 s_id
,
175 u16 ox_id
, wwn_t port_name
);
177 u16
fc_gpnid_build(struct fchs_s
*fchs
, void *pld
, u32 s_id
,
178 u16 ox_id
, u32 port_id
);
180 u16
fc_gs_rjt_build(struct fchs_s
*fchs
, struct ct_hdr_s
*cthdr
,
181 u32 d_id
, u32 s_id
, u16 ox_id
,
182 u8 reason_code
, u8 reason_code_expl
);
184 u16
fc_scr_build(struct fchs_s
*fchs
, struct fc_scr_s
*scr
,
185 u8 set_br_reg
, u32 s_id
, u16 ox_id
);
187 u16
fc_plogi_acc_build(struct fchs_s
*fchs
, void *pld
, u32 d_id
,
189 wwn_t port_name
, wwn_t node_name
,
190 u16 pdu_size
, u16 bb_cr
);
192 u16
fc_adisc_build(struct fchs_s
*fchs
, struct fc_adisc_s
*adisc
,
193 u32 d_id
, u32 s_id
, __be16 ox_id
, wwn_t port_name
,
196 enum fc_parse_status
fc_adisc_parse(struct fchs_s
*fchs
, void *pld
,
197 u32 host_dap
, wwn_t node_name
, wwn_t port_name
);
199 enum fc_parse_status
fc_adisc_rsp_parse(struct fc_adisc_s
*adisc
, int len
,
200 wwn_t port_name
, wwn_t node_name
);
202 u16
fc_adisc_acc_build(struct fchs_s
*fchs
, struct fc_adisc_s
*adisc
,
203 u32 d_id
, u32 s_id
, __be16 ox_id
,
204 wwn_t port_name
, wwn_t node_name
);
205 u16
fc_ls_rjt_build(struct fchs_s
*fchs
, struct fc_ls_rjt_s
*ls_rjt
,
206 u32 d_id
, u32 s_id
, __be16 ox_id
,
207 u8 reason_code
, u8 reason_code_expl
);
208 u16
fc_ls_acc_build(struct fchs_s
*fchs
, struct fc_els_cmd_s
*els_cmd
,
209 u32 d_id
, u32 s_id
, __be16 ox_id
);
210 u16
fc_prli_build(struct fchs_s
*fchs
, void *pld
, u32 d_id
,
211 u32 s_id
, u16 ox_id
);
213 enum fc_parse_status
fc_prli_rsp_parse(struct fc_prli_s
*prli
, int len
);
215 u16
fc_prli_acc_build(struct fchs_s
*fchs
, void *pld
, u32 d_id
,
216 u32 s_id
, __be16 ox_id
,
217 enum bfa_lport_role role
);
219 u16
fc_rnid_build(struct fchs_s
*fchs
, struct fc_rnid_cmd_s
*rnid
,
220 u32 d_id
, u32 s_id
, u16 ox_id
,
223 u16
fc_rnid_acc_build(struct fchs_s
*fchs
,
224 struct fc_rnid_acc_s
*rnid_acc
, u32 d_id
, u32 s_id
,
225 __be16 ox_id
, u32 data_format
,
226 struct fc_rnid_common_id_data_s
*common_id_data
,
227 struct fc_rnid_general_topology_data_s
*gen_topo_data
);
229 u16
fc_rpsc2_build(struct fchs_s
*fchs
, struct fc_rpsc2_cmd_s
*rps2c
,
230 u32 d_id
, u32 s_id
, u32
*pid_list
, u16 npids
);
231 u16
fc_rpsc_build(struct fchs_s
*fchs
, struct fc_rpsc_cmd_s
*rpsc
,
232 u32 d_id
, u32 s_id
, u16 ox_id
);
233 u16
fc_rpsc_acc_build(struct fchs_s
*fchs
,
234 struct fc_rpsc_acc_s
*rpsc_acc
, u32 d_id
, u32 s_id
,
235 __be16 ox_id
, struct fc_rpsc_speed_info_s
*oper_speed
);
236 u16
fc_gid_ft_build(struct fchs_s
*fchs
, void *pld
, u32 s_id
,
239 u16
fc_rpnid_build(struct fchs_s
*fchs
, void *pyld
, u32 s_id
,
240 u32 port_id
, wwn_t port_name
);
242 u16
fc_rnnid_build(struct fchs_s
*fchs
, void *pyld
, u32 s_id
,
243 u32 port_id
, wwn_t node_name
);
245 u16
fc_rcsid_build(struct fchs_s
*fchs
, void *pyld
, u32 s_id
,
246 u32 port_id
, u32 cos
);
248 u16
fc_rptid_build(struct fchs_s
*fchs
, void *pyld
, u32 s_id
,
249 u32 port_id
, u8 port_type
);
251 u16
fc_ganxt_build(struct fchs_s
*fchs
, void *pyld
, u32 s_id
,
254 u16
fc_logo_build(struct fchs_s
*fchs
, struct fc_logo_s
*logo
, u32 d_id
,
255 u32 s_id
, u16 ox_id
, wwn_t port_name
);
257 u16
fc_logo_acc_build(struct fchs_s
*fchs
, void *pld
, u32 d_id
,
258 u32 s_id
, __be16 ox_id
);
260 u16
fc_fdmi_reqhdr_build(struct fchs_s
*fchs
, void *pyld
, u32 s_id
,
262 u16
fc_gmal_req_build(struct fchs_s
*fchs
, void *pyld
, u32 s_id
, wwn_t wwn
);
263 u16
fc_gfn_req_build(struct fchs_s
*fchs
, void *pyld
, u32 s_id
, wwn_t wwn
);
265 void fc_get_fc4type_bitmask(u8 fc4_type
, u8
*bit_mask
);
267 void fc_els_req_build(struct fchs_s
*fchs
, u32 d_id
, u32 s_id
,
270 enum fc_parse_status
fc_plogi_rsp_parse(struct fchs_s
*fchs
, int len
,
273 enum fc_parse_status
fc_prli_parse(struct fc_prli_s
*prli
);
275 enum fc_parse_status
fc_pdisc_parse(struct fchs_s
*fchs
, wwn_t node_name
,
278 u16
fc_ba_acc_build(struct fchs_s
*fchs
, struct fc_ba_acc_s
*ba_acc
, u32 d_id
,
279 u32 s_id
, __be16 ox_id
, u16 rx_id
);
281 int fc_logout_params_pages(struct fchs_s
*fc_frame
, u8 els_code
);
283 u16
fc_tprlo_acc_build(struct fchs_s
*fchs
, struct fc_tprlo_acc_s
*tprlo_acc
,
284 u32 d_id
, u32 s_id
, __be16 ox_id
, int num_pages
);
286 u16
fc_prlo_acc_build(struct fchs_s
*fchs
, struct fc_prlo_acc_s
*prlo_acc
,
287 u32 d_id
, u32 s_id
, __be16 ox_id
, int num_pages
);
289 u16
fc_pdisc_build(struct fchs_s
*fchs
, u32 d_id
, u32 s_id
,
290 u16 ox_id
, wwn_t port_name
, wwn_t node_name
,
293 u16
fc_pdisc_rsp_parse(struct fchs_s
*fchs
, int len
, wwn_t port_name
);
295 u16
fc_prlo_build(struct fchs_s
*fchs
, u32 d_id
, u32 s_id
,
296 u16 ox_id
, int num_pages
);
298 u16
fc_tprlo_build(struct fchs_s
*fchs
, u32 d_id
, u32 s_id
,
299 u16 ox_id
, int num_pages
, enum fc_tprlo_type tprlo_type
,
302 u16
fc_ba_rjt_build(struct fchs_s
*fchs
, u32 d_id
, u32 s_id
,
303 __be16 ox_id
, u32 reason_code
, u32 reason_expl
);
305 u16
fc_gnnid_build(struct fchs_s
*fchs
, void *pyld
, u32 s_id
, u16 ox_id
,
308 u16
fc_ct_rsp_parse(struct ct_hdr_s
*cthdr
);
310 u16
fc_rscn_build(struct fchs_s
*fchs
, struct fc_rscn_pl_s
*rscn
, u32 s_id
,