Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 938febd6 authored by FUJITA Tomonori's avatar FUJITA Tomonori Committed by James Bottomley
Browse files

[SCSI] sym53c8xx: convert to use the data buffer accessors



- remove the unnecessary map_single path.

- convert to use the new accessors for the sg lists and the
parameters.

Jens Axboe <jens.axboe@oracle.com> did the for_each_sg cleanup.

Signed-off-by: default avatarFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Cc: Matthew Wilcox <matthew@wil.cx>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent cebadc5c
Loading
Loading
Loading
Loading
+11 −72
Original line number Original line Diff line number Diff line
@@ -146,41 +146,17 @@ struct sym_ucmd { /* Override the SCSI pointer structure */


static void __unmap_scsi_data(struct pci_dev *pdev, struct scsi_cmnd *cmd)
static void __unmap_scsi_data(struct pci_dev *pdev, struct scsi_cmnd *cmd)
{
{
	int dma_dir = cmd->sc_data_direction;
	if (SYM_UCMD_PTR(cmd)->data_mapped)
		scsi_dma_unmap(cmd);


	switch(SYM_UCMD_PTR(cmd)->data_mapped) {
	case 2:
		pci_unmap_sg(pdev, cmd->request_buffer, cmd->use_sg, dma_dir);
		break;
	case 1:
		pci_unmap_single(pdev, SYM_UCMD_PTR(cmd)->data_mapping,
				 cmd->request_bufflen, dma_dir);
		break;
	}
	SYM_UCMD_PTR(cmd)->data_mapped = 0;
	SYM_UCMD_PTR(cmd)->data_mapped = 0;
}
}


static dma_addr_t __map_scsi_single_data(struct pci_dev *pdev, struct scsi_cmnd *cmd)
{
	dma_addr_t mapping;
	int dma_dir = cmd->sc_data_direction;

	mapping = pci_map_single(pdev, cmd->request_buffer,
				 cmd->request_bufflen, dma_dir);
	if (mapping) {
		SYM_UCMD_PTR(cmd)->data_mapped  = 1;
		SYM_UCMD_PTR(cmd)->data_mapping = mapping;
	}

	return mapping;
}

static int __map_scsi_sg_data(struct pci_dev *pdev, struct scsi_cmnd *cmd)
static int __map_scsi_sg_data(struct pci_dev *pdev, struct scsi_cmnd *cmd)
{
{
	int use_sg;
	int use_sg;
	int dma_dir = cmd->sc_data_direction;


	use_sg = pci_map_sg(pdev, cmd->request_buffer, cmd->use_sg, dma_dir);
	use_sg = scsi_dma_map(cmd);
	if (use_sg > 0) {
	if (use_sg > 0) {
		SYM_UCMD_PTR(cmd)->data_mapped  = 2;
		SYM_UCMD_PTR(cmd)->data_mapped  = 2;
		SYM_UCMD_PTR(cmd)->data_mapping = use_sg;
		SYM_UCMD_PTR(cmd)->data_mapping = use_sg;
@@ -191,8 +167,6 @@ static int __map_scsi_sg_data(struct pci_dev *pdev, struct scsi_cmnd *cmd)


#define unmap_scsi_data(np, cmd)	\
#define unmap_scsi_data(np, cmd)	\
		__unmap_scsi_data(np->s.device, cmd)
		__unmap_scsi_data(np->s.device, cmd)
#define map_scsi_single_data(np, cmd)	\
		__map_scsi_single_data(np->s.device, cmd)
#define map_scsi_sg_data(np, cmd)	\
#define map_scsi_sg_data(np, cmd)	\
		__map_scsi_sg_data(np->s.device, cmd)
		__map_scsi_sg_data(np->s.device, cmd)
/*
/*
@@ -322,55 +296,20 @@ void sym_set_cam_result_error(struct sym_hcb *np, struct sym_ccb *cp, int resid)
		 */
		 */
		cam_status = sym_xerr_cam_status(DID_ERROR, cp->xerr_status);
		cam_status = sym_xerr_cam_status(DID_ERROR, cp->xerr_status);
	}
	}
	cmd->resid = resid;
	scsi_set_resid(cmd, resid);
	cmd->result = (drv_status << 24) + (cam_status << 16) + scsi_status;
	cmd->result = (drv_status << 24) + (cam_status << 16) + scsi_status;
}
}



/*
 *  Build the scatter/gather array for an I/O.
 */

static int sym_scatter_no_sglist(struct sym_hcb *np, struct sym_ccb *cp, struct scsi_cmnd *cmd)
{
	struct sym_tblmove *data = &cp->phys.data[SYM_CONF_MAX_SG-1];
	int segment;
	unsigned int len = cmd->request_bufflen;

	if (len) {
		dma_addr_t baddr = map_scsi_single_data(np, cmd);
		if (baddr) {
			if (len & 1) {
				struct sym_tcb *tp = &np->target[cp->target];
				if (tp->head.wval & EWS) {
					len++;
					cp->odd_byte_adjustment++;
				}
			}
			cp->data_len = len;
			sym_build_sge(np, data, baddr, len);
			segment = 1;
		} else {
			segment = -2;
		}
	} else {
		segment = 0;
	}

	return segment;
}

static int sym_scatter(struct sym_hcb *np, struct sym_ccb *cp, struct scsi_cmnd *cmd)
static int sym_scatter(struct sym_hcb *np, struct sym_ccb *cp, struct scsi_cmnd *cmd)
{
{
	int segment;
	int segment;
	int use_sg = (int) cmd->use_sg;
	int use_sg;


	cp->data_len = 0;
	cp->data_len = 0;


	if (!use_sg)
	use_sg = map_scsi_sg_data(np, cmd);
		segment = sym_scatter_no_sglist(np, cp, cmd);
	if (use_sg > 0) {
	else if ((use_sg = map_scsi_sg_data(np, cmd)) > 0) {
		struct scatterlist *sg;
		struct scatterlist *scatter = (struct scatterlist *)cmd->request_buffer;
		struct sym_tcb *tp = &np->target[cp->target];
		struct sym_tcb *tp = &np->target[cp->target];
		struct sym_tblmove *data;
		struct sym_tblmove *data;


@@ -381,9 +320,9 @@ static int sym_scatter(struct sym_hcb *np, struct sym_ccb *cp, struct scsi_cmnd


		data = &cp->phys.data[SYM_CONF_MAX_SG - use_sg];
		data = &cp->phys.data[SYM_CONF_MAX_SG - use_sg];


		for (segment = 0; segment < use_sg; segment++) {
		scsi_for_each_sg(cmd, sg, use_sg, segment) {
			dma_addr_t baddr = sg_dma_address(&scatter[segment]);
			dma_addr_t baddr = sg_dma_address(sg);
			unsigned int len = sg_dma_len(&scatter[segment]);
			unsigned int len = sg_dma_len(sg);


			if ((len & 1) && (tp->head.wval & EWS)) {
			if ((len & 1) && (tp->head.wval & EWS)) {
				len++;
				len++;
+1 −1
Original line number Original line Diff line number Diff line
@@ -255,7 +255,7 @@ sym_get_cam_status(struct scsi_cmnd *cmd)
 */
 */
static __inline void sym_set_cam_result_ok(struct sym_ccb *cp, struct scsi_cmnd *cmd, int resid)
static __inline void sym_set_cam_result_ok(struct sym_ccb *cp, struct scsi_cmnd *cmd, int resid)
{
{
	cmd->resid = resid;
	scsi_set_resid(cmd, resid);
	cmd->result = (((DID_OK) << 16) + ((cp->ssss_status) & 0x7f));
	cmd->result = (((DID_OK) << 16) + ((cp->ssss_status) & 0x7f));
}
}
void sym_set_cam_result_error(struct sym_hcb *np, struct sym_ccb *cp, int resid);
void sym_set_cam_result_error(struct sym_hcb *np, struct sym_ccb *cp, int resid);