mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-25 14:10:43 +00:00
nvme: Respect timeout when en/disabling the controller
So far the driver unconditionally delays 10ms when en/disabling the controller and still return 0 if 10ms times out. In fact, spec defines a timeout value in the CAP register that is the worst case time that host software shall wait for the controller to become ready. Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
parent
b65c692143
commit
04d2a38401
1 changed files with 11 additions and 3 deletions
|
@ -47,11 +47,19 @@ struct nvme_queue {
|
|||
static int nvme_wait_ready(struct nvme_dev *dev, bool enabled)
|
||||
{
|
||||
u32 bit = enabled ? NVME_CSTS_RDY : 0;
|
||||
int timeout;
|
||||
ulong start;
|
||||
|
||||
while ((readl(&dev->bar->csts) & NVME_CSTS_RDY) != bit)
|
||||
udelay(10000);
|
||||
/* Timeout field in the CAP register is in 500 millisecond units */
|
||||
timeout = NVME_CAP_TIMEOUT(dev->cap) * 500;
|
||||
|
||||
return 0;
|
||||
start = get_timer(0);
|
||||
while (get_timer(start) < timeout) {
|
||||
if ((readl(&dev->bar->csts) & NVME_CSTS_RDY) == bit)
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -ETIME;
|
||||
}
|
||||
|
||||
static int nvme_setup_prps(struct nvme_dev *dev, u64 *prp2,
|
||||
|
|
Loading…
Reference in a new issue