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;
next prev 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox