}
  
        xfer_cnt = le32_to_cpu(mpi_reply->TransferCount);
-       if (unlikely(scmd->request->cmd_type == REQ_TYPE_FS && sector_sz &&
 +
 +      /* In case of bogus fw or device, we could end up having
 +       * unaligned partial completion. We can force alignment here,
 +       * then scsi-ml does not need to handle this misbehavior.
 +       */
 +      sector_sz = scmd->device->sector_size;
++      if (unlikely(!blk_rq_is_passthrough(scmd->request) && sector_sz &&
 +                   xfer_cnt % sector_sz)) {
 +              sdev_printk(KERN_INFO, scmd->device,
 +                  "unaligned partial completion avoided (xfer_cnt=%u, sector_sz=%u)\n",
 +                          xfer_cnt, sector_sz);
 +              xfer_cnt = round_down(xfer_cnt, sector_sz);
 +      }
 +
        scsi_set_resid(scmd, scsi_bufflen(scmd) - xfer_cnt);
        if (ioc_status & MPI2_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE)
                log_info =  le32_to_cpu(mpi_reply->IOCLogInfo);