diff options
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/scsi-uclass.c | 30 | ||||
-rw-r--r-- | drivers/scsi/scsi.c | 47 |
2 files changed, 52 insertions, 25 deletions
diff --git a/drivers/scsi/scsi-uclass.c b/drivers/scsi/scsi-uclass.c index 1ee8236c05c..3eb6069649f 100644 --- a/drivers/scsi/scsi-uclass.c +++ b/drivers/scsi/scsi-uclass.c @@ -10,7 +10,9 @@ #define LOG_CATEGORY UCLASS_SCSI +#include <blk.h> #include <dm.h> +#include <part.h> #include <scsi.h> int scsi_exec(struct udevice *dev, struct scsi_cmd *pccb) @@ -23,6 +25,34 @@ int scsi_exec(struct udevice *dev, struct scsi_cmd *pccb) return ops->exec(dev, pccb); } +int scsi_get_blk_by_uuid(const char *uuid, + struct blk_desc **blk_desc_ptr, + struct disk_partition *part_info_ptr) +{ + static int is_scsi_scanned; + struct blk_desc *blk; + int i, ret; + + if (!is_scsi_scanned) { + scsi_scan(false /* no verbose */); + is_scsi_scanned = 1; + } + + for (i = 0; i < blk_find_max_devnum(UCLASS_SCSI) + 1; i++) { + ret = blk_get_desc(UCLASS_SCSI, i, &blk); + if (ret) + continue; + + ret = part_get_info_by_uuid(blk, uuid, part_info_ptr); + if (ret > 0) { + *blk_desc_ptr = blk; + return 0; + } + } + + return -1; +} + int scsi_bus_reset(struct udevice *dev) { struct scsi_ops *ops = scsi_get_ops(dev); diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index 7d022ce718a..78efed6b66a 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c @@ -39,7 +39,7 @@ static void scsi_print_error(struct scsi_cmd *pccb) #ifdef CONFIG_SYS_64BIT_LBA void scsi_setup_read16(struct scsi_cmd *pccb, lbaint_t start, - unsigned long blocks) + lbaint_t blocks) { pccb->cmd[0] = SCSI_READ16; pccb->cmd[1] = 0; @@ -83,7 +83,7 @@ static void scsi_setup_inquiry(struct scsi_cmd *pccb) } static void scsi_setup_sync_cache(struct scsi_cmd *pccb, lbaint_t start, - unsigned short blocks) + lbaint_t blocks) { pccb->cmd[0] = SCSI_SYNC_CACHE; pccb->cmd[1] = 0; @@ -100,7 +100,7 @@ static void scsi_setup_sync_cache(struct scsi_cmd *pccb, lbaint_t start, } static void scsi_setup_read_ext(struct scsi_cmd *pccb, lbaint_t start, - unsigned short blocks) + lbaint_t blocks) { pccb->cmd[0] = SCSI_READ10; pccb->cmd[1] = 0; @@ -121,7 +121,7 @@ static void scsi_setup_read_ext(struct scsi_cmd *pccb, lbaint_t start, } static void scsi_setup_write_ext(struct scsi_cmd *pccb, lbaint_t start, - unsigned short blocks) + lbaint_t blocks) { pccb->cmd[0] = SCSI_WRITE10; pccb->cmd[1] = 0; @@ -143,7 +143,7 @@ static void scsi_setup_write_ext(struct scsi_cmd *pccb, lbaint_t start, } static void scsi_setup_erase_ext(struct scsi_cmd *pccb, lbaint_t start, - unsigned short blocks) + lbaint_t blocks) { u8 *param = tempbuff; const u8 param_size = 24; @@ -193,9 +193,8 @@ static ulong scsi_read(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; + lbaint_t start, blks, max_blks, blocks; uintptr_t buf_addr; - unsigned short smallblks = 0; struct scsi_cmd *pccb = (struct scsi_cmd *)&tempccb; /* Setup device */ @@ -217,7 +216,6 @@ static ulong scsi_read(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt, pccb->dma_dir = DMA_FROM_DEVICE; #ifdef CONFIG_SYS_64BIT_LBA if (start > SCSI_LBA48_READ) { - unsigned long blocks; blocks = min_t(lbaint_t, blks, max_blks); pccb->datalen = block_dev->blksz * blocks; scsi_setup_read16(pccb, start, blocks); @@ -227,20 +225,20 @@ static ulong scsi_read(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt, #endif if (blks > max_blks) { pccb->datalen = block_dev->blksz * max_blks; - smallblks = max_blks; - scsi_setup_read_ext(pccb, start, smallblks); + blocks = max_blks; + scsi_setup_read_ext(pccb, start, blocks); start += max_blks; blks -= max_blks; } else { pccb->datalen = block_dev->blksz * blks; - smallblks = (unsigned short)blks; - scsi_setup_read_ext(pccb, start, smallblks); + blocks = blks; + scsi_setup_read_ext(pccb, start, blocks); start += blks; blks = 0; } debug("scsi_read_ext: startblk " LBAF - ", blccnt %x buffer %lX\n", - start, smallblks, buf_addr); + ", blccnt " LBAF " buffer %lX\n", + start, blocks, buf_addr); if (scsi_exec(bdev, pccb)) { scsi_print_error(pccb); blkcnt -= blks; @@ -249,7 +247,7 @@ static ulong scsi_read(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt, buf_addr += pccb->datalen; } while (blks != 0); debug("scsi_read_ext: end startblk " LBAF - ", blccnt %x buffer %lX\n", start, smallblks, buf_addr); + ", blccnt " LBAF " buffer %lX\n", start, blocks, buf_addr); return blkcnt; } @@ -263,9 +261,8 @@ static ulong scsi_write(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; + lbaint_t start, blks, max_blks, blocks; uintptr_t buf_addr; - unsigned short smallblks; struct scsi_cmd *pccb = (struct scsi_cmd *)&tempccb; /* Setup device */ @@ -286,19 +283,19 @@ static ulong scsi_write(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt, pccb->dma_dir = DMA_TO_DEVICE; if (blks > max_blks) { pccb->datalen = block_dev->blksz * max_blks; - smallblks = max_blks; - scsi_setup_write_ext(pccb, start, smallblks); + blocks = max_blks; + scsi_setup_write_ext(pccb, start, blocks); start += max_blks; blks -= max_blks; } else { pccb->datalen = block_dev->blksz * blks; - smallblks = (unsigned short)blks; - scsi_setup_write_ext(pccb, start, smallblks); + blocks = blks; + scsi_setup_write_ext(pccb, start, blocks); start += blks; blks = 0; } - debug("%s: startblk " LBAF ", blccnt %x buffer %lx\n", - __func__, start, smallblks, buf_addr); + debug("%s: startblk " LBAF ", blccnt " LBAF " buffer %lx\n", + __func__, start, blocks, buf_addr); if (scsi_exec(bdev, pccb)) { scsi_print_error(pccb); blkcnt -= blks; @@ -312,8 +309,8 @@ static ulong scsi_write(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt, if (scsi_exec(bdev, pccb)) scsi_print_error(pccb); - debug("%s: end startblk " LBAF ", blccnt %x buffer %lX\n", - __func__, start, smallblks, buf_addr); + debug("%s: end startblk " LBAF ", blccnt " LBAF " buffer %lX\n", + __func__, start, blocks, buf_addr); return blkcnt; } |