u32             sizeRead = 0;
        u32             ret = 0;
        u32             length = 1024 * 16 + sizeof(*payload) - 1;
+       u32             fc_len;
+       u8              *read_buf;
 
        if (pm8001_ha->fw_image->size < 28) {
                pm8001_ha->fw_status = FAIL_FILE_SIZE;
                        fwControl->retcode = 0;/* OUT */
                        fwControl->offset = loopNumber * IOCTL_BUF_SIZE;/*OUT */
 
-               /* for the last chunk of data in case file size is not even with
-               4k, load only the rest*/
-               if (((loopcount-loopNumber) == 1) &&
-                       ((partitionSize + HEADER_LEN) % IOCTL_BUF_SIZE)) {
-                       fwControl->len =
-                               (partitionSize + HEADER_LEN) % IOCTL_BUF_SIZE;
-                       memcpy((u8 *)fwControl->buffer,
-                               (u8 *)pm8001_ha->fw_image->data + sizeRead,
-                               (partitionSize + HEADER_LEN) % IOCTL_BUF_SIZE);
-                       sizeRead +=
-                               (partitionSize + HEADER_LEN) % IOCTL_BUF_SIZE;
-               } else {
-                       memcpy((u8 *)fwControl->buffer,
-                               (u8 *)pm8001_ha->fw_image->data + sizeRead,
-                               IOCTL_BUF_SIZE);
-                       sizeRead += IOCTL_BUF_SIZE;
-               }
-
-               pm8001_ha->nvmd_completion = &completion;
-               ret = PM8001_CHIP_DISP->fw_flash_update_req(pm8001_ha, payload);
-               if (ret) {
-                       pm8001_ha->fw_status = FAIL_OUT_MEMORY;
-                       goto out;
-               }
-               wait_for_completion(&completion);
-               if (fwControl->retcode > FLASH_UPDATE_IN_PROGRESS) {
-                       pm8001_ha->fw_status = fwControl->retcode;
-                       ret = -EFAULT;
-                       goto out;
-               }
+                       /*
+                        * for the last chunk of data in case file size is
+                        * not even with 4k, load only the rest
+                        */
+
+                       read_buf  = (u8 *)pm8001_ha->fw_image->data + sizeRead;
+                       fc_len = (partitionSize + HEADER_LEN) % IOCTL_BUF_SIZE;
+
+                       if (loopcount - loopNumber == 1 && fc_len) {
+                               fwControl->len = fc_len;
+                               memcpy((u8 *)fwControl->buffer, read_buf, fc_len);
+                               sizeRead += fc_len;
+                       } else {
+                               memcpy((u8 *)fwControl->buffer, read_buf, IOCTL_BUF_SIZE);
+                               sizeRead += IOCTL_BUF_SIZE;
+                       }
+
+                       pm8001_ha->nvmd_completion = &completion;
+                       ret = PM8001_CHIP_DISP->fw_flash_update_req(pm8001_ha, payload);
+                       if (ret) {
+                               pm8001_ha->fw_status = FAIL_OUT_MEMORY;
+                               goto out;
+                       }
+                       wait_for_completion(&completion);
+                       if (fwControl->retcode > FLASH_UPDATE_IN_PROGRESS) {
+                               pm8001_ha->fw_status = fwControl->retcode;
+                               ret = -EFAULT;
+                               goto out;
+                       }
                }
        }
 out: