[2/2] nvmem: u-boot-env: reformat MAC in "ethaddr" cell when reading

Message ID 20221127231035.17547-2-zajec5@gmail.com
State New
Headers
Series [1/2] nvmem: core: refactor .cell_post_process() CB arguments |

Commit Message

Rafał Miłecki Nov. 27, 2022, 11:10 p.m. UTC
  From: Rafał Miłecki <rafal@milecki.pl>

NVMEM consumers expect MAC in a byte-based format (see e.g.
nvmem_get_mac_address()). U-Boot environment data stores all values in
ASCII form.

Add post processing callback detecting "ethaddr" reads and reformat data
as expected. This fixes Ethernet drivers reading MAC from NVMEM devices.

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
---
 drivers/nvmem/u-boot-env.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)
  

Comments

kernel test robot Nov. 28, 2022, 2:50 a.m. UTC | #1
Hi Rafał,

I love your patch! Yet something to improve:

[auto build test ERROR on shawnguo/for-next]
[also build test ERROR on soc/for-next linus/master v6.1-rc7 next-20221125]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Rafa-Mi-ecki/nvmem-core-refactor-cell_post_process-CB-arguments/20221128-071155
base:   https://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux.git for-next
patch link:    https://lore.kernel.org/r/20221127231035.17547-2-zajec5%40gmail.com
patch subject: [PATCH 2/2] nvmem: u-boot-env: reformat MAC in "ethaddr" cell when reading
config: riscv-randconfig-r042-20221127
compiler: riscv64-linux-gcc (GCC) 12.1.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/7ed383c8df3e3a2435255360e03171ebdc4437b4
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Rafa-Mi-ecki/nvmem-core-refactor-cell_post_process-CB-arguments/20221128-071155
        git checkout 7ed383c8df3e3a2435255360e03171ebdc4437b4
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=riscv SHELL=/bin/bash

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   riscv64-linux-ld: arch/riscv/kvm/vcpu.o: in function `.L0 ':
   arch/riscv/kvm/vcpu.c:271: undefined reference to `riscv_cbom_block_size'
   riscv64-linux-ld: arch/riscv/kvm/vcpu.c:271: undefined reference to `riscv_cbom_block_size'
   riscv64-linux-ld: drivers/nvmem/u-boot-env.o: in function `.L0 ':
>> drivers/nvmem/u-boot-env.c:75: undefined reference to `mac_pton'


vim +75 drivers/nvmem/u-boot-env.c

    66	
    67	static int u_boot_env_cell_post_process(void *context, struct nvmem_cell_entry *cell,
    68						const char *id, void *buf, size_t *len)
    69	{
    70		struct u_boot_env *priv = context;
    71	
    72		if (!strcmp(cell->name, "ethaddr")) {
    73			u8 mac[ETH_ALEN];
    74	
  > 75			if (mac_pton(buf, mac)) {
    76				ether_addr_copy(buf, mac);
    77				if (len)
    78					*len = ETH_ALEN;
    79			}
    80		}
    81	
    82		return 0;
    83	}
    84
  
kernel test robot Nov. 28, 2022, 3:30 a.m. UTC | #2
Hi Rafał,

I love your patch! Perhaps something to improve:

[auto build test WARNING on shawnguo/for-next]
[also build test WARNING on soc/for-next linus/master v6.1-rc7 next-20221125]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Rafa-Mi-ecki/nvmem-core-refactor-cell_post_process-CB-arguments/20221128-071155
base:   https://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux.git for-next
patch link:    https://lore.kernel.org/r/20221127231035.17547-2-zajec5%40gmail.com
patch subject: [PATCH 2/2] nvmem: u-boot-env: reformat MAC in "ethaddr" cell when reading
config: x86_64-allyesconfig
compiler: gcc-11 (Debian 11.3.0-8) 11.3.0
reproduce (this is a W=1 build):
        # https://github.com/intel-lab-lkp/linux/commit/7ed383c8df3e3a2435255360e03171ebdc4437b4
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Rafa-Mi-ecki/nvmem-core-refactor-cell_post_process-CB-arguments/20221128-071155
        git checkout 7ed383c8df3e3a2435255360e03171ebdc4437b4
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        make W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash drivers/

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   drivers/nvmem/u-boot-env.c: In function 'u_boot_env_cell_post_process':
>> drivers/nvmem/u-boot-env.c:70:28: warning: unused variable 'priv' [-Wunused-variable]
      70 |         struct u_boot_env *priv = context;
         |                            ^~~~


vim +/priv +70 drivers/nvmem/u-boot-env.c

    66	
    67	static int u_boot_env_cell_post_process(void *context, struct nvmem_cell_entry *cell,
    68						const char *id, void *buf, size_t *len)
    69	{
  > 70		struct u_boot_env *priv = context;
    71	
    72		if (!strcmp(cell->name, "ethaddr")) {
    73			u8 mac[ETH_ALEN];
    74	
    75			if (mac_pton(buf, mac)) {
    76				ether_addr_copy(buf, mac);
    77				if (len)
    78					*len = ETH_ALEN;
    79			}
    80		}
    81	
    82		return 0;
    83	}
    84
  

Patch

diff --git a/drivers/nvmem/u-boot-env.c b/drivers/nvmem/u-boot-env.c
index 2a87dda45188..d103a52e0008 100644
--- a/drivers/nvmem/u-boot-env.c
+++ b/drivers/nvmem/u-boot-env.c
@@ -4,6 +4,8 @@ 
  */
 
 #include <linux/crc32.h>
+#include <linux/etherdevice.h>
+#include <linux/if_ether.h>
 #include <linux/mod_devicetable.h>
 #include <linux/module.h>
 #include <linux/mtd/mtd.h>
@@ -70,6 +72,24 @@  static int u_boot_env_read(void *context, unsigned int offset, void *val,
 	return 0;
 }
 
+static int u_boot_env_cell_post_process(void *context, struct nvmem_cell_entry *cell,
+					const char *id, void *buf, size_t *len)
+{
+	struct u_boot_env *priv = context;
+
+	if (!strcmp(cell->name, "ethaddr")) {
+		u8 mac[ETH_ALEN];
+
+		if (mac_pton(buf, mac)) {
+			ether_addr_copy(buf, mac);
+			if (len)
+				*len = ETH_ALEN;
+		}
+	}
+
+	return 0;
+}
+
 static int u_boot_env_add_cells(struct u_boot_env *priv, uint8_t *buf,
 				size_t data_offset, size_t data_len)
 {
@@ -179,6 +199,7 @@  static int u_boot_env_probe(struct platform_device *pdev)
 	struct nvmem_config config = {
 		.name = "u-boot-env",
 		.reg_read = u_boot_env_read,
+		.cell_post_process = u_boot_env_cell_post_process,
 	};
 	struct device *dev = &pdev->dev;
 	struct device_node *np = dev->of_node;