Commit 65963ead authored by Asai Thambi SP's avatar Asai Thambi SP Committed by Sasha Levin

mtip32xx: Handle FTL rebuild failure state during device initialization

[ Upstream commit aae4a033 ]

Allow device initialization to finish gracefully when it is in
FTL rebuild failure state. Also, recover device out of this state
after successfully secure erasing it.
Signed-off-by: default avatarSelvan Mani <smani@micron.com>
Signed-off-by: default avatarVignesh Gunasekaran <vgunasekaran@micron.com>
Signed-off-by: default avatarAsai Thambi S P <asamymuthupa@micron.com>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
Signed-off-by: default avatarSasha Levin <sasha.levin@oracle.com>
parent 0e536ed2
...@@ -705,7 +705,7 @@ static void mtip_handle_tfe(struct driver_data *dd) ...@@ -705,7 +705,7 @@ static void mtip_handle_tfe(struct driver_data *dd)
fail_reason = "thermal shutdown"; fail_reason = "thermal shutdown";
} }
if (buf[288] == 0xBF) { if (buf[288] == 0xBF) {
set_bit(MTIP_DDF_SEC_LOCK_BIT, &dd->dd_flag); set_bit(MTIP_DDF_REBUILD_FAILED_BIT, &dd->dd_flag);
dev_info(&dd->pdev->dev, dev_info(&dd->pdev->dev,
"Drive indicates rebuild has failed. Secure erase required.\n"); "Drive indicates rebuild has failed. Secure erase required.\n");
fail_all_ncq_cmds = 1; fail_all_ncq_cmds = 1;
...@@ -1012,6 +1012,7 @@ static bool mtip_pause_ncq(struct mtip_port *port, ...@@ -1012,6 +1012,7 @@ static bool mtip_pause_ncq(struct mtip_port *port,
(fis->features == 0x27 || fis->features == 0x72 || (fis->features == 0x27 || fis->features == 0x72 ||
fis->features == 0x62 || fis->features == 0x26))) { fis->features == 0x62 || fis->features == 0x26))) {
clear_bit(MTIP_DDF_SEC_LOCK_BIT, &port->dd->dd_flag); clear_bit(MTIP_DDF_SEC_LOCK_BIT, &port->dd->dd_flag);
clear_bit(MTIP_DDF_REBUILD_FAILED_BIT, &port->dd->dd_flag);
/* Com reset after secure erase or lowlevel format */ /* Com reset after secure erase or lowlevel format */
mtip_restart_port(port); mtip_restart_port(port);
return false; return false;
...@@ -1176,6 +1177,7 @@ static int mtip_exec_internal_command(struct mtip_port *port, ...@@ -1176,6 +1177,7 @@ static int mtip_exec_internal_command(struct mtip_port *port,
if ((rv = wait_for_completion_interruptible_timeout( if ((rv = wait_for_completion_interruptible_timeout(
&wait, &wait,
msecs_to_jiffies(timeout))) <= 0) { msecs_to_jiffies(timeout))) <= 0) {
if (rv == -ERESTARTSYS) { /* interrupted */ if (rv == -ERESTARTSYS) { /* interrupted */
dev_err(&dd->pdev->dev, dev_err(&dd->pdev->dev,
"Internal command [%02X] was interrupted after %u ms\n", "Internal command [%02X] was interrupted after %u ms\n",
...@@ -3128,7 +3130,7 @@ static int mtip_hw_get_identify(struct driver_data *dd) ...@@ -3128,7 +3130,7 @@ static int mtip_hw_get_identify(struct driver_data *dd)
if (buf[288] == 0xBF) { if (buf[288] == 0xBF) {
dev_info(&dd->pdev->dev, dev_info(&dd->pdev->dev,
"Drive indicates rebuild has failed.\n"); "Drive indicates rebuild has failed.\n");
/* TODO */ set_bit(MTIP_DDF_REBUILD_FAILED_BIT, &dd->dd_flag);
} }
} }
...@@ -3708,10 +3710,9 @@ static int mtip_submit_request(struct blk_mq_hw_ctx *hctx, struct request *rq) ...@@ -3708,10 +3710,9 @@ static int mtip_submit_request(struct blk_mq_hw_ctx *hctx, struct request *rq)
rq_data_dir(rq))) { rq_data_dir(rq))) {
return -ENODATA; return -ENODATA;
} }
if (unlikely(test_bit(MTIP_DDF_SEC_LOCK_BIT, &dd->dd_flag))) if (unlikely(test_bit(MTIP_DDF_SEC_LOCK_BIT, &dd->dd_flag) ||
test_bit(MTIP_DDF_REBUILD_FAILED_BIT, &dd->dd_flag)))
return -ENODATA; return -ENODATA;
if (test_bit(MTIP_DDF_REBUILD_FAILED_BIT, &dd->dd_flag))
return -ENXIO;
} }
if (rq->cmd_flags & REQ_DISCARD) { if (rq->cmd_flags & REQ_DISCARD) {
......
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