++static char __init *get_uboot_env_var(char *haystack, int haystack_len, char *needle, int needle_len) {
++ int i;
++ for (i = 0; i <= haystack_len - needle_len; i++) {
++ if (memcmp(haystack + i, needle, needle_len) == 0) {
++ return haystack + i + needle_len;
++ }
++ }
++ return NULL;
++}
++
++/*
++ * gigasx76x_parse_hex_* are not uniq. in arm/orion there are also duplicates:
++ * dns323_parse_hex_*
++ * TODO: one day write a patch for this :)
++ */
++static int __init gigasx76x_parse_hex_nibble(char n) {
++ if (n >= '0' && n <= '9')
++ return n - '0';
++
++ if (n >= 'A' && n <= 'F')
++ return n - 'A' + 10;
++
++ if (n >= 'a' && n <= 'f')
++ return n - 'a' + 10;
++
++ return -1;
++}
++
++static int __init gigasx76x_parse_hex_byte(const char *b) {
++ int hi;
++ int lo;
++
++ hi = gigasx76x_parse_hex_nibble(b[0]);
++ lo = gigasx76x_parse_hex_nibble(b[1]);
++
++ if (hi < 0 || lo < 0)
++ return -1;
++
++ return (hi << 4) | lo;
++}
++
++static int __init gigasx76x_register_ethernet(void) {
++ u_int8_t addr[6];
++ int i;
++ char *uboot_env_page;
++ char *mac;
++
++ uboot_env_page = ioremap(LTQ_FLASH_START + UBOOT_ENV_OFFSET, UBOOT_ENV_SIZE);
++ if (!uboot_env_page)
++ return -ENOMEM;
++
++ mac = get_uboot_env_var(uboot_env_page, UBOOT_ENV_SIZE, "\0ethaddr=", 9);
++
++ if (!mac) {
++ goto error_fail;
++ }
++
++ /* Sanity check the string we're looking at */
++ for (i = 0; i < 5; i++) {
++ if (*(mac + (i * 3) + 2) != ':') {
++ goto error_fail;
++ }
++ }
++
++ for (i = 0; i < 6; i++) {
++ int byte;
++ byte = gigasx76x_parse_hex_byte(mac + (i * 3));
++ if (byte < 0) {
++ goto error_fail;
++ }
++ addr[i] = byte;
++ }
++
++ iounmap(uboot_env_page);
++ printk("GIGASX76X: Found ethernet MAC address: ");
++ for (i = 0; i < 6; i++)
++ printk("%.2x%s", addr[i], (i < 5) ? ":" : ".\n");
++
++ memcpy(<q_eth_data.mac.sa_data, addr, 6);
++ ltq_register_etop(<q_eth_data);
++
++ return 0;
++
++ error_fail:
++ iounmap(uboot_env_page);
++ return -EINVAL;
++}
++
++static void __init gigasx76x_init(void) {
++#define GIGASX76X_USB 29
++#define GIGASX76X_MADWIFI_ADDR 0xb07f0000