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:
Bin Meng 2017-08-22 08:15:11 -07:00 committed by Tom Rini
parent b65c692143
commit 04d2a38401

View file

@ -47,13 +47,21 @@ 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;
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,
int total_len, u64 dma_addr)
{