diff options
Diffstat (limited to 'include/scsi/fc_encode.h')
-rw-r--r-- | include/scsi/fc_encode.h | 60 |
1 files changed, 40 insertions, 20 deletions
diff --git a/include/scsi/fc_encode.h b/include/scsi/fc_encode.h index a0ff61c3e935..27dad703824f 100644 --- a/include/scsi/fc_encode.h +++ b/include/scsi/fc_encode.h | |||
@@ -32,6 +32,7 @@ struct fc_ct_req { | |||
32 | struct fc_ns_gid_ft gid; | 32 | struct fc_ns_gid_ft gid; |
33 | struct fc_ns_rn_id rn; | 33 | struct fc_ns_rn_id rn; |
34 | struct fc_ns_rft rft; | 34 | struct fc_ns_rft rft; |
35 | struct fc_ns_fid fid; | ||
35 | } payload; | 36 | } payload; |
36 | }; | 37 | }; |
37 | 38 | ||
@@ -57,6 +58,23 @@ static inline void fc_fill_fc_hdr(struct fc_frame *fp, enum fc_rctl r_ctl, | |||
57 | } | 58 | } |
58 | 59 | ||
59 | /** | 60 | /** |
61 | * fc_adisc_fill() - Fill in adisc request frame | ||
62 | * @lport: local port. | ||
63 | * @fp: fc frame where payload will be placed. | ||
64 | */ | ||
65 | static inline void fc_adisc_fill(struct fc_lport *lport, struct fc_frame *fp) | ||
66 | { | ||
67 | struct fc_els_adisc *adisc; | ||
68 | |||
69 | adisc = fc_frame_payload_get(fp, sizeof(*adisc)); | ||
70 | memset(adisc, 0, sizeof(*adisc)); | ||
71 | adisc->adisc_cmd = ELS_ADISC; | ||
72 | put_unaligned_be64(lport->wwpn, &adisc->adisc_wwpn); | ||
73 | put_unaligned_be64(lport->wwnn, &adisc->adisc_wwnn); | ||
74 | hton24(adisc->adisc_port_id, fc_host_port_id(lport->host)); | ||
75 | } | ||
76 | |||
77 | /** | ||
60 | * fc_ct_hdr_fill- fills ct header and reset ct payload | 78 | * fc_ct_hdr_fill- fills ct header and reset ct payload |
61 | * returns pointer to ct request. | 79 | * returns pointer to ct request. |
62 | */ | 80 | */ |
@@ -77,10 +95,17 @@ static inline struct fc_ct_req *fc_ct_hdr_fill(const struct fc_frame *fp, | |||
77 | } | 95 | } |
78 | 96 | ||
79 | /** | 97 | /** |
80 | * fc_ct_fill - Fill in a name service request frame | 98 | * fc_ct_fill() - Fill in a name service request frame |
99 | * @lport: local port. | ||
100 | * @fc_id: FC_ID of non-destination rport for GPN_ID and similar inquiries. | ||
101 | * @fp: frame to contain payload. | ||
102 | * @op: CT opcode. | ||
103 | * @r_ctl: pointer to FC header R_CTL. | ||
104 | * @fh_type: pointer to FC-4 type. | ||
81 | */ | 105 | */ |
82 | static inline int fc_ct_fill(struct fc_lport *lport, struct fc_frame *fp, | 106 | static inline int fc_ct_fill(struct fc_lport *lport, |
83 | unsigned int op, enum fc_rctl *r_ctl, u32 *did, | 107 | u32 fc_id, struct fc_frame *fp, |
108 | unsigned int op, enum fc_rctl *r_ctl, | ||
84 | enum fc_fh_type *fh_type) | 109 | enum fc_fh_type *fh_type) |
85 | { | 110 | { |
86 | struct fc_ct_req *ct; | 111 | struct fc_ct_req *ct; |
@@ -91,6 +116,11 @@ static inline int fc_ct_fill(struct fc_lport *lport, struct fc_frame *fp, | |||
91 | ct->payload.gid.fn_fc4_type = FC_TYPE_FCP; | 116 | ct->payload.gid.fn_fc4_type = FC_TYPE_FCP; |
92 | break; | 117 | break; |
93 | 118 | ||
119 | case FC_NS_GPN_ID: | ||
120 | ct = fc_ct_hdr_fill(fp, op, sizeof(struct fc_ns_fid)); | ||
121 | hton24(ct->payload.fid.fp_fid, fc_id); | ||
122 | break; | ||
123 | |||
94 | case FC_NS_RFT_ID: | 124 | case FC_NS_RFT_ID: |
95 | ct = fc_ct_hdr_fill(fp, op, sizeof(struct fc_ns_rft)); | 125 | ct = fc_ct_hdr_fill(fp, op, sizeof(struct fc_ns_rft)); |
96 | hton24(ct->payload.rft.fid.fp_fid, | 126 | hton24(ct->payload.rft.fid.fp_fid, |
@@ -110,7 +140,6 @@ static inline int fc_ct_fill(struct fc_lport *lport, struct fc_frame *fp, | |||
110 | return -EINVAL; | 140 | return -EINVAL; |
111 | } | 141 | } |
112 | *r_ctl = FC_RCTL_DD_UNSOL_CTL; | 142 | *r_ctl = FC_RCTL_DD_UNSOL_CTL; |
113 | *did = FC_FID_DIR_SERV; | ||
114 | *fh_type = FC_TYPE_CT; | 143 | *fh_type = FC_TYPE_CT; |
115 | return 0; | 144 | return 0; |
116 | } | 145 | } |
@@ -249,51 +278,42 @@ static inline void fc_scr_fill(struct fc_lport *lport, struct fc_frame *fp) | |||
249 | /** | 278 | /** |
250 | * fc_els_fill - Fill in an ELS request frame | 279 | * fc_els_fill - Fill in an ELS request frame |
251 | */ | 280 | */ |
252 | static inline int fc_els_fill(struct fc_lport *lport, struct fc_rport *rport, | 281 | static inline int fc_els_fill(struct fc_lport *lport, |
282 | u32 did, | ||
253 | struct fc_frame *fp, unsigned int op, | 283 | struct fc_frame *fp, unsigned int op, |
254 | enum fc_rctl *r_ctl, u32 *did, enum fc_fh_type *fh_type) | 284 | enum fc_rctl *r_ctl, enum fc_fh_type *fh_type) |
255 | { | 285 | { |
256 | switch (op) { | 286 | switch (op) { |
287 | case ELS_ADISC: | ||
288 | fc_adisc_fill(lport, fp); | ||
289 | break; | ||
290 | |||
257 | case ELS_PLOGI: | 291 | case ELS_PLOGI: |
258 | fc_plogi_fill(lport, fp, ELS_PLOGI); | 292 | fc_plogi_fill(lport, fp, ELS_PLOGI); |
259 | *did = rport->port_id; | ||
260 | break; | 293 | break; |
261 | 294 | ||
262 | case ELS_FLOGI: | 295 | case ELS_FLOGI: |
263 | fc_flogi_fill(lport, fp); | 296 | fc_flogi_fill(lport, fp); |
264 | *did = FC_FID_FLOGI; | ||
265 | break; | 297 | break; |
266 | 298 | ||
267 | case ELS_LOGO: | 299 | case ELS_LOGO: |
268 | fc_logo_fill(lport, fp); | 300 | fc_logo_fill(lport, fp); |
269 | *did = FC_FID_FLOGI; | ||
270 | /* | ||
271 | * if rport is valid then it | ||
272 | * is port logo, therefore | ||
273 | * set did to rport id. | ||
274 | */ | ||
275 | if (rport) | ||
276 | *did = rport->port_id; | ||
277 | break; | 301 | break; |
278 | 302 | ||
279 | case ELS_RTV: | 303 | case ELS_RTV: |
280 | fc_rtv_fill(lport, fp); | 304 | fc_rtv_fill(lport, fp); |
281 | *did = rport->port_id; | ||
282 | break; | 305 | break; |
283 | 306 | ||
284 | case ELS_REC: | 307 | case ELS_REC: |
285 | fc_rec_fill(lport, fp); | 308 | fc_rec_fill(lport, fp); |
286 | *did = rport->port_id; | ||
287 | break; | 309 | break; |
288 | 310 | ||
289 | case ELS_PRLI: | 311 | case ELS_PRLI: |
290 | fc_prli_fill(lport, fp); | 312 | fc_prli_fill(lport, fp); |
291 | *did = rport->port_id; | ||
292 | break; | 313 | break; |
293 | 314 | ||
294 | case ELS_SCR: | 315 | case ELS_SCR: |
295 | fc_scr_fill(lport, fp); | 316 | fc_scr_fill(lport, fp); |
296 | *did = FC_FID_FCTRL; | ||
297 | break; | 317 | break; |
298 | 318 | ||
299 | default: | 319 | default: |