mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-29 17:25:38 +00:00
device property: move mac addr helpers to eth.c
Move the mac address helpers out, eth.c already contains a bunch of similar helpers. Suggested-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Jakub Kicinski <kuba@kernel.org> Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
9ca01b25df
commit
433baf0719
@ -15,7 +15,6 @@
|
||||
#include <linux/of_graph.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/phy.h>
|
||||
|
||||
struct fwnode_handle *dev_fwnode(struct device *dev)
|
||||
@ -935,68 +934,6 @@ int device_get_phy_mode(struct device *dev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(device_get_phy_mode);
|
||||
|
||||
static void *fwnode_get_mac_addr(struct fwnode_handle *fwnode,
|
||||
const char *name, char *addr,
|
||||
int alen)
|
||||
{
|
||||
int ret = fwnode_property_read_u8_array(fwnode, name, addr, alen);
|
||||
|
||||
if (ret == 0 && alen == ETH_ALEN && is_valid_ether_addr(addr))
|
||||
return addr;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* fwnode_get_mac_address - Get the MAC from the firmware node
|
||||
* @fwnode: Pointer to the firmware node
|
||||
* @addr: Address of buffer to store the MAC in
|
||||
* @alen: Length of the buffer pointed to by addr, should be ETH_ALEN
|
||||
*
|
||||
* Search the firmware node for the best MAC address to use. 'mac-address' is
|
||||
* checked first, because that is supposed to contain to "most recent" MAC
|
||||
* address. If that isn't set, then 'local-mac-address' is checked next,
|
||||
* because that is the default address. If that isn't set, then the obsolete
|
||||
* 'address' is checked, just in case we're using an old device tree.
|
||||
*
|
||||
* Note that the 'address' property is supposed to contain a virtual address of
|
||||
* the register set, but some DTS files have redefined that property to be the
|
||||
* MAC address.
|
||||
*
|
||||
* All-zero MAC addresses are rejected, because those could be properties that
|
||||
* exist in the firmware tables, but were not updated by the firmware. For
|
||||
* example, the DTS could define 'mac-address' and 'local-mac-address', with
|
||||
* zero MAC addresses. Some older U-Boots only initialized 'local-mac-address'.
|
||||
* In this case, the real MAC is in 'local-mac-address', and 'mac-address'
|
||||
* exists but is all zeros.
|
||||
*/
|
||||
void *fwnode_get_mac_address(struct fwnode_handle *fwnode, char *addr, int alen)
|
||||
{
|
||||
char *res;
|
||||
|
||||
res = fwnode_get_mac_addr(fwnode, "mac-address", addr, alen);
|
||||
if (res)
|
||||
return res;
|
||||
|
||||
res = fwnode_get_mac_addr(fwnode, "local-mac-address", addr, alen);
|
||||
if (res)
|
||||
return res;
|
||||
|
||||
return fwnode_get_mac_addr(fwnode, "address", addr, alen);
|
||||
}
|
||||
EXPORT_SYMBOL(fwnode_get_mac_address);
|
||||
|
||||
/**
|
||||
* device_get_mac_address - Get the MAC for a given device
|
||||
* @dev: Pointer to the device
|
||||
* @addr: Address of buffer to store the MAC in
|
||||
* @alen: Length of the buffer pointed to by addr, should be ETH_ALEN
|
||||
*/
|
||||
void *device_get_mac_address(struct device *dev, char *addr, int alen)
|
||||
{
|
||||
return fwnode_get_mac_address(dev_fwnode(dev), addr, alen);
|
||||
}
|
||||
EXPORT_SYMBOL(device_get_mac_address);
|
||||
|
||||
/**
|
||||
* fwnode_irq_get - Get IRQ directly from a fwnode
|
||||
* @fwnode: Pointer to the firmware node
|
||||
|
@ -26,9 +26,15 @@
|
||||
|
||||
#ifdef __KERNEL__
|
||||
struct device;
|
||||
struct fwnode_handle;
|
||||
|
||||
int eth_platform_get_mac_address(struct device *dev, u8 *mac_addr);
|
||||
unsigned char *arch_get_platform_mac_address(void);
|
||||
int nvmem_get_mac_address(struct device *dev, void *addrbuf);
|
||||
void *device_get_mac_address(struct device *dev, char *addr, int alen);
|
||||
void *fwnode_get_mac_address(struct fwnode_handle *fwnode,
|
||||
char *addr, int alen);
|
||||
|
||||
u32 eth_get_headlen(const struct net_device *dev, const void *data, u32 len);
|
||||
__be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev);
|
||||
extern const struct header_ops eth_header_ops;
|
||||
|
@ -389,11 +389,7 @@ const void *device_get_match_data(struct device *dev);
|
||||
|
||||
int device_get_phy_mode(struct device *dev);
|
||||
|
||||
void *device_get_mac_address(struct device *dev, char *addr, int alen);
|
||||
|
||||
int fwnode_get_phy_mode(struct fwnode_handle *fwnode);
|
||||
void *fwnode_get_mac_address(struct fwnode_handle *fwnode,
|
||||
char *addr, int alen);
|
||||
struct fwnode_handle *fwnode_graph_get_next_endpoint(
|
||||
const struct fwnode_handle *fwnode, struct fwnode_handle *prev);
|
||||
struct fwnode_handle *
|
||||
|
@ -51,6 +51,7 @@
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/of_net.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/property.h>
|
||||
#include <net/dst.h>
|
||||
#include <net/arp.h>
|
||||
#include <net/sock.h>
|
||||
@ -558,3 +559,65 @@ int nvmem_get_mac_address(struct device *dev, void *addrbuf)
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(nvmem_get_mac_address);
|
||||
|
||||
static void *fwnode_get_mac_addr(struct fwnode_handle *fwnode,
|
||||
const char *name, char *addr,
|
||||
int alen)
|
||||
{
|
||||
int ret = fwnode_property_read_u8_array(fwnode, name, addr, alen);
|
||||
|
||||
if (ret == 0 && alen == ETH_ALEN && is_valid_ether_addr(addr))
|
||||
return addr;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* fwnode_get_mac_address - Get the MAC from the firmware node
|
||||
* @fwnode: Pointer to the firmware node
|
||||
* @addr: Address of buffer to store the MAC in
|
||||
* @alen: Length of the buffer pointed to by addr, should be ETH_ALEN
|
||||
*
|
||||
* Search the firmware node for the best MAC address to use. 'mac-address' is
|
||||
* checked first, because that is supposed to contain to "most recent" MAC
|
||||
* address. If that isn't set, then 'local-mac-address' is checked next,
|
||||
* because that is the default address. If that isn't set, then the obsolete
|
||||
* 'address' is checked, just in case we're using an old device tree.
|
||||
*
|
||||
* Note that the 'address' property is supposed to contain a virtual address of
|
||||
* the register set, but some DTS files have redefined that property to be the
|
||||
* MAC address.
|
||||
*
|
||||
* All-zero MAC addresses are rejected, because those could be properties that
|
||||
* exist in the firmware tables, but were not updated by the firmware. For
|
||||
* example, the DTS could define 'mac-address' and 'local-mac-address', with
|
||||
* zero MAC addresses. Some older U-Boots only initialized 'local-mac-address'.
|
||||
* In this case, the real MAC is in 'local-mac-address', and 'mac-address'
|
||||
* exists but is all zeros.
|
||||
*/
|
||||
void *fwnode_get_mac_address(struct fwnode_handle *fwnode, char *addr, int alen)
|
||||
{
|
||||
char *res;
|
||||
|
||||
res = fwnode_get_mac_addr(fwnode, "mac-address", addr, alen);
|
||||
if (res)
|
||||
return res;
|
||||
|
||||
res = fwnode_get_mac_addr(fwnode, "local-mac-address", addr, alen);
|
||||
if (res)
|
||||
return res;
|
||||
|
||||
return fwnode_get_mac_addr(fwnode, "address", addr, alen);
|
||||
}
|
||||
EXPORT_SYMBOL(fwnode_get_mac_address);
|
||||
|
||||
/**
|
||||
* device_get_mac_address - Get the MAC for a given device
|
||||
* @dev: Pointer to the device
|
||||
* @addr: Address of buffer to store the MAC in
|
||||
* @alen: Length of the buffer pointed to by addr, should be ETH_ALEN
|
||||
*/
|
||||
void *device_get_mac_address(struct device *dev, char *addr, int alen)
|
||||
{
|
||||
return fwnode_get_mac_address(dev_fwnode(dev), addr, alen);
|
||||
}
|
||||
EXPORT_SYMBOL(device_get_mac_address);
|
||||
|
Loading…
Reference in New Issue
Block a user