Messages in this thread | | | Date | Fri, 14 Feb 2020 15:47:28 -0300 | From | Paul Cercueil <> | Subject | Re: [PATCH v2] net: davicom: dm9000: allow to pass MAC address through mac_addr module parameter |
| |
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.
-Paul
Le ven., févr. 14, 2020 at 17:07, H. Nikolaus Schaller <hns@goldelico.com> 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@goldelico.com> > --- > 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 >
| |