aboutsummaryrefslogtreecommitdiffstats
path: root/include/scsi/fc_encode.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/scsi/fc_encode.h')
-rw-r--r--include/scsi/fc_encode.h60
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 */
65static 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 */
82static inline int fc_ct_fill(struct fc_lport *lport, struct fc_frame *fp, 106static 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 */
252static inline int fc_els_fill(struct fc_lport *lport, struct fc_rport *rport, 281static 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: