linux-scsi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 13/19] lpfc: convert to use the data buffer accessors
@ 2007-05-12 10:05 FUJITA Tomonori
  2007-06-05 19:35 ` James Smart
  0 siblings, 1 reply; 2+ messages in thread
From: FUJITA Tomonori @ 2007-05-12 10:05 UTC (permalink / raw)
  To: James.Smart; +Cc: linux-scsi, James.Bottomley

This converts lpfc to use the data buffer accessors.

Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
---
 drivers/scsi/lpfc/lpfc_scsi.c |   55 ++++++++++++++++++----------------------
 1 files changed, 25 insertions(+), 30 deletions(-)

diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c
index 4ffaa79..96120ec 100644
--- a/drivers/scsi/lpfc/lpfc_scsi.c
+++ b/drivers/scsi/lpfc/lpfc_scsi.c
@@ -175,7 +175,7 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba *
 	IOCB_t *iocb_cmd = &lpfc_cmd->cur_iocbq.iocb;
 	dma_addr_t physaddr;
 	uint32_t i, num_bde = 0;
-	int datadir = scsi_cmnd->sc_data_direction;
+	int nseg, datadir = scsi_cmnd->sc_data_direction;
 
 	/*
 	 * There are three possibilities here - use scatter-gather segment, use
@@ -184,26 +184,22 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba *
 	 * data bde entry.
 	 */
 	bpl += 2;
-	if (scsi_cmnd->use_sg) {
+	nseg = scsi_dma_map(&phba->pcidev->dev, scsi_cmnd);
+	if (nseg > 0) {
 		/*
 		 * The driver stores the segment count returned from pci_map_sg
 		 * because this a count of dma-mappings used to map the use_sg
 		 * pages.  They are not guaranteed to be the same for those
 		 * architectures that implement an IOMMU.
 		 */
-		sgel = (struct scatterlist *)scsi_cmnd->request_buffer;
-		lpfc_cmd->seg_cnt = dma_map_sg(&phba->pcidev->dev, sgel,
-						scsi_cmnd->use_sg, datadir);
-		if (lpfc_cmd->seg_cnt == 0)
-			return 1;
 
+		lpfc_cmd->seg_cnt = nseg;
 		if (lpfc_cmd->seg_cnt > phba->cfg_sg_seg_cnt) {
 			printk(KERN_ERR "%s: Too many sg segments from "
 			       "dma_map_sg.  Config %d, seg_cnt %d",
 			       __FUNCTION__, phba->cfg_sg_seg_cnt,
 			       lpfc_cmd->seg_cnt);
-			dma_unmap_sg(&phba->pcidev->dev, sgel,
-				     lpfc_cmd->seg_cnt, datadir);
+			scsi_dma_unmap(&phba->pcidev->dev, scsi_cmnd);
 			return 1;
 		}
 
@@ -213,7 +209,7 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba *
 		 * single scsi command.  Just run through the seg_cnt and format
 		 * the bde's.
 		 */
-		for (i = 0; i < lpfc_cmd->seg_cnt; i++) {
+		scsi_for_each_sg(scsi_cmnd, sgel, nseg, i) {
 			physaddr = sg_dma_address(sgel);
 			bpl->addrLow = le32_to_cpu(putPaddrLow(physaddr));
 			bpl->addrHigh = le32_to_cpu(putPaddrHigh(physaddr));
@@ -224,10 +220,10 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba *
 				bpl->tus.f.bdeFlags = BUFF_USE_RCV;
 			bpl->tus.w = le32_to_cpu(bpl->tus.w);
 			bpl++;
-			sgel++;
 			num_bde++;
 		}
-	}
+	} else if (nseg < 0)
+		return 1;
 
 	/*
 	 * Finish initializing those IOCB fields that are dependent on the
@@ -240,7 +236,7 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba *
 		(num_bde * sizeof (struct ulp_bde64));
 	iocb_cmd->ulpBdeCount = 1;
 	iocb_cmd->ulpLe = 1;
-	fcp_cmnd->fcpDl = be32_to_cpu(scsi_cmnd->request_bufflen);
+	fcp_cmnd->fcpDl = be32_to_cpu(scsi_bufflen(scsi_cmnd));
 	return 0;
 }
 
@@ -253,9 +249,8 @@ lpfc_scsi_unprep_dma_buf(struct lpfc_hba
 	 * 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);
+	if (psb->seg_cnt > 0)
+		scsi_dma_unmap(&phba->pcidev->dev, psb->pCmd);
 }
 
 static void
@@ -316,14 +311,14 @@ lpfc_handle_fcp_err(struct lpfc_scsi_buf
 		}
 	}
 
-	cmnd->resid = 0;
+	scsi_resid(cmnd) = 0;
 	if (resp_info & RESID_UNDER) {
-		cmnd->resid = be32_to_cpu(fcprsp->rspResId);
+		scsi_resid(cmnd) = be32_to_cpu(fcprsp->rspResId);
 
 		lpfc_printf_log(phba, KERN_INFO, LOG_FCP,
 				"%d:0716 FCP Read Underrun, expected %d, "
 				"residual %d Data: x%x x%x x%x\n", phba->brd_no,
-				be32_to_cpu(fcpcmd->fcpDl), cmnd->resid,
+				be32_to_cpu(fcpcmd->fcpDl), scsi_resid(cmnd),
 				fcpi_parm, cmnd->cmnd[0], cmnd->underflow);
 
 		/*
@@ -333,15 +328,15 @@ lpfc_handle_fcp_err(struct lpfc_scsi_buf
 		 */
 		if ((cmnd->sc_data_direction == DMA_FROM_DEVICE) &&
 			fcpi_parm &&
-			(cmnd->resid != fcpi_parm)) {
+			(scsi_resid(cmnd) != fcpi_parm)) {
 			lpfc_printf_log(phba, KERN_WARNING,
 				LOG_FCP | LOG_FCP_ERROR,
 				"%d:0735 FCP Read Check Error and Underrun "
 				"Data: x%x x%x x%x x%x\n", phba->brd_no,
 				be32_to_cpu(fcpcmd->fcpDl),
-				cmnd->resid,
+				scsi_resid(cmnd),
 				fcpi_parm, cmnd->cmnd[0]);
-			cmnd->resid = cmnd->request_bufflen;
+			scsi_resid(cmnd) = scsi_bufflen(cmnd);
 			host_status = DID_ERROR;
 		}
 		/*
@@ -352,13 +347,13 @@ lpfc_handle_fcp_err(struct lpfc_scsi_buf
 		 */
 		if (!(resp_info & SNS_LEN_VALID) &&
 		    (scsi_status == SAM_STAT_GOOD) &&
-		    (cmnd->request_bufflen - cmnd->resid) < cmnd->underflow) {
+		    (scsi_bufflen(cmnd) - scsi_resid(cmnd) < cmnd->underflow)) {
 			lpfc_printf_log(phba, KERN_INFO, LOG_FCP,
 					"%d:0717 FCP command x%x residual "
 					"underrun converted to error "
 					"Data: x%x x%x x%x\n", phba->brd_no,
-					cmnd->cmnd[0], cmnd->request_bufflen,
-					cmnd->resid, cmnd->underflow);
+					cmnd->cmnd[0], scsi_bufflen(cmnd),
+					scsi_resid(cmnd), cmnd->underflow);
 
 			host_status = DID_ERROR;
 		}
@@ -367,7 +362,7 @@ lpfc_handle_fcp_err(struct lpfc_scsi_buf
 				"%d:0720 FCP command x%x residual "
 				"overrun error. Data: x%x x%x \n",
 				phba->brd_no, cmnd->cmnd[0],
-				cmnd->request_bufflen, cmnd->resid);
+				scsi_bufflen(cmnd), scsi_resid(cmnd));
 		host_status = DID_ERROR;
 
 	/*
@@ -383,7 +378,7 @@ lpfc_handle_fcp_err(struct lpfc_scsi_buf
 			be32_to_cpu(fcprsp->rspResId),
 			fcpi_parm, cmnd->cmnd[0]);
 		host_status = DID_ERROR;
-		cmnd->resid = cmnd->request_bufflen;
+		scsi_resid(cmnd) = scsi_bufflen(cmnd);
 	}
 
  out:
@@ -450,7 +445,7 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba
 				"SNS x%x x%x Data: x%x x%x\n",
 				phba->brd_no, cmd->device->id,
 				cmd->device->lun, cmd, cmd->result,
-				*lp, *(lp + 3), cmd->retries, cmd->resid);
+				*lp, *(lp + 3), cmd->retries, scsi_resid(cmd));
 	}
 
 	result = cmd->result;
@@ -559,7 +554,7 @@ lpfc_scsi_prep_cmnd(struct lpfc_hba * ph
 	 * bumping the bpl beyond the fcp_cmnd and fcp_rsp regions to the first
 	 * data bde entry.
 	 */
-	if (scsi_cmnd->use_sg) {
+	if (scsi_sg_count(scsi_cmnd)) {
 		if (datadir == DMA_TO_DEVICE) {
 			iocb_cmd->ulpCommand = CMD_FCP_IWRITE64_CR;
 			iocb_cmd->un.fcpi.fcpi_parm = 0;
@@ -570,7 +565,7 @@ lpfc_scsi_prep_cmnd(struct lpfc_hba * ph
 			iocb_cmd->ulpCommand = CMD_FCP_IREAD64_CR;
 			iocb_cmd->ulpPU = PARM_READ_CHECK;
 			iocb_cmd->un.fcpi.fcpi_parm =
-				scsi_cmnd->request_bufflen;
+				scsi_bufflen(scsi_cmnd);
 			fcp_cmnd->fcpCntl3 = READ_DATA;
 			phba->fc4InputRequests++;
 		}
-- 
1.4.3.2


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH 13/19] lpfc: convert to use the data buffer accessors
  2007-05-12 10:05 [PATCH 13/19] lpfc: convert to use the data buffer accessors FUJITA Tomonori
@ 2007-06-05 19:35 ` James Smart
  0 siblings, 0 replies; 2+ messages in thread
From: James Smart @ 2007-06-05 19:35 UTC (permalink / raw)
  To: FUJITA Tomonori; +Cc: linux-scsi, James.Bottomley

FYI - we have reworked this patch and include it in our 8.2.1 patch
set, which adds NPIV support.

-- james s


FUJITA Tomonori wrote:
> This converts lpfc to use the data buffer accessors.
> 
> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
> ---
>  drivers/scsi/lpfc/lpfc_scsi.c |   55 ++++++++++++++++++----------------------
>  1 files changed, 25 insertions(+), 30 deletions(-)
> 
> diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c
> index 4ffaa79..96120ec 100644
> --- a/drivers/scsi/lpfc/lpfc_scsi.c
> +++ b/drivers/scsi/lpfc/lpfc_scsi.c
> @@ -175,7 +175,7 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba *
>  	IOCB_t *iocb_cmd = &lpfc_cmd->cur_iocbq.iocb;
>  	dma_addr_t physaddr;
>  	uint32_t i, num_bde = 0;
> -	int datadir = scsi_cmnd->sc_data_direction;
> +	int nseg, datadir = scsi_cmnd->sc_data_direction;
>  
>  	/*
>  	 * There are three possibilities here - use scatter-gather segment, use
> @@ -184,26 +184,22 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba *
>  	 * data bde entry.
>  	 */
>  	bpl += 2;
> -	if (scsi_cmnd->use_sg) {
> +	nseg = scsi_dma_map(&phba->pcidev->dev, scsi_cmnd);
> +	if (nseg > 0) {
>  		/*
>  		 * The driver stores the segment count returned from pci_map_sg
>  		 * because this a count of dma-mappings used to map the use_sg
>  		 * pages.  They are not guaranteed to be the same for those
>  		 * architectures that implement an IOMMU.
>  		 */
> -		sgel = (struct scatterlist *)scsi_cmnd->request_buffer;
> -		lpfc_cmd->seg_cnt = dma_map_sg(&phba->pcidev->dev, sgel,
> -						scsi_cmnd->use_sg, datadir);
> -		if (lpfc_cmd->seg_cnt == 0)
> -			return 1;
>  
> +		lpfc_cmd->seg_cnt = nseg;
>  		if (lpfc_cmd->seg_cnt > phba->cfg_sg_seg_cnt) {
>  			printk(KERN_ERR "%s: Too many sg segments from "
>  			       "dma_map_sg.  Config %d, seg_cnt %d",
>  			       __FUNCTION__, phba->cfg_sg_seg_cnt,
>  			       lpfc_cmd->seg_cnt);
> -			dma_unmap_sg(&phba->pcidev->dev, sgel,
> -				     lpfc_cmd->seg_cnt, datadir);
> +			scsi_dma_unmap(&phba->pcidev->dev, scsi_cmnd);
>  			return 1;
>  		}
>  
> @@ -213,7 +209,7 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba *
>  		 * single scsi command.  Just run through the seg_cnt and format
>  		 * the bde's.
>  		 */
> -		for (i = 0; i < lpfc_cmd->seg_cnt; i++) {
> +		scsi_for_each_sg(scsi_cmnd, sgel, nseg, i) {
>  			physaddr = sg_dma_address(sgel);
>  			bpl->addrLow = le32_to_cpu(putPaddrLow(physaddr));
>  			bpl->addrHigh = le32_to_cpu(putPaddrHigh(physaddr));
> @@ -224,10 +220,10 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba *
>  				bpl->tus.f.bdeFlags = BUFF_USE_RCV;
>  			bpl->tus.w = le32_to_cpu(bpl->tus.w);
>  			bpl++;
> -			sgel++;
>  			num_bde++;
>  		}
> -	}
> +	} else if (nseg < 0)
> +		return 1;
>  
>  	/*
>  	 * Finish initializing those IOCB fields that are dependent on the
> @@ -240,7 +236,7 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba *
>  		(num_bde * sizeof (struct ulp_bde64));
>  	iocb_cmd->ulpBdeCount = 1;
>  	iocb_cmd->ulpLe = 1;
> -	fcp_cmnd->fcpDl = be32_to_cpu(scsi_cmnd->request_bufflen);
> +	fcp_cmnd->fcpDl = be32_to_cpu(scsi_bufflen(scsi_cmnd));
>  	return 0;
>  }
>  
> @@ -253,9 +249,8 @@ lpfc_scsi_unprep_dma_buf(struct lpfc_hba
>  	 * 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);
> +	if (psb->seg_cnt > 0)
> +		scsi_dma_unmap(&phba->pcidev->dev, psb->pCmd);
>  }
>  
>  static void
> @@ -316,14 +311,14 @@ lpfc_handle_fcp_err(struct lpfc_scsi_buf
>  		}
>  	}
>  
> -	cmnd->resid = 0;
> +	scsi_resid(cmnd) = 0;
>  	if (resp_info & RESID_UNDER) {
> -		cmnd->resid = be32_to_cpu(fcprsp->rspResId);
> +		scsi_resid(cmnd) = be32_to_cpu(fcprsp->rspResId);
>  
>  		lpfc_printf_log(phba, KERN_INFO, LOG_FCP,
>  				"%d:0716 FCP Read Underrun, expected %d, "
>  				"residual %d Data: x%x x%x x%x\n", phba->brd_no,
> -				be32_to_cpu(fcpcmd->fcpDl), cmnd->resid,
> +				be32_to_cpu(fcpcmd->fcpDl), scsi_resid(cmnd),
>  				fcpi_parm, cmnd->cmnd[0], cmnd->underflow);
>  
>  		/*
> @@ -333,15 +328,15 @@ lpfc_handle_fcp_err(struct lpfc_scsi_buf
>  		 */
>  		if ((cmnd->sc_data_direction == DMA_FROM_DEVICE) &&
>  			fcpi_parm &&
> -			(cmnd->resid != fcpi_parm)) {
> +			(scsi_resid(cmnd) != fcpi_parm)) {
>  			lpfc_printf_log(phba, KERN_WARNING,
>  				LOG_FCP | LOG_FCP_ERROR,
>  				"%d:0735 FCP Read Check Error and Underrun "
>  				"Data: x%x x%x x%x x%x\n", phba->brd_no,
>  				be32_to_cpu(fcpcmd->fcpDl),
> -				cmnd->resid,
> +				scsi_resid(cmnd),
>  				fcpi_parm, cmnd->cmnd[0]);
> -			cmnd->resid = cmnd->request_bufflen;
> +			scsi_resid(cmnd) = scsi_bufflen(cmnd);
>  			host_status = DID_ERROR;
>  		}
>  		/*
> @@ -352,13 +347,13 @@ lpfc_handle_fcp_err(struct lpfc_scsi_buf
>  		 */
>  		if (!(resp_info & SNS_LEN_VALID) &&
>  		    (scsi_status == SAM_STAT_GOOD) &&
> -		    (cmnd->request_bufflen - cmnd->resid) < cmnd->underflow) {
> +		    (scsi_bufflen(cmnd) - scsi_resid(cmnd) < cmnd->underflow)) {
>  			lpfc_printf_log(phba, KERN_INFO, LOG_FCP,
>  					"%d:0717 FCP command x%x residual "
>  					"underrun converted to error "
>  					"Data: x%x x%x x%x\n", phba->brd_no,
> -					cmnd->cmnd[0], cmnd->request_bufflen,
> -					cmnd->resid, cmnd->underflow);
> +					cmnd->cmnd[0], scsi_bufflen(cmnd),
> +					scsi_resid(cmnd), cmnd->underflow);
>  
>  			host_status = DID_ERROR;
>  		}
> @@ -367,7 +362,7 @@ lpfc_handle_fcp_err(struct lpfc_scsi_buf
>  				"%d:0720 FCP command x%x residual "
>  				"overrun error. Data: x%x x%x \n",
>  				phba->brd_no, cmnd->cmnd[0],
> -				cmnd->request_bufflen, cmnd->resid);
> +				scsi_bufflen(cmnd), scsi_resid(cmnd));
>  		host_status = DID_ERROR;
>  
>  	/*
> @@ -383,7 +378,7 @@ lpfc_handle_fcp_err(struct lpfc_scsi_buf
>  			be32_to_cpu(fcprsp->rspResId),
>  			fcpi_parm, cmnd->cmnd[0]);
>  		host_status = DID_ERROR;
> -		cmnd->resid = cmnd->request_bufflen;
> +		scsi_resid(cmnd) = scsi_bufflen(cmnd);
>  	}
>  
>   out:
> @@ -450,7 +445,7 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba
>  				"SNS x%x x%x Data: x%x x%x\n",
>  				phba->brd_no, cmd->device->id,
>  				cmd->device->lun, cmd, cmd->result,
> -				*lp, *(lp + 3), cmd->retries, cmd->resid);
> +				*lp, *(lp + 3), cmd->retries, scsi_resid(cmd));
>  	}
>  
>  	result = cmd->result;
> @@ -559,7 +554,7 @@ lpfc_scsi_prep_cmnd(struct lpfc_hba * ph
>  	 * bumping the bpl beyond the fcp_cmnd and fcp_rsp regions to the first
>  	 * data bde entry.
>  	 */
> -	if (scsi_cmnd->use_sg) {
> +	if (scsi_sg_count(scsi_cmnd)) {
>  		if (datadir == DMA_TO_DEVICE) {
>  			iocb_cmd->ulpCommand = CMD_FCP_IWRITE64_CR;
>  			iocb_cmd->un.fcpi.fcpi_parm = 0;
> @@ -570,7 +565,7 @@ lpfc_scsi_prep_cmnd(struct lpfc_hba * ph
>  			iocb_cmd->ulpCommand = CMD_FCP_IREAD64_CR;
>  			iocb_cmd->ulpPU = PARM_READ_CHECK;
>  			iocb_cmd->un.fcpi.fcpi_parm =
> -				scsi_cmnd->request_bufflen;
> +				scsi_bufflen(scsi_cmnd);
>  			fcp_cmnd->fcpCntl3 = READ_DATA;
>  			phba->fc4InputRequests++;
>  		}

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2007-06-05 19:35 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-05-12 10:05 [PATCH 13/19] lpfc: convert to use the data buffer accessors FUJITA Tomonori
2007-06-05 19:35 ` James Smart

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).