21373 lines
657 KiB
C
Executable File
21373 lines
657 KiB
C
Executable File
/*
|
|
* Routines to access hardware
|
|
*
|
|
* $Id: 8192cd_hw.c,v 1.107.2.43 2011/01/17 13:21:01 victoryman Exp $
|
|
*
|
|
* Copyright (c) 2009 Realtek Semiconductor Corp.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#define _8192CD_HW_C_
|
|
|
|
#ifdef __KERNEL__
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/init.h>
|
|
#include <asm/uaccess.h>
|
|
#include <linux/fcntl.h>
|
|
#include <linux/fs.h>
|
|
#include <linux/file.h>
|
|
#include <asm/unistd.h>
|
|
#elif defined(__ECOS)
|
|
#include <cyg/io/eth/rltk/819x/wrapper/sys_support.h>
|
|
#include <cyg/io/eth/rltk/819x/wrapper/skbuff.h>
|
|
#include <cyg/io/eth/rltk/819x/wrapper/timer.h>
|
|
#include <cyg/io/eth/rltk/819x/wrapper/wrapper.h>
|
|
#endif
|
|
|
|
#include "./8192cd_cfg.h"
|
|
#include "./8192cd.h"
|
|
#include "./8192cd_hw.h"
|
|
#include "./8192cd_headers.h"
|
|
#include "./8192cd_debug.h"
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
#include "Hal8188EPwrSeq.h"
|
|
#endif
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
#include "Hal8812PwrSeq.h"
|
|
#endif
|
|
|
|
#ifdef __KERNEL__
|
|
#ifdef __LINUX_2_6__
|
|
#include <linux/syscalls.h>
|
|
#else
|
|
#include <linux/fs.h>
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef USE_RTL8186_SDK
|
|
#ifdef CONFIG_RTL8672
|
|
#ifdef USE_RLX_BSP
|
|
#include <bspchip.h>
|
|
#include <gpio.h>
|
|
|
|
#ifdef CONFIG_RTL_8196C
|
|
#undef CONFIG_RTL_8196C
|
|
#endif
|
|
#ifdef CONFIG_RTL8196C_REVISION_B
|
|
#undef CONFIG_RTL8196C_REVISION_B
|
|
#endif
|
|
|
|
#else
|
|
#include <platform.h>
|
|
#include "../../../arch/mips/realtek/rtl8672/gpio.h"
|
|
#endif
|
|
#else
|
|
|
|
#if defined(__LINUX_2_6__)
|
|
#if defined(CONFIG_OPENWRT_SDK) && !defined(CONFIG_ARCH_CPU_RLX)
|
|
#include <asm/mach-realtek/bspchip.h>
|
|
#else
|
|
#include <bsp/bspchip.h>
|
|
#endif //CONFIG_OPENWRT_SDK
|
|
#else
|
|
#ifndef __ECOS
|
|
#include <asm/rtl865x/platform.h>
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
#endif // USE_RTL8186_SDK
|
|
|
|
|
|
#define MAX_CONFIG_FILE_SIZE (20*1024) // for 8192, added to 20k
|
|
|
|
int rtl8192cd_fileopen(const char *filename, int flags, int mode);
|
|
void selectMinPowerIdex(struct rtl8192cd_priv *priv);
|
|
void PHY_RF6052SetOFDMTxPower(struct rtl8192cd_priv *priv, unsigned int channel);
|
|
void PHY_RF6052SetCCKTxPower(struct rtl8192cd_priv *priv, unsigned int channel);
|
|
#if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT) || (defined(CONFIG_RTL_88E_SUPPORT) && defined(__KERNEL__) && (defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI))) || defined(CONFIG_RTL_8812_SUPPORT)
|
|
static void rtl8192cd_ReadFwHdr(struct rtl8192cd_priv * priv);
|
|
#endif
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
static int Load_92C_Firmware(struct rtl8192cd_priv *priv);
|
|
#endif
|
|
|
|
|
|
|
|
#define VAR_MAPPING(dst,src) \
|
|
unsigned char *data_##dst##_start = &data_##src[0]; \
|
|
unsigned char *data_##dst##_end = &data_##src[sizeof(data_##src)]; \
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
#include "data_PHY_REG_n.c"
|
|
#include "data_AGC_TAB_n.c"
|
|
#include "data_AGC_TAB_2G_n.c"
|
|
#include "data_AGC_TAB_5G_n.c"
|
|
#include "data_radio_a_n.c"
|
|
#include "data_radio_b_n.c"
|
|
#ifdef RTL8192D_INT_PA
|
|
#ifdef USB_POWER_SUPPORT
|
|
|
|
#if defined (RTL8192D_INT_PA_GAIN_TABLE_NEW)
|
|
#include "data_radio_a_intPA_GM_new.c"
|
|
#include "data_radio_b_intPA_GM_new.c"
|
|
#elif defined (RTL8192D_INT_PA_GAIN_TABLE_NEW1)
|
|
#include "data_radio_a_intPA_GM_new1.c"
|
|
#include "data_radio_b_intPA_GM_new1.c"
|
|
#else
|
|
#include "data_radio_a_intPA_GM.c"
|
|
#include "data_radio_b_intPA_GM.c"
|
|
#endif
|
|
|
|
#else // USB_POWER_SUPPORT
|
|
|
|
#if defined (RTL8192D_INT_PA_GAIN_TABLE_NEW)
|
|
#include "data_radio_a_intPA_new.c"
|
|
#include "data_radio_b_intPA_new.c"
|
|
#else
|
|
#include "data_radio_a_intPA.c"
|
|
#include "data_radio_b_intPA.c"
|
|
#endif
|
|
|
|
#endif // USB_POWER_SUPPORT
|
|
#endif // RTL8192D_INT_PA
|
|
//_TXPWR_REDEFINE
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
#include "data_AGC_TAB_n_92d_hp.c"
|
|
#include "data_PHY_REG_n_92d_hp.c"
|
|
#include "data_radio_a_n_92d_hp.c"
|
|
#include "data_radio_b_n_92d_hp.c"
|
|
#include "data_PHY_REG_PG_92d_hp.c"
|
|
#endif
|
|
#include "data_PHY_REG_PG.c"
|
|
#include "data_PHY_REG_PG_FCC.c"
|
|
#include "data_PHY_REG_PG_CE.c"
|
|
|
|
#ifdef _TRACKING_TABLE_FILE
|
|
#include "data_REG_TXPWR_TRK_n_92d.c"
|
|
#include "data_REG_TXPWR_TRK_n_92d_hp.c"
|
|
#endif
|
|
#include "data_PHY_REG_MP_n.c"
|
|
#include "data_MACPHY_REG.c"
|
|
#include "data_rtl8192dfw_n.c"
|
|
VAR_MAPPING(PHY_REG_n, PHY_REG_n);
|
|
VAR_MAPPING(AGC_TAB_n, AGC_TAB_n);
|
|
VAR_MAPPING(AGC_TAB_2G_n, AGC_TAB_2G_n);
|
|
VAR_MAPPING(AGC_TAB_5G_n, AGC_TAB_5G_n);
|
|
VAR_MAPPING(radio_a_n, radio_a_n);
|
|
VAR_MAPPING(radio_b_n, radio_b_n);
|
|
#ifdef RTL8192D_INT_PA
|
|
#ifdef USB_POWER_SUPPORT
|
|
|
|
#if defined (RTL8192D_INT_PA_GAIN_TABLE_NEW)
|
|
VAR_MAPPING(radio_a_intPA_GM_new, radio_a_intPA_GM_new);
|
|
VAR_MAPPING(radio_b_intPA_GM_new, radio_b_intPA_GM_new);
|
|
#elif defined (RTL8192D_INT_PA_GAIN_TABLE_NEW1)
|
|
VAR_MAPPING(radio_a_intPA_GM_new1, radio_a_intPA_GM_new1);
|
|
VAR_MAPPING(radio_b_intPA_GM_new1, radio_b_intPA_GM_new1);
|
|
#else
|
|
VAR_MAPPING(radio_a_intPA_GM, radio_a_intPA_GM);
|
|
VAR_MAPPING(radio_b_intPA_GM, radio_b_intPA_GM);
|
|
#endif
|
|
|
|
#else // USB_POWER_SUPPORT
|
|
|
|
#if defined (RTL8192D_INT_PA_GAIN_TABLE_NEW)
|
|
VAR_MAPPING(radio_a_intPA_new, radio_a_intPA_new);
|
|
VAR_MAPPING(radio_b_intPA_new, radio_b_intPA_new);
|
|
#else
|
|
VAR_MAPPING(radio_a_intPA, radio_a_intPA);
|
|
VAR_MAPPING(radio_b_intPA, radio_b_intPA);
|
|
#endif
|
|
|
|
#endif // USB_POWER_SUPPORT
|
|
#endif // RTL8192D_INT_PA
|
|
//_TXPWR_REDEFINE
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
VAR_MAPPING(AGC_TAB_n_92d_hp, AGC_TAB_n_92d_hp);
|
|
VAR_MAPPING(PHY_REG_n_92d_hp, PHY_REG_n_92d_hp);
|
|
VAR_MAPPING(radio_a_n_92d_hp, radio_a_n_92d_hp);
|
|
VAR_MAPPING(radio_b_n_92d_hp, radio_b_n_92d_hp);
|
|
VAR_MAPPING(PHY_REG_PG_92d_hp, PHY_REG_PG_92d_hp);
|
|
#endif
|
|
VAR_MAPPING(PHY_REG_PG, PHY_REG_PG);
|
|
VAR_MAPPING(PHY_REG_PG_FCC, PHY_REG_PG_FCC);
|
|
VAR_MAPPING(PHY_REG_PG_CE, PHY_REG_PG_CE);
|
|
#ifdef TXPWR_LMT
|
|
#include "TXPWR_92D.h"
|
|
#endif // TXPWR_LMT
|
|
#ifdef _TRACKING_TABLE_FILE
|
|
VAR_MAPPING(REG_TXPWR_TRK_n_92d, REG_TXPWR_TRK_n_92d);
|
|
VAR_MAPPING(REG_TXPWR_TRK_n_92d_hp, REG_TXPWR_TRK_n_92d_hp);
|
|
#endif
|
|
VAR_MAPPING(PHY_REG_MP_n, PHY_REG_MP_n);
|
|
VAR_MAPPING(MACPHY_REG, MACPHY_REG);
|
|
VAR_MAPPING(rtl8192dfw_n, rtl8192dfw_n);
|
|
#endif // CONFIG_RTL_92D_SUPPORT
|
|
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
|
|
#ifdef TESTCHIP_SUPPORT
|
|
#include "data_AGC_TAB.c"
|
|
#include "data_PHY_REG_1T.c"
|
|
#include "data_PHY_REG_2T.c"
|
|
#include "data_radio_a_1T.c"
|
|
#include "data_radio_a_2T.c"
|
|
#include "data_radio_b_2T.c"
|
|
#include "data_rtl8192cfw.c"
|
|
#endif
|
|
|
|
#include "data_AGC_TAB_n_92C.c"
|
|
#include "data_PHY_REG_1T_n.c"
|
|
#include "data_PHY_REG_2T_n.c"
|
|
#include "data_PHY_REG_2T_n_lna.c"
|
|
#include "data_radio_a_2T_n.c"
|
|
#include "data_radio_b_2T_n.c"
|
|
#include "data_radio_a_1T_n.c"
|
|
#include "data_rtl8192cfwn.c"
|
|
#include "data_rtl8192cfwua.c"
|
|
|
|
|
|
#include "data_PHY_REG_PG_92C.c"
|
|
#include "data_MACPHY_REG_92C.c"
|
|
#include "data_PHY_REG_MP_n_92C.c"
|
|
|
|
#include "data_AGC_TAB_n_hp.c"
|
|
#include "data_PHY_REG_2T_n_hp.c"
|
|
#include "data_radio_a_2T_n_lna.c"
|
|
#include "data_radio_b_2T_n_lna.c"
|
|
#include "data_PHY_REG_1T_n_hp.c"
|
|
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
#include "data_radio_a_2T_n_hp.c"
|
|
#include "data_radio_b_2T_n_hp.c"
|
|
#include "data_PHY_REG_PG_hp.c"
|
|
#endif
|
|
|
|
#ifdef _TRACKING_TABLE_FILE
|
|
#include "data_REG_TXPWR_TRK.c"
|
|
#include "data_REG_TXPWR_TRK_hp.c"
|
|
#endif
|
|
|
|
#ifdef TXPWR_LMT
|
|
#include "TXPWR_92C.h"
|
|
#endif // TXPWR_LMT
|
|
|
|
|
|
|
|
|
|
#define VAR_MAPPING(dst,src) \
|
|
unsigned char *data_##dst##_start = &data_##src[0]; \
|
|
unsigned char *data_##dst##_end = &data_##src[sizeof(data_##src)]; \
|
|
|
|
#ifdef TESTCHIP_SUPPORT
|
|
VAR_MAPPING(AGC_TAB, AGC_TAB);
|
|
VAR_MAPPING(PHY_REG_1T, PHY_REG_1T);
|
|
VAR_MAPPING(PHY_REG_2T, PHY_REG_2T);
|
|
VAR_MAPPING(radio_a_1T, radio_a_1T);
|
|
VAR_MAPPING(radio_a_2T, radio_a_2T);
|
|
VAR_MAPPING(radio_b_2T, radio_b_2T);
|
|
VAR_MAPPING(rtl8192cfw, rtl8192cfw);
|
|
#endif
|
|
|
|
VAR_MAPPING(AGC_TAB_n_92C, AGC_TAB_n_92C);
|
|
VAR_MAPPING(PHY_REG_1T_n, PHY_REG_1T_n);
|
|
VAR_MAPPING(PHY_REG_2T_n, PHY_REG_2T_n);
|
|
VAR_MAPPING(PHY_REG_2T_n_lna, PHY_REG_2T_n_lna);
|
|
VAR_MAPPING(radio_a_1T_n, radio_a_1T_n);
|
|
VAR_MAPPING(radio_a_2T_n, radio_a_2T_n);
|
|
VAR_MAPPING(radio_b_2T_n, radio_b_2T_n);
|
|
VAR_MAPPING(rtl8192cfw_n, rtl8192cfwn);
|
|
VAR_MAPPING(rtl8192cfw_ua, rtl8192cfwua);
|
|
|
|
VAR_MAPPING(MACPHY_REG_92C, MACPHY_REG_92C);
|
|
VAR_MAPPING(PHY_REG_PG_92C, PHY_REG_PG_92C);
|
|
VAR_MAPPING(PHY_REG_MP_n_92C, PHY_REG_MP_n_92C);
|
|
|
|
VAR_MAPPING(AGC_TAB_n_hp, AGC_TAB_n_hp);
|
|
VAR_MAPPING(PHY_REG_2T_n_hp, PHY_REG_2T_n_hp);
|
|
VAR_MAPPING(PHY_REG_1T_n_hp, PHY_REG_1T_n_hp);
|
|
VAR_MAPPING(radio_a_2T_n_lna, radio_a_2T_n_lna);
|
|
VAR_MAPPING(radio_b_2T_n_lna, radio_b_2T_n_lna);
|
|
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
VAR_MAPPING(radio_a_2T_n_hp, radio_a_2T_n_hp);
|
|
VAR_MAPPING(radio_b_2T_n_hp, radio_b_2T_n_hp);
|
|
VAR_MAPPING(PHY_REG_PG_hp, PHY_REG_PG_hp);
|
|
#endif
|
|
|
|
#ifdef _TRACKING_TABLE_FILE
|
|
VAR_MAPPING(REG_TXPWR_TRK, REG_TXPWR_TRK);
|
|
VAR_MAPPING(REG_TXPWR_TRK_hp, REG_TXPWR_TRK_hp);
|
|
#endif
|
|
|
|
#endif // CONFIG_RTL_92C_SUPPORT
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
#include "data_PHY_REG_PG_88E.c"
|
|
|
|
VAR_MAPPING(PHY_REG_PG_88E, PHY_REG_PG_88E);
|
|
|
|
#include "data_PHY_REG_PG_88E_new.c"
|
|
VAR_MAPPING(PHY_REG_PG_88E_new, PHY_REG_PG_88E_new);
|
|
#ifdef TXPWR_LMT_88E
|
|
#include "data_TXPWR_LMT_88E_new.c"
|
|
VAR_MAPPING(TXPWR_LMT_88E_new, TXPWR_LMT_88E_new);
|
|
#endif
|
|
|
|
#endif // CONFIG_RTL_88E_SUPPORT
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
#include "data_AGC_TAB_8812.c"
|
|
#include "data_MAC_REG_8812.c"
|
|
#include "data_PHY_REG_8812.c"
|
|
#include "data_PHY_REG_MP_8812.c"
|
|
#include "data_PHY_REG_PG_8812.c"
|
|
#include "data_RadioA_8812.c"
|
|
#include "data_RadioB_8812.c"
|
|
#include "data_rtl8812fw.c"
|
|
#ifdef _TRACKING_TABLE_FILE
|
|
#include "data_REG_TXPWR_TRK_8812.c"
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
#include "data_REG_TXPWR_TRK_8812_hp.c"
|
|
#include "data_PHY_REG_PG_8812_hp.c"
|
|
VAR_MAPPING(PHY_REG_PG_8812_hp, PHY_REG_PG_8812_hp);
|
|
#endif
|
|
|
|
#include "data_PHY_REG_PG_8812_new.c"
|
|
VAR_MAPPING(PHY_REG_PG_8812_new, PHY_REG_PG_8812_new);
|
|
#ifdef TXPWR_LMT_8812
|
|
#include "data_TXPWR_LMT_8812_new.c"
|
|
VAR_MAPPING(TXPWR_LMT_8812_new, TXPWR_LMT_8812_new);
|
|
#endif
|
|
|
|
#endif
|
|
|
|
VAR_MAPPING(rtl8812fw, rtl8812fw);
|
|
VAR_MAPPING(AGC_TAB_8812, AGC_TAB_8812);
|
|
VAR_MAPPING(MAC_REG_8812, MAC_REG_8812);
|
|
VAR_MAPPING(PHY_REG_8812, PHY_REG_8812);
|
|
VAR_MAPPING(PHY_REG_MP_8812, PHY_REG_MP_8812);
|
|
VAR_MAPPING(PHY_REG_PG_8812, PHY_REG_PG_8812);
|
|
VAR_MAPPING(RadioA_8812, RadioA_8812);
|
|
VAR_MAPPING(RadioB_8812, RadioB_8812);
|
|
#ifdef _TRACKING_TABLE_FILE
|
|
VAR_MAPPING(REG_TXPWR_TRK_8812, REG_TXPWR_TRK_8812);
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
VAR_MAPPING(REG_TXPWR_TRK_8812_hp, REG_TXPWR_TRK_8812_hp);
|
|
#endif
|
|
#endif
|
|
|
|
//FOR_8812_MP_CHIP
|
|
#include "data_MAC_REG_8812_n.c"
|
|
#include "data_AGC_TAB_8812_n_default.c"
|
|
#include "data_PHY_REG_8812_n_default.c"
|
|
#include "data_RadioA_8812_n_default.c"
|
|
#include "data_RadioB_8812_n_default.c"
|
|
#include "data_rtl8812fw_n.c"
|
|
#ifdef AC2G_256QAM
|
|
#include "data_rtl8812fw_n_2g.c"
|
|
VAR_MAPPING(rtl8812fw_n_2g, rtl8812fw_n_2g);
|
|
#endif
|
|
VAR_MAPPING(MAC_REG_8812_n, MAC_REG_8812_n);
|
|
VAR_MAPPING(rtl8812fw_n, rtl8812fw_n);
|
|
VAR_MAPPING(AGC_TAB_8812_n_default, AGC_TAB_8812_n_default);
|
|
VAR_MAPPING(PHY_REG_8812_n_default, PHY_REG_8812_n_default);
|
|
VAR_MAPPING(RadioA_8812_n_default, RadioA_8812_n_default);
|
|
VAR_MAPPING(RadioB_8812_n_default, RadioB_8812_n_default);
|
|
#include "data_AGC_TAB_8812_n_extlna.c"
|
|
#include "data_PHY_REG_8812_n_extlna.c"
|
|
#include "data_RadioA_8812_n_extlna.c"
|
|
#include "data_RadioB_8812_n_extlna.c"
|
|
VAR_MAPPING(AGC_TAB_8812_n_extlna, AGC_TAB_8812_n_extlna);
|
|
VAR_MAPPING(PHY_REG_8812_n_extlna, PHY_REG_8812_n_extlna);
|
|
VAR_MAPPING(RadioA_8812_n_extlna, RadioA_8812_n_extlna);
|
|
VAR_MAPPING(RadioB_8812_n_extlna, RadioB_8812_n_extlna);
|
|
#include "data_AGC_TAB_8812_n_extpa.c"
|
|
#include "data_PHY_REG_8812_n_extpa.c"
|
|
#include "data_RadioA_8812_n_extpa.c"
|
|
#include "data_RadioB_8812_n_extpa.c"
|
|
VAR_MAPPING(AGC_TAB_8812_n_extpa, AGC_TAB_8812_n_extpa);
|
|
VAR_MAPPING(PHY_REG_8812_n_extpa, PHY_REG_8812_n_extpa);
|
|
VAR_MAPPING(RadioA_8812_n_extpa, RadioA_8812_n_extpa);
|
|
VAR_MAPPING(RadioB_8812_n_extpa, RadioB_8812_n_extpa);
|
|
|
|
#ifdef HIGH_POWER_EXT_PA //FOR_8812_HP
|
|
#include "data_AGC_TAB_8812_hp.c"
|
|
#include "data_RadioA_8812_hp.c"
|
|
#include "data_RadioB_8812_hp.c"
|
|
VAR_MAPPING(AGC_TAB_8812_hp, AGC_TAB_8812_hp);
|
|
VAR_MAPPING(RadioA_8812_hp, RadioA_8812_hp);
|
|
VAR_MAPPING(RadioB_8812_hp, RadioB_8812_hp);
|
|
|
|
//FOR_8812_MP_CHIP
|
|
#include "data_AGC_TAB_8812_n_hp.c"
|
|
#include "data_PHY_REG_8812_n_hp.c"
|
|
#include "data_RadioA_8812_n_hp.c"
|
|
#include "data_RadioB_8812_n_hp.c"
|
|
#include "data_RadioA_8812_n_ultra_hp.c"
|
|
#include "data_RadioB_8812_n_ultra_hp.c"
|
|
|
|
VAR_MAPPING(AGC_TAB_8812_n_hp, AGC_TAB_8812_n_hp);
|
|
VAR_MAPPING(PHY_REG_8812_n_hp, PHY_REG_8812_n_hp);
|
|
VAR_MAPPING(RadioA_8812_n_hp, RadioA_8812_n_hp);
|
|
VAR_MAPPING(RadioB_8812_n_hp, RadioB_8812_n_hp);
|
|
VAR_MAPPING(RadioA_8812_n_ultra_hp, RadioA_8812_n_ultra_hp);
|
|
VAR_MAPPING(RadioB_8812_n_ultra_hp, RadioB_8812_n_ultra_hp);
|
|
|
|
#endif
|
|
#endif
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
* Function: PHYCheckIsLegalRfPath8192cPci()
|
|
*
|
|
* Overview: Check different RF type to execute legal judgement. If RF Path is illegal
|
|
* We will return false.
|
|
*
|
|
* Input: NONE
|
|
*
|
|
* Output: NONE
|
|
*
|
|
* Return: NONE
|
|
*
|
|
* Revised History:
|
|
* When Who Remark
|
|
* 11/15/2007 MHC Create Version 0.
|
|
*
|
|
*---------------------------------------------------------------------------*/
|
|
int PHYCheckIsLegalRfPath8192cPci(struct rtl8192cd_priv *priv, unsigned int eRFPath)
|
|
{
|
|
unsigned int rtValue = TRUE;
|
|
|
|
if (get_rf_mimo_mode(priv) == MIMO_2T2R) {
|
|
if ((eRFPath == RF92CD_PATH_A) || (eRFPath == RF92CD_PATH_B))
|
|
rtValue = TRUE;
|
|
else
|
|
rtValue = FALSE;
|
|
} else if (get_rf_mimo_mode(priv) == MIMO_1T1R) {
|
|
if (eRFPath == RF92CD_PATH_A)
|
|
rtValue = TRUE;
|
|
else
|
|
rtValue = FALSE;
|
|
} else {
|
|
rtValue = FALSE;
|
|
}
|
|
|
|
return rtValue;
|
|
}
|
|
#if defined(CONFIG_RTL_8196CS)
|
|
void setBaseAddressRegister(void)
|
|
{
|
|
int tmp32 = 0, status;
|
|
while (++tmp32 < 100) {
|
|
REG32(0xb8b00004) = 0x00100007;
|
|
REG32(0xb8b10004) = 0x00100007;
|
|
REG32(0xb8b10010) = 0x18c00001;
|
|
REG32(0xb8b10018) = 0x19000004;
|
|
status = (REG32(0xb8b10010) ^ 0x18c00001) | ( REG32(0xb8b10018) ^ 0x19000004);
|
|
if (!status)
|
|
break;
|
|
else {
|
|
printk("set BAR fail,%x\n", status);
|
|
printk("%x %x %x %x \n",
|
|
REG32(0xb8b00004) , REG32(0xb8b10004) , REG32(0xb8b10010), REG32(0xb8b10018) );
|
|
}
|
|
} ;
|
|
}
|
|
#endif
|
|
/**
|
|
* Function: phy_CalculateBitShift
|
|
*
|
|
* OverView: Get shifted position of the BitMask
|
|
*
|
|
* Input:
|
|
* u4Byte BitMask,
|
|
*
|
|
* Output: none
|
|
* Return: u4Byte Return the shift bit bit position of the mask
|
|
*/
|
|
unsigned int phy_CalculateBitShift(unsigned int BitMask)
|
|
{
|
|
unsigned int i;
|
|
|
|
for (i = 0; i <= 31; i++) {
|
|
if (((BitMask >> i) & 0x1) == 1)
|
|
break;
|
|
}
|
|
|
|
return (i);
|
|
}
|
|
|
|
/**
|
|
* Function: PHY_QueryBBReg
|
|
*
|
|
* OverView: Read "sepcific bits" from BB register
|
|
*
|
|
* Input:
|
|
* PADAPTER Adapter,
|
|
* u4Byte RegAddr, //The target address to be readback
|
|
* u4Byte BitMask //The target bit position in the target address
|
|
* //to be readback
|
|
* Output: None
|
|
* Return: u4Byte Data //The readback register value
|
|
* Note: This function is equal to "GetRegSetting" in PHY programming guide
|
|
*/
|
|
unsigned int PHY_QueryBBReg(struct rtl8192cd_priv *priv, unsigned int RegAddr, unsigned int BitMask)
|
|
{
|
|
unsigned int ReturnValue = 0, OriginalValue, BitShift;
|
|
|
|
#ifdef DISABLE_BB_RF
|
|
return 0;
|
|
#endif //DISABLE_BB_RF
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
unsigned char reg;
|
|
reg = MAC_PHY_CTRL_MP;
|
|
if (!(RTL_R8(reg) & BIT(1)) && priv->pshare->wlandev_idx == 1) {
|
|
return DMDP_PHY_QueryBBReg(0, RegAddr, BitMask);
|
|
}
|
|
#endif
|
|
|
|
OriginalValue = RTL_R32(RegAddr);
|
|
BitShift = phy_CalculateBitShift(BitMask);
|
|
ReturnValue = (OriginalValue & BitMask) >> BitShift;
|
|
|
|
return (ReturnValue);
|
|
}
|
|
|
|
|
|
/**
|
|
* Function: PHY_SetBBReg
|
|
*
|
|
* OverView: Write "Specific bits" to BB register (page 8~)
|
|
*
|
|
* Input:
|
|
* PADAPTER Adapter,
|
|
* u4Byte RegAddr, //The target address to be modified
|
|
* u4Byte BitMask //The target bit position in the target address
|
|
* //to be modified
|
|
* u4Byte Data //The new register value in the target bit position
|
|
* //of the target address
|
|
*
|
|
* Output: None
|
|
* Return: None
|
|
* Note: This function is equal to "PutRegSetting" in PHY programming guide
|
|
*/
|
|
void PHY_SetBBReg(struct rtl8192cd_priv *priv, unsigned int RegAddr, unsigned int BitMask, unsigned int Data)
|
|
{
|
|
unsigned int OriginalValue, BitShift, NewValue;
|
|
|
|
#ifdef DISABLE_BB_RF
|
|
return;
|
|
#endif //DISABLE_BB_RF
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
unsigned char reg;
|
|
reg = MAC_PHY_CTRL_MP;
|
|
|
|
if (!(RTL_R8(reg) & BIT(1)) && priv->pshare->wlandev_idx == 1) {
|
|
DMDP_PHY_SetBBReg(0, RegAddr, BitMask, Data);
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
if (BitMask != bMaskDWord) {
|
|
//if not "double word" write
|
|
//_TXPWR_REDEFINE ?? if have original value, how to count tx power index from PG file ??
|
|
OriginalValue = RTL_R32(RegAddr);
|
|
BitShift = phy_CalculateBitShift(BitMask);
|
|
NewValue = ((OriginalValue & (~BitMask)) | ((Data << BitShift) & BitMask));
|
|
RTL_W32(RegAddr, NewValue);
|
|
} else
|
|
RTL_W32(RegAddr, Data);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Function: phy_RFSerialWrite
|
|
*
|
|
* OverView: Write data to RF register (page 8~)
|
|
*
|
|
* Input:
|
|
* PADAPTER Adapter,
|
|
* RF92CD_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D
|
|
* u4Byte Offset, //The target address to be read
|
|
* u4Byte Data //The new register Data in the target bit position
|
|
* //of the target to be read
|
|
*
|
|
* Output: None
|
|
* Return: None
|
|
* Note: Threre are three types of serial operations: (1) Software serial write
|
|
* (2) Hardware LSSI-Low Speed Serial Interface (3) Hardware HSSI-High speed
|
|
* serial write. Driver need to implement (1) and (2).
|
|
* This function is equal to the combination of RF_ReadReg() and RFLSSIRead()
|
|
*
|
|
* Note: For RF8256 only
|
|
* The total count of RTL8256(Zebra4) register is around 36 bit it only employs
|
|
* 4-bit RF address. RTL8256 uses "register mode control bit" (Reg00[12], Reg00[10])
|
|
* to access register address bigger than 0xf. See "Appendix-4 in PHY Configuration
|
|
* programming guide" for more details.
|
|
* Thus, we define a sub-finction for RTL8526 register address conversion
|
|
* ===========================================================
|
|
* Register Mode RegCTL[1] RegCTL[0] Note
|
|
* (Reg00[12]) (Reg00[10])
|
|
* ===========================================================
|
|
* Reg_Mode0 0 x Reg 0 ~15(0x0 ~ 0xf)
|
|
* ------------------------------------------------------------------
|
|
* Reg_Mode1 1 0 Reg 16 ~30(0x1 ~ 0xf)
|
|
* ------------------------------------------------------------------
|
|
* Reg_Mode2 1 1 Reg 31 ~ 45(0x1 ~ 0xf)
|
|
* ------------------------------------------------------------------
|
|
*/
|
|
void phy_RFSerialWrite(struct rtl8192cd_priv *priv, RF92CD_RADIO_PATH_E eRFPath, unsigned int Offset, unsigned int Data)
|
|
{
|
|
struct rtl8192cd_hw *phw = GET_HW(priv);
|
|
unsigned int DataAndAddr = 0;
|
|
BB_REGISTER_DEFINITION_T *pPhyReg = &phw->PHYRegDef[eRFPath];
|
|
unsigned int NewOffset;
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT)
|
|
if(GET_CHIP_VER(priv) == VERSION_8188E)
|
|
Offset &= 0xff;
|
|
else
|
|
#endif
|
|
Offset &= 0x7f;
|
|
//
|
|
// Switch page for 8256 RF IC
|
|
//
|
|
NewOffset = Offset;
|
|
|
|
//
|
|
// Put write addr in [5:0] and write data in [31:16]
|
|
//
|
|
//DataAndAddr = (Data<<16) | (NewOffset&0x3f);
|
|
DataAndAddr = ((NewOffset << 20) | (Data & 0x000fffff)) & 0x0fffffff; // T65 RF
|
|
|
|
//
|
|
// Write Operation
|
|
//
|
|
PHY_SetBBReg(priv, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr);
|
|
}
|
|
|
|
|
|
/**
|
|
* Function: phy_RFSerialRead
|
|
*
|
|
* OverView: Read regster from RF chips
|
|
*
|
|
* Input:
|
|
* PADAPTER Adapter,
|
|
* RF92CD_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D
|
|
* u4Byte Offset, //The target address to be read
|
|
* u4Byte dbg_avoid, //set bitmask in reg 0 to prevent RF switchs to debug mode
|
|
*
|
|
* Output: None
|
|
* Return: u4Byte reback value
|
|
* Note: Threre are three types of serial operations: (1) Software serial write
|
|
* (2) Hardware LSSI-Low Speed Serial Interface (3) Hardware HSSI-High speed
|
|
* serial write. Driver need to implement (1) and (2).
|
|
* This function is equal to the combination of RF_ReadReg() and RFLSSIRead()
|
|
*/
|
|
unsigned int phy_RFSerialRead(struct rtl8192cd_priv *priv, RF92CD_RADIO_PATH_E eRFPath, unsigned int Offset, unsigned int dbg_avoid)
|
|
{
|
|
struct rtl8192cd_hw *phw = GET_HW(priv);
|
|
unsigned int tmplong, tmplong2;
|
|
unsigned int retValue = 0;
|
|
BB_REGISTER_DEFINITION_T *pPhyReg = &phw->PHYRegDef[eRFPath];
|
|
unsigned int NewOffset;
|
|
|
|
//
|
|
// Make sure RF register offset is correct
|
|
//
|
|
#if defined(CONFIG_RTL_88E_SUPPORT)
|
|
if(GET_CHIP_VER(priv) == VERSION_8188E)
|
|
Offset &= 0xff;
|
|
else
|
|
#endif
|
|
Offset &= 0x7f;
|
|
|
|
//
|
|
// Switch page for 8256 RF IC
|
|
//
|
|
NewOffset = Offset;
|
|
|
|
#if 0 // 92E use PHY_QueryRFReg & PHY_WriteRFReg callback function
|
|
//#ifdef CONFIG_WLAN_HAL_8192EE
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E) {
|
|
int RfPiEnable = 0;
|
|
if (eRFPath == RF_PATH_A) {
|
|
tmplong2 = PHY_QueryBBReg(priv, rFPGA0_XA_HSSIParameter2, bMaskDWord);;
|
|
tmplong2 = (tmplong2 & (~bLSSIReadAddress)) | (NewOffset << 23) | bLSSIReadEdge; //T65 RF
|
|
PHY_SetBBReg(priv, rFPGA0_XA_HSSIParameter2, bMaskDWord, tmplong2 & (~bLSSIReadEdge));
|
|
} else {
|
|
tmplong2 = PHY_QueryBBReg(priv, rFPGA0_XB_HSSIParameter2, bMaskDWord);
|
|
tmplong2 = (tmplong2 & (~bLSSIReadAddress)) | (NewOffset << 23) | bLSSIReadEdge; //T65 RF
|
|
PHY_SetBBReg(priv, rFPGA0_XB_HSSIParameter2, bMaskDWord, tmplong2 & (~bLSSIReadEdge));
|
|
}
|
|
|
|
tmplong2 = PHY_QueryBBReg(priv, rFPGA0_XA_HSSIParameter2, bMaskDWord);
|
|
PHY_SetBBReg(priv, rFPGA0_XA_HSSIParameter2, bMaskDWord, tmplong2 & (~bLSSIReadEdge));
|
|
PHY_SetBBReg(priv, rFPGA0_XA_HSSIParameter2, bMaskDWord, tmplong2 | bLSSIReadEdge);
|
|
|
|
delay_us(20);
|
|
} else
|
|
#endif
|
|
{
|
|
|
|
// For 92S LSSI Read RFLSSIRead
|
|
// For RF A/B write 0x824/82c(does not work in the future)
|
|
// We must use 0x824 for RF A and B to execute read trigger
|
|
tmplong = RTL_R32(rFPGA0_XA_HSSIParameter2);
|
|
tmplong2 = RTL_R32(pPhyReg->rfHSSIPara2);
|
|
tmplong2 = (tmplong2 & (~bLSSIReadAddress)) | ((NewOffset << 23) | bLSSIReadEdge); //T65 RF
|
|
|
|
RTL_W32(rFPGA0_XA_HSSIParameter2, tmplong & (~bLSSIReadEdge));
|
|
delay_us(20);
|
|
RTL_W32(pPhyReg->rfHSSIPara2, tmplong2);
|
|
delay_us(20);
|
|
#if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT)
|
|
if (
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
(GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)
|
|
#endif
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
||
|
|
#endif
|
|
(GET_CHIP_VER(priv) == VERSION_8192D)
|
|
#endif
|
|
) {
|
|
RTL_W32(rFPGA0_XA_HSSIParameter2, tmplong | bLSSIReadEdge);
|
|
delay_us(20);
|
|
RTL_W32(rFPGA0_XA_HSSIParameter2, tmplong & (~bLSSIReadEdge));
|
|
}
|
|
#endif
|
|
|
|
}
|
|
//Read from BBreg8a0, 12 bits for 8190, 20 bits for T65 RF
|
|
if (((eRFPath == RF92CD_PATH_A) && (RTL_R32(0x820)&BIT(8)))
|
|
|| ((eRFPath == RF92CD_PATH_B) && (RTL_R32(0x828)&BIT(8))))
|
|
retValue = PHY_QueryBBReg(priv, pPhyReg->rfLSSIReadBackPi, bLSSIReadBackData);
|
|
else
|
|
retValue = PHY_QueryBBReg(priv, pPhyReg->rfLSSIReadBack, bLSSIReadBackData);
|
|
|
|
return retValue;
|
|
}
|
|
|
|
|
|
#ifdef AC2G_256QAM
|
|
char is_ac2g(struct rtl8192cd_priv * priv)
|
|
{
|
|
|
|
unsigned char ac2g = 0;
|
|
|
|
if((GET_CHIP_VER(priv)== VERSION_8812E) || (GET_CHIP_VER(priv)== VERSION_8881A))
|
|
{
|
|
if(priv->pmib->dot11BssType.net_work_type & WIRELESS_11AC
|
|
&& ((priv->pmib->dot11BssType.net_work_type & WIRELESS_11A) == 0)
|
|
&& (priv->pshare->rf_ft_var.ac2g_enable)
|
|
)
|
|
ac2g = 1;
|
|
|
|
if((OPMODE&WIFI_STATION_STATE)
|
|
&& (priv->pmib->dot11BssType.net_work_type == (WIRELESS_11A|WIRELESS_11B|WIRELESS_11G|WIRELESS_11N|WIRELESS_11AC))
|
|
&& ((priv->pmib->dot11RFEntry.dot11channel != 0) && (priv->pmib->dot11RFEntry.dot11channel<36)))
|
|
ac2g = 1;
|
|
}
|
|
|
|
return ac2g;
|
|
|
|
}
|
|
#endif
|
|
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
|
|
unsigned int PHY_QueryRFReg_8812(struct rtl8192cd_priv *priv, RF92CD_RADIO_PATH_E eRFPath,
|
|
unsigned int RegAddr, unsigned int BitMask, unsigned int dbg_avoid)
|
|
{
|
|
unsigned int Original_Value = 0, Readback_Value, BitShift;
|
|
unsigned int dwTmp;
|
|
|
|
PHY_SetBBReg(priv, 0x838, 0xf, 0xc); // CCA off
|
|
|
|
RTL_W8(0x8b0, RegAddr);
|
|
|
|
if (IS_TEST_CHIP(priv)) { //for_8812_mp_chip
|
|
dwTmp = RTL_R32(0x8b0);
|
|
dwTmp &= ~BIT(8);
|
|
RTL_W32(0x8b0, dwTmp);
|
|
//printk("0x8b0 = 0x%x\n", dwTmp);
|
|
dwTmp |= BIT(8);
|
|
RTL_W32(0x8b0, dwTmp);
|
|
//printk("0x8b0 = 0x%x\n", dwTmp);
|
|
}
|
|
|
|
delay_us(50);
|
|
|
|
if (eRFPath == RF92CD_PATH_A)
|
|
Original_Value = RTL_R32(0xd04);
|
|
else if (eRFPath == RF92CD_PATH_B)
|
|
Original_Value = RTL_R32(0xd44);
|
|
|
|
//printk("_eric_8812 rf_%x = 0x%x \n", RegAddr, Original_Value);
|
|
|
|
Original_Value &= 0xfffff;
|
|
|
|
BitShift = phy_CalculateBitShift(BitMask);
|
|
Readback_Value = (Original_Value & BitMask) >> BitShift;
|
|
|
|
PHY_SetBBReg(priv, 0x838, 0xf, 0x4); // CCA on
|
|
|
|
return (Readback_Value);
|
|
}
|
|
|
|
void phy_RFSerialWrite_8812(struct rtl8192cd_priv *priv, RF92CD_RADIO_PATH_E eRFPath, unsigned int Offset, unsigned int Data)
|
|
{
|
|
unsigned int dwTmp = 0;
|
|
unsigned int value = ((Offset << 20) | Data);
|
|
|
|
//printk("_eric_8182 phy_RFSerialWrite_8812 +++ \n");
|
|
|
|
PHY_SetBBReg(priv, 0x838, 0xf, 0xc); // CCA off
|
|
|
|
if (eRFPath == RF92CD_PATH_A) {
|
|
dwTmp = RTL_R32(0xc90);
|
|
dwTmp &= 0xf0000000;
|
|
dwTmp |= value;
|
|
//printk("_eric_8812 0xc90 = 0x%x \n", dwTmp);
|
|
RTL_W32(0xc90, dwTmp);
|
|
} else if (eRFPath == RF92CD_PATH_B) {
|
|
dwTmp = RTL_R32(0xe90);
|
|
dwTmp &= 0xf0000000;
|
|
dwTmp |= value;
|
|
//printk("_eric_8812 0xe90 = 0x%x \n", dwTmp);
|
|
RTL_W32(0xe90, dwTmp);
|
|
}
|
|
|
|
PHY_SetBBReg(priv, 0x838, 0xf, 0x4); // CCA on
|
|
}
|
|
|
|
#ifdef CONFIG_RTL_KERNEL_MIPS16_WLAN
|
|
__NOMIPS16
|
|
#endif
|
|
void PHY_SetRFReg_8812(struct rtl8192cd_priv *priv, RF92CD_RADIO_PATH_E eRFPath, unsigned int RegAddr,
|
|
unsigned int BitMask, unsigned int Data)
|
|
{
|
|
unsigned int Original_Value, BitShift, New_Value;
|
|
#ifndef SMP_SYNC
|
|
unsigned long flags;
|
|
#endif
|
|
#if 0
|
|
if (priv->pshare->No_RF_Write == 1
|
|
#ifdef MP_TEST
|
|
&& (!priv->pshare->rf_ft_var.mp_specific)
|
|
#endif
|
|
)
|
|
return;
|
|
#endif
|
|
SAVE_INT_AND_CLI(flags);
|
|
if (BitMask != bMask20Bits) {
|
|
Original_Value = PHY_QueryRFReg_8812(priv, eRFPath, RegAddr, bMask20Bits, 0);
|
|
BitShift = phy_CalculateBitShift(BitMask);
|
|
New_Value = ((Original_Value & (~BitMask)) | (Data << BitShift));
|
|
phy_RFSerialWrite_8812(priv, eRFPath, RegAddr, New_Value);
|
|
} else {
|
|
phy_RFSerialWrite_8812(priv, eRFPath, RegAddr, Data);
|
|
}
|
|
|
|
delay_us(1); // At least 500ns delay to avoid RF write fail.
|
|
RESTORE_INT(flags);
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
/**
|
|
* Function: PHY_QueryRFReg
|
|
*
|
|
* OverView: Query "Specific bits" to RF register (page 8~)
|
|
*
|
|
* Input:
|
|
* PADAPTER Adapter,
|
|
* RF92CD_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D
|
|
* u4Byte RegAddr, //The target address to be read
|
|
* u4Byte BitMask //The target bit position in the target address
|
|
* //to be read
|
|
* u4Byte dbg_avoid //set bitmask in reg 0 to prevent RF switchs to debug mode
|
|
*
|
|
* Output: None
|
|
* Return: u4Byte Readback value
|
|
* Note: This function is equal to "GetRFRegSetting" in PHY programming guide
|
|
*/
|
|
unsigned int PHY_QueryRFReg(struct rtl8192cd_priv *priv, RF92CD_RADIO_PATH_E eRFPath,
|
|
unsigned int RegAddr, unsigned int BitMask, unsigned int dbg_avoid)
|
|
{
|
|
#ifdef DISABLE_BB_RF
|
|
return 0;
|
|
#endif //DISABLE_BB_RF
|
|
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
return PHY_QueryRFReg_8812(priv, eRFPath, RegAddr, BitMask, dbg_avoid);
|
|
}
|
|
#endif
|
|
|
|
#if defined(CONFIG_WLAN_HAL)
|
|
if(IS_HAL_CHIP(priv)) {
|
|
return GET_HAL_INTERFACE(priv)->PHYQueryRFRegHandler(priv, eRFPath, RegAddr, BitMask);
|
|
} else if (CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{
|
|
unsigned int Original_Value, Readback_Value, BitShift;
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
unsigned char reg;
|
|
reg = MAC_PHY_CTRL_MP;
|
|
if (!(RTL_R8(reg) & BIT(1)) && priv->pshare->wlandev_idx == 1) {
|
|
return DMDP_PHY_QueryRFReg(0, eRFPath, RegAddr, BitMask, dbg_avoid);
|
|
}
|
|
#endif
|
|
|
|
Original_Value = phy_RFSerialRead(priv, eRFPath, RegAddr, dbg_avoid);
|
|
BitShift = phy_CalculateBitShift(BitMask);
|
|
Readback_Value = (Original_Value & BitMask) >> BitShift;
|
|
return (Readback_Value);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Function: PHY_SetRFReg
|
|
*
|
|
* OverView: Write "Specific bits" to RF register (page 8~)
|
|
*
|
|
* Input:
|
|
* PADAPTER Adapter,
|
|
* RF92CD_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D
|
|
* u4Byte RegAddr, //The target address to be modified
|
|
* u4Byte BitMask //The target bit position in the target address
|
|
* //to be modified
|
|
* u4Byte Data //The new register Data in the target bit position
|
|
* //of the target address
|
|
*
|
|
* Output: None
|
|
* Return: None
|
|
* Note: This function is equal to "PutRFRegSetting" in PHY programming guide
|
|
*/
|
|
#ifdef CONFIG_RTL_KERNEL_MIPS16_WLAN
|
|
__NOMIPS16
|
|
#endif
|
|
void PHY_SetRFReg(struct rtl8192cd_priv *priv, RF92CD_RADIO_PATH_E eRFPath, unsigned int RegAddr,
|
|
unsigned int BitMask, unsigned int Data)
|
|
{
|
|
#ifdef DISABLE_BB_RF
|
|
return;
|
|
#endif //DISABLE_BB_RF
|
|
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
return PHY_SetRFReg_8812(priv, eRFPath, RegAddr, BitMask, Data);
|
|
}
|
|
#endif
|
|
|
|
#if defined(CONFIG_WLAN_HAL)
|
|
if(IS_HAL_CHIP(priv)) {
|
|
return GET_HAL_INTERFACE(priv)->PHYSSetRFRegHandler(priv, eRFPath, RegAddr, BitMask, Data);
|
|
} else if (CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{
|
|
unsigned int Original_Value, BitShift, New_Value;
|
|
#ifndef SMP_SYNC
|
|
unsigned long flags;
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
unsigned char reg;
|
|
reg = MAC_PHY_CTRL_MP;
|
|
|
|
if (!(RTL_R8(reg) & BIT(1)) && priv->pshare->wlandev_idx == 1) {
|
|
DMDP_PHY_SetRFReg(0, eRFPath, RegAddr, BitMask, Data);
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
SAVE_INT_AND_CLI(flags);
|
|
|
|
if (BitMask != bMask20Bits) {
|
|
Original_Value = phy_RFSerialRead(priv, eRFPath, RegAddr, 1);
|
|
BitShift = phy_CalculateBitShift(BitMask);
|
|
New_Value = ((Original_Value & (~BitMask)) | (Data << BitShift));
|
|
|
|
phy_RFSerialWrite(priv, eRFPath, RegAddr, New_Value);
|
|
} else {
|
|
phy_RFSerialWrite(priv, eRFPath, RegAddr, Data);
|
|
}
|
|
|
|
RESTORE_INT(flags);
|
|
delay_us(2); // At least 500ns delay to avoid RF write fail.
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef TXPWR_LMT_NEWFILE
|
|
static int is_NA(char* s)
|
|
{
|
|
if (( s[0] == 'N' || s[0] == 'n') && ( s[1] == 'A' || s[1] == 'a'))
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
static int is_hex(char s)
|
|
{
|
|
if (( s >= '0' && s <= '9') || ( s >= 'a' && s <= 'f') || (s >= 'A' && s <= 'F') || (s == 'x' || s == 'X'))
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
|
|
static int is_item(char s)
|
|
{
|
|
if (s == 't' || s == 'a' || s == 'b' || s == 'l' || s == 'e' || s == ':')
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
static unsigned char *get_digit(unsigned char **data)
|
|
{
|
|
unsigned char *buf = *data;
|
|
int i = 0;
|
|
|
|
while (buf[i] && ((buf[i] == ' ') || (buf[i] == '\t')))
|
|
i++;
|
|
*data = &buf[i];
|
|
|
|
while (buf[i]) {
|
|
if ((buf[i] == ' ') || (buf[i] == '\t')) {
|
|
buf[i] = '\0';
|
|
break;
|
|
}
|
|
if (buf[i] >= 'A' && buf[i] <= 'Z')
|
|
buf[i] += 32;
|
|
|
|
if (!is_hex(buf[i]) && !is_item(buf[i]))
|
|
return NULL;
|
|
i++;
|
|
}
|
|
if (i == 0)
|
|
return NULL;
|
|
else
|
|
return &buf[i + 1];
|
|
}
|
|
|
|
#ifdef TXPWR_LMT_NEWFILE
|
|
|
|
static unsigned char *get_digit_dot_8812(unsigned char **data)
|
|
{
|
|
unsigned char *buf=*data;
|
|
int i=0;
|
|
|
|
while(buf[i] && ((buf[i] == ' ') || (buf[i] == '\t')))
|
|
i++;
|
|
|
|
*data = &buf[i];
|
|
|
|
while(buf[i]) {
|
|
if(buf[i] == '.'){
|
|
// while((buf[i]==' ') ||(buf[i]=='\t') || (buf[i]=='\0') || (buf[i]=='/'))
|
|
// i++;
|
|
|
|
i++;
|
|
}
|
|
|
|
if ((buf[i] == ' ') || (buf[i] == '\t')) {
|
|
buf[i] = '\0';
|
|
break;
|
|
}
|
|
|
|
if (buf[i]>='A' && buf[i]<='Z')
|
|
buf[i] += 32;
|
|
|
|
if (!is_hex(buf[i])&&!is_item(buf[i])
|
|
&& !is_NA((char *)&buf[i]))
|
|
return NULL;
|
|
|
|
i++;
|
|
}
|
|
if (i == 0)
|
|
return NULL;
|
|
else
|
|
{
|
|
return &buf[i+1];
|
|
}
|
|
}
|
|
|
|
|
|
#define LMT_NUM 256
|
|
static int get_chnl_lmt_dot_new(struct rtl8192cd_priv *priv, unsigned char *line_head, unsigned int *channel, unsigned int *limit, unsigned int *table_idx)
|
|
{
|
|
unsigned char *next, *next2, *next3;
|
|
int base, idx;
|
|
int num=0;
|
|
int num_index;
|
|
int val;
|
|
int i; // for loop
|
|
unsigned char *ch;
|
|
unsigned char lmt[LMT_NUM];
|
|
unsigned char *twpwr_lmt_index_array;
|
|
unsigned char lmtIndex;
|
|
extern int _atoi(char *s, int base);
|
|
|
|
*channel = '\0';
|
|
base = 10;
|
|
|
|
//find limit table index first
|
|
if (!memcmp(line_head+2,"Table",5)) {
|
|
*channel = 0;
|
|
//printk("found idx\n");
|
|
goto find_idx;
|
|
}
|
|
else if (!memcmp(line_head,"CH0",3)) {
|
|
//printk("found channel\n");
|
|
ch = line_head+3;
|
|
}
|
|
else if (!memcmp(line_head,"CH",2)) {
|
|
//printk("found channel\n");
|
|
ch = line_head+2;
|
|
}
|
|
else
|
|
return 0;
|
|
|
|
*channel = _atoi(ch, base);
|
|
|
|
|
|
num = 0;
|
|
next = get_digit_dot_8812(&ch);
|
|
|
|
while(next != NULL)
|
|
{
|
|
num++;
|
|
if(is_NA(next))
|
|
lmt[num] = 0; //No limit
|
|
else {
|
|
val = _convert_2_pwr_dot(next, base);
|
|
if(val == -1)
|
|
num --;
|
|
else
|
|
lmt[num] = val;
|
|
}
|
|
next = get_digit_dot_8812(&next);
|
|
|
|
}
|
|
if(num == 0)
|
|
panic_printk("TX Power Porfile format Error\n");
|
|
|
|
//printk("channel = %d, lmt = %d %d %d\n", *channel, lmt[0], lmt[1], lmt[2]);
|
|
|
|
|
|
if(priv->pmib->dot11StationConfigEntry.txpwr_lmt_index <= 0) {
|
|
if(priv->pmib->dot11StationConfigEntry.dot11RegDomain == DOMAIN_MKK)
|
|
lmtIndex = 3;
|
|
else if(priv->pmib->dot11StationConfigEntry.dot11RegDomain == DOMAIN_ETSI)
|
|
lmtIndex = 2;
|
|
else
|
|
lmtIndex = 1;
|
|
} else {
|
|
lmtIndex = priv->pmib->dot11StationConfigEntry.txpwr_lmt_index;
|
|
}
|
|
|
|
*limit = lmt[lmtIndex];
|
|
|
|
return 1;
|
|
|
|
find_idx:
|
|
|
|
*channel = 0;
|
|
*limit = 0;
|
|
*table_idx = 0;
|
|
|
|
line_head = line_head + 8;
|
|
|
|
*table_idx = _atoi(line_head, base); //In this condition, 'limit' represents "# of table"
|
|
//printk("\n[table_idx = %d]\n", *table_idx);
|
|
|
|
return 1;
|
|
|
|
}
|
|
#endif
|
|
|
|
|
|
static unsigned char *get_digit_dot(unsigned char **data)
|
|
{
|
|
unsigned char *buf = *data;
|
|
int i = 0;
|
|
|
|
while (buf[i] && ((buf[i] == ' ') || (buf[i] == '\t')))
|
|
i++;
|
|
|
|
*data = &buf[i];
|
|
|
|
while (buf[i]) {
|
|
if (buf[i] == '.') {
|
|
// while ((buf[i] == ' ') || (buf[i] == '\t') || (buf[i] == '\0') || (buf[i] == '/'))
|
|
// i++;
|
|
|
|
i++;
|
|
}
|
|
|
|
if ((buf[i] == ' ') || (buf[i] == '\t')) {
|
|
buf[i] = '\0';
|
|
break;
|
|
}
|
|
if (buf[i] >= 'A' && buf[i] <= 'Z')
|
|
buf[i] += 32;
|
|
|
|
if (!is_hex(buf[i]) && !is_item(buf[i]))
|
|
return NULL;
|
|
i++;
|
|
}
|
|
if (i == 0)
|
|
return NULL;
|
|
else
|
|
{
|
|
return &buf[i + 1];
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef TXPWR_LMT
|
|
static int get_chnl_lmt_dot(unsigned char *line_head, unsigned int *ch_start, unsigned int *ch_end, unsigned int *limit, unsigned int *target)
|
|
{
|
|
unsigned char *next, *next2;
|
|
int base, idx;
|
|
int num = 0;
|
|
unsigned char *ch;
|
|
extern int _atoi(char * s, int base);
|
|
|
|
*ch_start = *ch_start = '\0';
|
|
|
|
// remove comments
|
|
ch = line_head;
|
|
while (1) {
|
|
if ((*ch == '\0') || (*ch == '\n') || (*ch == '\r'))
|
|
break;
|
|
else if (*ch == '/') {
|
|
*ch = '\0';
|
|
break;
|
|
} else {
|
|
ch++;
|
|
}
|
|
}
|
|
|
|
next = get_digit_dot(&line_head);
|
|
if (next == NULL)
|
|
return num;
|
|
num++;
|
|
|
|
if (!memcmp(line_head, "table", 5)) {
|
|
*ch_start = 0;
|
|
*ch_end = 0;
|
|
} else {
|
|
// char *s;
|
|
int format = 0;
|
|
int idx2;
|
|
|
|
if ((!memcmp(line_head, "0x", 2)) || (!memcmp(line_head, "0X", 2))) {
|
|
base = 16;
|
|
idx = 2;
|
|
} else {
|
|
base = 10;
|
|
idx = 0;
|
|
}
|
|
idx2 = idx;
|
|
while (line_head[idx2] != '\0') {
|
|
//printk("(%c)",line_head[idx2]);
|
|
if (line_head[idx2] == ':') {
|
|
line_head[idx2] = '\0';
|
|
format = 1; // format - start:end
|
|
break;
|
|
}
|
|
idx2++;
|
|
}
|
|
*ch_start = _atoi((char *)&line_head[idx], base);
|
|
if (format == 0) {
|
|
*ch_end = *ch_start;
|
|
} else {
|
|
*ch_end = _atoi((char *)&line_head[idx2 + 1], base);
|
|
}
|
|
}
|
|
|
|
|
|
*limit = 0;
|
|
if (next) {
|
|
if (!(next2 = get_digit_dot(&next)))
|
|
return num;
|
|
num++;
|
|
|
|
base = 10;
|
|
idx = 0;
|
|
|
|
if ( (*ch_start == 0) && (*ch_end == 0) )
|
|
*limit = _atoi((char *)&next[idx], base); //In this condition, 'limit' represents "# of table"
|
|
else
|
|
*limit = _convert_2_pwr_dot((char *)&next[idx], base);
|
|
}
|
|
|
|
|
|
*target = 0;
|
|
if (next2) {
|
|
if (!get_digit_dot(&next2))
|
|
return num;
|
|
num++;
|
|
|
|
base = 10;
|
|
idx = 0;
|
|
|
|
*target = _convert_2_pwr_dot((char *)&next2[idx], base);
|
|
}
|
|
|
|
|
|
return num;
|
|
}
|
|
#endif
|
|
|
|
//static
|
|
int get_offset_val(unsigned char *line_head, unsigned int *u4bRegOffset, unsigned int *u4bRegValue)
|
|
{
|
|
unsigned char *next;
|
|
int base, idx;
|
|
int num = 0;
|
|
unsigned char *ch;
|
|
extern int _atoi(char * s, int base);
|
|
|
|
*u4bRegOffset = *u4bRegValue = '\0';
|
|
|
|
ch = line_head;
|
|
while (1) {
|
|
if ((*ch == '\0') || (*ch == '\n') || (*ch == '\r'))
|
|
break;
|
|
else if (*ch == '/') {
|
|
*ch = '\0';
|
|
break;
|
|
} else {
|
|
ch++;
|
|
}
|
|
}
|
|
|
|
next = get_digit(&line_head);
|
|
if (next == NULL)
|
|
return num;
|
|
num++;
|
|
if ((!memcmp(line_head, "0x", 2)) || (!memcmp(line_head, "0X", 2))) {
|
|
base = 16;
|
|
idx = 2;
|
|
} else {
|
|
base = 10;
|
|
idx = 0;
|
|
}
|
|
*u4bRegOffset = _atoi((char *)&line_head[idx], base);
|
|
|
|
if (next) {
|
|
if (!get_digit(&next))
|
|
return num;
|
|
num++;
|
|
if ((!memcmp(next, "0x", 2)) || (!memcmp(next, "0X", 2))) {
|
|
base = 16;
|
|
idx = 2;
|
|
} else {
|
|
base = 10;
|
|
idx = 0;
|
|
}
|
|
*u4bRegValue = _atoi((char *)&next[idx], base);
|
|
} else
|
|
*u4bRegValue = 0;
|
|
|
|
return num;
|
|
}
|
|
|
|
|
|
#if 0//defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_WLAN_HAL_8192EE)
|
|
void assign_target_value_88e_new(struct rtl8192cd_priv *priv, unsigned int *u4bRegOffset, unsigned char *tmp_byte)
|
|
{
|
|
//CCK-11M
|
|
if(*u4bRegOffset == rTxAGC_A_CCK11_2_B_CCK11)
|
|
if(tmp_byte[3] != 0)
|
|
priv->pshare->tgpwr_CCK_new[RF_PATH_A] = tmp_byte[3];
|
|
|
|
if(*u4bRegOffset == rTxAGC_A_CCK11_2_B_CCK11)
|
|
if(tmp_byte[0] != 0)
|
|
priv->pshare->tgpwr_CCK_new[RF_PATH_B] = tmp_byte[0];
|
|
|
|
//OFDM-54M
|
|
if(*u4bRegOffset == rTxAGC_A_Rate54_24)
|
|
priv->pshare->tgpwr_OFDM_new[RF_PATH_A] = tmp_byte[3];
|
|
|
|
if(*u4bRegOffset == rTxAGC_B_Rate54_24)
|
|
priv->pshare->tgpwr_OFDM_new[RF_PATH_B] = tmp_byte[3];
|
|
|
|
//HT-MCS7
|
|
if(*u4bRegOffset == rTxAGC_A_Mcs07_Mcs04)
|
|
priv->pshare->tgpwr_HT1S_new[RF_PATH_A] = tmp_byte[3];
|
|
|
|
if(*u4bRegOffset == rTxAGC_B_Mcs07_Mcs04)
|
|
priv->pshare->tgpwr_HT1S_new[RF_PATH_B] = tmp_byte[3];
|
|
|
|
//HT-MCS15
|
|
if(*u4bRegOffset == rTxAGC_A_Mcs15_Mcs12)
|
|
priv->pshare->tgpwr_HT2S_new[RF_PATH_A] = tmp_byte[3];
|
|
|
|
if(*u4bRegOffset == rTxAGC_B_Mcs15_Mcs12)
|
|
priv->pshare->tgpwr_HT2S_new[RF_PATH_B] = tmp_byte[3];
|
|
|
|
|
|
}
|
|
#endif
|
|
#if 0//defined( CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8881A)
|
|
void assign_target_value_8812_new(struct rtl8192cd_priv *priv, unsigned int *u4bRegOffset, unsigned char *tmp_byte)
|
|
{
|
|
//CCK-11M
|
|
if(*u4bRegOffset == rTxAGC_A_CCK11_CCK1_JAguar)
|
|
priv->pshare->tgpwr_CCK_new[RF_PATH_A] = tmp_byte[3];
|
|
|
|
if(*u4bRegOffset == rTxAGC_B_CCK11_CCK1_JAguar)
|
|
priv->pshare->tgpwr_CCK_new[RF_PATH_B] = tmp_byte[3];
|
|
|
|
//OFDM-54M
|
|
if(*u4bRegOffset == rTxAGC_A_Ofdm54_Ofdm24_JAguar)
|
|
priv->pshare->tgpwr_OFDM_new[RF_PATH_A] = tmp_byte[3];
|
|
|
|
if(*u4bRegOffset == rTxAGC_B_Ofdm54_Ofdm24_JAguar)
|
|
priv->pshare->tgpwr_OFDM_new[RF_PATH_B] = tmp_byte[3];
|
|
|
|
//HT-MCS7
|
|
if(*u4bRegOffset == rTxAGC_A_MCS7_MCS4_JAguar)
|
|
priv->pshare->tgpwr_HT1S_new[RF_PATH_A] = tmp_byte[3];
|
|
|
|
if(*u4bRegOffset == rTxAGC_B_MCS7_MCS4_JAguar)
|
|
priv->pshare->tgpwr_HT1S_new[RF_PATH_B] = tmp_byte[3];
|
|
|
|
//HT-MCS15
|
|
if(*u4bRegOffset == rTxAGC_A_MCS15_MCS12_JAguar)
|
|
priv->pshare->tgpwr_HT2S_new[RF_PATH_A] = tmp_byte[3];
|
|
|
|
if(*u4bRegOffset == rTxAGC_B_MCS15_MCS12_JAguar)
|
|
priv->pshare->tgpwr_HT2S_new[RF_PATH_B] = tmp_byte[3];
|
|
|
|
//VHT-NSS1-MCS7
|
|
if(*u4bRegOffset == rTxAGC_A_Nss1Index7_Nss1Index4_JAguar)
|
|
priv->pshare->tgpwr_VHT1S_new[RF_PATH_A] = tmp_byte[3];
|
|
|
|
if(*u4bRegOffset == rTxAGC_B_Nss1Index7_Nss1Index4_JAguar)
|
|
priv->pshare->tgpwr_VHT1S_new[RF_PATH_B] = tmp_byte[3];
|
|
|
|
//VHT-NSS2-MCS7
|
|
if(*u4bRegOffset == rTxAGC_A_Nss2Index9_Nss2Index6_JAguar)
|
|
priv->pshare->tgpwr_VHT2S_new[RF_PATH_A] = tmp_byte[1];
|
|
|
|
if(*u4bRegOffset == rTxAGC_B_Nss2Index9_Nss2Index6_JAguar)
|
|
priv->pshare->tgpwr_VHT2S_new[RF_PATH_B] = tmp_byte[1];
|
|
|
|
}
|
|
#endif
|
|
|
|
unsigned int gen_reg_value(unsigned char* tmp_reg)
|
|
{
|
|
return (tmp_reg[0] | (tmp_reg[1]<<8) | (tmp_reg[2]<<16) | (tmp_reg[3]<<24)) ;
|
|
}
|
|
|
|
unsigned int gen_reg_value_2(unsigned char target, unsigned char* tmp_byte, unsigned char* tmp_reg)
|
|
{
|
|
unsigned char i =0;
|
|
|
|
for(i=0; i<4; i++)
|
|
{
|
|
if(target < tmp_byte[i])
|
|
tmp_reg[i] = tmp_byte[i] - target;
|
|
else
|
|
tmp_reg[i] = target - tmp_byte[i];
|
|
}
|
|
|
|
return (tmp_reg[0] | (tmp_reg[1]<<8) | (tmp_reg[2]<<16) | (tmp_reg[3]<<24)) ;
|
|
}
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_WLAN_HAL_8192EE)
|
|
unsigned int generate_u4bRegValue_88e_new(struct rtl8192cd_priv *priv, unsigned int *u4bRegOffset, unsigned char *tmp_byte)
|
|
{
|
|
unsigned char tmp_reg[4];
|
|
unsigned int reg_value = 0;
|
|
unsigned char target = 0;
|
|
|
|
if(*u4bRegOffset == rTxAGC_A_CCK1_Mcs32) //{NA NA 1M NA}
|
|
{
|
|
reg_value = RTL_R32(rTxAGC_A_CCK1_Mcs32);
|
|
|
|
tmp_reg[0]= (reg_value & (0xff));
|
|
tmp_reg[1]= tmp_byte[1]- priv->pshare->tgpwr_CCK_new[RF_PATH_A];
|
|
tmp_reg[2]= ((reg_value & (0xff0000)) >> 16);
|
|
tmp_reg[3]= ((reg_value & (0xff000000)) >> 24);
|
|
|
|
reg_value = gen_reg_value(tmp_reg);
|
|
return reg_value;
|
|
}
|
|
else if(*u4bRegOffset == rTxAGC_B_CCK5_1_Mcs32) // {5.5M 2M 1M NA}
|
|
{
|
|
reg_value = RTL_R32(rTxAGC_B_CCK5_1_Mcs32);
|
|
tmp_reg[0]= (reg_value & (0xff));
|
|
tmp_reg[1]= tmp_byte[1]- priv->pshare->tgpwr_CCK_new[RF_PATH_B];
|
|
tmp_reg[2]= tmp_byte[2]- priv->pshare->tgpwr_CCK_new[RF_PATH_B];
|
|
tmp_reg[3]= tmp_byte[3]- priv->pshare->tgpwr_CCK_new[RF_PATH_B];
|
|
|
|
reg_value = gen_reg_value(tmp_reg);
|
|
return reg_value;
|
|
}
|
|
else if(*u4bRegOffset == rTxAGC_A_CCK11_2_B_CCK11) //{11M 5.5M 2M NA} {NA NA NA NA 11M}
|
|
{
|
|
reg_value = RTL_R32(rTxAGC_A_CCK11_2_B_CCK11);
|
|
if (tmp_byte[3] > 0)
|
|
tmp_reg[3] = tmp_byte[3] - priv->pshare->tgpwr_CCK_new[RF_PATH_A];
|
|
else
|
|
tmp_reg[3] = ((reg_value & (0xff000000)) >> 24);
|
|
|
|
if (tmp_byte[0] > 0)
|
|
tmp_reg[0] = tmp_byte[0] - priv->pshare->tgpwr_CCK_new[RF_PATH_B];
|
|
else
|
|
tmp_reg[0] = (reg_value & 0xff);
|
|
|
|
if(tmp_byte[1] > 0)
|
|
tmp_reg[1]= tmp_byte[1]- priv->pshare->tgpwr_CCK_new[RF_PATH_A];
|
|
else
|
|
tmp_reg[1]=((reg_value & (0xff00)) >> 8);
|
|
|
|
if(tmp_byte[2] > 0)
|
|
tmp_reg[2]= tmp_byte[2]- priv->pshare->tgpwr_CCK_new[RF_PATH_A];
|
|
else
|
|
tmp_reg[2]=((reg_value & (0xff0000)) >> 16);
|
|
|
|
reg_value = gen_reg_value(tmp_reg);
|
|
RTL_W32(rTxAGC_A_CCK11_2_B_CCK11, reg_value);
|
|
return reg_value;
|
|
}
|
|
|
|
switch (*u4bRegOffset) {
|
|
case rTxAGC_A_Rate18_06:
|
|
case rTxAGC_A_Rate54_24:
|
|
target = priv->pshare->tgpwr_OFDM_new[RF_PATH_A];
|
|
break;
|
|
case rTxAGC_A_Mcs03_Mcs00:
|
|
case rTxAGC_A_Mcs07_Mcs04:
|
|
target = priv->pshare->tgpwr_HT1S_new[RF_PATH_A];
|
|
break;
|
|
case rTxAGC_A_Mcs11_Mcs08:
|
|
case rTxAGC_A_Mcs15_Mcs12:
|
|
target = priv->pshare->tgpwr_HT2S_new[RF_PATH_A];
|
|
break;
|
|
case rTxAGC_B_Rate18_06:
|
|
case rTxAGC_B_Rate54_24:
|
|
target = priv->pshare->tgpwr_OFDM_new[RF_PATH_B];
|
|
break;
|
|
case rTxAGC_B_Mcs03_Mcs00:
|
|
case rTxAGC_B_Mcs07_Mcs04:
|
|
target = priv->pshare->tgpwr_HT1S_new[RF_PATH_B];
|
|
break;
|
|
case rTxAGC_B_Mcs11_Mcs08:
|
|
case rTxAGC_B_Mcs15_Mcs12:
|
|
target = priv->pshare->tgpwr_HT2S_new[RF_PATH_B];
|
|
break;
|
|
}
|
|
|
|
reg_value = gen_reg_value_2(target, tmp_byte, tmp_reg);
|
|
return reg_value;
|
|
|
|
}
|
|
#endif
|
|
|
|
#if defined(RTK_AC_SUPPORT)
|
|
unsigned int generate_u4bRegValue_8812_new(struct rtl8192cd_priv *priv, unsigned int *u4bRegOffset, unsigned char *tmp_byte)
|
|
{
|
|
unsigned char tmp_reg[4];
|
|
unsigned int reg_value = 0;
|
|
unsigned char target = 0;
|
|
|
|
if(*u4bRegOffset == rTxAGC_A_Nss2Index1_Nss1Index8_JAguar)
|
|
{
|
|
tmp_reg[0]= tmp_byte[0]- priv->pshare->tgpwr_VHT1S_new[RF_PATH_A];
|
|
tmp_reg[1]= tmp_byte[1]- priv->pshare->tgpwr_VHT1S_new[RF_PATH_A];
|
|
tmp_reg[2]= tmp_byte[2]- priv->pshare->tgpwr_VHT2S_new[RF_PATH_A];
|
|
tmp_reg[3]= tmp_byte[3]- priv->pshare->tgpwr_VHT2S_new[RF_PATH_A];
|
|
|
|
reg_value = gen_reg_value(tmp_reg);
|
|
return reg_value;
|
|
}
|
|
else if(*u4bRegOffset == rTxAGC_B_Nss2Index1_Nss1Index8_JAguar)
|
|
{
|
|
tmp_reg[0]= tmp_byte[0]- priv->pshare->tgpwr_VHT1S_new[RF_PATH_B];
|
|
tmp_reg[1]= tmp_byte[1]- priv->pshare->tgpwr_VHT1S_new[RF_PATH_B];
|
|
tmp_reg[2]= tmp_byte[2]- priv->pshare->tgpwr_VHT2S_new[RF_PATH_B];
|
|
tmp_reg[3]= tmp_byte[3]- priv->pshare->tgpwr_VHT2S_new[RF_PATH_B];
|
|
|
|
reg_value = gen_reg_value(tmp_reg);
|
|
return reg_value;
|
|
}
|
|
|
|
switch (*u4bRegOffset) {
|
|
case rTxAGC_A_CCK11_CCK1_JAguar:
|
|
target = priv->pshare->tgpwr_CCK_new[RF_PATH_A];
|
|
break;
|
|
case rTxAGC_A_Ofdm18_Ofdm6_JAguar:
|
|
target = priv->pshare->tgpwr_OFDM_new[RF_PATH_A];
|
|
break;
|
|
case rTxAGC_A_Ofdm54_Ofdm24_JAguar:
|
|
target = priv->pshare->tgpwr_OFDM_new[RF_PATH_A];
|
|
break;
|
|
case rTxAGC_A_MCS3_MCS0_JAguar:
|
|
target = priv->pshare->tgpwr_HT1S_new[RF_PATH_A];
|
|
break;
|
|
case rTxAGC_A_MCS7_MCS4_JAguar:
|
|
target = priv->pshare->tgpwr_HT1S_new[RF_PATH_A];
|
|
break;
|
|
case rTxAGC_A_MCS11_MCS8_JAguar:
|
|
target = priv->pshare->tgpwr_HT2S_new[RF_PATH_A];
|
|
break;
|
|
case rTxAGC_A_MCS15_MCS12_JAguar:
|
|
target = priv->pshare->tgpwr_HT2S_new[RF_PATH_A];
|
|
break;
|
|
case rTxAGC_A_Nss1Index3_Nss1Index0_JAguar:
|
|
target = priv->pshare->tgpwr_VHT1S_new[RF_PATH_A];
|
|
break;
|
|
case rTxAGC_A_Nss1Index7_Nss1Index4_JAguar:
|
|
target = priv->pshare->tgpwr_VHT1S_new[RF_PATH_A];
|
|
break;
|
|
case rTxAGC_A_Nss2Index1_Nss1Index8_JAguar:
|
|
break;
|
|
case rTxAGC_A_Nss2Index5_Nss2Index2_JAguar:
|
|
target = priv->pshare->tgpwr_VHT2S_new[RF_PATH_A];
|
|
break;
|
|
case rTxAGC_A_Nss2Index9_Nss2Index6_JAguar:
|
|
target = priv->pshare->tgpwr_VHT2S_new[RF_PATH_A];
|
|
break;
|
|
case rTxAGC_B_CCK11_CCK1_JAguar:
|
|
target = priv->pshare->tgpwr_CCK_new[RF_PATH_B];
|
|
break;
|
|
case rTxAGC_B_Ofdm18_Ofdm6_JAguar:
|
|
target = priv->pshare->tgpwr_OFDM_new[RF_PATH_B];
|
|
break;
|
|
case rTxAGC_B_Ofdm54_Ofdm24_JAguar:
|
|
target = priv->pshare->tgpwr_OFDM_new[RF_PATH_B];
|
|
break;
|
|
case rTxAGC_B_MCS3_MCS0_JAguar:
|
|
target = priv->pshare->tgpwr_HT1S_new[RF_PATH_B];
|
|
break;
|
|
case rTxAGC_B_MCS7_MCS4_JAguar:
|
|
target = priv->pshare->tgpwr_HT1S_new[RF_PATH_B];
|
|
break;
|
|
case rTxAGC_B_MCS11_MCS8_JAguar:
|
|
target = priv->pshare->tgpwr_HT2S_new[RF_PATH_B];
|
|
break;
|
|
case rTxAGC_B_MCS15_MCS12_JAguar:
|
|
target = priv->pshare->tgpwr_HT2S_new[RF_PATH_B];
|
|
break;
|
|
case rTxAGC_B_Nss1Index3_Nss1Index0_JAguar:
|
|
target = priv->pshare->tgpwr_VHT1S_new[RF_PATH_B];
|
|
break;
|
|
case rTxAGC_B_Nss1Index7_Nss1Index4_JAguar:
|
|
target = priv->pshare->tgpwr_VHT1S_new[RF_PATH_B];
|
|
break;
|
|
case rTxAGC_B_Nss2Index1_Nss1Index8_JAguar:
|
|
break;
|
|
case rTxAGC_B_Nss2Index5_Nss2Index2_JAguar:
|
|
target = priv->pshare->tgpwr_VHT2S_new[RF_PATH_B];
|
|
break;
|
|
case rTxAGC_B_Nss2Index9_Nss2Index6_JAguar:
|
|
target = priv->pshare->tgpwr_VHT2S_new[RF_PATH_B];
|
|
break;
|
|
}
|
|
|
|
reg_value = gen_reg_value_2(target, tmp_byte, tmp_reg);
|
|
return reg_value;
|
|
|
|
}
|
|
#endif
|
|
|
|
|
|
static int find_str(char *line, char *str)
|
|
{
|
|
int len=0, idx=0;
|
|
char *ch = NULL;
|
|
|
|
if (!line ||!str || (strlen(str)>strlen(line)))
|
|
return 0;
|
|
|
|
ch = line;
|
|
while(1) {
|
|
if (strlen(line) - strlen(str) < (idx+1))
|
|
break;
|
|
|
|
if (!memcmp(&(line[idx]), str, strlen(str))) {
|
|
return idx;
|
|
//break;
|
|
}
|
|
idx++;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#if 0
|
|
static int get_target_val_new(struct rtl8192cd_priv *priv, unsigned char *line_head, unsigned int *u4bRegOffset, unsigned int *u4bMask, unsigned int *u4bRegValue)
|
|
{
|
|
int base, idx;
|
|
unsigned char *ch, *next, *pMask, *pValue;
|
|
extern int _atoi(char *s, int base);
|
|
|
|
unsigned char *b3, *b2, *b1, *b0;
|
|
unsigned char tmp_byte[4];
|
|
unsigned char lable = 0; //lable = {0: none, 1: 1Tx, 2: 2Tx}
|
|
|
|
|
|
*u4bRegOffset = *u4bRegValue = *u4bMask = '\0';
|
|
|
|
ch = line_head;
|
|
|
|
while (1) {
|
|
if ((*ch == '\0') || (*ch == '\n') || (*ch == '\r'))
|
|
break;
|
|
else if (*ch == '/') {
|
|
*ch = '\0';
|
|
break;
|
|
} else {
|
|
ch++;
|
|
}
|
|
}
|
|
|
|
if ((!memcmp(line_head, "0xff", 4)) || (!memcmp(line_head, "0XFF", 4)))
|
|
return 0;
|
|
|
|
if ((!memcmp(line_head, "0x", 2)) || (!memcmp(line_head, "0X", 2)))
|
|
{
|
|
base = 16;
|
|
idx = 2;
|
|
}
|
|
else if (!memcmp(line_head, "[1Tx]", 5))
|
|
{
|
|
lable = 1;
|
|
idx = find_str(line_head, "0x");
|
|
}
|
|
else if (!memcmp(line_head, "[2Tx]", 5))
|
|
{
|
|
lable = 2;
|
|
idx = find_str(line_head, "0x");
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if (lable)
|
|
{
|
|
*u4bRegOffset = _atoi((char *)&line_head[idx+2], base);
|
|
|
|
next = &(line_head[idx+2]);
|
|
pMask = get_digit(&next);
|
|
if (pMask) {
|
|
//*u4bMask = _atoi((char *)&pMask[2], 16);
|
|
|
|
if ((b3 = get_digit_dot(&pMask)) == NULL)
|
|
return 0;
|
|
//panic_printk("\nb3:%s\n", b3);
|
|
if ((b2 = get_digit_dot(&b3)) == NULL)
|
|
return 0;
|
|
//panic_printk("b2:%s\n", b2);
|
|
if ((b1 = get_digit_dot(&b2)) == NULL)
|
|
return 0;
|
|
//panic_printk("b1:%s\n", b1);
|
|
|
|
if ((b0 = get_digit_dot(&b1)) == NULL)
|
|
return 0;
|
|
//panic_printk("b0:%s\n", b0);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
*u4bRegOffset = _atoi((char *)&line_head[idx], base);
|
|
|
|
b3 = get_digit_dot(&line_head);
|
|
if (b3 == NULL)
|
|
return 0;
|
|
//panic_printk("b3:%s\n", b3);
|
|
b2 = get_digit_dot(&b3);
|
|
if (b2 == NULL)
|
|
return 0;
|
|
//panic_printk("b2:%s\n", b2);
|
|
b1 = get_digit_dot(&b2);
|
|
if (b1 == NULL)
|
|
return 0;
|
|
//panic_printk("b1:%s\n", b1);
|
|
b0 = get_digit_dot(&b1);
|
|
if (b0 == NULL)
|
|
return 0;
|
|
//panic_printk("b0:%s\n", b0);
|
|
}
|
|
|
|
base = 10;
|
|
idx = 0;
|
|
|
|
#if 1
|
|
tmp_byte[3] = _convert_2_pwr_dot(b3, base);
|
|
tmp_byte[2] = _convert_2_pwr_dot(b2, base);
|
|
tmp_byte[1] = _convert_2_pwr_dot(b1, base);
|
|
tmp_byte[0] = _convert_2_pwr_dot(b0, base);
|
|
#else
|
|
tmp_byte[3] = _atoi(b3, base);
|
|
tmp_byte[2] = _atoi(b2, base);
|
|
tmp_byte[1] = _atoi(b1, base);
|
|
tmp_byte[0] = _atoi(b0, base);
|
|
#endif
|
|
|
|
//printk("[%s] 0x%x: %d %d %d %d\n", __FUNCTION__, *u4bRegOffset, tmp_byte[3], tmp_byte[2], tmp_byte[1], tmp_byte[0]);
|
|
|
|
#if 0
|
|
panic_printk("[0x%x] tmp_byte = %02d-%02d-%02d-%02d\n", *u4bRegOffset,
|
|
tmp_byte[3], tmp_byte[2], tmp_byte[1], tmp_byte[0]);
|
|
#endif
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_WLAN_HAL_8192EE)//CONFIG_RTL_88E_SUPPORT
|
|
if(GET_CHIP_VER(priv) == VERSION_8188E || GET_CHIP_VER(priv)==VERSION_8192E)
|
|
assign_target_value_88e_new(priv, u4bRegOffset, tmp_byte);
|
|
#endif
|
|
#if defined( CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8881A)
|
|
if(GET_CHIP_VER(priv) == VERSION_8812E || GET_CHIP_VER(priv)==VERSION_8881A)
|
|
assign_target_value_8812_new(priv, u4bRegOffset, tmp_byte);
|
|
#endif
|
|
return 1;
|
|
}
|
|
#endif
|
|
|
|
static int get_offset_mask_val_new(struct rtl8192cd_priv *priv, unsigned char *line_head, unsigned int *u4bRegOffset, unsigned int *u4bMask, unsigned int *u4bRegValue)
|
|
{
|
|
int base, idx;
|
|
unsigned char *ch, *next, *pMask, *pValue;
|
|
extern int _atoi(char *s, int base);
|
|
|
|
unsigned char *b3, *b2, *b1, *b0;
|
|
unsigned char tmp_byte[4];
|
|
|
|
*u4bRegOffset = *u4bRegValue = *u4bMask = '\0';
|
|
|
|
ch = line_head;
|
|
|
|
while (1) {
|
|
if ((*ch == '\0') || (*ch == '\n') || (*ch == '\r'))
|
|
break;
|
|
else if (*ch == '/') {
|
|
*ch = '\0';
|
|
break;
|
|
} else {
|
|
ch++;
|
|
}
|
|
}
|
|
|
|
if ((!memcmp(line_head, "0xff", 4)) || (!memcmp(line_head, "0XFF", 4)))
|
|
return 0;
|
|
|
|
if ((!memcmp(line_head, "0x", 2)) || (!memcmp(line_head, "0X", 2)))
|
|
{
|
|
base = 16;
|
|
idx = 2;
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
*u4bRegOffset = _atoi((char *)&line_head[idx], base);
|
|
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188E) || (GET_CHIP_VER(priv) == VERSION_8192E))
|
|
*u4bMask = 0xffffffff;
|
|
else if (GET_CHIP_VER(priv) == VERSION_8812E || GET_CHIP_VER(priv)==VERSION_8881A)
|
|
*u4bMask = 0x7f7f7f7f;
|
|
|
|
b3 = get_digit_dot(&line_head);
|
|
if (b3 == NULL)
|
|
return 0;
|
|
|
|
b2 = get_digit_dot(&b3);
|
|
if (b2 == NULL)
|
|
return 0;
|
|
|
|
b1 = get_digit_dot(&b2);
|
|
if (b1 == NULL)
|
|
return 0;
|
|
|
|
b0 = get_digit_dot(&b1);
|
|
if (b0 == NULL)
|
|
return 0;
|
|
|
|
base = 10;
|
|
idx = 0;
|
|
|
|
#if 1
|
|
tmp_byte[3] = _convert_2_pwr_dot(b3, base);
|
|
tmp_byte[2] = _convert_2_pwr_dot(b2, base);
|
|
tmp_byte[1] = _convert_2_pwr_dot(b1, base);
|
|
tmp_byte[0] = _convert_2_pwr_dot(b0, base);
|
|
#else
|
|
tmp_byte[3] = _atoi(b3, base);
|
|
tmp_byte[2] = _atoi(b2, base);
|
|
tmp_byte[1] = _atoi(b1, base);
|
|
tmp_byte[0] = _atoi(b0, base);
|
|
#endif
|
|
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_WLAN_HAL_8192EE) //CONFIG_RTL_88E_SUPPORT
|
|
if(GET_CHIP_VER(priv) == VERSION_8188E || GET_CHIP_VER(priv) == VERSION_8192E)
|
|
*u4bRegValue = generate_u4bRegValue_88e_new(priv, u4bRegOffset, tmp_byte);
|
|
#endif
|
|
#if defined( CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8881A)
|
|
if(GET_CHIP_VER(priv) == VERSION_8812E || GET_CHIP_VER(priv)==VERSION_8881A)
|
|
*u4bRegValue = generate_u4bRegValue_8812_new(priv, u4bRegOffset, tmp_byte);
|
|
|
|
#endif
|
|
|
|
#if 0
|
|
panic_printk("[0x%x] tmp_byte = %02d-%02d-%02d-%02d ", *u4bRegOffset,
|
|
tmp_byte[3], tmp_byte[2], tmp_byte[1], tmp_byte[0]);
|
|
|
|
panic_printk(" [0x%08x]\n", *u4bRegValue);
|
|
#endif
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
static int get_offset_mask_val(unsigned char *line_head, unsigned int *u4bRegOffset, unsigned int *u4bMask, unsigned int *u4bRegValue)
|
|
{
|
|
unsigned char *next, *n1;
|
|
int base, idx;
|
|
int num = 0;
|
|
unsigned char *ch;
|
|
extern int _atoi(char * s, int base);
|
|
|
|
*u4bRegOffset = *u4bRegValue = *u4bMask = '\0';
|
|
|
|
ch = line_head;
|
|
while (1) {
|
|
if ((*ch == '\0') || (*ch == '\n') || (*ch == '\r'))
|
|
break;
|
|
else if (*ch == '/') {
|
|
*ch = '\0';
|
|
break;
|
|
} else {
|
|
ch++;
|
|
}
|
|
}
|
|
|
|
next = get_digit(&line_head);
|
|
if (next == NULL)
|
|
return num;
|
|
num++;
|
|
if ((!memcmp(line_head, "0x", 2)) || (!memcmp(line_head, "0X", 2))) {
|
|
base = 16;
|
|
idx = 2;
|
|
} else {
|
|
base = 10;
|
|
idx = 0;
|
|
}
|
|
*u4bRegOffset = _atoi((char *)&line_head[idx], base);
|
|
|
|
if (next) {
|
|
n1 = get_digit(&next);
|
|
if (n1 == NULL)
|
|
return num;
|
|
num++;
|
|
if ((!memcmp(next, "0x", 2)) || (!memcmp(next, "0X", 2))) {
|
|
base = 16;
|
|
idx = 2;
|
|
} else {
|
|
base = 10;
|
|
idx = 0;
|
|
}
|
|
*u4bMask = _atoi((char *)&next[idx], base);
|
|
|
|
if (n1) {
|
|
if (!get_digit(&n1))
|
|
return num;
|
|
num++;
|
|
if ((!memcmp(n1, "0x", 2)) || (!memcmp(n1, "0X", 2))) {
|
|
base = 16;
|
|
idx = 2;
|
|
} else {
|
|
base = 10;
|
|
idx = 0;
|
|
}
|
|
*u4bRegValue = _atoi((char *)&n1[idx], base);
|
|
} else
|
|
*u4bRegValue = 0;
|
|
} else
|
|
*u4bMask = 0;
|
|
|
|
return num;
|
|
}
|
|
|
|
|
|
unsigned char *get_line(unsigned char **line)
|
|
{
|
|
unsigned char *p = *line;
|
|
|
|
while (*p && ((*p == '\n') || (*p == '\r')))
|
|
p++;
|
|
|
|
if (*p == '\0') {
|
|
*line = NULL;
|
|
return NULL;
|
|
}
|
|
*line = p;
|
|
|
|
while (*p && (*p != '\n') && (*p != '\r'))
|
|
p++;
|
|
|
|
*p = '\0';
|
|
return p + 1;
|
|
}
|
|
|
|
int ch2idx(int ch)
|
|
{
|
|
int val = -1;
|
|
// |1~14|36, 38, 40, ..., 64|100, 102, ..., 140|149, 151, ..., 165|
|
|
if (ch <= 14)
|
|
val = ch - 1;
|
|
else if (ch <= 64)
|
|
val = ((ch - 36) >> 1) + 14;
|
|
else if (ch <= 140)
|
|
val = ((ch - 100) >> 1) + 29;
|
|
else if (ch <= 165)
|
|
val = ((ch - 149) >> 1) + 50;
|
|
|
|
return val;
|
|
}
|
|
|
|
#ifdef TXPWR_LMT
|
|
#ifdef TXPWR_LMT_NEWFILE
|
|
void find_pwr_limit_new(struct rtl8192cd_priv *priv, int channel, int offset)
|
|
{
|
|
int chidx_20 = 0, chidx_40 = 0, chidx_80 = 0;
|
|
int working_channel_40m = 0;
|
|
int working_channel_80m = get_center_channel(priv, channel, offset,1);
|
|
|
|
working_channel_40m = (priv->pshare->CurrentChannelBW ? ((offset==1) ? (channel-2) : (channel+2)) : channel);
|
|
|
|
chidx_20 = ch2idx(channel);
|
|
chidx_40 = ch2idx(working_channel_40m);
|
|
chidx_80 = ch2idx(working_channel_80m);
|
|
|
|
#if 0
|
|
panic_printk("[BW%dM]: central channel %d %d %d ==> index %d %d %d:\n",
|
|
20*(1 << priv->pshare->CurrentChannelBW),
|
|
channel, working_channel_40m, working_channel_80m,
|
|
chidx_20, chidx_40, chidx_80);
|
|
#endif
|
|
|
|
if ((chidx_20>=0) && (chidx_40>=0) && (chidx_80>=0)) {
|
|
priv->pshare->txpwr_lmt_CCK = priv->pshare->ch_pwr_lmtCCK[chidx_20];
|
|
priv->pshare->txpwr_lmt_OFDM = priv->pshare->ch_pwr_lmtOFDM[chidx_20];
|
|
|
|
if (priv->pshare->CurrentChannelBW == 2){ //BW=80M
|
|
priv->pshare->txpwr_lmt_HT1S = priv->pshare->ch_pwr_lmtHT40_1S[chidx_40];
|
|
priv->pshare->txpwr_lmt_HT2S = priv->pshare->ch_pwr_lmtHT40_2S[chidx_40];
|
|
priv->pshare->txpwr_lmt_VHT1S = priv->pshare->ch_pwr_lmtVHT80_1S[chidx_80];
|
|
priv->pshare->txpwr_lmt_VHT2S = priv->pshare->ch_pwr_lmtVHT80_2S[chidx_80];
|
|
} else if (priv->pshare->CurrentChannelBW == 1){ //BW=40M
|
|
priv->pshare->txpwr_lmt_HT1S = priv->pshare->ch_pwr_lmtHT40_1S[chidx_40];
|
|
priv->pshare->txpwr_lmt_HT2S = priv->pshare->ch_pwr_lmtHT40_2S[chidx_40];
|
|
priv->pshare->txpwr_lmt_VHT1S = priv->pshare->ch_pwr_lmtHT40_1S[chidx_40];
|
|
priv->pshare->txpwr_lmt_VHT2S = priv->pshare->ch_pwr_lmtHT40_2S[chidx_40];
|
|
} else { //BW=20M
|
|
priv->pshare->txpwr_lmt_HT1S = priv->pshare->ch_pwr_lmtHT20_1S[chidx_20];
|
|
priv->pshare->txpwr_lmt_HT2S = priv->pshare->ch_pwr_lmtHT20_2S[chidx_20];
|
|
priv->pshare->txpwr_lmt_VHT1S = priv->pshare->ch_pwr_lmtHT20_1S[chidx_20];
|
|
priv->pshare->txpwr_lmt_VHT2S = priv->pshare->ch_pwr_lmtHT20_2S[chidx_20];
|
|
}
|
|
|
|
if (priv->pmib->dot11RFEntry.tx2path && !priv->pshare->rf_ft_var.disable_txpwrlmt2path) {
|
|
if (priv->pshare->txpwr_lmt_CCK)
|
|
priv->pshare->txpwr_lmt_CCK -= 6;
|
|
if (priv->pshare->txpwr_lmt_OFDM)
|
|
priv->pshare->txpwr_lmt_OFDM -= 6;
|
|
if (priv->pshare->txpwr_lmt_HT1S)
|
|
priv->pshare->txpwr_lmt_HT1S -= 6;
|
|
if (priv->pshare->txpwr_lmt_VHT1S)
|
|
priv->pshare->txpwr_lmt_VHT1S -= 6;
|
|
}
|
|
} else {
|
|
priv->pshare->txpwr_lmt_CCK = 0;
|
|
priv->pshare->txpwr_lmt_OFDM = 0;
|
|
priv->pshare->txpwr_lmt_HT1S = 0;
|
|
priv->pshare->txpwr_lmt_HT2S = 0;
|
|
priv->pshare->txpwr_lmt_VHT1S = 0;
|
|
priv->pshare->txpwr_lmt_VHT2S = 0;
|
|
DEBUG_INFO("Cannot map current working channel to find power limit!\n");
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
void find_pwr_limit(struct rtl8192cd_priv *priv, int channel, int offset)
|
|
{
|
|
int chidx_20 = 0, chidx_40 = 0;
|
|
int working_channel_40m = get_center_channel(priv, channel, offset,1);
|
|
|
|
chidx_20 = ch2idx(channel);
|
|
chidx_40 = ch2idx(working_channel_40m);
|
|
|
|
#if 0
|
|
panic_printk("[BW%dM]: central channel[ %d %d ]==> index[ %d %d %d ]\n",
|
|
20*(1 << priv->pshare->CurrentChannelBW),
|
|
channel, working_channel_40m,
|
|
chidx_20, chidx_40);
|
|
#endif
|
|
|
|
if ((chidx_20 >= 0) && (chidx_40 >= 0)) {
|
|
priv->pshare->txpwr_lmt_CCK = priv->pshare->ch_pwr_lmtCCK[chidx_20];
|
|
priv->pshare->txpwr_lmt_OFDM = priv->pshare->ch_pwr_lmtOFDM[chidx_20];
|
|
priv->pshare->tgpwr_CCK = priv->pshare->ch_tgpwr_CCK[chidx_20];
|
|
priv->pshare->tgpwr_OFDM = priv->pshare->ch_tgpwr_OFDM[chidx_20];
|
|
|
|
if (priv->pshare->CurrentChannelBW) {
|
|
priv->pshare->txpwr_lmt_HT1S = priv->pshare->ch_pwr_lmtHT40_1S[chidx_40];
|
|
priv->pshare->txpwr_lmt_HT2S = priv->pshare->ch_pwr_lmtHT40_2S[chidx_40];
|
|
priv->pshare->tgpwr_HT1S = priv->pshare->ch_tgpwr_HT40_1S[chidx_40];
|
|
priv->pshare->tgpwr_HT2S = priv->pshare->ch_tgpwr_HT40_2S[chidx_40];
|
|
} else { //if 20M bw, tmp == tmp2 ??
|
|
priv->pshare->txpwr_lmt_HT1S = priv->pshare->ch_pwr_lmtHT20_1S[chidx_20];
|
|
priv->pshare->txpwr_lmt_HT2S = priv->pshare->ch_pwr_lmtHT20_2S[chidx_20];
|
|
priv->pshare->tgpwr_HT1S = priv->pshare->ch_tgpwr_HT20_1S[chidx_20];
|
|
priv->pshare->tgpwr_HT2S = priv->pshare->ch_tgpwr_HT20_2S[chidx_20];
|
|
}
|
|
} else {
|
|
priv->pshare->txpwr_lmt_CCK = 0;
|
|
priv->pshare->txpwr_lmt_OFDM = 0;
|
|
priv->pshare->txpwr_lmt_HT1S = 0;
|
|
priv->pshare->txpwr_lmt_HT2S = 0;
|
|
|
|
printk("Cannot map current working channel to find power limit!\n");
|
|
}
|
|
|
|
//printk("txpwr_lmt_OFDM %d tgpwr_OFDM %d\n", priv->pshare->txpwr_lmt_OFDM, priv->pshare->tgpwr_OFDM);
|
|
|
|
}
|
|
|
|
#ifdef TXPWR_LMT_NEWFILE
|
|
#define LMT_TABLE_NUM 13
|
|
|
|
#define BAND2G_20M_1T_CCK 1
|
|
#define BAND2G_20M_1T_OFDM 2
|
|
#define BAND2G_20M_1T_HT 3
|
|
#define BAND2G_20M_2T_HT 4
|
|
#define BAND2G_40M_1T_HT 5
|
|
#define BAND2G_40M_2T_HT 6
|
|
|
|
#define BAND5G_20M_1T_OFDM 7
|
|
#define BAND5G_20M_1T_HT 8
|
|
#define BAND5G_20M_2T_HT 9
|
|
#define BAND5G_40M_1T_HT 10
|
|
#define BAND5G_40M_2T_HT 11
|
|
#define BAND5G_80M_1T_VHT 12
|
|
#define BAND5G_80M_2T_VHT 13
|
|
|
|
int PHY_ConfigTXLmtWithParaFile_new(struct rtl8192cd_priv *priv)
|
|
{
|
|
int read_bytes, found, num, len=0;
|
|
unsigned int channel, limit, table_idx = 0;
|
|
unsigned char *mem_ptr, *line_head, *next_head;
|
|
int tbl_idx[13], set_en=0, type=-1;
|
|
struct TxPwrLmtTable_new *reg_table;
|
|
|
|
unsigned int tmp =0;
|
|
|
|
priv->pshare->txpwr_lmt_CCK = 0;
|
|
priv->pshare->txpwr_lmt_OFDM = 0;
|
|
priv->pshare->txpwr_lmt_HT1S = 0;
|
|
priv->pshare->txpwr_lmt_HT2S = 0;
|
|
priv->pshare->txpwr_lmt_VHT1S = 0;
|
|
priv->pshare->txpwr_lmt_VHT2S = 0;
|
|
|
|
reg_table = (struct TxPwrLmtTable *)priv->pshare->txpwr_lmt_buf;
|
|
|
|
if((mem_ptr = (unsigned char *)rtw_vmalloc(MAX_CONFIG_FILE_SIZE)) == NULL) {
|
|
printk("PHY_ConfigMACWithParaFile(): not enough memory\n");
|
|
return -1;
|
|
}
|
|
|
|
DEBUG_INFO("regdomain=%d\n",priv->pmib->dot11StationConfigEntry.dot11RegDomain);
|
|
|
|
memset(mem_ptr, 0, MAX_CONFIG_FILE_SIZE); // clear memory
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if(GET_CHIP_VER(priv) == VERSION_8812E){
|
|
panic_printk("[TXPWR_LMT_8812_new]\n");
|
|
next_head = data_TXPWR_LMT_8812_new_start;
|
|
read_bytes = (int)(data_TXPWR_LMT_8812_new_end - data_TXPWR_LMT_8812_new_start);
|
|
}
|
|
else
|
|
#endif
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if(GET_CHIP_VER(priv) == VERSION_8188E){
|
|
panic_printk("[TXPWR_LMT_88E_new]\n");
|
|
next_head = data_TXPWR_LMT_88E_new_start;
|
|
read_bytes = (int)(data_TXPWR_LMT_88E_new_end - data_TXPWR_LMT_88E_new_start);
|
|
}
|
|
else
|
|
#endif
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if ( IS_HAL_CHIP(priv) ) {
|
|
#ifdef PWR_BY_RATE_92E_HP
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa && GET_CHIP_VER(priv) == VERSION_8192E) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_POWERLIMITFILE_HP_SIZE, (pu1Byte)&read_bytes);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_POWERLIMITFILE_HP_START, (pu1Byte)&next_head);
|
|
} else
|
|
#endif
|
|
#endif
|
|
{
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_POWERLIMITFILE_SIZE, (pu1Byte)&read_bytes);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_POWERLIMITFILE_START, (pu1Byte)&next_head);
|
|
}
|
|
} else
|
|
#endif
|
|
{
|
|
printk("This WiFi IC not support Tx Power limit !!\n");
|
|
rtw_vmfree(mem_ptr, MAX_CONFIG_FILE_SIZE);
|
|
return -1;
|
|
}
|
|
|
|
memcpy(mem_ptr, next_head, read_bytes);
|
|
|
|
next_head = mem_ptr;
|
|
while (1) {
|
|
line_head = next_head;
|
|
next_head = get_line(&line_head);
|
|
|
|
if (line_head == NULL)
|
|
break;
|
|
|
|
if ((line_head[0] == '/') && (line_head[2] != 'T'))
|
|
continue;
|
|
|
|
found = get_chnl_lmt_dot_new(priv, line_head, &channel, &limit, &table_idx);
|
|
|
|
if (found > 0) {
|
|
reg_table[len].channel = channel;
|
|
reg_table[len].limit = limit;
|
|
reg_table[len].table_idx = table_idx;
|
|
|
|
len++;
|
|
if ((len * sizeof(struct TxPwrLmtTable_new)) > MAC_REG_SIZE)
|
|
break;
|
|
}
|
|
}
|
|
|
|
rtw_vmfree(mem_ptr, MAX_CONFIG_FILE_SIZE);
|
|
|
|
if ((len * sizeof(struct TxPwrLmtTable_new)) > MAC_REG_SIZE) {
|
|
printk("TXPWR_LMT table buffer not large enough!\n");
|
|
return -1;
|
|
}
|
|
|
|
num = 0;
|
|
|
|
memset(priv->pshare->ch_pwr_lmtOFDM, 0, SUPPORT_CH_NUM);
|
|
memset(priv->pshare->ch_pwr_lmtHT20_1S, 0, SUPPORT_CH_NUM);
|
|
memset(priv->pshare->ch_pwr_lmtHT20_2S, 0, SUPPORT_CH_NUM);
|
|
memset(priv->pshare->ch_pwr_lmtHT40_1S, 0, SUPPORT_CH_NUM);
|
|
memset(priv->pshare->ch_pwr_lmtHT40_2S, 0, SUPPORT_CH_NUM);
|
|
memset(priv->pshare->ch_pwr_lmtVHT80_1S, 0, SUPPORT_CH_NUM);
|
|
memset(priv->pshare->ch_pwr_lmtVHT80_2S, 0, SUPPORT_CH_NUM);
|
|
|
|
while (1) {
|
|
channel = reg_table[num].channel;
|
|
limit = reg_table[num].limit;
|
|
table_idx = reg_table[num].table_idx;
|
|
|
|
if(channel > 0)
|
|
{
|
|
//printk(">> [%02d]-%03d-%02d\n", table_idx, channel , limit);
|
|
|
|
if(priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_2G)
|
|
if ((table_idx >= BAND2G_20M_1T_CCK) && (table_idx <= BAND2G_40M_2T_HT)){
|
|
|
|
int j = ch2idx(channel);
|
|
|
|
if (table_idx == BAND2G_20M_1T_CCK){
|
|
priv->pshare->ch_pwr_lmtCCK[j] = limit;
|
|
}else if (table_idx == BAND2G_20M_1T_OFDM){
|
|
priv->pshare->ch_pwr_lmtOFDM[j] = limit;
|
|
}else if (table_idx == BAND2G_20M_1T_HT){
|
|
priv->pshare->ch_pwr_lmtHT20_1S[j] = limit;
|
|
}else if (table_idx == BAND2G_20M_2T_HT){
|
|
priv->pshare->ch_pwr_lmtHT20_2S[j] = limit;
|
|
}else if (table_idx == BAND2G_40M_1T_HT){
|
|
priv->pshare->ch_pwr_lmtHT40_1S[j] = limit;
|
|
}else if (table_idx == BAND2G_40M_2T_HT){
|
|
priv->pshare->ch_pwr_lmtHT40_2S[j] = limit;
|
|
}
|
|
}
|
|
|
|
if(priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_5G)
|
|
if ( (table_idx >= BAND5G_20M_1T_OFDM) && (table_idx <= BAND5G_80M_2T_VHT)){
|
|
|
|
int j = ch2idx(channel);
|
|
|
|
if (table_idx == BAND5G_20M_1T_OFDM){
|
|
priv->pshare->ch_pwr_lmtOFDM[j] = limit;
|
|
}else if (table_idx == BAND5G_20M_1T_HT){
|
|
priv->pshare->ch_pwr_lmtHT20_1S[j] = limit;
|
|
}else if (table_idx == BAND5G_20M_2T_HT){
|
|
priv->pshare->ch_pwr_lmtHT20_2S[j] = limit;
|
|
}else if (table_idx == BAND5G_40M_1T_HT){
|
|
priv->pshare->ch_pwr_lmtHT40_1S[j] = limit;
|
|
}else if (table_idx == BAND5G_40M_2T_HT){
|
|
priv->pshare->ch_pwr_lmtHT40_2S[j] = limit;
|
|
}else if (table_idx == BAND5G_80M_1T_VHT){
|
|
priv->pshare->ch_pwr_lmtVHT80_1S[j] = limit;
|
|
}else if (table_idx == BAND5G_80M_2T_VHT){
|
|
priv->pshare->ch_pwr_lmtVHT80_2S[j] = limit;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
num++;
|
|
|
|
if(num >= len)
|
|
break;
|
|
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#endif
|
|
|
|
int PHY_ConfigTXLmtWithParaFile(struct rtl8192cd_priv *priv)
|
|
{
|
|
int read_bytes, num, len = 0;
|
|
unsigned int ch_start, ch_end, limit, target = 0;
|
|
unsigned char *mem_ptr, *line_head, *next_head;
|
|
int tbl_idx[6], set_en = 0, type = -1;
|
|
struct TxPwrLmtTable *reg_table;
|
|
|
|
priv->pshare->txpwr_lmt_CCK = 0;
|
|
priv->pshare->txpwr_lmt_OFDM = 0;
|
|
priv->pshare->txpwr_lmt_HT1S = 0;
|
|
priv->pshare->txpwr_lmt_HT2S = 0;
|
|
|
|
reg_table = (struct TxPwrLmtTable *)priv->pshare->txpwr_lmt_buf;
|
|
|
|
if ((GET_CHIP_VER(priv) != VERSION_8192D) && (GET_CHIP_VER(priv) != VERSION_8192C) && (GET_CHIP_VER(priv) != VERSION_8188C)) {
|
|
printk("[%s]NOT support! TXPWR_LMT is for RTL8192D & 92C/88C ONLY!\n", __FUNCTION__);
|
|
return -1;
|
|
}
|
|
|
|
if ((mem_ptr = (unsigned char *)rtw_vmalloc(MAX_CONFIG_FILE_SIZE)) == NULL) {
|
|
printk("PHY_ConfigTXLmtWithParaFile(): not enough memory\n");
|
|
return -1;
|
|
}
|
|
|
|
|
|
tbl_idx[0] = 1;
|
|
tbl_idx[1] = 2;
|
|
tbl_idx[2] = 3;
|
|
tbl_idx[3] = 4;
|
|
tbl_idx[4] = 5;
|
|
tbl_idx[5] = 6;
|
|
|
|
|
|
DEBUG_INFO("regdomain=%d tbl_idx=%d,%d\n", priv->pmib->dot11StationConfigEntry.dot11RegDomain, tbl_idx[0], tbl_idx[1]);
|
|
|
|
|
|
memset(mem_ptr, 0, MAX_CONFIG_FILE_SIZE); // clear memory
|
|
|
|
printk("[%s][TXPWR_LMT]\n", __FUNCTION__);
|
|
|
|
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if((GET_CHIP_VER(priv)==VERSION_8192C) || (GET_CHIP_VER(priv)==VERSION_8188C))
|
|
{
|
|
int txpwr_lmt_index;
|
|
|
|
if(priv->pmib->dot11StationConfigEntry.txpwr_lmt_index <= 0) {
|
|
// if mib txpwr_lmt_index is default value
|
|
if(priv->pmib->dot11StationConfigEntry.dot11RegDomain==DOMAIN_FCC)
|
|
txpwr_lmt_index = 1;
|
|
else if(priv->pmib->dot11StationConfigEntry.dot11RegDomain==DOMAIN_ETSI)
|
|
txpwr_lmt_index = 2;
|
|
else
|
|
txpwr_lmt_index = TXPWR_LMT_92c_MAX + 1;
|
|
}
|
|
else {
|
|
txpwr_lmt_index = priv->pmib->dot11StationConfigEntry.txpwr_lmt_index;
|
|
}
|
|
|
|
if(txpwr_lmt_index <= TXPWR_LMT_92c_MAX &&
|
|
data_TXPWR_LMT_92c_array[txpwr_lmt_index])
|
|
{
|
|
|
|
next_head = data_TXPWR_LMT_92c_array[txpwr_lmt_index];
|
|
read_bytes = data_TXPWR_LMT_92c_array_end[txpwr_lmt_index] - data_TXPWR_LMT_92c_array[txpwr_lmt_index];
|
|
}
|
|
else
|
|
{
|
|
// When compiling error is "undefine data_TXPWR_LMT_92c"
|
|
// Please check if the file,rtl8192cd/data/TXPWR_LMT_92c.txt, exits.
|
|
next_head = data_TXPWR_LMT_92c;
|
|
read_bytes = (int)sizeof(data_TXPWR_LMT_92c);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if(GET_CHIP_VER(priv)==VERSION_8192D)
|
|
{
|
|
|
|
int txpwr_lmt_index;
|
|
|
|
if(priv->pmib->dot11StationConfigEntry.txpwr_lmt_index <= 0) {
|
|
// if mib txpwr_lmt_index is default value
|
|
if(priv->pmib->dot11StationConfigEntry.dot11RegDomain==DOMAIN_FCC)
|
|
txpwr_lmt_index = 1;
|
|
else if(priv->pmib->dot11StationConfigEntry.dot11RegDomain==DOMAIN_ETSI)
|
|
txpwr_lmt_index = 2;
|
|
else
|
|
txpwr_lmt_index = TXPWR_LMT_92d_MAX + 1;
|
|
}
|
|
else {
|
|
txpwr_lmt_index = priv->pmib->dot11StationConfigEntry.txpwr_lmt_index;
|
|
}
|
|
|
|
if(txpwr_lmt_index <= TXPWR_LMT_92d_MAX &&
|
|
data_TXPWR_LMT_92d_array[txpwr_lmt_index])
|
|
{
|
|
|
|
next_head = data_TXPWR_LMT_92d_array[txpwr_lmt_index];
|
|
read_bytes = data_TXPWR_LMT_92d_array_end[txpwr_lmt_index] -
|
|
data_TXPWR_LMT_92d_array[txpwr_lmt_index];
|
|
} else
|
|
{
|
|
// Note: default TX Power Limit
|
|
// When compiling error is "undefine data_TXPWR_LMT_92d"
|
|
// Please check if the file,rtl8192cd/data/TXPWR_LMT_92d.txt, exits.
|
|
next_head = data_TXPWR_LMT_92d;
|
|
read_bytes = (int)sizeof(data_TXPWR_LMT_92d);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
memcpy(mem_ptr, next_head, read_bytes);
|
|
|
|
next_head = mem_ptr;
|
|
while (1) {
|
|
line_head = next_head;
|
|
next_head = get_line(&line_head);
|
|
|
|
if (line_head == NULL)
|
|
break;
|
|
|
|
if (line_head[0] == '/')
|
|
continue;
|
|
|
|
num = get_chnl_lmt_dot(line_head, &ch_start, &ch_end, &limit, &target);
|
|
|
|
if (num > 0) {
|
|
reg_table[len].start = ch_start;
|
|
reg_table[len].end = ch_end;
|
|
reg_table[len].limit = limit;
|
|
reg_table[len].target = target;
|
|
|
|
len++;
|
|
if ((len * sizeof(struct TxPwrLmtTable)) > MAC_REG_SIZE)
|
|
break;
|
|
}
|
|
}
|
|
|
|
reg_table[len].start = 0xff;
|
|
|
|
rtw_vmfree(mem_ptr, MAX_CONFIG_FILE_SIZE);
|
|
|
|
if ((len * sizeof(struct TxPwrLmtTable)) > MAC_REG_SIZE) {
|
|
printk("TXPWR_LMT table buffer not large enough!\n");
|
|
return -1;
|
|
}
|
|
|
|
num = 0;
|
|
while (1) {
|
|
ch_start = reg_table[num].start;
|
|
ch_end = reg_table[num].end;
|
|
limit = reg_table[num].limit;
|
|
target = reg_table[num].target;
|
|
|
|
//printk(">> %d-%d-%d-%d\n",ch_start,ch_end,limit,target);
|
|
if (ch_start == 0xff)
|
|
break;
|
|
|
|
if (ch_start == 0 && ch_end == 0) {
|
|
if (limit == tbl_idx[0]) {
|
|
set_en = 1;
|
|
type = 0;
|
|
memset(priv->pshare->ch_pwr_lmtCCK, 0, SUPPORT_CH_NUM);
|
|
memset(priv->pshare->ch_tgpwr_CCK, 0, SUPPORT_CH_NUM);
|
|
} else if (limit == tbl_idx[1]) {
|
|
set_en = 1;
|
|
type = 1;
|
|
memset(priv->pshare->ch_pwr_lmtOFDM, 0, SUPPORT_CH_NUM);
|
|
memset(priv->pshare->ch_tgpwr_OFDM, 0, SUPPORT_CH_NUM);
|
|
} else if (limit == tbl_idx[2]) {
|
|
set_en = 1;
|
|
type = 2;
|
|
memset(priv->pshare->ch_pwr_lmtHT20_1S, 0, SUPPORT_CH_NUM);
|
|
memset(priv->pshare->ch_tgpwr_HT20_1S, 0, SUPPORT_CH_NUM);
|
|
} else if (limit == tbl_idx[3]) {
|
|
set_en = 1;
|
|
type = 3;
|
|
memset(priv->pshare->ch_pwr_lmtHT20_2S, 0, SUPPORT_CH_NUM);
|
|
memset(priv->pshare->ch_tgpwr_HT20_2S, 0, SUPPORT_CH_NUM);
|
|
} else if (limit == tbl_idx[4]) {
|
|
set_en = 1;
|
|
type = 4;
|
|
memset(priv->pshare->ch_pwr_lmtHT40_1S, 0, SUPPORT_CH_NUM);
|
|
memset(priv->pshare->ch_tgpwr_HT40_1S, 0, SUPPORT_CH_NUM);
|
|
} else if (limit == tbl_idx[5]) {
|
|
set_en = 1;
|
|
type = 5;
|
|
memset(priv->pshare->ch_pwr_lmtHT40_2S, 0, SUPPORT_CH_NUM);
|
|
memset(priv->pshare->ch_tgpwr_HT40_2S, 0, SUPPORT_CH_NUM);
|
|
} else {
|
|
set_en = 0;
|
|
}
|
|
}
|
|
|
|
if (set_en && ch_start) {
|
|
int j;
|
|
for (j = ch2idx(ch_start); j <= ch2idx(ch_end); j++) {
|
|
if (j < 0 || j >= SUPPORT_CH_NUM) {
|
|
panic_printk("channel out of bound!!\n");
|
|
break;
|
|
}
|
|
|
|
if (type == 0) {
|
|
priv->pshare->ch_pwr_lmtCCK[j] = limit;
|
|
priv->pshare->ch_tgpwr_CCK[j] = target;
|
|
} else if (type == 1) {
|
|
priv->pshare->ch_pwr_lmtOFDM[j] = limit;
|
|
priv->pshare->ch_tgpwr_OFDM[j] = target;
|
|
} else if (type == 2) {
|
|
priv->pshare->ch_pwr_lmtHT20_1S[j] = limit;
|
|
priv->pshare->ch_tgpwr_HT20_1S[j] = target;
|
|
} else if (type == 3) {
|
|
priv->pshare->ch_pwr_lmtHT20_2S[j] = limit;
|
|
priv->pshare->ch_tgpwr_HT20_2S[j] = target;
|
|
} else if (type == 4) {
|
|
priv->pshare->ch_pwr_lmtHT40_1S[j] = limit;
|
|
priv->pshare->ch_tgpwr_HT40_1S[j] = target;
|
|
} else if (type == 5) {
|
|
priv->pshare->ch_pwr_lmtHT40_2S[j] = limit;
|
|
priv->pshare->ch_tgpwr_HT40_2S[j] = target;
|
|
}
|
|
}
|
|
}
|
|
|
|
num++;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
#ifdef _TRACKING_TABLE_FILE
|
|
|
|
static char TXPWR_TRACKING_NAME[][32] = {
|
|
"2GCCKA_P",
|
|
"2GCCKA_N",
|
|
"2GCCKB_P",
|
|
"2GCCKB_N",
|
|
"2GA_P",
|
|
"2GA_N",
|
|
"2GB_P",
|
|
"2GB_N",
|
|
"5GLA_P",
|
|
"5GLA_N",
|
|
"5GLB_P",
|
|
"5GLB_N",
|
|
"5GMA_P",
|
|
"5GMA_N",
|
|
"5GMB_P",
|
|
"5GMB_N",
|
|
"5GHA_P",
|
|
"5GHA_N",
|
|
"5GHB_P",
|
|
"5GHB_N",
|
|
};
|
|
|
|
#if 1// not used
|
|
static char TXPWR_TRACKING_NAME_NEW[][32] = {
|
|
"[2G][A][+][CCK]",
|
|
"[2G][A][-][CCK]",
|
|
"[2G][B][+][CCK]",
|
|
"[2G][B][-][CCK]",
|
|
"[2G][A][+][ALL]",
|
|
"[2G][A][-][ALL]",
|
|
"[2G][B][+][ALL]",
|
|
"[2G][B][-][ALL]",
|
|
"[5G][A][+][ALL][0]",
|
|
"[5G][A][-][ALL][0]",
|
|
"[5G][B][+][ALL][0]",
|
|
"[5G][B][-][ALL][0]",
|
|
"[5G][A][+][ALL][1]",
|
|
"[5G][A][-][ALL][1]",
|
|
"[5G][B][+][ALL][1]",
|
|
"[5G][B][-][ALL][1]",
|
|
"[5G][A][+][ALL][2]",
|
|
"[5G][A][-][ALL][2]",
|
|
"[5G][B][+][ALL][2]",
|
|
"[5G][B][-][ALL][2]",
|
|
};
|
|
#endif
|
|
|
|
//#ifndef TXPWR_LMT
|
|
|
|
int _convert_2_pwr_tracking(char *s, int base)
|
|
{
|
|
int k = 0;
|
|
|
|
k = 0;
|
|
if (base == 10) {
|
|
while (*s >= '0' && *s <= '9') {
|
|
k = 10 * k + (*s - '0');
|
|
s++;
|
|
}
|
|
} else
|
|
return 0;
|
|
|
|
return k;
|
|
}
|
|
|
|
|
|
static unsigned char *get_digit_tracking(unsigned char **data)
|
|
{
|
|
unsigned char *buf = *data;
|
|
int i = 0;
|
|
|
|
*data = &buf[i];
|
|
|
|
while (buf[i]) {
|
|
if ((buf[i] == '\n') || (buf[i] == '\r')) {
|
|
return NULL;
|
|
}
|
|
|
|
if ((buf[i] == ' ') || (buf[i] == '\t'))
|
|
break;
|
|
|
|
i++;
|
|
}
|
|
|
|
while (buf[i]) {
|
|
|
|
if ((buf[i] == '\n') || (buf[i] == '\r')) {
|
|
return NULL;
|
|
}
|
|
|
|
if ((buf[i] >= '0') && (buf[i] <= '9')) {
|
|
//printk("found buf[i] = %c \n", buf[i]);
|
|
return &buf[i];
|
|
}
|
|
|
|
i++;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
//#endif
|
|
|
|
|
|
void input_tracking_value(struct rtl8192cd_priv *priv, int offset, int num, int value)
|
|
{
|
|
|
|
switch (offset) {
|
|
case CCKA_P:
|
|
case CCKA_N:
|
|
case CCKB_P:
|
|
case CCKB_N:
|
|
offset = (offset % 4);
|
|
priv->pshare->txpwr_tracking_2G_CCK[offset][num] = value;
|
|
break;
|
|
case A_P:
|
|
case A_N:
|
|
case B_P:
|
|
case B_N:
|
|
offset = (offset % 4);
|
|
priv->pshare->txpwr_tracking_2G_OFDM[offset][num] = value;
|
|
break;
|
|
case LA_P:
|
|
case LA_N:
|
|
case LB_P:
|
|
case LB_N:
|
|
offset = (offset % 4);
|
|
priv->pshare->txpwr_tracking_5GL[offset][num] = value;
|
|
//printk("txpwr_tracking_5GL[%d][%d]=%d\n", offset, num,value);
|
|
break;
|
|
case MA_P:
|
|
case MA_N:
|
|
case MB_P:
|
|
case MB_N:
|
|
offset = (offset % 4);
|
|
priv->pshare->txpwr_tracking_5GM[offset][num] = value;
|
|
//printk("txpwr_tracking_5GM[%d][%d]=%d\n", offset, num,value);
|
|
break;
|
|
case HA_P:
|
|
case HA_N:
|
|
case HB_P:
|
|
case HB_N:
|
|
offset = (offset % 4);
|
|
priv->pshare->txpwr_tracking_5GH[offset][num] = value;
|
|
//printk("txpwr_tracking_5GH[%d][%d]=%d\n", offset, num,value);
|
|
break;
|
|
default:
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
int get_tx_tracking_index(struct rtl8192cd_priv *priv, int channel, int i, int delta, int is_decrease, int is_CCK)
|
|
{
|
|
int index = 0;
|
|
|
|
if (delta == 0)
|
|
return 0;
|
|
|
|
if (delta > index_mapping_NUM_MAX)
|
|
delta = index_mapping_NUM_MAX;
|
|
|
|
//printk("\n_eric_tracking +++ channel = %d, i = %d, delta = %d, is_decrease = %d, is_CCK = %d\n", channel, i, delta, is_decrease, is_CCK);
|
|
|
|
if (!priv->pshare->tracking_table_new)
|
|
delta = delta - 1;
|
|
|
|
if (channel > 14) {
|
|
if (channel <= 99) {
|
|
index = priv->pshare->txpwr_tracking_5GL[(i * 2) + is_decrease][delta];
|
|
} else if (channel <= 140) {
|
|
|
|
index = priv->pshare->txpwr_tracking_5GM[(i * 2) + is_decrease][delta];
|
|
} else {
|
|
index = priv->pshare->txpwr_tracking_5GH[(i * 2) + is_decrease][delta];
|
|
}
|
|
} else {
|
|
if (is_CCK) {
|
|
index = priv->pshare->txpwr_tracking_2G_CCK[(i * 2) + is_decrease][delta];
|
|
} else {
|
|
index = priv->pshare->txpwr_tracking_2G_OFDM[(i * 2) + is_decrease][delta];
|
|
}
|
|
}
|
|
|
|
//printk("_eric_tracking +++ offset = %d\n", index);
|
|
|
|
return index;
|
|
|
|
}
|
|
|
|
static int get_tracking_table(struct rtl8192cd_priv *priv, unsigned char *line_head)
|
|
{
|
|
unsigned char *next;
|
|
int base, idx;
|
|
int num = 0;
|
|
int offset = 0;
|
|
unsigned char *swim;
|
|
extern int _atoi(char * s, int base);
|
|
|
|
// remove comments
|
|
swim = line_head + 1;
|
|
priv->pshare->tracking_table_new = 0;
|
|
|
|
for (offset = 0; offset < TXPWR_TRACKING_NAME_NUM; offset++) {
|
|
if (!memcmp(line_head, TXPWR_TRACKING_NAME[offset], strlen(TXPWR_TRACKING_NAME[offset])))
|
|
break;
|
|
}
|
|
|
|
if (offset >= TXPWR_TRACKING_NAME_NUM) {
|
|
for (offset = 0; offset < TXPWR_TRACKING_NAME_NUM; offset++) {
|
|
if (!memcmp(line_head, TXPWR_TRACKING_NAME_NEW[offset], strlen(TXPWR_TRACKING_NAME_NEW[offset])))
|
|
break;
|
|
}
|
|
|
|
if (offset >= TXPWR_TRACKING_NAME_NUM)
|
|
return offset;
|
|
|
|
priv->pshare->tracking_table_new = 1;
|
|
}
|
|
|
|
if (offset >= TXPWR_TRACKING_NAME_NUM)
|
|
return offset;
|
|
|
|
//printk("_Eric offset = %d \n", offset);
|
|
//printk("_Eric line_head = %s \n", line_head);
|
|
|
|
next = get_digit_tracking(&swim);
|
|
|
|
while (1) {
|
|
|
|
if (next == NULL)
|
|
break;
|
|
|
|
if (next) {
|
|
|
|
base = 10;
|
|
idx = 0;
|
|
|
|
//printk("num#%d = %d \n", num, _convert_2_pwr_tracking((char *)&next[idx], base));
|
|
input_tracking_value(priv, offset, num, _convert_2_pwr_tracking((char *)&next[idx], base));
|
|
|
|
num++;
|
|
} else
|
|
break;
|
|
|
|
if (num >= index_mapping_NUM_MAX)
|
|
break;
|
|
|
|
next = get_digit_tracking(&next);
|
|
|
|
}
|
|
|
|
|
|
return offset;
|
|
|
|
}
|
|
|
|
|
|
void check_tracking_table(struct rtl8192cd_priv *priv)
|
|
{
|
|
|
|
int tmp = 0;
|
|
int tmp2 = 0;
|
|
|
|
for (tmp = 0; tmp < 4; tmp++) {
|
|
for (tmp2 = 1; tmp2 < index_mapping_NUM_MAX; tmp2 ++) {
|
|
if (priv->pshare->txpwr_tracking_2G_CCK[tmp][tmp2] < priv->pshare->txpwr_tracking_2G_CCK[tmp][tmp2 - 1])
|
|
priv->pshare->txpwr_tracking_2G_CCK[tmp][tmp2] = priv->pshare->txpwr_tracking_2G_CCK[tmp][tmp2 - 1];
|
|
}
|
|
}
|
|
|
|
for (tmp = 0; tmp < 4; tmp++) {
|
|
for (tmp2 = 1; tmp2 < index_mapping_NUM_MAX; tmp2 ++) {
|
|
if (priv->pshare->txpwr_tracking_2G_OFDM[tmp][tmp2] < priv->pshare->txpwr_tracking_2G_OFDM[tmp][tmp2 - 1])
|
|
priv->pshare->txpwr_tracking_2G_OFDM[tmp][tmp2] = priv->pshare->txpwr_tracking_2G_OFDM[tmp][tmp2 - 1];
|
|
}
|
|
}
|
|
|
|
for (tmp = 0; tmp < 4; tmp++) {
|
|
for (tmp2 = 1; tmp2 < index_mapping_NUM_MAX; tmp2 ++) {
|
|
if (priv->pshare->txpwr_tracking_5GL[tmp][tmp2] < priv->pshare->txpwr_tracking_5GL[tmp][tmp2 - 1])
|
|
priv->pshare->txpwr_tracking_5GL[tmp][tmp2] = priv->pshare->txpwr_tracking_5GL[tmp][tmp2 - 1];
|
|
}
|
|
}
|
|
|
|
for (tmp = 0; tmp < 4; tmp++) {
|
|
for (tmp2 = 1; tmp2 < index_mapping_NUM_MAX; tmp2 ++) {
|
|
if (priv->pshare->txpwr_tracking_5GM[tmp][tmp2] < priv->pshare->txpwr_tracking_5GM[tmp][tmp2 - 1])
|
|
priv->pshare->txpwr_tracking_5GM[tmp][tmp2] = priv->pshare->txpwr_tracking_5GM[tmp][tmp2 - 1];
|
|
}
|
|
}
|
|
|
|
for (tmp = 0; tmp < 4; tmp++) {
|
|
for (tmp2 = 1; tmp2 < index_mapping_NUM_MAX; tmp2 ++) {
|
|
if (priv->pshare->txpwr_tracking_5GH[tmp][tmp2] < priv->pshare->txpwr_tracking_5GH[tmp][tmp2 - 1])
|
|
priv->pshare->txpwr_tracking_5GH[tmp][tmp2] = priv->pshare->txpwr_tracking_5GH[tmp][tmp2 - 1];
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
int PHY_ConfigTXPwrTrackingWithParaFile(struct rtl8192cd_priv *priv)
|
|
{
|
|
int read_bytes, num;
|
|
unsigned char *mem_ptr, *line_head, *next_head;
|
|
|
|
memset(priv->pshare->txpwr_tracking_2G_CCK, 0, (4 * index_mapping_NUM_MAX));
|
|
memset(priv->pshare->txpwr_tracking_2G_OFDM, 0, (4 * index_mapping_NUM_MAX));
|
|
memset(priv->pshare->txpwr_tracking_5GL, 0, (4 * index_mapping_NUM_MAX));
|
|
memset(priv->pshare->txpwr_tracking_5GM, 0, (4 * index_mapping_NUM_MAX));
|
|
memset(priv->pshare->txpwr_tracking_5GH, 0, (4 * index_mapping_NUM_MAX));
|
|
|
|
if ((mem_ptr = (unsigned char *)rtw_vmalloc(MAX_CONFIG_FILE_SIZE)) == NULL) {
|
|
printk("PHY_ConfigTXPwrTrackingWithParaFile(): not enough memory\n");
|
|
return -1;
|
|
}
|
|
|
|
memset(mem_ptr, 0, MAX_CONFIG_FILE_SIZE); // clear memory
|
|
|
|
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188C) || (GET_CHIP_VER(priv) == VERSION_8192C)) { //_Eric_?? any other IC types ??
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
printk("[%s][REG_TXPWR_TRK_hp]\n", __FUNCTION__);
|
|
next_head = data_REG_TXPWR_TRK_hp_start;
|
|
read_bytes = (int)(data_REG_TXPWR_TRK_hp_end - data_REG_TXPWR_TRK_hp_start);
|
|
#else
|
|
printk("[%s][REG_TXPWR_TRK]\n", __FUNCTION__);
|
|
next_head = data_REG_TXPWR_TRK_start;
|
|
read_bytes = (int)(data_REG_TXPWR_TRK_end - data_REG_TXPWR_TRK_start);
|
|
#endif
|
|
#endif
|
|
}
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
else if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
printk("[%s][REG_TXPWR_TRK_n_92d_hp]\n", __FUNCTION__);
|
|
next_head = data_REG_TXPWR_TRK_n_92d_hp_start;
|
|
read_bytes = (int)(data_REG_TXPWR_TRK_n_92d_hp_end - data_REG_TXPWR_TRK_n_92d_hp_start);
|
|
#else
|
|
printk("[%s][REG_TXPWR_TRK_n_92d]\n", __FUNCTION__);
|
|
next_head = data_REG_TXPWR_TRK_n_92d_start;
|
|
read_bytes = (int)(data_REG_TXPWR_TRK_n_92d_end - data_REG_TXPWR_TRK_n_92d_start);
|
|
#endif
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
else if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
panic_printk("[REG_TXPWR_TRK_8812_hp]\n");
|
|
next_head = data_REG_TXPWR_TRK_8812_hp_start;
|
|
read_bytes = (int)(data_REG_TXPWR_TRK_8812_hp_end - data_REG_TXPWR_TRK_8812_hp_start);
|
|
} else
|
|
#endif
|
|
{
|
|
panic_printk("[REG_TXPWR_TRK_8812]\n");
|
|
next_head = data_REG_TXPWR_TRK_8812_start;
|
|
read_bytes = (int)(data_REG_TXPWR_TRK_8812_end - data_REG_TXPWR_TRK_8812_start);
|
|
}
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
else if (GET_CHIP_VER(priv) == VERSION_8192E) {
|
|
//panic_printk("[REG_TXPWR_TRK_8192E]\n");
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_POWERTRACKINGFILE_SIZE, (pu1Byte)&read_bytes);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_POWERTRACKINGFILE_START, (pu1Byte)&next_head);
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_WLAN_HAL_8881A
|
|
else if (GET_CHIP_VER(priv) == VERSION_8881A) {
|
|
//panic_printk("[REG_TXPWR_TRK_8881A]\n");
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_POWERTRACKINGFILE_SIZE, (pu1Byte)&read_bytes);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_POWERTRACKINGFILE_START, (pu1Byte)&next_head);
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_WLAN_HAL_8814AE
|
|
else if (GET_CHIP_VER(priv) == VERSION_8814A) {
|
|
//printk("[%s][REG_TXPWR_TRK_8814A]\n", __FUNCTION__);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_POWERTRACKINGFILE_SIZE, (pu1Byte)&read_bytes);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_POWERTRACKINGFILE_START, (pu1Byte)&next_head);
|
|
}
|
|
#endif
|
|
else {
|
|
//printk("[%s][NOT SUPPORT]\n", __FUNCTION__);
|
|
rtw_vmfree(mem_ptr, MAX_CONFIG_FILE_SIZE);
|
|
return -1;
|
|
}
|
|
|
|
memcpy(mem_ptr, next_head, read_bytes);
|
|
|
|
next_head = mem_ptr;
|
|
|
|
while (1) {
|
|
line_head = next_head;
|
|
next_head = get_line(&line_head);
|
|
|
|
if (line_head == NULL)
|
|
break;
|
|
|
|
if (line_head[0] == '/')
|
|
continue;
|
|
|
|
num = get_tracking_table(priv, line_head);
|
|
|
|
}
|
|
|
|
check_tracking_table(priv);
|
|
|
|
#if 0
|
|
|
|
{
|
|
int tmp = 0;
|
|
int tmp2 = 0;
|
|
|
|
for (tmp = 0; tmp < 4; tmp++) {
|
|
printk("txpwr_tracking_2G_CCK #%d = ", tmp);
|
|
for (tmp2 = 0; tmp2 < index_mapping_NUM_MAX; tmp2 ++) {
|
|
printk("%d ", priv->pshare->txpwr_tracking_2G_CCK[tmp][tmp2]);
|
|
}
|
|
printk("\n");
|
|
}
|
|
|
|
for (tmp = 0; tmp < 4; tmp++) {
|
|
printk("txpwr_tracking_2G_OFDM #%d = ", tmp);
|
|
for (tmp2 = 0; tmp2 < index_mapping_NUM_MAX; tmp2 ++) {
|
|
printk("%d ", priv->pshare->txpwr_tracking_2G_OFDM[tmp][tmp2]);
|
|
}
|
|
printk("\n");
|
|
}
|
|
|
|
for (tmp = 0; tmp < 4; tmp++) {
|
|
printk("txpwr_tracking_5GL #%d = ", tmp);
|
|
for (tmp2 = 0; tmp2 < index_mapping_NUM_MAX; tmp2 ++) {
|
|
printk("%d ", priv->pshare->txpwr_tracking_5GL[tmp][tmp2]);
|
|
}
|
|
printk("\n");
|
|
}
|
|
|
|
for (tmp = 0; tmp < 4; tmp++) {
|
|
printk("txpwr_tracking_5GM #%d = ", tmp);
|
|
for (tmp2 = 0; tmp2 < index_mapping_NUM_MAX; tmp2 ++) {
|
|
printk("%d ", priv->pshare->txpwr_tracking_5GM[tmp][tmp2]);
|
|
}
|
|
printk("\n");
|
|
}
|
|
|
|
for (tmp = 0; tmp < 4; tmp++) {
|
|
printk("txpwr_tracking_5GH #%d = ", tmp);
|
|
for (tmp2 = 0; tmp2 < index_mapping_NUM_MAX; tmp2 ++) {
|
|
printk("%d ", priv->pshare->txpwr_tracking_5GH[tmp][tmp2]);
|
|
}
|
|
printk("\n");
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
rtw_vmfree(mem_ptr, MAX_CONFIG_FILE_SIZE);
|
|
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
void TXPowerTracking(struct rtl8192cd_priv *priv)
|
|
{
|
|
if (priv->up_time % priv->pshare->rf_ft_var.tpt_period == 0) {
|
|
#if !defined(USE_OUT_SRC) || defined(_OUTSRC_COEXIST)
|
|
#ifdef _OUTSRC_COEXIST
|
|
if (!IS_OUTSRC_CHIP(priv))
|
|
#endif
|
|
{
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv)==VERSION_8192C) || (GET_CHIP_VER(priv)==VERSION_8188C))
|
|
tx_power_tracking(priv);
|
|
#endif
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv)==VERSION_8192D)
|
|
tx_power_tracking_92D(priv);
|
|
#endif
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E)
|
|
odm_TXPowerTrackingCallback_ThermalMeter_8188E(priv);
|
|
#endif
|
|
}
|
|
#endif
|
|
#if defined(USE_OUT_SRC)
|
|
{
|
|
if (IS_OUTSRC_CHIP(priv)) {
|
|
#ifndef TPT_THREAD
|
|
ODM_TXPowerTrackingCheck(ODMPTR);
|
|
#else
|
|
rtl_atomic_set(&priv->pshare->do_tpt, 1);
|
|
#endif
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
else if ((priv->up_time % (priv->pshare->rf_ft_var.tpt_period)) == (priv->pshare->rf_ft_var.tpt_period -1))
|
|
{
|
|
// It will execute the TX power tracking at next Sec, so Trigger the Thermo Meter update first.
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192C || GET_CHIP_VER(priv) == VERSION_8188C)
|
|
PHY_SetRFReg(priv, RF92CD_PATH_A, RF_T_METER, bMask20Bits, 0x60);
|
|
else
|
|
#endif
|
|
// for 8192D, 8188E, 8192E, 8821 serious, the Thermo meter register address is 0x42
|
|
PHY_SetRFReg(priv, RF92CD_PATH_A, RF_T_METER_92D, BIT(16)|BIT(17), 0x3);
|
|
|
|
//panic_printk("%s:%d trigger thermalmeter!\n", __FUNCTION__, __LINE__);
|
|
return;
|
|
}
|
|
}
|
|
|
|
void SetTxPowerLevel(struct rtl8192cd_priv *priv)
|
|
{
|
|
unsigned int channel = priv->pmib->dot11RFEntry.dot11channel;
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
PHY_SetOFDMTxPower_8812(priv, channel);
|
|
if (priv->pshare->curr_band == BAND_2G)
|
|
PHY_SetCCKTxPower_8812(priv, channel);
|
|
priv->pshare->No_RF_Write = 1;
|
|
|
|
}
|
|
#endif
|
|
|
|
#if defined(CONFIG_WLAN_HAL_8881A) || defined(CONFIG_WLAN_HAL_8814AE)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8881A) || (GET_CHIP_VER(priv) == VERSION_8814A)) {
|
|
GET_HAL_INTERFACE(priv)->PHYSetOFDMTxPowerHandler(priv, channel);
|
|
if (priv->pshare->curr_band == BAND_2G) {
|
|
if (RT_STATUS_FAILURE == GET_HAL_INTERFACE(priv)->PHYSetCCKTxPowerHandler(priv, channel)) {
|
|
DEBUG_WARN("PHYSetCCKTxPower Fail !\n");
|
|
}
|
|
}
|
|
priv->pshare->No_RF_Write = 1;
|
|
}
|
|
#endif //#if defined(CONFIG_WLAN_HAL_8881A)
|
|
|
|
#if defined(CONFIG_WLAN_HAL_8192EE)
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E) {
|
|
GET_HAL_INTERFACE(priv)->PHYSetOFDMTxPowerHandler(priv, channel);
|
|
if (priv->pshare->curr_band == BAND_2G) {
|
|
GET_HAL_INTERFACE(priv)->PHYSetCCKTxPowerHandler(priv, channel);
|
|
}
|
|
selectMinPowerIdex(priv);
|
|
}
|
|
#endif //#if defined(CONFIG_WLAN_HAL_8192EE)
|
|
|
|
#if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_88E_SUPPORT)
|
|
if (GET_CHIP_VER(priv) <= VERSION_8188E) {
|
|
PHY_RF6052SetOFDMTxPower(priv, channel);
|
|
if (priv->pshare->curr_band == BAND_2G)
|
|
PHY_RF6052SetCCKTxPower(priv, channel);
|
|
|
|
selectMinPowerIdex(priv);
|
|
}
|
|
#endif
|
|
|
|
return;
|
|
}
|
|
|
|
#ifdef _DEBUG_RTL8192CD_
|
|
|
|
//_TXPWR_REDEFINE
|
|
int Read_PG_File(struct rtl8192cd_priv *priv, int reg_file, int table_number,
|
|
char *MCSTxAgcOffset_A, char *MCSTxAgcOffset_B, char *OFDMTxAgcOffset_A,
|
|
char *OFDMTxAgcOffset_B, char *CCKTxAgc_A, char *CCKTxAgc_B)
|
|
{
|
|
int read_bytes = 0, num, len = 0;
|
|
unsigned int u4bRegOffset, u4bRegValue, u4bRegMask;
|
|
unsigned char *mem_ptr, *line_head, *next_head = NULL;
|
|
struct PhyRegTable *phyreg_table = NULL;
|
|
struct MacRegTable *macreg_table = NULL;
|
|
unsigned short max_len = 0;
|
|
int file_format = TWO_COLUMN;
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
int idx = 0, pg_tbl_idx = table_number, write_en = 0;
|
|
|
|
int tmp_rTxAGC_A_CCK1_Mcs32 = 0;
|
|
int tmp_rTxAGC_B_CCK5_1_Mcs32 = 0;
|
|
int prev_reg = 0;
|
|
#endif
|
|
|
|
//printk("PHYREG_PG = %d\n", PHYREG_PG);
|
|
|
|
if (reg_file == PHYREG_PG) {
|
|
//printk("[%s][PHY_REG_PG]\n",__FUNCTION__);
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
|
|
if (priv->pmib->dot11StationConfigEntry.dot11RegDomain == DOMAIN_FCC) {
|
|
//printk("\nFCC PG!!!\n");
|
|
next_head = data_PHY_REG_PG_FCC_start;
|
|
read_bytes = (int)(data_PHY_REG_PG_FCC_end - data_PHY_REG_PG_FCC_start);
|
|
} else if (priv->pmib->dot11StationConfigEntry.dot11RegDomain == DOMAIN_ETSI) {
|
|
//printk("\nCE PG!!!\n");
|
|
next_head = data_PHY_REG_PG_CE_start;
|
|
read_bytes = (int)(data_PHY_REG_PG_CE_end - data_PHY_REG_PG_CE_start);
|
|
} else {
|
|
//printk("\nOTHER PG!!!\n");
|
|
next_head = data_PHY_REG_PG_start;
|
|
read_bytes = (int)(data_PHY_REG_PG_end - data_PHY_REG_PG_start);
|
|
}
|
|
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if ( priv->pshare->rf_ft_var.use_ext_pa) {
|
|
//printk("[%s][data_PHY_REG_PG_92d_hp]\n", __FUNCTION__);
|
|
next_head = data_PHY_REG_PG_92d_hp_start;
|
|
read_bytes = (int)(data_PHY_REG_PG_92d_hp_end - data_PHY_REG_PG_92d_hp_start);
|
|
}
|
|
#endif
|
|
|
|
}
|
|
#endif //CONFIG_RTL_92D_SUPPORT
|
|
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)) {
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if ( priv->pshare->rf_ft_var.use_ext_pa) {
|
|
//printk("[%s][data_PHY_REG_PG_hp]\n", __FUNCTION__);
|
|
next_head = data_PHY_REG_PG_hp_start;
|
|
read_bytes = (int)(data_PHY_REG_PG_hp_end - data_PHY_REG_PG_hp_start);
|
|
|
|
} else
|
|
#endif
|
|
{
|
|
//printk("[%s][data_PHY_REG_PG_92C]\n", __FUNCTION__);
|
|
next_head = data_PHY_REG_PG_92C_start;
|
|
read_bytes = (int)(data_PHY_REG_PG_92C_end - data_PHY_REG_PG_92C_start);
|
|
}
|
|
}
|
|
#endif //CONFIG_RTL_92C_SUPPORT
|
|
macreg_table = (struct MacRegTable *)priv->pshare->phy_reg_pg_buf;
|
|
max_len = PHY_REG_PG_SIZE;
|
|
file_format = THREE_COLUMN;
|
|
}
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
else if (reg_file == PHYREG) {
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
phyreg_table = (struct PhyRegTable *)priv->pshare->phy_reg_buf;
|
|
//printk("[%s][PHY_REG_n]\n",__FUNCTION__);
|
|
next_head = data_PHY_REG_n_start;
|
|
read_bytes = (int)(data_PHY_REG_n_end - data_PHY_REG_n_start);
|
|
max_len = PHY_REG_SIZE;
|
|
}
|
|
}
|
|
#endif // CONFIG_RTL_92D_SUPPORT
|
|
|
|
#ifdef MP_TEST
|
|
else if (reg_file == PHYREG_MP) {
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
phyreg_table = (struct PhyRegTable *)priv->pshare->phy_reg_mp_buf;
|
|
//printk("[%s][PHY_REG_MP_n]\n",__FUNCTION__);
|
|
next_head = data_PHY_REG_MP_n_start;
|
|
read_bytes = (int)(data_PHY_REG_MP_n_end - data_PHY_REG_MP_n_start);
|
|
max_len = PHY_REG_SIZE;
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)) {
|
|
phyreg_table = (struct PhyRegTable *)priv->pshare->phy_reg_mp_buf;
|
|
next_head = data_PHY_REG_MP_n_92C_start;
|
|
read_bytes = (int)(data_PHY_REG_MP_n_92C_end - data_PHY_REG_MP_n_92C_start);
|
|
max_len = PHY_REG_SIZE;
|
|
}
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
{
|
|
if ((mem_ptr = (unsigned char *)rtw_vmalloc(MAX_CONFIG_FILE_SIZE)) == NULL) {
|
|
printk("PHY_ConfigBBWithParaFile(): not enough memory\n");
|
|
return -1;
|
|
}
|
|
|
|
memset(mem_ptr, 0, MAX_CONFIG_FILE_SIZE); // clear memory
|
|
memcpy(mem_ptr, next_head, read_bytes);
|
|
|
|
next_head = mem_ptr;
|
|
while (1) {
|
|
line_head = next_head;
|
|
next_head = get_line(&line_head);
|
|
if (line_head == NULL)
|
|
break;
|
|
|
|
if (line_head[0] == '/')
|
|
continue;
|
|
|
|
if (file_format == TWO_COLUMN) {
|
|
num = get_offset_val(line_head, &u4bRegOffset, &u4bRegValue);
|
|
if (num > 0) {
|
|
phyreg_table[len].offset = u4bRegOffset;
|
|
phyreg_table[len].value = u4bRegValue;
|
|
len++;
|
|
|
|
if (u4bRegOffset == 0xff)
|
|
break;
|
|
if ((len * sizeof(struct PhyRegTable)) > max_len)
|
|
break;
|
|
}
|
|
} else {
|
|
num = get_offset_mask_val(line_head, &u4bRegOffset, &u4bRegMask , &u4bRegValue);
|
|
if (num > 0) {
|
|
macreg_table[len].offset = u4bRegOffset;
|
|
macreg_table[len].mask = u4bRegMask;
|
|
macreg_table[len].value = u4bRegValue;
|
|
len++;
|
|
if (u4bRegOffset == 0xff)
|
|
break;
|
|
if ((len * sizeof(struct MacRegTable)) > max_len)
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
rtw_vmfree(mem_ptr, MAX_CONFIG_FILE_SIZE);
|
|
|
|
if ((len * sizeof(struct PhyRegTable)) > max_len) {
|
|
printk("PHY REG table buffer not large enough!\n");
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
num = 0;
|
|
while (1) {
|
|
if (file_format == THREE_COLUMN) {
|
|
u4bRegOffset = macreg_table[num].offset;
|
|
u4bRegValue = macreg_table[num].value;
|
|
u4bRegMask = macreg_table[num].mask;
|
|
} else {
|
|
u4bRegOffset = phyreg_table[num].offset;
|
|
u4bRegValue = phyreg_table[num].value;
|
|
}
|
|
|
|
if (u4bRegOffset == 0xff)
|
|
break;
|
|
else if (file_format == THREE_COLUMN) {
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (reg_file == PHYREG_PG && GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
if (u4bRegOffset == 0xe00) {
|
|
if (idx == pg_tbl_idx)
|
|
write_en = 1;
|
|
idx++;
|
|
}
|
|
if (write_en) {
|
|
//PHY_SetBBReg(priv, u4bRegOffset, u4bRegMask, u4bRegValue);
|
|
//printk("3C- 92D %x %x %x \n", u4bRegOffset, u4bRegMask, u4bRegValue);
|
|
if (u4bRegMask != bMaskDWord) {
|
|
int BitShift = phy_CalculateBitShift(u4bRegMask);
|
|
u4bRegValue = (u4bRegValue << BitShift);
|
|
}
|
|
|
|
//=== PATH A ===
|
|
|
|
if (u4bRegOffset == rTxAGC_A_Mcs03_Mcs00)
|
|
*(unsigned int *)(&MCSTxAgcOffset_A[0]) = cpu_to_be32(u4bRegValue);
|
|
if (u4bRegOffset == rTxAGC_A_Mcs07_Mcs04)
|
|
*(unsigned int *)(&MCSTxAgcOffset_A[4]) = cpu_to_be32(u4bRegValue);
|
|
if (u4bRegOffset == rTxAGC_A_Mcs11_Mcs08)
|
|
*(unsigned int *)(&MCSTxAgcOffset_A[8]) = cpu_to_be32(u4bRegValue);
|
|
if (u4bRegOffset == rTxAGC_A_Mcs15_Mcs12)
|
|
*(unsigned int *)(&MCSTxAgcOffset_A[12]) = cpu_to_be32(u4bRegValue);
|
|
|
|
if (u4bRegOffset == rTxAGC_A_Rate18_06)
|
|
*(unsigned int *)(&OFDMTxAgcOffset_A[0]) = cpu_to_be32(u4bRegValue);
|
|
if (u4bRegOffset == rTxAGC_A_Rate54_24)
|
|
*(unsigned int *)(&OFDMTxAgcOffset_A[4]) = cpu_to_be32(u4bRegValue);
|
|
|
|
if (u4bRegOffset == rTxAGC_A_CCK1_Mcs32) {
|
|
tmp_rTxAGC_A_CCK1_Mcs32 = ((u4bRegValue & 0xff00) >> phy_CalculateBitShift(0xff00));
|
|
prev_reg = rTxAGC_A_CCK1_Mcs32;
|
|
}
|
|
|
|
if (u4bRegOffset == rTxAGC_A_CCK11_2_B_CCK11) {
|
|
if (prev_reg == rTxAGC_A_CCK1_Mcs32) {
|
|
//printk("\n%x %x %x\n", tmp_rTxAGC_A_CCK1_Mcs32, u4bRegValue, cpu_to_be32((u4bRegValue & 0xffffff00) | tmp_rTxAGC_A_CCK1_Mcs32));
|
|
|
|
*(unsigned int *)(&CCKTxAgc_A[0]) =
|
|
cpu_to_be32((u4bRegValue & 0xffffff00) | tmp_rTxAGC_A_CCK1_Mcs32);
|
|
}
|
|
}
|
|
|
|
//=== PATH B ===
|
|
|
|
if (u4bRegOffset == rTxAGC_B_Mcs03_Mcs00)
|
|
*(unsigned int *)(&MCSTxAgcOffset_B[0]) = cpu_to_be32(u4bRegValue);
|
|
if (u4bRegOffset == rTxAGC_B_Mcs07_Mcs04)
|
|
*(unsigned int *)(&MCSTxAgcOffset_B[4]) = cpu_to_be32(u4bRegValue);
|
|
if (u4bRegOffset == rTxAGC_B_Mcs11_Mcs08)
|
|
*(unsigned int *)(&MCSTxAgcOffset_B[8]) = cpu_to_be32(u4bRegValue);
|
|
if (u4bRegOffset == rTxAGC_B_Mcs15_Mcs12)
|
|
*(unsigned int *)(&MCSTxAgcOffset_B[12]) = cpu_to_be32(u4bRegValue);
|
|
|
|
if (u4bRegOffset == rTxAGC_B_Rate18_06)
|
|
*(unsigned int *)(&OFDMTxAgcOffset_B[0]) = cpu_to_be32(u4bRegValue);
|
|
if (u4bRegOffset == rTxAGC_B_Rate54_24)
|
|
*(unsigned int *)(&OFDMTxAgcOffset_B[4]) = cpu_to_be32(u4bRegValue);
|
|
|
|
if (u4bRegOffset == rTxAGC_B_CCK5_1_Mcs32) {
|
|
tmp_rTxAGC_B_CCK5_1_Mcs32 = u4bRegValue;
|
|
prev_reg = rTxAGC_B_CCK5_1_Mcs32;
|
|
}
|
|
|
|
if (u4bRegOffset == rTxAGC_A_CCK11_2_B_CCK11) {
|
|
if (prev_reg == rTxAGC_B_CCK5_1_Mcs32) {
|
|
//printk("\n%x %x %x\n", tmp_rTxAGC_B_CCK5_1_Mcs32, u4bRegValue, cpu_to_be32((u4bRegValue << 24) | (tmp_rTxAGC_B_CCK5_1_Mcs32 >> 8)));
|
|
*(unsigned int *)(&CCKTxAgc_B[0]) = cpu_to_be32((u4bRegValue << 24) | (tmp_rTxAGC_B_CCK5_1_Mcs32 >> 8));
|
|
}
|
|
}
|
|
|
|
if (u4bRegOffset == 0x868) {
|
|
write_en = 0;
|
|
break;
|
|
}
|
|
}
|
|
} else
|
|
#endif
|
|
{
|
|
//PHY_SetBBReg(priv, u4bRegOffset, u4bRegMask, u4bRegValue);
|
|
//printk("3C - 92C %x %x %x \n", u4bRegOffset, u4bRegMask, u4bRegValue);
|
|
}
|
|
} else {
|
|
//printk("Not 3C - %x %x %x \n", u4bRegOffset, bMaskDWord, u4bRegValue);
|
|
//PHY_SetBBReg(priv, u4bRegOffset, bMaskDWord, u4bRegValue);
|
|
}
|
|
num++;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#endif
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
* Function: PHY_ConfigBBWithParaFile()
|
|
*
|
|
* Overview: This function read BB parameters from general file format, and do register
|
|
* Read/Write
|
|
*
|
|
* Input: PADAPTER Adapter
|
|
* ps1Byte pFileName
|
|
*
|
|
* Output: NONE
|
|
*
|
|
* Return: RT_STATUS_SUCCESS: configuration file exist
|
|
*
|
|
*---------------------------------------------------------------------------*/
|
|
int PHY_ConfigBBWithParaFile(struct rtl8192cd_priv *priv, int reg_file)
|
|
{
|
|
int read_bytes = 0, num = 0, len = 0;
|
|
unsigned int u4bRegOffset, u4bRegValue, u4bRegMask = 0;
|
|
int file_format = TWO_COLUMN;
|
|
unsigned char *mem_ptr, *line_head, *next_head = NULL;
|
|
#if 1//defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_WLAN_HAL)//TXPWR_LMT_8812 TXPWR_LMT_88E
|
|
unsigned char *mem_ptr2, *next_head2=NULL;
|
|
#endif
|
|
struct PhyRegTable *phyreg_table = NULL;
|
|
struct MacRegTable *macreg_table = NULL;
|
|
unsigned short max_len = 0;
|
|
unsigned int regstart, regend;
|
|
#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL)
|
|
int idx = 0, pg_tbl_idx = BGN_2040_ALL, write_en = 0;
|
|
#endif
|
|
|
|
if (reg_file == AGCTAB) {
|
|
phyreg_table = (struct PhyRegTable *)priv->pshare->agc_tab_buf;
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
#ifdef HIGH_POWER_EXT_PA //_eric_?? DMDP & SMSP ??
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
//printk("[%s][AGC_TAB_n_92d_hp]\n",__FUNCTION__);
|
|
next_head = data_AGC_TAB_n_92d_hp_start;
|
|
read_bytes = (int)(data_AGC_TAB_n_92d_hp_end - data_AGC_TAB_n_92d_hp_start);
|
|
} else {
|
|
//printk("[%s][AGC_TAB_n]\n",__FUNCTION__);
|
|
next_head = data_AGC_TAB_n_start;
|
|
read_bytes = (int)(data_AGC_TAB_n_end - data_AGC_TAB_n_start);
|
|
}
|
|
#else //HIGH_POWER_EXT_PA
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if (priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY && priv->pshare->wlandev_idx == 1) {
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_5G) {
|
|
//printk("[%s][AGC_TAB_5G_n]\n",__FUNCTION__);
|
|
next_head = data_AGC_TAB_5G_n_start;
|
|
read_bytes = (int)(data_AGC_TAB_5G_n_end - data_AGC_TAB_5G_n_start);
|
|
} else {
|
|
//printk("[%s][AGC_TAB_2G_n]\n",__FUNCTION__);
|
|
next_head = data_AGC_TAB_2G_n_start;
|
|
read_bytes = (int)(data_AGC_TAB_2G_n_end - data_AGC_TAB_2G_n_start);
|
|
}
|
|
} else
|
|
#endif
|
|
{
|
|
//printk("[%s][AGC_TAB_n]\n",__FUNCTION__);
|
|
next_head = data_AGC_TAB_n_start;
|
|
read_bytes = (int)(data_AGC_TAB_n_end - data_AGC_TAB_n_start);
|
|
}
|
|
#endif //HIGH_POWER_EXT_PA
|
|
}
|
|
#endif //CONFIG_RTL_92D_SUPPORT
|
|
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)) {
|
|
#ifdef TESTCHIP_SUPPORT
|
|
if (IS_TEST_CHIP(priv)) {
|
|
next_head = data_AGC_TAB_start;
|
|
read_bytes = (int)(data_AGC_TAB_end - data_AGC_TAB_start);
|
|
} else
|
|
#endif
|
|
|
|
#if defined(HIGH_POWER_EXT_PA) || defined(HIGH_POWER_EXT_LNA)
|
|
if (
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
priv->pshare->rf_ft_var.use_ext_pa
|
|
#else
|
|
priv->pshare->rf_ft_var.use_ext_lna
|
|
#endif
|
|
) {
|
|
next_head = data_AGC_TAB_n_hp_start;
|
|
read_bytes = (int)(data_AGC_TAB_n_hp_end - data_AGC_TAB_n_hp_start);
|
|
} else
|
|
#endif
|
|
{
|
|
next_head = data_AGC_TAB_n_92C_start;
|
|
read_bytes = (int)(data_AGC_TAB_n_92C_end - data_AGC_TAB_n_92C_start);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT //8812 agc
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
if (IS_TEST_CHIP(priv)) {
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
printk("[AGC_TAB_8812_hp]\n");
|
|
next_head = data_AGC_TAB_8812_hp_start;
|
|
read_bytes = (int)(data_AGC_TAB_8812_hp_end - data_AGC_TAB_8812_hp_start);
|
|
} else
|
|
#endif
|
|
{
|
|
printk("[AGC_TAB_8812]\n");
|
|
next_head = data_AGC_TAB_8812_start;
|
|
read_bytes = (int)(data_AGC_TAB_8812_end - data_AGC_TAB_8812_start);
|
|
}
|
|
} else { //for_8812_mp_chip
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa && priv->pshare->rf_ft_var.use_ext_lna) {
|
|
panic_printk("[AGC_TAB_8812_n_hp]\n");
|
|
next_head = data_AGC_TAB_8812_n_hp_start;
|
|
read_bytes = (int)(data_AGC_TAB_8812_n_hp_end - data_AGC_TAB_8812_n_hp_start);
|
|
} else if (priv->pshare->rf_ft_var.use_ext_pa && !priv->pshare->rf_ft_var.use_ext_lna) {
|
|
panic_printk("[AGC_TAB_8812_n_extpa]\n");
|
|
next_head = data_AGC_TAB_8812_n_extpa_start;
|
|
read_bytes = (int)(data_AGC_TAB_8812_n_extpa_end - data_AGC_TAB_8812_n_extpa_start);
|
|
} else if (!priv->pshare->rf_ft_var.use_ext_pa && priv->pshare->rf_ft_var.use_ext_lna) {
|
|
panic_printk("[AGC_TAB_8812_n_extlna]\n");
|
|
next_head = data_AGC_TAB_8812_n_extlna_start;
|
|
read_bytes = (int)(data_AGC_TAB_8812_n_extlna_end - data_AGC_TAB_8812_n_extlna_start);
|
|
} else
|
|
#else
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
panic_printk("[AGC_TAB_8812_n_extpa]\n");
|
|
next_head = data_AGC_TAB_8812_n_extpa_start;
|
|
read_bytes = (int)(data_AGC_TAB_8812_n_extpa_end - data_AGC_TAB_8812_n_extpa_start);
|
|
} else
|
|
#endif
|
|
#else //HIGH_POWER_EXT_PA=n
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
if (priv->pshare->rf_ft_var.use_ext_lna) {
|
|
panic_printk("[AGC_TAB_8812_n_extlna]\n");
|
|
next_head = data_AGC_TAB_8812_n_extlna_start;
|
|
read_bytes = (int)(data_AGC_TAB_8812_n_extlna_end - data_AGC_TAB_8812_n_extlna_start);
|
|
} else
|
|
#endif
|
|
#endif
|
|
{
|
|
printk("[AGC_TAB_8812_n_default]\n");
|
|
next_head = data_AGC_TAB_8812_n_default_start;
|
|
read_bytes = (int)(data_AGC_TAB_8812_n_default_end - data_AGC_TAB_8812_n_default_start);
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa && priv->pshare->rf_ft_var.use_ext_lna) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_AGC_HP_SIZE, (pu1Byte)&read_bytes);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_AGC_HP_START, (pu1Byte)&next_head);
|
|
} else if (priv->pshare->rf_ft_var.use_ext_pa && !priv->pshare->rf_ft_var.use_ext_lna) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_AGC_EXTPA_SIZE, (pu1Byte)&read_bytes);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_AGC_EXTPA_START, (pu1Byte)&next_head);
|
|
} else if (!priv->pshare->rf_ft_var.use_ext_pa && priv->pshare->rf_ft_var.use_ext_lna) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_AGC_EXTLNA_SIZE, (pu1Byte)&read_bytes);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_AGC_EXTLNA_START, (pu1Byte)&next_head);
|
|
} else
|
|
#else
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_AGC_EXTPA_SIZE, (pu1Byte)&read_bytes);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_AGC_EXTPA_START, (pu1Byte)&next_head);
|
|
} else
|
|
#endif
|
|
#else
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
if (priv->pshare->rf_ft_var.use_ext_lna) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_AGC_EXTLNA_SIZE, (pu1Byte)&read_bytes);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_AGC_EXTLNA_START, (pu1Byte)&next_head);
|
|
} else
|
|
#endif
|
|
#endif
|
|
{
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_AGC_SIZE, (pu1Byte)&read_bytes);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_AGC_START, (pu1Byte)&next_head);
|
|
}
|
|
}
|
|
#endif //CONFIG_WLAN_HAL
|
|
|
|
max_len = AGC_TAB_SIZE;
|
|
} else if (reg_file == PHYREG_PG) {
|
|
//printk("[%s][PHY_REG_PG]\n",__FUNCTION__);
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
|
|
if (priv->pmib->dot11StationConfigEntry.dot11RegDomain == DOMAIN_FCC) {
|
|
//printk("\nFCC PG!!!\n");
|
|
next_head = data_PHY_REG_PG_FCC_start;
|
|
read_bytes = (int)(data_PHY_REG_PG_FCC_end - data_PHY_REG_PG_FCC_start);
|
|
} else if (priv->pmib->dot11StationConfigEntry.dot11RegDomain == DOMAIN_ETSI) {
|
|
//printk("\nCE PG!!!\n");
|
|
next_head = data_PHY_REG_PG_CE_start;
|
|
read_bytes = (int)(data_PHY_REG_PG_CE_end - data_PHY_REG_PG_CE_start);
|
|
} else {
|
|
//printk("\nOTHER PG!!!\n");
|
|
next_head = data_PHY_REG_PG_start;
|
|
read_bytes = (int)(data_PHY_REG_PG_end - data_PHY_REG_PG_start);
|
|
}
|
|
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if ( priv->pshare->rf_ft_var.use_ext_pa) {
|
|
//printk("[%s][data_PHY_REG_PG_92d_hp]\n", __FUNCTION__);
|
|
next_head = data_PHY_REG_PG_92d_hp_start;
|
|
read_bytes = (int)(data_PHY_REG_PG_92d_hp_end - data_PHY_REG_PG_92d_hp_start);
|
|
}
|
|
#endif
|
|
|
|
//_TXPWR_REDEFINE ?? Why 5G no need working channel ??
|
|
//_TXPWR_REDEFINE in MP Tool, 3 Groups: 36-99 100-148 149-165
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_5G) {
|
|
if (priv->pshare->is_40m_bw == 0) {
|
|
if (priv->pmib->dot11RFEntry.dot11channel <= 99)
|
|
pg_tbl_idx = AN_20_CH_36_64;
|
|
else if (priv->pmib->dot11RFEntry.dot11channel <= 148)
|
|
pg_tbl_idx = AN_20_CH_100_140;
|
|
else
|
|
pg_tbl_idx = AN_20_CH_149_165;
|
|
} else {
|
|
//_TXPWR_REDEFINE ??
|
|
int val = priv->pmib->dot11RFEntry.dot11channel;
|
|
|
|
if (priv->pshare->offset_2nd_chan == 1)
|
|
val -= 2;
|
|
else
|
|
val += 2;
|
|
|
|
if (priv->pmib->dot11RFEntry.dot11channel <= 99)
|
|
pg_tbl_idx = AN_40_CH_36_64;
|
|
else if (priv->pmib->dot11RFEntry.dot11channel <= 148)
|
|
pg_tbl_idx = AN_40_CH_100_140;
|
|
else
|
|
pg_tbl_idx = AN_40_CH_149_165;
|
|
}
|
|
} else {
|
|
if (priv->pshare->is_40m_bw == 0) {
|
|
if (priv->pmib->dot11RFEntry.dot11channel <= 3)
|
|
pg_tbl_idx = BGN_20_CH1_3;
|
|
else if (priv->pmib->dot11RFEntry.dot11channel <= 9)
|
|
pg_tbl_idx = BGN_20_CH4_9;
|
|
else
|
|
pg_tbl_idx = BGN_20_CH10_14;
|
|
} else {
|
|
int val = priv->pmib->dot11RFEntry.dot11channel;
|
|
|
|
if (priv->pshare->offset_2nd_chan == 1)
|
|
val -= 2;
|
|
else
|
|
val += 2;
|
|
|
|
if (val <= 3)
|
|
pg_tbl_idx = BGN_40_CH1_3;
|
|
else if (val <= 9)
|
|
pg_tbl_idx = BGN_40_CH4_9;
|
|
else
|
|
pg_tbl_idx = BGN_40_CH10_14;
|
|
}
|
|
}
|
|
#ifdef MP_TEST
|
|
//In Noraml Driver mode, and if mib 'pwr_by_rate' = 0 >> Use default power by rate table
|
|
if ( (priv->pshare->rf_ft_var.mp_specific == 0) && (priv->pshare->rf_ft_var.pwr_by_rate == 0) )
|
|
pg_tbl_idx = BGN_2040_ALL;
|
|
#endif
|
|
DEBUG_INFO("channel=%d pg_tbl_idx=%d\n", priv->pmib->dot11RFEntry.dot11channel, pg_tbl_idx);
|
|
|
|
}
|
|
#endif //CONFIG_RTL_92D_SUPPORT
|
|
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)) {
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if ( priv->pshare->rf_ft_var.use_ext_pa) {
|
|
//printk("[%s][data_PHY_REG_PG_hp]\n", __FUNCTION__);
|
|
next_head = data_PHY_REG_PG_hp_start;
|
|
read_bytes = (int)(data_PHY_REG_PG_hp_end - data_PHY_REG_PG_hp_start);
|
|
|
|
} else
|
|
#endif
|
|
{
|
|
//printk("[%s][data_PHY_REG_PG_92C]\n", __FUNCTION__);
|
|
next_head = data_PHY_REG_PG_92C_start;
|
|
read_bytes = (int)(data_PHY_REG_PG_92C_end - data_PHY_REG_PG_92C_start);
|
|
}
|
|
}
|
|
#endif //CONFIG_RTL_92C_SUPPORT
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
#ifdef SUPPORT_RTL8188E_TC
|
|
if (IS_TEST_CHIP(priv))
|
|
return 0;
|
|
#endif
|
|
|
|
#ifdef TXPWR_LMT_88E
|
|
#ifdef __ECOS
|
|
DEBUG_INFO("[%s][PHY_REG_PG_88E_new]\n", __FUNCTION__);
|
|
#else
|
|
printk("[%s][PHY_REG_PG_88E_new]\n", __FUNCTION__);
|
|
#endif
|
|
next_head = data_PHY_REG_PG_88E_new_start;
|
|
read_bytes = (int)(data_PHY_REG_PG_88E_new_end - data_PHY_REG_PG_88E_new_start);
|
|
|
|
pg_tbl_idx = 0;
|
|
#else
|
|
|
|
printk("[%s][PHY_REG_PG_88E]\n", __FUNCTION__);
|
|
next_head = data_PHY_REG_PG_88E_start;
|
|
read_bytes = (int)(data_PHY_REG_PG_88E_end - data_PHY_REG_PG_88E_start);
|
|
|
|
/* In Noraml Driver mode, and if mib 'pwr_by_rate' = 0 >> Use default power by rate table */
|
|
if (
|
|
#ifdef MP_TEST
|
|
priv->pshare->rf_ft_var.mp_specific ||
|
|
#endif
|
|
priv->pshare->rf_ft_var.pwr_by_rate) {
|
|
if (priv->pshare->is_40m_bw == 0) {
|
|
if (priv->pmib->dot11RFEntry.dot11channel <= 3)
|
|
pg_tbl_idx = BGN_20_CH1_3;
|
|
else if (priv->pmib->dot11RFEntry.dot11channel <= 9)
|
|
pg_tbl_idx = BGN_20_CH4_9;
|
|
else
|
|
pg_tbl_idx = BGN_20_CH10_14;
|
|
} else {
|
|
int val = priv->pmib->dot11RFEntry.dot11channel;
|
|
|
|
if (priv->pshare->offset_2nd_chan == 1)
|
|
val -= 2;
|
|
else
|
|
val += 2;
|
|
|
|
if (val <= 3)
|
|
pg_tbl_idx = BGN_40_CH1_3;
|
|
else if (val <= 9)
|
|
pg_tbl_idx = BGN_40_CH4_9;
|
|
else
|
|
pg_tbl_idx = BGN_40_CH10_14;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef MP_TEST
|
|
if (priv->pshare->rf_ft_var.mp_specific)
|
|
pg_tbl_idx = 0;
|
|
#endif
|
|
|
|
DEBUG_INFO("channel=%d pg_tbl_idx=%d\n", priv->pmib->dot11RFEntry.dot11channel, pg_tbl_idx);
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT //eric_8812 pg
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_5G)
|
|
pg_tbl_idx = 1;
|
|
else
|
|
pg_tbl_idx = 0;
|
|
|
|
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if(priv->pmib->dot11RFEntry.pa_type == PA_SKYWORKS_85712_HP){
|
|
panic_printk("[PHY_REG_PG_8812_hp]\n");
|
|
next_head = data_PHY_REG_PG_8812_hp_start;
|
|
read_bytes = (int)(data_PHY_REG_PG_8812_hp_end - data_PHY_REG_PG_8812_hp_start);
|
|
}else
|
|
#endif
|
|
{
|
|
#ifdef TXPWR_LMT_8812
|
|
panic_printk("[PHY_REG_PG_8812_new]\n");
|
|
next_head = data_PHY_REG_PG_8812_new_start;
|
|
read_bytes = (int)(data_PHY_REG_PG_8812_new_end - data_PHY_REG_PG_8812_new_start);
|
|
#else
|
|
panic_printk("[PHY_REG_PG_8812]\n");
|
|
next_head = data_PHY_REG_PG_8812_start;
|
|
read_bytes = (int)(data_PHY_REG_PG_8812_end - data_PHY_REG_PG_8812_start);
|
|
#endif
|
|
}
|
|
|
|
DEBUG_INFO("channel=%d pg_tbl_idx=%d\n", priv->pmib->dot11RFEntry.dot11channel, pg_tbl_idx);
|
|
}
|
|
#endif //CONFIG_RTL_8812_SUPPORT
|
|
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if ( IS_HAL_CHIP(priv) ) {
|
|
//printk("[%s][PHY_REG_PG_HAL]\n", __FUNCTION__);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_PG_SIZE, (pu1Byte)&read_bytes);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_PG_START, (pu1Byte)&next_head);
|
|
#if defined(CONFIG_WLAN_HAL_8881A) || defined(CONFIG_WLAN_HAL_8192EE) || defined(CONFIG_WLAN_HAL_8814AE)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8881A) || (GET_CHIP_VER(priv) == VERSION_8192E) || (GET_CHIP_VER(priv) == VERSION_8814A)) {
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_5G){
|
|
pg_tbl_idx = 1;
|
|
//printk("phyBandSelect == PHY_BAND_5G\n");
|
|
}
|
|
else{
|
|
pg_tbl_idx = 0;
|
|
//printk("phyBandSelect == PHY_BAND_2G\n");
|
|
}
|
|
} else
|
|
#endif
|
|
{
|
|
/* In Noraml Driver mode, and if mib 'pwr_by_rate' = 0 >> Use default power by rate table */
|
|
if (
|
|
#ifdef MP_TEST
|
|
priv->pshare->rf_ft_var.mp_specific ||
|
|
#endif
|
|
priv->pshare->rf_ft_var.pwr_by_rate) {
|
|
if (priv->pshare->is_40m_bw == 0) {
|
|
if (priv->pmib->dot11RFEntry.dot11channel <= 3)
|
|
pg_tbl_idx = BGN_20_CH1_3;
|
|
else if (priv->pmib->dot11RFEntry.dot11channel <= 9)
|
|
pg_tbl_idx = BGN_20_CH4_9;
|
|
else
|
|
pg_tbl_idx = BGN_20_CH10_14;
|
|
} else {
|
|
int val = priv->pmib->dot11RFEntry.dot11channel;
|
|
|
|
if (priv->pshare->offset_2nd_chan == 1)
|
|
val -= 2;
|
|
else
|
|
val += 2;
|
|
|
|
if (val <= 3)
|
|
pg_tbl_idx = BGN_40_CH1_3;
|
|
else if (val <= 9)
|
|
pg_tbl_idx = BGN_40_CH4_9;
|
|
else
|
|
pg_tbl_idx = BGN_40_CH10_14;
|
|
}
|
|
}
|
|
|
|
#ifdef MP_TEST
|
|
if (priv->pshare->rf_ft_var.mp_specific)
|
|
pg_tbl_idx = 0;
|
|
#endif
|
|
}
|
|
DEBUG_INFO("channel=%d pg_tbl_idx=%d\n", priv->pmib->dot11RFEntry.dot11channel, pg_tbl_idx);
|
|
}
|
|
#endif //CONFIG_WLAN_HAL
|
|
|
|
macreg_table = (struct MacRegTable *)priv->pshare->phy_reg_pg_buf;
|
|
max_len = PHY_REG_PG_SIZE;
|
|
file_format = THREE_COLUMN;
|
|
priv->pshare->txpwr_pg_format_abs = 0;
|
|
|
|
unsigned char *mem_ptr_tmp, *next_head_tmp=NULL;
|
|
if ((mem_ptr_tmp= (unsigned char *)rtw_vmalloc(MAX_CONFIG_FILE_SIZE)) == NULL) {
|
|
printk("PHY_ConfigBBWithParaFile(): not enough memory\n");
|
|
return -1;
|
|
}
|
|
|
|
memset(mem_ptr_tmp, 0, MAX_CONFIG_FILE_SIZE); // clear memory
|
|
memcpy(mem_ptr_tmp, next_head, read_bytes);
|
|
|
|
next_head_tmp= mem_ptr_tmp;
|
|
while(1) {
|
|
line_head = next_head_tmp;
|
|
next_head_tmp= get_line(&line_head);
|
|
|
|
if (line_head == NULL)
|
|
break;
|
|
if (line_head[0] == '/')
|
|
continue;
|
|
|
|
if (line_head[0] == '#') {
|
|
int line_idx = 1; //line_len = strlen(line_head);
|
|
|
|
while (line_idx <= strlen(line_head))
|
|
{
|
|
if (!memcmp(&(line_head[line_idx]), "Exact", 5)) {
|
|
//panic_printk("\n******** PG Exact format !!! ********\n");
|
|
priv->pshare->txpwr_pg_format_abs = 1;
|
|
file_format = FIVE_COLUMN;
|
|
break;
|
|
}
|
|
line_idx++;
|
|
}
|
|
}
|
|
|
|
if (!memcmp(line_head, "0x", 2) || !memcmp(line_head, "0X", 2))
|
|
break;
|
|
}
|
|
|
|
rtw_vmfree(mem_ptr_tmp, MAX_CONFIG_FILE_SIZE);
|
|
|
|
//panic_printk("PG file_format : %s\n", ((file_format == THREE_COLUMN) ? "THREE_COLUMN" : "FIVE_COLUMN"));
|
|
|
|
#ifdef TXPWR_LMT_NEWFILE
|
|
if ((file_format == THREE_COLUMN) && (GET_CHIP_VER(priv) >= VERSION_8188E)) {
|
|
panic_printk("%s() fail !!!: Wrong PHY_REG_PG format\n", __FUNCTION__);
|
|
return -1;
|
|
}
|
|
#endif
|
|
memset(priv->pshare->tgpwr_CCK_new, 0, 2);
|
|
memset(priv->pshare->tgpwr_OFDM_new, 0, 2);
|
|
memset(priv->pshare->tgpwr_HT1S_new, 0, 2);
|
|
memset(priv->pshare->tgpwr_HT2S_new, 0, 2);
|
|
memset(priv->pshare->tgpwr_VHT1S_new, 0, 2);
|
|
memset(priv->pshare->tgpwr_VHT2S_new, 0, 2);
|
|
}
|
|
#if 0
|
|
else if (reg_file == PHYREG_1T2R) {
|
|
macreg_table = (struct MacRegTable *)priv->pshare->phy_reg_2to1;
|
|
max_len = PHY_REG_1T2R;
|
|
file_format = THREE_COLUMN;
|
|
if (priv->pshare->rf_ft_var.pathB_1T == 0) { // PATH A
|
|
next_head = __PHY_to1T2R_start;
|
|
read_bytes = (int)(__PHY_to1T2R_end - __PHY_to1T2R_start);
|
|
} else { // PATH B
|
|
next_head = __PHY_to1T2R_b_start;
|
|
read_bytes = (int)(__PHY_to1T2R_b_end - __PHY_to1T2R_b_start);
|
|
}
|
|
}
|
|
#endif
|
|
#if defined(CONFIG_RTL_92D_SUPPORT) || defined (CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL)
|
|
else if (reg_file == PHYREG) {
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
phyreg_table = (struct PhyRegTable *)priv->pshare->phy_reg_buf;
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
//printk("[%s][PHY_REG_n_92d_hp]\n",__FUNCTION__);
|
|
next_head = data_PHY_REG_n_92d_hp_start;
|
|
read_bytes = (int)(data_PHY_REG_n_92d_hp_end - data_PHY_REG_n_92d_hp_start);
|
|
#else
|
|
//printk("[%s][PHY_REG_n]\n",__FUNCTION__);
|
|
next_head = data_PHY_REG_n_start;
|
|
read_bytes = (int)(data_PHY_REG_n_end - data_PHY_REG_n_start);
|
|
#endif
|
|
max_len = PHY_REG_SIZE;
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_8812_SUPPORT //8812 phy
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
phyreg_table = (struct PhyRegTable *)priv->pshare->phy_reg_buf;
|
|
if (IS_TEST_CHIP(priv)) { //for_8812_mp_chip
|
|
panic_printk("[%s][PHY_REG_8812]\n",__FUNCTION__);
|
|
next_head = data_PHY_REG_8812_start;
|
|
read_bytes = (int)(data_PHY_REG_8812_end - data_PHY_REG_8812_start);
|
|
} else {
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa && priv->pshare->rf_ft_var.use_ext_lna) {
|
|
panic_printk("[PHY_REG_8812_n_hp]\n");
|
|
next_head = data_PHY_REG_8812_n_hp_start;
|
|
read_bytes = (int)(data_PHY_REG_8812_n_hp_end - data_PHY_REG_8812_n_hp_start);
|
|
} else if (priv->pshare->rf_ft_var.use_ext_pa && !priv->pshare->rf_ft_var.use_ext_lna) {
|
|
panic_printk("[PHY_REG_8812_n_extpa]\n");
|
|
next_head = data_PHY_REG_8812_n_extpa_start;
|
|
read_bytes = (int)(data_PHY_REG_8812_n_extpa_end - data_PHY_REG_8812_n_extpa_start);
|
|
} else if (!priv->pshare->rf_ft_var.use_ext_pa && priv->pshare->rf_ft_var.use_ext_lna) {
|
|
panic_printk("[PHY_REG_8812_n_extlna]\n");
|
|
next_head = data_PHY_REG_8812_n_extlna_start;
|
|
read_bytes = (int)(data_PHY_REG_8812_n_extlna_end - data_PHY_REG_8812_n_extlna_start);
|
|
} else
|
|
#else
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
panic_printk("[PHY_REG_8812_n_extpa]\n");
|
|
next_head = data_PHY_REG_8812_n_extpa_start;
|
|
read_bytes = (int)(data_PHY_REG_8812_n_extpa_end - data_PHY_REG_8812_n_extpa_start);
|
|
} else
|
|
#endif
|
|
#else
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
if (priv->pshare->rf_ft_var.use_ext_lna) {
|
|
panic_printk("[PHY_REG_8812_n_extlna]\n");
|
|
next_head = data_PHY_REG_8812_n_extlna_start;
|
|
read_bytes = (int)(data_PHY_REG_8812_n_extlna_end - data_PHY_REG_8812_n_extlna_start);
|
|
} else
|
|
#endif
|
|
#endif
|
|
{
|
|
panic_printk("[PHY_REG_8812_n_default]\n");
|
|
next_head = data_PHY_REG_8812_n_default_start;
|
|
read_bytes = (int)(data_PHY_REG_8812_n_default_end - data_PHY_REG_8812_n_default_start);
|
|
}
|
|
}
|
|
max_len = PHY_REG_SIZE;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if ( IS_HAL_CHIP(priv) ) {
|
|
phyreg_table = (struct PhyRegTable *)priv->pshare->phy_reg_buf;
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa && priv->pshare->rf_ft_var.use_ext_lna) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_HP_SIZE, (pu1Byte)&read_bytes);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_HP_START, (pu1Byte)&next_head);
|
|
} else if (priv->pshare->rf_ft_var.use_ext_pa && !priv->pshare->rf_ft_var.use_ext_lna) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_EXTPA_SIZE, (pu1Byte)&read_bytes);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_EXTPA_START, (pu1Byte)&next_head);
|
|
} else if (!priv->pshare->rf_ft_var.use_ext_pa && priv->pshare->rf_ft_var.use_ext_lna) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_EXTLNA_SIZE, (pu1Byte)&read_bytes);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_EXTLNA_START, (pu1Byte)&next_head);
|
|
} else
|
|
#else
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_EXTPA_SIZE, (pu1Byte)&read_bytes);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_EXTPA_START, (pu1Byte)&next_head);
|
|
} else
|
|
#endif
|
|
#else
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
if ( priv->pshare->rf_ft_var.use_ext_lna) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_EXTLNA_SIZE, (pu1Byte)&read_bytes);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_EXTLNA_START, (pu1Byte)&next_head);
|
|
} else
|
|
#endif
|
|
#endif
|
|
{
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_SIZE, (pu1Byte)&read_bytes);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_START, (pu1Byte)&next_head);
|
|
}
|
|
|
|
max_len = PHY_REG_SIZE;
|
|
}
|
|
#endif //CONFIG_WLAN_HAL
|
|
|
|
}
|
|
#endif // CONFIG_RTL_92D_SUPPORT
|
|
#ifdef MP_TEST
|
|
else if (reg_file == PHYREG_MP) {
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
phyreg_table = (struct PhyRegTable *)priv->pshare->phy_reg_mp_buf;
|
|
//printk("[%s][PHY_REG_MP_n]\n",__FUNCTION__);
|
|
next_head = data_PHY_REG_MP_n_start;
|
|
read_bytes = (int)(data_PHY_REG_MP_n_end - data_PHY_REG_MP_n_start);
|
|
max_len = PHY_REG_SIZE;
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)) {
|
|
phyreg_table = (struct PhyRegTable *)priv->pshare->phy_reg_mp_buf;
|
|
next_head = data_PHY_REG_MP_n_92C_start;
|
|
read_bytes = (int)(data_PHY_REG_MP_n_92C_end - data_PHY_REG_MP_n_92C_start);
|
|
max_len = PHY_REG_SIZE;
|
|
}
|
|
#endif
|
|
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT //8812 phy mp
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
phyreg_table = (struct PhyRegTable *)priv->pshare->phy_reg_mp_buf;
|
|
printk("[%s][PHY_REG_MP_8812]\n", __FUNCTION__);
|
|
next_head = data_PHY_REG_MP_8812_start;
|
|
read_bytes = (int)(data_PHY_REG_MP_8812_end - data_PHY_REG_MP_8812_start);
|
|
max_len = PHY_REG_SIZE;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if ( IS_HAL_CHIP(priv) ) {
|
|
phyreg_table = (struct PhyRegTable *)priv->pshare->phy_reg_mp_buf;
|
|
printk("[%s][PHY_REG_MP_HAL]\n", __FUNCTION__);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_MP_SIZE, (pu1Byte)&read_bytes);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_MP_START, (pu1Byte)&next_head);
|
|
max_len = PHY_REG_SIZE;
|
|
}
|
|
#endif //CONFIG_WLAN_HAL
|
|
|
|
}
|
|
#endif
|
|
#if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_WLAN_HAL)
|
|
else if (reg_file == PHYREG_1T1R) { // PATH A
|
|
phyreg_table = (struct PhyRegTable *)priv->pshare->phy_reg_buf;
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)) {
|
|
#ifdef TESTCHIP_SUPPORT
|
|
if ( IS_TEST_CHIP(priv) ) {
|
|
next_head = data_PHY_REG_1T_start;
|
|
read_bytes = (int)(data_PHY_REG_1T_end - data_PHY_REG_1T_start);
|
|
} else
|
|
#endif
|
|
{
|
|
#if defined(HIGH_POWER_EXT_PA) || defined(HIGH_POWER_EXT_LNA)
|
|
if (
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
priv->pshare->rf_ft_var.use_ext_pa
|
|
#else
|
|
priv->pshare->rf_ft_var.use_ext_lna
|
|
#endif
|
|
) {
|
|
//printk("[%s][PHY_REG_1T_n_hp]\n", __FUNCTION__);
|
|
next_head = data_PHY_REG_1T_n_hp_start;
|
|
read_bytes = (int)(data_PHY_REG_1T_n_hp_end - data_PHY_REG_1T_n_hp_start);
|
|
} else
|
|
#endif
|
|
{
|
|
//printk("[%s][PHY_REG_1T_n]\n", __FUNCTION__);
|
|
next_head = data_PHY_REG_1T_n_start;
|
|
read_bytes = (int)(data_PHY_REG_1T_n_end - data_PHY_REG_1T_n_start);
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if ( IS_HAL_CHIP(priv) ) {
|
|
printk("[%s][PHY_REG_1T_HAL]\n", __FUNCTION__);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_1T_SIZE, (pu1Byte)&read_bytes);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_1T_START, (pu1Byte)&next_head);
|
|
}
|
|
#endif //CONFIG_WLAN_HAL
|
|
|
|
max_len = PHY_REG_SIZE;
|
|
#if 0
|
|
if (priv->pshare->rf_ft_var.pathB_1T == 0) {
|
|
next_head = __PHY_to1T1R_start;
|
|
read_bytes = (int)(__PHY_to1T1R_end - __PHY_to1T1R_start);
|
|
} else { // PATH B
|
|
next_head = __PHY_to1T1R_b_start;
|
|
read_bytes = (int)(__PHY_to1T1R_b_end - __PHY_to1T1R_b_start);
|
|
}
|
|
#endif
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
else if (reg_file == PHYREG_2T2R) {
|
|
#ifdef TESTCHIP_SUPPORT
|
|
if (IS_TEST_CHIP(priv)) {
|
|
phyreg_table = (struct PhyRegTable *)priv->pshare->phy_reg_buf;
|
|
next_head = data_PHY_REG_2T_start;
|
|
read_bytes = (int)(data_PHY_REG_2T_end - data_PHY_REG_2T_start);
|
|
} else
|
|
#endif
|
|
{
|
|
phyreg_table = (struct PhyRegTable *)priv->pshare->phy_reg_buf;
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa)
|
|
{
|
|
panic_printk("[%s][PHY_REG_2T_n_hp]\n", __FUNCTION__);
|
|
next_head = data_PHY_REG_2T_n_hp_start;
|
|
read_bytes = (int)(data_PHY_REG_2T_n_hp_end - data_PHY_REG_2T_n_hp_start);
|
|
} else
|
|
#endif
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
if (priv->pshare->rf_ft_var.use_ext_lna)
|
|
{
|
|
panic_printk("[%s][PHY_REG_2T_n_lna]\n", __FUNCTION__);
|
|
next_head = data_PHY_REG_2T_n_lna_start;
|
|
read_bytes = (int)(data_PHY_REG_2T_n_lna_end - data_PHY_REG_2T_n_lna_start);
|
|
} else
|
|
#endif
|
|
{
|
|
//printk("[%s][PHY_REG_2T_n]\n", __FUNCTION__);
|
|
next_head = data_PHY_REG_2T_n_start;
|
|
read_bytes = (int)(data_PHY_REG_2T_n_end - data_PHY_REG_2T_n_start);
|
|
}
|
|
}
|
|
max_len = PHY_REG_SIZE;
|
|
}
|
|
#endif
|
|
|
|
{
|
|
#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL)
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E || GET_CHIP_VER(priv)==VERSION_8881A) {
|
|
if (pg_tbl_idx == 0) {
|
|
regstart = 0xc20;
|
|
regend = 0xe38;
|
|
} else {
|
|
regstart = 0xc24;
|
|
regend = 0xe4c;
|
|
}
|
|
} else {
|
|
regstart = 0xe00;
|
|
regend = 0x868;
|
|
}
|
|
#endif
|
|
#if 0
|
|
if (file_format == FIVE_COLUMN)
|
|
{
|
|
|
|
if ((mem_ptr2 = (unsigned char *)kmalloc(MAX_CONFIG_FILE_SIZE, GFP_ATOMIC)) == NULL) {
|
|
printk("PHY_ConfigBBWithParaFile(): not enough memory\n");
|
|
return -1;
|
|
}
|
|
|
|
memset(mem_ptr2, 0, MAX_CONFIG_FILE_SIZE); // clear memory
|
|
memcpy(mem_ptr2, next_head, read_bytes);
|
|
|
|
next_head2 = mem_ptr2;
|
|
while(1) {
|
|
line_head = next_head2;
|
|
next_head2 = get_line(&line_head);
|
|
|
|
if (line_head == NULL)
|
|
break;
|
|
if (line_head[0] == '/')
|
|
continue;
|
|
get_target_val_new(priv, line_head, &u4bRegOffset, &u4bRegMask ,&u4bRegValue);
|
|
}
|
|
|
|
kfree(mem_ptr2);
|
|
}
|
|
#endif
|
|
if((mem_ptr = (unsigned char *)rtw_vmalloc(MAX_CONFIG_FILE_SIZE)) == NULL) {
|
|
printk("PHY_ConfigBBWithParaFile(): not enough memory\n");
|
|
return -1;
|
|
}
|
|
|
|
memset(mem_ptr, 0, MAX_CONFIG_FILE_SIZE); // clear memory
|
|
memcpy(mem_ptr, next_head, read_bytes);
|
|
|
|
next_head = mem_ptr;
|
|
while (1) {
|
|
line_head = next_head;
|
|
next_head = get_line(&line_head);
|
|
if (line_head == NULL)
|
|
break;
|
|
|
|
if (line_head[0] == '/')
|
|
continue;
|
|
|
|
if (file_format == TWO_COLUMN) {
|
|
num = get_offset_val(line_head, &u4bRegOffset, &u4bRegValue);
|
|
if (num > 0) {
|
|
if (((len+1) * sizeof(struct PhyRegTable)) > max_len)
|
|
break;
|
|
phyreg_table[len].offset = u4bRegOffset;
|
|
phyreg_table[len].value = u4bRegValue;
|
|
len++;
|
|
|
|
if ((len & 0x7ff) == 0)
|
|
watchdog_kick();
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT)|| defined(CONFIG_WLAN_HAL) //_eric_8812 ?? u4bRegOffset
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188E) || (GET_CHIP_VER(priv) == VERSION_8812E) || (IS_HAL_CHIP(priv))) {
|
|
if (u4bRegOffset == 0xffff)
|
|
break;
|
|
} else if (CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{
|
|
if (u4bRegOffset == 0xff)
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
if (reg_file == PHYREG_PG) {
|
|
if (file_format == THREE_COLUMN)
|
|
num = get_offset_mask_val(line_head, &u4bRegOffset, &u4bRegMask , &u4bRegValue);
|
|
else
|
|
num = get_offset_mask_val_new(priv, line_head, &u4bRegOffset, &u4bRegMask , &u4bRegValue);
|
|
}
|
|
|
|
if (num > 0) {
|
|
if (((len+1) * sizeof(struct MacRegTable)) > max_len)
|
|
break;
|
|
macreg_table[len].offset = u4bRegOffset;
|
|
macreg_table[len].mask = u4bRegMask;
|
|
macreg_table[len].value = u4bRegValue;
|
|
len++;
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188E) || (GET_CHIP_VER(priv) == VERSION_8812E) || (IS_HAL_CHIP(priv))) {
|
|
if (u4bRegOffset == 0xffff)
|
|
break;
|
|
} else if (CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{
|
|
if (u4bRegOffset == 0xff)
|
|
break;
|
|
}
|
|
|
|
if ((len & 0x7ff) == 0)
|
|
watchdog_kick();
|
|
}
|
|
}
|
|
}
|
|
|
|
rtw_vmfree(mem_ptr, MAX_CONFIG_FILE_SIZE);
|
|
|
|
if ((len * sizeof(struct PhyRegTable)) > max_len) {
|
|
printk("PHY REG table buffer not large enough!\n");
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
num = 0;
|
|
while (1) {
|
|
if (file_format == THREE_COLUMN || file_format == FIVE_COLUMN) {
|
|
u4bRegOffset = macreg_table[num].offset;
|
|
u4bRegValue = macreg_table[num].value;
|
|
u4bRegMask = macreg_table[num].mask;
|
|
} else {
|
|
u4bRegOffset = phyreg_table[num].offset;
|
|
u4bRegValue = phyreg_table[num].value;
|
|
}
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188E) || (GET_CHIP_VER(priv) == VERSION_8812E) || (IS_HAL_CHIP(priv))) {
|
|
if (u4bRegOffset == 0xffff)
|
|
break;
|
|
} else if (CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{
|
|
if (u4bRegOffset == 0xff)
|
|
break;
|
|
}
|
|
|
|
if (file_format == THREE_COLUMN || file_format == FIVE_COLUMN) {
|
|
#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL)
|
|
if (reg_file == PHYREG_PG && (
|
|
#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL)
|
|
(GET_CHIP_VER(priv) == VERSION_8192D)||(GET_CHIP_VER(priv) == VERSION_8188E) || (GET_CHIP_VER(priv) == VERSION_8812E) || (IS_HAL_CHIP(priv))
|
|
#endif
|
|
)) {
|
|
|
|
if (u4bRegOffset == regstart) {
|
|
if (idx == pg_tbl_idx)
|
|
write_en = 1;
|
|
idx++;
|
|
}
|
|
if (write_en) {
|
|
//panic_printk("0x%03x 0x%08x\n", u4bRegOffset, u4bRegValue);
|
|
PHY_SetBBReg(priv, u4bRegOffset, u4bRegMask, u4bRegValue);
|
|
if (u4bRegOffset == regend) {
|
|
write_en = 0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
} else
|
|
#endif
|
|
{
|
|
PHY_SetBBReg(priv, u4bRegOffset, u4bRegMask, u4bRegValue);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
PHY_SetBBReg(priv, u4bRegOffset, bMaskDWord, u4bRegValue);
|
|
}
|
|
#ifdef USE_OUT_SRC
|
|
if (reg_file == AGCTAB && priv->pshare->_dmODM.print_agc)
|
|
{
|
|
panic_printk("Reg %x [31:0] = %x \n", u4bRegOffset, u4bRegValue);
|
|
}
|
|
#endif
|
|
num++;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
* Function: PHY_ConfigRFWithParaFile()
|
|
*
|
|
* Overview: This function read RF parameters from general file format, and do RF 3-wire
|
|
*
|
|
* Input: PADAPTER Adapter
|
|
* ps1Byte pFileName
|
|
* RF92CD_RADIO_PATH_E eRFPath
|
|
*
|
|
* Output: NONE
|
|
*
|
|
* Return: RT_STATUS_SUCCESS: configuration file exist
|
|
*
|
|
* Note: Delay may be required for RF configuration
|
|
*---------------------------------------------------------------------------*/
|
|
int PHY_ConfigRFWithParaFile(struct rtl8192cd_priv *priv,
|
|
unsigned char *start, int read_bytes,
|
|
RF92CD_RADIO_PATH_E eRFPath)
|
|
{
|
|
int num;
|
|
unsigned int u4bRegOffset, u4bRegValue;
|
|
unsigned char *mem_ptr, *line_head, *next_head;
|
|
|
|
if ((mem_ptr = (unsigned char *)rtw_vmalloc(MAX_CONFIG_FILE_SIZE)) == NULL) {
|
|
printk("PHY_ConfigRFWithParaFile(): not enough memory\n");
|
|
return -1;
|
|
}
|
|
|
|
memset(mem_ptr, 0, MAX_CONFIG_FILE_SIZE); // clear memory
|
|
memcpy(mem_ptr, start, read_bytes);
|
|
|
|
next_head = mem_ptr;
|
|
while (1) {
|
|
line_head = next_head;
|
|
next_head = get_line(&line_head);
|
|
if (line_head == NULL)
|
|
break;
|
|
|
|
if (line_head[0] == '/')
|
|
continue;
|
|
|
|
num = get_offset_val(line_head, &u4bRegOffset, &u4bRegValue);
|
|
if (num > 0) {
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL) //_eric_8812 ?? rf paras ??
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188E) || (GET_CHIP_VER(priv) == VERSION_8812E) || (IS_HAL_CHIP(priv))) {
|
|
if (u4bRegOffset == 0xffff) {
|
|
break;
|
|
} else if ((u4bRegOffset == 0xfe) || (u4bRegOffset == 0xffe)) {
|
|
delay_ms(50); // Delay 50 ms. Only RF configuration require delay
|
|
} else if (num == 2) {
|
|
PHY_SetRFReg(priv, eRFPath, u4bRegOffset, bMask20Bits, u4bRegValue);
|
|
delay_ms(1);
|
|
}
|
|
} else if (CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{
|
|
if (u4bRegOffset == 0xff) {
|
|
break;
|
|
} else if (u4bRegOffset == 0xfe) {
|
|
delay_ms(50); // Delay 50 ms. Only RF configuration require delay
|
|
} else if (num == 2) {
|
|
PHY_SetRFReg(priv, eRFPath, u4bRegOffset, bMask20Bits, u4bRegValue);
|
|
delay_ms(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
watchdog_kick();
|
|
}
|
|
|
|
rtw_vmfree(mem_ptr, MAX_CONFIG_FILE_SIZE);
|
|
|
|
return 0;
|
|
}
|
|
|
|
#if 1
|
|
int PHY_ConfigMACWithParaFile(struct rtl8192cd_priv *priv)
|
|
{
|
|
int read_bytes, num, len = 0;
|
|
unsigned int u4bRegOffset, u4bRegValue;
|
|
unsigned char *mem_ptr, *line_head, *next_head;
|
|
struct PhyRegTable *reg_table = (struct PhyRegTable *)priv->pshare->mac_reg_buf;
|
|
|
|
{
|
|
if ((mem_ptr = (unsigned char *)rtw_vmalloc(MAX_CONFIG_FILE_SIZE)) == NULL) {
|
|
printk("PHY_ConfigMACWithParaFile(): not enough memory\n");
|
|
return -1;
|
|
}
|
|
|
|
memset(mem_ptr, 0, MAX_CONFIG_FILE_SIZE); // clear memory
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
u8 *pMACRegStart;
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_MACREGFILE_SIZE, (pu1Byte)&read_bytes);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_MACREGFILE_START, (pu1Byte)&pMACRegStart);
|
|
memcpy(mem_ptr, pMACRegStart, read_bytes);
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
printk("[%s][MACPHY_REG]\n", __FUNCTION__);
|
|
read_bytes = (int)(data_MACPHY_REG_end - data_MACPHY_REG_start);
|
|
memcpy(mem_ptr, data_MACPHY_REG_start, read_bytes);
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)) {
|
|
printk("[%s][MACPHY_REG_92C]\n", __FUNCTION__);
|
|
read_bytes = (int)(data_MACPHY_REG_92C_end - data_MACPHY_REG_92C_start);
|
|
memcpy(mem_ptr, data_MACPHY_REG_92C_start, read_bytes);
|
|
}
|
|
#endif
|
|
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT //mac reg
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
if (IS_TEST_CHIP(priv)) {
|
|
panic_printk("[MAC_REG_8812]\n");
|
|
read_bytes = (int)(data_MAC_REG_8812_end - data_MAC_REG_8812_start);
|
|
memcpy(mem_ptr, data_MAC_REG_8812_start, read_bytes);
|
|
} else {
|
|
panic_printk("[MAC_REG_8812_n]\n");
|
|
read_bytes = (int)(data_MAC_REG_8812_n_end - data_MAC_REG_8812_n_start);
|
|
memcpy(mem_ptr, data_MAC_REG_8812_n_start, read_bytes);
|
|
}
|
|
}
|
|
#endif
|
|
next_head = mem_ptr;
|
|
while (1) {
|
|
line_head = next_head;
|
|
next_head = get_line(&line_head);
|
|
if (line_head == NULL)
|
|
break;
|
|
|
|
if (line_head[0] == '/')
|
|
continue;
|
|
|
|
num = get_offset_val(line_head, &u4bRegOffset, &u4bRegValue);
|
|
if (num > 0) {
|
|
reg_table[len].offset = u4bRegOffset;
|
|
reg_table[len].value = u4bRegValue;
|
|
len++;
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188E) || (GET_CHIP_VER(priv) == VERSION_8812E) || (IS_HAL_CHIP(priv))) {
|
|
if (u4bRegOffset == 0xffff)
|
|
break;
|
|
} else if (CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{
|
|
if (u4bRegOffset == 0xff)
|
|
break;
|
|
}
|
|
if ((len * sizeof(struct MacRegTable)) > MAC_REG_SIZE)
|
|
break;
|
|
}
|
|
}
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188E) || (GET_CHIP_VER(priv) == VERSION_8812E) || (IS_HAL_CHIP(priv)))
|
|
reg_table[len].offset = 0xffff;
|
|
else if (CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
reg_table[len].offset = 0xff;
|
|
|
|
rtw_vmfree(mem_ptr, MAX_CONFIG_FILE_SIZE);
|
|
|
|
if ((len * sizeof(struct MacRegTable)) > MAC_REG_SIZE) {
|
|
printk("MAC REG table buffer not large enough!\n");
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
num = 0;
|
|
while (1) {
|
|
u4bRegOffset = reg_table[num].offset;
|
|
u4bRegValue = reg_table[num].value;
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188E) || (GET_CHIP_VER(priv) == VERSION_8812E) || (IS_HAL_CHIP(priv))) {
|
|
if (u4bRegOffset == 0xffff)
|
|
break;
|
|
} else if (CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{
|
|
if (u4bRegOffset == 0xff)
|
|
break;
|
|
}
|
|
|
|
RTL_W8(u4bRegOffset, u4bRegValue);
|
|
num++;
|
|
}
|
|
|
|
#if 0 //defined(CONFIG_RTL_8812_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
if (priv->pmib->dot11nConfigEntry.dot11nSTBC && priv->pmib->dot11nConfigEntry.dot11nLDPC)
|
|
RTL_W16(REG_RESP_SIFS_OFDM_8812, 0x0c0c);
|
|
}
|
|
#endif
|
|
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
#ifdef UNIVERSAL_REPEATER
|
|
static struct rtl8192cd_priv *get_another_interface_priv(struct rtl8192cd_priv *priv)
|
|
{
|
|
if (IS_DRV_OPEN(GET_VXD_PRIV(priv)))
|
|
return GET_VXD_PRIV(priv);
|
|
else if (IS_DRV_OPEN(GET_ROOT(priv)))
|
|
return GET_ROOT(priv);
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
|
|
static int get_shortslot_for_another_interface(struct rtl8192cd_priv *priv)
|
|
{
|
|
struct rtl8192cd_priv *p_priv;
|
|
|
|
p_priv = get_another_interface_priv(priv);
|
|
if (p_priv) {
|
|
if (p_priv->pmib->dot11OperationEntry.opmode & WIFI_AP_STATE)
|
|
return (p_priv->pmib->dot11ErpInfo.shortSlot);
|
|
else {
|
|
if (p_priv->pmib->dot11OperationEntry.opmode & WIFI_ASOC_STATE)
|
|
return (p_priv->pmib->dot11ErpInfo.shortSlot);
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
#endif // UNIVERSAL_REPEATER
|
|
|
|
|
|
void set_slot_time(struct rtl8192cd_priv *priv, int use_short)
|
|
{
|
|
#ifdef UNIVERSAL_REPEATER
|
|
int is_short;
|
|
is_short = get_shortslot_for_another_interface(priv);
|
|
if (is_short != -1) { // not abtained
|
|
use_short &= is_short;
|
|
}
|
|
#endif
|
|
|
|
#if defined(CONFIG_PCI_HCI)
|
|
if (use_short)
|
|
RTL_W8(SLOT_TIME, 0x09);
|
|
else
|
|
RTL_W8(SLOT_TIME, 0x14);
|
|
#elif defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
|
|
notify_slot_time_change(priv, use_short);
|
|
#endif
|
|
}
|
|
|
|
void SwChnl(struct rtl8192cd_priv *priv, unsigned char channel, int offset)
|
|
{
|
|
unsigned int val = channel, eRFPath, curMaxRFPath;
|
|
|
|
#ifdef RTK_NL80211 /*cfg p2p cfg p2p*/
|
|
if( priv->pshare->rtk_remain_on_channel ) {
|
|
NDEBUG("deny rtk_remain_on_channel\n");
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
#if defined(DFS) && !defined(RTK_NL80211)
|
|
#ifdef UNIVERSAL_REPEATER
|
|
unsigned int no_beacon = 0;
|
|
if(under_apmode_repeater(priv))
|
|
{
|
|
if(!priv->pmib->dot11DFSEntry.disable_DFS && is_DFS_channel(channel))
|
|
{
|
|
if(!priv->site_survey->hidden_ap_found){
|
|
no_beacon = 1;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
priv->pshare->No_RF_Write = 0;
|
|
UpdateBBRFVal8812(priv, channel);
|
|
}
|
|
#endif
|
|
|
|
// TODO: 8814AE BB/RF
|
|
// TODO: after all BB/RF init ready, change (8881A || 8814AE) to (WLAN_HAL && 11AC_SUPPORT) ??
|
|
#if defined(CONFIG_WLAN_HAL_8881A) || defined(CONFIG_WLAN_HAL_8814AE)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8881A) || (GET_CHIP_VER(priv) == VERSION_8814A)) {
|
|
priv->pshare->No_RF_Write = 0;
|
|
GET_HAL_INTERFACE(priv)->PHYUpdateBBRFValHandler(priv, channel, offset);
|
|
}
|
|
#endif
|
|
|
|
#ifdef AC2G_256QAM
|
|
if(is_ac2g(priv)) //for 8812 & 8881a
|
|
{
|
|
RTL_W32(0x8c0, RTL_R32(0x8c0) & (~BIT(17))); //enable tx vht rates
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
#ifdef MP_TEST
|
|
if ( (priv->pshare->rf_ft_var.mp_specific == 0) || (priv->pshare->rf_ft_var.pwr_by_rate == 1) )
|
|
reload_txpwr_pg(priv);
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if (priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY)
|
|
curMaxRFPath = RF92CD_PATH_B;
|
|
else
|
|
#endif
|
|
curMaxRFPath = RF92CD_PATH_MAX;
|
|
|
|
if (channel > 14)
|
|
priv->pshare->curr_band = BAND_5G;
|
|
else
|
|
priv->pshare->curr_band = BAND_2G;
|
|
|
|
//_TXPWR_REDEFINE ?? Working channel also apply to 5G ?? what if channel = 165 + 2 or 36 -2 ??
|
|
#if 0
|
|
#ifdef RTK_AC_SUPPORT //todo, find working channel for 80M
|
|
if (priv->pshare->CurrentChannelBW == HT_CHANNEL_WIDTH_80) {
|
|
#ifdef AC2G_256QAM
|
|
if(is_ac2g(priv))
|
|
val = 7; //in 2g band, only channel 7 can expand to 80M bw
|
|
else
|
|
#endif
|
|
if (channel <= 48)
|
|
val = 42;
|
|
else if (channel <= 64)
|
|
val = 58;
|
|
else if (channel <= 112)
|
|
val = 106;
|
|
else if (channel <= 128)
|
|
val = 122;
|
|
else if (channel <= 144)
|
|
val = 138;
|
|
else if (channel <= 161)
|
|
val = 155;
|
|
else if (channel <= 177)
|
|
val = 171;
|
|
} else
|
|
#endif
|
|
if (priv->pshare->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40) {
|
|
if (offset == 1)
|
|
val -= 2;
|
|
else
|
|
val += 2;
|
|
}
|
|
#else
|
|
val = get_center_channel(priv, channel, offset, 1);
|
|
#endif
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_2G)
|
|
#endif
|
|
if (priv->pshare->rf_ft_var.use_frq_2_3G)
|
|
val += 14;
|
|
|
|
for (eRFPath = RF92CD_PATH_A; eRFPath < curMaxRFPath; eRFPath++) {
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
priv->pshare->RegRF18[eRFPath] = RTL_SET_MASK(priv->pshare->RegRF18[eRFPath], 0xff, val, 0);
|
|
//PHY_SetRFReg(priv, eRFPath, rRfChannel, 0xff, val);
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_5G) {
|
|
/*
|
|
* Set Bit18 when channel >= 100, for 5G only
|
|
*/
|
|
if (val >= 100)
|
|
priv->pshare->RegRF18[eRFPath] |= BIT(18);
|
|
//PHY_SetRFReg(priv, eRFPath, rRfChannel, BIT(18), 1);
|
|
else
|
|
priv->pshare->RegRF18[eRFPath] &= (~(BIT(18)));
|
|
//PHY_SetRFReg(priv, eRFPath, rRfChannel, BIT(18), 0);
|
|
|
|
priv->pshare->RegRF18[eRFPath] |= BIT(16);
|
|
//PHY_SetRFReg(priv, eRFPath, rRfChannel, BIT(16), 1);
|
|
priv->pshare->RegRF18[eRFPath] |= BIT(8);
|
|
//PHY_SetRFReg(priv, eRFPath, rRfChannel, BIT(8), 1);
|
|
// CLOAD for RF paht_A/B (MP-chip)
|
|
if (val < 149)
|
|
PHY_SetRFReg(priv, eRFPath, 0xB, BIT(16) | BIT(15) | BIT(14), 0x7);
|
|
else
|
|
PHY_SetRFReg(priv, eRFPath, 0xB, BIT(16) | BIT(15) | BIT(14), 0x2);
|
|
} else {
|
|
priv->pshare->RegRF18[eRFPath] &= (~(BIT(18)));
|
|
//PHY_SetRFReg(priv, eRFPath, rRfChannel, BIT(18, 0);
|
|
priv->pshare->RegRF18[eRFPath] &= (~(BIT(16)));
|
|
//PHY_SetRFReg(priv, eRFPath, rRfChannel, BIT(16), 0);
|
|
priv->pshare->RegRF18[eRFPath] &= (~(BIT(8)));
|
|
//PHY_SetRFReg(priv, eRFPath, rRfChannel, BIT(8), 0);
|
|
// CLOAD for RF paht_A/B (MP-chip)
|
|
PHY_SetRFReg(priv, eRFPath, 0xB, BIT(16) | BIT(15) | BIT(14), 0x7);
|
|
}
|
|
|
|
PHY_SetRFReg(priv, eRFPath, rRfChannel, bMask20Bits, priv->pshare->RegRF18[eRFPath]);
|
|
//printk("%s(%d) RF 18 = 0x%05x[0x%05x]\n",__FUNCTION__,__LINE__,priv->pshare->RegRF18[eRFPath],
|
|
//PHY_QueryRFReg(priv,eRFPath,rRfChannel,bMask20Bits,1));
|
|
#ifdef RX_GAIN_TRACK_92D
|
|
priv->pshare->RegRF3C[eRFPath] = PHY_QueryRFReg(priv, eRFPath, 0x3C, bMask20Bits, 1);
|
|
#endif
|
|
} else
|
|
#endif
|
|
{
|
|
PHY_SetRFReg(priv, eRFPath, rRfChannel, 0xff, val);
|
|
}
|
|
|
|
}
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
SetSYN_para(priv, val);
|
|
#ifdef SW_LCK_92D
|
|
phy_ReloadLCKSetting(priv);
|
|
#endif
|
|
SetIMR_n(priv, val);
|
|
|
|
Update92DRFbyChannel(priv, val);
|
|
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_2G)
|
|
#endif
|
|
if (priv->pshare->rf_ft_var.use_frq_2_3G)
|
|
val -= 14;
|
|
|
|
priv->pshare->working_channel = val;
|
|
|
|
#ifdef TXPWR_LMT
|
|
{
|
|
if (!priv->pshare->rf_ft_var.disable_txpwrlmt) {
|
|
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188E)) //92c_pwrlmt
|
|
{
|
|
//printk("reload_txpwr_pg\n");
|
|
reload_txpwr_pg(priv);
|
|
}
|
|
|
|
#ifdef TXPWR_LMT_NEWFILE
|
|
if ((GET_CHIP_VER(priv) == VERSION_8812E) || (GET_CHIP_VER(priv) == VERSION_8188E) || IS_HAL_CHIP(priv))
|
|
find_pwr_limit_new(priv, channel, offset);
|
|
else if (CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
find_pwr_limit(priv, channel, offset);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
|
|
#if defined(DFS) && !defined(RTK_NL80211)
|
|
#ifdef UNIVERSAL_REPEATER
|
|
if(under_apmode_repeater(priv))
|
|
{
|
|
if(no_beacon == 1)
|
|
RTL_W8(TXPAUSE, RTL_R8(TXPAUSE) | STOP_BCN);
|
|
else
|
|
RTL_W8(TXPAUSE, RTL_R8(TXPAUSE) & ~STOP_BCN);
|
|
}
|
|
#endif
|
|
#endif
|
|
SetTxPowerLevel(priv);
|
|
|
|
return;
|
|
}
|
|
|
|
#ifdef MCR_WIRELESS_EXTEND
|
|
#ifdef CONFIG_WLAN_HAL_8814AE
|
|
int Switch_Antenna_8814(struct rtl8192cd_priv *priv, unsigned char *data)
|
|
{
|
|
unsigned int rx_ss=0, ant=0;
|
|
unsigned char*val=NULL;
|
|
|
|
if (strlen(data)==0) {
|
|
GDEBUG("Null data !!!\n");
|
|
return 1;
|
|
} else
|
|
GDEBUG("data: %s\n", data);
|
|
|
|
|
|
val = get_value_by_token((char *)data, "ss=");
|
|
if (val) {
|
|
rx_ss = _atoi(val,10);
|
|
if (rx_ss < 1 || rx_ss > 4) {
|
|
GDEBUG("not support ss=%d !\n", rx_ss);
|
|
return 1;
|
|
}
|
|
} else {
|
|
GDEBUG("no specific ss !\n");
|
|
return 1;
|
|
}
|
|
|
|
val = get_value_by_token((char *)data, "path=");
|
|
if (val) {
|
|
if (rx_ss == 1) {
|
|
if (priv->pshare->is_40m_bw == HT_CHANNEL_WIDTH_80) {
|
|
PHY_SetBBReg(priv, 0x838, BIT0, 0x1);
|
|
PHY_SetBBReg(priv, 0x82C, 0x00f00000, 0xb);
|
|
PHY_SetBBReg(priv, 0x82C, 0x000f0000, 0xb);
|
|
PHY_SetBBReg(priv, 0x838, 0x0f000000, 0x9);
|
|
PHY_SetBBReg(priv, 0x838, 0x00f00000, 0x9);
|
|
PHY_SetBBReg(priv, 0x838, 0x000f0000, 0x9);
|
|
PHY_SetBBReg(priv, 0x840, 0x0000f000, 0x7);
|
|
} else {
|
|
PHY_SetBBReg(priv, 0x82c, BIT27|BIT26|BIT25|BIT24, 0x5);
|
|
RTL_W8(0x830,0xa);
|
|
}
|
|
if (!strcmp(val,"a"))
|
|
ant = ANTENNA_A;
|
|
else if (!strcmp(val,"b"))
|
|
ant = ANTENNA_B;
|
|
else if (!strcmp(val,"c"))
|
|
ant = ANTENNA_C;
|
|
else if (!strcmp(val,"d"))
|
|
ant = ANTENNA_D;
|
|
}
|
|
else if (rx_ss == 2) {
|
|
if (priv->pshare->is_40m_bw == HT_CHANNEL_WIDTH_80) {
|
|
PHY_SetBBReg(priv, 0x838, BIT0, 0x1);
|
|
PHY_SetBBReg(priv, 0x82C, 0x00f00000, 0xa);
|
|
PHY_SetBBReg(priv, 0x82C, 0x000f0000, 0x9);
|
|
PHY_SetBBReg(priv, 0x838, 0x0f000000, 0x9);
|
|
PHY_SetBBReg(priv, 0x838, 0x00f00000, 0x9);
|
|
PHY_SetBBReg(priv, 0x838, 0x000f0000, 0x9);
|
|
PHY_SetBBReg(priv, 0x840, 0x0000f000, 0x6);
|
|
} else {
|
|
PHY_SetBBReg(priv, 0x82c, BIT27|BIT26|BIT25|BIT24, 0x5);
|
|
RTL_W8(0x830,0xa);
|
|
}
|
|
if (!strcmp(val,"ab"))
|
|
ant = 0; //ANTENNA_AB;
|
|
else if (!strcmp(val,"bc"))
|
|
ant = ANTENNA_BC;
|
|
else if (!strcmp(val,"cd"))
|
|
ant = 0; //ANTENNA_CD;
|
|
}
|
|
else if (rx_ss == 3) {
|
|
if (priv->pshare->is_40m_bw == HT_CHANNEL_WIDTH_80) {
|
|
PHY_SetBBReg(priv, 0x838, BIT0, 0x1);
|
|
PHY_SetBBReg(priv, 0x82C, 0x00f00000, 0xa);
|
|
PHY_SetBBReg(priv, 0x82C, 0x000f0000, 0x8);
|
|
PHY_SetBBReg(priv, 0x838, 0x0f000000, 0x7);
|
|
PHY_SetBBReg(priv, 0x838, 0x00f00000, 0x7);
|
|
PHY_SetBBReg(priv, 0x838, 0x000f0000, 0x7);
|
|
PHY_SetBBReg(priv, 0x840, 0x0000f000, 0x6);
|
|
} else {
|
|
PHY_SetBBReg(priv, 0x82c, BIT27|BIT26|BIT25|BIT24, 0x3);
|
|
RTL_W8(0x830,0x8);
|
|
}
|
|
|
|
if (!strcmp(val,"abc"))
|
|
ant = 0; //ANTENNA_ABC;
|
|
else if (!strcmp(val,"bcd"))
|
|
ant = ANTENNA_BCD;
|
|
}
|
|
else if (rx_ss == 4) {
|
|
if (priv->pshare->is_40m_bw == HT_CHANNEL_WIDTH_80) {
|
|
PHY_SetBBReg(priv, 0x838, BIT0, 0x1);
|
|
PHY_SetBBReg(priv, 0x82C, 0x00f00000, 0xa);
|
|
PHY_SetBBReg(priv, 0x82C, 0x000f0000, 0x8);
|
|
PHY_SetBBReg(priv, 0x838, 0x0f000000, 0x7);
|
|
PHY_SetBBReg(priv, 0x838, 0x00f00000, 0x7);
|
|
PHY_SetBBReg(priv, 0x838, 0x000f0000, 0x7);
|
|
PHY_SetBBReg(priv, 0x840, 0x0000f000, 0x7);
|
|
} else {
|
|
PHY_SetBBReg(priv, 0x82c, BIT27|BIT26|BIT25|BIT24, 0x3);
|
|
RTL_W8(0x830,0x8);
|
|
}
|
|
if (!strcmp(val,"abcd"))
|
|
ant = ANTENNA_ABCD;
|
|
}
|
|
|
|
if (!ant) {
|
|
GDEBUG("no support ant=%s ! (rx_ss=%d)\n", val, rx_ss);
|
|
return 1;
|
|
}
|
|
} else {
|
|
GDEBUG("no specific path !\n");
|
|
return 1;
|
|
}
|
|
|
|
|
|
switch(ant)
|
|
{
|
|
case ANTENNA_A:
|
|
//Tx
|
|
PHY_SetBBReg(priv, 0x93c, 0xfff00000, 0x001); // 0x93C[31:20]=12'b0000_0000_0001
|
|
|
|
//Rx
|
|
PHY_SetBBReg(priv, 0x808, 0xff, 0x11);
|
|
break;
|
|
|
|
case ANTENNA_B:
|
|
//Tx
|
|
PHY_SetBBReg(priv, 0x93c, 0xfff00000, 0x002); // 0x93C[31:20]=12'b0000_0000_0001
|
|
|
|
//Rx
|
|
PHY_SetBBReg(priv, 0x808, 0xff, 0x22);
|
|
break;
|
|
|
|
case ANTENNA_C:
|
|
//Tx
|
|
PHY_SetBBReg(priv, 0x93c, 0xfff00000, 0x004); // 0x93C[31:20]=12'b0000_0000_0001
|
|
|
|
//Rx
|
|
PHY_SetBBReg(priv, 0x808, 0xff, 0x44);
|
|
break;
|
|
|
|
case ANTENNA_D:
|
|
//Tx
|
|
PHY_SetBBReg(priv, 0x93c, 0xfff00000, 0x008); // 0x93C[31:20]=12'b0000_0000_0001
|
|
|
|
//Rx
|
|
PHY_SetBBReg(priv, 0x808, 0xff, 0x88);
|
|
break;
|
|
|
|
case ANTENNA_BC:
|
|
//Tx
|
|
PHY_SetBBReg(priv, 0x93c, 0xfff00000, 0x002); // 0x93C[31:20]=12'b0000_0000_0001
|
|
|
|
//Rx
|
|
PHY_SetBBReg(priv, 0x808, 0xff, 0x66);
|
|
break;
|
|
|
|
case ANTENNA_BCD:
|
|
//Tx
|
|
PHY_SetBBReg(priv, 0x93c, 0xfff00000, 0x002); // 0x93C[31:20]=12'b0000_0000_0001
|
|
|
|
//Rx
|
|
PHY_SetBBReg(priv, 0x808, 0xff, 0xee);
|
|
break;
|
|
|
|
case ANTENNA_ABCD:
|
|
//Tx
|
|
PHY_SetBBReg(priv, 0x93c, 0xfff00000, 0x002); // 0x93C[31:20]=12'b0000_0000_0001
|
|
|
|
//Rx
|
|
PHY_SetBBReg(priv, 0x808, 0xff, 0xff);
|
|
break;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef EXPERIMENTAL_WIRELESS_EXTEND
|
|
// switch 1 spatial stream path
|
|
//antPath: 01 for PathA,10 for PathB, 11for Path AB
|
|
void Switch_1SS_Antenna(struct rtl8192cd_priv *priv, unsigned int antPath )
|
|
{
|
|
unsigned int dword = 0;
|
|
if (get_rf_mimo_mode(priv) != MIMO_2T2R)
|
|
return;
|
|
|
|
if(GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
switch (antPath) {
|
|
case 1:
|
|
dword = RTL_R32(0x80C);
|
|
if ((dword & 0xf000) == 0x1000)
|
|
goto switch_1ss_end;
|
|
dword &= 0xffff0fff;
|
|
dword |= 0x1000; // Path A
|
|
RTL_W32(0x80C, dword);
|
|
break;
|
|
case 2:
|
|
dword = RTL_R32(0x80C);
|
|
if ((dword & 0xf000) == 0x2000)
|
|
goto switch_1ss_end;
|
|
dword &= 0xffff0fff;
|
|
dword |= 0x2000; // Path B
|
|
RTL_W32(0x80C, dword);
|
|
break;
|
|
|
|
case 3:
|
|
if (priv->pshare->rf_ft_var.ofdm_1ss_oneAnt == 1) // use one ANT for 1ss
|
|
goto switch_1ss_end;// do nothing
|
|
dword = RTL_R32(0x80C);
|
|
if ((dword & 0xf000) == 0x3000)
|
|
goto switch_1ss_end;
|
|
dword &= 0xffff0fff;
|
|
dword |= 0x3000; // Path A, B
|
|
RTL_W32(0x80C, dword);
|
|
break;
|
|
|
|
default:// do nothing
|
|
break;
|
|
}
|
|
|
|
} else {
|
|
|
|
switch (antPath) {
|
|
case 1:
|
|
dword = RTL_R32(0x90C);
|
|
if ((dword & 0x0ff00000) == 0x01100000)
|
|
goto switch_1ss_end;
|
|
dword &= 0xf00fffff;
|
|
dword |= 0x01100000; // Path A
|
|
RTL_W32(0x90C, dword);
|
|
break;
|
|
case 2:
|
|
dword = RTL_R32(0x90C);
|
|
if ((dword & 0x0ff00000) == 0x02200000)
|
|
goto switch_1ss_end;
|
|
dword &= 0xf00fffff;
|
|
dword |= 0x02200000; // Path B
|
|
RTL_W32(0x90C, dword);
|
|
break;
|
|
|
|
case 3:
|
|
if (priv->pshare->rf_ft_var.ofdm_1ss_oneAnt == 1) // use one ANT for 1ss
|
|
goto switch_1ss_end;// do nothing
|
|
dword = RTL_R32(0x90C);
|
|
if ((dword & 0x0ff00000) == 0x03300000)
|
|
goto switch_1ss_end;
|
|
dword &= 0xf00fffff;
|
|
dword |= 0x03300000; // Path A,B
|
|
RTL_W32(0x90C, dword);
|
|
break;
|
|
|
|
default:// do nothing
|
|
break;
|
|
}
|
|
}
|
|
switch_1ss_end:
|
|
return;
|
|
|
|
}
|
|
|
|
// switch OFDM path
|
|
//antPath: 01 for PathA,10 for PathB, 11for Path AB
|
|
void Switch_OFDM_Antenna(struct rtl8192cd_priv *priv, unsigned int antPath )
|
|
{
|
|
unsigned int dword = 0;
|
|
if (get_rf_mimo_mode(priv) != MIMO_2T2R)
|
|
return;
|
|
|
|
if(GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
|
|
switch (antPath) {
|
|
case 1:
|
|
dword = RTL_R32(0x80C);
|
|
if ((dword & 0xf00) == 0x100)
|
|
goto switch_OFDM_end;
|
|
dword &= 0xfffff0ff;
|
|
dword |= 0x100; // Path A
|
|
RTL_W32(0x80C, dword);
|
|
break;
|
|
case 2:
|
|
dword = RTL_R32(0x80C);
|
|
if ((dword & 0xf00) == 0x200)
|
|
goto switch_OFDM_end;
|
|
dword &= 0xfffff0ff;
|
|
dword |= 0x200; // Path B
|
|
RTL_W32(0x80C, dword);
|
|
break;
|
|
|
|
case 3:
|
|
if (priv->pshare->rf_ft_var.ofdm_1ss_oneAnt == 1) // use one ANT for 1ss
|
|
goto switch_OFDM_end;// do nothing
|
|
dword = RTL_R32(0x80C);
|
|
if ((dword & 0xf00) == 0x300)
|
|
goto switch_OFDM_end;
|
|
dword &= 0xfffff0ff;
|
|
dword |= 0x300; // Path A, B
|
|
RTL_W32(0x80C, dword);
|
|
break;
|
|
|
|
default:// do nothing
|
|
break;
|
|
}
|
|
|
|
} else {
|
|
|
|
switch (antPath) {
|
|
case 1:
|
|
dword = RTL_R32(0x90C);
|
|
if ((dword & 0x000000f0) == 0x00000010)
|
|
goto switch_OFDM_end;
|
|
dword &= 0xffffff0f;
|
|
dword |= 0x00000010; // Path A
|
|
RTL_W32(0x90C, dword);
|
|
break;
|
|
case 2:
|
|
dword = RTL_R32(0x90C);
|
|
if ((dword & 0x000000f0) == 0x00000020)
|
|
goto switch_OFDM_end;
|
|
dword &= 0xffffff0f;
|
|
dword |= 0x00000020; // Path B
|
|
RTL_W32(0x90C, dword);
|
|
break;
|
|
|
|
case 3:
|
|
if (priv->pshare->rf_ft_var.ofdm_1ss_oneAnt == 1) // use one ANT for 1ss
|
|
goto switch_OFDM_end;// do nothing
|
|
dword = RTL_R32(0x90C);
|
|
if ((dword & 0x000000f0) == 0x00000030)
|
|
goto switch_OFDM_end;
|
|
dword &= 0xffffff0f;
|
|
dword |= 0x00000030; // Path A,B
|
|
RTL_W32(0x90C, dword);
|
|
break;
|
|
|
|
default:// do nothing
|
|
break;
|
|
}
|
|
}
|
|
switch_OFDM_end:
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
void enable_hw_LED(struct rtl8192cd_priv *priv, unsigned int led_type)
|
|
{
|
|
|
|
#if (defined(HW_ANT_SWITCH) || defined(SW_ANT_SWITCH))&&( defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT))
|
|
int b23 = RTL_R32(LEDCFG) & BIT(23);
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL
|
|
// TODO: we should check register then set
|
|
if (IS_HAL_CHIP(priv))
|
|
return;
|
|
else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{//not HAL
|
|
switch (led_type) {
|
|
case LEDTYPE_HW_TX_RX:
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D)
|
|
RTL_W32(LEDCFG, LED_TX_RX_EVENT_ON << LED1CM_SHIFT_92D | LED1DIS_92D);
|
|
#endif
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C))
|
|
RTL_W32(LEDCFG, LED_RX_EVENT_ON << LED1CM_SHIFT | LED_TX_EVENT_ON << LED0CM_SHIFT);
|
|
#endif
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E)
|
|
RTL_W32(LEDCFG, (RTL_R32(LEDCFG) & 0xffff00ff) | BIT(13) | (LED_TX_RX_EVENT_ON << LED1CM_SHIFT));
|
|
#endif
|
|
break;
|
|
case LEDTYPE_HW_LINKACT_INFRA:
|
|
RTL_W32(LEDCFG, LED_TX_RX_EVENT_ON << LED0CM_SHIFT);
|
|
if ((OPMODE & WIFI_AP_STATE) || (OPMODE & WIFI_STATION_STATE))
|
|
RTL_W32(LEDCFG, RTL_R32(LEDCFG) & 0x0ff);
|
|
else
|
|
RTL_W32(LEDCFG, (RTL_R32(LEDCFG) & 0xfffff0ff) | LED1SV);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
#if (defined(HW_ANT_SWITCH) || defined(SW_ANT_SWITCH))&&( defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT))
|
|
RTL_W32(LEDCFG, b23 | RTL_R32(LEDCFG));
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Function: phy_InitBBRFRegisterDefinition
|
|
*
|
|
* OverView: Initialize Register definition offset for Radio Path A/B/C/D
|
|
*
|
|
* Input:
|
|
* PADAPTER Adapter,
|
|
*
|
|
* Output: None
|
|
* Return: None
|
|
* Note: The initialization value is constant and it should never be changes
|
|
*/
|
|
void phy_InitBBRFRegisterDefinition(struct rtl8192cd_priv *priv)
|
|
{
|
|
struct rtl8192cd_hw *phw = GET_HW(priv);
|
|
|
|
// RF Interface Sowrtware Control
|
|
phw->PHYRegDef[RF92CD_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 LSBs if read 32-bit from 0x870
|
|
phw->PHYRegDef[RF92CD_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872)
|
|
|
|
// RF Interface Readback Value
|
|
phw->PHYRegDef[RF92CD_PATH_A].rfintfi = rFPGA0_XAB_RFInterfaceRB; // 16 LSBs if read 32-bit from 0x8E0
|
|
phw->PHYRegDef[RF92CD_PATH_B].rfintfi = rFPGA0_XAB_RFInterfaceRB;// 16 MSBs if read 32-bit from 0x8E0 (16-bit for 0x8E2)
|
|
|
|
// RF Interface Output (and Enable)
|
|
phw->PHYRegDef[RF92CD_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x860
|
|
phw->PHYRegDef[RF92CD_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x864
|
|
|
|
// RF Interface (Output and) Enable
|
|
phw->PHYRegDef[RF92CD_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862)
|
|
phw->PHYRegDef[RF92CD_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866)
|
|
|
|
//Addr of LSSI. Wirte RF register by driver
|
|
phw->PHYRegDef[RF92CD_PATH_A].rf3wireOffset = rFPGA0_XA_LSSIParameter; //LSSI Parameter
|
|
phw->PHYRegDef[RF92CD_PATH_B].rf3wireOffset = rFPGA0_XB_LSSIParameter;
|
|
|
|
// RF parameter
|
|
phw->PHYRegDef[RF92CD_PATH_A].rfLSSI_Select = rFPGA0_XAB_RFParameter; //BB Band Select
|
|
phw->PHYRegDef[RF92CD_PATH_B].rfLSSI_Select = rFPGA0_XAB_RFParameter;
|
|
|
|
// Tx AGC Gain Stage (same for all path. Should we remove this?)
|
|
phw->PHYRegDef[RF92CD_PATH_A].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage
|
|
phw->PHYRegDef[RF92CD_PATH_B].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage
|
|
|
|
// Tranceiver A~D HSSI Parameter-1
|
|
phw->PHYRegDef[RF92CD_PATH_A].rfHSSIPara1 = rFPGA0_XA_HSSIParameter1; //wire control parameter1
|
|
phw->PHYRegDef[RF92CD_PATH_B].rfHSSIPara1 = rFPGA0_XB_HSSIParameter1; //wire control parameter1
|
|
|
|
// Tranceiver A~D HSSI Parameter-2
|
|
phw->PHYRegDef[RF92CD_PATH_A].rfHSSIPara2 = rFPGA0_XA_HSSIParameter2; //wire control parameter2
|
|
phw->PHYRegDef[RF92CD_PATH_B].rfHSSIPara2 = rFPGA0_XB_HSSIParameter2; //wire control parameter2
|
|
|
|
// RF switch Control
|
|
phw->PHYRegDef[RF92CD_PATH_A].rfSwitchControl = rFPGA0_XAB_SwitchControl; //TR/Ant switch control
|
|
phw->PHYRegDef[RF92CD_PATH_B].rfSwitchControl = rFPGA0_XAB_SwitchControl;
|
|
|
|
// AGC control 1
|
|
phw->PHYRegDef[RF92CD_PATH_A].rfAGCControl1 = rOFDM0_XAAGCCore1;
|
|
phw->PHYRegDef[RF92CD_PATH_B].rfAGCControl1 = rOFDM0_XBAGCCore1;
|
|
|
|
// AGC control 2
|
|
phw->PHYRegDef[RF92CD_PATH_A].rfAGCControl2 = rOFDM0_XAAGCCore2;
|
|
phw->PHYRegDef[RF92CD_PATH_B].rfAGCControl2 = rOFDM0_XBAGCCore2;
|
|
|
|
// RX AFE control 1
|
|
phw->PHYRegDef[RF92CD_PATH_A].rfRxIQImbalance = rOFDM0_XARxIQImbalance;
|
|
phw->PHYRegDef[RF92CD_PATH_B].rfRxIQImbalance = rOFDM0_XBRxIQImbalance;
|
|
|
|
// RX AFE control 1
|
|
phw->PHYRegDef[RF92CD_PATH_A].rfRxAFE = rOFDM0_XARxAFE;
|
|
phw->PHYRegDef[RF92CD_PATH_B].rfRxAFE = rOFDM0_XBRxAFE;
|
|
|
|
// Tx AFE control 1
|
|
phw->PHYRegDef[RF92CD_PATH_A].rfTxIQImbalance = rOFDM0_XATxIQImbalance;
|
|
phw->PHYRegDef[RF92CD_PATH_B].rfTxIQImbalance = rOFDM0_XBTxIQImbalance;
|
|
|
|
// Tx AFE control 2
|
|
phw->PHYRegDef[RF92CD_PATH_A].rfTxAFE = rOFDM0_XATxAFE;
|
|
phw->PHYRegDef[RF92CD_PATH_B].rfTxAFE = rOFDM0_XBTxAFE;
|
|
|
|
// Tranceiver LSSI Readback SI mode
|
|
phw->PHYRegDef[RF92CD_PATH_A].rfLSSIReadBack = rFPGA0_XA_LSSIReadBack;
|
|
phw->PHYRegDef[RF92CD_PATH_B].rfLSSIReadBack = rFPGA0_XB_LSSIReadBack;
|
|
|
|
// Tranceiver LSSI Readback PI mode
|
|
phw->PHYRegDef[RF92CD_PATH_A].rfLSSIReadBackPi = TransceiverA_HSPI_Readback;
|
|
phw->PHYRegDef[RF92CD_PATH_B].rfLSSIReadBackPi = TransceiverB_HSPI_Readback;
|
|
}
|
|
|
|
|
|
void check_chipID_MIMO(struct rtl8192cd_priv *priv)
|
|
{
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (GET_CHIP_VER(priv) == VERSION_8881A) {
|
|
priv->pshare->version_id |= (RTL_R16(0xf0)>>8) & 0x0f0; // save b[15:12]
|
|
goto exit_func;
|
|
}else if (GET_CHIP_VER(priv) == VERSION_8192E) {
|
|
priv->pshare->version_id |= (RTL_R16(0xf0)>>8) & 0x0f0; // 92E c-cut
|
|
goto exit_func;
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_8812_SUPPORT //FOR_8812_MP_CHIP
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
unsigned int val32;
|
|
val32 = RTL_R32(SYS_CFG);
|
|
if (val32 & BIT(23)) {
|
|
panic_printk("8812 test chip !! \n");
|
|
priv->pshare->version_id |= 0x100; //is 8812 test chip
|
|
} else {
|
|
panic_printk("8812 mp chip !! \n");
|
|
if (((val32 & 0xf000) >> 12) == 1) { // [15:12] :1 --> C-cut
|
|
priv->pshare->version_id |= 0x10;
|
|
}
|
|
}
|
|
priv->pshare->phw->MIMO_TR_hw_support = MIMO_2T2R;
|
|
goto exit_func;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
priv->pshare->phw->MIMO_TR_hw_support = MIMO_1T1R;
|
|
goto exit_func;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
if (priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY)
|
|
priv->pshare->phw->MIMO_TR_hw_support = MIMO_1T1R;
|
|
else
|
|
priv->pshare->phw->MIMO_TR_hw_support = MIMO_2T2R;
|
|
goto exit_func;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
{
|
|
unsigned int val32;
|
|
val32 = RTL_R32(SYS_CFG);
|
|
if (val32 & BIT(27)) {
|
|
priv->pshare->version_id = VERSION_8192C;
|
|
priv->pshare->phw->MIMO_TR_hw_support = MIMO_2T2R;
|
|
} else {
|
|
priv->pshare->version_id = VERSION_8188C;
|
|
priv->pshare->phw->MIMO_TR_hw_support = MIMO_1T1R;
|
|
|
|
if ((0x3 & (RTL_R32(0xec) >> 22)) == 0x01)
|
|
priv->pshare->version_id |= 0x200; // 88RE
|
|
}
|
|
|
|
if (val32 & BIT(23)) {
|
|
priv->pshare->version_id |= 0x100;
|
|
}
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)) {
|
|
if (val32 & BIT(19)) {
|
|
priv->pshare->version_id |= 0x400; // UMC
|
|
priv->pshare->version_id |= (0xf0 & (val32 >> 8)); // 0: a-cut
|
|
}
|
|
if (((0x0f & (val32 >> 16)) == 0) && ((0x0f & (val32 >> 12)) == 1)) { //6195B
|
|
priv->pshare->version_id |= 0x400;
|
|
priv->pshare->version_id |= 0x10; // 0x10: b-cut
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL)
|
|
exit_func:
|
|
#endif
|
|
return;
|
|
}
|
|
|
|
void selectMinPowerIdex(struct rtl8192cd_priv *priv)
|
|
{
|
|
int i = 0, idx, pwr_min = 0xff;
|
|
unsigned int val32;
|
|
unsigned int pwr_regA[] = {0xe00, 0xe04, 0xe08, 0x86c, 0xe10, 0xe14, 0xe18, 0xe1c};
|
|
//#if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT)
|
|
unsigned int pwr_regB[] = {0x830, 0x834, 0x838, 0x86c, 0x83c, 0x848, 0x84c, 0x868};
|
|
//#endif
|
|
|
|
for (idx = 0 ; idx < 8 ; idx++) {
|
|
val32 = RTL_R32(pwr_regA[idx]);
|
|
switch (pwr_regA[idx]) {
|
|
case 0xe08:
|
|
pwr_min = POWER_MIN_CHECK(pwr_min, (val32 >> 8) & 0xff);
|
|
break;
|
|
|
|
case 0x86c:
|
|
for (i = 8 ; i < 32 ; i += 8)
|
|
pwr_min = POWER_MIN_CHECK(pwr_min, (val32 >> i) & 0xff);
|
|
break;
|
|
|
|
default:
|
|
for (i = 0 ; i < 32 ; i += 8)
|
|
pwr_min = POWER_MIN_CHECK(pwr_min, (val32 >> i) & 0xff);
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*
|
|
#if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT)
|
|
if (
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
(GET_CHIP_VER(priv) == VERSION_8192C)
|
|
#endif
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
||
|
|
#endif
|
|
((GET_CHIP_VER(priv) == VERSION_8192D)
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
&& (priv->pmib->dot11RFEntry.macPhyMode == SINGLEMAC_SINGLEPHY)
|
|
#endif
|
|
)
|
|
#endif
|
|
)
|
|
*/
|
|
if(get_rf_mimo_mode(priv) == MIMO_2T2R)
|
|
{
|
|
for (idx = 0 ; idx < 8 ; idx++) {
|
|
val32 = RTL_R32(pwr_regB[idx]);
|
|
switch (pwr_regB[idx]) {
|
|
case 0x86c:
|
|
pwr_min = POWER_MIN_CHECK(pwr_min, val32 & 0xff);
|
|
break;
|
|
|
|
case 0x838:
|
|
for (i = 8 ; i < 32 ; i += 8)
|
|
pwr_min = POWER_MIN_CHECK(pwr_min, (val32 >> i) & 0xff);
|
|
break;
|
|
|
|
default:
|
|
for (i = 0 ; i < 32 ; i += 8)
|
|
pwr_min = POWER_MIN_CHECK(pwr_min, (val32 >> i) & 0xff);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
//#endif
|
|
|
|
priv->pshare->rf_ft_var.min_pwr_idex = pwr_min;
|
|
}
|
|
|
|
#ifdef POWER_PERCENT_ADJUSTMENT
|
|
s1Byte PwrPercent2PwrLevel(int percentage)
|
|
{
|
|
#define ARRAYSIZE(x) (sizeof(x)/sizeof((x)[0]))
|
|
|
|
const int percent_threshold[] = {95, 85, 75, 67, 60, 54, 48, 43, 38, 34, 30, 27, 24, 22, 19, 17, 15, 14, 12, 11, 10};
|
|
const s1Byte pwrlevel_diff[9] = { -40, -34, -30, -28, -26, -24, -23, -22, -21}; // for < 10% case
|
|
int i;
|
|
|
|
for (i = 0; i < ARRAYSIZE(percent_threshold); ++i) {
|
|
if (percentage >= percent_threshold[i]) {
|
|
return (s1Byte) - i;
|
|
}
|
|
}
|
|
|
|
if (percentage < 1) percentage = 1;
|
|
|
|
return pwrlevel_diff[percentage - 1];
|
|
}
|
|
#endif
|
|
|
|
void PHY_RF6052SetOFDMTxPower(struct rtl8192cd_priv *priv, unsigned int channel)
|
|
{
|
|
unsigned int writeVal, defValue = 0x28 ;
|
|
unsigned char offset;
|
|
unsigned char base, byte0, byte1, byte2, byte3;
|
|
unsigned char pwrlevelHT40_1S_A = priv->pmib->dot11RFEntry.pwrlevelHT40_1S_A[channel - 1];
|
|
unsigned char pwrlevelHT40_1S_B = priv->pmib->dot11RFEntry.pwrlevelHT40_1S_B[channel - 1];
|
|
unsigned char pwrdiffHT40_2S = priv->pmib->dot11RFEntry.pwrdiffHT40_2S[channel - 1];
|
|
unsigned char pwrdiffHT20 = priv->pmib->dot11RFEntry.pwrdiffHT20[channel - 1];
|
|
unsigned char pwrdiffOFDM = priv->pmib->dot11RFEntry.pwrdiffOFDM[channel - 1];
|
|
#ifdef USB_POWER_SUPPORT
|
|
//_TXPWR_REDEFINE
|
|
unsigned char pwrlevelHT40_6dBm_1S_A;
|
|
unsigned char pwrlevelHT40_6dBm_1S_B;
|
|
unsigned char pwrdiffHT40_6dBm_2S;
|
|
unsigned char pwrdiffHT20_6dBm;
|
|
unsigned char pwrdiffOFDM_6dBm;
|
|
unsigned char offset_6dBm;
|
|
s1Byte base_6dBm;
|
|
#endif
|
|
#ifdef POWER_PERCENT_ADJUSTMENT
|
|
s1Byte pwrdiff_percent = PwrPercent2PwrLevel(priv->pmib->dot11RFEntry.power_percent);
|
|
#endif
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
unsigned int ori_channel = channel; //Keep the original channel setting
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
/* for testchip only */
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
defValue = 0x21;
|
|
|
|
|
|
#if defined(CALIBRATE_BY_ODM)
|
|
#ifdef MP_TEST
|
|
if ((priv->pshare->rf_ft_var.mp_specific) && priv->pshare->mp_txpwr_patha)
|
|
defValue = priv->pshare->mp_txpwr_patha;
|
|
#endif
|
|
if (ODMPTR->RFCalibrateInfo.ThermalValue > GET_ROOT(priv)->pmib->dot11RFEntry.ther)
|
|
defValue += (ODMPTR->RFCalibrateInfo.BbSwingIdxOfdm[RF_PATH_A] - ODMPTR->RFCalibrateInfo.DefaultOfdmIndex);
|
|
#endif
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
#if defined(CONFIG_RTL_8198) || defined(CONFIG_RTL_819XD) || defined(CONFIG_RTL_8196E) || defined(CONFIG_RTL_8198B)
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_5G)
|
|
defValue = 0x28;
|
|
else
|
|
defValue = 0x2d;
|
|
#else
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_5G)
|
|
defValue = 0x26;
|
|
else
|
|
defValue = 0x30;
|
|
#endif
|
|
|
|
//TXPWR_REDEFINE
|
|
//FLASH GROUP [36-99] [100-148] [149-165]
|
|
//Special Cases: [34-2, 34, 34+2, 36-2, 165+2]:No DATA , [149-2]:FLASH DATA OF Channel-146-6dBm
|
|
//Use Flash data of channel 36 & 140 & 165 for these special cases.
|
|
if ((channel > 30) && (channel < 36))
|
|
channel = 36;
|
|
else if (channel == (149 - 2))
|
|
channel = 140;
|
|
else if (channel > 165)
|
|
channel = 165;
|
|
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_5G) {
|
|
pwrlevelHT40_1S_A = priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_A[channel - 1];
|
|
pwrlevelHT40_1S_B = priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[channel - 1];
|
|
pwrdiffHT40_2S = priv->pmib->dot11RFEntry.pwrdiff5GHT40_2S[channel - 1];
|
|
pwrdiffHT20 = priv->pmib->dot11RFEntry.pwrdiff5GHT20[channel - 1];
|
|
pwrdiffOFDM = priv->pmib->dot11RFEntry.pwrdiff5GOFDM[channel - 1];
|
|
}
|
|
|
|
#ifdef USB_POWER_SUPPORT
|
|
//_TXPWR_REDEFINE
|
|
//MCS 8 - 15: No Power By Rate
|
|
//Others: Power by Rate (Add Power)
|
|
//Remove PWR_5G_DIFF
|
|
|
|
//?? phyBandSelect will auto swtich or 2G | 5G ??
|
|
{
|
|
int i;
|
|
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_5G) {
|
|
pwrlevelHT40_6dBm_1S_A = priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_A[channel];
|
|
pwrlevelHT40_6dBm_1S_B = priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[channel];
|
|
pwrdiffHT40_6dBm_2S = priv->pmib->dot11RFEntry.pwrdiff5GHT40_2S[channel];
|
|
pwrdiffHT20_6dBm = priv->pmib->dot11RFEntry.pwrdiff5GHT20[channel];
|
|
pwrdiffOFDM_6dBm = priv->pmib->dot11RFEntry.pwrdiff5GOFDM[channel];
|
|
} else {
|
|
pwrlevelHT40_6dBm_1S_A = priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_A[channel - 1];
|
|
pwrlevelHT40_6dBm_1S_B = priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[channel - 1];
|
|
pwrdiffHT40_6dBm_2S = priv->pmib->dot11RFEntry.pwrdiff5GHT40_2S[channel - 1];
|
|
pwrdiffHT20_6dBm = priv->pmib->dot11RFEntry.pwrdiff5GHT20[channel - 1];
|
|
pwrdiffOFDM_6dBm = priv->pmib->dot11RFEntry.pwrdiff5GOFDM[channel - 1];
|
|
}
|
|
}
|
|
#endif
|
|
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if (priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY &&
|
|
priv->pshare->wlandev_idx == 1) {
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_5G)
|
|
pwrlevelHT40_1S_A = priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[channel - 1];
|
|
else {
|
|
pwrlevelHT40_1S_A = priv->pmib->dot11RFEntry.pwrlevelHT40_1S_B[channel - 1];
|
|
}
|
|
//_TXPWR_REDEFINE
|
|
#ifdef USB_POWER_SUPPORT
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_5G) {
|
|
pwrlevelHT40_6dBm_1S_A = priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[channel];
|
|
} else {
|
|
pwrlevelHT40_6dBm_1S_A = priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[channel - 1];
|
|
}
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
channel = ori_channel; //_TXPWR_REDEFINE Restore the channel setting
|
|
|
|
}
|
|
#endif
|
|
|
|
|
|
#ifdef TXPWR_LMT
|
|
#ifdef TXPWR_LMT_88E
|
|
if(GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
if(!priv->pshare->rf_ft_var.disable_txpwrlmt){
|
|
int i;
|
|
int max_idx_a, max_idx_b =0;
|
|
|
|
if (!priv->pshare->txpwr_lmt_OFDM || !priv->pshare->tgpwr_OFDM_new[RF_PATH_A]) {
|
|
//printk("No limit for OFDM TxPower\n");
|
|
max_idx_a = 255;
|
|
max_idx_b = 255;
|
|
} else {
|
|
// maximum additional power index
|
|
max_idx_a = (priv->pshare->txpwr_lmt_OFDM - priv->pshare->tgpwr_OFDM_new[RF_PATH_A]);
|
|
max_idx_b = (priv->pshare->txpwr_lmt_OFDM - priv->pshare->tgpwr_OFDM_new[RF_PATH_B]);
|
|
}
|
|
|
|
for (i = 0; i <= 7; i++) {
|
|
//printk("priv->pshare->phw->OFDMTxAgcOffset_A[%d]=0x%x max=0x%x\n",i, priv->pshare->phw->OFDMTxAgcOffset_A[i], max_idx_a);
|
|
priv->pshare->phw->OFDMTxAgcOffset_A[i] = POWER_MIN_CHECK(priv->pshare->phw->OFDMTxAgcOffset_A[i], max_idx_a);
|
|
priv->pshare->phw->OFDMTxAgcOffset_B[i] = POWER_MIN_CHECK(priv->pshare->phw->OFDMTxAgcOffset_B[i], max_idx_b);
|
|
//printk("priv->pshare->phw->OFDMTxAgcOffset_B[%d]=%x\n",i, priv->pshare->phw->OFDMTxAgcOffset_B[i]);
|
|
}
|
|
|
|
if (!priv->pshare->txpwr_lmt_HT1S || !priv->pshare->tgpwr_HT1S_new[RF_PATH_A]) {
|
|
//printk("No limit for HT1S TxPower\n");
|
|
max_idx_a = 255;
|
|
max_idx_b = 255;
|
|
} else {
|
|
// maximum additional power index
|
|
max_idx_a = (priv->pshare->txpwr_lmt_HT1S - priv->pshare->tgpwr_HT1S_new[RF_PATH_A]);
|
|
max_idx_b = (priv->pshare->txpwr_lmt_HT1S - priv->pshare->tgpwr_HT1S_new[RF_PATH_B]);
|
|
}
|
|
|
|
for (i = 0; i <= 7; i++) {
|
|
//printk("priv->pshare->phw->MCSTxAgcOffset_A[%d]=0x%x max=0x%x\n",i, priv->pshare->phw->MCSTxAgcOffset_A[i], max_idx_a);
|
|
priv->pshare->phw->MCSTxAgcOffset_A[i] = POWER_MIN_CHECK(priv->pshare->phw->MCSTxAgcOffset_A[i], max_idx_a);
|
|
priv->pshare->phw->MCSTxAgcOffset_B[i] = POWER_MIN_CHECK(priv->pshare->phw->MCSTxAgcOffset_B[i], max_idx_b);
|
|
//printk("priv->pshare->phw->MCSTxAgcOffset_B[%d]=%x\n",i, priv->pshare->phw->MCSTxAgcOffset_B[i]);
|
|
}
|
|
|
|
if (!priv->pshare->txpwr_lmt_HT2S || !priv->pshare->tgpwr_HT2S_new[RF_PATH_A]) {
|
|
//printk("No limit for HT2S TxPower\n");
|
|
max_idx_a = 255;
|
|
max_idx_b = 255;
|
|
} else {
|
|
// maximum additional power index
|
|
max_idx_a = (priv->pshare->txpwr_lmt_HT2S - priv->pshare->tgpwr_HT2S_new[RF_PATH_A]);
|
|
max_idx_b = (priv->pshare->txpwr_lmt_HT2S - priv->pshare->tgpwr_HT2S_new[RF_PATH_B]);
|
|
}
|
|
|
|
for (i = 8; i <= 15; i++) {
|
|
//printk("priv->pshare->phw->MCSTxAgcOffset_A[%d]=%x max=0x%x\n",i, priv->pshare->phw->MCSTxAgcOffset_A[i], max_idx_a);
|
|
priv->pshare->phw->MCSTxAgcOffset_A[i] = POWER_MIN_CHECK(priv->pshare->phw->MCSTxAgcOffset_A[i], max_idx_a);
|
|
priv->pshare->phw->MCSTxAgcOffset_B[i] = POWER_MIN_CHECK(priv->pshare->phw->MCSTxAgcOffset_B[i], max_idx_b);
|
|
//printk("priv->pshare->phw->MCSTxAgcOffset_B[%d]=%x\n",i, priv->pshare->phw->MCSTxAgcOffset_B[i]);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
#endif
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192D) || (GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C))
|
|
if (!priv->pshare->rf_ft_var.disable_txpwrlmt) {
|
|
int i;
|
|
int max_idx;
|
|
|
|
if (!priv->pshare->txpwr_lmt_OFDM || !priv->pshare->tgpwr_OFDM) {
|
|
//printk("No limit for OFDM TxPower\n");
|
|
max_idx = 255;
|
|
} else {
|
|
// maximum additional power index
|
|
max_idx = (priv->pshare->txpwr_lmt_OFDM - priv->pshare->tgpwr_OFDM);
|
|
}
|
|
|
|
for (i = 0; i <= 7; i++) {
|
|
priv->pshare->phw->OFDMTxAgcOffset_A[i] = POWER_MIN_CHECK(priv->pshare->phw->OFDMTxAgcOffset_A[i], max_idx);
|
|
priv->pshare->phw->OFDMTxAgcOffset_B[i] = POWER_MIN_CHECK(priv->pshare->phw->OFDMTxAgcOffset_B[i], max_idx);
|
|
//printk("priv->pshare->phw->OFDMTxAgcOffset_A[%d]=%x\n",i, priv->pshare->phw->OFDMTxAgcOffset_A[i]);
|
|
//printk("priv->pshare->phw->OFDMTxAgcOffset_B[%d]=%x\n",i, priv->pshare->phw->OFDMTxAgcOffset_B[i]);
|
|
}
|
|
|
|
if (!priv->pshare->txpwr_lmt_HT1S || !priv->pshare->tgpwr_HT1S) {
|
|
//printk("No limit for HT1S TxPower\n");
|
|
max_idx = 255;
|
|
} else {
|
|
// maximum additional power index
|
|
max_idx = (priv->pshare->txpwr_lmt_HT1S - priv->pshare->tgpwr_HT1S);
|
|
}
|
|
|
|
for (i = 0; i <= 7; i++) {
|
|
priv->pshare->phw->MCSTxAgcOffset_A[i] = POWER_MIN_CHECK(priv->pshare->phw->MCSTxAgcOffset_A[i], max_idx);
|
|
priv->pshare->phw->MCSTxAgcOffset_B[i] = POWER_MIN_CHECK(priv->pshare->phw->MCSTxAgcOffset_B[i], max_idx);
|
|
//printk("priv->pshare->phw->MCSTxAgcOffset_A[%d]=%x\n",i, priv->pshare->phw->MCSTxAgcOffset_A[i]);
|
|
//printk("priv->pshare->phw->MCSTxAgcOffset_B[%d]=%x\n",i, priv->pshare->phw->MCSTxAgcOffset_B[i]);
|
|
}
|
|
|
|
if (!priv->pshare->txpwr_lmt_HT2S || !priv->pshare->tgpwr_HT2S) {
|
|
//printk("No limit for HT2S TxPower\n");
|
|
max_idx = 255;
|
|
} else {
|
|
// maximum additional power index
|
|
max_idx = (priv->pshare->txpwr_lmt_HT2S - priv->pshare->tgpwr_HT2S);
|
|
}
|
|
|
|
for (i = 8; i <= 15; i++) {
|
|
priv->pshare->phw->MCSTxAgcOffset_A[i] = POWER_MIN_CHECK(priv->pshare->phw->MCSTxAgcOffset_A[i], max_idx);
|
|
priv->pshare->phw->MCSTxAgcOffset_B[i] = POWER_MIN_CHECK(priv->pshare->phw->MCSTxAgcOffset_B[i], max_idx);
|
|
//printk("priv->pshare->phw->MCSTxAgcOffset_A[%d]=%x\n",i, priv->pshare->phw->MCSTxAgcOffset_A[i]);
|
|
//printk("priv->pshare->phw->MCSTxAgcOffset_B[%d]=%x\n",i, priv->pshare->phw->MCSTxAgcOffset_B[i]);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
|
|
if ((pwrlevelHT40_1S_A == 0)
|
|
#if defined(MP_TEST) && defined(CONFIG_RTL_88E_SUPPORT) && defined(CALIBRATE_BY_ODM)
|
|
|| ((priv->pshare->rf_ft_var.mp_specific) || (OPMODE & WIFI_MP_STATE))
|
|
#endif
|
|
)
|
|
|
|
{
|
|
// use default value
|
|
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if(!(priv->pshare->rf_ft_var.mp_specific) && !(OPMODE & WIFI_MP_STATE))
|
|
if (priv->pshare->rf_ft_var.use_ext_pa)
|
|
defValue = HP_OFDM_POWER_DEFAULT ;
|
|
#endif
|
|
#ifndef ADD_TX_POWER_BY_CMD
|
|
writeVal = (defValue << 24) | (defValue << 16) | (defValue << 8) | (defValue);
|
|
RTL_W32(rTxAGC_A_Rate18_06, writeVal);
|
|
RTL_W32(rTxAGC_A_Rate54_24, writeVal);
|
|
RTL_W32(rTxAGC_A_Mcs03_Mcs00, writeVal);
|
|
RTL_W32(rTxAGC_A_Mcs07_Mcs04, writeVal);
|
|
RTL_W32(rTxAGC_B_Rate18_06, writeVal);
|
|
RTL_W32(rTxAGC_B_Rate54_24, writeVal);
|
|
RTL_W32(rTxAGC_B_Mcs03_Mcs00, writeVal);
|
|
RTL_W32(rTxAGC_B_Mcs07_Mcs04, writeVal);
|
|
|
|
#ifdef USB_POWER_SUPPORT
|
|
//_TXPWR_REDEFINE, pwrlevelHT40_1S_A == 0 >> No 6dBm Power >> default value >> so USB = def - 14
|
|
writeVal = POWER_RANGE_CHECK(defValue - USB_HT_2S_DIFF);
|
|
writeVal |= (writeVal << 24) | (writeVal << 16) | (writeVal << 8);
|
|
#endif
|
|
RTL_W32(rTxAGC_A_Mcs11_Mcs08, writeVal);
|
|
RTL_W32(rTxAGC_A_Mcs15_Mcs12, writeVal);
|
|
RTL_W32(rTxAGC_B_Mcs11_Mcs08, writeVal);
|
|
RTL_W32(rTxAGC_B_Mcs15_Mcs12, writeVal);
|
|
#else
|
|
base = defValue;
|
|
byte0 = byte1 = byte2 = byte3 = 0;
|
|
ASSIGN_TX_POWER_OFFSET(byte0, priv->pshare->rf_ft_var.txPowerPlus_ofdm_18);
|
|
ASSIGN_TX_POWER_OFFSET(byte1, priv->pshare->rf_ft_var.txPowerPlus_ofdm_12);
|
|
ASSIGN_TX_POWER_OFFSET(byte2, priv->pshare->rf_ft_var.txPowerPlus_ofdm_9);
|
|
ASSIGN_TX_POWER_OFFSET(byte3, priv->pshare->rf_ft_var.txPowerPlus_ofdm_6);
|
|
|
|
byte0 = POWER_RANGE_CHECK(base + byte0);
|
|
byte1 = POWER_RANGE_CHECK(base + byte1);
|
|
byte2 = POWER_RANGE_CHECK(base + byte2);
|
|
byte3 = POWER_RANGE_CHECK(base + byte3);
|
|
writeVal = (byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3;
|
|
RTL_W32(rTxAGC_A_Rate18_06, writeVal);
|
|
RTL_W32(rTxAGC_B_Rate18_06, writeVal);
|
|
|
|
byte0 = byte1 = byte2 = byte3 = 0;
|
|
ASSIGN_TX_POWER_OFFSET(byte0, priv->pshare->rf_ft_var.txPowerPlus_ofdm_54);
|
|
ASSIGN_TX_POWER_OFFSET(byte1, priv->pshare->rf_ft_var.txPowerPlus_ofdm_48);
|
|
ASSIGN_TX_POWER_OFFSET(byte2, priv->pshare->rf_ft_var.txPowerPlus_ofdm_36);
|
|
ASSIGN_TX_POWER_OFFSET(byte3, priv->pshare->rf_ft_var.txPowerPlus_ofdm_24);
|
|
byte0 = POWER_RANGE_CHECK(base + byte0);
|
|
byte1 = POWER_RANGE_CHECK(base + byte1);
|
|
byte2 = POWER_RANGE_CHECK(base + byte2);
|
|
byte3 = POWER_RANGE_CHECK(base + byte3);
|
|
writeVal = (byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3;
|
|
RTL_W32(rTxAGC_A_Rate54_24, writeVal);
|
|
RTL_W32(rTxAGC_B_Rate54_24, writeVal);
|
|
|
|
byte0 = byte1 = byte2 = byte3 = 0;
|
|
ASSIGN_TX_POWER_OFFSET(byte0, priv->pshare->rf_ft_var.txPowerPlus_mcs_3);
|
|
ASSIGN_TX_POWER_OFFSET(byte1, priv->pshare->rf_ft_var.txPowerPlus_mcs_2);
|
|
ASSIGN_TX_POWER_OFFSET(byte2, priv->pshare->rf_ft_var.txPowerPlus_mcs_1);
|
|
ASSIGN_TX_POWER_OFFSET(byte3, priv->pshare->rf_ft_var.txPowerPlus_mcs_0);
|
|
byte0 = POWER_RANGE_CHECK(base + byte0);
|
|
byte1 = POWER_RANGE_CHECK(base + byte1);
|
|
byte2 = POWER_RANGE_CHECK(base + byte2);
|
|
byte3 = POWER_RANGE_CHECK(base + byte3);
|
|
writeVal = (byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3;
|
|
RTL_W32(rTxAGC_A_Mcs03_Mcs00, writeVal);
|
|
RTL_W32(rTxAGC_B_Mcs03_Mcs00, writeVal);
|
|
|
|
byte0 = byte1 = byte2 = byte3 = 0;
|
|
ASSIGN_TX_POWER_OFFSET(byte0, priv->pshare->rf_ft_var.txPowerPlus_mcs_7);
|
|
ASSIGN_TX_POWER_OFFSET(byte1, priv->pshare->rf_ft_var.txPowerPlus_mcs_6);
|
|
ASSIGN_TX_POWER_OFFSET(byte2, priv->pshare->rf_ft_var.txPowerPlus_mcs_5);
|
|
ASSIGN_TX_POWER_OFFSET(byte3, priv->pshare->rf_ft_var.txPowerPlus_mcs_4);
|
|
byte0 = POWER_RANGE_CHECK(base + byte0);
|
|
byte1 = POWER_RANGE_CHECK(base + byte1);
|
|
byte2 = POWER_RANGE_CHECK(base + byte2);
|
|
byte3 = POWER_RANGE_CHECK(base + byte3);
|
|
writeVal = (byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3;
|
|
RTL_W32(rTxAGC_A_Mcs07_Mcs04, writeVal);
|
|
RTL_W32(rTxAGC_B_Mcs07_Mcs04, writeVal);
|
|
|
|
//_TXPWR_REDEFINE
|
|
#ifdef USB_POWER_SUPPORT
|
|
byte0 = byte1 = byte2 = byte3 = -USB_HT_2S_DIFF;
|
|
#else
|
|
byte0 = byte1 = byte2 = byte3 = 0;
|
|
ASSIGN_TX_POWER_OFFSET(byte0, priv->pshare->rf_ft_var.txPowerPlus_mcs_11);
|
|
ASSIGN_TX_POWER_OFFSET(byte1, priv->pshare->rf_ft_var.txPowerPlus_mcs_10);
|
|
ASSIGN_TX_POWER_OFFSET(byte2, priv->pshare->rf_ft_var.txPowerPlus_mcs_9);
|
|
ASSIGN_TX_POWER_OFFSET(byte3, priv->pshare->rf_ft_var.txPowerPlus_mcs_8);
|
|
#endif
|
|
|
|
byte0 = POWER_RANGE_CHECK(base + byte0);
|
|
byte1 = POWER_RANGE_CHECK(base + byte1);
|
|
byte2 = POWER_RANGE_CHECK(base + byte2);
|
|
byte3 = POWER_RANGE_CHECK(base + byte3);
|
|
writeVal = (byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3;
|
|
RTL_W32(rTxAGC_A_Mcs11_Mcs08, writeVal);
|
|
RTL_W32(rTxAGC_B_Mcs11_Mcs08, writeVal);
|
|
|
|
//_TXPWR_REDEFINE
|
|
#ifdef USB_POWER_SUPPORT
|
|
byte0 = byte1 = byte2 = byte3 = -USB_HT_2S_DIFF;
|
|
#else
|
|
byte0 = byte1 = byte2 = byte3 = 0;
|
|
ASSIGN_TX_POWER_OFFSET(byte0, priv->pshare->rf_ft_var.txPowerPlus_mcs_15);
|
|
ASSIGN_TX_POWER_OFFSET(byte1, priv->pshare->rf_ft_var.txPowerPlus_mcs_14);
|
|
ASSIGN_TX_POWER_OFFSET(byte2, priv->pshare->rf_ft_var.txPowerPlus_mcs_13);
|
|
ASSIGN_TX_POWER_OFFSET(byte3, priv->pshare->rf_ft_var.txPowerPlus_mcs_12);
|
|
#endif
|
|
|
|
byte0 = POWER_RANGE_CHECK(base + byte0);
|
|
byte1 = POWER_RANGE_CHECK(base + byte1);
|
|
byte2 = POWER_RANGE_CHECK(base + byte2);
|
|
byte3 = POWER_RANGE_CHECK(base + byte3);
|
|
writeVal = (byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3;
|
|
RTL_W32(rTxAGC_A_Mcs15_Mcs12, writeVal);
|
|
RTL_W32(rTxAGC_B_Mcs15_Mcs12, writeVal);
|
|
|
|
#endif // ADD_TX_POWER_BY_CMD
|
|
return; // use default
|
|
}
|
|
|
|
/****************************** PATH A ******************************/
|
|
base = pwrlevelHT40_1S_A;
|
|
offset = (pwrdiffOFDM & 0x0f);
|
|
#if defined(CONFIG_RTL_92D_SUPPORT)&& defined(CONFIG_RTL_92D_DMDP)
|
|
//_TXPWR_REDEFINE??
|
|
if (priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY && priv->pshare->wlandev_idx == 1) {
|
|
offset = ((pwrdiffOFDM & 0xf0) >> 4);
|
|
}
|
|
#endif
|
|
base = COUNT_SIGN_OFFSET(base, offset);
|
|
#ifdef POWER_PERCENT_ADJUSTMENT
|
|
base = POWER_RANGE_CHECK(base + pwrdiff_percent);
|
|
#endif
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) && defined(CALIBRATE_BY_ODM)
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
if (ODMPTR->RFCalibrateInfo.ThermalValue > GET_ROOT(priv)->pmib->dot11RFEntry.ther)
|
|
base += (ODMPTR->RFCalibrateInfo.BbSwingIdxOfdm[RF_PATH_A] - ODMPTR->RFCalibrateInfo.DefaultOfdmIndex);
|
|
}
|
|
#endif
|
|
|
|
byte0 = POWER_RANGE_CHECK(base + priv->pshare->phw->OFDMTxAgcOffset_A[0]);
|
|
byte1 = POWER_RANGE_CHECK(base + priv->pshare->phw->OFDMTxAgcOffset_A[1]);
|
|
byte2 = POWER_RANGE_CHECK(base + priv->pshare->phw->OFDMTxAgcOffset_A[2]);
|
|
byte3 = POWER_RANGE_CHECK(base + priv->pshare->phw->OFDMTxAgcOffset_A[3]);
|
|
writeVal = (byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3;
|
|
RTL_W32(rTxAGC_A_Rate18_06, writeVal);
|
|
|
|
byte0 = POWER_RANGE_CHECK(base + priv->pshare->phw->OFDMTxAgcOffset_A[4]);
|
|
byte1 = POWER_RANGE_CHECK(base + priv->pshare->phw->OFDMTxAgcOffset_A[5]);
|
|
byte2 = POWER_RANGE_CHECK(base + priv->pshare->phw->OFDMTxAgcOffset_A[6]);
|
|
byte3 = POWER_RANGE_CHECK(base + priv->pshare->phw->OFDMTxAgcOffset_A[7]);
|
|
writeVal = (byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3;
|
|
RTL_W32(rTxAGC_A_Rate54_24, writeVal);
|
|
|
|
base = pwrlevelHT40_1S_A;
|
|
if (priv->pshare->CurrentChannelBW == HT_CHANNEL_WIDTH_20) {
|
|
offset = (pwrdiffHT20 & 0x0f);
|
|
#if defined(CONFIG_RTL_92D_SUPPORT)&& defined(CONFIG_RTL_92D_DMDP)
|
|
//_TXPWR_REDEFINE??
|
|
if (priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY && priv->pshare->wlandev_idx == 1) {
|
|
offset = ((pwrdiffHT20 & 0xf0) >> 4);
|
|
}
|
|
#endif
|
|
base = COUNT_SIGN_OFFSET(base, offset);
|
|
}
|
|
#ifdef POWER_PERCENT_ADJUSTMENT
|
|
base = POWER_RANGE_CHECK(base + pwrdiff_percent);
|
|
#endif
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) && defined(CALIBRATE_BY_ODM)
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
if (ODMPTR->RFCalibrateInfo.ThermalValue > GET_ROOT(priv)->pmib->dot11RFEntry.ther)
|
|
base += (ODMPTR->RFCalibrateInfo.BbSwingIdxOfdm[RF_PATH_A] - ODMPTR->RFCalibrateInfo.DefaultOfdmIndex);
|
|
}
|
|
#endif
|
|
|
|
byte0 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_A[0]);
|
|
byte1 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_A[1]);
|
|
byte2 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_A[2]);
|
|
byte3 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_A[3]);
|
|
writeVal = (byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3;
|
|
RTL_W32(rTxAGC_A_Mcs03_Mcs00, writeVal);
|
|
|
|
byte0 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_A[4]);
|
|
byte1 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_A[5]);
|
|
byte2 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_A[6]);
|
|
byte3 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_A[7]);
|
|
writeVal = (byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3;
|
|
RTL_W32(rTxAGC_A_Mcs07_Mcs04, writeVal);
|
|
|
|
offset = (pwrdiffHT40_2S & 0x0f);
|
|
#if defined(CONFIG_RTL_92D_SUPPORT)&& defined(CONFIG_RTL_92D_DMDP)
|
|
//_TXPWR_REDEFINE??
|
|
if (priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY && priv->pshare->wlandev_idx == 1) {
|
|
offset = ((pwrdiffHT40_2S & 0xf0) >> 4);
|
|
}
|
|
#endif
|
|
base = COUNT_SIGN_OFFSET(base, offset);
|
|
|
|
//_TXPWR_REDEFINE
|
|
#ifdef USB_POWER_SUPPORT
|
|
|
|
base_6dBm = pwrlevelHT40_6dBm_1S_A;
|
|
|
|
if (priv->pshare->CurrentChannelBW == HT_CHANNEL_WIDTH_20) {
|
|
offset_6dBm = (pwrdiffHT20_6dBm & 0x0f);
|
|
|
|
#if defined(CONFIG_RTL_92D_SUPPORT)&& defined(CONFIG_RTL_92D_DMDP)
|
|
if (priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY && priv->pshare->wlandev_idx == 1) {
|
|
offset_6dBm = ((pwrdiffHT20_6dBm & 0xf0) >> 4);
|
|
}
|
|
#endif
|
|
|
|
base_6dBm = COUNT_SIGN_OFFSET(base_6dBm, offset_6dBm);
|
|
}
|
|
|
|
offset_6dBm = (pwrdiffHT40_6dBm_2S & 0x0f);
|
|
|
|
#if defined(CONFIG_RTL_92D_SUPPORT)&& defined(CONFIG_RTL_92D_DMDP)
|
|
if (priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY && priv->pshare->wlandev_idx == 1) {
|
|
offset_6dBm = ((pwrdiffHT40_6dBm_2S & 0xf0) >> 4);
|
|
}
|
|
#endif
|
|
|
|
base_6dBm = COUNT_SIGN_OFFSET(base_6dBm, offset_6dBm);
|
|
|
|
if ((pwrlevelHT40_6dBm_1S_A != 0) && (pwrlevelHT40_6dBm_1S_A != pwrlevelHT40_1S_A))
|
|
byte0 = byte1 = byte2 = byte3 = base_6dBm;
|
|
else if ((base - USB_HT_2S_DIFF) > 0)
|
|
byte0 = byte1 = byte2 = byte3 = POWER_RANGE_CHECK(base - USB_HT_2S_DIFF);
|
|
else
|
|
byte0 = byte1 = byte2 = byte3 = POWER_RANGE_CHECK(defValue - USB_HT_2S_DIFF);
|
|
|
|
#else
|
|
//_TXPWR_REDEFINE ?? MCS 8 - 11, shall NOT add power by rate even NOT USB power ??
|
|
byte0 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_A[8]);
|
|
byte1 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_A[9]);
|
|
byte2 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_A[10]);
|
|
byte3 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_A[11]);
|
|
#endif
|
|
|
|
writeVal = (byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3;
|
|
|
|
//DEBUG_INFO("debug e18:%x,%x,[%x,%x,%x,%x],%x\n", offset, base, byte0, byte1, byte2, byte3, writeVal);
|
|
RTL_W32(rTxAGC_A_Mcs11_Mcs08, writeVal);
|
|
|
|
#ifdef USB_POWER_SUPPORT
|
|
//_TXPWR_REDEFINE
|
|
if ((pwrlevelHT40_6dBm_1S_A != 0) && (pwrlevelHT40_6dBm_1S_A != pwrlevelHT40_1S_A))
|
|
byte0 = byte1 = byte2 = byte3 = base_6dBm;
|
|
else if ((base - USB_HT_2S_DIFF) > 0)
|
|
byte0 = byte1 = byte2 = byte3 = POWER_RANGE_CHECK(base - USB_HT_2S_DIFF);
|
|
else
|
|
byte0 = byte1 = byte2 = byte3 = POWER_RANGE_CHECK(defValue - USB_HT_2S_DIFF);
|
|
|
|
#else
|
|
byte0 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_A[12]);
|
|
byte1 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_A[13]);
|
|
byte2 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_A[14]);
|
|
byte3 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_A[15]);
|
|
#endif
|
|
|
|
writeVal = (byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3;
|
|
RTL_W32(rTxAGC_A_Mcs15_Mcs12, writeVal);
|
|
|
|
/****************************** PATH B ******************************/
|
|
base = pwrlevelHT40_1S_B;
|
|
offset = ((pwrdiffOFDM & 0xf0) >> 4);
|
|
base = COUNT_SIGN_OFFSET(base, offset);
|
|
#ifdef POWER_PERCENT_ADJUSTMENT
|
|
base = POWER_RANGE_CHECK(base + pwrdiff_percent);
|
|
#endif
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) && defined(CALIBRATE_BY_ODM)
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
if (ODMPTR->RFCalibrateInfo.ThermalValue > GET_ROOT(priv)->pmib->dot11RFEntry.ther)
|
|
base += (ODMPTR->RFCalibrateInfo.BbSwingIdxOfdm[RF_PATH_A] - ODMPTR->RFCalibrateInfo.DefaultOfdmIndex);
|
|
}
|
|
#endif
|
|
|
|
byte0 = POWER_RANGE_CHECK(base + priv->pshare->phw->OFDMTxAgcOffset_B[0]);
|
|
byte1 = POWER_RANGE_CHECK(base + priv->pshare->phw->OFDMTxAgcOffset_B[1]);
|
|
byte2 = POWER_RANGE_CHECK(base + priv->pshare->phw->OFDMTxAgcOffset_B[2]);
|
|
byte3 = POWER_RANGE_CHECK(base + priv->pshare->phw->OFDMTxAgcOffset_B[3]);
|
|
writeVal = (byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3;
|
|
RTL_W32(rTxAGC_B_Rate18_06, writeVal);
|
|
|
|
byte0 = POWER_RANGE_CHECK(base + priv->pshare->phw->OFDMTxAgcOffset_B[4]);
|
|
byte1 = POWER_RANGE_CHECK(base + priv->pshare->phw->OFDMTxAgcOffset_B[5]);
|
|
byte2 = POWER_RANGE_CHECK(base + priv->pshare->phw->OFDMTxAgcOffset_B[6]);
|
|
byte3 = POWER_RANGE_CHECK(base + priv->pshare->phw->OFDMTxAgcOffset_B[7]);
|
|
writeVal = (byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3;
|
|
RTL_W32(rTxAGC_B_Rate54_24, writeVal);
|
|
|
|
base = pwrlevelHT40_1S_B;
|
|
if (priv->pshare->CurrentChannelBW == HT_CHANNEL_WIDTH_20) {
|
|
offset = ((pwrdiffHT20 & 0xf0) >> 4);
|
|
base = COUNT_SIGN_OFFSET(base, offset);
|
|
}
|
|
#ifdef POWER_PERCENT_ADJUSTMENT
|
|
base = POWER_RANGE_CHECK(base + pwrdiff_percent);
|
|
#endif
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) && defined(CALIBRATE_BY_ODM)
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
if (ODMPTR->RFCalibrateInfo.ThermalValue > GET_ROOT(priv)->pmib->dot11RFEntry.ther)
|
|
base += (ODMPTR->RFCalibrateInfo.BbSwingIdxOfdm[RF_PATH_A] - ODMPTR->RFCalibrateInfo.DefaultOfdmIndex);
|
|
}
|
|
#endif
|
|
|
|
byte0 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_B[0]);
|
|
byte1 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_B[1]);
|
|
byte2 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_B[2]);
|
|
byte3 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_B[3]);
|
|
writeVal = (byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3;
|
|
RTL_W32(rTxAGC_B_Mcs03_Mcs00, writeVal);
|
|
|
|
byte0 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_B[4]);
|
|
byte1 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_B[5]);
|
|
byte2 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_B[6]);
|
|
byte3 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_B[7]);
|
|
writeVal = (byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3;
|
|
RTL_W32(rTxAGC_B_Mcs07_Mcs04, writeVal);
|
|
|
|
offset = ((pwrdiffHT40_2S & 0xf0) >> 4);
|
|
base = COUNT_SIGN_OFFSET(base, offset);
|
|
|
|
#ifdef USB_POWER_SUPPORT
|
|
//_TXPWR_REDEFINE ?? 2.4G
|
|
base_6dBm = pwrlevelHT40_6dBm_1S_B;
|
|
if (priv->pshare->CurrentChannelBW == HT_CHANNEL_WIDTH_20) {
|
|
offset_6dBm = ((pwrdiffHT20_6dBm & 0xf0) >> 4);
|
|
base_6dBm = COUNT_SIGN_OFFSET(base_6dBm, offset_6dBm);
|
|
}
|
|
|
|
offset_6dBm = ((pwrdiffHT40_6dBm_2S & 0xf0) >> 4);
|
|
base_6dBm = COUNT_SIGN_OFFSET(base_6dBm, offset_6dBm);
|
|
|
|
if (( pwrlevelHT40_6dBm_1S_B != 0 ) && (pwrlevelHT40_6dBm_1S_B != pwrlevelHT40_1S_B))
|
|
byte0 = byte1 = byte2 = byte3 = base_6dBm;
|
|
else if ((base - USB_HT_2S_DIFF) > 0)
|
|
byte0 = byte1 = byte2 = byte3 = POWER_RANGE_CHECK(base - USB_HT_2S_DIFF);
|
|
else
|
|
byte0 = byte1 = byte2 = byte3 = POWER_RANGE_CHECK(defValue - USB_HT_2S_DIFF);
|
|
|
|
#else
|
|
byte0 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_B[8]);
|
|
byte1 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_B[9]);
|
|
byte2 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_B[10]);
|
|
byte3 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_B[11]);
|
|
#endif
|
|
|
|
writeVal = (byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3;
|
|
RTL_W32(rTxAGC_B_Mcs11_Mcs08, writeVal);
|
|
|
|
#ifdef USB_POWER_SUPPORT
|
|
//_TXPWR_REDEFINE ?? 2.4G
|
|
if (( pwrlevelHT40_6dBm_1S_B != 0 ) && (pwrlevelHT40_6dBm_1S_B != pwrlevelHT40_1S_B))
|
|
byte0 = byte1 = byte2 = byte3 = base_6dBm;
|
|
else if ((base - USB_HT_2S_DIFF) > 0)
|
|
byte0 = byte1 = byte2 = byte3 = POWER_RANGE_CHECK(base - USB_HT_2S_DIFF);
|
|
else
|
|
byte0 = byte1 = byte2 = byte3 = POWER_RANGE_CHECK(defValue - USB_HT_2S_DIFF);
|
|
|
|
#else
|
|
byte0 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_B[12]);
|
|
byte1 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_B[13]);
|
|
byte2 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_B[14]);
|
|
byte3 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_B[15]);
|
|
#endif
|
|
|
|
writeVal = (byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3;
|
|
RTL_W32(rTxAGC_B_Mcs15_Mcs12, writeVal);
|
|
} /* PHY_RF6052SetOFDMTxPower */
|
|
|
|
|
|
void PHY_RF6052SetCCKTxPower(struct rtl8192cd_priv *priv, unsigned int channel)
|
|
{
|
|
unsigned int writeVal = 0;
|
|
u1Byte byte, byte1, byte2;
|
|
u1Byte pwrlevelCCK_A = priv->pmib->dot11RFEntry.pwrlevelCCK_A[channel - 1];
|
|
u1Byte pwrlevelCCK_B = priv->pmib->dot11RFEntry.pwrlevelCCK_B[channel - 1];
|
|
#ifdef POWER_PERCENT_ADJUSTMENT
|
|
s1Byte pwrdiff_percent = PwrPercent2PwrLevel(priv->pmib->dot11RFEntry.power_percent);
|
|
#endif
|
|
|
|
#if defined(CONFIG_RTL_92D_SUPPORT) && defined(CONFIG_RTL_92D_DMDP)
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
if (priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY &&
|
|
priv->pshare->wlandev_idx == 1) {
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_2G) {
|
|
pwrlevelCCK_A = priv->pmib->dot11RFEntry.pwrlevelCCK_B[channel - 1];
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
#ifdef TXPWR_LMT
|
|
if (!priv->pshare->rf_ft_var.disable_txpwrlmt) {
|
|
#ifdef TXPWR_LMT_88E
|
|
if(GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
int max_idx_a, max_idx_b, i;
|
|
if (!priv->pshare->txpwr_lmt_CCK ||
|
|
!priv->pshare->tgpwr_CCK_new[RF_PATH_A]) {
|
|
DEBUG_INFO("No limit for CCK TxPower\n");
|
|
max_idx_a = 255;
|
|
max_idx_b = 255;
|
|
} else {
|
|
// maximum additional power index
|
|
max_idx_a = (priv->pshare->txpwr_lmt_CCK - priv->pshare->tgpwr_CCK_new[RF_PATH_A]);
|
|
max_idx_b = (priv->pshare->txpwr_lmt_CCK - priv->pshare->tgpwr_CCK_new[RF_PATH_B]);
|
|
}
|
|
for (i = 0; i <= 3; i++) {
|
|
//printk("priv->pshare->phw->CCKTxAgc_A[%d]=0x%x max=0x%x\n",i, priv->pshare->phw->CCKTxAgc_A[i], max_idx_a);
|
|
//printk("priv->pshare->phw->CCKTxAgc_B[%d]=%x\n",i, priv->pshare->phw->CCKTxAgc_B[i]);
|
|
priv->pshare->phw->CCKTxAgc_A[i] = POWER_MIN_CHECK(priv->pshare->phw->CCKTxAgc_A[i], max_idx_a);
|
|
priv->pshare->phw->CCKTxAgc_B[i] = POWER_MIN_CHECK(priv->pshare->phw->CCKTxAgc_B[i], max_idx_b);
|
|
}
|
|
}
|
|
else
|
|
#endif
|
|
{
|
|
int max_idx, i;
|
|
if (!priv->pshare->txpwr_lmt_CCK || !priv->pshare->tgpwr_CCK) {
|
|
DEBUG_INFO("No limit for CCK TxPower\n");
|
|
max_idx = 255;
|
|
} else {
|
|
// maximum additional power index
|
|
max_idx = (priv->pshare->txpwr_lmt_CCK - priv->pshare->tgpwr_CCK);
|
|
}
|
|
|
|
for (i = 0; i <= 3; i++) {
|
|
priv->pshare->phw->CCKTxAgc_A[i] = POWER_MIN_CHECK(priv->pshare->phw->CCKTxAgc_A[i], max_idx);
|
|
priv->pshare->phw->CCKTxAgc_B[i] = POWER_MIN_CHECK(priv->pshare->phw->CCKTxAgc_B[i], max_idx);
|
|
//printk("priv->pshare->phw->CCKTxAgc_A[%d]=%x\n",i, priv->pshare->phw->CCKTxAgc_A[i]);
|
|
//printk("priv->pshare->phw->CCKTxAgc_B[%d]=%x\n",i, priv->pshare->phw->CCKTxAgc_B[i]);
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
if (priv->pshare->rf_ft_var.cck_pwr_max) {
|
|
//byte = POWER_RANGE_CHECK(priv->pshare->rf_ft_var.cck_pwr_max);
|
|
byte = (priv->pshare->rf_ft_var.cck_pwr_max > 0x3f) ? 0x3f : priv->pshare->rf_ft_var.cck_pwr_max;
|
|
writeVal = byte;
|
|
PHY_SetBBReg(priv, rTxAGC_A_CCK1_Mcs32, 0x0000ff00, writeVal);
|
|
writeVal = (byte << 16) | (byte << 8) | byte;
|
|
PHY_SetBBReg(priv, rTxAGC_B_CCK5_1_Mcs32, 0xffffff00, writeVal);
|
|
writeVal = (byte << 24) | (byte << 16) | (byte << 8) | byte;
|
|
PHY_SetBBReg(priv, rTxAGC_A_CCK11_2_B_CCK11, 0xffffffff, writeVal);
|
|
return;
|
|
}
|
|
|
|
if ((pwrlevelCCK_A == 0 && pwrlevelCCK_B == 0)
|
|
#if defined(MP_TEST) && defined(CONFIG_RTL_88E_SUPPORT) && defined(CALIBRATE_BY_ODM)
|
|
|| ((priv->pshare->rf_ft_var.mp_specific) || (OPMODE & WIFI_MP_STATE))
|
|
#endif
|
|
) {
|
|
// use default value
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa)
|
|
byte = HP_CCK_POWER_DEFAULT;
|
|
else
|
|
#endif
|
|
byte = 0x24;
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
/* for testchip only */
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
byte = 0x21;
|
|
|
|
#if defined(CALIBRATE_BY_ODM)
|
|
#ifdef MP_TEST
|
|
if ((priv->pshare->rf_ft_var.mp_specific) && priv->pshare->mp_txpwr_patha)
|
|
byte = priv->pshare->mp_txpwr_patha;
|
|
#endif
|
|
if (ODMPTR->RFCalibrateInfo.ThermalValue > GET_ROOT(priv)->pmib->dot11RFEntry.ther)
|
|
byte += (ODMPTR->RFCalibrateInfo.BbSwingIdxCck - ODMPTR->RFCalibrateInfo.DefaultCckIndex);
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
#ifndef ADD_TX_POWER_BY_CMD
|
|
writeVal = byte;
|
|
PHY_SetBBReg(priv, rTxAGC_A_CCK1_Mcs32, 0x0000ff00, writeVal);
|
|
writeVal = (byte << 16) | (byte << 8) | byte;
|
|
PHY_SetBBReg(priv, rTxAGC_B_CCK5_1_Mcs32, 0xffffff00, writeVal);
|
|
writeVal = (byte << 24) | (byte << 16) | (byte << 8) | byte;
|
|
PHY_SetBBReg(priv, rTxAGC_A_CCK11_2_B_CCK11, 0xffffffff, writeVal);
|
|
#else
|
|
pwrlevelCCK_A = pwrlevelCCK_B = byte;
|
|
byte = 0;
|
|
ASSIGN_TX_POWER_OFFSET(byte, priv->pshare->rf_ft_var.txPowerPlus_cck_1);
|
|
writeVal = POWER_RANGE_CHECK(pwrlevelCCK_A + byte);
|
|
PHY_SetBBReg(priv, rTxAGC_A_CCK1_Mcs32, 0x0000ff00, writeVal);
|
|
|
|
byte = byte1 = byte2 = 0;
|
|
ASSIGN_TX_POWER_OFFSET(byte, priv->pshare->rf_ft_var.txPowerPlus_cck_1);
|
|
ASSIGN_TX_POWER_OFFSET(byte1, priv->pshare->rf_ft_var.txPowerPlus_cck_2);
|
|
ASSIGN_TX_POWER_OFFSET(byte2, priv->pshare->rf_ft_var.txPowerPlus_cck_5);
|
|
byte = POWER_RANGE_CHECK(pwrlevelCCK_B + byte);
|
|
byte1 = POWER_RANGE_CHECK(pwrlevelCCK_B + byte1);
|
|
byte2 = POWER_RANGE_CHECK(pwrlevelCCK_B + byte2);
|
|
writeVal = ((byte2 << 16) | (byte1 << 8) | byte);
|
|
PHY_SetBBReg(priv, rTxAGC_B_CCK5_1_Mcs32, 0xffffff00, writeVal);
|
|
|
|
byte = byte1 = byte2 = 0;
|
|
ASSIGN_TX_POWER_OFFSET(byte, priv->pshare->rf_ft_var.txPowerPlus_cck_2);
|
|
ASSIGN_TX_POWER_OFFSET(byte1, priv->pshare->rf_ft_var.txPowerPlus_cck_5);
|
|
ASSIGN_TX_POWER_OFFSET(byte2, priv->pshare->rf_ft_var.txPowerPlus_cck_11);
|
|
byte = POWER_RANGE_CHECK(pwrlevelCCK_A + byte);
|
|
byte1 = POWER_RANGE_CHECK(pwrlevelCCK_A + byte1);
|
|
byte2 = POWER_RANGE_CHECK(pwrlevelCCK_A + byte2);
|
|
writeVal = ((byte2 << 24) | (byte1 << 16) | (byte << 8) | byte2);
|
|
PHY_SetBBReg(priv, rTxAGC_A_CCK11_2_B_CCK11, 0xffffffff, writeVal);
|
|
#endif
|
|
return; // use default
|
|
}
|
|
|
|
if ((get_rf_mimo_mode(priv) == MIMO_2T2R) && (pwrlevelCCK_B == 0)) {
|
|
pwrlevelCCK_B = pwrlevelCCK_A +
|
|
priv->pmib->dot11RFEntry.pwrlevelHT40_1S_B[channel - 1] - priv->pmib->dot11RFEntry.pwrlevelHT40_1S_A[channel - 1];
|
|
}
|
|
|
|
#ifdef POWER_PERCENT_ADJUSTMENT
|
|
pwrlevelCCK_A = POWER_RANGE_CHECK(pwrlevelCCK_A + pwrdiff_percent);
|
|
pwrlevelCCK_B = POWER_RANGE_CHECK(pwrlevelCCK_B + pwrdiff_percent);
|
|
#endif
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) && defined(CALIBRATE_BY_ODM)
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
if (ODMPTR->RFCalibrateInfo.ThermalValue > GET_ROOT(priv)->pmib->dot11RFEntry.ther)
|
|
pwrlevelCCK_A += (ODMPTR->RFCalibrateInfo.BbSwingIdxCck - ODMPTR->RFCalibrateInfo.DefaultCckIndex);
|
|
}
|
|
#endif
|
|
|
|
writeVal = POWER_RANGE_CHECK(pwrlevelCCK_A + priv->pshare->phw->CCKTxAgc_A[3] + priv->pmib->dot11RFEntry.add_cck1M_pwr);
|
|
PHY_SetBBReg(priv, rTxAGC_A_CCK1_Mcs32, 0x0000ff00, writeVal);
|
|
writeVal = (POWER_RANGE_CHECK(pwrlevelCCK_B + priv->pshare->phw->CCKTxAgc_B[1]) << 16) |
|
|
(POWER_RANGE_CHECK(pwrlevelCCK_B + priv->pshare->phw->CCKTxAgc_B[2]) << 8) |
|
|
POWER_RANGE_CHECK(pwrlevelCCK_B + priv->pshare->phw->CCKTxAgc_B[3] + priv->pmib->dot11RFEntry.add_cck1M_pwr);
|
|
PHY_SetBBReg(priv, rTxAGC_B_CCK5_1_Mcs32, 0xffffff00, writeVal);
|
|
writeVal = (POWER_RANGE_CHECK(pwrlevelCCK_A + priv->pshare->phw->CCKTxAgc_A[0]) << 24) |
|
|
(POWER_RANGE_CHECK(pwrlevelCCK_A + priv->pshare->phw->CCKTxAgc_A[1]) << 16) |
|
|
(POWER_RANGE_CHECK(pwrlevelCCK_A + priv->pshare->phw->CCKTxAgc_A[2]) << 8) |
|
|
POWER_RANGE_CHECK(pwrlevelCCK_B + priv->pshare->phw->CCKTxAgc_B[0]);
|
|
PHY_SetBBReg(priv, rTxAGC_A_CCK11_2_B_CCK11, 0xffffffff, writeVal);
|
|
}
|
|
|
|
|
|
#if defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8881A)
|
|
|
|
int PHY_CheckBBWithParaFile(struct rtl8192cd_priv *priv, int reg_file)
|
|
{
|
|
int read_bytes = 0, num, len = 0;
|
|
unsigned int u4bRegOffset, u4bRegValue, u4bRegMask;
|
|
int file_format = TWO_COLUMN;
|
|
unsigned char *mem_ptr, *line_head, *next_head = NULL;
|
|
struct PhyRegTable *phyreg_table = NULL;
|
|
struct MacRegTable *macreg_table = NULL;
|
|
unsigned short max_len = 0;
|
|
unsigned int regstart, regend;
|
|
|
|
#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8881A)
|
|
int idx = 0, pg_tbl_idx = BGN_2040_ALL, write_en = 0;
|
|
#endif
|
|
|
|
|
|
if (reg_file == PHYREG) {
|
|
#ifdef CONFIG_WLAN_HAL_8881A
|
|
if (GET_CHIP_VER(priv) == VERSION_8881A) {
|
|
phyreg_table = (struct PhyRegTable *)priv->pshare->phy_reg_buf;
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_SIZE, (pu1Byte)&read_bytes);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_PHYREGFILE_START, (pu1Byte)&next_head);
|
|
max_len = PHY_REG_SIZE;
|
|
}
|
|
#endif //CONFIG_WLAN_HAL
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT //8812 phy
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
phyreg_table = (struct PhyRegTable *)priv->pshare->phy_reg_buf;
|
|
max_len = PHY_REG_SIZE;
|
|
|
|
if (IS_TEST_CHIP(priv)) { //for_8812_mp_chip
|
|
printk("[%s][PHY_REG_8812]\n", __FUNCTION__);
|
|
next_head = data_PHY_REG_8812_start;
|
|
read_bytes = (int)(data_PHY_REG_8812_end - data_PHY_REG_8812_start);
|
|
} else {
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa && priv->pshare->rf_ft_var.use_ext_lna) {
|
|
printk("[%s][PHY_REG_8812_n_hp]\n", __FUNCTION__);
|
|
next_head = data_PHY_REG_8812_n_hp_start;
|
|
read_bytes = (int)(data_PHY_REG_8812_n_hp_end - data_PHY_REG_8812_n_hp_start);
|
|
} else if (priv->pshare->rf_ft_var.use_ext_pa && !priv->pshare->rf_ft_var.use_ext_lna) {
|
|
printk("[%s][PHY_REG_8812_n_extpa]\n", __FUNCTION__);
|
|
next_head = data_PHY_REG_8812_n_extpa_start;
|
|
read_bytes = (int)(data_PHY_REG_8812_n_extpa_end - data_PHY_REG_8812_n_extpa_start);
|
|
} else if (!priv->pshare->rf_ft_var.use_ext_pa && priv->pshare->rf_ft_var.use_ext_lna) {
|
|
printk("[%s][PHY_REG_8812_n_extlna]\n", __FUNCTION__);
|
|
next_head = data_PHY_REG_8812_n_extlna_start;
|
|
read_bytes = (int)(data_PHY_REG_8812_n_extlna_end - data_PHY_REG_8812_n_extlna_start);
|
|
} else
|
|
#else
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
printk("[%s][PHY_REG_8812_n_hp]\n", __FUNCTION__);
|
|
next_head = data_PHY_REG_8812_n_hp_start;
|
|
read_bytes = (int)(data_PHY_REG_8812_n_hp_end - data_PHY_REG_8812_n_hp_start);
|
|
} else
|
|
#endif
|
|
#else
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
if (priv->pshare->rf_ft_var.use_ext_lna) {
|
|
printk("[%s][PHY_REG_8812_n_extlna]\n", __FUNCTION__);
|
|
next_head = data_PHY_REG_8812_n_extlna_start;
|
|
read_bytes = (int)(data_PHY_REG_8812_n_extlna_end - data_PHY_REG_8812_n_extlna_start);
|
|
} else
|
|
#endif
|
|
#endif
|
|
{
|
|
printk("[%s][PHY_REG_8812_n_default]\n", __FUNCTION__);
|
|
next_head = data_PHY_REG_8812_n_default_start;
|
|
read_bytes = (int)(data_PHY_REG_8812_n_default_end - data_PHY_REG_8812_n_default_start);
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
{
|
|
if ((mem_ptr = (unsigned char *)rtw_vmalloc(MAX_CONFIG_FILE_SIZE)) == NULL) {
|
|
printk("PHY_ConfigBBWithParaFile(): not enough memory\n");
|
|
return -1;
|
|
}
|
|
|
|
memset(mem_ptr, 0, MAX_CONFIG_FILE_SIZE); // clear memory
|
|
|
|
memcpy(mem_ptr, next_head, read_bytes);
|
|
|
|
next_head = mem_ptr;
|
|
while (1) {
|
|
line_head = next_head;
|
|
next_head = get_line(&line_head);
|
|
if (line_head == NULL)
|
|
break;
|
|
|
|
if (line_head[0] == '/')
|
|
continue;
|
|
|
|
if (file_format == TWO_COLUMN) {
|
|
num = get_offset_val(line_head, &u4bRegOffset, &u4bRegValue);
|
|
if (num > 0) {
|
|
phyreg_table[len].offset = u4bRegOffset;
|
|
phyreg_table[len].value = u4bRegValue;
|
|
len++;
|
|
|
|
if ((len & 0x7ff) == 0)
|
|
watchdog_kick();
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188E) || (GET_CHIP_VER(priv) == VERSION_8812E) || (IS_HAL_CHIP(priv))) {
|
|
if (u4bRegOffset == 0xffff)
|
|
break;
|
|
} else if (CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{
|
|
if (u4bRegOffset == 0xff)
|
|
break;
|
|
}
|
|
if ((len * sizeof(struct PhyRegTable)) > max_len)
|
|
break;
|
|
}
|
|
} else {
|
|
num = get_offset_mask_val(line_head, &u4bRegOffset, &u4bRegMask , &u4bRegValue);
|
|
if (num > 0) {
|
|
macreg_table[len].offset = u4bRegOffset;
|
|
macreg_table[len].mask = u4bRegMask;
|
|
macreg_table[len].value = u4bRegValue;
|
|
len++;
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188E) || (GET_CHIP_VER(priv) == VERSION_8812E) || (IS_HAL_CHIP(priv))) {
|
|
if (u4bRegOffset == 0xffff)
|
|
break;
|
|
} else if (CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{
|
|
if (u4bRegOffset == 0xff)
|
|
break;
|
|
}
|
|
if ((len * sizeof(struct MacRegTable)) > max_len)
|
|
break;
|
|
|
|
if ((len & 0x7ff) == 0)
|
|
watchdog_kick();
|
|
}
|
|
}
|
|
}
|
|
|
|
rtw_vmfree(mem_ptr, MAX_CONFIG_FILE_SIZE);
|
|
|
|
if ((len * sizeof(struct PhyRegTable)) > max_len) {
|
|
|
|
printk("PHY REG table buffer not large enough!\n");
|
|
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
num = 0;
|
|
while (1) {
|
|
if (file_format == THREE_COLUMN) {
|
|
u4bRegOffset = macreg_table[num].offset;
|
|
u4bRegValue = macreg_table[num].value;
|
|
u4bRegMask = macreg_table[num].mask;
|
|
} else {
|
|
u4bRegOffset = phyreg_table[num].offset;
|
|
u4bRegValue = phyreg_table[num].value;
|
|
}
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188E) || (GET_CHIP_VER(priv) == VERSION_8812E) || (IS_HAL_CHIP(priv))) {
|
|
if (u4bRegOffset == 0xffff)
|
|
break;
|
|
} else if (CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{
|
|
if (u4bRegOffset == 0xff)
|
|
break;
|
|
}
|
|
|
|
if (file_format == THREE_COLUMN) {
|
|
#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL)
|
|
if (reg_file == PHYREG_PG && (
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
(GET_CHIP_VER(priv) == VERSION_8192D)
|
|
#endif
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL)
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
||
|
|
#endif
|
|
(GET_CHIP_VER(priv) == VERSION_8188E) || (GET_CHIP_VER(priv) == VERSION_8812E) || (IS_HAL_CHIP(priv))
|
|
#endif
|
|
)) {
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
if (pg_tbl_idx == 0) {
|
|
regstart = 0xc20;
|
|
regend = 0xe38;
|
|
} else {
|
|
regstart = 0xc24;
|
|
regend = 0xe4c;
|
|
}
|
|
printk("[%d]pg_tbl_idx=%d\n", __LINE__, pg_tbl_idx);
|
|
if (u4bRegOffset == regstart) {
|
|
if (idx == pg_tbl_idx) {
|
|
write_en = 1;
|
|
}
|
|
idx++;
|
|
}
|
|
if (write_en) {
|
|
PHY_SetBBReg(priv, u4bRegOffset, u4bRegMask, u4bRegValue);
|
|
if (u4bRegOffset == regend) {
|
|
write_en = 0;
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
regstart = 0xe00;
|
|
regend = 0x868;
|
|
if (u4bRegOffset == regstart) {
|
|
if (idx == pg_tbl_idx)
|
|
write_en = 1;
|
|
idx++;
|
|
}
|
|
if (write_en) {
|
|
PHY_SetBBReg(priv, u4bRegOffset, u4bRegMask, u4bRegValue);
|
|
if (u4bRegOffset == regend) {
|
|
write_en = 0;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
} else
|
|
#endif
|
|
{
|
|
PHY_SetBBReg(priv, u4bRegOffset, u4bRegMask, u4bRegValue);
|
|
}
|
|
} else {
|
|
unsigned int tmp = RTL_R32(u4bRegOffset);
|
|
//PHY_SetBBReg(priv, u4bRegOffset, bMaskDWord, u4bRegValue);
|
|
|
|
if (tmp != u4bRegValue) {
|
|
// printk("[0x%x] 0x%08x 0x%08x \n", u4bRegOffset, u4bRegValue, tmp);
|
|
PHY_SetBBReg(priv, u4bRegOffset, bMaskDWord, u4bRegValue);
|
|
}
|
|
}
|
|
num++;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
static void phy_BB8192CD_Check_ParaFile(struct rtl8192cd_priv *priv)
|
|
{
|
|
int rtStatus=0;
|
|
unsigned short val16;
|
|
unsigned int val32;
|
|
|
|
#if defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8881A)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8812E) || (GET_CHIP_VER(priv) == VERSION_8881A))
|
|
rtStatus = PHY_CheckBBWithParaFile(priv, PHYREG);
|
|
#endif
|
|
}
|
|
*/
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL
|
|
// TODO: Filen, comfirm register setting below
|
|
static int phy_BB88XX_Config_ParaFile(struct rtl8192cd_priv *priv)
|
|
{
|
|
int rtStatus = 0;
|
|
unsigned short val16;
|
|
unsigned int val32;
|
|
|
|
phy_InitBBRFRegisterDefinition(priv);
|
|
|
|
#if defined(CONFIG_SDIO_HCI) && defined(HIGH_POWER_EXT_LNA)
|
|
if (priv->pshare->rf_ft_var.use_ext_lna) {
|
|
RTL_W8(0x11, 0xeb);
|
|
RTL_W8(0x12, 0x07);
|
|
RTL_W8(0x14, 0x75);
|
|
}
|
|
#endif
|
|
|
|
// Enable BB and RF
|
|
val16 = RTL_R16(REG_SYS_FUNC_EN);
|
|
RTL_W16(REG_SYS_FUNC_EN, val16 | BIT(13) | BIT(0) | BIT(1));
|
|
|
|
RTL_W8(REG_RF_CTRL, RF_EN | RF_RSTB | RF_SDMRSTB);
|
|
|
|
/*----Check chip ID and hw TR MIMO config----*/
|
|
// check_chipID_MIMO(priv);
|
|
|
|
#if 0// eric-8814 def CONFIG_WLAN_HAL
|
|
if ( IS_HAL_CHIP(priv) ) {
|
|
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E) {
|
|
#if defined(CONFIG_MACBBRF_BY_ODM)
|
|
printk("%s(%d), HAL PHY_ConfigBBWithParaFile\n", __FUNCTION__, __LINE__);
|
|
rtStatus = ODM_ConfigBBWithHeaderFile(ODMPTR, CONFIG_BB_PHY_REG);
|
|
#else
|
|
printk("%s(%d), HAL PHY_ConfigBBWithParaFile\n", __FUNCTION__, __LINE__);
|
|
rtStatus = PHY_ConfigBBWithParaFile(priv, PHYREG);
|
|
#endif
|
|
}
|
|
#endif //CONFIG_WLAN_HAL_8192EE
|
|
|
|
#if defined(CONFIG_WLAN_HAL_8881A) || defined(CONFIG_WLAN_HAL_8814AE)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8881A) || (GET_CHIP_VER(priv) == VERSION_8814A)) {
|
|
printk("%s(%d), HAL PHY_ConfigBBWithParaFile\n", __FUNCTION__, __LINE__);
|
|
rtStatus = PHY_ConfigBBWithParaFile(priv, PHYREG);
|
|
}
|
|
#endif //CONFIG_WLAN_HAL_8881A
|
|
}
|
|
#endif //CONFIG_WLAN_HAL
|
|
|
|
if(ODMPTR->ConfigBBRF)
|
|
rtStatus = ODM_ConfigBBWithHeaderFile(ODMPTR, CONFIG_BB_PHY_REG);
|
|
else
|
|
rtStatus = PHY_ConfigBBWithParaFile(priv, PHYREG);
|
|
|
|
#if 1 //Filen, BB have no release these files
|
|
#ifdef MP_TEST
|
|
if (priv->pshare->rf_ft_var.mp_specific) {
|
|
delay_ms(10);
|
|
if(ODMPTR->ConfigBBRF)
|
|
rtStatus |= ODM_ConfigBBWithHeaderFile(ODMPTR, CONFIG_BB_PHY_REG_MP);
|
|
else
|
|
rtStatus |= PHY_ConfigBBWithParaFile(priv, PHYREG_MP);
|
|
}
|
|
#endif
|
|
|
|
if (rtStatus) {
|
|
printk("phy_BB88XX_Config_ParaFile(): PHYREG_MP Reg Fail!!\n");
|
|
return rtStatus;
|
|
}
|
|
|
|
/*----If EEPROM or EFUSE autoload OK, We must config by PHY_REG_PG.txt----*/
|
|
if (0)
|
|
rtStatus = ODM_ConfigBBWithHeaderFile(ODMPTR, CONFIG_BB_PHY_REG_PG);
|
|
else
|
|
rtStatus = PHY_ConfigBBWithParaFile(priv, PHYREG_PG);
|
|
|
|
if (rtStatus) {
|
|
printk("phy_BB88XX_Config_ParaFile():BB_PG Reg Fail!!\n");
|
|
return rtStatus;
|
|
}
|
|
#endif
|
|
|
|
/*----BB AGC table Initialization----*/
|
|
if(ODMPTR->ConfigBBRF)
|
|
rtStatus = ODM_ConfigBBWithHeaderFile(ODMPTR, CONFIG_BB_AGC_TAB);
|
|
else
|
|
rtStatus = PHY_ConfigBBWithParaFile(priv, AGCTAB);
|
|
|
|
if (rtStatus) {
|
|
printk("phy_BB8192CD_Config_ParaFile(): Write BB AGC Table Fail!!\n");
|
|
return rtStatus;
|
|
}
|
|
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E) {
|
|
PHY_SetBBReg(priv, rFPGA0_RFMOD, bOFDMEn, 1);
|
|
PHY_SetBBReg(priv, rFPGA0_RFMOD, bCCKEn, 1);
|
|
}
|
|
#endif //CONFIG_WLAN_HAL_8192EE
|
|
|
|
if(ODMPTR->ConfigBBRF)
|
|
priv->pshare->PhyVersion = ODM_GetHWImgVersion(ODMPTR);
|
|
DEBUG_INFO("PHY-BB Initialization Success\n");
|
|
|
|
return 0;
|
|
}
|
|
#endif //#ifdef CONFIG_WLAN_HAL
|
|
|
|
#if(CONFIG_WLAN_NOT_HAL_EXIST==1)
|
|
static int phy_BB8192CD_Config_ParaFile(struct rtl8192cd_priv *priv)
|
|
{
|
|
int rtStatus = 0;
|
|
unsigned short val16;
|
|
unsigned int val32;
|
|
|
|
phy_InitBBRFRegisterDefinition(priv);
|
|
|
|
// Enable BB and RF
|
|
val16 = RTL_R16(REG_SYS_FUNC_EN);
|
|
RTL_W16(REG_SYS_FUNC_EN, val16 | BIT(13) | BIT(0) | BIT(1));
|
|
|
|
// 20090923 Joseph: Advised by Steven and Jenyu. Power sequence before init RF.
|
|
#if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT)
|
|
if (
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
(GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)
|
|
#endif
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
||
|
|
#endif
|
|
(GET_CHIP_VER(priv) == VERSION_8192D)
|
|
#endif
|
|
) {
|
|
RTL_W8(REG_AFE_PLL_CTRL, 0x83);
|
|
RTL_W8(REG_AFE_PLL_CTRL + 1, 0xdb);
|
|
}
|
|
#endif
|
|
RTL_W8(REG_RF_CTRL, RF_EN | RF_RSTB | RF_SDMRSTB);
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E)
|
|
RTL_W8(0x76, 0x7); //enable RF Path B
|
|
#endif
|
|
|
|
#if defined(CONFIG_PCI_HCI)
|
|
//RTL_W8(REG_SYS_FUNC_EN, FEN_PPLL|FEN_PCIEA|FEN_DIO_PCIE|FEN_USBA|FEN_BB_GLB_RST|FEN_BBRSTB);
|
|
//RTL_W8(REG_LDOHCI12_CTRL, 0x1f);
|
|
#elif defined(CONFIG_SDIO_HCI)
|
|
RTL_W8(REG_SYS_FUNC_EN, FEN_PPLL|FEN_PCIEA|FEN_DIO_PCIE|FEN_BB_GLB_RST|FEN_BBRSTB);
|
|
#endif
|
|
|
|
#if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT)
|
|
if (
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
(GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)
|
|
#endif
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
||
|
|
#endif
|
|
(GET_CHIP_VER(priv) == VERSION_8192D)
|
|
#endif
|
|
) {
|
|
RTL_W8(REG_AFE_XTAL_CTRL + 1, 0x80);
|
|
|
|
val32 = RTL_R32(REG_AFE_XTAL_CTRL);
|
|
val32 = (val32 & (~(BIT(11) | BIT(14)))) | (BIT(18) | BIT(19) | BIT(21) | BIT(22));
|
|
RTL_W32(REG_AFE_XTAL_CTRL, val32);
|
|
}
|
|
|
|
#endif
|
|
|
|
/*----Check chip ID and hw TR MIMO config----*/
|
|
// check_chipID_MIMO(priv);
|
|
#ifdef USE_OUT_SRC
|
|
if(ODMPTR->ConfigBBRF)
|
|
rtStatus = ODM_ConfigBBWithHeaderFile(ODMPTR, CONFIG_BB_PHY_REG);
|
|
else
|
|
#endif
|
|
{
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C))
|
|
{
|
|
if (get_rf_mimo_mode(priv) == MIMO_2T2R)
|
|
rtStatus = PHY_ConfigBBWithParaFile(priv, PHYREG_2T2R);
|
|
else if (get_rf_mimo_mode(priv) == MIMO_1T1R)
|
|
rtStatus = PHY_ConfigBBWithParaFile(priv, PHYREG_1T1R);
|
|
}
|
|
else
|
|
rtStatus = PHY_ConfigBBWithParaFile(priv, PHYREG);
|
|
}
|
|
|
|
#ifdef MP_TEST
|
|
if ((priv->pshare->rf_ft_var.mp_specific)
|
|
#if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT)
|
|
&& (
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
!IS_TEST_CHIP(priv)
|
|
#endif
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
||
|
|
#endif
|
|
(GET_CHIP_VER(priv) == VERSION_8192D)
|
|
#endif
|
|
)
|
|
#endif
|
|
) {
|
|
delay_ms(10);
|
|
#ifdef USE_OUT_SRC
|
|
if(ODMPTR->ConfigBBRF)
|
|
rtStatus |= ODM_ConfigBBWithHeaderFile(ODMPTR, CONFIG_BB_PHY_REG_MP);
|
|
else
|
|
#endif
|
|
rtStatus |= PHY_ConfigBBWithParaFile(priv, PHYREG_MP);
|
|
}
|
|
#endif
|
|
|
|
if (rtStatus) {
|
|
printk("phy_BB8192CD_Config_ParaFile(): Write BB Reg Fail!!\n");
|
|
return rtStatus;
|
|
}
|
|
|
|
/*----If EEPROM or EFUSE autoload OK, We must config by PHY_REG_PG.txt----*/
|
|
#ifdef USE_OUT_SRC
|
|
if (0)
|
|
rtStatus = ODM_ConfigBBWithHeaderFile(ODMPTR, CONFIG_BB_PHY_REG_PG);
|
|
else
|
|
#endif
|
|
rtStatus = PHY_ConfigBBWithParaFile(priv, PHYREG_PG);
|
|
|
|
if (rtStatus) {
|
|
printk("phy_BB8192CD_Config_ParaFile():BB_PG Reg Fail!!\n");
|
|
return rtStatus;
|
|
}
|
|
|
|
/*----BB AGC table Initialization----*/
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D)
|
|
PHY_SetBBReg(priv, rFPGA0_RFMOD, bOFDMEn | bCCKEn, 0);
|
|
#endif
|
|
#ifdef USE_OUT_SRC
|
|
if(ODMPTR->ConfigBBRF)
|
|
rtStatus = ODM_ConfigBBWithHeaderFile(ODMPTR, CONFIG_BB_AGC_TAB);
|
|
else
|
|
#endif
|
|
rtStatus = PHY_ConfigBBWithParaFile(priv, AGCTAB);
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) != VERSION_8812E)
|
|
#endif
|
|
{
|
|
PHY_SetBBReg(priv, rFPGA0_RFMOD, bOFDMEn, 1);
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (!(priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_5G))
|
|
|
|
#endif
|
|
PHY_SetBBReg(priv, rFPGA0_RFMOD, bCCKEn, 1);
|
|
}
|
|
|
|
if (rtStatus) {
|
|
printk("phy_BB8192CD_Config_ParaFile(): Write BB AGC Table Fail!!\n");
|
|
return rtStatus;
|
|
}
|
|
|
|
#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
|
|
// Check if the CCK HighPower is turned ON.
|
|
// This is used to calculate PWDB.
|
|
priv->pshare->phw->reg824_bit9 = (unsigned char)PHY_QueryBBReg(priv, rFPGA0_XA_HSSIParameter2, 0x200);
|
|
#endif
|
|
|
|
#if 0
|
|
/*----For 1T2R Config----*/
|
|
if (get_rf_mimo_mode(priv) == MIMO_1T2R) {
|
|
rtStatus = PHY_ConfigBBWithParaFile(priv, PHYREG_1T2R);
|
|
if (rtStatus) {
|
|
printk("phy_BB8192CD_Config_ParaFile(): Write BB Reg for 1T2R Fail!!\n");
|
|
return rtStatus;
|
|
}
|
|
} else if (get_rf_mimo_mode(priv) == MIMO_1T1R) {
|
|
delay_ms(100);
|
|
rtStatus = PHY_ConfigBBWithParaFile(priv, PHYREG_1T1R);
|
|
if (rtStatus) {
|
|
printk("phy_BB8192CD_Config_ParaFile(): Write BB Reg for 1T1R Fail!!\n");
|
|
return rtStatus;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
DEBUG_INFO("PHY-BB Initialization Success\n");
|
|
return 0;
|
|
}
|
|
#else
|
|
static int phy_BB8192CD_Config_ParaFile(struct rtl8192cd_priv *priv)
|
|
{
|
|
return 0;
|
|
}
|
|
#endif//CONFIG_WLAN_NOT_HAL_EXIST
|
|
|
|
#if 1
|
|
//#if !defined(CONFIG_MACBBRF_BY_ODM) || !defined(CONFIG_RTL_88E_SUPPORT)
|
|
|
|
int phy_RF6052_Config_ParaFile(struct rtl8192cd_priv *priv)
|
|
{
|
|
int rtStatus = 0;
|
|
RF92CD_RADIO_PATH_E eRFPath;
|
|
BB_REGISTER_DEFINITION_T *pPhyReg;
|
|
unsigned int u4RegValue = 0;
|
|
#ifndef SMP_SYNC
|
|
unsigned long x;
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL
|
|
#if defined(HIGH_POWER_EXT_PA) && defined(HIGH_POWER_EXT_LNA)
|
|
HW_VARIABLES RF_REG_FILE_RADIO_HP_SIZE[RF92CD_PATH_MAX] = {
|
|
HW_VAR_RFREGFILE_RADIO_A_HP_SIZE, HW_VAR_RFREGFILE_RADIO_B_HP_SIZE,
|
|
#ifdef CONFIG_WLAN_HAL_8814AE
|
|
HW_VAR_RFREGFILE_RADIO_C_HP_SIZE, HW_VAR_RFREGFILE_RADIO_D_HP_SIZE
|
|
#endif
|
|
};
|
|
HW_VARIABLES RF_REG_FILE_RADIO_HP_START[RF92CD_PATH_MAX] = {
|
|
HW_VAR_RFREGFILE_RADIO_A_HP_START, HW_VAR_RFREGFILE_RADIO_B_HP_START,
|
|
#ifdef CONFIG_WLAN_HAL_8814AE
|
|
HW_VAR_RFREGFILE_RADIO_C_HP_START, HW_VAR_RFREGFILE_RADIO_D_HP_START
|
|
#endif
|
|
};
|
|
#endif // HIGH_POWER_EXT_PA && HIGH_POWER_EXT_LNA
|
|
|
|
HW_VARIABLES RF_REG_FILE_RADIO_SIZE[RF92CD_PATH_MAX] = {
|
|
HW_VAR_RFREGFILE_RADIO_A_SIZE, HW_VAR_RFREGFILE_RADIO_B_SIZE,
|
|
#ifdef CONFIG_WLAN_HAL_8814AE
|
|
HW_VAR_RFREGFILE_RADIO_C_SIZE, HW_VAR_RFREGFILE_RADIO_D_SIZE
|
|
#endif
|
|
};
|
|
HW_VARIABLES RF_REG_FILE_RADIO_START[RF92CD_PATH_MAX] = {
|
|
HW_VAR_RFREGFILE_RADIO_A_START, HW_VAR_RFREGFILE_RADIO_B_START,
|
|
#ifdef CONFIG_WLAN_HAL_8814AE
|
|
HW_VAR_RFREGFILE_RADIO_C_START, HW_VAR_RFREGFILE_RADIO_D_START
|
|
#endif
|
|
};
|
|
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
HW_VARIABLES RF_REG_FILE_RADIO_EXTPA_SIZE[RF92CD_PATH_MAX] = {
|
|
HW_VAR_RFREGFILE_RADIO_A_EXTPA_SIZE, HW_VAR_RFREGFILE_RADIO_B_EXTPA_SIZE,
|
|
#ifdef CONFIG_WLAN_HAL_8814AE
|
|
HW_VAR_RFREGFILE_RADIO_C_EXTPA_SIZE, HW_VAR_RFREGFILE_RADIO_D_EXTPA_SIZE
|
|
#endif
|
|
};
|
|
HW_VARIABLES RF_REG_FILE_RADIO_EXTPA_START[RF92CD_PATH_MAX] = {
|
|
HW_VAR_RFREGFILE_RADIO_A_EXTPA_START, HW_VAR_RFREGFILE_RADIO_B_EXTPA_START,
|
|
#ifdef CONFIG_WLAN_HAL_8814AE
|
|
HW_VAR_RFREGFILE_RADIO_C_EXTPA_START, HW_VAR_RFREGFILE_RADIO_D_EXTPA_START
|
|
#endif
|
|
};
|
|
#endif // HIGH_POWER_EXT_PA
|
|
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
HW_VARIABLES RF_REG_FILE_RADIO_EXTLNA_SIZE[RF92CD_PATH_MAX] = {
|
|
HW_VAR_RFREGFILE_RADIO_A_EXTLNA_SIZE, HW_VAR_RFREGFILE_RADIO_B_EXTLNA_SIZE,
|
|
#ifdef CONFIG_WLAN_HAL_8814AE
|
|
HW_VAR_RFREGFILE_RADIO_C_EXTLNA_SIZE, HW_VAR_RFREGFILE_RADIO_D_EXTLNA_SIZE
|
|
#endif
|
|
};
|
|
|
|
HW_VARIABLES RF_REG_FILE_RADIO_EXTLNA_START[RF92CD_PATH_MAX] = {
|
|
HW_VAR_RFREGFILE_RADIO_A_EXTLNA_START, HW_VAR_RFREGFILE_RADIO_B_EXTLNA_START,
|
|
#ifdef CONFIG_WLAN_HAL_8814AE
|
|
HW_VAR_RFREGFILE_RADIO_C_EXTLNA_START, HW_VAR_RFREGFILE_RADIO_D_EXTLNA_START
|
|
#endif
|
|
};
|
|
#endif // HIGH_POWER_EXT_LNA
|
|
#endif // CONFIG_WLAN_HAL
|
|
|
|
// SAVE_INT_AND_CLI(x);
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192D) && (priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY))
|
|
priv->pshare->phw->NumTotalRFPath = 1;
|
|
else
|
|
#endif
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E)
|
|
priv->pshare->phw->NumTotalRFPath = 1;
|
|
else
|
|
#endif
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if ( IS_HAL_CHIP(priv)) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_NUM_TOTAL_RF_PATH, (pu1Byte)&priv->pshare->phw->NumTotalRFPath);
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif //CONFIG_WLAN_HAL
|
|
priv->pshare->phw->NumTotalRFPath = 2;
|
|
|
|
for (eRFPath = RF92CD_PATH_A; eRFPath < priv->pshare->phw->NumTotalRFPath; eRFPath++) {
|
|
pPhyReg = &priv->pshare->phw->PHYRegDef[eRFPath];
|
|
|
|
/*----Store original RFENV control type----*/
|
|
switch (eRFPath) {
|
|
case RF92CD_PATH_A:
|
|
u4RegValue = PHY_QueryBBReg(priv, pPhyReg->rfintfs, bRFSI_RFENV);
|
|
break;
|
|
case RF92CD_PATH_B :
|
|
u4RegValue = PHY_QueryBBReg(priv, pPhyReg->rfintfs, bRFSI_RFENV << 16);
|
|
break;
|
|
#ifdef CONFIG_WLAN_HAL_8814AE
|
|
case RF92CD_PATH_C:
|
|
// TODO: 8814AE BB/RF
|
|
break;
|
|
case RF92CD_PATH_D:
|
|
break;
|
|
#endif
|
|
case RF92CD_PATH_MAX:
|
|
break;
|
|
}
|
|
|
|
/*----Set RF_ENV enable----*/
|
|
PHY_SetBBReg(priv, pPhyReg->rfintfe, bRFSI_RFENV << 16, 0x1);
|
|
|
|
/*----Set RF_ENV output high----*/
|
|
PHY_SetBBReg(priv, pPhyReg->rfintfo, bRFSI_RFENV, 0x1);
|
|
|
|
/* Set bit number of Address and Data for RF register */
|
|
PHY_SetBBReg(priv, pPhyReg->rfHSSIPara2, b3WireAddressLength, 0x0);
|
|
PHY_SetBBReg(priv, pPhyReg->rfHSSIPara2, b3WireDataLength, 0x0);
|
|
|
|
/*----Initialize RF fom connfiguration file----*/
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
switch (eRFPath) {
|
|
case RF92CD_PATH_A:
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if ((priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY) &&
|
|
(priv->pshare->wlandev_idx == 1)) {
|
|
#ifdef RTL8192D_INT_PA
|
|
if (priv->pshare->rf_ft_var.use_intpa92d) {
|
|
#ifdef USB_POWER_SUPPORT
|
|
|
|
#if defined (RTL8192D_INT_PA_GAIN_TABLE_NEW)
|
|
printk("[%s][radio_b_intPA_GM_new]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_b_intPA_GM_new_start,
|
|
(int)(data_radio_b_intPA_GM_new_end - data_radio_b_intPA_GM_new_start), eRFPath);
|
|
#elif defined (RTL8192D_INT_PA_GAIN_TABLE_NEW1)
|
|
printk("[%s][radio_b_intPA_GM_new1]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_b_intPA_GM_new1_start,
|
|
(int)(data_radio_b_intPA_GM_new1_end - data_radio_b_intPA_GM_new1_start), eRFPath);
|
|
#else
|
|
printk("[%s][radio_b_intPA_GM]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_b_intPA_GM_start,
|
|
(int)(data_radio_b_intPA_GM_end - data_radio_b_intPA_GM_start), eRFPath);
|
|
#endif
|
|
|
|
#else //USB_POWER_SUPPORT
|
|
|
|
#if defined (RTL8192D_INT_PA_GAIN_TABLE_NEW)
|
|
printk("[%s][radio_b_intPA_new]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_b_intPA_new_start,
|
|
(int)(data_radio_b_intPA_new_end - data_radio_b_intPA_new_start), eRFPath);
|
|
#else
|
|
printk("[%s][radio_b_intPA]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_b_intPA_start,
|
|
(int)(data_radio_b_intPA_end - data_radio_b_intPA_start), eRFPath);
|
|
#endif
|
|
|
|
#endif //USB_POWER_SUPPORT
|
|
|
|
} else
|
|
#endif
|
|
{
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
printk("[%s][radio_b_n_92d_hp]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_b_n_92d_hp_start,
|
|
(int)(data_radio_b_n_92d_hp_end - data_radio_b_n_92d_hp_start), eRFPath);
|
|
} else
|
|
#endif
|
|
{
|
|
printk("[%s] [radio_b_n]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_b_n_start,
|
|
(int)(data_radio_b_n_end - data_radio_b_n_start), eRFPath);
|
|
}
|
|
}
|
|
} else
|
|
#endif
|
|
{
|
|
#ifdef RTL8192D_INT_PA
|
|
if (priv->pshare->rf_ft_var.use_intpa92d) {
|
|
#ifdef USB_POWER_SUPPORT
|
|
|
|
#if defined (RTL8192D_INT_PA_GAIN_TABLE_NEW)
|
|
printk("[%s][radio_a_intPA_GM_new]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_a_intPA_GM_new_start,
|
|
(int)(data_radio_a_intPA_GM_new_end - data_radio_a_intPA_GM_new_start), eRFPath);
|
|
#elif defined (RTL8192D_INT_PA_GAIN_TABLE_NEW1)
|
|
printk("[%s][radio_a_intPA_GM_new1]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_a_intPA_GM_new1_start,
|
|
(int)(data_radio_a_intPA_GM_new1_end - data_radio_a_intPA_GM_new1_start), eRFPath);
|
|
#else
|
|
printk("[%s][radio_a_intPA_GM]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_a_intPA_GM_start,
|
|
(int)(data_radio_a_intPA_GM_end - data_radio_a_intPA_GM_start), eRFPath);
|
|
#endif
|
|
|
|
#else //USB_POWER_SUPPORT
|
|
|
|
#if defined (RTL8192D_INT_PA_GAIN_TABLE_NEW)
|
|
|
|
printk("[%s][radio_a_intPA_new]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_a_intPA_new_start,
|
|
(int)(data_radio_a_intPA_new_end - data_radio_a_intPA_new_start), eRFPath);
|
|
|
|
#else
|
|
printk("[%s][radio_a_intPA]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_a_intPA_start,
|
|
(int)(data_radio_a_intPA_end - data_radio_a_intPA_start), eRFPath);
|
|
#endif
|
|
|
|
#endif //USB_POWER_SUPPORT
|
|
} else
|
|
#endif
|
|
{
|
|
//_TXPWR_REDEFINE
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
printk("[%s][radio_a_n_92d_hp]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_a_n_92d_hp_start,
|
|
(int)(data_radio_a_n_92d_hp_end - data_radio_a_n_92d_hp_start), eRFPath);
|
|
} else
|
|
#endif
|
|
{
|
|
printk("[%s][radio_a_n]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_a_n_start,
|
|
(int)(data_radio_a_n_end - data_radio_a_n_start), eRFPath);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case RF92CD_PATH_B:
|
|
#ifdef RTL8192D_INT_PA
|
|
if (priv->pshare->rf_ft_var.use_intpa92d) {
|
|
#ifdef USB_POWER_SUPPORT
|
|
|
|
#if defined (RTL8192D_INT_PA_GAIN_TABLE_NEW)
|
|
printk("[%s][radio_b_intPA_GM_new]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_b_intPA_GM_new_start,
|
|
(int)(data_radio_b_intPA_GM_new_end - data_radio_b_intPA_GM_new_start), eRFPath);
|
|
#elif defined (RTL8192D_INT_PA_GAIN_TABLE_NEW1)
|
|
printk("[%s][radio_b_intPA_GM_new1]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_b_intPA_GM_new1_start,
|
|
(int)(data_radio_b_intPA_GM_new1_end - data_radio_b_intPA_GM_new1_start), eRFPath);
|
|
#else
|
|
printk("[%s][radio_b_intPA_GM]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_b_intPA_GM_start,
|
|
(int)(data_radio_b_intPA_GM_end - data_radio_b_intPA_GM_start), eRFPath);
|
|
#endif
|
|
|
|
|
|
#else //USB_POWER_SUPPORT
|
|
|
|
#if defined (RTL8192D_INT_PA_GAIN_TABLE_NEW)
|
|
printk("[%s][radio_b_intPA_new]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_b_intPA_new_start,
|
|
(int)(data_radio_b_intPA_new_end - data_radio_b_intPA_new_start), eRFPath);
|
|
#else
|
|
printk("[%s][radio_b_intPA]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_b_intPA_start,
|
|
(int)(data_radio_b_intPA_end - data_radio_b_intPA_start), eRFPath);
|
|
#endif
|
|
|
|
#endif //USB_POWER_SUPPORT
|
|
} else
|
|
#endif
|
|
{
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
printk("[%s][radio_b_n_92d_hp]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_b_n_92d_hp_start,
|
|
(int)(data_radio_b_n_92d_hp_end - data_radio_b_n_92d_hp_start), eRFPath);
|
|
} else
|
|
#endif
|
|
{
|
|
printk("[%s][radio_b_n]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_b_n_start,
|
|
(int)(data_radio_b_n_end - data_radio_b_n_start), eRFPath);
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
#endif //!CONFIG_RTL_92D_SUPPORT
|
|
#if defined(CONFIG_RTL_92C_SUPPORT)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)) {
|
|
switch (eRFPath) {
|
|
case RF92CD_PATH_A:
|
|
if (get_rf_mimo_mode(priv) == MIMO_2T2R) {
|
|
#ifdef TESTCHIP_SUPPORT
|
|
if (IS_TEST_CHIP(priv))
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_a_2T_start,
|
|
(int)(data_radio_a_2T_end - data_radio_a_2T_start), eRFPath);
|
|
else
|
|
#endif
|
|
{
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
//printk("[%s][data_radio_a_2T_n_hp]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_a_2T_n_hp_start,
|
|
(int)(data_radio_a_2T_n_hp_end - data_radio_a_2T_n_hp_start), eRFPath);
|
|
} else
|
|
#endif
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
if (priv->pshare->rf_ft_var.use_ext_lna) {
|
|
//printk("[%s][data_radio_a_2T_n_lna]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_a_2T_n_lna_start,
|
|
(int)(data_radio_a_2T_n_lna_end - data_radio_a_2T_n_lna_start), eRFPath);
|
|
} else
|
|
#endif
|
|
{
|
|
//printk("[%s][data_radio_a_2T_n]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_a_2T_n_start,
|
|
(int)(data_radio_a_2T_n_end - data_radio_a_2T_n_start), eRFPath);
|
|
}
|
|
}
|
|
} else if (get_rf_mimo_mode(priv) == MIMO_1T1R) {
|
|
#ifdef TESTCHIP_SUPPORT
|
|
if (IS_TEST_CHIP(priv))
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_a_1T_start,
|
|
(int)(data_radio_a_1T_end - data_radio_a_1T_start), eRFPath);
|
|
else
|
|
#endif
|
|
{
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
//printk("[%s][data_radio_a_2T_n_hp]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_a_2T_n_hp_start,
|
|
(int)(data_radio_a_2T_n_hp_end - data_radio_a_2T_n_hp_start), eRFPath);
|
|
} else
|
|
#endif
|
|
{
|
|
//printk("[%s][data_radio_a_1T_n]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_a_1T_n_start,
|
|
(int)(data_radio_a_1T_n_end - data_radio_a_1T_n_start), eRFPath);
|
|
}
|
|
|
|
}
|
|
}
|
|
break;
|
|
case RF92CD_PATH_B:
|
|
if (get_rf_mimo_mode(priv) == MIMO_2T2R) {
|
|
#ifdef TESTCHIP_SUPPORT
|
|
if (IS_TEST_CHIP(priv))
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_b_2T_start,
|
|
(int)(data_radio_b_2T_end - data_radio_b_2T_start), eRFPath);
|
|
else
|
|
#endif
|
|
{
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
//printk("[%s][data_radio_b_2T_n_hp]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_b_2T_n_hp_start,
|
|
(int)(data_radio_b_2T_n_hp_end - data_radio_b_2T_n_hp_start), eRFPath);
|
|
} else
|
|
#endif
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
if (priv->pshare->rf_ft_var.use_ext_lna) {
|
|
//printk("[%s][data_radio_b_2T_n_lna]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_b_2T_n_lna_start,
|
|
(int)(data_radio_b_2T_n_lna_end - data_radio_b_2T_n_lna_start), eRFPath);
|
|
} else
|
|
#endif
|
|
{
|
|
//printk("[%s][data_radio_b_2T_n]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_radio_b_2T_n_start,
|
|
(int)(data_radio_b_2T_n_end - data_radio_b_2T_n_start), eRFPath);
|
|
}
|
|
}
|
|
} else if (get_rf_mimo_mode(priv) == MIMO_1T1R)
|
|
rtStatus = 0;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT //data radio
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
switch (eRFPath) {
|
|
case RF92CD_PATH_A://for_8812_mp_chip
|
|
if (IS_TEST_CHIP(priv)) {
|
|
#ifdef HIGH_POWER_EXT_PA //FOR_8812_HP
|
|
if ( priv->pshare->rf_ft_var.use_ext_pa) {
|
|
printk("[RadioA_8812_hp]\n");
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_RadioA_8812_hp_start,
|
|
(int)(data_RadioA_8812_hp_end - data_RadioA_8812_hp_start), eRFPath);
|
|
} else
|
|
#endif
|
|
{
|
|
printk("[RadioA_8812]\n");
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_RadioA_8812_start,
|
|
(int)(data_RadioA_8812_end - data_RadioA_8812_start), eRFPath);
|
|
}
|
|
} else {
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa && priv->pshare->rf_ft_var.use_ext_lna) {
|
|
if (priv->pmib->dot11RFEntry.pa_type == PA_SKYWORKS_5023 || priv->pmib->dot11RFEntry.pa_type == PA_SKYWORKS_85712_HP) {
|
|
panic_printk("[RadioA_8812_n_ultra_hp]\n");
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_RadioA_8812_n_ultra_hp_start,
|
|
(int)(data_RadioA_8812_n_ultra_hp_end - data_RadioA_8812_n_ultra_hp_start), eRFPath);
|
|
} else {
|
|
panic_printk("[RadioA_8812_n_hp]\n");
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_RadioA_8812_n_hp_start,
|
|
(int)(data_RadioA_8812_n_hp_end - data_RadioA_8812_n_hp_start), eRFPath);
|
|
}
|
|
} else if (priv->pshare->rf_ft_var.use_ext_pa && !priv->pshare->rf_ft_var.use_ext_lna) {
|
|
panic_printk("[RadioA_8812_n_extpa]\n");
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_RadioA_8812_n_extpa_start,
|
|
(int)(data_RadioA_8812_n_extpa_end - data_RadioA_8812_n_extpa_start), eRFPath);
|
|
} else if (!priv->pshare->rf_ft_var.use_ext_pa && priv->pshare->rf_ft_var.use_ext_lna) {
|
|
panic_printk("[RadioA_8812_n_extlna]\n");
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_RadioA_8812_n_extlna_start,
|
|
(int)(data_RadioA_8812_n_extlna_end - data_RadioA_8812_n_extlna_start), eRFPath);
|
|
} else
|
|
#else
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
panic_printk("[RadioA_8812_n_extpa]\n");
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_RadioA_8812_n_extpa_start,
|
|
(int)(data_RadioA_8812_n_extpa_end - data_RadioA_8812_n_extpa_start), eRFPath);
|
|
} else
|
|
#endif
|
|
#else
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
if (priv->pshare->rf_ft_var.use_ext_lna) {
|
|
panic_printk("[RadioA_8812_n_extlna]\n");
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_RadioA_8812_n_extlna_start,
|
|
(int)(data_RadioA_8812_n_extlna_end - data_RadioA_8812_n_extlna_start), eRFPath);
|
|
|
|
} else
|
|
#endif
|
|
#endif
|
|
{
|
|
panic_printk("[RadioA_8812_n_default]\n");
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_RadioA_8812_n_default_start,
|
|
(int)(data_RadioA_8812_n_default_end - data_RadioA_8812_n_default_start), eRFPath);
|
|
}
|
|
}
|
|
break;
|
|
case RF92CD_PATH_B:
|
|
if (IS_TEST_CHIP(priv)) {
|
|
#ifdef HIGH_POWER_EXT_PA //FOR_8812_HP
|
|
if ( priv->pshare->rf_ft_var.use_ext_pa) {
|
|
panic_printk("[RadioB_8812_hp]\n");
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_RadioB_8812_hp_start,
|
|
(int)(data_RadioB_8812_hp_end - data_RadioB_8812_hp_start), eRFPath);
|
|
} else
|
|
#endif
|
|
{
|
|
panic_printk("[RadioB_8812]\n");
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_RadioB_8812_start,
|
|
(int)(data_RadioB_8812_end - data_RadioB_8812_start), eRFPath);
|
|
}
|
|
} else {
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa && priv->pshare->rf_ft_var.use_ext_lna) {
|
|
if (priv->pmib->dot11RFEntry.pa_type == PA_SKYWORKS_5023 || priv->pmib->dot11RFEntry.pa_type == PA_SKYWORKS_85712_HP) {
|
|
panic_printk("[RadioB_8812_n_ultra_hp]\n");
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_RadioB_8812_n_ultra_hp_start,
|
|
(int)(data_RadioB_8812_n_ultra_hp_end - data_RadioB_8812_n_ultra_hp_start), eRFPath);
|
|
} else {
|
|
panic_printk("[RadioB_8812_n_hp]\n");
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_RadioB_8812_n_hp_start,
|
|
(int)(data_RadioB_8812_n_hp_end - data_RadioB_8812_n_hp_start), eRFPath);
|
|
}
|
|
} else if (priv->pshare->rf_ft_var.use_ext_pa && !priv->pshare->rf_ft_var.use_ext_lna) {
|
|
panic_printk("[RadioB_8812_n_extpa]\n");
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_RadioB_8812_n_extpa_start,
|
|
(int)(data_RadioB_8812_n_extpa_end - data_RadioB_8812_n_extpa_start), eRFPath);
|
|
} else if (!priv->pshare->rf_ft_var.use_ext_pa && priv->pshare->rf_ft_var.use_ext_lna) {
|
|
panic_printk("[RadioB_8812_n_extlna]\n");
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_RadioB_8812_n_extlna_start,
|
|
(int)(data_RadioB_8812_n_extlna_end - data_RadioB_8812_n_extlna_start), eRFPath);
|
|
} else
|
|
#else
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
panic_printk("[RadioB_8812_n_extpa]\n");
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_RadioB_8812_n_extpa_start,
|
|
(int)(data_RadioB_8812_n_extpa_end - data_RadioB_8812_n_extpa_start), eRFPath);
|
|
} else
|
|
#endif
|
|
#else
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
if (priv->pshare->rf_ft_var.use_ext_lna) {
|
|
panic_printk("[RadioB_8812_n_extlna]\n");
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_RadioB_8812_n_extlna_start,
|
|
(int)(data_RadioB_8812_n_extlna_end - data_RadioB_8812_n_extlna_start), eRFPath);
|
|
} else
|
|
#endif
|
|
#endif
|
|
{
|
|
panic_printk("[RadioB_8812_n_default]\n");
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, data_RadioB_8812_n_default_start,
|
|
(int)(data_RadioB_8812_n_default_end - data_RadioB_8812_n_default_start), eRFPath);
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
pu4Byte FileStartPtr;
|
|
u4Byte FileLength;
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa && priv->pshare->rf_ft_var.use_ext_lna) {
|
|
//printk("[%s][Radio_HAL_hp] path%d\n",__FUNCTION__,eRFPath+1);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, RF_REG_FILE_RADIO_HP_SIZE[eRFPath], (pu1Byte)&FileLength);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, RF_REG_FILE_RADIO_HP_START[eRFPath], (pu1Byte)&FileStartPtr);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, (pu1Byte)FileStartPtr, (int)FileLength, eRFPath);
|
|
} else if (priv->pshare->rf_ft_var.use_ext_pa && !priv->pshare->rf_ft_var.use_ext_lna) {
|
|
//printk("[%s][Radio_HAL_extpa] path%d\n",__FUNCTION__,eRFPath+1);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, RF_REG_FILE_RADIO_EXTPA_SIZE[eRFPath], (pu1Byte)&FileLength);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, RF_REG_FILE_RADIO_EXTPA_START[eRFPath], (pu1Byte)&FileStartPtr);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, (pu1Byte)FileStartPtr, (int)FileLength, eRFPath);
|
|
} else if (!priv->pshare->rf_ft_var.use_ext_pa && priv->pshare->rf_ft_var.use_ext_lna) {
|
|
//printk("[%s][Radio_HAL_extlna] path%d\n",__FUNCTION__,eRFPath+1);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, RF_REG_FILE_RADIO_EXTLNA_SIZE[eRFPath], (pu1Byte)&FileLength);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, RF_REG_FILE_RADIO_EXTLNA_START[eRFPath], (pu1Byte)&FileStartPtr);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, (pu1Byte)FileStartPtr, (int)FileLength, eRFPath);
|
|
} else
|
|
#else
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
//printk("[%s][Radio_HAL_extpa] path%d\n",__FUNCTION__,eRFPath+1);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, RF_REG_FILE_RADIO_EXTPA_SIZE[eRFPath], (pu1Byte)&FileLength);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, RF_REG_FILE_RADIO_EXTPA_START[eRFPath], (pu1Byte)&FileStartPtr);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, (pu1Byte)FileStartPtr, (int)FileLength, eRFPath);
|
|
}else
|
|
#endif //HIGH_POWER_EXT_LNA
|
|
#else
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
if (priv->pshare->rf_ft_var.use_ext_lna) {
|
|
//printk("[%s][Radio_HAL_extlna] path%d\n",__FUNCTION__,eRFPath+1);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, RF_REG_FILE_RADIO_EXTLNA_SIZE[eRFPath], (pu1Byte)&FileLength);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, RF_REG_FILE_RADIO_EXTLNA_START[eRFPath], (pu1Byte)&FileStartPtr);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, (pu1Byte)FileStartPtr, (int)FileLength, eRFPath);
|
|
} else
|
|
#endif
|
|
#endif //HIGH_POWER_EXT_PA
|
|
{
|
|
//printk("[%s][Radio_HAL] path%d\n",__FUNCTION__,eRFPath+1);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, RF_REG_FILE_RADIO_SIZE[eRFPath], (pu1Byte)&FileLength);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, RF_REG_FILE_RADIO_START[eRFPath], (pu1Byte)&FileStartPtr);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, (pu1Byte)FileStartPtr, (int)FileLength, eRFPath);
|
|
}
|
|
#if 0 // TODO: can be removed after 8814A test ok
|
|
switch (eRFPath) {
|
|
case RF92CD_PATH_A:
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if ( priv->pshare->rf_ft_var.use_ext_pa) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_RFREGFILE_RADIO_A_HP_SIZE, (pu1Byte)&FileLength);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_RFREGFILE_RADIO_A_HP_START, (pu1Byte)&FileStartPtr);
|
|
printk("[%s][%s][RadioA_HAL_hp]\n", __FUNCTION__, ((GET_CHIP_VER(priv) == VERSION_8881A) ? "RTL_8881A" : "RTL_8192E"));
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, FileStartPtr,
|
|
(int)FileLength, eRFPath);
|
|
} else
|
|
#endif
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
if ( priv->pshare->rf_ft_var.use_ext_lna) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_RFREGFILE_RADIO_A_EXTLNA_SIZE, (pu1Byte)&FileLength);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_RFREGFILE_RADIO_A_EXTLNA_START, (pu1Byte)&FileStartPtr);
|
|
printk("[%s][%s][RadioA_HAL_extlna]\n", __FUNCTION__, ((GET_CHIP_VER(priv) == VERSION_8881A) ? "RTL_8881A" : "RTL_8192E"));
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, FileStartPtr,
|
|
(int)FileLength, eRFPath);
|
|
} else
|
|
#endif
|
|
{
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_RFREGFILE_RADIO_A_SIZE, (pu1Byte)&FileLength);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_RFREGFILE_RADIO_A_START, (pu1Byte)&FileStartPtr);
|
|
printk("[%s][RadioA_HAL]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, (pu1Byte)FileStartPtr, (int)FileLength, eRFPath);
|
|
}
|
|
break;
|
|
case RF92CD_PATH_B:
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if ( priv->pshare->rf_ft_var.use_ext_pa) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_RFREGFILE_RADIO_B_HP_SIZE, (pu1Byte)&FileLength);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_RFREGFILE_RADIO_B_HP_START, (pu1Byte)&FileStartPtr);
|
|
printk("[%s][%s][RadioB_HAL_hp]\n", __FUNCTION__, ((GET_CHIP_VER(priv) == VERSION_8881A) ? "RTL_8881A" : "RTL_8192E"));
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, FileStartPtr,
|
|
(int)FileLength, eRFPath);
|
|
} else
|
|
#endif
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
if ( priv->pshare->rf_ft_var.use_ext_lna) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_RFREGFILE_RADIO_B_EXTLNA_SIZE, (pu1Byte)&FileLength);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_RFREGFILE_RADIO_B_EXTLNA_START, (pu1Byte)&FileStartPtr);
|
|
printk("[%s][%s][RadioB_HAL_extlna]\n", __FUNCTION__, ((GET_CHIP_VER(priv) == VERSION_8881A) ? "RTL_8881A" : "RTL_8192E"));
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, FileStartPtr,
|
|
(int)FileLength, eRFPath);
|
|
} else
|
|
#endif
|
|
{
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_RFREGFILE_RADIO_B_SIZE, (pu1Byte)&FileLength);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_RFREGFILE_RADIO_B_START, (pu1Byte)&FileStartPtr);
|
|
printk("[%s][RadioB_HAL]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, (pu1Byte)FileStartPtr,
|
|
(int)FileLength, eRFPath);
|
|
}
|
|
break;
|
|
#ifdef CONFIG_WLAN_HAL_8814AE
|
|
// TODO: 8814AE BB/RF
|
|
case RF92CD_PATH_C:
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if ( priv->pshare->rf_ft_var.use_ext_pa) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_RFREGFILE_RADIO_C_HP_SIZE, (pu1Byte)&FileLength);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_RFREGFILE_RADIO_C_HP_START, (pu1Byte)&FileStartPtr);
|
|
printk("[%s][RadioC_HAL_hp]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, (pu1Byte)FileStartPtr, (int)FileLength, eRFPath);
|
|
} else
|
|
#endif
|
|
{
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_RFREGFILE_RADIO_C_SIZE, (pu1Byte)&FileLength);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_RFREGFILE_RADIO_C_START, (pu1Byte)&FileStartPtr);
|
|
printk("[%s][RadioC_HAL]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, (pu1Byte)FileStartPtr, (int)FileLength, eRFPath);
|
|
}
|
|
break;
|
|
// TODO: 8814AE BB/RF
|
|
case RF92CD_PATH_D:
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if ( priv->pshare->rf_ft_var.use_ext_pa) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_RFREGFILE_RADIO_D_HP_SIZE, (pu1Byte)&FileLength);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_RFREGFILE_RADIO_D_HP_START, (pu1Byte)&FileStartPtr);
|
|
printk("[%s][RadioD_HAL_hp]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, (pu1Byte)FileStartPtr, (int)FileLength, eRFPath);
|
|
} else
|
|
#endif
|
|
{
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_RFREGFILE_RADIO_D_SIZE, (pu1Byte)&FileLength);
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_RFREGFILE_RADIO_D_START, (pu1Byte)&FileStartPtr);
|
|
printk("[%s][RadioD_HAL]\n", __FUNCTION__);
|
|
rtStatus = PHY_ConfigRFWithParaFile(priv, (pu1Byte)FileStartPtr, (int)FileLength, eRFPath);
|
|
}
|
|
break;
|
|
#endif // CONFIG_WLAN_HAL_8814AE
|
|
|
|
default:
|
|
break;
|
|
}
|
|
#endif // end if 0
|
|
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
/*----Restore RFENV control type----*/;
|
|
switch (eRFPath) {
|
|
case RF92CD_PATH_A:
|
|
PHY_SetBBReg(priv, pPhyReg->rfintfs, bRFSI_RFENV, u4RegValue);
|
|
break;
|
|
case RF92CD_PATH_B :
|
|
PHY_SetBBReg(priv, pPhyReg->rfintfs, bRFSI_RFENV << 16, u4RegValue);
|
|
break;
|
|
#ifdef CONFIG_WLAN_HAL_8814AE
|
|
// TODO: 8814AE BB/RF
|
|
case RF92CD_PATH_C:
|
|
break;
|
|
case RF92CD_PATH_D:
|
|
break;
|
|
#endif // CONFIG_WLAN_HAL_8814AE
|
|
case RF92CD_PATH_MAX:
|
|
break;
|
|
}
|
|
}
|
|
|
|
DEBUG_INFO("PHY-RF Initialization Success\n");
|
|
|
|
// RESTORE_INT(x);
|
|
return rtStatus;
|
|
}
|
|
#endif
|
|
|
|
//
|
|
// Description:
|
|
// Set the MAC offset [0x09] and prevent all I/O for a while (about 20us~200us, suggested from SD4 Scott).
|
|
// If the protection is not performed well or the value is not set complete, the next I/O will cause the system hang.
|
|
// Note:
|
|
// This procudure is designed specifically for 8192S and references the platform based variables
|
|
// which violates the stucture of multi-platform.
|
|
// Thus, we shall not extend this procedure to common handler.
|
|
// By Bruce, 2009-01-08.
|
|
//
|
|
unsigned char
|
|
HalSetSysClk8192CD( struct rtl8192cd_priv *priv, unsigned char Data)
|
|
{
|
|
RTL_W8((SYS_CLKR + 1), Data);
|
|
delay_us(200);
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
|
|
#define MAX_RX_DMA_BUFFER_SIZE_8812 0x3E80 //0x3FFF // RX 16K
|
|
|
|
|
|
static void LLT_table_init_8812(struct rtl8192cd_priv *priv)
|
|
{
|
|
unsigned int i;//, maxPage = 255;
|
|
unsigned int count = 0;
|
|
// unsigned int value32; //High+low page number
|
|
unsigned char txpktbuf_bndy = 0xfc, bufBd = 0xff;
|
|
|
|
|
|
printk("=====>LLT_table_init_8812\n");
|
|
|
|
// 12. TXRKTBUG_PG_BNDY 0x114[31:0] = 0x27FF00F6 //TXRKTBUG_PG_BNDY
|
|
RTL_W8(TRXFF_BNDY, txpktbuf_bndy);
|
|
|
|
RTL_W16(TRXFF_BNDY + 2, MAX_RX_DMA_BUFFER_SIZE_8812 - 1);
|
|
|
|
// 13. TDECTRL[15:8] 0x209[7:0] = 0xF6 // Beacon Head for TXDMA
|
|
RTL_W8(TDECTRL + 1, txpktbuf_bndy);
|
|
|
|
// 14. BCNQ_PGBNDY 0x424[7:0] = 0xF6 //BCNQ_PGBNDY
|
|
// 2009/12/03 Why do we set so large boundary. confilct with document V11.
|
|
RTL_W8(TXPKTBUF_BCNQ_BDNY, txpktbuf_bndy);
|
|
RTL_W8(TXPKTBUF_MGQ_BDNY, txpktbuf_bndy);
|
|
|
|
// 15. WMAC_LBK_BF_HD 0x45D[7:0] = 0xF6 //WMAC_LBK_BF_HD
|
|
RTL_W8(TXPKTBUF_WMAC_LBK_BF_HD, txpktbuf_bndy);
|
|
|
|
// Set Tx/Rx page size (Tx must be 128 Bytes, Rx can be 64,128,256,512,1024 bytes)
|
|
// 16. PBP [7:0] = 0x11 // TRX page size
|
|
RTL_W8(PBP, 0x31);
|
|
|
|
// 17. DRV_INFO_SZ = 0x04
|
|
RTL_W8(RX_DRVINFO_SZ, 0x4);
|
|
|
|
// 18. LLT_table_init(Adapter);
|
|
for ( i = 0; i < txpktbuf_bndy - 1; i++) {
|
|
RTL_W32(LLT_INI, ((LLTE_RWM_WR & LLTE_RWM_Mask) << LLTE_RWM_SHIFT) | (i & LLTINI_ADDR_Mask) << LLTINI_ADDR_SHIFT
|
|
| ((i + 1)&LLTINI_HDATA_Mask) << LLTINI_HDATA_SHIFT);
|
|
|
|
count = 0;
|
|
do {
|
|
if (!(RTL_R32(LLT_INI) & ((LLTE_RWM_RD & LLTE_RWM_Mask) << LLTE_RWM_SHIFT)))
|
|
break;
|
|
if (++count >= 100) {
|
|
printk("LLT_init, section 01, i=%d\n", i);
|
|
printk("LLT Polling failed 01 !!!\n");
|
|
return;
|
|
}
|
|
} while (count < 100);
|
|
}
|
|
|
|
RTL_W32(LLT_INI, ((LLTE_RWM_WR & LLTE_RWM_Mask) << LLTE_RWM_SHIFT)
|
|
| ((txpktbuf_bndy - 1)&LLTINI_ADDR_Mask) << LLTINI_ADDR_SHIFT | (255 & LLTINI_HDATA_Mask) << LLTINI_HDATA_SHIFT);
|
|
|
|
count = 0;
|
|
do {
|
|
if (!(RTL_R32(LLT_INI) & ((LLTE_RWM_RD & LLTE_RWM_Mask) << LLTE_RWM_SHIFT)))
|
|
break;
|
|
if (++count >= 100) {
|
|
printk("LLT Polling failed 02 !!!\n");
|
|
return;
|
|
}
|
|
} while (count < 100);
|
|
|
|
|
|
for (i = txpktbuf_bndy; i < bufBd; i++) {
|
|
RTL_W32(LLT_INI, ((LLTE_RWM_WR & LLTE_RWM_Mask) << LLTE_RWM_SHIFT) | (i & LLTINI_ADDR_Mask) << LLTINI_ADDR_SHIFT
|
|
| ((i + 1)&LLTINI_HDATA_Mask) << LLTINI_HDATA_SHIFT);
|
|
|
|
do {
|
|
if (!(RTL_R32(LLT_INI) & ((LLTE_RWM_RD & LLTE_RWM_Mask) << LLTE_RWM_SHIFT)))
|
|
break;
|
|
if (++count >= 100) {
|
|
printk("LLT Polling failed 03 !!!\n");
|
|
return;
|
|
}
|
|
} while (count < 100);
|
|
}
|
|
|
|
RTL_W32(LLT_INI, ((LLTE_RWM_WR & LLTE_RWM_Mask) << LLTE_RWM_SHIFT) | (bufBd & LLTINI_ADDR_Mask) << LLTINI_ADDR_SHIFT
|
|
| (txpktbuf_bndy & LLTINI_HDATA_Mask) << LLTINI_HDATA_SHIFT);
|
|
|
|
count = 0;
|
|
do {
|
|
if (!(RTL_R32(LLT_INI) & ((LLTE_RWM_RD & LLTE_RWM_Mask) << LLTE_RWM_SHIFT)))
|
|
break;
|
|
if (++count >= 100) {
|
|
printk("LLT Polling failed 04 !!!\n");
|
|
return;
|
|
}
|
|
} while (count < 100);
|
|
|
|
|
|
// Set reserved page for each queue
|
|
// 11. RQPN 0x200[31:0] = 0x80BD1C1C // load RQPN
|
|
|
|
if (priv->pmib->dot11OperationEntry.wifi_specific != 0) {
|
|
RTL_W8(RQPN_NPQ, 0x29);
|
|
RTL_W32(RQPN, 0x80a92004);
|
|
} else {
|
|
RTL_W32(RQPN, 0x80EB0808);//0x80cb1010);//0x80711010);//0x80cb1010);
|
|
RTL_W8(RQPN_NPQ, 0x0);
|
|
}
|
|
|
|
printk("LLT_table_init_8812<=====\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
#endif //CONFIG_RTL_8812_SUPPORT
|
|
|
|
static void LLT_table_init(struct rtl8192cd_priv *priv)
|
|
{
|
|
unsigned txpktbufSz, bufBd;
|
|
unsigned int i, count = 0;
|
|
|
|
#ifdef CONFIG_PCI_HCI
|
|
#if 1
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if (priv->pmib->dot11RFEntry.macPhyMode != SINGLEMAC_SINGLEPHY) {
|
|
txpktbufSz = 120; //0x7C
|
|
bufBd = 127;
|
|
} else
|
|
#endif
|
|
{
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
#ifdef DRVMAC_LB
|
|
txpktbufSz = 83; // 0x53
|
|
bufBd = 87;
|
|
#else
|
|
txpktbufSz = 171; // 0xAB
|
|
bufBd = 175;
|
|
#endif
|
|
} else
|
|
#endif
|
|
{
|
|
txpktbufSz = 246; // 0xF6
|
|
bufBd = 255;
|
|
}
|
|
}
|
|
#else
|
|
unsigned txpktbufSz = 252; //174(0xAE) 120(0x78) 252(0xFC)
|
|
#endif
|
|
#endif // CONFIG_PCI_HCI
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) && (defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI))
|
|
if (!priv->pmib->dot11OperationEntry.wifi_specific) {
|
|
txpktbufSz = TX_PAGE_BOUNDARY_88E;
|
|
} else {
|
|
txpktbufSz = WMM_NORMAL_TX_PAGE_BOUNDARY_88E;
|
|
}
|
|
bufBd = LAST_ENTRY_OF_TX_PKT_BUFFER_88E;
|
|
#endif
|
|
|
|
for ( i = 0; i < txpktbufSz - 1; i++) {
|
|
RTL_W32(LLT_INI, ((LLTE_RWM_WR & LLTE_RWM_Mask) << LLTE_RWM_SHIFT) | (i & LLTINI_ADDR_Mask) << LLTINI_ADDR_SHIFT
|
|
| ((i + 1)&LLTINI_HDATA_Mask) << LLTINI_HDATA_SHIFT);
|
|
|
|
count = 0;
|
|
do {
|
|
if (!(RTL_R32(LLT_INI) & ((LLTE_RWM_RD & LLTE_RWM_Mask) << LLTE_RWM_SHIFT)))
|
|
break;
|
|
if (++count >= 100) {
|
|
printk("LLT_init, section 01, i=%d\n", i);
|
|
printk("LLT Polling failed 01 !!!\n");
|
|
return;
|
|
}
|
|
} while (count < 100);
|
|
}
|
|
|
|
RTL_W32(LLT_INI, ((LLTE_RWM_WR & LLTE_RWM_Mask) << LLTE_RWM_SHIFT)
|
|
| ((txpktbufSz - 1)&LLTINI_ADDR_Mask) << LLTINI_ADDR_SHIFT | (255 & LLTINI_HDATA_Mask) << LLTINI_HDATA_SHIFT);
|
|
|
|
count = 0;
|
|
do {
|
|
if (!(RTL_R32(LLT_INI) & ((LLTE_RWM_RD & LLTE_RWM_Mask) << LLTE_RWM_SHIFT)))
|
|
break;
|
|
if (++count >= 100) {
|
|
printk("LLT Polling failed 02 !!!\n");
|
|
return;
|
|
}
|
|
} while (count < 100);
|
|
|
|
|
|
for (i = txpktbufSz; i < bufBd; i++) {
|
|
RTL_W32(LLT_INI, ((LLTE_RWM_WR & LLTE_RWM_Mask) << LLTE_RWM_SHIFT) | (i & LLTINI_ADDR_Mask) << LLTINI_ADDR_SHIFT
|
|
| ((i + 1)&LLTINI_HDATA_Mask) << LLTINI_HDATA_SHIFT);
|
|
|
|
do {
|
|
if (!(RTL_R32(LLT_INI) & ((LLTE_RWM_RD & LLTE_RWM_Mask) << LLTE_RWM_SHIFT)))
|
|
break;
|
|
if (++count >= 100) {
|
|
printk("LLT Polling failed 03 !!!\n");
|
|
return;
|
|
}
|
|
} while (count < 100);
|
|
}
|
|
|
|
RTL_W32(LLT_INI, ((LLTE_RWM_WR & LLTE_RWM_Mask) << LLTE_RWM_SHIFT) | (bufBd & LLTINI_ADDR_Mask) << LLTINI_ADDR_SHIFT
|
|
| (txpktbufSz & LLTINI_HDATA_Mask) << LLTINI_HDATA_SHIFT);
|
|
|
|
count = 0;
|
|
do {
|
|
if (!(RTL_R32(LLT_INI) & ((LLTE_RWM_RD & LLTE_RWM_Mask) << LLTE_RWM_SHIFT)))
|
|
break;
|
|
if (++count >= 100) {
|
|
printk("LLT Polling failed 04 !!!\n");
|
|
return;
|
|
}
|
|
} while (count < 100);
|
|
|
|
// Set reserved page for each queue
|
|
|
|
#ifdef CONFIG_PCI_HCI
|
|
#if 1
|
|
/* normal queue init MUST be previoius of RQPN enable */
|
|
//RTL_W8(RQPN_NPQ, 4); //RQPN_NPQ
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if (priv->pmib->dot11RFEntry.macPhyMode != SINGLEMAC_SINGLEPHY ) {
|
|
if (priv->pmib->dot11OperationEntry.wifi_specific == 1) {
|
|
RTL_W8(RQPN_NPQ, 0x29);
|
|
RTL_W32(RQPN, 0x802f1c04);
|
|
} else {
|
|
//RTL_W32(RQPN, 0x80501010);
|
|
RTL_W8(RQPN_NPQ, 0x10);
|
|
//RTL_W32(RQPN, 0x80630410);
|
|
RTL_W32(RQPN, 0x80600404);
|
|
}
|
|
} else
|
|
#endif
|
|
{
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
//RTL_W8(RQPN_NPQ, 4);
|
|
RTL_W8(RQPN_NPQ, 0x29);
|
|
#ifdef DRVMAC_LB
|
|
RTL_W32(RQPN, 0x80460404);
|
|
#else
|
|
//RTL_W32(RQPN, 0x805d2029);
|
|
if (priv->pmib->dot11OperationEntry.wifi_specific == 1)
|
|
RTL_W32(RQPN, 0x805d2004);
|
|
else
|
|
RTL_W32(RQPN, 0x807d0004);
|
|
#endif
|
|
} else
|
|
#endif
|
|
{
|
|
RTL_W8(RQPN_NPQ, 0x29);
|
|
//RTL_W32(RQPN, 0x809f2929);
|
|
//RTL_W32(RQPN, 0x80a82029);
|
|
#ifdef DRVMAC_LB
|
|
RTL_W8(RQPN_NPQ + 2, 0x4);
|
|
RTL_W32(RQPN, 0x80380404);
|
|
#else
|
|
if (priv->pmib->dot11OperationEntry.wifi_specific == 0) {
|
|
RTL_W32(RQPN, 0x80C50404);
|
|
} else {
|
|
RTL_W32(RQPN, 0x80a92004);
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
#else
|
|
if (txpktbufSz == 120)
|
|
RTL_W32(RQPN, 0x80272828);
|
|
else if (txpktbufSz == 252) {
|
|
//RTL_W32(RQPN, 0x80c31c1c);
|
|
|
|
// Joseph test
|
|
//RTL_W32(RQPN, 0x80838484);
|
|
RTL_W32(RQPN, 0x80bd1c1c);
|
|
} else
|
|
RTL_W32(RQPN, 0x80393a3a);
|
|
#endif
|
|
#endif // CONFIG_PCI_HCI
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) && (defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI))
|
|
_InitQueueReservedPage(priv);
|
|
#endif
|
|
|
|
//RTL_W32(TDECTRL, RTL_R32(TDECTRL)|(txpktbufSz&BCN_HEAD_Mask)<<BCN_HEAD_SHIFT);
|
|
RTL_W8(TXPKTBUF_BCNQ_BDNY, txpktbufSz);
|
|
RTL_W8(TXPKTBUF_MGQ_BDNY, txpktbufSz);
|
|
RTL_W8(TRXFF_BNDY, txpktbufSz);
|
|
RTL_W8(TDECTRL + 1, txpktbufSz);
|
|
|
|
RTL_W8(0x45D, txpktbufSz);
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
static void MacInit_8812(struct rtl8192cd_priv *priv)
|
|
{
|
|
volatile unsigned char bytetmp;
|
|
volatile unsigned int Qbytetmp;
|
|
unsigned short retry;
|
|
printk("CP: MacInit_8812===>>");
|
|
|
|
RTL_W8(RSV_CTRL0, 0x00);
|
|
#if 0
|
|
if(RTL_R8(RSV_CTRL0) == 0)
|
|
RTL_W8(SPS0_CTRL, (RTL_R8(SPS0_CTRL) & 0xc3) | 0x10); // b[5:2] = 4
|
|
else
|
|
panic_printk("MAC reg unlock fail\n");
|
|
#endif
|
|
|
|
//Auto Power Down to CHIP-off State
|
|
bytetmp = RTL_R8(APS_FSMCO + 1);
|
|
bytetmp &= (~BIT(7)); //PlatformEFIORead1Byte(Adapter, REG_APS_FSMCO_8812+1) & (~BIT7)
|
|
RTL_W8(APS_FSMCO + 1, bytetmp);
|
|
|
|
//printk("_eric HalPwrSeqCmdParsing +++ \n");
|
|
//HW power on sequence
|
|
if (!HalPwrSeqCmdParsing(priv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
|
|
PWR_INTF_PCI_MSK, rtl8812_card_enable_flow))
|
|
panic_printk("!!! [%s %d]HalPwrSeqCmdParsing init fail!!!\n", __FUNCTION__, __LINE__);
|
|
|
|
//printk("_eric HalPwrSeqCmdParsing --- \n");
|
|
|
|
#if 0
|
|
RTL_W32(0x500, 0x7f);
|
|
RTL_W32(0x504, 0x7f);
|
|
RTL_W32(0x508, 0x7f);
|
|
RTL_W32(0x50c, 0x7f);
|
|
|
|
printk("0x%x, 0x%x, 0x%x, 0x%x \n", RTL_R32(0x500), RTL_R32(0x504), RTL_R32(0x508), RTL_R32(0x50c));
|
|
#endif
|
|
|
|
// Release MAC IO register reset
|
|
RTL_W32(CR, RTL_R32(CR) | MACRXEN | MACTXEN | SCHEDULE_EN | PROTOCOL_EN
|
|
| RXDMA_EN | TXDMA_EN | HCI_RXDMA_EN | HCI_TXDMA_EN);
|
|
delay_ms(2);
|
|
|
|
RTL_W8(HWSEQ_CTRL, 0x7f);
|
|
delay_ms(2);
|
|
|
|
|
|
// Add for wakeup online
|
|
bytetmp = RTL_R8(SYS_CLKR);
|
|
bytetmp |= BIT(3);
|
|
RTL_W8(SYS_CLKR, bytetmp);
|
|
|
|
bytetmp = RTL_R8(GPIO_MUXCFG + 1);
|
|
bytetmp &= (~BIT(4));
|
|
RTL_W8(GPIO_MUXCFG + 1, bytetmp);
|
|
|
|
|
|
// Release MAC IO register reset
|
|
// 9. CR 0x100[7:0] = 0xFF;
|
|
// 10. CR 0x101[1] = 0x01; // Enable SEC block
|
|
RTL_W16(CR, 0x2ff);
|
|
|
|
|
|
//System init
|
|
LLT_table_init_8812(priv);
|
|
|
|
//printk("\n\n 0x%.x, 0x%.8x \n\n\n", RTL_R32(0x200), RTL_R32(0x204));
|
|
|
|
// Enable interrupt
|
|
RTL_W32(REG_HISR0_8812, 0xffffffff);
|
|
RTL_W32(REG_HISR1_8812, 0xffffffff);
|
|
|
|
Qbytetmp = RTL_R16(REG_TRXDMA_CTRL_8812);
|
|
Qbytetmp &= 0xf;
|
|
Qbytetmp |= 0x5663; //0xF5B1;
|
|
RTL_W16(REG_TRXDMA_CTRL_8812, Qbytetmp);
|
|
|
|
|
|
// Reported Tx status from HW for rate adaptive.
|
|
// 2009/12/03 MH This should be realtive to power on step 14. But in document V11
|
|
// still not contain the description.!!!
|
|
RTL_W8(REG_FWHW_TXQ_CTRL_8812 + 1, 0x1F);
|
|
|
|
// disable earlymode
|
|
RTL_W8(0x4d0, 0x0);
|
|
|
|
#if 0 // 2012-07-06
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
RTL_W32(TRXFF_BNDY, (RTL_R32(TRXFF_BNDY) & 0x0000FFFF) | (0x13ff & RXFF0_BNDY_Mask) << RXFF0_BNDY_SHIFT);
|
|
} else
|
|
#endif
|
|
{
|
|
// Set Rx FF0 boundary : 9K/10K
|
|
RTL_W32(TRXFF_BNDY, (RTL_R32(TRXFF_BNDY) & 0x0000FFFF) | (0x27FF & RXFF0_BNDY_Mask) << RXFF0_BNDY_SHIFT);
|
|
}
|
|
#endif
|
|
// RTL_W8(TDECTRL, 0x11); // need to confirm
|
|
|
|
// Set Network type: ap mod
|
|
//RTL_W32(CR, RTL_R32(CR) | BIT(8));
|
|
|
|
RTL_W32(CR, RTL_R32(CR) | ((NETYPE_AP & NETYPE_Mask) << NETYPE_SHIFT));
|
|
|
|
// Set SLOT time
|
|
RTL_W8(SLOT_TIME, 0x09);
|
|
|
|
// Set AMPDU min space
|
|
RTL_W8(AMPDU_MIN_SPACE, 0); // need to confirm
|
|
|
|
// Set Tx/Rx page size (Tx must be 128 Bytes, Rx can be 64,128,256,512,1024 bytes)
|
|
//RTL_W8(PBP, (PBP_256B&PSTX_Mask)<<PSTX_SHIFT|(PBP_256B&PSRX_Mask)<<PSRX_SHIFT);
|
|
|
|
// Set RCR register
|
|
RTL_W32(RCR, RCR_APP_FCS | RCR_APP_MIC | RCR_APP_ICV | RCR_APP_PHYSTS | RCR_HTC_LOC_CTRL
|
|
| RCR_AMF | RCR_ADF | RCR_ACRC32 | RCR_AB | RCR_AM | RCR_APM | RCR_AAP);
|
|
|
|
// Set Driver info size
|
|
RTL_W8(RX_DRVINFO_SZ, 4);
|
|
|
|
// This part is not in WMAC InitMAC()
|
|
// Set SEC register
|
|
RTL_W16(SECCFG, RTL_R16(SECCFG) & ~(RXUSEDK | TXUSEDK));
|
|
|
|
// Set TCR register
|
|
// RTL_W32(TCR, RTL_R32(TCR)|CRC|CFE_FORM);
|
|
RTL_W32(TCR, RTL_R32(TCR) | CFE_FORM);
|
|
|
|
// Set TCR to avoid deadlock
|
|
RTL_W32(TCR, RTL_R32(TCR) | BIT(15) | BIT(14) | BIT(13) | BIT(12));
|
|
|
|
// Set RRSR (response rate set reg)
|
|
//SetResponseRate();
|
|
// Set RRSR (response rate set reg)
|
|
// Set RRSR to all legacy rate and HT rate
|
|
// CCK rate is supported by default.
|
|
// CCK rate will be filtered out only when associated AP does not support it.
|
|
// Only enable ACK rate to OFDM 24M
|
|
|
|
|
|
{
|
|
/*
|
|
* Set RRSR at here before MACPHY_REG.txt is ready
|
|
*/
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_5G) {
|
|
/*
|
|
* PHY_BAND_5G
|
|
*/
|
|
RTL_W16(RRSR, 0x150);
|
|
} else {
|
|
/*
|
|
* PHY_BAND_2G
|
|
*/
|
|
RTL_W16(RRSR, 0x15F); //Set 0x15F for NDSi Client Connection Issue
|
|
}
|
|
RTL_W8(RRSR + 2, 0);
|
|
|
|
}
|
|
|
|
// Set Spec SIFS (used in NAV)
|
|
// Joseph test
|
|
RTL_W16(SPEC_SIFS_A, (0x10 & SPEC_SIFS_OFDM_Mask) << SPEC_SIFS_OFDM_SHIFT
|
|
| (0x0A & SPEC_SIFS_CCK_Mask) << SPEC_SIFS_CCK_SHIFT);
|
|
|
|
// Set SIFS for CCK
|
|
// Joseph test
|
|
RTL_W16(SIFS_CCK, (0x0E & SIFS_TRX_Mask) << SIFS_TRX_SHIFT | (0x0A & SIFS_CTX_Mask) << SIFS_CTX_SHIFT);
|
|
|
|
// Set SIFS for OFDM
|
|
// Joseph test
|
|
RTL_W16(SIFS_OFDM, (0x0E & SIFS_TRX_Mask) << SIFS_TRX_SHIFT | (0x0A & SIFS_CTX_Mask) << SIFS_CTX_SHIFT);
|
|
|
|
// Set retry limit
|
|
if (priv->pmib->dot11OperationEntry.dot11LongRetryLimit)
|
|
priv->pshare->RL_setting = priv->pmib->dot11OperationEntry.dot11LongRetryLimit & 0xff;
|
|
else {
|
|
#ifdef CLIENT_MODE
|
|
if (priv->pmib->dot11OperationEntry.opmode & WIFI_STATION_STATE)
|
|
priv->pshare->RL_setting = 0x30;
|
|
else
|
|
#endif
|
|
priv->pshare->RL_setting = 0x10;
|
|
}
|
|
if (priv->pmib->dot11OperationEntry.dot11ShortRetryLimit)
|
|
priv->pshare->RL_setting |= ((priv->pmib->dot11OperationEntry.dot11ShortRetryLimit & 0xff) << 8);
|
|
else {
|
|
#ifdef CLIENT_MODE
|
|
if (priv->pmib->dot11OperationEntry.opmode & WIFI_STATION_STATE)
|
|
priv->pshare->RL_setting |= (0x30 << 8);
|
|
else
|
|
#endif
|
|
priv->pshare->RL_setting |= (0x10 << 8);
|
|
}
|
|
RTL_W16(REG_RL_8812, priv->pshare->RL_setting);
|
|
|
|
|
|
#if 0 //eric_8812 ??
|
|
|
|
RTL_W16(TRXDMA_CTRL, (0xC660 | RXSHFT_EN | RXDMA_ARBBW_EN));
|
|
//RTL_W8(PBP, (PBP_256B&PSTX_Mask)<<PSTX_SHIFT|(PBP_256B&PSRX_Mask)<<PSRX_SHIFT);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
//Set Desc Address
|
|
#if 0 //def CONFIG_RTL_8812_SUPPORT
|
|
RTL_W32(BCNQ_DESA, priv->pshare->phw->tx_bufringB_addr);
|
|
RTL_W32(REG_92E_MGQ_DESA, priv->pshare->phw->tx_bufring0_addr);
|
|
RTL_W32(REG_92E_VOQ_DESA, priv->pshare->phw->tx_bufring4_addr);
|
|
RTL_W32(REG_92E_VIQ_DESA, priv->pshare->phw->tx_bufring3_addr);
|
|
RTL_W32(REG_92E_BEQ_DESA, priv->pshare->phw->tx_bufring2_addr);
|
|
RTL_W32(REG_92E_BKQ_DESA, priv->pshare->phw->tx_bufring1_addr);
|
|
RTL_W32(REG_92E_HI0Q_DESA, priv->pshare->phw->tx_bufring5_addr);
|
|
|
|
RTL_W32(REG_92E_HI1Q_DESA, priv->pshare->phw->tx_bufring6_addr);
|
|
RTL_W32(REG_92E_HI2Q_DESA, priv->pshare->phw->tx_bufring7_addr);
|
|
RTL_W32(REG_92E_HI3Q_DESA, priv->pshare->phw->tx_bufring8_addr);
|
|
RTL_W32(REG_92E_HI4Q_DESA, priv->pshare->phw->tx_bufring9_addr);
|
|
RTL_W32(REG_92E_HI5Q_DESA, priv->pshare->phw->tx_bufring10_addr);
|
|
RTL_W32(REG_92E_HI6Q_DESA, priv->pshare->phw->tx_bufring11_addr);
|
|
RTL_W32(REG_92E_HI7Q_DESA, priv->pshare->phw->tx_bufring12_addr);
|
|
|
|
RTL_W32(RX_DESA, priv->pshare->phw->rx_ring_addr);
|
|
printk("0x%x,0x%x,0x%x,0x%x,0x%x\n", priv->pshare->phw->tx_bufring0_addr, priv->pshare->phw->tx_bufring1_addr, priv->pshare->phw->tx_bufring2_addr, priv->pshare->phw->tx_bufring3_addr, priv->pshare->phw->tx_bufring4_addr);
|
|
printk("1clean hw host point,0x%x,0x%x\n", priv->pshare->phw->tx_bufring5_addr, priv->pshare->phw->tx_bufringB_addr);
|
|
printk("2clean hw host point,0x%x,0x%x\n", priv->pshare->phw->tx_bufring6_addr, priv->pshare->phw->tx_bufring7_addr);
|
|
printk("3clean hw host point,0x%x,0x%x\n", priv->pshare->phw->tx_bufring8_addr, priv->pshare->phw->tx_bufring9_addr);
|
|
printk("4clean hw host point,0x%x,0x%x\n", priv->pshare->phw->tx_bufring10_addr, priv->pshare->phw->tx_bufring11_addr);
|
|
printk("5clean hw host point,0x%x,0x%x\n", priv->pshare->phw->tx_bufring12_addr, priv->pshare->phw->tx_bufringB_addr);
|
|
RTL_W32(REG_92E_ACQ_DES_NUM0, (((NUM_TX_DESC & ACQ_92E_VIQ_DESC_NUM_MASK) << ACQ_92E_VIQ_DESC_NUM_SHIFT) | ((NUM_TX_DESC & ACQ_92E_VOQ_DESC_NUM_MASK) << ACQ_92E_VOQ_DESC_NUM_SHIFT)));
|
|
RTL_W32(REG_92E_ACQ_DES_NUM1, (((NUM_TX_DESC & ACQ_92E_BKQ_DESC_NUM_MASK) << ACQ_92E_BKQ_DESC_NUM_SHIFT) | ((NUM_TX_DESC & ACQ_92E_BEQ_DESC_NUM_MASK) << ACQ_92E_BEQ_DESC_NUM_SHIFT)));
|
|
RTL_W32(REG_92E_HQ_DES_NUM0, (((NUM_TX_DESC & ACQ_92E_H1Q_DESC_NUM_MASK) << ACQ_92E_H1Q_DESC_NUM_SHIFT) | ((NUM_TX_DESC & ACQ_92E_H0Q_DESC_NUM_MASK) << ACQ_92E_H0Q_DESC_NUM_SHIFT)));
|
|
RTL_W32(REG_92E_HQ_DES_NUM1, (((NUM_TX_DESC & ACQ_92E_H3Q_DESC_NUM_MASK) << ACQ_92E_H3Q_DESC_NUM_SHIFT) | ((NUM_TX_DESC & ACQ_92E_H2Q_DESC_NUM_MASK) << ACQ_92E_H2Q_DESC_NUM_SHIFT)));
|
|
RTL_W32(REG_92E_HQ_DES_NUM2, (((NUM_TX_DESC & ACQ_92E_H5Q_DESC_NUM_MASK) << ACQ_92E_H5Q_DESC_NUM_SHIFT) | ((NUM_TX_DESC & ACQ_92E_H4Q_DESC_NUM_MASK) << ACQ_92E_H4Q_DESC_NUM_SHIFT)));
|
|
RTL_W32(REG_92E_HQ_DES_NUM3, (((NUM_TX_DESC & ACQ_92E_H7Q_DESC_NUM_MASK) << ACQ_92E_H7Q_DESC_NUM_SHIFT) | ((NUM_TX_DESC & ACQ_92E_H6Q_DESC_NUM_MASK) << ACQ_92E_H6Q_DESC_NUM_SHIFT)));
|
|
|
|
RTL_W32(REG_92E_ACQ_DES_NUM2, (((NUM_RX_DESC & ACQ_92E_RXQ_DESC_NUM_MASK) << ACQ_92E_RXQ_DESC_NUM_SHIFT) | ((NUM_TX_DESC & ACQ_92E_MGQ_DESC_NUM_MASK) << ACQ_92E_MGQ_DESC_NUM_SHIFT)));
|
|
//RTL_W32(0x3be, 64);
|
|
RTL_W32(REG_92E_TSFT_CLRQ, CLRQ_92E_ALL_IDX);
|
|
RTL_W8(REG_92E_UPD_HGQMD, RTL_R8(REG_92E_UPD_HGQMD) | BIT(5) | BIT(4));
|
|
//RTL_W16(0x3be, 64);
|
|
//RTL_W16(0x3b8, 64);
|
|
//RTL_W8(0x229, 0xf6);
|
|
//RTL_W8(0x457, 0xf6);
|
|
//RTL_W8(0x5a7,0xff);
|
|
#else
|
|
RTL_W32(BCNQ_DESA, priv->pshare->phw->tx_ringB_addr);
|
|
RTL_W32(MGQ_DESA, priv->pshare->phw->tx_ring0_addr);
|
|
RTL_W32(VOQ_DESA, priv->pshare->phw->tx_ring4_addr);
|
|
RTL_W32(VIQ_DESA, priv->pshare->phw->tx_ring3_addr);
|
|
RTL_W32(BEQ_DESA, priv->pshare->phw->tx_ring2_addr);
|
|
printk("BEQ_DESA = 0x%08x 0x%08x \n", RTL_R32(BEQ_DESA), (unsigned int)priv->pshare->phw->tx_ring2_addr);
|
|
RTL_W32(BKQ_DESA, priv->pshare->phw->tx_ring1_addr);
|
|
RTL_W32(HQ_DESA, priv->pshare->phw->tx_ring5_addr);
|
|
RTL_W32(RX_DESA, priv->pshare->phw->ring_dma_addr);
|
|
#endif
|
|
|
|
// RTL_W32(RCDA, priv->pshare->phw->rxcmd_ring_addr);
|
|
// RTL_W32(TCDA, priv->pshare->phw->txcmd_ring_addr);
|
|
// RTL_W32(TCDA, phw->tx_ring5_addr);
|
|
// 2009/03/13 MH Prevent incorrect DMA write after accident reset !!!
|
|
// RTL_W16(CMDR, 0x37FC);
|
|
|
|
|
|
RTL_W32(PCIE_CTRL_REG, RTL_R32(PCIE_CTRL_REG) | (0x07 & MAX_RXDMA_Mask) << MAX_RXDMA_SHIFT
|
|
| (0x07 & MAX_TXDMA_Mask) << MAX_TXDMA_SHIFT | BCNQSTOP);
|
|
if(priv->pmib->dot11nConfigEntry.dot11nUse40M == HT_CHANNEL_WIDTH_5){
|
|
RTL_W8(0x303,0x80);
|
|
}
|
|
// 20090928 Joseph
|
|
// Reconsider when to do this operation after asking HWSD.
|
|
RTL_W8(APSD_CTRL, RTL_R8(APSD_CTRL) & ~ BIT(6));
|
|
retry = 0;
|
|
do {
|
|
retry++;
|
|
bytetmp = RTL_R8(APSD_CTRL);
|
|
} while ((retry < 200) && (bytetmp & BIT(7))); //polling until BIT7 is 0. by tynli
|
|
|
|
if (bytetmp & BIT(7)) {
|
|
DEBUG_ERR("%s ERROR: APSD_CTRL=0x%02X\n", __FUNCTION__, bytetmp);
|
|
}
|
|
// disable BT_enable
|
|
RTL_W8(GPIO_MUXCFG, 0);
|
|
|
|
|
|
|
|
printk("DONE\n");
|
|
}
|
|
#endif
|
|
|
|
|
|
#if(CONFIG_WLAN_NOT_HAL_EXIST==1)
|
|
static int MacInit(struct rtl8192cd_priv *priv)
|
|
{
|
|
volatile unsigned char bytetmp;
|
|
unsigned short retry;
|
|
|
|
DEBUG_INFO("CP: MacInit===>>");
|
|
|
|
#ifdef CONFIG_PCI_HCI
|
|
|
|
RTL_W8(RSV_CTRL0, 0x00);
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv)==VERSION_8188E) {
|
|
#if 0
|
|
if(RTL_R8(RSV_CTRL0) == 0)
|
|
RTL_W8(SPS0_CTRL, (RTL_R8(SPS0_CTRL) & 0xc3) | 0x10); // b[5:2] = 4
|
|
else
|
|
panic_printk("MAC reg unlock fail\n");
|
|
#endif
|
|
if (!HalPwrSeqCmdParsing(priv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
|
|
PWR_INTF_PCI_MSK, rtl8188E_card_enable_flow))
|
|
panic_printk("%s %d, HalPwrSeqCmdParsing init fail!!!\n", __FUNCTION__, __LINE__);
|
|
|
|
#ifdef SUPPORT_RTL8188E_TC
|
|
check_RTL8188E_testChip(priv);
|
|
#endif
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_8812_SUPPORT //_eric_8812 mac init
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
//set RF register as PI mode
|
|
RTL_W8(0xc00, RTL_R8(0xc00) | BIT(2));
|
|
RTL_W8(0xe00, RTL_R8(0xe00) | BIT(2));
|
|
|
|
MacInit_8812(priv);
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
RTL_W8(SYS_FUNC_EN, FEN_PPLL | FEN_PCIEA | FEN_DIO_PCIE);
|
|
|
|
/* Enable PLL Power (LDOA15V) */
|
|
RTL_W8(LDOA15_CTRL, LDA15_OBUF | LDA15_EN);
|
|
|
|
/* advise by MAC team */
|
|
RTL_W8(LDOHCI12_CTRL, 0x1f);
|
|
|
|
#ifndef NOT_RTK_BSP
|
|
#if !defined(CONFIG_RTL_8198) && !defined(CONFIG_RTL_819XD) && !defined(CONFIG_RTL_8196E) && !defined(CONFIG_RTL_8198B)
|
|
{
|
|
/* temp modifying, for 96c pocket ap better performance */
|
|
volatile unsigned int Qbytetmp;
|
|
Qbytetmp = REG32(0xb8000048);
|
|
Qbytetmp &= ~(BIT(10) | BIT(8));
|
|
Qbytetmp |= BIT(19);
|
|
REG32(0xb8000048) = Qbytetmp;
|
|
}
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
#endif
|
|
|
|
// Power on when re-enter from IPS/Radio off/card disable
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
volatile unsigned int Qbytetmp;
|
|
RTL_W8(AFE_XTAL_CTRL, RTL_R8(AFE_XTAL_CTRL) | BIT(0));
|
|
|
|
Qbytetmp = RTL_R16(APS_FSMCO);
|
|
Qbytetmp &= 0xE7ff;
|
|
Qbytetmp |= 0x0800;
|
|
RTL_W16(APS_FSMCO, Qbytetmp);
|
|
|
|
while (!((Qbytetmp = RTL_R32(APS_FSMCO)) & 0x00020000));
|
|
|
|
Qbytetmp = RTL_R16(APS_FSMCO);
|
|
Qbytetmp &= 0x7FFF;
|
|
RTL_W16(APS_FSMCO, Qbytetmp);
|
|
|
|
Qbytetmp = RTL_R16(APS_FSMCO);
|
|
Qbytetmp &= 0xE7ff;
|
|
Qbytetmp |= 0x0000;
|
|
RTL_W16(APS_FSMCO, Qbytetmp);
|
|
} else
|
|
#endif
|
|
{
|
|
#ifdef CONFIG_RTL8672
|
|
RTL_W8(AFE_XTAL_CTRL, RTL_R8(AFE_XTAL_CTRL) | BIT(0)); // enable XTAL
|
|
#else
|
|
/* just don't change BIT(1),Crystal engine setting refine*/
|
|
//RTL_W8(AFE_XTAL_CTRL, 0x0d); // enable XTAL // clk inverted
|
|
#endif
|
|
RTL_W8(SPS0_CTRL, 0x2b); // enable SPS into PWM
|
|
}
|
|
delay_ms(1);
|
|
|
|
#if 0
|
|
// Enable AFE BANDGAP
|
|
RTL_W8(AFE_MISC, RTL_R8(AFE_MISC) | AFE_BGEN);
|
|
DEBUG_INFO("AFE_MISC = 0x%02x\n", RTL_R8(AFE_MISC));
|
|
|
|
// Enable AFE MBIAS
|
|
RTL_W8(AFE_MISC, RTL_R8(AFE_MISC) | AFE_MBEN);
|
|
DEBUG_INFO("AFE_MISC = 0x%02x\n", RTL_R8(AFE_MISC));
|
|
|
|
// Enable PLL Power (LDOA15V)
|
|
#ifdef CONFIG_RTL_92C_SUPPORT //#ifndef CONFIG_RTL_92D_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C))
|
|
RTL_W8(LDOA15_CTRL, RTL_R8(LDOA15_CTRL) | LDA15_EN);
|
|
#endif
|
|
|
|
// Enable VDDCORE (LDOD12V)
|
|
RTL_W8(LDOV12D_CTRL, RTL_R8(LDOV12D_CTRL) | LDV12_EN);
|
|
|
|
// Release XTAL Gated for AFE PLL
|
|
// RTL_W32(AFE_XTAL_CTRL, RTL_R32(AFE_XTAL_CTRL)|XTAL_GATE_AFE);
|
|
RTL_W32(AFE_XTAL_CTRL, RTL_R32(AFE_XTAL_CTRL) & ~XTAL_GATE_AFE);
|
|
|
|
// Enable AFE PLL
|
|
RTL_W32(AFE_PLL_CTRL, RTL_R32(AFE_PLL_CTRL) | APLL_EN);
|
|
|
|
// Release Isolation AFE PLL & MD
|
|
RTL_W16(SYS_ISO_CTRL, RTL_R16(SYS_ISO_CTRL) & ~ISO_MD2PP);
|
|
|
|
// Enable WMAC Clock
|
|
RTL_W16(SYS_CLKR, RTL_R16(SYS_CLKR) | MAC_CLK_EN | SEC_CLK_EN);
|
|
|
|
// Release WMAC reset & register reset
|
|
RTL_W16(SYS_FUNC_EN, RTL_R16(SYS_FUNC_EN) | FEN_MREGEN | FEN_DCORE);
|
|
|
|
// Release IMEM Isolation
|
|
RTL_W16(SYS_ISO_CTRL, RTL_R16(SYS_ISO_CTRL) & ~(BIT(10) | ISO_DIOR)); // need to confirm
|
|
|
|
/* // need double setting???
|
|
// Enable MAC IO registers
|
|
RTL_W16(SYS_FUNC_EN, RTL_R16(SYS_FUNC_EN)|FEN_MREGEN);
|
|
*/
|
|
|
|
// Switch HWFW select
|
|
RTL_W16(SYS_CLKR, (RTL_R16(SYS_CLKR) | CLKR_80M_SSC_DIS) & ~BIT(6)); // need to confirm
|
|
#else
|
|
// auto enable WLAN
|
|
|
|
// Power On Reset for MAC Block
|
|
bytetmp = RTL_R8(APS_FSMCO + 1) | BIT(0);
|
|
delay_us(2);
|
|
RTL_W8(APS_FSMCO + 1, bytetmp);
|
|
delay_us(2);
|
|
|
|
bytetmp = RTL_R8(APS_FSMCO + 1);
|
|
delay_us(2);
|
|
retry = 0;
|
|
while ((bytetmp & BIT(0)) && retry < 1000) {
|
|
retry++;
|
|
delay_us(50);
|
|
bytetmp = RTL_R8(APS_FSMCO + 1);
|
|
delay_us(50);
|
|
}
|
|
|
|
if (bytetmp & BIT(0)) {
|
|
DEBUG_ERR("%s ERROR: auto enable WLAN failed!!(0x%02X)\n", __FUNCTION__, bytetmp);
|
|
}
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E)
|
|
RTL_W16(SYS_FUNC_EN, RTL_R16(SYS_FUNC_EN) & ~FEN_CPUEN);
|
|
else /*Enable Radio off, GPIO, and LED function*/
|
|
#endif
|
|
RTL_W16(APS_FSMCO, 0x1012); // when enable HWPDN
|
|
|
|
// release RF digital isolation
|
|
#if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT)
|
|
if (
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
(GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)
|
|
#endif
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
||
|
|
#endif
|
|
(GET_CHIP_VER(priv) == VERSION_8192D)
|
|
#endif
|
|
)
|
|
RTL_W8(SYS_ISO_CTRL + 1, 0x82);
|
|
#endif
|
|
|
|
delay_us(2);
|
|
#endif
|
|
|
|
// Release MAC IO register reset
|
|
RTL_W32(CR, RTL_R32(CR) | MACRXEN | MACTXEN | SCHEDULE_EN | PROTOCOL_EN
|
|
| RXDMA_EN | TXDMA_EN | HCI_RXDMA_EN | HCI_TXDMA_EN);
|
|
|
|
#endif // CONFIG_PCI_HCI
|
|
|
|
#ifdef CONFIG_USB_HCI
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if (rtl8192cu_InitPowerOn(priv) == FALSE)
|
|
return FALSE;
|
|
#elif defined(CONFIG_RTL_88E_SUPPORT)
|
|
if (rtl8188eu_InitPowerOn(priv) == FALSE)
|
|
return FALSE;
|
|
#endif
|
|
#endif // CONFIG_USB_HCI
|
|
|
|
#if defined(CONFIG_SDIO_HCI) && defined(CONFIG_RTL_88E_SUPPORT)
|
|
if (rtl8188es_InitPowerOn(priv) == FALSE)
|
|
return FALSE;
|
|
#endif
|
|
|
|
//System init
|
|
LLT_table_init(priv);
|
|
|
|
// Clear interrupt and enable interrupt
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
RTL_W32(REG_88E_HISR, 0xFFFFFFFF);
|
|
RTL_W32(REG_88E_HISRE, 0xFFFFFFFF);
|
|
} else
|
|
#endif
|
|
{
|
|
RTL_W32(HISR, 0xFFFFFFFF);
|
|
RTL_W16(HISRE, 0xFFFF);
|
|
}
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
|
|
switch (priv->pmib->dot11RFEntry.macPhyMode) {
|
|
case SINGLEMAC_SINGLEPHY:
|
|
RTL_W8(MAC_PHY_CTRL_T, 0xfc);
|
|
RTL_W8(MAC_PHY_CTRL_MP, 0xfc); //enable super mac
|
|
RTL_W32(AGGLEN_LMT, 0xb972a841);
|
|
break;
|
|
case DUALMAC_SINGLEPHY:
|
|
RTL_W8(MAC_PHY_CTRL_T, 0xf1);
|
|
RTL_W8(MAC_PHY_CTRL_MP, 0xf1); //enable supermac
|
|
RTL_W32(AGGLEN_LMT, 0x54325521);
|
|
break;
|
|
case DUALMAC_DUALPHY:
|
|
RTL_W8(MAC_PHY_CTRL_T, 0xf3);
|
|
RTL_W8(MAC_PHY_CTRL_MP, 0xf3); //DMDP
|
|
RTL_W32(AGGLEN_LMT, 0x54325521);
|
|
break;
|
|
default:
|
|
DEBUG_ERR("Unknown 92D macPhyMode selection!\n");
|
|
}
|
|
/*
|
|
* Set Rx FF0 boundary, half sized for testchip & dual MAC
|
|
*/
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if (priv->pmib->dot11RFEntry.macPhyMode != SINGLEMAC_SINGLEPHY)
|
|
RTL_W32(TRXFF_BNDY, (RTL_R32(TRXFF_BNDY) & 0x0000FFFF) | (0x13ff & RXFF0_BNDY_Mask) << RXFF0_BNDY_SHIFT);
|
|
else
|
|
#endif
|
|
RTL_W32(TRXFF_BNDY, (RTL_R32(TRXFF_BNDY) & 0x0000FFFF) | (0x27ff & RXFF0_BNDY_Mask) << RXFF0_BNDY_SHIFT);
|
|
|
|
} else
|
|
#endif
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
RTL_W32(TRXFF_BNDY, (RTL_R32(TRXFF_BNDY) & 0x0000FFFF) | (0x25ff & RXFF0_BNDY_Mask) << RXFF0_BNDY_SHIFT);
|
|
} else
|
|
#endif
|
|
{
|
|
// Set Rx FF0 boundary : 9K/10K
|
|
RTL_W32(TRXFF_BNDY, (RTL_R32(TRXFF_BNDY) & 0x0000FFFF) | (0x27FF & RXFF0_BNDY_Mask) << RXFF0_BNDY_SHIFT);
|
|
}
|
|
|
|
#ifdef CONFIG_PCI_HCI
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if (IS_TEST_CHIP(priv)) {
|
|
// Set High priority queue select : HPQ:BC/H/VO/VI/MG, LPQ:BE/BK
|
|
// [5]:H, [4]:MG, [3]:BK, [2]:BE, [1]:VI, [0]:VO
|
|
RTL_W16(TRXDMA_CTRL, ((HPQ_SEL_HIQ | HPQ_SEL_MGQ | HPQ_SEL_VIQ | HPQ_SEL_VOQ)&HPQ_SEL_Mask) << HPQ_SEL_SHIFT);
|
|
|
|
/*
|
|
* Enable ampdu rx check error, and enable rx byte shift
|
|
*/
|
|
RTL_W8(TRXDMA_CTRL, RTL_R8(TRXDMA_CTRL) | RXSHFT_EN | RXDMA_ARBBW_EN);
|
|
} else
|
|
#endif
|
|
{
|
|
#if 0//def CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E)
|
|
RTL_W16(TRXDMA_CTRL, (/*0xF5B1*/ 0xB5B1 | RXSHFT_EN | RXDMA_ARBBW_EN));
|
|
else
|
|
#endif
|
|
//RTL_W16(TRXDMA_CTRL, (0xB770 | RXSHFT_EN | RXDMA_ARBBW_EN));
|
|
|
|
#if defined(CONFIG_RTL_ULINKER_BRSC)
|
|
RTL_W16(TRXDMA_CTRL, (0x5660 | RXDMA_ARBBW_EN)); //disable IP(layer3) auto aligne to 4bytes
|
|
#else
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E && priv->pmib->dot11OperationEntry.wifi_specific != 1)
|
|
RTL_W16(TRXDMA_CTRL, (0x56a0 | RXSHFT_EN | RXDMA_ARBBW_EN));
|
|
else
|
|
#endif
|
|
RTL_W16(TRXDMA_CTRL, (0x5660 | RXSHFT_EN | RXDMA_ARBBW_EN));
|
|
#endif
|
|
}
|
|
#endif // CONFIG_PCI_HCI
|
|
|
|
#ifdef CONFIG_USB_HCI
|
|
_InitQueuePriority(priv);
|
|
|
|
// Enable TXDMA to drop incorrect Bulk out packet
|
|
RTL_W32(TXDMA_OFFSET_CHK, RTL_R32(TXDMA_OFFSET_CHK) | DROP_DATA_EN);
|
|
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if (BOARD_USB_DONGLE == priv->pshare->BoardType)
|
|
priv->pmib->dot11RFEntry.trswitch = 1;
|
|
#endif
|
|
#endif // CONFIG_USB_HCI
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) && defined(CONFIG_SDIO_HCI)
|
|
_InitQueuePriority(priv);
|
|
#endif
|
|
|
|
// RTL_W8(TDECTRL, 0x11); // need to confirm
|
|
|
|
// Set Network type: ap mode
|
|
RTL_W32(CR, RTL_R32(CR) | ((NETYPE_AP & NETYPE_Mask) << NETYPE_SHIFT));
|
|
|
|
// Set SLOT time
|
|
RTL_W8(SLOT_TIME, 0x09);
|
|
|
|
// Set AMPDU min space
|
|
RTL_W8(AMPDU_MIN_SPACE, 0); // need to confirm
|
|
|
|
// Set Tx/Rx page size (Tx must be 128 Bytes, Rx can be 64,128,256,512,1024 bytes)
|
|
RTL_W8(PBP, (PBP_128B & PSTX_Mask) << PSTX_SHIFT | (PBP_128B & PSRX_Mask) << PSRX_SHIFT);
|
|
|
|
// Set RCR register
|
|
RTL_W32(RCR, RCR_APP_FCS | RCR_APP_MIC | RCR_APP_ICV | RCR_APP_PHYSTS | RCR_HTC_LOC_CTRL
|
|
| RCR_AMF | RCR_ADF | RCR_ACRC32 | RCR_AB | RCR_AM | RCR_APM | RCR_AAP);
|
|
|
|
#if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D || GET_CHIP_VER(priv) == VERSION_8192C || GET_CHIP_VER(priv) == VERSION_8188C) {
|
|
RTL_W32(RCR, RTL_R32(RCR) | RCR_AICV); /*force accept icv error packet in 92D, 92C and 88C*/
|
|
}
|
|
#endif
|
|
|
|
// Set Driver info size
|
|
RTL_W8(RX_DRVINFO_SZ, 4);
|
|
|
|
// This part is not in WMAC InitMAC()
|
|
// Set SEC register
|
|
RTL_W16(SECCFG, RTL_R16(SECCFG) & ~(RXUSEDK | TXUSEDK));
|
|
|
|
// Set TCR register
|
|
// RTL_W32(TCR, RTL_R32(TCR)|CRC|CFE_FORM);
|
|
RTL_W32(TCR, RTL_R32(TCR) | CFE_FORM);
|
|
|
|
// Set TCR to avoid deadlock
|
|
RTL_W32(TCR, RTL_R32(TCR) | BIT(15) | BIT(14) | BIT(13) | BIT(12));
|
|
|
|
// Set RRSR (response rate set reg)
|
|
//SetResponseRate();
|
|
// Set RRSR (response rate set reg)
|
|
// Set RRSR to all legacy rate and HT rate
|
|
// CCK rate is supported by default.
|
|
// CCK rate will be filtered out only when associated AP does not support it.
|
|
// Only enable ACK rate to OFDM 24M
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
/*
|
|
* Set RRSR at here before MACPHY_REG.txt is ready
|
|
*/
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_5G) {
|
|
/*
|
|
* PHY_BAND_5G
|
|
*/
|
|
RTL_W16(RRSR, 0x150);
|
|
} else {
|
|
/*
|
|
* PHY_BAND_2G
|
|
*/
|
|
RTL_W16(RRSR, 0x15F); //Set 0x15F for NDSi Client Connection Issue
|
|
}
|
|
RTL_W8(RRSR + 2, 0);
|
|
|
|
RTL_W8(RCR, 0x0e); //follow 92c MACPHY_REG
|
|
RTL_W8(RCR + 1, 0x2a); //follow 92c MACPHY_REG
|
|
} else
|
|
#endif
|
|
{
|
|
RTL_W16(RRSR, 0xFFFF);
|
|
RTL_W8(RRSR + 2, 0xFF);
|
|
}
|
|
|
|
// Set Spec SIFS (used in NAV)
|
|
// Joseph test
|
|
RTL_W16(SPEC_SIFS_A, (0x0A & SPEC_SIFS_OFDM_Mask) << SPEC_SIFS_OFDM_SHIFT
|
|
| (0x0A & SPEC_SIFS_CCK_Mask) << SPEC_SIFS_CCK_SHIFT);
|
|
|
|
// Set SIFS for CCK
|
|
// Joseph test
|
|
RTL_W16(SIFS_CCK, (0x0A & SIFS_TRX_Mask) << SIFS_TRX_SHIFT | (0x0A & SIFS_CTX_Mask) << SIFS_CTX_SHIFT);
|
|
|
|
// Set SIFS for OFDM
|
|
// Joseph test
|
|
RTL_W16(SIFS_OFDM, (0x0A & SIFS_TRX_Mask) << SIFS_TRX_SHIFT | (0x0A & SIFS_CTX_Mask) << SIFS_CTX_SHIFT);
|
|
|
|
// Set retry limit
|
|
if (priv->pmib->dot11OperationEntry.dot11LongRetryLimit)
|
|
priv->pshare->RL_setting = priv->pmib->dot11OperationEntry.dot11LongRetryLimit & 0xff;
|
|
else {
|
|
#ifdef CLIENT_MODE
|
|
if (priv->pmib->dot11OperationEntry.opmode & WIFI_STATION_STATE)
|
|
priv->pshare->RL_setting = 0x30;
|
|
else
|
|
#endif
|
|
priv->pshare->RL_setting = 0x10;
|
|
}
|
|
if (priv->pmib->dot11OperationEntry.dot11ShortRetryLimit)
|
|
priv->pshare->RL_setting |= ((priv->pmib->dot11OperationEntry.dot11ShortRetryLimit & 0xff) << 8);
|
|
else {
|
|
#ifdef CLIENT_MODE
|
|
if (priv->pmib->dot11OperationEntry.opmode & WIFI_STATION_STATE)
|
|
priv->pshare->RL_setting |= (0x30 << 8);
|
|
else
|
|
#endif
|
|
priv->pshare->RL_setting |= (0x10 << 8);
|
|
}
|
|
RTL_W16(RL, priv->pshare->RL_setting);
|
|
|
|
#ifdef CONFIG_PCI_HCI
|
|
//Set Desc Address
|
|
RTL_W32(BCNQ_DESA, priv->pshare->phw->tx_ringB_addr);
|
|
RTL_W32(MGQ_DESA, priv->pshare->phw->tx_ring0_addr);
|
|
RTL_W32(VOQ_DESA, priv->pshare->phw->tx_ring4_addr);
|
|
RTL_W32(VIQ_DESA, priv->pshare->phw->tx_ring3_addr);
|
|
RTL_W32(BEQ_DESA, priv->pshare->phw->tx_ring2_addr);
|
|
RTL_W32(BKQ_DESA, priv->pshare->phw->tx_ring1_addr);
|
|
RTL_W32(HQ_DESA, priv->pshare->phw->tx_ring5_addr);
|
|
RTL_W32(RX_DESA, priv->pshare->phw->ring_dma_addr);
|
|
// RTL_W32(RCDA, priv->pshare->phw->rxcmd_ring_addr);
|
|
// RTL_W32(TCDA, priv->pshare->phw->txcmd_ring_addr);
|
|
// RTL_W32(TCDA, phw->tx_ring5_addr);
|
|
// 2009/03/13 MH Prevent incorrect DMA write after accident reset !!!
|
|
// RTL_W16(CMDR, 0x37FC);
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D)
|
|
RTL_W32(PCIE_CTRL_REG, (RTL_R32(PCIE_CTRL_REG) & 0x00ffffff) | (0x03 & MAX_RXDMA_Mask) << MAX_RXDMA_SHIFT
|
|
| (0x03 & MAX_TXDMA_Mask) << MAX_TXDMA_SHIFT | BCNQSTOP);
|
|
else
|
|
#endif
|
|
RTL_W32(PCIE_CTRL_REG, RTL_R32(PCIE_CTRL_REG) | (0x07 & MAX_RXDMA_Mask) << MAX_RXDMA_SHIFT
|
|
| (0x07 & MAX_TXDMA_Mask) << MAX_TXDMA_SHIFT | BCNQSTOP);
|
|
#endif // CONFIG_PCI_HCI
|
|
|
|
// 20090928 Joseph
|
|
// Reconsider when to do this operation after asking HWSD.
|
|
RTL_W8(APSD_CTRL, RTL_R8(APSD_CTRL) & ~ BIT(6));
|
|
retry = 0;
|
|
do {
|
|
retry++;
|
|
bytetmp = RTL_R8(APSD_CTRL);
|
|
} while ((retry < 200) && (bytetmp & BIT(7))); //polling until BIT7 is 0. by tynli
|
|
|
|
if (bytetmp & BIT(7)) {
|
|
DEBUG_ERR("%s ERROR: APSD_CTRL=0x%02X\n", __FUNCTION__, bytetmp);
|
|
}
|
|
// disable BT_enable
|
|
RTL_W8(GPIO_MUXCFG, 0);
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
RTL_W16(TCR, RTL_R16(TCR) | WMAC_TCR_ERRSTEN3 | WMAC_TCR_ERRSTEN2
|
|
| WMAC_TCR_ERRSTEN1 | WMAC_TCR_ERRSTEN0);
|
|
/*
|
|
* For 92DE,Mac0 and Mac1 power off.
|
|
* 0x1F BIT6: 0 mac0 off, 1: mac0 on
|
|
* BIT7: 0 mac1 off, 1: mac1 on.
|
|
*/
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if (priv->pshare->wlandev_idx == 0)
|
|
#endif
|
|
{
|
|
RTL_W8(RSV_MAC0_CTRL, RTL_R8(RSV_MAC0_CTRL) | MAC0_EN);
|
|
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_5G)
|
|
RTL_W8(RSV_MAC0_CTRL, RTL_R8(RSV_MAC0_CTRL) & (~BAND_STAT));
|
|
else
|
|
RTL_W8(RSV_MAC0_CTRL, RTL_R8(RSV_MAC0_CTRL) | BAND_STAT);
|
|
}
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if (priv->pshare->wlandev_idx == 1) {
|
|
RTL_W8(RSV_MAC1_CTRL, RTL_R8(RSV_MAC1_CTRL) | MAC1_EN);
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_5G)
|
|
RTL_W8(RSV_MAC1_CTRL, RTL_R8(RSV_MAC1_CTRL) & (~BAND_STAT));
|
|
else
|
|
RTL_W8(RSV_MAC1_CTRL, RTL_R8(RSV_MAC1_CTRL) | BAND_STAT);
|
|
}
|
|
#endif
|
|
}
|
|
#endif //CONFIG_RTL_92D_SUPPORT
|
|
|
|
#if defined(CONFIG_USB_HCI)
|
|
InitUsbAggregationSetting(priv);
|
|
#elif defined(CONFIG_SDIO_HCI)
|
|
_initSdioAggregationSetting(priv);
|
|
#endif
|
|
|
|
#ifdef CONFIG_EXT_CLK_26M
|
|
_InitClockTo26MHz(priv);
|
|
#endif
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) && (defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI))
|
|
// Enable MACTXEN/MACRXEN block
|
|
RTL_W32(CR, RTL_R32(CR) | (MACTXEN | MACRXEN));
|
|
#endif
|
|
|
|
DEBUG_INFO("DONE\n");
|
|
|
|
return TRUE;
|
|
} // MacInit
|
|
#else
|
|
static int MacInit(struct rtl8192cd_priv *priv)
|
|
{
|
|
return TRUE;
|
|
}
|
|
#endif//CONFIG_WLAN_NOT_HAL_EXIST
|
|
|
|
#if(CONFIG_WLAN_NOT_HAL_EXIST==1)
|
|
static void MacConfig(struct rtl8192cd_priv *priv)
|
|
{
|
|
//RTL_W8(INIRTS_RATE_SEL, 0x8); // 24M
|
|
priv->pshare->phw->RTSInitRate_Candidate = priv->pshare->phw->RTSInitRate = 0x8; // 24M
|
|
RTL_W8(INIRTS_RATE_SEL, priv->pshare->phw->RTSInitRate);
|
|
|
|
// 2007/02/07 Mark by Emily becasue we have not verify whether this register works
|
|
//For 92C,which reg?
|
|
// RTL_W8(BWOPMODE, BW_20M); // set if work at 20m
|
|
|
|
// Ack timeout.
|
|
if ((priv->pmib->miscEntry.ack_timeout > 0) && (priv->pmib->miscEntry.ack_timeout < 0xff))
|
|
RTL_W8(ACKTO, priv->pmib->miscEntry.ack_timeout);
|
|
else
|
|
RTL_W8(ACKTO, 0x40);
|
|
|
|
// clear for mbid beacon tx
|
|
RTL_W8(MULTI_BCNQ_EN, 0);
|
|
RTL_W8(MULTI_BCNQ_OFFSET, 0);
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192D) && (priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_5G)) {
|
|
RTL_W32(ARFR0, 0xFF010); // 40M mode
|
|
RTL_W32(ARFR1, 0xFF010); // 20M mode
|
|
} else
|
|
#endif
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) && (defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI))
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E)
|
|
{
|
|
RTL_W32(ARFR0, 0xFF00F); // 40M mode
|
|
RTL_W32(ARFR1, 0xFF00F); // 20M mode
|
|
} else
|
|
#endif
|
|
{
|
|
// set user defining ARFR table for 11n 1T
|
|
RTL_W32(ARFR0, 0xFF015); // 40M mode
|
|
RTL_W32(ARFR1, 0xFF005); // 20M mode
|
|
}
|
|
/*
|
|
* Disable TXOP CFE
|
|
*/
|
|
RTL_W16(RD_CTRL, RTL_R16(RD_CTRL) | DIS_TXOP_CFE);
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
RTL_W8(MAC_SEL, 0);
|
|
RTL_W8(0x526, 0xff); /* enable all MBID interface beacon */
|
|
|
|
RTL_W32(0x024, 0x0011800d); //syn CLK enable, Xtal_bsel=nand
|
|
RTL_W32(0x028, 0x00ffdb83); //320MHz CLK enable
|
|
RTL_W32(0x014, 0x088ba955); //SPS=1.537V
|
|
RTL_W32(0x010, 0x49022b03);
|
|
|
|
/*
|
|
* Protection mode control for hw RTS
|
|
*/
|
|
RTL_W16(PROT_MODE_CTRL, 0xff0D);
|
|
}
|
|
#endif
|
|
|
|
/*
|
|
* RA try rate aggr limit
|
|
*/
|
|
RTL_W8(RA_TRY_RATE_AGG_LMT, 0);
|
|
|
|
/*
|
|
* Max mpdu number per aggr
|
|
*/
|
|
RTL_W16(PROT_MODE_CTRL + 2, 0x0909);
|
|
|
|
if(!CHIP_VER_92X_SERIES(priv))
|
|
RTL_W8(RESP_SIFS_OFDM+1, 0x0a); //R2T
|
|
|
|
#if (defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_88E_SUPPORT)) && defined(TX_EARLY_MODE)
|
|
if (
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
(GET_CHIP_VER(priv) == VERSION_8192D)
|
|
#endif
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
||
|
|
#endif
|
|
(GET_CHIP_VER(priv) == VERSION_8188E)
|
|
#endif
|
|
)
|
|
disable_em(priv);
|
|
#endif
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) && defined(TXREPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E)
|
|
RTL8188E_EnableTxReport(priv);
|
|
#endif
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) && defined(CONFIG_SDIO_HCI)
|
|
//
|
|
// Configure SDIO TxRx Control to enable Rx DMA timer masking.
|
|
// 2010.02.24.
|
|
//
|
|
// value8 = SdioLocalCmd52Read1Byte(priv, SDIO_REG_TX_CTRL);
|
|
SdioLocalCmd52Write4Byte(priv, SDIO_REG_TX_CTRL, 0x02);
|
|
|
|
#ifdef CONFIG_SDIO_TX_INTERRUPT
|
|
// Invalidate All TX Free Page Threshold
|
|
RTL_W32(REG_88E_TXDMA_TH, 0xFFFFFFFF);
|
|
RTL_W16(REG_88E_LQ_TH, 0xFFFF);
|
|
#endif
|
|
//
|
|
// Update current Tx FIFO page status.
|
|
//
|
|
sdio_query_txbuf_status(priv);
|
|
sdio_query_txoqt_status(priv);
|
|
#endif // CONFIG_RTL_88E_SUPPORT && CONFIG_SDIO_HCI
|
|
}
|
|
#else
|
|
static void MacConfig(struct rtl8192cd_priv *priv)
|
|
{
|
|
return;
|
|
}
|
|
#endif//CONFIG_WLAN_NOT_HAL_EXIST
|
|
|
|
|
|
unsigned int get_mean_of_2_close_value(unsigned int *val_array)
|
|
{
|
|
unsigned int tmp1, tmp2;
|
|
|
|
//printk("v1 %08x v2 %08x v3 %08x\n", val_array[0], val_array[1], val_array[2]);
|
|
if (val_array[0] > val_array[1]) {
|
|
tmp1 = val_array[1];
|
|
val_array[1] = val_array[0];
|
|
val_array[0] = tmp1;
|
|
}
|
|
if (val_array[1] > val_array[2]) {
|
|
tmp1 = val_array[2];
|
|
val_array[2] = val_array[1];
|
|
val_array[1] = tmp1;
|
|
}
|
|
if (val_array[0] > val_array[1]) {
|
|
tmp1 = val_array[1];
|
|
val_array[1] = val_array[0];
|
|
val_array[0] = tmp1;
|
|
}
|
|
//printk("v1 %08x v2 %08x v3 %08x\n", val_array[0], val_array[1], val_array[2]);
|
|
|
|
tmp1 = val_array[1] - val_array[0];
|
|
tmp2 = val_array[2] - val_array[1];
|
|
if (tmp1 < tmp2)
|
|
tmp1 = (val_array[0] + val_array[1]) / 2;
|
|
else
|
|
tmp1 = (val_array[1] + val_array[2]) / 2;
|
|
|
|
//printk("final %08x\n", tmp1);
|
|
return tmp1;
|
|
}
|
|
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
|
|
void PHY_APCalibrate(struct rtl8192cd_priv *priv)
|
|
{
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if (!priv->pshare->rf_ft_var.use_ext_pa)
|
|
#endif
|
|
if (!IS_TEST_CHIP(priv)) {
|
|
if (GET_CHIP_VER(priv) == VERSION_8192C)
|
|
APK_MAIN(priv, 1);
|
|
else if (GET_CHIP_VER(priv) == VERSION_8188C)
|
|
APK_MAIN(priv, 0);
|
|
}
|
|
}
|
|
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
#ifndef CONFIG_RTL_NEW_IQK
|
|
static void IQK_92CD(struct rtl8192cd_priv *priv)
|
|
{
|
|
unsigned int cal_num = 0, cal_retry = 0, Oldval = 0, temp_c04 = 0, temp_c08 = 0, temp_874 = 0, temp_eac;
|
|
unsigned int cal_e94, cal_e9c, cal_ea4, cal_eac, cal_eb4, cal_ebc, cal_ec4, cal_ecc, adda_on_reg;
|
|
unsigned int X, Y, val_e94[3], val_e9c[3], val_ea4[3], val_eac[3], val_eb4[3], val_ebc[3], val_ec4[3], val_ecc[3];
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
unsigned int temp_870 = 0, temp_860 = 0, temp_864 = 0;
|
|
#endif
|
|
|
|
// step 1: save ADDA power saving parameters
|
|
unsigned int temp_85c = RTL_R32(0x85c);
|
|
unsigned int temp_e6c = RTL_R32(0xe6c);
|
|
unsigned int temp_e70 = RTL_R32(0xe70);
|
|
unsigned int temp_e74 = RTL_R32(0xe74);
|
|
unsigned int temp_e78 = RTL_R32(0xe78);
|
|
unsigned int temp_e7c = RTL_R32(0xe7c);
|
|
unsigned int temp_e80 = RTL_R32(0xe80);
|
|
unsigned int temp_e84 = RTL_R32(0xe84);
|
|
unsigned int temp_e88 = RTL_R32(0xe88);
|
|
unsigned int temp_e8c = RTL_R32(0xe8c);
|
|
unsigned int temp_ed0 = RTL_R32(0xed0);
|
|
unsigned int temp_ed4 = RTL_R32(0xed4);
|
|
unsigned int temp_ed8 = RTL_R32(0xed8);
|
|
unsigned int temp_edc = RTL_R32(0xedc);
|
|
unsigned int temp_ee0 = RTL_R32(0xee0);
|
|
unsigned int temp_eec = RTL_R32(0xeec);
|
|
|
|
#ifdef MP_TEST
|
|
if (!priv->pshare->rf_ft_var.mp_specific)
|
|
#endif
|
|
{
|
|
if (priv->pshare->iqk_2g_done)
|
|
return;
|
|
priv->pshare->iqk_2g_done = 1;
|
|
}
|
|
|
|
printk(">> %s \n", __FUNCTION__);
|
|
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
temp_870 = RTL_R32(0x870);
|
|
temp_860 = RTL_R32(0x860);
|
|
temp_864 = RTL_R32(0x864);
|
|
}
|
|
#endif
|
|
|
|
// step 2: Path-A ADDA all on
|
|
adda_on_reg = 0x04db25a4;
|
|
|
|
RTL_W32(0x85c, adda_on_reg);
|
|
RTL_W32(0xe6c, adda_on_reg);
|
|
RTL_W32(0xe70, adda_on_reg);
|
|
RTL_W32(0xe74, adda_on_reg);
|
|
RTL_W32(0xe78, adda_on_reg);
|
|
RTL_W32(0xe7c, adda_on_reg);
|
|
RTL_W32(0xe80, adda_on_reg);
|
|
RTL_W32(0xe84, adda_on_reg);
|
|
RTL_W32(0xe88, adda_on_reg);
|
|
RTL_W32(0xe8c, adda_on_reg);
|
|
RTL_W32(0xed0, adda_on_reg);
|
|
RTL_W32(0xed4, adda_on_reg);
|
|
RTL_W32(0xed8, adda_on_reg);
|
|
RTL_W32(0xedc, adda_on_reg);
|
|
RTL_W32(0xee0, adda_on_reg);
|
|
RTL_W32(0xeec, adda_on_reg);
|
|
|
|
// step 3: IQ&LO calibration Setting
|
|
// BB switch to PI mode
|
|
//RTL_W32(0x820, 0x01000100);
|
|
//RTL_W32(0x828, 0x01000100);
|
|
//BB setting
|
|
temp_c04 = RTL_R32(0xc04);
|
|
temp_c08 = RTL_R32(0xc08);
|
|
temp_874 = RTL_R32(0x874);
|
|
RTL_W32(0xc04, 0x03a05600);
|
|
RTL_W32(0xc08, 0x000800e4);
|
|
RTL_W32(0x874, 0x00204000);
|
|
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
PHY_SetBBReg(priv, 0x870, BIT(10), 1);
|
|
PHY_SetBBReg(priv, 0x870, BIT(26), 1);
|
|
PHY_SetBBReg(priv, 0x860, BIT(10), 0);
|
|
PHY_SetBBReg(priv, 0x864, BIT(10), 0);
|
|
}
|
|
#endif
|
|
RTL_W32(0x840, 0x00010000);
|
|
RTL_W32(0x844, 0x00010000);
|
|
|
|
//AP or IQK
|
|
RTL_W32(0xb68 , 0x00080000);
|
|
RTL_W32(0xb6c , 0x00080000);
|
|
|
|
// IQK setting
|
|
PHY_SetBBReg(priv, 0xe28, 0xffffff00, 0x808000);
|
|
RTL_W32(0xe40, 0x01007c00);
|
|
RTL_W32(0xe44, 0x01004800);
|
|
// path-A IQK setting
|
|
RTL_W32(0xe30, 0x10008c1f);
|
|
RTL_W32(0xe34, 0x10008c1f);
|
|
RTL_W32(0xe38, 0x82140102);
|
|
RTL_W32(0xe3c, 0x28160202);
|
|
// path-B IQK setting
|
|
RTL_W32(0xe50, 0x10008c22);
|
|
RTL_W32(0xe54, 0x10008c22);
|
|
RTL_W32(0xe58, 0x82140102);
|
|
RTL_W32(0xe5c, 0x28160202);
|
|
// LO calibration setting
|
|
RTL_W32(0xe4c, 0x001028d1);
|
|
|
|
// delay to ensure Path-A IQK success
|
|
delay_ms(300);
|
|
|
|
// step 4: One shot, path A LOK & IQK
|
|
while (cal_num < 3) {
|
|
// One shot, path A LOK & IQK
|
|
RTL_W32(0xe48, 0xf9000000);
|
|
RTL_W32(0xe48, 0xf8000000);
|
|
// delay 1ms
|
|
delay_ms(10);
|
|
|
|
// check fail bit and check abnormal condition, then fill BB IQ matrix
|
|
cal_e94 = (RTL_R32(0xe94) >> 16) & 0x3ff;
|
|
cal_e9c = (RTL_R32(0xe9c) >> 16) & 0x3ff;
|
|
cal_ea4 = (RTL_R32(0xea4) >> 16) & 0x3ff;
|
|
temp_eac = RTL_R32(0xeac);
|
|
cal_eac = (temp_eac >> 16) & 0x3ff;
|
|
if (!(temp_eac & BIT(28)) && !(temp_eac & BIT(27)) &&
|
|
(cal_e94 != 0x142) && (cal_e9c != 0x42) &&
|
|
(cal_ea4 != 0x132) && (cal_eac != 0x36)) {
|
|
val_e94[cal_num] = cal_e94;
|
|
val_e9c[cal_num] = cal_e9c;
|
|
val_ea4[cal_num] = cal_ea4;
|
|
val_eac[cal_num] = cal_eac;
|
|
cal_num++;
|
|
} else {
|
|
if (++cal_retry >= 10) {
|
|
printk("%s Path-A Check\n", __FUNCTION__);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (cal_num == 3) {
|
|
cal_e94 = get_mean_of_2_close_value(val_e94);
|
|
cal_e9c = get_mean_of_2_close_value(val_e9c);
|
|
cal_ea4 = get_mean_of_2_close_value(val_ea4);
|
|
cal_eac = get_mean_of_2_close_value(val_eac);
|
|
|
|
priv->pshare->RegE94 = cal_e94;
|
|
priv->pshare->RegE9C = cal_e9c;
|
|
|
|
Oldval = (RTL_R32(0xc80) >> 22) & 0x3ff;
|
|
|
|
X = cal_e94;
|
|
PHY_SetBBReg(priv, 0xc80, 0x3ff, X * (Oldval / 0x100));
|
|
PHY_SetBBReg(priv, 0xc4c, BIT(24), ((X * Oldval) >> 7) & 0x1);
|
|
|
|
Y = cal_e9c;
|
|
PHY_SetBBReg(priv, 0xc94, 0xf0000000, ((Y * (Oldval / 0x100)) >> 6) & 0xf);
|
|
PHY_SetBBReg(priv, 0xc80, 0x003f0000, (Y * (Oldval / 0x100)) & 0x3f);
|
|
PHY_SetBBReg(priv, 0xc4c, BIT(26), ((Y * Oldval) >> 7) & 0x1);
|
|
|
|
PHY_SetBBReg(priv, 0xc14, 0x3ff, cal_ea4);
|
|
|
|
PHY_SetBBReg(priv, 0xc14, 0xfc00, cal_eac & 0x3f);
|
|
|
|
PHY_SetBBReg(priv, 0xca0, 0xf0000000, (cal_eac >> 6) & 0xf);
|
|
} else {
|
|
priv->pshare->RegE94 = 0x100;
|
|
priv->pshare->RegE9C = 0x00;
|
|
}
|
|
|
|
// step 5: Path-A standby mode
|
|
PHY_SetBBReg(priv, 0xe28, 0xffffff00, 0);
|
|
RTL_W32(0x840, 0x00010000);
|
|
PHY_SetBBReg(priv, 0xe28, 0xffffff00, 0x808000);
|
|
|
|
// step 6: Path-B ADDA all on
|
|
adda_on_reg = 0x0b1b25a4;
|
|
|
|
RTL_W32(0x85c, adda_on_reg);
|
|
RTL_W32(0xe6c, adda_on_reg);
|
|
RTL_W32(0xe70, adda_on_reg);
|
|
RTL_W32(0xe74, adda_on_reg);
|
|
RTL_W32(0xe78, adda_on_reg);
|
|
RTL_W32(0xe7c, adda_on_reg);
|
|
RTL_W32(0xe80, adda_on_reg);
|
|
RTL_W32(0xe84, adda_on_reg);
|
|
RTL_W32(0xe88, adda_on_reg);
|
|
RTL_W32(0xe8c, adda_on_reg);
|
|
RTL_W32(0xed0, adda_on_reg);
|
|
RTL_W32(0xed4, adda_on_reg);
|
|
RTL_W32(0xed8, adda_on_reg);
|
|
RTL_W32(0xedc, adda_on_reg);
|
|
RTL_W32(0xee0, adda_on_reg);
|
|
RTL_W32(0xeec, adda_on_reg);
|
|
|
|
// step 7: One shot, path B LOK & IQK
|
|
cal_num = 0;
|
|
cal_retry = 0;
|
|
while (cal_num < 3) {
|
|
// One shot, path B LOK & IQK
|
|
RTL_W32(0xe60, 2);
|
|
RTL_W32(0xe60, 0);
|
|
// delay 1ms
|
|
delay_ms(10);
|
|
|
|
// check fail bit and check abnormal condition, then fill BB IQ matrix
|
|
cal_eb4 = (RTL_R32(0xeb4) >> 16) & 0x3ff;
|
|
cal_ebc = (RTL_R32(0xebc) >> 16) & 0x3ff;
|
|
cal_ec4 = (RTL_R32(0xec4) >> 16) & 0x3ff;
|
|
cal_ecc = (RTL_R32(0xecc) >> 16) & 0x3ff;
|
|
temp_eac = RTL_R32(0xeac);
|
|
if (!(temp_eac & BIT(31)) && !(temp_eac & BIT(30)) &&
|
|
(cal_eb4 != 0x142) && (cal_ebc != 0x42) &&
|
|
(cal_ec4 != 0x132) && (cal_ecc != 0x36)) {
|
|
val_eb4[cal_num] = cal_eb4;
|
|
val_ebc[cal_num] = cal_ebc;
|
|
val_ec4[cal_num] = cal_ec4;
|
|
val_ecc[cal_num] = cal_ecc;
|
|
cal_num++;
|
|
} else {
|
|
if (++cal_retry >= 10) {
|
|
printk("%s Path-B Check\n", __FUNCTION__);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (cal_num == 3) {
|
|
cal_eb4 = get_mean_of_2_close_value(val_eb4);
|
|
cal_ebc = get_mean_of_2_close_value(val_ebc);
|
|
cal_ec4 = get_mean_of_2_close_value(val_ec4);
|
|
cal_ecc = get_mean_of_2_close_value(val_ecc);
|
|
|
|
priv->pshare->RegEB4 = cal_eb4;
|
|
priv->pshare->RegEBC = cal_ebc;
|
|
|
|
Oldval = (RTL_R32(0xc88) >> 22) & 0x3ff;
|
|
|
|
X = cal_eb4;
|
|
PHY_SetBBReg(priv, 0xc88, 0x3ff, X * (Oldval / 0x100));
|
|
PHY_SetBBReg(priv, 0xc4c, BIT(28), ((X * Oldval) >> 7) & 0x1);
|
|
|
|
Y = cal_ebc;
|
|
PHY_SetBBReg(priv, 0xc9c, 0xf0000000, ((Y * (Oldval / 0x100)) >> 6) & 0xf);
|
|
PHY_SetBBReg(priv, 0xc88, 0x003f0000, (Y * (Oldval / 0x100)) & 0x3f);
|
|
PHY_SetBBReg(priv, 0xc4c, BIT(30), ((Y * Oldval) >> 7) & 0x1);
|
|
|
|
PHY_SetBBReg(priv, 0xc1c, 0x3ff, cal_ec4);
|
|
|
|
PHY_SetBBReg(priv, 0xc1c, 0xfc00, cal_ecc & 0x3f);
|
|
|
|
PHY_SetBBReg(priv, 0xc78, 0xf000, (cal_ecc >> 6) & 0xf);
|
|
} else {
|
|
priv->pshare->RegEB4 = 0x100;
|
|
priv->pshare->RegEBC = 0x00;
|
|
}
|
|
|
|
|
|
// step 8: back to BB mode, load original values
|
|
RTL_W32(0xc04, temp_c04);
|
|
RTL_W32(0x874, temp_874);
|
|
RTL_W32(0xc08, temp_c08);
|
|
PHY_SetBBReg(priv, 0xe28, 0xffffff00, 0);
|
|
RTL_W32(0x840, 0x32ed3);
|
|
RTL_W32(0x844, 0x32ed3);
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
RTL_W32(0x870, temp_870);
|
|
RTL_W32(0x860, temp_860);
|
|
RTL_W32(0x864, temp_864);
|
|
}
|
|
#endif
|
|
// return to SI mode
|
|
//RTL_W32(0x820, 0x01000000);
|
|
//RTL_W32(0x828, 0x01000000);
|
|
|
|
// step 9: reload ADDA power saving parameters
|
|
RTL_W32(0x85c, temp_85c);
|
|
RTL_W32(0xe6c, temp_e6c);
|
|
RTL_W32(0xe70, temp_e70);
|
|
RTL_W32(0xe74, temp_e74);
|
|
RTL_W32(0xe78, temp_e78);
|
|
RTL_W32(0xe7c, temp_e7c);
|
|
RTL_W32(0xe80, temp_e80);
|
|
RTL_W32(0xe84, temp_e84);
|
|
RTL_W32(0xe88, temp_e88);
|
|
RTL_W32(0xe8c, temp_e8c);
|
|
RTL_W32(0xed0, temp_ed0);
|
|
RTL_W32(0xed4, temp_ed4);
|
|
RTL_W32(0xed8, temp_ed8);
|
|
RTL_W32(0xedc, temp_edc);
|
|
RTL_W32(0xee0, temp_ee0);
|
|
RTL_W32(0xeec, temp_eec);
|
|
|
|
}
|
|
|
|
|
|
static void IQK_88C(struct rtl8192cd_priv *priv)
|
|
{
|
|
unsigned int cal_num = 0, cal_retry = 0;
|
|
unsigned int Oldval_0 = 0, temp_c04 = 0, temp_c08 = 0, temp_874 = 0;
|
|
unsigned int cal_e94, cal_e9c, cal_ea4, cal_eac, temp_eac;
|
|
unsigned int X, Y, val_e94[3], val_e9c[3], val_ea4[3], val_eac[3];
|
|
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
unsigned int temp_870 = 0, temp_860 = 0, temp_864 = 0;
|
|
#endif
|
|
// step 1: save ADDA power saving parameters
|
|
unsigned int temp_85c = RTL_R32(0x85c);
|
|
unsigned int temp_e6c = RTL_R32(0xe6c);
|
|
unsigned int temp_e70 = RTL_R32(0xe70);
|
|
unsigned int temp_e74 = RTL_R32(0xe74);
|
|
unsigned int temp_e78 = RTL_R32(0xe78);
|
|
unsigned int temp_e7c = RTL_R32(0xe7c);
|
|
unsigned int temp_e80 = RTL_R32(0xe80);
|
|
unsigned int temp_e84 = RTL_R32(0xe84);
|
|
unsigned int temp_e88 = RTL_R32(0xe88);
|
|
unsigned int temp_e8c = RTL_R32(0xe8c);
|
|
unsigned int temp_ed0 = RTL_R32(0xed0);
|
|
unsigned int temp_ed4 = RTL_R32(0xed4);
|
|
unsigned int temp_ed8 = RTL_R32(0xed8);
|
|
unsigned int temp_edc = RTL_R32(0xedc);
|
|
unsigned int temp_ee0 = RTL_R32(0xee0);
|
|
unsigned int temp_eec = RTL_R32(0xeec);
|
|
|
|
#ifdef MP_TEST
|
|
if (!priv->pshare->rf_ft_var.mp_specific)
|
|
#endif
|
|
{
|
|
if (priv->pshare->iqk_2g_done)
|
|
return;
|
|
priv->pshare->iqk_2g_done = 1;
|
|
}
|
|
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
temp_870 = RTL_R32(0x870);
|
|
temp_860 = RTL_R32(0x860);
|
|
temp_864 = RTL_R32(0x864);
|
|
}
|
|
#endif
|
|
|
|
// step 2: ADDA all on
|
|
RTL_W32(0x85c, 0x0b1b25a0);
|
|
RTL_W32(0xe6c, 0x0bdb25a0);
|
|
RTL_W32(0xe70, 0x0bdb25a0);
|
|
RTL_W32(0xe74, 0x0bdb25a0);
|
|
RTL_W32(0xe78, 0x0bdb25a0);
|
|
RTL_W32(0xe7c, 0x0bdb25a0);
|
|
RTL_W32(0xe80, 0x0bdb25a0);
|
|
RTL_W32(0xe84, 0x0bdb25a0);
|
|
RTL_W32(0xe88, 0x0bdb25a0);
|
|
RTL_W32(0xe8c, 0x0bdb25a0);
|
|
RTL_W32(0xed0, 0x0bdb25a0);
|
|
RTL_W32(0xed4, 0x0bdb25a0);
|
|
RTL_W32(0xed8, 0x0bdb25a0);
|
|
RTL_W32(0xedc, 0x0bdb25a0);
|
|
RTL_W32(0xee0, 0x0bdb25a0);
|
|
RTL_W32(0xeec, 0x0bdb25a0);
|
|
|
|
// step 3: start IQK
|
|
// BB switch to PI mode
|
|
//RTL_W32(0x820, 0x01000100);
|
|
//RTL_W32(0x828, 0x01000100);
|
|
//BB setting
|
|
temp_c04 = RTL_R32(0xc04);
|
|
temp_c08 = RTL_R32(0xc08);
|
|
temp_874 = RTL_R32(0x874);
|
|
RTL_W32(0xc04, 0x03a05600);
|
|
RTL_W32(0xc08, 0x000800e4);
|
|
RTL_W32(0x874, 0x00204000);
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
PHY_SetBBReg(priv, 0x870, BIT(10), 1);
|
|
PHY_SetBBReg(priv, 0x870, BIT(26), 1);
|
|
PHY_SetBBReg(priv, 0x860, BIT(10), 0);
|
|
PHY_SetBBReg(priv, 0x864, BIT(10), 0);
|
|
}
|
|
#endif
|
|
|
|
//AP or IQK
|
|
// RTL_W32(0xb68, 0x0f600000);
|
|
RTL_W32(0xb68, 0x00080000);
|
|
|
|
// IQK setting
|
|
PHY_SetBBReg(priv, 0xe28, 0xffffff00, 0x808000);
|
|
RTL_W32(0xe40, 0x01007c00);
|
|
RTL_W32(0xe44, 0x01004800);
|
|
// path-A IQK setting
|
|
RTL_W32(0xe30, 0x10008c1f);
|
|
RTL_W32(0xe34, 0x10008c1f);
|
|
RTL_W32(0xe38, 0x82140102);
|
|
//RTL_W32(0xe3c, 0x28160502);
|
|
RTL_W32(0xe3c, 0x28160202);
|
|
|
|
// LO calibration setting
|
|
RTL_W32(0xe4c, 0x001028d1);
|
|
|
|
while (cal_num < 3) {
|
|
// One shot, path A LOK & IQK
|
|
RTL_W32(0xe48, 0xf9000000);
|
|
RTL_W32(0xe48, 0xf8000000);
|
|
// delay 1ms
|
|
delay_ms(150);
|
|
|
|
// step 4: check fail bit and check abnormal condition, then fill BB IQ matrix
|
|
cal_e94 = (RTL_R32(0xe94) >> 16) & 0x3ff;
|
|
cal_e9c = (RTL_R32(0xe9c) >> 16) & 0x3ff;
|
|
cal_ea4 = (RTL_R32(0xea4) >> 16) & 0x3ff;
|
|
temp_eac = RTL_R32(0xeac);
|
|
cal_eac = (temp_eac >> 16) & 0x3ff;
|
|
if (!(temp_eac & BIT(28)) && !(temp_eac & BIT(27)) &&
|
|
(cal_e94 != 0x142) && (cal_e9c != 0x42) &&
|
|
(cal_ea4 != 0x132) && (cal_eac != 0x36)) {
|
|
val_e94[cal_num] = cal_e94;
|
|
val_e9c[cal_num] = cal_e9c;
|
|
val_ea4[cal_num] = cal_ea4;
|
|
val_eac[cal_num] = cal_eac;
|
|
cal_num++;
|
|
} else {
|
|
if (++cal_retry >= 10) {
|
|
printk("IQK Check\n");
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (cal_num == 3) {
|
|
cal_e94 = get_mean_of_2_close_value(val_e94);
|
|
cal_e9c = get_mean_of_2_close_value(val_e9c);
|
|
cal_ea4 = get_mean_of_2_close_value(val_ea4);
|
|
cal_eac = get_mean_of_2_close_value(val_eac);
|
|
|
|
priv->pshare->RegE94 = cal_e94;
|
|
priv->pshare->RegE9C = cal_e9c;
|
|
|
|
Oldval_0 = (RTL_R32(0xc80) >> 22) & 0x3ff;
|
|
|
|
X = cal_e94;
|
|
PHY_SetBBReg(priv, 0xc80, 0x3ff, X * (Oldval_0 / 0x100));
|
|
PHY_SetBBReg(priv, 0xc4c, BIT(24), ((X * Oldval_0) >> 7) & 0x1);
|
|
|
|
Y = cal_e9c;
|
|
PHY_SetBBReg(priv, 0xc94, 0xf0000000, ((Y * (Oldval_0 / 0x100)) >> 6) & 0xf);
|
|
PHY_SetBBReg(priv, 0xc80, 0x003f0000, (Y * (Oldval_0 / 0x100)) & 0x3f);
|
|
PHY_SetBBReg(priv, 0xc4c, BIT(26), ((Y * Oldval_0) >> 7) & 0x1);
|
|
|
|
PHY_SetBBReg(priv, 0xc14, 0x3ff, cal_ea4);
|
|
|
|
PHY_SetBBReg(priv, 0xc14, 0xfc00, cal_eac & 0x3f);
|
|
|
|
PHY_SetBBReg(priv, 0xca0, 0xf0000000, (cal_eac >> 6) & 0xf);
|
|
} else {
|
|
priv->pshare->RegE94 = 0x100;
|
|
priv->pshare->RegE9C = 0x00;
|
|
}
|
|
|
|
// back to BB mode
|
|
RTL_W32(0xc04, temp_c04);
|
|
RTL_W32(0x874, temp_874);
|
|
RTL_W32(0xc08, temp_c08);
|
|
PHY_SetBBReg(priv, 0xe28, 0xffffff00, 0);
|
|
RTL_W32(0x840, 0x00032ed3);
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
RTL_W32(0x870, temp_870);
|
|
RTL_W32(0x860, temp_860);
|
|
RTL_W32(0x864, temp_864);
|
|
}
|
|
#endif
|
|
// return to SI mode
|
|
//RTL_W32(0x820, 0x01000000);
|
|
//RTL_W32(0x828, 0x01000000);
|
|
|
|
// step 5: reload ADDA power saving parameters
|
|
RTL_W32(0x85c, temp_85c);
|
|
RTL_W32(0xe6c, temp_e6c);
|
|
RTL_W32(0xe70, temp_e70);
|
|
RTL_W32(0xe74, temp_e74);
|
|
RTL_W32(0xe78, temp_e78);
|
|
RTL_W32(0xe7c, temp_e7c);
|
|
RTL_W32(0xe80, temp_e80);
|
|
RTL_W32(0xe84, temp_e84);
|
|
RTL_W32(0xe88, temp_e88);
|
|
RTL_W32(0xe8c, temp_e8c);
|
|
RTL_W32(0xed0, temp_ed0);
|
|
RTL_W32(0xed4, temp_ed4);
|
|
RTL_W32(0xed8, temp_ed8);
|
|
RTL_W32(0xedc, temp_edc);
|
|
RTL_W32(0xee0, temp_ee0);
|
|
RTL_W32(0xeec, temp_eec);
|
|
} // IQK
|
|
#endif
|
|
#endif
|
|
|
|
#endif
|
|
|
|
void PHY_IQCalibrate(struct rtl8192cd_priv *priv)
|
|
{
|
|
#ifndef SMP_SYNC
|
|
unsigned long x;
|
|
#endif
|
|
|
|
#ifdef RF_MIMO_SWITCH
|
|
MIMO_mode_switch(priv, MIMO_2T2R);
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
SAVE_INT_AND_CLI(x);
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if (priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY) {
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_5G) {
|
|
#ifdef DFS
|
|
if ((priv->pshare->rf_ft_var.dfsdelayiqk) &&
|
|
(OPMODE & WIFI_AP_STATE) &&
|
|
!priv->pmib->dot11DFSEntry.disable_DFS &&
|
|
(timer_pending(&priv->ch_avail_chk_timer) ||
|
|
priv->pmib->dot11DFSEntry.disable_tx)) {
|
|
RESTORE_INT(x);
|
|
return;
|
|
}
|
|
#endif
|
|
IQK_92D_5G_phy0_n(priv);
|
|
} else
|
|
IQK_92D_2G_phy1(priv);
|
|
} else
|
|
#endif
|
|
{
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_5G) {
|
|
#ifdef DFS
|
|
if ((priv->pshare->rf_ft_var.dfsdelayiqk) &&
|
|
(OPMODE & WIFI_AP_STATE) &&
|
|
!priv->pmib->dot11DFSEntry.disable_DFS &&
|
|
(timer_pending(&priv->ch_avail_chk_timer) ||
|
|
priv->pmib->dot11DFSEntry.disable_tx)) {
|
|
RESTORE_INT(x);
|
|
return;
|
|
}
|
|
#endif
|
|
IQK_92D_5G_n(priv);
|
|
} else
|
|
IQK_92D_2G(priv);
|
|
}
|
|
RESTORE_INT(x);
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)) {
|
|
SAVE_INT_AND_CLI(x);
|
|
#ifdef CONFIG_RTL_NEW_IQK
|
|
PHY_IQCalibrate_92C(priv);
|
|
#else
|
|
if ( IS_UMC_A_CUT_88C(priv)
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
|| (priv->pshare->rf_ft_var.use_ext_pa)
|
|
#endif
|
|
) {
|
|
PHY_IQCalibrate_92C(priv);
|
|
} else {
|
|
if (GET_CHIP_VER(priv) == VERSION_8192C)
|
|
IQK_92CD(priv);
|
|
else
|
|
IQK_88C(priv);
|
|
}
|
|
#endif
|
|
RESTORE_INT(x);
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E)
|
|
#ifdef USE_OUT_SRC
|
|
PHY_IQCalibrate_8188E(ODMPTR, FALSE);
|
|
#else
|
|
PHY_IQCalibrate_8188E(priv, FALSE);
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT //FOR_8812_IQK
|
|
#ifdef USE_OUT_SRC
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
#ifdef DFS
|
|
if (priv->pshare->rf_ft_var.dfs_skip_iqk)
|
|
return;
|
|
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_5G) {
|
|
if ((priv->pshare->rf_ft_var.dfsdelayiqk) &&
|
|
(OPMODE & WIFI_AP_STATE) &&
|
|
!priv->pmib->dot11DFSEntry.disable_DFS &&
|
|
(timer_pending(&priv->ch_avail_chk_timer) ||
|
|
priv->pmib->dot11DFSEntry.disable_tx))
|
|
return;
|
|
}
|
|
#endif
|
|
SAVE_INT_AND_CLI(x);
|
|
priv->pshare->No_RF_Write = 0;
|
|
phy_IQCalibrate_8812A(ODMPTR, priv->pshare->working_channel);
|
|
priv->pshare->No_RF_Write = 1;
|
|
RESTORE_INT(x);
|
|
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL_8881A
|
|
#ifdef USE_OUT_SRC
|
|
if (GET_CHIP_VER(priv) == VERSION_8881A) {
|
|
#ifdef DFS
|
|
if (priv->pshare->rf_ft_var.dfs_skip_iqk)
|
|
return;
|
|
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_5G) {
|
|
if ((priv->pshare->rf_ft_var.dfsdelayiqk) &&
|
|
(OPMODE & WIFI_AP_STATE) &&
|
|
!priv->pmib->dot11DFSEntry.disable_DFS &&
|
|
(timer_pending(&priv->ch_avail_chk_timer) ||
|
|
priv->pmib->dot11DFSEntry.disable_tx))
|
|
return;
|
|
}
|
|
#endif
|
|
SAVE_INT_AND_CLI(x);
|
|
priv->pshare->No_RF_Write = 0;
|
|
phy_IQCalibrate_8821A(ODMPTR);
|
|
priv->pshare->No_RF_Write = 1;
|
|
RESTORE_INT(x);
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
#ifdef USE_OUT_SRC
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E) {
|
|
// SAVE_INT_AND_CLI(x);
|
|
PHY_IQCalibrate_8192E(ODMPTR, FALSE);
|
|
// RESTORE_INT(x);
|
|
}
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
|
|
#ifdef ADD_TX_POWER_BY_CMD
|
|
static void assign_txpwr_offset(struct rtl8192cd_priv *priv)
|
|
{
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->CCKTxAgc_A[0], priv->pshare->rf_ft_var.txPowerPlus_cck_11);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->CCKTxAgc_A[1], priv->pshare->rf_ft_var.txPowerPlus_cck_5);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->CCKTxAgc_A[2], priv->pshare->rf_ft_var.txPowerPlus_cck_2);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->CCKTxAgc_A[3], priv->pshare->rf_ft_var.txPowerPlus_cck_1);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->CCKTxAgc_B[0], priv->pshare->rf_ft_var.txPowerPlus_cck_11);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->CCKTxAgc_B[1], priv->pshare->rf_ft_var.txPowerPlus_cck_5);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->CCKTxAgc_B[2], priv->pshare->rf_ft_var.txPowerPlus_cck_2);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->CCKTxAgc_B[3], priv->pshare->rf_ft_var.txPowerPlus_cck_1);
|
|
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->OFDMTxAgcOffset_A[0], priv->pshare->rf_ft_var.txPowerPlus_ofdm_18);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->OFDMTxAgcOffset_A[1], priv->pshare->rf_ft_var.txPowerPlus_ofdm_12);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->OFDMTxAgcOffset_A[2], priv->pshare->rf_ft_var.txPowerPlus_ofdm_9);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->OFDMTxAgcOffset_A[3], priv->pshare->rf_ft_var.txPowerPlus_ofdm_6);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->OFDMTxAgcOffset_B[0], priv->pshare->rf_ft_var.txPowerPlus_ofdm_18);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->OFDMTxAgcOffset_B[1], priv->pshare->rf_ft_var.txPowerPlus_ofdm_12);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->OFDMTxAgcOffset_B[2], priv->pshare->rf_ft_var.txPowerPlus_ofdm_9);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->OFDMTxAgcOffset_B[3], priv->pshare->rf_ft_var.txPowerPlus_ofdm_6);
|
|
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->OFDMTxAgcOffset_A[4], priv->pshare->rf_ft_var.txPowerPlus_ofdm_54);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->OFDMTxAgcOffset_A[5], priv->pshare->rf_ft_var.txPowerPlus_ofdm_48);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->OFDMTxAgcOffset_A[6], priv->pshare->rf_ft_var.txPowerPlus_ofdm_36);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->OFDMTxAgcOffset_A[7], priv->pshare->rf_ft_var.txPowerPlus_ofdm_24);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->OFDMTxAgcOffset_B[4], priv->pshare->rf_ft_var.txPowerPlus_ofdm_54);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->OFDMTxAgcOffset_B[5], priv->pshare->rf_ft_var.txPowerPlus_ofdm_48);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->OFDMTxAgcOffset_B[6], priv->pshare->rf_ft_var.txPowerPlus_ofdm_36);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->OFDMTxAgcOffset_B[7], priv->pshare->rf_ft_var.txPowerPlus_ofdm_24);
|
|
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_A[0], priv->pshare->rf_ft_var.txPowerPlus_mcs_3);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_A[1], priv->pshare->rf_ft_var.txPowerPlus_mcs_2);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_A[2], priv->pshare->rf_ft_var.txPowerPlus_mcs_1);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_A[3], priv->pshare->rf_ft_var.txPowerPlus_mcs_0);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_B[0], priv->pshare->rf_ft_var.txPowerPlus_mcs_3);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_B[1], priv->pshare->rf_ft_var.txPowerPlus_mcs_2);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_B[2], priv->pshare->rf_ft_var.txPowerPlus_mcs_1);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_B[3], priv->pshare->rf_ft_var.txPowerPlus_mcs_0);
|
|
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_A[4], priv->pshare->rf_ft_var.txPowerPlus_mcs_7);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_A[5], priv->pshare->rf_ft_var.txPowerPlus_mcs_6);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_A[6], priv->pshare->rf_ft_var.txPowerPlus_mcs_5);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_A[7], priv->pshare->rf_ft_var.txPowerPlus_mcs_4);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_B[4], priv->pshare->rf_ft_var.txPowerPlus_mcs_7);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_B[5], priv->pshare->rf_ft_var.txPowerPlus_mcs_6);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_B[6], priv->pshare->rf_ft_var.txPowerPlus_mcs_5);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_B[7], priv->pshare->rf_ft_var.txPowerPlus_mcs_4);
|
|
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_A[8], priv->pshare->rf_ft_var.txPowerPlus_mcs_11);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_A[9], priv->pshare->rf_ft_var.txPowerPlus_mcs_10);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_A[10], priv->pshare->rf_ft_var.txPowerPlus_mcs_9);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_A[11], priv->pshare->rf_ft_var.txPowerPlus_mcs_8);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_B[8], priv->pshare->rf_ft_var.txPowerPlus_mcs_11);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_B[9], priv->pshare->rf_ft_var.txPowerPlus_mcs_10);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_B[10], priv->pshare->rf_ft_var.txPowerPlus_mcs_9);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_B[11], priv->pshare->rf_ft_var.txPowerPlus_mcs_8);
|
|
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_A[12], priv->pshare->rf_ft_var.txPowerPlus_mcs_15);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_A[13], priv->pshare->rf_ft_var.txPowerPlus_mcs_14);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_A[14], priv->pshare->rf_ft_var.txPowerPlus_mcs_13);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_A[15], priv->pshare->rf_ft_var.txPowerPlus_mcs_12);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_B[12], priv->pshare->rf_ft_var.txPowerPlus_mcs_15);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_B[13], priv->pshare->rf_ft_var.txPowerPlus_mcs_14);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_B[14], priv->pshare->rf_ft_var.txPowerPlus_mcs_13);
|
|
ASSIGN_TX_POWER_OFFSET(priv->pshare->phw->MCSTxAgcOffset_B[15], priv->pshare->rf_ft_var.txPowerPlus_mcs_12);
|
|
}
|
|
#endif
|
|
|
|
|
|
void reload_txpwr_pg(struct rtl8192cd_priv *priv)
|
|
{
|
|
int i;
|
|
|
|
PHY_ConfigBBWithParaFile(priv, PHYREG_PG);
|
|
|
|
#if 0 //def HIGH_POWER_EXT_PA
|
|
if (!priv->pshare->rf_ft_var.use_ext_pa)
|
|
#endif
|
|
{
|
|
// get default Tx AGC offset
|
|
//_TXPWR_REDEFINE ?? CCKTxAgc_A[1] [2] [3] ??
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_A[0]) = cpu_to_be32(RTL_R32(rTxAGC_A_Mcs03_Mcs00));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_A[4]) = cpu_to_be32(RTL_R32(rTxAGC_A_Mcs07_Mcs04));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_A[8]) = cpu_to_be32(RTL_R32(rTxAGC_A_Mcs11_Mcs08));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_A[12]) = cpu_to_be32(RTL_R32(rTxAGC_A_Mcs15_Mcs12));
|
|
*(unsigned int *)(&priv->pshare->phw->OFDMTxAgcOffset_A[0]) = cpu_to_be32(RTL_R32(rTxAGC_A_Rate18_06));
|
|
*(unsigned int *)(&priv->pshare->phw->OFDMTxAgcOffset_A[4]) = cpu_to_be32(RTL_R32(rTxAGC_A_Rate54_24));
|
|
*(unsigned int *)(&priv->pshare->phw->CCKTxAgc_A[0]) = cpu_to_be32((RTL_R32(rTxAGC_A_CCK11_2_B_CCK11) & 0xffffff00)
|
|
| RTL_R8(rTxAGC_A_CCK1_Mcs32 + 1));
|
|
|
|
#if defined(CONFIG_RTL_92D_SUPPORT)&& defined(CONFIG_RTL_92D_DMDP)
|
|
if (priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY && priv->pshare->wlandev_idx == 1) {
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_A[0]) = cpu_to_be32(RTL_R32(rTxAGC_B_Mcs03_Mcs00));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_A[4]) = cpu_to_be32(RTL_R32(rTxAGC_B_Mcs07_Mcs04));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_A[8]) = cpu_to_be32(RTL_R32(rTxAGC_B_Mcs11_Mcs08));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_A[12]) = cpu_to_be32(RTL_R32(rTxAGC_B_Mcs15_Mcs12));
|
|
*(unsigned int *)(&priv->pshare->phw->OFDMTxAgcOffset_A[0]) = cpu_to_be32(RTL_R32(rTxAGC_B_Rate18_06));
|
|
*(unsigned int *)(&priv->pshare->phw->OFDMTxAgcOffset_A[4]) = cpu_to_be32(RTL_R32(rTxAGC_B_Rate54_24));
|
|
*(unsigned int *)(&priv->pshare->phw->CCKTxAgc_A[0]) = cpu_to_be32((RTL_R8(rTxAGC_A_CCK11_2_B_CCK11) << 24)
|
|
| (RTL_R32(rTxAGC_B_CCK5_1_Mcs32) >> 8));
|
|
}
|
|
#endif
|
|
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_B[0]) = cpu_to_be32(RTL_R32(rTxAGC_B_Mcs03_Mcs00));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_B[4]) = cpu_to_be32(RTL_R32(rTxAGC_B_Mcs07_Mcs04));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_B[8]) = cpu_to_be32(RTL_R32(rTxAGC_B_Mcs11_Mcs08));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_B[12]) = cpu_to_be32(RTL_R32(rTxAGC_B_Mcs15_Mcs12));
|
|
*(unsigned int *)(&priv->pshare->phw->OFDMTxAgcOffset_B[0]) = cpu_to_be32(RTL_R32(rTxAGC_B_Rate18_06));
|
|
*(unsigned int *)(&priv->pshare->phw->OFDMTxAgcOffset_B[4]) = cpu_to_be32(RTL_R32(rTxAGC_B_Rate54_24));
|
|
*(unsigned int *)(&priv->pshare->phw->CCKTxAgc_B[0]) = cpu_to_be32((RTL_R8(rTxAGC_A_CCK11_2_B_CCK11) << 24)
|
|
| (RTL_R32(rTxAGC_B_CCK5_1_Mcs32) >> 8));
|
|
|
|
}
|
|
|
|
|
|
#ifdef TXPWR_LMT
|
|
if (!priv->pshare->rf_ft_var.disable_txpwrlmt) {
|
|
//4 Set Target Power from PG table values
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188E)) //92c_pwrlmt
|
|
{
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_2G) {
|
|
//CCK
|
|
priv->pshare->tgpwr_CCK_new[RF_PATH_A] = priv->pshare->phw->CCKTxAgc_A[0];
|
|
priv->pshare->tgpwr_CCK_new[RF_PATH_B] = priv->pshare->phw->CCKTxAgc_B[0];
|
|
//4 Set PG table values to difference
|
|
for (i=0;i<4;i++) {
|
|
priv->pshare->phw->CCKTxAgc_A[i] -= priv->pshare->tgpwr_CCK_new[RF_PATH_A];
|
|
priv->pshare->phw->CCKTxAgc_B[i] -= priv->pshare->tgpwr_CCK_new[RF_PATH_B];
|
|
}
|
|
}
|
|
//OFDM
|
|
priv->pshare->tgpwr_OFDM_new[RF_PATH_A] = priv->pshare->phw->OFDMTxAgcOffset_A[4];
|
|
priv->pshare->tgpwr_OFDM_new[RF_PATH_B] = priv->pshare->phw->OFDMTxAgcOffset_B[4];
|
|
for (i=0;i<8;i++) {
|
|
priv->pshare->phw->OFDMTxAgcOffset_A[i] -= priv->pshare->tgpwr_OFDM_new[RF_PATH_A];
|
|
priv->pshare->phw->OFDMTxAgcOffset_B[i] -= priv->pshare->tgpwr_OFDM_new[RF_PATH_B];
|
|
}
|
|
|
|
//HT-1S
|
|
priv->pshare->tgpwr_HT1S_new[RF_PATH_A] = priv->pshare->phw->MCSTxAgcOffset_A[4];
|
|
priv->pshare->tgpwr_HT1S_new[RF_PATH_B] = priv->pshare->phw->MCSTxAgcOffset_B[4];
|
|
for (i=0;i<8;i++) {
|
|
priv->pshare->phw->MCSTxAgcOffset_A[i] -= priv->pshare->tgpwr_HT1S_new[RF_PATH_A];
|
|
priv->pshare->phw->MCSTxAgcOffset_B[i] -= priv->pshare->tgpwr_HT1S_new[RF_PATH_B];
|
|
}
|
|
|
|
//HT-2S
|
|
priv->pshare->tgpwr_HT2S_new[RF_PATH_A] = priv->pshare->phw->MCSTxAgcOffset_A[12];
|
|
priv->pshare->tgpwr_HT2S_new[RF_PATH_B] = priv->pshare->phw->MCSTxAgcOffset_B[12];
|
|
for (i=8;i<16;i++) {
|
|
priv->pshare->phw->MCSTxAgcOffset_A[i] -= priv->pshare->tgpwr_HT2S_new[RF_PATH_A];
|
|
priv->pshare->phw->MCSTxAgcOffset_B[i] -= priv->pshare->tgpwr_HT2S_new[RF_PATH_B];
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef ADD_TX_POWER_BY_CMD
|
|
assign_txpwr_offset(priv);
|
|
#endif
|
|
}
|
|
|
|
#ifdef USE_OUT_SRC
|
|
|
|
void ODM_software_init(struct rtl8192cd_priv *priv)
|
|
{
|
|
unsigned long ability;
|
|
unsigned int BoardType = ODM_BOARD_DEFAULT;
|
|
priv->pshare->_dmODM.priv = priv;
|
|
|
|
//
|
|
// Init Value
|
|
//
|
|
// 1. u1Byte SupportPlatform
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_PLATFORM, ODM_AP);
|
|
|
|
#if 0// defined(CONFIG_RTL_92E_SUPPORT) && defined(CONFIG_HW_ANTENNA_DIVERSITY)
|
|
ODM_CmnInfoInit(ODMPTR,ODM_CMNINFO_RF_ANTENNA_TYPE,CGCS_RX_HW_ANTDIV);
|
|
#endif
|
|
// 2. u4Byte SupportAbility
|
|
ability = \
|
|
ODM_BB_DIG |
|
|
ODM_BB_RA_MASK |
|
|
ODM_BB_FA_CNT |
|
|
ODM_BB_RATE_ADAPTIVE |
|
|
ODM_MAC_EDCA_TURBO |
|
|
ODM_RF_RX_GAIN_TRACK |
|
|
ODM_RF_CALIBRATION |
|
|
ODM_BB_DYNAMIC_TXPWR |
|
|
ODM_RF_TX_PWR_TRACK |
|
|
ODM_BB_NHM_CNT |
|
|
ODM_BB_PRIMARY_CCA |
|
|
0;
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
ability = \
|
|
ODM_BB_DIG |
|
|
ODM_BB_RA_MASK |
|
|
ODM_BB_FA_CNT |
|
|
ODM_MAC_EDCA_TURBO |
|
|
ODM_BB_RSSI_MONITOR |
|
|
ODM_BB_DYNAMIC_TXPWR |
|
|
ODM_RF_TX_PWR_TRACK |
|
|
ODM_RF_CALIBRATION |
|
|
ODM_BB_NHM_CNT |
|
|
0;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL_8881A
|
|
if (GET_CHIP_VER(priv) == VERSION_8881A) {
|
|
ability = \
|
|
ODM_BB_DIG |
|
|
ODM_BB_RA_MASK |
|
|
ODM_BB_FA_CNT |
|
|
ODM_MAC_EDCA_TURBO |
|
|
ODM_BB_RSSI_MONITOR |
|
|
ODM_BB_DYNAMIC_TXPWR |
|
|
ODM_RF_TX_PWR_TRACK |
|
|
ODM_RF_CALIBRATION |
|
|
ODM_BB_NHM_CNT |
|
|
0;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E) {
|
|
ability = \
|
|
ODM_BB_DIG |
|
|
ODM_BB_RA_MASK |
|
|
ODM_BB_FA_CNT |
|
|
ODM_BB_RSSI_MONITOR |
|
|
ODM_MAC_EDCA_TURBO |
|
|
ODM_BB_DYNAMIC_TXPWR |
|
|
ODM_RF_TX_PWR_TRACK |
|
|
ODM_RF_CALIBRATION |
|
|
ODM_BB_CCK_PD |
|
|
ODM_BB_NHM_CNT |
|
|
0;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL_8814AE
|
|
if (GET_CHIP_VER(priv) == VERSION_8814A) {
|
|
ability = ODM_BB_DIG |
|
|
// ODM_BB_RA_MASK |
|
|
ODM_BB_FA_CNT |
|
|
ODM_BB_RSSI_MONITOR |
|
|
//ODM_MAC_EDCA_TURBO |
|
|
ODM_BB_DYNAMIC_TXPWR |
|
|
ODM_RF_TX_PWR_TRACK |
|
|
// ODM_RF_CALIBRATION |
|
|
ODM_BB_CCK_PD |
|
|
0;
|
|
}
|
|
#endif
|
|
|
|
if ((OPMODE & WIFI_MP_STATE) || priv->pshare->rf_ft_var.mp_specific) {
|
|
ability = \
|
|
ODM_RF_CALIBRATION |
|
|
ODM_RF_TX_PWR_TRACK |
|
|
ODM_BB_FA_CNT |
|
|
0;
|
|
}
|
|
|
|
#if defined(SW_ANT_SWITCH)
|
|
if (priv->pshare->rf_ft_var.antSw_enable)
|
|
ability |= ODM_BB_ANT_DIV;
|
|
#endif
|
|
#ifdef TX_EARLY_MODE
|
|
ability |= ODM_MAC_EARLY_MODE;
|
|
#endif
|
|
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_ABILITY, ability);
|
|
ODM_CmnInfoUpdate(ODMPTR, ODM_CMNINFO_ABILITY, ability);
|
|
|
|
// 3. u1Byte SupportInterface
|
|
#ifdef CONFIG_PCI_HCI
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_INTERFACE, ODM_ITRF_PCIE);
|
|
#elif defined(CONFIG_USB_HCI)
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_INTERFACE, ODM_ITRF_USB);
|
|
#elif defined(CONFIG_SDIO_HCI)
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_INTERFACE, ODM_ITRF_SDIO);
|
|
#endif
|
|
|
|
// 4. u4Byte SupportICType
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E)
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_IC_TYPE, ODM_RTL8188E);
|
|
else if (GET_CHIP_VER(priv) == VERSION_8812E)
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_IC_TYPE, ODM_RTL8812);
|
|
else if (GET_CHIP_VER(priv) == VERSION_8881A)
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_IC_TYPE, ODM_RTL8881A);
|
|
else if (GET_CHIP_VER(priv) == VERSION_8192E)
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_IC_TYPE, ODM_RTL8192E);
|
|
else if (GET_CHIP_VER(priv) == VERSION_8814A)
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_IC_TYPE, ODM_RTL8814A);
|
|
|
|
// 5. u1Byte CutVersion
|
|
if (IS_TEST_CHIP(priv)) {
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_CUT_VER, ODM_CUT_TEST);
|
|
} else {
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_CUT_VER, (RTL_R32(SYS_CFG) >> 12) & 0xF);
|
|
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_MP_TEST_CHIP, 1);
|
|
}
|
|
|
|
// 6. u1Byte FabVersion
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_FAB_VER, ODM_TSMC);
|
|
|
|
// 7. u1Byte RFType
|
|
if (get_rf_mimo_mode(priv) == MIMO_1T1R)
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_RF_TYPE, ODM_1T1R);
|
|
else if (get_rf_mimo_mode(priv) == MIMO_1T2R)
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_RF_TYPE, ODM_1T2R);
|
|
else if (get_rf_mimo_mode(priv) == MIMO_2T2R)
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_RF_TYPE, ODM_2T2R);
|
|
//else if (get_rf_mimo_mode(priv) == MIMO_2T2R_GREEN)
|
|
//ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_RF_TYPE, ODM_2T2R_GREEN);
|
|
else if (get_rf_mimo_mode(priv) == MIMO_2T3R)
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_RF_TYPE, ODM_2T3R);
|
|
else if (get_rf_mimo_mode(priv) == MIMO_2T4R)
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_RF_TYPE, ODM_2T4R);
|
|
else if (get_rf_mimo_mode(priv) == MIMO_3T3R)
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_RF_TYPE, ODM_3T3R);
|
|
else if (get_rf_mimo_mode(priv) == MIMO_3T4R)
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_RF_TYPE, ODM_3T4R);
|
|
else if (get_rf_mimo_mode(priv) == MIMO_4T4R)
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_RF_TYPE, ODM_4T4R);
|
|
else
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_RF_TYPE, ODM_XTXR);
|
|
|
|
// 8. u1Byte BoardType
|
|
#if defined(HIGH_POWER_EXT_PA) && defined(HIGH_POWER_EXT_LNA)
|
|
if(priv->pshare->rf_ft_var.use_ext_pa && priv->pshare->rf_ft_var.use_ext_lna) { //For 88C/92C only
|
|
priv->pmib->dot11RFEntry.trswitch = 1;
|
|
}
|
|
#endif
|
|
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if(priv->pshare->rf_ft_var.use_ext_pa)
|
|
{
|
|
if(GET_CHIP_VER(priv) == VERSION_8814A)
|
|
BoardType |= (ODM_BOARD_EXT_LNA|ODM_BOARD_EXT_LNA_5G|ODM_BOARD_EXT_PA|ODM_BOARD_EXT_PA_5G);
|
|
else if((GET_CHIP_VER(priv) == VERSION_8812E)||(GET_CHIP_VER(priv) == VERSION_8881A))
|
|
BoardType |= ODM_BOARD_EXT_PA_5G;
|
|
else //2G Chip: 92C/88E/92E
|
|
BoardType |= (ODM_BOARD_EXT_LNA|ODM_BOARD_EXT_PA);
|
|
}
|
|
#endif
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
if(priv->pshare->rf_ft_var.use_ext_lna){
|
|
if((GET_CHIP_VER(priv) == VERSION_8812E)||(GET_CHIP_VER(priv) == VERSION_8881A))
|
|
BoardType |= ODM_BOARD_EXT_LNA_5G;
|
|
else if((GET_CHIP_VER(priv) == VERSION_8188E)||(GET_CHIP_VER(priv) == VERSION_8192E))
|
|
BoardType |= ODM_BOARD_EXT_LNA;
|
|
}
|
|
#endif
|
|
if(priv->pmib->dot11RFEntry.trswitch)
|
|
BoardType |= ODM_BOARD_EXT_TRSW;
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_BOARD_TYPE, BoardType);
|
|
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_RFE_TYPE, priv->pmib->dot11RFEntry.rfe_type);
|
|
|
|
// ExtLNA & ExtPA Type
|
|
if(GET_CHIP_VER(priv) == VERSION_8812E)
|
|
{
|
|
if(priv->pmib->dot11RFEntry.pa_type == PA_SKYWORKS_5023)
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_APA, 0x05);
|
|
else
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_APA, 0x00);
|
|
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_GPA, 0x00);
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_GLNA, 0x00);
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_ALNA, 0x00);
|
|
}
|
|
else if(GET_CHIP_VER(priv) == VERSION_8814A)
|
|
{
|
|
if(priv->pmib->dot11RFEntry.rfe_type == 2) {
|
|
panic_printk("PHY paratemters: RFE type 2 APA1+ALNA1+GPA1+GLNA1\n");
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_GPA, TYPE_GPA1); // path (A,B,C,D) = (1,1,1,1)
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_APA, TYPE_APA1);
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_GLNA, TYPE_GLNA1);
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_ALNA, TYPE_ALNA1);
|
|
} else if(priv->pmib->dot11RFEntry.rfe_type == 3) {
|
|
panic_printk("PHY paratemters: RFE type 3 APA2+ALNA2+GPA2+GLNA2\n");
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_GPA, TYPE_GPA2); // path (A,B,C,D) = (2,2,2,2)
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_APA, TYPE_APA2);
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_GLNA, TYPE_GLNA2);
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_ALNA, TYPE_ALNA2);
|
|
} else if(priv->pmib->dot11RFEntry.rfe_type == 4) {
|
|
panic_printk("PHY paratemters: RFE type 4 APA1+ALNA3+GPA1+GLNA1\n");
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_GPA, TYPE_GPA1); // path (A,B,C,D) = (2,2,2,2)
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_APA, TYPE_APA1);
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_GLNA, TYPE_GLNA1); // path (A,B,C,D) = (3,3,3,3)
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_ALNA, TYPE_ALNA3);
|
|
} else if(priv->pmib->dot11RFEntry.rfe_type == 5) {
|
|
panic_printk("PHY paratemters: RFE type 5 APA2+ALNA4+GPA2+GLNA2\n");
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_GPA, TYPE_GPA2);
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_APA, TYPE_APA2);
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_GLNA, TYPE_GLNA2);
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_ALNA, TYPE_ALNA4);
|
|
} else if(priv->pmib->dot11RFEntry.rfe_type == 0){
|
|
panic_printk("PHY paratemters: RFE type 0\n");
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_GPA, TYPE_GPA0);
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_APA, TYPE_APA0);
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_GLNA, TYPE_GLNA0);
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_ALNA, TYPE_ALNA0);
|
|
}else {
|
|
panic_printk("PHY paratemters: Unknow RFE type!!\n");
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_GPA, TYPE_GPA0);
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_APA, TYPE_APA0);
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_GLNA, TYPE_GLNA0);
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_ALNA, TYPE_ALNA0);
|
|
}
|
|
}
|
|
//Package Type => To Be Done!
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_PACKAGE_TYPE, 0);
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
//priv->pshare->rf_ft_var.use_ext_lna is useless
|
|
if(priv->pshare->rf_ft_var.use_ext_pa)
|
|
{
|
|
// 9. u1Byte ExtLNA
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188E)||(GET_CHIP_VER(priv) == VERSION_8192E))
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_EXT_LNA, TRUE);
|
|
else
|
|
{
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_EXT_LNA, TRUE);
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_5G_EXT_LNA, TRUE);
|
|
}
|
|
|
|
// 10. u1Byte ExtPA
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188E)||(GET_CHIP_VER(priv) == VERSION_8192E))
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_EXT_PA, TRUE);
|
|
else
|
|
{
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_EXT_PA, TRUE);
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_5G_EXT_PA, TRUE);
|
|
}
|
|
}
|
|
#endif
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
if(priv->pshare->rf_ft_var.use_ext_lna){
|
|
// 9. u1Byte ExtLNA
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188E)||(GET_CHIP_VER(priv) == VERSION_8192E)){
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_EXT_LNA, TRUE);
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_EXT_LNA_GAIN,
|
|
priv->pshare->rf_ft_var.ext_lna_gain);
|
|
}else{
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_EXT_LNA, TRUE);
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_5G_EXT_LNA, TRUE);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
// 11. u1Byte ExtTRSW, ODM_CMNINFO_EXT_TRSW:
|
|
// follows variable "trswitch" which is modified in rtl8192cd_init_hw_PCI().
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_EXT_TRSW, priv->pmib->dot11RFEntry.trswitch);
|
|
|
|
// 12. u1Byte PatchID
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_PATCH_ID, 0);
|
|
|
|
// 13. BOOLEAN bInHctTest
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_BINHCT_TEST, FALSE);
|
|
|
|
// 14. BOOLEAN bWIFITest
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_BWIFI_TEST, (priv->pmib->dot11OperationEntry.wifi_specific > 0));
|
|
|
|
// 15. BOOLEAN bDualMacSmartConcurrent
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_SMART_CONCURRENT, FALSE);
|
|
|
|
// Config BB/RF by ODM
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188E) || (GET_CHIP_VER(priv) == VERSION_8814A))
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_CONFIG_BB_RF, TRUE);
|
|
else
|
|
ODM_CmnInfoInit(ODMPTR, ODM_CMNINFO_CONFIG_BB_RF, FALSE);
|
|
|
|
//
|
|
// Dynamic Value
|
|
//
|
|
|
|
// 1. u1Byte *pMacPhyMode
|
|
ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_MAC_PHY_MODE, &priv->pmib->dot11RFEntry.macPhyMode);
|
|
|
|
// 2. u8Byte *pNumTxBytesUnicast
|
|
ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_TX_UNI, &priv->pshare->NumTxBytesUnicast);
|
|
|
|
// 3. u8Byte *pNumRxBytesUnicast
|
|
ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_RX_UNI, &priv->pshare->NumRxBytesUnicast);
|
|
|
|
// 4. u1Byte *pWirelessMode
|
|
ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_WM_MODE, &priv->pmib->dot11BssType.net_work_type);
|
|
|
|
// 5. u1Byte *pBandType
|
|
ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_BAND, &priv->pmib->dot11RFEntry.phyBandSelect);
|
|
|
|
// 6. u1Byte *pSecChOffset
|
|
ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_SEC_CHNL_OFFSET, &priv->pshare->offset_2nd_chan);
|
|
|
|
// 7. u1Byte *pSecurity
|
|
ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_SEC_MODE, &priv->pmib->dot1180211AuthEntry.dot11PrivacyAlgrthm);
|
|
|
|
// 8. u1Byte *pBandWidth
|
|
ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_BW, &priv->pshare->CurrentChannelBW);
|
|
|
|
// 9. u1Byte *pChannel
|
|
// ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_CHNL, &priv->pshare->working_channel);
|
|
ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_CHNL, &priv->pmib->dot11RFEntry.dot11channel);
|
|
|
|
// 10. BOOLEAN *pbMasterOfDMSP
|
|
// ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_DMSP_IS_MASTER, NULL);
|
|
ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_DMSP_IS_MASTER, &priv->pshare->dummy);
|
|
|
|
|
|
// 11. BOOLEAN *pbGetValueFromOtherMac
|
|
// ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_DMSP_GET_VALUE, NULL);
|
|
ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_DMSP_GET_VALUE, &priv->pshare->dummy);
|
|
|
|
// 12. PADAPTER *pBuddyAdapter
|
|
ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_BUDDY_ADAPTOR, NULL);
|
|
|
|
// 13. BOOLEAN *pbBTOperation
|
|
// ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_BT_OPERATION, NULL);
|
|
ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_BT_OPERATION, &priv->pshare->dummy);
|
|
|
|
// 14. BOOLEAN *pbBTDisableEDCATurbo
|
|
// ODM_CmnInfoHook(pOdm, ODM_CMNINFO_BT_DISABLE_EDCA, NULL);
|
|
ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_BT_DISABLE_EDCA, &priv->pshare->dummy);
|
|
|
|
|
|
// 15. BOOLEAN *pbScanInProcess
|
|
ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_SCAN, &priv->pshare->bScanInProcess);
|
|
|
|
// 16. pU4byte force data rate add by YuChen
|
|
ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_FORCED_RATE, &priv->pshare->current_tx_rate);
|
|
|
|
ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_POWER_SAVING, &priv->pshare->dummy);
|
|
|
|
|
|
ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_ONE_PATH_CCA, &priv->pshare->rf_ft_var.one_path_cca);
|
|
|
|
|
|
// dummy
|
|
|
|
ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_DRV_STOP, &priv->pshare->dummy);
|
|
ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_PNP_IN, &priv->pshare->dummy);
|
|
ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_INIT_ON, &priv->pshare->dummy);
|
|
ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_BT_BUSY, &priv->pshare->dummy);
|
|
// ODM_CmnInfoHook(ODMPTR, ODM_CMNINFO_ANT_DIV, &priv->pshare->dummy);
|
|
|
|
//For Phy para verison
|
|
ODM_GetHWImgVersion(ODMPTR);
|
|
|
|
|
|
// DM parameters init
|
|
// ODM_DMInit(ODMPTR);
|
|
|
|
ODM_InitAllTimers(ODMPTR);
|
|
|
|
#ifdef TPT_THREAD
|
|
#if defined(UNIVERSAL_REPEATER) || defined(MBSSID)
|
|
if (IS_ROOT_INTERFACE(priv))
|
|
#endif
|
|
#ifdef CHECK_HANGUP
|
|
if (!priv->reset_hangup)
|
|
#endif
|
|
#ifdef SMART_REPEATER_MODE
|
|
if (!priv->pshare->switch_chan_rp)
|
|
#endif
|
|
ODM_InitAllThreads(ODMPTR);
|
|
#endif
|
|
}
|
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
|
|
unsigned int getval_8b4(struct rtl8192cd_priv *priv, unsigned char rf_path)
|
|
{
|
|
unsigned int tmp_8b4 = 0;
|
|
unsigned int delay = priv->pshare->rf_ft_var.delay_8b4;
|
|
#if 1
|
|
if (rf_path == RF_PATH_A)
|
|
RTL_W8(0x804, 0x3);
|
|
else if (rf_path == RF_PATH_B)
|
|
RTL_W8(0x804, 0x13);
|
|
|
|
RTL_W32(0x808, 0xfccd);
|
|
RTL_W32(0x808, 0x40fccd);
|
|
#else
|
|
if(rf_path == RF_PATH_A)
|
|
{
|
|
RTL_W8(0xc50, 0x20);
|
|
PHY_SetRFReg(priv, RF_PATH_A, 0, bRFRegOffsetMask, 0x33e00);
|
|
RTL_W8(0x804, 0x3);
|
|
RTL_W32(0x808, 0xfccd);
|
|
RTL_W32(0x808, 0x40fccd);
|
|
}
|
|
else if(rf_path == RF_PATH_B)
|
|
{
|
|
RTL_W8(0xc58, 0x20);
|
|
PHY_SetRFReg(priv, RF_PATH_B, 0, bRFRegOffsetMask, 0x33e00);
|
|
RTL_W8(0x804, 0x13);
|
|
RTL_W32(0x808, 0xfccd);
|
|
RTL_W32(0x808, 0x40fccd);
|
|
}
|
|
#endif
|
|
delay_ms(delay);
|
|
tmp_8b4 = RTL_R32(0x8b4);
|
|
|
|
//printk("tmp_8b4[%d] = 0x%x \n", rf_path, tmp_8b4);
|
|
|
|
return tmp_8b4;
|
|
}
|
|
|
|
|
|
void Check_92E_Spur_Valid(struct rtl8192cd_priv * priv, BOOLEAN long_delay)
|
|
{
|
|
#ifdef CONFIG_PCI_HCI
|
|
unsigned char tmp_loop = 0;
|
|
unsigned int path_a_8b4 = 0, Reg0x804 = 0, Reg0x808 = 0;
|
|
unsigned int path_b_8b4 = 0;
|
|
// unsigned long flags;
|
|
unsigned int channel_bak, bw_bak, Offset2nd_bak;
|
|
|
|
watchdog_kick();
|
|
// watchdog_stop(priv);
|
|
|
|
Reg0x804 = RTL_R32(0x804);
|
|
Reg0x808 = RTL_R32(0x808);
|
|
bw_bak = priv->pshare->CurrentChannelBW;
|
|
Offset2nd_bak = priv->pshare->offset_2nd_chan;
|
|
channel_bak = priv->pmib->dot11RFEntry.dot11channel;
|
|
//RESTORE_INT(flags);
|
|
|
|
// Switch to channel 13, bw = 20M
|
|
SwBWMode(priv, HT_CHANNEL_WIDTH_20, HT_2NDCH_OFFSET_DONTCARE);
|
|
SwChnl(priv, 13, HT_2NDCH_OFFSET_DONTCARE);
|
|
|
|
RTL_W8(0xc50, 0x30);
|
|
RTL_W8(0xc58, 0x30);
|
|
|
|
//PHY_SetRFReg(priv, RF_PATH_A, 0x0, bMask20Bits, 0x0);
|
|
RTL_W32(0x88c, 0xccf000c0); //disable 3-wire
|
|
|
|
|
|
path_a_8b4 = getval_8b4(priv, RF92CD_PATH_A);
|
|
path_b_8b4 = getval_8b4(priv, RF92CD_PATH_B);
|
|
|
|
for(tmp_loop = 0 ; tmp_loop < priv->pshare->rf_ft_var.loop_8b4 ; tmp_loop ++) {
|
|
if (path_a_8b4 > priv->pshare->rf_ft_var.thrd_8b4 || path_b_8b4 > priv->pshare->rf_ft_var.thrd_8b4) {
|
|
//PLL reset
|
|
if (long_delay)
|
|
delay_ms(10);
|
|
RTL_W8(0x29, 0x7);
|
|
if (long_delay)
|
|
delay_ms(10);
|
|
RTL_W8(0x29, 0x47);
|
|
|
|
path_a_8b4 = getval_8b4(priv, RF92CD_PATH_A);
|
|
path_b_8b4 = getval_8b4(priv, RF92CD_PATH_B);
|
|
} else {
|
|
break;
|
|
}
|
|
watchdog_kick();
|
|
}
|
|
|
|
if (tmp_loop == priv->pshare->rf_ft_var.loop_8b4) {
|
|
priv->pshare->PLL_reset_ok = false;
|
|
printk("\n[Loop#%d] 0x8b4 = 0x%x[A] 0x%x[B], FAIL1 !!\n\n", tmp_loop, path_a_8b4, path_b_8b4);
|
|
#if 0
|
|
if (long_delay) {
|
|
for(tmp_loop = 0 ; tmp_loop < priv->pshare->rf_ft_var.loop_8b4 ; tmp_loop ++) {
|
|
if (path_a_8b4 > priv->pshare->rf_ft_var.thrd_8b4 || path_b_8b4 > priv->pshare->rf_ft_var.thrd_8b4) {
|
|
//PLL reset
|
|
delay_ms(20);
|
|
RTL_W8(0x29, 0x7);
|
|
delay_ms(20);
|
|
RTL_W8(0x29, 0x47);
|
|
|
|
path_a_8b4 = getval_8b4(priv, RF92CD_PATH_A);
|
|
path_b_8b4 = getval_8b4(priv, RF92CD_PATH_B);
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (tmp_loop == priv->pshare->rf_ft_var.loop_8b4) {
|
|
priv->pshare->PLL_reset_ok = false;
|
|
printk("\n[Loop#%d] 0x8b4 = 0x%x[A] 0x%x[B], FAIL2 !!\n\n", tmp_loop, path_a_8b4, path_b_8b4);
|
|
} else {
|
|
priv->pshare->PLL_reset_ok = true;
|
|
printk("\n[Loop#%d] 0x8b4 = 0x%x[A] 0x%x[B], OK2 !!\n\n", tmp_loop+1, path_a_8b4, path_b_8b4);
|
|
}
|
|
}
|
|
#endif
|
|
} else {
|
|
printk("\n[Loop#%d] 0x8b4 = 0x%x[A] 0x%x[B], OK !!\n\n", tmp_loop+1, path_a_8b4, path_b_8b4);
|
|
priv->pshare->PLL_reset_ok = true;
|
|
}
|
|
|
|
RTL_W32(0x88c, 0xcc0000c0); //enable 3-wire
|
|
|
|
RTL_W8(0xc50, 0x20);
|
|
RTL_W8(0xc58, 0x20);
|
|
RTL_W32(0x804, Reg0x804);
|
|
RTL_W32(0x808, Reg0x808);
|
|
|
|
SwBWMode(priv, bw_bak, Offset2nd_bak);
|
|
SwChnl(priv, channel_bak, Offset2nd_bak);
|
|
//SAVE_INT_AND_CLI(flags);
|
|
#endif // CONFIG_PCI_HCI
|
|
|
|
if (priv->pmib->dot11RFEntry.dot11channel == 13) {
|
|
PHY_SetBBReg(priv, 0xd18, BIT(27), 1);
|
|
PHY_SetBBReg(priv, 0xd2C, BIT(28), 1);
|
|
PHY_SetBBReg(priv, 0xd40, BIT(26), 1);
|
|
} else {
|
|
PHY_SetBBReg(priv, 0xd18, BIT(27), 0);
|
|
PHY_SetBBReg(priv, 0xd2C, BIT(28), 0);
|
|
PHY_SetBBReg(priv, 0xd40, BIT(26), 0);
|
|
}
|
|
|
|
// watchdog_resume(priv);
|
|
}
|
|
|
|
#endif // CONFIG_WLAN_HAL_8192EE
|
|
|
|
// Note: Not all FW version support H2C cmd for disable beacon when edcca on
|
|
// 92e -> v28+, 8812 -> v43+, 8881a -> v10+
|
|
void set_bcn_dont_ignore_edcca(struct rtl8192cd_priv *priv)
|
|
{
|
|
BOOLEAN carrier_sense_enable = FALSE,
|
|
bcn_dont_ignore_edcca = priv->pshare->rf_ft_var.bcn_dont_ignore_edcca,
|
|
adaptivity_enable = priv->pshare->rf_ft_var.adaptivity_enable;
|
|
|
|
#ifdef USE_OUT_SRC
|
|
if (IS_OUTSRC_CHIP(priv))
|
|
carrier_sense_enable = ODMPTR->Carrier_Sense_enable;
|
|
#endif
|
|
|
|
if ( carrier_sense_enable || (adaptivity_enable && bcn_dont_ignore_edcca) ) {
|
|
|
|
DEBUG_INFO("set bcn care edcca\n");
|
|
|
|
#if defined(deCONFIG_WLAN_HAL_8881A) || defined(CONFIG_WLAN_HAL_8192EE)
|
|
if ( (GET_CHIP_VER(priv) == VERSION_8881A) || (GET_CHIP_VER(priv)== VERSION_8192E) ) {
|
|
unsigned char H2CCommand[1]={0};
|
|
GET_HAL_INTERFACE(priv)->FillH2CCmdHandler(priv, H2C_88XX_BCN_IGNORE_EDCCA, 1, H2CCommand);
|
|
}
|
|
#endif
|
|
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
unsigned char H2CCommand[1]={0};
|
|
FillH2CCmd8812(priv, H2C_8812_BCN_IGNORE_EDCCA, 1, H2CCommand);
|
|
}
|
|
#endif
|
|
|
|
#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
unsigned int content = 0;
|
|
unsigned int h2c_cmd_bcn_ignore_edcca = 0xC2;
|
|
|
|
content |= h2c_cmd_bcn_ignore_edcca;
|
|
signin_h2c_cmd(priv, content, 0);
|
|
}
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
int rtl8192cd_init_hw_PCI(struct rtl8192cd_priv *priv)
|
|
{
|
|
struct wifi_mib *pmib;
|
|
unsigned int opmode;
|
|
unsigned long val32;
|
|
unsigned short val16;
|
|
int i;
|
|
#ifdef CONFIG_WLAN_HAL
|
|
unsigned int errorFlag = 0;
|
|
#endif
|
|
#ifndef SMP_SYNC
|
|
unsigned long x;
|
|
#endif
|
|
#if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT)
|
|
unsigned int fwStatus = 0, dwnRetry = 5;
|
|
#endif
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
unsigned int c50_bak, e50_bak;
|
|
#endif
|
|
SAVE_INT_AND_CLI(x);
|
|
|
|
pmib = GET_MIB(priv);
|
|
opmode = priv->pmib->dot11OperationEntry.opmode;
|
|
|
|
DBFENTER;
|
|
|
|
//1 For Test, Firmware Downloading
|
|
|
|
// MacConfigBeforeFwDownload(priv);
|
|
|
|
#if 0 // ==========>> later
|
|
// ===========================================================================================
|
|
// Download Firmware
|
|
// allocate memory for tx cmd packet
|
|
if ((priv->pshare->txcmd_buf = (unsigned char *)kmalloc((LoadPktSize), GFP_ATOMIC)) == NULL) {
|
|
printk("not enough memory for txcmd_buf\n");
|
|
return -1;
|
|
}
|
|
|
|
priv->pshare->cmdbuf_phyaddr = get_physical_addr(priv, priv->pshare->txcmd_buf,
|
|
LoadPktSize, PCI_DMA_TODEVICE);
|
|
|
|
if (LoadFirmware(priv) == FALSE) {
|
|
// panic_printk("Load Firmware Fail!\n");
|
|
panic_printk("Load Firmware check!\n");
|
|
return -1;
|
|
} else {
|
|
// delay_ms(20);
|
|
PRINT_INFO("Load firmware successful! \n");
|
|
}
|
|
#endif
|
|
// MacConfigAfterFwDownload(priv);
|
|
|
|
#if 0 // defined(CONFIG_RTL_92D_SUPPORT) && defined(MP_TEST) // 92D MP DUAL-PHY SETTING
|
|
if (priv->pshare->rf_ft_var.mp_specific && (GET_CHIP_VER(priv) == VERSION_8192D))
|
|
priv->pmib->dot11RFEntry.macPhyMode = DUALMAC_DUALPHY;
|
|
//priv->pmib->dot11RFEntry.macPhyMode = SINGLEMAC_SINGLEPHY;
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
check_chipID_MIMO(priv);
|
|
}
|
|
#endif
|
|
#if 0 //def CONFIG_RTL_92D_SUPPORT
|
|
if (check_MacPhyMode(priv) < 0) {
|
|
printk("Check macPhyMode Fail!\n");
|
|
return -1;
|
|
}
|
|
#endif
|
|
|
|
#ifdef USE_OUT_SRC
|
|
if (IS_OUTSRC_CHIP(priv))
|
|
ODM_software_init(priv);
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
|
|
unsigned int ClkSel = XTAL_CLK_SEL_40M;
|
|
|
|
#if defined(CONFIG_AUTO_PCIE_PHY_SCAN)
|
|
// Get XTAL information from platform
|
|
#if defined(CONFIG_RTL_8881A)
|
|
if ((REG32(0xb8000008) & 0x1000000) != 0x1000000)
|
|
ClkSel = XTAL_CLK_SEL_25M;
|
|
else
|
|
ClkSel = XTAL_CLK_SEL_40M;
|
|
#elif defined(CONFIG_RTL_8196E) || defined(CONFIG_RTL_819XD)
|
|
if ((REG32(0xb8000008) & 0x2000000) != 0x2000000)
|
|
ClkSel = XTAL_CLK_SEL_25M;
|
|
else
|
|
ClkSel = XTAL_CLK_SEL_40M;
|
|
#endif
|
|
|
|
#else
|
|
// independent with platform
|
|
#ifdef CONFIG_PHY_WLAN_EAT_40MHZ
|
|
ClkSel = XTAL_CLK_SEL_40M;
|
|
#else
|
|
ClkSel = XTAL_CLK_SEL_25M;
|
|
#endif //CONFIG_PHY_EAT_40MHZ
|
|
#endif //defined(CONFIG_AUTO_PCIE_PHY_SCAN)
|
|
|
|
|
|
if ( RT_STATUS_SUCCESS != GET_HAL_INTERFACE(priv)->InitPONHandler(priv, ClkSel) ) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_DRV_DBG, (pu1Byte)&errorFlag);
|
|
errorFlag |= DRV_ER_INIT_PON;
|
|
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_DRV_DBG, (pu1Byte)&errorFlag);
|
|
panic_printk("InitPON Failed\n");
|
|
} else {
|
|
printk("InitPON OK\n");
|
|
}
|
|
|
|
if ( RT_STATUS_SUCCESS != GET_HAL_INTERFACE(priv)->InitMACHandler(priv) ) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_DRV_DBG, (pu1Byte)&errorFlag);
|
|
errorFlag |= DRV_ER_INIT_MAC;
|
|
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_DRV_DBG, (pu1Byte)&errorFlag);
|
|
panic_printk("InitMAC Failed\n");
|
|
RESTORE_INT(x);
|
|
return -1;
|
|
} else {
|
|
|
|
printk("InitMAC OK\n");
|
|
}
|
|
|
|
#ifdef CONFIG_PCI_HCI
|
|
if ( RT_STATUS_SUCCESS != GET_HAL_INTERFACE(priv)->InitHCIDMARegHandler(priv) ) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_DRV_DBG, (pu1Byte)&errorFlag);
|
|
errorFlag |= DRV_ER_INIT_HCIDMA;
|
|
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_DRV_DBG, (pu1Byte)&errorFlag);
|
|
panic_printk("InitHCIDMAReg Failed\n");
|
|
} else {
|
|
printk("InitHCIDMAReg OK\n");
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL_8881A
|
|
//Filen, according to RLE0538 setting
|
|
if (GET_CHIP_VER(priv) == VERSION_8881A) {
|
|
//set RF register as PI mode
|
|
RTL_W8(0xc00, RTL_R8(0xc00) | BIT(2));
|
|
RTL_W8(0xe00, RTL_R8(0xe00) | BIT(2));
|
|
}
|
|
#endif // CONFIG_WLAN_HAL_8881A
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{//not HAL
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (priv->pmib->dot11nConfigEntry.dot11nUse40M == HT_CHANNEL_WIDTH_5){
|
|
unsigned int dwTmp1,dwTmp2,dwTmp3 = 0;
|
|
dwTmp1 = RTL_R8(0x301);
|
|
dwTmp2 = RTL_R32(0x808);
|
|
dwTmp2 &= ~(BIT(28) | BIT(29));
|
|
RTL_W8(REG_RSV_CTRL_8812, 0x0); // Enable to write page 3 reg
|
|
RTL_W8(0x301,0xff); // Close dma before clock set to 5M
|
|
RTL_W8(0x303,0x80);
|
|
RTL_W32 (0x808,dwTmp2);
|
|
dwTmp3 = RTL_R8(0x8);
|
|
dwTmp3 &= ~(BIT(7) | BIT(6));
|
|
dwTmp3 |= BIT(7);
|
|
RTL_W8(0x8,dwTmp3);
|
|
RTL_W8(0x301,dwTmp1);// rewrite 301 to default
|
|
RTL_W8(REG_RSV_CTRL_8812, 0x0e);
|
|
}
|
|
#endif
|
|
if (MacInit(priv) == FALSE) {
|
|
#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
|
|
printk("Mac Init failed!!\n");
|
|
RESTORE_INT(x);
|
|
return -1;
|
|
#endif
|
|
}
|
|
}
|
|
|
|
// RTL_W32(AGGLEN_LMT, RTL_R32(AGGLEN_LMT)|(0x0F&AGGLMT_MCS15S_Mask)<<AGGLMT_MCS15S_SHIFT
|
|
// |(0x0F&AGGLMT_MCS15_Mask)<<AGGLMT_MCS15_SHIFT);
|
|
|
|
// RTL_W8(AGGR_BK_TIME, 0x10);
|
|
|
|
//
|
|
// 2. Initialize MAC/PHY Config by MACPHY_reg.txt
|
|
//
|
|
/*
|
|
#if defined(CONFIG_MACBBRF_BY_ODM) && defined(CONFIG_RTL_88E_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
ODM_ConfigMACWithHeaderFile(ODMPTR);
|
|
} else
|
|
#endif
|
|
*/
|
|
#ifdef USE_OUT_SRC
|
|
if (IS_OUTSRC_CHIP(priv) && ODMPTR->ConfigBBRF)
|
|
{
|
|
ODM_ConfigMACWithHeaderFile(ODMPTR);
|
|
}else
|
|
#endif
|
|
{
|
|
panic_printk("\n\n************* Initialize MAC/PHY parameter *************\n");
|
|
if (PHY_ConfigMACWithParaFile(priv) < 0) {
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_DRV_DBG, (pu1Byte)&errorFlag);
|
|
errorFlag |= DRV_ER_INIT_MACPHYREGFILE;
|
|
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_DRV_DBG, (pu1Byte)&errorFlag);
|
|
}
|
|
#endif
|
|
printk("Initialize MAC/PHY Config failure\n");
|
|
RESTORE_INT(x);
|
|
return -1;
|
|
}
|
|
|
|
}
|
|
if(IS_C_CUT_8192E(priv))
|
|
{
|
|
if(priv->pmib->dot11nConfigEntry.dot11nUse40M == HT_CHANNEL_WIDTH_5
|
|
|| priv->pmib->dot11nConfigEntry.dot11nUse40M == HT_CHANNEL_WIDTH_10)
|
|
RTL_W8(0x303,0x80);
|
|
}
|
|
|
|
//
|
|
// 3. Initialize BB After MAC Config PHY_reg.txt, AGC_Tab.txt
|
|
//
|
|
|
|
#ifdef DRVMAC_LB
|
|
if (!priv->pmib->miscEntry.drvmac_lb)
|
|
#endif
|
|
{
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
RESTORE_INT(x);
|
|
val32 = phy_BB88XX_Config_ParaFile(priv);
|
|
SAVE_INT_AND_CLI(x);
|
|
if (val32) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_DRV_DBG, (pu1Byte)&errorFlag);
|
|
errorFlag |= DRV_ER_INIT_BBEGFILE;
|
|
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_DRV_DBG, (pu1Byte)&errorFlag);
|
|
printk("Initialize phy_BB88XX_Config_ParaFile failure\n");
|
|
}
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
val32 = phy_BB8192CD_Config_ParaFile(priv);
|
|
if (val32) {
|
|
RESTORE_INT(x);
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
if (priv->pmib->dot11nConfigEntry.dot11nLDPC)
|
|
RTL_W8(0x913, RTL_R8(0x913)|0x02);
|
|
else
|
|
RTL_W8(0x913, RTL_R8(0x913)&~0x02);
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
if (priv->pmib->dot11RFEntry.xcap != 0xff) {
|
|
PHY_SetBBReg(priv, 0x24, 0xF0, priv->pmib->dot11RFEntry.xcap & 0x0F);
|
|
PHY_SetBBReg(priv, 0x28, 0xF0000000, ((priv->pmib->dot11RFEntry.xcap & 0xF0) >> 4));
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
if (priv->pmib->dot11RFEntry.xcap > 0 && priv->pmib->dot11RFEntry.xcap < 0x3F) {
|
|
int org_val, tmp_val;
|
|
org_val = (RTL_R32(0x24) >> 11) & 0x3F;
|
|
if (org_val > priv->pmib->dot11RFEntry.xcap) {
|
|
for (tmp_val=org_val; tmp_val>=priv->pmib->dot11RFEntry.xcap; tmp_val--) {
|
|
PHY_SetBBReg(priv, 0x24, BIT(11) | BIT(12) | BIT(13) | BIT(14) | BIT(15) | BIT(16), tmp_val & 0x3F);
|
|
PHY_SetBBReg(priv, 0x24, BIT(17) | BIT(18) | BIT(19) | BIT(20) | BIT(21) | BIT(22), tmp_val & 0x3F);
|
|
}
|
|
}
|
|
else {
|
|
for (tmp_val=org_val; tmp_val<=priv->pmib->dot11RFEntry.xcap; tmp_val++) {
|
|
PHY_SetBBReg(priv, 0x24, BIT(11) | BIT(12) | BIT(13) | BIT(14) | BIT(15) | BIT(16), tmp_val & 0x3F);
|
|
PHY_SetBBReg(priv, 0x24, BIT(17) | BIT(18) | BIT(19) | BIT(20) | BIT(21) | BIT(22), tmp_val & 0x3F);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if defined(CONFIG_WLAN_HAL_8192EE) || defined(CONFIG_WLAN_HAL_8881A)
|
|
if ((GET_CHIP_VER(priv)== VERSION_8192E) || (GET_CHIP_VER(priv) == VERSION_8881A)) {
|
|
if (priv->pmib->dot11RFEntry.xcap > 0 && priv->pmib->dot11RFEntry.xcap < 0x3F) {
|
|
int org_val, tmp_val;
|
|
org_val = (RTL_R32(0x2C) >> 12) & 0x3F;
|
|
if (org_val > priv->pmib->dot11RFEntry.xcap) {
|
|
for (tmp_val=org_val; tmp_val>=priv->pmib->dot11RFEntry.xcap; tmp_val--) {
|
|
PHY_SetBBReg(priv, 0x2C, BIT(12) | BIT(13) | BIT(14) | BIT(15) | BIT(16) | BIT(17), tmp_val & 0x3F);
|
|
PHY_SetBBReg(priv, 0x2C, BIT(18) | BIT(19) | BIT(20) | BIT(21) | BIT(22) | BIT(23), tmp_val & 0x3F);
|
|
}
|
|
}
|
|
else {
|
|
for (tmp_val=org_val; tmp_val<=priv->pmib->dot11RFEntry.xcap; tmp_val++) {
|
|
PHY_SetBBReg(priv, 0x2C, BIT(12) | BIT(13) | BIT(14) | BIT(15) | BIT(16) | BIT(17), tmp_val & 0x3F);
|
|
PHY_SetBBReg(priv, 0x2C, BIT(18) | BIT(19) | BIT(20) | BIT(21) | BIT(22) | BIT(23), tmp_val & 0x3F);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
if (priv->pmib->dot11RFEntry.xcap > 0 && priv->pmib->dot11RFEntry.xcap < 0x3F) {
|
|
int org_val, tmp_val;
|
|
org_val = (RTL_R32(0x2C) >> 19) & 0x3F;
|
|
if (org_val > priv->pmib->dot11RFEntry.xcap) {
|
|
for (tmp_val=org_val; tmp_val>=priv->pmib->dot11RFEntry.xcap; tmp_val--) {
|
|
PHY_SetBBReg(priv, 0x2C, BIT(19) | BIT(20) | BIT(21) | BIT(22) | BIT(23) | BIT(24), tmp_val & 0x3F);
|
|
PHY_SetBBReg(priv, 0x2C, BIT(25) | BIT(26) | BIT(27) | BIT(28) | BIT(29) | BIT(30), tmp_val & 0x3F);
|
|
}
|
|
}
|
|
else {
|
|
for (tmp_val=org_val; tmp_val<=priv->pmib->dot11RFEntry.xcap; tmp_val++) {
|
|
PHY_SetBBReg(priv, 0x2C, BIT(19) | BIT(20) | BIT(21) | BIT(22) | BIT(23) | BIT(24), tmp_val & 0x3F);
|
|
PHY_SetBBReg(priv, 0x2C, BIT(25) | BIT(26) | BIT(27) | BIT(28) | BIT(29) | BIT(30), tmp_val & 0x3F);
|
|
}
|
|
}
|
|
}
|
|
|
|
// chang initial gain to avoid loading wrong AGC table, by Arthur
|
|
c50_bak = RTL_R8(0xc50);
|
|
e50_bak = RTL_R8(0xe50);
|
|
|
|
RTL_W8(0xc50, 0x22);
|
|
RTL_W8(0xe50, 0x22);
|
|
|
|
RTL_W8(0xc50, c50_bak);
|
|
RTL_W8(0xe50, e50_bak);
|
|
}
|
|
#endif
|
|
|
|
// support up to MCS7 for 1T1R, modify rx capability here
|
|
/*
|
|
if (get_rf_mimo_mode(priv) == MIMO_1T1R)
|
|
pmib->dot11nConfigEntry.dot11nSupportedMCS &= 0x00ff;
|
|
|
|
*/
|
|
/*
|
|
// Set NAV protection length
|
|
// CF-END Threshold
|
|
if (priv->pmib->dot11OperationEntry.wifi_specific) {
|
|
RTL_W16(NAV_PROT_LEN, 0x80);
|
|
// RTL_W8(CFEND_TH, 0x2);
|
|
}
|
|
else {
|
|
RTL_W16(NAV_PROT_LEN, 0x01C0);
|
|
// RTL_W8(CFEND_TH, 0xFF);
|
|
}
|
|
*/
|
|
//
|
|
// 4. Initiailze RF RAIO_A.txt RF RAIO_B.txt
|
|
//
|
|
// 2007/11/02 MH Before initalizing RF. We can not use FW to do RF-R/W.
|
|
// close loopback, normal mode
|
|
|
|
// For RF test only from Scott's suggestion
|
|
// RTL_W8(0x27, 0xDB); // ==========>> ???
|
|
// RTL_W8(0x1B, 0x07); // ACUT
|
|
|
|
/*
|
|
// set RCR: RX_SHIFT and disable ACF
|
|
// RTL_W8(0x48, 0x3e);
|
|
// RTL_W32(0x48, RTL_R32(0x48) & ~ RCR_ACF & ~RCR_ACRC32);
|
|
RTL_W16(RCR, RCR_AAP | RCR_APM | RCR_ACRC32);
|
|
RTL_W32(RCR, RTL_R32(RCR) & ~ RCR_ACF & ~RCR_ACRC32);
|
|
// for debug by victoryman, 20081119
|
|
// RTL_W32(RCR, RTL_R32(RCR) | RCR_APP_PHYST_RXFF);
|
|
RTL_W32(RCR, RTL_R32(RCR) | RCR_APP_PHYSTS);
|
|
*/
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
#if defined(RTL8192D_INT_PA)
|
|
u8 c9 = priv->pmib->dot11RFEntry.trsw_pape_C9;
|
|
u8 cc = priv->pmib->dot11RFEntry.trsw_pape_CC;
|
|
if ((c9 == 0xAA && cc == 0xA0) || // Type 2 : 5G TRSW+Int. PA, 2G TR co-matched
|
|
(c9 == 0xAA && cc == 0xAF) || // Type 3 : 5G SP3TSW+ Ext.(or Int.)PA, 2G TR co-matched
|
|
(c9 == 0x00 && cc == 0xA0)) { // Type 4 : 5G TRSW+ Ext( or Int.)PA, 2G TRSW+ Ext.(or Int.)PA
|
|
|
|
panic_printk("\n**********************************\n");
|
|
panic_printk("\n** NOTE!! RTL8192D INTERNAL PA! **\n");
|
|
panic_printk("\n**********************************\n");
|
|
|
|
|
|
priv->pshare->rf_ft_var.use_intpa92d = 1;
|
|
priv->pshare->phw->InternalPA5G[0] = 1;
|
|
priv->pshare->phw->InternalPA5G[1] = 1;
|
|
} else {
|
|
// if using default setting, set as external PA for safe.
|
|
priv->pshare->rf_ft_var.use_intpa92d = 0;
|
|
priv->pmib->dot11RFEntry.trsw_pape_C9 = 0x00;
|
|
priv->pmib->dot11RFEntry.trsw_pape_CC = 0xFF;
|
|
priv->pshare->phw->InternalPA5G[0] = 0;
|
|
priv->pshare->phw->InternalPA5G[1] = 0;
|
|
}
|
|
#else
|
|
// to ignore flash setting for external PA
|
|
priv->pmib->dot11RFEntry.trsw_pape_C9 = 0x00;
|
|
priv->pmib->dot11RFEntry.trsw_pape_CC = 0xFF;
|
|
priv->pshare->phw->InternalPA5G[0] = 0;
|
|
priv->pshare->phw->InternalPA5G[1] = 0;
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
RESTORE_INT(x);
|
|
|
|
#ifdef DRVMAC_LB
|
|
if (priv->pmib->miscEntry.drvmac_lb) {
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
RT_OP_MODE OP_Mode = RT_OP_MODE_NO_LINK;
|
|
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_MEDIA_STATUS, (pu1Byte)&OP_Mode);
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{//not HAL
|
|
RTL_W32(CR, (RTL_R32(CR) & ~(NETYPE_Mask << NETYPE_SHIFT)) | ((NETYPE_NOLINK & NETYPE_Mask) << NETYPE_SHIFT));
|
|
}
|
|
drvmac_loopback(priv);
|
|
} else
|
|
#endif
|
|
{
|
|
//#ifdef CHECK_HANGUP
|
|
#if 0
|
|
if (!priv->reset_hangup
|
|
#ifdef CLIENT_MODE
|
|
|| (!(OPMODE & WIFI_AP_STATE) &&
|
|
(priv->join_res != STATE_Sta_Bss) && (priv->join_res != STATE_Sta_Ibss_Active))
|
|
#endif
|
|
)
|
|
#endif
|
|
{
|
|
|
|
//panic_printk("-----------GET_CHIP_VER(priv) = 0x%x----------\n", GET_CHIP_VER(priv));
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
if(ODMPTR->ConfigBBRF)
|
|
{
|
|
val32 = ODM_ConfigRFWithHeaderFile(ODMPTR, CONFIG_RF_RADIO, ODM_RF_PATH_A);
|
|
val32 |= ODM_ConfigRFWithHeaderFile(ODMPTR, CONFIG_RF_RADIO, ODM_RF_PATH_B);
|
|
val32 |= ODM_ConfigRFWithHeaderFile(ODMPTR, CONFIG_RF_RADIO, ODM_RF_PATH_C);
|
|
val32 |= ODM_ConfigRFWithHeaderFile(ODMPTR, CONFIG_RF_RADIO, ODM_RF_PATH_D);
|
|
}
|
|
else
|
|
val32 = phy_RF6052_Config_ParaFile(priv);
|
|
|
|
|
|
#if defined(CONFIG_WLAN_HAL_8881A) || defined(CONFIG_WLAN_HAL_8814AE)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8881A) ||(GET_CHIP_VER(priv) == VERSION_8814A))
|
|
{
|
|
if (val32) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_DRV_DBG, (pu1Byte)&errorFlag);
|
|
errorFlag |= DRV_ER_INIT_PHYRF;
|
|
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_DRV_DBG, (pu1Byte)&errorFlag);
|
|
}
|
|
priv->pshare->No_RF_Write = 1;
|
|
}
|
|
//eric-8814 else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
|
|
if (val32)
|
|
return -1;
|
|
}
|
|
else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{//not HAL
|
|
#if 0 //eric-8814 defined(CONFIG_MACBBRF_BY_ODM) && defined(CONFIG_RTL_88E_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
priv->pshare->phw->NumTotalRFPath = 1;
|
|
val32 = ODM_ConfigRFWithHeaderFile(ODMPTR, CONFIG_RF_RADIO, ODM_RF_PATH_A);
|
|
} else
|
|
#endif
|
|
#ifdef USE_OUT_SRC
|
|
if(ODMPTR->ConfigBBRF)
|
|
{
|
|
val32 = ODM_ConfigRFWithHeaderFile(ODMPTR, CONFIG_RF_RADIO, ODM_RF_PATH_A);
|
|
val32 |= ODM_ConfigRFWithHeaderFile(ODMPTR, CONFIG_RF_RADIO, ODM_RF_PATH_B);
|
|
val32 |= ODM_ConfigRFWithHeaderFile(ODMPTR, CONFIG_RF_RADIO, ODM_RF_PATH_C);
|
|
val32 |= ODM_ConfigRFWithHeaderFile(ODMPTR, CONFIG_RF_RADIO, ODM_RF_PATH_D);
|
|
}
|
|
else
|
|
#endif
|
|
val32 = phy_RF6052_Config_ParaFile(priv);
|
|
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E)
|
|
priv->pshare->phw->NumTotalRFPath = 1;
|
|
else
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if ( IS_HAL_CHIP(priv)) { //8881A, 92E
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_NUM_TOTAL_RF_PATH, (pu1Byte)&priv->pshare->phw->NumTotalRFPath);
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif //CONFIG_WLAN_HAL
|
|
priv->pshare->phw->NumTotalRFPath = 2; //8812A
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT //eric_test
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E)
|
|
priv->pshare->No_RF_Write = 1;
|
|
#endif
|
|
if (val32)
|
|
return -1;
|
|
|
|
SAVE_INT_AND_CLI(x);
|
|
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if (IS_UMC_A_CUT_88C(priv)) {
|
|
PHY_SetRFReg(priv, RF92CD_PATH_A, RF_RX_G1, bMask20Bits, 0x30255);
|
|
PHY_SetRFReg(priv, RF92CD_PATH_A, RF_RX_G2, bMask20Bits, 0x50a00);
|
|
} else if (IS_UMC_B_CUT_88C(priv)) {
|
|
|
|
PHY_SetRFReg(priv, RF92CD_PATH_A, 0x1e, bMask20Bits, 0x03 | (PHY_QueryRFReg(priv, RF92CD_PATH_A, 0x1e, bMaskDWord, 1) & 0xff0f0));
|
|
PHY_SetRFReg(priv, RF92CD_PATH_A, 0x1f, bMask20Bits, 0x200 | (PHY_QueryRFReg(priv, RF92CD_PATH_A, 0x1f, bMaskDWord, 1) & 0xff0ff));
|
|
#if 0
|
|
PHY_SetRFReg(priv, RF92CD_PATH_A, 0x0c, bMask20Bits, 0x0008992f);
|
|
PHY_SetRFReg(priv, RF92CD_PATH_A, 0x0a, bMask20Bits, 0x0001aef1);
|
|
PHY_SetRFReg(priv, RF92CD_PATH_A, 0x15, bMask20Bits, 0x0008f425);
|
|
#endif
|
|
}
|
|
#endif
|
|
RESTORE_INT(x);
|
|
}
|
|
}
|
|
}
|
|
|
|
SAVE_INT_AND_CLI(x);
|
|
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
//Do nothing
|
|
//MacConfig() is integrated in code below
|
|
//Don't enable BB here
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{//not HAL
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
unsigned int eRFPath, curMaxRFPath = ((priv->pmib->dot11RFEntry.macPhyMode == SINGLEMAC_SINGLEPHY) ? RF92CD_PATH_MAX : RF92CD_PATH_B);
|
|
for (eRFPath = RF92CD_PATH_A; eRFPath < curMaxRFPath; eRFPath++) {
|
|
priv->pshare->RegRF18[eRFPath] = PHY_QueryRFReg(priv, eRFPath, 0x18, bMask20Bits, 1);
|
|
priv->pshare->RegRF28[eRFPath] = PHY_QueryRFReg(priv, eRFPath, 0x28, bMask20Bits, 1);
|
|
}
|
|
UpdateBBRFVal8192DE(priv);
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) != VERSION_8812E)
|
|
#endif
|
|
{
|
|
/*---- Set CCK and OFDM Block "ON"----*/
|
|
PHY_SetBBReg(priv, rFPGA0_RFMOD, bOFDMEn, 1);
|
|
#if defined(CONFIG_RTL_92D_SUPPORT)
|
|
if (!(priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_5G))
|
|
#endif
|
|
PHY_SetBBReg(priv, rFPGA0_RFMOD, bCCKEn, 1);
|
|
|
|
MacConfig(priv);
|
|
}
|
|
|
|
/*
|
|
* Force CCK CCA for High Power products
|
|
*/
|
|
#ifdef HIGH_POWER_EXT_LNA
|
|
if (priv->pshare->rf_ft_var.use_ext_lna)
|
|
RTL_W8(0xa0a, 0xcd);
|
|
#endif
|
|
}
|
|
|
|
// RTL_W8(BW_OPMODE, BIT(2)); // 40Mhz:0 20Mhz:1
|
|
// RTL_W32(MACIDR,0x0);
|
|
|
|
// under loopback mode
|
|
// RTL_W32(MACIDR,0xffffffff); // need to confirm
|
|
/*
|
|
#ifdef CONFIG_NET_PCI
|
|
if (IS_PCIBIOS_TYPE)
|
|
pci_unmap_single(priv->pshare->pdev, priv->pshare->cmdbuf_phyaddr,
|
|
(LoadPktSize), PCI_DMA_TODEVICE);
|
|
#endif
|
|
*/
|
|
#if 0
|
|
// RTL_W32(0x230, 0x40000000); //for test
|
|
////////////////////////////////////////////////////////////
|
|
|
|
printk("init_hw: 1\n");
|
|
|
|
RTL_W16(SIFS_OFDM, 0x1010);
|
|
RTL_W8(SLOT_TIME, 0x09);
|
|
|
|
RTL_W8(MSR, MSR_AP);
|
|
|
|
// RTL_W8(MSR,MSR_INFRA);
|
|
// for test, loopback
|
|
// RTL_W8(MSR, MSR_NOLINK);
|
|
// RTL_W8(LBKMD_SEL, BIT(0)| BIT(1) );
|
|
// RTL_W16(LBDLY, 0xffff);
|
|
|
|
//beacon related
|
|
RTL_W16(BCN_INTERVAL, pmib->dot11StationConfigEntry.dot11BeaconPeriod);
|
|
RTL_W16(ATIMWND, 2); //0
|
|
RTL_W16(BCN_DRV_EARLY_INT, 10 << 4); // 2
|
|
RTL_W16(BCN_DMATIME, 256); // 0xf
|
|
RTL_W16(SIFS_OFDM, 0x0e0e);
|
|
RTL_W8(SLOT_TIME, 0x10);
|
|
|
|
// CamResetAllEntry(priv);
|
|
RTL_W16(SECR, 0x0000);
|
|
|
|
// By H.Y. advice
|
|
// RTL_W16(_BCNTCFG_, 0x060a);
|
|
// if (OPMODE & WIFI_AP_STATE)
|
|
// RTL_W16(BCNTCFG, 0x000a);
|
|
// else
|
|
// for debug
|
|
// RTL_W16(_BCNTCFG_, 0x060a);
|
|
// RTL_W16(BCNTCFG, 0x0204);
|
|
|
|
init_beacon(priv);
|
|
|
|
priv->pshare->InterruptMask = (IMR_ROK | IMR_VODOK | IMR_VIDOK | IMR_BEDOK | IMR_BKDOK | \
|
|
IMR_HCCADOK | IMR_MGNTDOK | IMR_COMDOK | IMR_HIGHDOK | \
|
|
IMR_BDOK | /*IMR_RXCMDOK | IMR_TIMEOUT0 |*/ IMR_RDU | IMR_RXFOVW | \
|
|
IMR_BcnInt/* | IMR_TXFOVW*/ /*| IMR_TBDOK | IMR_TBDER*/) ;// IMR_ROK | IMR_BcnInt | IMR_RDU | IMR_RXFOVW | IMR_RXCMDOK;
|
|
|
|
// priv->pshare->InterruptMask = IMR_ROK| IMR_BDOK | IMR_BcnInt | IMR_MGNTDOK | IMR_TBDOK | IMR_RDU ;
|
|
// priv->pshare->InterruptMask = 0;
|
|
priv->pshare->InterruptMaskExt = 0;
|
|
RTL_W32(IMR, priv->pshare->InterruptMask);
|
|
RTL_W32(IMR + 4, priv->pshare->InterruptMaskExt);
|
|
|
|
//////////////////////////////////////////////////////////////
|
|
printk("end of init hw\n");
|
|
|
|
return 0;
|
|
|
|
#endif
|
|
// clear TPPoll
|
|
// RTL_W16(TPPoll, 0x0);
|
|
// Should 8192SE do this initialize? I don't know yet, 080812. Joshua
|
|
// PJ 1-5-2007 Reset PHY parameter counters
|
|
// RTL_W32(0xD00, RTL_R32(0xD00)|BIT(27));
|
|
// RTL_W32(0xD00, RTL_R32(0xD00)&(~(BIT(27))));
|
|
/*
|
|
// configure timing parameter
|
|
RTL_W8(ACK_TIMEOUT, 0x30);
|
|
RTL_W8(PIFS_TIME,0x13);
|
|
// RTL_W16(LBDLY, 0x060F);
|
|
// RTL_W16(SIFS_OFDM, 0x0e0e);
|
|
// RTL_W8(SLOT_TIME, 0x10);
|
|
if (priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) {
|
|
RTL_W16(SIFS_OFDM, 0x0a0a);
|
|
RTL_W8(SLOT_TIME, 0x09);
|
|
}
|
|
else if (priv->pmib->dot11BssType.net_work_type & WIRELESS_11A) {
|
|
RTL_W16(SIFS_OFDM, 0x0a0a);
|
|
RTL_W8(SLOT_TIME, 0x09);
|
|
}
|
|
else if (priv->pmib->dot11BssType.net_work_type & WIRELESS_11G) {
|
|
RTL_W16(SIFS_OFDM, 0x0a0a);
|
|
RTL_W8(SLOT_TIME, 0x09);
|
|
}
|
|
else { // WIRELESS_11B
|
|
RTL_W16(SIFS_OFDM, 0x0a0a);
|
|
RTL_W8(SLOT_TIME, 0x14);
|
|
}
|
|
*/
|
|
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
RT_OP_MODE OP_Mode;
|
|
MACCONFIG_PARA MacCfgPara;
|
|
u2Byte beaconPeriod;
|
|
|
|
if (opmode & WIFI_AP_STATE) {
|
|
DEBUG_INFO("AP-mode enabled...\n");
|
|
#if defined(CONFIG_RTK_MESH) //Mesh Mode but mesh not enable
|
|
if (priv->pmib->dot11WdsInfo.wdsPure || priv->pmib->dot1180211sInfo.meshSilence )
|
|
#else
|
|
if (priv->pmib->dot11WdsInfo.wdsPure)
|
|
#endif
|
|
{
|
|
OP_Mode = RT_OP_MODE_NO_LINK;
|
|
} else {
|
|
OP_Mode = RT_OP_MODE_AP;
|
|
}
|
|
} else if (opmode & WIFI_STATION_STATE) {
|
|
DEBUG_INFO("Station-mode enabled...\n");
|
|
OP_Mode = RT_OP_MODE_INFRASTRUCTURE;
|
|
} else if (opmode & WIFI_ADHOC_STATE) {
|
|
DEBUG_INFO("Adhoc-mode enabled...\n");
|
|
OP_Mode = RT_OP_MODE_IBSS;
|
|
} else {
|
|
printk("Operation mode error!\n");
|
|
RESTORE_INT(x);
|
|
return 2;
|
|
}
|
|
|
|
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_MEDIA_STATUS, (pu1Byte)&OP_Mode);
|
|
|
|
MacCfgPara.AckTO = priv->pmib->miscEntry.ack_timeout;
|
|
MacCfgPara.vap_enable = GET_ROOT(priv)->pmib->miscEntry.vap_enable;
|
|
MacCfgPara.OP_Mode = OP_Mode;
|
|
MacCfgPara.dot11DTIMPeriod = priv->pmib->dot11StationConfigEntry.dot11DTIMPeriod;
|
|
beaconPeriod = pmib->dot11StationConfigEntry.dot11BeaconPeriod;
|
|
|
|
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_BEACON_INTERVAL, (pu1Byte)&beaconPeriod);
|
|
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_MAC_CONFIG, (pu1Byte)&MacCfgPara);
|
|
}
|
|
#endif
|
|
|
|
#if !defined(USE_OUT_SRC) || defined(_OUTSRC_COEXIST)
|
|
#ifdef _OUTSRC_COEXIST
|
|
if (!IS_OUTSRC_CHIP(priv))
|
|
#endif
|
|
init_EDCA_para(priv, pmib->dot11BssType.net_work_type);
|
|
#endif
|
|
|
|
// we don't have EEPROM yet, Mark this for FPGA Platform
|
|
// RTL_W8(_9346CR_, CR9346_CFGRW);
|
|
|
|
// 92SE Windows driver does not set the PCIF as 0x77, seems HW bug?
|
|
// Set Tx and Rx DMA burst size
|
|
// RTL_W8(PCIF, 0x77);
|
|
// Enable byte shift
|
|
// RTL_W8(_PCIF_+2, 0x01);
|
|
|
|
/*
|
|
// Retry Limit
|
|
if (priv->pmib->dot11OperationEntry.dot11LongRetryLimit)
|
|
val16 = priv->pmib->dot11OperationEntry.dot11LongRetryLimit & 0xff;
|
|
else {
|
|
if (priv->pmib->dot11BssType.net_work_type & WIRELESS_11N)
|
|
val16 = 0x30;
|
|
else
|
|
val16 = 0x06;
|
|
}
|
|
if (priv->pmib->dot11OperationEntry.dot11ShortRetryLimit)
|
|
val16 |= ((priv->pmib->dot11OperationEntry.dot11ShortRetryLimit & 0xff) << 8);
|
|
else {
|
|
if (priv->pmib->dot11BssType.net_work_type & WIRELESS_11N)
|
|
val16 |= (0x30 << 8);
|
|
else
|
|
val16 |= (0x06 << 8);
|
|
}
|
|
RTL_W16(RETRY_LIMIT, val16);
|
|
|
|
This should be done later, but Windows Driver not done yet.
|
|
// Response Rate Set
|
|
// let ACK sent by highest of 24Mbps
|
|
val32 = 0x1ff;
|
|
if (pmib->dot11RFEntry.shortpreamble)
|
|
val32 |= BIT(23);
|
|
RTL_W32(_RRSR_, val32);
|
|
*/
|
|
|
|
|
|
|
|
|
|
// panic_printk("0x2c4 = bitmap = 0x%08x\n", (unsigned int)val32);
|
|
// panic_printk("0x2c0 = cmd | macid | band = 0x%08x\n", 0xfd0000a2 | (1<<9 | (sta_band & 0xf))<<8);
|
|
// panic_printk("Add id %d val %08x to ratr\n", 0, (unsigned int)val32);
|
|
|
|
/* for (i = 0; i < 8; i++)
|
|
RTL_W32(ARFR0+i*4, val32 & 0x1f0ff0f0);
|
|
*/
|
|
|
|
//settting initial rate for control frame to 24M
|
|
// RTL_W8(INIRTSMCS_SEL, 8); // ==========>> later
|
|
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
u8 MulticastAddr[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
|
|
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_MULTICAST_REG, (pu1Byte)MulticastAddr);
|
|
|
|
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_BSSID, (pu1Byte)pmib->dot11OperationEntry.hwaddr);
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{//not HAL
|
|
//setting MAR
|
|
RTL_W32(MAR, 0xffffffff);
|
|
RTL_W32((MAR + 4), 0xffffffff);
|
|
|
|
//setting BSSID, not matter AH/AP/station
|
|
memcpy((void *)&val32, (pmib->dot11OperationEntry.hwaddr), 4);
|
|
memcpy((void *)&val16, (pmib->dot11OperationEntry.hwaddr + 4), 2);
|
|
RTL_W32(BSSIDR, cpu_to_le32(val32));
|
|
RTL_W16((BSSIDR + 4), cpu_to_le16(val16));
|
|
// RTL_W32(BSSIDR, 0x814ce000);
|
|
// RTL_W16((BSSIDR + 4), 0xee92);
|
|
}
|
|
|
|
//setting TCR
|
|
//TCR, use default value
|
|
|
|
//setting RCR // set in MacConfigAfterFwDownload
|
|
// RTL_W32(_RCR_, _APWRMGT_ | _AMF_ | _ADF_ | _AICV_ | _ACRC32_ | _AB_ | _AM_ | _APM_);
|
|
// if (pmib->dot11OperationEntry.crc_log)
|
|
// RTL_W32(_RCR_, RTL_R32(_RCR_) | _ACRC32_);
|
|
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
//3 Integrated into SetHwRegHandler(priv, HW_VAR_MAC_CONFIG, &MacCfgPara);
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{//not HAL
|
|
// setting network type
|
|
if (opmode & WIFI_AP_STATE) {
|
|
DEBUG_INFO("AP-mode enabled...\n");
|
|
|
|
#if defined(CONFIG_RTK_MESH) //Mesh Mode but mesh not enable
|
|
if (priv->pmib->dot11WdsInfo.wdsPure || priv->pmib->dot1180211sInfo.meshSilence )
|
|
#else
|
|
if (priv->pmib->dot11WdsInfo.wdsPure)
|
|
#endif
|
|
{
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
//WDEBUG("pure WDS mode\n");
|
|
RTL_W32(CR, (RTL_R32(CR) & ~(NETYPE_Mask << NETYPE_SHIFT)) | ((NETYPE_INFRA & NETYPE_Mask) << NETYPE_SHIFT));
|
|
} else
|
|
#endif
|
|
{
|
|
RTL_W32(CR, (RTL_R32(CR) & ~(NETYPE_Mask << NETYPE_SHIFT)) | ((NETYPE_NOLINK & NETYPE_Mask) << NETYPE_SHIFT));
|
|
}
|
|
|
|
} else {
|
|
RTL_W32(CR, (RTL_R32(CR) & ~(NETYPE_Mask << NETYPE_SHIFT)) | ((NETYPE_AP & NETYPE_Mask) << NETYPE_SHIFT));
|
|
}
|
|
// Move init beacon after f/w download
|
|
#if 0
|
|
if (priv->auto_channel == 0) {
|
|
DEBUG_INFO("going to init beacon\n");
|
|
init_beacon(priv);
|
|
}
|
|
#endif
|
|
}
|
|
#ifdef CLIENT_MODE
|
|
else if (opmode & WIFI_STATION_STATE) {
|
|
DEBUG_INFO("Station-mode enabled...\n");
|
|
RTL_W32(CR, (RTL_R32(CR) & ~(NETYPE_Mask << NETYPE_SHIFT)) | ((NETYPE_INFRA & NETYPE_Mask) << NETYPE_SHIFT));
|
|
} else if (opmode & WIFI_ADHOC_STATE) {
|
|
DEBUG_INFO("Adhoc-mode enabled...\n");
|
|
RTL_W32(CR, (RTL_R32(CR) & ~(NETYPE_Mask << NETYPE_SHIFT)) | ((NETYPE_ADHOC & NETYPE_Mask) << NETYPE_SHIFT));
|
|
}
|
|
#endif
|
|
else {
|
|
printk("Operation mode error!\n");
|
|
RESTORE_INT(x);
|
|
return 2;
|
|
}
|
|
}
|
|
|
|
|
|
//3 Security Related
|
|
|
|
CamResetAllEntry(priv);
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
SECURITY_CONFIG_OPERATION SCO = 0;
|
|
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_SECURITY_CONFIG, (pu1Byte)&SCO);
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{//not HAL
|
|
RTL_W16(SECCFG, 0);
|
|
}
|
|
if ((OPMODE & (WIFI_AP_STATE | WIFI_STATION_STATE | WIFI_ADHOC_STATE)) &&
|
|
!priv->pmib->dot118021xAuthEntry.dot118021xAlgrthm &&
|
|
(pmib->dot1180211AuthEntry.dot11PrivacyAlgrthm == _WEP_40_PRIVACY_ ||
|
|
pmib->dot1180211AuthEntry.dot11PrivacyAlgrthm == _WEP_104_PRIVACY_)) {
|
|
pmib->dot11GroupKeysTable.dot11Privacy = pmib->dot1180211AuthEntry.dot11PrivacyAlgrthm;
|
|
if (pmib->dot1180211AuthEntry.dot11PrivacyAlgrthm == _WEP_40_PRIVACY_)
|
|
i = 5;
|
|
else
|
|
i = 13;
|
|
#ifdef USE_WEP_DEFAULT_KEY
|
|
memcpy(pmib->dot11GroupKeysTable.dot11EncryptKey.dot11TTKey.skey,
|
|
&priv->pmib->dot11DefaultKeysTable.keytype[pmib->dot1180211AuthEntry.dot11PrivacyKeyIndex].skey[0], i);
|
|
pmib->dot11GroupKeysTable.dot11EncryptKey.dot11TTKeyLen = i;
|
|
pmib->dot11GroupKeysTable.keyid = pmib->dot1180211AuthEntry.dot11PrivacyKeyIndex;
|
|
pmib->dot11GroupKeysTable.keyInCam = 0;
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
SECURITY_CONFIG_OPERATION SCO;
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_SECURITY_CONFIG, (pu1Byte)&SCO);
|
|
SCO |= SCO_NOSKMC;
|
|
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_SECURITY_CONFIG, (pu1Byte)&SCO);
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{//not HAL
|
|
RTL_W16(SECCFG, RTL_R16(SECCFG) | NOSKMC); // no search multicast
|
|
}
|
|
#else
|
|
#if defined(CONFIG_RTL8196B_KLD) || defined(CONFIG_RTL8196C_KLD)
|
|
memcpy(pmib->dot11GroupKeysTable.dot11EncryptKey.dot11TTKey.skey,
|
|
&priv->pmib->dot11DefaultKeysTable.keytype[pmib->dot1180211AuthEntry.dot11PrivacyKeyIndex].skey[0], i);
|
|
#else
|
|
memcpy(pmib->dot11GroupKeysTable.dot11EncryptKey.dot11TTKey.skey,
|
|
&priv->pmib->dot11DefaultKeysTable.keytype[0].skey[0], i);
|
|
#endif
|
|
pmib->dot11GroupKeysTable.dot11EncryptKey.dot11TTKeyLen = i;
|
|
pmib->dot11GroupKeysTable.keyid = pmib->dot1180211AuthEntry.dot11PrivacyKeyIndex;
|
|
pmib->dot11GroupKeysTable.keyInCam = 0;
|
|
#endif
|
|
}
|
|
|
|
// for debug
|
|
#if 0
|
|
// when hangup reset, re-init TKIP/AES key in ad-hoc mode
|
|
#ifdef CLIENT_MODE
|
|
if ((OPMODE & WIFI_ADHOC_STATE) && pmib->dot11OperationEntry.keep_rsnie &&
|
|
(pmib->dot1180211AuthEntry.dot11PrivacyAlgrthm == _TKIP_PRIVACY_ ||
|
|
pmib->dot1180211AuthEntry.dot11PrivacyAlgrthm == _CCMP_PRIVACY_)) {
|
|
DOT11_SET_KEY Set_Key;
|
|
Set_Key.KeyType = DOT11_KeyType_Group;
|
|
Set_Key.EncType = pmib->dot11GroupKeysTable.dot11Privacy;
|
|
DOT11_Process_Set_Key(priv->dev, NULL, &Set_Key, pmib->dot11GroupKeysTable.dot11EncryptKey.dot11TTKey.skey);
|
|
} else
|
|
#endif
|
|
//-------------------------------------- david+2006-06-30
|
|
// restore group key if it has been set before open, david
|
|
if (pmib->dot11GroupKeysTable.keyInCam) {
|
|
int retVal;
|
|
retVal = CamAddOneEntry(priv, (unsigned char *)"\xff\xff\xff\xff\xff\xff",
|
|
pmib->dot11GroupKeysTable.keyid,
|
|
pmib->dot11GroupKeysTable.dot11Privacy << 2,
|
|
0, pmib->dot11GroupKeysTable.dot11EncryptKey.dot11TTKey.skey);
|
|
if (retVal)
|
|
priv->pshare->CamEntryOccupied++;
|
|
else {
|
|
DEBUG_ERR("Add group key failed!\n");
|
|
}
|
|
}
|
|
#endif
|
|
//here add if legacy WEP
|
|
// if 1x is enabled, do not set default key, david
|
|
#ifdef USE_WEP_DEFAULT_KEY
|
|
#ifdef MBSSID
|
|
if (!(OPMODE & WIFI_AP_STATE) || !priv->pmib->miscEntry.vap_enable)
|
|
#endif
|
|
{
|
|
if (!SWCRYPTO && !IEEE8021X_FUN &&
|
|
(pmib->dot1180211AuthEntry.dot11PrivacyAlgrthm == _WEP_104_PRIVACY_ ||
|
|
pmib->dot1180211AuthEntry.dot11PrivacyAlgrthm == _WEP_40_PRIVACY_))
|
|
init_DefaultKey_Enc(priv, NULL, 0);
|
|
}
|
|
#endif
|
|
|
|
|
|
//3 MAC Beacon Tming Related
|
|
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
//Do Nothing
|
|
// Integrated into code above
|
|
//3 Integrated into SetHwRegHandler(priv, HW_VAR_MAC_CONFIG, &MacCfgPara);
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{//not HAL
|
|
|
|
//Setup Beacon Interval/interrupt interval, ATIM-WIND ATIM-Interrupt
|
|
RTL_W32(MBSSID_BCN_SPACE, pmib->dot11StationConfigEntry.dot11BeaconPeriod);
|
|
//Setting BCNITV is done by firmware now
|
|
// set_fw_reg(priv, (0xF1000000 | (pmib->dot11StationConfigEntry.dot11BeaconPeriod << 8)), 0, 0);
|
|
// Set max AMPDU aggregation time
|
|
// int max_aggre_time = 0xc0; // in 4us
|
|
// set_fw_reg(priv, (0xFD0000B1|((max_aggre_time << 8) & 0xff00)), 0 ,0);
|
|
|
|
// RTL_W32(0x2A4, 0x00006300);
|
|
// RTL_W32(0x2A0, 0xb026007C);
|
|
// delay_ms(1);
|
|
// while(RTL_R32(0x2A0) != 0){};
|
|
//RTL_W16(TBTT_PROHIBIT, 0xc804);
|
|
|
|
if((OPMODE & WIFI_AP_STATE ))
|
|
{ // for pure AP mode + repeater mode + APWDS + Mbssid
|
|
if ( (priv->pmib->miscEntry.vap_enable) || (priv->pmib->dot11StationConfigEntry.dot11BeaconPeriod <= 40)){
|
|
RTL_W32(TBTT_PROHIBIT, 0x1df04);
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) && (defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI))
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E)
|
|
RTL_W16(ATIMWND, 18);
|
|
#endif
|
|
}else{
|
|
RTL_W32(TBTT_PROHIBIT, 0x40004);
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) && (defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI))
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E)
|
|
RTL_W16(ATIMWND, 35);
|
|
#endif
|
|
}
|
|
// for pure WDS
|
|
if((priv->pmib->dot11WdsInfo.wdsEnabled && priv->pmib->dot11WdsInfo.wdsPure)) // pure wds mode
|
|
{
|
|
RTL_W32(TBTT_PROHIBIT, 0x104);
|
|
}
|
|
}else{
|
|
// for STA mode only
|
|
RTL_W32(TBTT_PROHIBIT, 0x104);
|
|
}
|
|
|
|
|
|
RTL_W8(DRVERLYINT, 10);
|
|
RTL_W8(BCNDMATIM, 1);
|
|
/*
|
|
if (priv->pshare->rf_ft_var.bcast_to_dzq)
|
|
RTL_W16(ATIMWND, 0x0a);
|
|
else
|
|
RTL_W16(ATIMWND, 5);
|
|
*/
|
|
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
RTL_W16(ATIMWND, 0x10);
|
|
RTL_W8(REG_92E_DTIM_COUNT_ROOT, priv->pmib->dot11StationConfigEntry.dot11DTIMPeriod);
|
|
RTL_W32(REG_92E_PKT_LIFETIME_CTRL, RTL_R32(REG_92E_PKT_LIFETIME_CTRL) & ~BIT(19));
|
|
} else
|
|
#endif
|
|
{
|
|
#if defined(CONFIG_PCI_HCI)
|
|
RTL_W16(ATIMWND, 1);
|
|
#endif
|
|
}
|
|
|
|
/*
|
|
if (!((OPMODE & WIFI_AP_STATE)
|
|
#if defined(WDS) && defined(CONFIG_RTK_MESH)
|
|
&& ((priv->pmib->dot11WdsInfo.wdsEnabled && priv->pmib->dot11WdsInfo.wdsPure) || priv->pmib->dot1180211sInfo.meshSilence))
|
|
#elif defined(WDS)
|
|
&& priv->pmib->dot11WdsInfo.wdsEnabled && priv->pmib->dot11WdsInfo.wdsPure )
|
|
#elif defined(CONFIG_RTK_MESH) //Mesh Mode but mesh not enable
|
|
&& priv->pmib->dot1180211sInfo.meshSilence )
|
|
#else
|
|
)
|
|
#endif
|
|
)
|
|
|
|
RTL_W16(BCN_DRV_EARLY_INT, RTL_R16(BCN_DRV_EARLY_INT)|BIT(15)); // sw beacon
|
|
*/
|
|
#ifdef MBSSID
|
|
if (priv->pmib->miscEntry.vap_enable && RTL8192CD_NUM_VWLAN == 1 &&
|
|
priv->pmib->dot11StationConfigEntry.dot11BeaconPeriod < 30)
|
|
//RTL_W16(BCN_DRV_EARLY_INT, (RTL_R16(BCN_DRV_EARLY_INT)&0xf00f) | ((6<<4)&0xff0));
|
|
RTL_W8(DRVERLYINT, 6);
|
|
#endif
|
|
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E)
|
|
RTL_W8(REG_92E_PRE_DL_BCN_ITV, RTL_R8(DRVERLYINT) + 1);
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if (IS_TEST_CHIP(priv) && ((GET_CHIP_VER(priv) == VERSION_8188C) || (GET_CHIP_VER(priv) == VERSION_8192C))) {
|
|
RTL_W8(BCN_CTRL, 0);
|
|
RTL_W8(0x553, 1);
|
|
RTL_W8(BCN_CTRL, EN_BCN_FUNCTION);
|
|
// RTL_W16(BCN_DMATIME, 0x400); // 1ms
|
|
|
|
// for debug
|
|
#ifdef CLIENT_MODE
|
|
if (OPMODE & WIFI_ADHOC_STATE)
|
|
RTL_W8(BCN_MAX_ERR, 0xff);
|
|
#endif
|
|
} else
|
|
#endif
|
|
{
|
|
RTL_W8(BCN_CTRL, DIS_TSF_UPDATE_N | DIS_SUB_STATE_N );
|
|
RTL_W8(BCN_MAX_ERR, 0xff);
|
|
RTL_W16(0x518, 0);
|
|
RTL_W8(0x553, 3);
|
|
if (OPMODE & WIFI_STATION_STATE)
|
|
RTL_W8(0x422, RTL_R8(0x422) ^ BIT(6));
|
|
|
|
if ((priv->pmib->dot11WdsInfo.wdsPure == 0)
|
|
#ifdef MP_TEST
|
|
&& (!priv->pshare->rf_ft_var.mp_specific)
|
|
#endif
|
|
) {
|
|
RTL_W8(BCN_CTRL, RTL_R8(BCN_CTRL) | EN_BCN_FUNCTION | EN_TXBCN_RPT);
|
|
} else {
|
|
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
//WDEBUG("pure WDS mode\n");
|
|
RTL_W8(BCN_CTRL, 0);
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
//--------------
|
|
|
|
// By H.Y. advice
|
|
// RTL_W16(_BCNTCFG_, 0x060a);
|
|
if (OPMODE & WIFI_AP_STATE)
|
|
RTL_W16(BCNTCFG, 0x320c); //RTL_W16(BCNTCFG, 0x000a);
|
|
else
|
|
// for debug
|
|
// RTL_W16(_BCNTCFG_, 0x060a);
|
|
RTL_W16(BCNTCFG, 0x0204);
|
|
}
|
|
|
|
//3 IMR Related
|
|
//3 Download Firmware Related
|
|
// Ack ISR, and then unmask IMR
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
if (opmode & WIFI_AP_STATE) {
|
|
GET_HAL_INTERFACE(priv)->InitIMRHandler(priv, RT_OP_MODE_AP);
|
|
} else if (opmode & WIFI_STATION_STATE) {
|
|
GET_HAL_INTERFACE(priv)->InitIMRHandler(priv, RT_OP_MODE_INFRASTRUCTURE);
|
|
} else if (opmode & WIFI_ADHOC_STATE) {
|
|
GET_HAL_INTERFACE(priv)->InitIMRHandler(priv, RT_OP_MODE_IBSS);
|
|
}
|
|
|
|
// TODO: Filen, no need to sync !?
|
|
priv->pshare->InterruptMask = _GET_HAL_DATA(priv)->IntMask[0];
|
|
priv->pshare->InterruptMask = _GET_HAL_DATA(priv)->IntMask[1];
|
|
|
|
// TODO: Filen, check download 8051 firmware
|
|
//Download Firmware
|
|
|
|
RESTORE_INT(x);
|
|
if ( RT_STATUS_SUCCESS != GET_HAL_INTERFACE(priv)->InitFirmwareHandler(priv)) {
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_DRV_DBG, (pu1Byte)&errorFlag);
|
|
errorFlag |= DRV_ER_INIT_DLFW;
|
|
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_DRV_DBG, (pu1Byte)&errorFlag);
|
|
printk("InitDownload FW Fail\n");
|
|
} else {
|
|
printk("InitDownload FW OK \n");
|
|
}
|
|
SAVE_INT_AND_CLI(x);
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{//not HAL
|
|
#if 1
|
|
#ifdef CONFIG_PCI_HCI
|
|
// Ack ISR, and then unmask IMR
|
|
#if 0
|
|
RTL_W32(ISR, RTL_R32(ISR));
|
|
RTL_W32(ISR + 4, RTL_R16(ISR + 4));
|
|
RTL_W32(IMR, 0x0);
|
|
RTL_W32(IMR + 4, 0x0);
|
|
priv->pshare->InterruptMask = _ROK_ | _BCNDMAINT_ | _RDU_ | _RXFOVW_ | _RXCMDOK_;
|
|
priv->pshare->InterruptMask = (IMR_ROK | IMR_VODOK | IMR_VIDOK | IMR_BEDOK | IMR_BKDOK | \
|
|
IMR_HCCADOK | IMR_MGNTDOK | IMR_COMDOK | IMR_HIGHDOK | \
|
|
IMR_BDOK | IMR_RXCMDOK | /*IMR_TIMEOUT0 |*/ IMR_RDU | IMR_RXFOVW | \
|
|
IMR_BcnInt/* | IMR_TXFOVW*/ /*| IMR_TBDOK | IMR_TBDER*/);// IMR_ROK | IMR_BcnInt | IMR_RDU | IMR_RXFOVW | IMR_RXCMDOK;
|
|
#endif
|
|
//priv->pshare->InterruptMask = HIMR_ROK | HIMR_BCNDMA0 | HIMR_RDU | HIMR_RXFOVW;
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
priv->pshare->InterruptMask = HIMR_88E_ROK | HIMR_88E_HISR1_IND_INT;
|
|
priv->pshare->InterruptMaskExt = HIMRE_88E_RXFOVW;
|
|
} else
|
|
#endif
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
priv->pshare->InterruptMask = HIMR_92E_ROK | HIMR_92E_HISR1_IND_INT;
|
|
priv->pshare->InterruptMaskExt = HIMRE_92E_RXFOVW;
|
|
#ifdef BEAMFORMING_SUPPORT
|
|
if (priv->pmib->dot11RFEntry.txbf == 1) {
|
|
priv->pshare->InterruptMask |= IMR_GTINT3_8812;
|
|
}
|
|
#endif
|
|
} else
|
|
#endif
|
|
{
|
|
priv->pshare->InterruptMask = HIMR_ROK | HIMR_BCNDMA0 | HIMR_RXFOVW;
|
|
priv->pshare->InterruptMaskExt = 0;
|
|
}
|
|
|
|
#ifdef MP_TEST
|
|
if (priv->pshare->rf_ft_var.mp_specific) {
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E)
|
|
priv->pshare->InterruptMask |= HIMR_88E_BEDOK;
|
|
else
|
|
#endif
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E)
|
|
priv->pshare->InterruptMask |= IMR_BEDOK_8812;
|
|
else
|
|
#endif
|
|
#ifdef CONFIG_WLAN_HAL
|
|
//3 Integrated into HAL code
|
|
#endif
|
|
priv->pshare->InterruptMask |= HIMR_BEDOK;
|
|
}
|
|
#endif
|
|
|
|
if (opmode & WIFI_AP_STATE) {
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E)
|
|
priv->pshare->InterruptMask |= HIMR_88E_BcnInt | HIMR_88E_TBDOK | HIMR_88E_TBDER;
|
|
else
|
|
#endif
|
|
#if defined(CONFIG_RTL_92E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192E) || (GET_CHIP_VER(priv) == VERSION_8812E)) {
|
|
if (priv->pmib->dot11WdsInfo.wdsPure) {
|
|
//WDEBUG("pure-WDS mode don't enable HIMR_92E_BcnInt | HIMR_92E_TBDOK | HIMR_92E_TBDER \n");
|
|
} else {
|
|
priv->pshare->InterruptMask |= HIMR_92E_BcnInt | HIMR_92E_TBDOK | HIMR_92E_TBDER;
|
|
}
|
|
} else
|
|
#endif
|
|
{
|
|
priv->pshare->InterruptMask |= HIMR_BCNDOK0 | HIMR_TXBCNERR;
|
|
}
|
|
}
|
|
#ifdef CLIENT_MODE
|
|
else if (opmode & WIFI_ADHOC_STATE) {
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E)
|
|
priv->pshare->InterruptMask |= HIMR_88E_BcnInt | HIMR_88E_TBDOK | HIMR_88E_TBDER;
|
|
else
|
|
#endif
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E)
|
|
priv->pshare->InterruptMask |= HIMR_92E_BcnInt | HIMR_92E_TBDOK | HIMR_92E_TBDER;
|
|
else
|
|
#endif
|
|
priv->pshare->InterruptMask |= (HIMR_TXBCNERR | HIMR_TXBCNOK);
|
|
}
|
|
#endif
|
|
|
|
#endif // CONFIG_PCI_HCI
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
#ifdef CONFIG_USB_HCI
|
|
#ifdef CONFIG_SUPPORT_USB_INT
|
|
priv->pshare->InterruptMask = 0;
|
|
priv->pshare->InterruptMaskExt = HIMRE_88E_TXERR | HIMRE_88E_RXERR | HIMRE_88E_TXFOVW | HIMRE_88E_RXFOVW;
|
|
|
|
#ifdef CONFIG_INTERRUPT_BASED_TXBCN
|
|
if (opmode & WIFI_AP_STATE)
|
|
priv->pshare->InterruptMask |= HIMR_88E_BcnInt | HIMR_88E_TBDOK | HIMR_88E_TBDER;
|
|
else if (opmode & WIFI_ADHOC_STATE)
|
|
priv->pshare->InterruptMask |= HIMR_88E_BcnInt | HIMR_88E_TBDOK | HIMR_88E_TBDER;
|
|
#endif
|
|
#endif // CONFIG_SUPPORT_USB_INT
|
|
#endif // CONFIG_USB_HCI
|
|
|
|
#ifdef CONFIG_SDIO_HCI
|
|
//
|
|
// Initialize and enable SDIO Host Interrupt.
|
|
//
|
|
InitSdioInterrupt(priv);
|
|
#endif
|
|
#endif // CONFIG_RTL_88E_SUPPORT
|
|
|
|
// FGPA does not have eeprom now
|
|
// RTL_W8(_9346CR_, 0);
|
|
/*
|
|
// ===========================================================================================
|
|
// Download Firmware
|
|
// allocate memory for tx cmd packet
|
|
if((priv->pshare->txcmd_buf = (unsigned char *)kmalloc((LoadPktSize), GFP_ATOMIC)) == NULL) {
|
|
printk("not enough memory for txcmd_buf\n");
|
|
return -1;
|
|
}
|
|
|
|
priv->pshare->cmdbuf_phyaddr = get_physical_addr(priv, priv->pshare->txcmd_buf,
|
|
LoadPktSize, PCI_DMA_TODEVICE);
|
|
*/
|
|
|
|
#if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT)
|
|
if (
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
(GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)
|
|
#endif
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
||
|
|
#endif
|
|
(GET_CHIP_VER(priv) == VERSION_8192D)
|
|
#endif
|
|
) {
|
|
/* currently need not to download fw */
|
|
rtl8192cd_ReadFwHdr(priv);
|
|
|
|
while (dwnRetry-- && !fwStatus) {
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D)
|
|
fwStatus = Load_92D_Firmware(priv);
|
|
#endif
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C))
|
|
fwStatus = Load_92C_Firmware(priv);
|
|
#endif
|
|
delay_ms(20);
|
|
};
|
|
if (fwStatus) {
|
|
DEBUG_INFO("Load firmware successful!\n");
|
|
} else {
|
|
DEBUG_INFO("Load firmware check!\n");
|
|
#ifdef PCIE_POWER_SAVING
|
|
priv->pshare->rf_ft_var.power_save &= ~( L1_en | L2_en);
|
|
#endif
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
if (RTL_R8(0x1c5) == 0xE0) {
|
|
DEBUG_INFO("RTL8192D part number failed!!\n");
|
|
RESTORE_INT(x);
|
|
return -1;
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
#if defined(__KERNEL__) && (defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI))
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
rtl8192cd_ReadFwHdr(priv);
|
|
|
|
fwStatus = Load_88E_Firmware(priv);
|
|
if (fwStatus) {
|
|
DEBUG_INFO("Load firmware successful!\n");
|
|
} else {
|
|
DEBUG_INFO("Load firmware check!\n");
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
extern RT_STATUS FirmwareDownload8812(struct rtl8192cd_priv * priv);
|
|
rtl8192cd_ReadFwHdr(priv);
|
|
priv->bFWReady = ! (0 ^ FirmwareDownload8812(priv));
|
|
}
|
|
#endif
|
|
}
|
|
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (errorFlag) {
|
|
panic_printk("%s, %d, errorFlag:%08x \n", __FUNCTION__, __LINE__, errorFlag);
|
|
RESTORE_INT(x);
|
|
return -1;
|
|
}
|
|
#endif
|
|
/*
|
|
MacConfigAfterFwDownload(priv);
|
|
*/
|
|
|
|
// Adaptive Rate Table for Basic Rate
|
|
val32 = 0;
|
|
for (i = 0; i < 32; i++) {
|
|
if (AP_BSSRATE[i]) {
|
|
if (AP_BSSRATE[i] & 0x80)
|
|
val32 |= get_bit_value_from_ieee_value(AP_BSSRATE[i] & 0x7f);
|
|
}
|
|
}
|
|
val32 |= (priv->pmib->dot11nConfigEntry.dot11nBasicMCS << 12);
|
|
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
// Do Nothing
|
|
// Filen: it is not necessary to check !?
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{//not HAL
|
|
unsigned int delay_count = 10;
|
|
do {
|
|
if (!is_h2c_buf_occupy(priv))
|
|
break;
|
|
delay_us(5);
|
|
delay_count--;
|
|
} while (delay_count);
|
|
}
|
|
|
|
#ifdef P2P_SUPPORT
|
|
if (OPMODE & WIFI_P2P_SUPPORT) {
|
|
#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_92C_SUPPORT)
|
|
P2P_DEBUG("managment frame G only \n");
|
|
set_RATid_cmd(priv, 0, ARFR_G_ONLY, val32); // under P2P mode
|
|
#endif
|
|
} else
|
|
#endif
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_5G) {
|
|
#ifdef USB_POWER_SUPPORT
|
|
val32 &= USB_RA_MASK;
|
|
#endif
|
|
set_RATid_cmd(priv, 0, ARFR_Band_A_BMC, val32);
|
|
} else
|
|
set_RATid_cmd(priv, 0, ARFR_BMC, val32);
|
|
}
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
else if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)) {
|
|
set_RATid_cmd(priv, 0, ARFR_BMC, val32);
|
|
}
|
|
#endif
|
|
else
|
|
#endif
|
|
{
|
|
#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_92C_SUPPORT)
|
|
set_RATid_cmd(priv, 0, ARFR_BMC, val32);
|
|
#endif
|
|
}
|
|
|
|
// kfree(priv->pshare->txcmd_buf);
|
|
|
|
#ifdef MP_TEST
|
|
if (!priv->pshare->rf_ft_var.mp_specific)
|
|
#endif
|
|
if (opmode & WIFI_AP_STATE) {
|
|
if (priv->auto_channel == 0) {
|
|
DEBUG_INFO("going to init beacon\n");
|
|
init_beacon(priv);
|
|
}
|
|
}
|
|
|
|
//3 Enable IMR
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
#if 0 //Filen: defer to open after drv_open
|
|
GET_HAL_INTERFACE(priv)->EnableIMRHandler(priv);
|
|
#endif
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{//not HAL
|
|
#ifdef CONFIG_PCI_HCI
|
|
//enable interrupt
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
RTL_W32(REG_88E_HIMR, priv->pshare->InterruptMask);
|
|
RTL_W32(REG_88E_HIMRE, priv->pshare->InterruptMaskExt);
|
|
} else
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
#ifdef DRVMAC_LB
|
|
priv->pshare->InterruptMask &= ~HIMR_92E_BcnInt;
|
|
#endif
|
|
#ifdef TXREPORT
|
|
priv->pshare->InterruptMask |= HIMR_92E_C2HCMD;
|
|
#endif
|
|
RTL_W32(REG_HIMR0_8812, priv->pshare->InterruptMask);
|
|
RTL_W32(REG_HIMR1_8812, priv->pshare->InterruptMaskExt);
|
|
} else
|
|
#endif
|
|
{
|
|
RTL_W32(HIMR, priv->pshare->InterruptMask);
|
|
}
|
|
// RTL_W32(IMR+4, priv->pshare->InterruptMaskExt);
|
|
// RTL_W32(IMR, 0xffffffff);
|
|
// RTL_W8(IMR+4, 0x3f);
|
|
#endif // CONFIG_PCI_HCI
|
|
|
|
#if defined(CONFIG_USB_HCI) && defined(CONFIG_RTL_88E_SUPPORT)
|
|
#ifdef CONFIG_SUPPORT_USB_INT
|
|
RTL_W32(REG_88E_HIMR, priv->pshare->InterruptMask);
|
|
RTL_W32(REG_88E_HIMRE, priv->pshare->InterruptMaskExt);
|
|
|
|
// REG_USB_SPECIAL_OPTION - BIT(4)
|
|
// 0; Use interrupt endpoint to upload interrupt pkt
|
|
// 1; Use bulk endpoint to upload interrupt pkt,
|
|
|
|
#ifdef CONFIG_USB_INTERRUPT_IN_PIPE
|
|
if(pHalData->RtIntInPipe == 0x05)
|
|
RTL_W8(REG_USB_SPECIAL_OPTION, RTL_R8(REG_USB_SPECIAL_OPTION) & (~INT_BULK_SEL));
|
|
else
|
|
#endif
|
|
RTL_W8(REG_USB_SPECIAL_OPTION, RTL_R8(REG_USB_SPECIAL_OPTION) | (INT_BULK_SEL));
|
|
#endif // CONFIG_SUPPORT_USB_INT
|
|
#endif // CONFIG_USB_HCI && CONFIG_RTL_88E_SUPPORT
|
|
}
|
|
|
|
// ===========================================================================================
|
|
|
|
#ifdef CHECK_HANGUP
|
|
if (priv->reset_hangup)
|
|
priv->pshare->CurrentChannelBW = priv->pshare->is_40m_bw;
|
|
else
|
|
#endif
|
|
{
|
|
if (opmode & WIFI_AP_STATE)
|
|
priv->pshare->CurrentChannelBW = priv->pshare->is_40m_bw;
|
|
else
|
|
priv->pshare->CurrentChannelBW = HT_CHANNEL_WIDTH_20;
|
|
}
|
|
|
|
if (!priv->pshare->rf_ft_var.disable_pwr_by_rate
|
|
#ifdef SUPPORT_RTL8188E_TC
|
|
&& (!((GET_CHIP_VER(priv) == VERSION_8188E) && IS_TEST_CHIP(priv)))
|
|
#endif
|
|
)
|
|
{
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv)==VERSION_8812E) {
|
|
*(unsigned int *)(&priv->pshare->phw->CCKTxAgc_A[0]) = cpu_to_be32(RTL_R32(rTxAGC_A_CCK11_CCK1_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->OFDMTxAgcOffset_A[0]) = cpu_to_be32(RTL_R32(rTxAGC_A_Ofdm18_Ofdm6_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->OFDMTxAgcOffset_A[4]) = cpu_to_be32(RTL_R32(rTxAGC_A_Ofdm54_Ofdm24_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_A[0]) = cpu_to_be32(RTL_R32(rTxAGC_A_MCS3_MCS0_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_A[4]) = cpu_to_be32(RTL_R32(rTxAGC_A_MCS7_MCS4_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_A[8]) = cpu_to_be32(RTL_R32(rTxAGC_A_MCS11_MCS8_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_A[12]) = cpu_to_be32(RTL_R32(rTxAGC_A_MCS15_MCS12_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->VHTTxAgcOffset_A[0]) = cpu_to_be32(RTL_R32(rTxAGC_A_Nss1Index3_Nss1Index0_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->VHTTxAgcOffset_A[4]) = cpu_to_be32(RTL_R32(rTxAGC_A_Nss1Index7_Nss1Index4_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->VHTTxAgcOffset_A[8]) = cpu_to_be32(RTL_R32(rTxAGC_A_Nss2Index1_Nss1Index8_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->VHTTxAgcOffset_A[12]) = cpu_to_be32(RTL_R32(rTxAGC_A_Nss2Index5_Nss2Index2_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->VHTTxAgcOffset_A[16]) = cpu_to_be32(RTL_R32(rTxAGC_A_Nss2Index9_Nss2Index6_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->CCKTxAgc_B[0]) = cpu_to_be32(RTL_R32(rTxAGC_B_CCK11_CCK1_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->OFDMTxAgcOffset_B[0]) = cpu_to_be32(RTL_R32(rTxAGC_B_Ofdm18_Ofdm6_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->OFDMTxAgcOffset_B[4]) = cpu_to_be32(RTL_R32(rTxAGC_B_Ofdm54_Ofdm24_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_B[0]) = cpu_to_be32(RTL_R32(rTxAGC_B_MCS3_MCS0_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_B[4]) = cpu_to_be32(RTL_R32(rTxAGC_B_MCS7_MCS4_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_B[8]) = cpu_to_be32(RTL_R32(rTxAGC_B_MCS11_MCS8_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_B[12]) = cpu_to_be32(RTL_R32(rTxAGC_B_MCS15_MCS12_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->VHTTxAgcOffset_B[0]) = cpu_to_be32(RTL_R32(rTxAGC_B_Nss1Index3_Nss1Index0_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->VHTTxAgcOffset_B[4]) = cpu_to_be32(RTL_R32(rTxAGC_B_Nss1Index7_Nss1Index4_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->VHTTxAgcOffset_B[8]) = cpu_to_be32(RTL_R32(rTxAGC_B_Nss2Index1_Nss1Index8_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->VHTTxAgcOffset_B[12]) = cpu_to_be32(RTL_R32(rTxAGC_B_Nss2Index5_Nss2Index2_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->VHTTxAgcOffset_B[16]) = cpu_to_be32(RTL_R32(rTxAGC_B_Nss2Index9_Nss2Index6_JAguar));
|
|
} else
|
|
#endif
|
|
#ifdef CONFIG_WLAN_HAL_8881A
|
|
if (GET_CHIP_VER(priv)==VERSION_8881A) {
|
|
*(unsigned int *)(&priv->pshare->phw->CCKTxAgc_A[0]) = cpu_to_be32(RTL_R32(rTxAGC_A_CCK11_CCK1_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->OFDMTxAgcOffset_A[0]) = cpu_to_be32(RTL_R32(rTxAGC_A_Ofdm18_Ofdm6_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->OFDMTxAgcOffset_A[4]) = cpu_to_be32(RTL_R32(rTxAGC_A_Ofdm54_Ofdm24_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_A[0]) = cpu_to_be32(RTL_R32(rTxAGC_A_MCS3_MCS0_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_A[4]) = cpu_to_be32(RTL_R32(rTxAGC_A_MCS7_MCS4_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_A[8]) = cpu_to_be32(RTL_R32(rTxAGC_A_MCS11_MCS8_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_A[12]) = cpu_to_be32(RTL_R32(rTxAGC_A_MCS15_MCS12_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->VHTTxAgcOffset_A[0]) = cpu_to_be32(RTL_R32(rTxAGC_A_Nss1Index3_Nss1Index0_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->VHTTxAgcOffset_A[4]) = cpu_to_be32(RTL_R32(rTxAGC_A_Nss1Index7_Nss1Index4_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->VHTTxAgcOffset_A[8]) = cpu_to_be32(RTL_R32(rTxAGC_A_Nss2Index1_Nss1Index8_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->VHTTxAgcOffset_A[12]) = cpu_to_be32(RTL_R32(rTxAGC_A_Nss2Index5_Nss2Index2_JAguar));
|
|
*(unsigned int *)(&priv->pshare->phw->VHTTxAgcOffset_A[16]) = cpu_to_be32(RTL_R32(rTxAGC_A_Nss2Index9_Nss2Index6_JAguar));
|
|
} else
|
|
#endif
|
|
{
|
|
// get default Tx AGC offset
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_A[0]) = cpu_to_be32(RTL_R32(rTxAGC_A_Mcs03_Mcs00));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_A[4]) = cpu_to_be32(RTL_R32(rTxAGC_A_Mcs07_Mcs04));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_A[8]) = cpu_to_be32(RTL_R32(rTxAGC_A_Mcs11_Mcs08));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_A[12]) = cpu_to_be32(RTL_R32(rTxAGC_A_Mcs15_Mcs12));
|
|
*(unsigned int *)(&priv->pshare->phw->OFDMTxAgcOffset_A[0]) = cpu_to_be32(RTL_R32(rTxAGC_A_Rate18_06));
|
|
*(unsigned int *)(&priv->pshare->phw->OFDMTxAgcOffset_A[4]) = cpu_to_be32(RTL_R32(rTxAGC_A_Rate54_24));
|
|
*(unsigned int *)(&priv->pshare->phw->CCKTxAgc_A[0]) = cpu_to_be32((RTL_R32(rTxAGC_A_CCK11_2_B_CCK11) & 0xffffff00)
|
|
| RTL_R8(rTxAGC_A_CCK1_Mcs32 + 1));
|
|
|
|
#if defined(CONFIG_RTL_92D_SUPPORT)&& defined(CONFIG_RTL_92D_DMDP)
|
|
if (priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY && priv->pshare->wlandev_idx == 1) {
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_A[0]) = cpu_to_be32(RTL_R32(rTxAGC_B_Mcs03_Mcs00));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_A[4]) = cpu_to_be32(RTL_R32(rTxAGC_B_Mcs07_Mcs04));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_A[8]) = cpu_to_be32(RTL_R32(rTxAGC_B_Mcs11_Mcs08));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_A[12]) = cpu_to_be32(RTL_R32(rTxAGC_B_Mcs15_Mcs12));
|
|
*(unsigned int *)(&priv->pshare->phw->OFDMTxAgcOffset_A[0]) = cpu_to_be32(RTL_R32(rTxAGC_B_Rate18_06));
|
|
*(unsigned int *)(&priv->pshare->phw->OFDMTxAgcOffset_A[4]) = cpu_to_be32(RTL_R32(rTxAGC_B_Rate54_24));
|
|
*(unsigned int *)(&priv->pshare->phw->CCKTxAgc_A[0]) = cpu_to_be32((RTL_R8(rTxAGC_A_CCK11_2_B_CCK11) << 24)
|
|
| (RTL_R32(rTxAGC_B_CCK5_1_Mcs32) >> 8));
|
|
}
|
|
#endif
|
|
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_B[0]) = cpu_to_be32(RTL_R32(rTxAGC_B_Mcs03_Mcs00));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_B[4]) = cpu_to_be32(RTL_R32(rTxAGC_B_Mcs07_Mcs04));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_B[8]) = cpu_to_be32(RTL_R32(rTxAGC_B_Mcs11_Mcs08));
|
|
*(unsigned int *)(&priv->pshare->phw->MCSTxAgcOffset_B[12]) = cpu_to_be32(RTL_R32(rTxAGC_B_Mcs15_Mcs12));
|
|
*(unsigned int *)(&priv->pshare->phw->OFDMTxAgcOffset_B[0]) = cpu_to_be32(RTL_R32(rTxAGC_B_Rate18_06));
|
|
*(unsigned int *)(&priv->pshare->phw->OFDMTxAgcOffset_B[4]) = cpu_to_be32(RTL_R32(rTxAGC_B_Rate54_24));
|
|
*(unsigned int *)(&priv->pshare->phw->CCKTxAgc_B[0]) = cpu_to_be32((RTL_R8(rTxAGC_A_CCK11_2_B_CCK11) << 24)
|
|
| (RTL_R32(rTxAGC_B_CCK5_1_Mcs32) >> 8));
|
|
}
|
|
|
|
if (priv->pshare->txpwr_pg_format_abs)
|
|
{
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_2G) {
|
|
//CCK
|
|
priv->pshare->tgpwr_CCK_new[RF_PATH_A] = priv->pshare->phw->CCKTxAgc_A[0];
|
|
priv->pshare->tgpwr_CCK_new[RF_PATH_B] = priv->pshare->phw->CCKTxAgc_B[0];
|
|
for (i=0;i<4;i++) {
|
|
priv->pshare->phw->CCKTxAgc_A[i] -= priv->pshare->tgpwr_CCK_new[RF_PATH_A];
|
|
priv->pshare->phw->CCKTxAgc_B[i] -= priv->pshare->tgpwr_CCK_new[RF_PATH_B];
|
|
}
|
|
}
|
|
//OFDM
|
|
priv->pshare->tgpwr_OFDM_new[RF_PATH_A] = priv->pshare->phw->OFDMTxAgcOffset_A[4];
|
|
priv->pshare->tgpwr_OFDM_new[RF_PATH_B] = priv->pshare->phw->OFDMTxAgcOffset_B[4];
|
|
for (i=0;i<8;i++) {
|
|
priv->pshare->phw->OFDMTxAgcOffset_A[i] -= priv->pshare->tgpwr_OFDM_new[RF_PATH_A];
|
|
priv->pshare->phw->OFDMTxAgcOffset_B[i] -= priv->pshare->tgpwr_OFDM_new[RF_PATH_B];
|
|
}
|
|
|
|
//HT-1S
|
|
priv->pshare->tgpwr_HT1S_new[RF_PATH_A] = priv->pshare->phw->MCSTxAgcOffset_A[4];
|
|
priv->pshare->tgpwr_HT1S_new[RF_PATH_B] = priv->pshare->phw->MCSTxAgcOffset_B[4];
|
|
for (i=0;i<8;i++) {
|
|
priv->pshare->phw->MCSTxAgcOffset_A[i] -= priv->pshare->tgpwr_HT1S_new[RF_PATH_A];
|
|
priv->pshare->phw->MCSTxAgcOffset_B[i] -= priv->pshare->tgpwr_HT1S_new[RF_PATH_B];
|
|
}
|
|
|
|
//HT-2S
|
|
priv->pshare->tgpwr_HT2S_new[RF_PATH_A] = priv->pshare->phw->MCSTxAgcOffset_A[12];
|
|
priv->pshare->tgpwr_HT2S_new[RF_PATH_B] = priv->pshare->phw->MCSTxAgcOffset_B[12];
|
|
for (i=8;i<16;i++) {
|
|
priv->pshare->phw->MCSTxAgcOffset_A[i] -= priv->pshare->tgpwr_HT2S_new[RF_PATH_A];
|
|
priv->pshare->phw->MCSTxAgcOffset_B[i] -= priv->pshare->tgpwr_HT2S_new[RF_PATH_B];
|
|
}
|
|
#ifdef RTK_AC_SUPPORT
|
|
if ((GET_CHIP_VER(priv)==VERSION_8812E) || (GET_CHIP_VER(priv)==VERSION_8881A)) {
|
|
//VHT-1S
|
|
priv->pshare->tgpwr_VHT1S_new[RF_PATH_A] = priv->pshare->phw->VHTTxAgcOffset_A[4];
|
|
priv->pshare->tgpwr_VHT1S_new[RF_PATH_B] = priv->pshare->phw->VHTTxAgcOffset_B[4];
|
|
//VHT-2S
|
|
priv->pshare->tgpwr_VHT2S_new[RF_PATH_A] = priv->pshare->phw->VHTTxAgcOffset_A[18];
|
|
priv->pshare->tgpwr_VHT2S_new[RF_PATH_B] = priv->pshare->phw->VHTTxAgcOffset_B[18];
|
|
|
|
for (i=0 ; i<20 ; i++) {
|
|
if (i<8) {
|
|
priv->pshare->phw->VHTTxAgcOffset_A[i] -= priv->pshare->tgpwr_HT1S_new[RF_PATH_A];
|
|
priv->pshare->phw->VHTTxAgcOffset_B[i] -= priv->pshare->tgpwr_HT1S_new[RF_PATH_B];
|
|
} else if (i==10 || i==11) {
|
|
priv->pshare->phw->VHTTxAgcOffset_A[i] = priv->pshare->tgpwr_HT1S_new[RF_PATH_A] - priv->pshare->phw->VHTTxAgcOffset_A[i];
|
|
priv->pshare->phw->VHTTxAgcOffset_B[i] = priv->pshare->tgpwr_HT1S_new[RF_PATH_B] - priv->pshare->phw->VHTTxAgcOffset_B[i];
|
|
} else if (i==16 || i==17) {
|
|
priv->pshare->phw->VHTTxAgcOffset_A[i] = priv->pshare->tgpwr_HT2S_new[RF_PATH_A] - priv->pshare->phw->VHTTxAgcOffset_A[i];
|
|
priv->pshare->phw->VHTTxAgcOffset_B[i] = priv->pshare->tgpwr_HT2S_new[RF_PATH_B] - priv->pshare->phw->VHTTxAgcOffset_B[i];
|
|
} else {
|
|
priv->pshare->phw->VHTTxAgcOffset_A[i] -= priv->pshare->tgpwr_HT2S_new[RF_PATH_A];
|
|
priv->pshare->phw->VHTTxAgcOffset_B[i] -= priv->pshare->tgpwr_HT2S_new[RF_PATH_B];
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
}
|
|
|
|
#ifdef ADD_TX_POWER_BY_CMD
|
|
assign_txpwr_offset(priv);
|
|
#endif
|
|
|
|
#ifdef TXPWR_LMT
|
|
if (!priv->pshare->rf_ft_var.disable_txpwrlmt)
|
|
{
|
|
#ifdef TXPWR_LMT_NEWFILE
|
|
if((GET_CHIP_VER(priv) == VERSION_8812E) || (GET_CHIP_VER(priv) == VERSION_8188E) || IS_HAL_CHIP(priv))
|
|
PHY_ConfigTXLmtWithParaFile_new(priv);
|
|
else if (CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
PHY_ConfigTXLmtWithParaFile(priv);
|
|
}
|
|
#endif
|
|
RESTORE_INT(x);
|
|
|
|
#ifdef _TRACKING_TABLE_FILE
|
|
if (priv->pshare->rf_ft_var.pwr_track_file) {
|
|
if((ODMPTR->ConfigBBRF) && (GET_CHIP_VER(priv) != VERSION_8188E))
|
|
ODM_ConfigRFWithTxPwrTrackHeaderFile(ODMPTR);
|
|
else
|
|
PHY_ConfigTXPwrTrackingWithParaFile(priv);
|
|
}
|
|
#endif
|
|
|
|
|
|
#if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C) || (GET_CHIP_VER(priv) == VERSION_8192D)) {
|
|
if ((priv->pmib->dot11RFEntry.ther < 0x07) || (priv->pmib->dot11RFEntry.ther > 0x1d)) {
|
|
DEBUG_ERR("TPT: unreasonable target ther %d, disable tpt\n", priv->pmib->dot11RFEntry.ther);
|
|
priv->pmib->dot11RFEntry.ther = 0;
|
|
}
|
|
} else
|
|
#endif
|
|
{
|
|
if ((priv->pmib->dot11RFEntry.ther < 0x07) || (priv->pmib->dot11RFEntry.ther > 0x32)) {
|
|
DEBUG_ERR("TPT: unreasonable target ther %d, disable tpt\n", priv->pmib->dot11RFEntry.ther);
|
|
priv->pmib->dot11RFEntry.ther = 0;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
if (opmode & WIFI_AP_STATE)
|
|
{
|
|
if (priv->auto_channel == 0) {
|
|
DEBUG_INFO("going to init beacon\n");
|
|
init_beacon(priv);
|
|
}
|
|
}
|
|
*/
|
|
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
#ifdef CONFIG_WLAN_HAL_8881A
|
|
if (GET_CHIP_VER(priv) == VERSION_8881A) {
|
|
//Don't enable BB here
|
|
}
|
|
#endif // CONFIG_WLAN_HAL_8881A
|
|
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E) {
|
|
// TODO: Filen, check 8192E BB/RF control
|
|
//Don't enable BB here
|
|
}
|
|
#endif //CONFIG_WLAN_HAL_8192EE
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{//not HAL
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) != VERSION_8812E)
|
|
#endif
|
|
{
|
|
/*---- Set CCK and OFDM Block "ON"----*/
|
|
PHY_SetBBReg(priv, rFPGA0_RFMOD, bOFDMEn, 1);
|
|
#if defined(CONFIG_RTL_92D_SUPPORT)
|
|
if (!(priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_5G))
|
|
#endif
|
|
PHY_SetBBReg(priv, rFPGA0_RFMOD, bCCKEn, 1);
|
|
}
|
|
}
|
|
|
|
delay_ms(2);
|
|
|
|
#ifdef MP_TEST
|
|
if (priv->pshare->rf_ft_var.mp_specific) {
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if ( IS_HAL_CHIP(priv) ) {
|
|
u4Byte MACAddr = 0x87654321;
|
|
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_ETHER_ADDR, (pu1Byte)&MACAddr);
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif //CONFIG_WLAN_HAL
|
|
RTL_W32(MACID, 0x87654321);
|
|
|
|
delay_ms(150);
|
|
}
|
|
#endif
|
|
// RESTORE_INT(x);
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv)==VERSION_8192D) {
|
|
SAVE_INT_AND_CLI(x);
|
|
#ifdef DPK_92D
|
|
if (((OPMODE & WIFI_MP_STATE) || priv->pshare->rf_ft_var.mp_specific)
|
|
&& priv->pmib->dot11RFEntry.phyBandSelect==PHY_BAND_5G && !priv->pshare->rf_ft_var.dpk_on) {
|
|
panic_printk(">>> DPK ON!!!");
|
|
priv->pshare->rf_ft_var.dpk_on = 1;
|
|
}
|
|
#endif
|
|
#ifdef SW_LCK_92D
|
|
PHY_LCCalibrate_92D(priv);
|
|
#endif
|
|
SwBWMode(priv, priv->pshare->CurrentChannelBW, priv->pshare->offset_2nd_chan);
|
|
SwChnl(priv, priv->pmib->dot11RFEntry.dot11channel, priv->pshare->offset_2nd_chan);
|
|
|
|
if (priv->pmib->dot11RFEntry.macPhyMode == SINGLEMAC_SINGLEPHY)
|
|
clnt_ss_check_band(priv, priv->pmib->dot11RFEntry.dot11channel);
|
|
RESTORE_INT(x);
|
|
/*
|
|
* IQK
|
|
*/
|
|
PHY_IQCalibrate(priv);
|
|
|
|
#ifdef DPK_92D
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_5G && priv->pshare->rf_ft_var.dpk_on)
|
|
PHY_DPCalibrate(priv);
|
|
#endif
|
|
}
|
|
#endif // CONFIG_RTL_92D_SUPPORT
|
|
|
|
#if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_88E_SUPPORT)
|
|
if (
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
(GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)
|
|
#endif
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
||
|
|
#endif
|
|
(GET_CHIP_VER(priv) == VERSION_8188E)
|
|
#endif
|
|
) {
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
// switch to channel 7 before doing IQK
|
|
printk("Switch to channel 7 before doing 88E IQK\n");
|
|
SAVE_INT_AND_CLI(x);
|
|
SwBWMode(priv, priv->pshare->CurrentChannelBW, priv->pshare->offset_2nd_chan);
|
|
SwChnl(priv, 7, priv->pshare->offset_2nd_chan);
|
|
RESTORE_INT(x);
|
|
}
|
|
#endif
|
|
PHY_IQCalibrate(priv); // IQK_92C IQK_88c IQK_88e
|
|
|
|
watchdog_kick();
|
|
|
|
//Do NOT perform APK fot RF team's request
|
|
//PHY_APCalibrate(priv); // APK_92C APK_88C
|
|
#ifdef CALIBRATE_BY_ODM
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
PHY_LCCalibrate_8188E(ODMPTR);
|
|
} else
|
|
#endif
|
|
{
|
|
SAVE_INT_AND_CLI(x);
|
|
PHY_LCCalibrate(priv);
|
|
RESTORE_INT(x);
|
|
}
|
|
|
|
SAVE_INT_AND_CLI(x);
|
|
|
|
SwBWMode(priv, priv->pshare->CurrentChannelBW, priv->pshare->offset_2nd_chan);
|
|
SwChnl(priv, priv->pmib->dot11RFEntry.dot11channel, priv->pshare->offset_2nd_chan);
|
|
|
|
/*
|
|
* Set RF & RRSR depends on band in use
|
|
*/
|
|
if (priv->pmib->dot11BssType.net_work_type & (WIRELESS_11G | WIRELESS_11N)) {
|
|
if ((priv->pmib->dot11StationConfigEntry.autoRate) || !(priv->pmib->dot11StationConfigEntry.fixedTxRate & 0xf)) {
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ( IS_UMC_A_CUT_88C(priv) || GET_CHIP_VER(priv) == VERSION_8192C )
|
|
PHY_SetRFReg(priv, 0, 0x26, bMask20Bits, 0x4f000);
|
|
else
|
|
#endif
|
|
PHY_SetRFReg(priv, 0, 0x26, bMask20Bits, 0x4f200);
|
|
|
|
// RTL_W32(RRSR, RTL_R32(RRSR) & ~(0x0c));
|
|
} else {
|
|
PHY_SetRFReg(priv, 0, 0x26, bMask20Bits, 0x0f400);
|
|
}
|
|
} else {
|
|
PHY_SetRFReg(priv, 0, 0x26, bMask20Bits, 0x0f400);
|
|
}
|
|
|
|
RESTORE_INT(x);
|
|
}
|
|
#endif // CONFIG_RTL_92C_SUPPORT || CONFIG_RTL_88E_SUPPORT
|
|
/*
|
|
if(priv->pshare->rf_ft_var.ofdm_1ss_oneAnt == 1){// use one PATH for ofdm and 1SS
|
|
Switch_1SS_Antenna(priv, 2);
|
|
Switch_OFDM_Antenna(priv, 2);
|
|
}
|
|
*/
|
|
|
|
watchdog_kick();
|
|
delay_ms(100);
|
|
SAVE_INT_AND_CLI(x);
|
|
|
|
//RTL_W32(0x100, RTL_R32(0x100) | BIT(14)); //for 8190 fw debug
|
|
|
|
// init DIG variables
|
|
// val32 = 0x40020064; // 0x20010020
|
|
val32 = 0x20010064; // 0x20010020
|
|
//
|
|
priv->pshare->threshold0 = (unsigned short)(val32 & 0x000000FF);
|
|
priv->pshare->threshold1 = (unsigned short)((val32 & 0x000FFF00) >> 8);
|
|
priv->pshare->threshold2 = (unsigned short)((val32 & 0xFFF00000) >> 20);
|
|
priv->pshare->digDownCount = 0;
|
|
priv->pshare->digDeadPoint = 0;
|
|
priv->pshare->digDeadPointHitCount = 0;
|
|
|
|
if (priv->pshare->rf_ft_var.nbi_filter_enable &&
|
|
(priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_2G)) {
|
|
NBI_filter_on(priv);
|
|
}
|
|
|
|
set_DIG_state(priv, 1); // DIG on
|
|
|
|
#if defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8812E) || IS_HAL_CHIP(priv)) {
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E) {
|
|
if (priv->pmib->dot11RFEntry.tx2path)
|
|
{
|
|
RTL_W32(0x90C, 0x83321333);
|
|
RTL_W32(0x80C, RTL_R32(0x80C) & ~BIT(31));
|
|
RTL_W8(0x6D8, RTL_R8(0x6D8) | 0x3F);
|
|
|
|
RTL_W8(0xA07, 0xC1);
|
|
RTL_W8(0xA11, RTL_R8(0xA11) & ~BIT(5));
|
|
//RTL_W8(0xA20, (RTL_R8(0xA20) & ~BIT(5)) | BIT(4));
|
|
//RTL_W8(0xA2E, RTL_R8(0xA2E) | BIT(3) | BIT(2));
|
|
//RTL_W8(0xA2F, (RTL_R8(0xA2F) & ~BIT(5)) | BIT(4));
|
|
//RTL_W8(0xA75, RTL_R8(0xA75) | BIT(0));
|
|
RTL_W32(0xC8C, 0xa0240000);
|
|
RTL_W8(0x800, RTL_R8(0x800) & ~BIT(1));
|
|
}
|
|
PHY_SetBBReg(priv, 0x90C, BIT(30), 0);
|
|
if (priv->pmib->dot11RFEntry.bcn2path){
|
|
RTL_W32(0x80c,RTL_R32(0x80c)|BIT(31));
|
|
RTL_W8(0x6D8, RTL_R8(0x6D8) | 0xCF);
|
|
}
|
|
}
|
|
} else if (CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{
|
|
// 2009.09.10
|
|
if (priv->pshare->rf_ft_var.cck_tx_pathB) {
|
|
RTL_W8(0xa07, 0x40); // 0x80 -> 0x40 CCK path B Tx
|
|
RTL_W8(0xa0b, 0x84); // 0x88 -> 0x84 CCK path B Tx
|
|
}
|
|
|
|
// CCK path A Tx
|
|
#ifdef CONFIG_POCKET_ROUTER_SUPPORT
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_2G)
|
|
#endif
|
|
{
|
|
RTL_W8(0xa07, (RTL_R8(0xa07) & 0xbf));
|
|
RTL_W8(0xa0b, (RTL_R8(0xa0b) & 0xfb));
|
|
}
|
|
#endif
|
|
|
|
#if defined(CONFIG_RTL_8198) || defined(CONFIG_RTL_819XD) || defined(CONFIG_RTL_8196E) || defined(CONFIG_RTL_8198B)
|
|
RTL_W8(AGGR_BK_TIME, 0x18);
|
|
RTL_W16(0x4ca, 0x0a0a);
|
|
// RTL_W32(RESP_SIFS_CCK, 0x0e0e0a0a);
|
|
//RTL_W32(ACKTO, 0x40001440);
|
|
RTL_W16(ACKTO, 0x1440);
|
|
RTL_W16(RXFLTMAP2, 0xffff);
|
|
//RTL_W16(RCR, RTL_R16(RCR)&(~ BIT(11)));
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
//CBN debug
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
// RTL_W32(RD_CTRL, RTL_R32(RD_CTRL)|BIT(13)); // enable force tx beacon
|
|
RTL_W8(BCN_MAX_ERR, 0); // tx beacon error threshold
|
|
// RTL_W16(EIFS, 0x0040); // eifs < tbtt_prohibit
|
|
if (opmode & WIFI_AP_STATE)
|
|
RTL_W16(rFPGA0_RFTiming1, 0x5388);
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif //CONFIG_WLAN_HAL
|
|
{//not HAL
|
|
RTL_W16(EIFS, 0x0040); // eifs = 40 us
|
|
|
|
#ifdef CONFIG_PCI_HCI
|
|
RTL_W32(0x350, RTL_R32(0x350) | BIT(26)); // tx status check
|
|
#endif
|
|
}
|
|
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)) {
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
priv->pmib->dot11RFEntry.trswitch = 1;
|
|
PHY_SetBBReg(priv, 0x870, BIT(10), 0);
|
|
if (GET_CHIP_VER(priv) == VERSION_8192C)
|
|
PHY_SetBBReg(priv, 0x870, BIT(26), 0);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if defined(SW_ANT_SWITCH) || defined(HW_ANT_SWITCH)
|
|
// priv->pmib->dot11RFEntry.trswitch = 1;
|
|
#endif
|
|
if(GET_CHIP_VER(priv) != VERSION_8188E){
|
|
if (priv->pmib->dot11RFEntry.trswitch)
|
|
RTL_W8(GPIO_MUXCFG, RTL_R8(GPIO_MUXCFG) | TRSW0EN);
|
|
else
|
|
RTL_W8(GPIO_MUXCFG, RTL_R8(GPIO_MUXCFG) & ~TRSW0EN);
|
|
}
|
|
|
|
#ifdef DFS
|
|
if (!priv->pmib->dot11DFSEntry.disable_DFS) {
|
|
RTL_W8(0xc50, 0x24);
|
|
delay_us(10);
|
|
RTL_W8(0xc50, 0x20);
|
|
}
|
|
#endif
|
|
|
|
if (get_rf_mimo_mode(priv) == MIMO_2T2R) {
|
|
RTL_W8(0xA20, (RTL_R8(0xA20) & ~BIT(5)) | BIT(4));
|
|
RTL_W8(0xA2E, RTL_R8(0xA2E) | BIT(3) | BIT(2));
|
|
RTL_W8(0x800, RTL_R8(0x800) & ~BIT(1));
|
|
|
|
if (priv->pmib->dot11RFEntry.tx2path) {
|
|
RTL_W32(0x90C, 0x83321333);
|
|
RTL_W32(0x80C, RTL_R32(0x80C) & ~BIT(31));
|
|
RTL_W8(0x6D8, RTL_R8(0x6D8) | 0x3F);
|
|
RTL_W8(0xA07, 0xC1);
|
|
RTL_W8(0xA11, RTL_R8(0xA11) & ~BIT(5));
|
|
RTL_W8(0xA2F, (RTL_R8(0xA2F) & ~BIT(5)) | BIT(4));
|
|
RTL_W8(0xA75, RTL_R8(0xA75) | BIT(0));
|
|
RTL_W32(0xC8C, 0xa0240000);
|
|
}
|
|
PHY_SetBBReg(priv, 0x90C, BIT(30), 0);
|
|
} else if (get_rf_mimo_mode(priv) == MIMO_1T1R) {
|
|
if (priv->pmib->dot11RFEntry.tx2path) {
|
|
DEBUG_INFO("Not 2T2R, disable tx2path\n");
|
|
priv->pmib->dot11RFEntry.tx2path = 0;
|
|
}
|
|
if (priv->pmib->dot11RFEntry.txbf) {
|
|
DEBUG_INFO("Not 2T2R, disable txbf\n");
|
|
priv->pmib->dot11RFEntry.txbf = 0;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
{
|
|
//Set 0x55d=0 except ADHOC Mode for all IC (BCN_MAX_ERR)
|
|
#ifdef CLIENT_MODE
|
|
if (OPMODE & WIFI_ADHOC_STATE)
|
|
RTL_W8(0x55d, 0xff);
|
|
else
|
|
#endif
|
|
if(OPMODE & WIFI_AP_STATE) {
|
|
if((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv)==VERSION_8188C))
|
|
RTL_W8(0x55d, 0xff); //Set 92C to MAX value to avoid init fail for some un-healthy demo boards.
|
|
else
|
|
RTL_W8(0x55d, 0x1); //Allow 1 Beacon Error only //Always Tx Beacon within PIFS
|
|
}
|
|
|
|
// printk("0x55d = 0x%x\n", RTL_R8(0x55d));
|
|
}
|
|
|
|
#if defined(CONFIG_WLAN_HAL_8814AE)
|
|
if (GET_CHIP_VER(priv) == VERSION_8814A) {
|
|
if (get_rf_mimo_mode(priv) == MIMO_2T2R)
|
|
{
|
|
RTL_W8(0x82f, (RTL_R8(0x82f)&0xf0) | 0x5);
|
|
RTL_W8(0x830, (RTL_R8(0x830)&0xf0) | 0xa);
|
|
RTL_W8(0x808, 0x66);
|
|
RTL_W8(0x1002, 0x2);
|
|
RTL_W8(0x1002, 0x3);
|
|
if(priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_2G)
|
|
RTL_W8(0xa07, 0x46);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef DRVMAC_LB
|
|
if (!priv->pmib->miscEntry.drvmac_lb)
|
|
#endif
|
|
{
|
|
#ifdef USE_OUT_SRC
|
|
if (IS_OUTSRC_CHIP(priv)) {
|
|
ODM_DMInit(ODMPTR); // DM parameters init
|
|
EdcaParaInit(priv);
|
|
}
|
|
else
|
|
#endif
|
|
{
|
|
rtl8192cd_AdaptivityInit(priv);
|
|
}
|
|
|
|
#if defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8881A)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8812E) || (GET_CHIP_VER(priv) == VERSION_8881A)) {
|
|
// ? did twice ?
|
|
// phy_BB8192CD_Check_ParaFile(priv);
|
|
#if defined(CONFIG_WLAN_HAL_8881A)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8881A) && _GET_HAL_DATA(priv)->bTestChip )
|
|
{
|
|
PHY_CheckBBWithParaFile(priv, PHYREG);
|
|
}
|
|
#endif
|
|
|
|
priv->pshare->No_RF_Write = 0;
|
|
SwBWMode(priv, priv->pshare->CurrentChannelBW, priv->pshare->offset_2nd_chan);
|
|
SwChnl(priv, priv->pmib->dot11RFEntry.dot11channel, priv->pshare->offset_2nd_chan);
|
|
priv->pshare->No_RF_Write = 1;
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_5G) {
|
|
RTL_W32(0x808, RTL_R32(0x808) | BIT(29));
|
|
RTL_W8(0x454, RTL_R8(0x454) | BIT(7));
|
|
} else { //PHY_BAND_2G
|
|
RTL_W32(0x808, RTL_R32(0x808) | BIT(29) | BIT(28));
|
|
RTL_W8(0x454, RTL_R8(0x454) & ~ BIT(7));
|
|
}
|
|
#if defined(CONFIG_WLAN_HAL_8814AE)
|
|
if (GET_CHIP_VER(priv) != VERSION_8814A)
|
|
#endif
|
|
{
|
|
RTL_W16(0x4ca, 0x1f1f);
|
|
RTL_W8(REG_RA_TRY_RATE_AGG_LMT_8812, 0x0); // try rate agg limit
|
|
}
|
|
|
|
#if defined(CONFIG_WLAN_HAL_8814AE)
|
|
if (GET_CHIP_VER(priv) == VERSION_8814A) {
|
|
if(priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_2G)
|
|
RTL_W16(0x4ca, 0x1f1f);
|
|
/*
|
|
if (get_rf_mimo_mode(priv) == MIMO_2T2R) {
|
|
RTL_W8(0x82f, (RTL_R8(0x82f)&0xf0) | 0x5);
|
|
RTL_W8(0x830, (RTL_R8(0x830)&0xf0) | 0xa);
|
|
RTL_W8(0x808, 0x66);
|
|
RTL_W8(0x1002, 0x2);
|
|
RTL_W8(0x1002, 0x3);
|
|
if(priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_2G)
|
|
RTL_W8(0xa07, 0x46);
|
|
}*/
|
|
}
|
|
#endif
|
|
|
|
|
|
// RTL_W32(0x2c, 0x28a3e200);
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
if (IS_TEST_CHIP(priv)) {
|
|
RTL_W8(0x44b, 0x3e); // 2SS MCS7~MCS3
|
|
} else {
|
|
|
|
RTL_W32(0x448, 0xfffff010); // 2SS MCS9~MCS3
|
|
RTL_W8(0x452, 0x1f); // 1SS MCS8
|
|
|
|
}
|
|
// RTL_W32(0x2c, 0x4103e200);
|
|
RTL_W8(0x577, RTL_R8(0x577) | 3); //disable CCA in TXOp
|
|
RTL_W32(0x608, RTL_R32(0x608) | BIT(26));
|
|
// RTL_W8(REG_RESP_SIFS_OFDM_8812+1, 0x0a); //R2T
|
|
#ifdef BEAMFORMING_SUPPORT
|
|
if (priv->pmib->dot11RFEntry.txbf == 1) {
|
|
RTL_W8(0x71b, 0x50); // ndp_rx_standby_timer
|
|
RTL_W16(0x718, RTL_R16(0x718) | 0x2cb); // Disable SIG-B CRC8 check
|
|
RTL_W32(0x604, RTL_R32(0x604) | BIT(26)); // Disable SIG-B CRC8 check
|
|
|
|
#ifdef BEAMFORMING_SUPPORT
|
|
RTL_W32(RCR, RTL_R32(RCR) | RCR_ACF);
|
|
#endif
|
|
}
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
|
|
|
|
RTL_W8(REG_RX_PKT_LIMIT_8812, 0x20); // rx pkt limit = 16k
|
|
|
|
// Path A only
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
if (get_rf_mimo_mode(priv) == MIMO_1T1R) {
|
|
|
|
if(AC_SIGMA_MODE==AC_SIGMA_NONE){
|
|
RTL_W8(0x808, 0x11);
|
|
RTL_W16(0x80c, 0x1111);
|
|
RTL_W8(0xa07, (RTL_R8(0xa07) & 0xf3)); // [3:2] = 2'b 00
|
|
RTL_W32(0x8bc, (RTL_R32(0x8bc) & 0x3FFFFF9F) | BIT(30) );
|
|
RTL_W8(0xe00, (RTL_R8(0xe00) & 0xf0) | 0x04 );
|
|
RTL_W8(0xe90, 0);
|
|
RTL_W32(0xe60, 0);
|
|
RTL_W32(0xe64, 0);
|
|
|
|
}
|
|
#ifdef AC2G_256QAM
|
|
if(1) //if(is_ac2g(priv))
|
|
{
|
|
RTL_W32(0x48c, 0x00000015);
|
|
RTL_W32(0x48c+4, 0x003ff000);
|
|
}
|
|
#endif
|
|
} else if (get_rf_mimo_mode(priv) == MIMO_2T2R) {
|
|
if (!((OPMODE & WIFI_MP_STATE) || priv->pshare->rf_ft_var.mp_specific)) {
|
|
if (priv->pmib->dot11RFEntry.tx2path) {
|
|
printk("8812 Enable Tx 2 Path\n");
|
|
RTL_W16(0x80c, 0x3333);
|
|
} else {
|
|
printk("8812 Disable Tx 2 Path\n");
|
|
RTL_W16(0x80c, 0x1113);
|
|
}
|
|
}
|
|
}
|
|
#ifdef AC2G_256QAM
|
|
if(1) //if(is_ac2g(priv))
|
|
{
|
|
RTL_W32(0x48c, 0x00000015);
|
|
RTL_W32(0x48c+4, 0x003ff000);
|
|
RTL_W32(0x494, 0x00000015);
|
|
RTL_W32(0x494+4, 0xffcff000);
|
|
}
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
PHY_IQCalibrate(priv); //FOR_8812_IQK
|
|
|
|
#if 1 //for 8812 IOT issue with 11N NICs
|
|
printk("0x838 B(1)= 0, 0x456 = 0x32 \n");
|
|
RTL_W8(0x838, (RTL_R8(0x838)& ~ BIT(0))); //Disbale CCA
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
if (IS_TEST_CHIP(priv))
|
|
RTL_W8(0x456, 0x32); //Refine AMPDU MAX duration
|
|
else if(get_rf_mimo_mode(priv) == MIMO_1T1R)
|
|
RTL_W8(0x456, 0xe0);
|
|
else
|
|
RTL_W8(0x456, 0x70); //8812_11n_iot, increase 0x456 for ampdu number
|
|
|
|
RTL_W8(0x480, 0x20); //Enable duplicate RTS to whole bandwidth
|
|
|
|
//RTL_W32(0x458, 0xffff); // aggregation max length
|
|
RTL_W32(0x458, 0x7fff); // agg size 64k->32k
|
|
|
|
RTL_W8(0x420, 0x00); // Enable Retry + New frames for AMPDU
|
|
|
|
if (IS_C_CUT_8812(priv)) {
|
|
RTL_W8(0x640, 0x40);
|
|
RTL_W8(0x45b, 0x80);
|
|
} else {
|
|
RTL_W8(0x640, 0x80);
|
|
}
|
|
|
|
#ifdef EN_EFUSE
|
|
PHY_SetBBReg(priv, 0xc1c, 0xffe00000, OFDMSwingTable_8812[priv->pshare->OFDM_index0[0]]);
|
|
PHY_SetBBReg(priv, 0xe1c, 0xffe00000, OFDMSwingTable_8812[priv->pshare->OFDM_index0[1]]);
|
|
#else
|
|
if(priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_2G){
|
|
// 2G OFDM base index should be 0dB
|
|
PHY_SetBBReg(priv, 0xc1c, 0xffe00000, OFDMSwingTable_8812[12]);
|
|
PHY_SetBBReg(priv, 0xe1c, 0xffe00000, OFDMSwingTable_8812[12]);
|
|
priv->pshare->OFDM_index0[0] = 12;
|
|
priv->pshare->OFDM_index0[1] = 12;
|
|
}else{
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
// ext_pa OFDM base index should be -4dB
|
|
PHY_SetBBReg(priv, 0xc1c, 0xffe00000, OFDMSwingTable_8812[20]);
|
|
PHY_SetBBReg(priv, 0xe1c, 0xffe00000, OFDMSwingTable_8812[20]);
|
|
priv->pshare->OFDM_index0[0] = 20;
|
|
priv->pshare->OFDM_index0[1] = 20;
|
|
} else
|
|
#endif
|
|
{
|
|
//int_pa OFDM base index should be -3dB
|
|
PHY_SetBBReg(priv, 0xc1c, 0xffe00000, OFDMSwingTable_8812[18]);
|
|
PHY_SetBBReg(priv, 0xe1c, 0xffe00000, OFDMSwingTable_8812[18]);
|
|
priv->pshare->OFDM_index0[0] = 18;
|
|
priv->pshare->OFDM_index0[1] = 18;
|
|
}
|
|
}
|
|
#endif
|
|
#ifdef MCR_WIRELESS_EXTEND
|
|
RTL_W32(0x10 , 0x2aab5e0c); //Enhance the Vcore for reviewing the function on
|
|
RTL_W32(0x830,0x2aaa6c88);
|
|
#endif
|
|
}
|
|
#endif
|
|
#endif
|
|
}
|
|
#endif
|
|
}
|
|
|
|
RESTORE_INT(x);
|
|
#if defined(CONFIG_WLAN_HAL_8192EE)
|
|
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E) {
|
|
PHY_SetRFReg(priv, RF92CD_PATH_A, 0xb1, bMask20Bits, 0x55418); // LCK
|
|
// RESTORE_INT(x);
|
|
PHY_IQCalibrate(priv);
|
|
// TX power tracking init
|
|
#ifdef HIGH_POWER_EXT_PA
|
|
if (priv->pshare->rf_ft_var.use_ext_pa) {
|
|
priv->pshare->OFDM_index0[0] = 30;
|
|
priv->pshare->OFDM_index0[1] = 30;
|
|
priv->pshare->CCK_index0 = 30;
|
|
} else
|
|
#endif
|
|
{
|
|
priv->pshare->OFDM_index0[0] = 20;
|
|
priv->pshare->OFDM_index0[1] = 20;
|
|
priv->pshare->CCK_index0 = 20;
|
|
}
|
|
// printk("Init OFDM_index0 base index = %x \n",priv->pshare->OFDM_index0[0]);
|
|
// printk("Init OFDM_index0 base index = %x \n",priv->pshare->OFDM_index0[1]);
|
|
// printk("priv->pshare->CCK_index0 = %x \n",priv->pshare->CCK_index0);
|
|
//
|
|
// PHY_ConfigBBWithParaFile(priv, PHYREG);
|
|
|
|
//LCCalibrate #20130301 Anchi
|
|
// printk("Do 8192E LCK!! RF 0xB6 = 0x%x\n", PHY_QueryRFReg(priv, RF_PATH_A, 0xB6, bMaskDWord, 1));
|
|
for (i=0 ; i<10 ; i++) {
|
|
if (PHY_QueryRFReg(priv, RF_PATH_A, 0xB6, 0xff000, 1) == 0x8)
|
|
break;
|
|
|
|
PHY_SetRFReg(priv, RF_PATH_A, 0x18, bMaskDWord, 0x0FC07); //LCK
|
|
delay_ms(50);
|
|
PHY_SetRFReg(priv, RF_PATH_A, 0xB6, bMaskDWord, 0x0803E);
|
|
printk("==> RF 0xB6 = 0x%x\n", PHY_QueryRFReg(priv, RF_PATH_A, 0xB6, bMaskDWord, 1));
|
|
}
|
|
|
|
for (i=0 ; i<10 ; i++) {
|
|
if (PHY_QueryRFReg(priv, RF_PATH_A, 0xB2, bMaskDWord, 1) == 0x8CC00)
|
|
break;
|
|
PHY_SetRFReg(priv, RF_PATH_A, 0x18, bMaskDWord, 0x0FC07); //LCK
|
|
delay_ms(50);
|
|
PHY_SetRFReg(priv, RF_PATH_A, 0xB2, bMaskDWord, 0x8CC00);
|
|
printk("==> RF 0xB2 = 0x%x\n", PHY_QueryRFReg(priv, RF_PATH_A, 0xB2, bMaskDWord, 1));
|
|
}
|
|
printk("8192E LCK done!!\n");
|
|
// SAVE_INT_AND_CLI(x);
|
|
|
|
//Increse 92E rx gain #20130301 Anchi
|
|
PHY_SetRFReg(priv, RF_PATH_A, 0x0, bMaskDWord, 0x33e74);
|
|
|
|
//2013-0717 VCO 9.6G supr #Anchi
|
|
//PHY_SetRFReg(priv, RF_PATH_A, 0xb2, bMaskDWord, 0xCC00);
|
|
//PHY_SetRFReg(priv, RF_PATH_A, 0x18, bMaskDWord, 0xFC07);
|
|
|
|
RTL_W8(0xa2f, 0x10); //CDD for CCK
|
|
RTL_W8(0xa10, 0x7c); // for ACPR
|
|
#if 0 //disable CCK 2R CCA due to DC tone
|
|
if (_GET_HAL_DATA(priv)->cutVersion == ODM_CUT_D) {
|
|
//CCK-2RCCA+path selection
|
|
RTL_W8(0xa2e, 0xd6);
|
|
RTL_W8(0xa01, 0x47);
|
|
|
|
PHY_SetBBReg(priv,0xa04,BIT(24)|BIT(25),1);
|
|
PHY_SetBBReg(priv,0xa04,BIT(26)|BIT(27),0);
|
|
PHY_SetBBReg(priv,0xa74,BIT(8),1);
|
|
PHY_SetBBReg(priv,0xa08,BIT(28),1);
|
|
}
|
|
#endif
|
|
|
|
SwBWMode(priv, priv->pshare->CurrentChannelBW, priv->pshare->offset_2nd_chan);
|
|
SwChnl(priv, priv->pmib->dot11RFEntry.dot11channel, priv->pshare->offset_2nd_chan);
|
|
}
|
|
#endif
|
|
|
|
|
|
#if 1 // TODO: Filen, tmp setting for tuning TP
|
|
#ifdef CONFIG_WLAN_HAL_8881A
|
|
if (GET_CHIP_VER(priv) == VERSION_8881A) {
|
|
unsigned int c50_bak = RTL_R8(0xc50);
|
|
RTL_W8(0xc50, 0x22);
|
|
RTL_W8(0xc50, c50_bak);
|
|
#if 0
|
|
if (get_bonding_type_8881A()==BOND_8881AB) {
|
|
RTL_W32(0x460, 0x03086666);
|
|
} else {
|
|
RTL_W32(0x460, 0x0320ffff);
|
|
}
|
|
#endif
|
|
RTL_W32(0x460, 0x03014444);
|
|
RTL_W16(0x4ca, 0x1414);
|
|
RTL_W8(0x456, 0x30);
|
|
priv->pshare->OFDM_index0[0] = 22; // -5dB
|
|
priv->pshare->AddTxAGC = 0;
|
|
priv->pshare->AddTxAGC_index = 0;
|
|
priv->pshare->rf_ft_var.pwrtrk_TxAGC = 0;
|
|
|
|
if (get_bonding_type_8881A() == BOND_8881AN)
|
|
{
|
|
unsigned int ch_band = PHY_QueryRFReg(priv, RF_PATH_A, 0x18, BIT(17)|BIT(18), 1);
|
|
if (ch_band == 0)
|
|
PHY_SetRFReg(priv, RF_PATH_A, 0x63, bMaskDWord, 0x114eb);
|
|
else if (ch_band == 1)
|
|
PHY_SetRFReg(priv, RF_PATH_A, 0x63, bMaskDWord, 0x116e7);
|
|
else if (ch_band = 2)
|
|
PHY_SetRFReg(priv, RF_PATH_A, 0x63, bMaskDWord, 0x11aeb);
|
|
}
|
|
|
|
if ((get_bonding_type_8881A() == BOND_8881AM ||get_bonding_type_8881A() == BOND_8881AN)
|
|
&& priv->pshare->rf_ft_var.use_intpa8881A && (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_2G)) {
|
|
PHY_SetBBReg(priv, 0xc1c, 0xffe00000, OFDMSwingTable_8812[16]); //int_pa OFDM base index should be -2dB
|
|
priv->pshare->OFDM_index0[0] = 16;
|
|
}
|
|
|
|
|
|
#ifdef AC2G_256QAM
|
|
if(1) //if(is_ac2g(priv))
|
|
{
|
|
RTL_W32(0x48c, 0x00000015);
|
|
RTL_W32(0x48c+4, 0x003ff000);
|
|
}
|
|
#endif
|
|
|
|
}
|
|
#endif //CONFIG_WLAN_HAL_8881A
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E) {
|
|
if (priv->pmib->dot11RFEntry.trswitch
|
|
#if defined(HIGH_POWER_EXT_PA)
|
|
|| priv->pshare->rf_ft_var.use_ext_pa
|
|
#endif
|
|
#if defined (HIGH_POWER_EXT_LNA)
|
|
|| priv->pshare->rf_ft_var.use_ext_lna
|
|
#endif
|
|
) {
|
|
#if defined(CONFIG_PCI_HCI)
|
|
PHY_SetBBReg(priv,0x4c,0xfffffff,0x628282);
|
|
PHY_SetBBReg(priv,0x930,0xff000f,0x540000);//930[3:0] =0 for RFE_CTRL_0 and 54 for tr switch
|
|
PHY_SetBBReg(priv,0x93c,0xffff,0x0);
|
|
|
|
//if (IS_HAL_TEST_CHIP(priv))
|
|
RTL_W32(0x938, 0x540); //938[27:24]=0 for RFE_CTRL_6 and 54 for tr switch
|
|
//else
|
|
// RTL_W32(0x938, 0x450);
|
|
RTL_W32(0x940, 0x15);
|
|
RTL_W32(0x944, 0xffff);
|
|
#elif defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
|
|
RTL_W32(0x4c, 0x70628282);
|
|
RTL_W32(0x930, 0x5000);
|
|
RTL_W32(0x934, 0x4000);
|
|
RTL_W32(0x93c, 0x0);
|
|
RTL_W32(0x938, 0x540); //938[27:24]=0 for RFE_CTRL_6 and 54 for tr switch
|
|
RTL_W32(0x940, 0x15);
|
|
RTL_W32(0x944, 0x83f);
|
|
#endif
|
|
printk("8192E ext PA or ext LNA !!!\n");
|
|
}
|
|
|
|
if (OPMODE & WIFI_AP_STATE) {
|
|
if ((priv->pshare->CurrentChannelBW==0 && priv->pmib->dot11RFEntry.dot11channel==13)
|
|
||(priv->pshare->CurrentChannelBW==1 && priv->pmib->dot11RFEntry.dot11channel>=11))
|
|
Check_92E_Spur_Valid(priv, false);
|
|
}
|
|
RTL_W8(0x462, 0x02);
|
|
#if defined(CONFIG_PCI_HCI)
|
|
RTL_W16(0x4ca, 0x1414);
|
|
#elif defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
|
|
RTL_W16(0x4ca, 0x0a0a);
|
|
#ifdef SDIO_AP_OFFLOAD
|
|
RTL_W16(0x454 , RTL_R16(0x454) & ~(BIT6|BIT3));
|
|
RTL_W16(0x100 , RTL_R16(0x100) | BIT(8));
|
|
#endif
|
|
#endif
|
|
#if defined(HIGH_POWER_EXT_PA)
|
|
if (priv->pshare->rf_ft_var.use_ext_pa)
|
|
set_CCK_swing_index(priv, 30);
|
|
#endif
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
RTL_W8(0x462, 0x02);
|
|
#ifdef USE_OUT_SRC
|
|
if (IS_OUTSRC_CHIP(priv))
|
|
set_CCK_swing_index(priv, ODMPTR->RFCalibrateInfo.DefaultCckIndex);
|
|
#endif
|
|
}
|
|
#endif
|
|
if (get_rf_mimo_mode(priv) == MIMO_1T1R){
|
|
#ifdef CONFIG_WLAN_HAL_8881A
|
|
if(GET_CHIP_VER(priv) == VERSION_8881A){ // AC chip & 1T1R
|
|
unsigned int tmp1=0;
|
|
tmp1 = PHY_QueryBBReg(priv, 0x8b8, bMaskDWord);
|
|
tmp1 &= ~(BIT(19)|BIT(13)); /*bit13 control HT,bit19 controlVHT , 0:cca no black,1:cca black*/
|
|
PHY_SetBBReg(priv, 0x8b8, 0xffffffff, tmp1);
|
|
|
|
tmp1 = PHY_QueryBBReg(priv, 0x8bc, bMaskDWord);
|
|
tmp1 &= ~(BIT(6)|BIT(5)); /*[6:5]=0x0, control by group;group0=mcs0~7*/
|
|
tmp1 &= ~(BIT(17)|BIT(15)); /*[18:15]=0xa;support mcs<10(0xa)*/
|
|
tmp1 |= (BIT(18) | BIT(16));
|
|
PHY_SetBBReg(priv, 0x8bc, 0xffffffff, tmp1);
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv)==VERSION_8192D)
|
|
{
|
|
/*
|
|
when 1T1R let 0xd00[20:19] = 2'b 00 ==> Support < MCS8
|
|
when 2T2R let 0xd00[20:19] = 2'b 01 ==> Support < MCS16
|
|
2. 0xd08[3] = 1'b 1 ==> Not support, break*/
|
|
unsigned int bbtmp1=0;
|
|
bbtmp1 = PHY_QueryBBReg(priv, 0xd00, 0xffffffff);
|
|
bbtmp1 &= ~(BIT(19)|BIT(20));
|
|
PHY_SetBBReg(priv, 0xd00, 0xffffffff, bbtmp1);
|
|
|
|
bbtmp1 = PHY_QueryBBReg(priv, 0xd08, 0xffffffff);
|
|
bbtmp1 |= BIT(3);
|
|
PHY_SetBBReg(priv, 0xd08, 0xffffffff, bbtmp1);
|
|
}
|
|
#endif // CONFIG_RTL_92D_SUPPORT
|
|
}
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) { // AC chip & 1T1R
|
|
unsigned int delay_count = 100;
|
|
unsigned char val_8b = 0;
|
|
unsigned char valtmp = 0;
|
|
do {
|
|
val_8b = RTL_R8(0x8B);
|
|
if ( val_8b & BIT(7)){
|
|
break;
|
|
}
|
|
delay_us(50);
|
|
delay_count--;
|
|
if(delay_count==0){
|
|
panic_printk("check 0x8B expire!!\n");
|
|
}
|
|
} while (delay_count);
|
|
|
|
//SDEBUG("net_work_type:%d\n",priv->pmib->dot11BssType.net_work_type);
|
|
|
|
if (val_8b & BIT(7)) {
|
|
//SDEBUG("0x8B=[%02x],delay_count=%d\n",val_8b,delay_count);
|
|
/*------------------------------------------------*/
|
|
valtmp = (val_8b&(BIT(4)|BIT(5)|BIT(6)))>> 4 ;
|
|
if(valtmp==1 && priv->pshare->phw->MIMO_TR_hw_support==MIMO_2T2R){
|
|
panic_printk("Antenna munber not match[%d]\n",valtmp);
|
|
// RESTORE_INT(x);
|
|
return -1;
|
|
}
|
|
/*---------------------TYPES;AC or N---------------------------*/
|
|
valtmp = (val_8b&(BIT(2)|BIT(3)))>>2 ;
|
|
//SDEBUG("%s\n",valtmp==3?"AC":(valtmp==2?"11N":"unknow"));
|
|
if(valtmp==2){
|
|
if(priv->pmib->dot11BssType.net_work_type & WIRELESS_11AC){
|
|
//priv->pmib->dot11BssType.net_work_type &= ~(WIRELESS_11AC);
|
|
panic_printk("Not support AC!!\n");
|
|
// RESTORE_INT(x);
|
|
return -1;
|
|
}
|
|
if( priv->pshare->is_40m_bw == 2 ){
|
|
//priv->pshare->is_40m_bw=1;
|
|
panic_printk("Not support 80M BW!!\n");
|
|
// RESTORE_INT(x);
|
|
return -1;
|
|
}
|
|
}
|
|
//SDEBUG("net_work_type:%d\n",priv->pmib->dot11BssType.net_work_type);
|
|
/*------------------------------------------------*/
|
|
valtmp = val_8b&(BIT(1)|BIT(0)) ;
|
|
//panic_printk("Chip:%s\n",valtmp==3?"AE/AU":(valtmp==2?"AR-VN":"unknow"));
|
|
/*------------------------------------------------*/
|
|
}
|
|
}
|
|
#endif // CONFIG_RTL_8812_SUPPORT
|
|
#ifdef WMM_DSCP_C42
|
|
priv->pshare->aggrmax_bak = RTL_R16(PROT_MODE_CTRL + 2);
|
|
#endif
|
|
|
|
#ifdef USE_OUT_SRC
|
|
if (IS_OUTSRC_CHIP(priv))
|
|
RTL_W16( RD_CTRL, RTL_R16( RD_CTRL) & ~(DIS_TXOP_CFE));
|
|
#endif
|
|
|
|
//Tego added power on protection to avoid wlan hang after suddenly wdg reboot, button reviewed
|
|
#if defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8192EE) || defined(CONFIG_WLAN_HAL_8881A)|| defined(CONFIG_WLAN_HAL_8814AE)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8812E)||(GET_CHIP_VER(priv)== VERSION_8192E)||
|
|
(GET_CHIP_VER(priv) == VERSION_8881A)||(GET_CHIP_VER(priv) == VERSION_8814A)){
|
|
RTL_W8(0x1c, RTL_R8(0x1c)|0x02);
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E)
|
|
{
|
|
if(priv->pmib->dot11RFEntry.tx2path)
|
|
{
|
|
PHY_SetRFReg(priv, ODM_RF_PATH_A, RF_WE_LUT, 0x80000,0x1); // RF Mode table write enable
|
|
PHY_SetRFReg(priv, ODM_RF_PATH_B, RF_WE_LUT, 0x80000,0x1); // RF Mode table write enable
|
|
|
|
// Paath_A
|
|
PHY_SetRFReg(priv, ODM_RF_PATH_A, RF_RCK_OS, 0xfffff,0x18000); // Select RX mode 0x30=0x18000
|
|
PHY_SetRFReg(priv, ODM_RF_PATH_A, RF_TXPA_G1, 0xfffff,0x0000f); // Set Table data
|
|
PHY_SetRFReg(priv, ODM_RF_PATH_A, RF_TXPA_G2, 0xfffff,0x77fc2); // Enable TXIQGEN in RX mode
|
|
// Path_B
|
|
PHY_SetRFReg(priv, ODM_RF_PATH_B, RF_RCK_OS, 0xfffff,0x18000); // Select RX mode
|
|
PHY_SetRFReg(priv, ODM_RF_PATH_B, RF_TXPA_G1, 0xfffff,0x0000f); // Set Table data
|
|
PHY_SetRFReg(priv, ODM_RF_PATH_B, RF_TXPA_G2, 0xfffff,0x77fc2); // Enable TXIQGEN in RX mode
|
|
|
|
PHY_SetRFReg(priv, ODM_RF_PATH_A, RF_WE_LUT, 0x80000,0x0); // RF Mode table write disable
|
|
PHY_SetRFReg(priv, ODM_RF_PATH_B, RF_WE_LUT, 0x80000,0x0); // RF Mode table write disable
|
|
RTL_W8(0xA2F, 0x10);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef WIFI_11N_2040_COEXIST
|
|
if (priv->pmib->dot11nConfigEntry.dot11nCoexist && (OPMODE & WIFI_AP_STATE)
|
|
&& (priv->pmib->dot11BssType.net_work_type & (WIRELESS_11N|WIRELESS_11G))
|
|
&& priv->pshare->is_40m_bw) {
|
|
RTL_W8(0xa70, RTL_R8(0xa70) | BIT(7)); // Enable Concurrent CCA at LSB & USB
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_1RCCA_RF_POWER_SAVING
|
|
#ifdef MP_TEST
|
|
if (!priv->pshare->rf_ft_var.mp_specific)
|
|
#endif
|
|
if (priv->pshare->rf_ft_var._1rcca_ps)
|
|
set_1rcca_ps(priv, 1);
|
|
#endif
|
|
|
|
set_bcn_dont_ignore_edcca(priv);
|
|
|
|
#ifdef USB_INTERFERENCE_ISSUE
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
//fixed USB interface interference issue
|
|
RTL_W8(0xfe40, 0xe0);
|
|
RTL_W8(0xfe41, 0x8d);
|
|
RTL_W8(0xfe42, 0x80);
|
|
RTL_W32(0x20c,0xfd0320);
|
|
#if 1
|
|
//2011/01/07 ,suggest by Johnny,for solved the problem that too many protocol error on USB bus
|
|
if(!IS_UMC_A_CUT(priv) )//&& !IS_92C_SERIAL(pHalData->VersionID))// TSMC , 8188
|
|
{
|
|
// 0xE6=0x94
|
|
RTL_W8(0xFE40, 0xE6);
|
|
RTL_W8(0xFE41, 0x94);
|
|
RTL_W8(0xFE42, 0x80);
|
|
|
|
// 0xE0=0x19
|
|
RTL_W8(0xFE40, 0xE0);
|
|
RTL_W8(0xFE41, 0x19);
|
|
RTL_W8(0xFE42, 0x80);
|
|
|
|
// 0xE5=0x91
|
|
RTL_W8(0xFE40, 0xE5);
|
|
RTL_W8(0xFE41, 0x91);
|
|
RTL_W8(0xFE42, 0x80);
|
|
|
|
// 0xE2=0x81
|
|
RTL_W8(0xFE40, 0xE2);
|
|
RTL_W8(0xFE41, 0x81);
|
|
RTL_W8(0xFE42, 0x80);
|
|
|
|
}
|
|
|
|
#endif
|
|
#endif // CONFIG_RTL_92C_SUPPORT
|
|
#endif // USB_INTERFERENCE_ISSUE
|
|
|
|
// RESTORE_INT(x);
|
|
DBFEXIT;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
#if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT) || (defined(CONFIG_RTL_88E_SUPPORT) && defined(__KERNEL__) && (defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI))) || defined(CONFIG_RTL_8812_SUPPORT)
|
|
static void rtl8192cd_ReadFwHdr(struct rtl8192cd_priv *priv)
|
|
{
|
|
struct __RTL8192C_FW_HDR__ *pFwHdr = NULL;
|
|
unsigned char *swap_arr;
|
|
|
|
#ifdef MP_TEST
|
|
if (priv->pshare->rf_ft_var.mp_specific)
|
|
return;
|
|
#endif
|
|
#ifdef __ECOS
|
|
unsigned char hdr_buf[RT_8192CD_FIRMWARE_HDR_SIZE];
|
|
swap_arr = hdr_buf;
|
|
#endif
|
|
#ifdef __KERNEL__
|
|
swap_arr = kmalloc(RT_8192CD_FIRMWARE_HDR_SIZE, GFP_ATOMIC);
|
|
if (swap_arr == NULL)
|
|
return;
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
memcpy(swap_arr, data_rtl8192dfw_n_start, RT_8192CD_FIRMWARE_HDR_SIZE);
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
if (IS_TEST_CHIP(priv))
|
|
memcpy(swap_arr, data_rtl8812fw_start, RT_8192CD_FIRMWARE_HDR_SIZE);
|
|
#ifdef AC2G_256QAM
|
|
else if(is_ac2g(priv))
|
|
memcpy(swap_arr, data_rtl8812fw_n_2g_start, RT_8192CD_FIRMWARE_HDR_SIZE);
|
|
#endif
|
|
else
|
|
memcpy(swap_arr, data_rtl8812fw_n_start, RT_8192CD_FIRMWARE_HDR_SIZE);
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)) {
|
|
#ifdef TESTCHIP_SUPPORT
|
|
if (IS_TEST_CHIP(priv))
|
|
memcpy(swap_arr, data_rtl8192cfw_start, RT_8192CD_FIRMWARE_HDR_SIZE);
|
|
else
|
|
#endif
|
|
{
|
|
if ( IS_UMC_A_CUT_88C(priv) )
|
|
memcpy(swap_arr, data_rtl8192cfw_ua_start, RT_8192CD_FIRMWARE_HDR_SIZE);
|
|
else
|
|
memcpy(swap_arr, data_rtl8192cfw_n_start, RT_8192CD_FIRMWARE_HDR_SIZE);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
if ( RTL_R16(0xF0) > 0x8000 )
|
|
memcpy(swap_arr, Array_8188E_FW_AP_S, RT_8192CD_FIRMWARE_HDR_SIZE);
|
|
else
|
|
memcpy(swap_arr, Array_8188E_FW_AP_T, RT_8192CD_FIRMWARE_HDR_SIZE);
|
|
}
|
|
#endif
|
|
|
|
pFwHdr = (struct __RTL8192C_FW_HDR__ *)swap_arr;
|
|
#ifdef _BIG_ENDIAN_
|
|
pFwHdr->signature = le16_to_cpu(pFwHdr->signature);
|
|
pFwHdr->version = le16_to_cpu(pFwHdr->version);
|
|
pFwHdr->year = le16_to_cpu(pFwHdr->year); // ready on after v33.1
|
|
#endif
|
|
|
|
priv->pshare->fw_signature = pFwHdr->signature;
|
|
priv->pshare->fw_category = pFwHdr->category;
|
|
priv->pshare->fw_function = pFwHdr->function;
|
|
priv->pshare->fw_version = pFwHdr->version;
|
|
priv->pshare->fw_sub_version = pFwHdr->subversion;
|
|
priv->pshare->fw_date_month = pFwHdr->month;
|
|
priv->pshare->fw_date_day = pFwHdr->day;
|
|
priv->pshare->fw_date_hour = pFwHdr->hour;
|
|
priv->pshare->fw_date_minute = pFwHdr->minute;
|
|
#ifdef __KERNEL__
|
|
kfree(swap_arr);
|
|
#endif
|
|
/*
|
|
printk("fw_signature: ");
|
|
if (priv->pshare->fw_signature == RTL8192C_TEST_CHIP)
|
|
printk("92C_TEST_CHIP");
|
|
else if (priv->pshare->fw_signature == RTL8188C_TEST_CHIP)
|
|
printk("88C_TEST_CHIP");
|
|
else if (priv->pshare->fw_signature == RTL8192C_MP_CHIP_A)
|
|
printk("92C_MP_CHIP_A");
|
|
else if (priv->pshare->fw_signature == RTL8188C_MP_CHIP_A)
|
|
printk("88C_MP_CHIP_A");
|
|
else if (priv->pshare->fw_signature == RTL8192C_MP_CHIP_B)
|
|
printk("92C_MP_CHIP_B");
|
|
else if (priv->pshare->fw_signature == RTL8188C_MP_CHIP_B)
|
|
printk("88C_MP_CHIP_B");
|
|
printk(", ");
|
|
|
|
printk("fw_category: ");
|
|
if (priv->pshare->fw_category == RTL8192C_NIC_PCIE)
|
|
printk("92C_NIC_PCIE");
|
|
else if (priv->pshare->fw_category == RTL8192C_NIC_USB)
|
|
printk("92C_NIC_USB");
|
|
else if (priv->pshare->fw_category == RTL8192C_AP_PCIE)
|
|
printk("92C_AP_PCIE");
|
|
else if (priv->pshare->fw_category == RTL8192C_AP_USB)
|
|
printk("92C_AP_USB");
|
|
printk(", ");
|
|
|
|
printk("fw_function: ");
|
|
if (priv->pshare->fw_function == RTL8192C_NIC_NORMAL)
|
|
printk("92C_NIC_NORMAL");
|
|
else if (priv->pshare->fw_function == RTL8192C_NIC_WWLAN)
|
|
printk("92C_NIC_WWLAN");
|
|
else if (priv->pshare->fw_function == RTL8192C_AP_NORMAL)
|
|
printk("92C_AP_NORMAL");
|
|
else if (priv->pshare->fw_function == RTL8192C_AP_SUSPEND)
|
|
printk("92C_AP_SUSPEND");
|
|
printk("\n");
|
|
|
|
printk("fw_version: %d.%d, ", priv->pshare->fw_version, priv->pshare->fw_sub_version);
|
|
printk("fw_date: %02x-%02x %02x:%02x\n", priv->pshare->fw_date_month, priv->pshare->fw_date_day,
|
|
priv->pshare->fw_date_hour, priv->pshare->fw_date_minute);
|
|
*/
|
|
}
|
|
#endif
|
|
|
|
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
static int Load_92C_Firmware(struct rtl8192cd_priv *priv)
|
|
{
|
|
int fw_len, wait_cnt = 0;
|
|
#ifdef CONFIG_PCI_HCI
|
|
unsigned int CurPtr = 0;
|
|
#endif
|
|
unsigned int WriteAddr;
|
|
unsigned int Temp;
|
|
unsigned char *ptmp;
|
|
|
|
#ifdef CONFIG_RTL8672
|
|
printk("val=%x\n", RTL_R8(0x80));
|
|
#endif
|
|
|
|
#ifdef MP_TEST
|
|
if (priv->pshare->rf_ft_var.mp_specific)
|
|
return TRUE;
|
|
#endif
|
|
|
|
printk("===> %s\n", __FUNCTION__);
|
|
|
|
#ifdef TESTCHIP_SUPPORT
|
|
if (IS_TEST_CHIP(priv)) {
|
|
ptmp = data_rtl8192cfw_start + 32;
|
|
fw_len = (int)(data_rtl8192cfw_end - ptmp);
|
|
|
|
} else
|
|
#endif
|
|
{
|
|
if ( IS_UMC_A_CUT_88C(priv) ) {
|
|
ptmp = data_rtl8192cfw_ua_start + 32;
|
|
fw_len = (int)(data_rtl8192cfw_ua_end - ptmp);
|
|
|
|
} else {
|
|
ptmp = data_rtl8192cfw_n_start + 32;
|
|
fw_len = (int)(data_rtl8192cfw_n_end - ptmp);
|
|
}
|
|
}
|
|
|
|
// Disable SIC
|
|
RTL_W8(0x41, 0x40);
|
|
delay_ms(1);
|
|
|
|
// Enable MCU
|
|
|
|
RTL_W8(SYS_FUNC_EN + 1, RTL_R8(SYS_FUNC_EN + 1) | 0x04);
|
|
delay_ms(1);
|
|
|
|
#ifdef CONFIG_RTL8672
|
|
RTL_W8(0x04, RTL_R8(0x04) | 0x02);
|
|
delay_ms(1); //czyao
|
|
#endif
|
|
|
|
// Load SRAM
|
|
WriteAddr = 0x1000;
|
|
RTL_W8(MCUFWDL, RTL_R8(MCUFWDL) | MCUFWDL_EN);
|
|
delay_ms(1);
|
|
|
|
// if (IS_TEST_CHIP(priv))
|
|
// RTL_W8(0x82, RTL_R8(0x82) & 0xf7);
|
|
// else
|
|
RTL_W32(MCUFWDL, RTL_R32(MCUFWDL) & 0xfff0ffff);
|
|
|
|
delay_ms(1);
|
|
|
|
#ifdef CONFIG_PCI_HCI
|
|
while (CurPtr < fw_len) {
|
|
if ((CurPtr + 4) > fw_len) {
|
|
// Reach the end of file.
|
|
while (CurPtr < fw_len) {
|
|
Temp = *(ptmp + CurPtr);
|
|
RTL_W8(WriteAddr, (unsigned char)Temp);
|
|
WriteAddr++;
|
|
CurPtr++;
|
|
}
|
|
} else {
|
|
// Write FW content to memory.
|
|
Temp = *((unsigned int *)(ptmp + CurPtr));
|
|
Temp = cpu_to_le32(Temp);
|
|
RTL_W32(WriteAddr, Temp);
|
|
WriteAddr += 4;
|
|
|
|
if ((IS_TEST_CHIP(priv) == 0) && (WriteAddr == 0x2000)) {
|
|
unsigned char tmp = RTL_R8(MCUFWDL + 2);
|
|
tmp += 1;
|
|
WriteAddr = 0x1000;
|
|
RTL_W8(MCUFWDL + 2, tmp) ;
|
|
delay_ms(10);
|
|
// printk("\n[CurPtr=%x, 0x82=%x]\n", CurPtr, RTL_R8(0x82));
|
|
}
|
|
CurPtr += 4;
|
|
}
|
|
}
|
|
#else
|
|
if (IS_ERR_VALUE(_WriteFW(priv, ptmp, fw_len)))
|
|
printk("WriteFW FAIL !\n");
|
|
#endif
|
|
|
|
Temp = RTL_R8(0x80);
|
|
Temp &= 0xfe;
|
|
Temp |= 0x02;
|
|
RTL_W8(0x80, (unsigned char)Temp);
|
|
delay_ms(1);
|
|
RTL_W8(0x81, 0x00);
|
|
|
|
printk("<=== %s\n", __FUNCTION__);
|
|
|
|
// check if firmware is ready
|
|
while (!(RTL_R8(MCUFWDL) & WINTINI_RDY)) {
|
|
if (++wait_cnt > 10) {
|
|
printk("8192c firmware not ready\n");
|
|
return FALSE;
|
|
}
|
|
|
|
delay_ms(1);
|
|
}
|
|
#ifdef CONFIG_RTL8672
|
|
printk("val=%x\n", RTL_R8(MCUFWDL));
|
|
#endif
|
|
|
|
return TRUE;
|
|
}
|
|
#endif // CONFIG_RTL_92C_SUPPORT
|
|
|
|
|
|
#define SET_RTL8192CD_RF_HALT(priv) \
|
|
{ \
|
|
unsigned char u1bTmp; \
|
|
\
|
|
do \
|
|
{ \
|
|
u1bTmp = RTL_R8(LDOV12D_CTRL); \
|
|
u1bTmp |= BIT(0); \
|
|
RTL_W8(LDOV12D_CTRL, u1bTmp); \
|
|
RTL_W8(SPS1_CTRL, 0x0); \
|
|
RTL_W8(TXPAUSE, 0xFF); \
|
|
RTL_W16(CMDR, 0x57FC); \
|
|
delay_us(100); \
|
|
RTL_W16(CMDR, 0x77FC); \
|
|
RTL_W8(PHY_CCA, 0x0); \
|
|
delay_us(10); \
|
|
RTL_W16(CMDR, 0x37FC); \
|
|
delay_us(10); \
|
|
RTL_W16(CMDR, 0x77FC); \
|
|
delay_us(10); \
|
|
RTL_W16(CMDR, 0x57FC); \
|
|
RTL_W16(CMDR, 0x0000); \
|
|
u1bTmp = RTL_R8((SYS_CLKR + 1)); \
|
|
if (u1bTmp & BIT(7)) \
|
|
{ \
|
|
u1bTmp &= ~(BIT(6) | BIT(7)); \
|
|
if (!HalSetSysClk8192CD(priv, u1bTmp)) \
|
|
break; \
|
|
} \
|
|
RTL_W8(0x03, 0x71); \
|
|
RTL_W8(0x09, 0x70); \
|
|
RTL_W8(0x29, 0x68); \
|
|
RTL_W8(0x28, 0x00); \
|
|
RTL_W8(0x20, 0x50); \
|
|
RTL_W8(0x26, 0x0E); \
|
|
} while (FALSE); \
|
|
}
|
|
|
|
void Unlock_MCU(struct rtl8192cd_priv *priv)
|
|
{
|
|
// 1. To clear C2H
|
|
RTL_W8(C2H_SYNC_BYTE, 0x0);
|
|
// 2. Unlock Overall MCU while(1)
|
|
RTL_W8(MCU_UNLOCK, 0xFF);
|
|
}
|
|
|
|
void FirmwareSelfReset(struct rtl8192cd_priv *priv)
|
|
{
|
|
unsigned char u1bTmp;
|
|
unsigned int Delay = 1000;
|
|
if (priv->pshare->fw_version > 0x21
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
|| GET_CHIP_VER(priv) == VERSION_8192D
|
|
#endif
|
|
) {
|
|
RTL_W32(FWIMR, 0x20);
|
|
RTL_W8(REG_HMETFR + 3, 0x20);
|
|
u1bTmp = RTL_R8( REG_SYS_FUNC_EN + 1);
|
|
while (u1bTmp & BIT(2)) {
|
|
Delay--;
|
|
DEBUG_INFO("polling 0x03[2] Delay = %d \n", Delay);
|
|
if (Delay == 0)
|
|
break;
|
|
delay_us(50);
|
|
Unlock_MCU(priv);
|
|
u1bTmp = RTL_R8( REG_SYS_FUNC_EN + 1);
|
|
}
|
|
// restore MCU internal while(1) loop
|
|
RTL_W8(MCU_UNLOCK, 0);
|
|
if (u1bTmp & BIT(2)) {
|
|
DEBUG_ERR("FirmwareSelfReset fail: 0x03=%02x, 0x1EB=0x%02x\n", u1bTmp, RTL_R8(0x1EB));
|
|
#ifdef CONFIG_USB_HCI
|
|
RTL_W8(SYS_FUNC_EN+1, 0x50); //Reset MAC and Enable 8051
|
|
delay_ms(10);
|
|
#endif
|
|
} else {
|
|
DEBUG_INFO("FirmwareSelfReset success: 0x03 = %x\n", u1bTmp);
|
|
}
|
|
}
|
|
}
|
|
|
|
//Return Value:
|
|
// 1: MAC I/O Registers Enable
|
|
// 0: MAC I/O Registers Disable
|
|
int check_MAC_IO_Enable(struct rtl8192cd_priv *priv)
|
|
{
|
|
//Check PON register to decide
|
|
return ( (RTL_R16(SYS_FUNC_EN) & (FEN_MREGEN | FEN_DCORE)) == (FEN_MREGEN | FEN_DCORE) );
|
|
}
|
|
#ifdef CONFIG_RTL8672
|
|
extern unsigned char clk_src_40M;
|
|
#endif
|
|
|
|
#ifdef CONFIG_PCI_HCI
|
|
int rtl8192cd_stop_hw(struct rtl8192cd_priv *priv)
|
|
{
|
|
RTL_W8(0x1c, RTL_R8(0x1c)& ~BIT(1));// unlock reg0x00~0x03 for 8812
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
#ifdef TXREPORT
|
|
RTL8188E_DisableTxReport(priv);
|
|
#endif
|
|
RTL_W32(REG_88E_HIMR, 0);
|
|
RTL_W32(REG_88E_HIMRE, 0);
|
|
HalPwrSeqCmdParsing(priv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
|
|
PWR_INTF_PCI_MSK, rtl8188E_leave_lps_flow);
|
|
} else
|
|
#endif
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
RTL_W32(REG_HIMR0_8812, 0);
|
|
RTL_W32(REG_HIMR1_8812, 0);
|
|
HalPwrSeqCmdParsing(priv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
|
|
PWR_INTF_PCI_MSK, rtl8812_enter_lps_flow);
|
|
} else
|
|
#endif
|
|
{
|
|
RTL_W32(HIMR, 0);
|
|
RTL_W16(HIMRE, 0);
|
|
RTL_W16(HIMRE + 2, 0);
|
|
RTL_W32(CR, (RTL_R32(CR) & ~(NETYPE_Mask << NETYPE_SHIFT)) | ((NETYPE_NOLINK & NETYPE_Mask) << NETYPE_SHIFT));
|
|
}
|
|
|
|
RTL_W8(RCR, 0);
|
|
RTL_W8(TXPAUSE, 0xff); // Pause MAC TX queue
|
|
#if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT)
|
|
if (
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
(GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)
|
|
#endif
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
||
|
|
#endif
|
|
(GET_CHIP_VER(priv) == VERSION_8192D)
|
|
#endif
|
|
) {
|
|
// RTL_W8(CR, RTL_R8(CR) & ~(MACTXEN|MACRXEN));
|
|
RTL_W8(CR, 0);
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if (priv->pshare->wlandev_idx == 0)
|
|
RTL_W8(RSV_MAC0_CTRL, RTL_R8(RSV_MAC0_CTRL) & (~MAC0_EN));
|
|
else
|
|
RTL_W8(RSV_MAC1_CTRL, RTL_R8(RSV_MAC1_CTRL) & (~MAC1_EN));
|
|
|
|
if ((RTL_R8(RSV_MAC0_CTRL)& MAC0_EN) || (RTL_R8(RSV_MAC1_CTRL)& MAC1_EN)) { // check if another interface exists
|
|
DEBUG_INFO("Another MAC exists, cannot stop hw!!\n");
|
|
} else
|
|
#endif
|
|
{
|
|
#if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT)
|
|
if (
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
(GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)
|
|
#endif
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
||
|
|
#endif
|
|
(GET_CHIP_VER(priv) == VERSION_8192D)
|
|
#endif
|
|
) {
|
|
//3 2.) ==== RF Off Sequence ====
|
|
phy_InitBBRFRegisterDefinition(priv); // preparation for read/write RF register
|
|
|
|
PHY_SetRFReg(priv, RF92CD_PATH_A, 0x00, bMask20Bits, 0x00); // disable RF
|
|
RTL_W8(RF_CTRL, 0x00);
|
|
RTL_W8(APSD_CTRL, 0x40);
|
|
RTL_W8(SYS_FUNC_EN, 0xe2); // reset BB state machine
|
|
RTL_W8(SYS_FUNC_EN, 0xe0); // reset BB state machine
|
|
|
|
|
|
|
|
//3 3.) ==== Reset digital sequence ====
|
|
if (RTL_R8(MCUFWDL) & BIT(1)) {
|
|
//Make sure that Host Recovery Interrupt is handled by 8051 ASAP.
|
|
RTL_W32(FSIMR, 0); // clear FSIMR
|
|
RTL_W32(FWIMR, 0x20); // clear FWIMR except HRCV_INT
|
|
RTL_W32(FTIMR, 0); // clear FTIMR
|
|
FirmwareSelfReset(priv);
|
|
|
|
//Clear FWIMR to guarantee if 8051 runs in ROM, it is impossible to run FWISR Interrupt handler
|
|
RTL_W32(FWIMR, 0x0); // clear All FWIMR
|
|
} else {
|
|
//Critical Error.
|
|
//the operation that reset 8051 is necessary to be done by 8051
|
|
DEBUG_ERR("%s %d ERROR: (RTL_R8(MCUFWDL) & BIT(1))=0\n", __FUNCTION__, __LINE__);
|
|
DEBUG_ERR("%s %d ERROR: the operation that reset 8051 is necessary to be done by 8051,%d\n", __FUNCTION__, __LINE__, RTL_R8(MCUFWDL));
|
|
}
|
|
}
|
|
#endif
|
|
|
|
// ==== Reset digital sequence ====
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188E) || (GET_CHIP_VER(priv) == VERSION_8812E))
|
|
RTL_W8(SYS_FUNC_EN + 1, RTL_R8(SYS_FUNC_EN + 1) & ~BIT(2));
|
|
else
|
|
#endif
|
|
RTL_W8(SYS_FUNC_EN + 1, 0x51); // reset MCU, MAC register, DCORE
|
|
RTL_W8(MCUFWDL, 0); // reset MCU ready status
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
unsigned char u1bTmp = 0;
|
|
// 0x1F[7:0] = 0 // turn off RF
|
|
RTL_W8(REG_RF_CTRL_8812, 0x00);
|
|
|
|
// Reset MCU. Suggested by Filen. 2011.01.26. by tynli.
|
|
u1bTmp = RTL_R8(REG_SYS_FUNC_EN_8812 + 1);
|
|
RTL_W8(REG_SYS_FUNC_EN_8812 + 1, (u1bTmp & (~BIT(2))));
|
|
|
|
// MCUFWDL 0x80[1:0]=0 // reset MCU ready status
|
|
RTL_W8(REG_MCUFWDL_8812, 0x00);
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
HalPwrSeqCmdParsing(priv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, rtl8188E_card_disable_flow);
|
|
} else
|
|
#endif
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
HalPwrSeqCmdParsing(priv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, rtl8812_card_disable_flow);
|
|
} else
|
|
#endif
|
|
{
|
|
//3 4.) ==== Disable analog sequence ====
|
|
RTL_W8(AFE_PLL_CTRL, 0x80); // disable PLL
|
|
|
|
#if defined(CONFIG_RTL_92C_SUPPORT) && defined(CONFIG_RTL_92D_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8192C) {
|
|
RTL_W8(SPS0_CTRL, 0x2b);
|
|
} else
|
|
#endif
|
|
{
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if (IS_UMC_B_CUT_88C(priv))
|
|
RTL_W8(SPS0_CTRL, 0x2b);
|
|
else
|
|
#endif
|
|
RTL_W8(SPS0_CTRL, 0x23);
|
|
}
|
|
}
|
|
#ifdef CONFIG_RTL8672
|
|
if (!clk_src_40M)
|
|
RTL_W8(AFE_XTAL_CTRL, RTL_R8(AFE_XTAL_CTRL)&~BIT(0)); // only for ADSL platform because 40M crystal is only used by WiFi chip // disable XTAL, if No BT COEX
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
unsigned char u1bTmp = 0;
|
|
|
|
// Reset MCU IO Wrapper
|
|
u1bTmp = RTL_R8(REG_RSV_CTRL_8812 + 1);
|
|
RTL_W8(REG_RSV_CTRL_8812 + 1, (u1bTmp & (~BIT(0))));
|
|
u1bTmp = RTL_R8(REG_RSV_CTRL_8812 + 1);
|
|
RTL_W8(REG_RSV_CTRL_8812 + 1, u1bTmp | BIT(0));
|
|
|
|
// RSV_CTRL 0x1C[7:0] = 0x0E // lock ISO/CLK/Power control register
|
|
RTL_W8(REG_RSV_CTRL_8812, 0x0e);
|
|
}
|
|
#endif
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188E) || (GET_CHIP_VER(priv) == VERSION_8812E)) {
|
|
// Reset MCU IO Wrapper
|
|
RTL_W8(RSV_CTRL0 + 1, RTL_R8(RSV_CTRL0 + 1) & ~BIT(3));
|
|
RTL_W8(RSV_CTRL0 + 1, RTL_R8(RSV_CTRL0 + 1) | BIT(3));
|
|
} else
|
|
#endif
|
|
{
|
|
RTL_W8(APS_FSMCO + 1, 0x10);
|
|
}
|
|
RTL_W8(RSV_CTRL0, 0x0e); // lock ISO/CLK/Power control register
|
|
|
|
//3 5.) ==== interface into suspend ====
|
|
// RTL_W16(APS_FSMCO, (RTL_R16(APS_FSMCO) & 0x00ff) | (0x18 << 8)); // PCIe suspend mode
|
|
|
|
#ifdef CONFIG_RTL8672
|
|
// 6.) Switch to XTAL_BSEL: NAND
|
|
RTL_W8(AFE_XTAL_CTRL, RTL_R8(AFE_XTAL_CTRL) & ~ BIT(1));
|
|
#endif
|
|
}
|
|
return SUCCESS;
|
|
}
|
|
#endif // CONFIG_PCI_HCI
|
|
|
|
|
|
#ifdef RTK_AC_SUPPORT //#if defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8881A) || defined(CONFIG_WLAN_HAL_8814AE)
|
|
|
|
#ifdef AC2G_256QAM
|
|
#define MAX_NUM_80M 8
|
|
|
|
unsigned char available_channel_AC_80m[MAX_NUM_80M][4] = {
|
|
{36, 40, 44, 48},
|
|
{52, 56, 60, 64},
|
|
{100, 104, 108, 112},
|
|
{116, 120, 124, 128},
|
|
{132, 136, 140, 144},
|
|
{149, 153, 157, 161},
|
|
{165, 169, 173, 177},
|
|
{1, 5, 9, 13},
|
|
};
|
|
#else
|
|
#define MAX_NUM_80M 7
|
|
|
|
unsigned char available_channel_AC_80m[MAX_NUM_80M][4] = {
|
|
{36, 40, 44, 48},
|
|
{52, 56, 60, 64},
|
|
{100, 104, 108, 112},
|
|
{116, 120, 124, 128},
|
|
{132, 136, 140, 144},
|
|
{149, 153, 157, 161},
|
|
{165, 169, 173, 177},
|
|
};
|
|
#endif
|
|
|
|
|
|
void get_txsc_AC(struct rtl8192cd_priv *priv, unsigned char channel)
|
|
{
|
|
unsigned char tmp, i, found = 0;
|
|
|
|
if (priv->pshare->CurrentChannelBW == HT_CHANNEL_WIDTH_80) {
|
|
for (tmp = 0; tmp < MAX_NUM_80M; tmp ++) {
|
|
for (i = 0; i < 4; i++) {
|
|
if (channel == available_channel_AC_80m[tmp][i]) {
|
|
found = 1;
|
|
//printk("found channel[%d] at [%d][%d]\n", channel, tmp, i);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (found)
|
|
break;
|
|
}
|
|
|
|
switch (i) {
|
|
case 0:
|
|
//printk("case 0 \n");
|
|
priv->pshare->txsc_20 = _20_B_40_B;
|
|
priv->pshare->txsc_40 = _40_B;
|
|
priv->pshare->offset_2nd_chan = HT_2NDCH_OFFSET_ABOVE;
|
|
break;
|
|
case 1:
|
|
priv->pshare->txsc_20 = _20_A_40_B;
|
|
priv->pshare->txsc_40 = _40_B;
|
|
priv->pshare->offset_2nd_chan = HT_2NDCH_OFFSET_BELOW;
|
|
break;
|
|
case 2:
|
|
priv->pshare->txsc_20 = _20_B_40_A;
|
|
priv->pshare->txsc_40 = _40_A;
|
|
priv->pshare->offset_2nd_chan = HT_2NDCH_OFFSET_ABOVE;
|
|
break;
|
|
case 3:
|
|
priv->pshare->txsc_20 = _20_A_40_A;
|
|
priv->pshare->txsc_40 = _40_A;
|
|
priv->pshare->offset_2nd_chan = HT_2NDCH_OFFSET_BELOW;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
} else if (priv->pshare->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40) {
|
|
if (priv->pshare->offset_2nd_chan == HT_2NDCH_OFFSET_BELOW)
|
|
priv->pshare->txsc_20 = 1;
|
|
else
|
|
priv->pshare->txsc_20 = 2;
|
|
|
|
priv->pshare->txsc_40 = 0;
|
|
} else if (priv->pshare->CurrentChannelBW == HT_CHANNEL_WIDTH_20) {
|
|
priv->pshare->txsc_20 = 0;
|
|
priv->pshare->txsc_40 = 0;
|
|
}
|
|
|
|
//printk("get_txsc_8812= %d %d \n", priv->pshare->txsc_20, priv->pshare->txsc_40);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
|
|
void SwBWMode_AC(struct rtl8192cd_priv *priv, unsigned int bandwidth, int offset)
|
|
{
|
|
unsigned char bTmp = 0, bTmp2 = 0;
|
|
unsigned int dwTmp = 0, dwTmp2 = 0,dwTmp3 = 0, tmp_rf = 0;
|
|
unsigned char primary_channel = 0;
|
|
unsigned int eRFPath, curMaxRFPath;
|
|
|
|
// printk("SwBWMode_AC +++ BW = %d txsc_20 = %d txsc_40 = %d\n", bandwidth, priv->pshare->txsc_20, priv->pshare->txsc_40);
|
|
|
|
curMaxRFPath = RF92CD_PATH_MAX;
|
|
|
|
primary_channel = priv->pshare->txsc_20;
|
|
|
|
//3 ========== <1> Set rf_mode 0x8ac & 0x668 & 0x8
|
|
dwTmp = RTL_R32(0x8ac);
|
|
dwTmp2 = RTL_R32(0x668);
|
|
dwTmp3 = RTL_R32(0x830);
|
|
|
|
dwTmp &= ~(BIT(0) | BIT(1) | BIT(6) | BIT(7) | BIT(8) | BIT(9) | BIT(20) | BIT(21));
|
|
dwTmp2 &= ~(BIT(7) | BIT(8));
|
|
dwTmp3 &= ~(BIT(3) | BIT(2) | BIT(1));
|
|
|
|
switch (bandwidth) {
|
|
case HT_CHANNEL_WIDTH_AC_5:
|
|
dwTmp |= (BIT(6) | BIT(20));
|
|
dwTmp3 |= (BIT(3) | BIT(1));
|
|
RTL_W32(0x8ac, dwTmp);
|
|
|
|
RTL_W32(0x668, dwTmp2);
|
|
RTL_W32(0x830, dwTmp3);
|
|
break;
|
|
case HT_CHANNEL_WIDTH_AC_10:
|
|
dwTmp |= (BIT(7) | BIT(8) | BIT(21));
|
|
RTL_W32(0x8ac, dwTmp);
|
|
|
|
RTL_W32(0x668, dwTmp2);
|
|
|
|
dwTmp3 |= BIT(3);
|
|
RTL_W32(0x830, dwTmp3);
|
|
break;
|
|
case HT_CHANNEL_WIDTH_AC_20:
|
|
dwTmp |= (BIT(9) | BIT(20) | BIT(21));
|
|
RTL_W32(0x8ac, dwTmp);
|
|
|
|
RTL_W32(0x668, dwTmp2);
|
|
break;
|
|
case HT_CHANNEL_WIDTH_AC_40:
|
|
dwTmp |= (BIT(0) | BIT(9) | BIT(20) | BIT(21));
|
|
RTL_W32(0x8ac, dwTmp);
|
|
|
|
dwTmp2 |= BIT(7);
|
|
RTL_W32(0x668, dwTmp2);
|
|
break;
|
|
case HT_CHANNEL_WIDTH_AC_80:
|
|
dwTmp |= (BIT(1) | BIT(9) | BIT(20) | BIT(21));
|
|
RTL_W32(0x8ac, dwTmp);
|
|
|
|
dwTmp2 |= BIT(8);
|
|
RTL_W32(0x668, dwTmp2);
|
|
break;
|
|
}
|
|
|
|
|
|
//3 ========== <2> Set adc buff clk 0x8c4 , rf_mode 0x8
|
|
if (IS_C_CUT_8812(priv)) {
|
|
switch (bandwidth)
|
|
{
|
|
case HT_CHANNEL_WIDTH_AC_5:
|
|
PHY_SetBBReg(priv, 0x8c4, BIT(30), 0);
|
|
PHY_SetBBReg(priv, 0x8, BIT(7)|BIT(6), 0x2);
|
|
break;
|
|
case HT_CHANNEL_WIDTH_AC_10:
|
|
PHY_SetBBReg(priv, 0x8c4, BIT(30), 0);
|
|
PHY_SetBBReg(priv, 0x8, BIT(7)|BIT(6), 0x1);
|
|
break;
|
|
case HT_CHANNEL_WIDTH_AC_20:
|
|
PHY_SetBBReg(priv, 0x8c4, BIT(30), 0);
|
|
PHY_SetBBReg(priv, 0x8, BIT(7)|BIT(6), 0x0);
|
|
break;
|
|
case HT_CHANNEL_WIDTH_AC_40:
|
|
PHY_SetBBReg(priv, 0x8c4, BIT(30), 0);
|
|
PHY_SetBBReg(priv, 0x8, BIT(7)|BIT(6), 0x0);
|
|
break;
|
|
case HT_CHANNEL_WIDTH_AC_80:
|
|
PHY_SetBBReg(priv, 0x8c4, BIT(30), 1);
|
|
PHY_SetBBReg(priv, 0x8, BIT(7)|BIT(6), 0x0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
//3 ========== <3> Set primary channel 0x8ac & 0xa00, txsc 0x483
|
|
|
|
dwTmp = RTL_R32(0x8ac);
|
|
dwTmp &= ~(BIT(2)|BIT(3)|BIT(4)|BIT(5));
|
|
|
|
bTmp = RTL_R8(0xa00);
|
|
bTmp2= RTL_R8(0x483);
|
|
|
|
switch (bandwidth) {
|
|
case HT_CHANNEL_WIDTH_AC_5:
|
|
case HT_CHANNEL_WIDTH_AC_10:
|
|
case HT_CHANNEL_WIDTH_AC_20:
|
|
break;
|
|
case HT_CHANNEL_WIDTH_AC_40:
|
|
dwTmp |= (primary_channel << 2);
|
|
RTL_W32(0x8ac, dwTmp);
|
|
RTL_W32(0x838, (RTL_R32(0x838) & 0x0fffffff) | (primary_channel << 28));
|
|
|
|
if (primary_channel == 1)
|
|
bTmp |= BIT(4);
|
|
else
|
|
bTmp &= ~(BIT(4));
|
|
|
|
RTL_W8(0xa00, bTmp);
|
|
|
|
bTmp2 &= 0xf0;
|
|
bTmp2 |= priv->pshare->txsc_20;
|
|
RTL_W8(0x483, bTmp2);
|
|
|
|
break;
|
|
case HT_CHANNEL_WIDTH_AC_80:
|
|
dwTmp |= (primary_channel << 2);
|
|
RTL_W32(0x8ac, dwTmp);
|
|
RTL_W32(0x838, (RTL_R32(0x838) & 0x0fffffff) | (primary_channel << 28));
|
|
|
|
bTmp2 = ( priv->pshare->txsc_20 | (priv->pshare->txsc_40 << 4));
|
|
RTL_W8(0x483, bTmp2);
|
|
|
|
break;
|
|
}
|
|
|
|
SpurCheck8812(priv, 0, 0, bandwidth);
|
|
|
|
//3 ========== <4> Set RRSR_RSC 0x440
|
|
|
|
dwTmp = RTL_R32(0x440);
|
|
dwTmp &= ~(BIT(21) | BIT(22));
|
|
|
|
switch (bandwidth) {
|
|
case HT_CHANNEL_WIDTH_AC_5:
|
|
case HT_CHANNEL_WIDTH_AC_10:
|
|
case HT_CHANNEL_WIDTH_AC_20:
|
|
break;
|
|
case HT_CHANNEL_WIDTH_AC_40:
|
|
RTL_W32(0x440, dwTmp);
|
|
break;
|
|
case HT_CHANNEL_WIDTH_AC_80:
|
|
|
|
//dwTmp |= (0x3 << 21);
|
|
//dwTmp |= (0x2 << 21); // duplicate ?
|
|
RTL_W32(0x440, dwTmp);
|
|
break;
|
|
}
|
|
|
|
//3 ========== <5> 0821, L1_peak_th 0x848
|
|
dwTmp = RTL_R32(0x848);
|
|
dwTmp &= ~(BIT(22)|BIT(23)|BIT(24)|BIT(25));
|
|
|
|
switch (bandwidth) {
|
|
|
|
case HT_CHANNEL_WIDTH_AC_5:
|
|
if (get_rf_mimo_mode(priv) == MIMO_1T1R)
|
|
dwTmp |= (7<<22);
|
|
else
|
|
dwTmp |= (6<<22);
|
|
break;
|
|
|
|
case HT_CHANNEL_WIDTH_AC_10:
|
|
if (get_rf_mimo_mode(priv) == MIMO_1T1R)
|
|
dwTmp |= (8<<22);
|
|
else
|
|
dwTmp |= (7<<22);
|
|
break;
|
|
|
|
case HT_CHANNEL_WIDTH_AC_20:
|
|
if (get_rf_mimo_mode(priv) == MIMO_1T1R)
|
|
dwTmp |= (8<<22);
|
|
else
|
|
dwTmp |= (7<<22);
|
|
break;
|
|
case HT_CHANNEL_WIDTH_AC_40:
|
|
dwTmp |= (6<<22);
|
|
break;
|
|
case HT_CHANNEL_WIDTH_AC_80:
|
|
dwTmp |= (5<<22);
|
|
break;
|
|
}
|
|
RTL_W32(0x848, dwTmp);
|
|
|
|
//3 ========== <6> Set RF TRX_BW rf_0x18
|
|
switch (bandwidth)
|
|
{
|
|
case HT_CHANNEL_WIDTH_AC_5:
|
|
case HT_CHANNEL_WIDTH_AC_10:
|
|
case HT_CHANNEL_WIDTH_AC_20:
|
|
tmp_rf = 0x03;
|
|
break;
|
|
case HT_CHANNEL_WIDTH_AC_40:
|
|
tmp_rf = 0x01;
|
|
break;
|
|
case HT_CHANNEL_WIDTH_AC_80:
|
|
tmp_rf = 0x00;
|
|
break;
|
|
}
|
|
|
|
for(eRFPath = RF92CD_PATH_A; eRFPath < curMaxRFPath; eRFPath++) {
|
|
unsigned int orig_val = PHY_QueryRFReg(priv, eRFPath, rRfChannel, bMask20Bits, 1);
|
|
orig_val &= ~(BIT(10)|BIT(11));
|
|
orig_val |= (tmp_rf << 10);
|
|
PHY_SetRFReg(priv, eRFPath, rRfChannel, bMask20Bits, orig_val);
|
|
}
|
|
|
|
}
|
|
#endif // #if defined(CONFIG_RTL_8812_SUPPORT)
|
|
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
void get_txsc_92e(struct rtl8192cd_priv *priv, unsigned char channel)
|
|
{
|
|
if (priv->pshare->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40) {
|
|
if (priv->pshare->offset_2nd_chan == HT_2NDCH_OFFSET_BELOW)
|
|
priv->pshare->txsc_20_92e = 1;
|
|
else
|
|
priv->pshare->txsc_20_92e = 2;
|
|
} else if (priv->pshare->CurrentChannelBW == HT_CHANNEL_WIDTH_20) {
|
|
priv->pshare->txsc_20_92e = 0;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
void SwBWMode(struct rtl8192cd_priv *priv, unsigned int bandwidth, int offset)
|
|
{
|
|
unsigned char regBwOpMode, regRRSR_RSC, nCur40MhzPrimeSC;
|
|
unsigned int eRFPath, curMaxRFPath, val;
|
|
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
priv->pshare->No_RF_Write = 0;
|
|
get_txsc_AC(priv, priv->pmib->dot11RFEntry.dot11channel);
|
|
SwBWMode_AC(priv, bandwidth, offset);
|
|
priv->pshare->No_RF_Write = 1;
|
|
return;
|
|
}
|
|
#endif //#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
|
|
#if defined(CONFIG_WLAN_HAL_8881A) || defined(CONFIG_WLAN_HAL_8814AE)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8881A) || (GET_CHIP_VER(priv) == VERSION_8814A)) {
|
|
priv->pshare->No_RF_Write = 0;
|
|
get_txsc_AC(priv, priv->pmib->dot11RFEntry.dot11channel);
|
|
GET_HAL_INTERFACE(priv)->PHYSwBWModeHandler(priv, bandwidth, offset);
|
|
priv->pshare->No_RF_Write = 1;
|
|
return;
|
|
}
|
|
#endif //#if defined(CONFIG_WLAN_HAL_8881A)
|
|
#if defined(CONFIG_WLAN_HAL_8192EE)
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E) {
|
|
get_txsc_92e(priv, priv->pmib->dot11RFEntry.dot11channel);
|
|
GET_HAL_INTERFACE(priv)->PHYSwBWModeHandler(priv, bandwidth, offset);
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
DEBUG_INFO("SwBWMode(): Switch to %s bandwidth\n", bandwidth ? "40MHz" : "20MHz");
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if (priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY)
|
|
curMaxRFPath = RF92CD_PATH_B;
|
|
else
|
|
#endif
|
|
curMaxRFPath = RF92CD_PATH_MAX;
|
|
|
|
if (offset == 1)
|
|
nCur40MhzPrimeSC = 2;
|
|
else
|
|
nCur40MhzPrimeSC = 1;
|
|
|
|
//3 <1> Set MAC register
|
|
regBwOpMode = RTL_R8(BWOPMODE);
|
|
regRRSR_RSC = RTL_R8(RRSR + 2);
|
|
|
|
switch (bandwidth) {
|
|
case HT_CHANNEL_WIDTH_20:
|
|
regBwOpMode |= BW_OPMODE_20MHZ;
|
|
RTL_W8(BWOPMODE, regBwOpMode);
|
|
break;
|
|
case HT_CHANNEL_WIDTH_20_40:
|
|
regBwOpMode &= ~BW_OPMODE_20MHZ;
|
|
RTL_W8(BWOPMODE, regBwOpMode);
|
|
regRRSR_RSC = (regRRSR_RSC & 0x90) | (nCur40MhzPrimeSC << 5);
|
|
RTL_W8(RRSR + 2, regRRSR_RSC);
|
|
|
|
// Let 812cd_rx, re-assign value
|
|
if (priv->pshare->is_40m_bw) {
|
|
priv->pshare->Reg_RRSR_2 = 0;
|
|
priv->pshare->Reg_81b = 0;
|
|
}
|
|
break;
|
|
default:
|
|
DEBUG_ERR("SwBWMode(): bandwidth mode error!\n");
|
|
return;
|
|
break;
|
|
}
|
|
|
|
//3 <2> Set PHY related register
|
|
switch (bandwidth) {
|
|
case HT_CHANNEL_WIDTH_20:
|
|
PHY_SetBBReg(priv, rFPGA0_RFMOD, bRFMOD, 0x0);
|
|
PHY_SetBBReg(priv, rFPGA1_RFMOD, bRFMOD, 0x0);
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
PHY_SetBBReg(priv, rFPGA0_AnalogParameter2, BIT(11) | BIT(10), 3);// SET BIT10 BIT11 for receive cck
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)) {
|
|
PHY_SetBBReg(priv, rFPGA0_AnalogParameter2, BIT(10), 1);
|
|
}
|
|
#endif
|
|
break;
|
|
case HT_CHANNEL_WIDTH_20_40:
|
|
PHY_SetBBReg(priv, rFPGA0_RFMOD, bRFMOD, 0x1);
|
|
PHY_SetBBReg(priv, rFPGA1_RFMOD, bRFMOD, 0x1);
|
|
// Set Control channel to upper or lower. These settings are required only for 40MHz
|
|
PHY_SetBBReg(priv, rCCK0_System, bCCKSideBand, (nCur40MhzPrimeSC >> 1));
|
|
PHY_SetBBReg(priv, rOFDM1_LSTF, 0xC00, nCur40MhzPrimeSC);
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
PHY_SetBBReg(priv, rFPGA0_AnalogParameter2, BIT(11) | BIT(10), 0);// SET BIT10 BIT11 for receive cck
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)) {
|
|
PHY_SetBBReg(priv, rFPGA0_AnalogParameter2, BIT(10), 0);
|
|
}
|
|
#endif
|
|
PHY_SetBBReg(priv, 0x818, (BIT(26) | BIT(27)), (nCur40MhzPrimeSC == 2) ? 1 : 2);
|
|
break;
|
|
default:
|
|
DEBUG_ERR("SwBWMode(): bandwidth mode error! %d\n", __LINE__);
|
|
return;
|
|
break;
|
|
}
|
|
|
|
//3<3> Set RF related register
|
|
switch (bandwidth) {
|
|
case HT_CHANNEL_WIDTH_20: {
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E)
|
|
val = 3;
|
|
else
|
|
#endif
|
|
val = 1;
|
|
}
|
|
break;
|
|
case HT_CHANNEL_WIDTH_20_40:
|
|
val = 0;
|
|
break;
|
|
default:
|
|
DEBUG_ERR("SwBWMode(): bandwidth mode error! %d\n", __LINE__);
|
|
return;
|
|
break;
|
|
}
|
|
|
|
for (eRFPath = RF92CD_PATH_A; eRFPath < curMaxRFPath; eRFPath++) {
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)) {
|
|
PHY_SetRFReg(priv, eRFPath, rRfChannel, (BIT(11) | BIT(10)), val);
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
priv->pshare->RegRF18[eRFPath] = RTL_SET_MASK(priv->pshare->RegRF18[eRFPath], (BIT(11) | BIT(10)), val, 10);
|
|
PHY_SetRFReg(priv, eRFPath, rRfChannel, bMask20Bits, priv->pshare->RegRF18[eRFPath]);
|
|
//PHY_SetRFReg(priv, eRFPath, rRfChannel, (BIT(11)|BIT(10)), val);
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
PHY_SetRFReg(priv, (RF92CD_RADIO_PATH_E)eRFPath, rRfChannel, (BIT(11) | BIT(10)), val);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
#if 0
|
|
if (priv->pshare->rf_ft_var.use_frq_2_3G)
|
|
PHY_SetRFReg(priv, RF90_PATH_C, 0x2c, 0x60, 0);
|
|
#endif
|
|
#ifdef TX_EARLY_MODE
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
if ((bandwidth == HT_CHANNEL_WIDTH_20) && GET_TX_EARLY_MODE) {
|
|
GET_TX_EARLY_MODE = 0;
|
|
//printk("[%s:%d] 88E 20M mpde ===> turn off early mode!\n", __FUNCTION__, __LINE__);
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
|
|
#if defined(SUPPORT_TX_AMSDU) || defined (P2P_SUPPORT)
|
|
void setup_timer2(struct rtl8192cd_priv *priv, unsigned int timeout)
|
|
{
|
|
unsigned int current_value = RTL_R32(TSFTR);
|
|
|
|
if (TSF_LESS(timeout, current_value))
|
|
timeout = current_value + 20;
|
|
|
|
RTL_W32(TIMER1, timeout);
|
|
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if ( IS_HAL_CHIP(priv) ) {
|
|
GET_HAL_INTERFACE(priv)->AddInterruptMaskHandler(priv, HAL_INT_TYPE_PSTIMEOUT2);
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif //CONFIG_WLAN_HAL
|
|
{//not HAL
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E)
|
|
RTL_W32(REG_HIMR0_8812, RTL_R32(REG_HIMR0_8812) | IMR_TIMER2_8812);
|
|
else
|
|
#endif
|
|
RTL_W32(HIMR, RTL_R32(HIMR) | HIMR_TIMEOUT2);
|
|
}
|
|
}
|
|
|
|
|
|
void cancel_timer2(struct rtl8192cd_priv *priv)
|
|
{
|
|
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if ( IS_HAL_CHIP(priv) ) {
|
|
GET_HAL_INTERFACE(priv)->RemoveInterruptMaskHandler(priv, HAL_INT_TYPE_PSTIMEOUT2);
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif //CONFIG_WLAN_HAL
|
|
{//not HAL
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E)
|
|
RTL_W32(REG_HIMR0_8812, RTL_R32(REG_HIMR0_8812) & ~IMR_TIMER2_8812);
|
|
else
|
|
#endif
|
|
RTL_W32(HIMR, RTL_R32(HIMR) & ~HIMR_TIMEOUT2);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
#if 0
|
|
void tx_path_by_rssi(struct rtl8192cd_priv *priv, struct stat_info *pstat, unsigned char enable)
|
|
{
|
|
|
|
if ((get_rf_mimo_mode(priv) != MIMO_2T2R))
|
|
return; // 1T2R, 1T1R; do nothing
|
|
|
|
if (pstat == NULL)
|
|
return;
|
|
|
|
if (pstat->sta_in_firmware != 1 || getSTABitMap(&priv->pshare->has_2r_sta, REMAP_AID(pstat))) // 2r STA
|
|
return; // do nothing
|
|
|
|
// for debug, by victoryman 20090623
|
|
if (pstat->tx_ra_bitmap & 0xff00000) {
|
|
// this should be a 2r station!!!
|
|
return;
|
|
}
|
|
|
|
if (pstat->tx_ra_bitmap & 0xffff000) { // 11n 1R client
|
|
if (enable) {
|
|
if (pstat->rf_info.mimorssi[0] > pstat->rf_info.mimorssi[1])
|
|
Switch_1SS_Antenna(priv, 1);
|
|
else
|
|
Switch_1SS_Antenna(priv, 2);
|
|
} else
|
|
Switch_1SS_Antenna(priv, 3);
|
|
} else if (pstat->tx_ra_bitmap & 0xff0) { // 11bg client
|
|
if (enable) {
|
|
if (pstat->rf_info.mimorssi[0] > pstat->rf_info.mimorssi[1])
|
|
Switch_OFDM_Antenna(priv, 1);
|
|
else
|
|
Switch_OFDM_Antenna(priv, 2);
|
|
} else
|
|
Switch_OFDM_Antenna(priv, 3);
|
|
}
|
|
|
|
#if 0 // original setup
|
|
if (priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) { // for 11n 1ss sta
|
|
if (enable) {
|
|
if (pstat->rf_info.mimorssi[0] > pstat->rf_info.mimorssi[1])
|
|
Switch_1SS_Antenna(priv, 1);
|
|
else
|
|
Switch_1SS_Antenna(priv, 2);
|
|
} else
|
|
Switch_1SS_Antenna(priv, 3);
|
|
} else if (priv->pmib->dot11BssType.net_work_type & WIRELESS_11G) { // for 11g
|
|
if (enable) {
|
|
if (pstat->rf_info.mimorssi[0] > pstat->rf_info.mimorssi[1])
|
|
Switch_OFDM_Antenna(priv, 1);
|
|
else
|
|
Switch_OFDM_Antenna(priv, 2);
|
|
} else
|
|
Switch_OFDM_Antenna(priv, 3);
|
|
}
|
|
#endif
|
|
|
|
|
|
}
|
|
//#endif
|
|
|
|
|
|
// dynamic Rx path selection by signal strength
|
|
void rx_path_by_rssi(struct rtl8192cd_priv *priv, struct stat_info *pstat, int enable)
|
|
{
|
|
unsigned char highest_rssi = 0, higher_rssi = 0, under_ss_th_low = 0;
|
|
RF92CD_RADIO_PATH_E eRFPath, eRFPath_highest = 0, eRFPath_higher = 0;
|
|
int ant_on_processing = 0;
|
|
#ifdef _DEBUG_RTL8192CD_
|
|
char path_name[] = {'A', 'B'};
|
|
#endif
|
|
|
|
if (enable == FALSE) {
|
|
if (priv->pshare->phw->ant_off_num) {
|
|
priv->pshare->phw->ant_off_num = 0;
|
|
priv->pshare->phw->ant_off_bitmap = 0;
|
|
RTL_W8(rOFDM0_TRxPathEnable, 0x0f);
|
|
RTL_W8(rOFDM1_TRxPathEnable, 0x0f);
|
|
DEBUG_INFO("More than 1 sta, turn on all path\n");
|
|
}
|
|
return;
|
|
}
|
|
|
|
for (eRFPath = RF92CD_PATH_A; eRFPath < priv->pshare->phw->NumTotalRFPath; eRFPath++) {
|
|
if (priv->pshare->phw->ant_off_bitmap & BIT(eRFPath))
|
|
continue;
|
|
|
|
if (pstat->rf_info.mimorssi[eRFPath] > highest_rssi) {
|
|
higher_rssi = highest_rssi;
|
|
eRFPath_higher = eRFPath_highest;
|
|
highest_rssi = pstat->rf_info.mimorssi[eRFPath];
|
|
eRFPath_highest = eRFPath;
|
|
}
|
|
|
|
else if (pstat->rf_info.mimorssi[eRFPath] > higher_rssi) {
|
|
higher_rssi = pstat->rf_info.mimorssi[eRFPath];
|
|
eRFPath_higher = eRFPath;
|
|
}
|
|
|
|
if (pstat->rf_info.mimorssi[eRFPath] < priv->pshare->rf_ft_var.ss_th_low)
|
|
under_ss_th_low = 1;
|
|
}
|
|
|
|
// for OFDM
|
|
if (priv->pshare->phw->ant_off_num > 0) {
|
|
for (eRFPath = RF92CD_PATH_A; eRFPath < priv->pshare->phw->NumTotalRFPath; eRFPath++) {
|
|
if (!(priv->pshare->phw->ant_off_bitmap & BIT(eRFPath)))
|
|
continue;
|
|
|
|
if (highest_rssi >= priv->pshare->phw->ant_on_criteria[eRFPath]) {
|
|
priv->pshare->phw->ant_off_num--;
|
|
priv->pshare->phw->ant_off_bitmap &= (~BIT(eRFPath));
|
|
RTL_W8(rOFDM0_TRxPathEnable, ~(priv->pshare->phw->ant_off_bitmap) & 0x0f);
|
|
RTL_W8(rOFDM1_TRxPathEnable, ~(priv->pshare->phw->ant_off_bitmap) & 0x0f);
|
|
DEBUG_INFO("Path %c is on due to >= %d%%\n",
|
|
path_name[eRFPath], priv->pshare->phw->ant_on_criteria[eRFPath]);
|
|
ant_on_processing = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!ant_on_processing) {
|
|
if (priv->pshare->phw->ant_off_num < 2) {
|
|
for (eRFPath = RF92CD_PATH_A; eRFPath < priv->pshare->phw->NumTotalRFPath; eRFPath++) {
|
|
if ((eRFPath == eRFPath_highest) || (priv->pshare->phw->ant_off_bitmap & BIT(eRFPath)))
|
|
continue;
|
|
|
|
if ((pstat->rf_info.mimorssi[eRFPath] < priv->pshare->rf_ft_var.ss_th_low) &&
|
|
((highest_rssi - pstat->rf_info.mimorssi[eRFPath]) > priv->pshare->rf_ft_var.diff_th)) {
|
|
priv->pshare->phw->ant_off_num++;
|
|
priv->pshare->phw->ant_off_bitmap |= BIT(eRFPath);
|
|
priv->pshare->phw->ant_on_criteria[eRFPath] = highest_rssi + 5;
|
|
RTL_W8(rOFDM0_TRxPathEnable, ~(priv->pshare->phw->ant_off_bitmap) & 0x0f);
|
|
RTL_W8(rOFDM1_TRxPathEnable, ~(priv->pshare->phw->ant_off_bitmap) & 0x0f);
|
|
DEBUG_INFO("Path %c is off due to under th_low %d%% and diff %d%%, will be on at %d%%\n",
|
|
path_name[eRFPath], priv->pshare->rf_ft_var.ss_th_low,
|
|
(highest_rssi - pstat->rf_info.mimorssi[eRFPath]),
|
|
priv->pshare->phw->ant_on_criteria[eRFPath]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// For CCK
|
|
if (priv->pshare->rf_ft_var.cck_sel_ver == 1) {
|
|
if (under_ss_th_low && (pstat->rx_pkts > 20)) {
|
|
if (priv->pshare->phw->ant_cck_sel != ((eRFPath_highest << 2) | eRFPath_higher)) {
|
|
priv->pshare->phw->ant_cck_sel = ((eRFPath_highest << 2) | eRFPath_higher);
|
|
RTL_W8(0xa07, (RTL_R8(0xa07) & 0xf0) | priv->pshare->phw->ant_cck_sel);
|
|
DEBUG_INFO("CCK select default: path %c, optional: path %c\n",
|
|
path_name[eRFPath_highest], path_name[eRFPath_higher]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// dynamic Rx path selection by signal strength
|
|
void rx_path_by_rssi_cck_v2(struct rtl8192cd_priv *priv, struct stat_info *pstat)
|
|
{
|
|
int highest_rssi = -1000, higher_rssi = -1000;
|
|
RF92CD_RADIO_PATH_E eRFPath, eRFPath_highest = 0, eRFPath_higher = 0;
|
|
#ifdef _DEBUG_RTL8192CD_
|
|
char path_name[] = {'A', 'B'};
|
|
#endif
|
|
|
|
for (eRFPath = RF92CD_PATH_A; eRFPath < priv->pshare->phw->NumTotalRFPath; eRFPath++) {
|
|
if (pstat->cck_mimorssi_total[eRFPath] > highest_rssi) {
|
|
higher_rssi = highest_rssi;
|
|
eRFPath_higher = eRFPath_highest;
|
|
highest_rssi = pstat->cck_mimorssi_total[eRFPath];
|
|
eRFPath_highest = eRFPath;
|
|
}
|
|
|
|
else if (pstat->cck_mimorssi_total[eRFPath] > higher_rssi) {
|
|
higher_rssi = pstat->cck_mimorssi_total[eRFPath];
|
|
eRFPath_higher = eRFPath;
|
|
}
|
|
}
|
|
|
|
if (priv->pshare->phw->ant_cck_sel != ((eRFPath_highest << 2) | eRFPath_higher)) {
|
|
priv->pshare->phw->ant_cck_sel = ((eRFPath_highest << 2) | eRFPath_higher);
|
|
RTL_W8(0xa07, (RTL_R8(0xa07) & 0xf0) | priv->pshare->phw->ant_cck_sel);
|
|
DEBUG_INFO("CCK rssi A:%d B:%d C:%d D:%d accu %d pkts\n", pstat->cck_mimorssi_total[0],
|
|
pstat->cck_mimorssi_total[1], pstat->cck_mimorssi_total[2], pstat->cck_mimorssi_total[3], pstat->cck_rssi_num);
|
|
DEBUG_INFO("CCK select default: path %c, optional: path %c\n",
|
|
path_name[eRFPath_highest], path_name[eRFPath_higher]);
|
|
}
|
|
}
|
|
|
|
|
|
// Tx power control
|
|
void tx_power_control(struct rtl8192cd_priv *priv, struct stat_info *pstat, int enable)
|
|
{
|
|
if (enable) {
|
|
if (!priv->pshare->phw->lower_tx_power) {
|
|
// TX High power enable
|
|
// set_fw_reg(priv, 0xfd000009, 0, 0);
|
|
if (!priv->pshare->bcnTxAGC)
|
|
RTL_W8(0x364, RTL_R8(0x364) | FW_REG364_HP);
|
|
priv->pshare->phw->lower_tx_power++;
|
|
|
|
if ((!priv->pshare->is_40m_bw || (pstat->tx_bw == HT_CHANNEL_WIDTH_20)) &&
|
|
(!pstat->is_rtl8190_sta && !pstat->is_broadcom_sta && !pstat->is_marvell_sta && !pstat->is_intel_sta))
|
|
set_fw_reg(priv, 0xfd004314, 0, 0);
|
|
else
|
|
set_fw_reg(priv, 0xfd000015, 0, 0);
|
|
}
|
|
} else {
|
|
if (priv->pshare->phw->lower_tx_power) {
|
|
//TX High power disable
|
|
// set_fw_reg(priv, 0xfd000008, 0, 0);
|
|
RTL_W8(0x364, RTL_R8(0x364) & ~FW_REG364_HP);
|
|
priv->pshare->phw->lower_tx_power = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void tx_power_tracking(struct rtl8192cd_priv *priv)
|
|
{
|
|
if (priv->pmib->dot11RFEntry.ther) {
|
|
DEBUG_INFO("TPT: triggered(every %d seconds)\n", priv->pshare->rf_ft_var.tpt_period);
|
|
|
|
// enable rf reg 0x24 power and trigger, to get ther value in 1 second
|
|
PHY_SetRFReg(priv, RF92CD_PATH_A, 0x24, bMask20Bits, 0x60);
|
|
mod_timer(&priv->pshare->phw->tpt_timer, jiffies + RTL_MILISECONDS_TO_JIFFIES(1000)); // 1000ms
|
|
}
|
|
}
|
|
|
|
|
|
void rtl8192cd_tpt_timer(unsigned long task_priv)
|
|
{
|
|
struct rtl8192cd_priv *priv = (struct rtl8192cd_priv *)task_priv;
|
|
unsigned int val32;
|
|
|
|
if (!(priv->drv_state & DRV_STATE_OPEN))
|
|
return;
|
|
|
|
if (timer_pending(&priv->pshare->phw->tpt_timer))
|
|
del_timer_sync(&priv->pshare->phw->tpt_timer);
|
|
|
|
if (priv->pmib->dot11RFEntry.ther) {
|
|
// query rf reg 0x24[4:0], for thermal meter value
|
|
val32 = PHY_QueryRFReg(priv, RF92CD_PATH_A, 0x24, bMask20Bits, 1) & 0x01f;
|
|
|
|
if (val32) {
|
|
set_fw_reg(priv, 0xfd000019 | (priv->pmib->dot11RFEntry.ther & 0xff) << 8 | val32 << 16, 0, 0);
|
|
DEBUG_INFO("TPT: finished once (ther: current=0x%02x, target=0x%02x)\n",
|
|
val32, priv->pmib->dot11RFEntry.ther);
|
|
} else {
|
|
DEBUG_WARN("TPT: cannot finish, since wrong current ther value report\n");
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
|
|
/*
|
|
*
|
|
* CAM related functions
|
|
*
|
|
*/
|
|
|
|
/*******************************************************/
|
|
/*CAM related utility */
|
|
/*CamAddOneEntry */
|
|
/*CamDeleteOneEntry */
|
|
/*CamResetAllEntry */
|
|
/*******************************************************/
|
|
#define TOTAL_CAM_ENTRY (priv->pshare->total_cam_entry)
|
|
|
|
#define CAM_CONTENT_COUNT 8
|
|
#define CAM_CONTENT_USABLE_COUNT 6
|
|
|
|
#define CFG_VALID BIT(15)
|
|
#define CFG_RPT_MD BIT(8)
|
|
|
|
|
|
static UCHAR CAM_find_usable(struct rtl8192cd_priv *priv)
|
|
{
|
|
unsigned long command = 0, content = 0;
|
|
unsigned char index;
|
|
int for_begin = 4;
|
|
#ifdef CONFIG_WLAN_HAL
|
|
u4Byte retVal;
|
|
#endif // CONFIG_WLAN_HAL
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
for_begin = 3;
|
|
|
|
#ifdef MBSSID
|
|
if (GET_ROOT(priv)->pmib->miscEntry.vap_enable)
|
|
for_begin = 0;
|
|
#endif
|
|
#ifdef UNIVERSAL_REPEATER
|
|
if (IS_VXD_INTERFACE(priv)) {
|
|
for_begin = 0;
|
|
} else {
|
|
if (IS_ROOT_INTERFACE(priv)) {
|
|
if (IS_DRV_OPEN(GET_VXD_PRIV(priv)))
|
|
for_begin = 0;
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
retVal = GET_HAL_INTERFACE(priv)->CAMFindUsableHandler(priv, for_begin);
|
|
return (unsigned char)retVal;
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{//not HAL
|
|
for (index = for_begin; index < TOTAL_CAM_ENTRY; index++) {
|
|
// polling bit, and No Write enable, and address
|
|
command = CAM_CONTENT_COUNT * index;
|
|
RTL_W32(CAMCMD, (SECCAM_POLL | command));
|
|
|
|
// Check polling bit is clear
|
|
while (1) {
|
|
command = RTL_R32(CAMCMD);
|
|
if (command & SECCAM_POLL)
|
|
continue;
|
|
else
|
|
break;
|
|
}
|
|
content = RTL_R32(CAMREAD);
|
|
|
|
// check valid bit. if not valid,
|
|
if ((content & CFG_VALID) == 0) {
|
|
return index;
|
|
}
|
|
}
|
|
}
|
|
return TOTAL_CAM_ENTRY;
|
|
}
|
|
|
|
|
|
static void CAM_program_entry(struct rtl8192cd_priv *priv, unsigned char index, unsigned char* macad,
|
|
unsigned char* key128, unsigned short config)
|
|
{
|
|
unsigned long target_command = 0, target_content = 0;
|
|
signed char entry_i = 0;
|
|
struct stat_info *pstat;
|
|
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
GET_HAL_INTERFACE(priv)->CAMProgramEntryHandler(
|
|
priv,
|
|
index,
|
|
macad,
|
|
key128,
|
|
config
|
|
);
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{//not HAL
|
|
for (entry_i = (CAM_CONTENT_USABLE_COUNT-1); entry_i >= 0; entry_i--) {
|
|
// polling bit, and write enable, and address
|
|
target_command = entry_i + CAM_CONTENT_COUNT * index;
|
|
target_command = target_command | SECCAM_POLL | SECCAM_WE;
|
|
if (entry_i == 0) {
|
|
//first 32-bit is MAC address and CFG field
|
|
target_content = (ULONG)(*(macad + 0)) << 16
|
|
| (ULONG)(*(macad + 1)) << 24
|
|
| (ULONG)config;
|
|
target_content = target_content | config;
|
|
} else if (entry_i == 1) {
|
|
//second 32-bit is MAC address
|
|
target_content = (ULONG)(*(macad + 5)) << 24
|
|
| (ULONG)(*(macad + 4)) << 16
|
|
| (ULONG)(*(macad + 3)) << 8
|
|
| (ULONG)(*(macad + 2));
|
|
} else {
|
|
target_content = (ULONG)(*(key128 + (entry_i * 4 - 8) + 3)) << 24
|
|
| (ULONG)(*(key128 + (entry_i * 4 - 8) + 2)) << 16
|
|
| (ULONG)(*(key128 + (entry_i * 4 - 8) + 1)) << 8
|
|
| (ULONG)(*(key128 + (entry_i * 4 - 8) + 0));
|
|
}
|
|
|
|
RTL_W32(CAMWRITE, target_content);
|
|
RTL_W32(CAMCMD, target_command);
|
|
}
|
|
|
|
target_content = RTL_R32(CR);
|
|
if ((target_content & MAC_SEC_EN) == 0)
|
|
RTL_W32(CR, (target_content | MAC_SEC_EN));
|
|
}
|
|
|
|
pstat = get_stainfo(priv, macad);
|
|
if (pstat) {
|
|
pstat->cam_id = index;
|
|
}
|
|
// move above
|
|
#if 0
|
|
target_content = RTL_R32(CR);
|
|
if ((target_content & MAC_SEC_EN) == 0)
|
|
RTL_W32(CR, (target_content | MAC_SEC_EN));
|
|
#endif
|
|
}
|
|
|
|
|
|
int CamAddOneEntry(struct rtl8192cd_priv *priv, unsigned char *pucMacAddr, unsigned long keyId,
|
|
unsigned long encAlg, unsigned long useDK, unsigned char *pKey)
|
|
{
|
|
unsigned char retVal = 0, camIndex = 0, wpaContent = 0;
|
|
unsigned short usConfig = 0;
|
|
unsigned int set_dk_margin = 4;
|
|
|
|
//use Hardware Polling to check the valid bit.
|
|
//in reality it should be done by software link-list
|
|
if ((!memcmp(pucMacAddr, "\xff\xff\xff\xff\xff\xff", 6)) || (useDK
|
|
#if defined(CONFIG_RTL_HW_WAPI_SUPPORT)
|
|
&& ((encAlg >> 2) != DOT11_ENC_WAPI)
|
|
#endif
|
|
))
|
|
camIndex = keyId;
|
|
else
|
|
camIndex = CAM_find_usable(priv);
|
|
|
|
if (camIndex == TOTAL_CAM_ENTRY)
|
|
return retVal;
|
|
|
|
usConfig = usConfig | CFG_VALID | ((USHORT)(encAlg)) | (UCHAR)keyId;
|
|
#ifdef MULTI_MAC_CLONE
|
|
if ((OPMODE&WIFI_STATION_STATE) && priv->pmib->ethBrExtInfo.macclone_enable)
|
|
usConfig |= CFG_RPT_MD;
|
|
#endif
|
|
|
|
#if defined(CONFIG_RTL_HW_WAPI_SUPPORT)
|
|
if ((encAlg >> 2) == DOT11_ENC_WAPI) {
|
|
//ulUseDK is used to diff Parwise and Group
|
|
if (camIndex < 4) //is group key
|
|
usConfig |= BIT(6);
|
|
|
|
if (useDK == 1) // ==0 sec key; == 1mic key
|
|
usConfig |= BIT(5);
|
|
|
|
useDK = 0;
|
|
}
|
|
#endif
|
|
|
|
CAM_program_entry(priv, camIndex, pucMacAddr, pKey, usConfig);
|
|
|
|
if (priv->pshare->CamEntryOccupied == 0) {
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
SECURITY_CONFIG_OPERATION SCO;
|
|
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_SECURITY_CONFIG, (pu1Byte)&SCO);
|
|
if (useDK == 1) {
|
|
SCO |= SCO_RXUSEDK | SCO_TXUSEDK;
|
|
}
|
|
SCO |= SCO_RXDEC | SCO_TXENC | SCO_NOSKMC | SCO_CHK_KEYID;
|
|
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_SECURITY_CONFIG, (pu1Byte)&SCO);
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{//not HAL
|
|
if (useDK == 1)
|
|
wpaContent = RXUSEDK | TXUSEDK;
|
|
RTL_W16(SECCFG, RTL_R16(SECCFG) | RXDEC | TXENC | wpaContent | NOSKMC | CHK_KEYID);
|
|
}
|
|
}
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
set_dk_margin = 3;
|
|
|
|
#ifdef MBSSID
|
|
if (GET_ROOT(priv)->pmib->miscEntry.vap_enable)
|
|
set_dk_margin = 0;
|
|
#endif
|
|
#ifdef UNIVERSAL_REPEATER
|
|
if (IS_VXD_INTERFACE(priv)) {
|
|
set_dk_margin = 0;
|
|
} else {
|
|
if (IS_ROOT_INTERFACE(priv)) {
|
|
if (IS_DRV_OPEN(GET_VXD_PRIV(priv)))
|
|
set_dk_margin = 0;
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
if (camIndex < set_dk_margin) {
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
SECURITY_CONFIG_OPERATION SCO;
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_SECURITY_CONFIG, (pu1Byte)&SCO);
|
|
SCO = (SCO & ~SCO_NOSKMC) | (SCO_RXBCUSEDK | SCO_TXBCUSEDK);
|
|
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_SECURITY_CONFIG, (pu1Byte)&SCO);
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{//not HAL
|
|
RTL_W16(SECCFG, (RTL_R16(SECCFG) & ~NOSKMC) | (RXBCUSEDK | TXBCUSEDK));
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
#if(CONFIG_WLAN_NOT_HAL_EXIST==1)
|
|
void CAM_read_mac_config(struct rtl8192cd_priv *priv, unsigned char index, unsigned char* pMacad,
|
|
unsigned short* pTempConfig)
|
|
{
|
|
unsigned long command = 0, content = 0;
|
|
|
|
// polling bit, and No Write enable, and address
|
|
// cam address...
|
|
// first 32-bit
|
|
command = CAM_CONTENT_COUNT * index + 0;
|
|
command = command | SECCAM_POLL;
|
|
RTL_W32(CAMCMD, command);
|
|
|
|
//Check polling bit is clear
|
|
while (1) {
|
|
#ifdef CONFIG_SDIO_HCI
|
|
{
|
|
s32 err;
|
|
command = sdio_read32(priv, CAMCMD, &err);
|
|
if (-ENOMEDIUM == err)
|
|
return;
|
|
}
|
|
#else
|
|
command = RTL_R32(CAMCMD);
|
|
#endif
|
|
if (command & SECCAM_POLL)
|
|
continue;
|
|
else
|
|
break;
|
|
}
|
|
content = RTL_R32(CAMREAD);
|
|
|
|
//first 32-bit is MAC address and CFG field
|
|
*(pMacad + 0) = (UCHAR)((content >> 16) & 0x000000FF);
|
|
*(pMacad + 1) = (UCHAR)((content >> 24) & 0x000000FF);
|
|
*pTempConfig = (USHORT)(content & 0x0000FFFF);
|
|
|
|
command = CAM_CONTENT_COUNT * index + 1;
|
|
command = command | SECCAM_POLL;
|
|
RTL_W32(CAMCMD, command);
|
|
|
|
//Check polling bit is clear
|
|
while (1) {
|
|
#ifdef CONFIG_SDIO_HCI
|
|
{
|
|
s32 err;
|
|
command = sdio_read32(priv, CAMCMD, &err);
|
|
if (-ENOMEDIUM == err)
|
|
return;
|
|
}
|
|
#else
|
|
command = RTL_R32(CAMCMD);
|
|
#endif
|
|
if (command & SECCAM_POLL)
|
|
continue;
|
|
else
|
|
break;
|
|
}
|
|
content = RTL_R32(CAMREAD);
|
|
|
|
*(pMacad + 5) = (UCHAR)((content >> 24) & 0x000000FF);
|
|
*(pMacad + 4) = (UCHAR)((content >> 16) & 0x000000FF);
|
|
*(pMacad + 3) = (UCHAR)((content >> 8) & 0x000000FF);
|
|
*(pMacad + 2) = (UCHAR)((content) & 0x000000FF);
|
|
}
|
|
#else
|
|
void CAM_read_mac_config(struct rtl8192cd_priv *priv, unsigned char index, unsigned char* pMacad,
|
|
unsigned short* pTempConfig)
|
|
{
|
|
return;
|
|
}
|
|
#endif//CONFIG_WLAN_NOT_HAL_EXIST
|
|
|
|
|
|
#if 0
|
|
void CAM_mark_invalid(struct rtl8192cd_priv *priv, UCHAR ucIndex)
|
|
{
|
|
ULONG ulCommand = 0;
|
|
ULONG ulContent = 0;
|
|
|
|
// polling bit, and No Write enable, and address
|
|
ulCommand = CAM_CONTENT_COUNT * ucIndex;
|
|
ulCommand = ulCommand | _CAM_POLL_ | _CAM_WE_;
|
|
// write content 0 is equall to mark invalid
|
|
RTL_W32(_CAM_W_, ulContent);
|
|
RTL_W32(_CAMCMD_, ulCommand);
|
|
}
|
|
#endif
|
|
|
|
|
|
static void CAM_empty_entry(struct rtl8192cd_priv *priv, unsigned char index)
|
|
{
|
|
unsigned long command = 0, content = 0;
|
|
unsigned int i;
|
|
|
|
for (i = 0; i < CAM_CONTENT_COUNT; i++) {
|
|
// polling bit, and No Write enable, and address
|
|
command = CAM_CONTENT_COUNT * index + i;
|
|
command = command | SECCAM_POLL | SECCAM_WE;
|
|
// write content 0 is equal to mark invalid
|
|
RTL_W32(CAMWRITE, content);
|
|
RTL_W32(CAMCMD, command);
|
|
}
|
|
}
|
|
|
|
|
|
int CamDeleteOneEntry(struct rtl8192cd_priv *priv, unsigned char *pMacAddr, unsigned long keyId, unsigned int useDK)
|
|
{
|
|
unsigned char ucIndex;
|
|
unsigned char ucTempMAC[6];
|
|
unsigned short usTempConfig = 0;
|
|
int for_begin = 4;
|
|
|
|
#ifdef CONFIG_WLAN_HAL
|
|
CAM_ENTRY_CFG CamEntryCfg;
|
|
#endif
|
|
|
|
// group key processing
|
|
if ((!memcmp(pMacAddr, "\xff\xff\xff\xff\xff\xff", 6)) || (useDK)) {
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
GET_HAL_INTERFACE(priv)->CAMReadMACConfigHandler(priv, keyId, ucTempMAC, &CamEntryCfg);
|
|
if ( _TRUE == CamEntryCfg.bValid ) {
|
|
GET_HAL_INTERFACE(priv)->CAMEmptyEntryHandler(priv, keyId);
|
|
|
|
if (priv->pshare->CamEntryOccupied == 1) {
|
|
SECURITY_CONFIG_OPERATION SCO = 0;
|
|
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_SECURITY_CONFIG, (pu1Byte)&SCO);
|
|
}
|
|
|
|
return 1;
|
|
} else {
|
|
return 0;
|
|
}
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{//not HAL
|
|
CAM_read_mac_config(priv, keyId, ucTempMAC, &usTempConfig);
|
|
if (usTempConfig & CFG_VALID) {
|
|
CAM_empty_entry(priv, keyId);
|
|
if (priv->pshare->CamEntryOccupied == 1)
|
|
RTL_W16(SECCFG, 0);
|
|
return 1;
|
|
} else
|
|
return 0;
|
|
}
|
|
}
|
|
#ifdef CONFIG_WLAN_HAL
|
|
// TODO: check 8881A desgin below
|
|
#endif //CONFIG_WLAN_HAL
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
for_begin = 3;
|
|
|
|
#ifdef MBSSID
|
|
if (GET_ROOT(priv)->pmib->miscEntry.vap_enable)
|
|
for_begin = 0;
|
|
#endif
|
|
#ifdef UNIVERSAL_REPEATER
|
|
if (IS_VXD_INTERFACE(priv)) {
|
|
for_begin = 0;
|
|
} else {
|
|
if (IS_ROOT_INTERFACE(priv)) {
|
|
if (IS_DRV_OPEN(GET_VXD_PRIV(priv)))
|
|
for_begin = 0;
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
// unicast key processing
|
|
// key processing for RTL818X(B) series
|
|
for (ucIndex = for_begin; ucIndex < TOTAL_CAM_ENTRY; ucIndex++) {
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
GET_HAL_INTERFACE(priv)->CAMReadMACConfigHandler(priv, ucIndex, ucTempMAC, &CamEntryCfg);
|
|
if (!memcmp(pMacAddr, ucTempMAC, 6)) {
|
|
#if defined(CONFIG_RTL_HW_WAPI_SUPPORT)
|
|
if ( (CamEntryCfg.EncAlgo == DOT11_ENC_WAPI) && (CamEntryCfg.KeyID != keyId)) {
|
|
continue;
|
|
}
|
|
#endif
|
|
|
|
GET_HAL_INTERFACE(priv)->CAMEmptyEntryHandler(priv, ucIndex);
|
|
|
|
if (priv->pshare->CamEntryOccupied == 1) {
|
|
SECURITY_CONFIG_OPERATION SCO = 0;
|
|
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_SECURITY_CONFIG, (pu1Byte)&SCO);
|
|
}
|
|
return 1;
|
|
}
|
|
} else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{//not HAL
|
|
CAM_read_mac_config(priv, ucIndex, ucTempMAC, &usTempConfig);
|
|
if (!memcmp(pMacAddr, ucTempMAC, 6)) {
|
|
|
|
#if defined(CONFIG_RTL_HW_WAPI_SUPPORT)
|
|
if ((((usTempConfig & 0x1c) >> 2) == DOT11_ENC_WAPI) && ((usTempConfig & 0x3) != keyId))
|
|
continue;
|
|
#endif
|
|
CAM_empty_entry(priv, ucIndex); // reset MAC address, david+2007-1-15
|
|
|
|
if (priv->pshare->CamEntryOccupied == 1)
|
|
RTL_W16(SECCFG, 0);
|
|
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*now use empty to fill in the first 4 entries*/
|
|
void CamResetAllEntry(struct rtl8192cd_priv *priv)
|
|
{
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv)) {
|
|
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_CAM_RESET_ALL_ENTRY, NULL);
|
|
} else if (CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
{
|
|
unsigned char index;
|
|
|
|
RTL_W32(CAMCMD, SECCAM_CLR);
|
|
|
|
for (index = 0; index < TOTAL_CAM_ENTRY; index++)
|
|
CAM_empty_entry(priv, index);
|
|
|
|
RTL_W32(CR, RTL_R32(CR) & (~MAC_SEC_EN));
|
|
}
|
|
priv->pshare->CamEntryOccupied = 0;
|
|
priv->pmib->dot11GroupKeysTable.keyInCam = 0;
|
|
|
|
// RTL_W32(CR, RTL_R32(CR) & (~MAC_SEC_EN));
|
|
}
|
|
|
|
|
|
void CAM_read_entry(struct rtl8192cd_priv *priv, unsigned char index, unsigned char* macad,
|
|
unsigned char* key128, unsigned short* config)
|
|
{
|
|
unsigned long target_command = 0, target_content = 0;
|
|
unsigned char entry_i = 0;
|
|
unsigned long status;
|
|
|
|
for (entry_i = 0; entry_i < CAM_CONTENT_USABLE_COUNT; entry_i++) {
|
|
// polling bit, and No Write enable, and address
|
|
target_command = (unsigned long)(entry_i + CAM_CONTENT_COUNT * index);
|
|
target_command = target_command | SECCAM_POLL;
|
|
|
|
RTL_W32(CAMCMD, target_command);
|
|
//Check polling bit is clear
|
|
while (1) {
|
|
status = RTL_R32(CAMCMD);
|
|
if (status & SECCAM_POLL)
|
|
continue;
|
|
else
|
|
break;
|
|
}
|
|
target_content = RTL_R32(CAMREAD);
|
|
|
|
if (entry_i == 0) {
|
|
//first 32-bit is MAC address and CFG field
|
|
*(config) = (unsigned short)((target_content) & 0x0000FFFF);
|
|
*(macad + 0) = (unsigned char)((target_content >> 16) & 0x000000FF);
|
|
*(macad + 1) = (unsigned char)((target_content >> 24) & 0x000000FF);
|
|
} else if (entry_i == 1) {
|
|
*(macad + 5) = (unsigned char)((target_content >> 24) & 0x000000FF);
|
|
*(macad + 4) = (unsigned char)((target_content >> 16) & 0x000000FF);
|
|
*(macad + 3) = (unsigned char)((target_content >> 8) & 0x000000FF);
|
|
*(macad + 2) = (unsigned char)((target_content) & 0x000000FF);
|
|
} else {
|
|
*(key128 + (entry_i * 4 - 8) + 3) = (unsigned char)((target_content >> 24) & 0x000000FF);
|
|
*(key128 + (entry_i * 4 - 8) + 2) = (unsigned char)((target_content >> 16) & 0x000000FF);
|
|
*(key128 + (entry_i * 4 - 8) + 1) = (unsigned char)((target_content >> 8) & 0x000000FF);
|
|
*(key128 + (entry_i * 4 - 8) + 0) = (unsigned char)(target_content & 0x000000FF);
|
|
}
|
|
|
|
target_content = 0;
|
|
}
|
|
}
|
|
|
|
|
|
#if 0
|
|
void debug_cam(UCHAR*TempOutputMac, UCHAR*TempOutputKey, USHORT TempOutputCfg)
|
|
{
|
|
printk("MAC Address\n");
|
|
printk(" %X %X %X %X %X %X\n", *TempOutputMac
|
|
, *(TempOutputMac + 1)
|
|
, *(TempOutputMac + 2)
|
|
, *(TempOutputMac + 3)
|
|
, *(TempOutputMac + 4)
|
|
, *(TempOutputMac + 5));
|
|
printk("Config:\n");
|
|
printk(" %X\n", TempOutputCfg);
|
|
|
|
printk("Key:\n");
|
|
printk("%X %X %X %X,%X %X %X %X,\n%X %X %X %X,%X %X %X %X\n"
|
|
, *TempOutputKey, *(TempOutputKey + 1), *(TempOutputKey + 2)
|
|
, *(TempOutputKey + 3), *(TempOutputKey + 4), *(TempOutputKey + 5)
|
|
, *(TempOutputKey + 6), *(TempOutputKey + 7), *(TempOutputKey + 8)
|
|
, *(TempOutputKey + 9), *(TempOutputKey + 10), *(TempOutputKey + 11)
|
|
, *(TempOutputKey + 12), *(TempOutputKey + 13), *(TempOutputKey + 14)
|
|
, *(TempOutputKey + 15));
|
|
}
|
|
|
|
|
|
void CamDumpAll(struct rtl8192cd_priv *priv)
|
|
{
|
|
UCHAR TempOutputMac[6];
|
|
UCHAR TempOutputKey[16];
|
|
USHORT TempOutputCfg = 0;
|
|
unsigned long flags;
|
|
int i;
|
|
|
|
SAVE_INT_AND_CLI(flags);
|
|
for (i = 0; i < TOTAL_CAM_ENTRY; i++) {
|
|
printk("%X-", i);
|
|
CAM_read_entry(priv, i, TempOutputMac, TempOutputKey, &TempOutputCfg);
|
|
debug_cam(TempOutputMac, TempOutputKey, TempOutputCfg);
|
|
printk("\n\n");
|
|
}
|
|
RESTORE_INT(flags);
|
|
}
|
|
|
|
|
|
void CamDump4(struct rtl8192cd_priv *priv)
|
|
{
|
|
UCHAR TempOutputMac[6];
|
|
UCHAR TempOutputKey[16];
|
|
USHORT TempOutputCfg = 0;
|
|
unsigned long flags;
|
|
int i;
|
|
|
|
SAVE_INT_AND_CLI(flags);
|
|
for (i = 0; i < 4; i++) {
|
|
printk("%X", i);
|
|
CAM_read_entry(priv, i, TempOutputMac, TempOutputKey, &TempOutputCfg);
|
|
debug_cam(TempOutputMac, TempOutputKey, TempOutputCfg);
|
|
printk("\n\n");
|
|
}
|
|
RESTORE_INT(flags);
|
|
}
|
|
#endif
|
|
|
|
#ifdef SDIO_AP_OFFLOAD
|
|
int offloadTestFunction(struct rtl8192cd_priv *priv, unsigned char *data)
|
|
{
|
|
int mode;
|
|
mode = _atoi(data, 16);
|
|
|
|
if (strlen(data) == 0) {
|
|
printk("Usage:\n");
|
|
printk("offload 6 - Leave offload\n");
|
|
return 0;
|
|
}
|
|
|
|
if (mode == 0x6) {
|
|
schedule_work(&GET_ROOT(priv)->ap_cmd_queue);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
#endif // SDIO_AP_OFFLOAD
|
|
|
|
#ifdef CONFIG_OFFLOAD_FUNCTION
|
|
int offloadTestFunction(struct rtl8192cd_priv *priv, unsigned char *data)
|
|
{
|
|
int mode = 0;
|
|
mode = _atoi(data, 16);
|
|
|
|
if (strlen(data) == 0) {
|
|
printk("offloadTest 0x1 downlaod Rsvd page\n");
|
|
printk("offloadTest 0x2: AP offload enable \n");
|
|
|
|
return 0;
|
|
}
|
|
|
|
if (mode == 0x0) {
|
|
u1Byte reg_val;
|
|
//clear the non-valid bit
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_REG_CCK_CHECK, (pu1Byte)®_val);
|
|
reg_val = reg_val & ~BIT(6);
|
|
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_REG_CCK_CHECK, (pu1Byte)®_val);
|
|
}
|
|
|
|
if (mode == 0x1) {
|
|
printk("epdn 6e: download probe rsp\n");
|
|
priv->offload_function_ctrl = 1;
|
|
//RTL_W16(0x100 , RTL_R16(0x100) | BIT(8)); // enable sw beacon
|
|
// tasklet_hi_schedule(&priv->pshare->rx_tasklet);
|
|
//RTL_W8(HWSEQ_CTRL,RTL_R8(HWSEQ_CTRL) | BIT(6)); // HW SEQ
|
|
|
|
u4Byte u4_val;
|
|
|
|
// enable sw beacon
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_REG_CR, (pu4Byte)&u4_val);
|
|
u4_val = u4_val | BIT(8);
|
|
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_REG_CR, (pu4Byte)&u4_val);
|
|
|
|
u1Byte u1_val;
|
|
|
|
#if (IS_RTL8192E_SERIES | IS_RTL8881A_SERIES)
|
|
// HW SEQ
|
|
GET_HAL_INTERFACE(priv)->GetHwRegHandler(priv, HW_VAR_HWSEQ_CTRL, (pu1Byte)&u1_val);
|
|
u1_val = u1_val | BIT(6);
|
|
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_HWSEQ_CTRL, (pu1Byte)&u1_val);
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
if (mode == 0x2) {
|
|
|
|
unsigned char loc_bcn[1];
|
|
unsigned char loc_probe[1];
|
|
|
|
loc_bcn[0] = priv->offload_bcn_page;
|
|
loc_probe[0] = priv->offload_proc_page;
|
|
|
|
printk("loc_bcn[0]= %x \n", loc_bcn[0]);
|
|
printk("loc_probe[0]= %x \n", loc_probe[0]);
|
|
|
|
GET_HAL_INTERFACE(priv)->SetAPOffloadHandler(priv, 1, 1, 0, 0, loc_bcn, loc_probe);
|
|
|
|
|
|
delay_ms(10);
|
|
}
|
|
|
|
if (mode == 0x3) {
|
|
GET_HAL_INTERFACE(priv)->SetMACIDSleepHandler(priv, 1 , 1);
|
|
}
|
|
|
|
if (mode == 0x4) {
|
|
GET_HAL_INTERFACE(priv)->SetMACIDSleepHandler(priv, 0 , 1);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
#endif //#ifdef CONFIG_OFFLOAD_FUNCTION
|
|
|
|
|
|
/*
|
|
*
|
|
* Power Saving related functions
|
|
*
|
|
*/
|
|
#ifdef PCIE_POWER_SAVING
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
extern u32 if_priv[];
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
|
|
void Sw_PCIE_Func2(int func)
|
|
{
|
|
#if (RTL_USED_PCIE_SLOT==1)
|
|
int reg = 0xb8b2100c;
|
|
#else
|
|
int reg = 0xb8b0100c;
|
|
#endif
|
|
|
|
REG32(reg) &= ~(1);
|
|
REG32(reg) |= func; // switch to function #
|
|
}
|
|
#endif
|
|
|
|
#if defined(__LINUX_2_6__)
|
|
extern void HostPCIe_SetPhyMdioWrite(unsigned int , unsigned int , unsigned short );
|
|
#endif
|
|
#ifdef ASPM_ENABLE
|
|
void ASPM_on_off(struct rtl8192cd_priv *priv) ;
|
|
#endif
|
|
|
|
#ifndef CONFIG_RTL_8198B
|
|
#define CLK_MANAGE 0xb8000010
|
|
#endif
|
|
#ifdef PCIE_POWER_SAVING_DEBUG
|
|
int PCIE_PowerDown(struct rtl8192cd_priv *priv, unsigned char *data)
|
|
{
|
|
// #define PCIE_PHY0 0xb8b01008
|
|
|
|
#define dprintf printk
|
|
int tmp, mode, portnum = 0;
|
|
unsigned int PCIE_PHY0, linkstatus;
|
|
unsigned int haddr, saddr;
|
|
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
haddr = CFG_92D_SLOTH;
|
|
saddr = CFG_92D_SLOTS;
|
|
} else {
|
|
haddr = CFG_92C_SLOTH;
|
|
saddr = CFG_92C_SLOTS;
|
|
}
|
|
|
|
PCIE_PHY0 = haddr + 0x1008;
|
|
linkstatus = haddr + 0x728;
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
Sw_PCIE_Func2(priv->pshare->wlandev_idx);
|
|
#endif
|
|
|
|
#if defined(CONFIG_RTL_92D_SUPPORT)
|
|
portnum = RTL_USED_PCIE_SLOT;
|
|
#endif
|
|
|
|
mode = _atoi(data, 16);
|
|
|
|
if (strlen(data) == 0) {
|
|
dprintf("epdn mode.\n");
|
|
dprintf("epdn 0: D0 ->L0 \n");
|
|
dprintf("epdn 3: D3hot ->L1 \n");
|
|
dprintf("epdn 4: board cast PME_TurnOff \n");
|
|
dprintf("epdn 7: enable aspm and L0 entry \n");
|
|
dprintf("epdn 8: enable aspm and L1 entry \n");
|
|
dprintf("epdn 9: diable aspm \n");
|
|
dprintf("epdn 5a: pcie reset \n");
|
|
dprintf("epdn 6a: L0 -> L2 \n");
|
|
dprintf("epdn 6b: L2 -> L0\n");
|
|
dprintf("epdn 6c: L0 -> L1 \n");
|
|
dprintf("epdn 6d: L1 -> L0\n");
|
|
dprintf("epdn 6e: download probe rsp\n");
|
|
dprintf("epdn a3: wake pin test\n");
|
|
dprintf("epdn b: bar\n");
|
|
dprintf("epdn b1: offload enable \n");
|
|
dprintf("epdn b2: offload disable\n");
|
|
dprintf("epdn c1: swith to 1T\n");
|
|
dprintf("epdn c2: switch to 2T\n");
|
|
dprintf("Link status=%x \n", REG32(linkstatus) & 0x1f );
|
|
return 0;
|
|
}
|
|
|
|
if (mode == 0) {
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
if (priv->pshare->wlandev_idx != 0) {
|
|
dprintf("not Root Interface!! \n");
|
|
return 0;
|
|
}
|
|
Sw_PCIE_Func2(0);
|
|
}
|
|
#endif
|
|
|
|
#ifdef SAVING_MORE_PWR
|
|
HostPCIe_SetPhyMdioWrite(portnum, 0xf, 0x0f0f);
|
|
#endif
|
|
tmp = REG32(0xb8b10044) & ( ~(3));
|
|
REG32(0xb8b10044) = tmp | (0); //D0
|
|
delay_ms(1);
|
|
REG32(0xb8b10044) = tmp | (0); //D0
|
|
dprintf("D0 \n");
|
|
priv->pwr_state = L0;
|
|
|
|
#if defined(CONFIG_RTL_92D_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
// if(priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY)
|
|
{
|
|
Sw_PCIE_Func2(1);
|
|
#ifdef SAVING_MORE_PWR
|
|
HostPCIe_SetPhyMdioWrite(portnum, 0xf, 0x0f0f);
|
|
#endif
|
|
tmp = REG32(0xb8b10044) & ( ~(3)); //D0
|
|
REG32(0xb8b10044) = tmp | (0); //D0
|
|
delay_ms(1);
|
|
REG32(0xb8b10044) = tmp | (0); //D0
|
|
dprintf("D0 wlan1\n");
|
|
((struct rtl8192cd_priv *)if_priv[1])->pwr_state = L0;
|
|
}
|
|
Sw_PCIE_Func2(0);
|
|
#endif
|
|
delay_ms(1);
|
|
}
|
|
#endif
|
|
|
|
}
|
|
|
|
if (mode == 3) {
|
|
|
|
#if defined(CONFIG_RTL_92D_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if (priv->pshare->wlandev_idx != 0) {
|
|
dprintf("not Root Interface!! \n");
|
|
return 0;
|
|
}
|
|
// if(priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY)
|
|
{
|
|
|
|
dprintf("DMDP, disable wlan1 !!\n");
|
|
Sw_PCIE_Func2(1);
|
|
#ifdef SAVING_MORE_PWR
|
|
REG32(0xb8b10080) |= (0x100); //enable clock PM
|
|
#endif
|
|
tmp = REG32(0xb8b10044) & ( ~(3));
|
|
REG32(0xb8b10044) = tmp | (3); //D3
|
|
|
|
((struct rtl8192cd_priv *)if_priv[1])->pwr_state = L1;
|
|
#ifdef SAVING_MORE_PWR
|
|
HostPCIe_SetPhyMdioWrite(portnum, 0xf, 0x0708);
|
|
#endif
|
|
}
|
|
Sw_PCIE_Func2(0);
|
|
#endif
|
|
delay_ms(1);
|
|
|
|
}
|
|
#endif
|
|
|
|
#ifdef SAVING_MORE_PWR
|
|
REG32(0xb8b10080) |= (0x100); //enable clock PM
|
|
#endif
|
|
tmp = REG32(0xb8b10044) & ( ~(3));
|
|
REG32(0xb8b10044) = tmp | (3); //D3
|
|
//HostPCIe_SetPhyMdioWrite(0xd, 0x15a6);
|
|
dprintf("D3 hot \n");
|
|
priv->pwr_state = L1;
|
|
#ifdef SAVING_MORE_PWR
|
|
HostPCIe_SetPhyMdioWrite(portnum, 0xf, 0x0708);
|
|
#endif
|
|
}
|
|
|
|
if (mode == 4) {
|
|
|
|
RTL_W8(0x1c, 0xe1); // reg lock, dis_prst
|
|
RTL_W8(0x1c, 0xe1);
|
|
|
|
#ifdef SAVING_MORE_PWR
|
|
HostPCIe_SetPhyMdioWrite(portnum, 0xf, 0x0f0f);
|
|
#endif
|
|
|
|
REG32(0xb8b01008) |= (0x200);
|
|
dprintf("Host boardcase PME_TurnOff \n");
|
|
priv->pwr_state = L2;
|
|
}
|
|
|
|
|
|
if (mode == 0xd) {
|
|
|
|
RTL_W8(0x1c, 0x0);
|
|
priv->pshare->phw->cur_rx = 0;
|
|
#ifdef DELAY_REFILL_RX_BUF
|
|
priv->pshare->phw->cur_rx_refill = 0;
|
|
#endif
|
|
memset(&(priv->pshare->phw->txhead0), 0, sizeof(int) * 12);
|
|
|
|
RTL_W8(SPS0_CTRL, 0x2b);
|
|
RTL_W32(BCNQ_DESA, priv->pshare->phw->tx_ringB_addr);
|
|
RTL_W32(MGQ_DESA, priv->pshare->phw->tx_ring0_addr);
|
|
RTL_W32(VOQ_DESA, priv->pshare->phw->tx_ring4_addr);
|
|
RTL_W32(VIQ_DESA, priv->pshare->phw->tx_ring3_addr);
|
|
RTL_W32(BEQ_DESA, priv->pshare->phw->tx_ring2_addr);
|
|
RTL_W32(BKQ_DESA, priv->pshare->phw->tx_ring1_addr);
|
|
RTL_W32(HQ_DESA, priv->pshare->phw->tx_ring5_addr);
|
|
RTL_W32(RX_DESA, priv->pshare->phw->ring_dma_addr);
|
|
|
|
}
|
|
|
|
if (mode == 7) {
|
|
REG32(0xb8b1070c) &= ~ ((0x7 << 27) | (0x7 << 24));
|
|
REG32(0xb8b1070c) |= ((3) << 27) | ((1) << 24); //L1=8us, L0s=2us
|
|
|
|
REG32(0xb8b00080) &= ~(0x3);
|
|
REG32(0xb8b10080) &= ~(0x3);
|
|
|
|
REG32(0xb8b00080) |= 1; //L0s
|
|
REG32(0xb8b10080) |= 1;
|
|
priv->pwr_state = ASPM_L0s_L1;
|
|
}
|
|
|
|
if (mode == 8) {
|
|
REG32(0xb8b1070c) &= ~ ((0x7 << 27) | (0x7 << 24));
|
|
REG32(0xb8b1070c) |= ((1) << 27) | ((3) << 24); //L1=2us, L0s=4us
|
|
|
|
REG32(0xb8b00080) &= ~(0x3);
|
|
REG32(0xb8b10080) &= ~(0x3);
|
|
|
|
REG32(0xb8b00080) |= 3; //L1
|
|
REG32(0xb8b10080) |= 3; //L1
|
|
priv->pwr_state = ASPM_L0s_L1;
|
|
|
|
}
|
|
|
|
if (mode == 9) {
|
|
REG32(0xb8b00080) &= ~(0x3);
|
|
REG32(0xb8b10080) &= ~(0x3);
|
|
priv->pwr_state = L0;
|
|
}
|
|
|
|
|
|
if (mode == 0x6a) {
|
|
priv->ps_ctrl = 1 | 32 | 0x80;
|
|
mod_timer(&priv->ps_timer, jiffies + RTL_MILISECONDS_TO_JIFFIES(100));
|
|
}
|
|
|
|
if (mode == 0x6c) {
|
|
priv->ps_ctrl = 1 | 16 | 0x80;
|
|
// mod_timer(&priv->ps_timer, jiffies + RTL_MILISECONDS_TO_JIFFIES(100));
|
|
PCIe_power_save_tasklet((unsigned long)priv);
|
|
}
|
|
|
|
if ((mode == 0x6b) || (mode == 0x6d)) {
|
|
priv->ps_ctrl = 0x82 | (priv->pwr_state << 4);
|
|
priv->pshare->rf_ft_var.power_save &= 0xf0;
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
((struct rtl8192cd_priv *)if_priv[1])->pshare->rf_ft_var.power_save &= 0xf0;
|
|
#endif
|
|
PCIe_power_save_tasklet((unsigned long)priv);
|
|
signin_h2c_cmd(priv, _AP_OFFLOAD_CMD_ , 0 );
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
signin_h2c_cmd(((struct rtl8192cd_priv *)if_priv[1]), _AP_OFFLOAD_CMD_ , 0 );
|
|
#endif
|
|
}
|
|
|
|
if (mode == 0x6e) {
|
|
priv->offload_ctrl = 1;
|
|
RTL_W16(0x100 , RTL_R16(0x100) | BIT(8)); // enable sw beacon
|
|
tasklet_hi_schedule(&priv->pshare->rx_tasklet);
|
|
}
|
|
|
|
if (mode == 0xc1) {
|
|
// PHY_ConfigBBWithParaFile(priv, PATHB_OFF);
|
|
switch_to_1x1(priv, PWR_STATE_IN);
|
|
|
|
}
|
|
|
|
if (mode == 0xc2) {
|
|
// PHY_ConfigBBWithParaFile(priv, PATHB_ON);
|
|
switch_to_1x1(priv, PWR_STATE_OUT);
|
|
}
|
|
|
|
if (mode == 0xb) {
|
|
REG32(0xb8b00004) = 0x00100007;
|
|
REG32(0xb8b10004) = 0x00100007;
|
|
REG32(0xb8b10010) = 0x18c00001;
|
|
REG32(0xb8b10018) = 0x19000004;
|
|
printk("b1-00=%x, b0-04=%x, b1-04=%x, b1-10=%x, b1-18=%x\n", REG32(0xb8b10000),
|
|
REG32(0xb8b00004), REG32(0xb8b10004), REG32(0xb8b10010), REG32(0xb8b10018) );
|
|
}
|
|
|
|
if (mode == 0xb1) {
|
|
unsigned int cmd = _AP_OFFLOAD_CMD_ | (1 << 8) | (HIDDEN_AP << 16) | ((GET_MIB(priv))->dot11OperationEntry.deny_any) << 24;
|
|
int page = ((priv->offload_ctrl) >> 7) & 0xff;
|
|
int cmd2 = 0, cmd2e = 0;
|
|
|
|
if (!page) {
|
|
page = 2;
|
|
}
|
|
|
|
if (GET_CHIP_VER(priv) != VERSION_8192D) {
|
|
cmd2 = (_RSVDPAGE_CMD_ | page << 8) ;
|
|
} else {
|
|
cmd2 = ( _RSVDPAGE_CMD_ | BIT(7) | (page << 8));
|
|
cmd2e = (page << 8) | (page) ;
|
|
}
|
|
|
|
// RTL_W16(PCIE_CTRL_REG, 0xff00 );
|
|
REG32(saddr + 0x44) |= 0x8108;
|
|
|
|
printk("cmd: %x %x\n", cmd2, cmd2e);
|
|
signin_h2c_cmd(priv, cmd2, cmd2e);
|
|
delay_ms(10);
|
|
signin_h2c_cmd(priv, cmd, 0 );
|
|
printk("sign in h2c cmd:%x, 0x284=%x\n", cmd, RTL_R32(0x284));
|
|
|
|
#if defined(CONFIG_RTL_8198) || defined(CONFIG_RTL_819XD) || defined(CONFIG_RTL_8196E)
|
|
REG32(0xb8003000) |= BIT(16); // GIMR
|
|
#else
|
|
REG32(0xb8003000) |= BIT(9); // GIMR
|
|
#endif
|
|
|
|
delay_ms(10);
|
|
}
|
|
|
|
if (mode == 0xb2) {
|
|
signin_h2c_cmd(priv, 0x0000, 0); // offload disable
|
|
RTL_W8(0x423, 0x0); // mac seq disable
|
|
RTL_W8(0x286, 0); // RW_RELEASE_ENABLE
|
|
RTL_W16(PCIE_CTRL_REG, 0x00ff );
|
|
}
|
|
|
|
//static unsigned int Buffer[9];
|
|
|
|
if (mode == 0xa3) {
|
|
unsigned char tmp;
|
|
#ifdef RTL8676_WAKE_GPIO
|
|
int gpio_num, irq_num;
|
|
|
|
get_wifi_wake_pin(&gpio_num);
|
|
irq_num = gpioGetBspIRQNum(gpio_num);
|
|
|
|
gpioConfig(gpio_num, GPIO_FUNC_INPUT);
|
|
gpioSetIMR(gpio_num, EN_FALL_EDGE_ISR); // enable interrupt in falling-edge
|
|
REG32(BSP_GIMR) |= BIT(irq_num);
|
|
|
|
#else
|
|
|
|
#if defined(CONFIG_RTL_8198) || defined(CONFIG_RTL_819XD) || defined(CONFIG_RTL_8196E)
|
|
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
REG32(0xb8000044) |= BIT(16) | BIT(17); //LEDPHASE1
|
|
REG32(0xb8003500) &= ~(BIT(17)); //PABCD_CNR , gpio pin
|
|
REG32(0xb8003508) &= ~(BIT(17)); //PABCD_DIR
|
|
REG32(0xb8003518) &= (~(0x03 << 2));
|
|
REG32(0xb8003518) |= (0x01 << 2); // PCD_IMR
|
|
} else {
|
|
REG32(0xb8000044) |= BIT(24); //LEDPHASE4
|
|
REG32(0xb8003500) &= ~(BIT(20)); //PABCD_CNR , gpio pin
|
|
REG32(0xb8003508) &= ~(BIT(20)); //PABCD_DIR
|
|
REG32(0xb8003518) &= (~(0x03 << 8));
|
|
REG32(0xb8003518) |= (0x01 << 8); // PCD_IMR
|
|
}
|
|
|
|
REG32(0xb8003000) |= BIT(16); // GIMR
|
|
#else
|
|
REG32(0xb8000040) |= 0x0c00; //LEDPHASE1 :GPIOB7
|
|
REG32(0xb8003500) &= ~(BIT(15));; //PABCD_CNR , gpio pin
|
|
REG32(0xb8003508) &= ~(BIT(15)); //PABCD_DIR
|
|
REG32(0xb8003514) &= (~(0x03 << 30));
|
|
REG32(0xb8003514) |= (0x01 << 30); // PAB_IMR // enable interrupt in falling-edge
|
|
REG32(0xb8003000) |= BIT(9); // GIMR
|
|
#endif
|
|
|
|
#endif
|
|
// clear wake pin status
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
Sw_PCIE_Func2(priv->pshare->wlandev_idx);
|
|
#endif
|
|
|
|
REG32(saddr + 0x44) = 0x8108;
|
|
tmp = RTL_R8(0x690);
|
|
if (tmp & 1) {
|
|
tmp ^= 0x1;
|
|
RTL_W8(0x690, tmp);
|
|
}
|
|
dprintf("0xb8b10044=%x,690=%x,3000=%x, 3514=%x\n", REG32(saddr + 0x44), RTL_R8(0x690), REG32(0xb8003000), REG32(0xb8003514) );
|
|
RTL_W8(0x690, tmp | 0x1 );
|
|
dprintf("0xb8b10044=%x,690=%x\n", REG32(saddr + 0x44), RTL_R8(0x690) );
|
|
}
|
|
|
|
if (mode == 0x5a)
|
|
PCIE_reset_procedure3(priv);
|
|
|
|
//-------------------------------------------------------------
|
|
if (mode == 0x010) { //L0->L1->L0
|
|
tmp = REG32(0xb8b10044) & ( ~(3)); //D0
|
|
REG32(0xb8b10044) = tmp | (3); //D3
|
|
REG32(0xb8b10044) = tmp | (0); //D0, wakeup
|
|
|
|
while (1) {
|
|
if ((REG32(linkstatus) & 0x1f) == 0x11) //wait to L0
|
|
break;
|
|
}
|
|
|
|
dprintf("DID/VID=%x\n", REG32(0xb8b10000));
|
|
}
|
|
//-------------------------------------------------------------
|
|
if (mode == 0x020) { //L0->L2->L0
|
|
tmp = REG32(0xb8b10044) & ( ~(3)); //D0
|
|
|
|
REG32(0xb8b10044) = tmp | (3); //D3
|
|
delay_ms(100);
|
|
|
|
REG32(0xb8b01008) |= (0x200);
|
|
delay_ms(100);
|
|
|
|
//wakeup
|
|
REG32(CLK_MANAGE) &= ~(1 << 12); //perst=0 off.
|
|
//dprintf("CLK_MANAGE=%x \n", REG32(CLK_MANAGE));
|
|
delay_ms(100);
|
|
delay_ms(100);
|
|
delay_ms(100);
|
|
|
|
REG32(CLK_MANAGE) |= (1 << 12); //PERST=1
|
|
//prom_printf("\nCLK_MANAGE(0x%x)=0x%x\n\n",CLK_MANAGE,READ_MEM32(CLK_MANAGE));
|
|
|
|
//4. PCIE PHY Reset
|
|
REG32(PCIE_PHY0) = 0x01; //bit7 PHY reset=0 bit0 Enable LTSSM=1
|
|
REG32(PCIE_PHY0) = 0x81; //bit7 PHY reset=1 bit0 Enable LTSSM=1
|
|
|
|
while (1) {
|
|
if ( (REG32(linkstatus) & 0x1f) == 0x11)
|
|
break;
|
|
}
|
|
|
|
dprintf("DID/VID=%x\n", REG32(0xb8b10000));
|
|
}
|
|
|
|
dprintf("Link status=%x\n", READ_MEM32(linkstatus) & 0x1f/*, READ_MEM32(linkstatus), REG32(linkstatus)*/ );
|
|
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
|
|
void switch_to_1x1(struct rtl8192cd_priv *priv, int mode)
|
|
{
|
|
|
|
if (mode == PWR_STATE_IN) {
|
|
|
|
priv->pshare->rf_phy_bb_backup[21] = RTL_R32(0x88c);
|
|
|
|
priv->pshare->rf_phy_bb_backup[0] = RTL_R32(0x844);
|
|
priv->pshare->rf_phy_bb_backup[1] = RTL_R32(0x85c);
|
|
priv->pshare->rf_phy_bb_backup[2] = RTL_R32(0xe6c);
|
|
|
|
priv->pshare->rf_phy_bb_backup[3] = RTL_R32(0xe70);
|
|
priv->pshare->rf_phy_bb_backup[4] = RTL_R32(0xe74);
|
|
priv->pshare->rf_phy_bb_backup[5] = RTL_R32(0xe78);
|
|
priv->pshare->rf_phy_bb_backup[6] = RTL_R32(0xe7c);
|
|
|
|
priv->pshare->rf_phy_bb_backup[7] = RTL_R32(0xe80);
|
|
priv->pshare->rf_phy_bb_backup[8] = RTL_R32(0xe84);
|
|
priv->pshare->rf_phy_bb_backup[9] = RTL_R32(0xe88);
|
|
priv->pshare->rf_phy_bb_backup[10] = RTL_R32(0xe8c);
|
|
|
|
priv->pshare->rf_phy_bb_backup[11] = RTL_R32(0xed0);
|
|
priv->pshare->rf_phy_bb_backup[12] = RTL_R32(0xed4);
|
|
priv->pshare->rf_phy_bb_backup[13] = RTL_R32(0xed8);
|
|
priv->pshare->rf_phy_bb_backup[14] = RTL_R32(0xedc);
|
|
|
|
priv->pshare->rf_phy_bb_backup[15] = RTL_R32(0xee0);
|
|
priv->pshare->rf_phy_bb_backup[16] = RTL_R32(0xeec);
|
|
|
|
priv->pshare->rf_phy_bb_backup[17] = RTL_R32(0xc04);
|
|
priv->pshare->rf_phy_bb_backup[18] = RTL_R32(0xd04);
|
|
priv->pshare->rf_phy_bb_backup[19] = RTL_R32(0x90c);
|
|
priv->pshare->rf_phy_bb_backup[20] = RTL_R32(0x804);
|
|
priv->pshare->rf_phy_bb_backup[22] = RTL_R32(0xa04);
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192D)) {
|
|
unsigned int mask = 0xB4FFFFFF, path = 0x11;
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_2G) {
|
|
mask = 0xDB3FFFFF;
|
|
path = 0x22;
|
|
RTL_W8(0xa07, 0x45);
|
|
}
|
|
PHY_SetBBReg(priv, 0x85c, bMaskDWord, priv->pshare->rf_phy_bb_backup[1] & mask);
|
|
PHY_SetBBReg(priv, 0xe6c, bMaskDWord, priv->pshare->rf_phy_bb_backup[2] & mask);
|
|
|
|
PHY_SetBBReg(priv, 0xe70, bMaskDWord, priv->pshare->rf_phy_bb_backup[3] & mask);
|
|
PHY_SetBBReg(priv, 0xe74, bMaskDWord, priv->pshare->rf_phy_bb_backup[4] & mask);
|
|
PHY_SetBBReg(priv, 0xe78, bMaskDWord, priv->pshare->rf_phy_bb_backup[5] & mask);
|
|
PHY_SetBBReg(priv, 0xe7c, bMaskDWord, priv->pshare->rf_phy_bb_backup[6] & mask);
|
|
|
|
PHY_SetBBReg(priv, 0xe80, bMaskDWord, priv->pshare->rf_phy_bb_backup[7] & mask);
|
|
PHY_SetBBReg(priv, 0xe84, bMaskDWord, priv->pshare->rf_phy_bb_backup[8] & mask);
|
|
PHY_SetBBReg(priv, 0xe88, bMaskDWord, priv->pshare->rf_phy_bb_backup[9] & mask);
|
|
PHY_SetBBReg(priv, 0xe8c, bMaskDWord, priv->pshare->rf_phy_bb_backup[10] & mask);
|
|
|
|
PHY_SetBBReg(priv, 0xed0, bMaskDWord, priv->pshare->rf_phy_bb_backup[11] & mask);
|
|
PHY_SetBBReg(priv, 0xed4, bMaskDWord, priv->pshare->rf_phy_bb_backup[12] & mask);
|
|
PHY_SetBBReg(priv, 0xed8, bMaskDWord, priv->pshare->rf_phy_bb_backup[13] & mask);
|
|
PHY_SetBBReg(priv, 0xedc, bMaskDWord, priv->pshare->rf_phy_bb_backup[14] & mask);
|
|
|
|
PHY_SetBBReg(priv, 0xee0, bMaskDWord, priv->pshare->rf_phy_bb_backup[15] & mask);
|
|
PHY_SetBBReg(priv, 0xeec, bMaskDWord, priv->pshare->rf_phy_bb_backup[16] & mask);
|
|
|
|
PHY_SetBBReg(priv, 0xc04, 0x000000ff, path);
|
|
PHY_SetBBReg(priv, 0xd04, 0x0000000f, path & 0x01);
|
|
PHY_SetBBReg(priv, 0x90c, 0x000000ff, path);
|
|
PHY_SetBBReg(priv, 0x90c, 0x0ff00000, path);
|
|
|
|
} else
|
|
#endif
|
|
{
|
|
PHY_SetBBReg(priv, 0x88c, 0x00c00000 , 0x3);
|
|
|
|
#if 1
|
|
// standby
|
|
PHY_SetBBReg(priv, 0x844, bMaskDWord, 0x00010000);
|
|
#else
|
|
// power off
|
|
PHY_SetBBReg(priv, 0x844, bMaskDWord, 0x00000000);
|
|
#endif
|
|
|
|
PHY_SetBBReg(priv, 0x85c, bMaskDWord, 0x00db25a4);
|
|
PHY_SetBBReg(priv, 0xe6c, bMaskDWord, 0x20db25a4);
|
|
|
|
PHY_SetBBReg(priv, 0xe70, bMaskDWord, 0x20db25a4);
|
|
PHY_SetBBReg(priv, 0xe74, bMaskDWord, 0x041b25a4);
|
|
PHY_SetBBReg(priv, 0xe78, bMaskDWord, 0x041b25a4);
|
|
PHY_SetBBReg(priv, 0xe7c, bMaskDWord, 0x041b25a4);
|
|
|
|
PHY_SetBBReg(priv, 0xe80, bMaskDWord, 0x041b25a4);
|
|
PHY_SetBBReg(priv, 0xe84, bMaskDWord, 0x63db25a4);
|
|
PHY_SetBBReg(priv, 0xe88, bMaskDWord, 0x041b25a4);
|
|
PHY_SetBBReg(priv, 0xe8c, bMaskDWord, 0x20db25a4);
|
|
|
|
PHY_SetBBReg(priv, 0xed0, bMaskDWord, 0x20db25a4);
|
|
PHY_SetBBReg(priv, 0xed4, bMaskDWord, 0x20db25a4);
|
|
PHY_SetBBReg(priv, 0xed8, bMaskDWord, 0x20db25a4);
|
|
PHY_SetBBReg(priv, 0xedc, bMaskDWord, 0x001b25a4);
|
|
|
|
PHY_SetBBReg(priv, 0xee0, bMaskDWord, 0x001b25a4);
|
|
PHY_SetBBReg(priv, 0xeec, bMaskDWord, 0x24db25a4);
|
|
|
|
PHY_SetBBReg(priv, 0xc04, 0x000000ff , 0x11);
|
|
PHY_SetBBReg(priv, 0xd04, 0x0000000f , 0x1);
|
|
PHY_SetBBReg(priv, 0x90c, 0x000000ff , 0x11);
|
|
PHY_SetBBReg(priv, 0x90c, 0x0ff00000 , 0x11);
|
|
|
|
PHY_SetBBReg(priv, 0x804, 0x000000f , 0x1);
|
|
}
|
|
} else if (mode == PWR_STATE_OUT) {
|
|
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192C) {
|
|
PHY_SetBBReg(priv, 0x88c, bMaskDWord, priv->pshare->rf_phy_bb_backup[21]);
|
|
PHY_SetBBReg(priv, 0x844, bMaskDWord, priv->pshare->rf_phy_bb_backup[0]);
|
|
}
|
|
#endif
|
|
PHY_SetBBReg(priv, 0x85c, bMaskDWord, priv->pshare->rf_phy_bb_backup[1]);
|
|
PHY_SetBBReg(priv, 0xe6c, bMaskDWord, priv->pshare->rf_phy_bb_backup[2]);
|
|
|
|
PHY_SetBBReg(priv, 0xe70, bMaskDWord, priv->pshare->rf_phy_bb_backup[3]);
|
|
PHY_SetBBReg(priv, 0xe74, bMaskDWord, priv->pshare->rf_phy_bb_backup[4]);
|
|
PHY_SetBBReg(priv, 0xe78, bMaskDWord, priv->pshare->rf_phy_bb_backup[5]);
|
|
PHY_SetBBReg(priv, 0xe7c, bMaskDWord, priv->pshare->rf_phy_bb_backup[6]);
|
|
|
|
PHY_SetBBReg(priv, 0xe80, bMaskDWord, priv->pshare->rf_phy_bb_backup[7]);
|
|
PHY_SetBBReg(priv, 0xe84, bMaskDWord, priv->pshare->rf_phy_bb_backup[8]);
|
|
PHY_SetBBReg(priv, 0xe88, bMaskDWord, priv->pshare->rf_phy_bb_backup[9]);
|
|
PHY_SetBBReg(priv, 0xe8c, bMaskDWord, priv->pshare->rf_phy_bb_backup[10]);
|
|
|
|
PHY_SetBBReg(priv, 0xed0, bMaskDWord, priv->pshare->rf_phy_bb_backup[11]);
|
|
PHY_SetBBReg(priv, 0xed4, bMaskDWord, priv->pshare->rf_phy_bb_backup[12]);
|
|
PHY_SetBBReg(priv, 0xed8, bMaskDWord, priv->pshare->rf_phy_bb_backup[13]);
|
|
PHY_SetBBReg(priv, 0xedc, bMaskDWord, priv->pshare->rf_phy_bb_backup[14]);
|
|
|
|
PHY_SetBBReg(priv, 0xee0, bMaskDWord, priv->pshare->rf_phy_bb_backup[15]);
|
|
PHY_SetBBReg(priv, 0xeec, bMaskDWord, priv->pshare->rf_phy_bb_backup[16]);
|
|
|
|
PHY_SetBBReg(priv, 0xc04, bMaskDWord , priv->pshare->rf_phy_bb_backup[17]);
|
|
PHY_SetBBReg(priv, 0xd04, bMaskDWord , priv->pshare->rf_phy_bb_backup[18]);
|
|
PHY_SetBBReg(priv, 0x90c, bMaskDWord , priv->pshare->rf_phy_bb_backup[19]);
|
|
PHY_SetBBReg(priv, 0xa04, bMaskDWord , priv->pshare->rf_phy_bb_backup[22]);
|
|
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192C)
|
|
PHY_SetBBReg(priv, 0x804, bMaskDWord , priv->pshare->rf_phy_bb_backup[20]);
|
|
#endif
|
|
}
|
|
}
|
|
|
|
#ifdef __LINUX_2_6__
|
|
irqreturn_t gpio_wakeup_isr(int irq, void *dev_instance);
|
|
#else
|
|
void gpio_wakeup_isr(int irq, void *dev_instance, struct pt_regs *regs);
|
|
#endif
|
|
|
|
//const unsigned int CLK_MANAGE = 0xb8000010;
|
|
//const unsigned int SYS_PCIE_PHY0 =(0xb8000000 +0x50);
|
|
void PCIE_reset_procedure3(struct rtl8192cd_priv *priv)
|
|
|
|
{
|
|
|
|
//PCIE Register
|
|
unsigned int PCIE_PHY0_REG, PCIE_PHY0, linkstatus, haddr;
|
|
int status = 0, counter = 0;
|
|
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D)
|
|
haddr = CFG_92D_SLOTH;
|
|
else
|
|
haddr = CFG_92C_SLOTH;
|
|
|
|
PCIE_PHY0_REG = haddr + 0x1000;
|
|
PCIE_PHY0 = haddr + 0x1008;
|
|
linkstatus = haddr + 0x728;
|
|
|
|
|
|
#if 0
|
|
REG32(CLK_MANAGE) &= ~(1 << 12); //perst=0 off.
|
|
//dprintf("CLK_MANAGE=%x \n", REG32(CLK_MANAGE));
|
|
delay_ms(3);
|
|
delay_ms(3);
|
|
|
|
REG32(CLK_MANAGE) |= (1 << 12); //PERST=1
|
|
//prom_printf("\nCLK_MANAGE(0x%x)=0x%x\n\n",CLK_MANAGE,READ_MEM32(CLK_MANAGE));
|
|
|
|
//4. PCIE PHY Reset
|
|
REG32(PCIE_PHY0) = 0x01; //bit7 PHY reset=0 bit0 Enable LTSSM=1
|
|
REG32(PCIE_PHY0) = 0x81; //bit7 PHY reset=1 bit0
|
|
//
|
|
delay_ms(3);
|
|
|
|
#else
|
|
do {
|
|
//2.Active LX & PCIE Clock
|
|
REG32(CLK_MANAGE) &= (~(1 << 11)); //enable active_pcie0
|
|
delay_ms(2);
|
|
|
|
//4. PCIE PHY Reset
|
|
REG32(PCIE_PHY0) = 0x1; //bit7 PHY reset=0 bit0 Enable LTSSM=1
|
|
delay_ms(2);
|
|
|
|
REG32(CLK_MANAGE) &= ~(1 << 12); //perst=0 off.
|
|
delay_ms(5);
|
|
|
|
REG32(PCIE_PHY0) = 0x81; //bit7 PHY reset=1 bit0 Enable LTSSM=1
|
|
delay_ms(5);
|
|
|
|
REG32(CLK_MANAGE) |= (1 << 11); //enable active_pcie0
|
|
|
|
//---------------------------------------
|
|
// 6. PCIE Device Reset
|
|
|
|
delay_ms(5);
|
|
REG32(CLK_MANAGE) |= (1 << 12); //PERST=1
|
|
delay_ms(5);
|
|
status = REG32(linkstatus) & 0x1f;
|
|
|
|
if ( status == 0x11 ) {
|
|
break;
|
|
} else {
|
|
delay_ms(100);
|
|
// printk("status=%x\n", status);
|
|
if ( ++counter > 1000) {
|
|
// panic_printk("PCIe reset fail!!!!\n");
|
|
break;
|
|
}
|
|
}
|
|
} while (1);
|
|
|
|
|
|
|
|
#endif
|
|
|
|
// printk("PCIE_reset_procedure3\t devid=%x\n",REG32(0xb8b10000));
|
|
|
|
}
|
|
|
|
#ifdef ASPM_ENABLE
|
|
void ASPM_on_off(struct rtl8192cd_priv *priv)
|
|
{
|
|
#ifndef SMP_SYNC
|
|
unsigned long flags;
|
|
#endif
|
|
SAVE_INT_AND_CLI(flags);
|
|
unsigned int haddr, saddr;
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
haddr = CFG_92D_SLOTH;
|
|
saddr = CFG_92D_SLOTS;
|
|
} else {
|
|
haddr = CFG_92C_SLOTH;
|
|
saddr = CFG_92C_SLOTS;
|
|
}
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
Sw_PCIE_Func2(priv->pshare->wlandev_idx);
|
|
#endif
|
|
|
|
if (priv->pshare->rf_ft_var.power_save & ASPM_en) {
|
|
if (priv->pwr_state == L0) {
|
|
|
|
REG32(haddr + 0x70c) &= ~ ((0x7 << 27) | (0x7 << 24));
|
|
REG32(haddr + 0x70c) |= ((3) << 27) | ((1) << 24); //L1=8us, L0s=2us
|
|
|
|
REG32(haddr + 0x80) &= ~(0x3);
|
|
REG32(saddr + 0x80) &= ~(0x3);
|
|
REG32(haddr + 0x80) |= 1; //L0s
|
|
REG32(saddr + 0x80) |= 1;
|
|
|
|
priv->pwr_state = ASPM_L0s_L1;
|
|
}
|
|
} else if (priv->pwr_state == ASPM_L0s_L1) {
|
|
REG32(haddr + 0x80) &= ~(0x3);
|
|
REG32(saddr + 0x80) &= ~(0x3);
|
|
priv->pwr_state = L0;
|
|
}
|
|
|
|
RESTORE_INT(flags);
|
|
}
|
|
#endif
|
|
|
|
#ifdef GPIO_WAKEPIN
|
|
int request_irq_for_wakeup_pin(struct net_device *dev)
|
|
{
|
|
struct rtl8192cd_priv *priv = GET_DEV_PRIV(dev);
|
|
unsigned int saddr;
|
|
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D)
|
|
saddr = CFG_92D_SLOTS;
|
|
else
|
|
saddr = CFG_92C_SLOTS;
|
|
|
|
#if defined(CONFIG_RTL_819XD) || defined(CONFIG_RTL_8196E)
|
|
|
|
#if defined(CONFIG_RTL_ULINKER)
|
|
{
|
|
// GPIO B5, b8000044 [10:9] = 2'b 11
|
|
REG32(0xb8000044) = (REG32(0xb8000044) & ~0x600) | 0x600; //LEDPHASE1
|
|
REG32(0xb8003500) &= ~(BIT(13)); //PABCD_CNR , gpio pin
|
|
REG32(0xb8003508) &= ~(BIT(13)); //PABCD_DIR
|
|
REG32(0xb8003514) &= (~(0x03 << 26));
|
|
REG32(0xb8003514) |= (0x01 << 26); // enable interrupt in falling-edge
|
|
REG32(PABCD_ISR) = BIT(13) ; // clear int status
|
|
}
|
|
#else
|
|
|
|
#if defined(CONFIG_RTL_92D_SUPPORT) && defined(CONFIG_RTL_8197D)
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
// GPIO B7, b8000044 [17:15] =3'b 100
|
|
REG32(0xb8000044) = (REG32(0xb8000044) & ~0x00038000) | BIT(17); //LEDPHASE1
|
|
REG32(0xb8003500) &= ~(BIT(15)); //PABCD_CNR , gpio pin
|
|
REG32(0xb8003508) &= ~(BIT(15)); //PABCD_DIR
|
|
REG32(0xb8003514) &= (~(0x03 << 30));
|
|
REG32(0xb8003514) |= (0x01 << 30); // enable interrupt in falling-edge
|
|
REG32(PABCD_ISR) = BIT(15) ; // clear int status
|
|
|
|
} else
|
|
#endif
|
|
{
|
|
// GPIO A4, b8000040 [2:0] = 3'b 110
|
|
REG32(0xb8000040) = (REG32(0xb8000040) & ~0x7) | 0x6; //JTAG_TMS
|
|
REG32(0xb8003500) &= ~(BIT(4)); //PABCD_CNR , gpio pin
|
|
REG32(0xb8003508) &= ~(BIT(4)); //PABCD_DIR
|
|
REG32(0xb8003514) &= (~(0x03 << 8));
|
|
REG32(0xb8003514) |= (0x01 << 8); // enable interrupt in falling-edge
|
|
REG32(PABCD_ISR) = BIT(4) ; // clear int status
|
|
}
|
|
#endif /* #if defined(CONFIG_RTL_ULINKER) */
|
|
|
|
REG32(0xb8003000) |= BIT(16); // GIMR
|
|
|
|
#elif defined(CONFIG_RTL_8198)
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
// GPIO C1
|
|
REG32(0xb8000044) |= BIT(16) | BIT(17); //LEDPHASE1
|
|
REG32(0xb8003500) &= ~(BIT(17)); //PABCD_CNR , gpio pin
|
|
REG32(0xb8003508) &= ~(BIT(17)); //PABCD_DIR
|
|
REG32(0xb8003518) &= (~(0x03 << 2));
|
|
REG32(0xb8003518) |= (0x01 << 2); // enable interrupt in falling-edge
|
|
REG32(PABCD_ISR) = BIT(17) ; // clear int status
|
|
|
|
} else
|
|
#endif
|
|
{
|
|
// GPIO C4
|
|
REG32(0xb8000044) |= BIT(24); //LEDPHASE4
|
|
REG32(0xb8003500) &= ~(BIT(20)); //PABCD_CNR , gpio pin
|
|
REG32(0xb8003508) &= ~(BIT(20)); //PABCD_DIR
|
|
REG32(0xb8003518) &= (~(0x03 << 8));
|
|
REG32(0xb8003518) |= (0x01 << 8); // enable interrupt in falling-edge
|
|
REG32(PABCD_ISR) = BIT(20) ; // clear int status
|
|
}
|
|
REG32(0xb8003000) |= BIT(16); // GIMR
|
|
#else
|
|
// GPIO B7
|
|
REG32(0xb8000040) |= 0x0c00; //LEDPHASE1 :GPIOB7
|
|
REG32(0xb8003500) &= ~(BIT(15));; //PABCD_CNR , gpio pin
|
|
REG32(0xb8003508) &= ~(BIT(15)); //PABCD_DIR
|
|
REG32(0xb8003514) &= (~(0x03 << 30));
|
|
REG32(0xb8003514) |= (0x01 << 30); // PAB_IMR // enable interrupt in falling-edge
|
|
REG32(0xb8003000) |= BIT(9); // GIMR
|
|
|
|
REG32(PABCD_ISR) = BIT(15) ; // clear int status
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
Sw_PCIE_Func2(priv->pshare->wlandev_idx);
|
|
#endif
|
|
|
|
REG32(saddr + 0x44) = 0x8108; // clear pme status
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
Sw_PCIE_Func2(0);
|
|
#endif
|
|
|
|
#if defined(__LINUX_2_6__)
|
|
return request_irq(BSP_GPIO_ABCD_IRQ, gpio_wakeup_isr, IRQF_SHARED, "rtk_gpio", dev);
|
|
#else
|
|
return request_irq(1, gpio_wakeup_isr, SA_SHIRQ, "rtl_gpio", dev);
|
|
#endif
|
|
|
|
}
|
|
#endif
|
|
|
|
|
|
void init_pcie_power_saving(struct rtl8192cd_priv *priv)
|
|
{
|
|
|
|
unsigned int saddr;
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D)
|
|
saddr = CFG_92D_SLOTS;
|
|
else
|
|
saddr = CFG_92C_SLOTS;
|
|
|
|
// Jason : clk req
|
|
#if 0
|
|
REG32(0xb9000354) = 8;
|
|
REG32(0xb9000358) = 0x30;
|
|
#endif
|
|
|
|
#ifdef FIB_96C
|
|
if (REG32(SYSTEM_BASE ) == 0x80000001) {
|
|
#if defined(__LINUX_2_6__)
|
|
#else
|
|
extern void HostPCIe_SetPhyMdioWrite(unsigned int , unsigned int , unsigned short );
|
|
#endif
|
|
HostPCIe_SetPhyMdioWrite(0, 8, 0x18d5); // 18dd -> 18d5
|
|
HostPCIe_SetPhyMdioWrite(0, 0xd, 0x15a6); // 15b6 -> 15a6
|
|
}
|
|
#endif
|
|
|
|
// Jason , for ASPM read_reg
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8188C)) {
|
|
RTL_W16(0x354, 0x18e);
|
|
RTL_W16(0x358, 0x23);
|
|
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188C) ) {
|
|
RTL_W16(0x354, 0x20eb);
|
|
RTL_W16(0x358, 0x3d);
|
|
}
|
|
}
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
Sw_PCIE_Func2(priv->pshare->wlandev_idx);
|
|
#endif
|
|
|
|
REG32(saddr + 0x80) |= 0x0100;
|
|
#ifdef ASPM_ENABLE
|
|
REG32(saddr + 0x80) |= 0x43;
|
|
#endif
|
|
REG32(saddr + 0x0778) |= BIT(5) << 8;
|
|
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
|
|
// 92c backdoor
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188C) || (GET_CHIP_VER(priv) == VERSION_8192C)) {
|
|
REG32(saddr + 0x70c) |= BIT(7) << 24;
|
|
REG32(saddr + 0x718) |= (BIT(3) | BIT(4)) << 8;
|
|
// dprintf("70f=%x,719=%x\n", REG32(0xb8b1070f), REG32(0xb8b10719) );
|
|
}
|
|
#endif
|
|
|
|
RTL_W8(0x690, 0x2); // WoW
|
|
RTL_W8(0x302, 0x2); // sw L123
|
|
RTL_W8(0x5, 0x0); // AFSM_PCIE
|
|
RTL_W16(PCIE_CTRL_REG, 0xff );
|
|
|
|
// RTL_W16(0x558, 0x040a);
|
|
// RTL_W16(0x100 , RTL_R16(0x100) | BIT(8)); // enable sw beacon
|
|
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if (IS_TEST_CHIP(priv)) {
|
|
priv->pshare->rf_ft_var.power_save &= (~ L2_en);
|
|
priv->pshare->rf_ft_var.power_save &= (~ASPM_en);
|
|
} else
|
|
#endif
|
|
{
|
|
RTL_W8(0x08, RTL_R8(0x08) | BIT(3)); // WAKEPAN_EN
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if (IS_UMC_A_CUT_88C(priv))
|
|
priv->pshare->rf_ft_var.power_save &= (~ASPM_en);
|
|
#endif
|
|
|
|
}
|
|
#ifdef ASPM_ENABLE
|
|
ASPM_on_off(priv);
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
Sw_PCIE_Func2(1);
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
int isPSConditionMatch(struct rtl8192cd_priv *priv)
|
|
{
|
|
|
|
// temporary disable Active ECO when 1 interfcae is disabled
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if ( (priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY) &&
|
|
(!IS_DRV_OPEN(((struct rtl8192cd_priv *)if_priv[1 & (priv->pshare->wlandev_idx ^ 1)]))))
|
|
return 0;
|
|
#endif
|
|
|
|
if (!IS_DRV_OPEN(priv))
|
|
return 1;
|
|
|
|
if ( (priv->assoc_num == 0)
|
|
&& (priv->pshare->rf_ft_var.power_save & (L1_en | L2_en))
|
|
#ifdef MBSSID
|
|
&& (!priv->pmib->miscEntry.vap_enable)
|
|
#endif
|
|
#ifdef WDS
|
|
&& (!priv->pmib->dot11WdsInfo.wdsEnabled)
|
|
#endif
|
|
#ifdef UNIVERSAL_REPEATER
|
|
&& (!IS_DRV_OPEN(GET_VXD_PRIV(priv)))
|
|
#endif
|
|
#ifdef CLIENT_MODE
|
|
&& !((OPMODE & WIFI_STATION_STATE) || (OPMODE & WIFI_ADHOC_STATE))
|
|
#endif
|
|
)
|
|
return 1;
|
|
else
|
|
return 0;
|
|
|
|
}
|
|
|
|
void PCIe_power_save_timer(unsigned long task_priv)
|
|
{
|
|
struct rtl8192cd_priv *priv = (struct rtl8192cd_priv *)task_priv;
|
|
char force;
|
|
force = priv->ps_ctrl & 0x80;
|
|
priv->ps_ctrl &= 0x7f;
|
|
|
|
#ifdef MP_TEST
|
|
if (priv->pshare->rf_ft_var.mp_specific)
|
|
return ;
|
|
#endif
|
|
|
|
if (!IS_DRV_OPEN(priv))
|
|
return;
|
|
|
|
if (force == 0) {
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if (isPSConditionMatch((struct rtl8192cd_priv *)if_priv[0]) && isPSConditionMatch((struct rtl8192cd_priv *)if_priv[1]))
|
|
#else
|
|
if (isPSConditionMatch(priv))
|
|
#endif
|
|
{
|
|
if (priv->pwr_state != L1 && priv->pwr_state != L2) {
|
|
if ((priv->offload_ctrl >> 7) && (priv->offload_ctrl & 1) == 0) {
|
|
if (priv->pshare->rf_ft_var.power_save & L2_en)
|
|
priv->ps_ctrl = 0x21;
|
|
else
|
|
priv->ps_ctrl = 0x11;
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if ((priv->pshare->wlandev_idx == 1) &&
|
|
(!IS_DRV_OPEN(((struct rtl8192cd_priv *)if_priv[0]))) ) {
|
|
((struct rtl8192cd_priv *)if_priv[0])->ps_ctrl = priv->ps_ctrl;
|
|
tasklet_schedule(&((struct rtl8192cd_priv *)if_priv[0])->pshare->ps_tasklet);
|
|
} else if ((priv->pshare->wlandev_idx == 0) &&
|
|
((!IS_DRV_OPEN(((struct rtl8192cd_priv *)if_priv[1]))) || (((struct rtl8192cd_priv *)if_priv[1])->offload_ctrl >> 7)))
|
|
#endif
|
|
tasklet_schedule(&priv->pshare->ps_tasklet);
|
|
} else {
|
|
priv->offload_ctrl = 1;
|
|
RTL_W16(CR , RTL_R16(CR) | ENSWBCN); // enable sw beacon
|
|
mod_timer(&priv->ps_timer, jiffies + RTL_SECONDS_TO_JIFFIES(1));
|
|
return;
|
|
}
|
|
}
|
|
} else {
|
|
priv->offload_ctrl = 0;
|
|
}
|
|
|
|
} else {
|
|
if (priv->pwr_state == L0)
|
|
tasklet_schedule(&priv->pshare->ps_tasklet);
|
|
}
|
|
mod_timer(&priv->ps_timer, jiffies + POWER_DOWN_T0);
|
|
|
|
#ifdef ASPM_ENABLE
|
|
ASPM_on_off(priv);
|
|
#endif
|
|
|
|
}
|
|
|
|
void setBaseAddressRegister(void)
|
|
{
|
|
int tmp32 = 0, status;
|
|
while (++tmp32 < 100) {
|
|
REG32(0xb8b00004) = 0x00100007;
|
|
REG32(0xb8b10004) = 0x00100007;
|
|
REG32(0xb8b10010) = 0x18c00001;
|
|
REG32(0xb8b10018) = 0x19000004;
|
|
status = (REG32(0xb8b10010) ^ 0x18c00001) | ( REG32(0xb8b10018) ^ 0x19000004);
|
|
if (!status)
|
|
break;
|
|
else {
|
|
printk("set BAR fail,%x\n", status);
|
|
printk("%x %x %x %x \n",
|
|
REG32(0xb8b00004) , REG32(0xb8b10004) , REG32(0xb8b10010), REG32(0xb8b10018) );
|
|
}
|
|
} ;
|
|
}
|
|
|
|
void PCIe_power_save_tasklet(unsigned long task_priv)
|
|
{
|
|
struct rtl8192cd_priv *priv = (struct rtl8192cd_priv *)task_priv;
|
|
char in_out, L1_L2;
|
|
unsigned int tmp32 = 0, status = 0, page = 0, ctr;
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
unsigned int portnum = 0, i;
|
|
#endif
|
|
#ifndef SMP_SYNC
|
|
unsigned long flags;
|
|
#endif
|
|
|
|
unsigned int saddr, haddr;
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
saddr = CFG_92D_SLOTS;
|
|
haddr = CFG_92D_SLOTH;
|
|
|
|
portnum = RTL_USED_PCIE_SLOT;
|
|
} else
|
|
#endif
|
|
{
|
|
saddr = CFG_92C_SLOTS;
|
|
haddr = CFG_92C_SLOTH;
|
|
}
|
|
|
|
priv->ps_ctrl &= 0x7f;
|
|
in_out = priv->ps_ctrl & 0xf;
|
|
L1_L2 = (priv->ps_ctrl >> 4) & 0x7;
|
|
|
|
#if defined(CONFIG_RTL_92D_DMDP)
|
|
if ((in_out == PWR_STATE_IN) && (priv->pshare->wlandev_idx == 0) && (priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY)) {
|
|
struct rtl8192cd_priv *priv1 = ((struct rtl8192cd_priv *)if_priv[1]);
|
|
priv1->ps_ctrl = priv->ps_ctrl;
|
|
PCIe_power_save_tasklet((unsigned long )priv1);
|
|
}
|
|
#endif
|
|
|
|
DEBUG_INFO("%s, %s, L%d\n", __FUNCTION__, (in_out == PWR_STATE_IN ? "in" : "out") , L1_L2);
|
|
|
|
if ( in_out == PWR_STATE_IN) {
|
|
SAVE_INT_AND_CLI(flags);
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
Sw_PCIE_Func2(priv->pshare->wlandev_idx);
|
|
|
|
if (!IS_DRV_OPEN(priv)) {
|
|
#ifdef ASPM_ENABLE
|
|
if ( priv->pwr_state == ASPM_L0s_L1) {
|
|
REG32(haddr + 0x80) &= ~(0x3);
|
|
REG32(saddr + 0x80) &= ~(0x3);
|
|
}
|
|
#endif
|
|
RTL_W8(PCIE_CTRL_REG + 2, 0x2); // sw L123
|
|
RTL_W16(PCIE_CTRL_REG, 0xff00 );
|
|
REG32(saddr + 0x44) |= 0x8108;
|
|
|
|
if (L1_L2 == L1) {
|
|
priv->pwr_state = L1;
|
|
} else {
|
|
RTL_W8(RSV_CTRL0, 0xe1); // reg lock, dis_prst
|
|
RTL_W8(RSV_CTRL0, 0xe1);
|
|
priv->pwr_state = L2;
|
|
}
|
|
RESTORE_INT(flags);
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
#ifdef ASPM_ENABLE
|
|
if ( priv->pwr_state == ASPM_L0s_L1) {
|
|
REG32(haddr + 0x80) &= ~(0x3);
|
|
REG32(saddr + 0x80) &= ~(0x3);
|
|
}
|
|
#endif
|
|
|
|
// RTL_W8(0x286, 4);
|
|
RTL_W8(PCIE_CTRL_REG + 2, 0x2); // sw L123
|
|
REG32(saddr + 0x44) |= 0x8108; // clear pme status
|
|
|
|
RTL_W16(NQOS_SEQ, priv->pshare->phw->seq);
|
|
RTL_W8(HWSEQ_CTRL, 0x7f); // mac seq
|
|
|
|
ctr = 3000;
|
|
do {
|
|
delay_us(100);
|
|
if (!RTL_R8(PCIE_CTRL_REG)) {
|
|
RTL_W8(PCIE_CTRL_REG + 1, 0xfe );
|
|
break;
|
|
}
|
|
} while (--ctr);
|
|
if (!ctr) {
|
|
status = 1;
|
|
}
|
|
ctr = 3000;
|
|
do {
|
|
delay_us(100);
|
|
if ( ((RTL_R32(0x200) ^ RTL_R32(0x204)) == 0) &&
|
|
(((RTL_R32(VOQ_INFO) | RTL_R32(VIQ_INFO) | RTL_R32(BEQ_INFO) | RTL_R32(BKQ_INFO)
|
|
| RTL_R32(MGQ_INFO) | RTL_R32(HIQ_INFO)) & 0xffff00) == 0)
|
|
) {
|
|
break;
|
|
}
|
|
} while (--ctr);
|
|
if (!ctr) {
|
|
status = 1;
|
|
}
|
|
RTL_W8(TXPAUSE, 0x2f);
|
|
delay_ms(1);
|
|
|
|
#ifdef PCIE_L2_ENABLE
|
|
if (L1_L2 == L2) {
|
|
int tx_head, tx_tail, q_num;
|
|
struct tx_desc *phdesc, *pdesc;
|
|
for (q_num = MGNT_QUEUE; q_num <= HIGH_QUEUE; q_num++) {
|
|
tx_head = get_txhead(GET_HW(priv), q_num);
|
|
tx_tail = get_txtail(GET_HW(priv), q_num);
|
|
phdesc = get_txdesc(GET_HW(priv), q_num);
|
|
while (tx_tail != tx_head) {
|
|
pdesc = phdesc + (tx_tail);
|
|
pdesc->Dword0 &= set_desc(~TX_OWN);
|
|
tx_tail = (tx_tail + 1) % CURRENT_NUM_TX_DESC;
|
|
}
|
|
}
|
|
#ifdef SMP_SYNC
|
|
if (!priv->pshare->has_triggered_tx_tasklet) {
|
|
tasklet_schedule(&priv->pshare->tx_tasklet);
|
|
priv->pshare->has_triggered_tx_tasklet = 1;
|
|
}
|
|
#else
|
|
rtl8192cd_tx_dsr((unsigned long)priv);
|
|
#endif
|
|
rtl8192cd_rx_isr(priv);
|
|
}
|
|
#endif
|
|
if ((get_rf_mimo_mode(priv) == MIMO_2T2R) && (priv->pshare->rf_ft_var.power_save & _1x1_en))
|
|
switch_to_1x1(priv, PWR_STATE_IN);
|
|
|
|
page = ((priv->offload_ctrl) >> 7) & 0xff;
|
|
RTL_W16(RCR, RTL_R16(RCR) & ~(BIT(11) | BIT(12) | BIT(13)));
|
|
RTL_W16(RXFLTMAP0, RTL_R16(RXFLTMAP0) | BIT(11) | BIT(4));
|
|
|
|
if (priv->pshare->rf_ft_var.power_save & offload_en) {
|
|
|
|
if (GET_CHIP_VER(priv) != VERSION_8192D)
|
|
status |= signin_h2c_cmd(priv, _RSVDPAGE_CMD_ | page << 8, 0);
|
|
else
|
|
status |= signin_h2c_cmd(priv, _RSVDPAGE_CMD_ | BIT(7) | (page << 8), (page << 8) | (page) );
|
|
|
|
status |= signin_h2c_cmd(priv, _AP_OFFLOAD_CMD_ | (1 << 8) | (HIDDEN_AP << 16) | ((GET_MIB(priv))->dot11OperationEntry.deny_any) << 24, 0 );
|
|
#if defined(__LINUX_2_6__)
|
|
RTL_W32(HIMR, 0);
|
|
#endif
|
|
DEBUG_INFO("%s, LINE:%d, h2c %x, %x, %x\n", __FUNCTION__, __LINE__,
|
|
(_RSVDPAGE_CMD_ | page << 8), (_RSVDPAGE_CMD_ | BIT(7) | (page << 8), (page << 8) | (page)),
|
|
(_AP_OFFLOAD_CMD_ | (1 << 8) | (HIDDEN_AP << 16) | ((GET_MIB(priv))->dot11OperationEntry.deny_any) << 24)
|
|
);
|
|
ctr = 3000;
|
|
do {
|
|
delay_us(10);
|
|
page = RTL_R8(RXPKT_NUM + 2) & 6 ;
|
|
if (page == 6)
|
|
break;
|
|
} while (--ctr);
|
|
|
|
if (status || (page != 6)) {
|
|
DEBUG_INFO("signin_h2c_cmd fail(ap offload), 286=%x\n", page);
|
|
#if defined(__LINUX_2_6__)
|
|
RTL_W32(HIMR, priv->pshare->InterruptMask);
|
|
#endif
|
|
if ((get_rf_mimo_mode(priv) == MIMO_2T2R) && (priv->pshare->rf_ft_var.power_save & _1x1_en))
|
|
switch_to_1x1(priv, PWR_STATE_OUT);
|
|
RTL_W8(HWSEQ_CTRL, 0x0); // mac seq disable
|
|
RTL_W8(RXPKT_NUM + 2, 0);
|
|
|
|
RTL_W16(RCR, RTL_R16(RCR) | (BIT(11) | BIT(13)));
|
|
RTL_W16(RXFLTMAP0, RTL_R16(RXFLTMAP0) & ~(BIT(11) | BIT(4)));
|
|
|
|
RTL_W8(PCIE_CTRL_REG + 1, 0x00); // enable DMA
|
|
RTL_W8(TXPAUSE, 0x0);
|
|
|
|
priv->offload_ctrl = 0;
|
|
RESTORE_INT(flags);
|
|
return;
|
|
}
|
|
}
|
|
RTL_W16(CR , RTL_R16(CR) | ENSWBCN); // enable sw beacon
|
|
|
|
if ( L1_L2 == L1) {
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if ((priv->pshare->wlandev_idx) && (priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY)
|
|
&& IS_DRV_OPEN(((struct rtl8192cd_priv *)if_priv[0]))) {
|
|
RESTORE_INT(flags);
|
|
return ;
|
|
}
|
|
Sw_PCIE_Func2(1);
|
|
tmp32 = REG32(saddr + 0x44) & ( ~(3));
|
|
REG32(saddr + 0x44) = tmp32 | (3); //D3
|
|
|
|
if (!priv->pshare->wlandev_idx)
|
|
((struct rtl8192cd_priv *)if_priv[1])->pwr_state = L1;
|
|
Sw_PCIE_Func2(0);
|
|
delay_ms(1);
|
|
#endif
|
|
priv->pwr_state = L1;
|
|
|
|
tmp32 = REG32(saddr + 0x44) & ( ~(3)); //D0
|
|
REG32(saddr + 0x44) = tmp32 | (3); //D3
|
|
//HostPCIe_SetPhyMdioWrite(0xd, 0x15a6);
|
|
printk("D3 hot -> L1\n");
|
|
delay_ms(1);
|
|
#if 0 //saving more power
|
|
HostPCIe_SetPhyMdioWrite(portnum, 0xf, 0x0708);
|
|
#endif
|
|
}
|
|
RESTORE_INT(flags);
|
|
|
|
|
|
#ifdef PCIE_L2_ENABLE
|
|
if ( L1_L2 == L2) {
|
|
#if 0 //saving more power leave L1 write
|
|
HostPCIe_SetPhyMdioWrite(portnum, 0xf, 0x0f0f);
|
|
#endif
|
|
RTL_W8(RSV_CTRL0, 0xe1); // reg lock, dis_prst
|
|
RTL_W8(RSV_CTRL0, 0xe1);
|
|
priv->pwr_state = L2;
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if (!priv->pshare->wlandev_idx)
|
|
#endif
|
|
REG32(haddr + 0x1008) |= (0x200);
|
|
printk("PME turn off -> L2\n");
|
|
}
|
|
#endif
|
|
#if defined(CONFIG_RTL_8198) || defined(CONFIG_RTL_819XD) || defined(CONFIG_RTL_8196E)
|
|
REG32(0xb8003000) |= BIT(16); // GIMR
|
|
#else
|
|
REG32(0xb8003000) |= BIT(9); // GIMR
|
|
#endif
|
|
} else if (in_out == PWR_STATE_OUT) {
|
|
#ifdef PCIE_L2_ENABLE
|
|
if ( L1_L2 == L2) {
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
Sw_PCIE_Func2(priv->pshare->wlandev_idx);
|
|
if (!priv->pshare->wlandev_idx )
|
|
#endif
|
|
PCIE_reset_procedure3(priv);
|
|
setBaseAddressRegister();
|
|
|
|
SAVE_INT_AND_CLI(flags);
|
|
priv->pwr_state = L0;
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
((struct rtl8192cd_priv *)if_priv[1])->pwr_state = L0;
|
|
#endif
|
|
RTL_W8(RSV_CTRL0, 0x0);
|
|
tmp32 = 0;
|
|
while (1) {
|
|
if ( !(RTL_R8(SPS0_CTRL) & BIT(3)) || (++tmp32 > 20) ) {
|
|
RTL_W8(SPS0_CTRL, 0x2b);
|
|
break;
|
|
}
|
|
}
|
|
DEBUG_INFO("SPS0_CTRL=%d !!\n", RTL_R8(SPS0_CTRL));
|
|
} else
|
|
#endif
|
|
{
|
|
|
|
SAVE_INT_AND_CLI(flags);
|
|
if ( priv->pwr_state == L1) {
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
for (i = 0; i < 2; i++) {
|
|
Sw_PCIE_Func2(i);
|
|
#endif
|
|
ctr = 3000;
|
|
#if 0 //saving more power, leave L1 write
|
|
HostPCIe_SetPhyMdioWrite(portnum, 0xf, 0x0f0f);
|
|
#endif
|
|
tmp32 = REG32(saddr + 0x44) & ( ~(3)); //D0
|
|
do {
|
|
REG32(saddr + 0x44) = tmp32 | (0); //D0
|
|
delay_us(1);
|
|
REG32(saddr + 0x44) = tmp32 | (0); //D0
|
|
status = REG32(haddr + 0x728) & 0x1f;
|
|
if (status == 0x11)
|
|
break;
|
|
} while (--ctr);
|
|
|
|
if (status != 0x11)
|
|
panic_printk("change to L0 fail!!!, status=%x, MAC0\n", status);
|
|
else
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
((struct rtl8192cd_priv *)if_priv[i])->pwr_state = L0;
|
|
}
|
|
#else
|
|
priv->pwr_state = L0;
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if ((priv->pshare->wlandev_idx == 0) && (priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY) && !IS_DRV_OPEN(priv) ) {
|
|
goto OEPN_MAC1;
|
|
}
|
|
#endif
|
|
|
|
if (priv->pshare->rf_ft_var.power_save & offload_en) {
|
|
|
|
#if defined(__LINUX_2_6__)
|
|
RTL_W32(HIMR, priv->pshare->InterruptMask);
|
|
#endif
|
|
signin_h2c_cmd(priv, _AP_OFFLOAD_CMD_ , 0 ); // offload
|
|
delay_ms(2);
|
|
}
|
|
|
|
if ((get_rf_mimo_mode(priv) == MIMO_2T2R) && (priv->pshare->rf_ft_var.power_save & _1x1_en))
|
|
switch_to_1x1(priv, PWR_STATE_OUT);
|
|
#ifdef PCIE_L2_ENABLE
|
|
if ( L1_L2 == L2) {
|
|
priv->pshare->phw->cur_rx = 0;
|
|
#ifdef DELAY_REFILL_RX_BUF
|
|
priv->pshare->phw->cur_rx_refill = 0;
|
|
#endif
|
|
memset(&(priv->pshare->phw->txhead0), 0, sizeof(int) * 12);
|
|
RTL_W32(BCNQ_DESA, priv->pshare->phw->tx_ringB_addr);
|
|
RTL_W32(MGQ_DESA, priv->pshare->phw->tx_ring0_addr);
|
|
RTL_W32(VOQ_DESA, priv->pshare->phw->tx_ring4_addr);
|
|
RTL_W32(VIQ_DESA, priv->pshare->phw->tx_ring3_addr);
|
|
RTL_W32(BEQ_DESA, priv->pshare->phw->tx_ring2_addr);
|
|
RTL_W32(BKQ_DESA, priv->pshare->phw->tx_ring1_addr);
|
|
RTL_W32(HQ_DESA, priv->pshare->phw->tx_ring5_addr);
|
|
RTL_W32(RX_DESA, priv->pshare->phw->ring_dma_addr);
|
|
}
|
|
#endif
|
|
// wait until FW stop parsing packet
|
|
ctr = 1000;
|
|
do {
|
|
if (!(RTL_R8(FWIMR) & FWIMR_RXDONE))
|
|
break;
|
|
delay_us(200);
|
|
} while (--ctr) ;
|
|
if (!ctr)
|
|
DEBUG_ERR("stop offload fail\n");
|
|
|
|
RTL_W8(HWSEQ_CTRL, 0x0); // mac seq disable
|
|
RTL_W8(RXPKT_NUM + 2, 0); // RW_RELEASE_ENABLE
|
|
RTL_W16(RCR, RTL_R16(RCR) | (BIT(11) | BIT(13)));
|
|
RTL_W16(RXFLTMAP0, RTL_R16(RXFLTMAP0) & ~(BIT(11) | BIT(4)));
|
|
RTL_W8(PCIE_CTRL_REG + 1, 0x00); // enable DMA
|
|
RTL_W8(PCIE_CTRL_REG + 2, 0x3); // sw L123
|
|
RTL_W8(TXPAUSE, 0x0);
|
|
RTL_W16(CR , RTL_R16(CR) & ~ENSWBCN);
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if ((priv->pshare->wlandev_idx == 0) && (priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY)) {
|
|
struct rtl8192cd_priv *priv1;
|
|
OEPN_MAC1:
|
|
priv1 = ((struct rtl8192cd_priv *)if_priv[1]);
|
|
if (IS_DRV_OPEN(priv1) ) {
|
|
priv1->ps_ctrl = priv->ps_ctrl;
|
|
PCIe_power_save_tasklet((unsigned long )priv1);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if defined(RX_TASKLET)
|
|
if (IS_DRV_OPEN(priv)) {
|
|
tasklet_hi_schedule(&priv->pshare->rx_tasklet);
|
|
}
|
|
#endif
|
|
|
|
#ifdef ASPM_ENABLE
|
|
ASPM_on_off(priv);
|
|
#endif
|
|
RESTORE_INT(flags);
|
|
}
|
|
}
|
|
|
|
|
|
void PCIeWakeUp(struct rtl8192cd_priv *priv, unsigned int expTime)
|
|
{
|
|
#ifndef SMP_SYNC
|
|
unsigned long flags;
|
|
#endif
|
|
SAVE_INT_AND_CLI(flags);
|
|
|
|
if ( (priv->pwr_state == L1) || (priv->pwr_state == L2)) {
|
|
|
|
if (timer_pending(&priv->ps_timer))
|
|
del_timer_sync(&priv->ps_timer);
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if (priv->pshare->wlandev_idx == 1) {
|
|
struct rtl8192cd_priv *priv0 = ((struct rtl8192cd_priv *)if_priv[0]);
|
|
PCIeWakeUp(priv0, expTime);
|
|
} else
|
|
#endif
|
|
{
|
|
priv->ps_ctrl = 0x02 | (priv->pwr_state << 4);
|
|
PCIe_power_save_tasklet((unsigned long)priv);
|
|
}
|
|
|
|
mod_timer(&priv->ps_timer, jiffies + expTime);
|
|
priv->offload_ctrl = 0;
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
((struct rtl8192cd_priv *)if_priv[priv->pshare->wlandev_idx ^ 1])->offload_ctrl = 0;
|
|
#endif
|
|
}
|
|
RESTORE_INT(flags);
|
|
}
|
|
|
|
#ifdef __LINUX_2_6__
|
|
irqreturn_t gpio_wakeup_isr(int irq, void *dev_instance)
|
|
#else
|
|
void gpio_wakeup_isr(int irq, void *dev_instance, struct pt_regs *regs)
|
|
#endif
|
|
{
|
|
struct net_device *dev = NULL;
|
|
struct rtl8192cd_priv *priv = NULL;
|
|
|
|
unsigned int saddr;
|
|
|
|
dev = (struct net_device *)dev_instance;
|
|
priv = (struct rtl8192cd_priv *)dev->priv;
|
|
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
saddr = CFG_92D_SLOTS;
|
|
} else {
|
|
saddr = CFG_92C_SLOTS;
|
|
}
|
|
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
Sw_PCIE_Func2(priv->pshare->wlandev_idx);
|
|
#endif
|
|
|
|
DEBUG_INFO("%s, PABCD_ISR=%x\t", dev->name, REG32(PABCD_ISR));
|
|
|
|
#if defined(CONFIG_RTL_819XD) || defined(CONFIG_RTL_8196E)
|
|
|
|
#if defined(CONFIG_RTL_ULINKER)
|
|
REG32(PABCD_ISR) = BIT(13) ; // clear int status
|
|
#else
|
|
#if defined(CONFIG_RTL_92D_SUPPORT) && defined(CONFIG_RTL_8197D)
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D)
|
|
REG32(PABCD_ISR) = BIT(15) ;
|
|
else
|
|
#endif
|
|
REG32(PABCD_ISR) = BIT(4) ; // clear int status
|
|
#endif /* #if defined(CONFIG_RTL_ULINKER) */
|
|
|
|
#elif defined(CONFIG_RTL_8198)
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D)
|
|
REG32(PABCD_ISR) = BIT(17) ;
|
|
else
|
|
#endif
|
|
REG32(PABCD_ISR) = BIT(20) ; // clear int status
|
|
#else
|
|
REG32(PABCD_ISR) = BIT(15) ; // clear int status
|
|
#endif
|
|
|
|
DEBUG_INFO(", PABCD_ISR=%x,0xb8100044=%x\n", REG32(PABCD_ISR), REG32(saddr + 0x44));
|
|
|
|
#ifdef GPIO_WAKEPIN
|
|
#ifdef PCIE_POWER_SAVING_DEBUG
|
|
priv->firstPkt = 1;
|
|
#endif
|
|
if (timer_pending(&priv->ps_timer))
|
|
del_timer_sync(&priv->ps_timer);
|
|
|
|
if ( priv->pwr_state == L1 || priv->pwr_state == L2) {
|
|
priv->ps_ctrl = 0x02 | (priv->pwr_state << 4);
|
|
PCIe_power_save_tasklet((unsigned long)priv);
|
|
}
|
|
|
|
priv->offload_ctrl = 0;
|
|
mod_timer(&priv->ps_timer, jiffies + (POWER_DOWN_T0));
|
|
|
|
#endif
|
|
#ifdef __LINUX_2_6__
|
|
return IRQ_HANDLED;
|
|
#endif
|
|
}
|
|
|
|
|
|
void radio_off(struct rtl8192cd_priv *priv)
|
|
{
|
|
#if 0
|
|
extern void HostPCIe_Close(void);
|
|
printk("Radio Off======>\n");
|
|
HostPCIe_Close();
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
|
|
#if defined(RF_MIMO_SWITCH) || defined(PCIE_POWER_SAVING) || defined(RF_MIMO_PS)
|
|
int MIMO_mode_switch(struct rtl8192cd_priv *priv, int mode)
|
|
{
|
|
if(get_rf_mimo_mode(priv) != MIMO_2T2R)
|
|
return 0;
|
|
#ifdef MP_TEST
|
|
if (((OPMODE & WIFI_MP_STATE) || priv->pshare->rf_ft_var.mp_specific))
|
|
return 0;
|
|
#endif
|
|
if ((mode == MIMO_1T1R) && (priv->pshare->rf_status!= MIMO_1T1R)) {
|
|
|
|
//panic_printk("switch to 1x1\n");
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
Assert_BB_Reset(priv);
|
|
priv->pshare->rf_phy_bb_backup[0] = RTL_R32(0x808);
|
|
priv->pshare->rf_phy_bb_backup[1] = RTL_R32(0x80c);
|
|
priv->pshare->rf_phy_bb_backup[2] = RTL_R32(0xa04);
|
|
priv->pshare->rf_phy_bb_backup[3] = RTL_R32(0x8bc);
|
|
priv->pshare->rf_phy_bb_backup[4] = RTL_R32(0xe00);
|
|
priv->pshare->rf_phy_bb_backup[5] = RTL_R32(0xe90);
|
|
priv->pshare->rf_phy_bb_backup[6] = RTL_R32(0xe60);
|
|
priv->pshare->rf_phy_bb_backup[7] = RTL_R32(0xe64);
|
|
RTL_W8(0x808, 0x11);
|
|
RTL_W16(0x80c, 0x1111);
|
|
RTL_W8(0xa07, (RTL_R8(0xa07) & 0xf3)); // [3:2] = 2'b 00
|
|
RTL_W32(0x8bc, (RTL_R32(0x8bc) & 0x3FFFFF9F) | BIT(30) );
|
|
RTL_W8(0xe00, (RTL_R8(0xe00) & 0xf0) | 0x04 );
|
|
RTL_W8(0xe90, 0);
|
|
RTL_W32(0xe60, 0);
|
|
RTL_W32(0xe64, 0);
|
|
Release_BB_Reset(priv);
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
if(GET_CHIP_VER(priv) == VERSION_8192E) {
|
|
priv->pshare->rf_phy_bb_backup[0] = RTL_R32(0xd00);
|
|
priv->pshare->rf_phy_bb_backup[23] = RTL_R32(0xe68);
|
|
priv->pshare->rf_phy_bb_backup[24] = RTL_R32(0x82c);
|
|
priv->pshare->rf_phy_bb_backup[25] = RTL_R32(0xa00);
|
|
}
|
|
#endif
|
|
#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_92C_SUPPORT)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8192D)) {
|
|
priv->pshare->rf_phy_bb_backup[0] = RTL_R32(0x844);
|
|
priv->pshare->rf_phy_bb_backup[20] = RTL_R32(0x804);
|
|
priv->pshare->rf_phy_bb_backup[21] = RTL_R32(0x88c);
|
|
}
|
|
#endif
|
|
#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_WLAN_HAL_8192EE)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192E) || (GET_CHIP_VER(priv) == VERSION_8192D) || (GET_CHIP_VER(priv) == VERSION_8192C)) {
|
|
priv->pshare->rf_phy_bb_backup[1] = RTL_R32(0x85c);
|
|
priv->pshare->rf_phy_bb_backup[2] = RTL_R32(0xe6c);
|
|
priv->pshare->rf_phy_bb_backup[3] = RTL_R32(0xe70);
|
|
priv->pshare->rf_phy_bb_backup[4] = RTL_R32(0xe74);
|
|
priv->pshare->rf_phy_bb_backup[5] = RTL_R32(0xe78);
|
|
priv->pshare->rf_phy_bb_backup[6] = RTL_R32(0xe7c);
|
|
priv->pshare->rf_phy_bb_backup[7] = RTL_R32(0xe80);
|
|
priv->pshare->rf_phy_bb_backup[8] = RTL_R32(0xe84);
|
|
priv->pshare->rf_phy_bb_backup[9] = RTL_R32(0xe88);
|
|
priv->pshare->rf_phy_bb_backup[10] = RTL_R32(0xe8c);
|
|
priv->pshare->rf_phy_bb_backup[11] = RTL_R32(0xed0);
|
|
priv->pshare->rf_phy_bb_backup[12] = RTL_R32(0xed4);
|
|
priv->pshare->rf_phy_bb_backup[13] = RTL_R32(0xed8);
|
|
priv->pshare->rf_phy_bb_backup[14] = RTL_R32(0xedc);
|
|
priv->pshare->rf_phy_bb_backup[15] = RTL_R32(0xee0);
|
|
priv->pshare->rf_phy_bb_backup[16] = RTL_R32(0xeec);
|
|
priv->pshare->rf_phy_bb_backup[17] = RTL_R32(0xc04);
|
|
priv->pshare->rf_phy_bb_backup[18] = RTL_R32(0xd04);
|
|
priv->pshare->rf_phy_bb_backup[19] = RTL_R32(0x90c);
|
|
priv->pshare->rf_phy_bb_backup[22] = RTL_R32(0xa04);
|
|
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
unsigned int mask = 0xB4FFFFFF, path = 0x11;
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_2G) {
|
|
mask = 0xDB3FFFFF;
|
|
path = 0x22;
|
|
RTL_W8(0xa07, 0x45);
|
|
}
|
|
PHY_SetBBReg(priv, 0x85c, bMaskDWord, priv->pshare->rf_phy_bb_backup[1] & mask);
|
|
PHY_SetBBReg(priv, 0xe6c, bMaskDWord, priv->pshare->rf_phy_bb_backup[2] & mask);
|
|
PHY_SetBBReg(priv, 0xe70, bMaskDWord, priv->pshare->rf_phy_bb_backup[3] & mask);
|
|
PHY_SetBBReg(priv, 0xe74, bMaskDWord, priv->pshare->rf_phy_bb_backup[4] & mask);
|
|
PHY_SetBBReg(priv, 0xe78, bMaskDWord, priv->pshare->rf_phy_bb_backup[5] & mask);
|
|
PHY_SetBBReg(priv, 0xe7c, bMaskDWord, priv->pshare->rf_phy_bb_backup[6] & mask);
|
|
PHY_SetBBReg(priv, 0xe80, bMaskDWord, priv->pshare->rf_phy_bb_backup[7] & mask);
|
|
PHY_SetBBReg(priv, 0xe84, bMaskDWord, priv->pshare->rf_phy_bb_backup[8] & mask);
|
|
PHY_SetBBReg(priv, 0xe88, bMaskDWord, priv->pshare->rf_phy_bb_backup[9] & mask);
|
|
PHY_SetBBReg(priv, 0xe8c, bMaskDWord, priv->pshare->rf_phy_bb_backup[10] & mask);
|
|
PHY_SetBBReg(priv, 0xed0, bMaskDWord, priv->pshare->rf_phy_bb_backup[11] & mask);
|
|
PHY_SetBBReg(priv, 0xed4, bMaskDWord, priv->pshare->rf_phy_bb_backup[12] & mask);
|
|
PHY_SetBBReg(priv, 0xed8, bMaskDWord, priv->pshare->rf_phy_bb_backup[13] & mask);
|
|
PHY_SetBBReg(priv, 0xedc, bMaskDWord, priv->pshare->rf_phy_bb_backup[14] & mask);
|
|
PHY_SetBBReg(priv, 0xee0, bMaskDWord, priv->pshare->rf_phy_bb_backup[15] & mask);
|
|
PHY_SetBBReg(priv, 0xeec, bMaskDWord, priv->pshare->rf_phy_bb_backup[16] & mask);
|
|
PHY_SetBBReg(priv, 0xc04, 0x000000ff, path);
|
|
PHY_SetBBReg(priv, 0xd04, 0x0000000f, path & 0x01);
|
|
PHY_SetBBReg(priv, 0x90c, 0x000000ff, path);
|
|
PHY_SetBBReg(priv, 0x90c, 0x0ff00000, path);
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192C) {
|
|
PHY_SetBBReg(priv, 0x88c, 0x00c00000 , 0x3);
|
|
PHY_SetBBReg(priv, 0x844, bMaskDWord, 0x00010000); // standby
|
|
PHY_SetBBReg(priv, 0x85c, bMaskDWord, 0x00db25a4);
|
|
PHY_SetBBReg(priv, 0xe6c, bMaskDWord, 0x20db25a4);
|
|
PHY_SetBBReg(priv, 0xe70, bMaskDWord, 0x20db25a4);
|
|
PHY_SetBBReg(priv, 0xe74, bMaskDWord, 0x041b25a4);
|
|
PHY_SetBBReg(priv, 0xe78, bMaskDWord, 0x041b25a4);
|
|
PHY_SetBBReg(priv, 0xe7c, bMaskDWord, 0x041b25a4);
|
|
PHY_SetBBReg(priv, 0xe80, bMaskDWord, 0x041b25a4);
|
|
PHY_SetBBReg(priv, 0xe84, bMaskDWord, 0x63db25a4);
|
|
PHY_SetBBReg(priv, 0xe88, bMaskDWord, 0x041b25a4);
|
|
PHY_SetBBReg(priv, 0xe8c, bMaskDWord, 0x20db25a4);
|
|
PHY_SetBBReg(priv, 0xed0, bMaskDWord, 0x20db25a4);
|
|
PHY_SetBBReg(priv, 0xed4, bMaskDWord, 0x20db25a4);
|
|
PHY_SetBBReg(priv, 0xed8, bMaskDWord, 0x20db25a4);
|
|
PHY_SetBBReg(priv, 0xedc, bMaskDWord, 0x001b25a4);
|
|
PHY_SetBBReg(priv, 0xee0, bMaskDWord, 0x001b25a4);
|
|
PHY_SetBBReg(priv, 0xeec, bMaskDWord, 0x24db25a4);
|
|
PHY_SetBBReg(priv, 0xc04, 0x000000ff , 0x11);
|
|
PHY_SetBBReg(priv, 0xd04, 0x0000000f , 0x1);
|
|
PHY_SetBBReg(priv, 0x90c, 0x000000ff , 0x11);
|
|
PHY_SetBBReg(priv, 0x90c, 0x0ff00000 , 0x11);
|
|
PHY_SetBBReg(priv, 0x804, 0x000000f , 0x1);
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E) {
|
|
unsigned int mask = 0xB4FFFFFF;
|
|
int pathB=0;
|
|
if((RTL_R8(0xa07) & 0x80) == 0)
|
|
pathB=1;
|
|
PHY_SetBBReg(priv, 0x85c, bMaskDWord, priv->pshare->rf_phy_bb_backup[1] & mask);
|
|
PHY_SetBBReg(priv, 0xe6c, bMaskDWord, priv->pshare->rf_phy_bb_backup[2] & mask);
|
|
PHY_SetBBReg(priv, 0xe70, bMaskDWord, priv->pshare->rf_phy_bb_backup[3] & mask);
|
|
PHY_SetBBReg(priv, 0xe74, bMaskDWord, priv->pshare->rf_phy_bb_backup[4] & mask);
|
|
PHY_SetBBReg(priv, 0xe78, bMaskDWord, priv->pshare->rf_phy_bb_backup[5] & mask);
|
|
PHY_SetBBReg(priv, 0xe7c, bMaskDWord, priv->pshare->rf_phy_bb_backup[6] & mask);
|
|
PHY_SetBBReg(priv, 0xe80, bMaskDWord, priv->pshare->rf_phy_bb_backup[7] & mask);
|
|
PHY_SetBBReg(priv, 0xe84, bMaskDWord, priv->pshare->rf_phy_bb_backup[8] & mask);
|
|
PHY_SetBBReg(priv, 0xe88, bMaskDWord, priv->pshare->rf_phy_bb_backup[9] & mask);
|
|
PHY_SetBBReg(priv, 0xe8c, bMaskDWord, priv->pshare->rf_phy_bb_backup[10] & mask);
|
|
PHY_SetBBReg(priv, 0xed0, bMaskDWord, priv->pshare->rf_phy_bb_backup[11] & mask);
|
|
PHY_SetBBReg(priv, 0xed4, bMaskDWord, priv->pshare->rf_phy_bb_backup[12] & mask);
|
|
PHY_SetBBReg(priv, 0xed8, bMaskDWord, priv->pshare->rf_phy_bb_backup[13] & mask);
|
|
PHY_SetBBReg(priv, 0xedc, bMaskDWord, priv->pshare->rf_phy_bb_backup[14] & mask);
|
|
PHY_SetBBReg(priv, 0xee0, bMaskDWord, priv->pshare->rf_phy_bb_backup[15] & mask);
|
|
PHY_SetBBReg(priv, 0xeec, bMaskDWord, priv->pshare->rf_phy_bb_backup[16] & mask);
|
|
PHY_SetBBReg(priv, 0xe68, bMaskDWord, priv->pshare->rf_phy_bb_backup[23] & mask);
|
|
|
|
PHY_SetBBReg(priv, 0xc04, 0x000000ff , 0x11);
|
|
PHY_SetBBReg(priv, 0xd04, 0x0000000f , 0x1);
|
|
PHY_SetBBReg(priv, 0x90c, 0x000000ff , 0x11);
|
|
PHY_SetBBReg(priv, 0x90c, 0x0ff00000 , 0x11);
|
|
PHY_SetBBReg(priv, 0xd00, 0x00180000, 0);
|
|
PHY_SetBBReg(priv, 0x82c, (BIT22 | BIT21| BIT20), 1);
|
|
PHY_SetBBReg(priv, 0xa00, BIT7, 0); // ant div disable
|
|
|
|
if(pathB) {
|
|
RTL_W8(0xa07, 0x40);
|
|
PHY_SetBBReg(priv, 0xe74, BIT27, 1);
|
|
|
|
} else {
|
|
RTL_W8(0xa07, 0x80);
|
|
}
|
|
|
|
}
|
|
#endif
|
|
priv->pshare->rf_status= MIMO_1T1R;
|
|
return 1;
|
|
|
|
} else if ((mode == MIMO_2T2R) && (priv->pshare->rf_status == MIMO_1T1R)) {
|
|
//panic_printk("switch to 2x2\n");
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
Assert_BB_Reset(priv);
|
|
RTL_W32(0x808, priv->pshare->rf_phy_bb_backup[0]);
|
|
RTL_W32(0x80c, priv->pshare->rf_phy_bb_backup[1]);
|
|
RTL_W32(0xa04, priv->pshare->rf_phy_bb_backup[2]);
|
|
RTL_W32(0x8bc, priv->pshare->rf_phy_bb_backup[3]);
|
|
RTL_W32(0xe00, priv->pshare->rf_phy_bb_backup[4]);
|
|
RTL_W32(0xe90, priv->pshare->rf_phy_bb_backup[5]);
|
|
RTL_W32(0xe60, priv->pshare->rf_phy_bb_backup[6]);
|
|
RTL_W32(0xe64, priv->pshare->rf_phy_bb_backup[7]);
|
|
Release_BB_Reset(priv);
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192C) {
|
|
PHY_SetBBReg(priv, 0x88c, bMaskDWord, priv->pshare->rf_phy_bb_backup[21]);
|
|
PHY_SetBBReg(priv, 0x844, bMaskDWord, priv->pshare->rf_phy_bb_backup[0]);
|
|
}
|
|
#endif
|
|
#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_WLAN_HAL_8192EE)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192D) || (GET_CHIP_VER(priv) == VERSION_8192C) || (GET_CHIP_VER(priv) == VERSION_8192E)) {
|
|
PHY_SetBBReg(priv, 0x85c, bMaskDWord, priv->pshare->rf_phy_bb_backup[1]);
|
|
PHY_SetBBReg(priv, 0xe6c, bMaskDWord, priv->pshare->rf_phy_bb_backup[2]);
|
|
PHY_SetBBReg(priv, 0xe70, bMaskDWord, priv->pshare->rf_phy_bb_backup[3]);
|
|
PHY_SetBBReg(priv, 0xe74, bMaskDWord, priv->pshare->rf_phy_bb_backup[4]);
|
|
PHY_SetBBReg(priv, 0xe78, bMaskDWord, priv->pshare->rf_phy_bb_backup[5]);
|
|
PHY_SetBBReg(priv, 0xe7c, bMaskDWord, priv->pshare->rf_phy_bb_backup[6]);
|
|
PHY_SetBBReg(priv, 0xe80, bMaskDWord, priv->pshare->rf_phy_bb_backup[7]);
|
|
PHY_SetBBReg(priv, 0xe84, bMaskDWord, priv->pshare->rf_phy_bb_backup[8]);
|
|
PHY_SetBBReg(priv, 0xe88, bMaskDWord, priv->pshare->rf_phy_bb_backup[9]);
|
|
PHY_SetBBReg(priv, 0xe8c, bMaskDWord, priv->pshare->rf_phy_bb_backup[10]);
|
|
PHY_SetBBReg(priv, 0xed0, bMaskDWord, priv->pshare->rf_phy_bb_backup[11]);
|
|
PHY_SetBBReg(priv, 0xed4, bMaskDWord, priv->pshare->rf_phy_bb_backup[12]);
|
|
PHY_SetBBReg(priv, 0xed8, bMaskDWord, priv->pshare->rf_phy_bb_backup[13]);
|
|
PHY_SetBBReg(priv, 0xedc, bMaskDWord, priv->pshare->rf_phy_bb_backup[14]);
|
|
PHY_SetBBReg(priv, 0xee0, bMaskDWord, priv->pshare->rf_phy_bb_backup[15]);
|
|
PHY_SetBBReg(priv, 0xeec, bMaskDWord, priv->pshare->rf_phy_bb_backup[16]);
|
|
PHY_SetBBReg(priv, 0xc04, bMaskDWord , priv->pshare->rf_phy_bb_backup[17]);
|
|
PHY_SetBBReg(priv, 0xd04, bMaskDWord , priv->pshare->rf_phy_bb_backup[18]);
|
|
PHY_SetBBReg(priv, 0x90c, bMaskDWord , priv->pshare->rf_phy_bb_backup[19]);
|
|
PHY_SetBBReg(priv, 0xa04, bMaskDWord , priv->pshare->rf_phy_bb_backup[22]);
|
|
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
if(GET_CHIP_VER(priv) == VERSION_8192E) {
|
|
PHY_SetBBReg(priv, 0xd00, bMaskDWord, priv->pshare->rf_phy_bb_backup[0]);
|
|
PHY_SetBBReg(priv, 0xe68, bMaskDWord , priv->pshare->rf_phy_bb_backup[23]);
|
|
PHY_SetBBReg(priv, 0x82c, bMaskDWord , priv->pshare->rf_phy_bb_backup[24]);
|
|
PHY_SetBBReg(priv, 0xa00, bMaskDWord , priv->pshare->rf_phy_bb_backup[25]);
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192C)
|
|
PHY_SetBBReg(priv, 0x804, bMaskDWord , priv->pshare->rf_phy_bb_backup[20]);
|
|
#endif
|
|
priv->pshare->rf_status = MIMO_2T2R;
|
|
return 1;
|
|
|
|
}
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
#ifdef EN_EFUSE
|
|
#define VOLTAGE_V25 0x03
|
|
|
|
#if defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8192EE)
|
|
#define MAX_2G_CHNLGRP 6
|
|
#define MAX_5G_CHNLGRP 14
|
|
|
|
struct channel_group {
|
|
unsigned char low;
|
|
unsigned char high;
|
|
};
|
|
|
|
static struct channel_group chnl_pwrlvlgp_2G[] = {
|
|
//decrease 1 for array index
|
|
{0, 1},
|
|
{2, 4},
|
|
{5, 7},
|
|
{8, 10},
|
|
{11, 12},
|
|
{13, 13}
|
|
};
|
|
|
|
static struct channel_group chnl_pwrlvlgp_5G[] = {
|
|
//decrease 1 for array index
|
|
{35, 39},
|
|
{43, 47},
|
|
{51, 55},
|
|
{59, 63},
|
|
{99, 103},
|
|
{107, 111},
|
|
{115, 119},
|
|
{123, 127},
|
|
{131, 135},
|
|
{139, 143},
|
|
{148, 152},
|
|
{156, 160},
|
|
{164, 168},
|
|
{172, 176}
|
|
};
|
|
|
|
int find_2gchnlgroup(int chnl)
|
|
{
|
|
int index = 0;
|
|
|
|
for (index = 0; index < MAX_2G_CHNLGRP; index++) {
|
|
if ( (chnl >= chnl_pwrlvlgp_2G[index].low)
|
|
&& (chnl <= chnl_pwrlvlgp_2G[index].high) )
|
|
return index;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
int find_5gchnlgroup(int chnl)
|
|
{
|
|
int index = 0;
|
|
|
|
for (index = 0; index < MAX_5G_CHNLGRP; index++) {
|
|
if ( (chnl >= chnl_pwrlvlgp_5G[index].low)
|
|
&& (chnl <= chnl_pwrlvlgp_5G[index].high) )
|
|
return index;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
void read_efusemap_2gtxpwrdiff(struct rtl8192cd_priv *priv, unsigned int chnl)
|
|
{
|
|
unsigned char *hwinfo = &(priv->EfuseMap[EFUSE_INIT_MAP][0]);
|
|
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
priv->pmib->dot11RFEntry.pwrdiff_20BW1S_OFDM1T_A[chnl]
|
|
= hwinfo[EEPROM_2G_HT201S_TxPowerDiff + PATHA_OFFSET];
|
|
priv->pmib->dot11RFEntry.pwrdiff_40BW2S_20BW2S_A[chnl]
|
|
= hwinfo[EEPROM_2G_HT402S_TxPowerDiff + PATHA_OFFSET];
|
|
priv->pmib->dot11RFEntry.pwrdiff_OFDM2T_CCK2T_A[chnl]
|
|
= hwinfo[EEPROM_2G_OFDM2T_TxPowerDiff + PATHA_OFFSET];
|
|
|
|
priv->pmib->dot11RFEntry.pwrdiff_20BW1S_OFDM1T_B[chnl]
|
|
= hwinfo[EEPROM_2G_HT201S_TxPowerDiff + PATHB_OFFSET];
|
|
priv->pmib->dot11RFEntry.pwrdiff_40BW2S_20BW2S_B[chnl]
|
|
= hwinfo[EEPROM_2G_HT402S_TxPowerDiff + PATHB_OFFSET];
|
|
priv->pmib->dot11RFEntry.pwrdiff_OFDM2T_CCK2T_B[chnl]
|
|
= hwinfo[EEPROM_2G_OFDM2T_TxPowerDiff + PATHB_OFFSET];
|
|
}
|
|
}
|
|
|
|
void read_efusemap_5gtxpwrdiff(struct rtl8192cd_priv *priv, unsigned int chnl)
|
|
{
|
|
unsigned char *hwinfo = &(priv->EfuseMap[EFUSE_INIT_MAP][0]);
|
|
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
priv->pmib->dot11RFEntry.pwrdiff_5G_20BW1S_OFDM1T_A[chnl]
|
|
= hwinfo[EEPROM_5G_HT201S_TxPowerDiff + PATHA_OFFSET];
|
|
priv->pmib->dot11RFEntry.pwrdiff_5G_40BW2S_20BW2S_A[chnl]
|
|
= hwinfo[EEPROM_5G_HT402S_TxPowerDiff + PATHA_OFFSET];
|
|
priv->pmib->dot11RFEntry.pwrdiff_5G_80BW1S_160BW1S_A[chnl]
|
|
= hwinfo[EEPROM_5G_HT801S_TxPowerDiff + PATHA_OFFSET];
|
|
priv->pmib->dot11RFEntry.pwrdiff_5G_80BW2S_160BW2S_A[chnl]
|
|
= hwinfo[EEPROM_5G_HT802S_TxPowerDiff + PATHA_OFFSET];
|
|
|
|
priv->pmib->dot11RFEntry.pwrdiff_5G_20BW1S_OFDM1T_B[chnl]
|
|
= hwinfo[EEPROM_5G_HT201S_TxPowerDiff + PATHB_OFFSET];
|
|
priv->pmib->dot11RFEntry.pwrdiff_5G_40BW2S_20BW2S_B[chnl]
|
|
= hwinfo[EEPROM_5G_HT402S_TxPowerDiff + PATHB_OFFSET];
|
|
priv->pmib->dot11RFEntry.pwrdiff_5G_80BW1S_160BW1S_B[chnl]
|
|
= hwinfo[EEPROM_5G_HT801S_TxPowerDiff + PATHB_OFFSET];
|
|
priv->pmib->dot11RFEntry.pwrdiff_5G_80BW2S_160BW2S_B[chnl]
|
|
= hwinfo[EEPROM_5G_HT802S_TxPowerDiff + PATHB_OFFSET];
|
|
}
|
|
}
|
|
|
|
int clear_5g_pwr_params(struct rtl8192cd_priv *priv, int index)
|
|
{
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_A[index] = 0;
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[index] = 0;
|
|
priv->pmib->dot11RFEntry.pwrdiff_5G_20BW1S_OFDM1T_A[index] = 0;
|
|
priv->pmib->dot11RFEntry.pwrdiff_5G_40BW2S_20BW2S_A[index] = 0;
|
|
priv->pmib->dot11RFEntry.pwrdiff_5G_80BW1S_160BW1S_A[index] = 0;
|
|
priv->pmib->dot11RFEntry.pwrdiff_5G_80BW2S_160BW2S_A[index] = 0;
|
|
|
|
priv->pmib->dot11RFEntry.pwrdiff_5G_20BW1S_OFDM1T_B[index] = 0;
|
|
priv->pmib->dot11RFEntry.pwrdiff_5G_40BW2S_20BW2S_B[index] = 0;
|
|
priv->pmib->dot11RFEntry.pwrdiff_5G_80BW1S_160BW1S_B[index] = 0;
|
|
priv->pmib->dot11RFEntry.pwrdiff_5G_80BW2S_160BW2S_B[index] = 0;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
#endif // CONFIG_RTL_8812_SUPPORT
|
|
#endif // CONFIG_RTL_8812_SUPPORT || CONFIG_WLAN_HAL_8192EE
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
* Function: efuse_PowerSwitch
|
|
*
|
|
* Overview: When we want to enable write operation, we should change to
|
|
* pwr on state. When we stop write, we should switch to 500k mode
|
|
* and disable LDO 2.5V.
|
|
*
|
|
* Input: NONE
|
|
*
|
|
* Output: NONE
|
|
*
|
|
* Return: NONE
|
|
*
|
|
* Revised History:
|
|
* When Who Remark
|
|
* 11/17/2008 MHC Create Version 0.
|
|
*
|
|
*---------------------------------------------------------------------------*/
|
|
static void efuse_PowerSwitch(struct rtl8192cd_priv *priv, unsigned char bWrite, unsigned char PwrState)
|
|
{
|
|
unsigned char tempval;
|
|
short tmpV16;
|
|
if (PwrState == TRUE) {
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
tempval = 0x69;
|
|
RTL_W8(REG_PG_PASSWD_8812, tempval);
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E)
|
|
RTL_W8(REG_EFUSE_ACCESS, EFUSE_ACCESS_ON);
|
|
#endif
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E)
|
|
RTL_W8(REG_EFUSE_ACCESS, EFUSE_ACCESS_ON_8192E);
|
|
#endif
|
|
|
|
// 1.2V Power: From VDDON with Power Cut(0x0000h[15]), defualt valid
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
if (GET_CHIP_VER(priv) != VERSION_8812E)
|
|
#endif
|
|
|
|
{
|
|
tmpV16 = RTL_R16(SYS_ISO_CTRL);
|
|
if (!(tmpV16 & PWC_EV12V)) {
|
|
RTL_W8(0x1c, RTL_R8(0x1c)& ~BIT(1));
|
|
tmpV16 |= PWC_EV12V;
|
|
RTL_W16(SYS_ISO_CTRL, tmpV16);
|
|
RTL_W8(0x1c, RTL_R8(0x1c)|0x02);
|
|
}
|
|
}
|
|
|
|
// Reset: 0x0000h[28], default valid
|
|
tmpV16 = RTL_R16(REG_SYS_FUNC_EN);
|
|
if (!(tmpV16 & FEN_ELDR)) {
|
|
RTL_W8(0x1c, RTL_R8(0x1c)|0x02);
|
|
tmpV16 |= FEN_ELDR;
|
|
RTL_W16(REG_SYS_FUNC_EN, tmpV16);
|
|
RTL_W8(0x1c, RTL_R8(0x1c)|0x02);
|
|
}
|
|
// Clock: Gated(0x0008h[5]) 8M(0x0008h[1]) clock from ANA, default valid
|
|
tmpV16 = RTL_R16(SYS_CLKR);
|
|
if ((!(tmpV16 & LOADER_CLK_EN)) || (!(tmpV16 & ANA8M))) {
|
|
tmpV16 |= (LOADER_CLK_EN | ANA8M);
|
|
RTL_W16(SYS_CLKR, tmpV16);
|
|
}
|
|
|
|
if (bWrite == TRUE) {
|
|
// Enable LDO 2.5V before read/write action
|
|
tempval = RTL_R8(EFUSE_TEST + 3);
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
tempval &= ~(BIT3 | BIT4 | BIT5 | BIT6);
|
|
tempval |= (VOLTAGE_V25 << 3);
|
|
tempval |= BIT7;
|
|
RTL_W8(EFUSE_TEST + 3, tempval);
|
|
} else
|
|
#endif
|
|
{
|
|
tempval &= 0x0F;
|
|
tempval |= (VOLTAGE_V25 << 4);
|
|
RTL_W8(EFUSE_TEST + 3, (tempval | 0x80));
|
|
}
|
|
}
|
|
} else {
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
tempval = 0x0;
|
|
RTL_W8(REG_PG_PASSWD_8812, tempval);
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E)
|
|
RTL_W8(REG_EFUSE_ACCESS, EFUSE_ACCESS_OFF);
|
|
#endif
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E)
|
|
RTL_W8(REG_EFUSE_ACCESS, EFUSE_ACCESS_OFF_8192E);
|
|
#endif
|
|
|
|
|
|
if (bWrite == TRUE) {
|
|
// Disable LDO 2.5V after read/write action
|
|
tempval = RTL_R8(EFUSE_TEST + 3);
|
|
RTL_W8(EFUSE_TEST + 3, (tempval & 0x7F));
|
|
}
|
|
}
|
|
} /* efuse_PowerSwitch */
|
|
|
|
static void ReadEFuseByte(struct rtl8192cd_priv *priv, unsigned short _offset, unsigned char *pbuf)
|
|
{
|
|
unsigned int value32;
|
|
unsigned char readbyte;
|
|
unsigned short retry;
|
|
|
|
#if defined(CONFIG_WLAN_HAL_8192EE)
|
|
if( GET_CHIP_VER(priv) == VERSION_8192E )
|
|
{
|
|
if (!IS_TEST_CHIP(priv) && IS_HARDWARE_TYPE_8192E(priv) &&
|
|
(_GET_HAL_DATA(priv)->cutVersion != ODM_CUT_A) )
|
|
{
|
|
//0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8])
|
|
RTL_W8(EFUSE_TEST + 1, (RTL_R8(EFUSE_TEST + 1) & 0xf7) | (0x00 << 3));
|
|
}
|
|
}
|
|
#endif
|
|
|
|
//Write Address
|
|
RTL_W8(EFUSE_CTRL + 1, (_offset & 0xff));
|
|
readbyte = RTL_R8(EFUSE_CTRL + 2);
|
|
RTL_W8(EFUSE_CTRL + 2, ((_offset >> 8) & 0x03) | (readbyte & 0xfc));
|
|
|
|
//Write bit 32 0
|
|
readbyte = RTL_R8(EFUSE_CTRL + 3);
|
|
RTL_W8(EFUSE_CTRL + 3, 0x72); //read cmd
|
|
//RTL_W8(EFUSE_CTRL+3, (readbyte & 0x7f));
|
|
|
|
//Check bit 32 read-ready
|
|
retry = 0;
|
|
value32 = RTL_R32(EFUSE_CTRL);
|
|
|
|
while (!(((value32 >> 24) & 0xff) & 0x80) && (retry < 10000)) {
|
|
value32 = RTL_R32(EFUSE_CTRL);
|
|
retry++;
|
|
}
|
|
|
|
// 20100205 Joseph: Add delay suggested by SD1 Victor.
|
|
// This fix the problem that Efuse read error in high temperature condition.
|
|
// Designer says that there shall be some delay after ready bit is set, or the
|
|
// result will always stay on last data we read.
|
|
delay_us(50);
|
|
value32 = RTL_R32(EFUSE_CTRL);
|
|
|
|
*pbuf = (unsigned char)(value32 & 0xff);
|
|
} /* ReadEFuseByte */
|
|
|
|
|
|
//
|
|
// Description:
|
|
// 1. Execute E-Fuse read byte operation according as map offset and
|
|
// save to E-Fuse table.
|
|
// 2. Refered from SD1 Richard.
|
|
//
|
|
// Assumption:
|
|
// 1. Boot from E-Fuse and successfully auto-load.
|
|
// 2. PASSIVE_LEVEL (USB interface)
|
|
//
|
|
// Created by Roger, 2008.10.21.
|
|
// 2008/12/12 MH 1. Reorganize code flow and reserve bytes. and add description.
|
|
// 2. Add efuse utilization collect.
|
|
// 2008/12/22 MH Read Efuse must check if we write section 1 data again!!! Sec1
|
|
// write addr must be after sec5.
|
|
//
|
|
static void ReadEFuse(struct rtl8192cd_priv *priv, unsigned short _offset, int _size_byte, unsigned char *pbuf)
|
|
{
|
|
unsigned char efuseTbl[priv->EfuseMapLen];
|
|
unsigned char rtemp8[1];
|
|
unsigned short eFuse_Addr = 0;
|
|
unsigned char offset, wren;
|
|
unsigned short i, j;
|
|
unsigned short eFuseWord[priv->EfuseMaxSection][EFUSE_MAX_WORD_UNIT];
|
|
unsigned short efuse_utilized = 0;
|
|
#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8192EE)
|
|
UINT8 bSupportExtendHdr = ((GET_CHIP_VER(priv) == VERSION_8192D) || (GET_CHIP_VER(priv) == VERSION_8188E)
|
|
|| (GET_CHIP_VER(priv) == VERSION_8192E) || (GET_CHIP_VER(priv) == VERSION_8812E));
|
|
#endif
|
|
|
|
//
|
|
// Do NOT excess total size of EFuse table. Added by Roger, 2008.11.10.
|
|
//
|
|
if ((_offset + _size_byte) > priv->EfuseMapLen) {
|
|
// total E-Fuse table is 128bytes
|
|
DEBUG_INFO("ReadEFuse(): Invalid offset(%#x) with read bytes(%#x)!!\n", _offset, _size_byte);
|
|
return;
|
|
}
|
|
|
|
// 0. Refresh efuse init map as all oxFF.
|
|
for (i = 0; i < priv->EfuseMaxSection; i++)
|
|
for (j = 0; j < EFUSE_MAX_WORD_UNIT; j++)
|
|
eFuseWord[i][j] = 0xFFFF;
|
|
|
|
//
|
|
// 1. Read the first byte to check if efuse is empty!!!
|
|
//
|
|
//
|
|
ReadEFuseByte(priv, eFuse_Addr, rtemp8);
|
|
if (*rtemp8 != 0xFF) {
|
|
efuse_utilized++;
|
|
eFuse_Addr++;
|
|
} else {
|
|
//RTPRINT(FEEPROM, EFUSE_READ_ALL, ("EFUSE is empty efuse_Addr-%d efuse_data=%x\n", eFuse_Addr, *rtemp8));
|
|
return;
|
|
}
|
|
|
|
//
|
|
// 2. Read real efuse content. Filter PG header and every section data.
|
|
//
|
|
while ((*rtemp8 != 0xFF) && (eFuse_Addr < priv->EfuseRealContentLen)) {
|
|
|
|
#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8192EE)
|
|
// Check PG header for section num.
|
|
if (bSupportExtendHdr && ((*rtemp8 & 0x1F) == 0x0F)) { //extended header
|
|
unsigned char u1temp = ((*rtemp8 & 0xE0) >> 5);
|
|
ReadEFuseByte(priv, eFuse_Addr, rtemp8);
|
|
if ((*rtemp8 & 0x0F) == 0x0F) {
|
|
eFuse_Addr++;
|
|
ReadEFuseByte(priv, eFuse_Addr, rtemp8);
|
|
if (*rtemp8 != 0xFF && (eFuse_Addr < priv->EfuseRealContentLen)) {
|
|
eFuse_Addr++;
|
|
}
|
|
break;
|
|
} else {
|
|
offset = ((*rtemp8 & 0xF0) >> 1) | u1temp;
|
|
wren = (*rtemp8 & 0x0F);
|
|
eFuse_Addr++;
|
|
}
|
|
} else
|
|
#endif
|
|
{
|
|
offset = ((*rtemp8 >> 4) & 0x0f);
|
|
wren = (*rtemp8 & 0x0f);
|
|
}
|
|
|
|
if (offset < priv->EfuseMaxSection) {
|
|
for (i = 0; i < EFUSE_MAX_WORD_UNIT; i++) {
|
|
// Check word enable condition in the section
|
|
if (!(wren & 0x01)) {
|
|
ReadEFuseByte(priv, eFuse_Addr, rtemp8);
|
|
DEBUG_INFO("ReadEFuse, Addr=%x, %02x\n", eFuse_Addr, *rtemp8);
|
|
eFuse_Addr++;
|
|
efuse_utilized++;
|
|
eFuseWord[offset][i] = (*rtemp8 & 0xff);
|
|
if (eFuse_Addr >= priv->EfuseRealContentLen)
|
|
break;
|
|
ReadEFuseByte(priv, eFuse_Addr, rtemp8);
|
|
DEBUG_INFO("ReadEFuse, Addr=%x, %02x\n", eFuse_Addr, *rtemp8);
|
|
eFuse_Addr++;
|
|
efuse_utilized++;
|
|
eFuseWord[offset][i] |= (((UINT16) * rtemp8 << 8) & 0xff00);
|
|
if (eFuse_Addr >= priv->EfuseRealContentLen)
|
|
break;
|
|
}
|
|
wren >>= 1;
|
|
}
|
|
}
|
|
|
|
// Read next PG header
|
|
ReadEFuseByte(priv, eFuse_Addr, rtemp8);
|
|
if (*rtemp8 != 0xFF && (eFuse_Addr < priv->EfuseRealContentLen)) {
|
|
efuse_utilized++;
|
|
DEBUG_INFO("ReadEFuse, Addr=%x, %02x\n", eFuse_Addr, *rtemp8);
|
|
eFuse_Addr++;
|
|
}
|
|
}
|
|
|
|
//
|
|
// 3. Collect 16 sections and 4 word unit into Efuse map.
|
|
//
|
|
for (i = 0; i < priv->EfuseMaxSection; i++) {
|
|
for (j = 0; j < EFUSE_MAX_WORD_UNIT; j++) {
|
|
efuseTbl[(i << 3) + (j << 1)] = (eFuseWord[i][j] & 0xff);
|
|
efuseTbl[(i << 3) + (j << 1) + 1] = ((eFuseWord[i][j] >> 8) & 0xff);
|
|
}
|
|
}
|
|
|
|
//
|
|
// 4. Copy from Efuse map to output pointer memory!!!
|
|
//
|
|
for (i = 0; i < _size_byte; i++) {
|
|
pbuf[i] = efuseTbl[_offset + i];
|
|
}
|
|
|
|
//
|
|
// 5. Calculate Efuse utilization.
|
|
//
|
|
//efuse_usage = (unsigned char)((efuse_utilized*100)/priv->EfuseRealContentLen);
|
|
priv->EfuseUsedBytes = efuse_utilized;
|
|
|
|
}
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
* Function: efuse_ReadAllMap
|
|
*
|
|
* Overview: Read All Efuse content
|
|
*
|
|
* Input: NONE
|
|
*
|
|
* Output: NONE
|
|
*
|
|
* Return: NONE
|
|
*
|
|
* Revised History:
|
|
* When Who Remark
|
|
* 11/11/2008 MHC Create Version 0.
|
|
*
|
|
*---------------------------------------------------------------------------*/
|
|
static void efuse_ReadAllMap(struct rtl8192cd_priv *priv, unsigned char *Efuse)
|
|
{
|
|
//
|
|
// We must enable clock and LDO 2.5V otherwise, read all map will be fail!!!!
|
|
//
|
|
efuse_PowerSwitch(priv, FALSE, TRUE);
|
|
ReadEFuse(priv, 0, priv->EfuseMapLen, Efuse);
|
|
efuse_PowerSwitch(priv, FALSE, FALSE);
|
|
}
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
* Function: EFUSE_ShadowMapUpdate
|
|
*
|
|
* Overview: Transfer current EFUSE content to shadow init and modify map.
|
|
*
|
|
* Input: NONE
|
|
*
|
|
* Output: NONE
|
|
*
|
|
* Return: NONE
|
|
*
|
|
* Revised History:
|
|
* When Who Remark
|
|
* 11/13/2008 MHC Create Version 0.
|
|
*
|
|
*---------------------------------------------------------------------------*/
|
|
static void EFUSE_ShadowMapUpdate(struct rtl8192cd_priv *priv)
|
|
{
|
|
/*
|
|
if (priv->AutoloadFailFlag == TRUE ) {
|
|
DEBUG_INFO("AutoloadFailFlag=TRUE");
|
|
memset((&priv->EfuseMap[EFUSE_INIT_MAP][0]), 0xFF, 128);
|
|
} else
|
|
*/
|
|
{
|
|
efuse_ReadAllMap(priv, &priv->EfuseMap[EFUSE_INIT_MAP][0]);
|
|
}
|
|
|
|
memcpy(&priv->EfuseMap[EFUSE_MODIFY_MAP][0],
|
|
&priv->EfuseMap[EFUSE_INIT_MAP][0], priv->EfuseMapLen);
|
|
|
|
}
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
static void ReadTxPowerInfoFromHWPG_8188E(struct rtl8192cd_priv *priv)
|
|
{
|
|
const int MAX_CHNL_GROUP_24G_88E = 6; // ch1~2, ch3~5, ch6~8,ch9~11,ch12~13,CH 14 total six groups
|
|
const int chnl_group[MAX_2G_CHANNEL_NUM] = {0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5};
|
|
|
|
unsigned int eeAddr = EEPROM_TX_PWR_INX_88E;
|
|
unsigned char *hwinfo = &(priv->EfuseMap[EFUSE_INIT_MAP][0]);
|
|
|
|
u8 IndexCCK_Base[MAX_CHNL_GROUP_24G_88E];
|
|
u8 IndexBW40_Base[MAX_CHNL_GROUP_24G_88E-1];
|
|
//If only one tx, only BW20 and OFDM are used.
|
|
u8 OFDM_Diff, BW20_Diff;
|
|
u8 group, ch, index;
|
|
|
|
// if (!isPGValueValid(priv, hwinfo))
|
|
// return;
|
|
|
|
if (/*priv->AutoloadFailFlag==FALSE &&*/ priv->pmib->efuseEntry.enable_efuse==1) {
|
|
for (group = 0 ; group < MAX_CHNL_GROUP_24G_88E; ++group) {
|
|
IndexCCK_Base[group] = hwinfo[eeAddr++];
|
|
}
|
|
|
|
for (group = 0 ; group < MAX_CHNL_GROUP_24G_88E-1; ++group) {
|
|
IndexBW40_Base[group] = hwinfo[eeAddr++];
|
|
}
|
|
|
|
BW20_Diff = (hwinfo[eeAddr] & 0xf0) >> 4; // 4-bit field and MSB(bit3) is sign number
|
|
OFDM_Diff = (hwinfo[eeAddr] & 0x0f); // 4-bit field and MSB(bit3) is sign number
|
|
eeAddr++;
|
|
|
|
for (ch = 1; ch <= MAX_2G_CHANNEL_NUM; ++ch)
|
|
{
|
|
index = ch -1;
|
|
group = chnl_group[index];
|
|
|
|
priv->pmib->dot11RFEntry.pwrlevelCCK_A[index] = IndexCCK_Base[group];
|
|
|
|
if (ch == 14)
|
|
priv->pmib->dot11RFEntry.pwrlevelHT40_1S_A[index] = IndexBW40_Base[4];
|
|
else
|
|
priv->pmib->dot11RFEntry.pwrlevelHT40_1S_A[index] = IndexBW40_Base[group];
|
|
}
|
|
|
|
memset(priv->pmib->dot11RFEntry.pwrdiffHT20, BW20_Diff, sizeof(priv->pmib->dot11RFEntry.pwrdiffHT20));
|
|
memset(priv->pmib->dot11RFEntry.pwrdiffOFDM, OFDM_Diff, sizeof(priv->pmib->dot11RFEntry.pwrdiffOFDM));
|
|
memset(priv->pmib->dot11RFEntry.pwrlevelCCK_B, 0x00, sizeof(priv->pmib->dot11RFEntry.pwrlevelCCK_B));
|
|
memset(priv->pmib->dot11RFEntry.pwrlevelHT40_1S_B, 0x00, sizeof(priv->pmib->dot11RFEntry.pwrlevelHT40_1S_B));
|
|
memset(priv->pmib->dot11RFEntry.pwrdiffHT40_2S, 0x00, sizeof(priv->pmib->dot11RFEntry.pwrdiffHT40_2S));
|
|
|
|
DEBUG_INFO("EFUSE Autoload success!\n");
|
|
}
|
|
}
|
|
#endif // CONFIG_RTL_88E_SUPPORT
|
|
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
static void ReadTxPowerInfoFromHWPG_8192E(struct rtl8192cd_priv *priv)
|
|
{
|
|
int i, ch_gp;
|
|
unsigned char *hwinfo = &(priv->EfuseMap[EFUSE_INIT_MAP][0]);
|
|
|
|
if ( GET_CHIP_VER(priv)==VERSION_8192E )
|
|
{
|
|
for (i=0; i<MAX_2G_CHANNEL_NUM; i++)
|
|
{
|
|
ch_gp = find_2gchnlgroup(i);
|
|
|
|
if(ch_gp > -1)
|
|
{
|
|
if (hwinfo[EEPROM_2G_CCK1T_TxPower+PATHA_OFFSET+ch_gp] <= 63 )
|
|
priv->pmib->dot11RFEntry.pwrlevelCCK_A[i]= hwinfo[EEPROM_2G_CCK1T_TxPower+PATHA_OFFSET+ch_gp];
|
|
else
|
|
priv->pmib->dot11RFEntry.pwrlevelCCK_A[i]= 0;
|
|
if (hwinfo[EEPROM_2G_CCK1T_TxPower+PATHB_OFFSET+ch_gp] <= 63 )
|
|
priv->pmib->dot11RFEntry.pwrlevelCCK_B[i]= hwinfo[EEPROM_2G_CCK1T_TxPower+PATHB_OFFSET+ch_gp];
|
|
else
|
|
priv->pmib->dot11RFEntry.pwrlevelCCK_B[i]= 0;
|
|
|
|
if (i==13)//ch 14
|
|
ch_gp -= 1;
|
|
|
|
if (hwinfo[EEPROM_2G_HT401S_TxPower+PATHA_OFFSET+ch_gp] <= 63 )
|
|
priv->pmib->dot11RFEntry.pwrlevelHT40_1S_A[i] = hwinfo[EEPROM_2G_HT401S_TxPower+PATHA_OFFSET+ch_gp];
|
|
else
|
|
priv->pmib->dot11RFEntry.pwrlevelHT40_1S_A[i] = 0;
|
|
if (hwinfo[EEPROM_2G_HT401S_TxPower+PATHB_OFFSET+ch_gp] <= 63 )
|
|
priv->pmib->dot11RFEntry.pwrlevelHT40_1S_B[i] = hwinfo[EEPROM_2G_HT401S_TxPower+PATHB_OFFSET+ch_gp];
|
|
else
|
|
priv->pmib->dot11RFEntry.pwrlevelHT40_1S_B[i] = 0;
|
|
}
|
|
|
|
if (priv->pmib->dot11RFEntry.pwrlevelCCK_A[0] != 0)
|
|
{
|
|
priv->pmib->dot11RFEntry.pwrdiffHT40_2S[i] = ((hwinfo[EEPROM_2G_HT402S_TxPowerDiff+PATHA_OFFSET] & 0xf0) >> 4) |
|
|
(hwinfo[EEPROM_2G_HT402S_TxPowerDiff+PATHB_OFFSET] & 0xf0);
|
|
priv->pmib->dot11RFEntry.pwrdiffHT20[i] = ((hwinfo[EEPROM_2G_HT201S_TxPowerDiff+PATHA_OFFSET] & 0xf0) >> 4) |
|
|
(hwinfo[EEPROM_2G_HT201S_TxPowerDiff+PATHB_OFFSET] & 0xf0);
|
|
priv->pmib->dot11RFEntry.pwrdiffOFDM[i] = (hwinfo[EEPROM_2G_OFDM1T_TxPowerDiff+PATHA_OFFSET] & 0x0f) |
|
|
((hwinfo[EEPROM_2G_OFDM1T_TxPowerDiff+PATHB_OFFSET] & 0x0f) << 4);
|
|
}
|
|
else
|
|
{
|
|
priv->pmib->dot11RFEntry.pwrdiffHT40_2S[i] = 0;
|
|
priv->pmib->dot11RFEntry.pwrdiffHT20[i] = 0;
|
|
priv->pmib->dot11RFEntry.pwrdiffOFDM[i] = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
#if 0
|
|
const int MAX_CHNL_GROUP_24G_92E = 6; // ch1~2, ch3~5, ch6~8,ch9~11,ch12~13,CH 14 total six groups
|
|
const int chnl_group[MAX_2G_CHANNEL_NUM] = {0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5};
|
|
|
|
unsigned int eeAddr_A = EEPROM_TX_PWR_INX_8192E+PATHA_OFFSET, eeAddr_B = EEPROM_TX_PWR_INX_8192E+PATHB_OFFSET;
|
|
unsigned char *hwinfo = &(priv->EfuseMap[EFUSE_INIT_MAP][0]);
|
|
|
|
u8 IndexCCK_Base_A[MAX_CHNL_GROUP_24G_92E], IndexCCK_Base_B[MAX_CHNL_GROUP_24G_92E];
|
|
u8 IndexBW40_Base_A[MAX_CHNL_GROUP_24G_92E-1], IndexBW40_Base_B[MAX_CHNL_GROUP_24G_92E-1];
|
|
//If only one tx, only BW20 and OFDM are used.
|
|
u8 OFDM_Diff, BW20_Diff, BW40_2S_DIFF, BW20_2S_DIFF;
|
|
u8 group, ch, index;
|
|
|
|
// if (!isPGValueValid(priv, hwinfo))
|
|
// return;
|
|
|
|
if (/*priv->AutoloadFailFlag==FALSE &&*/ priv->pmib->efuseEntry.enable_efuse==1) {
|
|
for (group = 0 ; group < MAX_CHNL_GROUP_24G_92E; ++group) {
|
|
IndexCCK_Base_A[group] = hwinfo[eeAddr_A++];
|
|
IndexCCK_Base_B[group] = hwinfo[eeAddr_B++];
|
|
}
|
|
|
|
for (group = 0 ; group < MAX_CHNL_GROUP_24G_92E-1; ++group) {
|
|
IndexBW40_Base_A[group] = hwinfo[eeAddr_A++];
|
|
IndexBW40_Base_B[group] = hwinfo[eeAddr_B++];
|
|
}
|
|
|
|
BW20_Diff = (hwinfo[eeAddr_A] & 0xf0) >> 4; // 4-bit field and MSB(bit3) is sign number
|
|
OFDM_Diff = (hwinfo[eeAddr_A] & 0x0f); // 4-bit field and MSB(bit3) is sign number
|
|
|
|
eeAddr_A++;
|
|
|
|
BW40_2S_DIFF = (hwinfo[eeAddr_A] & 0xf0) >> 4; // 4-bit field and MSB(bit3) is sign number
|
|
BW20_2S_DIFF = (hwinfo[eeAddr_A] & 0x0f); // 4-bit field and MSB(bit3) is sign number
|
|
|
|
for (ch = 1; ch <= MAX_2G_CHANNEL_NUM; ++ch)
|
|
{
|
|
index = ch -1;
|
|
group = chnl_group[index];
|
|
|
|
priv->pmib->dot11RFEntry.pwrlevelCCK_A[index] = IndexCCK_Base_A[group];
|
|
priv->pmib->dot11RFEntry.pwrlevelCCK_B[index] = IndexCCK_Base_B[group];
|
|
|
|
if (ch == 14){
|
|
priv->pmib->dot11RFEntry.pwrlevelHT40_1S_A[index] = IndexBW40_Base_A[4];
|
|
priv->pmib->dot11RFEntry.pwrlevelHT40_1S_B[index] = IndexBW40_Base_B[4];
|
|
}
|
|
else{
|
|
priv->pmib->dot11RFEntry.pwrlevelHT40_1S_A[index] = IndexBW40_Base_A[group];
|
|
priv->pmib->dot11RFEntry.pwrlevelHT40_1S_B[index] = IndexBW40_Base_B[group];
|
|
}
|
|
}
|
|
|
|
memset(priv->pmib->dot11RFEntry.pwrdiffHT20, BW20_Diff, sizeof(priv->pmib->dot11RFEntry.pwrdiffHT20));
|
|
memset(priv->pmib->dot11RFEntry.pwrdiffOFDM, OFDM_Diff, sizeof(priv->pmib->dot11RFEntry.pwrdiffOFDM));
|
|
memset(priv->pmib->dot11RFEntry.pwrdiffHT40_2S, BW40_2S_DIFF, sizeof(priv->pmib->dot11RFEntry.pwrdiffHT40_2S));
|
|
|
|
DEBUG_INFO("EFUSE Autoload success!\n");
|
|
}
|
|
#endif
|
|
}
|
|
#endif // CONFIG_WLAN_HAL_8192EE
|
|
|
|
static int isPGValueValid(struct rtl8192cd_priv *priv, unsigned char *hwinfo)
|
|
{
|
|
int j=0;
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188C) || (GET_CHIP_VER(priv) == VERSION_8192C)) {
|
|
for (j = EEPROM_TxPowerCCK; j < EEPROM_TxPowerCCK + 3; j++) {
|
|
if (hwinfo[j] > 63)
|
|
return 0;
|
|
}
|
|
for (j = EEPROM_TxPowerHT40_1S; j < EEPROM_TxPowerHT40_1S + 3; j++) {
|
|
if (hwinfo[j] > 63)
|
|
return 0;
|
|
}
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
for (j = EEPROM_2G_TxPowerCCK; j < EEPROM_2G_TxPowerCCK + 3; j++) {
|
|
if (hwinfo[j] > 63)
|
|
return 0;
|
|
}
|
|
for (j = EEPROM_2G_TxPowerHT40_1S; j < EEPROM_2G_TxPowerHT40_1S + 3; j++) {
|
|
if (hwinfo[j] > 63)
|
|
return 0;
|
|
}
|
|
for (j = EEPROM_5GL_TxPowerHT40_1S; j < EEPROM_5GL_TxPowerHT40_1S + 3; j++) {
|
|
if (hwinfo[j] > 63)
|
|
return 0;
|
|
}
|
|
for (j = EEPROM_5GM_TxPowerHT40_1S; j < EEPROM_5GM_TxPowerHT40_1S + 3; j++) {
|
|
if (hwinfo[j] > 63)
|
|
return 0;
|
|
}
|
|
for (j = EEPROM_5GH_TxPowerHT40_1S; j < EEPROM_5GH_TxPowerHT40_1S + 3; j++) {
|
|
if (hwinfo[j] > 63)
|
|
return 0;
|
|
}
|
|
}
|
|
#endif // CONFIG_RTL_92D_SUPPORT
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
for (j = EEPROM_TX_PWR_INX_88E; j < EEPROM_TX_PWR_INX_88E+11; j++) {
|
|
if (hwinfo[j] > 63)
|
|
return 0;
|
|
}
|
|
}
|
|
#endif // CONFIG_RTL_88E_SUPPORT
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E) {
|
|
for (j = EEPROM_2G_CCK1T_TxPower+PATHA_OFFSET; j < EEPROM_2G_CCK1T_TxPower+PATHA_OFFSET+11; j++) { // path A CCK and HT40-1S
|
|
if (hwinfo[j] > 63){
|
|
return 0;
|
|
}
|
|
}
|
|
for (j = EEPROM_2G_CCK1T_TxPower+PATHB_OFFSET; j < EEPROM_2G_CCK1T_TxPower+PATHB_OFFSET+11; j++) { // path B CCK and HT40-1S
|
|
if (hwinfo[j] > 63)
|
|
return 0;
|
|
}
|
|
}
|
|
#endif // CONFIG_WLAN_HAL_8192EE
|
|
return 1;
|
|
}
|
|
|
|
|
|
void ReadTxPowerInfoFromHWPG(struct rtl8192cd_priv *priv)
|
|
{
|
|
unsigned char *hwinfo = &(priv->EfuseMap[EFUSE_INIT_MAP][0]);
|
|
int i;
|
|
|
|
if (!isPGValueValid(priv, hwinfo))
|
|
return;
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
ReadTxPowerInfoFromHWPG_8188E(priv);
|
|
return;
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E) {
|
|
ReadTxPowerInfoFromHWPG_8192E(priv);
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
if (/*priv->AutoloadFailFlag==FALSE &&*/ priv->pmib->efuseEntry.enable_efuse == 1) {
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
if ( GET_CHIP_VER(priv) == VERSION_8812E ) {
|
|
for (i = 0; i < MAX_2G_CHANNEL_NUM; i++) {
|
|
int ch_gp = -1;
|
|
ch_gp = find_2gchnlgroup(i);
|
|
|
|
if (ch_gp > -1) {
|
|
priv->pmib->dot11RFEntry.pwrlevelCCK_A[i] = hwinfo[EEPROM_2G_CCK1T_TxPower + PATHA_OFFSET + ch_gp];
|
|
priv->pmib->dot11RFEntry.pwrlevelCCK_B[i] = hwinfo[EEPROM_2G_CCK1T_TxPower + PATHB_OFFSET + ch_gp];
|
|
priv->pmib->dot11RFEntry.pwrlevelHT40_1S_A[i] = hwinfo[EEPROM_2G_HT401S_TxPower + PATHA_OFFSET + ch_gp];
|
|
priv->pmib->dot11RFEntry.pwrlevelHT40_1S_B[i] = hwinfo[EEPROM_2G_HT401S_TxPower + PATHB_OFFSET + ch_gp];
|
|
|
|
read_efusemap_2gtxpwrdiff(priv, i);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < MAX_5G_CHANNEL_NUM; i++) {
|
|
int ch_gp = -1;
|
|
ch_gp = find_5gchnlgroup(i);
|
|
|
|
if (ch_gp > -1) {
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_A[i] = hwinfo[EEPROM_5G_HT401S_TxPower + PATHA_OFFSET + ch_gp];
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[i] = hwinfo[EEPROM_5G_HT401S_TxPower + PATHB_OFFSET + ch_gp];
|
|
|
|
read_efusemap_5gtxpwrdiff(priv, i);
|
|
} else {
|
|
clear_5g_pwr_params(priv, i);
|
|
}
|
|
}
|
|
} else
|
|
#endif //#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
{
|
|
#if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT)
|
|
u8 TxPwrCCK = 0, TxPwrHT40_1S = 0, TxPwrHT40_2SDiff = 0, TxPwrHT20Diff = 0, TxPwrOFDMDiff = 0;
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188C) || (GET_CHIP_VER(priv) == VERSION_8192C)) {
|
|
TxPwrCCK = EEPROM_TxPowerCCK;
|
|
TxPwrHT40_1S = EEPROM_TxPowerHT40_1S;
|
|
TxPwrHT40_2SDiff = EEPROM_TxPowerHT40_2SDiff;
|
|
TxPwrHT20Diff = EEPROM_TxPowerHT20Diff;
|
|
TxPwrOFDMDiff = EEPROM_TxPowerOFDMDiff;
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
// 2.4G Setting
|
|
TxPwrCCK = EEPROM_2G_TxPowerCCK;
|
|
TxPwrHT40_1S = EEPROM_2G_TxPowerHT40_1S;
|
|
TxPwrHT40_2SDiff = EEPROM_2G_TxPowerHT40_2SDiff;
|
|
TxPwrHT20Diff = EEPROM_2G_TxPowerHT20Diff;
|
|
TxPwrOFDMDiff = EEPROM_2G_TxPowerOFDMDiff;
|
|
|
|
// 5G Setting
|
|
for (i = 0; i < MAX_5G_CHANNEL_NUM; i++) {
|
|
if (i >= 35 && i <= 63) { // ch 36 ~ 64
|
|
if (i >= 35 && i <= 43) { // ch 36 ~ 44
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_A[i] = hwinfo[EEPROM_5GL_TxPowerHT40_1S];
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[i] = hwinfo[EEPROM_5GL_TxPowerHT40_1S + 3];
|
|
|
|
priv->pmib->dot11RFEntry.pwrdiff5GHT40_2S[i] = hwinfo[EEPROM_5GL_TxPowerHT40_2SDiff];
|
|
priv->pmib->dot11RFEntry.pwrdiff5GHT20[i] = hwinfo[EEPROM_5GL_TxPowerHT20Diff];
|
|
priv->pmib->dot11RFEntry.pwrdiff5GOFDM[i] = hwinfo[EEPROM_5GL_TxPowerOFDMDiff];
|
|
} else if (i >= 45 && i <= 53) { // ch 46 ~ 54
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_A[i] = hwinfo[EEPROM_5GL_TxPowerHT40_1S + 1];
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[i] = hwinfo[EEPROM_5GL_TxPowerHT40_1S + 4];
|
|
|
|
priv->pmib->dot11RFEntry.pwrdiff5GHT40_2S[i] = hwinfo[EEPROM_5GL_TxPowerHT40_2SDiff + 1];
|
|
priv->pmib->dot11RFEntry.pwrdiff5GHT20[i] = hwinfo[EEPROM_5GL_TxPowerHT20Diff + 1];
|
|
priv->pmib->dot11RFEntry.pwrdiff5GOFDM[i] = hwinfo[EEPROM_5GL_TxPowerOFDMDiff + 1];
|
|
} else if (i >= 55 && i <= 63) { // ch 56 ~ 64
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_A[i] = hwinfo[EEPROM_5GL_TxPowerHT40_1S + 2];
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[i] = hwinfo[EEPROM_5GL_TxPowerHT40_1S + 5];
|
|
|
|
priv->pmib->dot11RFEntry.pwrdiff5GHT40_2S[i] = hwinfo[EEPROM_5GL_TxPowerHT40_2SDiff + 2];
|
|
priv->pmib->dot11RFEntry.pwrdiff5GHT20[i] = hwinfo[EEPROM_5GL_TxPowerHT20Diff + 2];
|
|
priv->pmib->dot11RFEntry.pwrdiff5GOFDM[i] = hwinfo[EEPROM_5GL_TxPowerOFDMDiff + 2];
|
|
} else {
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_A[i] = 0;
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[i] = 0;
|
|
|
|
priv->pmib->dot11RFEntry.pwrdiff5GHT40_2S[i] = 0;
|
|
priv->pmib->dot11RFEntry.pwrdiff5GHT20[i] = 0;
|
|
priv->pmib->dot11RFEntry.pwrdiff5GOFDM[i] = 0;
|
|
}
|
|
} else if (i >= 99 && i <= 139) { // ch 100 ~ 140
|
|
if (i >= 99 && i <= 111) { // ch 100 ~ 112
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_A[i] = hwinfo[EEPROM_5GM_TxPowerHT40_1S];
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[i] = hwinfo[EEPROM_5GM_TxPowerHT40_1S + 3];
|
|
|
|
priv->pmib->dot11RFEntry.pwrdiff5GHT40_2S[i] = hwinfo[EEPROM_5GM_TxPowerHT40_2SDiff];
|
|
priv->pmib->dot11RFEntry.pwrdiff5GHT20[i] = hwinfo[EEPROM_5GM_TxPowerHT20Diff];
|
|
priv->pmib->dot11RFEntry.pwrdiff5GOFDM[i] = hwinfo[EEPROM_5GM_TxPowerOFDMDiff];
|
|
} else if (i >= 113 && i <= 125) { // ch 114 ~ 126
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_A[i] = hwinfo[EEPROM_5GM_TxPowerHT40_1S + 1];
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[i] = hwinfo[EEPROM_5GM_TxPowerHT40_1S + 4];
|
|
|
|
priv->pmib->dot11RFEntry.pwrdiff5GHT40_2S[i] = hwinfo[EEPROM_5GM_TxPowerHT40_2SDiff + 1];
|
|
priv->pmib->dot11RFEntry.pwrdiff5GHT20[i] = hwinfo[EEPROM_5GM_TxPowerHT20Diff + 1];
|
|
priv->pmib->dot11RFEntry.pwrdiff5GOFDM[i] = hwinfo[EEPROM_5GM_TxPowerOFDMDiff + 1];
|
|
} else if (i >= 127 && i <= 139) { // ch 128 ~ 140
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_A[i] = hwinfo[EEPROM_5GM_TxPowerHT40_1S + 2];
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[i] = hwinfo[EEPROM_5GM_TxPowerHT40_1S + 5];
|
|
|
|
priv->pmib->dot11RFEntry.pwrdiff5GHT40_2S[i] = hwinfo[EEPROM_5GM_TxPowerHT40_2SDiff + 2];
|
|
priv->pmib->dot11RFEntry.pwrdiff5GHT20[i] = hwinfo[EEPROM_5GM_TxPowerHT20Diff + 2];
|
|
priv->pmib->dot11RFEntry.pwrdiff5GOFDM[i] = hwinfo[EEPROM_5GM_TxPowerOFDMDiff + 2];
|
|
} else {
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_A[i] = 0;
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[i] = 0;
|
|
|
|
priv->pmib->dot11RFEntry.pwrdiff5GHT40_2S[i] = 0;
|
|
priv->pmib->dot11RFEntry.pwrdiff5GHT20[i] = 0;
|
|
priv->pmib->dot11RFEntry.pwrdiff5GOFDM[i] = 0;
|
|
}
|
|
} else if (i >= 148 && i <= 164 ) { // ch 149 ~ 165
|
|
if (i >= 148 && i <= 152) { // ch 149 ~ 153
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_A[i] = hwinfo[EEPROM_5GH_TxPowerHT40_1S];
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[i] = hwinfo[EEPROM_5GH_TxPowerHT40_1S + 3];
|
|
|
|
priv->pmib->dot11RFEntry.pwrdiff5GHT40_2S[i] = hwinfo[EEPROM_5GH_TxPowerHT40_2SDiff];
|
|
priv->pmib->dot11RFEntry.pwrdiff5GHT20[i] = hwinfo[EEPROM_5GH_TxPowerHT20Diff];
|
|
priv->pmib->dot11RFEntry.pwrdiff5GOFDM[i] = hwinfo[EEPROM_5GH_TxPowerOFDMDiff];
|
|
} else if (i >= 154 && i <= 158) { // ch 155 ~ 159
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_A[i] = hwinfo[EEPROM_5GH_TxPowerHT40_1S + 1];
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[i] = hwinfo[EEPROM_5GH_TxPowerHT40_1S + 4];
|
|
|
|
priv->pmib->dot11RFEntry.pwrdiff5GHT40_2S[i] = hwinfo[EEPROM_5GH_TxPowerHT40_2SDiff + 1];
|
|
priv->pmib->dot11RFEntry.pwrdiff5GHT20[i] = hwinfo[EEPROM_5GH_TxPowerHT20Diff + 1];
|
|
priv->pmib->dot11RFEntry.pwrdiff5GOFDM[i] = hwinfo[EEPROM_5GH_TxPowerOFDMDiff + 1];
|
|
} else if (i >= 160 && i <= 164) { // ch 161 ~ 165
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_A[i] = hwinfo[EEPROM_5GH_TxPowerHT40_1S + 2];
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[i] = hwinfo[EEPROM_5GH_TxPowerHT40_1S + 5];
|
|
|
|
priv->pmib->dot11RFEntry.pwrdiff5GHT40_2S[i] = hwinfo[EEPROM_5GH_TxPowerHT40_2SDiff + 2];
|
|
priv->pmib->dot11RFEntry.pwrdiff5GHT20[i] = hwinfo[EEPROM_5GH_TxPowerHT20Diff + 2];
|
|
priv->pmib->dot11RFEntry.pwrdiff5GOFDM[i] = hwinfo[EEPROM_5GH_TxPowerOFDMDiff + 2];
|
|
} else {
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_A[i] = 0;
|
|
priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[i] = 0;
|
|
|
|
priv->pmib->dot11RFEntry.pwrdiff5GHT40_2S[i] = 0;
|
|
priv->pmib->dot11RFEntry.pwrdiff5GHT20[i] = 0;
|
|
priv->pmib->dot11RFEntry.pwrdiff5GOFDM[i] = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
for (i = 0; i < MAX_2G_CHANNEL_NUM; i++) {
|
|
if (i < 3) {
|
|
priv->pmib->dot11RFEntry.pwrlevelCCK_A[i] = hwinfo[TxPwrCCK];
|
|
priv->pmib->dot11RFEntry.pwrlevelCCK_B[i] = hwinfo[TxPwrCCK + 3];
|
|
|
|
priv->pmib->dot11RFEntry.pwrlevelHT40_1S_A[i] = hwinfo[TxPwrHT40_1S];
|
|
priv->pmib->dot11RFEntry.pwrlevelHT40_1S_B[i] = hwinfo[TxPwrHT40_1S + 3];
|
|
|
|
priv->pmib->dot11RFEntry.pwrdiffHT40_2S[i] = hwinfo[TxPwrHT40_2SDiff];
|
|
priv->pmib->dot11RFEntry.pwrdiffHT20[i] = hwinfo[TxPwrHT20Diff];
|
|
priv->pmib->dot11RFEntry.pwrdiffOFDM[i] = hwinfo[TxPwrOFDMDiff];
|
|
|
|
} else if (i < 9) {
|
|
priv->pmib->dot11RFEntry.pwrlevelCCK_A[i] = hwinfo[TxPwrCCK + 1];
|
|
priv->pmib->dot11RFEntry.pwrlevelCCK_B[i] = hwinfo[TxPwrCCK + 4];
|
|
|
|
priv->pmib->dot11RFEntry.pwrlevelHT40_1S_A[i] = hwinfo[TxPwrHT40_1S + 1];
|
|
priv->pmib->dot11RFEntry.pwrlevelHT40_1S_B[i] = hwinfo[TxPwrHT40_1S + 4];
|
|
|
|
priv->pmib->dot11RFEntry.pwrdiffHT40_2S[i] = hwinfo[TxPwrHT40_2SDiff + 1];
|
|
priv->pmib->dot11RFEntry.pwrdiffHT20[i] = hwinfo[TxPwrHT20Diff + 1];
|
|
priv->pmib->dot11RFEntry.pwrdiffOFDM[i] = hwinfo[TxPwrOFDMDiff + 1];
|
|
} else {
|
|
priv->pmib->dot11RFEntry.pwrlevelCCK_A[i] = hwinfo[TxPwrCCK + 2];
|
|
priv->pmib->dot11RFEntry.pwrlevelCCK_B[i] = hwinfo[TxPwrCCK + 5];
|
|
|
|
priv->pmib->dot11RFEntry.pwrlevelHT40_1S_A[i] = hwinfo[TxPwrHT40_1S + 2];
|
|
priv->pmib->dot11RFEntry.pwrlevelHT40_1S_B[i] = hwinfo[TxPwrHT40_1S + 5];
|
|
|
|
priv->pmib->dot11RFEntry.pwrdiffHT40_2S[i] = hwinfo[TxPwrHT40_2SDiff + 2];
|
|
priv->pmib->dot11RFEntry.pwrdiffHT20[i] = hwinfo[TxPwrHT20Diff + 2];
|
|
priv->pmib->dot11RFEntry.pwrdiffOFDM[i] = hwinfo[TxPwrOFDMDiff + 2];
|
|
|
|
}
|
|
}
|
|
#endif // CONFIG_RTL_92C_SUPPORT || CONFIG_RTL_92D_SUPPORT
|
|
}
|
|
DEBUG_INFO("EFUSE Autoload success!\n");
|
|
}
|
|
}
|
|
|
|
|
|
static void ReadMacAddressFromEfuse(struct rtl8192cd_priv *priv)
|
|
{
|
|
u16 efuse_MAC=0; //sdio
|
|
#ifdef __KERNEL__
|
|
struct sockaddr addr;
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188C) || (GET_CHIP_VER(priv) == VERSION_8192C)) {
|
|
efuse_MAC = EEPROM_MACADDRESS;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if (priv->pshare->wlandev_idx == 0) {
|
|
efuse_MAC = EEPROM_MAC0_MACADDRESS;
|
|
} else {
|
|
efuse_MAC = EEPROM_MAC1_MACADDRESS;
|
|
}
|
|
#else
|
|
efuse_MAC = EEPROM_MAC0_MACADDRESS;
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E)
|
|
efuse_MAC = EEPROM_MAC_ADDR_88E;
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E)
|
|
efuse_MAC = EEPROM_92E_MACADDRESS;
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E)
|
|
efuse_MAC = EEPROM_8812_MACADDRESS;
|
|
#endif
|
|
|
|
if (/*priv->AutoloadFailFlag==FALSE &&*/ priv->pmib->efuseEntry.enable_efuse == 1) {
|
|
unsigned char *hwinfo = &(priv->EfuseMap[EFUSE_INIT_MAP][0]);
|
|
unsigned char *efuse_mac = hwinfo + efuse_MAC;
|
|
unsigned char zero[] = {0, 0, 0, 0, 0, 0}, mac[6];
|
|
|
|
memcpy(mac, efuse_mac, MACADDRLEN);
|
|
/* printk("wlan%d EFUSE MAC [%02x:%02x:%02x:%02x:%02x:%02x]\n", priv->pshare->wlandev_idx,
|
|
*mac, *(mac+1), *(mac+2), *(mac+3), *(mac+4), *(mac+5)); */
|
|
#if 0
|
|
if (memcmp(mac, zero, MACADDRLEN) && !IS_MCAST(mac)) {
|
|
#ifdef __KERNEL__
|
|
memcpy(addr.sa_data, mac, MACADDRLEN);
|
|
rtl8192cd_set_hwaddr(priv->dev, (void *)&addr);
|
|
#else
|
|
rtl8192cd_set_hwaddr(priv->dev, (void *)mac);
|
|
#endif
|
|
}
|
|
#else
|
|
if (!memcmp(mac, zero, MACADDRLEN) || IS_MCAST(mac)) {
|
|
memcpy(mac, zero, MACADDRLEN);
|
|
}
|
|
|
|
#ifdef __KERNEL__
|
|
memcpy(addr.sa_data, mac, MACADDRLEN);
|
|
rtl8192cd_set_hwaddr(priv->dev, (void *)&addr);
|
|
#else
|
|
rtl8192cd_set_hwaddr(priv->dev, (void *)mac);
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
#if defined(__ECOS) && defined(CONFIG_SDIO_HCI)
|
|
int get_mac_addr_from_efuse(struct rtl8192cd_priv *priv, char *mac)
|
|
{
|
|
u16 efuse_MAC=0; //sdio
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E)
|
|
efuse_MAC = EEPROM_MAC_ADDR_88E;
|
|
#endif
|
|
|
|
if (/*priv->AutoloadFailFlag==FALSE &&*/ priv->pmib->efuseEntry.enable_efuse == 1) {
|
|
unsigned char *hwinfo = &(priv->EfuseMap[EFUSE_INIT_MAP][0]);
|
|
unsigned char *efuse_mac = hwinfo + efuse_MAC;
|
|
|
|
memcpy(mac, efuse_mac, MACADDRLEN);
|
|
/* printk("wlan%d EFUSE MAC [%02x:%02x:%02x:%02x:%02x:%02x]\n", priv->pshare->wlandev_idx,
|
|
*mac, *(mac+1), *(mac+2), *(mac+3), *(mac+4), *(mac+5)); */
|
|
return 0;
|
|
}
|
|
else {
|
|
memset((void *)mac, 0, 6);
|
|
return -1;
|
|
}
|
|
}
|
|
#endif // __ECOS && CONFIG_SDIO_HCI
|
|
|
|
void ReadThermalMeterFromEfuse(struct rtl8192cd_priv *priv)
|
|
{
|
|
unsigned char *hwinfo = &(priv->EfuseMap[EFUSE_INIT_MAP][0]);
|
|
u8 efuse_Ther = 0, TherMask = 0x1f;
|
|
|
|
if (!priv->pmib->efuseEntry.enable_efuse)
|
|
return;
|
|
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188C) || (GET_CHIP_VER(priv) == VERSION_8192C)) {
|
|
efuse_Ther = EEPROM_THERMAL_METER;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
efuse_Ther = EEPROM_92D_THERMAL_METER;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
efuse_Ther = EEPROM_THERMAL_METER_88E;
|
|
TherMask = 0xff;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E) {
|
|
efuse_Ther = EEPROM_92E_THERMAL_METER;
|
|
TherMask = 0xff;
|
|
}
|
|
#endif
|
|
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
efuse_Ther = EEPROM_8812_THERMAL_METER;
|
|
TherMask = 0xff;
|
|
}
|
|
#endif
|
|
|
|
priv->pmib->dot11RFEntry.ther = (hwinfo[efuse_Ther] & TherMask);
|
|
DEBUG_INFO("ThermalMeter = 0x%x\n", priv->pmib->dot11RFEntry.ther);
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8192EE)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188E) || (GET_CHIP_VER(priv) == VERSION_8812E) || (GET_CHIP_VER(priv) == VERSION_8192E)) {
|
|
if ((priv->pmib->dot11RFEntry.ther < 0x07) || (priv->pmib->dot11RFEntry.ther > 0x32)) {
|
|
DEBUG_ERR("TPT: unreasonable target ther %d, disable tpt\n", priv->pmib->dot11RFEntry.ther);
|
|
priv->pmib->dot11RFEntry.ther = 0;
|
|
}
|
|
} else
|
|
#endif
|
|
if ((priv->pmib->dot11RFEntry.ther < 0x07) || (priv->pmib->dot11RFEntry.ther > 0x1d)) {
|
|
priv->pmib->dot11RFEntry.ther = 0;
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_USB_HCI
|
|
static void ReadBoardTypeFromEfuse(struct rtl8192cd_priv *priv)
|
|
{
|
|
unsigned char *hwinfo = &(priv->EfuseMap[EFUSE_INIT_MAP][0]);
|
|
u8 efuse_boardType;
|
|
|
|
if (!priv->pmib->efuseEntry.enable_efuse)
|
|
return;
|
|
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv)== VERSION_8188C) || (GET_CHIP_VER(priv)== VERSION_8192C)) {
|
|
efuse_boardType = EEPROM_NORMAL_BoardType;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
efuse_boardType = EEPROM_RF_BOARD_OPTION_88E;
|
|
}
|
|
#endif
|
|
|
|
priv->pshare->BoardType = (hwinfo[efuse_boardType] & BOARD_TYPE_NORMAL_MASK) >> 5;
|
|
DEBUG_INFO("BoardType = %d\n", priv->pshare->BoardType);
|
|
}
|
|
|
|
static void ReadIDFromEfuse(struct rtl8192cd_priv *priv)
|
|
{
|
|
unsigned char *hwinfo = &(priv->EfuseMap[EFUSE_INIT_MAP][0]);
|
|
|
|
if (FALSE == priv->AutoloadFailFlag) {
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192C) {
|
|
// VID, PID
|
|
priv->pshare->EEPROMVID = le16_to_cpu( *(u16 *)&hwinfo[EEPROM_VID]);
|
|
priv->pshare->EEPROMPID = le16_to_cpu( *(u16 *)&hwinfo[EEPROM_PID]);
|
|
|
|
// Customer ID, 0x00 and 0xff are reserved for Realtek.
|
|
priv->pshare->EEPROMCustomerID = hwinfo[EEPROM_CUSTOMER_ID];
|
|
priv->pshare->EEPROMSubCustomerID = hwinfo[EEPROM_SUBCUSTOMER_ID];
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
// VID, PID
|
|
priv->pshare->EEPROMVID = EF2Byte( *(u16 *)&hwinfo[EEPROM_VID_88EU] );
|
|
priv->pshare->EEPROMPID = EF2Byte( *(u16 *)&hwinfo[EEPROM_PID_88EU] );
|
|
|
|
// Customer ID, 0x00 and 0xff are reserved for Realtek.
|
|
priv->pshare->EEPROMCustomerID = hwinfo[EEPROM_CUSTOMERID_88E];
|
|
priv->pshare->EEPROMSubCustomerID = EEPROM_Default_SubCustomerID;
|
|
}
|
|
#endif
|
|
} else{
|
|
priv->pshare->EEPROMVID = EEPROM_Default_VID;
|
|
priv->pshare->EEPROMPID = EEPROM_Default_PID;
|
|
|
|
// Customer ID, 0x00 and 0xff are reserved for Realtek.
|
|
priv->pshare->EEPROMCustomerID = EEPROM_Default_CustomerID;
|
|
priv->pshare->EEPROMSubCustomerID = EEPROM_Default_SubCustomerID;
|
|
}
|
|
|
|
DEBUG_INFO("EEPROMVID = 0x%04x\n", priv->pshare->EEPROMVID);
|
|
DEBUG_INFO("EEPROMPID = 0x%04x\n", priv->pshare->EEPROMPID);
|
|
DEBUG_INFO("EEPROMCustomerID : 0x%02x\n", priv->pshare->EEPROMCustomerID);
|
|
DEBUG_INFO("EEPROMSubCustomerID: 0x%02x\n", priv->pshare->EEPROMSubCustomerID);
|
|
}
|
|
#endif // CONFIG_USB_HCI
|
|
|
|
#ifdef CONFIG_SDIO_HCI
|
|
#define RF_GAIN_OFFSET_ON BIT4
|
|
#define REG_RF_BB_GAIN 0x55
|
|
#define RF_GAIN_OFFSET_MASK 0xfffff
|
|
#define EFUSE_GAIN_FLAG_OFFSET 0xC1
|
|
|
|
#if defined(CONFIG_WLAN_HAL_8192EE)
|
|
#define EFUSE_GAIN_OFFSET 0x1F6
|
|
#else
|
|
#define EFUSE_GAIN_OFFSET 0xF6
|
|
#endif
|
|
|
|
void rtw_bb_rf_gain_offset(struct rtl8192cd_priv *priv)
|
|
{
|
|
unsigned char *hwinfo = &(priv->EfuseMap[EFUSE_INIT_MAP][0]);
|
|
u8 efuse_gain_offset, val, valb;
|
|
u32 res, resb;
|
|
|
|
if (!priv->pmib->efuseEntry.enable_efuse)
|
|
return;
|
|
|
|
efuse_gain_offset = (hwinfo[EFUSE_GAIN_FLAG_OFFSET]);
|
|
ReadEFuseByte(priv, EFUSE_GAIN_OFFSET, &val);
|
|
|
|
#if defined(CONFIG_WLAN_HAL_8192EE)
|
|
valb = ((val & 0xF0) >> 4);
|
|
#endif
|
|
|
|
if (efuse_gain_offset & RF_GAIN_OFFSET_ON) {
|
|
if ( val == 0xFF ) {
|
|
printk("gain offset : invalid data\n");
|
|
return ;
|
|
}
|
|
/*
|
|
** REG-0xF6 = [1:3]:gain [0]:+/-
|
|
** REG-0x55 = [16:18]:gain [15]:+/-
|
|
**/
|
|
|
|
res = PHY_QueryRFReg(priv, RF92CD_PATH_A, REG_RF_BB_GAIN, bMask20Bits, 1);
|
|
res &= 0xfff87fff;
|
|
res |= (val & 0x0f)<< 15;
|
|
PHY_SetRFReg(priv, RF92CD_PATH_A, REG_RF_BB_GAIN, bMask20Bits, res);
|
|
val = PHY_QueryRFReg(priv, RF92CD_PATH_A, REG_RF_BB_GAIN, bMask20Bits, 1);
|
|
|
|
#if defined(CONFIG_WLAN_HAL_8192EE)
|
|
resb = PHY_QueryRFReg(priv, RF92CD_PATH_B, REG_RF_BB_GAIN, bMask20Bits, 1);
|
|
resb &= 0xfff87fff;
|
|
resb |= (valb & 0x0f)<< 15;
|
|
PHY_SetRFReg(priv, RF92CD_PATH_B, REG_RF_BB_GAIN, bMask20Bits, resb);
|
|
val = PHY_QueryRFReg(priv, RF92CD_PATH_B, REG_RF_BB_GAIN, bMask20Bits, 1);
|
|
#endif
|
|
printk("write RF %d offset 0x%02x val [0x%05x], read back [0x%05x]\n",
|
|
RF92CD_PATH_A, REG_RF_BB_GAIN, res&0xfffff, val&0xfffff);
|
|
|
|
#if defined(CONFIG_WLAN_HAL_8192EE)
|
|
printk("write RF %d offset 0x%02x val [0x%05x], read back [0x%05x]\n",
|
|
RF92CD_PATH_B, REG_RF_BB_GAIN, resb&0xfffff, valb&0xfffff);
|
|
#endif
|
|
}
|
|
}
|
|
#endif // CONFIG_SDIO_HCI
|
|
|
|
#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8192EE)
|
|
void ReadCrystalCalibrationFromEfuse(struct rtl8192cd_priv *priv)
|
|
{
|
|
unsigned char *hwinfo = &(priv->EfuseMap[EFUSE_INIT_MAP][0]);
|
|
|
|
if (!priv->pmib->efuseEntry.enable_efuse)
|
|
return;
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
if (hwinfo[EEPROM_8812_XTAL_K] == 0xff)
|
|
priv->pmib->dot11RFEntry.xcap = 0x0;
|
|
else
|
|
priv->pmib->dot11RFEntry.xcap = hwinfo[EEPROM_8812_XTAL_K] & 0x3f; //[5:0]
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
priv->pmib->dot11RFEntry.xcap = (hwinfo[EEPROM_XTAL_88E]); //[7:0]
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
if(GET_CHIP_VER(priv) == VERSION_8192E)
|
|
{
|
|
if( hwinfo[EEPROM_92E_XTAL_K] > 0x3f )
|
|
priv->pmib->dot11RFEntry.xcap = 0;
|
|
else
|
|
priv->pmib->dot11RFEntry.xcap = hwinfo[EEPROM_92E_XTAL_K] & 0x3f; // [5:0]
|
|
}
|
|
#endif
|
|
#if defined(CONFIG_RTL_92D_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
priv->pmib->dot11RFEntry.xcap = (hwinfo[EEPROM_92D_XTAL_K]); //[7:0]
|
|
}
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_SDIO_HCI
|
|
void ReadChannelPlanFromEfuse(struct rtl8192cd_priv *priv)
|
|
{
|
|
unsigned char *hwinfo = &(priv->EfuseMap[EFUSE_INIT_MAP][0]);
|
|
|
|
if (!priv->pmib->efuseEntry.enable_efuse)
|
|
return;
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
if (0x20 == hwinfo[EEPROM_ChannelPlan_88E])
|
|
priv->pmib->dot11StationConfigEntry.dot11RegDomain = DOMAIN_WORLD_WIDE;
|
|
else if (0x21 == hwinfo[EEPROM_ChannelPlan_88E])
|
|
priv->pmib->dot11StationConfigEntry.dot11RegDomain = DOMAIN_ETSI;
|
|
else if (0x22 == hwinfo[EEPROM_ChannelPlan_88E])
|
|
priv->pmib->dot11StationConfigEntry.dot11RegDomain = DOMAIN_FCC;
|
|
else if (0x23 == hwinfo[EEPROM_ChannelPlan_88E])
|
|
priv->pmib->dot11StationConfigEntry.dot11RegDomain = DOMAIN_MKK1;
|
|
else if (0x24 == hwinfo[EEPROM_ChannelPlan_88E])
|
|
priv->pmib->dot11StationConfigEntry.dot11RegDomain = DOMAIN_FRANCE;
|
|
else if (0x41 == hwinfo[EEPROM_ChannelPlan_88E])
|
|
priv->pmib->dot11StationConfigEntry.dot11RegDomain = DOMAIN_GLOBAL;
|
|
}
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
void ReadTxBBSwingFromEfuse(struct rtl8192cd_priv *priv)
|
|
{
|
|
unsigned char *hwinfo = &(priv->EfuseMap[EFUSE_INIT_MAP][0]);
|
|
unsigned int swing_setting[4] = {12, 18, 24, 30};
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
int idx = 0;
|
|
if (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_2G) {
|
|
idx = hwinfo[EEPROM_2G_TxBBSwing] & 0x3; // 2G PathA OFDM
|
|
priv->pshare->OFDM_index0[0] = swing_setting[idx];
|
|
idx = (hwinfo[EEPROM_2G_TxBBSwing]>>2) & 0x3; // 2G PathB OFDM
|
|
priv->pshare->OFDM_index0[1] = swing_setting[idx];
|
|
} else if (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_5G) {
|
|
idx = hwinfo[EEPROM_5G_TxBBSwing] & 0x3; // 5G PathA OFDM
|
|
priv->pshare->OFDM_index0[0] = swing_setting[idx];
|
|
idx = (hwinfo[EEPROM_5G_TxBBSwing]>>2) & 0x3; // 5G PathB OFDM
|
|
priv->pshare->OFDM_index0[1] = swing_setting[idx];
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
void ReadDeltaValFromEfuse(struct rtl8192cd_priv *priv)
|
|
{
|
|
unsigned char *hwinfo = &(priv->EfuseMap[EFUSE_INIT_MAP][0]);
|
|
|
|
if (!priv->pmib->efuseEntry.enable_efuse)
|
|
return;
|
|
|
|
priv->pmib->dot11RFEntry.deltaIQK = (hwinfo[EEPROM_92D_IQK_DELTA] & 0x03); //[1:0]
|
|
priv->pmib->dot11RFEntry.deltaLCK = (hwinfo[EEPROM_92D_LCK_DELTA] & 0x0C) >> 2; //[3:2]
|
|
}
|
|
|
|
void ReadTRSWPAPEFromEfuse(struct rtl8192cd_priv *priv)
|
|
{
|
|
unsigned char *hwinfo = &(priv->EfuseMap[EFUSE_INIT_MAP][0]);
|
|
|
|
if (!priv->pmib->efuseEntry.enable_efuse)
|
|
return;
|
|
|
|
priv->pmib->dot11RFEntry.trsw_pape_C9 = (hwinfo[EEPROM_92D_TRSW_CTRL] & 0xff);
|
|
priv->pmib->dot11RFEntry.trsw_pape_CC = (hwinfo[EEPROM_92D_PAPE_CTRL] & 0xff);
|
|
|
|
if (priv->pmib->dot11RFEntry.trsw_pape_C9 == 0xff)
|
|
priv->pmib->dot11RFEntry.trsw_pape_C9 = 0;
|
|
}
|
|
|
|
#endif
|
|
|
|
int EfuseMapAlloc(struct rtl8192cd_priv *priv)
|
|
{
|
|
int i;
|
|
for( i = 0 ; i < 2 ; i++ ) {
|
|
priv->EfuseMap[i] = (unsigned char*)kmalloc(sizeof(unsigned char)*priv->EfuseMapLen, GFP_ATOMIC);
|
|
if (NULL == priv->EfuseMap[i])
|
|
return FAIL;
|
|
memset((void *)priv->EfuseMap[i], 0xff, sizeof(unsigned char)*priv->EfuseMapLen);
|
|
}
|
|
|
|
return SUCCESS;
|
|
}
|
|
|
|
int EfuseCmdInit(struct rtl8192cd_priv *priv)
|
|
{
|
|
priv->EfuseCmd = (char**)kmalloc(sizeof(char*)*priv->EfuseCmdNum, GFP_ATOMIC);
|
|
if (NULL == priv->EfuseCmd)
|
|
return FAIL;
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if( GET_CHIP_VER(priv) == VERSION_8188E )
|
|
{
|
|
priv->EfuseCmd[0] = "HW_TX_POWER_CCK_A";
|
|
priv->EfuseCmd[1] = "HW_TX_POWER_HT40_1S_A";
|
|
priv->EfuseCmd[2] = "HW_TX_POWER_DIFF_HT20_OFDM";
|
|
priv->EfuseCmd[3] = "HW_WLAN0_WLAN_ADDR";
|
|
priv->EfuseCmd[4] = "EFUSE_MAP0";
|
|
priv->EfuseCmd[5] = "EFUSE_MAP1";
|
|
priv->EfuseCmd[6] = "HW_11N_THER";
|
|
priv->EfuseCmd[7] = "HW_11N_XCAP";
|
|
#ifdef CONFIG_SDIO_HCI
|
|
priv->EfuseCmd[8] = "HW_REG_DOMAIN";
|
|
priv->EfuseCmd[9] = "SD";
|
|
#endif
|
|
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if( GET_CHIP_VER(priv) == VERSION_8192C || GET_CHIP_VER(priv) == VERSION_8188C )
|
|
{
|
|
priv->EfuseCmd[0] = "HW_TX_POWER_CCK_A";
|
|
priv->EfuseCmd[1] = "HW_TX_POWER_CCK_B";
|
|
priv->EfuseCmd[2] = "HW_TX_POWER_HT40_1S_A";
|
|
priv->EfuseCmd[3] = "HW_TX_POWER_HT40_1S_B";
|
|
priv->EfuseCmd[4] = "HW_TX_POWER_DIFF_HT40_2S";
|
|
priv->EfuseCmd[5] = "HW_TX_POWER_DIFF_HT20";
|
|
priv->EfuseCmd[6] = "HW_TX_POWER_DIFF_OFDM";
|
|
priv->EfuseCmd[7] = "HW_WLAN0_WLAN_ADDR";
|
|
priv->EfuseCmd[8] = "EFUSE_MAP0";
|
|
priv->EfuseCmd[9] = "EFUSE_MAP1";
|
|
priv->EfuseCmd[10] = "HW_11N_THER";
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if( GET_CHIP_VER(priv) == VERSION_8192D )
|
|
{
|
|
priv->EfuseCmd[0] = "HW_TX_POWER_CCK_A";
|
|
priv->EfuseCmd[1] = "HW_TX_POWER_CCK_B";
|
|
priv->EfuseCmd[2] = "HW_TX_POWER_HT40_1S_A";
|
|
priv->EfuseCmd[3] = "HW_TX_POWER_HT40_1S_B";
|
|
priv->EfuseCmd[4] = "HW_TX_POWER_DIFF_HT40_2S";
|
|
priv->EfuseCmd[5] = "HW_TX_POWER_DIFF_HT20";
|
|
priv->EfuseCmd[6] = "HW_TX_POWER_DIFF_OFDM";
|
|
priv->EfuseCmd[7] = "HW_WLAN0_WLAN_ADDR";
|
|
priv->EfuseCmd[8] = "EFUSE_MAP0";
|
|
priv->EfuseCmd[9] = "EFUSE_MAP1";
|
|
priv->EfuseCmd[10] = "HW_11N_THER";
|
|
priv->EfuseCmd[11] = "HW_TX_POWER_5G_HT40_1S_A";
|
|
priv->EfuseCmd[12] = "HW_TX_POWER_5G_HT40_1S_B";
|
|
priv->EfuseCmd[13] = "HW_TX_POWER_DIFF_5G_HT40_2S";
|
|
priv->EfuseCmd[14] = "HW_TX_POWER_DIFF_5G_HT20";
|
|
priv->EfuseCmd[15] = "HW_TX_POWER_DIFF_5G_OFDM";
|
|
priv->EfuseCmd[16] = "HW_11N_TRSWPAPE_C9";
|
|
priv->EfuseCmd[17] = "HW_11N_TRSWPAPE_CC";
|
|
priv->EfuseCmd[18] = "HW_11N_XCAP";
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
if( GET_CHIP_VER(priv) == VERSION_8192E )
|
|
{
|
|
priv->EfuseCmd[0] = "HW_TX_POWER_CCK_A";
|
|
priv->EfuseCmd[1] = "HW_TX_POWER_CCK_B";
|
|
priv->EfuseCmd[2] = "HW_TX_POWER_HT40_1S_A";
|
|
priv->EfuseCmd[3] = "HW_TX_POWER_HT40_1S_B";
|
|
priv->EfuseCmd[4] = "HW_TX_POWER_DIFF_HT20_A";
|
|
priv->EfuseCmd[5] = "HW_TX_POWER_DIFF_HT20_B";
|
|
priv->EfuseCmd[6] = "HW_TX_POWER_DIFF_HT20_OFDM_A";
|
|
priv->EfuseCmd[7] = "HW_TX_POWER_DIFF_HT20_OFDM_B";
|
|
priv->EfuseCmd[8] = "HW_TX_POWER_DIFF_HT40_2S_A";
|
|
priv->EfuseCmd[9] = "HW_TX_POWER_DIFF_HT40_2S_B";
|
|
priv->EfuseCmd[10] = "HW_WLAN0_WLAN_ADDR";
|
|
priv->EfuseCmd[11] = "EFUSE_MAP0";
|
|
priv->EfuseCmd[12] = "EFUSE_MAP1";
|
|
priv->EfuseCmd[13] = "HW_11N_THER";
|
|
priv->EfuseCmd[14] = "HW_11N_XCAP";
|
|
priv->EfuseCmd[15] = "EFUSE_TEST";
|
|
#ifdef CONFIG_SDIO_HCI
|
|
priv->EfuseCmd[16] = "SD";
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if( GET_CHIP_VER(priv) == VERSION_8812E )
|
|
{
|
|
priv->EfuseCmd[0] = "HW_TX_POWER_CCK_A";
|
|
priv->EfuseCmd[1] = "HW_TX_POWER_CCK_B";
|
|
priv->EfuseCmd[2] = "HW_TX_POWER_HT40_1S_A";
|
|
priv->EfuseCmd[3] = "HW_TX_POWER_HT40_1S_B";
|
|
priv->EfuseCmd[4] = "HW_TX_POWER_DIFF_HT40_2S";
|
|
priv->EfuseCmd[5] = "HW_TX_POWER_DIFF_HT20";
|
|
priv->EfuseCmd[6] = "HW_TX_POWER_DIFF_OFDM";
|
|
priv->EfuseCmd[7] = "HW_WLAN0_WLAN_ADDR";
|
|
priv->EfuseCmd[8] = "EFUSE_MAP0";
|
|
priv->EfuseCmd[9] = "EFUSE_MAP1";
|
|
priv->EfuseCmd[10] = "HW_11N_THER";
|
|
priv->EfuseCmd[11] = "HW_TX_POWER_5G_HT40_1S_A";
|
|
priv->EfuseCmd[12] = "HW_TX_POWER_5G_HT40_1S_B";
|
|
priv->EfuseCmd[13] = "HW_TX_POWER_DIFF_5G_HT40_2S";
|
|
priv->EfuseCmd[14] = "HW_TX_POWER_DIFF_5G_HT20";
|
|
priv->EfuseCmd[15] = "HW_TX_POWER_DIFF_5G_OFDM";
|
|
priv->EfuseCmd[16] = "HW_11N_TRSWPAPE_C9";
|
|
priv->EfuseCmd[17] = "HW_11N_TRSWPAPE_CC";
|
|
priv->EfuseCmd[18] = "HW_11N_XCAP";
|
|
priv->EfuseCmd[19] = "HW_TX_POWER_DIFF_5G_20BW1S_OFDM1T_A";
|
|
priv->EfuseCmd[20] = "HW_TX_POWER_DIFF_5G_20BW1S_OFDM1T_B";
|
|
priv->EfuseCmd[21] = "HW_TX_POWER_DIFF_5G_40BW2S_20BW2S_A";
|
|
priv->EfuseCmd[22] = "HW_TX_POWER_DIFF_5G_40BW2S_20BW2S_B";
|
|
priv->EfuseCmd[23] = "HW_TX_POWER_DIFF_5G_80BW1S_160BW1S_A";
|
|
priv->EfuseCmd[24] = "HW_TX_POWER_DIFF_5G_80BW1S_160BW1S_B";
|
|
priv->EfuseCmd[25] = "HW_TX_POWER_DIFF_5G_80BW2S_160BW2S_A";
|
|
priv->EfuseCmd[26] = "HW_TX_POWER_DIFF_5G_80BW2S_160BW2S_B";
|
|
priv->EfuseCmd[27] = "HW_TX_POWER_DIFF_20BW1S_OFDM1T_A";
|
|
priv->EfuseCmd[28] = "HW_TX_POWER_DIFF_20BW1S_OFDM1T_B";
|
|
priv->EfuseCmd[29] = "HW_TX_POWER_DIFF_40BW2S_20BW2S_A";
|
|
priv->EfuseCmd[30] = "HW_TX_POWER_DIFF_40BW2S_20BW2S_B";
|
|
}
|
|
#endif
|
|
|
|
return SUCCESS;
|
|
}
|
|
|
|
void EfuseInit(struct rtl8192cd_priv *priv)
|
|
{
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if( GET_CHIP_VER(priv) == VERSION_8188E )
|
|
{
|
|
priv->EfuseRealContentLen = 256;
|
|
priv->EfuseMapLen = 512;
|
|
priv->EfuseMaxSection= 64;
|
|
priv->EfuseOobProtectBytes= 18;
|
|
#ifdef CONFIG_SDIO_HCI
|
|
priv->EfuseCmdNum = 10;
|
|
#else
|
|
priv->EfuseCmdNum = 8;
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if( GET_CHIP_VER(priv) == VERSION_8192C || GET_CHIP_VER(priv) == VERSION_8188C )
|
|
{
|
|
priv->EfuseRealContentLen = 512;
|
|
priv->EfuseMapLen = 128;
|
|
priv->EfuseMaxSection= 16;
|
|
priv->EfuseOobProtectBytes= 15;
|
|
priv->EfuseCmdNum = 11;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if( GET_CHIP_VER(priv) == VERSION_8192D )
|
|
{
|
|
priv->EfuseRealContentLen = 1024;
|
|
priv->EfuseMapLen= 256;
|
|
priv->EfuseMaxSection= 32;
|
|
priv->EfuseOobProtectBytes= 18;
|
|
priv->EfuseCmdNum = 19;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
if( GET_CHIP_VER(priv) == VERSION_8192E )
|
|
{
|
|
priv->EfuseRealContentLen = 512;
|
|
priv->EfuseMapLen = 512;
|
|
priv->EfuseMaxSection = 64;
|
|
priv->EfuseOobProtectBytes = 15;
|
|
#ifdef CONFIG_SDIO_HCI
|
|
priv->EfuseCmdNum = 17;
|
|
#else
|
|
priv->EfuseCmdNum = 16;
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if( GET_CHIP_VER(priv) == VERSION_8812E )
|
|
{
|
|
priv->EfuseRealContentLen = 1024;
|
|
priv->EfuseMapLen= 512;
|
|
priv->EfuseMaxSection= 64;
|
|
priv->EfuseOobProtectBytes= 506;
|
|
priv->EfuseCmdNum = 31;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
//
|
|
// Description:
|
|
// Read HW adapter information by E-Fuse or EEPROM according CR9346 reported.
|
|
//
|
|
// Assumption:
|
|
// 1. CR9346 regiser has verified.
|
|
// 2. PASSIVE_LEVEL (USB interface)
|
|
//
|
|
// Created by Roger, 2008.10.21.
|
|
//
|
|
int ReadAdapterInfo8192CE(struct rtl8192cd_priv *priv)
|
|
{
|
|
#if defined(UNIVERSAL_REPEATER) || defined(MBSSID)
|
|
if (IS_ROOT_INTERFACE(priv))
|
|
#endif
|
|
{
|
|
unsigned char tmpU1b;
|
|
tmpU1b = RTL_R8(CR9346);
|
|
|
|
// To check system boot selection.
|
|
if (tmpU1b & CmdEERPOMSEL) {
|
|
DEBUG_INFO("Boot from EEPROM\n");
|
|
} else {
|
|
DEBUG_INFO("Boot from EFUSE\n");
|
|
}
|
|
|
|
// To check autoload success or not.
|
|
if (tmpU1b & CmdEEPROM_En) {
|
|
DEBUG_INFO("Autoload OK!!\n");
|
|
priv->AutoloadFailFlag = FALSE;
|
|
#if 0
|
|
EFUSE_ShadowMapUpdate(priv);
|
|
ReadTxPowerInfoFromHWPG(priv);
|
|
ReadMacAddressFromEfuse(priv);
|
|
#endif
|
|
} else { // Auto load fail.
|
|
DEBUG_INFO("AutoLoad Fail reported from CR9346!!\n");
|
|
priv->AutoloadFailFlag = TRUE;
|
|
}
|
|
|
|
#ifdef CONFIG_SDIO_HCI
|
|
// card enable before eFuse access
|
|
if(_CardEnable(priv) == FAIL) {
|
|
printk(KERN_ERR "%s: run power on flow fail\n", __func__);
|
|
return -EIO;
|
|
}
|
|
#endif
|
|
|
|
EfuseInit(priv);
|
|
if (EfuseMapAlloc(priv) == FAIL) {
|
|
printk(KERN_ERR "%s: can't allocate efuse map\n", __func__);
|
|
return -ENOMEM;
|
|
}
|
|
if (EfuseCmdInit(priv) == FAIL) {
|
|
printk(KERN_ERR "%s: can't allocate efuse cmd\n", __func__);
|
|
return -ENOMEM;
|
|
}
|
|
EFUSE_ShadowMapUpdate(priv);
|
|
|
|
#ifdef CONFIG_SDIO_HCI
|
|
// card disable after finishing eFuse access
|
|
#ifdef CONFIG_WLAN_HAL
|
|
if (IS_HAL_CHIP(priv))
|
|
GET_HAL_INTERFACE(priv)->StopHWHandler(priv);
|
|
else if(CONFIG_WLAN_NOT_HAL_EXIST)
|
|
#endif
|
|
rtl8192cd_stop_hw(priv);
|
|
#endif // CONFIG_SDIO_HCI
|
|
}
|
|
#if defined(UNIVERSAL_REPEATER) || defined(MBSSID)
|
|
else {
|
|
int i;
|
|
|
|
EfuseInit(priv);
|
|
for( i = 0 ; i < 2 ; i++ )
|
|
priv->EfuseMap[i] = priv->proot_priv->EfuseMap[i];
|
|
priv->EfuseCmd = priv->proot_priv->EfuseCmd;
|
|
}
|
|
#endif
|
|
|
|
ReadTxPowerInfoFromHWPG(priv);
|
|
ReadThermalMeterFromEfuse(priv);
|
|
ReadMacAddressFromEfuse(priv);
|
|
#ifdef CONFIG_USB_HCI
|
|
ReadIDFromEfuse(priv);
|
|
ReadBoardTypeFromEfuse(priv);
|
|
#endif
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
ReadCrystalCalibrationFromEfuse(priv);
|
|
ReadDeltaValFromEfuse(priv);
|
|
ReadTRSWPAPEFromEfuse(priv);
|
|
}
|
|
#endif
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8192EE)
|
|
if ((GET_CHIP_VER(priv)==VERSION_8188E) || (GET_CHIP_VER(priv) == VERSION_8812E) || (GET_CHIP_VER(priv)==VERSION_8192E))
|
|
ReadCrystalCalibrationFromEfuse(priv);
|
|
#endif
|
|
|
|
#ifdef CONFIG_SDIO_HCI
|
|
if (GET_CHIP_VER(priv)==VERSION_8188E)
|
|
ReadChannelPlanFromEfuse(priv);
|
|
#endif
|
|
|
|
return 0;
|
|
}
|
|
#if 0
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
static char FLASH_NAME_PARAM[][50] = {
|
|
"HW_TX_POWER_CCK_A",
|
|
"HW_TX_POWER_HT40_1S_A",
|
|
"HW_TX_POWER_DIFF_HT20_OFDM",
|
|
"HW_WLAN0_WLAN_ADDR",
|
|
"EFUSE_MAP0",
|
|
"EFUSE_MAP1",
|
|
"HW_11N_THER",
|
|
"HW_11N_XCAP",
|
|
#ifdef CONFIG_SDIO_HCI
|
|
"HW_REG_DOMAIN",
|
|
#endif
|
|
};
|
|
#elif defined(CONFIG_WLAN_HAL_8192EE)
|
|
static char FLASH_NAME_PARAM[][50] = {
|
|
"HW_TX_POWER_CCK_A",
|
|
"HW_TX_POWER_CCK_B",
|
|
"HW_TX_POWER_HT40_1S_A",
|
|
"HW_TX_POWER_HT40_1S_B",
|
|
"HW_TX_POWER_DIFF_HT20_OFDM",
|
|
"HW_TX_POWER_DIFF_HT40_2S",
|
|
"HW_WLAN0_WLAN_ADDR",
|
|
"EFUSE_MAP0",
|
|
"EFUSE_MAP1",
|
|
"HW_11N_THER",
|
|
"HW_11N_XCAP" //there's more
|
|
};
|
|
#else
|
|
static char FLASH_NAME_PARAM[][50] = {
|
|
"HW_TX_POWER_CCK_A",
|
|
"HW_TX_POWER_CCK_B",
|
|
"HW_TX_POWER_HT40_1S_A",
|
|
"HW_TX_POWER_HT40_1S_B",
|
|
"HW_TX_POWER_DIFF_HT40_2S",
|
|
"HW_TX_POWER_DIFF_HT20",
|
|
"HW_TX_POWER_DIFF_OFDM",
|
|
"HW_WLAN0_WLAN_ADDR",
|
|
"EFUSE_MAP0",
|
|
"EFUSE_MAP1",
|
|
"HW_11N_THER",
|
|
#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT)
|
|
"HW_TX_POWER_5G_HT40_1S_A",
|
|
"HW_TX_POWER_5G_HT40_1S_B",
|
|
"HW_TX_POWER_DIFF_5G_HT40_2S",
|
|
"HW_TX_POWER_DIFF_5G_HT20",
|
|
"HW_TX_POWER_DIFF_5G_OFDM",
|
|
"HW_11N_TRSWPAPE_C9",
|
|
"HW_11N_TRSWPAPE_CC",
|
|
"HW_11N_XCAP",
|
|
#endif
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
"HW_TX_POWER_DIFF_5G_20BW1S_OFDM1T_A",
|
|
"HW_TX_POWER_DIFF_5G_20BW1S_OFDM1T_B",
|
|
"HW_TX_POWER_DIFF_5G_40BW2S_20BW2S_A",
|
|
"HW_TX_POWER_DIFF_5G_40BW2S_20BW2S_B",
|
|
"HW_TX_POWER_DIFF_5G_80BW1S_160BW1S_A",
|
|
"HW_TX_POWER_DIFF_5G_80BW1S_160BW1S_B",
|
|
"HW_TX_POWER_DIFF_5G_80BW2S_160BW2S_A",
|
|
"HW_TX_POWER_DIFF_5G_80BW2S_160BW2S_B",
|
|
"HW_TX_POWER_DIFF_20BW1S_OFDM1T_A",
|
|
"HW_TX_POWER_DIFF_20BW1S_OFDM1T_B",
|
|
"HW_TX_POWER_DIFF_40BW2S_20BW2S_A",
|
|
"HW_TX_POWER_DIFF_40BW2S_20BW2S_B"
|
|
#endif
|
|
};
|
|
#endif
|
|
|
|
#define EFUSECMD_NUM_92C 11
|
|
#define EFUSECMD_NUM_92D 19
|
|
#define EFUSECMD_NUM_8812 31
|
|
#ifdef CONFIG_SDIO_HCI
|
|
#define EFUSECMD_NUM_88E 9
|
|
#else
|
|
#define EFUSECMD_NUM_88E 8
|
|
#endif
|
|
#define EFUSECMD_NUM_92E 11
|
|
|
|
#endif
|
|
|
|
static int getEEPROMOffset(struct rtl8192cd_priv *priv, int type)
|
|
{
|
|
int offset = 0;
|
|
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188C) || (GET_CHIP_VER(priv) == VERSION_8192C)) {
|
|
switch (type) {
|
|
case 0:
|
|
offset = EEPROM_TxPowerCCK;
|
|
break;
|
|
case 1:
|
|
offset = EEPROM_TxPowerCCK + 3;
|
|
break;
|
|
case 2:
|
|
offset = EEPROM_TxPowerHT40_1S;
|
|
break;
|
|
case 3:
|
|
offset = EEPROM_TxPowerHT40_1S + 3;
|
|
break;
|
|
case 4:
|
|
offset = EEPROM_TxPowerHT40_2SDiff;
|
|
break;
|
|
case 5:
|
|
offset = EEPROM_TxPowerHT20Diff;
|
|
break;
|
|
case 6:
|
|
offset = EEPROM_TxPowerOFDMDiff;
|
|
break;
|
|
case 7:
|
|
offset = EEPROM_MACADDRESS;
|
|
break;
|
|
case 10:
|
|
offset = EEPROM_THERMAL_METER;
|
|
break;
|
|
default:
|
|
offset = -1;
|
|
panic_printk("NOT SUPPORT!!\n");
|
|
break;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
switch (type) {
|
|
case 0:
|
|
offset = EEPROM_2G_TxPowerCCK;
|
|
break;
|
|
case 1:
|
|
offset = EEPROM_2G_TxPowerCCK + 3;
|
|
break;
|
|
case 2:
|
|
offset = EEPROM_2G_TxPowerHT40_1S;
|
|
break;
|
|
case 3:
|
|
offset = EEPROM_2G_TxPowerHT40_1S + 3;
|
|
break;
|
|
case 4:
|
|
offset = EEPROM_2G_TxPowerHT40_2SDiff;
|
|
break;
|
|
case 5:
|
|
offset = EEPROM_2G_TxPowerHT20Diff;
|
|
break;
|
|
case 6:
|
|
offset = EEPROM_2G_TxPowerOFDMDiff;
|
|
break;
|
|
case 7:
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if (priv->pshare->wlandev_idx == 1)
|
|
offset = EEPROM_MAC1_MACADDRESS;
|
|
else
|
|
#endif
|
|
offset = EEPROM_MAC0_MACADDRESS;
|
|
break;
|
|
case 8:
|
|
offset = 0x00;
|
|
break;
|
|
case 9:
|
|
offset = 0x32;
|
|
break;
|
|
case 10:
|
|
offset = EEPROM_92D_THERMAL_METER;
|
|
break;
|
|
case 11:
|
|
offset = EEPROM_5GL_TxPowerHT40_1S;
|
|
break;
|
|
case 12:
|
|
offset = EEPROM_5GL_TxPowerHT40_1S + 3;
|
|
break;
|
|
case 13:
|
|
offset = EEPROM_5GL_TxPowerHT40_2SDiff;
|
|
break;
|
|
case 14:
|
|
offset = EEPROM_5GL_TxPowerHT20Diff;
|
|
break;
|
|
case 15:
|
|
offset = EEPROM_5GL_TxPowerOFDMDiff;
|
|
break;
|
|
case 16:
|
|
offset = EEPROM_92D_TRSW_CTRL;
|
|
break;
|
|
case 17:
|
|
offset = EEPROM_92D_PAPE_CTRL;
|
|
break;
|
|
case 18:
|
|
offset = EEPROM_92D_XTAL_K;
|
|
break;
|
|
default:
|
|
offset = -1;
|
|
panic_printk("NOT SUPPORT!!\n");
|
|
break;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
switch (type) {
|
|
case 0:
|
|
offset = EEPROM_2G_CCK1T_TxPower + PATHA_OFFSET;
|
|
break;
|
|
case 1:
|
|
offset = EEPROM_2G_CCK1T_TxPower + PATHB_OFFSET;
|
|
break;
|
|
case 2:
|
|
offset = EEPROM_2G_HT401S_TxPower + PATHA_OFFSET;
|
|
break;
|
|
case 3:
|
|
offset = EEPROM_2G_HT401S_TxPower + PATHA_OFFSET;
|
|
break;
|
|
case 4:
|
|
offset = EEPROM_2G_HT402S_TxPowerDiff + PATHA_OFFSET;
|
|
break;
|
|
case 5:
|
|
offset = EEPROM_2G_HT201S_TxPowerDiff + PATHA_OFFSET;
|
|
break;
|
|
case 6:
|
|
offset = EEPROM_2G_OFDM1T_TxPowerDiff + PATHA_OFFSET;
|
|
break;
|
|
case 7:
|
|
offset = EEPROM_8812_MACADDRESS;
|
|
break;
|
|
case 8:
|
|
offset = 0x00;
|
|
break;
|
|
case 9:
|
|
offset = 0x32;
|
|
break;
|
|
case 10:
|
|
offset = EEPROM_8812_THERMAL_METER;
|
|
break;
|
|
case 11:
|
|
offset = EEPROM_5G_HT401S_TxPower + PATHA_OFFSET;
|
|
break;
|
|
case 12:
|
|
offset = EEPROM_5G_HT401S_TxPower + PATHB_OFFSET;
|
|
break;
|
|
case 18:
|
|
offset = EEPROM_8812_XTAL_K;
|
|
break;
|
|
case 19:
|
|
offset = EEPROM_5G_HT201S_TxPowerDiff + PATHA_OFFSET;
|
|
break;
|
|
case 20:
|
|
offset = EEPROM_5G_HT201S_TxPowerDiff + PATHB_OFFSET;
|
|
break;
|
|
case 21:
|
|
offset = EEPROM_5G_HT402S_TxPowerDiff + PATHA_OFFSET;
|
|
break;
|
|
case 22:
|
|
offset = EEPROM_5G_HT402S_TxPowerDiff + PATHB_OFFSET;
|
|
break;
|
|
case 23:
|
|
offset = EEPROM_5G_HT801S_TxPowerDiff + PATHA_OFFSET;
|
|
break;
|
|
case 24:
|
|
offset = EEPROM_5G_HT801S_TxPowerDiff + PATHB_OFFSET;
|
|
break;
|
|
case 25:
|
|
offset = EEPROM_5G_HT802S_TxPowerDiff + PATHA_OFFSET;
|
|
break;
|
|
case 26:
|
|
offset = EEPROM_5G_HT802S_TxPowerDiff + PATHB_OFFSET;
|
|
break;
|
|
case 27:
|
|
offset = EEPROM_2G_HT201S_TxPowerDiff + PATHA_OFFSET;
|
|
break;
|
|
case 28:
|
|
offset = EEPROM_2G_HT201S_TxPowerDiff + PATHB_OFFSET;
|
|
break;
|
|
case 29:
|
|
offset = EEPROM_2G_HT402S_TxPowerDiff + PATHA_OFFSET;
|
|
break;
|
|
case 30:
|
|
offset = EEPROM_2G_HT402S_TxPowerDiff + PATHB_OFFSET;
|
|
break;
|
|
default:
|
|
offset = -1;
|
|
panic_printk("NOT SUPPORT!!\n");
|
|
break;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
switch (type) {
|
|
case 0:
|
|
offset = EEPROM_TX_PWR_INX_88E; //HW_TX_POWER_CCK_A
|
|
break;
|
|
case 1:
|
|
offset = EEPROM_TX_PWR_INX_88E + 6; //HW_TX_POWER_HT40_1S_A
|
|
break;
|
|
case 2:
|
|
offset = EEPROM_TX_PWR_INX_88E + 11; //HW_TX_POWER_DIFF_HT20_OFDM
|
|
break;
|
|
case 3:
|
|
offset = EEPROM_MAC_ADDR_88E; // HW_WLAN0_WLAN_ADDR
|
|
break;
|
|
case 4:
|
|
offset = 0x00;
|
|
break;
|
|
case 5:
|
|
offset = 0x32;
|
|
break;
|
|
case 6:
|
|
offset = EEPROM_THERMAL_METER_88E; //HW_11N_THER
|
|
break;
|
|
case 7:
|
|
offset = EEPROM_XTAL_88E; //HW_11N_XCAP
|
|
break;
|
|
#ifdef CONFIG_SDIO_HCI
|
|
case 8:
|
|
offset = EEPROM_ChannelPlan_88E; //HW_REG_DOMAIN
|
|
break;
|
|
case 9:
|
|
offset = EEPROM_88E_SDIOTYPE;
|
|
break;
|
|
#endif
|
|
default:
|
|
offset = -1;
|
|
panic_printk("NOT SUPPORT!!\n");
|
|
break;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if defined(CONFIG_WLAN_HAL_8192EE)
|
|
if(GET_CHIP_VER(priv) == VERSION_8192E)
|
|
{
|
|
switch(type)
|
|
{
|
|
case 0: // HW_TX_POWER_CCK_A
|
|
offset = EEPROM_2G_CCK1T_TxPower + PATHA_OFFSET;
|
|
break;
|
|
case 1: // HW_TX_POWER_CCK_B
|
|
offset = EEPROM_2G_CCK1T_TxPower + PATHB_OFFSET;
|
|
break;
|
|
case 2: // HW_TX_POWER_HT40_1S_A
|
|
offset = EEPROM_2G_HT401S_TxPower + PATHA_OFFSET;
|
|
break;
|
|
case 3: // HW_TX_POWER_HT40_1S_B
|
|
offset = EEPROM_2G_HT401S_TxPower + PATHB_OFFSET;
|
|
break;
|
|
case 4: // HW_TX_POWER_DIFF_HT20_A
|
|
offset = EEPROM_2G_HT201S_TxPowerDiff + PATHA_OFFSET;
|
|
break;
|
|
case 5: // HW_TX_POWER_DIFF_HT20_B
|
|
offset = EEPROM_2G_HT201S_TxPowerDiff + PATHB_OFFSET;
|
|
break;
|
|
case 6: // HW_TX_POWER_DIFF_HT20_OFDM_A
|
|
offset = EEPROM_2G_OFDM1T_TxPowerDiff + PATHA_OFFSET;
|
|
break;
|
|
case 7: // HW_TX_POWER_DIFF_HT20_OFDM_B
|
|
offset = EEPROM_2G_OFDM1T_TxPowerDiff + PATHB_OFFSET;
|
|
break;
|
|
case 8: // HW_TX_POWER_DIFF_HT40_2S_A
|
|
offset = EEPROM_2G_HT402S_TxPowerDiff + PATHA_OFFSET;
|
|
break;
|
|
case 9: // HW_TX_POWER_DIFF_HT40_2S_B
|
|
offset = EEPROM_2G_HT402S_TxPowerDiff + PATHB_OFFSET;
|
|
break;
|
|
case 10: // HW_WLAN0_WLAN_ADDR
|
|
offset = EEPROM_92E_MACADDRESS;
|
|
break;
|
|
case 11: // EFUSE_MAP0
|
|
offset = 0x00;
|
|
break;
|
|
case 12: // EFUSE_MAP1
|
|
offset = 0x32;
|
|
break;
|
|
case 13: // HW_11N_THER
|
|
offset = EEPROM_92E_THERMAL_METER;
|
|
break;
|
|
case 14: // HW_11N_XCAP
|
|
offset = EEPROM_92E_XTAL_K;
|
|
break;
|
|
case 15: // EFUSE_TEST
|
|
offset = 0x02;
|
|
break;
|
|
#ifdef CONFIG_SDIO_HCI
|
|
case 16:
|
|
offset = EEPROM_92E_SDIOTYPE;
|
|
break;
|
|
#endif
|
|
default:
|
|
offset = -1;
|
|
panic_printk("NOT SUPPORT!!\n");
|
|
break;
|
|
}
|
|
}
|
|
#endif
|
|
return offset;
|
|
}
|
|
|
|
|
|
/* 11/16/2008 MH Add description. Get current efuse area enabled word!!. */
|
|
static UINT8 efuse_CalculateWordCnts( UINT8 word_en)
|
|
{
|
|
UINT8 word_cnts = 0;
|
|
if (!(word_en & BIT(0))) word_cnts++; // 0 : write enable
|
|
if (!(word_en & BIT(1))) word_cnts++;
|
|
if (!(word_en & BIT(2))) word_cnts++;
|
|
if (!(word_en & BIT(3))) word_cnts++;
|
|
return word_cnts;
|
|
} // efuse_CalculateWordCnts
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
* Function: efuse_GetCurrentSize
|
|
*
|
|
* Overview: Get current efuse size!!!
|
|
*
|
|
* Input: NONE
|
|
*
|
|
* Output: NONE
|
|
*
|
|
* Return: NONE
|
|
*
|
|
* Revised History:
|
|
* When Who Remark
|
|
* 11/16/2008 MHC Create Version 0.
|
|
*
|
|
*---------------------------------------------------------------------------*/
|
|
static UINT16 efuse_GetCurrentSize(struct rtl8192cd_priv *priv)
|
|
{
|
|
INT32 bContinual = TRUE;
|
|
UINT16 efuse_addr = 0;
|
|
UINT8 hoffset = 0, hworden = 0;
|
|
UINT8 efuse_data, word_cnts = 0;
|
|
#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8192EE)
|
|
UINT8 bSupportExtendHdr = ((GET_CHIP_VER(priv) == VERSION_8192D) || (GET_CHIP_VER(priv) == VERSION_8188E) || (GET_CHIP_VER(priv) == VERSION_8192E)
|
|
|| (GET_CHIP_VER(priv) == VERSION_8812E));
|
|
#endif
|
|
|
|
|
|
do {
|
|
ReadEFuseByte(priv, efuse_addr, &efuse_data) ;
|
|
if (efuse_data != 0xFF) {
|
|
#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8192EE)
|
|
if (bSupportExtendHdr && ((efuse_data & 0x1F) == 0x0F)) { //extended header
|
|
hoffset = efuse_data;
|
|
efuse_addr++;
|
|
ReadEFuseByte(priv, efuse_addr , &efuse_data);
|
|
if ((efuse_data & 0x0F) == 0x0F) {
|
|
efuse_addr++;
|
|
continue;
|
|
} else {
|
|
hoffset = ((hoffset & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1);
|
|
hworden = efuse_data & 0x0F;
|
|
}
|
|
} else
|
|
#endif
|
|
{
|
|
hoffset = (efuse_data >> 4) & 0x0F;
|
|
hworden = efuse_data & 0x0F;
|
|
}
|
|
word_cnts = efuse_CalculateWordCnts(hworden);
|
|
//read next header
|
|
efuse_addr = efuse_addr + (word_cnts * 2) + 1;
|
|
} else {
|
|
bContinual = FALSE ;
|
|
}
|
|
} while (bContinual && (efuse_addr < priv->EfuseRealContentLen) );
|
|
|
|
return efuse_addr;
|
|
|
|
} // efuse_GetCurrentSize}
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
* Function: efuse_WordEnableDataRead
|
|
*
|
|
* Overview: Read allowed word in current efuse section data.
|
|
*
|
|
* Input: NONE
|
|
*
|
|
* Output: NONE
|
|
*
|
|
* Return: NONE
|
|
*
|
|
* Revised History:
|
|
* When Who Remark
|
|
* 11/16/2008 MHC Create Version 0.
|
|
* 11/21/2008 MHC Fix Write bug when we only enable late word.
|
|
*
|
|
*---------------------------------------------------------------------------*/
|
|
static void efuse_WordEnableDataRead(UINT8 word_en, UINT8 *sourdata, UINT8 *targetdata)
|
|
{
|
|
if (!(word_en & BIT(0))) {
|
|
targetdata[0] = sourdata[0];
|
|
targetdata[1] = sourdata[1];
|
|
}
|
|
if (!(word_en & BIT(1))) {
|
|
targetdata[2] = sourdata[2];
|
|
targetdata[3] = sourdata[3];
|
|
}
|
|
if (!(word_en & BIT(2))) {
|
|
targetdata[4] = sourdata[4];
|
|
targetdata[5] = sourdata[5];
|
|
}
|
|
if (!(word_en & BIT(3))) {
|
|
targetdata[6] = sourdata[6];
|
|
targetdata[7] = sourdata[7];
|
|
}
|
|
} // efuse_WordEnableDataRead
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
* Function: efuse_PgPacketRead
|
|
*
|
|
* Overview: Receive dedicated Efuse are content. For92s, we support 16
|
|
* area now. It will return 8 bytes content for every area.
|
|
*
|
|
* Input: NONE
|
|
*
|
|
* Output: NONE
|
|
*
|
|
* Return: NONE
|
|
*
|
|
* Revised History:
|
|
* When Who Remark
|
|
* 11/16/2008 MHC Reorganize code Arch and assign as local API.
|
|
*
|
|
*---------------------------------------------------------------------------*/
|
|
static INT32 efuse_PgPacketRead(struct rtl8192cd_priv *priv, UINT8 offset, UINT8 *data)
|
|
{
|
|
UINT8 ReadState = PG_STATE_HEADER;
|
|
INT32 bContinual = TRUE, bDataEmpty = TRUE ;
|
|
UINT16 efuse_addr = 0;
|
|
UINT8 hoffset = 0, hworden = 0, efuse_data, word_cnts = 0, tmpidx = 0;
|
|
UINT8 tmpdata[8];
|
|
#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_WLAN_HAL_8192EE) || defined(CONFIG_RTL_8812_SUPPORT)
|
|
UINT8 tmp_header;
|
|
UINT8 bSupportExtendHdr = ((GET_CHIP_VER(priv) == VERSION_8192D) || (GET_CHIP_VER(priv) == VERSION_8188E)
|
|
|| (GET_CHIP_VER(priv) == VERSION_8192E) || (GET_CHIP_VER(priv) == VERSION_8812E));
|
|
#endif
|
|
|
|
if (data == NULL)
|
|
return FALSE;
|
|
if (offset > priv->EfuseMaxSection)
|
|
return FALSE;
|
|
|
|
memset(data, 0xff, sizeof(UINT8)*PGPKT_DATA_SIZE);
|
|
memset(tmpdata, 0xff, sizeof(UINT8)*PGPKT_DATA_SIZE);
|
|
|
|
//
|
|
// <Roger_TODO> Efuse has been pre-programmed dummy 5Bytes at the end of Efuse by CP.
|
|
// Skip dummy parts to prevent unexpected data read from Efuse.
|
|
// By pass right now. 2009.02.19.
|
|
//
|
|
while (bContinual && (efuse_addr < priv->EfuseRealContentLen) ) {
|
|
//------- Header Read -------------
|
|
if (ReadState & PG_STATE_HEADER) {
|
|
ReadEFuseByte(priv, efuse_addr , &efuse_data);
|
|
if (efuse_data != 0xFF) {
|
|
#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_WLAN_HAL_8192EE) || defined(CONFIG_RTL_8812_SUPPORT)
|
|
if (bSupportExtendHdr && ((efuse_data & 0x1F) == 0x0F)) {
|
|
tmp_header = efuse_data;
|
|
efuse_addr++;
|
|
ReadEFuseByte(priv, efuse_addr , &efuse_data);
|
|
if ((efuse_data & 0x0F) != 0x0F) {
|
|
hoffset = ((tmp_header & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1);
|
|
hworden = efuse_data & 0x0F;
|
|
} else {
|
|
efuse_addr++;
|
|
continue;
|
|
}
|
|
|
|
} else
|
|
#endif
|
|
{
|
|
hoffset = (efuse_data >> 4) & 0x0F;
|
|
hworden = efuse_data & 0x0F;
|
|
}
|
|
word_cnts = efuse_CalculateWordCnts(hworden);
|
|
bDataEmpty = TRUE ;
|
|
|
|
if (hoffset == offset) {
|
|
for (tmpidx = 0; tmpidx < word_cnts * 2 ; tmpidx++) {
|
|
ReadEFuseByte(priv, efuse_addr + 1 + tmpidx , &efuse_data);
|
|
tmpdata[tmpidx] = efuse_data;
|
|
if (efuse_data != 0xff) {
|
|
bDataEmpty = FALSE;
|
|
}
|
|
}
|
|
if (bDataEmpty == FALSE) {
|
|
ReadState = PG_STATE_DATA;
|
|
} else { //read next header
|
|
efuse_addr = efuse_addr + (word_cnts * 2) + 1;
|
|
ReadState = PG_STATE_HEADER;
|
|
}
|
|
} else { //read next header
|
|
efuse_addr = efuse_addr + (word_cnts * 2) + 1;
|
|
ReadState = PG_STATE_HEADER;
|
|
}
|
|
} else {
|
|
bContinual = FALSE ;
|
|
}
|
|
}
|
|
//------- Data section Read -------------
|
|
else if (ReadState & PG_STATE_DATA) {
|
|
efuse_WordEnableDataRead(hworden, tmpdata, data);
|
|
efuse_addr = efuse_addr + (word_cnts * 2) + 1;
|
|
ReadState = PG_STATE_HEADER;
|
|
}
|
|
}
|
|
if ( (data[0] == 0xff) && (data[1] == 0xff) && (data[2] == 0xff) && (data[3] == 0xff) &&
|
|
(data[4] == 0xff) && (data[5] == 0xff) && (data[6] == 0xff) && (data[7] == 0xff))
|
|
return FALSE;
|
|
else
|
|
return TRUE;
|
|
|
|
} // efuse_PgPacketRead
|
|
|
|
|
|
/* 11/16/2008 MH Write one byte to reald Efuse. */
|
|
static INT32 WriteEFuseByte(struct rtl8192cd_priv *priv, UINT16 addr, UINT8 data)
|
|
{
|
|
UINT8 tmpidx = 0;
|
|
INT32 bResult;
|
|
u4Byte efuseValue = 0;
|
|
|
|
// DEBUG_INFO("Addr = %x Data=%x\n", addr, data);
|
|
|
|
// -----------------e-fuse reg ctrl ---------------------------------
|
|
//address
|
|
#if defined(CONFIG_WLAN_HAL_8192EE)
|
|
if( GET_CHIP_VER(priv) == VERSION_8192E && !IS_TEST_CHIP(priv) && IS_HARDWARE_TYPE_8192E(priv) &&
|
|
(_GET_HAL_DATA(priv)->cutVersion != ODM_CUT_A) )
|
|
{
|
|
//0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8])
|
|
RTL_W8(EFUSE_TEST + 1, (RTL_R8(EFUSE_TEST + 1) & 0xf7) | (0x01 << 3));
|
|
RTL_W32(EFUSE_CTRL, 0x90600000|(addr<<8 | data));
|
|
}
|
|
else
|
|
#endif
|
|
{
|
|
efuseValue = RTL_R32(EFUSE_CTRL);
|
|
efuseValue |= (BIT21|BIT31);
|
|
efuseValue &= ~(0x3FFFF);
|
|
efuseValue |= ((addr<<8 | data) & 0x3FFFF);
|
|
RTL_W32(EFUSE_CTRL, efuseValue);
|
|
|
|
#if 0
|
|
RTL_W8( EFUSE_CTRL + 1, (UINT8)(addr & 0xff));
|
|
RTL_W8( EFUSE_CTRL + 2, (RTL_R8(EFUSE_CTRL + 2) & 0xFC ) | (UINT8)((addr >> 8) & 0x03));
|
|
RTL_W8( EFUSE_CTRL, data);//data
|
|
|
|
RTL_W8( EFUSE_CTRL + 3, 0xF2 ); //write cmd
|
|
#endif
|
|
}
|
|
|
|
while ((0x80 & RTL_R8(EFUSE_CTRL + 3)) && (tmpidx < 100) ) {
|
|
delay_ms(1);
|
|
tmpidx++;
|
|
}
|
|
|
|
if (tmpidx < 100) {
|
|
bResult = TRUE;
|
|
} else {
|
|
bResult = FALSE;
|
|
}
|
|
|
|
#if defined(CONFIG_WLAN_HAL_8192EE)
|
|
if( GET_CHIP_VER(priv) == VERSION_8192E )
|
|
{
|
|
if (!IS_TEST_CHIP(priv) && IS_HARDWARE_TYPE_8192E(priv) &&
|
|
( _GET_HAL_DATA(priv)->cutVersion != ODM_CUT_A ) )
|
|
{
|
|
//0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8])
|
|
RTL_W8(EFUSE_TEST + 1, (RTL_R8(EFUSE_TEST + 1) & 0xf7) | (0x00 << 3));
|
|
}
|
|
}
|
|
#endif
|
|
|
|
return bResult;
|
|
} //
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
* Function: efuse_WordEnableDataWrite
|
|
*
|
|
* Overview: Write necessary word unit into current efuse section!
|
|
*
|
|
* Input: NONE
|
|
*
|
|
* Output: NONE
|
|
*
|
|
* Return: NONE
|
|
*
|
|
* Revised History:
|
|
* When Who Remark
|
|
* 11/16/2008 MHC Reorganize Efuse operate flow!!.
|
|
*
|
|
*---------------------------------------------------------------------------*/
|
|
static UINT8 efuse_WordEnableDataWrite(struct rtl8192cd_priv *priv,
|
|
UINT16 efuse_addr, UINT8 word_en, UINT8 *data)
|
|
{
|
|
UINT16 tmpaddr = 0;
|
|
UINT16 start_addr = efuse_addr;
|
|
UINT8 badworden = 0x0F;
|
|
UINT8 tmpdata[8];
|
|
|
|
//memset(tmpdata,0xff,PGPKT_DATA_SIZE);
|
|
memset(tmpdata, 0xff, PGPKT_DATA_SIZE);
|
|
DEBUG_INFO("word_en = %x efuse_addr=%x\n", word_en, efuse_addr);
|
|
|
|
if (!(word_en & BIT(0))) {
|
|
tmpaddr = start_addr;
|
|
WriteEFuseByte(priv, start_addr++, data[0]);
|
|
WriteEFuseByte(priv, start_addr++, data[1]);
|
|
ReadEFuseByte(priv, tmpaddr, &tmpdata[0]);
|
|
ReadEFuseByte(priv, tmpaddr + 1, &tmpdata[1]);
|
|
if ((data[0] != tmpdata[0]) || (data[1] != tmpdata[1])) {
|
|
badworden &= (~ BIT(0));
|
|
}
|
|
}
|
|
if (!(word_en & BIT(1))) {
|
|
tmpaddr = start_addr;
|
|
WriteEFuseByte(priv, start_addr++, data[2]);
|
|
WriteEFuseByte(priv, start_addr++, data[3]);
|
|
ReadEFuseByte(priv, tmpaddr , &tmpdata[2]);
|
|
ReadEFuseByte(priv, tmpaddr + 1, &tmpdata[3]);
|
|
if ((data[2] != tmpdata[2]) || (data[3] != tmpdata[3])) {
|
|
badworden &= ( ~ BIT(1));
|
|
}
|
|
}
|
|
if (!(word_en & BIT(2))) {
|
|
tmpaddr = start_addr;
|
|
WriteEFuseByte(priv, start_addr++, data[4]);
|
|
WriteEFuseByte(priv, start_addr++, data[5]);
|
|
ReadEFuseByte(priv, tmpaddr, &tmpdata[4]);
|
|
ReadEFuseByte(priv, tmpaddr + 1, &tmpdata[5]);
|
|
if ((data[4] != tmpdata[4]) || (data[5] != tmpdata[5])) {
|
|
badworden &= ( ~ BIT(2));
|
|
}
|
|
}
|
|
if (!(word_en & BIT(3))) {
|
|
tmpaddr = start_addr;
|
|
WriteEFuseByte(priv, start_addr++, data[6]);
|
|
WriteEFuseByte(priv, start_addr++, data[7]);
|
|
ReadEFuseByte(priv, tmpaddr, &tmpdata[6]);
|
|
ReadEFuseByte(priv, tmpaddr + 1, &tmpdata[7]);
|
|
if ((data[6] != tmpdata[6]) || (data[7] != tmpdata[7])) {
|
|
badworden &= ( ~ BIT(3));
|
|
}
|
|
}
|
|
return badworden;
|
|
} // efuse_WordEnableDataWrite
|
|
|
|
|
|
//
|
|
// Description:
|
|
// This routine will calculate current shadow map that
|
|
// how much bytes needs to be updated.
|
|
//
|
|
// Assumption:
|
|
// We shall call this routine before programming physical Efuse content.
|
|
//
|
|
// Return Value:
|
|
// TRUE: Efuse has enough capacity to program.
|
|
// FALSE: Efuse do NOT has enough capacity to program.
|
|
//
|
|
// Created by Roger, 2008.04.21.
|
|
//
|
|
static int EFUSE_ShadowUpdateChk(struct rtl8192cd_priv *priv)
|
|
{
|
|
UINT8 SectionIdx, i, Base;
|
|
UINT16 WordsNeed = 0, HdrNum = 0, TotalBytes = 0, EfuseUsed = 0;
|
|
UINT8 bWordChanged, bResult = TRUE;
|
|
|
|
// Efuse contain total 16 sections.
|
|
for (SectionIdx = 0; SectionIdx < priv->EfuseMaxSection; SectionIdx++) {
|
|
Base = SectionIdx * 8;
|
|
bWordChanged = FALSE;
|
|
|
|
// One section contain 4 words = 8 bytes.
|
|
for (i = 0; i < 8; i = i + 2) {
|
|
if ((priv->EfuseMap[EFUSE_INIT_MAP][Base + i] != priv->EfuseMap[EFUSE_MODIFY_MAP][Base + i]) ||
|
|
(priv->EfuseMap[EFUSE_INIT_MAP][Base + i + 1] != priv->EfuseMap[EFUSE_MODIFY_MAP][Base + i + 1])) {
|
|
WordsNeed++;
|
|
bWordChanged = TRUE;
|
|
}
|
|
}
|
|
|
|
// We shall append Efuse header If any WORDs changed in this section.
|
|
if (bWordChanged == TRUE) {
|
|
if (SectionIdx >= EFUSE_MAX_SECTION_BASE)
|
|
HdrNum += 2;
|
|
else
|
|
HdrNum++;
|
|
}
|
|
}
|
|
|
|
TotalBytes = HdrNum + WordsNeed * 2;
|
|
EfuseUsed = priv->EfuseUsedBytes;
|
|
|
|
// Calculate whether updated map has enough capacity.
|
|
if ((TotalBytes + EfuseUsed) >= (priv->EfuseRealContentLen - priv->EfuseOobProtectBytes))
|
|
bResult = FALSE;
|
|
|
|
DEBUG_INFO("EFUSE_ShadowUpdateChk(): TotalBytes(%#x), HdrNum(%#x), WordsNeed(%#x), EfuseUsed(%d)\n",
|
|
TotalBytes, HdrNum, WordsNeed, EfuseUsed);
|
|
|
|
return bResult;
|
|
}
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
* Function: efuse_PgPacketWrite
|
|
*
|
|
* Overview: Send A G package for different section in real efuse area.
|
|
* For 92S, One PG package contain 8 bytes content and 4 word
|
|
* unit. PG header = 0x[bit7-4=offset][bit3-0word enable]
|
|
*
|
|
* Input: NONE
|
|
*
|
|
* Output: NONE
|
|
*
|
|
* Return: NONE
|
|
*
|
|
* Revised History:
|
|
* When Who Remark
|
|
* 11/16/2008 MHC Reorganize code Arch and assign as local API.
|
|
*
|
|
*---------------------------------------------------------------------------*/
|
|
static int efuse_PgPacketWrite(struct rtl8192cd_priv *priv,
|
|
UINT8 offset, UINT8 word_en, UINT8 *data)
|
|
{
|
|
UINT8 WriteState = PG_STATE_HEADER;
|
|
INT32 bContinual = TRUE, bDataEmpty = TRUE, bResult = TRUE, bExtendedHeader = FALSE;
|
|
UINT16 efuse_addr = 0;
|
|
UINT8 efuse_data, pg_header = 0, pg_header_temp = 0;
|
|
|
|
UINT8 tmp_word_cnts = 0, target_word_cnts = 0;
|
|
UINT8 tmp_header, match_word_en, tmp_word_en;
|
|
|
|
PGPKT_STRUCT target_pkt;
|
|
PGPKT_STRUCT tmp_pkt;
|
|
|
|
UINT8 originaldata[sizeof(UINT8) * 8];
|
|
UINT8 tmpindex = 0, badworden = 0x0F;
|
|
static INT32 repeat_times = 0;
|
|
|
|
//
|
|
// <Roger_Notes> Efuse has been pre-programmed dummy 5Bytes at the end of Efuse by CP.
|
|
// So we have to prevent unexpected data string connection, which will cause
|
|
// incorrect data auto-load from HW. The total size is equal or smaller than 498bytes
|
|
// (i.e., offset 0~497, and dummy 1bytes) expected after CP test.
|
|
// 2009.02.19.
|
|
//
|
|
if ( efuse_GetCurrentSize(priv) >= (priv->EfuseRealContentLen - priv->EfuseOobProtectBytes)) {
|
|
DEBUG_INFO ("efuse_PgPacketWrite error \n");
|
|
return FALSE;
|
|
}
|
|
|
|
tmp_pkt.offset = 0;
|
|
tmp_pkt.word_en = 0;
|
|
// Init the 8 bytes content as 0xff
|
|
target_pkt.offset = offset;
|
|
target_pkt.word_en = word_en;
|
|
memset(target_pkt.data, 0xFF, sizeof(UINT8) * 8);
|
|
|
|
efuse_WordEnableDataRead(word_en, data, target_pkt.data);
|
|
target_word_cnts = efuse_CalculateWordCnts(target_pkt.word_en);
|
|
|
|
//
|
|
// <Roger_Notes> Efuse has been pre-programmed dummy 5Bytes at the end of Efuse by CP.
|
|
// So we have to prevent unexpected data string connection, which will cause
|
|
// incorrect data auto-load from HW. Dummy 1bytes is additional.
|
|
// 2009.02.19.
|
|
//
|
|
while ( bContinual && (efuse_addr < (priv->EfuseRealContentLen - priv->EfuseOobProtectBytes)) ) {
|
|
if (WriteState == PG_STATE_HEADER) {
|
|
bDataEmpty = TRUE;
|
|
badworden = 0x0F;
|
|
//************ so *******************
|
|
DEBUG_INFO("EFUSE PG_STATE_HEADER\n");
|
|
ReadEFuseByte(priv, efuse_addr , &efuse_data);
|
|
if (efuse_data != 0xFF) {
|
|
if ((efuse_data & 0x1F) == 0x0F) { //extended header
|
|
tmp_header = efuse_data;
|
|
efuse_addr++;
|
|
ReadEFuseByte(priv, efuse_addr , &efuse_data);
|
|
if ((efuse_data & 0x0F) == 0x0F) { //wren fail
|
|
efuse_addr++;
|
|
continue;
|
|
} else {
|
|
tmp_pkt.offset = ((tmp_header & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1);
|
|
tmp_pkt.word_en = efuse_data & 0x0F;
|
|
}
|
|
} else {
|
|
tmp_header = efuse_data;
|
|
tmp_pkt.offset = (tmp_header >> 4) & 0x0F;
|
|
tmp_pkt.word_en = tmp_header & 0x0F;
|
|
}
|
|
|
|
tmp_word_cnts = efuse_CalculateWordCnts(tmp_pkt.word_en);
|
|
|
|
//************ so-1 *******************
|
|
if (tmp_pkt.offset != target_pkt.offset) {
|
|
efuse_addr = efuse_addr + (tmp_word_cnts * 2) + 1; //Next pg_packet
|
|
#ifdef EFUSE_ERROE_HANDLE
|
|
WriteState = PG_STATE_HEADER;
|
|
#endif
|
|
} else {
|
|
//************ so-2 *******************
|
|
for (tmpindex = 0 ; tmpindex < (tmp_word_cnts * 2) ; tmpindex++) {
|
|
ReadEFuseByte(priv, (efuse_addr + 1 + tmpindex) , &efuse_data);
|
|
if (efuse_data != 0xFF)
|
|
bDataEmpty = FALSE;
|
|
}
|
|
//************ so-2-1 *******************
|
|
if (bDataEmpty == FALSE) {
|
|
efuse_addr = efuse_addr + (tmp_word_cnts * 2) + 1; //Next pg_packet
|
|
#ifdef EFUSE_ERROE_HANDLE
|
|
WriteState = PG_STATE_HEADER;
|
|
#endif
|
|
} else {
|
|
//************ so-2-2 *******************
|
|
match_word_en = 0x0F;
|
|
if ( !( (target_pkt.word_en & BIT(0)) | (tmp_pkt.word_en & BIT(0)) )) {
|
|
match_word_en &= (~ BIT(0));
|
|
}
|
|
if ( !( (target_pkt.word_en & BIT(1)) | (tmp_pkt.word_en & BIT(1)) )) {
|
|
match_word_en &= (~ BIT(1));
|
|
}
|
|
if ( !( (target_pkt.word_en & BIT(2)) | (tmp_pkt.word_en & BIT(2)) )) {
|
|
match_word_en &= (~ BIT(2));
|
|
}
|
|
if ( !( (target_pkt.word_en & BIT(3)) | (tmp_pkt.word_en & BIT(3)) )) {
|
|
match_word_en &= (~ BIT(3));
|
|
}
|
|
|
|
//************ so-2-2-A *******************
|
|
if ((match_word_en & 0x0F) != 0x0F) {
|
|
badworden = efuse_WordEnableDataWrite(priv, efuse_addr + 1, tmp_pkt.word_en , target_pkt.data);
|
|
|
|
//************ so-2-2-A-1 *******************
|
|
if (0x0F != (badworden & 0x0F)) {
|
|
UINT8 reorg_offset = offset;
|
|
UINT8 reorg_worden = badworden;
|
|
efuse_PgPacketWrite(priv, reorg_offset, reorg_worden, originaldata);
|
|
}
|
|
|
|
tmp_word_en = 0x0F;
|
|
if ( (target_pkt.word_en & BIT(0)) ^ (match_word_en & BIT(0)) ) {
|
|
tmp_word_en &= (~ BIT(0));
|
|
}
|
|
if ( (target_pkt.word_en & BIT(1)) ^ (match_word_en & BIT(1)) ) {
|
|
tmp_word_en &= (~ BIT(1));
|
|
}
|
|
if ( (target_pkt.word_en & BIT(2)) ^ (match_word_en & BIT(2)) ) {
|
|
tmp_word_en &= (~ BIT(2));
|
|
}
|
|
if ( (target_pkt.word_en & BIT(3)) ^ (match_word_en & BIT(3)) ) {
|
|
tmp_word_en &= (~ BIT(3));
|
|
}
|
|
|
|
//************ so-2-2-A-2 *******************
|
|
if ((tmp_word_en & 0x0F) != 0x0F) {
|
|
//reorganize other pg packet
|
|
efuse_addr = efuse_GetCurrentSize(priv);
|
|
target_pkt.offset = offset;
|
|
target_pkt.word_en = tmp_word_en;
|
|
} else {
|
|
bContinual = FALSE;
|
|
}
|
|
#ifdef EFUSE_ERROE_HANDLE
|
|
WriteState = PG_STATE_HEADER;
|
|
repeat_times++;
|
|
if (repeat_times > EFUSE_REPEAT_THRESHOLD_) {
|
|
bContinual = FALSE;
|
|
bResult = FALSE;
|
|
}
|
|
#endif
|
|
} else { //************ so-2-2-B *******************
|
|
//reorganize other pg packet
|
|
efuse_addr = efuse_addr + (2 * tmp_word_cnts) + 1; //next pg packet addr
|
|
target_pkt.offset = offset;
|
|
target_pkt.word_en = target_pkt.word_en;
|
|
#ifdef EFUSE_ERROE_HANDLE
|
|
WriteState = PG_STATE_HEADER;
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
DEBUG_INFO("EFUSE PG_STATE_HEADER-1\n");
|
|
} else {
|
|
//************ s1: header == oxff *******************
|
|
bExtendedHeader = FALSE;
|
|
|
|
if (target_pkt.offset >= EFUSE_MAX_SECTION_BASE) {
|
|
pg_header = ((target_pkt.offset & 0x07) << 5) | 0x0F;
|
|
|
|
DEBUG_INFO("efuse_PgPacketWrite extended pg_header[2:0] |0x0F 0x%x \n", pg_header);
|
|
|
|
WriteEFuseByte(priv, efuse_addr, pg_header);
|
|
ReadEFuseByte(priv, efuse_addr, &tmp_header);
|
|
|
|
while (tmp_header == 0xFF) {
|
|
DEBUG_INFO("efuse_PgPacketWrite extended pg_header[2:0] wirte fail \n");
|
|
|
|
repeat_times++;
|
|
|
|
if (repeat_times > EFUSE_REPEAT_THRESHOLD_) {
|
|
bContinual = FALSE;
|
|
bResult = FALSE;
|
|
efuse_addr++;
|
|
break;
|
|
}
|
|
WriteEFuseByte(priv, efuse_addr, pg_header);
|
|
ReadEFuseByte(priv, efuse_addr, &tmp_header);
|
|
}
|
|
|
|
if (!bContinual)
|
|
break;
|
|
|
|
if (tmp_header == pg_header) {
|
|
efuse_addr++;
|
|
pg_header_temp = pg_header;
|
|
pg_header = ((target_pkt.offset & 0x78) << 1 ) | target_pkt.word_en;
|
|
|
|
DEBUG_INFO("efuse_PgPacketWrite extended pg_header[6:3] | worden 0x%x word_en 0x%x \n", pg_header, target_pkt.word_en);
|
|
|
|
WriteEFuseByte(priv, efuse_addr, pg_header);
|
|
ReadEFuseByte(priv, efuse_addr, &tmp_header);
|
|
|
|
while (tmp_header == 0xFF) {
|
|
repeat_times++;
|
|
|
|
if (repeat_times > EFUSE_REPEAT_THRESHOLD_) {
|
|
bContinual = FALSE;
|
|
bResult = FALSE;
|
|
break;
|
|
}
|
|
WriteEFuseByte(priv, efuse_addr, pg_header);
|
|
ReadEFuseByte(priv, efuse_addr, &tmp_header);
|
|
}
|
|
|
|
if (!bContinual)
|
|
break;
|
|
|
|
if ((tmp_header & 0x0F) == 0x0F) { //wren PG fail
|
|
repeat_times++;
|
|
|
|
if (repeat_times > EFUSE_REPEAT_THRESHOLD_) {
|
|
bContinual = FALSE;
|
|
bResult = FALSE;
|
|
break;
|
|
} else {
|
|
efuse_addr++;
|
|
continue;
|
|
}
|
|
} else if (pg_header != tmp_header) { //offset PG fail
|
|
bExtendedHeader = TRUE;
|
|
tmp_pkt.offset = ((pg_header_temp & 0xE0) >> 5) | ((tmp_header & 0xF0) >> 1);
|
|
tmp_pkt.word_en = tmp_header & 0x0F;
|
|
tmp_word_cnts = efuse_CalculateWordCnts(tmp_pkt.word_en);
|
|
}
|
|
} else if ((tmp_header & 0x1F) == 0x0F) { //wrong extended header
|
|
efuse_addr += 2;
|
|
continue;
|
|
}
|
|
} else {
|
|
pg_header = ((target_pkt.offset << 4) & 0xf0) | target_pkt.word_en;
|
|
WriteEFuseByte(priv, efuse_addr, pg_header);
|
|
ReadEFuseByte(priv, efuse_addr, &tmp_header);
|
|
}
|
|
if (tmp_header == pg_header) { //************ s1-1*******************
|
|
WriteState = PG_STATE_DATA;
|
|
} else
|
|
#ifdef EFUSE_ERROE_HANDLE
|
|
if (tmp_header == 0xFF) { //************ s1-3: if Write or read func doesn't work *******************
|
|
//efuse_addr doesn't change
|
|
WriteState = PG_STATE_HEADER;
|
|
repeat_times++;
|
|
if (repeat_times > EFUSE_REPEAT_THRESHOLD_) {
|
|
bContinual = FALSE;
|
|
bResult = FALSE;
|
|
}
|
|
} else
|
|
#endif
|
|
{
|
|
//************ s1-2 : fixed the header procedure *******************
|
|
if (!bExtendedHeader) {
|
|
tmp_pkt.offset = (tmp_header >> 4) & 0x0F;
|
|
tmp_pkt.word_en = tmp_header & 0x0F;
|
|
tmp_word_cnts = efuse_CalculateWordCnts(tmp_pkt.word_en);
|
|
}
|
|
|
|
//************ s1-2-A :cover the exist data *******************
|
|
//memset(originaldata,0xff,sizeof(UINT8)*8);
|
|
memset(originaldata, 0xff, sizeof(UINT8) * 8);
|
|
|
|
if (efuse_PgPacketRead( priv, tmp_pkt.offset, originaldata)) { //check if data exist
|
|
badworden = efuse_WordEnableDataWrite(priv, efuse_addr + 1, tmp_pkt.word_en, originaldata);
|
|
if (0x0F != (badworden & 0x0F)) {
|
|
UINT8 reorg_offset = tmp_pkt.offset;
|
|
UINT8 reorg_worden = badworden;
|
|
efuse_PgPacketWrite(priv, reorg_offset, reorg_worden, originaldata);
|
|
efuse_addr = efuse_GetCurrentSize(priv);
|
|
} else {
|
|
efuse_addr = efuse_addr + (tmp_word_cnts * 2) + 1; //Next pg_packet
|
|
}
|
|
} else {
|
|
//************ s1-2-B: wrong address*******************
|
|
efuse_addr = efuse_addr + (tmp_word_cnts * 2) + 1; //Next pg_packet
|
|
}
|
|
|
|
#ifdef EFUSE_ERROE_HANDLE
|
|
WriteState = PG_STATE_HEADER;
|
|
repeat_times++;
|
|
if (repeat_times > EFUSE_REPEAT_THRESHOLD_) {
|
|
bContinual = FALSE;
|
|
bResult = FALSE;
|
|
}
|
|
#endif
|
|
DEBUG_INFO("EFUSE PG_STATE_HEADER-2\n");
|
|
}
|
|
|
|
}
|
|
}
|
|
//write data state
|
|
else if (WriteState == PG_STATE_DATA) {
|
|
//************ s1-1 *******************
|
|
DEBUG_INFO("EFUSE PG_STATE_DATA\n");
|
|
badworden = 0x0f;
|
|
badworden = efuse_WordEnableDataWrite(priv, efuse_addr + 1, target_pkt.word_en, target_pkt.data);
|
|
if ((badworden & 0x0F) == 0x0F) {
|
|
//************ s1-1-A *******************
|
|
bContinual = FALSE;
|
|
} else {
|
|
//reorganize other pg packet //************ s1-1-B *******************
|
|
efuse_addr = efuse_addr + (2 * target_word_cnts) + 1; //next pg packet addr
|
|
//===========================
|
|
target_pkt.offset = offset;
|
|
target_pkt.word_en = badworden;
|
|
target_word_cnts = efuse_CalculateWordCnts(target_pkt.word_en);
|
|
//===========================
|
|
#ifdef EFUSE_ERROE_HANDLE
|
|
WriteState = PG_STATE_HEADER;
|
|
repeat_times++;
|
|
if (repeat_times > EFUSE_REPEAT_THRESHOLD_) {
|
|
bContinual = FALSE;
|
|
bResult = FALSE;
|
|
}
|
|
#endif
|
|
DEBUG_INFO("EFUSE PG_STATE_HEADER-3\n");
|
|
}
|
|
}
|
|
}
|
|
|
|
if (efuse_addr >= (priv->EfuseRealContentLen - priv->EfuseOobProtectBytes)) {
|
|
DEBUG_INFO("efuse_PgPacketWrite(): efuse_addr(%#x) Out of size!!\n", efuse_addr);
|
|
}
|
|
|
|
return TRUE;
|
|
} // efuse_PgPacketWrite
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
* Function: EFUSE_ShadowUpdate
|
|
*
|
|
* Overview: Compare init and modify map to update Efuse!!!!!
|
|
*
|
|
* Input: NONE
|
|
*
|
|
* Output: NONE
|
|
*
|
|
* Return: NONE
|
|
*
|
|
* Revised History:
|
|
* When Who Remark
|
|
* 11/12/2008 MHC Create Version 0.
|
|
* 12/11/2008 MHC 92SE PH workaround to prevent HW autoload fail.
|
|
* 12/30/2008 Roger Fix the bug that EFUSE will writed out-of boundary.
|
|
* 02/16/2009 Roger Revise PCIe autoload fail case and compatible with USB interface to
|
|
* overcome MP issue.
|
|
*
|
|
*---------------------------------------------------------------------------*/
|
|
static int EFUSE_ShadowUpdate(struct rtl8192cd_priv *priv)
|
|
{
|
|
UINT16 i, offset, base = 0;
|
|
UINT8 word_en = 0x0F;
|
|
|
|
//
|
|
// <Roger_Notes> We have to check whether current Efuse capacity is big enough to program!!
|
|
// 2009.04.21.
|
|
//
|
|
if (!EFUSE_ShadowUpdateChk(priv)) {
|
|
//
|
|
// <Roger_Notes> We shall reload current Efuse all map and synchronize current modified
|
|
// map to prevent inconsistent Efuse content.
|
|
// 2009.04.21.
|
|
//
|
|
EFUSE_ShadowMapUpdate(priv);
|
|
DEBUG_INFO("<---EFUSE_ShadowUpdate(): Efuse out of capacity!!\n");
|
|
return FALSE;
|
|
}
|
|
// For Efuse write action, we must enable LDO2.5V and 40MHZ clk.
|
|
efuse_PowerSwitch(priv, TRUE, TRUE);
|
|
|
|
//
|
|
// Efuse support 16 write are with PG header packet!!!!
|
|
//
|
|
for (offset = 0; offset < priv->EfuseMaxSection; offset++) {
|
|
// From section(0) to section(15) sequential write.
|
|
word_en = 0x0F;
|
|
base = offset * 8;
|
|
//
|
|
// Decide Word Enable Bit for the Efuse section
|
|
// One section contain 4 words = 8 bytes!!!!!
|
|
//
|
|
for (i = 0; i < 8; i++) {
|
|
if (priv->EfuseMap[EFUSE_INIT_MAP][base + i] != priv->EfuseMap[EFUSE_MODIFY_MAP][base + i]) {
|
|
word_en &= ~(BIT(i / 2));
|
|
DEBUG_INFO("Section(%#x) Addr[%x] %x update to %x, Word_En=%02x\n",
|
|
offset, base + i, priv->EfuseMap[EFUSE_INIT_MAP][base + i], priv->EfuseMap[EFUSE_MODIFY_MAP][base + i], word_en);
|
|
}
|
|
}
|
|
|
|
//
|
|
// This section will need to update, call Efuse real write section !!!!
|
|
//
|
|
if (word_en != 0x0F) {
|
|
UINT8 tmpdata[8];
|
|
memcpy(tmpdata, (&priv->EfuseMap[EFUSE_MODIFY_MAP][base]), 8);
|
|
|
|
//
|
|
// <Roger_Notes> Break programming process if efuse capacity is NOT available.
|
|
// 2009.04.20.
|
|
//
|
|
if (!efuse_PgPacketWrite(priv, (UINT8)offset, word_en, tmpdata)) {
|
|
DEBUG_INFO("EFUSE_ShadowUpdate(): PG section(%#x) fail!!\n", offset);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// For warm reboot, we must resume Efuse clock to 500K.
|
|
efuse_PowerSwitch(priv, TRUE, FALSE);
|
|
|
|
//
|
|
// <Roger_Notes> We update both init shadow map again and modified map
|
|
// while WPG do loading operation after previous programming.
|
|
// 2008.12.30.
|
|
//
|
|
EFUSE_ShadowMapUpdate(priv);
|
|
|
|
ReadTxPowerInfoFromHWPG(priv);
|
|
ReadThermalMeterFromEfuse(priv);
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
ReadCrystalCalibrationFromEfuse(priv);
|
|
ReadDeltaValFromEfuse(priv);
|
|
ReadTRSWPAPEFromEfuse(priv);
|
|
}
|
|
#endif
|
|
|
|
#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8192EE)
|
|
if ((GET_CHIP_VER(priv)==VERSION_8188E) || (GET_CHIP_VER(priv) == VERSION_8812E) || (GET_CHIP_VER(priv)==VERSION_8192E))
|
|
ReadCrystalCalibrationFromEfuse(priv);
|
|
#endif
|
|
|
|
DEBUG_INFO ("<---EFUSE_ShadowUpdate()\n");
|
|
return TRUE;
|
|
} // EFUSE_ShadowUpdate
|
|
|
|
|
|
static void shadowMapWrite(struct rtl8192cd_priv *priv, int type, char *value, unsigned char *hwinfo)
|
|
{
|
|
int i, offset ;
|
|
offset = getEEPROMOffset(priv, type);
|
|
|
|
if (offset < 0)
|
|
return;
|
|
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188C) || (GET_CHIP_VER(priv) == VERSION_8192C)) {
|
|
if (offset == EEPROM_MACADDRESS) {
|
|
for (i = 0; i < MACADDRLEN; i++) {
|
|
get_array_val(hwinfo + offset + i, value + i * 2, 2);
|
|
}
|
|
} else if (offset == EEPROM_THERMAL_METER) {
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
} else {
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
get_array_val(hwinfo + offset + 1, value + 3 * 2, 2);
|
|
get_array_val(hwinfo + offset + 2, value + 9 * 2, 2);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
if (offset == 0 || offset == 0x32) {
|
|
for (i = 0; i < 0x32; i++) {
|
|
get_array_val(hwinfo + offset + i, value + i * 2, 2);
|
|
}
|
|
} else if (offset == EEPROM_MAC0_MACADDRESS || offset == EEPROM_MAC1_MACADDRESS) {
|
|
for (i = 0; i < MACADDRLEN; i++) {
|
|
get_array_val(hwinfo + offset + i, value + i * 2, 2);
|
|
}
|
|
} else if (offset == EEPROM_92D_THERMAL_METER ||
|
|
offset == EEPROM_92D_TRSW_CTRL ||
|
|
offset == EEPROM_92D_PAPE_CTRL ||
|
|
offset == EEPROM_92D_XTAL_K ) {
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
} else if ((offset == EEPROM_2G_TxPowerCCK) ||
|
|
(offset == EEPROM_2G_TxPowerCCK + 3) ||
|
|
(offset == EEPROM_2G_TxPowerHT40_1S) ||
|
|
(offset == EEPROM_2G_TxPowerHT40_1S + 3) ||
|
|
(offset == EEPROM_2G_TxPowerHT40_2SDiff) ||
|
|
(offset == EEPROM_2G_TxPowerHT20Diff) ||
|
|
(offset == EEPROM_2G_TxPowerOFDMDiff)) {
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
get_array_val(hwinfo + offset + 1, value + 3 * 2, 2);
|
|
get_array_val(hwinfo + offset + 2, value + 9 * 2, 2);
|
|
} else if (offset == EEPROM_5GL_TxPowerHT40_1S) {
|
|
get_array_val(hwinfo + EEPROM_5GL_TxPowerHT40_1S, value + 35 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GL_TxPowerHT40_1S + 1, value + 45 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GL_TxPowerHT40_1S + 2, value + 55 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GM_TxPowerHT40_1S, value + 99 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GM_TxPowerHT40_1S + 1, value + 113 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GM_TxPowerHT40_1S + 2, value + 127 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GH_TxPowerHT40_1S, value + 148 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GH_TxPowerHT40_1S + 1, value + 154 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GH_TxPowerHT40_1S + 2, value + 160 * 2, 2);
|
|
} else if (offset == EEPROM_5GL_TxPowerHT40_1S + 3) {
|
|
get_array_val(hwinfo + EEPROM_5GL_TxPowerHT40_1S + 3, value + 35 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GL_TxPowerHT40_1S + 4, value + 45 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GL_TxPowerHT40_1S + 5, value + 55 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GM_TxPowerHT40_1S + 3, value + 99 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GM_TxPowerHT40_1S + 4, value + 113 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GM_TxPowerHT40_1S + 5, value + 127 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GH_TxPowerHT40_1S + 3, value + 148 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GH_TxPowerHT40_1S + 4, value + 154 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GH_TxPowerHT40_1S + 5, value + 160 * 2, 2);
|
|
} else if (offset == EEPROM_5GL_TxPowerHT40_2SDiff) {
|
|
get_array_val(hwinfo + EEPROM_5GL_TxPowerHT40_2SDiff, value + 35 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GL_TxPowerHT40_2SDiff + 1, value + 45 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GL_TxPowerHT40_2SDiff + 2, value + 55 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GM_TxPowerHT40_2SDiff, value + 99 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GM_TxPowerHT40_2SDiff + 1, value + 113 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GM_TxPowerHT40_2SDiff + 2, value + 127 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GH_TxPowerHT40_2SDiff, value + 148 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GH_TxPowerHT40_2SDiff + 1, value + 154 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GH_TxPowerHT40_2SDiff + 2, value + 160 * 2, 2);
|
|
} else if (offset == EEPROM_5GL_TxPowerHT20Diff) {
|
|
get_array_val(hwinfo + EEPROM_5GL_TxPowerHT20Diff, value + 35 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GL_TxPowerHT20Diff + 1, value + 45 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GL_TxPowerHT20Diff + 2, value + 55 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GM_TxPowerHT20Diff, value + 99 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GM_TxPowerHT20Diff + 1, value + 113 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GM_TxPowerHT20Diff + 2, value + 127 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GH_TxPowerHT20Diff, value + 148 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GH_TxPowerHT20Diff + 1, value + 154 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GH_TxPowerHT20Diff + 2, value + 160 * 2, 2);
|
|
} else if (offset == EEPROM_5GL_TxPowerOFDMDiff) {
|
|
get_array_val(hwinfo + EEPROM_5GL_TxPowerOFDMDiff, value + 35 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GL_TxPowerOFDMDiff + 1, value + 45 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GL_TxPowerOFDMDiff + 2, value + 55 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GM_TxPowerOFDMDiff, value + 99 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GM_TxPowerOFDMDiff + 1, value + 113 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GM_TxPowerOFDMDiff + 2, value + 127 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GH_TxPowerOFDMDiff, value + 148 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GH_TxPowerOFDMDiff + 1, value + 154 * 2, 2);
|
|
get_array_val(hwinfo + EEPROM_5GH_TxPowerOFDMDiff + 2, value + 160 * 2, 2);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
if (offset == 0 || offset == 0x32) {
|
|
for (i = 0; i < 0x32; i++) {
|
|
get_array_val(hwinfo + offset + i, value + i * 2, 2);
|
|
}
|
|
} else if (offset == EEPROM_8812_MACADDRESS) {
|
|
for (i = 0; i < MACADDRLEN; i++) {
|
|
get_array_val(hwinfo + offset + i, value + i * 2, 2);
|
|
}
|
|
} else if (offset == EEPROM_8812_THERMAL_METER ||
|
|
offset == EEPROM_8812_XTAL_K ) {
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
} else if ((offset == EEPROM_2G_CCK1T_TxPower + PATHA_OFFSET) ||
|
|
(offset == EEPROM_2G_CCK1T_TxPower + PATHB_OFFSET) ||
|
|
(offset == EEPROM_2G_HT401S_TxPower + PATHA_OFFSET) ||
|
|
(offset == EEPROM_2G_HT401S_TxPower + PATHB_OFFSET) ||
|
|
(offset == EEPROM_2G_HT201S_TxPowerDiff + PATHA_OFFSET) ||
|
|
(offset == EEPROM_2G_HT201S_TxPowerDiff + PATHA_OFFSET) ||
|
|
(offset == EEPROM_2G_OFDM1T_TxPowerDiff + PATHA_OFFSET)) {
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
get_array_val(hwinfo + offset + 1, value + 3 * 2, 2);
|
|
get_array_val(hwinfo + offset + 2, value + 9 * 2, 2);
|
|
} else if (offset == EEPROM_5G_HT401S_TxPower + PATHA_OFFSET) {
|
|
for (i = 0 ; i < MAX_5G_CHNLGRP ; i++)
|
|
get_array_val(hwinfo + offset + i, value + i * 2, 2);
|
|
} else if (offset == EEPROM_5G_HT401S_TxPower + PATHB_OFFSET) {
|
|
for (i = 0 ; i < MAX_5G_CHNLGRP ; i++)
|
|
get_array_val(hwinfo + offset + i, value + i * 2, 2);
|
|
} else if (offset == EEPROM_5G_HT201S_TxPowerDiff + PATHA_OFFSET) {
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
} else if (offset == EEPROM_5G_HT201S_TxPowerDiff + PATHB_OFFSET) {
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
} else if (offset == EEPROM_5G_HT402S_TxPowerDiff + PATHA_OFFSET) {
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
} else if (offset == EEPROM_5G_HT402S_TxPowerDiff + PATHB_OFFSET) {
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
} else if (offset == EEPROM_5G_HT801S_TxPowerDiff + PATHA_OFFSET) {
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
} else if (offset == EEPROM_5G_HT801S_TxPowerDiff + PATHB_OFFSET) {
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
} else if (offset == EEPROM_5G_HT802S_TxPowerDiff + PATHA_OFFSET) {
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
} else if (offset == EEPROM_5G_HT802S_TxPowerDiff + PATHB_OFFSET) {
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
} else if (offset == EEPROM_2G_HT201S_TxPowerDiff + PATHA_OFFSET) {
|
|
for (i = 0 ; i < MAX_2G_CHNLGRP ; i++)
|
|
get_array_val(hwinfo + offset + i, value + i * 2, 2);
|
|
} else if (offset == EEPROM_2G_HT201S_TxPowerDiff + PATHB_OFFSET) {
|
|
for (i = 0 ; i < MAX_2G_CHNLGRP ; i++)
|
|
get_array_val(hwinfo + offset + i, value + i * 2, 2);
|
|
} else if (offset == EEPROM_2G_HT402S_TxPowerDiff + PATHA_OFFSET) {
|
|
for (i = 0 ; i < MAX_2G_CHNLGRP ; i++)
|
|
get_array_val(hwinfo + offset + i, value + i * 2, 2);
|
|
} else if (offset == EEPROM_2G_HT402S_TxPowerDiff + PATHB_OFFSET) {
|
|
for (i = 0 ; i < MAX_2G_CHNLGRP ; i++)
|
|
get_array_val(hwinfo + offset + i, value + i * 2, 2);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if(GET_CHIP_VER(priv) == VERSION_8188E){
|
|
if (offset == 0 || offset == 0x32) {
|
|
for (i = 0; i < 0x32; i++) {
|
|
get_array_val(hwinfo + offset + i, value + i * 2, 2);
|
|
}
|
|
}else if (offset == EEPROM_MAC_ADDR_88E) {
|
|
for (i = 0; i < MACADDRLEN; i++) {
|
|
get_array_val(hwinfo + offset + i, value + i * 2, 2);
|
|
}
|
|
} else if (offset == EEPROM_THERMAL_METER_88E ||
|
|
offset == EEPROM_XTAL_88E) {
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
}
|
|
#ifdef CONFIG_SDIO_HCI
|
|
else if (offset == EEPROM_ChannelPlan_88E) {
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
}
|
|
else if( offset == EEPROM_88E_SDIOTYPE ) {
|
|
printk("val=%c\n", *value);
|
|
|
|
if ( *value == '2' ) {
|
|
hwinfo[offset] = 0x3F;
|
|
hwinfo[offset+1] = 0x00;
|
|
hwinfo[offset+2] = 0xFF;
|
|
hwinfo[offset+3] = 0x02;
|
|
hwinfo[offset+4] = 0x32;
|
|
hwinfo[offset+5] = 0x00;
|
|
hwinfo[offset+6] = 0x00;
|
|
} else if ( *value == '3' ) {
|
|
hwinfo[offset] = 0x6E;
|
|
//hwinfo[offset+1] = 0x51;
|
|
hwinfo[offset+1] = 0x50; // no DDR
|
|
hwinfo[offset+2] = 0x01;
|
|
hwinfo[offset+3] = 0x03;
|
|
hwinfo[offset+4] = 0x43;
|
|
hwinfo[offset+5] = 0xFF;
|
|
hwinfo[offset+6] = 0xFF;
|
|
}
|
|
}
|
|
#endif
|
|
else if (offset == EEPROM_TX_PWR_INX_88E){ // CCK_A
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
get_array_val(hwinfo + offset + 1, value + 2 * 2, 2);
|
|
get_array_val(hwinfo + offset + 2, value + 5 * 2, 2);
|
|
get_array_val(hwinfo + offset + 3, value + 8 * 2, 2);
|
|
get_array_val(hwinfo + offset + 4, value + 11 * 2, 2);
|
|
get_array_val(hwinfo + offset + 5, value + 13 * 2, 2);
|
|
|
|
} else if (offset == EEPROM_TX_PWR_INX_88E + 6){ // HT40_1S_A
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
get_array_val(hwinfo + offset + 1, value + 2 * 2, 2);
|
|
get_array_val(hwinfo + offset + 2, value + 5 * 2, 2);
|
|
get_array_val(hwinfo + offset + 3, value + 8 * 2, 2);
|
|
get_array_val(hwinfo + offset + 4, value + 11 * 2, 2);
|
|
} else if (offset == EEPROM_TX_PWR_INX_88E + 11){ //DIFF_HT20_OFDM
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if 0
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
if(GET_CHIP_VER(priv) == VERSION_8192E){
|
|
if (offset == 0 || offset == 0x32) {
|
|
for (i = 0; i < 0x32; i++) {
|
|
get_array_val(hwinfo + offset + i, value + i * 2, 2);
|
|
}
|
|
}else if (offset == EEPROM_MAC_ADDR_8192EE) {
|
|
for (i = 0; i < MACADDRLEN; i++) {
|
|
get_array_val(hwinfo + offset + i, value + i * 2, 2);
|
|
}
|
|
} else if (offset == EEPROM_THERMAL_METER_8192E ||
|
|
offset == EEPROM_XTAL_8192E) {
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
} else if ((offset == EEPROM_TX_PWR_INX_8192E + PATHA_OFFSET)||
|
|
(offset == EEPROM_TX_PWR_INX_8192E + PATHB_OFFSET)){ // CCK_A and CCK_B
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
get_array_val(hwinfo + offset + 1, value + 2 * 2, 2);
|
|
get_array_val(hwinfo + offset + 2, value + 5 * 2, 2);
|
|
get_array_val(hwinfo + offset + 3, value + 8 * 2, 2);
|
|
get_array_val(hwinfo + offset + 4, value + 11 * 2, 2);
|
|
get_array_val(hwinfo + offset + 5, value + 13 * 2, 2);
|
|
|
|
} else if ((offset == EEPROM_TX_PWR_INX_8192E + PATHA_OFFSET + 6)||
|
|
(offset == EEPROM_TX_PWR_INX_8192E + PATHB_OFFSET + 6)){ // HT40_1S_A and HT40_1S_B
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
get_array_val(hwinfo + offset + 1, value + 2 * 2, 2);
|
|
get_array_val(hwinfo + offset + 2, value + 5 * 2, 2);
|
|
get_array_val(hwinfo + offset + 3, value + 8 * 2, 2);
|
|
get_array_val(hwinfo + offset + 4, value + 11 * 2, 2);
|
|
} else if (offset == EEPROM_TX_PWR_INX_8192E + PATHA_OFFSET + 11){ //DIFF_HT20_OFDM
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
} else if (offset == EEPROM_TX_PWR_INX_8192E + PATHA_OFFSET + 12){ //DIFF_HT40_2S_HT20_2S
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
if(GET_CHIP_VER(priv) == VERSION_8192E)
|
|
{
|
|
if (offset == 0 || offset == 0x32)
|
|
{
|
|
for (i = 0; i < 0x32; i++)
|
|
get_array_val(hwinfo + offset + i, value + i * 2, 2);
|
|
}
|
|
else if (offset == EEPROM_92E_MACADDRESS)
|
|
{
|
|
for (i = 0; i < MACADDRLEN; i++)
|
|
get_array_val(hwinfo + offset + i, value + i * 2, 2);
|
|
}
|
|
else if (offset == EEPROM_92E_THERMAL_METER || offset == EEPROM_92E_XTAL_K)
|
|
{
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
}
|
|
else if ( (offset == EEPROM_2G_CCK1T_TxPower + PATHA_OFFSET) || // CCK_A and CCK_B
|
|
(offset == EEPROM_2G_CCK1T_TxPower + PATHB_OFFSET))
|
|
{
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
get_array_val(hwinfo + offset + 1, value + 2 * 2, 2);
|
|
get_array_val(hwinfo + offset + 2, value + 5 * 2, 2);
|
|
get_array_val(hwinfo + offset + 3, value + 8 * 2, 2);
|
|
get_array_val(hwinfo + offset + 4, value + 11 * 2, 2);
|
|
get_array_val(hwinfo + offset + 5, value + 13 * 2, 2);
|
|
}
|
|
else if ( (offset == EEPROM_2G_HT401S_TxPower + PATHA_OFFSET) || // HT40_1S_A and HT40_1S_B
|
|
(offset == EEPROM_2G_HT401S_TxPower + PATHB_OFFSET))
|
|
{
|
|
get_array_val(hwinfo + offset, value, 2);
|
|
get_array_val(hwinfo + offset + 1, value + 2 * 2, 2);
|
|
get_array_val(hwinfo + offset + 2, value + 5 * 2, 2);
|
|
get_array_val(hwinfo + offset + 3, value + 8 * 2, 2);
|
|
get_array_val(hwinfo + offset + 4, value + 11 * 2, 2);
|
|
}
|
|
else if( (offset == EEPROM_2G_HT201S_TxPowerDiff + PATHA_OFFSET) || // TX_POWER_DIFF_HT20_A & TX_POWER_DIFF_HT20_OFDM_A
|
|
(offset == EEPROM_2G_HT201S_TxPowerDiff + PATHB_OFFSET) || // TX_POWER_DIFF_HT20_B & TX_POWER_DIFF_HT20_OFDM_B
|
|
(offset == EEPROM_2G_HT402S_TxPowerDiff + PATHA_OFFSET) || // TX_POWER_DIFF_HT40_2S_A
|
|
(offset == EEPROM_2G_HT402S_TxPowerDiff + PATHB_OFFSET)) // TX_POWER_DIFF_HT40_2S_B
|
|
{
|
|
unsigned char orig_value = hwinfo[offset],
|
|
input_value = (unsigned char)_atoi(value, 16);
|
|
|
|
if( (strcmp(priv->EfuseCmd[type], "HW_TX_POWER_DIFF_HT20_A") == 0) || // write [7:4]
|
|
(strcmp(priv->EfuseCmd[type], "HW_TX_POWER_DIFF_HT20_B") == 0) ||
|
|
(strcmp(priv->EfuseCmd[type], "HW_TX_POWER_DIFF_HT40_2S_A") == 0) ||
|
|
(strcmp(priv->EfuseCmd[type], "HW_TX_POWER_DIFF_HT40_2S_B") == 0))
|
|
{
|
|
hwinfo[offset] = (orig_value & 0x0f) | ((input_value << 4) & 0xf0);
|
|
}
|
|
else if((strcmp(priv->EfuseCmd[type], "HW_TX_POWER_DIFF_HT20_OFDM_A") == 0) || // write [3:0]
|
|
(strcmp(priv->EfuseCmd[type], "HW_TX_POWER_DIFF_HT20_OFDM_B") == 0))
|
|
{
|
|
hwinfo[offset] = (orig_value & 0xf0) | (input_value & 0x0f);
|
|
}
|
|
}
|
|
#ifdef CONFIG_SDIO_HCI
|
|
else if( offset == EEPROM_92E_SDIOTYPE ) {
|
|
printk("val=%c\n", *value);
|
|
|
|
if ( *value == '2' ) {
|
|
hwinfo[offset] = 0x3F;
|
|
hwinfo[offset+1] = 0x00;
|
|
// hwinfo[offset+2] = 0xFF;
|
|
hwinfo[offset+3] = 0x02;
|
|
hwinfo[offset+4] = 0x23;
|
|
hwinfo[offset+5] = 0x00;
|
|
hwinfo[offset+6] = 0x00;
|
|
} else if ( *value == '3' ) {
|
|
hwinfo[offset] = 0x6E;
|
|
hwinfo[offset+1] = 0x50; // [0] DDR50=0, avoid Data CRC error issue in DDR50
|
|
// hwinfo[offset+2] = 0xFF;
|
|
hwinfo[offset+3] = 0x03;
|
|
hwinfo[offset+4] = 0x34;
|
|
hwinfo[offset+5] = 0xFF;
|
|
hwinfo[offset+6] = 0xFF;
|
|
}
|
|
}
|
|
#endif
|
|
#if 0
|
|
else if (offset == 0x02 ) // EFUSE_TEST
|
|
{
|
|
unsigned char tmp_efuse[priv->EfuseMapLen];
|
|
int is_fail = 0;
|
|
int exec_cnt = _atoi(value, 10);
|
|
unsigned int j;
|
|
|
|
printk("***EFUSE_TEST BEGIN***\n");
|
|
for( j = 0 ; j != exec_cnt ; ++j )
|
|
{
|
|
if( (j != 0) && (j % 1000 == 0) )
|
|
printk("EFUSE_TEST execute %d times\n", j);
|
|
efuse_ReadAllMap(priv, &tmp_efuse[0]);
|
|
if( memcmp(&tmp_efuse[0], &priv->EfuseMap[EFUSE_INIT_MAP][0], priv->EfuseMapLen) != 0 )
|
|
{
|
|
is_fail = 1;
|
|
break;
|
|
}
|
|
}
|
|
printk("***EFUSE_TEST END***\n");
|
|
|
|
if( is_fail )
|
|
printk("EFUSE_TEST FAIL!!\n");
|
|
else
|
|
printk("EFUSE_TEST SUCCESS!!\n");
|
|
}
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
static int converToFlashFormat(struct rtl8192cd_priv *priv, unsigned char *out, unsigned char *hwinfo, int type)
|
|
{
|
|
int i, offset, len = 0;
|
|
offset = getEEPROMOffset(priv, type);
|
|
|
|
if (offset < 0)
|
|
return 0;
|
|
|
|
len += sprintf(out, "%s=", priv->EfuseCmd[type]);
|
|
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188C) || (GET_CHIP_VER(priv) == VERSION_8192C)) {
|
|
if (offset == EEPROM_MACADDRESS) {
|
|
for (i = 0; i < MACADDRLEN; i++) {
|
|
sprintf(out + len, "%02x", hwinfo[offset + i]);
|
|
len += 2;
|
|
}
|
|
} else if (offset == EEPROM_THERMAL_METER) {
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
} else {
|
|
for (i = 0; i < MAX_2G_CHANNEL_NUM; i++) {
|
|
if (i < 3) {
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
} else if (i < 9) {
|
|
sprintf(out + len, "%02x", hwinfo[offset + 1]);
|
|
len += 2;
|
|
} else {
|
|
sprintf(out + len, "%02x", hwinfo[offset + 2]);
|
|
len += 2;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
if (offset == EEPROM_MAC0_MACADDRESS || offset == EEPROM_MAC1_MACADDRESS) {
|
|
for (i = 0; i < MACADDRLEN; i++) {
|
|
sprintf(out + len, "%02x", hwinfo[offset + i]);
|
|
len += 2;
|
|
}
|
|
} else if (offset == EEPROM_92D_THERMAL_METER ||
|
|
offset == EEPROM_92D_TRSW_CTRL ||
|
|
offset == EEPROM_92D_PAPE_CTRL ||
|
|
offset == EEPROM_92D_XTAL_K ) {
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
} else if ((offset == EEPROM_2G_TxPowerCCK) ||
|
|
(offset == EEPROM_2G_TxPowerCCK + 3) ||
|
|
(offset == EEPROM_2G_TxPowerHT40_1S) ||
|
|
(offset == EEPROM_2G_TxPowerHT40_1S + 3) ||
|
|
(offset == EEPROM_2G_TxPowerHT40_2SDiff) ||
|
|
(offset == EEPROM_2G_TxPowerHT20Diff) ||
|
|
(offset == EEPROM_2G_TxPowerOFDMDiff)) {
|
|
for (i = 0; i < MAX_2G_CHANNEL_NUM; i++) {
|
|
if (i < 3) {
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
} else if (i < 9) {
|
|
sprintf(out + len, "%02x", hwinfo[offset + 1]);
|
|
len += 2;
|
|
} else {
|
|
sprintf(out + len, "%02x", hwinfo[offset + 2]);
|
|
len += 2;
|
|
}
|
|
}
|
|
} else if (offset == EEPROM_5GL_TxPowerHT40_1S) {
|
|
for (i = 0; i < MAX_5G_CHANNEL_NUM; i++) {
|
|
if (i >= 35 && i <= 63) { // ch 36 ~ 64
|
|
if (i >= 35 && i <= 43) { // ch 36 ~ 44
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GL_TxPowerHT40_1S]);
|
|
len += 2;
|
|
} else if (i >= 45 && i <= 53) { // ch 46 ~ 54
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GL_TxPowerHT40_1S + 1]);
|
|
len += 2;
|
|
} else if (i >= 55 && i <= 63) { // ch 56 ~ 64
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GL_TxPowerHT40_1S + 2]);
|
|
len += 2;
|
|
} else {
|
|
sprintf(out + len, "00");
|
|
len += 2;
|
|
}
|
|
} else if (i >= 99 && i <= 139) { // ch 100 ~ 140
|
|
if (i >= 99 && i <= 111) { // ch 100 ~ 112
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GM_TxPowerHT40_1S]);
|
|
len += 2;
|
|
} else if (i >= 113 && i <= 125) { // ch 114 ~ 126
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GM_TxPowerHT40_1S + 1]);
|
|
len += 2;
|
|
} else if (i >= 127 && i <= 139) { // ch 128 ~ 140
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GM_TxPowerHT40_1S + 2]);
|
|
len += 2;
|
|
} else {
|
|
sprintf(out + len, "00");
|
|
len += 2;
|
|
}
|
|
} else if (i >= 148 && i <= 164 ) { // ch 149 ~ 165
|
|
if (i >= 148 && i <= 152) { // ch 149 ~ 153
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GH_TxPowerHT40_1S]);
|
|
len += 2;
|
|
} else if (i >= 154 && i <= 158) { // ch 155 ~ 159
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GH_TxPowerHT40_1S + 1]);
|
|
len += 2;
|
|
} else if (i >= 160 && i <= 164) { // ch 161 ~ 165
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GH_TxPowerHT40_1S + 2]);
|
|
len += 2;
|
|
} else {
|
|
sprintf(out + len, "00");
|
|
len += 2;
|
|
}
|
|
} else {
|
|
sprintf(out + len, "00");
|
|
len += 2;
|
|
}
|
|
}
|
|
} else if (offset == EEPROM_5GL_TxPowerHT40_1S + 3) {
|
|
for (i = 0; i < MAX_5G_CHANNEL_NUM; i++) {
|
|
if (i >= 35 && i <= 63) { // ch 36 ~ 64
|
|
if (i >= 35 && i <= 43) { // ch 36 ~ 44
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GL_TxPowerHT40_1S + 3]);
|
|
len += 2;
|
|
} else if (i >= 45 && i <= 53) { // ch 46 ~ 54
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GL_TxPowerHT40_1S + 4]);
|
|
len += 2;
|
|
} else if (i >= 55 && i <= 63) { // ch 56 ~ 64
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GL_TxPowerHT40_1S + 5]);
|
|
len += 2;
|
|
} else {
|
|
sprintf(out + len, "00");
|
|
len += 2;
|
|
}
|
|
} else if (i >= 99 && i <= 139) { // ch 100 ~ 140
|
|
if (i >= 99 && i <= 111) { // ch 100 ~ 112
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GM_TxPowerHT40_1S + 3]);
|
|
len += 2;
|
|
} else if (i >= 113 && i <= 125) { // ch 114 ~ 126
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GM_TxPowerHT40_1S + 4]);
|
|
len += 2;
|
|
} else if (i >= 127 && i <= 139) { // ch 128 ~ 140
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GM_TxPowerHT40_1S + 5]);
|
|
len += 2;
|
|
} else {
|
|
sprintf(out + len, "00");
|
|
len += 2;
|
|
}
|
|
} else if (i >= 148 && i <= 164 ) { // ch 149 ~ 165
|
|
if (i >= 148 && i <= 152) { // ch 149 ~ 153
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GH_TxPowerHT40_1S + 3]);
|
|
len += 2;
|
|
} else if (i >= 154 && i <= 158) { // ch 155 ~ 159
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GH_TxPowerHT40_1S + 4]);
|
|
len += 2;
|
|
} else if (i >= 160 && i <= 164) { // ch 161 ~ 165
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GH_TxPowerHT40_1S + 5]);
|
|
len += 2;
|
|
} else {
|
|
sprintf(out + len, "00");
|
|
len += 2;
|
|
}
|
|
} else {
|
|
sprintf(out + len, "00");
|
|
len += 2;
|
|
}
|
|
}
|
|
} else if (offset == EEPROM_5GL_TxPowerHT40_2SDiff) {
|
|
for (i = 0; i < MAX_5G_CHANNEL_NUM; i++) {
|
|
if (i >= 35 && i <= 63) { // ch 36 ~ 64
|
|
if (i >= 35 && i <= 43) { // ch 36 ~ 44
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GL_TxPowerHT40_2SDiff]);
|
|
len += 2;
|
|
} else if (i >= 45 && i <= 53) { // ch 46 ~ 54
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GL_TxPowerHT40_2SDiff + 1]);
|
|
len += 2;
|
|
} else if (i >= 55 && i <= 63) { // ch 56 ~ 64
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GL_TxPowerHT40_2SDiff + 2]);
|
|
len += 2;
|
|
} else {
|
|
sprintf(out + len, "00");
|
|
len += 2;
|
|
}
|
|
} else if (i >= 99 && i <= 139) { // ch 100 ~ 140
|
|
if (i >= 99 && i <= 111) { // ch 100 ~ 112
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GM_TxPowerHT40_2SDiff]);
|
|
len += 2;
|
|
} else if (i >= 113 && i <= 125) { // ch 114 ~ 126
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GM_TxPowerHT40_2SDiff + 1]);
|
|
len += 2;
|
|
} else if (i >= 127 && i <= 139) { // ch 128 ~ 140
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GM_TxPowerHT40_2SDiff + 2]);
|
|
len += 2;
|
|
} else {
|
|
sprintf(out + len, "00");
|
|
len += 2;
|
|
}
|
|
} else if (i >= 148 && i <= 164 ) { // ch 149 ~ 165
|
|
if (i >= 148 && i <= 152) { // ch 149 ~ 153
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GH_TxPowerHT40_2SDiff]);
|
|
len += 2;
|
|
} else if (i >= 154 && i <= 158) { // ch 155 ~ 159
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GH_TxPowerHT40_2SDiff + 1]);
|
|
len += 2;
|
|
} else if (i >= 160 && i <= 164) { // ch 161 ~ 165
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GH_TxPowerHT40_2SDiff + 2]);
|
|
len += 2;
|
|
} else {
|
|
sprintf(out + len, "00");
|
|
len += 2;
|
|
}
|
|
} else {
|
|
sprintf(out + len, "00");
|
|
len += 2;
|
|
}
|
|
}
|
|
} else if (offset == EEPROM_5GL_TxPowerHT20Diff) {
|
|
for (i = 0; i < MAX_5G_CHANNEL_NUM; i++) {
|
|
if (i >= 35 && i <= 63) { // ch 36 ~ 64
|
|
if (i >= 35 && i <= 43) { // ch 36 ~ 44
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GL_TxPowerHT20Diff]);
|
|
len += 2;
|
|
} else if (i >= 45 && i <= 53) { // ch 46 ~ 54
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GL_TxPowerHT20Diff + 1]);
|
|
len += 2;
|
|
} else if (i >= 55 && i <= 63) { // ch 56 ~ 64
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GL_TxPowerHT20Diff + 2]);
|
|
len += 2;
|
|
} else {
|
|
sprintf(out + len, "00");
|
|
len += 2;
|
|
}
|
|
} else if (i >= 99 && i <= 139) { // ch 100 ~ 140
|
|
if (i >= 99 && i <= 111) { // ch 100 ~ 112
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GM_TxPowerHT20Diff]);
|
|
len += 2;
|
|
} else if (i >= 113 && i <= 125) { // ch 114 ~ 126
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GM_TxPowerHT20Diff + 1]);
|
|
len += 2;
|
|
} else if (i >= 127 && i <= 139) { // ch 128 ~ 140
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GM_TxPowerHT20Diff + 2]);
|
|
len += 2;
|
|
} else {
|
|
sprintf(out + len, "00");
|
|
len += 2;
|
|
}
|
|
} else if (i >= 148 && i <= 164 ) { // ch 149 ~ 165
|
|
if (i >= 148 && i <= 152) { // ch 149 ~ 153
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GH_TxPowerHT20Diff]);
|
|
len += 2;
|
|
} else if (i >= 154 && i <= 158) { // ch 155 ~ 159
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GH_TxPowerHT20Diff + 1]);
|
|
len += 2;
|
|
} else if (i >= 160 && i <= 164) { // ch 161 ~ 165
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GH_TxPowerHT20Diff + 2]);
|
|
len += 2;
|
|
} else {
|
|
sprintf(out + len, "00");
|
|
len += 2;
|
|
}
|
|
} else {
|
|
sprintf(out + len, "00");
|
|
len += 2;
|
|
}
|
|
}
|
|
} else if (offset == EEPROM_5GL_TxPowerOFDMDiff) {
|
|
for (i = 0; i < MAX_5G_CHANNEL_NUM; i++) {
|
|
if (i >= 35 && i <= 63) { // ch 36 ~ 64
|
|
if (i >= 35 && i <= 43) { // ch 36 ~ 44
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GL_TxPowerOFDMDiff]);
|
|
len += 2;
|
|
} else if (i >= 45 && i <= 53) { // ch 46 ~ 54
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GL_TxPowerOFDMDiff + 1]);
|
|
len += 2;
|
|
} else if (i >= 55 && i <= 63) { // ch 56 ~ 64
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GL_TxPowerOFDMDiff + 2]);
|
|
len += 2;
|
|
} else {
|
|
sprintf(out + len, "00");
|
|
len += 2;
|
|
}
|
|
} else if (i >= 99 && i <= 139) { // ch 100 ~ 140
|
|
if (i >= 99 && i <= 111) { // ch 100 ~ 112
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GM_TxPowerOFDMDiff]);
|
|
len += 2;
|
|
} else if (i >= 113 && i <= 125) { // ch 114 ~ 126
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GM_TxPowerOFDMDiff + 1]);
|
|
len += 2;
|
|
} else if (i >= 127 && i <= 139) { // ch 128 ~ 140
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GM_TxPowerOFDMDiff + 2]);
|
|
len += 2;
|
|
} else {
|
|
sprintf(out + len, "00");
|
|
len += 2;
|
|
}
|
|
} else if (i >= 148 && i <= 164 ) { // ch 149 ~ 165
|
|
if (i >= 148 && i <= 152) { // ch 149 ~ 153
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GH_TxPowerOFDMDiff]);
|
|
len += 2;
|
|
} else if (i >= 154 && i <= 158) { // ch 155 ~ 159
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GH_TxPowerOFDMDiff + 1]);
|
|
len += 2;
|
|
} else if (i >= 160 && i <= 164) { // ch 161 ~ 165
|
|
sprintf(out + len, "%02x", hwinfo[EEPROM_5GH_TxPowerOFDMDiff + 2]);
|
|
len += 2;
|
|
} else {
|
|
sprintf(out + len, "00");
|
|
len += 2;
|
|
}
|
|
} else {
|
|
sprintf(out + len, "00");
|
|
len += 2;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E) {
|
|
if (offset == EEPROM_8812_MACADDRESS) {
|
|
for (i = 0; i < MACADDRLEN; i++) {
|
|
sprintf(out + len, "%02x", hwinfo[offset + i]);
|
|
len += 2;
|
|
}
|
|
} else if (offset == EEPROM_8812_THERMAL_METER ||
|
|
offset == EEPROM_8812_XTAL_K ) {
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
} else if ((offset == EEPROM_2G_CCK1T_TxPower + PATHA_OFFSET) ||
|
|
(offset == EEPROM_2G_CCK1T_TxPower + PATHB_OFFSET) ||
|
|
(offset == EEPROM_2G_HT401S_TxPower + PATHA_OFFSET) ||
|
|
(offset == EEPROM_2G_HT401S_TxPower + PATHB_OFFSET) ) {
|
|
for (i = 0; i < MAX_2G_CHANNEL_NUM; i++) {
|
|
int chnl_gp = find_2gchnlgroup(i);
|
|
|
|
if (chnl_gp > -1) {
|
|
sprintf(out + len, "%02x", hwinfo[offset + chnl_gp]);
|
|
len += 2;
|
|
} else {
|
|
sprintf(out + len, "%02x", 0);
|
|
len += 2;
|
|
}
|
|
}
|
|
} else if (offset == EEPROM_5G_HT401S_TxPower + PATHA_OFFSET) {
|
|
for (i = 0; i < MAX_5G_CHNLGRP; i++) {
|
|
sprintf(out + len, "%02x", hwinfo[offset + i]);
|
|
len += 2;
|
|
}
|
|
} else if (offset == EEPROM_5G_HT401S_TxPower + PATHB_OFFSET) {
|
|
for (i = 0; i < MAX_5G_CHNLGRP; i++) {
|
|
sprintf(out + len, "%02x", hwinfo[offset + i]);
|
|
len += 2;
|
|
}
|
|
} else if (offset == EEPROM_5G_HT201S_TxPowerDiff + PATHA_OFFSET) {
|
|
for (i = 0; i < MAX_5G_CHNLGRP; i++) {
|
|
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
}
|
|
} else if (offset == EEPROM_5G_HT201S_TxPowerDiff + PATHB_OFFSET) {
|
|
for (i = 0; i < MAX_5G_CHNLGRP; i++) {
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
}
|
|
} else if (offset == EEPROM_5G_HT402S_TxPowerDiff + PATHA_OFFSET) {
|
|
for (i = 0; i < MAX_5G_CHNLGRP; i++) {
|
|
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
}
|
|
} else if (offset == EEPROM_5G_HT402S_TxPowerDiff + PATHB_OFFSET) {
|
|
for (i = 0; i < MAX_5G_CHNLGRP; i++) {
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
}
|
|
} else if (offset == EEPROM_5G_HT801S_TxPowerDiff + PATHA_OFFSET) {
|
|
for (i = 0; i < MAX_5G_CHNLGRP; i++) {
|
|
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
}
|
|
} else if (offset == EEPROM_5G_HT801S_TxPowerDiff + PATHB_OFFSET) {
|
|
for (i = 0; i < MAX_5G_CHNLGRP; i++) {
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
}
|
|
} else if (offset == EEPROM_5G_HT802S_TxPowerDiff + PATHA_OFFSET) {
|
|
for (i = 0; i < MAX_5G_CHNLGRP; i++) {
|
|
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
}
|
|
} else if (offset == EEPROM_5G_HT802S_TxPowerDiff + PATHB_OFFSET) {
|
|
for (i = 0; i < MAX_5G_CHNLGRP; i++) {
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
}
|
|
} else if (offset == EEPROM_2G_HT201S_TxPowerDiff + PATHA_OFFSET) {
|
|
for (i = 0; i < MAX_2G_CHANNEL_NUM; i++) {
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
}
|
|
} else if (offset == EEPROM_2G_HT201S_TxPowerDiff + PATHB_OFFSET) {
|
|
for (i = 0; i < MAX_2G_CHANNEL_NUM; i++) {
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
}
|
|
} else if (offset == EEPROM_2G_HT402S_TxPowerDiff + PATHA_OFFSET) {
|
|
for (i = 0; i < MAX_2G_CHANNEL_NUM; i++) {
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
}
|
|
} else if (offset == EEPROM_2G_HT402S_TxPowerDiff + PATHA_OFFSET) {
|
|
for (i = 0; i < MAX_2G_CHANNEL_NUM; i++) {
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if(GET_CHIP_VER(priv) == VERSION_8188E){
|
|
if (offset == EEPROM_MAC_ADDR_88E) {
|
|
for (i = 0; i < MACADDRLEN; i++) {
|
|
sprintf(out + len, "%02x", hwinfo[offset + i]);
|
|
len += 2;
|
|
}
|
|
} else if (offset == EEPROM_THERMAL_METER_88E ||
|
|
offset == EEPROM_XTAL_88E) {
|
|
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
}
|
|
#ifdef CONFIG_SDIO_HCI
|
|
else if (offset == EEPROM_ChannelPlan_88E) {
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
}
|
|
#endif
|
|
else if (offset == EEPROM_TX_PWR_INX_88E || // CCK_A
|
|
offset == EEPROM_TX_PWR_INX_88E + 6){ // HT40_1S_A
|
|
|
|
for (i = 0; i < MAX_2G_CHANNEL_NUM; i++) {
|
|
if (i < 2) {
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
} else if (i < 5) {
|
|
sprintf(out + len, "%02x", hwinfo[offset + 1]);
|
|
len += 2;
|
|
} else if (i < 8) {
|
|
sprintf(out + len, "%02x", hwinfo[offset + 2]);
|
|
len += 2;
|
|
} else if (i < 11) {
|
|
sprintf(out + len, "%02x", hwinfo[offset + 3]);
|
|
len += 2;
|
|
} else if (i < 13) {
|
|
sprintf(out + len, "%02x", hwinfo[offset + 4]);
|
|
len += 2;
|
|
} else {
|
|
if( offset == EEPROM_TX_PWR_INX_88E)
|
|
sprintf(out + len, "%02x", hwinfo[offset + 5]);
|
|
else
|
|
sprintf(out + len, "%02x", hwinfo[offset + 4]);
|
|
len += 2;
|
|
}
|
|
}
|
|
}
|
|
else if (offset == EEPROM_TX_PWR_INX_88E + 11 ){ // DIFF_HT20_OFDM
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
}
|
|
#ifdef CONFIG_SDIO_HCI
|
|
else if ( offset == EEPROM_88E_SDIOTYPE ) {
|
|
for( i = 0 ; i < SDIOTYPELEN; i++ )
|
|
len += sprintf(out + len, "%02x", hwinfo[offset + i]);
|
|
}
|
|
#endif
|
|
|
|
}
|
|
#endif
|
|
|
|
#if defined(CONFIG_WLAN_HAL_8192EE)
|
|
if ( GET_CHIP_VER(priv)==VERSION_8192E )
|
|
{
|
|
switch(offset)
|
|
{
|
|
case EEPROM_2G_CCK1T_TxPower + PATHA_OFFSET: // HW_TX_POWER_CCK_A
|
|
case EEPROM_2G_CCK1T_TxPower + PATHB_OFFSET: // HW_TX_POWER_CCK_B
|
|
for ( i = 0; i < MAX_2G_CHANNEL_NUM ; i++ )
|
|
{
|
|
int ch_gp = find_2gchnlgroup(i);
|
|
if(ch_gp > -1)
|
|
len += sprintf(out + len, "%02x", hwinfo[offset + ch_gp]);
|
|
}
|
|
break;
|
|
case EEPROM_2G_HT401S_TxPower + PATHA_OFFSET: // HW_TX_POWER_HT40_1S_A
|
|
case EEPROM_2G_HT401S_TxPower + PATHB_OFFSET: // HW_TX_POWER_HT40_1S_B
|
|
for ( i = 0; i < MAX_2G_CHANNEL_NUM ; i++ )
|
|
{
|
|
int ch_gp = find_2gchnlgroup(i);
|
|
if(ch_gp > -1)
|
|
{
|
|
if(i == 13)
|
|
ch_gp -= 1;
|
|
len += sprintf(out + len, "%02x", hwinfo[offset + ch_gp]);
|
|
}
|
|
}
|
|
break;
|
|
case EEPROM_2G_HT201S_TxPowerDiff + PATHA_OFFSET: // HW_TX_POWER_DIFF_HT20_A and HW_TX_POWER_DIFF_HT20_OFDM_A
|
|
for ( i = 0; i < MAX_2G_CHANNEL_NUM ; i++ )
|
|
{
|
|
if( strcmp(priv->EfuseCmd[type], "HW_TX_POWER_DIFF_HT20_A") == 0 )
|
|
len += sprintf(out + len, "%02x", (hwinfo[offset]&0xf0) >> 4);
|
|
else if( strcmp(priv->EfuseCmd[type], "HW_TX_POWER_DIFF_HT20_OFDM_A") == 0 )
|
|
len += sprintf(out + len, "%02x", (hwinfo[offset]&0x0f) );
|
|
}
|
|
break;
|
|
case EEPROM_2G_HT201S_TxPowerDiff + PATHB_OFFSET: // HW_TX_POWER_DIFF_HT20_B and HW_TX_POWER_DIFF_HT20_OFDM_B
|
|
for ( i = 0; i < MAX_2G_CHANNEL_NUM ; i++ )
|
|
{
|
|
if( strcmp(priv->EfuseCmd[type], "HW_TX_POWER_DIFF_HT20_B") == 0 )
|
|
len += sprintf(out + len, "%02x", (hwinfo[offset]&0xf0));
|
|
else if( strcmp(priv->EfuseCmd[type], "HW_TX_POWER_DIFF_HT20_OFDM_B") == 0 )
|
|
len += sprintf(out + len, "%02x", (hwinfo[offset]&0x0f) << 4 );
|
|
}
|
|
break;
|
|
case EEPROM_2G_HT402S_TxPowerDiff + PATHA_OFFSET: // HW_TX_POWER_DIFF_HT40_2S_A
|
|
case EEPROM_2G_HT402S_TxPowerDiff + PATHB_OFFSET: // HW_TX_POWER_DIFF_HT40_2S_B
|
|
for ( i = 0; i < MAX_2G_CHANNEL_NUM ; i++ )
|
|
{
|
|
if( strcmp(priv->EfuseCmd[type], "HW_TX_POWER_DIFF_HT40_2S_A") == 0 )
|
|
len += sprintf(out + len, "%02x", (hwinfo[offset]&0xf0) >> 4);
|
|
else if( strcmp(priv->EfuseCmd[type], "HW_TX_POWER_DIFF_HT40_2S_B") == 0 )
|
|
len += sprintf(out + len, "%02x", (hwinfo[offset]&0xf0));
|
|
}
|
|
break;
|
|
case EEPROM_92E_MACADDRESS: // HW_WLAN0_WLAN_ADDR
|
|
for( i = 0 ; i < MACADDRLEN ; i++ )
|
|
len += sprintf(out + len, "%02x", hwinfo[offset + i]);
|
|
break;
|
|
case EEPROM_92E_THERMAL_METER: // HW_11N_THER
|
|
case EEPROM_92E_XTAL_K: // HW_11N_XCAP
|
|
len += sprintf(out + len, "%02x", hwinfo[offset]);
|
|
break;
|
|
#ifdef CONFIG_SDIO_HCI
|
|
case EEPROM_92E_SDIOTYPE:
|
|
for( i = 0 ; i < SDIOTYPELEN; i++ )
|
|
len += sprintf(out + len, "%02x", hwinfo[offset + i]);
|
|
break;
|
|
#endif
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if 0
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
if(GET_CHIP_VER(priv) == VERSION_8192E){
|
|
if (offset == EEPROM_MAC_ADDR_8192EE) {
|
|
for (i = 0; i < MACADDRLEN; i++) {
|
|
sprintf(out + len, "%02x", hwinfo[offset + i]);
|
|
len += 2;
|
|
}
|
|
} else if (offset == EEPROM_THERMAL_METER_8192E ||
|
|
offset == EEPROM_XTAL_8192E) {
|
|
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
} else if ((offset == EEPROM_TX_PWR_INX_8192E + PATHA_OFFSET)|| // CCK_A
|
|
(offset == EEPROM_TX_PWR_INX_8192E + PATHB_OFFSET)|| // CCK_B
|
|
(offset == EEPROM_TX_PWR_INX_8192E + PATHA_OFFSET + 6)|| // HT40_1S_A
|
|
(offset == EEPROM_TX_PWR_INX_8192E + PATHB_OFFSET + 6)){ // HT40_1S_B
|
|
|
|
for (i = 0; i < MAX_2G_CHANNEL_NUM; i++) {
|
|
if (i < 2) {
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
} else if (i < 5) {
|
|
sprintf(out + len, "%02x", hwinfo[offset + 1]);
|
|
len += 2;
|
|
} else if (i < 8) {
|
|
sprintf(out + len, "%02x", hwinfo[offset + 2]);
|
|
len += 2;
|
|
} else if (i < 11) {
|
|
sprintf(out + len, "%02x", hwinfo[offset + 3]);
|
|
len += 2;
|
|
} else if (i < 13) {
|
|
sprintf(out + len, "%02x", hwinfo[offset + 4]);
|
|
len += 2;
|
|
} else {
|
|
if((offset == EEPROM_TX_PWR_INX_8192E + PATHA_OFFSET)|| // CCK_A
|
|
(offset == EEPROM_TX_PWR_INX_8192E + PATHB_OFFSET)) // CCK_B
|
|
sprintf(out + len, "%02x", hwinfo[offset + 5]);
|
|
else
|
|
sprintf(out + len, "%02x", hwinfo[offset + 4]);
|
|
len += 2;
|
|
}
|
|
}
|
|
}
|
|
else if (offset == EEPROM_TX_PWR_INX_8192E + PATHA_OFFSET + 11 ){ // DIFF_HT20_OFDM
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
}
|
|
else if (offset == EEPROM_TX_PWR_INX_8192E + PATHA_OFFSET + 12 ){ // DIFF_HT40_2S_HT20_2S
|
|
sprintf(out + len, "%02x", hwinfo[offset]);
|
|
len += 2;
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
out[len] = '\0';
|
|
return len + 1;
|
|
}
|
|
|
|
|
|
int efuse_get(struct rtl8192cd_priv *priv, unsigned char *data)
|
|
{
|
|
int j, len;
|
|
#if 0
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188C) || (GET_CHIP_VER(priv) == VERSION_8192C))
|
|
para_num = EFUSECMD_NUM_92C;
|
|
#endif
|
|
#if defined(CONFIG_RTL_92D_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D)
|
|
para_num = EFUSECMD_NUM_92D;
|
|
#endif
|
|
#if defined(CONFIG_RTL_8812_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E)
|
|
para_num = EFUSECMD_NUM_8812;
|
|
#endif
|
|
#if defined(CONFIG_RTL_88E_SUPPORT)
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E)
|
|
para_num = EFUSECMD_NUM_88E;
|
|
#endif
|
|
#if defined(CONFIG_WLAN_HAL_8192EE)
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E)
|
|
para_num = EFUSECMD_NUM_92E;
|
|
#endif
|
|
#endif
|
|
|
|
for( j = 0 ; j < priv->EfuseCmdNum ; j++ )
|
|
{
|
|
if (strcmp(data, priv->EfuseCmd[j]) == 0)
|
|
{
|
|
len = converToFlashFormat(priv, data, &(priv->EfuseMap[EFUSE_INIT_MAP][0]), j);
|
|
//printk("%s\n", data);
|
|
return len;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
int efuse_set(struct rtl8192cd_priv *priv, unsigned char *data)
|
|
{
|
|
char *val;
|
|
int j;
|
|
#if 0
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188C) || (GET_CHIP_VER(priv) == VERSION_8192C))
|
|
para_num = EFUSECMD_NUM_92C;
|
|
#endif
|
|
#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT)
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192D) || (GET_CHIP_VER(priv) == VERSION_8812E))
|
|
para_num = EFUSECMD_NUM_92D;
|
|
#endif
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E)
|
|
para_num = EFUSECMD_NUM_88E;
|
|
#endif
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E)
|
|
para_num = EFUSECMD_NUM_92E;
|
|
#endif
|
|
#endif
|
|
|
|
for( j = 0 ; j < priv->EfuseCmdNum ; j++ )
|
|
{
|
|
val = get_value_by_token(data, priv->EfuseCmd[j]);
|
|
if(val)
|
|
shadowMapWrite(priv, j, val + 1, &(priv->EfuseMap[EFUSE_MODIFY_MAP][0]));
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
int efuse_sync(struct rtl8192cd_priv *priv, unsigned char *data)
|
|
{
|
|
DEBUG_INFO("efuse sync\n");
|
|
EFUSE_ShadowUpdate(priv);
|
|
return 0;
|
|
}
|
|
|
|
#ifdef RTK_NL80211
|
|
void read_efuse_mac_address(struct rtl8192cd_priv *priv,char * efusemac)
|
|
{
|
|
u16 efuse_MAC = 0;
|
|
if(!efusemac)
|
|
return;
|
|
|
|
EfuseInit(priv);
|
|
if (EfuseMapAlloc(priv) == FAIL) {
|
|
printk(KERN_ERR "%s: can't allocate efuse map\n", __func__);
|
|
return -ENOMEM;
|
|
}
|
|
|
|
if (EfuseCmdInit(priv) == FAIL) {
|
|
printk(KERN_ERR "%s: can't allocate efuse cmd\n", __func__);
|
|
return -ENOMEM;
|
|
}
|
|
|
|
EFUSE_ShadowMapUpdate(priv);
|
|
#ifdef CONFIG_RTL_92C_SUPPORT
|
|
if ((GET_CHIP_VER(priv) == VERSION_8188C) || (GET_CHIP_VER(priv) == VERSION_8192C)) {
|
|
efuse_MAC = EEPROM_MACADDRESS;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_92D_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8192D) {
|
|
#ifdef CONFIG_RTL_92D_DMDP
|
|
if (priv->pshare->wlandev_idx == 0) {
|
|
efuse_MAC = EEPROM_MAC0_MACADDRESS;
|
|
} else {
|
|
efuse_MAC = EEPROM_MAC1_MACADDRESS;
|
|
}
|
|
#else
|
|
efuse_MAC = EEPROM_MAC0_MACADDRESS;
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E)
|
|
efuse_MAC = EEPROM_MAC_ADDR_88E;
|
|
#endif
|
|
|
|
#ifdef CONFIG_WLAN_HAL_8192EE
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E) {
|
|
efuse_MAC = EEPROM_92E_MACADDRESS;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL_8812_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8812E)
|
|
efuse_MAC = EEPROM_8812_MACADDRESS;
|
|
#endif
|
|
//if (/*priv->AutoloadFailFlag==FALSE &&*/ priv->pmib->efuseEntry.enable_efuse == 1)
|
|
{
|
|
unsigned char *hwinfo = &(priv->EfuseMap[EFUSE_INIT_MAP][0]);
|
|
unsigned char *efuse_mac = hwinfo + efuse_MAC;
|
|
unsigned char zero[] = {0, 0, 0, 0, 0, 0}, mac[6];
|
|
|
|
memcpy(mac,efuse_mac, MACADDRLEN);
|
|
/*printk("wlan%d EFUSE MAC [%02x:%02x:%02x:%02x:%02x:%02x]\n", priv->pshare->wlandev_idx,
|
|
*mac, *(mac+1), *(mac+2), *(mac+3), *(mac+4), *(mac+5));*/
|
|
|
|
if (!memcmp(mac, zero, MACADDRLEN) || IS_MCAST(mac)) {
|
|
memcpy(mac, zero, MACADDRLEN);
|
|
}
|
|
memcpy(efusemac,mac,MACADDRLEN);
|
|
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#endif // EN_EFUSE
|
|
|
|
#ifdef TX_EARLY_MODE
|
|
void enable_em(struct rtl8192cd_priv *priv)
|
|
{
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
RTL_W32(EARLY_MODE_CTRL, RTL_R32(EARLY_MODE_CTRL) | 0x8000001f);
|
|
priv->pshare->aggrmax_bak = RTL_R16(PROT_MODE_CTRL + 2);
|
|
//RTL_W16(PROT_MODE_CTRL+2, 0x0808);
|
|
RTL_W16(PROT_MODE_CTRL+2, 0x0c0c);
|
|
} else
|
|
#endif
|
|
{
|
|
RTL_W32(EARLY_MODE_CTRL, RTL_R32(EARLY_MODE_CTRL) | 0x8000000f); // enable signel AMPDU, early mode for vi/vo/be/bk queue
|
|
}
|
|
|
|
RTL_W16(TCR, RTL_R16(TCR) | WMAC_TCR_ERRSTEN2);
|
|
}
|
|
|
|
void disable_em(struct rtl8192cd_priv *priv)
|
|
{
|
|
#ifdef CONFIG_RTL_88E_SUPPORT
|
|
if (GET_CHIP_VER(priv) == VERSION_8188E) {
|
|
RTL_W32(EARLY_MODE_CTRL, RTL_R32(EARLY_MODE_CTRL) & ~0x8000001f);
|
|
if (priv->pshare->aggrmax_bak != 0)
|
|
RTL_W16(PROT_MODE_CTRL + 2, (priv->pshare->aggrmax_bak & 0xffff));
|
|
} else
|
|
#endif
|
|
{
|
|
RTL_W32(EARLY_MODE_CTRL, RTL_R32(EARLY_MODE_CTRL) & ~0x8000000f); // disable signel AMPDU, early mode for vi/vo/be/bk queue
|
|
}
|
|
|
|
RTL_W16(TCR, RTL_R16(TCR) & ~WMAC_TCR_ERRSTEN2 );
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef RTLWIFINIC_GPIO_CONTROL
|
|
struct rtl8192cd_priv *root_priv;
|
|
|
|
void RTLWIFINIC_GPIO_init_priv(struct rtl8192cd_priv *priv)
|
|
{
|
|
root_priv = priv;
|
|
}
|
|
|
|
void RTLWIFINIC_GPIO_config(unsigned int gpio_num, unsigned int direction)
|
|
{
|
|
struct rtl8192cd_priv *priv = root_priv;
|
|
if (!root_priv)
|
|
return;
|
|
|
|
#ifdef PCIE_POWER_SAVING
|
|
PCIeWakeUp(priv, POWER_DOWN_T0);
|
|
#endif
|
|
|
|
if ((gpio_num >= 0) && (gpio_num <= 7)) {
|
|
priv->pshare->phw->GPIO_dir[gpio_num] = direction;
|
|
|
|
if (direction == 0x01) {
|
|
RTL_W32(GPIO_PIN_CTRL, RTL_R32(GPIO_PIN_CTRL) & ~(BIT(gpio_num + 24) | BIT(gpio_num + 16)));
|
|
return;
|
|
} else if (direction == 0x10) {
|
|
RTL_W32(GPIO_PIN_CTRL, (RTL_R32(GPIO_PIN_CTRL) & ~BIT(gpio_num + 24)) | (BIT(gpio_num + 16) | BIT(gpio_num + 8)));
|
|
return;
|
|
}
|
|
}
|
|
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192E) || (GET_CHIP_VER(priv) == VERSION_8881A)) {
|
|
if ((gpio_num >= 8) && (gpio_num <= 15)) {
|
|
priv->pshare->phw->GPIO_dir[gpio_num] = direction;
|
|
|
|
if (direction == 0x01) {
|
|
RTL_W32(0x060, RTL_R32(0x060) & ~(BIT(gpio_num + 16) | BIT(gpio_num + 8)));
|
|
return;
|
|
} else if (direction == 0x10) {
|
|
RTL_W32(0x060, (RTL_R32(0x060) & ~BIT(gpio_num + 16)) | (BIT(gpio_num + 8) | BIT(gpio_num)));
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if ((gpio_num >= 8) && (gpio_num <= 11)) {
|
|
priv->pshare->phw->GPIO_dir[gpio_num] = direction;
|
|
|
|
if (direction == 0x01) {
|
|
RTL_W32(GPIO_MUXCFG, RTL_R32(GPIO_MUXCFG) & ~(BIT(gpio_num + 20) | BIT(gpio_num + 16)));
|
|
return;
|
|
} else if (direction == 0x10) {
|
|
RTL_W32(GPIO_MUXCFG, (RTL_R32(GPIO_MUXCFG) & ~BIT(gpio_num + 20)) | (BIT(gpio_num + 16) | BIT(gpio_num + 12)));
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
panic_printk("GPIO %d action %d not support!\n", gpio_num, direction);
|
|
return;
|
|
}
|
|
|
|
void RTLWIFINIC_GPIO_write(unsigned int gpio_num, unsigned int value)
|
|
{
|
|
struct rtl8192cd_priv *priv = root_priv;
|
|
if (!root_priv)
|
|
return;
|
|
#ifdef PCIE_POWER_SAVING
|
|
PCIeWakeUp(priv, POWER_DOWN_T0);
|
|
#endif
|
|
|
|
if (priv->pshare->phw->GPIO_dir[gpio_num] != 0x10)
|
|
RTLWIFINIC_GPIO_config(gpio_num, 0x10);
|
|
|
|
if (((gpio_num >= 0) && (gpio_num <= 7)) && (priv->pshare->phw->GPIO_dir[gpio_num] == 0x10)) {
|
|
if (value)
|
|
RTL_W32(GPIO_PIN_CTRL, RTL_R32(GPIO_PIN_CTRL) & ~BIT(gpio_num + 8));
|
|
else
|
|
RTL_W32(GPIO_PIN_CTRL, RTL_R32(GPIO_PIN_CTRL) | BIT(gpio_num + 8));
|
|
return;
|
|
}
|
|
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192E) || (GET_CHIP_VER(priv) == VERSION_8881A)) {
|
|
if (((gpio_num >= 8) && (gpio_num <= 15)) && (priv->pshare->phw->GPIO_dir[gpio_num] == 0x10)) {
|
|
if (value)
|
|
RTL_W32(0x060, RTL_R32(0x060) & ~BIT(gpio_num));
|
|
else
|
|
RTL_W32(0x060, RTL_R32(0x060) | BIT(gpio_num));
|
|
return;
|
|
}
|
|
}
|
|
else {
|
|
if (((gpio_num >= 8) && (gpio_num <= 11)) && (priv->pshare->phw->GPIO_dir[gpio_num] == 0x10)) {
|
|
if (value)
|
|
RTL_W32(GPIO_MUXCFG, RTL_R32(GPIO_MUXCFG) & ~BIT(gpio_num + 12));
|
|
else
|
|
RTL_W32(GPIO_MUXCFG, RTL_R32(GPIO_MUXCFG) | BIT(gpio_num + 12));
|
|
return;
|
|
}
|
|
}
|
|
|
|
panic_printk("GPIO %d set value %d not support!\n", gpio_num, value);
|
|
return;
|
|
}
|
|
|
|
|
|
int RTLWIFINIC_GPIO_read(unsigned int gpio_num)
|
|
{
|
|
struct rtl8192cd_priv *priv = root_priv;
|
|
unsigned int val32;
|
|
if (!root_priv)
|
|
return -1;
|
|
|
|
if (priv->pshare->phw->GPIO_dir[gpio_num] != 0x01)
|
|
RTLWIFINIC_GPIO_config(gpio_num, 0x01);
|
|
|
|
if (((gpio_num >= 0) && (gpio_num <= 7)) && (priv->pshare->phw->GPIO_dir[gpio_num] == 0x01)) {
|
|
#ifdef PCIE_POWER_SAVING
|
|
if ((priv->pwr_state == L2) || (priv->pwr_state == L1))
|
|
val32 = priv->pshare->phw->GPIO_cache[0];
|
|
else
|
|
#endif
|
|
val32 = RTL_R32(GPIO_PIN_CTRL);
|
|
if (val32 & BIT(gpio_num))
|
|
return 0;
|
|
else
|
|
return 1;
|
|
}
|
|
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192E) || (GET_CHIP_VER(priv) == VERSION_8881A)) {
|
|
if (((gpio_num >= 8) && (gpio_num <= 15)) && (priv->pshare->phw->GPIO_dir[gpio_num] == 0x01)) {
|
|
val32 = RTL_R32(0x060);
|
|
if (val32 & BIT(gpio_num - 8))
|
|
return 0;
|
|
else
|
|
return 1;
|
|
}
|
|
}
|
|
else {
|
|
if (((gpio_num >= 8) && (gpio_num <= 11)) && (priv->pshare->phw->GPIO_dir[gpio_num] == 0x01)) {
|
|
#ifdef PCIE_POWER_SAVING
|
|
if ((priv->pwr_state == L2) || (priv->pwr_state == L1))
|
|
val32 = priv->pshare->phw->GPIO_cache[1];
|
|
else
|
|
#endif
|
|
val32 = RTL_R32(GPIO_MUXCFG);
|
|
if (val32 & BIT(gpio_num + 8))
|
|
return 0;
|
|
else
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
panic_printk("GPIO %d get value not support!\n", gpio_num);
|
|
return -1;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_RTL8672
|
|
// Note: The following GPIO enumeration must have the same order with the RTL8192CD_GPIO of
|
|
// GPIO_DEF enumeration in gpio.h
|
|
enum WIFI_GPIO {
|
|
WIFI_GPIO_0 = 0, WIFI_GPIO_1, WIFI_GPIO_2, WIFI_GPIO_3,
|
|
WIFI_GPIO_4, WIFI_GPIO_5, WIFI_GPIO_6, WIFI_GPIO_7,
|
|
WIFI_GPIO_8, WIFI_GPIO_9, WIFI_GPIO_10, WIFI_GPIO_11,
|
|
WIFI_GPIO_12, WIFI_GPIO_13, WIFI_GPIO_14, WIFI_GPIO_15,
|
|
WIFI_GPIO_92E_ANTSEL_P
|
|
};
|
|
|
|
void rtl8192cd_gpio_config(unsigned int wlan_idx, unsigned int gpio_num, int direction)
|
|
{
|
|
struct rtl8192cd_priv *priv;
|
|
unsigned int regval, mask;
|
|
|
|
// if (wlan_idx >= sizeof(wlan_device)/sizeof(struct _device_info_))
|
|
// return;
|
|
#if defined(CONFIG_USE_PCIE_SLOT_0) && defined(CONFIG_USE_PCIE_SLOT_1)
|
|
if (wlan_idx >= 2)
|
|
return;
|
|
#else
|
|
wlan_idx = 0;
|
|
#endif
|
|
|
|
priv = wlan_device[wlan_idx].priv;
|
|
if (NULL == priv)
|
|
return;
|
|
|
|
if ((gpio_num >= 0) && (gpio_num <= 7)) {
|
|
regval = RTL_R32(GPIO_PIN_CTRL);
|
|
mask = BIT(gpio_num + 16);
|
|
if (regval & mask) {
|
|
if ((regval & BIT(gpio_num + 24)) || (direction == 0x01)) // input
|
|
RTL_W32(GPIO_PIN_CTRL, regval & ~(BIT(gpio_num + 24) | mask));
|
|
} else {
|
|
if ((regval & BIT(gpio_num + 24)) || (direction == 0x10)) // output
|
|
RTL_W32(GPIO_PIN_CTRL, (regval & ~ BIT(gpio_num + 24)) | mask);
|
|
}
|
|
return;
|
|
}
|
|
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192E) || (GET_CHIP_VER(priv) == VERSION_8881A)) {
|
|
if ((gpio_num >= 8) && (gpio_num <= 15)) {
|
|
regval = RTL_R32(0x060);
|
|
mask = BIT(gpio_num + 8);
|
|
if (regval & mask) {
|
|
if ((regval & BIT(gpio_num + 16)) || (direction == 0x01)) // input
|
|
RTL_W32(0x060, regval & ~(BIT(gpio_num + 16) | mask));
|
|
} else {
|
|
if ((regval & BIT(gpio_num + 16)) || (direction == 0x10)) // output
|
|
RTL_W32(0x060, (regval & ~ BIT(gpio_num + 16)) | mask);
|
|
}
|
|
return;
|
|
} else if (gpio_num == WIFI_GPIO_92E_ANTSEL_P) {
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E) {
|
|
regval = RTL_R32(LEDCFG);
|
|
if (!(regval & BIT23))
|
|
RTL_W32(LEDCFG, regval | BIT23); // SW control ANT_SEL[P:N]
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if ((gpio_num >= 8) && (gpio_num <= 11)) {
|
|
regval = RTL_R32(GPIO_MUXCFG);
|
|
mask = BIT(gpio_num + 16);
|
|
if (regval & mask) {
|
|
if ((regval & BIT(gpio_num + 20)) || (direction == 0x01)) // input
|
|
RTL_W32(GPIO_MUXCFG, regval & ~(BIT(gpio_num + 20) | mask));
|
|
} else {
|
|
if ((regval & BIT(gpio_num + 20)) || (direction == 0x10)) // output
|
|
RTL_W32(GPIO_MUXCFG, (regval & ~ BIT(gpio_num + 20)) | mask);
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(rtl8192cd_gpio_config);
|
|
|
|
void rtl8192cd_gpio_write(unsigned int wlan_idx, unsigned int gpio_num, int value)
|
|
{
|
|
struct rtl8192cd_priv *priv;
|
|
unsigned int regval, mask;
|
|
|
|
// if (wlan_idx >= sizeof(wlan_device)/sizeof(struct _device_info_))
|
|
// return;
|
|
#if defined(CONFIG_USE_PCIE_SLOT_0) && defined(CONFIG_USE_PCIE_SLOT_1)
|
|
if (wlan_idx >= 2)
|
|
return;
|
|
#else
|
|
wlan_idx = 0;
|
|
#endif
|
|
|
|
priv = wlan_device[wlan_idx].priv;
|
|
if (NULL == priv)
|
|
return;
|
|
|
|
if ((gpio_num >= 0) && (gpio_num <= 7)) {
|
|
regval = RTL_R32(GPIO_PIN_CTRL);
|
|
mask = BIT(gpio_num + 8);
|
|
if (regval & mask) {
|
|
if (!value)
|
|
RTL_W32(GPIO_PIN_CTRL, regval & ~mask);
|
|
} else {
|
|
if (value)
|
|
RTL_W32(GPIO_PIN_CTRL, regval | mask);
|
|
}
|
|
return;
|
|
}
|
|
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192E) || (GET_CHIP_VER(priv) == VERSION_8881A)) {
|
|
if ((gpio_num >= 8) && (gpio_num <= 15)) {
|
|
regval = RTL_R32(0x060);
|
|
mask = BIT(gpio_num);
|
|
if (regval & mask) {
|
|
if (!value)
|
|
RTL_W32(0x060, regval & ~mask);
|
|
} else {
|
|
if (value)
|
|
RTL_W32(0x060, regval | mask);
|
|
}
|
|
return;
|
|
} else if (gpio_num == WIFI_GPIO_92E_ANTSEL_P) {
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E) {
|
|
regval = RTL_R32(0x064);
|
|
if (regval & BIT0) {
|
|
if (!value)
|
|
RTL_W32(0x064, regval & ~BIT0);
|
|
} else {
|
|
if (value)
|
|
RTL_W32(0x064, regval | BIT0);
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if ((gpio_num >= 8) && (gpio_num <= 11)) {
|
|
regval = RTL_R32(GPIO_MUXCFG);
|
|
mask = BIT(gpio_num + 12);
|
|
if (regval & mask) {
|
|
if (!value)
|
|
RTL_W32(GPIO_MUXCFG, regval & ~mask);
|
|
} else {
|
|
if (value)
|
|
RTL_W32(GPIO_MUXCFG, regval | mask);
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(rtl8192cd_gpio_write);
|
|
|
|
int rtl8192cd_gpio_read(unsigned int wlan_idx, unsigned int gpio_num)
|
|
{
|
|
struct rtl8192cd_priv *priv;
|
|
unsigned int val32;
|
|
|
|
// if (wlan_idx >= sizeof(wlan_device)/sizeof(struct _device_info_))
|
|
// return -1;
|
|
#if defined(CONFIG_USE_PCIE_SLOT_0) && defined(CONFIG_USE_PCIE_SLOT_1)
|
|
if (wlan_idx >= 2)
|
|
return -1;
|
|
#else
|
|
wlan_idx = 0;
|
|
#endif
|
|
|
|
priv = wlan_device[wlan_idx].priv;
|
|
if (NULL == priv)
|
|
return -1;
|
|
|
|
if ((gpio_num >= 0) && (gpio_num <= 7)) {
|
|
val32 = RTL_R32(GPIO_PIN_CTRL);
|
|
if (val32 & BIT(gpio_num + 16))
|
|
return (val32 & BIT(gpio_num + 8)) ? 1 : 0;
|
|
else
|
|
return (val32 & BIT(gpio_num)) ? 1 : 0;
|
|
}
|
|
|
|
if ((GET_CHIP_VER(priv) == VERSION_8192E) || (GET_CHIP_VER(priv) == VERSION_8881A)) {
|
|
if ((gpio_num >= 8) && (gpio_num <= 15)) {
|
|
val32 = RTL_R32(0x060);
|
|
if (val32 & BIT(gpio_num + 8)) // output
|
|
return (val32 & BIT(gpio_num)) ? 1 : 0;
|
|
else // input
|
|
return (val32 & BIT(gpio_num - 8)) ? 1 : 0;
|
|
} else if (gpio_num == WIFI_GPIO_92E_ANTSEL_P) {
|
|
if (GET_CHIP_VER(priv) == VERSION_8192E)
|
|
return (RTL_R32(0x064) & BIT0) ? 1 : 0;
|
|
}
|
|
}
|
|
else {
|
|
if ((gpio_num >= 8) && (gpio_num <= 11)) {
|
|
val32 = RTL_R32(GPIO_MUXCFG);
|
|
if (val32 & BIT(gpio_num + 16))
|
|
return (val32 & BIT(gpio_num + 12)) ? 1 : 0;
|
|
else
|
|
return (val32 & BIT(gpio_num + 8)) ? 1 : 0;
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
EXPORT_SYMBOL(rtl8192cd_gpio_read);
|
|
#endif // CONFIG_RTL8672
|
|
|
|
#if defined(CONFIG_WLAN_HAL) && defined(CONFIG_PCI_HCI)
|
|
// TODO: move into HAL
|
|
BOOLEAN
|
|
compareAvailableTXBD(
|
|
struct rtl8192cd_priv *priv,
|
|
unsigned int num,
|
|
unsigned int qNum,
|
|
int compareFlag
|
|
)
|
|
{
|
|
PHCI_TX_DMA_MANAGER_88XX ptx_dma = (PHCI_TX_DMA_MANAGER_88XX)(_GET_HAL_DATA(priv)->PTxDMA88XX);
|
|
unsigned int halQnum = GET_HAL_INTERFACE(priv)->MappingTxQueueHandler(priv, qNum);
|
|
#ifndef SMP_SYNC
|
|
unsigned long avail_txbd_flag;
|
|
#endif
|
|
|
|
SAVE_INT_AND_CLI(avail_txbd_flag);
|
|
|
|
if (compareFlag == 1) {
|
|
if (ptx_dma->tx_queue[halQnum].avail_txbd_num > num) {
|
|
RESTORE_INT(avail_txbd_flag);
|
|
return TRUE;
|
|
} else {
|
|
RESTORE_INT(avail_txbd_flag);
|
|
return FALSE;
|
|
}
|
|
} else if (compareFlag == 2) {
|
|
if (ptx_dma->tx_queue[halQnum].avail_txbd_num < num) {
|
|
RESTORE_INT(avail_txbd_flag);
|
|
return TRUE;
|
|
} else {
|
|
RESTORE_INT(avail_txbd_flag);
|
|
return FALSE;
|
|
}
|
|
} else {
|
|
printk("%s(%d): Error setting !!! \n", __FUNCTION__, __LINE__);
|
|
}
|
|
|
|
RESTORE_INT(avail_txbd_flag);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
#endif // CONFIG_WLAN_HAL && CONFIG_PCI_HCI
|
|
|
|
/* Hotsport 2.0 Release 1 */
|
|
#if defined(HS2_SUPPORT) || defined(RTK_NL80211)//survey_dump
|
|
void start_bbp_ch_load(struct rtl8192cd_priv *priv, unsigned int units)
|
|
{
|
|
unsigned short chip_ver = GET_CHIP_VER(priv);
|
|
if(chip_ver == VERSION_8188C || chip_ver == VERSION_8192C || chip_ver ==VERSION_8192D ||
|
|
chip_ver == VERSION_8188E || chip_ver == VERSION_8192E) /*all N-series ic*/
|
|
{
|
|
RTL_W16(0x894, units); //set ch load period time units*4 usec
|
|
RTL_W32(0x890, 0x0); //reset
|
|
RTL_W32(0x890, 0x100);
|
|
RTL_W32(0x890, 0x101);
|
|
}
|
|
else /* 8812, 8881A, 8814A, all AC-series ic*/
|
|
{
|
|
RTL_W16(0x990, units); //set ch load period time units*4 usec
|
|
RTL_W32(0x994, 0x0); //reset
|
|
RTL_W32(0x994, 0x100);
|
|
RTL_W32(0x994, 0x101);
|
|
}
|
|
}
|
|
|
|
int read_bbp_ch_load(struct rtl8192cd_priv *priv)
|
|
{
|
|
unsigned short chip_ver = GET_CHIP_VER(priv);
|
|
unsigned char retry = 0;
|
|
if(chip_ver == VERSION_8188C || chip_ver == VERSION_8192C || chip_ver ==VERSION_8192D ||
|
|
chip_ver == VERSION_8188E || chip_ver == VERSION_8192E) /*all N-series ic*/
|
|
{
|
|
do {
|
|
if (RTL_R32(0x8b4) & BIT16)
|
|
return (RTL_R32(0x8d0) & 0xffff)*4;
|
|
delay_ms(1);
|
|
} while(++retry < 20);
|
|
}
|
|
else /* 8812, 8881A, 8813, all AC-series ic*/
|
|
{
|
|
do {
|
|
if (RTL_R32(0xfa4) & BIT16)
|
|
return (RTL_R32(0xfa4) & 0xffff)*4;
|
|
delay_ms(1);
|
|
} while(++retry < 20);
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_1RCCA_RF_POWER_SAVING
|
|
void set_1rcca_ps(struct rtl8192cd_priv *priv, int enable)
|
|
{
|
|
if (enable && !priv->pshare->_1rcca_ps_active) {
|
|
priv->pshare->_1rcca_ps_active = 1;
|
|
RTL_W8(0x800, RTL_R8(0x800) | BIT1);
|
|
RTL_W8(0xc04, 0x13);
|
|
} else if (!enable && priv->pshare->_1rcca_ps_active) {
|
|
priv->pshare->_1rcca_ps_active = 0;
|
|
RTL_W8(0x800, RTL_R8(0x800) & ~BIT1);
|
|
RTL_W8(0xc04, 0x33);
|
|
}
|
|
}
|
|
#endif // CONFIG_1RCCA_RF_POWER_SAVING
|
|
|