[SCSI] megaraid_sas: Load io_request DataLength in bytes
authoradam radford <aradford@gmail.com>
Tue, 2 Oct 2012 02:27:07 +0000 (19:27 -0700)
committerJames Bottomley <JBottomley@Parallels.com>
Tue, 9 Oct 2012 10:17:26 +0000 (11:17 +0100)
Load io_request->DataLength in bytes for newer firmware that supports high
availability.

Signed-off-by: Adam Radford <aradford@gmail.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/megaraid/megaraid_sas_fusion.c

index 0af045e795a7c48f9fc34aab7d683c883464a9b4..31d397497c456db44d0b67a4a4a96303d6ff4043 100644 (file)
@@ -1184,8 +1184,6 @@ megasas_set_pd_lba(struct MPI2_RAID_SCSI_IO_REQUEST *io_request, u8 cdb_len,
                io_request->CDB.EEDP32.PrimaryReferenceTag =
                        cpu_to_be32(ref_tag);
                io_request->CDB.EEDP32.PrimaryApplicationTagMask = 0xffff;
-
-               io_request->DataLength = num_blocks * 512;
                io_request->IoFlags = 32; /* Specify 32-byte cdb */
 
                /* Transfer length */
@@ -1329,7 +1327,7 @@ megasas_build_ldio_fusion(struct megasas_instance *instance,
                          struct megasas_cmd_fusion *cmd)
 {
        u8 fp_possible;
-       u32 start_lba_lo, start_lba_hi, device_id;
+       u32 start_lba_lo, start_lba_hi, device_id, datalength = 0;
        struct MPI2_RAID_SCSI_IO_REQUEST *io_request;
        union MEGASAS_REQUEST_DESCRIPTOR_UNION *req_desc;
        struct IO_REQUEST_INFO io_info;
@@ -1355,7 +1353,7 @@ megasas_build_ldio_fusion(struct megasas_instance *instance,
         * 6-byte READ(0x08) or WRITE(0x0A) cdb
         */
        if (scp->cmd_len == 6) {
-               io_request->DataLength = (u32) scp->cmnd[4];
+               datalength = (u32) scp->cmnd[4];
                start_lba_lo = ((u32) scp->cmnd[1] << 16) |
                        ((u32) scp->cmnd[2] << 8) | (u32) scp->cmnd[3];
 
@@ -1366,7 +1364,7 @@ megasas_build_ldio_fusion(struct megasas_instance *instance,
         * 10-byte READ(0x28) or WRITE(0x2A) cdb
         */
        else if (scp->cmd_len == 10) {
-               io_request->DataLength = (u32) scp->cmnd[8] |
+               datalength = (u32) scp->cmnd[8] |
                        ((u32) scp->cmnd[7] << 8);
                start_lba_lo = ((u32) scp->cmnd[2] << 24) |
                        ((u32) scp->cmnd[3] << 16) |
@@ -1377,7 +1375,7 @@ megasas_build_ldio_fusion(struct megasas_instance *instance,
         * 12-byte READ(0xA8) or WRITE(0xAA) cdb
         */
        else if (scp->cmd_len == 12) {
-               io_request->DataLength = ((u32) scp->cmnd[6] << 24) |
+               datalength = ((u32) scp->cmnd[6] << 24) |
                        ((u32) scp->cmnd[7] << 16) |
                        ((u32) scp->cmnd[8] << 8) | (u32) scp->cmnd[9];
                start_lba_lo = ((u32) scp->cmnd[2] << 24) |
@@ -1389,7 +1387,7 @@ megasas_build_ldio_fusion(struct megasas_instance *instance,
         * 16-byte READ(0x88) or WRITE(0x8A) cdb
         */
        else if (scp->cmd_len == 16) {
-               io_request->DataLength = ((u32) scp->cmnd[10] << 24) |
+               datalength = ((u32) scp->cmnd[10] << 24) |
                        ((u32) scp->cmnd[11] << 16) |
                        ((u32) scp->cmnd[12] << 8) | (u32) scp->cmnd[13];
                start_lba_lo = ((u32) scp->cmnd[6] << 24) |
@@ -1403,8 +1401,9 @@ megasas_build_ldio_fusion(struct megasas_instance *instance,
 
        memset(&io_info, 0, sizeof(struct IO_REQUEST_INFO));
        io_info.ldStartBlock = ((u64)start_lba_hi << 32) | start_lba_lo;
-       io_info.numBlocks = io_request->DataLength;
+       io_info.numBlocks = datalength;
        io_info.ldTgtId = device_id;
+       io_request->DataLength = scsi_bufflen(scp);
 
        if (scp->sc_data_direction == PCI_DMA_FROMDEVICE)
                io_info.isRead = 1;
@@ -1431,7 +1430,6 @@ megasas_build_ldio_fusion(struct megasas_instance *instance,
        if (fp_possible) {
                megasas_set_pd_lba(io_request, scp->cmd_len, &io_info, scp,
                                   local_map_ptr, start_lba_lo);
-               io_request->DataLength = scsi_bufflen(scp);
                io_request->Function = MPI2_FUNCTION_SCSI_IO_REQUEST;
                cmd->request_desc->SCSIIO.RequestFlags =
                        (MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY