Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
of_net.c
Go to the documentation of this file.
1 /*
2  * OF helpers for network devices.
3  *
4  * This file is released under the GPLv2
5  *
6  * Initially copied out of arch/powerpc/kernel/prom_parse.c
7  */
8 #include <linux/etherdevice.h>
9 #include <linux/kernel.h>
10 #include <linux/of_net.h>
11 #include <linux/phy.h>
12 #include <linux/export.h>
13 
19 static const char *phy_modes[] = {
20  [PHY_INTERFACE_MODE_NA] = "",
21  [PHY_INTERFACE_MODE_MII] = "mii",
22  [PHY_INTERFACE_MODE_GMII] = "gmii",
23  [PHY_INTERFACE_MODE_SGMII] = "sgmii",
24  [PHY_INTERFACE_MODE_TBI] = "tbi",
25  [PHY_INTERFACE_MODE_RMII] = "rmii",
26  [PHY_INTERFACE_MODE_RGMII] = "rgmii",
27  [PHY_INTERFACE_MODE_RGMII_ID] = "rgmii-id",
28  [PHY_INTERFACE_MODE_RGMII_RXID] = "rgmii-rxid",
29  [PHY_INTERFACE_MODE_RGMII_TXID] = "rgmii-txid",
30  [PHY_INTERFACE_MODE_RTBI] = "rtbi",
31  [PHY_INTERFACE_MODE_SMII] = "smii",
32 };
33 
41 const int of_get_phy_mode(struct device_node *np)
42 {
43  const char *pm;
44  int err, i;
45 
46  err = of_property_read_string(np, "phy-mode", &pm);
47  if (err < 0)
48  return err;
49 
50  for (i = 0; i < ARRAY_SIZE(phy_modes); i++)
51  if (!strcasecmp(pm, phy_modes[i]))
52  return i;
53 
54  return -ENODEV;
55 }
57 
76 const void *of_get_mac_address(struct device_node *np)
77 {
78  struct property *pp;
79 
80  pp = of_find_property(np, "mac-address", NULL);
81  if (pp && (pp->length == 6) && is_valid_ether_addr(pp->value))
82  return pp->value;
83 
84  pp = of_find_property(np, "local-mac-address", NULL);
85  if (pp && (pp->length == 6) && is_valid_ether_addr(pp->value))
86  return pp->value;
87 
88  pp = of_find_property(np, "address", NULL);
89  if (pp && (pp->length == 6) && is_valid_ether_addr(pp->value))
90  return pp->value;
91 
92  return NULL;
93 }