diff options
-rw-r--r-- | arch/arm/mach-orion5x/ts209-setup.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/arch/arm/mach-orion5x/ts209-setup.c b/arch/arm/mach-orion5x/ts209-setup.c index 71b0cffa2fe0..fd43863a86f6 100644 --- a/arch/arm/mach-orion5x/ts209-setup.c +++ b/arch/arm/mach-orion5x/ts209-setup.c | |||
@@ -188,6 +188,87 @@ static struct mv643xx_eth_platform_data qnap_ts209_eth_data = { | |||
188 | .force_phy_addr = 1, | 188 | .force_phy_addr = 1, |
189 | }; | 189 | }; |
190 | 190 | ||
191 | static int __init parse_hex_nibble(char n) | ||
192 | { | ||
193 | if (n >= '0' && n <= '9') | ||
194 | return n - '0'; | ||
195 | |||
196 | if (n >= 'A' && n <= 'F') | ||
197 | return n - 'A' + 10; | ||
198 | |||
199 | if (n >= 'a' && n <= 'f') | ||
200 | return n - 'a' + 10; | ||
201 | |||
202 | return -1; | ||
203 | } | ||
204 | |||
205 | static int __init parse_hex_byte(const char *b) | ||
206 | { | ||
207 | int hi; | ||
208 | int lo; | ||
209 | |||
210 | hi = parse_hex_nibble(b[0]); | ||
211 | lo = parse_hex_nibble(b[1]); | ||
212 | |||
213 | if (hi < 0 || lo < 0) | ||
214 | return -1; | ||
215 | |||
216 | return (hi << 4) | lo; | ||
217 | } | ||
218 | |||
219 | static int __init check_mac_addr(const char *addr_str) | ||
220 | { | ||
221 | u_int8_t addr[6]; | ||
222 | int i; | ||
223 | |||
224 | for (i = 0; i < 6; i++) { | ||
225 | int byte; | ||
226 | |||
227 | /* | ||
228 | * Enforce "xx:xx:xx:xx:xx:xx\n" format. | ||
229 | */ | ||
230 | if (addr_str[(i * 3) + 2] != ((i < 5) ? ':' : '\n')) | ||
231 | return -1; | ||
232 | |||
233 | byte = parse_hex_byte(addr_str + (i * 3)); | ||
234 | if (byte < 0) | ||
235 | return -1; | ||
236 | addr[i] = byte; | ||
237 | } | ||
238 | |||
239 | printk(KERN_INFO "ts209: found ethernet mac address "); | ||
240 | for (i = 0; i < 6; i++) | ||
241 | printk("%.2x%s", addr[i], (i < 5) ? ":" : ".\n"); | ||
242 | |||
243 | memcpy(qnap_ts209_eth_data.mac_addr, addr, 6); | ||
244 | |||
245 | return 0; | ||
246 | } | ||
247 | |||
248 | /* | ||
249 | * The 'NAS Config' flash partition has an ext2 filesystem which | ||
250 | * contains a file that has the ethernet MAC address in plain text | ||
251 | * (format "xx:xx:xx:xx:xx:xx\n".) | ||
252 | */ | ||
253 | static void __init ts209_find_mac_addr(void) | ||
254 | { | ||
255 | unsigned long addr; | ||
256 | |||
257 | for (addr = 0x00700000; addr < 0x00760000; addr += 1024) { | ||
258 | char *nor_page; | ||
259 | int ret = 0; | ||
260 | |||
261 | nor_page = ioremap(QNAP_TS209_NOR_BOOT_BASE + addr, 1024); | ||
262 | if (nor_page != NULL) { | ||
263 | ret = check_mac_addr(nor_page); | ||
264 | iounmap(nor_page); | ||
265 | } | ||
266 | |||
267 | if (ret == 0) | ||
268 | break; | ||
269 | } | ||
270 | } | ||
271 | |||
191 | /***************************************************************************** | 272 | /***************************************************************************** |
192 | * RTC S35390A on I2C bus | 273 | * RTC S35390A on I2C bus |
193 | ****************************************************************************/ | 274 | ****************************************************************************/ |
@@ -342,7 +423,9 @@ static void __init qnap_ts209_init(void) | |||
342 | pr_warning("qnap_ts209_init: failed to get RTC IRQ\n"); | 423 | pr_warning("qnap_ts209_init: failed to get RTC IRQ\n"); |
343 | i2c_register_board_info(0, &qnap_ts209_i2c_rtc, 1); | 424 | i2c_register_board_info(0, &qnap_ts209_i2c_rtc, 1); |
344 | 425 | ||
426 | ts209_find_mac_addr(); | ||
345 | orion5x_eth_init(&qnap_ts209_eth_data); | 427 | orion5x_eth_init(&qnap_ts209_eth_data); |
428 | |||
346 | orion5x_sata_init(&qnap_ts209_sata_data); | 429 | orion5x_sata_init(&qnap_ts209_sata_data); |
347 | } | 430 | } |
348 | 431 | ||