mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-16 17:44:19 +00:00
Merge "fix(ufs): add retries to ufs_read_capacity" into integration
This commit is contained in:
commit
1d867c14cb
2 changed files with 28 additions and 17 deletions
|
@ -682,14 +682,14 @@ void ufs_write_desc(int idn, int index, uintptr_t buf, size_t size)
|
|||
ufs_query(QUERY_WRITE_DESC, idn, index, 0, buf, size);
|
||||
}
|
||||
|
||||
static void ufs_read_capacity(int lun, unsigned int *num, unsigned int *size)
|
||||
static int ufs_read_capacity(int lun, unsigned int *num, unsigned int *size)
|
||||
{
|
||||
utp_utrd_t utrd;
|
||||
resp_upiu_t *resp;
|
||||
sense_data_t *sense;
|
||||
unsigned char data[CACHE_WRITEBACK_GRANULE << 1];
|
||||
uintptr_t buf;
|
||||
int retry;
|
||||
int retries = UFS_READ_CAPACITY_RETRIES;
|
||||
|
||||
assert((ufs_params.reg_base != 0) &&
|
||||
(ufs_params.desc_base != 0) &&
|
||||
|
@ -707,22 +707,24 @@ static void ufs_read_capacity(int lun, unsigned int *num, unsigned int *size)
|
|||
dump_upiu(&utrd);
|
||||
#endif
|
||||
resp = (resp_upiu_t *)utrd.resp_upiu;
|
||||
retry = 0;
|
||||
sense = &resp->sd.sense;
|
||||
if (sense->resp_code == SENSE_DATA_VALID) {
|
||||
if ((sense->sense_key == SENSE_KEY_UNIT_ATTENTION) &&
|
||||
(sense->asc == 0x29) && (sense->ascq == 0)) {
|
||||
retry = 1;
|
||||
}
|
||||
if (!((sense->resp_code == SENSE_DATA_VALID) &&
|
||||
(sense->sense_key == SENSE_KEY_UNIT_ATTENTION) &&
|
||||
(sense->asc == 0x29) && (sense->ascq == 0))) {
|
||||
inv_dcache_range(buf, CACHE_WRITEBACK_GRANULE);
|
||||
/* last logical block address */
|
||||
*num = be32toh(*(unsigned int *)buf);
|
||||
if (*num)
|
||||
*num += 1;
|
||||
/* logical block length in bytes */
|
||||
*size = be32toh(*(unsigned int *)(buf + 4));
|
||||
|
||||
return 0;
|
||||
}
|
||||
inv_dcache_range(buf, CACHE_WRITEBACK_GRANULE);
|
||||
/* last logical block address */
|
||||
*num = be32toh(*(unsigned int *)buf);
|
||||
if (*num)
|
||||
*num += 1;
|
||||
/* logical block length in bytes */
|
||||
*size = be32toh(*(unsigned int *)(buf + 4));
|
||||
} while (retry);
|
||||
|
||||
} while (retries-- > 0);
|
||||
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
size_t ufs_read_blocks(int lun, int lba, uintptr_t buf, size_t size)
|
||||
|
@ -799,9 +801,15 @@ static void ufs_enum(void)
|
|||
result = ufs_set_fdevice_init();
|
||||
assert(result == 0);
|
||||
|
||||
blk_num = 0;
|
||||
blk_size = 0;
|
||||
|
||||
/* dump available LUNs */
|
||||
for (i = 0; i < UFS_MAX_LUNS; i++) {
|
||||
ufs_read_capacity(i, &blk_num, &blk_size);
|
||||
result = ufs_read_capacity(i, &blk_num, &blk_size);
|
||||
if (result != 0) {
|
||||
WARN("UFS LUN%d dump failed\n", i);
|
||||
}
|
||||
if (blk_num && blk_size) {
|
||||
INFO("UFS LUN%d contains %d blocks with %d-byte size\n",
|
||||
i, blk_num, blk_size);
|
||||
|
|
|
@ -259,6 +259,9 @@
|
|||
/* maximum number of retries for a general UIC command */
|
||||
#define UFS_UIC_COMMAND_RETRIES 3
|
||||
|
||||
/* maximum number of retries for reading UFS capacity */
|
||||
#define UFS_READ_CAPACITY_RETRIES 10
|
||||
|
||||
/* maximum number of link-startup retries */
|
||||
#define DME_LINKSTARTUP_RETRIES 10
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue