diff options
author | James Smart <James.Smart@Emulex.Com> | 2009-10-02 15:16:39 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2009-12-04 13:01:39 -0500 |
commit | 4d9ab994e214d35107017c342aca42477b137316 (patch) | |
tree | 0ee7dd76ce9938eceeac20e4dab287194dc42c41 /drivers/scsi/lpfc/lpfc_init.c | |
parent | 1796e72291b2b6aafaec5954e666d0b5a95da935 (diff) |
[SCSI] lpfc 8.3.5: fix reset path, ELS ordering and discovery issues
This patch includes the following fixes:
- Fixed panic during HBA reset.
- Fixed FCoE event tag passed in resume_rpi.
- Fix out of order ELS commands
- Fixed discovery issues found during VLAN testing.
- Fix UNREG_VPI failure on extended link pull
- Fixed crash while processing unsolicited FC frames.
- Clear retry count in the delayed ELS handler
- Fixed discovery failure during quick link bounce.
Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_init.c')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_init.c | 51 |
1 files changed, 8 insertions, 43 deletions
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index f913f1e93635..d654c0e3db4d 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c | |||
@@ -2919,6 +2919,7 @@ lpfc_sli4_async_fcoe_evt(struct lpfc_hba *phba, | |||
2919 | uint8_t event_type = bf_get(lpfc_acqe_fcoe_event_type, acqe_fcoe); | 2919 | uint8_t event_type = bf_get(lpfc_acqe_fcoe_event_type, acqe_fcoe); |
2920 | int rc; | 2920 | int rc; |
2921 | 2921 | ||
2922 | phba->fc_eventTag = acqe_fcoe->event_tag; | ||
2922 | phba->fcoe_eventtag = acqe_fcoe->event_tag; | 2923 | phba->fcoe_eventtag = acqe_fcoe->event_tag; |
2923 | switch (event_type) { | 2924 | switch (event_type) { |
2924 | case LPFC_FCOE_EVENT_TYPE_NEW_FCF: | 2925 | case LPFC_FCOE_EVENT_TYPE_NEW_FCF: |
@@ -2990,6 +2991,7 @@ static void | |||
2990 | lpfc_sli4_async_dcbx_evt(struct lpfc_hba *phba, | 2991 | lpfc_sli4_async_dcbx_evt(struct lpfc_hba *phba, |
2991 | struct lpfc_acqe_dcbx *acqe_dcbx) | 2992 | struct lpfc_acqe_dcbx *acqe_dcbx) |
2992 | { | 2993 | { |
2994 | phba->fc_eventTag = acqe_dcbx->event_tag; | ||
2993 | lpfc_printf_log(phba, KERN_ERR, LOG_SLI, | 2995 | lpfc_printf_log(phba, KERN_ERR, LOG_SLI, |
2994 | "0290 The SLI4 DCBX asynchronous event is not " | 2996 | "0290 The SLI4 DCBX asynchronous event is not " |
2995 | "handled yet\n"); | 2997 | "handled yet\n"); |
@@ -3594,8 +3596,10 @@ lpfc_sli4_driver_resource_unset(struct lpfc_hba *phba) | |||
3594 | 3596 | ||
3595 | /* Free the current connect table */ | 3597 | /* Free the current connect table */ |
3596 | list_for_each_entry_safe(conn_entry, next_conn_entry, | 3598 | list_for_each_entry_safe(conn_entry, next_conn_entry, |
3597 | &phba->fcf_conn_rec_list, list) | 3599 | &phba->fcf_conn_rec_list, list) { |
3600 | list_del_init(&conn_entry->list); | ||
3598 | kfree(conn_entry); | 3601 | kfree(conn_entry); |
3602 | } | ||
3599 | 3603 | ||
3600 | return; | 3604 | return; |
3601 | } | 3605 | } |
@@ -5058,15 +5062,6 @@ lpfc_sli4_queue_create(struct lpfc_hba *phba) | |||
5058 | } | 5062 | } |
5059 | phba->sli4_hba.els_cq = qdesc; | 5063 | phba->sli4_hba.els_cq = qdesc; |
5060 | 5064 | ||
5061 | /* Create slow-path Unsolicited Receive Complete Queue */ | ||
5062 | qdesc = lpfc_sli4_queue_alloc(phba, phba->sli4_hba.cq_esize, | ||
5063 | phba->sli4_hba.cq_ecount); | ||
5064 | if (!qdesc) { | ||
5065 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
5066 | "0502 Failed allocate slow-path USOL RX CQ\n"); | ||
5067 | goto out_free_els_cq; | ||
5068 | } | ||
5069 | phba->sli4_hba.rxq_cq = qdesc; | ||
5070 | 5065 | ||
5071 | /* Create fast-path FCP Completion Queue(s), one-to-one with EQs */ | 5066 | /* Create fast-path FCP Completion Queue(s), one-to-one with EQs */ |
5072 | phba->sli4_hba.fcp_cq = kzalloc((sizeof(struct lpfc_queue *) * | 5067 | phba->sli4_hba.fcp_cq = kzalloc((sizeof(struct lpfc_queue *) * |
@@ -5075,7 +5070,7 @@ lpfc_sli4_queue_create(struct lpfc_hba *phba) | |||
5075 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 5070 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
5076 | "2577 Failed allocate memory for fast-path " | 5071 | "2577 Failed allocate memory for fast-path " |
5077 | "CQ record array\n"); | 5072 | "CQ record array\n"); |
5078 | goto out_free_rxq_cq; | 5073 | goto out_free_els_cq; |
5079 | } | 5074 | } |
5080 | for (fcp_cqidx = 0; fcp_cqidx < phba->cfg_fcp_eq_count; fcp_cqidx++) { | 5075 | for (fcp_cqidx = 0; fcp_cqidx < phba->cfg_fcp_eq_count; fcp_cqidx++) { |
5081 | qdesc = lpfc_sli4_queue_alloc(phba, phba->sli4_hba.cq_esize, | 5076 | qdesc = lpfc_sli4_queue_alloc(phba, phba->sli4_hba.cq_esize, |
@@ -5188,9 +5183,6 @@ out_free_fcp_cq: | |||
5188 | phba->sli4_hba.fcp_cq[fcp_cqidx] = NULL; | 5183 | phba->sli4_hba.fcp_cq[fcp_cqidx] = NULL; |
5189 | } | 5184 | } |
5190 | kfree(phba->sli4_hba.fcp_cq); | 5185 | kfree(phba->sli4_hba.fcp_cq); |
5191 | out_free_rxq_cq: | ||
5192 | lpfc_sli4_queue_free(phba->sli4_hba.rxq_cq); | ||
5193 | phba->sli4_hba.rxq_cq = NULL; | ||
5194 | out_free_els_cq: | 5186 | out_free_els_cq: |
5195 | lpfc_sli4_queue_free(phba->sli4_hba.els_cq); | 5187 | lpfc_sli4_queue_free(phba->sli4_hba.els_cq); |
5196 | phba->sli4_hba.els_cq = NULL; | 5188 | phba->sli4_hba.els_cq = NULL; |
@@ -5247,10 +5239,6 @@ lpfc_sli4_queue_destroy(struct lpfc_hba *phba) | |||
5247 | lpfc_sli4_queue_free(phba->sli4_hba.dat_rq); | 5239 | lpfc_sli4_queue_free(phba->sli4_hba.dat_rq); |
5248 | phba->sli4_hba.dat_rq = NULL; | 5240 | phba->sli4_hba.dat_rq = NULL; |
5249 | 5241 | ||
5250 | /* Release unsolicited receive complete queue */ | ||
5251 | lpfc_sli4_queue_free(phba->sli4_hba.rxq_cq); | ||
5252 | phba->sli4_hba.rxq_cq = NULL; | ||
5253 | |||
5254 | /* Release ELS complete queue */ | 5242 | /* Release ELS complete queue */ |
5255 | lpfc_sli4_queue_free(phba->sli4_hba.els_cq); | 5243 | lpfc_sli4_queue_free(phba->sli4_hba.els_cq); |
5256 | phba->sli4_hba.els_cq = NULL; | 5244 | phba->sli4_hba.els_cq = NULL; |
@@ -5383,25 +5371,6 @@ lpfc_sli4_queue_setup(struct lpfc_hba *phba) | |||
5383 | phba->sli4_hba.els_cq->queue_id, | 5371 | phba->sli4_hba.els_cq->queue_id, |
5384 | phba->sli4_hba.sp_eq->queue_id); | 5372 | phba->sli4_hba.sp_eq->queue_id); |
5385 | 5373 | ||
5386 | /* Set up slow-path Unsolicited Receive Complete Queue */ | ||
5387 | if (!phba->sli4_hba.rxq_cq) { | ||
5388 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
5389 | "0532 USOL RX CQ not allocated\n"); | ||
5390 | goto out_destroy_els_cq; | ||
5391 | } | ||
5392 | rc = lpfc_cq_create(phba, phba->sli4_hba.rxq_cq, phba->sli4_hba.sp_eq, | ||
5393 | LPFC_RCQ, LPFC_USOL); | ||
5394 | if (rc) { | ||
5395 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
5396 | "0533 Failed setup of slow-path USOL RX CQ: " | ||
5397 | "rc = 0x%x\n", rc); | ||
5398 | goto out_destroy_els_cq; | ||
5399 | } | ||
5400 | lpfc_printf_log(phba, KERN_INFO, LOG_INIT, | ||
5401 | "2587 USL CQ setup: cq-id=%d, parent eq-id=%d\n", | ||
5402 | phba->sli4_hba.rxq_cq->queue_id, | ||
5403 | phba->sli4_hba.sp_eq->queue_id); | ||
5404 | |||
5405 | /* Set up fast-path FCP Response Complete Queue */ | 5374 | /* Set up fast-path FCP Response Complete Queue */ |
5406 | for (fcp_cqidx = 0; fcp_cqidx < phba->cfg_fcp_eq_count; fcp_cqidx++) { | 5375 | for (fcp_cqidx = 0; fcp_cqidx < phba->cfg_fcp_eq_count; fcp_cqidx++) { |
5407 | if (!phba->sli4_hba.fcp_cq[fcp_cqidx]) { | 5376 | if (!phba->sli4_hba.fcp_cq[fcp_cqidx]) { |
@@ -5507,7 +5476,7 @@ lpfc_sli4_queue_setup(struct lpfc_hba *phba) | |||
5507 | goto out_destroy_fcp_wq; | 5476 | goto out_destroy_fcp_wq; |
5508 | } | 5477 | } |
5509 | rc = lpfc_rq_create(phba, phba->sli4_hba.hdr_rq, phba->sli4_hba.dat_rq, | 5478 | rc = lpfc_rq_create(phba, phba->sli4_hba.hdr_rq, phba->sli4_hba.dat_rq, |
5510 | phba->sli4_hba.rxq_cq, LPFC_USOL); | 5479 | phba->sli4_hba.els_cq, LPFC_USOL); |
5511 | if (rc) { | 5480 | if (rc) { |
5512 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 5481 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
5513 | "0541 Failed setup of Receive Queue: " | 5482 | "0541 Failed setup of Receive Queue: " |
@@ -5519,7 +5488,7 @@ lpfc_sli4_queue_setup(struct lpfc_hba *phba) | |||
5519 | "parent cq-id=%d\n", | 5488 | "parent cq-id=%d\n", |
5520 | phba->sli4_hba.hdr_rq->queue_id, | 5489 | phba->sli4_hba.hdr_rq->queue_id, |
5521 | phba->sli4_hba.dat_rq->queue_id, | 5490 | phba->sli4_hba.dat_rq->queue_id, |
5522 | phba->sli4_hba.rxq_cq->queue_id); | 5491 | phba->sli4_hba.els_cq->queue_id); |
5523 | return 0; | 5492 | return 0; |
5524 | 5493 | ||
5525 | out_destroy_fcp_wq: | 5494 | out_destroy_fcp_wq: |
@@ -5531,8 +5500,6 @@ out_destroy_mbx_wq: | |||
5531 | out_destroy_fcp_cq: | 5500 | out_destroy_fcp_cq: |
5532 | for (--fcp_cqidx; fcp_cqidx >= 0; fcp_cqidx--) | 5501 | for (--fcp_cqidx; fcp_cqidx >= 0; fcp_cqidx--) |
5533 | lpfc_cq_destroy(phba, phba->sli4_hba.fcp_cq[fcp_cqidx]); | 5502 | lpfc_cq_destroy(phba, phba->sli4_hba.fcp_cq[fcp_cqidx]); |
5534 | lpfc_cq_destroy(phba, phba->sli4_hba.rxq_cq); | ||
5535 | out_destroy_els_cq: | ||
5536 | lpfc_cq_destroy(phba, phba->sli4_hba.els_cq); | 5503 | lpfc_cq_destroy(phba, phba->sli4_hba.els_cq); |
5537 | out_destroy_mbx_cq: | 5504 | out_destroy_mbx_cq: |
5538 | lpfc_cq_destroy(phba, phba->sli4_hba.mbx_cq); | 5505 | lpfc_cq_destroy(phba, phba->sli4_hba.mbx_cq); |
@@ -5574,8 +5541,6 @@ lpfc_sli4_queue_unset(struct lpfc_hba *phba) | |||
5574 | lpfc_cq_destroy(phba, phba->sli4_hba.mbx_cq); | 5541 | lpfc_cq_destroy(phba, phba->sli4_hba.mbx_cq); |
5575 | /* Unset ELS complete queue */ | 5542 | /* Unset ELS complete queue */ |
5576 | lpfc_cq_destroy(phba, phba->sli4_hba.els_cq); | 5543 | lpfc_cq_destroy(phba, phba->sli4_hba.els_cq); |
5577 | /* Unset unsolicited receive complete queue */ | ||
5578 | lpfc_cq_destroy(phba, phba->sli4_hba.rxq_cq); | ||
5579 | /* Unset FCP response complete queue */ | 5544 | /* Unset FCP response complete queue */ |
5580 | for (fcp_qidx = 0; fcp_qidx < phba->cfg_fcp_eq_count; fcp_qidx++) | 5545 | for (fcp_qidx = 0; fcp_qidx < phba->cfg_fcp_eq_count; fcp_qidx++) |
5581 | lpfc_cq_destroy(phba, phba->sli4_hba.fcp_cq[fcp_qidx]); | 5546 | lpfc_cq_destroy(phba, phba->sli4_hba.fcp_cq[fcp_qidx]); |