From 34a44dad743b557542edf5b48f789e6bb6442628 Mon Sep 17 00:00:00 2001 From: Balaji Selvanathan Date: Thu, 16 Apr 2026 14:40:46 +0530 Subject: [PATCH 1/2] Revert "scsi: sync cache on write" While the SYNC_CACHE approach prevents data loss during board resets, it causes system hangs during large sparse image flashing operations. This will be replaced with a FUA (Force Unit Access) approach in future commit, which achieves the same data integrity goal more efficiently. This reverts commit ffe4e6ab42d2534302be825e49a2d085acf80f30. Signed-off-by: Balaji Selvanathan Reviewed-by: Simon Glass --- drivers/scsi/scsi.c | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index 116b696b08d..9a417795851 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c @@ -82,23 +82,6 @@ static void scsi_setup_inquiry(struct scsi_cmd *pccb) pccb->msgout[0] = SCSI_IDENTIFY; /* NOT USED */ } -static void scsi_setup_sync_cache(struct scsi_cmd *pccb, lbaint_t start, - lbaint_t blocks) -{ - pccb->cmd[0] = SCSI_SYNC_CACHE; - pccb->cmd[1] = 0; - pccb->cmd[2] = (unsigned char)(start >> 24) & 0xff; - pccb->cmd[3] = (unsigned char)(start >> 16) & 0xff; - pccb->cmd[4] = (unsigned char)(start >> 8) & 0xff; - pccb->cmd[5] = (unsigned char)start & 0xff; - pccb->cmd[6] = 0; - pccb->cmd[7] = (unsigned char)(blocks >> 8) & 0xff; - pccb->cmd[8] = (unsigned char)blocks & 0xff; - pccb->cmd[9] = 0; - pccb->cmdlen = 10; - pccb->msgout[0] = SCSI_IDENTIFY; /* NOT USED */ -} - static void scsi_setup_read_ext(struct scsi_cmd *pccb, lbaint_t start, lbaint_t blocks) { @@ -301,11 +284,6 @@ static ulong scsi_write(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt, buf_addr += pccb->datalen; } while (blks != 0); - /* Flush the SCSI cache so we don't lose data on board reset. */ - scsi_setup_sync_cache(pccb, 0, 0); - if (scsi_exec(bdev, pccb)) - scsi_print_error(pccb); - debug("%s: end startblk " LBAF ", blccnt " LBAF " buffer %lX\n", __func__, start, blocks, buf_addr); return blkcnt; From 4b42c59a34bb9364bd2228fd2fead0c5750e7abf Mon Sep 17 00:00:00 2001 From: Aswin Murugan Date: Thu, 16 Apr 2026 14:40:47 +0530 Subject: [PATCH 2/2] scsi: Enable FUA bit in WRITE10 commands Enable the Force Unit Access (FUA) bit in SCSI WRITE10 commands to ensure writes bypass the device's volatile cache and go directly to non-volatile storage. This provides write-through behavior that prevents data loss during board resets. Reviewed-by: Varadarajan Narayanan Signed-off-by: Aswin Murugan Signed-off-by: Balaji Selvanathan Reviewed-by: Simon Glass --- drivers/scsi/scsi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index 9a417795851..50e7d749921 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c @@ -107,7 +107,7 @@ static void scsi_setup_write_ext(struct scsi_cmd *pccb, lbaint_t start, lbaint_t blocks) { pccb->cmd[0] = SCSI_WRITE10; - pccb->cmd[1] = 0; + pccb->cmd[1] = 0x08; /* Set FUA bit to bypass write cache */ pccb->cmd[2] = (unsigned char)(start >> 24) & 0xff; pccb->cmd[3] = (unsigned char)(start >> 16) & 0xff; pccb->cmd[4] = (unsigned char)(start >> 8) & 0xff;