diff options
author | James Smart <James.Smart@Emulex.Com> | 2007-10-27 13:37:53 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-01-11 19:22:33 -0500 |
commit | a8adb83208020c913f010cb4e26d09e25300db8e (patch) | |
tree | 2245ca9f0dba5139946c99d45b80e7f2ce324b74 /drivers/scsi/lpfc/lpfc_init.c | |
parent | 87af33fe5f78c27cf9e43c6e586dd6efd4be3e40 (diff) |
[SCSI] lpfc 8.2.3 : Miscellaneous Small Fixes - part 2
Miscellaneous Small Fixes - part 2
- Fix ndlp left in PLOGI state after link up
- Fix cannot rcv unsol ELS frames after running HBA resets for a few minutes
- Fix HBQ buffer_count implemention
- Fix RPI leak
- Fix crash while deleting vports while HBA is reset
- Revert the FCP Fbits offset back to 7
- Fix panic when deleting vports
- Remove unused code in switch statement outside of a case
- Reject PLOGI from invalid PName or NName of 0
- Ignore PLOGI responses from WWPName or WWNName of 0
- Fix debugfs hbqinfo display for ppc
- Added 8G to list of supported speeds for sysfs parameter
- Defer ndlp cleanup to dev-loss timeout handler
- Added support for WRITE_VPARMS mailbox command by applications
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_init.c')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_init.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index ceb185fa3216..db96f7504a14 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c | |||
@@ -1339,6 +1339,7 @@ lpfc_cleanup(struct lpfc_vport *vport) | |||
1339 | { | 1339 | { |
1340 | struct lpfc_hba *phba = vport->phba; | 1340 | struct lpfc_hba *phba = vport->phba; |
1341 | struct lpfc_nodelist *ndlp, *next_ndlp; | 1341 | struct lpfc_nodelist *ndlp, *next_ndlp; |
1342 | int i = 0; | ||
1342 | 1343 | ||
1343 | if (phba->link_state > LPFC_LINK_DOWN) | 1344 | if (phba->link_state > LPFC_LINK_DOWN) |
1344 | lpfc_port_link_failure(vport); | 1345 | lpfc_port_link_failure(vport); |
@@ -1351,17 +1352,20 @@ lpfc_cleanup(struct lpfc_vport *vport) | |||
1351 | NLP_EVT_DEVICE_RM); | 1352 | NLP_EVT_DEVICE_RM); |
1352 | } | 1353 | } |
1353 | 1354 | ||
1354 | /* At this point, ALL ndlp's should be gone */ | 1355 | /* At this point, ALL ndlp's should be gone |
1356 | * because of the previous NLP_EVT_DEVICE_RM. | ||
1357 | * Lets wait for this to happen, if needed. | ||
1358 | */ | ||
1355 | while (!list_empty(&vport->fc_nodes)) { | 1359 | while (!list_empty(&vport->fc_nodes)) { |
1356 | 1360 | ||
1357 | list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, | 1361 | if (i++ > 3000) { |
1358 | nlp_listp) { | ||
1359 | lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY, | 1362 | lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY, |
1360 | "0233 Nodelist x%x not free: %d\n", | 1363 | "0233 Nodelist not empty\n"); |
1361 | ndlp->nlp_DID, | 1364 | break; |
1362 | atomic_read(&ndlp->kref.refcount)); | ||
1363 | lpfc_drop_node(vport, ndlp); | ||
1364 | } | 1365 | } |
1366 | |||
1367 | /* Wait for any activity on ndlps to settle */ | ||
1368 | msleep(10); | ||
1365 | } | 1369 | } |
1366 | return; | 1370 | return; |
1367 | } | 1371 | } |
@@ -1499,6 +1503,8 @@ lpfc_offline_prep(struct lpfc_hba * phba) | |||
1499 | for(i = 0; i < LPFC_MAX_VPORTS && vports[i] != NULL; i++) { | 1503 | for(i = 0; i < LPFC_MAX_VPORTS && vports[i] != NULL; i++) { |
1500 | struct Scsi_Host *shost; | 1504 | struct Scsi_Host *shost; |
1501 | 1505 | ||
1506 | if (vports[i]->load_flag & FC_UNLOADING) | ||
1507 | continue; | ||
1502 | shost = lpfc_shost_from_vport(vports[i]); | 1508 | shost = lpfc_shost_from_vport(vports[i]); |
1503 | list_for_each_entry_safe(ndlp, next_ndlp, | 1509 | list_for_each_entry_safe(ndlp, next_ndlp, |
1504 | &vports[i]->fc_nodes, | 1510 | &vports[i]->fc_nodes, |
@@ -1771,6 +1777,8 @@ void lpfc_host_attrib_init(struct Scsi_Host *shost) | |||
1771 | fc_host_supported_speeds(shost) = 0; | 1777 | fc_host_supported_speeds(shost) = 0; |
1772 | if (phba->lmt & LMT_10Gb) | 1778 | if (phba->lmt & LMT_10Gb) |
1773 | fc_host_supported_speeds(shost) |= FC_PORTSPEED_10GBIT; | 1779 | fc_host_supported_speeds(shost) |= FC_PORTSPEED_10GBIT; |
1780 | if (phba->lmt & LMT_8Gb) | ||
1781 | fc_host_supported_speeds(shost) |= FC_PORTSPEED_8GBIT; | ||
1774 | if (phba->lmt & LMT_4Gb) | 1782 | if (phba->lmt & LMT_4Gb) |
1775 | fc_host_supported_speeds(shost) |= FC_PORTSPEED_4GBIT; | 1783 | fc_host_supported_speeds(shost) |= FC_PORTSPEED_4GBIT; |
1776 | if (phba->lmt & LMT_2Gb) | 1784 | if (phba->lmt & LMT_2Gb) |