diff options
author | James Smart <james.smart@emulex.com> | 2014-05-21 08:04:59 -0400 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2014-06-02 12:29:49 -0400 |
commit | 68e814f587700b935f696b9e18403fe6c900a4a1 (patch) | |
tree | 19c2e4b2f788544da2c17ee587fcf65971c63983 /drivers/scsi/lpfc | |
parent | 2e61f50490d0ac4fec03b2409ea981dc4c87e4d6 (diff) |
lpfc: Fix for cleaning up stale ring flag and sp_queue_event entries
Fix for cleaning up stale ring flag and sp_queue_event entries.
Signed-off-by: James Smart <james.smart@emulex.com>
Reviewed-By: Dick Kennedy <dick.kennedy@emulex.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'drivers/scsi/lpfc')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_init.c | 48 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_sli.c | 1 |
2 files changed, 49 insertions, 0 deletions
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 2fb0396c3806..38a4119d6294 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c | |||
@@ -820,6 +820,52 @@ lpfc_hba_down_prep(struct lpfc_hba *phba) | |||
820 | } | 820 | } |
821 | 821 | ||
822 | /** | 822 | /** |
823 | * lpfc_sli4_free_sp_events - Cleanup sp_queue_events to free | ||
824 | * rspiocb which got deferred | ||
825 | * | ||
826 | * @phba: pointer to lpfc HBA data structure. | ||
827 | * | ||
828 | * This routine will cleanup completed slow path events after HBA is reset | ||
829 | * when bringing down the SLI Layer. | ||
830 | * | ||
831 | * | ||
832 | * Return codes | ||
833 | * void. | ||
834 | **/ | ||
835 | static void | ||
836 | lpfc_sli4_free_sp_events(struct lpfc_hba *phba) | ||
837 | { | ||
838 | struct lpfc_iocbq *rspiocbq; | ||
839 | struct hbq_dmabuf *dmabuf; | ||
840 | struct lpfc_cq_event *cq_event; | ||
841 | |||
842 | spin_lock_irq(&phba->hbalock); | ||
843 | phba->hba_flag &= ~HBA_SP_QUEUE_EVT; | ||
844 | spin_unlock_irq(&phba->hbalock); | ||
845 | |||
846 | while (!list_empty(&phba->sli4_hba.sp_queue_event)) { | ||
847 | /* Get the response iocb from the head of work queue */ | ||
848 | spin_lock_irq(&phba->hbalock); | ||
849 | list_remove_head(&phba->sli4_hba.sp_queue_event, | ||
850 | cq_event, struct lpfc_cq_event, list); | ||
851 | spin_unlock_irq(&phba->hbalock); | ||
852 | |||
853 | switch (bf_get(lpfc_wcqe_c_code, &cq_event->cqe.wcqe_cmpl)) { | ||
854 | case CQE_CODE_COMPL_WQE: | ||
855 | rspiocbq = container_of(cq_event, struct lpfc_iocbq, | ||
856 | cq_event); | ||
857 | lpfc_sli_release_iocbq(phba, rspiocbq); | ||
858 | break; | ||
859 | case CQE_CODE_RECEIVE: | ||
860 | case CQE_CODE_RECEIVE_V1: | ||
861 | dmabuf = container_of(cq_event, struct hbq_dmabuf, | ||
862 | cq_event); | ||
863 | lpfc_in_buf_free(phba, &dmabuf->dbuf); | ||
864 | } | ||
865 | } | ||
866 | } | ||
867 | |||
868 | /** | ||
823 | * lpfc_hba_free_post_buf - Perform lpfc uninitialization after HBA reset | 869 | * lpfc_hba_free_post_buf - Perform lpfc uninitialization after HBA reset |
824 | * @phba: pointer to lpfc HBA data structure. | 870 | * @phba: pointer to lpfc HBA data structure. |
825 | * | 871 | * |
@@ -981,6 +1027,8 @@ lpfc_hba_down_post_s4(struct lpfc_hba *phba) | |||
981 | spin_lock_irqsave(&phba->scsi_buf_list_put_lock, iflag); | 1027 | spin_lock_irqsave(&phba->scsi_buf_list_put_lock, iflag); |
982 | list_splice(&aborts, &phba->lpfc_scsi_buf_list_put); | 1028 | list_splice(&aborts, &phba->lpfc_scsi_buf_list_put); |
983 | spin_unlock_irqrestore(&phba->scsi_buf_list_put_lock, iflag); | 1029 | spin_unlock_irqrestore(&phba->scsi_buf_list_put_lock, iflag); |
1030 | |||
1031 | lpfc_sli4_free_sp_events(phba); | ||
984 | return 0; | 1032 | return 0; |
985 | } | 1033 | } |
986 | 1034 | ||
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index f2a614a1f8f2..bdcdadd6db4a 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c | |||
@@ -9244,6 +9244,7 @@ lpfc_sli_queue_setup(struct lpfc_hba *phba) | |||
9244 | pring->sli.sli3.next_cmdidx = 0; | 9244 | pring->sli.sli3.next_cmdidx = 0; |
9245 | pring->sli.sli3.local_getidx = 0; | 9245 | pring->sli.sli3.local_getidx = 0; |
9246 | pring->sli.sli3.cmdidx = 0; | 9246 | pring->sli.sli3.cmdidx = 0; |
9247 | pring->flag = 0; | ||
9247 | INIT_LIST_HEAD(&pring->txq); | 9248 | INIT_LIST_HEAD(&pring->txq); |
9248 | INIT_LIST_HEAD(&pring->txcmplq); | 9249 | INIT_LIST_HEAD(&pring->txcmplq); |
9249 | INIT_LIST_HEAD(&pring->iocb_continueq); | 9250 | INIT_LIST_HEAD(&pring->iocb_continueq); |