File tree Expand file tree Collapse file tree 4 files changed +57
-3
lines changed
Documentation/devicetree/bindings/net Expand file tree Collapse file tree 4 files changed +57
-3
lines changed Original file line number Diff line number Diff line change @@ -10,6 +10,8 @@ Documentation/devicetree/bindings/phy/phy-bindings.txt.
10
10
the boot program; should be used in cases where the MAC address assigned to
11
11
the device by the boot program is different from the "local-mac-address"
12
12
property;
13
+ - nvmem-cells: phandle, reference to an nvmem node for the MAC address;
14
+ - nvmem-cell-names: string, should be "mac-address" if nvmem is to be used;
13
15
- max-speed: number, specifies maximum speed in Mbit/s supported by the device;
14
16
- max-frame-size: number, maximum transfer unit (IEEE defined MTU), rather than
15
17
the maximum frame size (there's contradiction in the Devicetree
Original file line number Diff line number Diff line change @@ -3952,10 +3952,16 @@ static int macb_probe(struct platform_device *pdev)
3952
3952
dev -> max_mtu = ETH_DATA_LEN ;
3953
3953
3954
3954
mac = of_get_mac_address (np );
3955
- if (mac )
3955
+ if (mac ) {
3956
3956
ether_addr_copy (bp -> dev -> dev_addr , mac );
3957
- else
3958
- macb_get_hwaddr (bp );
3957
+ } else {
3958
+ err = of_get_nvmem_mac_address (np , bp -> dev -> dev_addr );
3959
+ if (err ) {
3960
+ if (err == - EPROBE_DEFER )
3961
+ goto err_out_free_netdev ;
3962
+ macb_get_hwaddr (bp );
3963
+ }
3964
+ }
3959
3965
3960
3966
err = of_get_phy_mode (np );
3961
3967
if (err < 0 ) {
Original file line number Diff line number Diff line change 7
7
*/
8
8
#include <linux/etherdevice.h>
9
9
#include <linux/kernel.h>
10
+ #include <linux/nvmem-consumer.h>
10
11
#include <linux/of_net.h>
11
12
#include <linux/phy.h>
12
13
#include <linux/export.h>
@@ -80,3 +81,42 @@ const void *of_get_mac_address(struct device_node *np)
80
81
return of_get_mac_addr (np , "address" );
81
82
}
82
83
EXPORT_SYMBOL (of_get_mac_address );
84
+
85
+ /**
86
+ * Obtain the MAC address from an nvmem provider named 'mac-address' through
87
+ * device tree.
88
+ * On success, copies the new address into memory pointed to by addr and
89
+ * returns 0. Returns a negative error code otherwise.
90
+ * @np: Device tree node containing the nvmem-cells phandle
91
+ * @addr: Pointer to receive the MAC address using ether_addr_copy()
92
+ */
93
+ int of_get_nvmem_mac_address (struct device_node * np , void * addr )
94
+ {
95
+ struct nvmem_cell * cell ;
96
+ const void * mac ;
97
+ size_t len ;
98
+ int ret ;
99
+
100
+ cell = of_nvmem_cell_get (np , "mac-address" );
101
+ if (IS_ERR (cell ))
102
+ return PTR_ERR (cell );
103
+
104
+ mac = nvmem_cell_read (cell , & len );
105
+
106
+ nvmem_cell_put (cell );
107
+
108
+ if (IS_ERR (mac ))
109
+ return PTR_ERR (mac );
110
+
111
+ if (len < ETH_ALEN || !is_valid_ether_addr (mac )) {
112
+ ret = - EINVAL ;
113
+ } else {
114
+ ether_addr_copy (addr , mac );
115
+ ret = 0 ;
116
+ }
117
+
118
+ kfree (mac );
119
+
120
+ return ret ;
121
+ }
122
+ EXPORT_SYMBOL (of_get_nvmem_mac_address );
Original file line number Diff line number Diff line change 13
13
struct net_device ;
14
14
extern int of_get_phy_mode (struct device_node * np );
15
15
extern const void * of_get_mac_address (struct device_node * np );
16
+ extern int of_get_nvmem_mac_address (struct device_node * np , void * addr );
16
17
extern struct net_device * of_find_net_device_by_node (struct device_node * np );
17
18
#else
18
19
static inline int of_get_phy_mode (struct device_node * np )
@@ -25,6 +26,11 @@ static inline const void *of_get_mac_address(struct device_node *np)
25
26
return NULL ;
26
27
}
27
28
29
+ static inline int of_get_nvmem_mac_address (struct device_node * np , void * addr )
30
+ {
31
+ return - ENODEV ;
32
+ }
33
+
28
34
static inline struct net_device * of_find_net_device_by_node (struct device_node * np )
29
35
{
30
36
return NULL ;
You can’t perform that action at this time.
0 commit comments