All of lore.kernel.org
 help / color / mirror / Atom feed
From: Robert Love <robert.w.love@intel.com>
To: James.Bottomley@HansenPartnership.com, linux-scsi@vger.kernel.org
Cc: Chris Leech <christopher.leech@intel.com>,
	Robert Love <robert.w.love@intel.com>
Subject: [PATCH 13/35] libfc, libfcoe: FDISC ELS for NPIV
Date: Fri, 11 Sep 2009 16:58:04 -0700	[thread overview]
Message-ID: <20090911235804.27223.76844.stgit@localhost.localdomain> (raw)
In-Reply-To: <20090911235655.27223.69728.stgit@localhost.localdomain>

From: Chris Leech <christopher.leech@intel.com>

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>
---

 drivers/scsi/fcoe/libfcoe.c   |    6 +++---
 drivers/scsi/libfc/fc_lport.c |    6 +++++-
 include/scsi/fc/fc_els.h      |    4 +++-
 include/scsi/fc_encode.h      |   29 +++++++++++++++++++++++++++++
 4 files changed, 40 insertions(+), 5 deletions(-)

diff --git a/drivers/scsi/fcoe/libfcoe.c b/drivers/scsi/fcoe/libfcoe.c
index 62a4c20..8d2e5aa 100644
--- a/drivers/scsi/fcoe/libfcoe.c
+++ b/drivers/scsi/fcoe/libfcoe.c
@@ -450,7 +450,7 @@ static int fcoe_ctlr_encaps(struct fcoe_ctlr *fip,
 	memset(mac, 0, sizeof(mac));
 	mac->fd_desc.fip_dtype = FIP_DT_MAC;
 	mac->fd_desc.fip_dlen = sizeof(*mac) / FIP_BPW;
-	if (dtype != FIP_DT_FLOGI)
+	if (dtype != FIP_DT_FLOGI && dtype != FIP_DT_FDISC)
 		memcpy(mac->fd_mac, fip->data_src_addr, ETH_ALEN);
 	else if (fip->spma)
 		memcpy(mac->fd_mac, fip->ctl_src_addr, ETH_ALEN);
@@ -866,8 +866,8 @@ static void fcoe_ctlr_recv_els(struct fcoe_ctlr *fip, struct sk_buff *skb)
 		goto drop;
 	els_op = *(u8 *)(fh + 1);
 
-	if (els_dtype == FIP_DT_FLOGI && sub == FIP_SC_REP &&
-	    fip->flogi_oxid == ntohs(fh->fh_ox_id) &&
+	if ((els_dtype == FIP_DT_FLOGI || els_dtype == FIP_DT_FDISC) &&
+	    sub == FIP_SC_REP && fip->flogi_oxid == ntohs(fh->fh_ox_id) &&
 	    els_op == ELS_LS_ACC && is_valid_ether_addr(granted_mac)) {
 		fip->flogi_oxid = FC_XID_UNKNOWN;
 		fip->update_mac(fip, fip->data_src_addr, granted_mac);
diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c
index 2729e60..dd6a1db 100644
--- a/drivers/scsi/libfc/fc_lport.c
+++ b/drivers/scsi/libfc/fc_lport.c
@@ -1446,6 +1446,9 @@ static void fc_lport_flogi_resp(struct fc_seq *sp, struct fc_frame *fp,
 			e_d_tov = ntohl(flp->fl_csp.sp_e_d_tov);
 			if (csp_flags & FC_SP_FT_EDTR)
 				e_d_tov /= 1000000;
+
+			lport->npiv_enabled = !!(csp_flags & FC_SP_FT_NPIV_ACC);
+
 			if ((csp_flags & FC_SP_FT_FPORT) == 0) {
 				if (e_d_tov > lport->e_d_tov)
 					lport->e_d_tov = e_d_tov;
@@ -1495,7 +1498,8 @@ void fc_lport_enter_flogi(struct fc_lport *lport)
 	if (!fp)
 		return fc_lport_error(lport, fp);
 
-	if (!lport->tt.elsct_send(lport, FC_FID_FLOGI, fp, ELS_FLOGI,
+	if (!lport->tt.elsct_send(lport, FC_FID_FLOGI, fp,
+				  lport->vport ? ELS_FDISC : ELS_FLOGI,
 				  fc_lport_flogi_resp, lport, lport->e_d_tov))
 		fc_lport_error(lport, fp);
 }
diff --git a/include/scsi/fc/fc_els.h b/include/scsi/fc/fc_els.h
index 195ca01..b0872af 100644
--- a/include/scsi/fc/fc_els.h
+++ b/include/scsi/fc/fc_els.h
@@ -248,10 +248,12 @@ struct fc_els_csp {
 /*
  * sp_features
  */
-#define	FC_SP_FT_CIRO	0x8000	/* continuously increasing rel. off. */
+#define	FC_SP_FT_NPIV	0x8000	/* multiple N_Port_ID support (FLOGI) */
+#define	FC_SP_FT_CIRO	0x8000	/* continuously increasing rel off (PLOGI) */
 #define	FC_SP_FT_CLAD	0x8000	/* clean address (in FLOGI LS_ACC) */
 #define	FC_SP_FT_RAND	0x4000	/* random relative offset */
 #define	FC_SP_FT_VAL	0x2000	/* valid vendor version level */
+#define	FC_SP_FT_NPIV_ACC	0x2000	/* NPIV assignment (FLOGI LS_ACC) */
 #define	FC_SP_FT_FPORT	0x1000	/* F port (1) vs. N port (0) */
 #define	FC_SP_FT_ABB	0x0800	/* alternate BB_credit management */
 #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 27dad70..c93ca3e 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)
 	sp->sp_bb_data = htons((u16) lport->mfs);
 	cp = &flogi->fl_cssp[3 - 1];	/* class 3 parameters */
 	cp->cp_class = htons(FC_CPC_VALID | FC_CPC_SEQ);
+	if (lport->does_npiv)
+		sp->sp_features = htons(FC_SP_FT_NPIV);
+}
+
+/**
+ * fc_fdisc_fill - Fill in a fdisc request frame.
+ */
+static inline void fc_fdisc_fill(struct fc_lport *lport, struct fc_frame *fp)
+{
+	struct fc_els_csp *sp;
+	struct fc_els_cssp *cp;
+	struct fc_els_flogi *fdisc;
+
+	fdisc = fc_frame_payload_get(fp, sizeof(*fdisc));
+	memset(fdisc, 0, sizeof(*fdisc));
+	fdisc->fl_cmd = (u8) ELS_FDISC;
+	put_unaligned_be64(lport->wwpn, &fdisc->fl_wwpn);
+	put_unaligned_be64(lport->wwnn, &fdisc->fl_wwnn);
+	sp = &fdisc->fl_csp;
+	sp->sp_hi_ver = 0x20;
+	sp->sp_lo_ver = 0x20;
+	sp->sp_bb_cred = htons(10);	/* this gets set by gateway */
+	sp->sp_bb_data = htons((u16) lport->mfs);
+	cp = &fdisc->fl_cssp[3 - 1];	/* class 3 parameters */
+	cp->cp_class = htons(FC_CPC_VALID | FC_CPC_SEQ);
 }
 
 /**
@@ -296,6 +321,10 @@ static inline int fc_els_fill(struct fc_lport *lport,
 		fc_flogi_fill(lport, fp);
 		break;
 
+	case ELS_FDISC:
+		fc_fdisc_fill(lport, fp);
+		break;
+
 	case ELS_LOGO:
 		fc_logo_fill(lport, fp);
 		break;


  parent reply	other threads:[~2009-09-11 23:58 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-09-11 23:56 [PATCH 00/35] libfc, libfcoe and fcoe updates for 2.6.32 Robert Love
2009-09-11 23:57 ` [PATCH 01/35] libfc: fix typo in retry check on received PRLI Robert Love
2009-09-11 23:57 ` [PATCH 02/35] fcoe: Increase FCOE_MAX_LUN to 0xFFFF (65535) Robert Love
2009-09-11 23:57 ` [PATCH 03/35] libfc: Move non-common routines and prototypes out of libfc.h Robert Love
2009-09-11 23:57 ` [PATCH 04/35] libfc: Remove fc_fcp_complete Robert Love
2009-09-11 23:57 ` [PATCH 05/35] libfc: Add libfc/fc_libfc.[ch] for libfc internal routines Robert Love
2009-09-11 23:57 ` [PATCH 06/35] libfc: Move libfc_init and libfc_exit to fc_libfc.c Robert Love
2009-09-11 23:57 ` [PATCH 07/35] libfc: fix ddp in fc_fcp for 0 xid Robert Love
2009-09-11 23:57 ` [PATCH 08/35] fcoe: remove redundant checking of netdev->netdev_ops Robert Love
2009-09-11 23:57 ` [PATCH 09/35] libfc, fcoe: fixes for highmem skb linearize panics Robert Love
2009-09-11 23:57 ` [PATCH 10/35] libfc: changes to libfc_host_alloc to consolidate initialization with allocation Robert Love
2009-09-11 23:57 ` [PATCH 11/35] libfc: add some generic NPIV support routines to libfc Robert Love
2009-09-11 23:57 ` [PATCH 12/35] libfc: vport link handling and fc_vport state managment Robert Love
2009-09-11 23:58 ` Robert Love [this message]
2009-09-11 23:58 ` [PATCH 14/35] libfcoe, fcoe: libfcoe NPIV support Robert Love
2009-09-11 23:58 ` [PATCH 15/35] fcoe: add a separate scsi transport template for NPIV vports Robert Love
2009-09-11 23:58 ` [PATCH 16/35] fcoe: NPIV vport create/destroy Robert Love
2009-09-11 23:58 ` [PATCH 17/35] libfc: RPN_ID is obsolete and unnecessary Robert Love
2009-09-11 23:58 ` [PATCH 18/35] libfc: RNN_ID may be required before RSNN_NN with some switches Robert Love
2009-09-11 23:58 ` [PATCH 19/35] libfc: Register Symbolic Node Name (RSNN_NN) Robert Love
2009-09-11 23:58 ` [PATCH 20/35] libfc: Register Symbolic Port Name (RSPN_ID) Robert Love
2009-09-11 23:58 ` [PATCH 21/35] libfc: combine name server registration response handlers Robert Love
2009-09-11 23:58 ` [PATCH 22/35] libfc: combine name server registration request functions Robert Love
2009-09-11 23:58 ` [PATCH 23/35] fcoe: vport symbolic name support Robert Love
2009-09-11 23:59 ` [PATCH 24/35] libfc: Export FC headers Robert Love
2009-09-11 23:59 ` [PATCH 25/35] libfc: Add routine to copy data from a buffer to a SG list Robert Love
2009-09-11 23:59 ` [PATCH 26/35] libfc, fcoe: Add FC passthrough support Robert Love
2009-09-11 23:59 ` [PATCH 27/35] libfc, fcoe: Don't EXPORT_SYMBOLS unnecessarily Robert Love
2009-09-11 23:59 ` [PATCH 28/35] libfc: Remove unused fc_lport pointer from fc_fcp_pkt_abort Robert Love
2009-09-11 23:59 ` [PATCH 29/35] libfc: Formatting cleanups across libfc Robert Love
2009-09-11 23:59 ` [PATCH 30/35] libfcoe: formatting and comment cleanups Robert Love
2009-09-11 23:59 ` [PATCH 31/35] fcoe: Formatting cleanups and commenting Robert Love
2009-09-11 23:59 ` [PATCH 32/35] libfc: Fix wrong scsi return status under FC_DATA_UNDRUN Robert Love
2009-09-11 23:59 ` [PATCH 33/35] fcoe, libfc: use single frame allocation API Robert Love
2009-09-12  0:00 ` [PATCH 34/35] libfc: reduce can_queue for all FCP frame allocation failures Robert Love
2009-09-12  0:00 ` [PATCH 35/35] libfc: adds can_queue ramp up Robert Love
2009-09-14 17:18   ` Mike Christie
2009-09-14 23:23     ` Vasu Dev

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20090911235804.27223.76844.stgit@localhost.localdomain \
    --to=robert.w.love@intel.com \
    --cc=James.Bottomley@HansenPartnership.com \
    --cc=christopher.leech@intel.com \
    --cc=linux-scsi@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.