scsi: dm: split scsi_scan()

The DM version of scsi_scan() is becoming a bit long, it can be split:
scsi_scan() iterates over the IDs and LUNs and for each id/lun pair calls
do_scsi_scan_one() to do the work of:
 - detecting an attached drive
 - creating the associated block device if a drive is found.

Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Jean-Jacques Hiblot 2017-04-24 11:51:26 +02:00 committed by Simon Glass
parent eaa59b3404
commit d52063b84f

View file

@ -549,6 +549,52 @@ removable:
* to the user if mode = 1
*/
#if defined(CONFIG_DM_SCSI)
static int do_scsi_scan_one(struct udevice *dev, int id, int lun, int mode)
{
int ret;
struct udevice *bdev;
struct blk_desc bd;
struct blk_desc *bdesc;
char str[10];
/*
* detect the scsi driver to get information about its geometry (block
* size, number of blocks) and other parameters (ids, type, ...)
*/
scsi_init_dev_desc_priv(&bd);
if (scsi_detect_dev(id, lun, &bd))
return -ENODEV;
/*
* Create only one block device and do detection
* to make sure that there won't be a lot of
* block devices created
*/
snprintf(str, sizeof(str), "id%dlun%d", id, lun);
ret = blk_create_devicef(dev, "scsi_blk", str, IF_TYPE_SCSI, -1,
bd.blksz, bd.blksz * bd.lba, &bdev);
if (ret) {
debug("Can't create device\n");
return ret;
}
bdesc = dev_get_uclass_platdata(bdev);
bdesc->target = id;
bdesc->lun = lun;
bdesc->removable = bd.removable;
bdesc->type = bd.type;
memcpy(&bdesc->vendor, &bd.vendor, sizeof(bd.vendor));
memcpy(&bdesc->product, &bd.product, sizeof(bd.product));
memcpy(&bdesc->revision, &bd.revision, sizeof(bd.revision));
part_init(bdesc);
if (mode == 1) {
printf(" Device %d: ", 0);
dev_print(bdesc);
}
return 0;
}
int scsi_scan(int mode)
{
unsigned char i, lun;
@ -576,59 +622,9 @@ int scsi_scan(int mode)
/* Get controller platdata */
plat = dev_get_platdata(dev);
for (i = 0; i < plat->max_id; i++) {
for (lun = 0; lun < plat->max_lun; lun++) {
struct udevice *bdev; /* block device */
/* block device description */
struct blk_desc _bd;
struct blk_desc *bdesc;
char str[10];
scsi_init_dev_desc_priv(&_bd);
ret = scsi_detect_dev(i, lun, &_bd);
if (ret)
/*
* no device detected?
* check the next lun.
*/
continue;
/*
* Create only one block device and do detection
* to make sure that there won't be a lot of
* block devices created
*/
snprintf(str, sizeof(str), "id%dlun%d", i, lun);
ret = blk_create_devicef(dev, "scsi_blk",
str, IF_TYPE_SCSI,
-1,
_bd.blksz,
_bd.blksz * _bd.lba,
&bdev);
if (ret) {
debug("Can't create device\n");
return ret;
}
bdesc = dev_get_uclass_platdata(bdev);
bdesc->target = i;
bdesc->lun = lun;
bdesc->removable = _bd.removable;
bdesc->type = _bd.type;
memcpy(&bdesc->vendor, &_bd.vendor,
sizeof(_bd.vendor));
memcpy(&bdesc->product, &_bd.product,
sizeof(_bd.product));
memcpy(&bdesc->revision, &_bd.revision,
sizeof(_bd.revision));
part_init(bdesc);
if (mode == 1) {
printf(" Device %d: ", 0);
dev_print(bdesc);
} /* if mode */
} /* next LUN */
}
for (i = 0; i < plat->max_id; i++)
for (lun = 0; lun < plat->max_lun; lun++)
do_scsi_scan_one(dev, i, lun, mode);
}
return 0;