2010-10-27 02:07:13 +04:00
/*
* OF helpers for network devices .
*
* This file is released under the GPLv2
*
* Initially copied out of arch / powerpc / kernel / prom_parse . c
*/
# include <linux/etherdevice.h>
# include <linux/kernel.h>
# include <linux/of_net.h>
2011-07-04 10:03:17 +04:00
# include <linux/phy.h>
2011-07-29 10:05:38 +04:00
# include <linux/export.h>
2011-07-04 10:03:17 +04:00
/**
* of_get_phy_mode - Get phy mode for given device_node
* @ np : Pointer to the given device_node
*
2013-11-15 10:23:32 +04:00
* The function gets phy interface string from property ' phy - mode ' or
* ' phy - connection - type ' , and return its index in phy_modes table , or errno in
* error case .
2011-07-04 10:03:17 +04:00
*/
2013-08-18 15:01:30 +04:00
int of_get_phy_mode ( struct device_node * np )
2011-07-04 10:03:17 +04:00
{
const char * pm ;
int err , i ;
err = of_property_read_string ( np , " phy-mode " , & pm ) ;
2013-11-15 10:23:32 +04:00
if ( err < 0 )
err = of_property_read_string ( np , " phy-connection-type " , & pm ) ;
2011-07-04 10:03:17 +04:00
if ( err < 0 )
return err ;
2014-02-12 05:27:39 +04:00
for ( i = 0 ; i < PHY_INTERFACE_MODE_MAX ; i + + )
if ( ! strcasecmp ( pm , phy_modes ( i ) ) )
2011-07-04 10:03:17 +04:00
return i ;
return - ENODEV ;
}
EXPORT_SYMBOL_GPL ( of_get_phy_mode ) ;
2010-10-27 02:07:13 +04:00
2015-03-18 22:25:46 +03:00
static const void * of_get_mac_addr ( struct device_node * np , const char * name )
{
struct property * pp = of_find_property ( np , name , NULL ) ;
if ( pp & & pp - > length = = ETH_ALEN & & is_valid_ether_addr ( pp - > value ) )
return pp - > value ;
return NULL ;
}
2010-10-27 02:07:13 +04:00
/**
* Search the device tree 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 device tree , but were not set by U - Boot . 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 .
*/
const void * of_get_mac_address ( struct device_node * np )
{
2015-03-18 22:25:46 +03:00
const void * addr ;
2010-10-27 02:07:13 +04:00
2015-03-18 22:25:46 +03:00
addr = of_get_mac_addr ( np , " mac-address " ) ;
if ( addr )
return addr ;
2010-10-27 02:07:13 +04:00
2015-03-18 22:25:46 +03:00
addr = of_get_mac_addr ( np , " local-mac-address " ) ;
if ( addr )
return addr ;
2010-10-27 02:07:13 +04:00
2015-03-18 22:25:46 +03:00
return of_get_mac_addr ( np , " address " ) ;
2010-10-27 02:07:13 +04:00
}
EXPORT_SYMBOL ( of_get_mac_address ) ;