aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/libfc
diff options
context:
space:
mode:
authorChris Leech <christopher.leech@intel.com>2009-11-03 14:46:29 -0500
committerJames Bottomley <James.Bottomley@suse.de>2009-12-04 13:00:58 -0500
commit11b561886643d4e23d0fd58c205d830a448dd0a2 (patch)
tree3d28650e6727589dd672ea3985d2aa2643a99549 /drivers/scsi/libfc
parentdb36c06cc6802d03bcba08982377f7c03a3cda7f (diff)
[SCSI] libfcoe, fcoe: libfcoe NPIV support
The FIP code in libfcoe needed several changes to support NPIV 1) dst_src_addr needs to be managed per-n_port-ID for FPMA fabrics with NPIV enabled. Managing the MAC address is now handled in fcoe, with some slight changes to update_mac() and a new get_src_addr() function pointer. 2) The libfc elsct_send() hook is used to setup FCoE specific response handlers for FIP encapsulated ELS exchanges. This lets the FCoE specific handling know which VN_Port the exchange is for, and doesn't require tracking OX_IDs. It might be possible to roll back to the full FIP frame in these, but for now I've just stashed the contents of the MAC address descriptor in the skb context block for later use. Also, because fcoe_elsct_send() just passes control on to fc_elsct_send(), all transmits still come through the normal frame_send() path. 3) The NPIV changes added a mutex hold in the keep alive sending, the lport mutex is protecting the vport list. We can't take a mutex from a timer, so move the FIP keep alive logic to the link work struct. 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 'drivers/scsi/libfc')
-rw-r--r--drivers/scsi/libfc/fc_elsct.c3
-rw-r--r--drivers/scsi/libfc/fc_lport.c6
2 files changed, 6 insertions, 3 deletions
diff --git a/drivers/scsi/libfc/fc_elsct.c b/drivers/scsi/libfc/fc_elsct.c
index 92984587ff4d..aae54fe3b299 100644
--- a/drivers/scsi/libfc/fc_elsct.c
+++ b/drivers/scsi/libfc/fc_elsct.c
@@ -31,7 +31,7 @@
31/* 31/*
32 * fc_elsct_send - sends ELS/CT frame 32 * fc_elsct_send - sends ELS/CT frame
33 */ 33 */
34static struct fc_seq *fc_elsct_send(struct fc_lport *lport, 34struct fc_seq *fc_elsct_send(struct fc_lport *lport,
35 u32 did, 35 u32 did,
36 struct fc_frame *fp, 36 struct fc_frame *fp,
37 unsigned int op, 37 unsigned int op,
@@ -63,6 +63,7 @@ static struct fc_seq *fc_elsct_send(struct fc_lport *lport,
63 63
64 return lport->tt.exch_seq_send(lport, fp, resp, NULL, arg, timer_msec); 64 return lport->tt.exch_seq_send(lport, fp, resp, NULL, arg, timer_msec);
65} 65}
66EXPORT_SYMBOL(fc_elsct_send);
66 67
67int fc_elsct_init(struct fc_lport *lport) 68int fc_elsct_init(struct fc_lport *lport)
68{ 69{
diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c
index ccba67ca68a1..807f5b3e4efe 100644
--- a/drivers/scsi/libfc/fc_lport.c
+++ b/drivers/scsi/libfc/fc_lport.c
@@ -1320,7 +1320,7 @@ static void fc_lport_timeout(struct work_struct *work)
1320 * held, but it will lock, call an _enter_* function or fc_lport_error 1320 * held, but it will lock, call an _enter_* function or fc_lport_error
1321 * and then unlock the lport. 1321 * and then unlock the lport.
1322 */ 1322 */
1323static void fc_lport_logo_resp(struct fc_seq *sp, struct fc_frame *fp, 1323void fc_lport_logo_resp(struct fc_seq *sp, struct fc_frame *fp,
1324 void *lp_arg) 1324 void *lp_arg)
1325{ 1325{
1326 struct fc_lport *lport = lp_arg; 1326 struct fc_lport *lport = lp_arg;
@@ -1357,6 +1357,7 @@ out:
1357err: 1357err:
1358 mutex_unlock(&lport->lp_mutex); 1358 mutex_unlock(&lport->lp_mutex);
1359} 1359}
1360EXPORT_SYMBOL(fc_lport_logo_resp);
1360 1361
1361/** 1362/**
1362 * fc_rport_enter_logo() - Logout of the fabric 1363 * fc_rport_enter_logo() - Logout of the fabric
@@ -1397,7 +1398,7 @@ static void fc_lport_enter_logo(struct fc_lport *lport)
1397 * held, but it will lock, call an _enter_* function or fc_lport_error 1398 * held, but it will lock, call an _enter_* function or fc_lport_error
1398 * and then unlock the lport. 1399 * and then unlock the lport.
1399 */ 1400 */
1400static void fc_lport_flogi_resp(struct fc_seq *sp, struct fc_frame *fp, 1401void fc_lport_flogi_resp(struct fc_seq *sp, struct fc_frame *fp,
1401 void *lp_arg) 1402 void *lp_arg)
1402{ 1403{
1403 struct fc_lport *lport = lp_arg; 1404 struct fc_lport *lport = lp_arg;
@@ -1480,6 +1481,7 @@ out:
1480err: 1481err:
1481 mutex_unlock(&lport->lp_mutex); 1482 mutex_unlock(&lport->lp_mutex);
1482} 1483}
1484EXPORT_SYMBOL(fc_lport_flogi_resp);
1483 1485
1484/** 1486/**
1485 * fc_rport_enter_flogi() - Send a FLOGI request to the fabric manager 1487 * fc_rport_enter_flogi() - Send a FLOGI request to the fabric manager