diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/scsi/fc/fc_els.h | 4 | ||||
-rw-r--r-- | include/scsi/fc_encode.h | 29 |
2 files changed, 32 insertions, 1 deletions
diff --git a/include/scsi/fc/fc_els.h b/include/scsi/fc/fc_els.h index 195ca014d3ce..b0872afe2d30 100644 --- a/include/scsi/fc/fc_els.h +++ b/include/scsi/fc/fc_els.h | |||
@@ -248,10 +248,12 @@ struct fc_els_csp { | |||
248 | /* | 248 | /* |
249 | * sp_features | 249 | * sp_features |
250 | */ | 250 | */ |
251 | #define FC_SP_FT_CIRO 0x8000 /* continuously increasing rel. off. */ | 251 | #define FC_SP_FT_NPIV 0x8000 /* multiple N_Port_ID support (FLOGI) */ |
252 | #define FC_SP_FT_CIRO 0x8000 /* continuously increasing rel off (PLOGI) */ | ||
252 | #define FC_SP_FT_CLAD 0x8000 /* clean address (in FLOGI LS_ACC) */ | 253 | #define FC_SP_FT_CLAD 0x8000 /* clean address (in FLOGI LS_ACC) */ |
253 | #define FC_SP_FT_RAND 0x4000 /* random relative offset */ | 254 | #define FC_SP_FT_RAND 0x4000 /* random relative offset */ |
254 | #define FC_SP_FT_VAL 0x2000 /* valid vendor version level */ | 255 | #define FC_SP_FT_VAL 0x2000 /* valid vendor version level */ |
256 | #define FC_SP_FT_NPIV_ACC 0x2000 /* NPIV assignment (FLOGI LS_ACC) */ | ||
255 | #define FC_SP_FT_FPORT 0x1000 /* F port (1) vs. N port (0) */ | 257 | #define FC_SP_FT_FPORT 0x1000 /* F port (1) vs. N port (0) */ |
256 | #define FC_SP_FT_ABB 0x0800 /* alternate BB_credit management */ | 258 | #define FC_SP_FT_ABB 0x0800 /* alternate BB_credit management */ |
257 | #define FC_SP_FT_EDTR 0x0400 /* E_D_TOV Resolution is nanoseconds */ | 259 | #define FC_SP_FT_EDTR 0x0400 /* E_D_TOV Resolution is nanoseconds */ |
diff --git a/include/scsi/fc_encode.h b/include/scsi/fc_encode.h index 27dad703824f..c93ca3ece1a0 100644 --- a/include/scsi/fc_encode.h +++ b/include/scsi/fc_encode.h | |||
@@ -198,6 +198,31 @@ static inline void fc_flogi_fill(struct fc_lport *lport, struct fc_frame *fp) | |||
198 | sp->sp_bb_data = htons((u16) lport->mfs); | 198 | sp->sp_bb_data = htons((u16) lport->mfs); |
199 | cp = &flogi->fl_cssp[3 - 1]; /* class 3 parameters */ | 199 | cp = &flogi->fl_cssp[3 - 1]; /* class 3 parameters */ |
200 | cp->cp_class = htons(FC_CPC_VALID | FC_CPC_SEQ); | 200 | cp->cp_class = htons(FC_CPC_VALID | FC_CPC_SEQ); |
201 | if (lport->does_npiv) | ||
202 | sp->sp_features = htons(FC_SP_FT_NPIV); | ||
203 | } | ||
204 | |||
205 | /** | ||
206 | * fc_fdisc_fill - Fill in a fdisc request frame. | ||
207 | */ | ||
208 | static inline void fc_fdisc_fill(struct fc_lport *lport, struct fc_frame *fp) | ||
209 | { | ||
210 | struct fc_els_csp *sp; | ||
211 | struct fc_els_cssp *cp; | ||
212 | struct fc_els_flogi *fdisc; | ||
213 | |||
214 | fdisc = fc_frame_payload_get(fp, sizeof(*fdisc)); | ||
215 | memset(fdisc, 0, sizeof(*fdisc)); | ||
216 | fdisc->fl_cmd = (u8) ELS_FDISC; | ||
217 | put_unaligned_be64(lport->wwpn, &fdisc->fl_wwpn); | ||
218 | put_unaligned_be64(lport->wwnn, &fdisc->fl_wwnn); | ||
219 | sp = &fdisc->fl_csp; | ||
220 | sp->sp_hi_ver = 0x20; | ||
221 | sp->sp_lo_ver = 0x20; | ||
222 | sp->sp_bb_cred = htons(10); /* this gets set by gateway */ | ||
223 | sp->sp_bb_data = htons((u16) lport->mfs); | ||
224 | cp = &fdisc->fl_cssp[3 - 1]; /* class 3 parameters */ | ||
225 | cp->cp_class = htons(FC_CPC_VALID | FC_CPC_SEQ); | ||
201 | } | 226 | } |
202 | 227 | ||
203 | /** | 228 | /** |
@@ -296,6 +321,10 @@ static inline int fc_els_fill(struct fc_lport *lport, | |||
296 | fc_flogi_fill(lport, fp); | 321 | fc_flogi_fill(lport, fp); |
297 | break; | 322 | break; |
298 | 323 | ||
324 | case ELS_FDISC: | ||
325 | fc_fdisc_fill(lport, fp); | ||
326 | break; | ||
327 | |||
299 | case ELS_LOGO: | 328 | case ELS_LOGO: |
300 | fc_logo_fill(lport, fp); | 329 | fc_logo_fill(lport, fp); |
301 | break; | 330 | break; |