[SCSI] stex: use sg buffer copy helper functions
authorFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Sun, 9 Mar 2008 04:44:35 +0000 (13:44 +0900)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Mon, 7 Apr 2008 17:15:46 +0000 (12:15 -0500)
This replaces stex_internal_copy with scsi_sg_copy_to/from_buffer.

Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Acked-by: Ed Lin <ed.lin@promise.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
drivers/scsi/stex.c

index 654430e..8c7b183 100644 (file)
@@ -426,49 +426,13 @@ static int stex_map_sg(struct st_hba *hba,
        return 0;
 }
 
-static void stex_internal_copy(struct scsi_cmnd *cmd,
-       const void *src, size_t *count, int sg_count, int direction)
-{
-       size_t lcount;
-       size_t len;
-       void *s, *d, *base = NULL;
-       size_t offset;
-
-       if (*count > scsi_bufflen(cmd))
-               *count = scsi_bufflen(cmd);
-       lcount = *count;
-       while (lcount) {
-               len = lcount;
-               s = (void *)src;
-
-               offset = *count - lcount;
-               s += offset;
-               base = scsi_kmap_atomic_sg(scsi_sglist(cmd),
-                                          sg_count, &offset, &len);
-               if (!base) {
-                       *count -= lcount;
-                       return;
-               }
-               d = base + offset;
-
-               if (direction == ST_TO_CMD)
-                       memcpy(d, s, len);
-               else
-                       memcpy(s, d, len);
-
-               lcount -= len;
-               scsi_kunmap_atomic_sg(base);
-       }
-}
-
 static void stex_controller_info(struct st_hba *hba, struct st_ccb *ccb)
 {
        struct st_frame *p;
        size_t count = sizeof(struct st_frame);
 
        p = hba->copy_buffer;
-       stex_internal_copy(ccb->cmd, p, &count, scsi_sg_count(ccb->cmd),
-                          ST_FROM_CMD);
+       count = scsi_sg_copy_to_buffer(ccb->cmd, p, count);
        memset(p->base, 0, sizeof(u32)*6);
        *(unsigned long *)(p->base) = pci_resource_start(hba->pdev, 0);
        p->rom_addr = 0;
@@ -486,8 +450,7 @@ static void stex_controller_info(struct st_hba *hba, struct st_ccb *ccb)
        p->subid =
                hba->pdev->subsystem_vendor << 16 | hba->pdev->subsystem_device;
 
-       stex_internal_copy(ccb->cmd, p, &count, scsi_sg_count(ccb->cmd),
-                          ST_TO_CMD);
+       count = scsi_sg_copy_from_buffer(ccb->cmd, p, count);
 }
 
 static void
@@ -554,10 +517,8 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *))
                unsigned char page;
                page = cmd->cmnd[2] & 0x3f;
                if (page == 0x8 || page == 0x3f) {
-                       size_t cp_len = sizeof(ms10_caching_page);
-                       stex_internal_copy(cmd, ms10_caching_page,
-                                          &cp_len, scsi_sg_count(cmd),
-                                          ST_TO_CMD);
+                       scsi_sg_copy_from_buffer(cmd, ms10_caching_page,
+                                                sizeof(ms10_caching_page));
                        cmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
                        done(cmd);
                } else
@@ -586,10 +547,8 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *))
                if (id != host->max_id - 1)
                        break;
                if (lun == 0 && (cmd->cmnd[1] & INQUIRY_EVPD) == 0) {
-                       size_t cp_len = sizeof(console_inq_page);
-                       stex_internal_copy(cmd, console_inq_page,
-                                          &cp_len, scsi_sg_count(cmd),
-                                          ST_TO_CMD);
+                       scsi_sg_copy_from_buffer(cmd, (void *)console_inq_page,
+                                                sizeof(console_inq_page));
                        cmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
                        done(cmd);
                } else
@@ -606,8 +565,7 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *))
                        ver.signature[0] = PASSTHRU_SIGNATURE;
                        ver.console_id = host->max_id - 1;
                        ver.host_no = hba->host->host_no;
-                       stex_internal_copy(cmd, &ver, &cp_len,
-                                          scsi_sg_count(cmd), ST_TO_CMD);
+                       cp_len = scsi_sg_copy_from_buffer(cmd, &ver, cp_len);
                        cmd->result = sizeof(ver) == cp_len ?
                                DID_OK << 16 | COMMAND_COMPLETE << 8 :
                                DID_ERROR << 16 | COMMAND_COMPLETE << 8;
@@ -700,15 +658,12 @@ static void stex_copy_data(struct st_ccb *ccb,
 
        if (ccb->cmd == NULL)
                return;
-       stex_internal_copy(ccb->cmd,
-               resp->variable, &count, scsi_sg_count(ccb->cmd), ST_TO_CMD);
+       count = scsi_sg_copy_from_buffer(ccb->cmd, resp->variable, count);
 }
 
 static void stex_ys_commands(struct st_hba *hba,
        struct st_ccb *ccb, struct status_msg *resp)
 {
-       size_t count;
-
        if (ccb->cmd->cmnd[0] == MGT_CMD &&
                resp->scsi_status != SAM_STAT_CHECK_CONDITION) {
                scsi_set_resid(ccb->cmd, scsi_bufflen(ccb->cmd) -
@@ -724,9 +679,8 @@ static void stex_ys_commands(struct st_hba *hba,
                resp->scsi_status == SAM_STAT_GOOD) {
                ST_INQ *inq_data;
 
-               count = STEX_EXTRA_SIZE;
-               stex_internal_copy(ccb->cmd, hba->copy_buffer,
-                       &count, scsi_sg_count(ccb->cmd), ST_FROM_CMD);
+               scsi_sg_copy_to_buffer(ccb->cmd, hba->copy_buffer,
+                                      STEX_EXTRA_SIZE);
                inq_data = (ST_INQ *)hba->copy_buffer;
                if (inq_data->DeviceTypeQualifier != 0)
                        ccb->srb_status = SRB_STATUS_SELECTION_TIMEOUT;