aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/arcmsr/arcmsr_hba.c
diff options
context:
space:
mode:
authorFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2007-05-14 06:25:56 -0400
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>2007-05-27 23:28:21 -0400
commitdeff2627cda995c926788fd9192337ec3febe7b5 (patch)
treea343c6c2db67fdaff3bda9c2db8cdabb96ca2fc9 /drivers/scsi/arcmsr/arcmsr_hba.c
parent22c1a6600af920f4fef6d5cc51a8f04b58e9db83 (diff)
[SCSI] arcmsr: 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: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> Acked-by: Nick Cheng <nick.cheng@areca.com.tw> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/arcmsr/arcmsr_hba.c')
-rw-r--r--drivers/scsi/arcmsr/arcmsr_hba.c103
1 files changed, 31 insertions, 72 deletions
diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
index 8b46158cc045..672df79d7e39 100644
--- a/drivers/scsi/arcmsr/arcmsr_hba.c
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c
@@ -369,19 +369,9 @@ static void arcmsr_abort_allcmd(struct AdapterControlBlock *acb)
369 369
370static void arcmsr_pci_unmap_dma(struct CommandControlBlock *ccb) 370static void arcmsr_pci_unmap_dma(struct CommandControlBlock *ccb)
371{ 371{
372 struct AdapterControlBlock *acb = ccb->acb;
373 struct scsi_cmnd *pcmd = ccb->pcmd; 372 struct scsi_cmnd *pcmd = ccb->pcmd;
374 373
375 if (pcmd->use_sg != 0) { 374 scsi_dma_unmap(pcmd);
376 struct scatterlist *sl;
377
378 sl = (struct scatterlist *)pcmd->request_buffer;
379 pci_unmap_sg(acb->pdev, sl, pcmd->use_sg, pcmd->sc_data_direction);
380 }
381 else if (pcmd->request_bufflen != 0)
382 pci_unmap_single(acb->pdev,
383 pcmd->SCp.dma_handle,
384 pcmd->request_bufflen, pcmd->sc_data_direction);
385} 375}
386 376
387static void arcmsr_ccb_complete(struct CommandControlBlock *ccb, int stand_flag) 377static void arcmsr_ccb_complete(struct CommandControlBlock *ccb, int stand_flag)
@@ -551,6 +541,7 @@ static void arcmsr_build_ccb(struct AdapterControlBlock *acb,
551 int8_t *psge = (int8_t *)&arcmsr_cdb->u; 541 int8_t *psge = (int8_t *)&arcmsr_cdb->u;
552 uint32_t address_lo, address_hi; 542 uint32_t address_lo, address_hi;
553 int arccdbsize = 0x30; 543 int arccdbsize = 0x30;
544 int nseg;
554 545
555 ccb->pcmd = pcmd; 546 ccb->pcmd = pcmd;
556 memset(arcmsr_cdb, 0, sizeof (struct ARCMSR_CDB)); 547 memset(arcmsr_cdb, 0, sizeof (struct ARCMSR_CDB));
@@ -561,20 +552,20 @@ static void arcmsr_build_ccb(struct AdapterControlBlock *acb,
561 arcmsr_cdb->CdbLength = (uint8_t)pcmd->cmd_len; 552 arcmsr_cdb->CdbLength = (uint8_t)pcmd->cmd_len;
562 arcmsr_cdb->Context = (unsigned long)arcmsr_cdb; 553 arcmsr_cdb->Context = (unsigned long)arcmsr_cdb;
563 memcpy(arcmsr_cdb->Cdb, pcmd->cmnd, pcmd->cmd_len); 554 memcpy(arcmsr_cdb->Cdb, pcmd->cmnd, pcmd->cmd_len);
564 if (pcmd->use_sg) { 555
565 int length, sgcount, i, cdb_sgcount = 0; 556 nseg = scsi_dma_map(pcmd);
566 struct scatterlist *sl; 557 BUG_ON(nseg < 0);
567 558
568 /* Get Scatter Gather List from scsiport. */ 559 if (nseg) {
569 sl = (struct scatterlist *) pcmd->request_buffer; 560 int length, i, cdb_sgcount = 0;
570 sgcount = pci_map_sg(acb->pdev, sl, pcmd->use_sg, 561 struct scatterlist *sg;
571 pcmd->sc_data_direction); 562
572 /* map stor port SG list to our iop SG List. */ 563 /* map stor port SG list to our iop SG List. */
573 for (i = 0; i < sgcount; i++) { 564 scsi_for_each_sg(pcmd, sg, nseg, i) {
574 /* Get the physical address of the current data pointer */ 565 /* Get the physical address of the current data pointer */
575 length = cpu_to_le32(sg_dma_len(sl)); 566 length = cpu_to_le32(sg_dma_len(sg));
576 address_lo = cpu_to_le32(dma_addr_lo32(sg_dma_address(sl))); 567 address_lo = cpu_to_le32(dma_addr_lo32(sg_dma_address(sg)));
577 address_hi = cpu_to_le32(dma_addr_hi32(sg_dma_address(sl))); 568 address_hi = cpu_to_le32(dma_addr_hi32(sg_dma_address(sg)));
578 if (address_hi == 0) { 569 if (address_hi == 0) {
579 struct SG32ENTRY *pdma_sg = (struct SG32ENTRY *)psge; 570 struct SG32ENTRY *pdma_sg = (struct SG32ENTRY *)psge;
580 571
@@ -591,32 +582,12 @@ static void arcmsr_build_ccb(struct AdapterControlBlock *acb,
591 psge += sizeof (struct SG64ENTRY); 582 psge += sizeof (struct SG64ENTRY);
592 arccdbsize += sizeof (struct SG64ENTRY); 583 arccdbsize += sizeof (struct SG64ENTRY);
593 } 584 }
594 sl++;
595 cdb_sgcount++; 585 cdb_sgcount++;
596 } 586 }
597 arcmsr_cdb->sgcount = (uint8_t)cdb_sgcount; 587 arcmsr_cdb->sgcount = (uint8_t)cdb_sgcount;
598 arcmsr_cdb->DataLength = pcmd->request_bufflen; 588 arcmsr_cdb->DataLength = scsi_bufflen(pcmd);
599 if ( arccdbsize > 256) 589 if ( arccdbsize > 256)
600 arcmsr_cdb->Flags |= ARCMSR_CDB_FLAG_SGL_BSIZE; 590 arcmsr_cdb->Flags |= ARCMSR_CDB_FLAG_SGL_BSIZE;
601 } else if (pcmd->request_bufflen) {
602 dma_addr_t dma_addr;
603 dma_addr = pci_map_single(acb->pdev, pcmd->request_buffer,
604 pcmd->request_bufflen, pcmd->sc_data_direction);
605 pcmd->SCp.dma_handle = dma_addr;
606 address_lo = cpu_to_le32(dma_addr_lo32(dma_addr));
607 address_hi = cpu_to_le32(dma_addr_hi32(dma_addr));
608 if (address_hi == 0) {
609 struct SG32ENTRY *pdma_sg = (struct SG32ENTRY *)psge;
610 pdma_sg->address = address_lo;
611 pdma_sg->length = pcmd->request_bufflen;
612 } else {
613 struct SG64ENTRY *pdma_sg = (struct SG64ENTRY *)psge;
614 pdma_sg->addresshigh = address_hi;
615 pdma_sg->address = address_lo;
616 pdma_sg->length = pcmd->request_bufflen|IS_SG64_ADDR;
617 }
618 arcmsr_cdb->sgcount = 1;
619 arcmsr_cdb->DataLength = pcmd->request_bufflen;
620 } 591 }
621 if (pcmd->sc_data_direction == DMA_TO_DEVICE ) { 592 if (pcmd->sc_data_direction == DMA_TO_DEVICE ) {
622 arcmsr_cdb->Flags |= ARCMSR_CDB_FLAG_WRITE; 593 arcmsr_cdb->Flags |= ARCMSR_CDB_FLAG_WRITE;
@@ -848,24 +819,21 @@ static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, struct scsi_
848 struct CMD_MESSAGE_FIELD *pcmdmessagefld; 819 struct CMD_MESSAGE_FIELD *pcmdmessagefld;
849 int retvalue = 0, transfer_len = 0; 820 int retvalue = 0, transfer_len = 0;
850 char *buffer; 821 char *buffer;
822 struct scatterlist *sg;
851 uint32_t controlcode = (uint32_t ) cmd->cmnd[5] << 24 | 823 uint32_t controlcode = (uint32_t ) cmd->cmnd[5] << 24 |
852 (uint32_t ) cmd->cmnd[6] << 16 | 824 (uint32_t ) cmd->cmnd[6] << 16 |
853 (uint32_t ) cmd->cmnd[7] << 8 | 825 (uint32_t ) cmd->cmnd[7] << 8 |
854 (uint32_t ) cmd->cmnd[8]; 826 (uint32_t ) cmd->cmnd[8];
855 /* 4 bytes: Areca io control code */ 827 /* 4 bytes: Areca io control code */
856 if (cmd->use_sg) {
857 struct scatterlist *sg = (struct scatterlist *)cmd->request_buffer;
858 828
859 buffer = kmap_atomic(sg->page, KM_IRQ0) + sg->offset; 829 sg = scsi_sglist(cmd);
860 if (cmd->use_sg > 1) { 830 buffer = kmap_atomic(sg->page, KM_IRQ0) + sg->offset;
861 retvalue = ARCMSR_MESSAGE_FAIL; 831 if (scsi_sg_count(cmd) > 1) {
862 goto message_out; 832 retvalue = ARCMSR_MESSAGE_FAIL;
863 } 833 goto message_out;
864 transfer_len += sg->length;
865 } else {
866 buffer = cmd->request_buffer;
867 transfer_len = cmd->request_bufflen;
868 } 834 }
835 transfer_len += sg->length;
836
869 if (transfer_len > sizeof(struct CMD_MESSAGE_FIELD)) { 837 if (transfer_len > sizeof(struct CMD_MESSAGE_FIELD)) {
870 retvalue = ARCMSR_MESSAGE_FAIL; 838 retvalue = ARCMSR_MESSAGE_FAIL;
871 goto message_out; 839 goto message_out;
@@ -1057,12 +1025,9 @@ static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, struct scsi_
1057 retvalue = ARCMSR_MESSAGE_FAIL; 1025 retvalue = ARCMSR_MESSAGE_FAIL;
1058 } 1026 }
1059 message_out: 1027 message_out:
1060 if (cmd->use_sg) { 1028 sg = scsi_sglist(cmd);
1061 struct scatterlist *sg; 1029 kunmap_atomic(buffer - sg->offset, KM_IRQ0);
1062 1030
1063 sg = (struct scatterlist *) cmd->request_buffer;
1064 kunmap_atomic(buffer - sg->offset, KM_IRQ0);
1065 }
1066 return retvalue; 1031 return retvalue;
1067} 1032}
1068 1033
@@ -1085,6 +1050,7 @@ static void arcmsr_handle_virtual_command(struct AdapterControlBlock *acb,
1085 case INQUIRY: { 1050 case INQUIRY: {
1086 unsigned char inqdata[36]; 1051 unsigned char inqdata[36];
1087 char *buffer; 1052 char *buffer;
1053 struct scatterlist *sg;
1088 1054
1089 if (cmd->device->lun) { 1055 if (cmd->device->lun) {
1090 cmd->result = (DID_TIME_OUT << 16); 1056 cmd->result = (DID_TIME_OUT << 16);
@@ -1104,21 +1070,14 @@ static void arcmsr_handle_virtual_command(struct AdapterControlBlock *acb,
1104 strncpy(&inqdata[16], "RAID controller ", 16); 1070 strncpy(&inqdata[16], "RAID controller ", 16);
1105 /* Product Identification */ 1071 /* Product Identification */
1106 strncpy(&inqdata[32], "R001", 4); /* Product Revision */ 1072 strncpy(&inqdata[32], "R001", 4); /* Product Revision */
1107 if (cmd->use_sg) {
1108 struct scatterlist *sg;
1109 1073
1110 sg = (struct scatterlist *) cmd->request_buffer; 1074 sg = scsi_sglist(cmd);
1111 buffer = kmap_atomic(sg->page, KM_IRQ0) + sg->offset; 1075 buffer = kmap_atomic(sg->page, KM_IRQ0) + sg->offset;
1112 } else { 1076
1113 buffer = cmd->request_buffer;
1114 }
1115 memcpy(buffer, inqdata, sizeof(inqdata)); 1077 memcpy(buffer, inqdata, sizeof(inqdata));
1116 if (cmd->use_sg) { 1078 sg = scsi_sglist(cmd);
1117 struct scatterlist *sg; 1079 kunmap_atomic(buffer - sg->offset, KM_IRQ0);
1118 1080
1119 sg = (struct scatterlist *) cmd->request_buffer;
1120 kunmap_atomic(buffer - sg->offset, KM_IRQ0);
1121 }
1122 cmd->scsi_done(cmd); 1081 cmd->scsi_done(cmd);
1123 } 1082 }
1124 break; 1083 break;