|
@@ -11,10 +11,6 @@
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
|
* more details.
|
|
|
*
|
|
|
- * You should have received a copy of the GNU General Public License along with
|
|
|
- * tmis program; if not, write to the Free Software Foundation, Inc.,
|
|
|
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
|
|
- *
|
|
|
* Tme full GNU General Public License is included in this distribution in the
|
|
|
* file called LICENSE.
|
|
|
*
|
|
@@ -26,10 +22,9 @@
|
|
|
* Larry Finger <Larry.Finger@lwfinger.net>
|
|
|
*
|
|
|
*****************************************************************************/
|
|
|
-
|
|
|
-#include <linux/export.h>
|
|
|
#include "wifi.h"
|
|
|
#include "efuse.h"
|
|
|
+#include <linux/export.h>
|
|
|
|
|
|
static const u8 MAX_PGPKT_SIZE = 9;
|
|
|
static const u8 PGPKT_DATA_SIZE = 8;
|
|
@@ -63,21 +58,19 @@ static void efuse_shadow_write_2byte(struct ieee80211_hw *hw, u16 offset,
|
|
|
u16 value);
|
|
|
static void efuse_shadow_write_4byte(struct ieee80211_hw *hw, u16 offset,
|
|
|
u32 value);
|
|
|
-static int efuse_one_byte_read(struct ieee80211_hw *hw, u16 addr,
|
|
|
- u8 *data);
|
|
|
static int efuse_one_byte_write(struct ieee80211_hw *hw, u16 addr,
|
|
|
- u8 data);
|
|
|
+ u8 data);
|
|
|
static void efuse_read_all_map(struct ieee80211_hw *hw, u8 *efuse);
|
|
|
static int efuse_pg_packet_read(struct ieee80211_hw *hw, u8 offset,
|
|
|
- u8 *data);
|
|
|
+ u8 *data);
|
|
|
static int efuse_pg_packet_write(struct ieee80211_hw *hw, u8 offset,
|
|
|
u8 word_en, u8 *data);
|
|
|
static void efuse_word_enable_data_read(u8 word_en, u8 *sourdata,
|
|
|
u8 *targetdata);
|
|
|
-static u8 efuse_word_enable_data_write(struct ieee80211_hw *hw,
|
|
|
- u16 efuse_addr, u8 word_en, u8 *data);
|
|
|
+static u8 enable_efuse_data_write(struct ieee80211_hw *hw,
|
|
|
+ u16 efuse_addr, u8 word_en, u8 *data);
|
|
|
static void efuse_power_switch(struct ieee80211_hw *hw, u8 write,
|
|
|
- u8 pwrstate);
|
|
|
+ u8 pwrstate);
|
|
|
static u16 efuse_get_current_size(struct ieee80211_hw *hw);
|
|
|
static u8 efuse_calculate_word_cnts(u8 word_en);
|
|
|
|
|
@@ -413,8 +406,7 @@ bool efuse_shadow_update_chk(struct ieee80211_hw *hw)
|
|
|
efuse_used = rtlefuse->efuse_usedbytes;
|
|
|
|
|
|
if ((totalbytes + efuse_used) >=
|
|
|
- (EFUSE_MAX_SIZE -
|
|
|
- rtlpriv->cfg->maps[EFUSE_OOB_PROTECT_BYTES_LEN]))
|
|
|
+ (EFUSE_MAX_SIZE - rtlpriv->cfg->maps[EFUSE_OOB_PROTECT_BYTES_LEN]))
|
|
|
result = false;
|
|
|
|
|
|
RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,
|
|
@@ -428,13 +420,14 @@ void efuse_shadow_read(struct ieee80211_hw *hw, u8 type,
|
|
|
u16 offset, u32 *value)
|
|
|
{
|
|
|
if (type == 1)
|
|
|
- efuse_shadow_read_1byte(hw, offset, (u8 *) value);
|
|
|
+ efuse_shadow_read_1byte(hw, offset, (u8 *)value);
|
|
|
else if (type == 2)
|
|
|
- efuse_shadow_read_2byte(hw, offset, (u16 *) value);
|
|
|
+ efuse_shadow_read_2byte(hw, offset, (u16 *)value);
|
|
|
else if (type == 4)
|
|
|
efuse_shadow_read_4byte(hw, offset, value);
|
|
|
|
|
|
}
|
|
|
+EXPORT_SYMBOL(efuse_shadow_read);
|
|
|
|
|
|
void efuse_shadow_write(struct ieee80211_hw *hw, u8 type, u16 offset,
|
|
|
u32 value)
|
|
@@ -456,7 +449,7 @@ bool efuse_shadow_update(struct ieee80211_hw *hw)
|
|
|
u8 word_en = 0x0F;
|
|
|
u8 first_pg = false;
|
|
|
|
|
|
- RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, "--->\n");
|
|
|
+ RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, "\n");
|
|
|
|
|
|
if (!efuse_shadow_update_chk(hw)) {
|
|
|
efuse_read_all_map(hw, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0]);
|
|
@@ -465,7 +458,7 @@ bool efuse_shadow_update(struct ieee80211_hw *hw)
|
|
|
rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE]);
|
|
|
|
|
|
RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,
|
|
|
- "<---efuse out of capacity!!\n");
|
|
|
+ "efuse out of capacity!!\n");
|
|
|
return false;
|
|
|
}
|
|
|
efuse_power_switch(hw, true, true);
|
|
@@ -477,7 +470,6 @@ bool efuse_shadow_update(struct ieee80211_hw *hw)
|
|
|
|
|
|
for (i = 0; i < 8; i++) {
|
|
|
if (first_pg) {
|
|
|
-
|
|
|
word_en &= ~(BIT(i / 2));
|
|
|
|
|
|
rtlefuse->efuse_map[EFUSE_INIT_MAP][base + i] =
|
|
@@ -500,7 +492,7 @@ bool efuse_shadow_update(struct ieee80211_hw *hw)
|
|
|
&rtlefuse->efuse_map[EFUSE_MODIFY_MAP][base],
|
|
|
8);
|
|
|
RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_LOUD,
|
|
|
- "U-efuse", tmpdata, 8);
|
|
|
+ "U-efuse\n", tmpdata, 8);
|
|
|
|
|
|
if (!efuse_pg_packet_write(hw, (u8) offset, word_en,
|
|
|
tmpdata)) {
|
|
@@ -519,7 +511,7 @@ bool efuse_shadow_update(struct ieee80211_hw *hw)
|
|
|
&rtlefuse->efuse_map[EFUSE_INIT_MAP][0],
|
|
|
rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE]);
|
|
|
|
|
|
- RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, "<---\n");
|
|
|
+ RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, "\n");
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -529,14 +521,14 @@ void rtl_efuse_shadow_map_update(struct ieee80211_hw *hw)
|
|
|
struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
|
|
|
|
|
|
if (rtlefuse->autoload_failflag)
|
|
|
- memset(&rtlefuse->efuse_map[EFUSE_INIT_MAP][0], 0xFF,
|
|
|
- rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE]);
|
|
|
+ memset((&rtlefuse->efuse_map[EFUSE_INIT_MAP][0]),
|
|
|
+ 0xFF, rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE]);
|
|
|
else
|
|
|
efuse_read_all_map(hw, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0]);
|
|
|
|
|
|
memcpy(&rtlefuse->efuse_map[EFUSE_MODIFY_MAP][0],
|
|
|
- &rtlefuse->efuse_map[EFUSE_INIT_MAP][0],
|
|
|
- rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE]);
|
|
|
+ &rtlefuse->efuse_map[EFUSE_INIT_MAP][0],
|
|
|
+ rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE]);
|
|
|
|
|
|
}
|
|
|
EXPORT_SYMBOL(rtl_efuse_shadow_map_update);
|
|
@@ -619,7 +611,7 @@ static void efuse_shadow_write_4byte(struct ieee80211_hw *hw,
|
|
|
|
|
|
}
|
|
|
|
|
|
-static int efuse_one_byte_read(struct ieee80211_hw *hw, u16 addr, u8 *data)
|
|
|
+int efuse_one_byte_read(struct ieee80211_hw *hw, u16 addr, u8 *data)
|
|
|
{
|
|
|
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
|
|
u8 tmpidx = 0;
|
|
@@ -650,14 +642,15 @@ static int efuse_one_byte_read(struct ieee80211_hw *hw, u16 addr, u8 *data)
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
+EXPORT_SYMBOL(efuse_one_byte_read);
|
|
|
|
|
|
static int efuse_one_byte_write(struct ieee80211_hw *hw, u16 addr, u8 data)
|
|
|
{
|
|
|
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
|
|
u8 tmpidx = 0;
|
|
|
|
|
|
- RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, "Addr = %x Data=%x\n",
|
|
|
- addr, data);
|
|
|
+ RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,
|
|
|
+ "Addr = %x Data=%x\n", addr, data);
|
|
|
|
|
|
rtl_write_byte(rtlpriv,
|
|
|
rtlpriv->cfg->maps[EFUSE_CTRL] + 1, (u8) (addr & 0xff));
|
|
@@ -677,11 +670,10 @@ static int efuse_one_byte_write(struct ieee80211_hw *hw, u16 addr, u8 data)
|
|
|
|
|
|
if (tmpidx < 100)
|
|
|
return true;
|
|
|
-
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-static void efuse_read_all_map(struct ieee80211_hw *hw, u8 * efuse)
|
|
|
+static void efuse_read_all_map(struct ieee80211_hw *hw, u8 *efuse)
|
|
|
{
|
|
|
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
|
|
efuse_power_switch(hw, false, true);
|
|
@@ -706,14 +698,14 @@ static void efuse_read_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,
|
|
|
if (hoffset == offset) {
|
|
|
for (tmpidx = 0; tmpidx < word_cnts * 2; tmpidx++) {
|
|
|
if (efuse_one_byte_read(hw, *efuse_addr + 1 + tmpidx,
|
|
|
- &efuse_data)) {
|
|
|
+ &efuse_data)) {
|
|
|
tmpdata[tmpidx] = efuse_data;
|
|
|
if (efuse_data != 0xff)
|
|
|
- dataempty = true;
|
|
|
+ dataempty = false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (dataempty) {
|
|
|
+ if (!dataempty) {
|
|
|
*readstate = PG_STATE_DATA;
|
|
|
} else {
|
|
|
*efuse_addr = *efuse_addr + (word_cnts * 2) + 1;
|
|
@@ -729,7 +721,9 @@ static void efuse_read_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,
|
|
|
static int efuse_pg_packet_read(struct ieee80211_hw *hw, u8 offset, u8 *data)
|
|
|
{
|
|
|
u8 readstate = PG_STATE_HEADER;
|
|
|
+
|
|
|
bool continual = true;
|
|
|
+
|
|
|
u8 efuse_data, word_cnts = 0;
|
|
|
u16 efuse_addr = 0;
|
|
|
u8 tmpdata[8];
|
|
@@ -747,9 +741,8 @@ static int efuse_pg_packet_read(struct ieee80211_hw *hw, u8 offset, u8 *data)
|
|
|
if (efuse_one_byte_read(hw, efuse_addr, &efuse_data)
|
|
|
&& (efuse_data != 0xFF))
|
|
|
efuse_read_data_case1(hw, &efuse_addr,
|
|
|
- efuse_data,
|
|
|
- offset, tmpdata,
|
|
|
- &readstate);
|
|
|
+ efuse_data, offset,
|
|
|
+ tmpdata, &readstate);
|
|
|
else
|
|
|
continual = false;
|
|
|
} else if (readstate & PG_STATE_DATA) {
|
|
@@ -771,13 +764,14 @@ static int efuse_pg_packet_read(struct ieee80211_hw *hw, u8 offset, u8 *data)
|
|
|
}
|
|
|
|
|
|
static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,
|
|
|
- u8 efuse_data, u8 offset, int *continual,
|
|
|
- u8 *write_state, struct pgpkt_struct *target_pkt,
|
|
|
- int *repeat_times, int *result, u8 word_en)
|
|
|
+ u8 efuse_data, u8 offset,
|
|
|
+ int *continual, u8 *write_state,
|
|
|
+ struct pgpkt_struct *target_pkt,
|
|
|
+ int *repeat_times, int *result, u8 word_en)
|
|
|
{
|
|
|
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
|
|
struct pgpkt_struct tmp_pkt;
|
|
|
- bool dataempty = true;
|
|
|
+ int dataempty = true;
|
|
|
u8 originaldata[8 * sizeof(u8)];
|
|
|
u8 badworden = 0x0F;
|
|
|
u8 match_word_en, tmp_word_en;
|
|
@@ -794,9 +788,10 @@ static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,
|
|
|
*write_state = PG_STATE_HEADER;
|
|
|
} else {
|
|
|
for (tmpindex = 0; tmpindex < (tmp_word_cnts * 2); tmpindex++) {
|
|
|
- u16 address = *efuse_addr + 1 + tmpindex;
|
|
|
- if (efuse_one_byte_read(hw, address,
|
|
|
- &efuse_data) && (efuse_data != 0xFF))
|
|
|
+ if (efuse_one_byte_read(hw,
|
|
|
+ (*efuse_addr + 1 + tmpindex),
|
|
|
+ &efuse_data) &&
|
|
|
+ (efuse_data != 0xFF))
|
|
|
dataempty = false;
|
|
|
}
|
|
|
|
|
@@ -806,33 +801,34 @@ static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,
|
|
|
} else {
|
|
|
match_word_en = 0x0F;
|
|
|
if (!((target_pkt->word_en & BIT(0)) |
|
|
|
- (tmp_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))))
|
|
|
+ (tmp_pkt.word_en & BIT(1))))
|
|
|
match_word_en &= (~BIT(1));
|
|
|
|
|
|
if (!((target_pkt->word_en & BIT(2)) |
|
|
|
- (tmp_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))))
|
|
|
+ (tmp_pkt.word_en & BIT(3))))
|
|
|
match_word_en &= (~BIT(3));
|
|
|
|
|
|
if ((match_word_en & 0x0F) != 0x0F) {
|
|
|
- badworden = efuse_word_enable_data_write(
|
|
|
- hw, *efuse_addr + 1,
|
|
|
- tmp_pkt.word_en,
|
|
|
- target_pkt->data);
|
|
|
+ badworden =
|
|
|
+ enable_efuse_data_write(hw,
|
|
|
+ *efuse_addr + 1,
|
|
|
+ tmp_pkt.word_en,
|
|
|
+ target_pkt->data);
|
|
|
|
|
|
- if (0x0F != (badworden & 0x0F)) {
|
|
|
+ if (0x0F != (badworden & 0x0F)) {
|
|
|
u8 reorg_offset = offset;
|
|
|
u8 reorg_worden = badworden;
|
|
|
efuse_pg_packet_write(hw, reorg_offset,
|
|
|
- reorg_worden,
|
|
|
- originaldata);
|
|
|
+ reorg_worden,
|
|
|
+ originaldata);
|
|
|
}
|
|
|
|
|
|
tmp_word_en = 0x0F;
|
|
@@ -845,11 +841,11 @@ static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,
|
|
|
tmp_word_en &= (~BIT(1));
|
|
|
|
|
|
if ((target_pkt->word_en & BIT(2)) ^
|
|
|
- (match_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)))
|
|
|
+ (match_word_en & BIT(3)))
|
|
|
tmp_word_en &= (~BIT(3));
|
|
|
|
|
|
if ((tmp_word_en & 0x0F) != 0x0F) {
|
|
@@ -873,7 +869,7 @@ static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- RTPRINT(rtlpriv, FEEPROM, EFUSE_PG, "efuse PG_STATE_HEADER-1\n");
|
|
|
+ RTPRINT(rtlpriv, FEEPROM, EFUSE_PG, "efuse PG_STATE_HEADER-1\n");
|
|
|
}
|
|
|
|
|
|
static void efuse_write_data_case2(struct ieee80211_hw *hw, u16 *efuse_addr,
|
|
@@ -908,12 +904,13 @@ static void efuse_write_data_case2(struct ieee80211_hw *hw, u16 *efuse_addr,
|
|
|
|
|
|
tmp_word_cnts = efuse_calculate_word_cnts(tmp_pkt.word_en);
|
|
|
|
|
|
- memset(originaldata, 0xff, 8 * sizeof(u8));
|
|
|
+ memset(originaldata, 0xff, 8 * sizeof(u8));
|
|
|
|
|
|
if (efuse_pg_packet_read(hw, tmp_pkt.offset, originaldata)) {
|
|
|
- badworden = efuse_word_enable_data_write(hw,
|
|
|
- *efuse_addr + 1, tmp_pkt.word_en,
|
|
|
- originaldata);
|
|
|
+ badworden = enable_efuse_data_write(hw,
|
|
|
+ *efuse_addr + 1,
|
|
|
+ tmp_pkt.word_en,
|
|
|
+ originaldata);
|
|
|
|
|
|
if (0x0F != (badworden & 0x0F)) {
|
|
|
u8 reorg_offset = tmp_pkt.offset;
|
|
@@ -923,8 +920,8 @@ static void efuse_write_data_case2(struct ieee80211_hw *hw, u16 *efuse_addr,
|
|
|
originaldata);
|
|
|
*efuse_addr = efuse_get_current_size(hw);
|
|
|
} else {
|
|
|
- *efuse_addr = *efuse_addr + (tmp_word_cnts * 2)
|
|
|
- + 1;
|
|
|
+ *efuse_addr = *efuse_addr +
|
|
|
+ (tmp_word_cnts * 2) + 1;
|
|
|
}
|
|
|
} else {
|
|
|
*efuse_addr = *efuse_addr + (tmp_word_cnts * 2) + 1;
|
|
@@ -948,7 +945,7 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,
|
|
|
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
|
|
struct pgpkt_struct target_pkt;
|
|
|
u8 write_state = PG_STATE_HEADER;
|
|
|
- int continual = true, result = true;
|
|
|
+ int continual = true, dataempty = true, result = true;
|
|
|
u16 efuse_addr = 0;
|
|
|
u8 efuse_data;
|
|
|
u8 target_word_cnts = 0;
|
|
@@ -956,7 +953,7 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,
|
|
|
static int repeat_times;
|
|
|
|
|
|
if (efuse_get_current_size(hw) >= (EFUSE_MAX_SIZE -
|
|
|
- rtlpriv->cfg->maps[EFUSE_OOB_PROTECT_BYTES_LEN])) {
|
|
|
+ rtlpriv->cfg->maps[EFUSE_OOB_PROTECT_BYTES_LEN])) {
|
|
|
RTPRINT(rtlpriv, FEEPROM, EFUSE_PG,
|
|
|
"efuse_pg_packet_write error\n");
|
|
|
return false;
|
|
@@ -965,17 +962,18 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,
|
|
|
target_pkt.offset = offset;
|
|
|
target_pkt.word_en = word_en;
|
|
|
|
|
|
- memset(target_pkt.data, 0xFF, 8 * sizeof(u8));
|
|
|
+ memset(target_pkt.data, 0xFF, 8 * sizeof(u8));
|
|
|
|
|
|
efuse_word_enable_data_read(word_en, data, target_pkt.data);
|
|
|
target_word_cnts = efuse_calculate_word_cnts(target_pkt.word_en);
|
|
|
|
|
|
- RTPRINT(rtlpriv, FEEPROM, EFUSE_PG, "efuse Power ON\n");
|
|
|
+ RTPRINT(rtlpriv, FEEPROM, EFUSE_PG, "efuse Power ON\n");
|
|
|
|
|
|
while (continual && (efuse_addr < (EFUSE_MAX_SIZE -
|
|
|
- rtlpriv->cfg->maps[EFUSE_OOB_PROTECT_BYTES_LEN]))) {
|
|
|
+ rtlpriv->cfg->maps[EFUSE_OOB_PROTECT_BYTES_LEN]))) {
|
|
|
|
|
|
if (write_state == PG_STATE_HEADER) {
|
|
|
+ dataempty = true;
|
|
|
badworden = 0x0F;
|
|
|
RTPRINT(rtlpriv, FEEPROM, EFUSE_PG,
|
|
|
"efuse PG_STATE_HEADER\n");
|
|
@@ -985,7 +983,8 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,
|
|
|
efuse_write_data_case1(hw, &efuse_addr,
|
|
|
efuse_data, offset,
|
|
|
&continual,
|
|
|
- &write_state, &target_pkt,
|
|
|
+ &write_state,
|
|
|
+ &target_pkt,
|
|
|
&repeat_times, &result,
|
|
|
word_en);
|
|
|
else
|
|
@@ -999,15 +998,17 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,
|
|
|
} else if (write_state == PG_STATE_DATA) {
|
|
|
RTPRINT(rtlpriv, FEEPROM, EFUSE_PG,
|
|
|
"efuse PG_STATE_DATA\n");
|
|
|
+ badworden = 0x0f;
|
|
|
badworden =
|
|
|
- efuse_word_enable_data_write(hw, efuse_addr + 1,
|
|
|
- target_pkt.word_en,
|
|
|
- target_pkt.data);
|
|
|
+ enable_efuse_data_write(hw, efuse_addr + 1,
|
|
|
+ target_pkt.word_en,
|
|
|
+ target_pkt.data);
|
|
|
|
|
|
if ((badworden & 0x0F) == 0x0F) {
|
|
|
continual = false;
|
|
|
} else {
|
|
|
- efuse_addr += (2 * target_word_cnts) + 1;
|
|
|
+ efuse_addr =
|
|
|
+ efuse_addr + (2 * target_word_cnts) + 1;
|
|
|
|
|
|
target_pkt.offset = offset;
|
|
|
target_pkt.word_en = badworden;
|
|
@@ -1027,7 +1028,7 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,
|
|
|
}
|
|
|
|
|
|
if (efuse_addr >= (EFUSE_MAX_SIZE -
|
|
|
- rtlpriv->cfg->maps[EFUSE_OOB_PROTECT_BYTES_LEN])) {
|
|
|
+ rtlpriv->cfg->maps[EFUSE_OOB_PROTECT_BYTES_LEN])) {
|
|
|
RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,
|
|
|
"efuse_addr(%#x) Out of size!!\n", efuse_addr);
|
|
|
}
|
|
@@ -1035,8 +1036,8 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-static void efuse_word_enable_data_read(u8 word_en,
|
|
|
- u8 *sourdata, u8 *targetdata)
|
|
|
+static void efuse_word_enable_data_read(u8 word_en, u8 *sourdata,
|
|
|
+ u8 *targetdata)
|
|
|
{
|
|
|
if (!(word_en & BIT(0))) {
|
|
|
targetdata[0] = sourdata[0];
|
|
@@ -1059,8 +1060,8 @@ static void efuse_word_enable_data_read(u8 word_en,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static u8 efuse_word_enable_data_write(struct ieee80211_hw *hw,
|
|
|
- u16 efuse_addr, u8 word_en, u8 *data)
|
|
|
+static u8 enable_efuse_data_write(struct ieee80211_hw *hw,
|
|
|
+ u16 efuse_addr, u8 word_en, u8 *data)
|
|
|
{
|
|
|
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
|
|
u16 tmpaddr;
|
|
@@ -1069,8 +1070,8 @@ static u8 efuse_word_enable_data_write(struct ieee80211_hw *hw,
|
|
|
u8 tmpdata[8];
|
|
|
|
|
|
memset(tmpdata, 0xff, PGPKT_DATA_SIZE);
|
|
|
- RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, "word_en = %x efuse_addr=%x\n",
|
|
|
- word_en, efuse_addr);
|
|
|
+ RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,
|
|
|
+ "word_en = %x efuse_addr=%x\n", word_en, efuse_addr);
|
|
|
|
|
|
if (!(word_en & BIT(0))) {
|
|
|
tmpaddr = start_addr;
|
|
@@ -1127,19 +1128,22 @@ static void efuse_power_switch(struct ieee80211_hw *hw, u8 write, u8 pwrstate)
|
|
|
u16 tmpV16;
|
|
|
|
|
|
if (pwrstate && (rtlhal->hw_type != HARDWARE_TYPE_RTL8192SE)) {
|
|
|
- if (rtlhal->hw_type == HARDWARE_TYPE_RTL8188EE)
|
|
|
- rtl_write_byte(rtlpriv, rtlpriv->cfg->maps[EFUSE_ACCESS],
|
|
|
- 0x69);
|
|
|
|
|
|
- tmpV16 = rtl_read_word(rtlpriv,
|
|
|
- rtlpriv->cfg->maps[SYS_ISO_CTRL]);
|
|
|
- if (!(tmpV16 & rtlpriv->cfg->maps[EFUSE_PWC_EV12V])) {
|
|
|
- tmpV16 |= rtlpriv->cfg->maps[EFUSE_PWC_EV12V];
|
|
|
- rtl_write_word(rtlpriv,
|
|
|
- rtlpriv->cfg->maps[SYS_ISO_CTRL],
|
|
|
- tmpV16);
|
|
|
+ if (rtlhal->hw_type != HARDWARE_TYPE_RTL8192CE &&
|
|
|
+ rtlhal->hw_type != HARDWARE_TYPE_RTL8192DE) {
|
|
|
+ rtl_write_byte(rtlpriv,
|
|
|
+ rtlpriv->cfg->maps[EFUSE_ACCESS], 0x69);
|
|
|
+ } else {
|
|
|
+ tmpV16 =
|
|
|
+ rtl_read_word(rtlpriv,
|
|
|
+ rtlpriv->cfg->maps[SYS_ISO_CTRL]);
|
|
|
+ if (!(tmpV16 & rtlpriv->cfg->maps[EFUSE_PWC_EV12V])) {
|
|
|
+ tmpV16 |= rtlpriv->cfg->maps[EFUSE_PWC_EV12V];
|
|
|
+ rtl_write_word(rtlpriv,
|
|
|
+ rtlpriv->cfg->maps[SYS_ISO_CTRL],
|
|
|
+ tmpV16);
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
tmpV16 = rtl_read_word(rtlpriv,
|
|
|
rtlpriv->cfg->maps[SYS_FUNC_EN]);
|
|
|
if (!(tmpV16 & rtlpriv->cfg->maps[EFUSE_FEN_ELDR])) {
|
|
@@ -1164,7 +1168,10 @@ static void efuse_power_switch(struct ieee80211_hw *hw, u8 write, u8 pwrstate)
|
|
|
rtlpriv->cfg->maps[EFUSE_TEST] +
|
|
|
3);
|
|
|
|
|
|
- if (rtlhal->hw_type != HARDWARE_TYPE_RTL8192SE) {
|
|
|
+ if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
|
|
|
+ tempval &= ~(BIT(3) | BIT(4) | BIT(5) | BIT(6));
|
|
|
+ tempval |= (VOLTAGE_V25 << 3);
|
|
|
+ } else if (rtlhal->hw_type != HARDWARE_TYPE_RTL8192SE) {
|
|
|
tempval &= 0x0F;
|
|
|
tempval |= (VOLTAGE_V25 << 4);
|
|
|
}
|
|
@@ -1176,11 +1183,11 @@ static void efuse_power_switch(struct ieee80211_hw *hw, u8 write, u8 pwrstate)
|
|
|
|
|
|
if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192SE) {
|
|
|
rtl_write_byte(rtlpriv, rtlpriv->cfg->maps[EFUSE_CLK],
|
|
|
- 0x03);
|
|
|
+ 0x03);
|
|
|
}
|
|
|
-
|
|
|
} else {
|
|
|
- if (rtlhal->hw_type == HARDWARE_TYPE_RTL8188EE)
|
|
|
+ if (rtlhal->hw_type != HARDWARE_TYPE_RTL8192CE &&
|
|
|
+ rtlhal->hw_type != HARDWARE_TYPE_RTL8192DE)
|
|
|
rtl_write_byte(rtlpriv,
|
|
|
rtlpriv->cfg->maps[EFUSE_ACCESS], 0);
|
|
|
|
|
@@ -1195,27 +1202,28 @@ static void efuse_power_switch(struct ieee80211_hw *hw, u8 write, u8 pwrstate)
|
|
|
|
|
|
if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192SE) {
|
|
|
rtl_write_byte(rtlpriv, rtlpriv->cfg->maps[EFUSE_CLK],
|
|
|
- 0x02);
|
|
|
+ 0x02);
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
static u16 efuse_get_current_size(struct ieee80211_hw *hw)
|
|
|
{
|
|
|
+ int continual = true;
|
|
|
u16 efuse_addr = 0;
|
|
|
- u8 hworden;
|
|
|
+ u8 hoffset, hworden;
|
|
|
u8 efuse_data, word_cnts;
|
|
|
|
|
|
- while (efuse_one_byte_read(hw, efuse_addr, &efuse_data) &&
|
|
|
- efuse_addr < EFUSE_MAX_SIZE) {
|
|
|
- if (efuse_data == 0xFF)
|
|
|
- break;
|
|
|
-
|
|
|
- hworden = efuse_data & 0x0F;
|
|
|
- word_cnts = efuse_calculate_word_cnts(hworden);
|
|
|
- efuse_addr = efuse_addr + (word_cnts * 2) + 1;
|
|
|
+ while (continual && efuse_one_byte_read(hw, efuse_addr, &efuse_data) &&
|
|
|
+ (efuse_addr < EFUSE_MAX_SIZE)) {
|
|
|
+ if (efuse_data != 0xFF) {
|
|
|
+ hoffset = (efuse_data >> 4) & 0x0F;
|
|
|
+ hworden = efuse_data & 0x0F;
|
|
|
+ word_cnts = efuse_calculate_word_cnts(hworden);
|
|
|
+ efuse_addr = efuse_addr + (word_cnts * 2) + 1;
|
|
|
+ } else {
|
|
|
+ continual = false;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
return efuse_addr;
|