This reverts commit b32dda34506b4f486bc803d0c7251f987edd2455.

Currently, scsi is broken and causes data abort. I did a bisect and found
that this commit was the cause. Reverting it and scsi is working again.

=== Error Log with data abort

U-Boot 2026.01-rc4-tld-1-g0e0a198a68be (Dec 08 2025 - 17:42:05 -0800)
Synology DS116

DS116> scsi reset

Reset SCSI
scanning bus for devices...
Target spinup took 0 ms.
SATA link 1 timeout.
AHCI 0001.0000 32 slots 2 ports 6 Gbps 0x3 impl SATA mode
flags: 64bit ncq led only pmp fbss pio slum part sxs
  Device 0: (0:0) Vendor: ATA Prod.: FUJITSU MHY2250B Rev: 890B
            Type: Hard Disk
            Capacity: 238475.1 MB = 232.8 GB (488397169 x 512)

DS116> ext2ls scsi 0:1 /boot
data abort
pc : [<3ffa5d3e>]          lr : [<3ffc1515>]
sp : 3fb65ad8  ip : 0000000c     fp : 3fb7f220
r10: 00002710  r9 : 3fb6aed0     r8 : 3fb85e40
r7 : f10a8100  r6 : 000003e8     r5 : 000003e8  r4 : 3fb65ae0
r3 : e38e39c1  r2 : 00000000     r1 : 3fb65ae0  r0 : 00931767
Flags: Nzcv  IRQs off  FIQs off  Mode SVC_32 (T)
Code: 3ffd b510 6803 460c (6bdb) 681b

Signed-off-by: Tony Dinh <[email protected]>
---

 drivers/scsi/scsi.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index b414d022f3f..715271b1d69 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -228,11 +228,13 @@ static ulong scsi_read(struct udevice *dev, lbaint_t 
blknr, lbaint_t blkcnt,
                        blocks = max_blks;
                        scsi_setup_read_ext(pccb, start, blocks);
                        start += max_blks;
+                       blks -= max_blks;
                } else {
                        pccb->datalen = block_dev->blksz * blks;
                        blocks = blks;
                        scsi_setup_read_ext(pccb, start, blocks);
                        start += blks;
+                       blks = 0;
                }
                debug("scsi_read_ext: startblk " LBAF
                      ", blccnt " LBAF " buffer %lX\n",
@@ -242,7 +244,6 @@ static ulong scsi_read(struct udevice *dev, lbaint_t blknr, 
lbaint_t blkcnt,
                        blkcnt -= blks;
                        break;
                }
-               blks -= blocks;
                buf_addr += pccb->datalen;
        } while (blks != 0);
        debug("scsi_read_ext: end startblk " LBAF
@@ -285,11 +286,13 @@ static ulong scsi_write(struct udevice *dev, lbaint_t 
blknr, lbaint_t blkcnt,
                        blocks = max_blks;
                        scsi_setup_write_ext(pccb, start, blocks);
                        start += max_blks;
+                       blks -= max_blks;
                } else {
                        pccb->datalen = block_dev->blksz * blks;
                        blocks = blks;
                        scsi_setup_write_ext(pccb, start, blocks);
                        start += blks;
+                       blks = 0;
                }
                debug("%s: startblk " LBAF ", blccnt " LBAF " buffer %lx\n",
                      __func__, start, blocks, buf_addr);
@@ -298,7 +301,6 @@ static ulong scsi_write(struct udevice *dev, lbaint_t 
blknr, lbaint_t blkcnt,
                        blkcnt -= blks;
                        break;
                }
-               blks -= blocks;
                buf_addr += pccb->datalen;
        } while (blks != 0);
 
@@ -320,7 +322,7 @@ static ulong scsi_erase(struct udevice *dev, lbaint_t 
blknr, lbaint_t blkcnt)
        struct blk_desc *block_dev = dev_get_uclass_plat(dev);
        struct udevice *bdev = dev->parent;
        struct scsi_plat *uc_plat = dev_get_uclass_plat(bdev);
-       lbaint_t start, blks, max_blks, blocks;
+       lbaint_t start, blks, max_blks;
        struct scsi_cmd *pccb = (struct scsi_cmd *)&tempccb;
 
        /* Setup device */
@@ -337,20 +339,19 @@ static ulong scsi_erase(struct udevice *dev, lbaint_t 
blknr, lbaint_t blkcnt)
              __func__, block_dev->devnum, start, blks);
        do {
                if (blks > max_blks) {
-                       blocks = max_blks;
                        scsi_setup_erase_ext(pccb, start, max_blks);
                        start += max_blks;
+                       blks -= max_blks;
                } else {
-                       blocks = blks;
                        scsi_setup_erase_ext(pccb, start, blks);
                        start += blks;
+                       blks = 0;
                }
                if (scsi_exec(bdev, pccb)) {
                        scsi_print_error(pccb);
                        blkcnt -= blks;
                        break;
                }
-               blks -= blocks;
        } while (blks != 0);
        return blkcnt;
 }
-- 
2.47.3

base-commit: 0e0a198a68be71148f5ec27ef86796174f91436f
branch: master

Reply via email to