Message ID | 20180719153243.20944-4-brgl@bgdev.pl (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, Jul 19, 2018 at 05:32:43PM +0200, Bartosz Golaszewski wrote: > From: Bartosz Golaszewski <bgolaszewski@baylibre.com> > > MTD doesn't support nvmem yet. Some platforms use MTD to read the MAC > address from SPI flash. If we want this function to generalize reading > the MAC address, we need to separately try to use MTD. How many board files are doing this? It is only worth generlizing if there are a number of board files, all just pulling 6 bytes out from the beginning of an MTD partition. It is also normal to actually add a user of a new feature at the same time as the new feature. It can be messy when it is across subsystem boundaries, but please at least try. Andrew -- 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 98bc280b8a62..a0d5e4477afc 100644 --- a/net/ethernet/eth.c +++ b/net/ethernet/eth.c @@ -55,6 +55,7 @@ #include <linux/of_net.h> #include <linux/pci.h> #include <linux/nvmem-consumer.h> +#include <linux/mtd/mtd.h> #include <net/dst.h> #include <net/arp.h> #include <net/sock.h> @@ -593,6 +594,36 @@ static int mac_address_from_nvmem(struct device *dev, u8 *mac_addr) return rv; } +#ifdef CONFIG_MTD +static int mac_address_from_mtd(u8 *mac_addr) +{ + struct mtd_info *mtd; + size_t alen; + int rv = 0; + + mtd = get_mtd_device_nm("MAC-Address"); + if (IS_ERR(mtd)) + return PTR_ERR(mtd); + + rv = mtd_read(mtd, 0, ETH_ALEN, &alen, mac_addr); + if (rv) + goto put_mtd; + + if (alen != ETH_ALEN || !is_valid_ether_addr(mac_addr)) + rv = -ENODEV; + +put_mtd: + put_mtd_device(mtd); + + return rv; +} +#else /* CONFIG_MTD */ +static int mac_address_from_mtd(u8 *mac_addr) +{ + return -ENODEV; +} +#endif /* CONFIG_MTD */ + int eth_platform_get_mac_address(struct device *dev, u8 *mac_addr) { int rv; @@ -609,6 +640,6 @@ int eth_platform_get_mac_address(struct device *dev, u8 *mac_addr) if (!rv) return 0; - return -ENODEV; + return mac_address_from_mtd(mac_addr); } EXPORT_SYMBOL(eth_platform_get_mac_address);