
From: Simon Glass <sjg@chromium.org> Each time around the loop a certain number of blocks are processed. Put this in a variable (to_read/to_write) and avoid changing the input parameter Signed-off-by: Simon Glass <sjg@chromium.org> --- drivers/scsi/scsi.c | 54 +++++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index a1612a4f4c0..6deea51bebc 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c @@ -156,28 +156,30 @@ static ulong scsi_read(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt, ", blccnt " LBAF " buffer %lx\n", desc->devnum, start, blks, (unsigned long)buffer); do { + ulong to_read; /* number of blocks to read on this iteration */ + + to_read = blks; pccb->pdata = (unsigned char *)buf_addr; pccb->dma_dir = DMA_FROM_DEVICE; if (IS_ENABLED(CONFIG_SYS_64BIT_LBA) && start > SCSI_LBA48_READ) { - unsigned long blocks; - blocks = min_t(lbaint_t, blks, max_blks); - pccb->datalen = desc->blksz * blocks; - scsi_setup_read16(desc, pccb, start, blocks); - start += blocks; - blks -= blocks; - } else - if (blks > max_blks) { - pccb->datalen = desc->blksz * max_blks; - smallblks = max_blks; + to_read = min_t(lbaint_t, to_read, max_blks); + pccb->datalen = desc->blksz * to_read; + scsi_setup_read16(desc, pccb, start, to_read); + start += to_read; + blks -= to_read; + } else if (to_read > max_blks) { + to_read = max_blks; + pccb->datalen = desc->blksz * to_read; + smallblks = to_read; scsi_setup_read_ext(desc, pccb, start, smallblks); - start += max_blks; - blks -= max_blks; + start += to_read; + blks -= to_read; } else { - pccb->datalen = desc->blksz * blks; - smallblks = (unsigned short)blks; + pccb->datalen = desc->blksz * to_read; + smallblks = (unsigned short)to_read; scsi_setup_read_ext(desc, pccb, start, smallblks); - start += blks; + start += to_read; blks = 0; } debug("scsi_read_ext: startblk " LBAF @@ -228,19 +230,23 @@ static ulong scsi_write(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt, debug("\n%s: dev %d startblk " LBAF ", blccnt " LBAF " buffer %lx\n", __func__, desc->devnum, start, blks, (unsigned long)buffer); do { + ulong to_write; /* # blocks to write on this iteration */ + + to_write = blks; pccb->pdata = (unsigned char *)buf_addr; pccb->dma_dir = DMA_TO_DEVICE; - if (blks > max_blks) { - pccb->datalen = desc->blksz * max_blks; - smallblks = max_blks; - scsi_setup_write_ext(desc, pccb, start, smallblks); - start += max_blks; - blks -= max_blks; + if (to_write > max_blks) { + to_write = max_blks; + pccb->datalen = desc->blksz * to_write; + smallblks = to_write; + scsi_setup_write_ext(desc, pccb, start, to_write); + start += to_write; + blks -= to_write; } else { - pccb->datalen = desc->blksz * blks; - smallblks = (unsigned short)blks; + pccb->datalen = desc->blksz * to_write; + smallblks = (unsigned short)to_write; scsi_setup_write_ext(desc, pccb, start, smallblks); - start += blks; + start += to_write; blks = 0; } debug("%s: startblk " LBAF ", blccnt %x buffer %lx\n", -- 2.43.0