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:
Родитель
9ca01b25df
Коммит
433baf0719
|
@ -15,7 +15,6 @@
|
||||||
#include <linux/of_graph.h>
|
#include <linux/of_graph.h>
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <linux/property.h>
|
#include <linux/property.h>
|
||||||
#include <linux/etherdevice.h>
|
|
||||||
#include <linux/phy.h>
|
#include <linux/phy.h>
|
||||||
|
|
||||||
struct fwnode_handle *dev_fwnode(struct device *dev)
|
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);
|
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_irq_get - Get IRQ directly from a fwnode
|
||||||
* @fwnode: Pointer to the firmware node
|
* @fwnode: Pointer to the firmware node
|
||||||
|
|
|
@ -26,9 +26,15 @@
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
struct device;
|
struct device;
|
||||||
|
struct fwnode_handle;
|
||||||
|
|
||||||
int eth_platform_get_mac_address(struct device *dev, u8 *mac_addr);
|
int eth_platform_get_mac_address(struct device *dev, u8 *mac_addr);
|
||||||
unsigned char *arch_get_platform_mac_address(void);
|
unsigned char *arch_get_platform_mac_address(void);
|
||||||
int nvmem_get_mac_address(struct device *dev, void *addrbuf);
|
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);
|
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);
|
__be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev);
|
||||||
extern const struct header_ops eth_header_ops;
|
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);
|
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);
|
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(
|
struct fwnode_handle *fwnode_graph_get_next_endpoint(
|
||||||
const struct fwnode_handle *fwnode, struct fwnode_handle *prev);
|
const struct fwnode_handle *fwnode, struct fwnode_handle *prev);
|
||||||
struct fwnode_handle *
|
struct fwnode_handle *
|
||||||
|
|
|
@ -51,6 +51,7 @@
|
||||||
#include <linux/if_ether.h>
|
#include <linux/if_ether.h>
|
||||||
#include <linux/of_net.h>
|
#include <linux/of_net.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
|
#include <linux/property.h>
|
||||||
#include <net/dst.h>
|
#include <net/dst.h>
|
||||||
#include <net/arp.h>
|
#include <net/arp.h>
|
||||||
#include <net/sock.h>
|
#include <net/sock.h>
|
||||||
|
@ -558,3 +559,65 @@ int nvmem_get_mac_address(struct device *dev, void *addrbuf)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(nvmem_get_mac_address);
|
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);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче