From 6e16f7f09c6171e0dc07a0a8b97a3569e8b47a9a Mon Sep 17 00:00:00 2001 From: anans Date: Fri, 11 Mar 2022 20:07:39 +0530 Subject: [PATCH 1/2] refactor(ufs): adds a function for sending command new function for sending commands and reuses that function in the driver, this can also be used to have retries for specific commands in the future Signed-off-by: anans Change-Id: Ie01f36ff8e2df072db4d97929d293b80ed24f04b --- drivers/ufs/ufs.c | 44 ++++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/drivers/ufs/ufs.c b/drivers/ufs/ufs.c index 3d6d99fb0..b040a9518 100644 --- a/drivers/ufs/ufs.c +++ b/drivers/ufs/ufs.c @@ -490,6 +490,21 @@ static int ufs_check_resp(utp_utrd_t *utrd, int trans_type) return 0; } +static void ufs_send_cmd(utp_utrd_t *utrd, uint8_t cmd_op, uint8_t lun, int lba, uintptr_t buf, + size_t length) +{ + int result; + + get_utrd(utrd); + + result = ufs_prepare_cmd(utrd, cmd_op, lun, lba, buf, length); + assert(result == 0); + ufs_send_request(utrd->task_tag); + result = ufs_check_resp(utrd, RESPONSE_UPIU); + assert(result == 0); + (void)result; +} + #ifdef UFS_RESP_DEBUG static void dump_upiu(utp_utrd_t *utrd) { @@ -540,14 +555,7 @@ static void ufs_verify_init(void) static void ufs_verify_ready(void) { utp_utrd_t utrd; - int result; - - get_utrd(&utrd); - ufs_prepare_cmd(&utrd, CDBCMD_TEST_UNIT_READY, 0, 0, 0, 0); - ufs_send_request(utrd.task_tag); - result = ufs_check_resp(&utrd, RESPONSE_UPIU); - assert(result == 0); - (void)result; + ufs_send_cmd(&utrd, CDBCMD_TEST_UNIT_READY, 0, 0, 0, 0); } static void ufs_query(uint8_t op, uint8_t idn, uint8_t index, uint8_t sel, @@ -663,12 +671,8 @@ static void ufs_read_capacity(int lun, unsigned int *num, unsigned int *size) memset((void *)buf, 0, CACHE_WRITEBACK_GRANULE); flush_dcache_range(buf, CACHE_WRITEBACK_GRANULE); do { - get_utrd(&utrd); - ufs_prepare_cmd(&utrd, CDBCMD_READ_CAPACITY_10, lun, 0, - buf, READ_CAPACITY_LENGTH); - ufs_send_request(utrd.task_tag); - result = ufs_check_resp(&utrd, RESPONSE_UPIU); - assert(result == 0); + ufs_send_cmd(&utrd, CDBCMD_READ_CAPACITY_10, lun, 0, + buf, READ_CAPACITY_LENGTH); #ifdef UFS_RESP_DEBUG dump_upiu(&utrd); #endif @@ -702,11 +706,7 @@ size_t ufs_read_blocks(int lun, int lba, uintptr_t buf, size_t size) (ufs_params.desc_base != 0) && (ufs_params.desc_size >= UFS_DESC_SIZE)); - get_utrd(&utrd); - ufs_prepare_cmd(&utrd, CDBCMD_READ_10, lun, lba, buf, size); - ufs_send_request(utrd.task_tag); - result = ufs_check_resp(&utrd, RESPONSE_UPIU); - assert(result == 0); + ufs_send_cmd(&utrd, CDBCMD_READ_10, lun, lba, buf, size); #ifdef UFS_RESP_DEBUG dump_upiu(&utrd); #endif @@ -725,11 +725,7 @@ size_t ufs_write_blocks(int lun, int lba, const uintptr_t buf, size_t size) (ufs_params.desc_base != 0) && (ufs_params.desc_size >= UFS_DESC_SIZE)); - get_utrd(&utrd); - ufs_prepare_cmd(&utrd, CDBCMD_WRITE_10, lun, lba, buf, size); - ufs_send_request(utrd.task_tag); - result = ufs_check_resp(&utrd, RESPONSE_UPIU); - assert(result == 0); + ufs_send_cmd(&utrd, CDBCMD_WRITE_10, lun, lba, buf, size); #ifdef UFS_RESP_DEBUG dump_upiu(&utrd); #endif From 0956319b580726029ddc4e00cde6c5a348b99052 Mon Sep 17 00:00:00 2001 From: anans Date: Tue, 15 Mar 2022 13:37:37 +0530 Subject: [PATCH 2/2] fix(ufs): move nutrs assignment to ufs_init nutrs is set in ufs_enum (used by get_empty_slot), this will not be assigned if UFS_FLAGS_SKIPINIT is set in flags during init and might end up crashing read/write commands Change-Id: I1517b69c56741fd5bf4ef0ebc1fc8738746233d7 Signed-off-by: anans --- drivers/ufs/ufs.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/drivers/ufs/ufs.c b/drivers/ufs/ufs.c index b040a9518..3c27afff2 100644 --- a/drivers/ufs/ufs.c +++ b/drivers/ufs/ufs.c @@ -739,11 +739,6 @@ static void ufs_enum(void) unsigned int blk_num, blk_size; int i; - /* 0 means 1 slot */ - nutrs = (mmio_read_32(ufs_params.reg_base + CAP) & CAP_NUTRS_MASK) + 1; - if (nutrs > (ufs_params.desc_size / UFS_DESC_SIZE)) - nutrs = ufs_params.desc_size / UFS_DESC_SIZE; - ufs_verify_init(); ufs_verify_ready(); @@ -788,6 +783,13 @@ int ufs_init(const ufs_ops_t *ops, ufs_params_t *params) memcpy(&ufs_params, params, sizeof(ufs_params_t)); + /* 0 means 1 slot */ + nutrs = (mmio_read_32(ufs_params.reg_base + CAP) & CAP_NUTRS_MASK) + 1; + if (nutrs > (ufs_params.desc_size / UFS_DESC_SIZE)) { + nutrs = ufs_params.desc_size / UFS_DESC_SIZE; + } + + if (ufs_params.flags & UFS_FLAGS_SKIPINIT) { result = ufshc_dme_get(0x1571, 0, &data); assert(result == 0);