mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
fpga: stratix10-soc: Fix SVC mailbox handling during reconfiguration
Fix incorrect stratix10_svc_done() usage during FPGA reconfiguration.
Do not call stratix10_svc_done() at the end of write_init() on success, so
the SVC session remains active through write() and write_complete(). Call
stratix10_svc_done() on failure in write_init() and write() so the shared
SVC mailbox is released when reconfiguration aborts, allowing coexistence
with other SVC clients such as soc64-hwmon.
Fixes: e7eef1d763 ("fpga: add intel stratix10 soc fpga manager driver")
Cc: stable@vger.kernel.org # 5.1+
Signed-off-by: Tien Sung Ang <tien.sung.ang@altera.com>
Signed-off-by: Tze Yee Ng <tze.yee.ng@altera.com>
Reviewed-by: Xu Yilun <yilun.xu@intel.com>
Link: https://lore.kernel.org/r/8768ce3260489c9febdfce08e27d03f5f5ed9c33.1782801986.git.tze.yee.ng@altera.com
Signed-off-by: Xu Yilun <yilun.xu@linux.intel.com>
This commit is contained in:
@@ -195,20 +195,18 @@ static int s10_ops_write_init(struct fpga_manager *mgr,
|
||||
ret = s10_svc_send_msg(priv, COMMAND_RECONFIG,
|
||||
&ctype, sizeof(ctype));
|
||||
if (ret < 0)
|
||||
goto init_done;
|
||||
goto init_error;
|
||||
|
||||
ret = wait_for_completion_timeout(
|
||||
&priv->status_return_completion, S10_RECONFIG_TIMEOUT);
|
||||
if (!ret) {
|
||||
if (!wait_for_completion_timeout(&priv->status_return_completion,
|
||||
S10_RECONFIG_TIMEOUT)) {
|
||||
dev_err(dev, "timeout waiting for RECONFIG_REQUEST\n");
|
||||
ret = -ETIMEDOUT;
|
||||
goto init_done;
|
||||
goto init_error;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
if (!test_and_clear_bit(SVC_STATUS_OK, &priv->status)) {
|
||||
ret = -ETIMEDOUT;
|
||||
goto init_done;
|
||||
goto init_error;
|
||||
}
|
||||
|
||||
/* Allocate buffers from the service layer's pool. */
|
||||
@@ -217,14 +215,16 @@ static int s10_ops_write_init(struct fpga_manager *mgr,
|
||||
if (IS_ERR(kbuf)) {
|
||||
s10_free_buffers(mgr);
|
||||
ret = PTR_ERR(kbuf);
|
||||
goto init_done;
|
||||
goto init_error;
|
||||
}
|
||||
|
||||
priv->svc_bufs[i].buf = kbuf;
|
||||
priv->svc_bufs[i].lock = 0;
|
||||
}
|
||||
|
||||
init_done:
|
||||
return 0;
|
||||
|
||||
init_error:
|
||||
stratix10_svc_done(priv->chan);
|
||||
return ret;
|
||||
}
|
||||
@@ -342,6 +342,9 @@ static int s10_ops_write(struct fpga_manager *mgr, const char *buf,
|
||||
if (!s10_free_buffers(mgr))
|
||||
dev_err(dev, "%s not all buffers were freed\n", __func__);
|
||||
|
||||
if (ret < 0)
|
||||
stratix10_svc_done(priv->chan);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user