[SCSI] stex: stex_internal_copy should be called with sg_count in struct st_ccb
[sfrench/cifs-2.6.git] / drivers / scsi / stex.c
index 72f6d8015358d6f52c967f51876d53cac2597c29..654430edf74db0525b35605e06b176126cb5aab1 100644 (file)
@@ -461,30 +461,14 @@ static void stex_internal_copy(struct scsi_cmnd *cmd,
        }
 }
 
-static int stex_direct_copy(struct scsi_cmnd *cmd,
-       const void *src, size_t count)
-{
-       size_t cp_len = count;
-       int n_elem = 0;
-
-       n_elem = scsi_dma_map(cmd);
-       if (n_elem < 0)
-               return 0;
-
-       stex_internal_copy(cmd, src, &cp_len, n_elem, ST_TO_CMD);
-
-       scsi_dma_unmap(cmd);
-
-       return cp_len == count;
-}
-
 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, ccb->sg_count, ST_FROM_CMD);
+       stex_internal_copy(ccb->cmd, p, &count, scsi_sg_count(ccb->cmd),
+                          ST_FROM_CMD);
        memset(p->base, 0, sizeof(u32)*6);
        *(unsigned long *)(p->base) = pci_resource_start(hba->pdev, 0);
        p->rom_addr = 0;
@@ -502,7 +486,8 @@ 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, ccb->sg_count, ST_TO_CMD);
+       stex_internal_copy(ccb->cmd, p, &count, scsi_sg_count(ccb->cmd),
+                          ST_TO_CMD);
 }
 
 static void
@@ -569,8 +554,10 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *))
                unsigned char page;
                page = cmd->cmnd[2] & 0x3f;
                if (page == 0x8 || page == 0x3f) {
-                       stex_direct_copy(cmd, ms10_caching_page,
-                                       sizeof(ms10_caching_page));
+                       size_t cp_len = sizeof(ms10_caching_page);
+                       stex_internal_copy(cmd, ms10_caching_page,
+                                          &cp_len, scsi_sg_count(cmd),
+                                          ST_TO_CMD);
                        cmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
                        done(cmd);
                } else
@@ -599,8 +586,10 @@ 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) {
-                       stex_direct_copy(cmd, console_inq_page,
-                               sizeof(console_inq_page));
+                       size_t cp_len = sizeof(console_inq_page);
+                       stex_internal_copy(cmd, console_inq_page,
+                                          &cp_len, scsi_sg_count(cmd),
+                                          ST_TO_CMD);
                        cmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
                        done(cmd);
                } else
@@ -609,6 +598,7 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *))
        case PASSTHRU_CMD:
                if (cmd->cmnd[1] == PASSTHRU_GET_DRVVER) {
                        struct st_drvver ver;
+                       size_t cp_len = sizeof(ver);
                        ver.major = ST_VER_MAJOR;
                        ver.minor = ST_VER_MINOR;
                        ver.oem = ST_OEM;
@@ -616,7 +606,9 @@ 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;
-                       cmd->result = stex_direct_copy(cmd, &ver, sizeof(ver)) ?
+                       stex_internal_copy(cmd, &ver, &cp_len,
+                                          scsi_sg_count(cmd), ST_TO_CMD);
+                       cmd->result = sizeof(ver) == cp_len ?
                                DID_OK << 16 | COMMAND_COMPLETE << 8 :
                                DID_ERROR << 16 | COMMAND_COMPLETE << 8;
                        done(cmd);
@@ -709,7 +701,7 @@ static void stex_copy_data(struct st_ccb *ccb,
        if (ccb->cmd == NULL)
                return;
        stex_internal_copy(ccb->cmd,
-               resp->variable, &count, ccb->sg_count, ST_TO_CMD);
+               resp->variable, &count, scsi_sg_count(ccb->cmd), ST_TO_CMD);
 }
 
 static void stex_ys_commands(struct st_hba *hba,
@@ -734,7 +726,7 @@ static void stex_ys_commands(struct st_hba *hba,
 
                count = STEX_EXTRA_SIZE;
                stex_internal_copy(ccb->cmd, hba->copy_buffer,
-                       &count, ccb->sg_count, ST_FROM_CMD);
+                       &count, scsi_sg_count(ccb->cmd), ST_FROM_CMD);
                inq_data = (ST_INQ *)hba->copy_buffer;
                if (inq_data->DeviceTypeQualifier != 0)
                        ccb->srb_status = SRB_STATUS_SELECTION_TIMEOUT;