diff --git a/drivers/ufs/ufs.c b/drivers/ufs/ufs.c index 3c27afff2..f4e54b3d3 100644 --- a/drivers/ufs/ufs.c +++ b/drivers/ufs/ufs.c @@ -734,16 +734,41 @@ size_t ufs_write_blocks(int lun, int lba, const uintptr_t buf, size_t size) return size - resp->res_trans_cnt; } +static int ufs_set_fdevice_init(void) +{ + unsigned int result; + int timeout; + + ufs_set_flag(FLAG_DEVICE_INIT); + + timeout = FDEVICEINIT_TIMEOUT_MS; + do { + result = ufs_read_flag(FLAG_DEVICE_INIT); + if (!result) { + break; + } + mdelay(5); + timeout -= 5; + } while (timeout > 0); + + if (result != 0U) { + return -ETIMEDOUT; + } + + return 0; +} + static void ufs_enum(void) { unsigned int blk_num, blk_size; - int i; + int i, result; ufs_verify_init(); ufs_verify_ready(); - ufs_set_flag(FLAG_DEVICE_INIT); - mdelay(200); + result = ufs_set_fdevice_init(); + assert(result == 0); + /* dump available LUNs */ for (i = 0; i < UFS_MAX_LUNS; i++) { ufs_read_capacity(i, &blk_num, &blk_size); @@ -752,6 +777,8 @@ static void ufs_enum(void) i, blk_num, blk_size); } } + + (void)result; } static void ufs_get_device_info(struct ufs_dev_desc *card_data) diff --git a/include/drivers/ufs.h b/include/drivers/ufs.h index c074e85d1..8930474a9 100644 --- a/include/drivers/ufs.h +++ b/include/drivers/ufs.h @@ -265,6 +265,8 @@ #define HCE_ENABLE_INNER_RETRIES 50 #define HCE_ENABLE_TIMEOUT_US 100 +#define FDEVICEINIT_TIMEOUT_MS 1500 + /** * ufs_dev_desc - ufs device details from the device descriptor * @wmanufacturerid: card details