| From e444c26c8143cefad653556be0633cbdfce1a6b8 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 20 May 2021 13:35:19 +0200 |
| Subject: firmware: turris-mox-rwtm: fail probing when firmware does not |
| support hwrng |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Pali Rohár <pali@kernel.org> |
| |
| [ Upstream commit 2eab59cf0d2036a5a9e264f719b71c21ccf679c2 ] |
| |
| When Marvell's rWTM firmware, which does not support the GET_RANDOM |
| command, is used, kernel prints an error message |
| hwrng: no data available |
| every 10 seconds. |
| |
| Fail probing of this driver if the rWTM firmware does not support the |
| GET_RANDOM command. |
| |
| Fixes: 389711b37493 ("firmware: Add Turris Mox rWTM firmware driver") |
| Signed-off-by: Pali Rohár <pali@kernel.org> |
| Signed-off-by: Marek Behún <kabel@kernel.org> |
| Reviewed-by: Andrew Lunn <andrew@lunn.ch> |
| Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/firmware/turris-mox-rwtm.c | 28 ++++++++++++++++++++++++++++ |
| 1 file changed, 28 insertions(+) |
| |
| diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c |
| index d7e3489e4bf2..3ef9687dddca 100644 |
| --- a/drivers/firmware/turris-mox-rwtm.c |
| +++ b/drivers/firmware/turris-mox-rwtm.c |
| @@ -260,6 +260,27 @@ static int mox_get_board_info(struct mox_rwtm *rwtm) |
| return 0; |
| } |
| |
| +static int check_get_random_support(struct mox_rwtm *rwtm) |
| +{ |
| + struct armada_37xx_rwtm_tx_msg msg; |
| + int ret; |
| + |
| + msg.command = MBOX_CMD_GET_RANDOM; |
| + msg.args[0] = 1; |
| + msg.args[1] = rwtm->buf_phys; |
| + msg.args[2] = 4; |
| + |
| + ret = mbox_send_message(rwtm->mbox, &msg); |
| + if (ret < 0) |
| + return ret; |
| + |
| + ret = wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2); |
| + if (ret < 0) |
| + return ret; |
| + |
| + return mox_get_status(MBOX_CMD_GET_RANDOM, rwtm->reply.retval); |
| +} |
| + |
| static int mox_hwrng_read(struct hwrng *rng, void *data, size_t max, bool wait) |
| { |
| struct mox_rwtm *rwtm = (struct mox_rwtm *) rng->priv; |
| @@ -497,6 +518,13 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev) |
| if (ret < 0) |
| dev_warn(dev, "Cannot read board information: %i\n", ret); |
| |
| + ret = check_get_random_support(rwtm); |
| + if (ret < 0) { |
| + dev_notice(dev, |
| + "Firmware does not support the GET_RANDOM command\n"); |
| + goto free_channel; |
| + } |
| + |
| rwtm->hwrng.name = DRIVER_NAME "_hwrng"; |
| rwtm->hwrng.read = mox_hwrng_read; |
| rwtm->hwrng.priv = (unsigned long) rwtm; |
| -- |
| 2.30.2 |
| |