summaryrefslogtreecommitdiff
path: root/backport-module-eeprom-treat-zero-arguments-like-any-other-ar.patch
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2025-08-07 06:49:01 +0000
committerCoprDistGit <infra@openeuler.org>2025-08-07 06:49:01 +0000
commit8765044a415eaa071b3bd4217b30057af8dcf5b7 (patch)
tree45835ec5a8f37c44c826c83ceb8ba0095b54598d /backport-module-eeprom-treat-zero-arguments-like-any-other-ar.patch
parentc2027a35dbf73cd104fac843c4cabb074d99f36d (diff)
automatic import of ethtoolopeneuler22.03_LTS
Diffstat (limited to 'backport-module-eeprom-treat-zero-arguments-like-any-other-ar.patch')
-rw-r--r--backport-module-eeprom-treat-zero-arguments-like-any-other-ar.patch149
1 files changed, 149 insertions, 0 deletions
diff --git a/backport-module-eeprom-treat-zero-arguments-like-any-other-ar.patch b/backport-module-eeprom-treat-zero-arguments-like-any-other-ar.patch
new file mode 100644
index 0000000..11f7675
--- /dev/null
+++ b/backport-module-eeprom-treat-zero-arguments-like-any-other-ar.patch
@@ -0,0 +1,149 @@
+From c810d56d96d87d1db1cadf899238cee2e70f0cfd Mon Sep 17 00:00:00 2001
+From: Jakub Kicinski <kuba@kernel.org>
+Date: Fri, 12 Jul 2024 11:07:06 -0700
+Subject: module-eeprom: treat zero arguments like any other arguments for hex
+ dump
+
+The code does not differentiate between user asking for page 0 and
+page not being set on the CLI at all. This is problematic because
+drivers don't support old type of dumping for newer module types.
+For example trying to hex dump EEPROM of a QSFP-DD on mlx5 gives
+us in kernel logs:
+
+ mlx5_query_module_eeprom[...]: Module ID not recognized: 0x18
+
+We can dump all the non-zero pages, and without "hex on" ethtool
+also uses the page-aware API to get the information it will print.
+But hex dumping page 0 is not possible.
+
+Instead of using zero / non-zero to figure out whether param was
+set - add a bitmap of which params got set on command line.
+The nl_param()'s dest option is not used by any other command,
+so we're free to change the format.
+
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Reviewed-by: Ido Schimmel <idosch@nvidia.com>
+---
+ netlink/module-eeprom.c | 30 +++++++++++++++++++++---------
+ netlink/parser.c | 11 +++++++++--
+ 2 files changed, 30 insertions(+), 11 deletions(-)
+
+diff --git a/netlink/module-eeprom.c b/netlink/module-eeprom.c
+index fe02c5a..2b30d04 100644
+--- a/netlink/module-eeprom.c
++++ b/netlink/module-eeprom.c
+@@ -22,6 +22,7 @@
+ #define ETH_I2C_MAX_ADDRESS 0x7F
+
+ struct cmd_params {
++ unsigned long present;
+ u8 dump_hex;
+ u8 dump_raw;
+ u32 offset;
+@@ -31,6 +32,14 @@ struct cmd_params {
+ u32 i2c_address;
+ };
+
++enum {
++ PARAM_OFFSET = 2,
++ PARAM_LENGTH,
++ PARAM_PAGE,
++ PARAM_BANK,
++ PARAM_I2C,
++};
++
+ static const struct param_parser getmodule_params[] = {
+ {
+ .arg = "hex",
+@@ -44,31 +53,31 @@ static const struct param_parser getmodule_params[] = {
+ .dest_offset = offsetof(struct cmd_params, dump_raw),
+ .min_argc = 1,
+ },
+- {
++ [PARAM_OFFSET] = {
+ .arg = "offset",
+ .handler = nl_parse_direct_u32,
+ .dest_offset = offsetof(struct cmd_params, offset),
+ .min_argc = 1,
+ },
+- {
++ [PARAM_LENGTH] = {
+ .arg = "length",
+ .handler = nl_parse_direct_u32,
+ .dest_offset = offsetof(struct cmd_params, length),
+ .min_argc = 1,
+ },
+- {
++ [PARAM_PAGE] = {
+ .arg = "page",
+ .handler = nl_parse_direct_u32,
+ .dest_offset = offsetof(struct cmd_params, page),
+ .min_argc = 1,
+ },
+- {
++ [PARAM_BANK] = {
+ .arg = "bank",
+ .handler = nl_parse_direct_u32,
+ .dest_offset = offsetof(struct cmd_params, bank),
+ .min_argc = 1,
+ },
+- {
++ [PARAM_I2C] = {
+ .arg = "i2c",
+ .handler = nl_parse_direct_u32,
+ .dest_offset = offsetof(struct cmd_params, i2c_address),
+@@ -267,15 +276,18 @@ int nl_getmodule(struct cmd_context *ctx)
+ * ioctl. Netlink can only request specific pages.
+ */
+ if ((getmodule_cmd_params.dump_hex || getmodule_cmd_params.dump_raw) &&
+- !getmodule_cmd_params.page && !getmodule_cmd_params.bank &&
+- !getmodule_cmd_params.i2c_address) {
++ !(getmodule_cmd_params.present & (1 << PARAM_PAGE |
++ 1 << PARAM_BANK |
++ 1 << PARAM_I2C))) {
+ nlctx->ioctl_fallback = true;
+ return -EOPNOTSUPP;
+ }
+
+ #ifdef ETHTOOL_ENABLE_PRETTY_DUMP
+- if (getmodule_cmd_params.page || getmodule_cmd_params.bank ||
+- getmodule_cmd_params.offset || getmodule_cmd_params.length)
++ if (getmodule_cmd_params.present & (1 << PARAM_PAGE |
++ 1 << PARAM_BANK |
++ 1 << PARAM_OFFSET |
++ 1 << PARAM_LENGTH))
+ #endif
+ getmodule_cmd_params.dump_hex = true;
+
+diff --git a/netlink/parser.c b/netlink/parser.c
+index 6f86361..cd32752 100644
+--- a/netlink/parser.c
++++ b/netlink/parser.c
+@@ -996,7 +996,7 @@ static void tmp_buff_destroy(struct tmp_buff *head)
+ * and their handlers; the array must be terminated by null
+ * element {}
+ * @dest: optional destination to copy parsed data to (at
+- * param_parser::offset)
++ * param_parser::offset); buffer should start with presence bitmap
+ * @group_style: defines if identifiers in .group represent separate messages,
+ * nested attributes or are not allowed
+ * @msgbuffs: (only used for @group_style = PARSER_GROUP_MSG) array to store
+@@ -1096,7 +1096,14 @@ int nl_parser(struct nl_context *nlctx, const struct param_parser *params,
+ buff = tmp_buff_find(buffs, parser->group);
+ msgbuff = buff ? buff->msgbuff : &nlsk->msgbuff;
+
+- param_dest = dest ? ((char *)dest + parser->dest_offset) : NULL;
++ if (dest) {
++ unsigned long index = parser - params;
++
++ param_dest = ((char *)dest + parser->dest_offset);
++ set_bit(index, (unsigned long *)dest);
++ } else {
++ param_dest = NULL;
++ }
+ ret = parser->handler(nlctx, parser->type, parser->handler_data,
+ msgbuff, param_dest);
+ if (ret < 0)
+--
+cgit 1.2.3-korg
+