示例#1
0
/* 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;
}