summaryrefslogtreecommitdiff
path: root/common/scsi.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/scsi.c')
-rw-r--r--common/scsi.c102
1 files changed, 49 insertions, 53 deletions
diff --git a/common/scsi.c b/common/scsi.c
index d37222cc6b..c456f5a717 100644
--- a/common/scsi.c
+++ b/common/scsi.c
@@ -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;