|
@@ -153,22 +153,6 @@ static void
|
|
|
lpfc_release_scsi_buf(struct lpfc_hba * phba, struct lpfc_scsi_buf * psb)
|
|
|
{
|
|
|
unsigned long iflag = 0;
|
|
|
- /*
|
|
|
- * There are only two special cases to consider. (1) the scsi command
|
|
|
- * requested scatter-gather usage or (2) the scsi command allocated
|
|
|
- * a request buffer, but did not request use_sg. There is a third
|
|
|
- * case, but it does not require resource deallocation.
|
|
|
- */
|
|
|
- if ((psb->seg_cnt > 0) && (psb->pCmd->use_sg)) {
|
|
|
- dma_unmap_sg(&phba->pcidev->dev, psb->pCmd->request_buffer,
|
|
|
- psb->seg_cnt, psb->pCmd->sc_data_direction);
|
|
|
- } else {
|
|
|
- if ((psb->nonsg_phys) && (psb->pCmd->request_bufflen)) {
|
|
|
- dma_unmap_single(&phba->pcidev->dev, psb->nonsg_phys,
|
|
|
- psb->pCmd->request_bufflen,
|
|
|
- psb->pCmd->sc_data_direction);
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
spin_lock_irqsave(&phba->scsi_buf_list_lock, iflag);
|
|
|
psb->pCmd = NULL;
|
|
@@ -281,6 +265,27 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba * phba, struct lpfc_scsi_buf * lpfc_cmd)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void
|
|
|
+lpfc_scsi_unprep_dma_buf(struct lpfc_hba * phba, struct lpfc_scsi_buf * psb)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * There are only two special cases to consider. (1) the scsi command
|
|
|
+ * requested scatter-gather usage or (2) the scsi command allocated
|
|
|
+ * a request buffer, but did not request use_sg. There is a third
|
|
|
+ * case, but it does not require resource deallocation.
|
|
|
+ */
|
|
|
+ if ((psb->seg_cnt > 0) && (psb->pCmd->use_sg)) {
|
|
|
+ dma_unmap_sg(&phba->pcidev->dev, psb->pCmd->request_buffer,
|
|
|
+ psb->seg_cnt, psb->pCmd->sc_data_direction);
|
|
|
+ } else {
|
|
|
+ if ((psb->nonsg_phys) && (psb->pCmd->request_bufflen)) {
|
|
|
+ dma_unmap_single(&phba->pcidev->dev, psb->nonsg_phys,
|
|
|
+ psb->pCmd->request_bufflen,
|
|
|
+ psb->pCmd->sc_data_direction);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void
|
|
|
lpfc_handle_fcp_err(struct lpfc_scsi_buf *lpfc_cmd)
|
|
|
{
|
|
@@ -454,6 +459,7 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
|
|
|
cmd->scsi_done(cmd);
|
|
|
|
|
|
if (phba->cfg_poll & ENABLE_FCP_RING_POLLING) {
|
|
|
+ lpfc_scsi_unprep_dma_buf(phba, lpfc_cmd);
|
|
|
lpfc_release_scsi_buf(phba, lpfc_cmd);
|
|
|
return;
|
|
|
}
|
|
@@ -511,6 +517,7 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ lpfc_scsi_unprep_dma_buf(phba, lpfc_cmd);
|
|
|
lpfc_release_scsi_buf(phba, lpfc_cmd);
|
|
|
}
|
|
|
|
|
@@ -822,6 +829,7 @@ lpfc_queuecommand(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *))
|
|
|
return 0;
|
|
|
|
|
|
out_host_busy_free_buf:
|
|
|
+ lpfc_scsi_unprep_dma_buf(phba, lpfc_cmd);
|
|
|
lpfc_release_scsi_buf(phba, lpfc_cmd);
|
|
|
out_host_busy:
|
|
|
return SCSI_MLQUEUE_HOST_BUSY;
|