Blame view
drivers/scsi/bfa/bfa_fcbuild.c
37.2 KB
7725ccfda [SCSI] bfa: Broca... |
1 |
/* |
a36c61f90 [SCSI] bfa: clean... |
2 |
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc. |
7725ccfda [SCSI] bfa: Broca... |
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
* All rights reserved * www.brocade.com * * Linux driver for Brocade Fibre Channel Host Bus Adapter. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License (GPL) Version 2 as * published by the Free Software Foundation * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ /* * fcbuild.c - FC link service frame building and parsing routines */ |
f16a17507 [SCSI] bfa: remov... |
20 |
#include "bfad_drv.h" |
a36c61f90 [SCSI] bfa: clean... |
21 |
#include "bfa_fcbuild.h" |
7725ccfda [SCSI] bfa: Broca... |
22 23 24 25 |
/* * static build functions */ |
a36c61f90 [SCSI] bfa: clean... |
26 |
static void fc_els_rsp_build(struct fchs_s *fchs, u32 d_id, u32 s_id, |
50444a340 [SCSI] bfa: fix e... |
27 |
__be16 ox_id); |
a36c61f90 [SCSI] bfa: clean... |
28 |
static void fc_bls_rsp_build(struct fchs_s *fchs, u32 d_id, u32 s_id, |
50444a340 [SCSI] bfa: fix e... |
29 |
__be16 ox_id); |
a36c61f90 [SCSI] bfa: clean... |
30 31 32 33 |
static struct fchs_s fc_els_req_tmpl; static struct fchs_s fc_els_rsp_tmpl; static struct fchs_s fc_bls_req_tmpl; static struct fchs_s fc_bls_rsp_tmpl; |
7725ccfda [SCSI] bfa: Broca... |
34 35 36 37 |
static struct fc_ba_acc_s ba_acc_tmpl; static struct fc_logi_s plogi_tmpl; static struct fc_prli_s prli_tmpl; static struct fc_rrq_s rrq_tmpl; |
a36c61f90 [SCSI] bfa: clean... |
38 |
static struct fchs_s fcp_fchs_tmpl; |
7725ccfda [SCSI] bfa: Broca... |
39 40 41 42 43 44 45 46 47 48 49 |
void fcbuild_init(void) { /* * fc_els_req_tmpl */ fc_els_req_tmpl.routing = FC_RTG_EXT_LINK; fc_els_req_tmpl.cat_info = FC_CAT_LD_REQUEST; fc_els_req_tmpl.type = FC_TYPE_ELS; fc_els_req_tmpl.f_ctl = |
f16a17507 [SCSI] bfa: remov... |
50 |
bfa_hton3b(FCTL_SEQ_INI | FCTL_FS_EXCH | FCTL_END_SEQ | |
7725ccfda [SCSI] bfa: Broca... |
51 52 53 54 55 56 57 58 59 60 |
FCTL_SI_XFER); fc_els_req_tmpl.rx_id = FC_RXID_ANY; /* * fc_els_rsp_tmpl */ fc_els_rsp_tmpl.routing = FC_RTG_EXT_LINK; fc_els_rsp_tmpl.cat_info = FC_CAT_LD_REPLY; fc_els_rsp_tmpl.type = FC_TYPE_ELS; fc_els_rsp_tmpl.f_ctl = |
f16a17507 [SCSI] bfa: remov... |
61 |
bfa_hton3b(FCTL_EC_RESP | FCTL_SEQ_INI | FCTL_LS_EXCH | |
7725ccfda [SCSI] bfa: Broca... |
62 63 64 65 66 67 68 69 |
FCTL_END_SEQ | FCTL_SI_XFER); fc_els_rsp_tmpl.rx_id = FC_RXID_ANY; /* * fc_bls_req_tmpl */ fc_bls_req_tmpl.routing = FC_RTG_BASIC_LINK; fc_bls_req_tmpl.type = FC_TYPE_BLS; |
f16a17507 [SCSI] bfa: remov... |
70 |
fc_bls_req_tmpl.f_ctl = bfa_hton3b(FCTL_END_SEQ | FCTL_SI_XFER); |
7725ccfda [SCSI] bfa: Broca... |
71 72 73 74 75 76 77 78 79 |
fc_bls_req_tmpl.rx_id = FC_RXID_ANY; /* * fc_bls_rsp_tmpl */ fc_bls_rsp_tmpl.routing = FC_RTG_BASIC_LINK; fc_bls_rsp_tmpl.cat_info = FC_CAT_BA_ACC; fc_bls_rsp_tmpl.type = FC_TYPE_BLS; fc_bls_rsp_tmpl.f_ctl = |
f16a17507 [SCSI] bfa: remov... |
80 |
bfa_hton3b(FCTL_EC_RESP | FCTL_SEQ_INI | FCTL_LS_EXCH | |
7725ccfda [SCSI] bfa: Broca... |
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
FCTL_END_SEQ | FCTL_SI_XFER); fc_bls_rsp_tmpl.rx_id = FC_RXID_ANY; /* * ba_acc_tmpl */ ba_acc_tmpl.seq_id_valid = 0; ba_acc_tmpl.low_seq_cnt = 0; ba_acc_tmpl.high_seq_cnt = 0xFFFF; /* * plogi_tmpl */ plogi_tmpl.csp.verhi = FC_PH_VER_PH_3; plogi_tmpl.csp.verlo = FC_PH_VER_4_3; |
7725ccfda [SCSI] bfa: Broca... |
96 97 98 |
plogi_tmpl.csp.ciro = 0x1; plogi_tmpl.csp.cisc = 0x0; plogi_tmpl.csp.altbbcred = 0x0; |
ba816ea8e [SCSI] bfa: repla... |
99 100 101 |
plogi_tmpl.csp.conseq = cpu_to_be16(0x00FF); plogi_tmpl.csp.ro_bitmap = cpu_to_be16(0x0002); plogi_tmpl.csp.e_d_tov = cpu_to_be32(2000); |
7725ccfda [SCSI] bfa: Broca... |
102 103 104 105 106 107 108 109 110 111 112 |
plogi_tmpl.class3.class_valid = 1; plogi_tmpl.class3.sequential = 1; plogi_tmpl.class3.conseq = 0xFF; plogi_tmpl.class3.ospx = 1; /* * prli_tmpl */ prli_tmpl.command = FC_ELS_PRLI; prli_tmpl.pglen = 0x10; |
ba816ea8e [SCSI] bfa: repla... |
113 |
prli_tmpl.pagebytes = cpu_to_be16(0x0014); |
7725ccfda [SCSI] bfa: Broca... |
114 115 116 117 118 119 120 121 122 123 |
prli_tmpl.parampage.type = FC_TYPE_FCP; prli_tmpl.parampage.imagepair = 1; prli_tmpl.parampage.servparams.rxrdisab = 1; /* * rrq_tmpl */ rrq_tmpl.els_cmd.els_code = FC_ELS_RRQ; /* |
a36c61f90 [SCSI] bfa: clean... |
124 |
* fcp_struct fchs_s mpl |
7725ccfda [SCSI] bfa: Broca... |
125 126 127 128 129 |
*/ fcp_fchs_tmpl.routing = FC_RTG_FC4_DEV_DATA; fcp_fchs_tmpl.cat_info = FC_CAT_UNSOLICIT_CMD; fcp_fchs_tmpl.type = FC_TYPE_FCP; fcp_fchs_tmpl.f_ctl = |
f16a17507 [SCSI] bfa: remov... |
130 |
bfa_hton3b(FCTL_FS_EXCH | FCTL_END_SEQ | FCTL_SI_XFER); |
7725ccfda [SCSI] bfa: Broca... |
131 132 133 134 135 |
fcp_fchs_tmpl.seq_id = 1; fcp_fchs_tmpl.rx_id = FC_RXID_ANY; } static void |
a36c61f90 [SCSI] bfa: clean... |
136 |
fc_gs_fchdr_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u32 ox_id) |
7725ccfda [SCSI] bfa: Broca... |
137 |
{ |
6a18b1675 [SCSI] bfa: remov... |
138 |
memset(fchs, 0, sizeof(struct fchs_s)); |
7725ccfda [SCSI] bfa: Broca... |
139 140 141 142 143 |
fchs->routing = FC_RTG_FC4_DEV_DATA; fchs->cat_info = FC_CAT_UNSOLICIT_CTRL; fchs->type = FC_TYPE_SERVICES; fchs->f_ctl = |
f16a17507 [SCSI] bfa: remov... |
144 |
bfa_hton3b(FCTL_SEQ_INI | FCTL_FS_EXCH | FCTL_END_SEQ | |
7725ccfda [SCSI] bfa: Broca... |
145 146 147 148 |
FCTL_SI_XFER); fchs->rx_id = FC_RXID_ANY; fchs->d_id = (d_id); fchs->s_id = (s_id); |
ba816ea8e [SCSI] bfa: repla... |
149 |
fchs->ox_id = cpu_to_be16(ox_id); |
7725ccfda [SCSI] bfa: Broca... |
150 |
|
5fbe25c7a [SCSI] bfa: fix c... |
151 |
/* |
7725ccfda [SCSI] bfa: Broca... |
152 153 154 155 |
* @todo no need to set ox_id for request * no need to set rx_id for response */ } |
d7be54cc5 [SCSI] bfa: FCS b... |
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
static void fc_gsresp_fchdr_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u16 ox_id) { memset(fchs, 0, sizeof(struct fchs_s)); fchs->routing = FC_RTG_FC4_DEV_DATA; fchs->cat_info = FC_CAT_SOLICIT_CTRL; fchs->type = FC_TYPE_SERVICES; fchs->f_ctl = bfa_hton3b(FCTL_EC_RESP | FCTL_SEQ_INI | FCTL_LS_EXCH | FCTL_END_SEQ | FCTL_SI_XFER); fchs->d_id = d_id; fchs->s_id = s_id; fchs->ox_id = ox_id; } |
7725ccfda [SCSI] bfa: Broca... |
171 |
void |
50444a340 [SCSI] bfa: fix e... |
172 |
fc_els_req_build(struct fchs_s *fchs, u32 d_id, u32 s_id, __be16 ox_id) |
7725ccfda [SCSI] bfa: Broca... |
173 |
{ |
6a18b1675 [SCSI] bfa: remov... |
174 |
memcpy(fchs, &fc_els_req_tmpl, sizeof(struct fchs_s)); |
7725ccfda [SCSI] bfa: Broca... |
175 176 |
fchs->d_id = (d_id); fchs->s_id = (s_id); |
ba816ea8e [SCSI] bfa: repla... |
177 |
fchs->ox_id = cpu_to_be16(ox_id); |
7725ccfda [SCSI] bfa: Broca... |
178 179 180 |
} static void |
50444a340 [SCSI] bfa: fix e... |
181 |
fc_els_rsp_build(struct fchs_s *fchs, u32 d_id, u32 s_id, __be16 ox_id) |
7725ccfda [SCSI] bfa: Broca... |
182 |
{ |
6a18b1675 [SCSI] bfa: remov... |
183 |
memcpy(fchs, &fc_els_rsp_tmpl, sizeof(struct fchs_s)); |
7725ccfda [SCSI] bfa: Broca... |
184 185 186 187 188 189 190 191 |
fchs->d_id = d_id; fchs->s_id = s_id; fchs->ox_id = ox_id; } enum fc_parse_status fc_els_rsp_parse(struct fchs_s *fchs, int len) { |
a36c61f90 [SCSI] bfa: clean... |
192 193 |
struct fc_els_cmd_s *els_cmd = (struct fc_els_cmd_s *) (fchs + 1); struct fc_ls_rjt_s *ls_rjt = (struct fc_ls_rjt_s *) els_cmd; |
7725ccfda [SCSI] bfa: Broca... |
194 195 196 197 198 199 |
len = len; switch (els_cmd->els_code) { case FC_ELS_LS_RJT: if (ls_rjt->reason_code == FC_LS_RJT_RSN_LOGICAL_BUSY) |
f8ceafde6 [SCSI] bfa: fixed... |
200 |
return FC_PARSE_BUSY; |
7725ccfda [SCSI] bfa: Broca... |
201 |
else |
f8ceafde6 [SCSI] bfa: fixed... |
202 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
203 204 |
case FC_ELS_ACC: |
f8ceafde6 [SCSI] bfa: fixed... |
205 |
return FC_PARSE_OK; |
7725ccfda [SCSI] bfa: Broca... |
206 |
} |
f8ceafde6 [SCSI] bfa: fixed... |
207 |
return FC_PARSE_OK; |
7725ccfda [SCSI] bfa: Broca... |
208 209 210 |
} static void |
50444a340 [SCSI] bfa: fix e... |
211 |
fc_bls_rsp_build(struct fchs_s *fchs, u32 d_id, u32 s_id, __be16 ox_id) |
7725ccfda [SCSI] bfa: Broca... |
212 |
{ |
6a18b1675 [SCSI] bfa: remov... |
213 |
memcpy(fchs, &fc_bls_rsp_tmpl, sizeof(struct fchs_s)); |
7725ccfda [SCSI] bfa: Broca... |
214 215 216 217 218 219 220 |
fchs->d_id = d_id; fchs->s_id = s_id; fchs->ox_id = ox_id; } static u16 fc_plogi_x_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id, |
50444a340 [SCSI] bfa: fix e... |
221 |
__be16 ox_id, wwn_t port_name, wwn_t node_name, |
be540a991 [SCSI] bfa: FC cr... |
222 |
u16 pdu_size, u16 bb_cr, u8 els_code) |
7725ccfda [SCSI] bfa: Broca... |
223 |
{ |
a36c61f90 [SCSI] bfa: clean... |
224 |
struct fc_logi_s *plogi = (struct fc_logi_s *) (pld); |
7725ccfda [SCSI] bfa: Broca... |
225 |
|
6a18b1675 [SCSI] bfa: remov... |
226 |
memcpy(plogi, &plogi_tmpl, sizeof(struct fc_logi_s)); |
7725ccfda [SCSI] bfa: Broca... |
227 228 229 230 231 232 |
plogi->els_cmd.els_code = els_code; if (els_code == FC_ELS_PLOGI) fc_els_req_build(fchs, d_id, s_id, ox_id); else fc_els_rsp_build(fchs, d_id, s_id, ox_id); |
ba816ea8e [SCSI] bfa: repla... |
233 |
plogi->csp.rxsz = plogi->class3.rxsz = cpu_to_be16(pdu_size); |
be540a991 [SCSI] bfa: FC cr... |
234 |
plogi->csp.bbcred = cpu_to_be16(bb_cr); |
7725ccfda [SCSI] bfa: Broca... |
235 |
|
6a18b1675 [SCSI] bfa: remov... |
236 237 |
memcpy(&plogi->port_name, &port_name, sizeof(wwn_t)); memcpy(&plogi->node_name, &node_name, sizeof(wwn_t)); |
7725ccfda [SCSI] bfa: Broca... |
238 |
|
f8ceafde6 [SCSI] bfa: fixed... |
239 |
return sizeof(struct fc_logi_s); |
7725ccfda [SCSI] bfa: Broca... |
240 241 242 243 |
} u16 fc_flogi_build(struct fchs_s *fchs, struct fc_logi_s *flogi, u32 s_id, |
a36c61f90 [SCSI] bfa: clean... |
244 245 |
u16 ox_id, wwn_t port_name, wwn_t node_name, u16 pdu_size, u8 set_npiv, u8 set_auth, u16 local_bb_credits) |
7725ccfda [SCSI] bfa: Broca... |
246 |
{ |
f16a17507 [SCSI] bfa: remov... |
247 |
u32 d_id = bfa_hton3b(FC_FABRIC_PORT); |
50444a340 [SCSI] bfa: fix e... |
248 |
__be32 *vvl_info; |
7725ccfda [SCSI] bfa: Broca... |
249 |
|
6a18b1675 [SCSI] bfa: remov... |
250 |
memcpy(flogi, &plogi_tmpl, sizeof(struct fc_logi_s)); |
7725ccfda [SCSI] bfa: Broca... |
251 252 253 |
flogi->els_cmd.els_code = FC_ELS_FLOGI; fc_els_req_build(fchs, d_id, s_id, ox_id); |
ba816ea8e [SCSI] bfa: repla... |
254 |
flogi->csp.rxsz = flogi->class3.rxsz = cpu_to_be16(pdu_size); |
7725ccfda [SCSI] bfa: Broca... |
255 256 257 258 259 260 261 262 263 264 265 |
flogi->port_name = port_name; flogi->node_name = node_name; /* * Set the NPIV Capability Bit ( word 1, bit 31) of Common * Service Parameters. */ flogi->csp.ciro = set_npiv; /* set AUTH capability */ flogi->csp.security = set_auth; |
ba816ea8e [SCSI] bfa: repla... |
266 |
flogi->csp.bbcred = cpu_to_be16(local_bb_credits); |
7725ccfda [SCSI] bfa: Broca... |
267 268 269 270 271 272 |
/* Set brcd token in VVL */ vvl_info = (u32 *)&flogi->vvl[0]; /* set the flag to indicate the presence of VVL */ flogi->csp.npiv_supp = 1; /* @todo. field name is not correct */ |
ba816ea8e [SCSI] bfa: repla... |
273 |
vvl_info[0] = cpu_to_be32(FLOGI_VVL_BRCD); |
7725ccfda [SCSI] bfa: Broca... |
274 |
|
f8ceafde6 [SCSI] bfa: fixed... |
275 |
return sizeof(struct fc_logi_s); |
7725ccfda [SCSI] bfa: Broca... |
276 277 278 279 |
} u16 fc_flogi_acc_build(struct fchs_s *fchs, struct fc_logi_s *flogi, u32 s_id, |
50444a340 [SCSI] bfa: fix e... |
280 |
__be16 ox_id, wwn_t port_name, wwn_t node_name, |
be540a991 [SCSI] bfa: FC cr... |
281 |
u16 pdu_size, u16 local_bb_credits, u8 bb_scn) |
7725ccfda [SCSI] bfa: Broca... |
282 283 |
{ u32 d_id = 0; |
be540a991 [SCSI] bfa: FC cr... |
284 |
u16 bbscn_rxsz = (bb_scn << 12) | pdu_size; |
7725ccfda [SCSI] bfa: Broca... |
285 |
|
6a18b1675 [SCSI] bfa: remov... |
286 |
memcpy(flogi, &plogi_tmpl, sizeof(struct fc_logi_s)); |
7725ccfda [SCSI] bfa: Broca... |
287 288 289 |
fc_els_rsp_build(fchs, d_id, s_id, ox_id); flogi->els_cmd.els_code = FC_ELS_ACC; |
be540a991 [SCSI] bfa: FC cr... |
290 291 |
flogi->class3.rxsz = cpu_to_be16(pdu_size); flogi->csp.rxsz = cpu_to_be16(bbscn_rxsz); /* bb_scn/rxsz */ |
7725ccfda [SCSI] bfa: Broca... |
292 293 |
flogi->port_name = port_name; flogi->node_name = node_name; |
ba816ea8e [SCSI] bfa: repla... |
294 |
flogi->csp.bbcred = cpu_to_be16(local_bb_credits); |
7725ccfda [SCSI] bfa: Broca... |
295 |
|
f8ceafde6 [SCSI] bfa: fixed... |
296 |
return sizeof(struct fc_logi_s); |
7725ccfda [SCSI] bfa: Broca... |
297 298 299 300 |
} u16 fc_fdisc_build(struct fchs_s *fchs, struct fc_logi_s *flogi, u32 s_id, |
a36c61f90 [SCSI] bfa: clean... |
301 |
u16 ox_id, wwn_t port_name, wwn_t node_name, u16 pdu_size) |
7725ccfda [SCSI] bfa: Broca... |
302 |
{ |
f16a17507 [SCSI] bfa: remov... |
303 |
u32 d_id = bfa_hton3b(FC_FABRIC_PORT); |
7725ccfda [SCSI] bfa: Broca... |
304 |
|
6a18b1675 [SCSI] bfa: remov... |
305 |
memcpy(flogi, &plogi_tmpl, sizeof(struct fc_logi_s)); |
7725ccfda [SCSI] bfa: Broca... |
306 307 308 |
flogi->els_cmd.els_code = FC_ELS_FDISC; fc_els_req_build(fchs, d_id, s_id, ox_id); |
ba816ea8e [SCSI] bfa: repla... |
309 |
flogi->csp.rxsz = flogi->class3.rxsz = cpu_to_be16(pdu_size); |
7725ccfda [SCSI] bfa: Broca... |
310 311 |
flogi->port_name = port_name; flogi->node_name = node_name; |
f8ceafde6 [SCSI] bfa: fixed... |
312 |
return sizeof(struct fc_logi_s); |
7725ccfda [SCSI] bfa: Broca... |
313 314 315 316 317 |
} u16 fc_plogi_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id, u16 ox_id, wwn_t port_name, wwn_t node_name, |
be540a991 [SCSI] bfa: FC cr... |
318 |
u16 pdu_size, u16 bb_cr) |
7725ccfda [SCSI] bfa: Broca... |
319 320 |
{ return fc_plogi_x_build(fchs, pld, d_id, s_id, ox_id, port_name, |
be540a991 [SCSI] bfa: FC cr... |
321 |
node_name, pdu_size, bb_cr, FC_ELS_PLOGI); |
7725ccfda [SCSI] bfa: Broca... |
322 323 324 325 326 |
} u16 fc_plogi_acc_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id, u16 ox_id, wwn_t port_name, wwn_t node_name, |
be540a991 [SCSI] bfa: FC cr... |
327 |
u16 pdu_size, u16 bb_cr) |
7725ccfda [SCSI] bfa: Broca... |
328 329 |
{ return fc_plogi_x_build(fchs, pld, d_id, s_id, ox_id, port_name, |
be540a991 [SCSI] bfa: FC cr... |
330 |
node_name, pdu_size, bb_cr, FC_ELS_ACC); |
7725ccfda [SCSI] bfa: Broca... |
331 332 333 334 335 |
} enum fc_parse_status fc_plogi_rsp_parse(struct fchs_s *fchs, int len, wwn_t port_name) { |
a36c61f90 [SCSI] bfa: clean... |
336 337 338 |
struct fc_els_cmd_s *els_cmd = (struct fc_els_cmd_s *) (fchs + 1); struct fc_logi_s *plogi; struct fc_ls_rjt_s *ls_rjt; |
7725ccfda [SCSI] bfa: Broca... |
339 340 341 342 343 |
switch (els_cmd->els_code) { case FC_ELS_LS_RJT: ls_rjt = (struct fc_ls_rjt_s *) (fchs + 1); if (ls_rjt->reason_code == FC_LS_RJT_RSN_LOGICAL_BUSY) |
f8ceafde6 [SCSI] bfa: fixed... |
344 |
return FC_PARSE_BUSY; |
7725ccfda [SCSI] bfa: Broca... |
345 |
else |
f8ceafde6 [SCSI] bfa: fixed... |
346 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
347 348 349 |
case FC_ELS_ACC: plogi = (struct fc_logi_s *) (fchs + 1); if (len < sizeof(struct fc_logi_s)) |
f8ceafde6 [SCSI] bfa: fixed... |
350 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
351 352 |
if (!wwn_is_equal(plogi->port_name, port_name)) |
f8ceafde6 [SCSI] bfa: fixed... |
353 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
354 355 |
if (!plogi->class3.class_valid) |
f8ceafde6 [SCSI] bfa: fixed... |
356 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
357 |
|
ba816ea8e [SCSI] bfa: repla... |
358 |
if (be16_to_cpu(plogi->class3.rxsz) < (FC_MIN_PDUSZ)) |
f8ceafde6 [SCSI] bfa: fixed... |
359 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
360 |
|
f8ceafde6 [SCSI] bfa: fixed... |
361 |
return FC_PARSE_OK; |
7725ccfda [SCSI] bfa: Broca... |
362 |
default: |
f8ceafde6 [SCSI] bfa: fixed... |
363 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
364 365 366 367 368 369 |
} } enum fc_parse_status fc_plogi_parse(struct fchs_s *fchs) { |
a36c61f90 [SCSI] bfa: clean... |
370 |
struct fc_logi_s *plogi = (struct fc_logi_s *) (fchs + 1); |
7725ccfda [SCSI] bfa: Broca... |
371 372 373 |
if (plogi->class3.class_valid != 1) return FC_PARSE_FAILURE; |
ba816ea8e [SCSI] bfa: repla... |
374 375 |
if ((be16_to_cpu(plogi->class3.rxsz) < FC_MIN_PDUSZ) || (be16_to_cpu(plogi->class3.rxsz) > FC_MAX_PDUSZ) |
7725ccfda [SCSI] bfa: Broca... |
376 |
|| (plogi->class3.rxsz == 0)) |
f8ceafde6 [SCSI] bfa: fixed... |
377 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
378 379 380 381 382 383 384 385 |
return FC_PARSE_OK; } u16 fc_prli_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id, u16 ox_id) { |
a36c61f90 [SCSI] bfa: clean... |
386 |
struct fc_prli_s *prli = (struct fc_prli_s *) (pld); |
7725ccfda [SCSI] bfa: Broca... |
387 388 |
fc_els_req_build(fchs, d_id, s_id, ox_id); |
6a18b1675 [SCSI] bfa: remov... |
389 |
memcpy(prli, &prli_tmpl, sizeof(struct fc_prli_s)); |
7725ccfda [SCSI] bfa: Broca... |
390 391 392 393 394 395 396 |
prli->command = FC_ELS_PRLI; prli->parampage.servparams.initiator = 1; prli->parampage.servparams.retry = 1; prli->parampage.servparams.rec_support = 1; prli->parampage.servparams.task_retry_id = 0; prli->parampage.servparams.confirm = 1; |
f8ceafde6 [SCSI] bfa: fixed... |
397 |
return sizeof(struct fc_prli_s); |
7725ccfda [SCSI] bfa: Broca... |
398 399 400 401 |
} u16 fc_prli_acc_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id, |
50444a340 [SCSI] bfa: fix e... |
402 |
__be16 ox_id, enum bfa_lport_role role) |
7725ccfda [SCSI] bfa: Broca... |
403 |
{ |
a36c61f90 [SCSI] bfa: clean... |
404 |
struct fc_prli_s *prli = (struct fc_prli_s *) (pld); |
7725ccfda [SCSI] bfa: Broca... |
405 406 |
fc_els_rsp_build(fchs, d_id, s_id, ox_id); |
6a18b1675 [SCSI] bfa: remov... |
407 |
memcpy(prli, &prli_tmpl, sizeof(struct fc_prli_s)); |
7725ccfda [SCSI] bfa: Broca... |
408 409 |
prli->command = FC_ELS_ACC; |
a36c61f90 [SCSI] bfa: clean... |
410 |
prli->parampage.servparams.initiator = 1; |
7725ccfda [SCSI] bfa: Broca... |
411 412 |
prli->parampage.rspcode = FC_PRLI_ACC_XQTD; |
f8ceafde6 [SCSI] bfa: fixed... |
413 |
return sizeof(struct fc_prli_s); |
7725ccfda [SCSI] bfa: Broca... |
414 415 416 417 418 419 |
} enum fc_parse_status fc_prli_rsp_parse(struct fc_prli_s *prli, int len) { if (len < sizeof(struct fc_prli_s)) |
f8ceafde6 [SCSI] bfa: fixed... |
420 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
421 422 |
if (prli->command != FC_ELS_ACC) |
f8ceafde6 [SCSI] bfa: fixed... |
423 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
424 425 426 |
if ((prli->parampage.rspcode != FC_PRLI_ACC_XQTD) && (prli->parampage.rspcode != FC_PRLI_ACC_PREDEF_IMG)) |
f8ceafde6 [SCSI] bfa: fixed... |
427 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
428 429 |
if (prli->parampage.servparams.target != 1) |
f8ceafde6 [SCSI] bfa: fixed... |
430 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
431 |
|
f8ceafde6 [SCSI] bfa: fixed... |
432 |
return FC_PARSE_OK; |
7725ccfda [SCSI] bfa: Broca... |
433 434 435 436 437 438 |
} enum fc_parse_status fc_prli_parse(struct fc_prli_s *prli) { if (prli->parampage.type != FC_TYPE_FCP) |
f8ceafde6 [SCSI] bfa: fixed... |
439 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
440 441 |
if (!prli->parampage.imagepair) |
f8ceafde6 [SCSI] bfa: fixed... |
442 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
443 444 |
if (!prli->parampage.servparams.initiator) |
f8ceafde6 [SCSI] bfa: fixed... |
445 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
446 |
|
f8ceafde6 [SCSI] bfa: fixed... |
447 |
return FC_PARSE_OK; |
7725ccfda [SCSI] bfa: Broca... |
448 449 450 |
} u16 |
a36c61f90 [SCSI] bfa: clean... |
451 452 |
fc_logo_build(struct fchs_s *fchs, struct fc_logo_s *logo, u32 d_id, u32 s_id, u16 ox_id, wwn_t port_name) |
7725ccfda [SCSI] bfa: Broca... |
453 454 |
{ fc_els_req_build(fchs, d_id, s_id, ox_id); |
6a18b1675 [SCSI] bfa: remov... |
455 |
memset(logo, '\0', sizeof(struct fc_logo_s)); |
7725ccfda [SCSI] bfa: Broca... |
456 457 458 |
logo->els_cmd.els_code = FC_ELS_LOGO; logo->nport_id = (s_id); logo->orig_port_name = port_name; |
f8ceafde6 [SCSI] bfa: fixed... |
459 |
return sizeof(struct fc_logo_s); |
7725ccfda [SCSI] bfa: Broca... |
460 |
} |
da99dcc98 [SCSI] bfa: remov... |
461 |
static u16 |
7725ccfda [SCSI] bfa: Broca... |
462 |
fc_adisc_x_build(struct fchs_s *fchs, struct fc_adisc_s *adisc, u32 d_id, |
50444a340 [SCSI] bfa: fix e... |
463 |
u32 s_id, __be16 ox_id, wwn_t port_name, |
7725ccfda [SCSI] bfa: Broca... |
464 465 |
wwn_t node_name, u8 els_code) { |
6a18b1675 [SCSI] bfa: remov... |
466 |
memset(adisc, '\0', sizeof(struct fc_adisc_s)); |
7725ccfda [SCSI] bfa: Broca... |
467 468 469 470 471 472 473 474 475 476 477 478 |
adisc->els_cmd.els_code = els_code; if (els_code == FC_ELS_ADISC) fc_els_req_build(fchs, d_id, s_id, ox_id); else fc_els_rsp_build(fchs, d_id, s_id, ox_id); adisc->orig_HA = 0; adisc->orig_port_name = port_name; adisc->orig_node_name = node_name; adisc->nport_id = (s_id); |
f8ceafde6 [SCSI] bfa: fixed... |
479 |
return sizeof(struct fc_adisc_s); |
7725ccfda [SCSI] bfa: Broca... |
480 481 482 483 |
} u16 fc_adisc_build(struct fchs_s *fchs, struct fc_adisc_s *adisc, u32 d_id, |
50444a340 [SCSI] bfa: fix e... |
484 |
u32 s_id, __be16 ox_id, wwn_t port_name, wwn_t node_name) |
7725ccfda [SCSI] bfa: Broca... |
485 486 487 488 489 490 491 |
{ return fc_adisc_x_build(fchs, adisc, d_id, s_id, ox_id, port_name, node_name, FC_ELS_ADISC); } u16 fc_adisc_acc_build(struct fchs_s *fchs, struct fc_adisc_s *adisc, u32 d_id, |
50444a340 [SCSI] bfa: fix e... |
492 |
u32 s_id, __be16 ox_id, wwn_t port_name, |
7725ccfda [SCSI] bfa: Broca... |
493 494 495 496 497 498 499 500 501 502 503 504 |
wwn_t node_name) { return fc_adisc_x_build(fchs, adisc, d_id, s_id, ox_id, port_name, node_name, FC_ELS_ACC); } enum fc_parse_status fc_adisc_rsp_parse(struct fc_adisc_s *adisc, int len, wwn_t port_name, wwn_t node_name) { if (len < sizeof(struct fc_adisc_s)) |
f8ceafde6 [SCSI] bfa: fixed... |
505 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
506 507 |
if (adisc->els_cmd.els_code != FC_ELS_ACC) |
f8ceafde6 [SCSI] bfa: fixed... |
508 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
509 510 |
if (!wwn_is_equal(adisc->orig_port_name, port_name)) |
f8ceafde6 [SCSI] bfa: fixed... |
511 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
512 |
|
f8ceafde6 [SCSI] bfa: fixed... |
513 |
return FC_PARSE_OK; |
7725ccfda [SCSI] bfa: Broca... |
514 515 516 |
} enum fc_parse_status |
a36c61f90 [SCSI] bfa: clean... |
517 518 |
fc_adisc_parse(struct fchs_s *fchs, void *pld, u32 host_dap, wwn_t node_name, wwn_t port_name) |
7725ccfda [SCSI] bfa: Broca... |
519 |
{ |
a36c61f90 [SCSI] bfa: clean... |
520 |
struct fc_adisc_s *adisc = (struct fc_adisc_s *) pld; |
7725ccfda [SCSI] bfa: Broca... |
521 522 |
if (adisc->els_cmd.els_code != FC_ELS_ACC) |
f8ceafde6 [SCSI] bfa: fixed... |
523 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
524 525 526 527 |
if ((adisc->nport_id == (host_dap)) && wwn_is_equal(adisc->orig_port_name, port_name) && wwn_is_equal(adisc->orig_node_name, node_name)) |
f8ceafde6 [SCSI] bfa: fixed... |
528 |
return FC_PARSE_OK; |
7725ccfda [SCSI] bfa: Broca... |
529 |
|
f8ceafde6 [SCSI] bfa: fixed... |
530 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
531 532 533 534 535 |
} enum fc_parse_status fc_pdisc_parse(struct fchs_s *fchs, wwn_t node_name, wwn_t port_name) { |
a36c61f90 [SCSI] bfa: clean... |
536 |
struct fc_logi_s *pdisc = (struct fc_logi_s *) (fchs + 1); |
7725ccfda [SCSI] bfa: Broca... |
537 538 539 |
if (pdisc->class3.class_valid != 1) return FC_PARSE_FAILURE; |
ba816ea8e [SCSI] bfa: repla... |
540 |
if ((be16_to_cpu(pdisc->class3.rxsz) < |
a36c61f90 [SCSI] bfa: clean... |
541 |
(FC_MIN_PDUSZ - sizeof(struct fchs_s))) |
7725ccfda [SCSI] bfa: Broca... |
542 |
|| (pdisc->class3.rxsz == 0)) |
f8ceafde6 [SCSI] bfa: fixed... |
543 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
544 545 |
if (!wwn_is_equal(pdisc->port_name, port_name)) |
f8ceafde6 [SCSI] bfa: fixed... |
546 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
547 548 |
if (!wwn_is_equal(pdisc->node_name, node_name)) |
f8ceafde6 [SCSI] bfa: fixed... |
549 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
550 551 552 553 554 555 556 |
return FC_PARSE_OK; } u16 fc_abts_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u16 ox_id) { |
6a18b1675 [SCSI] bfa: remov... |
557 |
memcpy(fchs, &fc_bls_req_tmpl, sizeof(struct fchs_s)); |
7725ccfda [SCSI] bfa: Broca... |
558 559 560 |
fchs->cat_info = FC_CAT_ABTS; fchs->d_id = (d_id); fchs->s_id = (s_id); |
ba816ea8e [SCSI] bfa: repla... |
561 |
fchs->ox_id = cpu_to_be16(ox_id); |
7725ccfda [SCSI] bfa: Broca... |
562 |
|
f8ceafde6 [SCSI] bfa: fixed... |
563 |
return sizeof(struct fchs_s); |
7725ccfda [SCSI] bfa: Broca... |
564 565 566 567 568 569 570 |
} enum fc_parse_status fc_abts_rsp_parse(struct fchs_s *fchs, int len) { if ((fchs->cat_info == FC_CAT_BA_ACC) || (fchs->cat_info == FC_CAT_BA_RJT)) |
f8ceafde6 [SCSI] bfa: fixed... |
571 |
return FC_PARSE_OK; |
7725ccfda [SCSI] bfa: Broca... |
572 |
|
f8ceafde6 [SCSI] bfa: fixed... |
573 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
574 575 576 |
} u16 |
a36c61f90 [SCSI] bfa: clean... |
577 578 |
fc_rrq_build(struct fchs_s *fchs, struct fc_rrq_s *rrq, u32 d_id, u32 s_id, u16 ox_id, u16 rrq_oxid) |
7725ccfda [SCSI] bfa: Broca... |
579 580 581 582 583 584 |
{ fc_els_req_build(fchs, d_id, s_id, ox_id); /* * build rrq payload */ |
6a18b1675 [SCSI] bfa: remov... |
585 |
memcpy(rrq, &rrq_tmpl, sizeof(struct fc_rrq_s)); |
7725ccfda [SCSI] bfa: Broca... |
586 |
rrq->s_id = (s_id); |
ba816ea8e [SCSI] bfa: repla... |
587 |
rrq->ox_id = cpu_to_be16(rrq_oxid); |
7725ccfda [SCSI] bfa: Broca... |
588 |
rrq->rx_id = FC_RXID_ANY; |
f8ceafde6 [SCSI] bfa: fixed... |
589 |
return sizeof(struct fc_rrq_s); |
7725ccfda [SCSI] bfa: Broca... |
590 591 592 593 |
} u16 fc_logo_acc_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id, |
50444a340 [SCSI] bfa: fix e... |
594 |
__be16 ox_id) |
7725ccfda [SCSI] bfa: Broca... |
595 |
{ |
a36c61f90 [SCSI] bfa: clean... |
596 |
struct fc_els_cmd_s *acc = pld; |
7725ccfda [SCSI] bfa: Broca... |
597 598 |
fc_els_rsp_build(fchs, d_id, s_id, ox_id); |
6a18b1675 [SCSI] bfa: remov... |
599 |
memset(acc, 0, sizeof(struct fc_els_cmd_s)); |
7725ccfda [SCSI] bfa: Broca... |
600 |
acc->els_code = FC_ELS_ACC; |
f8ceafde6 [SCSI] bfa: fixed... |
601 |
return sizeof(struct fc_els_cmd_s); |
7725ccfda [SCSI] bfa: Broca... |
602 603 604 605 |
} u16 fc_ls_rjt_build(struct fchs_s *fchs, struct fc_ls_rjt_s *ls_rjt, u32 d_id, |
50444a340 [SCSI] bfa: fix e... |
606 |
u32 s_id, __be16 ox_id, u8 reason_code, |
7725ccfda [SCSI] bfa: Broca... |
607 608 609 |
u8 reason_code_expl) { fc_els_rsp_build(fchs, d_id, s_id, ox_id); |
6a18b1675 [SCSI] bfa: remov... |
610 |
memset(ls_rjt, 0, sizeof(struct fc_ls_rjt_s)); |
7725ccfda [SCSI] bfa: Broca... |
611 612 613 614 615 |
ls_rjt->els_cmd.els_code = FC_ELS_LS_RJT; ls_rjt->reason_code = reason_code; ls_rjt->reason_code_expl = reason_code_expl; ls_rjt->vendor_unique = 0x00; |
f8ceafde6 [SCSI] bfa: fixed... |
616 |
return sizeof(struct fc_ls_rjt_s); |
7725ccfda [SCSI] bfa: Broca... |
617 618 619 620 |
} u16 fc_ba_acc_build(struct fchs_s *fchs, struct fc_ba_acc_s *ba_acc, u32 d_id, |
50444a340 [SCSI] bfa: fix e... |
621 |
u32 s_id, __be16 ox_id, u16 rx_id) |
7725ccfda [SCSI] bfa: Broca... |
622 623 |
{ fc_bls_rsp_build(fchs, d_id, s_id, ox_id); |
6a18b1675 [SCSI] bfa: remov... |
624 |
memcpy(ba_acc, &ba_acc_tmpl, sizeof(struct fc_ba_acc_s)); |
7725ccfda [SCSI] bfa: Broca... |
625 626 627 628 629 |
fchs->rx_id = rx_id; ba_acc->ox_id = fchs->ox_id; ba_acc->rx_id = fchs->rx_id; |
f8ceafde6 [SCSI] bfa: fixed... |
630 |
return sizeof(struct fc_ba_acc_s); |
7725ccfda [SCSI] bfa: Broca... |
631 632 633 |
} u16 |
a36c61f90 [SCSI] bfa: clean... |
634 |
fc_ls_acc_build(struct fchs_s *fchs, struct fc_els_cmd_s *els_cmd, u32 d_id, |
50444a340 [SCSI] bfa: fix e... |
635 |
u32 s_id, __be16 ox_id) |
7725ccfda [SCSI] bfa: Broca... |
636 637 |
{ fc_els_rsp_build(fchs, d_id, s_id, ox_id); |
6a18b1675 [SCSI] bfa: remov... |
638 |
memset(els_cmd, 0, sizeof(struct fc_els_cmd_s)); |
7725ccfda [SCSI] bfa: Broca... |
639 |
els_cmd->els_code = FC_ELS_ACC; |
f8ceafde6 [SCSI] bfa: fixed... |
640 |
return sizeof(struct fc_els_cmd_s); |
7725ccfda [SCSI] bfa: Broca... |
641 642 643 644 645 646 |
} int fc_logout_params_pages(struct fchs_s *fc_frame, u8 els_code) { int num_pages = 0; |
a36c61f90 [SCSI] bfa: clean... |
647 648 |
struct fc_prlo_s *prlo; struct fc_tprlo_s *tprlo; |
7725ccfda [SCSI] bfa: Broca... |
649 650 651 |
if (els_code == FC_ELS_PRLO) { prlo = (struct fc_prlo_s *) (fc_frame + 1); |
ba816ea8e [SCSI] bfa: repla... |
652 |
num_pages = (be16_to_cpu(prlo->payload_len) - 4) / 16; |
7725ccfda [SCSI] bfa: Broca... |
653 654 |
} else { tprlo = (struct fc_tprlo_s *) (fc_frame + 1); |
ba816ea8e [SCSI] bfa: repla... |
655 |
num_pages = (be16_to_cpu(tprlo->payload_len) - 4) / 16; |
7725ccfda [SCSI] bfa: Broca... |
656 657 658 659 660 661 |
} return num_pages; } u16 fc_tprlo_acc_build(struct fchs_s *fchs, struct fc_tprlo_acc_s *tprlo_acc, |
50444a340 [SCSI] bfa: fix e... |
662 |
u32 d_id, u32 s_id, __be16 ox_id, int num_pages) |
7725ccfda [SCSI] bfa: Broca... |
663 664 665 666 |
{ int page; fc_els_rsp_build(fchs, d_id, s_id, ox_id); |
6a18b1675 [SCSI] bfa: remov... |
667 |
memset(tprlo_acc, 0, (num_pages * 16) + 4); |
7725ccfda [SCSI] bfa: Broca... |
668 669 670 |
tprlo_acc->command = FC_ELS_ACC; tprlo_acc->page_len = 0x10; |
ba816ea8e [SCSI] bfa: repla... |
671 |
tprlo_acc->payload_len = cpu_to_be16((num_pages * 16) + 4); |
7725ccfda [SCSI] bfa: Broca... |
672 673 674 675 676 677 678 679 |
for (page = 0; page < num_pages; page++) { tprlo_acc->tprlo_acc_params[page].opa_valid = 0; tprlo_acc->tprlo_acc_params[page].rpa_valid = 0; tprlo_acc->tprlo_acc_params[page].fc4type_csp = FC_TYPE_FCP; tprlo_acc->tprlo_acc_params[page].orig_process_assc = 0; tprlo_acc->tprlo_acc_params[page].resp_process_assc = 0; } |
ba816ea8e [SCSI] bfa: repla... |
680 |
return be16_to_cpu(tprlo_acc->payload_len); |
7725ccfda [SCSI] bfa: Broca... |
681 682 683 |
} u16 |
a36c61f90 [SCSI] bfa: clean... |
684 |
fc_prlo_acc_build(struct fchs_s *fchs, struct fc_prlo_acc_s *prlo_acc, u32 d_id, |
50444a340 [SCSI] bfa: fix e... |
685 |
u32 s_id, __be16 ox_id, int num_pages) |
7725ccfda [SCSI] bfa: Broca... |
686 687 688 689 |
{ int page; fc_els_rsp_build(fchs, d_id, s_id, ox_id); |
6a18b1675 [SCSI] bfa: remov... |
690 |
memset(prlo_acc, 0, (num_pages * 16) + 4); |
7725ccfda [SCSI] bfa: Broca... |
691 692 |
prlo_acc->command = FC_ELS_ACC; prlo_acc->page_len = 0x10; |
ba816ea8e [SCSI] bfa: repla... |
693 |
prlo_acc->payload_len = cpu_to_be16((num_pages * 16) + 4); |
7725ccfda [SCSI] bfa: Broca... |
694 695 696 697 698 699 700 701 |
for (page = 0; page < num_pages; page++) { prlo_acc->prlo_acc_params[page].opa_valid = 0; prlo_acc->prlo_acc_params[page].rpa_valid = 0; prlo_acc->prlo_acc_params[page].fc4type_csp = FC_TYPE_FCP; prlo_acc->prlo_acc_params[page].orig_process_assc = 0; prlo_acc->prlo_acc_params[page].resp_process_assc = 0; } |
ba816ea8e [SCSI] bfa: repla... |
702 |
return be16_to_cpu(prlo_acc->payload_len); |
7725ccfda [SCSI] bfa: Broca... |
703 704 705 706 |
} u16 fc_rnid_build(struct fchs_s *fchs, struct fc_rnid_cmd_s *rnid, u32 d_id, |
a36c61f90 [SCSI] bfa: clean... |
707 |
u32 s_id, u16 ox_id, u32 data_format) |
7725ccfda [SCSI] bfa: Broca... |
708 709 |
{ fc_els_req_build(fchs, d_id, s_id, ox_id); |
6a18b1675 [SCSI] bfa: remov... |
710 |
memset(rnid, 0, sizeof(struct fc_rnid_cmd_s)); |
7725ccfda [SCSI] bfa: Broca... |
711 712 713 |
rnid->els_cmd.els_code = FC_ELS_RNID; rnid->node_id_data_format = data_format; |
f8ceafde6 [SCSI] bfa: fixed... |
714 |
return sizeof(struct fc_rnid_cmd_s); |
7725ccfda [SCSI] bfa: Broca... |
715 716 717 |
} u16 |
a36c61f90 [SCSI] bfa: clean... |
718 |
fc_rnid_acc_build(struct fchs_s *fchs, struct fc_rnid_acc_s *rnid_acc, u32 d_id, |
50444a340 [SCSI] bfa: fix e... |
719 |
u32 s_id, __be16 ox_id, u32 data_format, |
a36c61f90 [SCSI] bfa: clean... |
720 721 |
struct fc_rnid_common_id_data_s *common_id_data, struct fc_rnid_general_topology_data_s *gen_topo_data) |
7725ccfda [SCSI] bfa: Broca... |
722 |
{ |
6a18b1675 [SCSI] bfa: remov... |
723 |
memset(rnid_acc, 0, sizeof(struct fc_rnid_acc_s)); |
7725ccfda [SCSI] bfa: Broca... |
724 725 726 727 728 729 730 731 732 733 734 735 |
fc_els_rsp_build(fchs, d_id, s_id, ox_id); rnid_acc->els_cmd.els_code = FC_ELS_ACC; rnid_acc->node_id_data_format = data_format; rnid_acc->common_id_data_length = sizeof(struct fc_rnid_common_id_data_s); rnid_acc->common_id_data = *common_id_data; if (data_format == RNID_NODEID_DATA_FORMAT_DISCOVERY) { rnid_acc->specific_id_data_length = sizeof(struct fc_rnid_general_topology_data_s); |
6a18b1675 [SCSI] bfa: remov... |
736 |
rnid_acc->gen_topology_data = *gen_topo_data; |
f8ceafde6 [SCSI] bfa: fixed... |
737 |
return sizeof(struct fc_rnid_acc_s); |
7725ccfda [SCSI] bfa: Broca... |
738 |
} else { |
f8ceafde6 [SCSI] bfa: fixed... |
739 740 |
return sizeof(struct fc_rnid_acc_s) - sizeof(struct fc_rnid_general_topology_data_s); |
7725ccfda [SCSI] bfa: Broca... |
741 742 743 744 745 746 |
} } u16 fc_rpsc_build(struct fchs_s *fchs, struct fc_rpsc_cmd_s *rpsc, u32 d_id, |
a36c61f90 [SCSI] bfa: clean... |
747 |
u32 s_id, u16 ox_id) |
7725ccfda [SCSI] bfa: Broca... |
748 749 |
{ fc_els_req_build(fchs, d_id, s_id, ox_id); |
6a18b1675 [SCSI] bfa: remov... |
750 |
memset(rpsc, 0, sizeof(struct fc_rpsc_cmd_s)); |
7725ccfda [SCSI] bfa: Broca... |
751 752 |
rpsc->els_cmd.els_code = FC_ELS_RPSC; |
f8ceafde6 [SCSI] bfa: fixed... |
753 |
return sizeof(struct fc_rpsc_cmd_s); |
7725ccfda [SCSI] bfa: Broca... |
754 755 756 |
} u16 |
a36c61f90 [SCSI] bfa: clean... |
757 758 |
fc_rpsc2_build(struct fchs_s *fchs, struct fc_rpsc2_cmd_s *rpsc2, u32 d_id, u32 s_id, u32 *pid_list, u16 npids) |
7725ccfda [SCSI] bfa: Broca... |
759 |
{ |
f16a17507 [SCSI] bfa: remov... |
760 |
u32 dctlr_id = FC_DOMAIN_CTRLR(bfa_hton3b(d_id)); |
7725ccfda [SCSI] bfa: Broca... |
761 |
int i = 0; |
f16a17507 [SCSI] bfa: remov... |
762 |
fc_els_req_build(fchs, bfa_hton3b(dctlr_id), s_id, 0); |
7725ccfda [SCSI] bfa: Broca... |
763 |
|
6a18b1675 [SCSI] bfa: remov... |
764 |
memset(rpsc2, 0, sizeof(struct fc_rpsc2_cmd_s)); |
7725ccfda [SCSI] bfa: Broca... |
765 766 |
rpsc2->els_cmd.els_code = FC_ELS_RPSC; |
ba816ea8e [SCSI] bfa: repla... |
767 768 |
rpsc2->token = cpu_to_be32(FC_BRCD_TOKEN); rpsc2->num_pids = cpu_to_be16(npids); |
7725ccfda [SCSI] bfa: Broca... |
769 770 |
for (i = 0; i < npids; i++) rpsc2->pid_list[i].pid = pid_list[i]; |
a36c61f90 [SCSI] bfa: clean... |
771 |
return sizeof(struct fc_rpsc2_cmd_s) + ((npids - 1) * (sizeof(u32))); |
7725ccfda [SCSI] bfa: Broca... |
772 773 774 775 |
} u16 fc_rpsc_acc_build(struct fchs_s *fchs, struct fc_rpsc_acc_s *rpsc_acc, |
50444a340 [SCSI] bfa: fix e... |
776 |
u32 d_id, u32 s_id, __be16 ox_id, |
a36c61f90 [SCSI] bfa: clean... |
777 |
struct fc_rpsc_speed_info_s *oper_speed) |
7725ccfda [SCSI] bfa: Broca... |
778 |
{ |
6a18b1675 [SCSI] bfa: remov... |
779 |
memset(rpsc_acc, 0, sizeof(struct fc_rpsc_acc_s)); |
7725ccfda [SCSI] bfa: Broca... |
780 781 782 783 |
fc_els_rsp_build(fchs, d_id, s_id, ox_id); rpsc_acc->command = FC_ELS_ACC; |
ba816ea8e [SCSI] bfa: repla... |
784 |
rpsc_acc->num_entries = cpu_to_be16(1); |
7725ccfda [SCSI] bfa: Broca... |
785 786 |
rpsc_acc->speed_info[0].port_speed_cap = |
ba816ea8e [SCSI] bfa: repla... |
787 |
cpu_to_be16(oper_speed->port_speed_cap); |
7725ccfda [SCSI] bfa: Broca... |
788 789 |
rpsc_acc->speed_info[0].port_op_speed = |
ba816ea8e [SCSI] bfa: repla... |
790 |
cpu_to_be16(oper_speed->port_op_speed); |
7725ccfda [SCSI] bfa: Broca... |
791 |
|
f8ceafde6 [SCSI] bfa: fixed... |
792 |
return sizeof(struct fc_rpsc_acc_s); |
7725ccfda [SCSI] bfa: Broca... |
793 |
} |
7725ccfda [SCSI] bfa: Broca... |
794 795 796 |
u16 fc_logo_rsp_parse(struct fchs_s *fchs, int len) { |
a36c61f90 [SCSI] bfa: clean... |
797 |
struct fc_els_cmd_s *els_cmd = (struct fc_els_cmd_s *) (fchs + 1); |
7725ccfda [SCSI] bfa: Broca... |
798 799 800 801 802 803 804 805 806 |
len = len; if (els_cmd->els_code != FC_ELS_ACC) return FC_PARSE_FAILURE; return FC_PARSE_OK; } u16 |
a36c61f90 [SCSI] bfa: clean... |
807 808 |
fc_pdisc_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u16 ox_id, wwn_t port_name, wwn_t node_name, u16 pdu_size) |
7725ccfda [SCSI] bfa: Broca... |
809 |
{ |
a36c61f90 [SCSI] bfa: clean... |
810 |
struct fc_logi_s *pdisc = (struct fc_logi_s *) (fchs + 1); |
7725ccfda [SCSI] bfa: Broca... |
811 |
|
6a18b1675 [SCSI] bfa: remov... |
812 |
memcpy(pdisc, &plogi_tmpl, sizeof(struct fc_logi_s)); |
7725ccfda [SCSI] bfa: Broca... |
813 814 815 |
pdisc->els_cmd.els_code = FC_ELS_PDISC; fc_els_req_build(fchs, d_id, s_id, ox_id); |
ba816ea8e [SCSI] bfa: repla... |
816 |
pdisc->csp.rxsz = pdisc->class3.rxsz = cpu_to_be16(pdu_size); |
7725ccfda [SCSI] bfa: Broca... |
817 818 |
pdisc->port_name = port_name; pdisc->node_name = node_name; |
f8ceafde6 [SCSI] bfa: fixed... |
819 |
return sizeof(struct fc_logi_s); |
7725ccfda [SCSI] bfa: Broca... |
820 821 822 823 824 |
} u16 fc_pdisc_rsp_parse(struct fchs_s *fchs, int len, wwn_t port_name) { |
a36c61f90 [SCSI] bfa: clean... |
825 |
struct fc_logi_s *pdisc = (struct fc_logi_s *) (fchs + 1); |
7725ccfda [SCSI] bfa: Broca... |
826 827 |
if (len < sizeof(struct fc_logi_s)) |
f8ceafde6 [SCSI] bfa: fixed... |
828 |
return FC_PARSE_LEN_INVAL; |
7725ccfda [SCSI] bfa: Broca... |
829 830 |
if (pdisc->els_cmd.els_code != FC_ELS_ACC) |
f8ceafde6 [SCSI] bfa: fixed... |
831 |
return FC_PARSE_ACC_INVAL; |
7725ccfda [SCSI] bfa: Broca... |
832 833 |
if (!wwn_is_equal(pdisc->port_name, port_name)) |
f8ceafde6 [SCSI] bfa: fixed... |
834 |
return FC_PARSE_PWWN_NOT_EQUAL; |
7725ccfda [SCSI] bfa: Broca... |
835 836 |
if (!pdisc->class3.class_valid) |
f8ceafde6 [SCSI] bfa: fixed... |
837 |
return FC_PARSE_NWWN_NOT_EQUAL; |
7725ccfda [SCSI] bfa: Broca... |
838 |
|
ba816ea8e [SCSI] bfa: repla... |
839 |
if (be16_to_cpu(pdisc->class3.rxsz) < (FC_MIN_PDUSZ)) |
f8ceafde6 [SCSI] bfa: fixed... |
840 |
return FC_PARSE_RXSZ_INVAL; |
7725ccfda [SCSI] bfa: Broca... |
841 |
|
f8ceafde6 [SCSI] bfa: fixed... |
842 |
return FC_PARSE_OK; |
7725ccfda [SCSI] bfa: Broca... |
843 844 845 846 847 848 |
} u16 fc_prlo_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u16 ox_id, int num_pages) { |
a36c61f90 [SCSI] bfa: clean... |
849 |
struct fc_prlo_s *prlo = (struct fc_prlo_s *) (fchs + 1); |
7725ccfda [SCSI] bfa: Broca... |
850 851 852 |
int page; fc_els_req_build(fchs, d_id, s_id, ox_id); |
6a18b1675 [SCSI] bfa: remov... |
853 |
memset(prlo, 0, (num_pages * 16) + 4); |
7725ccfda [SCSI] bfa: Broca... |
854 855 |
prlo->command = FC_ELS_PRLO; prlo->page_len = 0x10; |
ba816ea8e [SCSI] bfa: repla... |
856 |
prlo->payload_len = cpu_to_be16((num_pages * 16) + 4); |
7725ccfda [SCSI] bfa: Broca... |
857 858 859 860 861 862 863 864 |
for (page = 0; page < num_pages; page++) { prlo->prlo_params[page].type = FC_TYPE_FCP; prlo->prlo_params[page].opa_valid = 0; prlo->prlo_params[page].rpa_valid = 0; prlo->prlo_params[page].orig_process_assc = 0; prlo->prlo_params[page].resp_process_assc = 0; } |
ba816ea8e [SCSI] bfa: repla... |
865 |
return be16_to_cpu(prlo->payload_len); |
7725ccfda [SCSI] bfa: Broca... |
866 867 868 869 870 |
} u16 fc_prlo_rsp_parse(struct fchs_s *fchs, int len) { |
a36c61f90 [SCSI] bfa: clean... |
871 |
struct fc_prlo_acc_s *prlo = (struct fc_prlo_acc_s *) (fchs + 1); |
7725ccfda [SCSI] bfa: Broca... |
872 873 874 875 876 877 |
int num_pages = 0; int page = 0; len = len; if (prlo->command != FC_ELS_ACC) |
f8ceafde6 [SCSI] bfa: fixed... |
878 |
return FC_PARSE_FAILURE; |
7725ccfda [SCSI] bfa: Broca... |
879 |
|
ba816ea8e [SCSI] bfa: repla... |
880 |
num_pages = ((be16_to_cpu(prlo->payload_len)) - 4) / 16; |
7725ccfda [SCSI] bfa: Broca... |
881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 |
for (page = 0; page < num_pages; page++) { if (prlo->prlo_acc_params[page].type != FC_TYPE_FCP) return FC_PARSE_FAILURE; if (prlo->prlo_acc_params[page].opa_valid != 0) return FC_PARSE_FAILURE; if (prlo->prlo_acc_params[page].rpa_valid != 0) return FC_PARSE_FAILURE; if (prlo->prlo_acc_params[page].orig_process_assc != 0) return FC_PARSE_FAILURE; if (prlo->prlo_acc_params[page].resp_process_assc != 0) return FC_PARSE_FAILURE; } |
f8ceafde6 [SCSI] bfa: fixed... |
898 |
return FC_PARSE_OK; |
7725ccfda [SCSI] bfa: Broca... |
899 900 901 902 |
} u16 |
a36c61f90 [SCSI] bfa: clean... |
903 904 |
fc_tprlo_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u16 ox_id, int num_pages, enum fc_tprlo_type tprlo_type, u32 tpr_id) |
7725ccfda [SCSI] bfa: Broca... |
905 |
{ |
a36c61f90 [SCSI] bfa: clean... |
906 |
struct fc_tprlo_s *tprlo = (struct fc_tprlo_s *) (fchs + 1); |
7725ccfda [SCSI] bfa: Broca... |
907 908 909 |
int page; fc_els_req_build(fchs, d_id, s_id, ox_id); |
6a18b1675 [SCSI] bfa: remov... |
910 |
memset(tprlo, 0, (num_pages * 16) + 4); |
7725ccfda [SCSI] bfa: Broca... |
911 912 |
tprlo->command = FC_ELS_TPRLO; tprlo->page_len = 0x10; |
ba816ea8e [SCSI] bfa: repla... |
913 |
tprlo->payload_len = cpu_to_be16((num_pages * 16) + 4); |
7725ccfda [SCSI] bfa: Broca... |
914 915 916 917 918 919 920 921 922 923 924 925 926 927 |
for (page = 0; page < num_pages; page++) { tprlo->tprlo_params[page].type = FC_TYPE_FCP; tprlo->tprlo_params[page].opa_valid = 0; tprlo->tprlo_params[page].rpa_valid = 0; tprlo->tprlo_params[page].orig_process_assc = 0; tprlo->tprlo_params[page].resp_process_assc = 0; if (tprlo_type == FC_GLOBAL_LOGO) { tprlo->tprlo_params[page].global_process_logout = 1; } else if (tprlo_type == FC_TPR_LOGO) { tprlo->tprlo_params[page].tpo_nport_valid = 1; tprlo->tprlo_params[page].tpo_nport_id = (tpr_id); } } |
ba816ea8e [SCSI] bfa: repla... |
928 |
return be16_to_cpu(tprlo->payload_len); |
7725ccfda [SCSI] bfa: Broca... |
929 930 931 932 933 934 935 936 937 938 939 940 |
} u16 fc_tprlo_rsp_parse(struct fchs_s *fchs, int len) { struct fc_tprlo_acc_s *tprlo = (struct fc_tprlo_acc_s *) (fchs + 1); int num_pages = 0; int page = 0; len = len; if (tprlo->command != FC_ELS_ACC) |
f8ceafde6 [SCSI] bfa: fixed... |
941 |
return FC_PARSE_ACC_INVAL; |
7725ccfda [SCSI] bfa: Broca... |
942 |
|
ba816ea8e [SCSI] bfa: repla... |
943 |
num_pages = (be16_to_cpu(tprlo->payload_len) - 4) / 16; |
7725ccfda [SCSI] bfa: Broca... |
944 945 946 |
for (page = 0; page < num_pages; page++) { if (tprlo->tprlo_acc_params[page].type != FC_TYPE_FCP) |
f8ceafde6 [SCSI] bfa: fixed... |
947 |
return FC_PARSE_NOT_FCP; |
7725ccfda [SCSI] bfa: Broca... |
948 |
if (tprlo->tprlo_acc_params[page].opa_valid != 0) |
f8ceafde6 [SCSI] bfa: fixed... |
949 |
return FC_PARSE_OPAFLAG_INVAL; |
7725ccfda [SCSI] bfa: Broca... |
950 |
if (tprlo->tprlo_acc_params[page].rpa_valid != 0) |
f8ceafde6 [SCSI] bfa: fixed... |
951 |
return FC_PARSE_RPAFLAG_INVAL; |
7725ccfda [SCSI] bfa: Broca... |
952 |
if (tprlo->tprlo_acc_params[page].orig_process_assc != 0) |
f8ceafde6 [SCSI] bfa: fixed... |
953 |
return FC_PARSE_OPA_INVAL; |
7725ccfda [SCSI] bfa: Broca... |
954 |
if (tprlo->tprlo_acc_params[page].resp_process_assc != 0) |
f8ceafde6 [SCSI] bfa: fixed... |
955 |
return FC_PARSE_RPA_INVAL; |
7725ccfda [SCSI] bfa: Broca... |
956 |
} |
f8ceafde6 [SCSI] bfa: fixed... |
957 |
return FC_PARSE_OK; |
7725ccfda [SCSI] bfa: Broca... |
958 959 960 961 962 |
} enum fc_parse_status fc_rrq_rsp_parse(struct fchs_s *fchs, int len) { |
a36c61f90 [SCSI] bfa: clean... |
963 |
struct fc_els_cmd_s *els_cmd = (struct fc_els_cmd_s *) (fchs + 1); |
7725ccfda [SCSI] bfa: Broca... |
964 965 966 967 968 969 970 971 972 |
len = len; if (els_cmd->els_code != FC_ELS_ACC) return FC_PARSE_FAILURE; return FC_PARSE_OK; } u16 |
50444a340 [SCSI] bfa: fix e... |
973 |
fc_ba_rjt_build(struct fchs_s *fchs, u32 d_id, u32 s_id, __be16 ox_id, |
a36c61f90 [SCSI] bfa: clean... |
974 |
u32 reason_code, u32 reason_expl) |
7725ccfda [SCSI] bfa: Broca... |
975 |
{ |
a36c61f90 [SCSI] bfa: clean... |
976 |
struct fc_ba_rjt_s *ba_rjt = (struct fc_ba_rjt_s *) (fchs + 1); |
7725ccfda [SCSI] bfa: Broca... |
977 978 979 980 981 982 |
fc_bls_rsp_build(fchs, d_id, s_id, ox_id); fchs->cat_info = FC_CAT_BA_RJT; ba_rjt->reason_code = reason_code; ba_rjt->reason_expl = reason_expl; |
f8ceafde6 [SCSI] bfa: fixed... |
983 |
return sizeof(struct fc_ba_rjt_s); |
7725ccfda [SCSI] bfa: Broca... |
984 985 986 987 988 |
} static void fc_gs_cthdr_build(struct ct_hdr_s *cthdr, u32 s_id, u16 cmd_code) { |
6a18b1675 [SCSI] bfa: remov... |
989 |
memset(cthdr, 0, sizeof(struct ct_hdr_s)); |
7725ccfda [SCSI] bfa: Broca... |
990 991 992 |
cthdr->rev_id = CT_GS3_REVISION; cthdr->gs_type = CT_GSTYPE_DIRSERVICE; cthdr->gs_sub_type = CT_GSSUBTYPE_NAMESERVER; |
ba816ea8e [SCSI] bfa: repla... |
993 |
cthdr->cmd_rsp_code = cpu_to_be16(cmd_code); |
7725ccfda [SCSI] bfa: Broca... |
994 995 996 997 998 |
} static void fc_gs_fdmi_cthdr_build(struct ct_hdr_s *cthdr, u32 s_id, u16 cmd_code) { |
6a18b1675 [SCSI] bfa: remov... |
999 |
memset(cthdr, 0, sizeof(struct ct_hdr_s)); |
7725ccfda [SCSI] bfa: Broca... |
1000 1001 1002 |
cthdr->rev_id = CT_GS3_REVISION; cthdr->gs_type = CT_GSTYPE_MGMTSERVICE; cthdr->gs_sub_type = CT_GSSUBTYPE_HBA_MGMTSERVER; |
ba816ea8e [SCSI] bfa: repla... |
1003 |
cthdr->cmd_rsp_code = cpu_to_be16(cmd_code); |
7725ccfda [SCSI] bfa: Broca... |
1004 1005 1006 1007 1008 1009 |
} static void fc_gs_ms_cthdr_build(struct ct_hdr_s *cthdr, u32 s_id, u16 cmd_code, u8 sub_type) { |
6a18b1675 [SCSI] bfa: remov... |
1010 |
memset(cthdr, 0, sizeof(struct ct_hdr_s)); |
7725ccfda [SCSI] bfa: Broca... |
1011 1012 1013 |
cthdr->rev_id = CT_GS3_REVISION; cthdr->gs_type = CT_GSTYPE_MGMTSERVICE; cthdr->gs_sub_type = sub_type; |
ba816ea8e [SCSI] bfa: repla... |
1014 |
cthdr->cmd_rsp_code = cpu_to_be16(cmd_code); |
7725ccfda [SCSI] bfa: Broca... |
1015 1016 1017 1018 1019 1020 |
} u16 fc_gidpn_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, wwn_t port_name) { |
a36c61f90 [SCSI] bfa: clean... |
1021 1022 |
struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; struct fcgs_gidpn_req_s *gidpn = (struct fcgs_gidpn_req_s *)(cthdr + 1); |
f16a17507 [SCSI] bfa: remov... |
1023 |
u32 d_id = bfa_hton3b(FC_NAME_SERVER); |
7725ccfda [SCSI] bfa: Broca... |
1024 1025 1026 |
fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); fc_gs_cthdr_build(cthdr, s_id, GS_GID_PN); |
6a18b1675 [SCSI] bfa: remov... |
1027 |
memset(gidpn, 0, sizeof(struct fcgs_gidpn_req_s)); |
7725ccfda [SCSI] bfa: Broca... |
1028 |
gidpn->port_name = port_name; |
f8ceafde6 [SCSI] bfa: fixed... |
1029 |
return sizeof(struct fcgs_gidpn_req_s) + sizeof(struct ct_hdr_s); |
7725ccfda [SCSI] bfa: Broca... |
1030 1031 1032 1033 1034 1035 |
} u16 fc_gpnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, u32 port_id) { |
a36c61f90 [SCSI] bfa: clean... |
1036 |
struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; |
7725ccfda [SCSI] bfa: Broca... |
1037 |
fcgs_gpnid_req_t *gpnid = (fcgs_gpnid_req_t *) (cthdr + 1); |
f16a17507 [SCSI] bfa: remov... |
1038 |
u32 d_id = bfa_hton3b(FC_NAME_SERVER); |
7725ccfda [SCSI] bfa: Broca... |
1039 1040 1041 |
fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); fc_gs_cthdr_build(cthdr, s_id, GS_GPN_ID); |
6a18b1675 [SCSI] bfa: remov... |
1042 |
memset(gpnid, 0, sizeof(fcgs_gpnid_req_t)); |
7725ccfda [SCSI] bfa: Broca... |
1043 |
gpnid->dap = port_id; |
f8ceafde6 [SCSI] bfa: fixed... |
1044 |
return sizeof(fcgs_gpnid_req_t) + sizeof(struct ct_hdr_s); |
7725ccfda [SCSI] bfa: Broca... |
1045 1046 1047 1048 1049 1050 |
} u16 fc_gnnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, u32 port_id) { |
a36c61f90 [SCSI] bfa: clean... |
1051 |
struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; |
7725ccfda [SCSI] bfa: Broca... |
1052 |
fcgs_gnnid_req_t *gnnid = (fcgs_gnnid_req_t *) (cthdr + 1); |
f16a17507 [SCSI] bfa: remov... |
1053 |
u32 d_id = bfa_hton3b(FC_NAME_SERVER); |
7725ccfda [SCSI] bfa: Broca... |
1054 1055 1056 |
fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); fc_gs_cthdr_build(cthdr, s_id, GS_GNN_ID); |
6a18b1675 [SCSI] bfa: remov... |
1057 |
memset(gnnid, 0, sizeof(fcgs_gnnid_req_t)); |
7725ccfda [SCSI] bfa: Broca... |
1058 |
gnnid->dap = port_id; |
f8ceafde6 [SCSI] bfa: fixed... |
1059 |
return sizeof(fcgs_gnnid_req_t) + sizeof(struct ct_hdr_s); |
7725ccfda [SCSI] bfa: Broca... |
1060 1061 1062 1063 1064 |
} u16 fc_ct_rsp_parse(struct ct_hdr_s *cthdr) { |
ba816ea8e [SCSI] bfa: repla... |
1065 |
if (be16_to_cpu(cthdr->cmd_rsp_code) != CT_RSP_ACCEPT) { |
7725ccfda [SCSI] bfa: Broca... |
1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 |
if (cthdr->reason_code == CT_RSN_LOGICAL_BUSY) return FC_PARSE_BUSY; else return FC_PARSE_FAILURE; } return FC_PARSE_OK; } u16 |
d7be54cc5 [SCSI] bfa: FCS b... |
1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 |
fc_gs_rjt_build(struct fchs_s *fchs, struct ct_hdr_s *cthdr, u32 d_id, u32 s_id, u16 ox_id, u8 reason_code, u8 reason_code_expl) { fc_gsresp_fchdr_build(fchs, d_id, s_id, ox_id); cthdr->cmd_rsp_code = cpu_to_be16(CT_RSP_REJECT); cthdr->rev_id = CT_GS3_REVISION; cthdr->reason_code = reason_code; cthdr->exp_code = reason_code_expl; return sizeof(struct ct_hdr_s); } u16 |
a36c61f90 [SCSI] bfa: clean... |
1091 1092 |
fc_scr_build(struct fchs_s *fchs, struct fc_scr_s *scr, u8 set_br_reg, u32 s_id, u16 ox_id) |
7725ccfda [SCSI] bfa: Broca... |
1093 |
{ |
f16a17507 [SCSI] bfa: remov... |
1094 |
u32 d_id = bfa_hton3b(FC_FABRIC_CONTROLLER); |
7725ccfda [SCSI] bfa: Broca... |
1095 1096 |
fc_els_req_build(fchs, d_id, s_id, ox_id); |
6a18b1675 [SCSI] bfa: remov... |
1097 |
memset(scr, 0, sizeof(struct fc_scr_s)); |
7725ccfda [SCSI] bfa: Broca... |
1098 1099 1100 1101 |
scr->command = FC_ELS_SCR; scr->reg_func = FC_SCR_REG_FUNC_FULL; if (set_br_reg) scr->vu_reg_func = FC_VU_SCR_REG_FUNC_FABRIC_NAME_CHANGE; |
f8ceafde6 [SCSI] bfa: fixed... |
1102 |
return sizeof(struct fc_scr_s); |
7725ccfda [SCSI] bfa: Broca... |
1103 1104 1105 |
} u16 |
a36c61f90 [SCSI] bfa: clean... |
1106 1107 |
fc_rscn_build(struct fchs_s *fchs, struct fc_rscn_pl_s *rscn, u32 s_id, u16 ox_id) |
7725ccfda [SCSI] bfa: Broca... |
1108 |
{ |
f16a17507 [SCSI] bfa: remov... |
1109 |
u32 d_id = bfa_hton3b(FC_FABRIC_CONTROLLER); |
7725ccfda [SCSI] bfa: Broca... |
1110 1111 1112 1113 1114 1115 1116 |
u16 payldlen; fc_els_req_build(fchs, d_id, s_id, ox_id); rscn->command = FC_ELS_RSCN; rscn->pagelen = sizeof(rscn->event[0]); payldlen = sizeof(u32) + rscn->pagelen; |
ba816ea8e [SCSI] bfa: repla... |
1117 |
rscn->payldlen = cpu_to_be16(payldlen); |
7725ccfda [SCSI] bfa: Broca... |
1118 1119 1120 |
rscn->event[0].format = FC_RSCN_FORMAT_PORTID; rscn->event[0].portid = s_id; |
f8ceafde6 [SCSI] bfa: fixed... |
1121 |
return sizeof(struct fc_rscn_pl_s); |
7725ccfda [SCSI] bfa: Broca... |
1122 1123 1124 1125 |
} u16 fc_rftid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, |
a36c61f90 [SCSI] bfa: clean... |
1126 |
enum bfa_lport_role roles) |
7725ccfda [SCSI] bfa: Broca... |
1127 |
{ |
a36c61f90 [SCSI] bfa: clean... |
1128 1129 |
struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; struct fcgs_rftid_req_s *rftid = (struct fcgs_rftid_req_s *)(cthdr + 1); |
f16a17507 [SCSI] bfa: remov... |
1130 |
u32 type_value, d_id = bfa_hton3b(FC_NAME_SERVER); |
7725ccfda [SCSI] bfa: Broca... |
1131 1132 1133 1134 |
u8 index; fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); fc_gs_cthdr_build(cthdr, s_id, GS_RFT_ID); |
6a18b1675 [SCSI] bfa: remov... |
1135 |
memset(rftid, 0, sizeof(struct fcgs_rftid_req_s)); |
7725ccfda [SCSI] bfa: Broca... |
1136 1137 1138 1139 1140 1141 |
rftid->dap = s_id; /* By default, FCP FC4 Type is registered */ index = FC_TYPE_FCP >> 5; type_value = 1 << (FC_TYPE_FCP % 32); |
ba816ea8e [SCSI] bfa: repla... |
1142 |
rftid->fc4_type[index] = cpu_to_be32(type_value); |
7725ccfda [SCSI] bfa: Broca... |
1143 |
|
f8ceafde6 [SCSI] bfa: fixed... |
1144 |
return sizeof(struct fcgs_rftid_req_s) + sizeof(struct ct_hdr_s); |
7725ccfda [SCSI] bfa: Broca... |
1145 1146 1147 |
} u16 |
a36c61f90 [SCSI] bfa: clean... |
1148 1149 |
fc_rftid_build_sol(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, u8 *fc4_bitmap, u32 bitmap_size) |
7725ccfda [SCSI] bfa: Broca... |
1150 |
{ |
a36c61f90 [SCSI] bfa: clean... |
1151 1152 |
struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; struct fcgs_rftid_req_s *rftid = (struct fcgs_rftid_req_s *)(cthdr + 1); |
f16a17507 [SCSI] bfa: remov... |
1153 |
u32 d_id = bfa_hton3b(FC_NAME_SERVER); |
7725ccfda [SCSI] bfa: Broca... |
1154 1155 1156 |
fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); fc_gs_cthdr_build(cthdr, s_id, GS_RFT_ID); |
6a18b1675 [SCSI] bfa: remov... |
1157 |
memset(rftid, 0, sizeof(struct fcgs_rftid_req_s)); |
7725ccfda [SCSI] bfa: Broca... |
1158 1159 |
rftid->dap = s_id; |
6a18b1675 [SCSI] bfa: remov... |
1160 |
memcpy((void *)rftid->fc4_type, (void *)fc4_bitmap, |
a36c61f90 [SCSI] bfa: clean... |
1161 |
(bitmap_size < 32 ? bitmap_size : 32)); |
7725ccfda [SCSI] bfa: Broca... |
1162 |
|
f8ceafde6 [SCSI] bfa: fixed... |
1163 |
return sizeof(struct fcgs_rftid_req_s) + sizeof(struct ct_hdr_s); |
7725ccfda [SCSI] bfa: Broca... |
1164 1165 1166 1167 1168 1169 |
} u16 fc_rffid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, u8 fc4_type, u8 fc4_ftrs) { |
a36c61f90 [SCSI] bfa: clean... |
1170 1171 |
struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; struct fcgs_rffid_req_s *rffid = (struct fcgs_rffid_req_s *)(cthdr + 1); |
f16a17507 [SCSI] bfa: remov... |
1172 |
u32 d_id = bfa_hton3b(FC_NAME_SERVER); |
7725ccfda [SCSI] bfa: Broca... |
1173 1174 1175 |
fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); fc_gs_cthdr_build(cthdr, s_id, GS_RFF_ID); |
6a18b1675 [SCSI] bfa: remov... |
1176 |
memset(rffid, 0, sizeof(struct fcgs_rffid_req_s)); |
7725ccfda [SCSI] bfa: Broca... |
1177 |
|
a36c61f90 [SCSI] bfa: clean... |
1178 |
rffid->dap = s_id; |
7725ccfda [SCSI] bfa: Broca... |
1179 |
rffid->fc4ftr_bits = fc4_ftrs; |
a36c61f90 [SCSI] bfa: clean... |
1180 |
rffid->fc4_type = fc4_type; |
7725ccfda [SCSI] bfa: Broca... |
1181 |
|
f8ceafde6 [SCSI] bfa: fixed... |
1182 |
return sizeof(struct fcgs_rffid_req_s) + sizeof(struct ct_hdr_s); |
7725ccfda [SCSI] bfa: Broca... |
1183 1184 1185 1186 1187 1188 |
} u16 fc_rspnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, u8 *name) { |
a36c61f90 [SCSI] bfa: clean... |
1189 |
struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; |
7725ccfda [SCSI] bfa: Broca... |
1190 |
struct fcgs_rspnid_req_s *rspnid = |
a36c61f90 [SCSI] bfa: clean... |
1191 |
(struct fcgs_rspnid_req_s *)(cthdr + 1); |
f16a17507 [SCSI] bfa: remov... |
1192 |
u32 d_id = bfa_hton3b(FC_NAME_SERVER); |
7725ccfda [SCSI] bfa: Broca... |
1193 1194 1195 |
fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); fc_gs_cthdr_build(cthdr, s_id, GS_RSPN_ID); |
6a18b1675 [SCSI] bfa: remov... |
1196 |
memset(rspnid, 0, sizeof(struct fcgs_rspnid_req_s)); |
7725ccfda [SCSI] bfa: Broca... |
1197 1198 1199 1200 |
rspnid->dap = s_id; rspnid->spn_len = (u8) strlen((char *)name); strncpy((char *)rspnid->spn, (char *)name, rspnid->spn_len); |
f8ceafde6 [SCSI] bfa: fixed... |
1201 |
return sizeof(struct fcgs_rspnid_req_s) + sizeof(struct ct_hdr_s); |
7725ccfda [SCSI] bfa: Broca... |
1202 1203 1204 |
} u16 |
a36c61f90 [SCSI] bfa: clean... |
1205 |
fc_gid_ft_build(struct fchs_s *fchs, void *pyld, u32 s_id, u8 fc4_type) |
7725ccfda [SCSI] bfa: Broca... |
1206 |
{ |
a36c61f90 [SCSI] bfa: clean... |
1207 1208 |
struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; struct fcgs_gidft_req_s *gidft = (struct fcgs_gidft_req_s *)(cthdr + 1); |
f16a17507 [SCSI] bfa: remov... |
1209 |
u32 d_id = bfa_hton3b(FC_NAME_SERVER); |
7725ccfda [SCSI] bfa: Broca... |
1210 1211 1212 1213 |
fc_gs_fchdr_build(fchs, d_id, s_id, 0); fc_gs_cthdr_build(cthdr, s_id, GS_GID_FT); |
6a18b1675 [SCSI] bfa: remov... |
1214 |
memset(gidft, 0, sizeof(struct fcgs_gidft_req_s)); |
7725ccfda [SCSI] bfa: Broca... |
1215 1216 1217 |
gidft->fc4_type = fc4_type; gidft->domain_id = 0; gidft->area_id = 0; |
f8ceafde6 [SCSI] bfa: fixed... |
1218 |
return sizeof(struct fcgs_gidft_req_s) + sizeof(struct ct_hdr_s); |
7725ccfda [SCSI] bfa: Broca... |
1219 1220 1221 1222 1223 1224 |
} u16 fc_rpnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id, wwn_t port_name) { |
a36c61f90 [SCSI] bfa: clean... |
1225 1226 |
struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; struct fcgs_rpnid_req_s *rpnid = (struct fcgs_rpnid_req_s *)(cthdr + 1); |
f16a17507 [SCSI] bfa: remov... |
1227 |
u32 d_id = bfa_hton3b(FC_NAME_SERVER); |
7725ccfda [SCSI] bfa: Broca... |
1228 1229 1230 |
fc_gs_fchdr_build(fchs, d_id, s_id, 0); fc_gs_cthdr_build(cthdr, s_id, GS_RPN_ID); |
6a18b1675 [SCSI] bfa: remov... |
1231 |
memset(rpnid, 0, sizeof(struct fcgs_rpnid_req_s)); |
7725ccfda [SCSI] bfa: Broca... |
1232 1233 |
rpnid->port_id = port_id; rpnid->port_name = port_name; |
f8ceafde6 [SCSI] bfa: fixed... |
1234 |
return sizeof(struct fcgs_rpnid_req_s) + sizeof(struct ct_hdr_s); |
7725ccfda [SCSI] bfa: Broca... |
1235 1236 1237 1238 1239 1240 |
} u16 fc_rnnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id, wwn_t node_name) { |
a36c61f90 [SCSI] bfa: clean... |
1241 1242 |
struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; struct fcgs_rnnid_req_s *rnnid = (struct fcgs_rnnid_req_s *)(cthdr + 1); |
f16a17507 [SCSI] bfa: remov... |
1243 |
u32 d_id = bfa_hton3b(FC_NAME_SERVER); |
7725ccfda [SCSI] bfa: Broca... |
1244 1245 1246 |
fc_gs_fchdr_build(fchs, d_id, s_id, 0); fc_gs_cthdr_build(cthdr, s_id, GS_RNN_ID); |
6a18b1675 [SCSI] bfa: remov... |
1247 |
memset(rnnid, 0, sizeof(struct fcgs_rnnid_req_s)); |
7725ccfda [SCSI] bfa: Broca... |
1248 1249 |
rnnid->port_id = port_id; rnnid->node_name = node_name; |
f8ceafde6 [SCSI] bfa: fixed... |
1250 |
return sizeof(struct fcgs_rnnid_req_s) + sizeof(struct ct_hdr_s); |
7725ccfda [SCSI] bfa: Broca... |
1251 1252 1253 1254 1255 1256 |
} u16 fc_rcsid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id, u32 cos) { |
a36c61f90 [SCSI] bfa: clean... |
1257 |
struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; |
7725ccfda [SCSI] bfa: Broca... |
1258 1259 |
struct fcgs_rcsid_req_s *rcsid = (struct fcgs_rcsid_req_s *) (cthdr + 1); |
f16a17507 [SCSI] bfa: remov... |
1260 |
u32 d_id = bfa_hton3b(FC_NAME_SERVER); |
7725ccfda [SCSI] bfa: Broca... |
1261 1262 1263 |
fc_gs_fchdr_build(fchs, d_id, s_id, 0); fc_gs_cthdr_build(cthdr, s_id, GS_RCS_ID); |
6a18b1675 [SCSI] bfa: remov... |
1264 |
memset(rcsid, 0, sizeof(struct fcgs_rcsid_req_s)); |
7725ccfda [SCSI] bfa: Broca... |
1265 1266 |
rcsid->port_id = port_id; rcsid->cos = cos; |
f8ceafde6 [SCSI] bfa: fixed... |
1267 |
return sizeof(struct fcgs_rcsid_req_s) + sizeof(struct ct_hdr_s); |
7725ccfda [SCSI] bfa: Broca... |
1268 1269 1270 1271 1272 1273 |
} u16 fc_rptid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id, u8 port_type) { |
a36c61f90 [SCSI] bfa: clean... |
1274 1275 |
struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; struct fcgs_rptid_req_s *rptid = (struct fcgs_rptid_req_s *)(cthdr + 1); |
f16a17507 [SCSI] bfa: remov... |
1276 |
u32 d_id = bfa_hton3b(FC_NAME_SERVER); |
7725ccfda [SCSI] bfa: Broca... |
1277 1278 1279 |
fc_gs_fchdr_build(fchs, d_id, s_id, 0); fc_gs_cthdr_build(cthdr, s_id, GS_RPT_ID); |
6a18b1675 [SCSI] bfa: remov... |
1280 |
memset(rptid, 0, sizeof(struct fcgs_rptid_req_s)); |
7725ccfda [SCSI] bfa: Broca... |
1281 1282 |
rptid->port_id = port_id; rptid->port_type = port_type; |
f8ceafde6 [SCSI] bfa: fixed... |
1283 |
return sizeof(struct fcgs_rptid_req_s) + sizeof(struct ct_hdr_s); |
7725ccfda [SCSI] bfa: Broca... |
1284 1285 1286 1287 1288 |
} u16 fc_ganxt_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id) { |
a36c61f90 [SCSI] bfa: clean... |
1289 1290 |
struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; struct fcgs_ganxt_req_s *ganxt = (struct fcgs_ganxt_req_s *)(cthdr + 1); |
f16a17507 [SCSI] bfa: remov... |
1291 |
u32 d_id = bfa_hton3b(FC_NAME_SERVER); |
7725ccfda [SCSI] bfa: Broca... |
1292 1293 1294 |
fc_gs_fchdr_build(fchs, d_id, s_id, 0); fc_gs_cthdr_build(cthdr, s_id, GS_GA_NXT); |
6a18b1675 [SCSI] bfa: remov... |
1295 |
memset(ganxt, 0, sizeof(struct fcgs_ganxt_req_s)); |
7725ccfda [SCSI] bfa: Broca... |
1296 |
ganxt->port_id = port_id; |
f8ceafde6 [SCSI] bfa: fixed... |
1297 |
return sizeof(struct ct_hdr_s) + sizeof(struct fcgs_ganxt_req_s); |
7725ccfda [SCSI] bfa: Broca... |
1298 1299 1300 1301 1302 1303 1304 1305 1306 |
} /* * Builds fc hdr and ct hdr for FDMI requests. */ u16 fc_fdmi_reqhdr_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 cmd_code) { |
a36c61f90 [SCSI] bfa: clean... |
1307 |
struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; |
f16a17507 [SCSI] bfa: remov... |
1308 |
u32 d_id = bfa_hton3b(FC_MGMT_SERVER); |
7725ccfda [SCSI] bfa: Broca... |
1309 1310 1311 |
fc_gs_fchdr_build(fchs, d_id, s_id, 0); fc_gs_fdmi_cthdr_build(cthdr, s_id, cmd_code); |
f8ceafde6 [SCSI] bfa: fixed... |
1312 |
return sizeof(struct ct_hdr_s); |
7725ccfda [SCSI] bfa: Broca... |
1313 1314 1315 1316 1317 1318 1319 1320 1321 |
} /* * Given a FC4 Type, this function returns a fc4 type bitmask */ void fc_get_fc4type_bitmask(u8 fc4_type, u8 *bit_mask) { u8 index; |
50444a340 [SCSI] bfa: fix e... |
1322 |
__be32 *ptr = (__be32 *) bit_mask; |
7725ccfda [SCSI] bfa: Broca... |
1323 1324 1325 1326 1327 1328 1329 1330 |
u32 type_value; /* * @todo : Check for bitmask size */ index = fc4_type >> 5; type_value = 1 << (fc4_type % 32); |
ba816ea8e [SCSI] bfa: repla... |
1331 |
ptr[index] = cpu_to_be32(type_value); |
7725ccfda [SCSI] bfa: Broca... |
1332 1333 1334 1335 |
} /* |
a36c61f90 [SCSI] bfa: clean... |
1336 |
* GMAL Request |
7725ccfda [SCSI] bfa: Broca... |
1337 1338 1339 1340 |
*/ u16 fc_gmal_req_build(struct fchs_s *fchs, void *pyld, u32 s_id, wwn_t wwn) { |
a36c61f90 [SCSI] bfa: clean... |
1341 |
struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; |
7725ccfda [SCSI] bfa: Broca... |
1342 |
fcgs_gmal_req_t *gmal = (fcgs_gmal_req_t *) (cthdr + 1); |
f16a17507 [SCSI] bfa: remov... |
1343 |
u32 d_id = bfa_hton3b(FC_MGMT_SERVER); |
7725ccfda [SCSI] bfa: Broca... |
1344 1345 1346 1347 |
fc_gs_fchdr_build(fchs, d_id, s_id, 0); fc_gs_ms_cthdr_build(cthdr, s_id, GS_FC_GMAL_CMD, CT_GSSUBTYPE_CFGSERVER); |
6a18b1675 [SCSI] bfa: remov... |
1348 |
memset(gmal, 0, sizeof(fcgs_gmal_req_t)); |
7725ccfda [SCSI] bfa: Broca... |
1349 |
gmal->wwn = wwn; |
f8ceafde6 [SCSI] bfa: fixed... |
1350 |
return sizeof(struct ct_hdr_s) + sizeof(fcgs_gmal_req_t); |
7725ccfda [SCSI] bfa: Broca... |
1351 1352 1353 1354 1355 1356 1357 1358 |
} /* * GFN (Get Fabric Name) Request */ u16 fc_gfn_req_build(struct fchs_s *fchs, void *pyld, u32 s_id, wwn_t wwn) { |
a36c61f90 [SCSI] bfa: clean... |
1359 |
struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; |
7725ccfda [SCSI] bfa: Broca... |
1360 |
fcgs_gfn_req_t *gfn = (fcgs_gfn_req_t *) (cthdr + 1); |
f16a17507 [SCSI] bfa: remov... |
1361 |
u32 d_id = bfa_hton3b(FC_MGMT_SERVER); |
7725ccfda [SCSI] bfa: Broca... |
1362 1363 1364 1365 |
fc_gs_fchdr_build(fchs, d_id, s_id, 0); fc_gs_ms_cthdr_build(cthdr, s_id, GS_FC_GFN_CMD, CT_GSSUBTYPE_CFGSERVER); |
6a18b1675 [SCSI] bfa: remov... |
1366 |
memset(gfn, 0, sizeof(fcgs_gfn_req_t)); |
7725ccfda [SCSI] bfa: Broca... |
1367 |
gfn->wwn = wwn; |
f8ceafde6 [SCSI] bfa: fixed... |
1368 |
return sizeof(struct ct_hdr_s) + sizeof(fcgs_gfn_req_t); |
7725ccfda [SCSI] bfa: Broca... |
1369 |
} |