diff options
author | James Smart <James.Smart@Emulex.Com> | 2009-06-10 17:22:56 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2009-06-15 11:09:33 -0400 |
commit | 0c2875893ef27b93d5d3221f8f98ae944d6be5fa (patch) | |
tree | 01e201e3827611c9b5cfc35a5f00b6532fc948ef /drivers/scsi/lpfc/lpfc_hbadisc.c | |
parent | f1126688805d77a4798b694439fa48bba6629388 (diff) |
[SCSI] lpfc 8.3.3 : FC/FCOE discovery fixes
Contains the following changes:
- Force vport to send LOGO to fabric controller when deleting vport
- Fixed driver failing to register login when a PLOGI is received
- Fixes for FIP discovery
- Added stricter checks for FCF addressing mode
- Added code to send only FLOGI, FDISC and LOGO to Fabric controller as FIP
- Fixed handling of LOGO from Fabric port
- Fixed consecutive link up events skipped link_down processing
Signed-off-by: James Smart <James.Smart@emulex.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_hbadisc.c')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_hbadisc.c | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index 35c41ae75be2..ed46b24a3380 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c | |||
@@ -1197,6 +1197,11 @@ lpfc_match_fcf_conn_list(struct lpfc_hba *phba, | |||
1197 | { | 1197 | { |
1198 | struct lpfc_fcf_conn_entry *conn_entry; | 1198 | struct lpfc_fcf_conn_entry *conn_entry; |
1199 | 1199 | ||
1200 | /* If FCF not available return 0 */ | ||
1201 | if (!bf_get(lpfc_fcf_record_fcf_avail, new_fcf_record) || | ||
1202 | !bf_get(lpfc_fcf_record_fcf_valid, new_fcf_record)) | ||
1203 | return 0; | ||
1204 | |||
1200 | if (!phba->cfg_enable_fip) { | 1205 | if (!phba->cfg_enable_fip) { |
1201 | *boot_flag = 0; | 1206 | *boot_flag = 0; |
1202 | *addr_mode = bf_get(lpfc_fcf_record_mac_addr_prov, | 1207 | *addr_mode = bf_get(lpfc_fcf_record_mac_addr_prov, |
@@ -1216,6 +1221,14 @@ lpfc_match_fcf_conn_list(struct lpfc_hba *phba, | |||
1216 | *boot_flag = 0; | 1221 | *boot_flag = 0; |
1217 | *addr_mode = bf_get(lpfc_fcf_record_mac_addr_prov, | 1222 | *addr_mode = bf_get(lpfc_fcf_record_mac_addr_prov, |
1218 | new_fcf_record); | 1223 | new_fcf_record); |
1224 | |||
1225 | /* | ||
1226 | * When there are no FCF connect entries, use driver's default | ||
1227 | * addressing mode - FPMA. | ||
1228 | */ | ||
1229 | if (*addr_mode & LPFC_FCF_FPMA) | ||
1230 | *addr_mode = LPFC_FCF_FPMA; | ||
1231 | |||
1219 | *vlan_id = 0xFFFF; | 1232 | *vlan_id = 0xFFFF; |
1220 | return 1; | 1233 | return 1; |
1221 | } | 1234 | } |
@@ -1241,6 +1254,14 @@ lpfc_match_fcf_conn_list(struct lpfc_hba *phba, | |||
1241 | } | 1254 | } |
1242 | 1255 | ||
1243 | /* | 1256 | /* |
1257 | * If connection record does not support any addressing mode, | ||
1258 | * skip the FCF record. | ||
1259 | */ | ||
1260 | if (!(bf_get(lpfc_fcf_record_mac_addr_prov, new_fcf_record) | ||
1261 | & (LPFC_FCF_FPMA | LPFC_FCF_SPMA))) | ||
1262 | continue; | ||
1263 | |||
1264 | /* | ||
1244 | * Check if the connection record specifies a required | 1265 | * Check if the connection record specifies a required |
1245 | * addressing mode. | 1266 | * addressing mode. |
1246 | */ | 1267 | */ |
@@ -1272,6 +1293,11 @@ lpfc_match_fcf_conn_list(struct lpfc_hba *phba, | |||
1272 | else | 1293 | else |
1273 | *boot_flag = 0; | 1294 | *boot_flag = 0; |
1274 | 1295 | ||
1296 | /* | ||
1297 | * If user did not specify any addressing mode, or if the | ||
1298 | * prefered addressing mode specified by user is not supported | ||
1299 | * by FCF, allow fabric to pick the addressing mode. | ||
1300 | */ | ||
1275 | *addr_mode = bf_get(lpfc_fcf_record_mac_addr_prov, | 1301 | *addr_mode = bf_get(lpfc_fcf_record_mac_addr_prov, |
1276 | new_fcf_record); | 1302 | new_fcf_record); |
1277 | /* | 1303 | /* |
@@ -1297,12 +1323,6 @@ lpfc_match_fcf_conn_list(struct lpfc_hba *phba, | |||
1297 | !(conn_entry->conn_rec.flags & FCFCNCT_AM_SPMA) && | 1323 | !(conn_entry->conn_rec.flags & FCFCNCT_AM_SPMA) && |
1298 | (*addr_mode & LPFC_FCF_FPMA)) | 1324 | (*addr_mode & LPFC_FCF_FPMA)) |
1299 | *addr_mode = LPFC_FCF_FPMA; | 1325 | *addr_mode = LPFC_FCF_FPMA; |
1300 | /* | ||
1301 | * If user did not specify any addressing mode, use FPMA if | ||
1302 | * possible else use SPMA. | ||
1303 | */ | ||
1304 | else if (*addr_mode & LPFC_FCF_FPMA) | ||
1305 | *addr_mode = LPFC_FCF_FPMA; | ||
1306 | 1326 | ||
1307 | if (conn_entry->conn_rec.flags & FCFCNCT_VLAN_VALID) | 1327 | if (conn_entry->conn_rec.flags & FCFCNCT_VLAN_VALID) |
1308 | *vlan_id = conn_entry->conn_rec.vlan_tag; | 1328 | *vlan_id = conn_entry->conn_rec.vlan_tag; |
@@ -1864,7 +1884,7 @@ lpfc_mbx_cmpl_read_la(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) | |||
1864 | vport->fc_flag &= ~FC_BYPASSED_MODE; | 1884 | vport->fc_flag &= ~FC_BYPASSED_MODE; |
1865 | spin_unlock_irq(shost->host_lock); | 1885 | spin_unlock_irq(shost->host_lock); |
1866 | 1886 | ||
1867 | if (((phba->fc_eventTag + 1) < la->eventTag) || | 1887 | if ((phba->fc_eventTag < la->eventTag) || |
1868 | (phba->fc_eventTag == la->eventTag)) { | 1888 | (phba->fc_eventTag == la->eventTag)) { |
1869 | phba->fc_stat.LinkMultiEvent++; | 1889 | phba->fc_stat.LinkMultiEvent++; |
1870 | if (la->attType == AT_LINK_UP) | 1890 | if (la->attType == AT_LINK_UP) |
@@ -2925,6 +2945,7 @@ lpfc_unreg_rpi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) | |||
2925 | lpfc_no_rpi(phba, ndlp); | 2945 | lpfc_no_rpi(phba, ndlp); |
2926 | ndlp->nlp_rpi = 0; | 2946 | ndlp->nlp_rpi = 0; |
2927 | ndlp->nlp_flag &= ~NLP_RPI_VALID; | 2947 | ndlp->nlp_flag &= ~NLP_RPI_VALID; |
2948 | ndlp->nlp_flag &= ~NLP_NPR_ADISC; | ||
2928 | return 1; | 2949 | return 1; |
2929 | } | 2950 | } |
2930 | return 0; | 2951 | return 0; |