void ath6kl_mangle_mac_address(struct ath6kl *ar, u8 locally_administered_bit)
{
	u8 *ptr_mac;
	int i, ret;
	u8 *macbuf;

	switch (ar->target_type) {
	case TARGET_TYPE_AR6003:
		ptr_mac = ar->fw_board + AR6003_MAC_ADDRESS_OFFSET;
		break;
	case TARGET_TYPE_AR6004:
		ptr_mac = ar->fw_board + AR6004_MAC_ADDRESS_OFFSET;
		break;
	default:
		ath6kl_err("Invalid Target Type\n");
		return;
	}

/* #if 0 mac address issue - It sometimes changed macaddress */
	ath6kl_dbg(ATH6KL_DBG_BOOT,
		   "MAC from EEPROM %02X:%02X:%02X:%02X:%02X:%02X\n",
		   ptr_mac[0], ptr_mac[1], ptr_mac[2],
		   ptr_mac[3], ptr_mac[4], ptr_mac[5]);
/* #endif */

	ret = ath6kl_fetch_nvmac_info(ar);

	if (ret) {
		ath6kl_err("MAC address nvmac file not found\n");
		return;
	}
	macbuf = kmalloc(ath6kl_softmac_len + 1, GFP_ATOMIC);
	if (macbuf) {
		unsigned int softmac[6];
		memcpy(macbuf, ath6kl_softmac, ath6kl_softmac_len);
		macbuf[ath6kl_softmac_len] = '\0';

		if (sscanf(macbuf, "%02x:%02x:%02x:%02x:%02x:%02x",
				   &softmac[0], &softmac[1], &softmac[2],
				   &softmac[3], &softmac[4], &softmac[5])
				 == 6) {

			for (i = 0; i < 6; ++i)
				ptr_mac[i] = softmac[i] & 0xff;
	}

		ath6kl_dbg(ATH6KL_DBG_BOOT,
			"MAC from SoftMAC %02X_%02X:%02X\n",
			ptr_mac[0], ptr_mac[4], ptr_mac[5]);
		}
	vfree(ath6kl_softmac);

	if (locally_administered_bit)
		ptr_mac[0] |= 0x02;

	ath6kl_calculate_crc(ar->target_type, ar->fw_board, ar->fw_board_len);
}
Exemplo n.º 2
0
void ath6kl_mangle_mac_address(struct ath6kl *ar)
{
	u8 *ptr_mac;
	int i, ret;
#ifdef CONFIG_MACH_PX
	unsigned int softmac[6];
#endif

	switch (ar->target_type) {
	case TARGET_TYPE_AR6003:
		ptr_mac = ar->fw_board + AR6003_MAC_ADDRESS_OFFSET;
		break;
	case TARGET_TYPE_AR6004:
		ptr_mac = ar->fw_board + AR6004_MAC_ADDRESS_OFFSET;
		break;
	default:
		ath6kl_err("Invalid Target Type\n");
		return;
	}

#if 0
	ath6kl_dbg(ATH6KL_DBG_BOOT,
		   "MAC from EEPROM %02X:%02X:%02X:%02X:%02X:%02X\n",
		   ptr_mac[0], ptr_mac[1], ptr_mac[2],
		   ptr_mac[3], ptr_mac[4], ptr_mac[5]);
#endif

#ifdef CONFIG_MACH_PX
	ret = ath6kl_fetch_nvmac_info(ar);

	if (ret) {
		ath6kl_err("MAC address file not found\n");
		return;
	}

	if (sscanf(ath6kl_softmac, "%02x:%02x:%02x:%02x:%02x:%02x",
			   &softmac[0], &softmac[1], &softmac[2],
			   &softmac[3], &softmac[4], &softmac[5])==6) {

		for (i=0; i<6; ++i) {
			ptr_mac[i] = softmac[i] & 0xff;
		}
	}

	ath6kl_dbg(ATH6KL_DBG_BOOT,
		   "MAC from SoftMAC %02X_%02X:%02X\n",
		   ptr_mac[0], ptr_mac[4], ptr_mac[5]);
	vfree(ath6kl_softmac);
#else
	ret = ath6kl_fetch_mac_file(ar);
	if (ret) {
		ath6kl_err("MAC address file not found\n");
		return;
	}

	for (i = 0; i < ETH_ALEN; ++i) {
	   ptr_mac[i] = ath6kl_softmac[i] & 0xff;
	}

	kfree(ath6kl_softmac);
#endif

	ath6kl_calculate_crc(ar->target_type, ar->fw_board, ar->fw_board_len);
}