aboutsummaryrefslogtreecommitdiffstats
path: root/include/scsi
diff options
context:
space:
mode:
authorChris Leech <christopher.leech@intel.com>2009-11-03 14:46:24 -0500
committerJames Bottomley <James.Bottomley@suse.de>2009-12-04 13:00:57 -0500
commitdb36c06cc6802d03bcba08982377f7c03a3cda7f (patch)
tree9a9ad60bd0de059f1839b8bab2cfc555d0ca56d1 /include/scsi
parent8faecddb212d502b1b77936498b9a82b13c4ff44 (diff)
[SCSI] libfc, libfcoe: FDISC ELS for NPIV
Add FDISC ELS handling to libfc and libfcoe, treat it the same as FLOGI where appropriate. Add checking for NPIV support in the FLOGI LS_ACC service parameters. Signed-off-by: Chris Leech <christopher.leech@intel.com> Signed-off-by: Robert Love <robert.w.love@intel.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'include/scsi')
-rw-r--r--include/scsi/fc/fc_els.h4
-rw-r--r--include/scsi/fc_encode.h29
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 */
208static 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;