aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/lpfc
diff options
context:
space:
mode:
authorJames Smart <james.smart@emulex.com>2014-05-21 08:04:59 -0400
committerChristoph Hellwig <hch@lst.de>2014-06-02 12:29:49 -0400
commit68e814f587700b935f696b9e18403fe6c900a4a1 (patch)
tree19c2e4b2f788544da2c17ee587fcf65971c63983 /drivers/scsi/lpfc
parent2e61f50490d0ac4fec03b2409ea981dc4c87e4d6 (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.c48
-rw-r--r--drivers/scsi/lpfc/lpfc_sli.c1
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 **/
835static void
836lpfc_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);