On Fri, 8 May 2020 12:14:51 +0300 Igor Russkikh wrote: > >> This patch moves MAC generation into a separate function, which is called > >> from both places to reduce the amount of copy/paste. > > > > Right, but why do you have your own mac generation rather than using > > eth_hw_addr_random(). You need to set NET_ADDR_RANDOM for example, > > just use standard helpers, please. > > We want this still be an Aquantia vendor id MAC, not a fully random mac. > Thats why the logic below randomizes only low three octets.
Are there any other drivers in tree which do that? I think the standard operating procedure is: if (!valid) { netdev_warn(dev, "Invalid MAC using random\n"); eth_hw_addr_random(dev); } Please see all the eth_hw_addr_random() calls in drivers. > >> +static inline bool aq_hw_is_zero_ether_addr(const u8 *addr) > > > > No static inlines in C files, please. Let compiler decide inlineing & > > generate a warning when function becomes unused. > > Ok, will fix. > > >> + get_random_bytes(&rnd, sizeof(unsigned int)); > >> + l = 0xE300 0000U | (0xFFFFU & rnd) | (0x00 << 16); > >> + h = 0x8001300EU; > >> + > >> + mac[5] = (u8)(0xFFU & l); > >> + l >>= 8; > >> + mac[4] = (u8)(0xFFU & l); > >> + l >>= 8; > >> + mac[3] = (u8)(0xFFU & l); > >> + l >>= 8; > >> + mac[2] = (u8)(0xFFU & l); > >> + mac[1] = (u8)(0xFFU & h); > >> + h >>= 8; > >> + mac[0] = (u8)(0xFFU & h); > > > > This can be greatly simplified using helpers from etherdevice.h, if > > it's really needed. > > This is the exact place where we put Aquantia vendor id, even if mac is > random. > > eth_hw_addr_random is more suitable for software devices like bridges, which > are not related to any vendor. What's the basis for this statement? Please look around the existing drivers.