Re: [Letux-kernel] [PATCH v2] net: davicom: dm9000: allow to pass MAC address through mac_addr module parameter

From: Paul Cercueil
Date: Fri Feb 14 2020 - 14:57:50 EST




Le ven., févr. 14, 2020 at 20:38, H. Nikolaus Schaller <hns@xxxxxxxxxxxxx> a écrit :
Am 14.02.2020 um 20:24 schrieb H. Nikolaus Schaller <hns@xxxxxxxxxxxxx>:


Am 14.02.2020 um 19:47 schrieb Paul Cercueil <paul@xxxxxxxxxxxxxxx>:

Hi Nikolaus,

What I'd suggest is to write a NVMEM driver for the efuse and retrieve the MAC address cleanly with nvmem_get_mac_address().

It shouldn't be hard to do (there's already code for it in the non-upstream 3.18 kernel for the CI20) and you remove the dependency on uboot.

Interesting approach. I have found this:

https://lore.kernel.org/patchwork/patch/868158/

but it looks as if it was never finished (I could not locate a V3 or anything mainline?)
and and it tries to solve other problems as well.


Yes, I think it's a bit too complex - it's probably fine to just read chunks of 4 bytes.


And it looks to be much more complex than my "solution" to the immediate problem.


Yes, a proper fix usually means more work ;)

I have to study it to know if I can write a nvmem_get_mac_address().

Another question is how to link this very jz4780 specific code to the generic davicom dm9000 driver?
And where should the new code live. In some jz4780 specific file or elsewhere?

In the dm9000's devicetree node you'd have a "mac-address = <&mac_addr>;". The "mac-address" is already a standard property, and the davicom driver already supports it.

The "mac_addr" should be a pointer to the efuse cell that corresponds to the MAC address. See the examples at the bottom of Documentation/devicetree/bindings/nvmem/nvmem.yaml and Documentation/devicetree/bindings/nvmem/nvmem-consumer.yaml.

-Paul



BR,
Nikolaus


-Paul


Le ven., févr. 14, 2020 at 17:07, H. Nikolaus Schaller <hns@xxxxxxxxxxxxx> a écrit :
The MIPS Ingenic CI20 board is shipped with a quite old u-boot
(ci20-v2013.10 see https://elinux.org/CI20_Dev_Zone). This passes
the MAC address through dm9000.mac_addr=xx:xx:xx:xx:xx:xx
kernel module parameter to give the board a fixed MAC address.
This is not processed by the dm9000 driver which assigns a random
MAC address on each boot, making DHCP assign a new IP address
each time.
So we add a check for the mac_addr module parameter as a last
resort before assigning a random one. This mechanism can also
be used outside of u-boot to provide a value through modprobe
config.
To parse the MAC address in a new function get_mac_addr() we
use an copy adapted from the ksz884x.c driver which provides
the same functionality.
Signed-off-by: H. Nikolaus Schaller <hns@xxxxxxxxxxxxx>
---
drivers/net/ethernet/davicom/dm9000.c | 42 +++++++++++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/drivers/net/ethernet/davicom/dm9000.c b/drivers/net/ethernet/davicom/dm9000.c
index 1ea3372775e6..7402030b0352 100644
--- a/drivers/net/ethernet/davicom/dm9000.c
+++ b/drivers/net/ethernet/davicom/dm9000.c
@@ -1409,6 +1409,43 @@ static struct dm9000_plat_data *dm9000_parse_dt(struct device *dev)
return pdata;
}
+static char *mac_addr = ":";
+module_param(mac_addr, charp, 0);
+MODULE_PARM_DESC(mac_addr, "MAC address");
+
+static void get_mac_addr(struct net_device *ndev, char *macaddr)
+{
+ int i = 0;
+ int j = 0;
+ int got_num = 0;
+ int num = 0;
+
+ while (j < ETH_ALEN) {
+ if (macaddr[i]) {
+ int digit;
+
+ got_num = 1;
+ digit = hex_to_bin(macaddr[i]);
+ if (digit >= 0)
+ num = num * 16 + digit;
+ else if (':' == macaddr[i])
+ got_num = 2;
+ else
+ break;
+ } else if (got_num) {
+ got_num = 2;
+ } else {
+ break;
+ }
+ if (got_num == 2) {
+ ndev->dev_addr[j++] = (u8)num;
+ num = 0;
+ got_num = 0;
+ }
+ i++;
+ }
+}
+
/*
* Search DM9000 board, allocate space and register it
*/
@@ -1679,6 +1716,11 @@ dm9000_probe(struct platform_device *pdev)
ndev->dev_addr[i] = ior(db, i+DM9000_PAR);
}
+ if (!is_valid_ether_addr(ndev->dev_addr)) {
+ mac_src = "param";
+ get_mac_addr(ndev, mac_addr);
+ }
+
if (!is_valid_ether_addr(ndev->dev_addr)) {
inv_mac_addr = true;
eth_hw_addr_random(ndev);
--
2.23.0



_______________________________________________
http://projects.goldelico.com/p/gta04-kernel/
Letux-kernel mailing list
Letux-kernel@xxxxxxxxxxxxxxx
http://lists.goldelico.com/mailman/listinfo.cgi/letux-kernel