[SCSI] megaraid_sas: Fix megasas_ioc_init_fusion
authoradam radford <aradford@gmail.com>
Mon, 10 Mar 2014 09:51:36 +0000 (02:51 -0700)
committerJames Bottomley <JBottomley@Parallels.com>
Sat, 15 Mar 2014 17:19:21 +0000 (10:19 -0700)
The following patch for megaraid_sas fixes the megasas_ioc_init_fusion
function to use a local stack variable for the IOCinit frame physical address
instead of clobbering the first request descriptor.

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

index 9c4b342..f77715a 100644 (file)
@@ -585,7 +585,7 @@ megasas_ioc_init_fusion(struct megasas_instance *instance)
        struct megasas_cmd *cmd;
        u8 ret;
        struct fusion_context *fusion;
-       union MEGASAS_REQUEST_DESCRIPTOR_UNION *req_desc;
+       union MEGASAS_REQUEST_DESCRIPTOR_UNION req_desc;
        int i;
        struct megasas_header *frame_hdr;
 
@@ -650,15 +650,12 @@ megasas_ioc_init_fusion(struct megasas_instance *instance)
                cpu_to_le32(lower_32_bits(ioc_init_handle));
        init_frame->data_xfer_len = cpu_to_le32(sizeof(struct MPI2_IOC_INIT_REQUEST));
 
-       req_desc =
-         (union MEGASAS_REQUEST_DESCRIPTOR_UNION *)fusion->req_frames_desc;
-
-       req_desc->Words = 0;
-       req_desc->MFAIo.RequestFlags =
+       req_desc.Words = 0;
+       req_desc.MFAIo.RequestFlags =
                (MEGASAS_REQ_DESCRIPT_FLAGS_MFA <<
                 MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
-       cpu_to_le32s((u32 *)&req_desc->MFAIo);
-       req_desc->Words |= cpu_to_le64(cmd->frame_phys_addr);
+       cpu_to_le32s((u32 *)&req_desc.MFAIo);
+       req_desc.Words |= cpu_to_le64(cmd->frame_phys_addr);
 
        /*
         * disable the intr before firing the init frame
@@ -672,8 +669,8 @@ megasas_ioc_init_fusion(struct megasas_instance *instance)
                        break;
        }
 
-       instance->instancet->fire_cmd(instance, req_desc->u.low,
-                                     req_desc->u.high, instance->reg_set);
+       instance->instancet->fire_cmd(instance, req_desc.u.low,
+                                     req_desc.u.high, instance->reg_set);
 
        wait_and_poll(instance, cmd);