f38966ef167c90fd882eaa0b2b61e2cb8342a7df
[glsdk/meta-ti-glsdk.git] / recipes-bsp / u-boot / u-boot / 2011.06 / 0006-Add-Ethernet-hardware-MAC-address-framework-to-usbne.patch
1 From f8ff7b1760739c33b1b0aa5a88d903e6e8945f1c Mon Sep 17 00:00:00 2001
2 From: Simon Glass <sjg@chromium.org>
3 Date: Mon, 13 Jun 2011 13:13:10 +0000
4 Subject: [PATCH 06/30] Add Ethernet hardware MAC address framework to usbnet
5 MIME-Version: 1.0
6 Content-Type: text/plain; charset=UTF-8
7 Content-Transfer-Encoding: 8bit
9 Built-in Ethernet adapters support setting the mac address by means of a
10 ethaddr environment variable for each interface (ethaddr, eth1addr, eth2addr).
12 This adds similar support to the USB network side, using the names
13 usbethaddr, usbeth1addr, etc. They are kept separate since we don't want
14 a USB device taking the MAC address of a built-in device or vice versa.
16 Changes for v2:
17 - eth_set_hwaddr -> eth_write_hwaddr
18 - tided up other users of eth_getenv_enetaddr_by_index()
20 Changes for v5:
21 - Changed NULL to "eth" in eth_getenv_enetaddr_by_index() API
23 Signed-off-by: Simon Glass <sjg@chromium.org>
24 Tested-by: Eric BĂ©nard <eric@eukrea.com>
25 ---
26 board/davinci/common/misc.c | 2 +-
27 drivers/net/designware.c | 2 +-
28 drivers/usb/eth/usb_ether.c | 9 +++++-
29 include/net.h | 25 ++++++++++++++++-
30 net/eth.c | 64 ++++++++++++++++++++++++++-----------------
31 5 files changed, 72 insertions(+), 30 deletions(-)
33 diff --git a/board/davinci/common/misc.c b/board/davinci/common/misc.c
34 index 2bfdf23..53d6aa1 100644
35 --- a/board/davinci/common/misc.c
36 +++ b/board/davinci/common/misc.c
37 @@ -101,7 +101,7 @@ void davinci_sync_env_enetaddr(uint8_t *rom_enetaddr)
38 {
39 uint8_t env_enetaddr[6];
41 - eth_getenv_enetaddr_by_index(0, env_enetaddr);
42 + eth_getenv_enetaddr_by_index("eth", 0, env_enetaddr);
43 if (!memcmp(env_enetaddr, "\0\0\0\0\0\0", 6)) {
44 /* There is no MAC address in the environment, so we initialize
45 * it from the value in the EEPROM. */
46 diff --git a/drivers/net/designware.c b/drivers/net/designware.c
47 index 3f5eeb7..02ba393 100644
48 --- a/drivers/net/designware.c
49 +++ b/drivers/net/designware.c
50 @@ -500,7 +500,7 @@ int designware_initialize(u32 id, ulong base_addr, u32 phy_addr)
51 dev->iobase = (int)base_addr;
52 dev->priv = priv;
54 - eth_getenv_enetaddr_by_index(id, &dev->enetaddr[0]);
55 + eth_getenv_enetaddr_by_index("eth", id, &dev->enetaddr[0]);
57 priv->dev = dev;
58 priv->mac_regs_p = (struct eth_mac_regs *)base_addr;
59 diff --git a/drivers/usb/eth/usb_ether.c b/drivers/usb/eth/usb_ether.c
60 index 7b55da3..6565ea5 100644
61 --- a/drivers/usb/eth/usb_ether.c
62 +++ b/drivers/usb/eth/usb_ether.c
63 @@ -80,6 +80,7 @@ int is_eth_dev_on_usb_host(void)
64 */
65 static void probe_valid_drivers(struct usb_device *dev)
66 {
67 + struct eth_device *eth;
68 int j;
70 for (j = 0; prob_dev[j].probe && prob_dev[j].get_info; j++) {
71 @@ -88,9 +89,10 @@ static void probe_valid_drivers(struct usb_device *dev)
72 /*
73 * ok, it is a supported eth device. Get info and fill it in
74 */
75 + eth = &usb_eth[usb_max_eth_dev].eth_dev;
76 if (prob_dev[j].get_info(dev,
77 &usb_eth[usb_max_eth_dev],
78 - &usb_eth[usb_max_eth_dev].eth_dev)) {
79 + eth)) {
80 /* found proper driver */
81 /* register with networking stack */
82 usb_max_eth_dev++;
83 @@ -100,7 +102,10 @@ static void probe_valid_drivers(struct usb_device *dev)
84 * call since eth_current_changed (internally called)
85 * relies on it
86 */
87 - eth_register(&usb_eth[usb_max_eth_dev - 1].eth_dev);
88 + eth_register(eth);
89 + if (eth_write_hwaddr(eth, "usbeth",
90 + usb_max_eth_dev - 1))
91 + puts("Warning: failed to set MAC address\n");
92 break;
93 }
94 }
95 diff --git a/include/net.h b/include/net.h
96 index 018a744..ce54825 100644
97 --- a/include/net.h
98 +++ b/include/net.h
99 @@ -128,7 +128,18 @@ extern int eth_get_dev_index (void); /* get the device index */
100 extern void eth_parse_enetaddr(const char *addr, uchar *enetaddr);
101 extern int eth_getenv_enetaddr(char *name, uchar *enetaddr);
102 extern int eth_setenv_enetaddr(char *name, const uchar *enetaddr);
103 -extern int eth_getenv_enetaddr_by_index(int index, uchar *enetaddr);
104 +
105 +/*
106 + * Get the hardware address for an ethernet interface .
107 + * Args:
108 + * base_name - base name for device (normally "eth")
109 + * index - device index number (0 for first)
110 + * enetaddr - returns 6 byte hardware address
111 + * Returns:
112 + * Return true if the address is valid.
113 + */
114 +extern int eth_getenv_enetaddr_by_index(const char *base_name, int index,
115 + uchar *enetaddr);
117 extern int usb_eth_initialize(bd_t *bi);
118 extern int eth_init(bd_t *bis); /* Initialize the device */
119 @@ -141,6 +152,18 @@ extern int eth_rx(void); /* Check for received packets */
120 extern void eth_halt(void); /* stop SCC */
121 extern char *eth_get_name(void); /* get name of current device */
123 +/*
124 + * Set the hardware address for an ethernet interface based on 'eth%daddr'
125 + * environment variable (or just 'ethaddr' if eth_number is 0).
126 + * Args:
127 + * base_name - base name for device (normally "eth")
128 + * eth_number - value of %d (0 for first device of this type)
129 + * Returns:
130 + * 0 is success, non-zero is error status from driver.
131 + */
132 +int eth_write_hwaddr(struct eth_device *dev, const char *base_name,
133 + int eth_number);
134 +
135 #ifdef CONFIG_MCAST_TFTP
136 int eth_mcast_join( IPaddr_t mcast_addr, u8 join);
137 u32 ether_crc (size_t len, unsigned char const *p);
138 diff --git a/net/eth.c b/net/eth.c
139 index 6523834..b3ea565 100644
140 --- a/net/eth.c
141 +++ b/net/eth.c
142 @@ -54,10 +54,11 @@ int eth_setenv_enetaddr(char *name, const uchar *enetaddr)
143 return setenv(name, buf);
144 }
146 -int eth_getenv_enetaddr_by_index(int index, uchar *enetaddr)
147 +int eth_getenv_enetaddr_by_index(const char *base_name, int index,
148 + uchar *enetaddr)
149 {
150 char enetvar[32];
151 - sprintf(enetvar, index ? "eth%daddr" : "ethaddr", index);
152 + sprintf(enetvar, index ? "%s%daddr" : "%saddr", base_name, index);
153 return eth_getenv_enetaddr(enetvar, enetaddr);
154 }
156 @@ -188,6 +189,38 @@ static void eth_current_changed(void)
157 #endif
158 }
160 +int eth_write_hwaddr(struct eth_device *dev, const char *base_name,
161 + int eth_number)
162 +{
163 + unsigned char env_enetaddr[6];
164 + int ret = 0;
165 +
166 + if (!eth_getenv_enetaddr_by_index(base_name, eth_number, env_enetaddr))
167 + return -1;
168 +
169 + if (memcmp(env_enetaddr, "\0\0\0\0\0\0", 6)) {
170 + if (memcmp(dev->enetaddr, "\0\0\0\0\0\0", 6) &&
171 + memcmp(dev->enetaddr, env_enetaddr, 6)) {
172 + printf("\nWarning: %s MAC addresses don't match:\n",
173 + dev->name);
174 + printf("Address in SROM is %pM\n",
175 + dev->enetaddr);
176 + printf("Address in environment is %pM\n",
177 + env_enetaddr);
178 + }
179 +
180 + memcpy(dev->enetaddr, env_enetaddr, 6);
181 + }
182 +
183 + if (dev->write_hwaddr &&
184 + !eth_mac_skip(eth_number) &&
185 + is_valid_ether_addr(dev->enetaddr)) {
186 + ret = dev->write_hwaddr(dev);
187 + }
188 +
189 + return ret;
190 +}
191 +
192 int eth_register(struct eth_device *dev)
193 {
194 struct eth_device *d;
195 @@ -208,7 +241,6 @@ int eth_register(struct eth_device *dev)
197 int eth_initialize(bd_t *bis)
198 {
199 - unsigned char env_enetaddr[6];
200 int eth_number = 0;
202 eth_devices = NULL;
203 @@ -264,27 +296,8 @@ int eth_initialize(bd_t *bis)
204 if (strchr(dev->name, ' '))
205 puts("\nWarning: eth device name has a space!\n");
207 - eth_getenv_enetaddr_by_index(eth_number, env_enetaddr);
208 -
209 - if (memcmp(env_enetaddr, "\0\0\0\0\0\0", 6)) {
210 - if (memcmp(dev->enetaddr, "\0\0\0\0\0\0", 6) &&
211 - memcmp(dev->enetaddr, env_enetaddr, 6))
212 - {
213 - printf ("\nWarning: %s MAC addresses don't match:\n",
214 - dev->name);
215 - printf ("Address in SROM is %pM\n",
216 - dev->enetaddr);
217 - printf ("Address in environment is %pM\n",
218 - env_enetaddr);
219 - }
220 -
221 - memcpy(dev->enetaddr, env_enetaddr, 6);
222 - }
223 - if (dev->write_hwaddr &&
224 - !eth_mac_skip(eth_number) &&
225 - is_valid_ether_addr(dev->enetaddr)) {
226 - dev->write_hwaddr(dev);
227 - }
228 + if (eth_write_hwaddr(dev, NULL, eth_number))
229 + puts("Warning: failed to set MAC address\n");
231 eth_number++;
232 dev = dev->next;
233 @@ -359,7 +372,8 @@ int eth_init(bd_t *bis)
234 do {
235 uchar env_enetaddr[6];
237 - if (eth_getenv_enetaddr_by_index(eth_number, env_enetaddr))
238 + if (eth_getenv_enetaddr_by_index("eth", eth_number,
239 + env_enetaddr))
240 memcpy(dev->enetaddr, env_enetaddr, 6);
242 ++eth_number;
243 --
244 1.6.6.1