mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-28 18:11:33 +00:00
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:
parent
eaa59b3404
commit
d52063b84f
1 changed files with 49 additions and 53 deletions
102
common/scsi.c
102
common/scsi.c
|
@ -549,6 +549,52 @@ removable:
|
||||||
* to the user if mode = 1
|
* to the user if mode = 1
|
||||||
*/
|
*/
|
||||||
#if defined(CONFIG_DM_SCSI)
|
#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)
|
int scsi_scan(int mode)
|
||||||
{
|
{
|
||||||
unsigned char i, lun;
|
unsigned char i, lun;
|
||||||
|
@ -576,59 +622,9 @@ int scsi_scan(int mode)
|
||||||
/* Get controller platdata */
|
/* Get controller platdata */
|
||||||
plat = dev_get_platdata(dev);
|
plat = dev_get_platdata(dev);
|
||||||
|
|
||||||
for (i = 0; i < plat->max_id; i++) {
|
for (i = 0; i < plat->max_id; i++)
|
||||||
for (lun = 0; lun < plat->max_lun; lun++) {
|
for (lun = 0; lun < plat->max_lun; lun++)
|
||||||
struct udevice *bdev; /* block device */
|
do_scsi_scan_one(dev, i, lun, mode);
|
||||||
/* 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 */
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Add table
Reference in a new issue