Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c151aed6 authored by Larry Finger's avatar Larry Finger Committed by John W. Linville
Browse files

rtlwifi: rtl8188ee: Update driver to match Realtek release of 06282014



Not only does this patch update the driver to match the latest Realtek release,
it is an important step in getting the internal code source at Realtek to match
the code in the kernel. The primary reason for this is to make it easier for
Realtek to maintain the kernel source without requiring an intermediate like me.

In this process of merging the two source repositories, there are a lot
of changes in both, and this commit is rather large.

Signed-off-by: default avatarLarry Finger <Larry.Finger@lwfinger.net>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent f3a97e93
Loading
Loading
Loading
Loading
+26 −40
Original line number Original line Diff line number Diff line
@@ -11,10 +11,6 @@
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 * more details.
 *
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
 *
 * The full GNU General Public License is included in this distribution in the
 * The full GNU General Public License is included in this distribution in the
 * file called LICENSE.
 * file called LICENSE.
 *
 *
@@ -111,7 +107,6 @@


#define CHIP_BONDING_IDENTIFIER(_value)	(((_value)>>22)&0x3)
#define CHIP_BONDING_IDENTIFIER(_value)	(((_value)>>22)&0x3)



/* [15:12] IC version(CUT): A-cut=0, B-cut=1, C-cut=2, D-cut=3
/* [15:12] IC version(CUT): A-cut=0, B-cut=1, C-cut=2, D-cut=3
 * [7] Manufacturer: TSMC=0, UMC=1
 * [7] Manufacturer: TSMC=0, UMC=1
 * [6:4] RF type: 1T1R=0, 1T2R=1, 2T2R=2
 * [6:4] RF type: 1T1R=0, 1T2R=1, 2T2R=2
@@ -130,7 +125,6 @@
#define D_CUT_VERSION			((BIT(12)|BIT(13)))
#define D_CUT_VERSION			((BIT(12)|BIT(13)))
#define E_CUT_VERSION			BIT(14)
#define E_CUT_VERSION			BIT(14)



/* MASK */
/* MASK */
#define IC_TYPE_MASK			(BIT(0)|BIT(1)|BIT(2))
#define IC_TYPE_MASK			(BIT(0)|BIT(1)|BIT(2))
#define CHIP_TYPE_MASK			BIT(3)
#define CHIP_TYPE_MASK			BIT(3)
@@ -147,7 +141,6 @@
#define GET_CVID_ROM_VERSION(version)	((version) & ROM_VERSION_MASK)
#define GET_CVID_ROM_VERSION(version)	((version) & ROM_VERSION_MASK)
#define GET_CVID_CUT_VERSION(version)	((version) & CUT_VERSION_MASK)
#define GET_CVID_CUT_VERSION(version)	((version) & CUT_VERSION_MASK)



#define IS_81XXC(version)						\
#define IS_81XXC(version)						\
	((GET_CVID_IC_TYPE(version) == 0) ? true : false)
	((GET_CVID_IC_TYPE(version) == 0) ? true : false)
#define IS_8723_SERIES(version)						\
#define IS_8723_SERIES(version)						\
@@ -174,7 +167,7 @@
#define IS_81xxC_VENDOR_UMC_A_CUT(version)				\
#define IS_81xxC_VENDOR_UMC_A_CUT(version)				\
	(IS_81XXC(version) ? ((IS_CHIP_VENDOR_UMC(version)) ?		\
	(IS_81XXC(version) ? ((IS_CHIP_VENDOR_UMC(version)) ?		\
	 ((GET_CVID_CUT_VERSION(version)) ? false : true) : false) : false)
	 ((GET_CVID_CUT_VERSION(version)) ? false : true) : false) : false)
#define IS_81xxC_VENDOR_UMC_B_CUT(version)				\
#define IS_81XXC_VENDOR_UMC_B_CUT(version)				\
	(IS_81XXC(version) ? (IS_CHIP_VENDOR_UMC(version) ?		\
	(IS_81XXC(version) ? (IS_CHIP_VENDOR_UMC(version) ?		\
	((GET_CVID_CUT_VERSION(version) == B_CUT_VERSION) ? true	\
	((GET_CVID_CUT_VERSION(version) == B_CUT_VERSION) ? true	\
	: false) : false) : false)
	: false) : false) : false)
@@ -225,44 +218,37 @@ enum power_polocy_config {
};
};


enum interface_select_pci {
enum interface_select_pci {
	INTF_SEL1_MINICARD,
	INTF_SEL1_MINICARD = 0,
	INTF_SEL0_PCIE,
	INTF_SEL0_PCIE = 1,
	INTF_SEL2_RSV,
	INTF_SEL2_RSV = 2,
	INTF_SEL3_RSV,
	INTF_SEL3_RSV = 3,
};
};


enum hal_fw_c2h_cmd_id {
enum hal_fw_c2h_cmd_id {
	HAL_FW_C2H_CMD_Read_MACREG,
	HAL_FW_C2H_CMD_READ_MACREG = 0,
	HAL_FW_C2H_CMD_Read_BBREG,
	HAL_FW_C2H_CMD_READ_BBREG = 1,
	HAL_FW_C2H_CMD_Read_RFREG,
	HAL_FW_C2H_CMD_READ_RFREG = 2,
	HAL_FW_C2H_CMD_Read_EEPROM,
	HAL_FW_C2H_CMD_READ_EEPROM = 3,
	HAL_FW_C2H_CMD_Read_EFUSE,
	HAL_FW_C2H_CMD_READ_EFUSE = 4,
	HAL_FW_C2H_CMD_Read_CAM,
	HAL_FW_C2H_CMD_READ_CAM = 5,
	HAL_FW_C2H_CMD_Get_BasicRate,
	HAL_FW_C2H_CMD_GET_BASICRATE = 6,
	HAL_FW_C2H_CMD_Get_DataRate,
	HAL_FW_C2H_CMD_GET_DATARATE = 7,
	HAL_FW_C2H_CMD_Survey,
	HAL_FW_C2H_CMD_SURVEY = 8,
	HAL_FW_C2H_CMD_SurveyDone,
	HAL_FW_C2H_CMD_SURVEYDONE = 9,
	HAL_FW_C2H_CMD_JoinBss,
	HAL_FW_C2H_CMD_JOINBSS = 10,
	HAL_FW_C2H_CMD_AddSTA,
	HAL_FW_C2H_CMD_ADDSTA = 11,
	HAL_FW_C2H_CMD_DelSTA,
	HAL_FW_C2H_CMD_DELSTA = 12,
	HAL_FW_C2H_CMD_AtimDone,
	HAL_FW_C2H_CMD_ATIMDONE = 13,
	HAL_FW_C2H_CMD_TX_Report,
	HAL_FW_C2H_CMD_TX_REPORT = 14,
	HAL_FW_C2H_CMD_CCX_Report,
	HAL_FW_C2H_CMD_CCX_REPORT = 15,
	HAL_FW_C2H_CMD_DTM_Report,
	HAL_FW_C2H_CMD_DTM_REPORT = 16,
	HAL_FW_C2H_CMD_TX_Rate_Statistics,
	HAL_FW_C2H_CMD_TX_RATE_STATISTICS = 17,
	HAL_FW_C2H_CMD_C2HLBK,
	HAL_FW_C2H_CMD_C2HLBK = 18,
	HAL_FW_C2H_CMD_C2HDBG,
	HAL_FW_C2H_CMD_C2HDBG = 19,
	HAL_FW_C2H_CMD_C2HFEEDBACK,
	HAL_FW_C2H_CMD_C2HFEEDBACK = 20,
	HAL_FW_C2H_CMD_MAX
	HAL_FW_C2H_CMD_MAX
};
};


enum wake_on_wlan_mode {
	ewowlandisable,
	ewakeonmagicpacketonly,
	ewakeonpatternmatchonly,
	ewakeonbothtypepacket
};

enum rtl_desc_qsel {
enum rtl_desc_qsel {
	QSLT_BK = 0x2,
	QSLT_BK = 0x2,
	QSLT_BE = 0x0,
	QSLT_BE = 0x0,
+462 −419

File changed.

Preview size limit exceeded, changes collapsed.

+12 −11
Original line number Original line Diff line number Diff line
@@ -156,7 +156,6 @@
#define	DM_REG_SLEEP_11N				0xEE0
#define	DM_REG_SLEEP_11N				0xEE0
#define	DM_REG_PMPD_ANAEN_11N				0xEEC
#define	DM_REG_PMPD_ANAEN_11N				0xEEC



/*MAC REG LIST*/
/*MAC REG LIST*/
#define	DM_REG_BB_RST_11N				0x02
#define	DM_REG_BB_RST_11N				0x02
#define	DM_REG_ANTSEL_PIN_11N				0x4C
#define	DM_REG_ANTSEL_PIN_11N				0x4C
@@ -168,8 +167,9 @@
#define	DM_REG_EDCA_BK_11N				0x50C
#define	DM_REG_EDCA_BK_11N				0x50C
#define	DM_REG_TXPAUSE_11N				0x522
#define	DM_REG_TXPAUSE_11N				0x522
#define	DM_REG_RESP_TX_11N				0x6D8
#define	DM_REG_RESP_TX_11N				0x6D8
#define	DM_REG_ANT_TRAIN_1				0x7b0
#define	DM_REG_ANT_TRAIN_PARA1_11N			0x7b0
#define	DM_REG_ANT_TRAIN_2				0x7b4
#define	DM_REG_ANT_TRAIN_PARA2_11N			0x7b4



/*DIG Related*/
/*DIG Related*/
#define	DM_BIT_IGI_11N					0x0000007F
#define	DM_BIT_IGI_11N					0x0000007F
@@ -208,7 +208,7 @@
#define DM_DIG_BACKOFF_MIN				-4
#define DM_DIG_BACKOFF_MIN				-4
#define DM_DIG_BACKOFF_DEFAULT				10
#define DM_DIG_BACKOFF_DEFAULT				10


#define RXPATHSELECTION_SS_TH_LOW			30
#define RXPATHSELECTION_SS_TH_W				30
#define RXPATHSELECTION_DIFF_TH				18
#define RXPATHSELECTION_DIFF_TH				18


#define DM_RATR_STA_INIT				0
#define DM_RATR_STA_INIT				0
@@ -238,10 +238,12 @@ struct swat_t {
	u8 failure_cnt;
	u8 failure_cnt;
	u8 try_flag;
	u8 try_flag;
	u8 stop_trying;
	u8 stop_trying;

	long pre_rssi;
	long pre_rssi;
	long trying_threshold;
	long trying_threshold;
	u8 cur_antenna;
	u8 cur_antenna;
	u8 pre_antenna;
	u8 pre_antenna;

};
};


enum FAT_STATE {
enum FAT_STATE {
@@ -310,8 +312,9 @@ enum pwr_track_control_method {


void rtl88e_dm_set_tx_ant_by_tx_info(struct ieee80211_hw *hw,
void rtl88e_dm_set_tx_ant_by_tx_info(struct ieee80211_hw *hw,
				     u8 *pdesc, u32 mac_id);
				     u8 *pdesc, u32 mac_id);
void rtl88e_dm_ant_sel_statistics(struct ieee80211_hw *hw, u8 antsel_tr_mux,
void rtl88e_dm_ant_sel_statistics(struct ieee80211_hw *hw,
				  u32 mac_id, u32 rx_pwdb_all);
				  u8 antsel_tr_mux, u32 mac_id,
				  u32 rx_pwdb_all);
void rtl88e_dm_fast_antenna_training_callback(unsigned long data);
void rtl88e_dm_fast_antenna_training_callback(unsigned long data);
void rtl88e_dm_init(struct ieee80211_hw *hw);
void rtl88e_dm_init(struct ieee80211_hw *hw);
void rtl88e_dm_watchdog(struct ieee80211_hw *hw);
void rtl88e_dm_watchdog(struct ieee80211_hw *hw);
@@ -320,7 +323,5 @@ void rtl88e_dm_init_edca_turbo(struct ieee80211_hw *hw);
void rtl88e_dm_check_txpower_tracking(struct ieee80211_hw *hw);
void rtl88e_dm_check_txpower_tracking(struct ieee80211_hw *hw);
void rtl88e_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw);
void rtl88e_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw);
void rtl88e_dm_txpower_track_adjust(struct ieee80211_hw *hw,
void rtl88e_dm_txpower_track_adjust(struct ieee80211_hw *hw,
				    u8 type, u8 *pdirection,
	u8 type, u8 *pdirection, u32 *poutwrite_val);
				    u32 *poutwrite_val);

#endif
#endif
+124 −107
Original line number Original line Diff line number Diff line
@@ -11,10 +11,6 @@
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 * more details.
 *
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
 *
 * The full GNU General Public License is included in this distribution in the
 * The full GNU General Public License is included in this distribution in the
 * file called LICENSE.
 * file called LICENSE.
 *
 *
@@ -34,8 +30,6 @@
#include "def.h"
#include "def.h"
#include "fw.h"
#include "fw.h"


#include <linux/kmemleak.h>

static void _rtl88e_enable_fw_download(struct ieee80211_hw *hw, bool enable)
static void _rtl88e_enable_fw_download(struct ieee80211_hw *hw, bool enable)
{
{
	struct rtl_priv *rtlpriv = rtl_priv(hw);
	struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -62,26 +56,26 @@ static void _rtl88e_fw_block_write(struct ieee80211_hw *hw,
				   const u8 *buffer, u32 size)
				   const u8 *buffer, u32 size)
{
{
	struct rtl_priv *rtlpriv = rtl_priv(hw);
	struct rtl_priv *rtlpriv = rtl_priv(hw);
	u32 blk_sz = sizeof(u32);
	u32 blocksize = sizeof(u32);
	u8 *buf_ptr = (u8 *)buffer;
	u8 *bufferptr = (u8 *)buffer;
	u32 *pu4BytePtr = (u32 *)buffer;
	u32 *pu4BytePtr = (u32 *)buffer;
	u32 i, offset, blk_cnt, remain;
	u32 i, offset, blockcount, remainsize;


	blk_cnt = size / blk_sz;
	blockcount = size / blocksize;
	remain = size % blk_sz;
	remainsize = size % blocksize;


	for (i = 0; i < blk_cnt; i++) {
	for (i = 0; i < blockcount; i++) {
		offset = i * blk_sz;
		offset = i * blocksize;
		rtl_write_dword(rtlpriv, (FW_8192C_START_ADDRESS + offset),
		rtl_write_dword(rtlpriv, (FW_8192C_START_ADDRESS + offset),
				*(pu4BytePtr + i));
				*(pu4BytePtr + i));
	}
	}


	if (remain) {
	if (remainsize) {
		offset = blk_cnt * blk_sz;
		offset = blockcount * blocksize;
		buf_ptr += offset;
		bufferptr += offset;
		for (i = 0; i < remain; i++) {
		for (i = 0; i < remainsize; i++) {
			rtl_write_byte(rtlpriv, (FW_8192C_START_ADDRESS +
			rtl_write_byte(rtlpriv, (FW_8192C_START_ADDRESS +
						 offset + i), *(buf_ptr + i));
						 offset + i), *(bufferptr + i));
		}
		}
	}
	}
}
}
@@ -119,32 +113,33 @@ static void _rtl88e_write_fw(struct ieee80211_hw *hw,
			     enum version_8188e version, u8 *buffer, u32 size)
			     enum version_8188e version, u8 *buffer, u32 size)
{
{
	struct rtl_priv *rtlpriv = rtl_priv(hw);
	struct rtl_priv *rtlpriv = rtl_priv(hw);
	u8 *buf_ptr = buffer;
	u8 *bufferptr = (u8 *)buffer;
	u32 page_no, remain;
	u32 pagenums, remainsize;
	u32 page, offset;
	u32 page, offset;


	RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "FW size is %d bytes,\n", size);
	RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "FW size is %d bytes,\n", size);


	_rtl88e_fill_dummy(buf_ptr, &size);
	_rtl88e_fill_dummy(bufferptr, &size);


	page_no = size / FW_8192C_PAGE_SIZE;
	pagenums = size / FW_8192C_PAGE_SIZE;
	remain = size % FW_8192C_PAGE_SIZE;
	remainsize = size % FW_8192C_PAGE_SIZE;


	if (page_no > 8) {
	if (pagenums > 8) {
		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
			 "Page numbers should not greater then 8\n");
			 "Page numbers should not greater then 8\n");
	}
	}


	for (page = 0; page < page_no; page++) {
	for (page = 0; page < pagenums; page++) {
		offset = page * FW_8192C_PAGE_SIZE;
		offset = page * FW_8192C_PAGE_SIZE;
		_rtl88e_fw_page_write(hw, page, (buf_ptr + offset),
		_rtl88e_fw_page_write(hw, page, (bufferptr + offset),
				      FW_8192C_PAGE_SIZE);
				      FW_8192C_PAGE_SIZE);
	}
	}


	if (remain) {
	if (remainsize) {
		offset = page_no * FW_8192C_PAGE_SIZE;
		offset = pagenums * FW_8192C_PAGE_SIZE;
		page = page_no;
		page = pagenums;
		_rtl88e_fw_page_write(hw, page, (buf_ptr + offset), remain);
		_rtl88e_fw_page_write(hw, page, (bufferptr + offset),
				      remainsize);
	}
	}
}
}


@@ -199,7 +194,8 @@ static int _rtl88e_fw_free_to_go(struct ieee80211_hw *hw)
	return err;
	return err;
}
}


int rtl88e_download_fw(struct ieee80211_hw *hw, bool buse_wake_on_wlan_fw)
int rtl88e_download_fw(struct ieee80211_hw *hw,
		       bool buse_wake_on_wlan_fw)
{
{
	struct rtl_priv *rtlpriv = rtl_priv(hw);
	struct rtl_priv *rtlpriv = rtl_priv(hw);
	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
@@ -237,9 +233,14 @@ int rtl88e_download_fw(struct ieee80211_hw *hw, bool buse_wake_on_wlan_fw)
	_rtl88e_enable_fw_download(hw, false);
	_rtl88e_enable_fw_download(hw, false);


	err = _rtl88e_fw_free_to_go(hw);
	err = _rtl88e_fw_free_to_go(hw);
	if (err) {
		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
			 "Firmware is not ready to run!\n");
	} else {
		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
			 "Firmware is ready to run!\n");
	}


	RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
		 "Firmware is%s ready to run!\n", err ? " not" : "");
	return 0;
	return 0;
}
}


@@ -266,9 +267,9 @@ static void _rtl88e_fill_h2c_command(struct ieee80211_hw *hw,
	bool isfw_read = false;
	bool isfw_read = false;
	u8 buf_index = 0;
	u8 buf_index = 0;
	bool write_sucess = false;
	bool write_sucess = false;
	u8 wait_h2c_limit = 100;
	u8 wait_h2c_limmit = 100;
	u8 wait_writeh2c_limit = 100;
	u8 wait_writeh2c_limit = 100;
	u8 boxc[4], boxext[2];
	u8 boxcontent[4], boxextcontent[4];
	u32 h2c_waitcounter = 0;
	u32 h2c_waitcounter = 0;
	unsigned long flag;
	unsigned long flag;
	u8 idx;
	u8 idx;
@@ -331,18 +332,17 @@ static void _rtl88e_fill_h2c_command(struct ieee80211_hw *hw,
			box_extreg = REG_HMEBOX_EXT_3;
			box_extreg = REG_HMEBOX_EXT_3;
			break;
			break;
		default:
		default:
			RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
			RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
				 "switch case not processed\n");
				 "switch case not process\n");
			break;
			break;
		}
		}

		isfw_read = _rtl88e_check_fw_read_last_h2c(hw, boxnum);
		isfw_read = _rtl88e_check_fw_read_last_h2c(hw, boxnum);
		while (!isfw_read) {
		while (!isfw_read) {
			wait_h2c_limit--;
			wait_h2c_limmit--;
			if (wait_h2c_limit == 0) {
			if (wait_h2c_limmit == 0) {
				RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
				RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
					 "Waiting too long for FW read "
					 "Waiting too long for FW read clear HMEBox(%d)!\n",
					 "clear HMEBox(%d)!\n", boxnum);
					 boxnum);
				break;
				break;
			}
			}


@@ -351,20 +351,20 @@ static void _rtl88e_fill_h2c_command(struct ieee80211_hw *hw,
			isfw_read = _rtl88e_check_fw_read_last_h2c(hw, boxnum);
			isfw_read = _rtl88e_check_fw_read_last_h2c(hw, boxnum);
			u1b_tmp = rtl_read_byte(rtlpriv, 0x130);
			u1b_tmp = rtl_read_byte(rtlpriv, 0x130);
			RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
			RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
				 "Waiting for FW read clear HMEBox(%d)!!! "
				 "Waiting for FW read clear HMEBox(%d)!!! 0x130 = %2x\n",
				 "0x130 = %2x\n", boxnum, u1b_tmp);
				 boxnum, u1b_tmp);
		}
		}


		if (!isfw_read) {
		if (!isfw_read) {
			RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
			RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
				 "Write H2C register BOX[%d] fail!!!!! "
				 "Write H2C register BOX[%d] fail!!!!! Fw do not read.\n",
				 "Fw do not read.\n", boxnum);
				 boxnum);
			break;
			break;
		}
		}


		memset(boxc, 0, sizeof(boxc));
		memset(boxcontent, 0, sizeof(boxcontent));
		memset(boxext, 0, sizeof(boxext));
		memset(boxextcontent, 0, sizeof(boxextcontent));
		boxc[0] = element_id;
		boxcontent[0] = element_id;
		RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
		RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
			 "Write element_id box_reg(%4x) = %2x\n",
			 "Write element_id box_reg(%4x) = %2x\n",
			 box_reg, element_id);
			 box_reg, element_id);
@@ -373,33 +373,38 @@ static void _rtl88e_fill_h2c_command(struct ieee80211_hw *hw,
		case 1:
		case 1:
		case 2:
		case 2:
		case 3:
		case 3:
			/*boxc[0] &= ~(BIT(7));*/
			/*boxcontent[0] &= ~(BIT(7));*/
			memcpy((u8 *)(boxc) + 1, cmd_b + buf_index, cmd_len);
			memcpy((u8 *)(boxcontent) + 1,
			       cmd_b + buf_index, cmd_len);


			for (idx = 0; idx < 4; idx++)
			for (idx = 0; idx < 4; idx++) {
				rtl_write_byte(rtlpriv, box_reg+idx, boxc[idx]);
				rtl_write_byte(rtlpriv, box_reg + idx,
					       boxcontent[idx]);
			}
			break;
			break;
		case 4:
		case 4:
		case 5:
		case 5:
		case 6:
		case 6:
		case 7:
		case 7:
			/*boxc[0] |= (BIT(7));*/
			/*boxcontent[0] |= (BIT(7));*/
			memcpy((u8 *)(boxext), cmd_b + buf_index+3, cmd_len-3);
			memcpy((u8 *)(boxextcontent),
			memcpy((u8 *)(boxc) + 1, cmd_b + buf_index, 3);
			       cmd_b + buf_index+3, cmd_len-3);
			memcpy((u8 *)(boxcontent) + 1,
			       cmd_b + buf_index, 3);


			for (idx = 0; idx < 2; idx++) {
			for (idx = 0; idx < 2; idx++) {
				rtl_write_byte(rtlpriv, box_extreg + idx,
				rtl_write_byte(rtlpriv, box_extreg + idx,
					       boxext[idx]);
					       boxextcontent[idx]);
			}
			}


			for (idx = 0; idx < 4; idx++) {
			for (idx = 0; idx < 4; idx++) {
				rtl_write_byte(rtlpriv, box_reg + idx,
				rtl_write_byte(rtlpriv, box_reg + idx,
					       boxc[idx]);
					       boxcontent[idx]);
			}
			}
			break;
			break;
		default:
		default:
			RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
			RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
				 "switch case not processed\n");
				 "switch case not process\n");
			break;
			break;
		}
		}


@@ -422,18 +427,19 @@ static void _rtl88e_fill_h2c_command(struct ieee80211_hw *hw,
}
}


void rtl88e_fill_h2c_cmd(struct ieee80211_hw *hw,
void rtl88e_fill_h2c_cmd(struct ieee80211_hw *hw,
			 u8 element_id, u32 cmd_len, u8 *cmd_b)
			 u8 element_id, u32 cmd_len, u8 *cmdbuffer)
{
{
	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
	u32 tmp_cmdbuf[2];
	u32 tmp_cmdbuf[2];


	if (rtlhal->fw_ready == false) {
	if (!rtlhal->fw_ready) {
		RT_ASSERT(false, "fail H2C cmd - Fw download fail!!!\n");
		RT_ASSERT(false,
			  "return H2C cmd because of Fw download fail!!!\n");
		return;
		return;
	}
	}


	memset(tmp_cmdbuf, 0, 8);
	memset(tmp_cmdbuf, 0, 8);
	memcpy(tmp_cmdbuf, cmd_b, cmd_len);
	memcpy(tmp_cmdbuf, cmdbuffer, cmd_len);
	_rtl88e_fill_h2c_command(hw, element_id, cmd_len, (u8 *)&tmp_cmdbuf);
	_rtl88e_fill_h2c_command(hw, element_id, cmd_len, (u8 *)&tmp_cmdbuf);


	return;
	return;
@@ -448,7 +454,8 @@ void rtl88e_firmware_selfreset(struct ieee80211_hw *hw)
	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp & (~BIT(2))));
	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp & (~BIT(2))));
	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp | BIT(2)));
	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp | BIT(2)));
	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
		 "8051Reset88E(): 8051 reset success.\n");
		 "8051Reset88E(): 8051 reset success\n");

}
}


void rtl88e_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
void rtl88e_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
@@ -456,14 +463,14 @@ void rtl88e_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
	struct rtl_priv *rtlpriv = rtl_priv(hw);
	struct rtl_priv *rtlpriv = rtl_priv(hw);
	u8 u1_h2c_set_pwrmode[H2C_88E_PWEMODE_LENGTH] = { 0 };
	u8 u1_h2c_set_pwrmode[H2C_88E_PWEMODE_LENGTH] = { 0 };
	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
	u8 power_state = 0;
	u8 rlbm, power_state = 0;

	RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode);
	RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode);

	SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, ((mode) ? 1 : 0));
	SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, ((mode) ? 1 : 0));
	SET_H2CCMD_PWRMODE_PARM_RLBM(u1_h2c_set_pwrmode, 0);
	rlbm = 0;/*YJ, temp, 120316. FW now not support RLBM=2.*/
	SET_H2CCMD_PWRMODE_PARM_RLBM(u1_h2c_set_pwrmode, rlbm);
	SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode,
	SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode,
					 (rtlpriv->mac80211.p2p) ?
		(rtlpriv->mac80211.p2p) ? ppsc->smart_ps : 1);
					 ppsc->smart_ps : 1);
	SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(u1_h2c_set_pwrmode,
	SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(u1_h2c_set_pwrmode,
		ppsc->reg_max_lps_awakeintvl);
		ppsc->reg_max_lps_awakeintvl);
	SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1_h2c_set_pwrmode, 0);
	SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1_h2c_set_pwrmode, 0);
@@ -471,13 +478,14 @@ void rtl88e_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
		power_state |= FW_PWR_STATE_ACTIVE;
		power_state |= FW_PWR_STATE_ACTIVE;
	else
	else
		power_state |= FW_PWR_STATE_RF_OFF;
		power_state |= FW_PWR_STATE_RF_OFF;

	SET_H2CCMD_PWRMODE_PARM_PWR_STATE(u1_h2c_set_pwrmode, power_state);
	SET_H2CCMD_PWRMODE_PARM_PWR_STATE(u1_h2c_set_pwrmode, power_state);


	RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
	RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
		      "rtl92c_set_fw_pwrmode(): u1_h2c_set_pwrmode\n",
		      "rtl92c_set_fw_pwrmode(): u1_h2c_set_pwrmode\n",
		      u1_h2c_set_pwrmode, H2C_88E_PWEMODE_LENGTH);
		      u1_h2c_set_pwrmode, H2C_88E_PWEMODE_LENGTH);
	rtl88e_fill_h2c_cmd(hw, H2C_88E_SETPWRMODE, H2C_88E_PWEMODE_LENGTH,
	rtl88e_fill_h2c_cmd(hw, H2C_88E_SETPWRMODE,
			    u1_h2c_set_pwrmode);
			    H2C_88E_PWEMODE_LENGTH, u1_h2c_set_pwrmode);
}
}


void rtl88e_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus)
void rtl88e_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus)
@@ -499,8 +507,9 @@ void rtl88e_set_fw_ap_off_load_cmd(struct ieee80211_hw *hw,
	SET_H2CCMD_AP_OFFLOAD_HIDDEN(u1_apoffload_parm, mac->hiddenssid);
	SET_H2CCMD_AP_OFFLOAD_HIDDEN(u1_apoffload_parm, mac->hiddenssid);
	SET_H2CCMD_AP_OFFLOAD_DENYANY(u1_apoffload_parm, 0);
	SET_H2CCMD_AP_OFFLOAD_DENYANY(u1_apoffload_parm, 0);


	rtl88e_fill_h2c_cmd(hw, H2C_88E_AP_OFFLOAD, H2C_88E_AP_OFFLOAD_LENGTH,
	rtl88e_fill_h2c_cmd(hw, H2C_88E_AP_OFFLOAD,
			    u1_apoffload_parm);
			    H2C_88E_AP_OFFLOAD_LENGTH, u1_apoffload_parm);

}
}


static bool _rtl88e_cmd_send_packet(struct ieee80211_hw *hw,
static bool _rtl88e_cmd_send_packet(struct ieee80211_hw *hw,
@@ -511,6 +520,7 @@ static bool _rtl88e_cmd_send_packet(struct ieee80211_hw *hw,
	struct rtl8192_tx_ring *ring;
	struct rtl8192_tx_ring *ring;
	struct rtl_tx_desc *pdesc;
	struct rtl_tx_desc *pdesc;
	struct sk_buff *pskb = NULL;
	struct sk_buff *pskb = NULL;
	u8 own;
	unsigned long flags;
	unsigned long flags;


	ring = &rtlpci->tx_ring[BEACON_QUEUE];
	ring = &rtlpci->tx_ring[BEACON_QUEUE];
@@ -522,6 +532,7 @@ static bool _rtl88e_cmd_send_packet(struct ieee80211_hw *hw,
	spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
	spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);


	pdesc = &ring->desc[0];
	pdesc = &ring->desc[0];
	own = (u8)rtlpriv->cfg->ops->get_desc((u8 *)pdesc, true, HW_DESC_OWN);


	rtlpriv->cfg->ops->fill_tx_cmddesc(hw, (u8 *)pdesc, 1, 1, skb);
	rtlpriv->cfg->ops->fill_tx_cmddesc(hw, (u8 *)pdesc, 1, 1, skb);


@@ -656,14 +667,15 @@ void rtl88e_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished)
	struct rtl_priv *rtlpriv = rtl_priv(hw);
	struct rtl_priv *rtlpriv = rtl_priv(hw);
	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
	struct sk_buff *skb = NULL;
	struct sk_buff *skb = NULL;

	u32 totalpacketlen;
	u32 totalpacketlen;
	u8 u1RsvdPageLoc[5] = { 0 };
	bool rtstatus;

	u8 u1rsvdpageloc[5] = { 0 };
	bool b_dlok = false;
	u8 *beacon;
	u8 *beacon;
	u8 *pspoll;
	u8 *p_pspoll;
	u8 *nullfunc;
	u8 *nullfunc;
	u8 *probersp;
	u8 *p_probersp;

	/*---------------------------------------------------------
	/*---------------------------------------------------------
	 *			(1) beacon
	 *			(1) beacon
	 *---------------------------------------------------------
	 *---------------------------------------------------------
@@ -676,12 +688,12 @@ void rtl88e_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished)
	 *			(2) ps-poll
	 *			(2) ps-poll
	 *--------------------------------------------------------
	 *--------------------------------------------------------
	 */
	 */
	pspoll = &reserved_page_packet[PSPOLL_PG * 128];
	p_pspoll = &reserved_page_packet[PSPOLL_PG * 128];
	SET_80211_PS_POLL_AID(pspoll, (mac->assoc_id | 0xc000));
	SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000));
	SET_80211_PS_POLL_BSSID(pspoll, mac->bssid);
	SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid);
	SET_80211_PS_POLL_TA(pspoll, mac->mac_addr);
	SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr);


	SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1RsvdPageLoc, PSPOLL_PG);
	SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1rsvdpageloc, PSPOLL_PG);


	/*--------------------------------------------------------
	/*--------------------------------------------------------
	 *			(3) null data
	 *			(3) null data
@@ -692,18 +704,18 @@ void rtl88e_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished)
	SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr);
	SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr);
	SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid);
	SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid);


	SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1RsvdPageLoc, NULL_PG);
	SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1rsvdpageloc, NULL_PG);


	/*---------------------------------------------------------
	/*---------------------------------------------------------
	 *			(4) probe response
	 *			(4) probe response
	 *----------------------------------------------------------
	 *----------------------------------------------------------
	 */
	 */
	probersp = &reserved_page_packet[PROBERSP_PG * 128];
	p_probersp = &reserved_page_packet[PROBERSP_PG * 128];
	SET_80211_HDR_ADDRESS1(probersp, mac->bssid);
	SET_80211_HDR_ADDRESS1(p_probersp, mac->bssid);
	SET_80211_HDR_ADDRESS2(probersp, mac->mac_addr);
	SET_80211_HDR_ADDRESS2(p_probersp, mac->mac_addr);
	SET_80211_HDR_ADDRESS3(probersp, mac->bssid);
	SET_80211_HDR_ADDRESS3(p_probersp, mac->bssid);


	SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(u1RsvdPageLoc, PROBERSP_PG);
	SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(u1rsvdpageloc, PROBERSP_PG);


	totalpacketlen = TOTAL_RESERVED_PKT_LEN;
	totalpacketlen = TOTAL_RESERVED_PKT_LEN;


@@ -712,33 +724,36 @@ void rtl88e_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished)
		      &reserved_page_packet[0], totalpacketlen);
		      &reserved_page_packet[0], totalpacketlen);
	RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
	RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
		      "rtl88e_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n",
		      "rtl88e_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n",
		      u1RsvdPageLoc, 3);
		      u1rsvdpageloc, 3);


	skb = dev_alloc_skb(totalpacketlen);
	skb = dev_alloc_skb(totalpacketlen);
	if (!skb)
		return;
	kmemleak_not_leak(skb);
	memcpy(skb_put(skb, totalpacketlen),
	memcpy(skb_put(skb, totalpacketlen),
	       &reserved_page_packet, totalpacketlen);
	       &reserved_page_packet, totalpacketlen);


	if (_rtl88e_cmd_send_packet(hw, skb)) {
	rtstatus = _rtl88e_cmd_send_packet(hw, skb);

	if (rtstatus)
		b_dlok = true;

	if (b_dlok) {
		RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
		RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
			 "Set RSVD page location to Fw.\n");
			 "Set RSVD page location to Fw.\n");
		RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
		RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
			      "H2C_RSVDPAGE:\n", u1RsvdPageLoc, 3);
			      "H2C_RSVDPAGE:\n", u1rsvdpageloc, 3);
		rtl88e_fill_h2c_cmd(hw, H2C_88E_RSVDPAGE,
		rtl88e_fill_h2c_cmd(hw, H2C_88E_RSVDPAGE,
				    sizeof(u1RsvdPageLoc), u1RsvdPageLoc);
				    sizeof(u1rsvdpageloc), u1rsvdpageloc);
	} else
	} else
		RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
		RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
			 "Set RSVD page location to Fw FAIL!!!!!!.\n");
			 "Set RSVD page location to Fw FAIL!!!!!!.\n");
}
}


/*Shoud check FW support p2p or not.*/
/*Should check FW support p2p or not.*/
static void rtl88e_set_p2p_ctw_period_cmd(struct ieee80211_hw *hw, u8 ctwindow)
static void rtl88e_set_p2p_ctw_period_cmd(struct ieee80211_hw *hw, u8 ctwindow)
{
{
	u8 u1_ctwindow_period[1] = { ctwindow};
	u8 u1_ctwindow_period[1] = { ctwindow};


	rtl88e_fill_h2c_cmd(hw, H2C_88E_P2P_PS_CTW_CMD, 1, u1_ctwindow_period);
	rtl88e_fill_h2c_cmd(hw, H2C_88E_P2P_PS_CTW_CMD, 1, u1_ctwindow_period);

}
}


void rtl88e_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
void rtl88e_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
@@ -755,7 +770,7 @@ void rtl88e_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
	switch (p2p_ps_state) {
	switch (p2p_ps_state) {
	case P2P_PS_DISABLE:
	case P2P_PS_DISABLE:
		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_DISABLE\n");
		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_DISABLE\n");
		memset(p2p_ps_offload, 0, sizeof(struct p2p_ps_offload_t));
		memset(p2p_ps_offload, 0, 1);
		break;
		break;
	case P2P_PS_ENABLE:
	case P2P_PS_ENABLE:
		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_ENABLE\n");
		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_ENABLE\n");
@@ -765,6 +780,7 @@ void rtl88e_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
			ctwindow = p2pinfo->ctwindow;
			ctwindow = p2pinfo->ctwindow;
			rtl88e_set_p2p_ctw_period_cmd(hw, ctwindow);
			rtl88e_set_p2p_ctw_period_cmd(hw, ctwindow);
		}
		}

		/* hw only support 2 set of NoA */
		/* hw only support 2 set of NoA */
		for (i = 0 ; i < p2pinfo->noa_num; i++) {
		for (i = 0 ; i < p2pinfo->noa_num; i++) {
			/* To control the register setting for which NOA*/
			/* To control the register setting for which NOA*/
@@ -804,7 +820,7 @@ void rtl88e_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)


			if (P2P_ROLE_GO == rtlpriv->mac80211.p2p) {
			if (P2P_ROLE_GO == rtlpriv->mac80211.p2p) {
				p2p_ps_offload->role = 1;
				p2p_ps_offload->role = 1;
				p2p_ps_offload->allstasleep = 0;
				p2p_ps_offload->allstasleep = -1;
			} else {
			} else {
				p2p_ps_offload->role = 0;
				p2p_ps_offload->role = 0;
			}
			}
@@ -827,4 +843,5 @@ void rtl88e_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)


	rtl88e_fill_h2c_cmd(hw, H2C_88E_P2P_PS_OFFLOAD, 1,
	rtl88e_fill_h2c_cmd(hw, H2C_88E_P2P_PS_OFFLOAD, 1,
			    (u8 *)p2p_ps_offload);
			    (u8 *)p2p_ps_offload);

}
}
+16 −13
Original line number Original line Diff line number Diff line
@@ -56,7 +56,8 @@


/* Fw PS state for RPWM.
/* Fw PS state for RPWM.
*BIT[2:0] = HW state
*BIT[2:0] = HW state
 * BIT[3] = Protocol PS state, 1: register active state, 0: register sleep state
*BIT[3] = Protocol PS state,
*1: register active state , 0: register sleep state
*BIT[4] = sub-state
*BIT[4] = sub-state
*/
*/
#define	FW_PS_GO_ON			BIT(0)
#define	FW_PS_GO_ON			BIT(0)
@@ -98,10 +99,13 @@
#define	FW_PS_STATE_S2			(FW_PS_RF_OFF)
#define	FW_PS_STATE_S2			(FW_PS_RF_OFF)
#define	FW_PS_STATE_S3			(FW_PS_ALL_ON)
#define	FW_PS_STATE_S3			(FW_PS_ALL_ON)
#define	FW_PS_STATE_S4			((FW_PS_ST_ACTIVE) | (FW_PS_ALL_ON))
#define	FW_PS_STATE_S4			((FW_PS_ST_ACTIVE) | (FW_PS_ALL_ON))

/* ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE))*/
#define	FW_PS_STATE_ALL_ON_88E		(FW_PS_CLOCK_ON)
#define	FW_PS_STATE_ALL_ON_88E		(FW_PS_CLOCK_ON)
/* (FW_PS_RF_ON)*/
#define	FW_PS_STATE_RF_ON_88E		(FW_PS_CLOCK_ON)
#define	FW_PS_STATE_RF_ON_88E		(FW_PS_CLOCK_ON)
/* 0x0*/
#define	FW_PS_STATE_RF_OFF_88E	(FW_PS_CLOCK_ON)
#define	FW_PS_STATE_RF_OFF_88E	(FW_PS_CLOCK_ON)
/* (FW_PS_STATE_RF_OFF)*/
#define	FW_PS_STATE_RF_OFF_LOW_PWR_88E	(FW_PS_CLOCK_OFF)
#define	FW_PS_STATE_RF_OFF_LOW_PWR_88E	(FW_PS_CLOCK_OFF)


#define	FW_PS_STATE_ALL_ON_92C		(FW_PS_STATE_S4)
#define	FW_PS_STATE_ALL_ON_92C		(FW_PS_STATE_S4)
@@ -146,7 +150,7 @@ struct rtl92c_firmware_header {
	u32 rsvd5;
	u32 rsvd5;
};
};


enum rtl8192c_h2c_cmd {
enum rtl8188e_h2c_cmd {
	H2C_88E_RSVDPAGE = 0,
	H2C_88E_RSVDPAGE = 0,
	H2C_88E_JOINBSSRPT = 1,
	H2C_88E_JOINBSSRPT = 1,
	H2C_88E_SCAN = 2,
	H2C_88E_SCAN = 2,
@@ -289,13 +293,12 @@ enum rtl8192c_h2c_cmd {
int rtl88e_download_fw(struct ieee80211_hw *hw,
int rtl88e_download_fw(struct ieee80211_hw *hw,
		       bool buse_wake_on_wlan_fw);
		       bool buse_wake_on_wlan_fw);
void rtl88e_fill_h2c_cmd(struct ieee80211_hw *hw, u8 element_id,
void rtl88e_fill_h2c_cmd(struct ieee80211_hw *hw, u8 element_id,
			 u32 cmd_len, u8 *p_cmdbuffer);
			 u32 cmd_len, u8 *cmdbuffer);
void rtl88e_firmware_selfreset(struct ieee80211_hw *hw);
void rtl88e_firmware_selfreset(struct ieee80211_hw *hw);
void rtl88e_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode);
void rtl88e_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode);
void rtl88e_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw,
void rtl88e_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus);
				      u8 mstatus);
void rtl88e_set_fw_ap_off_load_cmd(struct ieee80211_hw *hw,
void rtl88e_set_fw_ap_off_load_cmd(struct ieee80211_hw *hw,  u8 enable);
				   u8 ap_offload_enable);
void rtl88e_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished);
void rtl88e_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished);
void rtl88e_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state);
void rtl88e_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state);

#endif
#endif
Loading