aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/ncr53c8xx.c70
1 files changed, 11 insertions, 59 deletions
diff --git a/drivers/scsi/ncr53c8xx.c b/drivers/scsi/ncr53c8xx.c
index bbf521cbc55d..030ba49f33ff 100644
--- a/drivers/scsi/ncr53c8xx.c
+++ b/drivers/scsi/ncr53c8xx.c
@@ -529,43 +529,20 @@ static void __unmap_scsi_data(struct device *dev, struct scsi_cmnd *cmd)
529{ 529{
530 switch(cmd->__data_mapped) { 530 switch(cmd->__data_mapped) {
531 case 2: 531 case 2:
532 dma_unmap_sg(dev, cmd->request_buffer, cmd->use_sg, 532 scsi_dma_unmap(cmd);
533 cmd->sc_data_direction);
534 break;
535 case 1:
536 dma_unmap_single(dev, cmd->__data_mapping,
537 cmd->request_bufflen,
538 cmd->sc_data_direction);
539 break; 533 break;
540 } 534 }
541 cmd->__data_mapped = 0; 535 cmd->__data_mapped = 0;
542} 536}
543 537
544static u_long __map_scsi_single_data(struct device *dev, struct scsi_cmnd *cmd)
545{
546 dma_addr_t mapping;
547
548 if (cmd->request_bufflen == 0)
549 return 0;
550
551 mapping = dma_map_single(dev, cmd->request_buffer,
552 cmd->request_bufflen,
553 cmd->sc_data_direction);
554 cmd->__data_mapped = 1;
555 cmd->__data_mapping = mapping;
556
557 return mapping;
558}
559
560static int __map_scsi_sg_data(struct device *dev, struct scsi_cmnd *cmd) 538static int __map_scsi_sg_data(struct device *dev, struct scsi_cmnd *cmd)
561{ 539{
562 int use_sg; 540 int use_sg;
563 541
564 if (cmd->use_sg == 0) 542 use_sg = scsi_dma_map(cmd);
543 if (!use_sg)
565 return 0; 544 return 0;
566 545
567 use_sg = dma_map_sg(dev, cmd->request_buffer, cmd->use_sg,
568 cmd->sc_data_direction);
569 cmd->__data_mapped = 2; 546 cmd->__data_mapped = 2;
570 cmd->__data_mapping = use_sg; 547 cmd->__data_mapping = use_sg;
571 548
@@ -573,7 +550,6 @@ static int __map_scsi_sg_data(struct device *dev, struct scsi_cmnd *cmd)
573} 550}
574 551
575#define unmap_scsi_data(np, cmd) __unmap_scsi_data(np->dev, cmd) 552#define unmap_scsi_data(np, cmd) __unmap_scsi_data(np->dev, cmd)
576#define map_scsi_single_data(np, cmd) __map_scsi_single_data(np->dev, cmd)
577#define map_scsi_sg_data(np, cmd) __map_scsi_sg_data(np->dev, cmd) 553#define map_scsi_sg_data(np, cmd) __map_scsi_sg_data(np->dev, cmd)
578 554
579/*========================================================== 555/*==========================================================
@@ -7667,39 +7643,16 @@ fail:
7667** sizes to the data segment array. 7643** sizes to the data segment array.
7668*/ 7644*/
7669 7645
7670static int ncr_scatter_no_sglist(struct ncb *np, struct ccb *cp, struct scsi_cmnd *cmd)
7671{
7672 struct scr_tblmove *data = &cp->phys.data[MAX_SCATTER - 1];
7673 int segment;
7674
7675 cp->data_len = cmd->request_bufflen;
7676
7677 if (cmd->request_bufflen) {
7678 dma_addr_t baddr = map_scsi_single_data(np, cmd);
7679 if (baddr) {
7680 ncr_build_sge(np, data, baddr, cmd->request_bufflen);
7681 segment = 1;
7682 } else {
7683 segment = -2;
7684 }
7685 } else {
7686 segment = 0;
7687 }
7688
7689 return segment;
7690}
7691
7692static int ncr_scatter(struct ncb *np, struct ccb *cp, struct scsi_cmnd *cmd) 7646static int ncr_scatter(struct ncb *np, struct ccb *cp, struct scsi_cmnd *cmd)
7693{ 7647{
7694 int segment = 0; 7648 int segment = 0;
7695 int use_sg = (int) cmd->use_sg; 7649 int use_sg = scsi_sg_count(cmd);
7696 7650
7697 cp->data_len = 0; 7651 cp->data_len = 0;
7698 7652
7699 if (!use_sg) 7653 use_sg = map_scsi_sg_data(np, cmd);
7700 segment = ncr_scatter_no_sglist(np, cp, cmd); 7654 if (use_sg > 0) {
7701 else if ((use_sg = map_scsi_sg_data(np, cmd)) > 0) { 7655 struct scatterlist *sg;
7702 struct scatterlist *scatter = (struct scatterlist *)cmd->request_buffer;
7703 struct scr_tblmove *data; 7656 struct scr_tblmove *data;
7704 7657
7705 if (use_sg > MAX_SCATTER) { 7658 if (use_sg > MAX_SCATTER) {
@@ -7709,16 +7662,15 @@ static int ncr_scatter(struct ncb *np, struct ccb *cp, struct scsi_cmnd *cmd)
7709 7662
7710 data = &cp->phys.data[MAX_SCATTER - use_sg]; 7663 data = &cp->phys.data[MAX_SCATTER - use_sg];
7711 7664
7712 for (segment = 0; segment < use_sg; segment++) { 7665 scsi_for_each_sg(cmd, sg, use_sg, segment) {
7713 dma_addr_t baddr = sg_dma_address(&scatter[segment]); 7666 dma_addr_t baddr = sg_dma_address(sg);
7714 unsigned int len = sg_dma_len(&scatter[segment]); 7667 unsigned int len = sg_dma_len(sg);
7715 7668
7716 ncr_build_sge(np, &data[segment], baddr, len); 7669 ncr_build_sge(np, &data[segment], baddr, len);
7717 cp->data_len += len; 7670 cp->data_len += len;
7718 } 7671 }
7719 } else { 7672 } else
7720 segment = -2; 7673 segment = -2;
7721 }
7722 7674
7723 return segment; 7675 return segment;
7724} 7676}