/* get permanent mac address from * 0: success * non-0:fail */ u16 l1f_get_perm_macaddr(struct alx_hw *hw, u8 *addr) { u32 val, mac0, mac1; u16 flag, i; #define INTN_LOADED 0x1 #define EXTN_LOADED 0x2 flag = 0; val = 0; read_mcadr: /* get it from register first */ alx_mem_r32(hw, L1F_STAD0, &mac0); alx_mem_r32(hw, L1F_STAD1, &mac1); *(u32 *)(addr + 2) = LX_SWAP_DW(mac0); *(u16 *)addr = (u16)LX_SWAP_W((u16)mac1); if (macaddr_valid(addr)) return 0; if ((flag & INTN_LOADED) == 0) { /* load from efuse ? */ for (i = 0; i < L1F_SLD_MAX_TO; i++) { alx_mem_r32(hw, L1F_SLD, &val); if ((val & (L1F_SLD_STAT | L1F_SLD_START)) == 0) break; mdelay(1); } if (i == L1F_SLD_MAX_TO) goto out; alx_mem_w32(hw, L1F_SLD, val | L1F_SLD_START); for (i = 0; i < L1F_SLD_MAX_TO; i++) { mdelay(1); alx_mem_r32(hw, L1F_SLD, &val); if ((val & L1F_SLD_START) == 0) break; } if (i == L1F_SLD_MAX_TO) goto out; flag |= INTN_LOADED; goto read_mcadr; } if ((flag & EXTN_LOADED) == 0) { alx_mem_r32(hw, L1F_EFLD, &val); if ((val & (L1F_EFLD_F_EXIST | L1F_EFLD_E_EXIST)) != 0) { /* load from eeprom/flash ? */ for (i = 0; i < L1F_SLD_MAX_TO; i++) { alx_mem_r32(hw, L1F_EFLD, &val); if ((val & (L1F_EFLD_STAT | L1F_EFLD_START)) == 0) { break; } mdelay(1); } if (i == L1F_SLD_MAX_TO) goto out; alx_mem_w32(hw, L1F_EFLD, val | L1F_EFLD_START); for (i = 0; i < L1F_SLD_MAX_TO; i++) { mdelay(1); alx_mem_r32(hw, L1F_EFLD, &val); if ((val & L1F_EFLD_START) == 0) break; } if (i == L1F_SLD_MAX_TO) goto out; flag |= EXTN_LOADED; goto read_mcadr; } } out: return LX_ERR_ALOAD; }
int get_mac_addr(char* mac) { int status; char filename[128]; char filebuf[128]; RWLOCK_INIT(&mac_lock); RWLOCK_WLOCK(&mac_lock); memset(filebuf, 0, 128); printk("%s : enter\n", __func__); // 1. if "mac.bin" exist ? make_filename(filename, sizeof(filename), "mac.bin"); status = mac_read_file(filebuf, filename); if(status < 0) { //printk("Not find file: %s!\n", filename); } else { printk("Find file: %s \n", filename); memcpy(&(registry.general.macAddress), filebuf, 6); goto _exit; } #if 0 // 2. if mib file mac available ? if(macaddr_valid(mac, 6)) { printk("Find mac in mib file or EEPROM\n"); memcpy(filebuf, mac, 6); goto _exit; } #endif #ifdef WINNER_SN2MAC // 2. if mac.sn exist ? make_filename(filename, sizeof(filename), "mac.sn"); status = mac_read_file(filebuf, filename); if(status < 0) { if(sn_to_mac(filebuf)==TRUE) { printk("sn_to_mac : %02X:%02X:%02X:%02X:%02X:%02X\n", filebuf[0], filebuf[1], filebuf[2], filebuf[3], filebuf[4], filebuf[5]); mac_write_file(filebuf, 6, filename); goto _exit; } } else { printk("Find file %s\n", filename); goto _exit; } #endif // 3. if mac.random exist ? make_filename(filename, sizeof(filename), "mac.random"); status = mac_read_file(filebuf, filename); if(status < 0) { //printk("Not find file: %s!\n", filename); } else { printk("Find file %s\n", filename); goto _exit; } // 4. mac.random not exist, generate it printk("No mac , generate random one!\n"); WiFiEngine_RandomMAC(0, filebuf, 6); memcpy(filebuf, MAC_PREFIX, strlen(MAC_PREFIX)); //mac_write_file(filebuf, 6, filename); _exit: RWLOCK_WUNLOCK(&mac_lock); memcpy(mac, filebuf, 6); printk("mac = %02X:%02X:%02X:%02X:%02X:%02X\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); return 0; }