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