Commit 955bc122 authored by Jens Axboe's avatar Jens Axboe

Merge tag 'nvme-6.2-2023-01-20' of git://git.infradead.org/nvme into block-6.2

Pull NVMe fixes from Christoph:

"nvme fixes for Linux 6.2

 - fix  controller shutdown regression in nvme-apple (Janne Grunau)
 - fix a polling on timeout regression in nvme-pci (Keith Busch)"

* tag 'nvme-6.2-2023-01-20' of git://git.infradead.org/nvme:
  nvme-pci: fix timeout request state check
  nvme-apple: only reset the controller when RTKit is running
  nvme-apple: reset controller during shutdown
parents 77465647 1c584208
...@@ -829,7 +829,23 @@ static void apple_nvme_disable(struct apple_nvme *anv, bool shutdown) ...@@ -829,7 +829,23 @@ static void apple_nvme_disable(struct apple_nvme *anv, bool shutdown)
apple_nvme_remove_cq(anv); apple_nvme_remove_cq(anv);
} }
/*
* Always disable the NVMe controller after shutdown.
* We need to do this to bring it back up later anyway, and we
* can't do it while the firmware is not running (e.g. in the
* resume reset path before RTKit is initialized), so for Apple
* controllers it makes sense to unconditionally do it here.
* Additionally, this sequence of events is reliable, while
* others (like disabling after bringing back the firmware on
* resume) seem to run into trouble under some circumstances.
*
* Both U-Boot and m1n1 also use this convention (i.e. an ANS
* NVMe controller is handed off with firmware shut down, in an
* NVMe disabled state, after a clean shutdown).
*/
if (shutdown)
nvme_disable_ctrl(&anv->ctrl, shutdown); nvme_disable_ctrl(&anv->ctrl, shutdown);
nvme_disable_ctrl(&anv->ctrl, false);
} }
WRITE_ONCE(anv->ioq.enabled, false); WRITE_ONCE(anv->ioq.enabled, false);
...@@ -985,11 +1001,11 @@ static void apple_nvme_reset_work(struct work_struct *work) ...@@ -985,11 +1001,11 @@ static void apple_nvme_reset_work(struct work_struct *work)
goto out; goto out;
} }
if (anv->ctrl.ctrl_config & NVME_CC_ENABLE)
apple_nvme_disable(anv, false);
/* RTKit must be shut down cleanly for the (soft)-reset to work */ /* RTKit must be shut down cleanly for the (soft)-reset to work */
if (apple_rtkit_is_running(anv->rtk)) { if (apple_rtkit_is_running(anv->rtk)) {
/* reset the controller if it is enabled */
if (anv->ctrl.ctrl_config & NVME_CC_ENABLE)
apple_nvme_disable(anv, false);
dev_dbg(anv->dev, "Trying to shut down RTKit before reset."); dev_dbg(anv->dev, "Trying to shut down RTKit before reset.");
ret = apple_rtkit_shutdown(anv->rtk); ret = apple_rtkit_shutdown(anv->rtk);
if (ret) if (ret)
......
...@@ -1362,7 +1362,7 @@ static enum blk_eh_timer_return nvme_timeout(struct request *req) ...@@ -1362,7 +1362,7 @@ static enum blk_eh_timer_return nvme_timeout(struct request *req)
else else
nvme_poll_irqdisable(nvmeq); nvme_poll_irqdisable(nvmeq);
if (blk_mq_request_completed(req)) { if (blk_mq_rq_state(req) != MQ_RQ_IN_FLIGHT) {
dev_warn(dev->ctrl.device, dev_warn(dev->ctrl.device,
"I/O %d QID %d timeout, completion polled\n", "I/O %d QID %d timeout, completion polled\n",
req->tag, nvmeq->qid); req->tag, nvmeq->qid);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment