Intel NVMe reset issue

Panah, Khosrow Khosrow.Panah at idt.com
Thu Nov 1 17:45:33 EDT 2012


Busch,

I used the 5 seconds as the worst case scenario to allow controller transition of CC.EN from 1 to 0. I concur that I have seen a timeout value specified in specification neither.

Khosrow


-----Original Message-----
From: Busch, Keith [mailto:keith.busch at intel.com] 
Sent: Thursday, November 01, 2012 2:13 PM
To: Panah, Khosrow; linux-nvme at lists.infradead.org
Cc: Kong, Kwok
Subject: RE: Intel NVMe reset issue

I think this looks good. Just curious, where does the 5 second timeout come from? That sounds reasonable to me, but I don't see that ECN033 specifies what the timeout should be for CSTS.RDY to transition from 1 to 0 after setting CC.EN to 0.

Reviewed-by: Keith Busch <keith.busch at intel.com>

> -----Original Message-----
> From: linux-nvme-bounces at lists.infradead.org [mailto:linux-nvme- 
> bounces at lists.infradead.org] On Behalf Of Panah, Khosrow
> Sent: Thursday, November 01, 2012 12:37 PM
> To: linux-nvme at lists.infradead.org
> Cc: Kong, Kwok
> Subject: Intel NVMe reset issue
> 
> All,
> 
> While testing Intel NVMe driver on Linux, I noticed there are 
> instances controller fails to initialize IDT controller. The problem 
> is related to Intel Linux driver does not wait for "Enable" bit to 
> clear when attempting to setup admin queue.  I am suggesting the 
> following changes to "nvme_configure_admin_queue" routine:
> 
> ***************
> *** 1039,1044 ****
> --- 1058,1078 ----
>         dev->ctrl_config |= NVME_CC_IOSQES | NVME_CC_IOCQES;
> 
>         writel(0, &dev->bar->cc);
> +       timeout = (5 * HZ) + jiffies;
> +       while (!result && (readl(&dev->bar->csts) & NVME_CSTS_RDY)) {
> +               msleep(100);
> +               if (fatal_signal_pending(current))
> +                       result = -EINTR;
> +               if (time_after(jiffies, timeout)) {
> +                       dev_err(&dev->pci_dev->dev,
> +                               "Device busy; aborting
> initialisation\n");
> +                       result = -ENODEV;
> +               }
> +       }
> +       if (result) {
> +               nvme_free_queue_mem(nvmeq);
> +               return result;
> +       }
>         writel(aqa, &dev->bar->aqa);
>         writeq(nvmeq->sq_dma_addr, &dev->bar->asq);
>         writeq(nvmeq->cq_dma_addr, &dev->bar->acq);
> 
> Khosrow
> 
> 
> _______________________________________________
> Linux-nvme mailing list
> Linux-nvme at lists.infradead.org
> http://merlin.infradead.org/mailman/listinfo/linux-nvme



More information about the Linux-nvme mailing list