|
@@ -819,6 +819,52 @@ lpfc_hba_down_prep(struct lpfc_hba *phba)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * lpfc_sli4_free_sp_events - Cleanup sp_queue_events to free
|
|
|
+ * rspiocb which got deferred
|
|
|
+ *
|
|
|
+ * @phba: pointer to lpfc HBA data structure.
|
|
|
+ *
|
|
|
+ * This routine will cleanup completed slow path events after HBA is reset
|
|
|
+ * when bringing down the SLI Layer.
|
|
|
+ *
|
|
|
+ *
|
|
|
+ * Return codes
|
|
|
+ * void.
|
|
|
+ **/
|
|
|
+static void
|
|
|
+lpfc_sli4_free_sp_events(struct lpfc_hba *phba)
|
|
|
+{
|
|
|
+ struct lpfc_iocbq *rspiocbq;
|
|
|
+ struct hbq_dmabuf *dmabuf;
|
|
|
+ struct lpfc_cq_event *cq_event;
|
|
|
+
|
|
|
+ spin_lock_irq(&phba->hbalock);
|
|
|
+ phba->hba_flag &= ~HBA_SP_QUEUE_EVT;
|
|
|
+ spin_unlock_irq(&phba->hbalock);
|
|
|
+
|
|
|
+ while (!list_empty(&phba->sli4_hba.sp_queue_event)) {
|
|
|
+ /* Get the response iocb from the head of work queue */
|
|
|
+ spin_lock_irq(&phba->hbalock);
|
|
|
+ list_remove_head(&phba->sli4_hba.sp_queue_event,
|
|
|
+ cq_event, struct lpfc_cq_event, list);
|
|
|
+ spin_unlock_irq(&phba->hbalock);
|
|
|
+
|
|
|
+ switch (bf_get(lpfc_wcqe_c_code, &cq_event->cqe.wcqe_cmpl)) {
|
|
|
+ case CQE_CODE_COMPL_WQE:
|
|
|
+ rspiocbq = container_of(cq_event, struct lpfc_iocbq,
|
|
|
+ cq_event);
|
|
|
+ lpfc_sli_release_iocbq(phba, rspiocbq);
|
|
|
+ break;
|
|
|
+ case CQE_CODE_RECEIVE:
|
|
|
+ case CQE_CODE_RECEIVE_V1:
|
|
|
+ dmabuf = container_of(cq_event, struct hbq_dmabuf,
|
|
|
+ cq_event);
|
|
|
+ lpfc_in_buf_free(phba, &dmabuf->dbuf);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* lpfc_hba_free_post_buf - Perform lpfc uninitialization after HBA reset
|
|
|
* @phba: pointer to lpfc HBA data structure.
|
|
@@ -981,6 +1027,8 @@ lpfc_hba_down_post_s4(struct lpfc_hba *phba)
|
|
|
spin_lock_irqsave(&phba->scsi_buf_list_put_lock, iflag);
|
|
|
list_splice(&aborts, &phba->lpfc_scsi_buf_list_put);
|
|
|
spin_unlock_irqrestore(&phba->scsi_buf_list_put_lock, iflag);
|
|
|
+
|
|
|
+ lpfc_sli4_free_sp_events(phba);
|
|
|
return 0;
|
|
|
}
|
|
|
|