mirror of
https://xff.cz/git/u-boot/
synced 2025-09-25 12:31:17 +02: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:
@@ -47,11 +47,19 @@ struct nvme_queue {
|
|||||||
static int nvme_wait_ready(struct nvme_dev *dev, bool enabled)
|
static int nvme_wait_ready(struct nvme_dev *dev, bool enabled)
|
||||||
{
|
{
|
||||||
u32 bit = enabled ? NVME_CSTS_RDY : 0;
|
u32 bit = enabled ? NVME_CSTS_RDY : 0;
|
||||||
|
int timeout;
|
||||||
|
ulong start;
|
||||||
|
|
||||||
while ((readl(&dev->bar->csts) & NVME_CSTS_RDY) != bit)
|
/* Timeout field in the CAP register is in 500 millisecond units */
|
||||||
udelay(10000);
|
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,
|
static int nvme_setup_prps(struct nvme_dev *dev, u64 *prp2,
|
||||||
|
Reference in New Issue
Block a user