summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorTom Rini <[email protected]>2022-09-25 17:20:11 -0400
committerTom Rini <[email protected]>2022-09-25 17:20:11 -0400
commit9114b7cee817789ad59e0fb6d5cd57f50668b4e1 (patch)
treea6bd3d83314fee80b1b1a2e9a39df39d96a2dcc8 /drivers
parent81da5042e514bfd27516d3530dde4d62a6708ca4 (diff)
parent22c80d5603ac4c58debc8c776b8f138e76cf5f7c (diff)
Merge tag 'dm-next-25sep22' of https://gitlab.denx.de/u-boot/custodians/u-boot-dm into next
sandbox SCSI conversion to driver model final patch for blk improvements
Diffstat (limited to 'drivers')
-rw-r--r--drivers/ata/sata.c2
-rw-r--r--drivers/block/blk-uclass.c145
-rw-r--r--drivers/block/blk_legacy.c58
-rw-r--r--drivers/block/ide.c8
-rw-r--r--drivers/block/sandbox.c8
-rw-r--r--drivers/mmc/mmc-uclass.c2
-rw-r--r--drivers/mmc/mmc_legacy.c8
-rw-r--r--drivers/net/fsl_enetc.c12
-rw-r--r--drivers/net/fsl_enetc.h2
-rw-r--r--drivers/scsi/Makefile1
-rw-r--r--drivers/scsi/sandbox_scsi.c132
-rw-r--r--drivers/scsi/scsi.c6
-rw-r--r--drivers/scsi/scsi_emul.c74
-rw-r--r--drivers/usb/emul/sandbox_flash.c205
-rw-r--r--drivers/virtio/virtio_blk.c2
-rw-r--r--drivers/xen/pvblock.c2
16 files changed, 398 insertions, 269 deletions
diff --git a/drivers/ata/sata.c b/drivers/ata/sata.c
index 604c721cfdc..ce3e9b5a400 100644
--- a/drivers/ata/sata.c
+++ b/drivers/ata/sata.c
@@ -79,7 +79,7 @@ int __sata_initialize(void)
for (i = 0; i < CONFIG_SYS_SATA_MAX_DEVICE; i++) {
memset(&sata_dev_desc[i], 0, sizeof(struct blk_desc));
- sata_dev_desc[i].if_type = UCLASS_AHCI;
+ sata_dev_desc[i].uclass_id = UCLASS_AHCI;
sata_dev_desc[i].devnum = i;
sata_dev_desc[i].part_type = PART_TYPE_UNKNOWN;
sata_dev_desc[i].type = DEV_TYPE_HARDDISK;
diff --git a/drivers/block/blk-uclass.c b/drivers/block/blk-uclass.c
index a9a85aa37f3..7d12d5413f1 100644
--- a/drivers/block/blk-uclass.c
+++ b/drivers/block/blk-uclass.c
@@ -20,7 +20,7 @@
static struct {
enum uclass_id id;
const char *name;
-} if_typename_str[] = {
+} uclass_idname_str[] = {
{ UCLASS_IDE, "ide" },
{ UCLASS_SCSI, "scsi" },
{ UCLASS_USB, "usb" },
@@ -34,19 +34,19 @@ static struct {
{ UCLASS_PVBLOCK, "pvblock" },
};
-static enum uclass_id if_typename_to_iftype(const char *if_typename)
+static enum uclass_id uclass_name_to_iftype(const char *uclass_idname)
{
int i;
- for (i = 0; i < ARRAY_SIZE(if_typename_str); i++) {
- if (!strcmp(if_typename, if_typename_str[i].name))
- return if_typename_str[i].id;
+ for (i = 0; i < ARRAY_SIZE(uclass_idname_str); i++) {
+ if (!strcmp(uclass_idname, uclass_idname_str[i].name))
+ return uclass_idname_str[i].id;
}
return UCLASS_INVALID;
}
-static enum uclass_id if_type_to_uclass_id(enum uclass_id if_type)
+static enum uclass_id conv_uclass_id(enum uclass_id uclass_id)
{
/*
* This strange adjustment is used because we use UCLASS_MASS_STORAGE
@@ -65,31 +65,30 @@ static enum uclass_id if_type_to_uclass_id(enum uclass_id if_type)
* - rename UCLASS_USB name to "usb_ctlr"
* - use UCLASS_MASS_STORAGE instead of UCLASS_USB in if_typename_str
*/
- if (if_type == UCLASS_USB)
+ if (uclass_id == UCLASS_USB)
return UCLASS_MASS_STORAGE;
-
- return if_type;
+ return uclass_id;
}
-const char *blk_get_if_type_name(enum uclass_id if_type)
+const char *blk_get_uclass_name(enum uclass_id uclass_id)
{
int i;
- for (i = 0; i < ARRAY_SIZE(if_typename_str); i++) {
- if (if_typename_str[i].id == if_type)
- return if_typename_str[i].name;
+ for (i = 0; i < ARRAY_SIZE(uclass_idname_str); i++) {
+ if (uclass_idname_str[i].id == uclass_id)
+ return uclass_idname_str[i].name;
}
return "(none)";
}
-struct blk_desc *blk_get_devnum_by_type(enum uclass_id if_type, int devnum)
+struct blk_desc *blk_get_devnum_by_uclass_id(enum uclass_id uclass_id, int devnum)
{
struct blk_desc *desc;
struct udevice *dev;
int ret;
- ret = blk_get_device(if_type, devnum, &dev);
+ ret = blk_get_device(uclass_id, devnum, &dev);
if (ret)
return NULL;
desc = dev_get_uclass_plat(dev);
@@ -102,7 +101,7 @@ struct blk_desc *blk_get_devnum_by_type(enum uclass_id if_type, int devnum)
* name in a local table. This gives us an interface type which we can match
* against the uclass of the block device's parent.
*/
-struct blk_desc *blk_get_devnum_by_typename(const char *if_typename, int devnum)
+struct blk_desc *blk_get_devnum_by_uclass_idname(const char *uclass_idname, int devnum)
{
enum uclass_id uclass_id;
enum uclass_id type;
@@ -110,16 +109,16 @@ struct blk_desc *blk_get_devnum_by_typename(const char *if_typename, int devnum)
struct uclass *uc;
int ret;
- type = if_typename_to_iftype(if_typename);
+ type = uclass_name_to_iftype(uclass_idname);
if (type == UCLASS_INVALID) {
debug("%s: Unknown interface type '%s'\n", __func__,
- if_typename);
+ uclass_idname);
return NULL;
}
- uclass_id = if_type_to_uclass_id(type);
+ uclass_id = conv_uclass_id(type);
if (uclass_id == UCLASS_INVALID) {
debug("%s: Unknown uclass for interface type'\n",
- blk_get_if_type_name(type));
+ blk_get_uclass_name(type));
return NULL;
}
@@ -129,8 +128,8 @@ struct blk_desc *blk_get_devnum_by_typename(const char *if_typename, int devnum)
uclass_foreach_dev(dev, uc) {
struct blk_desc *desc = dev_get_uclass_plat(dev);
- debug("%s: if_type=%d, devnum=%d: %s, %d, %d\n", __func__,
- type, devnum, dev->name, desc->if_type, desc->devnum);
+ debug("%s: uclass_id=%d, devnum=%d: %s, %d, %d\n", __func__,
+ type, devnum, dev->name, desc->uclass_id, desc->devnum);
if (desc->devnum != devnum)
continue;
@@ -178,14 +177,14 @@ struct blk_desc *blk_get_by_device(struct udevice *dev)
/**
* get_desc() - Get the block device descriptor for the given device number
*
- * @if_type: Interface type
+ * @uclass_id: Interface type
* @devnum: Device number (0 = first)
* @descp: Returns block device descriptor on success
* Return: 0 on success, -ENODEV if there is no such device and no device
* with a higher device number, -ENOENT if there is no such device but there
* is one with a higher number, or other -ve on other error.
*/
-static int get_desc(enum uclass_id if_type, int devnum, struct blk_desc **descp)
+static int get_desc(enum uclass_id uclass_id, int devnum, struct blk_desc **descp)
{
bool found_more = false;
struct udevice *dev;
@@ -199,9 +198,9 @@ static int get_desc(enum uclass_id if_type, int devnum, struct blk_desc **descp)
uclass_foreach_dev(dev, uc) {
struct blk_desc *desc = dev_get_uclass_plat(dev);
- debug("%s: if_type=%d, devnum=%d: %s, %d, %d\n", __func__,
- if_type, devnum, dev->name, desc->if_type, desc->devnum);
- if (desc->if_type == if_type) {
+ debug("%s: uclass_id=%d, devnum=%d: %s, %d, %d\n", __func__,
+ uclass_id, devnum, dev->name, desc->uclass_id, desc->devnum);
+ if (desc->uclass_id == uclass_id) {
if (desc->devnum == devnum) {
ret = device_probe(dev);
if (ret)
@@ -218,26 +217,26 @@ static int get_desc(enum uclass_id if_type, int devnum, struct blk_desc **descp)
return found_more ? -ENOENT : -ENODEV;
}
-int blk_select_hwpart_devnum(enum uclass_id if_type, int devnum, int hwpart)
+int blk_select_hwpart_devnum(enum uclass_id uclass_id, int devnum, int hwpart)
{
struct udevice *dev;
int ret;
- ret = blk_get_device(if_type, devnum, &dev);
+ ret = blk_get_device(uclass_id, devnum, &dev);
if (ret)
return ret;
return blk_select_hwpart(dev, hwpart);
}
-int blk_list_part(enum uclass_id if_type)
+int blk_list_part(enum uclass_id uclass_id)
{
struct blk_desc *desc;
int devnum, ok;
int ret;
for (ok = 0, devnum = 0;; ++devnum) {
- ret = get_desc(if_type, devnum, &desc);
+ ret = get_desc(uclass_id, devnum, &desc);
if (ret == -ENODEV)
break;
else if (ret)
@@ -255,12 +254,12 @@ int blk_list_part(enum uclass_id if_type)
return 0;
}
-int blk_print_part_devnum(enum uclass_id if_type, int devnum)
+int blk_print_part_devnum(enum uclass_id uclass_id, int devnum)
{
struct blk_desc *desc;
int ret;
- ret = get_desc(if_type, devnum, &desc);
+ ret = get_desc(uclass_id, devnum, &desc);
if (ret)
return ret;
if (desc->type == DEV_TYPE_UNKNOWN)
@@ -270,14 +269,14 @@ int blk_print_part_devnum(enum uclass_id if_type, int devnum)
return 0;
}
-void blk_list_devices(enum uclass_id if_type)
+void blk_list_devices(enum uclass_id uclass_id)
{
struct blk_desc *desc;
int ret;
int i;
for (i = 0;; ++i) {
- ret = get_desc(if_type, i, &desc);
+ ret = get_desc(uclass_id, i, &desc);
if (ret == -ENODEV)
break;
else if (ret)
@@ -289,12 +288,12 @@ void blk_list_devices(enum uclass_id if_type)
}
}
-int blk_print_device_num(enum uclass_id if_type, int devnum)
+int blk_print_device_num(enum uclass_id uclass_id, int devnum)
{
struct blk_desc *desc;
int ret;
- ret = get_desc(if_type, devnum, &desc);
+ ret = get_desc(uclass_id, devnum, &desc);
if (ret)
return ret;
printf("\nIDE device %d: ", devnum);
@@ -303,13 +302,13 @@ int blk_print_device_num(enum uclass_id if_type, int devnum)
return 0;
}
-int blk_show_device(enum uclass_id if_type, int devnum)
+int blk_show_device(enum uclass_id uclass_id, int devnum)
{
struct blk_desc *desc;
int ret;
printf("\nDevice %d: ", devnum);
- ret = get_desc(if_type, devnum, &desc);
+ ret = get_desc(uclass_id, devnum, &desc);
if (ret == -ENODEV || ret == -ENOENT) {
printf("unknown device\n");
return -ENODEV;
@@ -324,14 +323,14 @@ int blk_show_device(enum uclass_id if_type, int devnum)
return 0;
}
-ulong blk_read_devnum(enum uclass_id if_type, int devnum, lbaint_t start,
+ulong blk_read_devnum(enum uclass_id uclass_id, int devnum, lbaint_t start,
lbaint_t blkcnt, void *buffer)
{
struct blk_desc *desc;
ulong n;
int ret;
- ret = get_desc(if_type, devnum, &desc);
+ ret = get_desc(uclass_id, devnum, &desc);
if (ret)
return ret;
n = blk_dread(desc, start, blkcnt, buffer);
@@ -341,13 +340,13 @@ ulong blk_read_devnum(enum uclass_id if_type, int devnum, lbaint_t start,
return n;
}
-ulong blk_write_devnum(enum uclass_id if_type, int devnum, lbaint_t start,
+ulong blk_write_devnum(enum uclass_id uclass_id, int devnum, lbaint_t start,
lbaint_t blkcnt, const void *buffer)
{
struct blk_desc *desc;
int ret;
- ret = get_desc(if_type, devnum, &desc);
+ ret = get_desc(uclass_id, devnum, &desc);
if (ret)
return ret;
return blk_dwrite(desc, start, blkcnt, buffer);
@@ -370,7 +369,7 @@ int blk_dselect_hwpart(struct blk_desc *desc, int hwpart)
return blk_select_hwpart(desc->bdev, hwpart);
}
-int blk_first_device(int if_type, struct udevice **devp)
+int blk_first_device(int uclass_id, struct udevice **devp)
{
struct blk_desc *desc;
int ret;
@@ -382,7 +381,7 @@ int blk_first_device(int if_type, struct udevice **devp)
return -ENODEV;
do {
desc = dev_get_uclass_plat(*devp);
- if (desc->if_type == if_type)
+ if (desc->uclass_id == uclass_id)
return 0;
ret = uclass_find_next_device(devp);
if (ret)
@@ -395,10 +394,10 @@ int blk_first_device(int if_type, struct udevice **devp)
int blk_next_device(struct udevice **devp)
{
struct blk_desc *desc;
- int ret, if_type;
+ int ret, uclass_id;
desc = dev_get_uclass_plat(*devp);
- if_type = desc->if_type;
+ uclass_id = desc->uclass_id;
do {
ret = uclass_find_next_device(devp);
if (ret)
@@ -406,12 +405,12 @@ int blk_next_device(struct udevice **devp)
if (!*devp)
return -ENODEV;
desc = dev_get_uclass_plat(*devp);
- if (desc->if_type == if_type)
+ if (desc->uclass_id == uclass_id)
return 0;
} while (1);
}
-int blk_find_device(int if_type, int devnum, struct udevice **devp)
+int blk_find_device(int uclass_id, int devnum, struct udevice **devp)
{
struct uclass *uc;
struct udevice *dev;
@@ -423,9 +422,9 @@ int blk_find_device(int if_type, int devnum, struct udevice **devp)
uclass_foreach_dev(dev, uc) {
struct blk_desc *desc = dev_get_uclass_plat(dev);
- debug("%s: if_type=%d, devnum=%d: %s, %d, %d\n", __func__,
- if_type, devnum, dev->name, desc->if_type, desc->devnum);
- if (desc->if_type == if_type && desc->devnum == devnum) {
+ debug("%s: uclass_id=%d, devnum=%d: %s, %d, %d\n", __func__,
+ uclass_id, devnum, dev->name, desc->uclass_id, desc->devnum);
+ if (desc->uclass_id == uclass_id && desc->devnum == devnum) {
*devp = dev;
return 0;
}
@@ -434,11 +433,11 @@ int blk_find_device(int if_type, int devnum, struct udevice **devp)
return -ENODEV;
}
-int blk_get_device(int if_type, int devnum, struct udevice **devp)
+int blk_get_device(int uclass_id, int devnum, struct udevice **devp)
{
int ret;
- ret = blk_find_device(if_type, devnum, devp);
+ ret = blk_find_device(uclass_id, devnum, devp);
if (ret)
return ret;
@@ -455,12 +454,12 @@ unsigned long blk_dread(struct blk_desc *block_dev, lbaint_t start,
if (!ops->read)
return -ENOSYS;
- if (blkcache_read(block_dev->if_type, block_dev->devnum,
+ if (blkcache_read(block_dev->uclass_id, block_dev->devnum,
start, blkcnt, block_dev->blksz, buffer))
return blkcnt;
blks_read = ops->read(dev, start, blkcnt, buffer);
if (blks_read == blkcnt)
- blkcache_fill(block_dev->if_type, block_dev->devnum,
+ blkcache_fill(block_dev->uclass_id, block_dev->devnum,
start, blkcnt, block_dev->blksz, buffer);
return blks_read;
@@ -475,7 +474,7 @@ unsigned long blk_dwrite(struct blk_desc *block_dev, lbaint_t start,
if (!ops->write)
return -ENOSYS;
- blkcache_invalidate(block_dev->if_type, block_dev->devnum);
+ blkcache_invalidate(block_dev->uclass_id, block_dev->devnum);
return ops->write(dev, start, blkcnt, buffer);
}
@@ -488,7 +487,7 @@ unsigned long blk_derase(struct blk_desc *block_dev, lbaint_t start,
if (!ops->erase)
return -ENOSYS;
- blkcache_invalidate(block_dev->if_type, block_dev->devnum);
+ blkcache_invalidate(block_dev->uclass_id, block_dev->devnum);
return ops->erase(dev, start, blkcnt);
}
@@ -525,7 +524,7 @@ const char *blk_get_devtype(struct udevice *dev)
return uclass_get_name(device_get_uclass_id(parent));
};
-int blk_find_max_devnum(enum uclass_id if_type)
+int blk_find_max_devnum(enum uclass_id uclass_id)
{
struct udevice *dev;
int max_devnum = -ENODEV;
@@ -538,18 +537,18 @@ int blk_find_max_devnum(enum uclass_id if_type)
uclass_foreach_dev(dev, uc) {
struct blk_desc *desc = dev_get_uclass_plat(dev);
- if (desc->if_type == if_type && desc->devnum > max_devnum)
+ if (desc->uclass_id == uclass_id && desc->devnum > max_devnum)
max_devnum = desc->devnum;
}
return max_devnum;
}
-int blk_next_free_devnum(enum uclass_id if_type)
+int blk_next_free_devnum(enum uclass_id uclass_id)
{
int ret;
- ret = blk_find_max_devnum(if_type);
+ ret = blk_find_max_devnum(uclass_id);
if (ret == -ENODEV)
return 0;
if (ret < 0)
@@ -631,7 +630,7 @@ int blk_count_devices(enum blk_flag_t flag)
return count;
}
-static int blk_claim_devnum(enum uclass_id if_type, int devnum)
+static int blk_claim_devnum(enum uclass_id uclass_id, int devnum)
{
struct udevice *dev;
struct uclass *uc;
@@ -643,8 +642,8 @@ static int blk_claim_devnum(enum uclass_id if_type, int devnum)
uclass_foreach_dev(dev, uc) {
struct blk_desc *desc = dev_get_uclass_plat(dev);
- if (desc->if_type == if_type && desc->devnum == devnum) {
- int next = blk_next_free_devnum(if_type);
+ if (desc->uclass_id == uclass_id && desc->devnum == devnum) {
+ int next = blk_next_free_devnum(uclass_id);
if (next < 0)
return next;
@@ -657,7 +656,7 @@ static int blk_claim_devnum(enum uclass_id if_type, int devnum)
}
int blk_create_device(struct udevice *parent, const char *drv_name,
- const char *name, int if_type, int devnum, int blksz,
+ const char *name, int uclass_id, int devnum, int blksz,
lbaint_t lba, struct udevice **devp)
{
struct blk_desc *desc;
@@ -665,9 +664,9 @@ int blk_create_device(struct udevice *parent, const char *drv_name,
int ret;
if (devnum == -1) {
- devnum = blk_next_free_devnum(if_type);
+ devnum = blk_next_free_devnum(uclass_id);
} else {
- ret = blk_claim_devnum(if_type, devnum);
+ ret = blk_claim_devnum(uclass_id, devnum);
if (ret < 0 && ret != -ENOENT)
return ret;
}
@@ -677,7 +676,7 @@ int blk_create_device(struct udevice *parent, const char *drv_name,
if (ret)
return ret;
desc = dev_get_uclass_plat(dev);
- desc->if_type = if_type;
+ desc->uclass_id = uclass_id;
desc->blksz = blksz;
desc->log2blksz = LOG2(desc->blksz);
desc->lba = lba;
@@ -690,7 +689,7 @@ int blk_create_device(struct udevice *parent, const char *drv_name,
}
int blk_create_devicef(struct udevice *parent, const char *drv_name,
- const char *name, int if_type, int devnum, int blksz,
+ const char *name, int uclass_id, int devnum, int blksz,
lbaint_t lba, struct udevice **devp)
{
char dev_name[30], *str;
@@ -701,7 +700,7 @@ int blk_create_devicef(struct udevice *parent, const char *drv_name,
if (!str)
return -ENOMEM;
- ret = blk_create_device(parent, drv_name, str, if_type, devnum,
+ ret = blk_create_device(parent, drv_name, str, uclass_id, devnum,
blksz, lba, devp);
if (ret) {
free(str);
@@ -725,7 +724,7 @@ int blk_probe_or_unbind(struct udevice *dev)
return ret;
}
-int blk_unbind_all(int if_type)
+int blk_unbind_all(int uclass_id)
{
struct uclass *uc;
struct udevice *dev, *next;
@@ -737,7 +736,7 @@ int blk_unbind_all(int if_type)
uclass_foreach_dev_safe(dev, next, uc) {
struct blk_desc *desc = dev_get_uclass_plat(dev);
- if (desc->if_type == if_type) {
+ if (desc->uclass_id == uclass_id) {
ret = device_remove(dev, DM_REMOVE_NORMAL);
if (ret)
return ret;
diff --git a/drivers/block/blk_legacy.c b/drivers/block/blk_legacy.c
index 8c6f9cb208e..5bf1d047152 100644
--- a/drivers/block/blk_legacy.c
+++ b/drivers/block/blk_legacy.c
@@ -9,14 +9,14 @@
#include <part.h>
#include <linux/err.h>
-struct blk_driver *blk_driver_lookup_type(int if_type)
+struct blk_driver *blk_driver_lookup_type(int uclass_id)
{
struct blk_driver *drv = ll_entry_start(struct blk_driver, blk_driver);
const int n_ents = ll_entry_count(struct blk_driver, blk_driver);
struct blk_driver *entry;
for (entry = drv; entry != drv + n_ents; entry++) {
- if (if_type == entry->if_type)
+ if (uclass_id == entry->uclass_id)
return entry;
}
@@ -24,14 +24,14 @@ struct blk_driver *blk_driver_lookup_type(int if_type)
return NULL;
}
-static struct blk_driver *blk_driver_lookup_typename(const char *if_typename)
+static struct blk_driver *blk_driver_lookup_typename(const char *uclass_idname)
{
struct blk_driver *drv = ll_entry_start(struct blk_driver, blk_driver);
const int n_ents = ll_entry_count(struct blk_driver, blk_driver);
struct blk_driver *entry;
for (entry = drv; entry != drv + n_ents; entry++) {
- if (!strcmp(if_typename, entry->if_typename))
+ if (!strcmp(uclass_idname, entry->uclass_idname))
return entry;
}
@@ -39,11 +39,11 @@ static struct blk_driver *blk_driver_lookup_typename(const char *if_typename)
return NULL;
}
-const char *blk_get_if_type_name(enum uclass_id if_type)
+const char *blk_get_uclass_name(enum uclass_id uclass_id)
{
- struct blk_driver *drv = blk_driver_lookup_type(if_type);
+ struct blk_driver *drv = blk_driver_lookup_type(uclass_id);
- return drv ? drv->if_typename : NULL;
+ return drv ? drv->uclass_idname : NULL;
}
/**
@@ -70,14 +70,14 @@ static int get_desc(struct blk_driver *drv, int devnum, struct blk_desc **descp)
return drv->get_dev(devnum, descp);
}
-int blk_list_part(enum uclass_id if_type)
+int blk_list_part(enum uclass_id uclass_id)
{
struct blk_driver *drv;
struct blk_desc *desc;
int devnum, ok;
bool first = true;
- drv = blk_driver_lookup_type(if_type);
+ drv = blk_driver_lookup_type(uclass_id);
if (!drv)
return -ENOSYS;
for (ok = 0, devnum = 0; devnum < drv->max_devs; ++devnum) {
@@ -97,9 +97,9 @@ int blk_list_part(enum uclass_id if_type)
return 0;
}
-int blk_print_part_devnum(enum uclass_id if_type, int devnum)
+int blk_print_part_devnum(enum uclass_id uclass_id, int devnum)
{
- struct blk_driver *drv = blk_driver_lookup_type(if_type);
+ struct blk_driver *drv = blk_driver_lookup_type(uclass_id);
struct blk_desc *desc;
int ret;
@@ -115,9 +115,9 @@ int blk_print_part_devnum(enum uclass_id if_type, int devnum)
return 0;
}
-void blk_list_devices(enum uclass_id if_type)
+void blk_list_devices(enum uclass_id uclass_id)
{
- struct blk_driver *drv = blk_driver_lookup_type(if_type);
+ struct blk_driver *drv = blk_driver_lookup_type(uclass_id);
struct blk_desc *desc;
int i;
@@ -133,9 +133,9 @@ void blk_list_devices(enum uclass_id if_type)
}
}
-int blk_print_device_num(enum uclass_id if_type, int devnum)
+int blk_print_device_num(enum uclass_id uclass_id, int devnum)
{
- struct blk_driver *drv = blk_driver_lookup_type(if_type);
+ struct blk_driver *drv = blk_driver_lookup_type(uclass_id);
struct blk_desc *desc;
int ret;
@@ -144,15 +144,15 @@ int blk_print_device_num(enum uclass_id if_type, int devnum)
ret = get_desc(drv, devnum, &desc);
if (ret)
return ret;
- printf("\n%s device %d: ", drv->if_typename, devnum);
+ printf("\n%s device %d: ", drv->uclass_idname, devnum);
dev_print(desc);
return 0;
}
-int blk_show_device(enum uclass_id if_type, int devnum)
+int blk_show_device(enum uclass_id uclass_id, int devnum)
{
- struct blk_driver *drv = blk_driver_lookup_type(if_type);
+ struct blk_driver *drv = blk_driver_lookup_type(uclass_id);
struct blk_desc *desc;
int ret;
@@ -174,9 +174,9 @@ int blk_show_device(enum uclass_id if_type, int devnum)
return 0;
}
-struct blk_desc *blk_get_devnum_by_type(enum uclass_id if_type, int devnum)
+struct blk_desc *blk_get_devnum_by_uclass_id(enum uclass_id uclass_id, int devnum)
{
- struct blk_driver *drv = blk_driver_lookup_type(if_type);
+ struct blk_driver *drv = blk_driver_lookup_type(uclass_id);
struct blk_desc *desc;
if (!drv)
@@ -190,7 +190,7 @@ struct blk_desc *blk_get_devnum_by_type(enum uclass_id if_type, int devnum)
int blk_dselect_hwpart(struct blk_desc *desc, int hwpart)
{
- struct blk_driver *drv = blk_driver_lookup_type(desc->if_type);
+ struct blk_driver *drv = blk_driver_lookup_type(desc->uclass_id);
if (!drv)
return -ENOSYS;
@@ -200,9 +200,9 @@ int blk_dselect_hwpart(struct blk_desc *desc, int hwpart)
return 0;
}
-struct blk_desc *blk_get_devnum_by_typename(const char *if_typename, int devnum)
+struct blk_desc *blk_get_devnum_by_uclass_idname(const char *uclass_idname, int devnum)
{
- struct blk_driver *drv = blk_driver_lookup_typename(if_typename);
+ struct blk_driver *drv = blk_driver_lookup_typename(uclass_idname);
struct blk_desc *desc;
if (!drv)
@@ -214,10 +214,10 @@ struct blk_desc *blk_get_devnum_by_typename(const char *if_typename, int devnum)
return desc;
}
-ulong blk_read_devnum(enum uclass_id if_type, int devnum, lbaint_t start,
+ulong blk_read_devnum(enum uclass_id uclass_id, int devnum, lbaint_t start,
lbaint_t blkcnt, void *buffer)
{
- struct blk_driver *drv = blk_driver_lookup_type(if_type);
+ struct blk_driver *drv = blk_driver_lookup_type(uclass_id);
struct blk_desc *desc;
ulong n;
int ret;
@@ -234,10 +234,10 @@ ulong blk_read_devnum(enum uclass_id if_type, int devnum, lbaint_t start,
return n;
}
-ulong blk_write_devnum(enum uclass_id if_type, int devnum, lbaint_t start,
+ulong blk_write_devnum(enum uclass_id uclass_id, int devnum, lbaint_t start,
lbaint_t blkcnt, const void *buffer)
{
- struct blk_driver *drv = blk_driver_lookup_type(if_type);
+ struct blk_driver *drv = blk_driver_lookup_type(uclass_id);
struct blk_desc *desc;
int ret;
@@ -249,9 +249,9 @@ ulong blk_write_devnum(enum uclass_id if_type, int devnum, lbaint_t start,
return desc->block_write(desc, start, blkcnt, buffer);
}
-int blk_select_hwpart_devnum(enum uclass_id if_type, int devnum, int hwpart)
+int blk_select_hwpart_devnum(enum uclass_id uclass_id, int devnum, int hwpart)
{
- struct blk_driver *drv = blk_driver_lookup_type(if_type);
+ struct blk_driver *drv = blk_driver_lookup_type(uclass_id);
struct blk_desc *desc;
int ret;
diff --git a/drivers/block/ide.c b/drivers/block/ide.c
index b8840d29c28..eaa58d859c6 100644
--- a/drivers/block/ide.c
+++ b/drivers/block/ide.c
@@ -537,7 +537,7 @@ static void ide_ident(struct blk_desc *dev_desc)
/* Select device
*/
ide_outb(device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
- dev_desc->if_type = UCLASS_IDE;
+ dev_desc->uclass_id = UCLASS_IDE;
#ifdef CONFIG_ATAPI
retries = 0;
@@ -752,7 +752,7 @@ void ide_init(void)
for (i = 0; i < CONFIG_SYS_IDE_MAXDEVICE; ++i) {
ide_dev_desc[i].type = DEV_TYPE_UNKNOWN;
- ide_dev_desc[i].if_type = UCLASS_IDE;
+ ide_dev_desc[i].uclass_id = UCLASS_IDE;
ide_dev_desc[i].devnum = i;
ide_dev_desc[i].part_type = PART_TYPE_UNKNOWN;
ide_dev_desc[i].blksz = 0;
@@ -1143,8 +1143,8 @@ UCLASS_DRIVER(ide) = {
};
#else
U_BOOT_LEGACY_BLK(ide) = {
- .if_typename = "ide",
- .if_type = UCLASS_IDE,
+ .uclass_idname = "ide",
+ .uclass_id = UCLASS_IDE,
.max_devs = CONFIG_SYS_IDE_MAXDEVICE,
.desc = ide_dev_desc,
};
diff --git a/drivers/block/sandbox.c b/drivers/block/sandbox.c
index 2de12e0a93e..f2aae89716b 100644
--- a/drivers/block/sandbox.c
+++ b/drivers/block/sandbox.c
@@ -150,7 +150,7 @@ int host_dev_bind(int devnum, char *filename, bool removable)
goto err_file;
}
- desc = blk_get_devnum_by_type(UCLASS_ROOT, devnum);
+ desc = blk_get_devnum_by_uclass_id(UCLASS_ROOT, devnum);
desc->removable = removable;
snprintf(desc->vendor, BLK_VEN_SIZE, "U-Boot");
snprintf(desc->product, BLK_PRD_SIZE, "hostfile");
@@ -192,7 +192,7 @@ int host_dev_bind(int dev, char *filename, bool removable)
}
struct blk_desc *blk_dev = &host_dev->blk_dev;
- blk_dev->if_type = UCLASS_ROOT;
+ blk_dev->uclass_id = UCLASS_ROOT;
blk_dev->priv = host_dev;
blk_dev->blksz = 512;
blk_dev->lba = os_lseek(host_dev->fd, 0, OS_SEEK_END) / blk_dev->blksz;
@@ -262,8 +262,8 @@ U_BOOT_DRIVER(sandbox_host_blk) = {
};
#else
U_BOOT_LEGACY_BLK(sandbox_host) = {
- .if_typename = "host",
- .if_type = UCLASS_ROOT,
+ .uclass_idname = "host",
+ .uclass_id = UCLASS_ROOT,
.max_devs = SANDBOX_HOST_MAX_DEVICES,
.get_dev = host_get_dev_err,
};
diff --git a/drivers/mmc/mmc-uclass.c b/drivers/mmc/mmc-uclass.c
index b1bd4ae1bc8..759a6b728c8 100644
--- a/drivers/mmc/mmc-uclass.c
+++ b/drivers/mmc/mmc-uclass.c
@@ -472,7 +472,7 @@ static int mmc_select_hwpart(struct udevice *bdev, int hwpart)
ret = mmc_switch_part(mmc, hwpart);
if (!ret)
- blkcache_invalidate(desc->if_type, desc->devnum);
+ blkcache_invalidate(desc->uclass_id, desc->devnum);
return ret;
}
diff --git a/drivers/mmc/mmc_legacy.c b/drivers/mmc/mmc_legacy.c
index 4e0891e5dfe..a101ee43fde 100644
--- a/drivers/mmc/mmc_legacy.c
+++ b/drivers/mmc/mmc_legacy.c
@@ -132,7 +132,7 @@ static struct mmc mmc_static = {
.dsr_imp = 0,
.dsr = 0xffffffff,
.block_dev = {
- .if_type = UCLASS_MMC,
+ .uclass_id = UCLASS_MMC,
.removable = 1,
.devnum = 0,
.block_read = mmc_bread,
@@ -194,7 +194,7 @@ struct mmc *mmc_create(const struct mmc_config *cfg, void *priv)
mmc->dsr = 0xffffffff;
/* Setup the universal parts of the block interface just once */
bdesc = mmc_get_blk_desc(mmc);
- bdesc->if_type = UCLASS_MMC;
+ bdesc->uclass_id = UCLASS_MMC;
bdesc->removable = 1;
bdesc->devnum = mmc_get_next_devnum();
bdesc->block_read = mmc_bread;
@@ -253,8 +253,8 @@ static int mmc_get_dev(int dev, struct blk_desc **descp)
}
U_BOOT_LEGACY_BLK(mmc) = {
- .if_typename = "mmc",
- .if_type = UCLASS_MMC,
+ .uclass_idname = "mmc",
+ .uclass_id = UCLASS_MMC,
.max_devs = -1,
.get_dev = mmc_get_dev,
.select_hwpart = mmc_select_hwpartp,
diff --git a/drivers/net/fsl_enetc.c b/drivers/net/fsl_enetc.c
index 835e5bd8bd5..d43a85b4984 100644
--- a/drivers/net/fsl_enetc.c
+++ b/drivers/net/fsl_enetc.c
@@ -146,7 +146,7 @@ static int enetc_init_sgmii(struct udevice *dev)
if (!enetc_has_imdio(dev))
return 0;
- if (priv->if_type == PHY_INTERFACE_MODE_2500BASEX)
+ if (priv->uclass_id == PHY_INTERFACE_MODE_2500BASEX)
is2500 = true;
/*
@@ -221,7 +221,7 @@ static void enetc_setup_mac_iface(struct udevice *dev,
struct enetc_priv *priv = dev_get_priv(dev);
u32 if_mode;
- switch (priv->if_type) {
+ switch (priv->uclass_id) {
case PHY_INTERFACE_MODE_RGMII:
case PHY_INTERFACE_MODE_RGMII_ID:
case PHY_INTERFACE_MODE_RGMII_RXID:
@@ -278,14 +278,14 @@ static void enetc_start_pcs(struct udevice *dev)
return;
}
- priv->if_type = dev_read_phy_mode(dev);
- if (priv->if_type == PHY_INTERFACE_MODE_NA) {
+ priv->uclass_id = dev_read_phy_mode(dev);
+ if (priv->uclass_id == PHY_INTERFACE_MODE_NA) {
enetc_dbg(dev,
"phy-mode property not found, defaulting to SGMII\n");
- priv->if_type = PHY_INTERFACE_MODE_SGMII;
+ priv->uclass_id = PHY_INTERFACE_MODE_SGMII;
}
- switch (priv->if_type) {
+ switch (priv->uclass_id) {
case PHY_INTERFACE_MODE_SGMII:
case PHY_INTERFACE_MODE_2500BASEX:
enetc_init_sgmii(dev);
diff --git a/drivers/net/fsl_enetc.h b/drivers/net/fsl_enetc.h
index 69f2f4aaff1..f2acf367aa3 100644
--- a/drivers/net/fsl_enetc.h
+++ b/drivers/net/fsl_enetc.h
@@ -158,7 +158,7 @@ struct enetc_priv {
struct bd_ring tx_bdr;
struct bd_ring rx_bdr;
- int if_type;
+ int uclass_id;
struct mii_dev imdio;
struct phy_device *phy;
};
diff --git a/drivers/scsi/Makefile b/drivers/scsi/Makefile
index 25194eeec11..d1b40c61401 100644
--- a/drivers/scsi/Makefile
+++ b/drivers/scsi/Makefile
@@ -17,4 +17,5 @@ endif
ifdef CONFIG_SCSI
obj-$(CONFIG_SANDBOX) += sandbox_scsi.o
+obj-$(CONFIG_SANDBOX) += scsi_emul.o
endif
diff --git a/drivers/scsi/sandbox_scsi.c b/drivers/scsi/sandbox_scsi.c
index 39b969a4b2f..a7ac33cb1c4 100644
--- a/drivers/scsi/sandbox_scsi.c
+++ b/drivers/scsi/sandbox_scsi.c
@@ -7,19 +7,145 @@
* that CONFIG_SCSI can be enabled for sandbox.
*/
+#define LOG_CATEGORY UCLASS_SCSI
+
#include <common.h>
+#include <dm.h>
+#include <os.h>
+#include <malloc.h>
#include <scsi.h>
+#include <scsi_emul.h>
+
+enum {
+ SANDBOX_SCSI_BLOCK_LEN = 512,
+ SANDBOX_SCSI_BUF_SIZE = 512,
+};
+
+/**
+ * struct sandbox_scsi_priv
+ *
+ * @eminfo: emulator state
+ * @pathanme: Path to the backing file, e.g. 'scsi.img'
+ * @fd: File descriptor of backing file
+ */
+struct sandbox_scsi_priv {
+ struct scsi_emul_info eminfo;
+ const char *pathname;
+ int fd;
+};
-int scsi_bus_reset(struct udevice *dev)
+static int sandbox_scsi_exec(struct udevice *dev, struct scsi_cmd *req)
{
+ struct sandbox_scsi_priv *priv = dev_get_priv(dev);
+ struct scsi_emul_info *info = &priv->eminfo;
+ int ret;
+
+ if (req->lun || req->target)
+ return -EIO;
+ ret = sb_scsi_emul_command(info, req, req->cmdlen);
+ if (ret < 0) {
+ log_debug("SCSI command 0x%02x ret errno %d\n", req->cmd[0],
+ ret);
+ return ret;
+ } else if (ret == SCSI_EMUL_DO_READ && priv->fd != -1) {
+ long bytes_read;
+
+ log_debug("read %x %x\n", info->seek_block, info->read_len);
+ os_lseek(priv->fd, info->seek_block * info->block_size,
+ OS_SEEK_SET);
+ bytes_read = os_read(priv->fd, req->pdata, info->buff_used);
+ if (bytes_read < 0)
+ return bytes_read;
+ if (bytes_read != info->buff_used)
+ return -EIO;
+ } else if (!ret) {
+ req->pdata = info->buff;
+ info->phase = SCSIPH_STATUS;
+ log_debug("sending buf\n");
+ } else {
+ log_debug("error\n");
+ return -EIO;
+ }
+
return 0;
}
-void scsi_init(void)
+static int sandbox_scsi_bus_reset(struct udevice *dev)
{
+ /* Not implemented */
+
+ return 0;
}
-int scsi_exec(struct udevice *dev, struct scsi_cmd *pccb)
+static int sandbox_scsi_of_to_plat(struct udevice *dev)
{
+ struct sandbox_scsi_priv *priv = dev_get_priv(dev);
+
+ priv->pathname = dev_read_string(dev, "sandbox,filepath");
+
return 0;
}
+
+static int sandbox_scsi_probe(struct udevice *dev)
+{
+ struct scsi_plat *scsi_plat = dev_get_uclass_plat(dev);
+ struct sandbox_scsi_priv *priv = dev_get_priv(dev);
+ struct scsi_emul_info *info = &priv->eminfo;
+ int ret;
+
+ scsi_plat->max_id = 2;
+ scsi_plat->max_lun = 3;
+ scsi_plat->max_bytes_per_req = 1 << 20;
+
+ info->vendor = "SANDBOX";
+ info->product = "FAKE DISK";
+ info->buff = malloc(SANDBOX_SCSI_BUF_SIZE);
+ if (!info->buff)
+ return log_ret(-ENOMEM);
+ info->block_size = SANDBOX_SCSI_BLOCK_LEN;
+
+ if (priv->pathname) {
+ priv->fd = os_open(priv->pathname, OS_O_RDONLY);
+ if (priv->fd != -1) {
+ ret = os_get_filesize(priv->pathname, &info->file_size);
+ if (ret)
+ return log_msg_ret("sz", ret);
+ }
+ } else {
+ priv->fd = -1;
+ }
+ log_debug("filename: %s, fd %d\n", priv->pathname, priv->fd);
+
+ return 0;
+}
+
+static int sandbox_scsi_remove(struct udevice *dev)
+{
+ struct sandbox_scsi_priv *priv = dev_get_priv(dev);
+ struct scsi_emul_info *info = &priv->eminfo;
+
+ free(info->buff);
+
+ return 0;
+}
+
+struct scsi_ops sandbox_scsi_ops = {
+ .exec = sandbox_scsi_exec,
+ .bus_reset = sandbox_scsi_bus_reset,
+};
+
+static const struct udevice_id sanbox_scsi_ids[] = {
+ { .compatible = "sandbox,scsi" },
+ { }
+};
+
+U_BOOT_DRIVER(sandbox_scsi) = {
+ .name = "sandbox_scsi",
+ .id = UCLASS_SCSI,
+ .ops = &sandbox_scsi_ops,
+ .of_match = sanbox_scsi_ids,
+ .of_to_plat = sandbox_scsi_of_to_plat,
+ .probe = sandbox_scsi_probe,
+ .remove = sandbox_scsi_remove,
+ .priv_auto = sizeof(struct sandbox_scsi_priv),
+};
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index 99be5aef877..3e769b0843f 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -456,7 +456,7 @@ static void scsi_init_dev_desc(struct blk_desc *dev_desc, int devnum)
{
dev_desc->lba = 0;
dev_desc->blksz = 0;
- dev_desc->if_type = UCLASS_SCSI;
+ dev_desc->uclass_id = UCLASS_SCSI;
dev_desc->devnum = devnum;
dev_desc->part_type = PART_TYPE_UNKNOWN;
@@ -706,8 +706,8 @@ U_BOOT_DRIVER(scsi_blk) = {
};
#else
U_BOOT_LEGACY_BLK(scsi) = {
- .if_typename = "scsi",
- .if_type = UCLASS_SCSI,
+ .uclass_idname = "scsi",
+ .uclass_id = UCLASS_SCSI,
.max_devs = SCSI_MAX_DEVICE,
.desc = scsi_dev_desc,
};
diff --git a/drivers/scsi/scsi_emul.c b/drivers/scsi/scsi_emul.c
new file mode 100644
index 00000000000..5ba364bdac7
--- /dev/null
+++ b/drivers/scsi/scsi_emul.c
@@ -0,0 +1,74 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Emulation of enough SCSI commands to find and read from a unit
+ *
+ * Copyright 2022 Google LLC
+ * Written by Simon Glass <[email protected]>
+ *
+ * implementation of SCSI functions required so that CONFIG_SCSI can be enabled
+ * for sandbox.
+ */
+
+#define LOG_CATEGORY UCLASS_SCSI
+
+#include <common.h>
+#include <dm.h>
+#include <log.h>
+#include <scsi.h>
+#include <scsi_emul.h>
+
+int sb_scsi_emul_command(struct scsi_emul_info *info,
+ const struct scsi_cmd *req, int len)
+{
+ int ret = 0;
+
+ info->buff_used = 0;
+ log_debug("emul %x\n", *req->cmd);
+ switch (*req->cmd) {
+ case SCSI_INQUIRY: {
+ struct scsi_inquiry_resp *resp = (void *)info->buff;
+
+ info->alloc_len = req->cmd[4];
+ memset(resp, '\0', sizeof(*resp));
+ resp->data_format = 1;
+ resp->additional_len = 0x1f;
+ strncpy(resp->vendor, info->vendor, sizeof(resp->vendor));
+ strncpy(resp->product, info->product, sizeof(resp->product));
+ strncpy(resp->revision, "1.0", sizeof(resp->revision));
+ info->buff_used = sizeof(*resp);
+ break;
+ }
+ case SCSI_TST_U_RDY:
+ break;
+ case SCSI_RD_CAPAC: {
+ struct scsi_read_capacity_resp *resp = (void *)info->buff;
+ uint blocks;
+
+ if (info->file_size)
+ blocks = info->file_size / info->block_size - 1;
+ else
+ blocks = 0;
+ resp->last_block_addr = cpu_to_be32(blocks);
+ resp->block_len = cpu_to_be32(info->block_size);
+ info->buff_used = sizeof(*resp);
+ break;
+ }
+ case SCSI_READ10: {
+ const struct scsi_read10_req *read_req = (void *)req;
+
+ info->seek_block = be32_to_cpu(read_req->lba);
+ info->read_len = be16_to_cpu(read_req->xfer_len);
+ info->buff_used = info->read_len * info->block_size;
+ ret = SCSI_EMUL_DO_READ;
+ break;
+ }
+ default:
+ debug("Command not supported: %x\n", req->cmd[0]);
+ ret = -EPROTONOSUPPORT;
+ }
+ if (ret >= 0)
+ info->phase = info->transfer_len ? SCSIPH_DATA : SCSIPH_STATUS;
+ log_debug(" - done %x: ret=%d\n", *req->cmd, ret);
+
+ return ret;
+}
diff --git a/drivers/usb/emul/sandbox_flash.c b/drivers/usb/emul/sandbox_flash.c
index 01b2b41cce9..2589c708d88 100644
--- a/drivers/usb/emul/sandbox_flash.c
+++ b/drivers/usb/emul/sandbox_flash.c
@@ -7,8 +7,10 @@
#include <common.h>
#include <dm.h>
#include <log.h>
+#include <malloc.h>
#include <os.h>
#include <scsi.h>
+#include <scsi_emul.h>
#include <usb.h>
/*
@@ -21,12 +23,7 @@ enum {
SANDBOX_FLASH_EP_OUT = 1, /* endpoints */
SANDBOX_FLASH_EP_IN = 2,
SANDBOX_FLASH_BLOCK_LEN = 512,
-};
-
-enum cmd_phase {
- PHASE_START,
- PHASE_DATA,
- PHASE_STATUS,
+ SANDBOX_FLASH_BUF_SIZE = 512,
};
enum {
@@ -40,29 +37,19 @@ enum {
/**
* struct sandbox_flash_priv - private state for this driver
*
+ * @eminfo: emulator state
* @error: true if there is an error condition
- * @alloc_len: Allocation length from the last incoming command
- * @transfer_len: Transfer length from CBW header
- * @read_len: Number of blocks of data left in the current read command
* @tag: Tag value from last command
* @fd: File descriptor of backing file
* @file_size: Size of file in bytes
* @status_buff: Data buffer for outgoing status
- * @buff_used: Number of bytes ready to transfer back to host
- * @buff: Data buffer for outgoing data
*/
struct sandbox_flash_priv {
+ struct scsi_emul_info eminfo;
bool error;
- int alloc_len;
- int transfer_len;
- int read_len;
- enum cmd_phase phase;
u32 tag;
int fd;
- loff_t file_size;
struct umass_bbb_csw status;
- int buff_used;
- u8 buff[512];
};
struct sandbox_flash_plat {
@@ -70,32 +57,6 @@ struct sandbox_flash_plat {
struct usb_string flash_strings[STRINGID_COUNT];
};
-struct scsi_inquiry_resp {
- u8 type;
- u8 flags;
- u8 version;
- u8 data_format;
- u8 additional_len;
- u8 spare[3];
- char vendor[8];
- char product[16];
- char revision[4];
-};
-
-struct scsi_read_capacity_resp {
- u32 last_block_addr;
- u32 block_len;
-};
-
-struct __packed scsi_read10_req {
- u8 cmd;
- u8 lun_flags;
- u32 lba;
- u8 spare;
- u16 transfer_len;
- u8 spare2[3];
-};
-
static struct usb_device_descriptor flash_device_desc = {
.bLength = sizeof(flash_device_desc),
.bDescriptorType = USB_DT_DEVICE,
@@ -200,7 +161,6 @@ static void setup_fail_response(struct sandbox_flash_priv *priv)
csw->dCSWTag = priv->tag;
csw->dCSWDataResidue = 0;
csw->bCSWStatus = CSWSTATUS_FAILED;
- priv->buff_used = 0;
}
/**
@@ -210,8 +170,7 @@ static void setup_fail_response(struct sandbox_flash_priv *priv)
* @resp: Response to send, or NULL if none
* @size: Size of response
*/
-static void setup_response(struct sandbox_flash_priv *priv, void *resp,
- int size)
+static void setup_response(struct sandbox_flash_priv *priv)
{
struct umass_bbb_csw *csw = &priv->status;
@@ -219,97 +178,45 @@ static void setup_response(struct sandbox_flash_priv *priv, void *resp,
csw->dCSWTag = priv->tag;
csw->dCSWDataResidue = 0;
csw->bCSWStatus = CSWSTATUS_GOOD;
-
- assert(!resp || resp == priv->buff);
- priv->buff_used = size;
}
-static void handle_read(struct sandbox_flash_priv *priv, ulong lba,
- ulong transfer_len)
-{
- debug("%s: lba=%lx, transfer_len=%lx\n", __func__, lba, transfer_len);
- priv->read_len = transfer_len;
- if (priv->fd != -1) {
- os_lseek(priv->fd, lba * SANDBOX_FLASH_BLOCK_LEN, OS_SEEK_SET);
- setup_response(priv, priv->buff,
- transfer_len * SANDBOX_FLASH_BLOCK_LEN);
- } else {
- setup_fail_response(priv);
- }
-}
-
-static int handle_ufi_command(struct sandbox_flash_plat *plat,
- struct sandbox_flash_priv *priv, const void *buff,
+static int handle_ufi_command(struct sandbox_flash_priv *priv, const void *buff,
int len)
{
+ struct scsi_emul_info *info = &priv->eminfo;
const struct scsi_cmd *req = buff;
+ int ret;
- switch (*req->cmd) {
- case SCSI_INQUIRY: {
- struct scsi_inquiry_resp *resp = (void *)priv->buff;
-
- priv->alloc_len = req->cmd[4];
- memset(resp, '\0', sizeof(*resp));
- resp->data_format = 1;
- resp->additional_len = 0x1f;
- strncpy(resp->vendor,
- plat->flash_strings[STRINGID_MANUFACTURER - 1].s,
- sizeof(resp->vendor));
- strncpy(resp->product,
- plat->flash_strings[STRINGID_PRODUCT - 1].s,
- sizeof(resp->product));
- strncpy(resp->revision, "1.0", sizeof(resp->revision));
- setup_response(priv, resp, sizeof(*resp));
- break;
- }
- case SCSI_TST_U_RDY:
- setup_response(priv, NULL, 0);
- break;
- case SCSI_RD_CAPAC: {
- struct scsi_read_capacity_resp *resp = (void *)priv->buff;
- uint blocks;
-
- if (priv->file_size)
- blocks = priv->file_size / SANDBOX_FLASH_BLOCK_LEN - 1;
- else
- blocks = 0;
- resp->last_block_addr = cpu_to_be32(blocks);
- resp->block_len = cpu_to_be32(SANDBOX_FLASH_BLOCK_LEN);
- setup_response(priv, resp, sizeof(*resp));
- break;
- }
- case SCSI_READ10: {
- struct scsi_read10_req *req = (void *)buff;
-
- handle_read(priv, be32_to_cpu(req->lba),
- be16_to_cpu(req->transfer_len));
- break;
- }
- default:
- debug("Command not supported: %x\n", req->cmd[0]);
- return -EPROTONOSUPPORT;
+ ret = sb_scsi_emul_command(info, req, len);
+ if (!ret) {
+ setup_response(priv);
+ } else if (ret == SCSI_EMUL_DO_READ && priv->fd != -1) {
+ os_lseek(priv->fd, info->seek_block * info->block_size,
+ OS_SEEK_SET);
+ setup_response(priv);
+ } else {
+ setup_fail_response(priv);
}
- priv->phase = priv->transfer_len ? PHASE_DATA : PHASE_STATUS;
return 0;
}
static int sandbox_flash_bulk(struct udevice *dev, struct usb_device *udev,
unsigned long pipe, void *buff, int len)
{
- struct sandbox_flash_plat *plat = dev_get_plat(dev);
struct sandbox_flash_priv *priv = dev_get_priv(dev);
+ struct scsi_emul_info *info = &priv->eminfo;
int ep = usb_pipeendpoint(pipe);
struct umass_bbb_cbw *cbw = buff;
debug("%s: dev=%s, pipe=%lx, ep=%x, len=%x, phase=%d\n", __func__,
- dev->name, pipe, ep, len, priv->phase);
+ dev->name, pipe, ep, len, info->phase);
switch (ep) {
case SANDBOX_FLASH_EP_OUT:
- switch (priv->phase) {
- case PHASE_START:
- priv->alloc_len = 0;
- priv->read_len = 0;
+ switch (info->phase) {
+ case SCSIPH_START:
+ info->alloc_len = 0;
+ info->read_len = 0;
if (priv->error || len != UMASS_BBB_CBW_SIZE ||
cbw->dCBWSignature != CBWSIGNATURE)
goto err;
@@ -318,22 +225,22 @@ static int sandbox_flash_bulk(struct udevice *dev, struct usb_device *udev,
goto err;
if (cbw->bCDBLength < 1 || cbw->bCDBLength >= 0x10)
goto err;
- priv->transfer_len = cbw->dCBWDataTransferLength;
+ info->transfer_len = cbw->dCBWDataTransferLength;
priv->tag = cbw->dCBWTag;
- return handle_ufi_command(plat, priv, cbw->CBWCDB,
+ return handle_ufi_command(priv, cbw->CBWCDB,
cbw->bCDBLength);
- case PHASE_DATA:
+ case SCSIPH_DATA:
debug("data out\n");
break;
default:
break;
}
case SANDBOX_FLASH_EP_IN:
- switch (priv->phase) {
- case PHASE_DATA:
- debug("data in, len=%x, alloc_len=%x, priv->read_len=%x\n",
- len, priv->alloc_len, priv->read_len);
- if (priv->read_len) {
+ switch (info->phase) {
+ case SCSIPH_DATA:
+ debug("data in, len=%x, alloc_len=%x, info->read_len=%x\n",
+ len, info->alloc_len, info->read_len);
+ if (info->read_len) {
ulong bytes_read;
if (priv->fd == -1)
@@ -342,24 +249,24 @@ static int sandbox_flash_bulk(struct udevice *dev, struct usb_device *udev,
bytes_read = os_read(priv->fd, buff, len);
if (bytes_read != len)
return -EIO;
- priv->read_len -= len / SANDBOX_FLASH_BLOCK_LEN;
- if (!priv->read_len)
- priv->phase = PHASE_STATUS;
+ info->read_len -= len / info->block_size;
+ if (!info->read_len)
+ info->phase = SCSIPH_STATUS;
} else {
- if (priv->alloc_len && len > priv->alloc_len)
- len = priv->alloc_len;
- if (len > sizeof(priv->buff))
- len = sizeof(priv->buff);
- memcpy(buff, priv->buff, len);
- priv->phase = PHASE_STATUS;
+ if (info->alloc_len && len > info->alloc_len)
+ len = info->alloc_len;
+ if (len > SANDBOX_FLASH_BUF_SIZE)
+ len = SANDBOX_FLASH_BUF_SIZE;
+ memcpy(buff, info->buff, len);
+ info->phase = SCSIPH_STATUS;
}
return len;
- case PHASE_STATUS:
+ case SCSIPH_STATUS:
debug("status in, len=%x\n", len);
if (len > sizeof(priv->status))
len = sizeof(priv->status);
memcpy(buff, &priv->status, len);
- priv->phase = PHASE_START;
+ info->phase = SCSIPH_START;
return len;
default:
break;
@@ -400,10 +307,31 @@ static int sandbox_flash_probe(struct udevice *dev)
{
struct sandbox_flash_plat *plat = dev_get_plat(dev);
struct sandbox_flash_priv *priv = dev_get_priv(dev);
+ struct scsi_emul_info *info = &priv->eminfo;
+ int ret;
priv->fd = os_open(plat->pathname, OS_O_RDONLY);
- if (priv->fd != -1)
- return os_get_filesize(plat->pathname, &priv->file_size);
+ if (priv->fd != -1) {
+ ret = os_get_filesize(plat->pathname, &info->file_size);
+ if (ret)
+ return log_msg_ret("sz", ret);
+ }
+ info->buff = malloc(SANDBOX_FLASH_BUF_SIZE);
+ if (!info->buff)
+ return log_ret(-ENOMEM);
+ info->vendor = plat->flash_strings[STRINGID_MANUFACTURER - 1].s;
+ info->product = plat->flash_strings[STRINGID_PRODUCT - 1].s;
+ info->block_size = SANDBOX_FLASH_BLOCK_LEN;
+
+ return 0;
+}
+
+static int sandbox_flash_remove(struct udevice *dev)
+{
+ struct sandbox_flash_priv *priv = dev_get_priv(dev);
+ struct scsi_emul_info *info = &priv->eminfo;
+
+ free(info->buff);
return 0;
}
@@ -424,6 +352,7 @@ U_BOOT_DRIVER(usb_sandbox_flash) = {
.of_match = sandbox_usb_flash_ids,
.bind = sandbox_flash_bind,
.probe = sandbox_flash_probe,
+ .remove = sandbox_flash_remove,
.of_to_plat = sandbox_flash_of_to_plat,
.ops = &sandbox_usb_flash_ops,
.priv_auto = sizeof(struct sandbox_flash_priv),
diff --git a/drivers/virtio/virtio_blk.c b/drivers/virtio/virtio_blk.c
index 9710b79117c..30cfc56725c 100644
--- a/drivers/virtio/virtio_blk.c
+++ b/drivers/virtio/virtio_blk.c
@@ -75,7 +75,7 @@ static int virtio_blk_bind(struct udevice *dev)
struct blk_desc *desc = dev_get_uclass_plat(dev);
int devnum;
- desc->if_type = UCLASS_VIRTIO;
+ desc->uclass_id = UCLASS_VIRTIO;
/*
* Initialize the devnum to -ENODEV. This is to make sure that
* blk_next_free_devnum() works as expected, since the default
diff --git a/drivers/xen/pvblock.c b/drivers/xen/pvblock.c
index 1090e528d02..970182cd904 100644
--- a/drivers/xen/pvblock.c
+++ b/drivers/xen/pvblock.c
@@ -665,7 +665,7 @@ static int pvblock_blk_bind(struct udevice *udev)
struct blk_desc *desc = dev_get_uclass_plat(udev);
int devnum;
- desc->if_type = UCLASS_PVBLOCK;
+ desc->uclass_id = UCLASS_PVBLOCK;
/*
* Initialize the devnum to -ENODEV. This is to make sure that
* blk_next_free_devnum() works as expected, since the default