diff options
| -rw-r--r-- | drivers/scsi/ncr53c8xx.c | 70 |
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 | ||
| 544 | static 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 | |||
| 560 | static int __map_scsi_sg_data(struct device *dev, struct scsi_cmnd *cmd) | 538 | static 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 | ||
| 7670 | static 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 | |||
| 7692 | static int ncr_scatter(struct ncb *np, struct ccb *cp, struct scsi_cmnd *cmd) | 7646 | static 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 | } |
