* [PATCH 00/19] Updates for turris-mox-rwtm driver
@ 2024-06-12 13:54 Marek Behún
2024-06-12 13:54 ` [PATCH 01/19] firmware: turris-mox-rwtm: Do not complete if there are no waiters Marek Behún
` (18 more replies)
0 siblings, 19 replies; 32+ messages in thread
From: Marek Behún @ 2024-06-12 13:54 UTC (permalink / raw)
To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
Cc: Marek Behún
Hi Gregory, Arnd, Andy et al.
this is a series of fixes, refactors and cleanups for the
turris-mox-rwtm driver.
Marek
Marek Behún (19):
firmware: turris-mox-rwtm: Do not complete if there are no waiters
firmware: turris-mox-rwtm: Fix checking return value of
wait_for_completion_timeout()
firmware: turris-mox-rwtm: Use PAGE_SIZE instead of hardcoded 4096
firmware: turris-mox-rwtm: Use ETH_ALEN instead of hardcoded 6
firmware: turris-mox-rwtm: Use the boolean type where appropriate
firmware: turris-mox-rwtm: Hide signature related constants behind
macros
firmware: turris-mox-rwtm: Fix driver includes
firmware: turris-mox-rwtm: Use kobj_type's default_groups member for
automatic sysfs files creation
firmware: turris-mox-rwtm: Simplify debugfs code
firmware: turris-mox-rwtm: Simplify driver kobject code
firmware: turris-mox-rwtm: Return true error code if kobject_add()
fails
firmware: turris-mox-rwtm: Convert rest to devm_* and get rid of
driver .remove()
firmware: turris-mox-rwtm: Use dev_err_probe() where possible
firmware: turris-mox-rwtm: Rearrange probe calls
firmware: turris-mox-rwtm: Drop redundant device pointer
firmware: turris-mox-rwtm: Use devm_mutex_init() instead of
mutex_init()
firmware: turris-mox-rwtm: Use container_of() instead of hwrng .priv
member
firmware: turris-mox-rwtm: Deduplicate command execution code
firmware: turris-mox-rwtm: Use EOPNOTSUPP instead of ENOSYS
drivers/firmware/turris-mox-rwtm.c | 390 +++++++++++++----------------
1 file changed, 172 insertions(+), 218 deletions(-)
--
2.44.2
^ permalink raw reply [flat|nested] 32+ messages in thread
* [PATCH 01/19] firmware: turris-mox-rwtm: Do not complete if there are no waiters
2024-06-12 13:54 [PATCH 00/19] Updates for turris-mox-rwtm driver Marek Behún
@ 2024-06-12 13:54 ` Marek Behún
2024-06-12 13:54 ` [PATCH 02/19] firmware: turris-mox-rwtm: Fix checking return value of wait_for_completion_timeout() Marek Behún
` (17 subsequent siblings)
18 siblings, 0 replies; 32+ messages in thread
From: Marek Behún @ 2024-06-12 13:54 UTC (permalink / raw)
To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
Cc: Marek Behún
Do not complete the command done completion if there are no waiters.
This can happen if a wait_for_completion timed out or was interrupted.
Fixes: 389711b37493 ("firmware: Add Turris Mox rWTM firmware driver")
Signed-off-by: Marek Behún <kabel@kernel.org>
---
drivers/firmware/turris-mox-rwtm.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
index 31d962cdd6eb..f1f9160c4195 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -2,7 +2,7 @@
/*
* Turris Mox rWTM firmware driver
*
- * Copyright (C) 2019 Marek Behún <kabel@kernel.org>
+ * Copyright (C) 2019, 2024 Marek Behún <kabel@kernel.org>
*/
#include <linux/armada-37xx-rwtm-mailbox.h>
@@ -174,6 +174,9 @@ static void mox_rwtm_rx_callback(struct mbox_client *cl, void *data)
struct mox_rwtm *rwtm = dev_get_drvdata(cl->dev);
struct armada_37xx_rwtm_rx_msg *msg = data;
+ if (completion_done(&rwtm->cmd_done))
+ return;
+
rwtm->reply = *msg;
complete(&rwtm->cmd_done);
}
--
2.44.2
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 02/19] firmware: turris-mox-rwtm: Fix checking return value of wait_for_completion_timeout()
2024-06-12 13:54 [PATCH 00/19] Updates for turris-mox-rwtm driver Marek Behún
2024-06-12 13:54 ` [PATCH 01/19] firmware: turris-mox-rwtm: Do not complete if there are no waiters Marek Behún
@ 2024-06-12 13:54 ` Marek Behún
2024-06-13 8:06 ` Ilpo Järvinen
2024-06-12 13:54 ` [PATCH 03/19] firmware: turris-mox-rwtm: Use PAGE_SIZE instead of hardcoded 4096 Marek Behún
` (16 subsequent siblings)
18 siblings, 1 reply; 32+ messages in thread
From: Marek Behún @ 2024-06-12 13:54 UTC (permalink / raw)
To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
Cc: Marek Behún
The wait_for_completion_timeout() function returns 0 if timed out, and a
positive value if completed. Fix the usage of this function.
Fixes: 389711b37493 ("firmware: Add Turris Mox rWTM firmware driver")
Fixes: 2eab59cf0d20 ("firmware: turris-mox-rwtm: fail probing when firmware does not support hwrng")
Signed-off-by: Marek Behún <kabel@kernel.org>
---
drivers/firmware/turris-mox-rwtm.c | 15 ++++++---------
1 file changed, 6 insertions(+), 9 deletions(-)
diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
index f1f9160c4195..3f4758e03c81 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -202,9 +202,8 @@ static int mox_get_board_info(struct mox_rwtm *rwtm)
if (ret < 0)
return ret;
- ret = wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2);
- if (ret < 0)
- return ret;
+ if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2))
+ return -ETIMEDOUT;
ret = mox_get_status(MBOX_CMD_BOARD_INFO, reply->retval);
if (ret == -ENODATA) {
@@ -238,9 +237,8 @@ static int mox_get_board_info(struct mox_rwtm *rwtm)
if (ret < 0)
return ret;
- ret = wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2);
- if (ret < 0)
- return ret;
+ if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2))
+ return -ETIMEDOUT;
ret = mox_get_status(MBOX_CMD_ECDSA_PUB_KEY, reply->retval);
if (ret == -ENODATA) {
@@ -277,9 +275,8 @@ static int check_get_random_support(struct mox_rwtm *rwtm)
if (ret < 0)
return ret;
- ret = wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2);
- if (ret < 0)
- return ret;
+ if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2))
+ return -ETIMEDOUT;
return mox_get_status(MBOX_CMD_GET_RANDOM, rwtm->reply.retval);
}
--
2.44.2
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 03/19] firmware: turris-mox-rwtm: Use PAGE_SIZE instead of hardcoded 4096
2024-06-12 13:54 [PATCH 00/19] Updates for turris-mox-rwtm driver Marek Behún
2024-06-12 13:54 ` [PATCH 01/19] firmware: turris-mox-rwtm: Do not complete if there are no waiters Marek Behún
2024-06-12 13:54 ` [PATCH 02/19] firmware: turris-mox-rwtm: Fix checking return value of wait_for_completion_timeout() Marek Behún
@ 2024-06-12 13:54 ` Marek Behún
2024-06-13 8:01 ` Ilpo Järvinen
2024-06-12 13:54 ` [PATCH 04/19] firmware: turris-mox-rwtm: Use ETH_ALEN instead of hardcoded 6 Marek Behún
` (15 subsequent siblings)
18 siblings, 1 reply; 32+ messages in thread
From: Marek Behún @ 2024-06-12 13:54 UTC (permalink / raw)
To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
Cc: Marek Behún
The 4096 bytes limit in mox_hwrng_read() is due to the DMA buffer being
allocated to one PAGE_SIZE bytes. The PAGE_SIZE macro is used when
allocating the buffer, use it in mox_hwrng_read() as well.
Signed-off-by: Marek Behún <kabel@kernel.org>
---
drivers/firmware/turris-mox-rwtm.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
index 3f4758e03c81..5acdde1bb6d9 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -287,8 +287,8 @@ static int mox_hwrng_read(struct hwrng *rng, void *data, size_t max, bool wait)
struct armada_37xx_rwtm_tx_msg msg;
int ret;
- if (max > 4096)
- max = 4096;
+ if (max > PAGE_SIZE)
+ max = PAGE_SIZE;
msg.command = MBOX_CMD_GET_RANDOM;
msg.args[0] = 1;
--
2.44.2
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 04/19] firmware: turris-mox-rwtm: Use ETH_ALEN instead of hardcoded 6
2024-06-12 13:54 [PATCH 00/19] Updates for turris-mox-rwtm driver Marek Behún
` (2 preceding siblings ...)
2024-06-12 13:54 ` [PATCH 03/19] firmware: turris-mox-rwtm: Use PAGE_SIZE instead of hardcoded 4096 Marek Behún
@ 2024-06-12 13:54 ` Marek Behún
2024-06-13 8:02 ` Ilpo Järvinen
2024-06-12 13:54 ` [PATCH 05/19] firmware: turris-mox-rwtm: Use the boolean type where appropriate Marek Behún
` (14 subsequent siblings)
18 siblings, 1 reply; 32+ messages in thread
From: Marek Behún @ 2024-06-12 13:54 UTC (permalink / raw)
To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
Cc: Marek Behún
Use the ETH_ALEN macro instead of hardcoded 6 for MAC address length.
Signed-off-by: Marek Behún <kabel@kernel.org>
---
drivers/firmware/turris-mox-rwtm.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
index 5acdde1bb6d9..1b708a0760e6 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -10,6 +10,7 @@
#include <linux/debugfs.h>
#include <linux/dma-mapping.h>
#include <linux/hw_random.h>
+#include <linux/if_ether.h>
#include <linux/mailbox_client.h>
#include <linux/module.h>
#include <linux/mutex.h>
@@ -65,7 +66,7 @@ struct mox_rwtm {
int has_board_info;
u64 serial_number;
int board_version, ram_size;
- u8 mac_address1[6], mac_address2[6];
+ u8 mac_address1[ETH_ALEN], mac_address2[ETH_ALEN];
/* public key burned in eFuse */
int has_pubkey;
--
2.44.2
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 05/19] firmware: turris-mox-rwtm: Use the boolean type where appropriate
2024-06-12 13:54 [PATCH 00/19] Updates for turris-mox-rwtm driver Marek Behún
` (3 preceding siblings ...)
2024-06-12 13:54 ` [PATCH 04/19] firmware: turris-mox-rwtm: Use ETH_ALEN instead of hardcoded 6 Marek Behún
@ 2024-06-12 13:54 ` Marek Behún
2024-06-12 13:54 ` [PATCH 06/19] firmware: turris-mox-rwtm: Hide signature related constants behind macros Marek Behún
` (13 subsequent siblings)
18 siblings, 0 replies; 32+ messages in thread
From: Marek Behún @ 2024-06-12 13:54 UTC (permalink / raw)
To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
Cc: Marek Behún
Use the boolean type for has_board_info, has_pubkey and last_sig_done
members of the driver's private structure.
Signed-off-by: Marek Behún <kabel@kernel.org>
---
drivers/firmware/turris-mox-rwtm.c | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
index 1b708a0760e6..b7212bdc301d 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -17,6 +17,7 @@
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
+#include <linux/types.h>
#define DRIVER_NAME "turris-mox-rwtm"
@@ -63,13 +64,13 @@ struct mox_rwtm {
struct completion cmd_done;
/* board information */
- int has_board_info;
+ bool has_board_info;
u64 serial_number;
int board_version, ram_size;
u8 mac_address1[ETH_ALEN], mac_address2[ETH_ALEN];
/* public key burned in eFuse */
- int has_pubkey;
+ bool has_pubkey;
u8 pubkey[135];
#ifdef CONFIG_DEBUG_FS
@@ -81,7 +82,7 @@ struct mox_rwtm {
*/
struct dentry *debugfs_root;
u32 last_sig[34];
- int last_sig_done;
+ bool last_sig_done;
#endif
};
@@ -225,7 +226,7 @@ static int mox_get_board_info(struct mox_rwtm *rwtm)
reply->status[5]);
reply_to_mac_addr(rwtm->mac_address2, reply->status[6],
reply->status[7]);
- rwtm->has_board_info = 1;
+ rwtm->has_board_info = true;
pr_info("Turris Mox serial number %016llX\n",
rwtm->serial_number);
@@ -252,7 +253,7 @@ static int mox_get_board_info(struct mox_rwtm *rwtm)
} else {
u32 *s = reply->status;
- rwtm->has_pubkey = 1;
+ rwtm->has_pubkey = true;
sprintf(rwtm->pubkey,
"%06x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
ret, s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7],
@@ -349,7 +350,7 @@ static ssize_t do_sign_read(struct file *file, char __user *buf, size_t len,
/* 2 arrays of 17 32-bit words are 136 bytes */
ret = simple_read_from_buffer(buf, len, ppos, rwtm->last_sig, 136);
- rwtm->last_sig_done = 0;
+ rwtm->last_sig_done = false;
return ret;
}
@@ -415,7 +416,7 @@ static ssize_t do_sign_write(struct file *file, const char __user *buf,
*/
memcpy(rwtm->last_sig, rwtm->buf + 68, 136);
cpu_to_be32_array(rwtm->last_sig, rwtm->last_sig, 34);
- rwtm->last_sig_done = 1;
+ rwtm->last_sig_done = true;
mutex_unlock(&rwtm->busy);
return len;
--
2.44.2
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 06/19] firmware: turris-mox-rwtm: Hide signature related constants behind macros
2024-06-12 13:54 [PATCH 00/19] Updates for turris-mox-rwtm driver Marek Behún
` (4 preceding siblings ...)
2024-06-12 13:54 ` [PATCH 05/19] firmware: turris-mox-rwtm: Use the boolean type where appropriate Marek Behún
@ 2024-06-12 13:54 ` Marek Behún
2024-06-12 13:54 ` [PATCH 07/19] firmware: turris-mox-rwtm: Fix driver includes Marek Behún
` (12 subsequent siblings)
18 siblings, 0 replies; 32+ messages in thread
From: Marek Behún @ 2024-06-12 13:54 UTC (permalink / raw)
To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
Cc: Marek Behún
Hide signature generation related constants behind macros instead of
hardcoding the values.
Use SHA512_DIGEST_SIZE from crypto/sha2.h instead of hardcoded 64 as the
message size.
Signed-off-by: Marek Behún <kabel@kernel.org>
---
drivers/firmware/turris-mox-rwtm.c | 34 +++++++++++++++++++-----------
1 file changed, 22 insertions(+), 12 deletions(-)
diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
index b7212bdc301d..254629437f59 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -5,6 +5,7 @@
* Copyright (C) 2019, 2024 Marek Behún <kabel@kernel.org>
*/
+#include <crypto/sha2.h>
#include <linux/armada-37xx-rwtm-mailbox.h>
#include <linux/completion.h>
#include <linux/debugfs.h>
@@ -27,6 +28,12 @@
* https://gitlab.labs.nic.cz/turris/mox-boot-builder/tree/master/wtmi.
*/
+#define MOX_ECC_NUMBER_WORDS 17
+#define MOX_ECC_NUMBER_LEN (MOX_ECC_NUMBER_WORDS * sizeof(u32))
+
+#define MOX_ECC_SIGNATURE_WORDS (2 * MOX_ECC_NUMBER_WORDS)
+#define MOX_ECC_SIGNATURE_LEN (MOX_ECC_NUMBER_WORDS * sizeof(u32))
+
#define MBOX_STS_SUCCESS (0 << 30)
#define MBOX_STS_FAIL (1 << 30)
#define MBOX_STS_BADCMD (2 << 30)
@@ -81,7 +88,7 @@ struct mox_rwtm {
* from userspace.
*/
struct dentry *debugfs_root;
- u32 last_sig[34];
+ u32 last_sig[MOX_ECC_SIGNATURE_WORDS];
bool last_sig_done;
#endif
};
@@ -342,14 +349,15 @@ static ssize_t do_sign_read(struct file *file, char __user *buf, size_t len,
if (*ppos != 0)
return 0;
- if (len < 136)
+ if (len < MOX_ECC_SIGNATURE_LEN)
return -EINVAL;
if (!rwtm->last_sig_done)
return -ENODATA;
/* 2 arrays of 17 32-bit words are 136 bytes */
- ret = simple_read_from_buffer(buf, len, ppos, rwtm->last_sig, 136);
+ ret = simple_read_from_buffer(buf, len, ppos, rwtm->last_sig,
+ MOX_ECC_SIGNATURE_LEN);
rwtm->last_sig_done = false;
return ret;
@@ -364,8 +372,7 @@ static ssize_t do_sign_write(struct file *file, const char __user *buf,
loff_t dummy = 0;
ssize_t ret;
- /* the input is a SHA-512 hash, so exactly 64 bytes have to be read */
- if (len != 64)
+ if (len != SHA512_DIGEST_SIZE)
return -EINVAL;
/* if last result is not zero user has not read that information yet */
@@ -386,17 +393,18 @@ static ssize_t do_sign_write(struct file *file, const char __user *buf,
* 3. Address of the buffer where ECDSA signature value S shall be
* stored by the rWTM firmware.
*/
- memset(rwtm->buf, 0, 4);
- ret = simple_write_to_buffer(rwtm->buf + 4, 64, &dummy, buf, len);
+ memset(rwtm->buf, 0, sizeof(u32));
+ ret = simple_write_to_buffer(rwtm->buf + sizeof(u32),
+ SHA512_DIGEST_SIZE, &dummy, buf, len);
if (ret < 0)
goto unlock_mutex;
- be32_to_cpu_array(rwtm->buf, rwtm->buf, 17);
+ be32_to_cpu_array(rwtm->buf, rwtm->buf, MOX_ECC_NUMBER_WORDS);
msg.command = MBOX_CMD_SIGN;
msg.args[0] = 1;
msg.args[1] = rwtm->buf_phys;
- msg.args[2] = rwtm->buf_phys + 68;
- msg.args[3] = rwtm->buf_phys + 2 * 68;
+ msg.args[2] = rwtm->buf_phys + MOX_ECC_NUMBER_LEN;
+ msg.args[3] = rwtm->buf_phys + 2 * MOX_ECC_NUMBER_LEN;
ret = mbox_send_message(rwtm->mbox, &msg);
if (ret < 0)
goto unlock_mutex;
@@ -414,8 +422,10 @@ static ssize_t do_sign_write(struct file *file, const char __user *buf,
* computed by the rWTM firmware and convert their words from
* LE to BE.
*/
- memcpy(rwtm->last_sig, rwtm->buf + 68, 136);
- cpu_to_be32_array(rwtm->last_sig, rwtm->last_sig, 34);
+ memcpy(rwtm->last_sig, rwtm->buf + MOX_ECC_NUMBER_LEN,
+ MOX_ECC_SIGNATURE_LEN);
+ cpu_to_be32_array(rwtm->last_sig, rwtm->last_sig,
+ MOX_ECC_SIGNATURE_WORDS);
rwtm->last_sig_done = true;
mutex_unlock(&rwtm->busy);
--
2.44.2
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 07/19] firmware: turris-mox-rwtm: Fix driver includes
2024-06-12 13:54 [PATCH 00/19] Updates for turris-mox-rwtm driver Marek Behún
` (5 preceding siblings ...)
2024-06-12 13:54 ` [PATCH 06/19] firmware: turris-mox-rwtm: Hide signature related constants behind macros Marek Behún
@ 2024-06-12 13:54 ` Marek Behún
2024-06-12 13:54 ` [PATCH 08/19] firmware: turris-mox-rwtm: Use kobj_type's default_groups member for automatic sysfs files creation Marek Behún
` (11 subsequent siblings)
18 siblings, 0 replies; 32+ messages in thread
From: Marek Behún @ 2024-06-12 13:54 UTC (permalink / raw)
To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
Cc: Marek Behún
Drop including of.h, include several other headers that are used but not
included directly.
Signed-off-by: Marek Behún <kabel@kernel.org>
---
drivers/firmware/turris-mox-rwtm.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
index 254629437f59..5675f94a3ff2 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -8,16 +8,21 @@
#include <crypto/sha2.h>
#include <linux/armada-37xx-rwtm-mailbox.h>
#include <linux/completion.h>
+#include <linux/container_of.h>
#include <linux/debugfs.h>
+#include <linux/device.h>
#include <linux/dma-mapping.h>
+#include <linux/err.h>
+#include <linux/fs.h>
#include <linux/hw_random.h>
#include <linux/if_ether.h>
+#include <linux/kobject.h>
#include <linux/mailbox_client.h>
#include <linux/module.h>
#include <linux/mutex.h>
-#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
+#include <linux/sysfs.h>
#include <linux/types.h>
#define DRIVER_NAME "turris-mox-rwtm"
--
2.44.2
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 08/19] firmware: turris-mox-rwtm: Use kobj_type's default_groups member for automatic sysfs files creation
2024-06-12 13:54 [PATCH 00/19] Updates for turris-mox-rwtm driver Marek Behún
` (6 preceding siblings ...)
2024-06-12 13:54 ` [PATCH 07/19] firmware: turris-mox-rwtm: Fix driver includes Marek Behún
@ 2024-06-12 13:54 ` Marek Behún
2024-06-13 8:14 ` Ilpo Järvinen
2024-06-12 13:54 ` [PATCH 09/19] firmware: turris-mox-rwtm: Simplify debugfs code Marek Behún
` (10 subsequent siblings)
18 siblings, 1 reply; 32+ messages in thread
From: Marek Behún @ 2024-06-12 13:54 UTC (permalink / raw)
To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
Cc: Marek Behún
Put the turris-mox-rwtm attribute group into the .default_groups
member of the underlying kobject type and drop the manual
sysfs_create_files() / sysfs_remove_files(). The kobject library will
take care of this in it's internal code.
Signed-off-by: Marek Behún <kabel@kernel.org>
---
drivers/firmware/turris-mox-rwtm.c | 71 ++++++++++++++----------------
1 file changed, 32 insertions(+), 39 deletions(-)
diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
index 5675f94a3ff2..441409fefc59 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -113,6 +113,36 @@ static inline struct mox_rwtm *to_rwtm(struct kobject *kobj)
return container_of(kobj, struct mox_kobject, kobj)->rwtm;
}
+#define MOX_ATTR_RO(name, format, cat) \
+static ssize_t \
+name##_show(struct kobject *kobj, struct kobj_attribute *a, \
+ char *buf) \
+{ \
+ struct mox_rwtm *rwtm = to_rwtm(kobj); \
+ if (!rwtm->has_##cat) \
+ return -ENODATA; \
+ return sprintf(buf, format, rwtm->name); \
+} \
+static struct kobj_attribute mox_attr_##name = __ATTR_RO(name)
+
+MOX_ATTR_RO(serial_number, "%016llX\n", board_info);
+MOX_ATTR_RO(board_version, "%i\n", board_info);
+MOX_ATTR_RO(ram_size, "%i\n", board_info);
+MOX_ATTR_RO(mac_address1, "%pM\n", board_info);
+MOX_ATTR_RO(mac_address2, "%pM\n", board_info);
+MOX_ATTR_RO(pubkey, "%s\n", pubkey);
+
+static struct attribute *mox_rwtm_attrs[] = {
+ &mox_attr_serial_number.attr,
+ &mox_attr_board_version.attr,
+ &mox_attr_ram_size.attr,
+ &mox_attr_mac_address1.attr,
+ &mox_attr_mac_address2.attr,
+ &mox_attr_pubkey.attr,
+ NULL
+};
+ATTRIBUTE_GROUPS(mox_rwtm);
+
static void mox_kobj_release(struct kobject *kobj)
{
kfree(to_rwtm(kobj)->kobj);
@@ -121,6 +151,7 @@ static void mox_kobj_release(struct kobject *kobj)
static const struct kobj_type mox_kobj_ktype = {
.release = mox_kobj_release,
.sysfs_ops = &kobj_sysfs_ops,
+ .default_groups = mox_rwtm_groups,
};
static int mox_kobj_create(struct mox_rwtm *rwtm)
@@ -140,25 +171,6 @@ static int mox_kobj_create(struct mox_rwtm *rwtm)
return 0;
}
-#define MOX_ATTR_RO(name, format, cat) \
-static ssize_t \
-name##_show(struct kobject *kobj, struct kobj_attribute *a, \
- char *buf) \
-{ \
- struct mox_rwtm *rwtm = to_rwtm(kobj); \
- if (!rwtm->has_##cat) \
- return -ENODATA; \
- return sprintf(buf, format, rwtm->name); \
-} \
-static struct kobj_attribute mox_attr_##name = __ATTR_RO(name)
-
-MOX_ATTR_RO(serial_number, "%016llX\n", board_info);
-MOX_ATTR_RO(board_version, "%i\n", board_info);
-MOX_ATTR_RO(ram_size, "%i\n", board_info);
-MOX_ATTR_RO(mac_address1, "%pM\n", board_info);
-MOX_ATTR_RO(mac_address2, "%pM\n", board_info);
-MOX_ATTR_RO(pubkey, "%s\n", pubkey);
-
static int mox_get_status(enum mbox_cmd cmd, u32 retval)
{
if (MBOX_STS_CMD(retval) != cmd)
@@ -173,16 +185,6 @@ static int mox_get_status(enum mbox_cmd cmd, u32 retval)
return MBOX_STS_VALUE(retval);
}
-static const struct attribute *mox_rwtm_attrs[] = {
- &mox_attr_serial_number.attr,
- &mox_attr_board_version.attr,
- &mox_attr_ram_size.attr,
- &mox_attr_mac_address1.attr,
- &mox_attr_mac_address2.attr,
- &mox_attr_pubkey.attr,
- NULL
-};
-
static void mox_rwtm_rx_callback(struct mbox_client *cl, void *data)
{
struct mox_rwtm *rwtm = dev_get_drvdata(cl->dev);
@@ -507,12 +509,6 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
return ret;
}
- ret = sysfs_create_files(rwtm_to_kobj(rwtm), mox_rwtm_attrs);
- if (ret < 0) {
- dev_err(dev, "Cannot create sysfs files!\n");
- goto put_kobj;
- }
-
platform_set_drvdata(pdev, rwtm);
mutex_init(&rwtm->busy);
@@ -526,7 +522,7 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
if (ret != -EPROBE_DEFER)
dev_err(dev, "Cannot request mailbox channel: %i\n",
ret);
- goto remove_files;
+ goto put_kobj;
}
init_completion(&rwtm->cmd_done);
@@ -564,8 +560,6 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
free_channel:
mbox_free_channel(rwtm->mbox);
-remove_files:
- sysfs_remove_files(rwtm_to_kobj(rwtm), mox_rwtm_attrs);
put_kobj:
kobject_put(rwtm_to_kobj(rwtm));
return ret;
@@ -576,7 +570,6 @@ static void turris_mox_rwtm_remove(struct platform_device *pdev)
struct mox_rwtm *rwtm = platform_get_drvdata(pdev);
rwtm_unregister_debugfs(rwtm);
- sysfs_remove_files(rwtm_to_kobj(rwtm), mox_rwtm_attrs);
kobject_put(rwtm_to_kobj(rwtm));
mbox_free_channel(rwtm->mbox);
}
--
2.44.2
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 09/19] firmware: turris-mox-rwtm: Simplify debugfs code
2024-06-12 13:54 [PATCH 00/19] Updates for turris-mox-rwtm driver Marek Behún
` (7 preceding siblings ...)
2024-06-12 13:54 ` [PATCH 08/19] firmware: turris-mox-rwtm: Use kobj_type's default_groups member for automatic sysfs files creation Marek Behún
@ 2024-06-12 13:54 ` Marek Behún
2024-06-12 13:54 ` [PATCH 10/19] firmware: turris-mox-rwtm: Simplify driver kobject code Marek Behún
` (9 subsequent siblings)
18 siblings, 0 replies; 32+ messages in thread
From: Marek Behún @ 2024-06-12 13:54 UTC (permalink / raw)
To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
Cc: Marek Behún
Simplify debugfs code: do not check for errors, as debugfs errors should
be ignored, and use devm action for dropping the debugfs directory.
Signed-off-by: Marek Behún <kabel@kernel.org>
---
drivers/firmware/turris-mox-rwtm.c | 44 ++++++++----------------------
1 file changed, 11 insertions(+), 33 deletions(-)
diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
index 441409fefc59..6d1e0b1dd2b4 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -92,7 +92,6 @@ struct mox_rwtm {
* It should be rewritten via crypto API once akcipher API is available
* from userspace.
*/
- struct dentry *debugfs_root;
u32 last_sig[MOX_ECC_SIGNATURE_WORDS];
bool last_sig_done;
#endif
@@ -450,39 +449,23 @@ static const struct file_operations do_sign_fops = {
.llseek = no_llseek,
};
-static int rwtm_register_debugfs(struct mox_rwtm *rwtm)
+static void rwtm_debugfs_release(void *root)
{
- struct dentry *root, *entry;
-
- root = debugfs_create_dir("turris-mox-rwtm", NULL);
-
- if (IS_ERR(root))
- return PTR_ERR(root);
-
- entry = debugfs_create_file_unsafe("do_sign", 0600, root, rwtm,
- &do_sign_fops);
- if (IS_ERR(entry))
- goto err_remove;
-
- rwtm->debugfs_root = root;
-
- return 0;
-err_remove:
debugfs_remove_recursive(root);
- return PTR_ERR(entry);
}
-static void rwtm_unregister_debugfs(struct mox_rwtm *rwtm)
+static void rwtm_register_debugfs(struct mox_rwtm *rwtm)
{
- debugfs_remove_recursive(rwtm->debugfs_root);
+ struct dentry *root;
+
+ root = debugfs_create_dir("turris-mox-rwtm", NULL);
+
+ devm_add_action_or_reset(rwtm->dev, rwtm_debugfs_release, root);
+
+ debugfs_create_file_unsafe("do_sign", 0600, root, rwtm, &do_sign_fops);
}
#else
-static inline int rwtm_register_debugfs(struct mox_rwtm *rwtm)
-{
- return 0;
-}
-
-static inline void rwtm_unregister_debugfs(struct mox_rwtm *rwtm)
+static inline void rwtm_register_debugfs(struct mox_rwtm *rwtm)
{
}
#endif
@@ -548,11 +531,7 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
goto free_channel;
}
- ret = rwtm_register_debugfs(rwtm);
- if (ret < 0) {
- dev_err(dev, "Failed creating debugfs entries: %i\n", ret);
- goto free_channel;
- }
+ rwtm_register_debugfs(rwtm);
dev_info(dev, "HWRNG successfully registered\n");
@@ -569,7 +548,6 @@ static void turris_mox_rwtm_remove(struct platform_device *pdev)
{
struct mox_rwtm *rwtm = platform_get_drvdata(pdev);
- rwtm_unregister_debugfs(rwtm);
kobject_put(rwtm_to_kobj(rwtm));
mbox_free_channel(rwtm->mbox);
}
--
2.44.2
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 10/19] firmware: turris-mox-rwtm: Simplify driver kobject code
2024-06-12 13:54 [PATCH 00/19] Updates for turris-mox-rwtm driver Marek Behún
` (8 preceding siblings ...)
2024-06-12 13:54 ` [PATCH 09/19] firmware: turris-mox-rwtm: Simplify debugfs code Marek Behún
@ 2024-06-12 13:54 ` Marek Behún
2024-06-13 8:31 ` Ilpo Järvinen
2024-06-12 13:54 ` [PATCH 11/19] firmware: turris-mox-rwtm: Return true error code if kobject_add() fails Marek Behún
` (8 subsequent siblings)
18 siblings, 1 reply; 32+ messages in thread
From: Marek Behún @ 2024-06-12 13:54 UTC (permalink / raw)
To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
Cc: Marek Behún
Drop the mox_kobject wrapper that needs to be allocated, instead put the
kobject directly into the driver private structure. This allows us to
drop one kzalloc() call.
Signed-off-by: Marek Behún <kabel@kernel.org>
---
drivers/firmware/turris-mox-rwtm.c | 36 ++++++++----------------------
1 file changed, 9 insertions(+), 27 deletions(-)
diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
index 6d1e0b1dd2b4..84ec72575c4d 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -21,7 +21,6 @@
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/platform_device.h>
-#include <linux/slab.h>
#include <linux/sysfs.h>
#include <linux/types.h>
@@ -58,13 +57,11 @@ enum mbox_cmd {
MBOX_CMD_OTP_WRITE = 8,
};
-struct mox_kobject;
-
struct mox_rwtm {
struct device *dev;
struct mbox_client mbox_client;
struct mbox_chan *mbox;
- struct mox_kobject *kobj;
+ struct kobject kobj;
struct hwrng hwrng;
struct armada_37xx_rwtm_rx_msg reply;
@@ -97,19 +94,9 @@ struct mox_rwtm {
#endif
};
-struct mox_kobject {
- struct kobject kobj;
- struct mox_rwtm *rwtm;
-};
-
-static inline struct kobject *rwtm_to_kobj(struct mox_rwtm *rwtm)
-{
- return &rwtm->kobj->kobj;
-}
-
static inline struct mox_rwtm *to_rwtm(struct kobject *kobj)
{
- return container_of(kobj, struct mox_kobject, kobj)->rwtm;
+ return container_of(kobj, struct mox_rwtm, kobj);
}
#define MOX_ATTR_RO(name, format, cat) \
@@ -142,9 +129,8 @@ static struct attribute *mox_rwtm_attrs[] = {
};
ATTRIBUTE_GROUPS(mox_rwtm);
-static void mox_kobj_release(struct kobject *kobj)
+static void mox_kobj_release(struct kobject *)
{
- kfree(to_rwtm(kobj)->kobj);
}
static const struct kobj_type mox_kobj_ktype = {
@@ -155,18 +141,14 @@ static const struct kobj_type mox_kobj_ktype = {
static int mox_kobj_create(struct mox_rwtm *rwtm)
{
- rwtm->kobj = kzalloc(sizeof(*rwtm->kobj), GFP_KERNEL);
- if (!rwtm->kobj)
- return -ENOMEM;
+ struct kobject *kobj = &rwtm->kobj;
- kobject_init(rwtm_to_kobj(rwtm), &mox_kobj_ktype);
- if (kobject_add(rwtm_to_kobj(rwtm), firmware_kobj, "turris-mox-rwtm")) {
- kobject_put(rwtm_to_kobj(rwtm));
+ kobject_init(kobj, &mox_kobj_ktype);
+ if (kobject_add(kobj, firmware_kobj, "turris-mox-rwtm")) {
+ kobject_put(kobj);
return -ENXIO;
}
- rwtm->kobj->rwtm = rwtm;
-
return 0;
}
@@ -540,7 +522,7 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
free_channel:
mbox_free_channel(rwtm->mbox);
put_kobj:
- kobject_put(rwtm_to_kobj(rwtm));
+ kobject_put(&rwtm->kobj);
return ret;
}
@@ -548,7 +530,7 @@ static void turris_mox_rwtm_remove(struct platform_device *pdev)
{
struct mox_rwtm *rwtm = platform_get_drvdata(pdev);
- kobject_put(rwtm_to_kobj(rwtm));
+ kobject_put(&rwtm->kobj);
mbox_free_channel(rwtm->mbox);
}
--
2.44.2
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 11/19] firmware: turris-mox-rwtm: Return true error code if kobject_add() fails
2024-06-12 13:54 [PATCH 00/19] Updates for turris-mox-rwtm driver Marek Behún
` (9 preceding siblings ...)
2024-06-12 13:54 ` [PATCH 10/19] firmware: turris-mox-rwtm: Simplify driver kobject code Marek Behún
@ 2024-06-12 13:54 ` Marek Behún
2024-06-12 13:54 ` [PATCH 12/19] firmware: turris-mox-rwtm: Convert rest to devm_* and get rid of driver .remove() Marek Behún
` (7 subsequent siblings)
18 siblings, 0 replies; 32+ messages in thread
From: Marek Behún @ 2024-06-12 13:54 UTC (permalink / raw)
To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
Cc: Marek Behún
Return the error code from kobject_add() if it fails, instead of -ENXIO.
Signed-off-by: Marek Behún <kabel@kernel.org>
---
drivers/firmware/turris-mox-rwtm.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
index 84ec72575c4d..cdbe244be694 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -142,14 +142,15 @@ static const struct kobj_type mox_kobj_ktype = {
static int mox_kobj_create(struct mox_rwtm *rwtm)
{
struct kobject *kobj = &rwtm->kobj;
+ int ret;
kobject_init(kobj, &mox_kobj_ktype);
- if (kobject_add(kobj, firmware_kobj, "turris-mox-rwtm")) {
+
+ ret = kobject_add(kobj, firmware_kobj, "turris-mox-rwtm");
+ if (ret)
kobject_put(kobj);
- return -ENXIO;
- }
- return 0;
+ return ret;
}
static int mox_get_status(enum mbox_cmd cmd, u32 retval)
--
2.44.2
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 12/19] firmware: turris-mox-rwtm: Convert rest to devm_* and get rid of driver .remove()
2024-06-12 13:54 [PATCH 00/19] Updates for turris-mox-rwtm driver Marek Behún
` (10 preceding siblings ...)
2024-06-12 13:54 ` [PATCH 11/19] firmware: turris-mox-rwtm: Return true error code if kobject_add() fails Marek Behún
@ 2024-06-12 13:54 ` Marek Behún
2024-06-12 13:54 ` [PATCH 13/19] firmware: turris-mox-rwtm: Use dev_err_probe() where possible Marek Behún
` (6 subsequent siblings)
18 siblings, 0 replies; 32+ messages in thread
From: Marek Behún @ 2024-06-12 13:54 UTC (permalink / raw)
To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
Cc: Marek Behún
Use devm resource management for driver's kobject and mailbox. This
allows us to get rid of driver's .remove() method and gotos in .probe().
Signed-off-by: Marek Behún <kabel@kernel.org>
---
drivers/firmware/turris-mox-rwtm.c | 41 +++++++++++++++---------------
1 file changed, 20 insertions(+), 21 deletions(-)
diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
index cdbe244be694..153772721901 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -139,6 +139,11 @@ static const struct kobj_type mox_kobj_ktype = {
.default_groups = mox_rwtm_groups,
};
+static void mox_devm_kobj_release(void *kobj)
+{
+ kobject_put(kobj);
+}
+
static int mox_kobj_create(struct mox_rwtm *rwtm)
{
struct kobject *kobj = &rwtm->kobj;
@@ -146,11 +151,11 @@ static int mox_kobj_create(struct mox_rwtm *rwtm)
kobject_init(kobj, &mox_kobj_ktype);
- ret = kobject_add(kobj, firmware_kobj, "turris-mox-rwtm");
+ ret = devm_add_action_or_reset(rwtm->dev, mox_devm_kobj_release, kobj);
if (ret)
- kobject_put(kobj);
+ return ret;
- return ret;
+ return kobject_add(kobj, firmware_kobj, "turris-mox-rwtm");
}
static int mox_get_status(enum mbox_cmd cmd, u32 retval)
@@ -453,6 +458,11 @@ static inline void rwtm_register_debugfs(struct mox_rwtm *rwtm)
}
#endif
+static void rwtm_devm_mbox_release(void *mbox)
+{
+ mbox_free_channel(mbox);
+}
+
static int turris_mox_rwtm_probe(struct platform_device *pdev)
{
struct mox_rwtm *rwtm;
@@ -488,9 +498,13 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
if (ret != -EPROBE_DEFER)
dev_err(dev, "Cannot request mailbox channel: %i\n",
ret);
- goto put_kobj;
+ return ret;
}
+ ret = devm_add_action_or_reset(dev, rwtm_devm_mbox_release, rwtm->mbox);
+ if (ret < 0)
+ return ret;
+
init_completion(&rwtm->cmd_done);
ret = mox_get_board_info(rwtm);
@@ -501,7 +515,7 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
if (ret < 0) {
dev_notice(dev,
"Firmware does not support the GET_RANDOM command\n");
- goto free_channel;
+ return ret;
}
rwtm->hwrng.name = DRIVER_NAME "_hwrng";
@@ -511,7 +525,7 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
ret = devm_hwrng_register(dev, &rwtm->hwrng);
if (ret < 0) {
dev_err(dev, "Cannot register HWRNG: %i\n", ret);
- goto free_channel;
+ return ret;
}
rwtm_register_debugfs(rwtm);
@@ -519,20 +533,6 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
dev_info(dev, "HWRNG successfully registered\n");
return 0;
-
-free_channel:
- mbox_free_channel(rwtm->mbox);
-put_kobj:
- kobject_put(&rwtm->kobj);
- return ret;
-}
-
-static void turris_mox_rwtm_remove(struct platform_device *pdev)
-{
- struct mox_rwtm *rwtm = platform_get_drvdata(pdev);
-
- kobject_put(&rwtm->kobj);
- mbox_free_channel(rwtm->mbox);
}
static const struct of_device_id turris_mox_rwtm_match[] = {
@@ -545,7 +545,6 @@ MODULE_DEVICE_TABLE(of, turris_mox_rwtm_match);
static struct platform_driver turris_mox_rwtm_driver = {
.probe = turris_mox_rwtm_probe,
- .remove_new = turris_mox_rwtm_remove,
.driver = {
.name = DRIVER_NAME,
.of_match_table = turris_mox_rwtm_match,
--
2.44.2
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 13/19] firmware: turris-mox-rwtm: Use dev_err_probe() where possible
2024-06-12 13:54 [PATCH 00/19] Updates for turris-mox-rwtm driver Marek Behún
` (11 preceding siblings ...)
2024-06-12 13:54 ` [PATCH 12/19] firmware: turris-mox-rwtm: Convert rest to devm_* and get rid of driver .remove() Marek Behún
@ 2024-06-12 13:54 ` Marek Behún
2024-06-12 13:54 ` [PATCH 14/19] firmware: turris-mox-rwtm: Rearrange probe calls Marek Behún
` (5 subsequent siblings)
18 siblings, 0 replies; 32+ messages in thread
From: Marek Behún @ 2024-06-12 13:54 UTC (permalink / raw)
To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
Cc: Marek Behún
Use dev_err_probe() where possible in the driver's .probe() method.
Signed-off-by: Marek Behún <kabel@kernel.org>
---
drivers/firmware/turris-mox-rwtm.c | 22 ++++++++++------------
1 file changed, 10 insertions(+), 12 deletions(-)
diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
index 153772721901..3c3f8ae23809 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -480,10 +480,9 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
return -ENOMEM;
ret = mox_kobj_create(rwtm);
- if (ret < 0) {
- dev_err(dev, "Cannot create turris-mox-rwtm kobject!\n");
- return ret;
- }
+ if (ret < 0)
+ return dev_err_probe(dev, ret,
+ "Cannot create turris-mox-rwtm kobject!\n");
platform_set_drvdata(pdev, rwtm);
@@ -495,10 +494,11 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
rwtm->mbox = mbox_request_channel(&rwtm->mbox_client, 0);
if (IS_ERR(rwtm->mbox)) {
ret = PTR_ERR(rwtm->mbox);
- if (ret != -EPROBE_DEFER)
- dev_err(dev, "Cannot request mailbox channel: %i\n",
- ret);
- return ret;
+ if (ret == -EPROBE_DEFER)
+ return ret;
+
+ return dev_err_probe(dev, ret,
+ "Cannot request mailbox channel!\n");
}
ret = devm_add_action_or_reset(dev, rwtm_devm_mbox_release, rwtm->mbox);
@@ -523,10 +523,8 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
rwtm->hwrng.priv = (unsigned long) rwtm;
ret = devm_hwrng_register(dev, &rwtm->hwrng);
- if (ret < 0) {
- dev_err(dev, "Cannot register HWRNG: %i\n", ret);
- return ret;
- }
+ if (ret < 0)
+ return dev_err_probe(dev, ret, "Cannot register HWRNG!\n");
rwtm_register_debugfs(rwtm);
--
2.44.2
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 14/19] firmware: turris-mox-rwtm: Rearrange probe calls
2024-06-12 13:54 [PATCH 00/19] Updates for turris-mox-rwtm driver Marek Behún
` (12 preceding siblings ...)
2024-06-12 13:54 ` [PATCH 13/19] firmware: turris-mox-rwtm: Use dev_err_probe() where possible Marek Behún
@ 2024-06-12 13:54 ` Marek Behún
2024-06-12 13:54 ` [PATCH 15/19] firmware: turris-mox-rwtm: Drop redundant device pointer Marek Behún
` (4 subsequent siblings)
18 siblings, 0 replies; 32+ messages in thread
From: Marek Behún @ 2024-06-12 13:54 UTC (permalink / raw)
To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
Cc: Marek Behún
Rearrange probe calls:
- create the kobject (and corresponding sysfs files) only after the
mailbox is created and board info is read
- initialize the completion before mailbox channel is requested
Signed-off-by: Marek Behún <kabel@kernel.org>
---
drivers/firmware/turris-mox-rwtm.c | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
index 3c3f8ae23809..b9be3c806695 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -479,14 +479,10 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
if (!rwtm->buf)
return -ENOMEM;
- ret = mox_kobj_create(rwtm);
- if (ret < 0)
- return dev_err_probe(dev, ret,
- "Cannot create turris-mox-rwtm kobject!\n");
-
platform_set_drvdata(pdev, rwtm);
mutex_init(&rwtm->busy);
+ init_completion(&rwtm->cmd_done);
rwtm->mbox_client.dev = dev;
rwtm->mbox_client.rx_callback = mox_rwtm_rx_callback;
@@ -505,12 +501,15 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
if (ret < 0)
return ret;
- init_completion(&rwtm->cmd_done);
-
ret = mox_get_board_info(rwtm);
if (ret < 0)
dev_warn(dev, "Cannot read board information: %i\n", ret);
+ ret = mox_kobj_create(rwtm);
+ if (ret < 0)
+ return dev_err_probe(dev, ret,
+ "Cannot create turris-mox-rwtm kobject!\n");
+
ret = check_get_random_support(rwtm);
if (ret < 0) {
dev_notice(dev,
--
2.44.2
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 15/19] firmware: turris-mox-rwtm: Drop redundant device pointer
2024-06-12 13:54 [PATCH 00/19] Updates for turris-mox-rwtm driver Marek Behún
` (13 preceding siblings ...)
2024-06-12 13:54 ` [PATCH 14/19] firmware: turris-mox-rwtm: Rearrange probe calls Marek Behún
@ 2024-06-12 13:54 ` Marek Behún
2024-06-12 13:54 ` [PATCH 16/19] firmware: turris-mox-rwtm: Use devm_mutex_init() instead of mutex_init() Marek Behún
` (3 subsequent siblings)
18 siblings, 0 replies; 32+ messages in thread
From: Marek Behún @ 2024-06-12 13:54 UTC (permalink / raw)
To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
Cc: Marek Behún
Drop redundant device pointer from driver's private structure.
Signed-off-by: Marek Behún <kabel@kernel.org>
---
drivers/firmware/turris-mox-rwtm.c | 21 +++++++++++++--------
1 file changed, 13 insertions(+), 8 deletions(-)
diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
index b9be3c806695..5f4dd919ce2e 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -58,7 +58,6 @@ enum mbox_cmd {
};
struct mox_rwtm {
- struct device *dev;
struct mbox_client mbox_client;
struct mbox_chan *mbox;
struct kobject kobj;
@@ -94,6 +93,11 @@ struct mox_rwtm {
#endif
};
+static inline struct device *rwtm_dev(struct mox_rwtm *rwtm)
+{
+ return rwtm->mbox_client.dev;
+}
+
static inline struct mox_rwtm *to_rwtm(struct kobject *kobj)
{
return container_of(kobj, struct mox_rwtm, kobj);
@@ -151,7 +155,8 @@ static int mox_kobj_create(struct mox_rwtm *rwtm)
kobject_init(kobj, &mox_kobj_ktype);
- ret = devm_add_action_or_reset(rwtm->dev, mox_devm_kobj_release, kobj);
+ ret = devm_add_action_or_reset(rwtm_dev(rwtm), mox_devm_kobj_release,
+ kobj);
if (ret)
return ret;
@@ -196,6 +201,7 @@ static void reply_to_mac_addr(u8 *mac, u32 t1, u32 t2)
static int mox_get_board_info(struct mox_rwtm *rwtm)
{
+ struct device *dev = rwtm_dev(rwtm);
struct armada_37xx_rwtm_tx_msg msg;
struct armada_37xx_rwtm_rx_msg *reply = &rwtm->reply;
int ret;
@@ -210,10 +216,10 @@ static int mox_get_board_info(struct mox_rwtm *rwtm)
ret = mox_get_status(MBOX_CMD_BOARD_INFO, reply->retval);
if (ret == -ENODATA) {
- dev_warn(rwtm->dev,
+ dev_warn(dev,
"Board does not have manufacturing information burned!\n");
} else if (ret == -ENOSYS) {
- dev_notice(rwtm->dev,
+ dev_notice(dev,
"Firmware does not support the BOARD_INFO command\n");
} else if (ret < 0) {
return ret;
@@ -245,9 +251,9 @@ static int mox_get_board_info(struct mox_rwtm *rwtm)
ret = mox_get_status(MBOX_CMD_ECDSA_PUB_KEY, reply->retval);
if (ret == -ENODATA) {
- dev_warn(rwtm->dev, "Board has no public key burned!\n");
+ dev_warn(dev, "Board has no public key burned!\n");
} else if (ret == -ENOSYS) {
- dev_notice(rwtm->dev,
+ dev_notice(dev,
"Firmware does not support the ECDSA_PUB_KEY command\n");
} else if (ret < 0) {
return ret;
@@ -448,7 +454,7 @@ static void rwtm_register_debugfs(struct mox_rwtm *rwtm)
root = debugfs_create_dir("turris-mox-rwtm", NULL);
- devm_add_action_or_reset(rwtm->dev, rwtm_debugfs_release, root);
+ devm_add_action_or_reset(rwtm_dev(rwtm), rwtm_debugfs_release, root);
debugfs_create_file_unsafe("do_sign", 0600, root, rwtm, &do_sign_fops);
}
@@ -473,7 +479,6 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
if (!rwtm)
return -ENOMEM;
- rwtm->dev = dev;
rwtm->buf = dmam_alloc_coherent(dev, PAGE_SIZE, &rwtm->buf_phys,
GFP_KERNEL);
if (!rwtm->buf)
--
2.44.2
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 16/19] firmware: turris-mox-rwtm: Use devm_mutex_init() instead of mutex_init()
2024-06-12 13:54 [PATCH 00/19] Updates for turris-mox-rwtm driver Marek Behún
` (14 preceding siblings ...)
2024-06-12 13:54 ` [PATCH 15/19] firmware: turris-mox-rwtm: Drop redundant device pointer Marek Behún
@ 2024-06-12 13:54 ` Marek Behún
2024-06-12 13:54 ` [PATCH 17/19] firmware: turris-mox-rwtm: Use container_of() instead of hwrng .priv member Marek Behún
` (2 subsequent siblings)
18 siblings, 0 replies; 32+ messages in thread
From: Marek Behún @ 2024-06-12 13:54 UTC (permalink / raw)
To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
Cc: Marek Behún
Use devm_mutex_init() instead of mutex_init(), to properly call
mutex_destroy() on probe failure / driver unbind.
Signed-off-by: Marek Behún <kabel@kernel.org>
---
drivers/firmware/turris-mox-rwtm.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
index 5f4dd919ce2e..f753e98f1ca7 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -486,7 +486,10 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, rwtm);
- mutex_init(&rwtm->busy);
+ ret = devm_mutex_init(dev, &rwtm->busy);
+ if (ret < 0)
+ return ret;
+
init_completion(&rwtm->cmd_done);
rwtm->mbox_client.dev = dev;
--
2.44.2
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 17/19] firmware: turris-mox-rwtm: Use container_of() instead of hwrng .priv member
2024-06-12 13:54 [PATCH 00/19] Updates for turris-mox-rwtm driver Marek Behún
` (15 preceding siblings ...)
2024-06-12 13:54 ` [PATCH 16/19] firmware: turris-mox-rwtm: Use devm_mutex_init() instead of mutex_init() Marek Behún
@ 2024-06-12 13:54 ` Marek Behún
2024-06-12 13:54 ` [PATCH 18/19] firmware: turris-mox-rwtm: Deduplicate command execution code Marek Behún
2024-06-12 13:54 ` [PATCH 19/19] firmware: turris-mox-rwtm: Use EOPNOTSUPP instead of ENOSYS Marek Behún
18 siblings, 0 replies; 32+ messages in thread
From: Marek Behún @ 2024-06-12 13:54 UTC (permalink / raw)
To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
Cc: Marek Behún
Use container_of() to get driver private structure from hwnrg structure,
instead of the hwrng's .priv member, as suggested by Herbert for another
driver [1].
[1] https://lore.kernel.org/soc/ZmLhQBdmg613KdET@gondor.apana.org.au/
Signed-off-by: Marek Behún <kabel@kernel.org>
---
drivers/firmware/turris-mox-rwtm.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
index f753e98f1ca7..5991434f62a3 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -292,7 +292,7 @@ static int check_get_random_support(struct mox_rwtm *rwtm)
static int mox_hwrng_read(struct hwrng *rng, void *data, size_t max, bool wait)
{
- struct mox_rwtm *rwtm = (struct mox_rwtm *) rng->priv;
+ struct mox_rwtm *rwtm = container_of(rng, struct mox_rwtm, hwrng);
struct armada_37xx_rwtm_tx_msg msg;
int ret;
@@ -527,7 +527,6 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
rwtm->hwrng.name = DRIVER_NAME "_hwrng";
rwtm->hwrng.read = mox_hwrng_read;
- rwtm->hwrng.priv = (unsigned long) rwtm;
ret = devm_hwrng_register(dev, &rwtm->hwrng);
if (ret < 0)
--
2.44.2
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 18/19] firmware: turris-mox-rwtm: Deduplicate command execution code
2024-06-12 13:54 [PATCH 00/19] Updates for turris-mox-rwtm driver Marek Behún
` (16 preceding siblings ...)
2024-06-12 13:54 ` [PATCH 17/19] firmware: turris-mox-rwtm: Use container_of() instead of hwrng .priv member Marek Behún
@ 2024-06-12 13:54 ` Marek Behún
2024-06-12 13:54 ` [PATCH 19/19] firmware: turris-mox-rwtm: Use EOPNOTSUPP instead of ENOSYS Marek Behún
18 siblings, 0 replies; 32+ messages in thread
From: Marek Behún @ 2024-06-12 13:54 UTC (permalink / raw)
To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
Cc: Marek Behún
Deduplicate rWTM command execution calls
mbox_send_message()
wait_for_completion()
mox_get_status()
to one function
mox_rwtm_exec()
Signed-off-by: Marek Behún <kabel@kernel.org>
---
drivers/firmware/turris-mox-rwtm.c | 98 ++++++++++++------------------
1 file changed, 39 insertions(+), 59 deletions(-)
diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
index 5991434f62a3..ea5ff1827d08 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -189,6 +189,34 @@ static void mox_rwtm_rx_callback(struct mbox_client *cl, void *data)
complete(&rwtm->cmd_done);
}
+static int mox_rwtm_exec(struct mox_rwtm *rwtm, enum mbox_cmd cmd,
+ struct armada_37xx_rwtm_tx_msg *msg,
+ bool interruptible)
+{
+ struct armada_37xx_rwtm_tx_msg _msg = {};
+ int ret;
+
+ if (!msg)
+ msg = &_msg;
+
+ msg->command = cmd;
+
+ ret = mbox_send_message(rwtm->mbox, msg);
+ if (ret < 0)
+ return ret;
+
+ if (interruptible) {
+ ret = wait_for_completion_interruptible(&rwtm->cmd_done);
+ if (ret < 0)
+ return ret;
+ } else {
+ if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2))
+ return -ETIMEDOUT;
+ }
+
+ return mox_get_status(cmd, rwtm->reply.retval);
+}
+
static void reply_to_mac_addr(u8 *mac, u32 t1, u32 t2)
{
mac[0] = t1 >> 8;
@@ -202,19 +230,10 @@ static void reply_to_mac_addr(u8 *mac, u32 t1, u32 t2)
static int mox_get_board_info(struct mox_rwtm *rwtm)
{
struct device *dev = rwtm_dev(rwtm);
- struct armada_37xx_rwtm_tx_msg msg;
struct armada_37xx_rwtm_rx_msg *reply = &rwtm->reply;
int ret;
- msg.command = MBOX_CMD_BOARD_INFO;
- ret = mbox_send_message(rwtm->mbox, &msg);
- if (ret < 0)
- return ret;
-
- if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2))
- return -ETIMEDOUT;
-
- ret = mox_get_status(MBOX_CMD_BOARD_INFO, reply->retval);
+ ret = mox_rwtm_exec(rwtm, MBOX_CMD_BOARD_INFO, NULL, false);
if (ret == -ENODATA) {
dev_warn(dev,
"Board does not have manufacturing information burned!\n");
@@ -241,15 +260,7 @@ static int mox_get_board_info(struct mox_rwtm *rwtm)
pr_info(" burned RAM size %i MiB\n", rwtm->ram_size);
}
- msg.command = MBOX_CMD_ECDSA_PUB_KEY;
- ret = mbox_send_message(rwtm->mbox, &msg);
- if (ret < 0)
- return ret;
-
- if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2))
- return -ETIMEDOUT;
-
- ret = mox_get_status(MBOX_CMD_ECDSA_PUB_KEY, reply->retval);
+ ret = mox_rwtm_exec(rwtm, MBOX_CMD_ECDSA_PUB_KEY, NULL, false);
if (ret == -ENODATA) {
dev_warn(dev, "Board has no public key burned!\n");
} else if (ret == -ENOSYS) {
@@ -272,38 +283,24 @@ static int mox_get_board_info(struct mox_rwtm *rwtm)
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;
-
- if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2))
- return -ETIMEDOUT;
+ struct armada_37xx_rwtm_tx_msg msg = {
+ .args = { 1, rwtm->buf_phys, 4 },
+ };
- return mox_get_status(MBOX_CMD_GET_RANDOM, rwtm->reply.retval);
+ return mox_rwtm_exec(rwtm, MBOX_CMD_GET_RANDOM, &msg, false);
}
static int mox_hwrng_read(struct hwrng *rng, void *data, size_t max, bool wait)
{
struct mox_rwtm *rwtm = container_of(rng, struct mox_rwtm, hwrng);
- struct armada_37xx_rwtm_tx_msg msg;
+ struct armada_37xx_rwtm_tx_msg msg = {
+ .args = { 1, rwtm->buf_phys, (max + 3) & ~3 },
+ };
int ret;
if (max > PAGE_SIZE)
max = PAGE_SIZE;
- msg.command = MBOX_CMD_GET_RANDOM;
- msg.args[0] = 1;
- msg.args[1] = rwtm->buf_phys;
- msg.args[2] = (max + 3) & ~3;
-
if (!wait) {
if (!mutex_trylock(&rwtm->busy))
return -EBUSY;
@@ -311,15 +308,7 @@ static int mox_hwrng_read(struct hwrng *rng, void *data, size_t max, bool wait)
mutex_lock(&rwtm->busy);
}
- ret = mbox_send_message(rwtm->mbox, &msg);
- if (ret < 0)
- goto unlock_mutex;
-
- ret = wait_for_completion_interruptible(&rwtm->cmd_done);
- if (ret < 0)
- goto unlock_mutex;
-
- ret = mox_get_status(MBOX_CMD_GET_RANDOM, rwtm->reply.retval);
+ ret = mox_rwtm_exec(rwtm, MBOX_CMD_GET_RANDOM, &msg, true);
if (ret < 0)
goto unlock_mutex;
@@ -367,7 +356,6 @@ static ssize_t do_sign_write(struct file *file, const char __user *buf,
size_t len, loff_t *ppos)
{
struct mox_rwtm *rwtm = file->private_data;
- struct armada_37xx_rwtm_rx_msg *reply = &rwtm->reply;
struct armada_37xx_rwtm_tx_msg msg;
loff_t dummy = 0;
ssize_t ret;
@@ -400,23 +388,15 @@ static ssize_t do_sign_write(struct file *file, const char __user *buf,
goto unlock_mutex;
be32_to_cpu_array(rwtm->buf, rwtm->buf, MOX_ECC_NUMBER_WORDS);
- msg.command = MBOX_CMD_SIGN;
msg.args[0] = 1;
msg.args[1] = rwtm->buf_phys;
msg.args[2] = rwtm->buf_phys + MOX_ECC_NUMBER_LEN;
msg.args[3] = rwtm->buf_phys + 2 * MOX_ECC_NUMBER_LEN;
- ret = mbox_send_message(rwtm->mbox, &msg);
- if (ret < 0)
- goto unlock_mutex;
- ret = wait_for_completion_interruptible(&rwtm->cmd_done);
+ ret = mox_rwtm_exec(rwtm, MBOX_CMD_SIGN, &msg, true);
if (ret < 0)
goto unlock_mutex;
- ret = MBOX_STS_VALUE(reply->retval);
- if (MBOX_STS_ERROR(reply->retval) != MBOX_STS_SUCCESS)
- goto unlock_mutex;
-
/*
* Here we read the R and S values of the ECDSA signature
* computed by the rWTM firmware and convert their words from
--
2.44.2
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 19/19] firmware: turris-mox-rwtm: Use EOPNOTSUPP instead of ENOSYS
2024-06-12 13:54 [PATCH 00/19] Updates for turris-mox-rwtm driver Marek Behún
` (17 preceding siblings ...)
2024-06-12 13:54 ` [PATCH 18/19] firmware: turris-mox-rwtm: Deduplicate command execution code Marek Behún
@ 2024-06-12 13:54 ` Marek Behún
18 siblings, 0 replies; 32+ messages in thread
From: Marek Behún @ 2024-06-12 13:54 UTC (permalink / raw)
To: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
Cc: Marek Behún
Checkpatch warns agains -ENOSYS:
WARNING: ENOSYS means 'invalid syscall nr' and nothing else
Use EOPNOTSUPP instead.
Signed-off-by: Marek Behún <kabel@kernel.org>
---
drivers/firmware/turris-mox-rwtm.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
index ea5ff1827d08..d1e5ee37aca4 100644
--- a/drivers/firmware/turris-mox-rwtm.c
+++ b/drivers/firmware/turris-mox-rwtm.c
@@ -170,7 +170,7 @@ static int mox_get_status(enum mbox_cmd cmd, u32 retval)
else if (MBOX_STS_ERROR(retval) == MBOX_STS_FAIL)
return -(int)MBOX_STS_VALUE(retval);
else if (MBOX_STS_ERROR(retval) == MBOX_STS_BADCMD)
- return -ENOSYS;
+ return -EOPNOTSUPP;
else if (MBOX_STS_ERROR(retval) != MBOX_STS_SUCCESS)
return -EIO;
else
@@ -237,7 +237,7 @@ static int mox_get_board_info(struct mox_rwtm *rwtm)
if (ret == -ENODATA) {
dev_warn(dev,
"Board does not have manufacturing information burned!\n");
- } else if (ret == -ENOSYS) {
+ } else if (ret == -EOPNOTSUPP) {
dev_notice(dev,
"Firmware does not support the BOARD_INFO command\n");
} else if (ret < 0) {
@@ -263,7 +263,7 @@ static int mox_get_board_info(struct mox_rwtm *rwtm)
ret = mox_rwtm_exec(rwtm, MBOX_CMD_ECDSA_PUB_KEY, NULL, false);
if (ret == -ENODATA) {
dev_warn(dev, "Board has no public key burned!\n");
- } else if (ret == -ENOSYS) {
+ } else if (ret == -EOPNOTSUPP) {
dev_notice(dev,
"Firmware does not support the ECDSA_PUB_KEY command\n");
} else if (ret < 0) {
--
2.44.2
^ permalink raw reply related [flat|nested] 32+ messages in thread
* Re: [PATCH 03/19] firmware: turris-mox-rwtm: Use PAGE_SIZE instead of hardcoded 4096
2024-06-12 13:54 ` [PATCH 03/19] firmware: turris-mox-rwtm: Use PAGE_SIZE instead of hardcoded 4096 Marek Behún
@ 2024-06-13 8:01 ` Ilpo Järvinen
2024-06-13 9:54 ` Marek Behún
0 siblings, 1 reply; 32+ messages in thread
From: Ilpo Järvinen @ 2024-06-13 8:01 UTC (permalink / raw)
To: Marek Behún
Cc: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede
[-- Attachment #1: Type: text/plain, Size: 1003 bytes --]
On Wed, 12 Jun 2024, Marek Behún wrote:
> The 4096 bytes limit in mox_hwrng_read() is due to the DMA buffer being
> allocated to one PAGE_SIZE bytes. The PAGE_SIZE macro is used when
> allocating the buffer, use it in mox_hwrng_read() as well.
>
> Signed-off-by: Marek Behún <kabel@kernel.org>
> ---
> drivers/firmware/turris-mox-rwtm.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
> index 3f4758e03c81..5acdde1bb6d9 100644
> --- a/drivers/firmware/turris-mox-rwtm.c
> +++ b/drivers/firmware/turris-mox-rwtm.c
> @@ -287,8 +287,8 @@ static int mox_hwrng_read(struct hwrng *rng, void *data, size_t max, bool wait)
> struct armada_37xx_rwtm_tx_msg msg;
> int ret;
>
> - if (max > 4096)
> - max = 4096;
> + if (max > PAGE_SIZE)
> + max = PAGE_SIZE;
Wouldn't it be better to bind these to the alloc side with a local define
that is set to PAGE_SIZE?
--
i.
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH 04/19] firmware: turris-mox-rwtm: Use ETH_ALEN instead of hardcoded 6
2024-06-12 13:54 ` [PATCH 04/19] firmware: turris-mox-rwtm: Use ETH_ALEN instead of hardcoded 6 Marek Behún
@ 2024-06-13 8:02 ` Ilpo Järvinen
0 siblings, 0 replies; 32+ messages in thread
From: Ilpo Järvinen @ 2024-06-13 8:02 UTC (permalink / raw)
To: Marek Behún
Cc: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede
[-- Attachment #1: Type: text/plain, Size: 1043 bytes --]
On Wed, 12 Jun 2024, Marek Behún wrote:
> Use the ETH_ALEN macro instead of hardcoded 6 for MAC address length.
>
> Signed-off-by: Marek Behún <kabel@kernel.org>
> ---
> drivers/firmware/turris-mox-rwtm.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
> index 5acdde1bb6d9..1b708a0760e6 100644
> --- a/drivers/firmware/turris-mox-rwtm.c
> +++ b/drivers/firmware/turris-mox-rwtm.c
> @@ -10,6 +10,7 @@
> #include <linux/debugfs.h>
> #include <linux/dma-mapping.h>
> #include <linux/hw_random.h>
> +#include <linux/if_ether.h>
> #include <linux/mailbox_client.h>
> #include <linux/module.h>
> #include <linux/mutex.h>
> @@ -65,7 +66,7 @@ struct mox_rwtm {
> int has_board_info;
> u64 serial_number;
> int board_version, ram_size;
> - u8 mac_address1[6], mac_address2[6];
> + u8 mac_address1[ETH_ALEN], mac_address2[ETH_ALEN];
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
--
i.
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH 02/19] firmware: turris-mox-rwtm: Fix checking return value of wait_for_completion_timeout()
2024-06-12 13:54 ` [PATCH 02/19] firmware: turris-mox-rwtm: Fix checking return value of wait_for_completion_timeout() Marek Behún
@ 2024-06-13 8:06 ` Ilpo Järvinen
0 siblings, 0 replies; 32+ messages in thread
From: Ilpo Järvinen @ 2024-06-13 8:06 UTC (permalink / raw)
To: Marek Behún
Cc: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede
[-- Attachment #1: Type: text/plain, Size: 1954 bytes --]
On Wed, 12 Jun 2024, Marek Behún wrote:
> The wait_for_completion_timeout() function returns 0 if timed out, and a
> positive value if completed. Fix the usage of this function.
>
> Fixes: 389711b37493 ("firmware: Add Turris Mox rWTM firmware driver")
> Fixes: 2eab59cf0d20 ("firmware: turris-mox-rwtm: fail probing when firmware does not support hwrng")
> Signed-off-by: Marek Behún <kabel@kernel.org>
> ---
> drivers/firmware/turris-mox-rwtm.c | 15 ++++++---------
> 1 file changed, 6 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
> index f1f9160c4195..3f4758e03c81 100644
> --- a/drivers/firmware/turris-mox-rwtm.c
> +++ b/drivers/firmware/turris-mox-rwtm.c
> @@ -202,9 +202,8 @@ static int mox_get_board_info(struct mox_rwtm *rwtm)
> if (ret < 0)
> return ret;
>
> - ret = wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2);
> - if (ret < 0)
> - return ret;
> + if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2))
> + return -ETIMEDOUT;
>
> ret = mox_get_status(MBOX_CMD_BOARD_INFO, reply->retval);
> if (ret == -ENODATA) {
> @@ -238,9 +237,8 @@ static int mox_get_board_info(struct mox_rwtm *rwtm)
> if (ret < 0)
> return ret;
>
> - ret = wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2);
> - if (ret < 0)
> - return ret;
> + if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2))
> + return -ETIMEDOUT;
>
> ret = mox_get_status(MBOX_CMD_ECDSA_PUB_KEY, reply->retval);
> if (ret == -ENODATA) {
> @@ -277,9 +275,8 @@ static int check_get_random_support(struct mox_rwtm *rwtm)
> if (ret < 0)
> return ret;
>
> - ret = wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2);
> - if (ret < 0)
> - return ret;
> + if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2))
> + return -ETIMEDOUT;
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
--
i.
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH 08/19] firmware: turris-mox-rwtm: Use kobj_type's default_groups member for automatic sysfs files creation
2024-06-12 13:54 ` [PATCH 08/19] firmware: turris-mox-rwtm: Use kobj_type's default_groups member for automatic sysfs files creation Marek Behún
@ 2024-06-13 8:14 ` Ilpo Järvinen
0 siblings, 0 replies; 32+ messages in thread
From: Ilpo Järvinen @ 2024-06-13 8:14 UTC (permalink / raw)
To: Marek Behún
Cc: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede, Ilpo Järvinen
[-- Attachment #1: Type: text/plain, Size: 2439 bytes --]
On Wed, 12 Jun 2024, Marek Behún wrote:
> Put the turris-mox-rwtm attribute group into the .default_groups
> member of the underlying kobject type and drop the manual
> sysfs_create_files() / sysfs_remove_files(). The kobject library will
> take care of this in it's internal code.
>
> Signed-off-by: Marek Behún <kabel@kernel.org>
> ---
> drivers/firmware/turris-mox-rwtm.c | 71 ++++++++++++++----------------
> 1 file changed, 32 insertions(+), 39 deletions(-)
>
> diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
> index 5675f94a3ff2..441409fefc59 100644
> --- a/drivers/firmware/turris-mox-rwtm.c
> +++ b/drivers/firmware/turris-mox-rwtm.c
> @@ -113,6 +113,36 @@ static inline struct mox_rwtm *to_rwtm(struct kobject *kobj)
> return container_of(kobj, struct mox_kobject, kobj)->rwtm;
> }
>
> +#define MOX_ATTR_RO(name, format, cat) \
> +static ssize_t \
> +name##_show(struct kobject *kobj, struct kobj_attribute *a, \
> + char *buf) \
> +{ \
> + struct mox_rwtm *rwtm = to_rwtm(kobj); \
Fix \ alignment to match the others while you move the code around.
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
--
i.
> + if (!rwtm->has_##cat) \
> + return -ENODATA; \
> + return sprintf(buf, format, rwtm->name); \
> +} \
> +static struct kobj_attribute mox_attr_##name = __ATTR_RO(name)
> +
> +MOX_ATTR_RO(serial_number, "%016llX\n", board_info);
> +MOX_ATTR_RO(board_version, "%i\n", board_info);
> +MOX_ATTR_RO(ram_size, "%i\n", board_info);
> +MOX_ATTR_RO(mac_address1, "%pM\n", board_info);
> +MOX_ATTR_RO(mac_address2, "%pM\n", board_info);
> +MOX_ATTR_RO(pubkey, "%s\n", pubkey);
> +
> +static struct attribute *mox_rwtm_attrs[] = {
> + &mox_attr_serial_number.attr,
> + &mox_attr_board_version.attr,
> + &mox_attr_ram_size.attr,
> + &mox_attr_mac_address1.attr,
> + &mox_attr_mac_address2.attr,
> + &mox_attr_pubkey.attr,
> + NULL
> +};
> +ATTRIBUTE_GROUPS(mox_rwtm);
> +
> static void mox_kobj_release(struct kobject *kobj)
> {
> kfree(to_rwtm(kobj)->kobj);
> @@ -121,6 +151,7 @@ static void mox_kobj_release(struct kobject *kobj)
> static const struct kobj_type mox_kobj_ktype = {
> .release = mox_kobj_release,
> .sysfs_ops = &kobj_sysfs_ops,
> + .default_groups = mox_rwtm_groups,
> };
>
> static int mox_kobj_create(struct mox_rwtm *rwtm)
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH 10/19] firmware: turris-mox-rwtm: Simplify driver kobject code
2024-06-12 13:54 ` [PATCH 10/19] firmware: turris-mox-rwtm: Simplify driver kobject code Marek Behún
@ 2024-06-13 8:31 ` Ilpo Järvinen
2024-06-13 9:55 ` Marek Behún
0 siblings, 1 reply; 32+ messages in thread
From: Ilpo Järvinen @ 2024-06-13 8:31 UTC (permalink / raw)
To: Marek Behún
Cc: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede
[-- Attachment #1: Type: text/plain, Size: 3386 bytes --]
On Wed, 12 Jun 2024, Marek Behún wrote:
> Drop the mox_kobject wrapper that needs to be allocated, instead put the
> kobject directly into the driver private structure. This allows us to
> drop one kzalloc() call.
>
> Signed-off-by: Marek Behún <kabel@kernel.org>
> ---
> drivers/firmware/turris-mox-rwtm.c | 36 ++++++++----------------------
> 1 file changed, 9 insertions(+), 27 deletions(-)
>
> diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
> index 6d1e0b1dd2b4..84ec72575c4d 100644
> --- a/drivers/firmware/turris-mox-rwtm.c
> +++ b/drivers/firmware/turris-mox-rwtm.c
> @@ -21,7 +21,6 @@
> #include <linux/module.h>
> #include <linux/mutex.h>
> #include <linux/platform_device.h>
> -#include <linux/slab.h>
> #include <linux/sysfs.h>
> #include <linux/types.h>
>
> @@ -58,13 +57,11 @@ enum mbox_cmd {
> MBOX_CMD_OTP_WRITE = 8,
> };
>
> -struct mox_kobject;
> -
> struct mox_rwtm {
> struct device *dev;
> struct mbox_client mbox_client;
> struct mbox_chan *mbox;
> - struct mox_kobject *kobj;
> + struct kobject kobj;
> struct hwrng hwrng;
>
> struct armada_37xx_rwtm_rx_msg reply;
> @@ -97,19 +94,9 @@ struct mox_rwtm {
> #endif
> };
>
> -struct mox_kobject {
> - struct kobject kobj;
> - struct mox_rwtm *rwtm;
> -};
> -
> -static inline struct kobject *rwtm_to_kobj(struct mox_rwtm *rwtm)
> -{
> - return &rwtm->kobj->kobj;
> -}
> -
> static inline struct mox_rwtm *to_rwtm(struct kobject *kobj)
> {
> - return container_of(kobj, struct mox_kobject, kobj)->rwtm;
> + return container_of(kobj, struct mox_rwtm, kobj);
> }
>
> #define MOX_ATTR_RO(name, format, cat) \
> @@ -142,9 +129,8 @@ static struct attribute *mox_rwtm_attrs[] = {
> };
> ATTRIBUTE_GROUPS(mox_rwtm);
>
> -static void mox_kobj_release(struct kobject *kobj)
> +static void mox_kobj_release(struct kobject *)
> {
> - kfree(to_rwtm(kobj)->kobj);
> }
Is empty .release necessary at all? I found some kobj_type structs without
.release so I'd expect it to be unnecessary.
--
i.
> static const struct kobj_type mox_kobj_ktype = {
> @@ -155,18 +141,14 @@ static const struct kobj_type mox_kobj_ktype = {
>
> static int mox_kobj_create(struct mox_rwtm *rwtm)
> {
> - rwtm->kobj = kzalloc(sizeof(*rwtm->kobj), GFP_KERNEL);
> - if (!rwtm->kobj)
> - return -ENOMEM;
> + struct kobject *kobj = &rwtm->kobj;
>
> - kobject_init(rwtm_to_kobj(rwtm), &mox_kobj_ktype);
> - if (kobject_add(rwtm_to_kobj(rwtm), firmware_kobj, "turris-mox-rwtm")) {
> - kobject_put(rwtm_to_kobj(rwtm));
> + kobject_init(kobj, &mox_kobj_ktype);
> + if (kobject_add(kobj, firmware_kobj, "turris-mox-rwtm")) {
> + kobject_put(kobj);
> return -ENXIO;
> }
>
> - rwtm->kobj->rwtm = rwtm;
> -
> return 0;
> }
>
> @@ -540,7 +522,7 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
> free_channel:
> mbox_free_channel(rwtm->mbox);
> put_kobj:
> - kobject_put(rwtm_to_kobj(rwtm));
> + kobject_put(&rwtm->kobj);
> return ret;
> }
>
> @@ -548,7 +530,7 @@ static void turris_mox_rwtm_remove(struct platform_device *pdev)
> {
> struct mox_rwtm *rwtm = platform_get_drvdata(pdev);
>
> - kobject_put(rwtm_to_kobj(rwtm));
> + kobject_put(&rwtm->kobj);
> mbox_free_channel(rwtm->mbox);
> }
>
>
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH 03/19] firmware: turris-mox-rwtm: Use PAGE_SIZE instead of hardcoded 4096
2024-06-13 8:01 ` Ilpo Järvinen
@ 2024-06-13 9:54 ` Marek Behún
0 siblings, 0 replies; 32+ messages in thread
From: Marek Behún @ 2024-06-13 9:54 UTC (permalink / raw)
To: Ilpo Järvinen
Cc: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede
On Thu, 13 Jun 2024 11:01:42 +0300 (EEST)
Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> wrote:
> On Wed, 12 Jun 2024, Marek Behún wrote:
>
> > The 4096 bytes limit in mox_hwrng_read() is due to the DMA buffer being
> > allocated to one PAGE_SIZE bytes. The PAGE_SIZE macro is used when
> > allocating the buffer, use it in mox_hwrng_read() as well.
> >
> > Signed-off-by: Marek Behún <kabel@kernel.org>
> > ---
> > drivers/firmware/turris-mox-rwtm.c | 4 ++--
> > 1 file changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
> > index 3f4758e03c81..5acdde1bb6d9 100644
> > --- a/drivers/firmware/turris-mox-rwtm.c
> > +++ b/drivers/firmware/turris-mox-rwtm.c
> > @@ -287,8 +287,8 @@ static int mox_hwrng_read(struct hwrng *rng, void *data, size_t max, bool wait)
> > struct armada_37xx_rwtm_tx_msg msg;
> > int ret;
> >
> > - if (max > 4096)
> > - max = 4096;
> > + if (max > PAGE_SIZE)
> > + max = PAGE_SIZE;
>
> Wouldn't it be better to bind these to the alloc side with a local define
> that is set to PAGE_SIZE?
OK.
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH 10/19] firmware: turris-mox-rwtm: Simplify driver kobject code
2024-06-13 8:31 ` Ilpo Järvinen
@ 2024-06-13 9:55 ` Marek Behún
2024-06-13 10:19 ` Ilpo Järvinen
0 siblings, 1 reply; 32+ messages in thread
From: Marek Behún @ 2024-06-13 9:55 UTC (permalink / raw)
To: Ilpo Järvinen
Cc: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede
On Thu, 13 Jun 2024 11:31:43 +0300 (EEST)
Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> wrote:
> Is empty .release necessary at all? I found some kobj_type structs without
> .release so I'd expect it to be unnecessary.
lib/kobject.c function kobject_cleanup() has the following:
if (t && !t->release)
pr_debug("'%s' (%p): does not have a release() function, it is broken and must be fixed. See Documentation/core-api/kobject.rst.\n",
Marek
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH 10/19] firmware: turris-mox-rwtm: Simplify driver kobject code
2024-06-13 9:55 ` Marek Behún
@ 2024-06-13 10:19 ` Ilpo Järvinen
2024-06-13 13:31 ` Marek Behún
0 siblings, 1 reply; 32+ messages in thread
From: Ilpo Järvinen @ 2024-06-13 10:19 UTC (permalink / raw)
To: Marek Behún
Cc: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede
[-- Attachment #1: Type: text/plain, Size: 678 bytes --]
On Thu, 13 Jun 2024, Marek Behún wrote:
> On Thu, 13 Jun 2024 11:31:43 +0300 (EEST)
> Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> wrote:
>
> > Is empty .release necessary at all? I found some kobj_type structs without
> > .release so I'd expect it to be unnecessary.
>
> lib/kobject.c function kobject_cleanup() has the following:
>
> if (t && !t->release)
> pr_debug("'%s' (%p): does not have a release() function, it is broken and must be fixed. See Documentation/core-api/kobject.rst.\n",
Hmm, the plot thickens... that documentation file says:
'Do not try to get rid of this warning by providing an "empty" release
function.'
?
--
i.
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH 10/19] firmware: turris-mox-rwtm: Simplify driver kobject code
2024-06-13 10:19 ` Ilpo Järvinen
@ 2024-06-13 13:31 ` Marek Behún
2024-06-13 13:37 ` Ilpo Järvinen
0 siblings, 1 reply; 32+ messages in thread
From: Marek Behún @ 2024-06-13 13:31 UTC (permalink / raw)
To: Ilpo Järvinen
Cc: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede
On Thu, 13 Jun 2024 13:19:47 +0300 (EEST)
Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> wrote:
> On Thu, 13 Jun 2024, Marek Behún wrote:
>
> > On Thu, 13 Jun 2024 11:31:43 +0300 (EEST)
> > Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> wrote:
> >
> > > Is empty .release necessary at all? I found some kobj_type structs without
> > > .release so I'd expect it to be unnecessary.
> >
> > lib/kobject.c function kobject_cleanup() has the following:
> >
> > if (t && !t->release)
> > pr_debug("'%s' (%p): does not have a release() function, it is broken and must be fixed. See Documentation/core-api/kobject.rst.\n",
>
> Hmm, the plot thickens... that documentation file says:
>
> 'Do not try to get rid of this warning by providing an "empty" release
> function.'
>
> ?
This whole thing stinks. I will rewrite it so that the attributes will
be under the device's kobject, as they should be. This way I can get
rid of the whole own kobject type.
Then I will add a symlink from /sys/firmware/turris-mox-rwtm to the
device, for sysfs ABI compatibility.
Marek
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH 10/19] firmware: turris-mox-rwtm: Simplify driver kobject code
2024-06-13 13:31 ` Marek Behún
@ 2024-06-13 13:37 ` Ilpo Järvinen
2024-06-13 15:39 ` Marek Behún
0 siblings, 1 reply; 32+ messages in thread
From: Ilpo Järvinen @ 2024-06-13 13:37 UTC (permalink / raw)
To: Marek Behún
Cc: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede
[-- Attachment #1: Type: text/plain, Size: 1484 bytes --]
On Thu, 13 Jun 2024, Marek Behún wrote:
> On Thu, 13 Jun 2024 13:19:47 +0300 (EEST)
> Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> wrote:
>
> > On Thu, 13 Jun 2024, Marek Behún wrote:
> >
> > > On Thu, 13 Jun 2024 11:31:43 +0300 (EEST)
> > > Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> wrote:
> > >
> > > > Is empty .release necessary at all? I found some kobj_type structs without
> > > > .release so I'd expect it to be unnecessary.
> > >
> > > lib/kobject.c function kobject_cleanup() has the following:
> > >
> > > if (t && !t->release)
> > > pr_debug("'%s' (%p): does not have a release() function, it is broken and must be fixed. See Documentation/core-api/kobject.rst.\n",
> >
> > Hmm, the plot thickens... that documentation file says:
> >
> > 'Do not try to get rid of this warning by providing an "empty" release
> > function.'
> >
> > ?
>
> This whole thing stinks. I will rewrite it so that the attributes will
> be under the device's kobject, as they should be. This way I can get
> rid of the whole own kobject type.
Yeah, I didn't really understand why they weren't there in the first
place.
> Then I will add a symlink from /sys/firmware/turris-mox-rwtm to the
> device, for sysfs ABI compatibility.
BTW (unrelated to any of your patches unless I missed something)...
You might want to check one unlock_mutex: label that seemed to be 100%
duplicate the tail of the return path.
--
i.
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH 10/19] firmware: turris-mox-rwtm: Simplify driver kobject code
2024-06-13 13:37 ` Ilpo Järvinen
@ 2024-06-13 15:39 ` Marek Behún
2024-06-13 15:44 ` Ilpo Järvinen
0 siblings, 1 reply; 32+ messages in thread
From: Marek Behún @ 2024-06-13 15:39 UTC (permalink / raw)
To: Ilpo Järvinen
Cc: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede
On Thu, 13 Jun 2024 16:37:23 +0300 (EEST)
Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> wrote:
> On Thu, 13 Jun 2024, Marek Behún wrote:
>
> > On Thu, 13 Jun 2024 13:19:47 +0300 (EEST)
> > Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> wrote:
> >
> > > On Thu, 13 Jun 2024, Marek Behún wrote:
> > >
> > > > On Thu, 13 Jun 2024 11:31:43 +0300 (EEST)
> > > > Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> wrote:
> > > >
> > > > > Is empty .release necessary at all? I found some kobj_type structs without
> > > > > .release so I'd expect it to be unnecessary.
> > > >
> > > > lib/kobject.c function kobject_cleanup() has the following:
> > > >
> > > > if (t && !t->release)
> > > > pr_debug("'%s' (%p): does not have a release() function, it is broken and must be fixed. See Documentation/core-api/kobject.rst.\n",
> > >
> > > Hmm, the plot thickens... that documentation file says:
> > >
> > > 'Do not try to get rid of this warning by providing an "empty" release
> > > function.'
> > >
> > > ?
> >
> > This whole thing stinks. I will rewrite it so that the attributes will
> > be under the device's kobject, as they should be. This way I can get
> > rid of the whole own kobject type.
>
> Yeah, I didn't really understand why they weren't there in the first
> place.
>
> > Then I will add a symlink from /sys/firmware/turris-mox-rwtm to the
> > device, for sysfs ABI compatibility.
>
>
> BTW (unrelated to any of your patches unless I missed something)...
> You might want to check one unlock_mutex: label that seemed to be 100%
> duplicate the tail of the return path.
Do you mean this?
mutex_unlock(&rwtm->busy);
return len;
unlock_mutex:
mutex_unlock(&rwtm->busy);
return ret;
It's not 100% duplicate, but yes, I could do ret = len.
The thing is that this whole debugfs code is going away. I wanted to
clean the driver up a little before converting this debugfs code to
keyctl (which is the correct API for the thing that is now exposed to
userspace via debugfs).
Marek
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH 10/19] firmware: turris-mox-rwtm: Simplify driver kobject code
2024-06-13 15:39 ` Marek Behún
@ 2024-06-13 15:44 ` Ilpo Järvinen
0 siblings, 0 replies; 32+ messages in thread
From: Ilpo Järvinen @ 2024-06-13 15:44 UTC (permalink / raw)
To: Marek Behún
Cc: Gregory CLEMENT, Andrew Lunn, Arnd Bergmann, soc, arm,
Andy Shevchenko, Hans de Goede
[-- Attachment #1: Type: text/plain, Size: 2347 bytes --]
On Thu, 13 Jun 2024, Marek Behún wrote:
> On Thu, 13 Jun 2024 16:37:23 +0300 (EEST)
> Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> wrote:
>
> > On Thu, 13 Jun 2024, Marek Behún wrote:
> >
> > > On Thu, 13 Jun 2024 13:19:47 +0300 (EEST)
> > > Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> wrote:
> > >
> > > > On Thu, 13 Jun 2024, Marek Behún wrote:
> > > >
> > > > > On Thu, 13 Jun 2024 11:31:43 +0300 (EEST)
> > > > > Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> wrote:
> > > > >
> > > > > > Is empty .release necessary at all? I found some kobj_type structs without
> > > > > > .release so I'd expect it to be unnecessary.
> > > > >
> > > > > lib/kobject.c function kobject_cleanup() has the following:
> > > > >
> > > > > if (t && !t->release)
> > > > > pr_debug("'%s' (%p): does not have a release() function, it is broken and must be fixed. See Documentation/core-api/kobject.rst.\n",
> > > >
> > > > Hmm, the plot thickens... that documentation file says:
> > > >
> > > > 'Do not try to get rid of this warning by providing an "empty" release
> > > > function.'
> > > >
> > > > ?
> > >
> > > This whole thing stinks. I will rewrite it so that the attributes will
> > > be under the device's kobject, as they should be. This way I can get
> > > rid of the whole own kobject type.
> >
> > Yeah, I didn't really understand why they weren't there in the first
> > place.
> >
> > > Then I will add a symlink from /sys/firmware/turris-mox-rwtm to the
> > > device, for sysfs ABI compatibility.
> >
> >
> > BTW (unrelated to any of your patches unless I missed something)...
> > You might want to check one unlock_mutex: label that seemed to be 100%
> > duplicate the tail of the return path.
>
> Do you mean this?
>
> mutex_unlock(&rwtm->busy);
> return len;
> unlock_mutex:
> mutex_unlock(&rwtm->busy);
> return ret;
>
> It's not 100% duplicate, but yes, I could do ret = len.
Ah sorry, I didn't realize the variable name was different.
> The thing is that this whole debugfs code is going away. I wanted to
> clean the driver up a little before converting this debugfs code to
> keyctl (which is the correct API for the thing that is now exposed to
> userspace via debugfs).
--
i.
^ permalink raw reply [flat|nested] 32+ messages in thread
end of thread, other threads:[~2024-06-13 15:45 UTC | newest]
Thread overview: 32+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-06-12 13:54 [PATCH 00/19] Updates for turris-mox-rwtm driver Marek Behún
2024-06-12 13:54 ` [PATCH 01/19] firmware: turris-mox-rwtm: Do not complete if there are no waiters Marek Behún
2024-06-12 13:54 ` [PATCH 02/19] firmware: turris-mox-rwtm: Fix checking return value of wait_for_completion_timeout() Marek Behún
2024-06-13 8:06 ` Ilpo Järvinen
2024-06-12 13:54 ` [PATCH 03/19] firmware: turris-mox-rwtm: Use PAGE_SIZE instead of hardcoded 4096 Marek Behún
2024-06-13 8:01 ` Ilpo Järvinen
2024-06-13 9:54 ` Marek Behún
2024-06-12 13:54 ` [PATCH 04/19] firmware: turris-mox-rwtm: Use ETH_ALEN instead of hardcoded 6 Marek Behún
2024-06-13 8:02 ` Ilpo Järvinen
2024-06-12 13:54 ` [PATCH 05/19] firmware: turris-mox-rwtm: Use the boolean type where appropriate Marek Behún
2024-06-12 13:54 ` [PATCH 06/19] firmware: turris-mox-rwtm: Hide signature related constants behind macros Marek Behún
2024-06-12 13:54 ` [PATCH 07/19] firmware: turris-mox-rwtm: Fix driver includes Marek Behún
2024-06-12 13:54 ` [PATCH 08/19] firmware: turris-mox-rwtm: Use kobj_type's default_groups member for automatic sysfs files creation Marek Behún
2024-06-13 8:14 ` Ilpo Järvinen
2024-06-12 13:54 ` [PATCH 09/19] firmware: turris-mox-rwtm: Simplify debugfs code Marek Behún
2024-06-12 13:54 ` [PATCH 10/19] firmware: turris-mox-rwtm: Simplify driver kobject code Marek Behún
2024-06-13 8:31 ` Ilpo Järvinen
2024-06-13 9:55 ` Marek Behún
2024-06-13 10:19 ` Ilpo Järvinen
2024-06-13 13:31 ` Marek Behún
2024-06-13 13:37 ` Ilpo Järvinen
2024-06-13 15:39 ` Marek Behún
2024-06-13 15:44 ` Ilpo Järvinen
2024-06-12 13:54 ` [PATCH 11/19] firmware: turris-mox-rwtm: Return true error code if kobject_add() fails Marek Behún
2024-06-12 13:54 ` [PATCH 12/19] firmware: turris-mox-rwtm: Convert rest to devm_* and get rid of driver .remove() Marek Behún
2024-06-12 13:54 ` [PATCH 13/19] firmware: turris-mox-rwtm: Use dev_err_probe() where possible Marek Behún
2024-06-12 13:54 ` [PATCH 14/19] firmware: turris-mox-rwtm: Rearrange probe calls Marek Behún
2024-06-12 13:54 ` [PATCH 15/19] firmware: turris-mox-rwtm: Drop redundant device pointer Marek Behún
2024-06-12 13:54 ` [PATCH 16/19] firmware: turris-mox-rwtm: Use devm_mutex_init() instead of mutex_init() Marek Behún
2024-06-12 13:54 ` [PATCH 17/19] firmware: turris-mox-rwtm: Use container_of() instead of hwrng .priv member Marek Behún
2024-06-12 13:54 ` [PATCH 18/19] firmware: turris-mox-rwtm: Deduplicate command execution code Marek Behún
2024-06-12 13:54 ` [PATCH 19/19] firmware: turris-mox-rwtm: Use EOPNOTSUPP instead of ENOSYS Marek Behún
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox