diff options
author | Joe Eykholt <jeykholt@cisco.com> | 2009-11-03 14:49:27 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2009-12-04 13:01:20 -0500 |
commit | ab593b187391bdd03ccad2968972a2e118a88cd4 (patch) | |
tree | f1fb209ae42b19c6e9065ae8db37776c1bb39558 /drivers/scsi/libfc | |
parent | 78112e5558064cb4d2e355aed87b2036fcdfe3dd (diff) |
[SCSI] libfc: register FC4 features with the FC switch
Customers and certification tests have pointed out that we don't
show up on the switch management software as an initiator.
On some MDS switches 'show fcns database' command shows libfc
initiators as 'fcp' not 'fcp:init' like other initiators.
On others switches, I think the switch gets the features by doing a PRLI,
but it may be only certain models or under certain configurations.
Fix this by registering our FC4 features with the RFF_ID CT request
after local port login and after the RFT_ID.
Signed-off-by: Joe Eykholt <jeykholt@cisco.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_lport.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c index d3aec1959394..1bcc5e11d2c0 100644 --- a/drivers/scsi/libfc/fc_lport.c +++ b/drivers/scsi/libfc/fc_lport.c | |||
@@ -122,6 +122,7 @@ static const char *fc_lport_state_names[] = { | |||
122 | [LPORT_ST_RSNN_NN] = "RSNN_NN", | 122 | [LPORT_ST_RSNN_NN] = "RSNN_NN", |
123 | [LPORT_ST_RSPN_ID] = "RSPN_ID", | 123 | [LPORT_ST_RSPN_ID] = "RSPN_ID", |
124 | [LPORT_ST_RFT_ID] = "RFT_ID", | 124 | [LPORT_ST_RFT_ID] = "RFT_ID", |
125 | [LPORT_ST_RFF_ID] = "RFF_ID", | ||
125 | [LPORT_ST_SCR] = "SCR", | 126 | [LPORT_ST_SCR] = "SCR", |
126 | [LPORT_ST_READY] = "Ready", | 127 | [LPORT_ST_READY] = "Ready", |
127 | [LPORT_ST_LOGO] = "LOGO", | 128 | [LPORT_ST_LOGO] = "LOGO", |
@@ -1034,6 +1035,7 @@ static void fc_lport_error(struct fc_lport *lport, struct fc_frame *fp) | |||
1034 | case LPORT_ST_RSNN_NN: | 1035 | case LPORT_ST_RSNN_NN: |
1035 | case LPORT_ST_RSPN_ID: | 1036 | case LPORT_ST_RSPN_ID: |
1036 | case LPORT_ST_RFT_ID: | 1037 | case LPORT_ST_RFT_ID: |
1038 | case LPORT_ST_RFF_ID: | ||
1037 | case LPORT_ST_SCR: | 1039 | case LPORT_ST_SCR: |
1038 | case LPORT_ST_DNS: | 1040 | case LPORT_ST_DNS: |
1039 | case LPORT_ST_FLOGI: | 1041 | case LPORT_ST_FLOGI: |
@@ -1070,7 +1072,7 @@ static void fc_lport_ns_resp(struct fc_seq *sp, struct fc_frame *fp, | |||
1070 | 1072 | ||
1071 | mutex_lock(&lport->lp_mutex); | 1073 | mutex_lock(&lport->lp_mutex); |
1072 | 1074 | ||
1073 | if (lport->state < LPORT_ST_RNN_ID || lport->state > LPORT_ST_RFT_ID) { | 1075 | if (lport->state < LPORT_ST_RNN_ID || lport->state > LPORT_ST_RFF_ID) { |
1074 | FC_LPORT_DBG(lport, "Received a name server response, " | 1076 | FC_LPORT_DBG(lport, "Received a name server response, " |
1075 | "but in state %s\n", fc_lport_state(lport)); | 1077 | "but in state %s\n", fc_lport_state(lport)); |
1076 | if (IS_ERR(fp)) | 1078 | if (IS_ERR(fp)) |
@@ -1101,6 +1103,9 @@ static void fc_lport_ns_resp(struct fc_seq *sp, struct fc_frame *fp, | |||
1101 | fc_lport_enter_ns(lport, LPORT_ST_RFT_ID); | 1103 | fc_lport_enter_ns(lport, LPORT_ST_RFT_ID); |
1102 | break; | 1104 | break; |
1103 | case LPORT_ST_RFT_ID: | 1105 | case LPORT_ST_RFT_ID: |
1106 | fc_lport_enter_ns(lport, LPORT_ST_RFF_ID); | ||
1107 | break; | ||
1108 | case LPORT_ST_RFF_ID: | ||
1104 | fc_lport_enter_scr(lport); | 1109 | fc_lport_enter_scr(lport); |
1105 | break; | 1110 | break; |
1106 | default: | 1111 | default: |
@@ -1235,6 +1240,10 @@ static void fc_lport_enter_ns(struct fc_lport *lport, enum fc_lport_state state) | |||
1235 | cmd = FC_NS_RFT_ID; | 1240 | cmd = FC_NS_RFT_ID; |
1236 | size += sizeof(struct fc_ns_rft); | 1241 | size += sizeof(struct fc_ns_rft); |
1237 | break; | 1242 | break; |
1243 | case LPORT_ST_RFF_ID: | ||
1244 | cmd = FC_NS_RFF_ID; | ||
1245 | size += sizeof(struct fc_ns_rff_id); | ||
1246 | break; | ||
1238 | default: | 1247 | default: |
1239 | fc_lport_error(lport, NULL); | 1248 | fc_lport_error(lport, NULL); |
1240 | return; | 1249 | return; |
@@ -1317,6 +1326,7 @@ static void fc_lport_timeout(struct work_struct *work) | |||
1317 | case LPORT_ST_RSNN_NN: | 1326 | case LPORT_ST_RSNN_NN: |
1318 | case LPORT_ST_RSPN_ID: | 1327 | case LPORT_ST_RSPN_ID: |
1319 | case LPORT_ST_RFT_ID: | 1328 | case LPORT_ST_RFT_ID: |
1329 | case LPORT_ST_RFF_ID: | ||
1320 | fc_lport_enter_ns(lport, lport->state); | 1330 | fc_lport_enter_ns(lport, lport->state); |
1321 | break; | 1331 | break; |
1322 | case LPORT_ST_SCR: | 1332 | case LPORT_ST_SCR: |