Message ID | 20180808153150.23444-15-brgl@bgdev.pl (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | at24: remove at24_platform_data | expand |
On Wed, Aug 8, 2018 at 6:31 PM, Bartosz Golaszewski <brgl@bgdev.pl> wrote: > From: Bartosz Golaszewski <bgolaszewski@baylibre.com> > > We want do add more sources from which to read the MAC address. In > order to avoid bloating this function too much, start by splitting it > into subroutines, each of which takes care of reading the MAC from > one source. > +static int mac_address_from_of(struct device *dev, u8 *mac_addr) > { > const unsigned char *addr; > + struct device_node *np; > > + np = dev_is_pci(dev) ? pci_device_to_OF_node(to_pci_dev(dev)) > + : dev->of_node; I didn't get these manipulations. What the scenario when pci_dev->dev.of_node != dev->of_node?
2018-08-08 19:50 GMT+02:00 Andy Shevchenko <andy.shevchenko@gmail.com>: > On Wed, Aug 8, 2018 at 6:31 PM, Bartosz Golaszewski <brgl@bgdev.pl> wrote: >> From: Bartosz Golaszewski <bgolaszewski@baylibre.com> >> >> We want do add more sources from which to read the MAC address. In >> order to avoid bloating this function too much, start by splitting it >> into subroutines, each of which takes care of reading the MAC from >> one source. > >> +static int mac_address_from_of(struct device *dev, u8 *mac_addr) >> { >> const unsigned char *addr; >> + struct device_node *np; >> > >> + np = dev_is_pci(dev) ? pci_device_to_OF_node(to_pci_dev(dev)) >> + : dev->of_node; > > I didn't get these manipulations. > > What the scenario when pci_dev->dev.of_node != dev->of_node? > > -- > With Best Regards, > Andy Shevchenko I'll add an additional patch that addresses it. Bart -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/ethernet/eth.c b/net/ethernet/eth.c index ee28440f57c5..cf54cdf042b7 100644 --- a/net/ethernet/eth.c +++ b/net/ethernet/eth.c @@ -525,26 +525,52 @@ unsigned char * __weak arch_get_platform_mac_address(void) return NULL; } -int eth_platform_get_mac_address(struct device *dev, u8 *mac_addr) +static int mac_address_from_of(struct device *dev, u8 *mac_addr) { const unsigned char *addr; - struct device_node *dp; + struct device_node *np; - if (dev_is_pci(dev)) - dp = pci_device_to_OF_node(to_pci_dev(dev)); - else - dp = dev->of_node; + np = dev_is_pci(dev) ? pci_device_to_OF_node(to_pci_dev(dev)) + : dev->of_node; - addr = NULL; - if (dp) - addr = of_get_mac_address(dp); - if (!addr) - addr = arch_get_platform_mac_address(); + if (!np) + return -ENODEV; + addr = of_get_mac_address(np); if (!addr) return -ENODEV; + if (!addr || !is_valid_ether_addr(addr)) + return -ENODEV; + + ether_addr_copy(mac_addr, addr); + return 0; +} + +static int mac_address_from_arch(u8 *mac_addr) +{ + const unsigned char *addr; + + addr = arch_get_platform_mac_address(); + if (!addr || !is_valid_ether_addr(addr)) + return -ENODEV; + ether_addr_copy(mac_addr, addr); return 0; } + +int eth_platform_get_mac_address(struct device *dev, u8 *mac_addr) +{ + int rv; + + rv = mac_address_from_of(dev, mac_addr); + if (!rv) + return 0; + + rv = mac_address_from_arch(mac_addr); + if (!rv) + return 0; + + return -ENODEV; +} EXPORT_SYMBOL(eth_platform_get_mac_address);