The firmware is read from disk as a little-endian byte string. The code that loads the firmware into the device transfers it as 4-byte quantities. The routines that write multi-byte quantities on BE hardware assume that the data are in CPU order, and automatically do the conversion to the LE order required by the device. As a result, the firmware is transmitted incorrectly. Rather than do multiple byte swaps on the data, the download routine is revised to transmit bytes rather than dwords. Although the number of I/O operations is increased, the firmware is not often loaded. All drivers have the same bug, and use essentially the same code to download firmware. These routines have been moved into rtlwifi. Some CamelCase variables have been renamed. Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> Cc: Ping-Ke Shih <pkshih@realtek.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
95 lines
3.0 KiB
C
95 lines
3.0 KiB
C
/******************************************************************************
|
|
*
|
|
* Copyright(c) 2009-2014 Realtek Corporation.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of version 2 of the GNU General Public License as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* The full GNU General Public License is included in this distribution in the
|
|
* file called LICENSE.
|
|
*
|
|
* Contact Information:
|
|
* wlanfae <wlanfae@realtek.com>
|
|
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
|
|
* Hsinchu 300, Taiwan.
|
|
*
|
|
* Larry Finger <Larry.Finger@lwfinger.net>
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#ifndef __FW_COMMON_H__
|
|
#define __FW_COMMON_H__
|
|
|
|
#define REG_SYS_FUNC_EN 0x0002
|
|
#define REG_MCUFWDL 0x0080
|
|
#define FW_8192C_PAGE_SIZE 4096
|
|
#define FW_8723A_POLLING_TIMEOUT_COUNT 1000
|
|
#define FW_8723B_POLLING_TIMEOUT_COUNT 6000
|
|
#define FW_8192C_POLLING_DELAY 5
|
|
|
|
#define MCUFWDL_RDY BIT(1)
|
|
#define FWDL_CHKSUM_RPT BIT(2)
|
|
#define WINTINI_RDY BIT(6)
|
|
|
|
#define REG_RSV_CTRL 0x001C
|
|
#define REG_HMETFR 0x01CC
|
|
|
|
enum version_8723e {
|
|
VERSION_TEST_UMC_CHIP_8723 = 0x0081,
|
|
VERSION_NORMAL_UMC_CHIP_8723_1T1R_A_CUT = 0x0089,
|
|
VERSION_NORMAL_UMC_CHIP_8723_1T1R_B_CUT = 0x1089,
|
|
VERSION_TEST_CHIP_1T1R_8723B = 0x0106,
|
|
VERSION_NORMAL_SMIC_CHIP_1T1R_8723B = 0x010E,
|
|
VERSION_UNKNOWN = 0xFF,
|
|
};
|
|
|
|
enum rtl8723be_cmd {
|
|
H2C_8723BE_RSVDPAGE = 0,
|
|
H2C_8723BE_JOINBSSRPT = 1,
|
|
H2C_8723BE_SCAN = 2,
|
|
H2C_8723BE_KEEP_ALIVE_CTRL = 3,
|
|
H2C_8723BE_DISCONNECT_DECISION = 4,
|
|
H2C_8723BE_INIT_OFFLOAD = 6,
|
|
H2C_8723BE_AP_OFFLOAD = 8,
|
|
H2C_8723BE_BCN_RSVDPAGE = 9,
|
|
H2C_8723BE_PROBERSP_RSVDPAGE = 10,
|
|
|
|
H2C_8723BE_SETPWRMODE = 0x20,
|
|
H2C_8723BE_PS_TUNING_PARA = 0x21,
|
|
H2C_8723BE_PS_TUNING_PARA2 = 0x22,
|
|
H2C_8723BE_PS_LPS_PARA = 0x23,
|
|
H2C_8723BE_P2P_PS_OFFLOAD = 0x24,
|
|
|
|
H2C_8723BE_WO_WLAN = 0x80,
|
|
H2C_8723BE_REMOTE_WAKE_CTRL = 0x81,
|
|
H2C_8723BE_AOAC_GLOBAL_INFO = 0x82,
|
|
H2C_8723BE_AOAC_RSVDPAGE = 0x83,
|
|
H2C_8723BE_RSSI_REPORT = 0x42,
|
|
H2C_8723BE_RA_MASK = 0x40,
|
|
H2C_8723BE_SELECTIVE_SUSPEND_ROF_CMD,
|
|
H2C_8723BE_P2P_PS_MODE,
|
|
H2C_8723BE_PSD_RESULT,
|
|
/*Not defined CTW CMD for P2P yet*/
|
|
H2C_8723BE_P2P_PS_CTW_CMD,
|
|
MAX_8723BE_H2CCMD
|
|
};
|
|
|
|
void rtl8723ae_firmware_selfreset(struct ieee80211_hw *hw);
|
|
void rtl8723be_firmware_selfreset(struct ieee80211_hw *hw);
|
|
void rtl8723_enable_fw_download(struct ieee80211_hw *hw, bool enable);
|
|
void rtl8723_write_fw(struct ieee80211_hw *hw,
|
|
enum version_8723e version,
|
|
u8 *buffer, u32 size, u8 max_page);
|
|
int rtl8723_fw_free_to_go(struct ieee80211_hw *hw, bool is_8723be, int count);
|
|
int rtl8723_download_fw(struct ieee80211_hw *hw, bool is_8723be, int count);
|
|
bool rtl8723_cmd_send_packet(struct ieee80211_hw *hw,
|
|
struct sk_buff *skb);
|
|
|
|
#endif
|