diff options
Diffstat (limited to 'drivers/net/wireless/rtlwifi/efuse.c')
| -rw-r--r-- | drivers/net/wireless/rtlwifi/efuse.c | 234 | 
1 files changed, 137 insertions, 97 deletions
| diff --git a/drivers/net/wireless/rtlwifi/efuse.c b/drivers/net/wireless/rtlwifi/efuse.c index 590f14f45a89..50de6f5d8a56 100644 --- a/drivers/net/wireless/rtlwifi/efuse.c +++ b/drivers/net/wireless/rtlwifi/efuse.c @@ -52,8 +52,6 @@ static const struct efuse_map RTL8712_SDIO_EFUSE_TABLE[] = {  	{11, 0, 0, 28}  }; -static void read_efuse_byte(struct ieee80211_hw *hw, u16 _offset, -					u8 *pbuf);  static void efuse_shadow_read_1byte(struct ieee80211_hw *hw, u16 offset,  				    u8 *value);  static void efuse_shadow_read_2byte(struct ieee80211_hw *hw, u16 offset, @@ -79,7 +77,7 @@ 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 void efuse_power_switch(struct ieee80211_hw *hw, u8 bwrite, +static void efuse_power_switch(struct ieee80211_hw *hw, u8 write,  					u8 pwrstate);  static u16 efuse_get_current_size(struct ieee80211_hw *hw);  static u8 efuse_calculate_word_cnts(u8 word_en); @@ -115,8 +113,10 @@ u8 efuse_read_1byte(struct ieee80211_hw *hw, u16 address)  	u8 bytetemp;  	u8 temp;  	u32 k = 0; +	const u32 efuse_len = +		rtlpriv->cfg->maps[EFUSE_REAL_CONTENT_SIZE]; -	if (address < EFUSE_REAL_CONTENT_LEN) { +	if (address < efuse_len) {  		temp = address & 0xFF;  		rtl_write_byte(rtlpriv, rtlpriv->cfg->maps[EFUSE_CTRL] + 1,  			       temp); @@ -158,11 +158,13 @@ void efuse_write_1byte(struct ieee80211_hw *hw, u16 address, u8 value)  	u8 bytetemp;  	u8 temp;  	u32 k = 0; +	const u32 efuse_len = +		rtlpriv->cfg->maps[EFUSE_REAL_CONTENT_SIZE];  	RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,  		 ("Addr=%x Data =%x\n", address, value)); -	if (address < EFUSE_REAL_CONTENT_LEN) { +	if (address < efuse_len) {  		rtl_write_byte(rtlpriv, rtlpriv->cfg->maps[EFUSE_CTRL], value);  		temp = address & 0xFF; @@ -198,7 +200,7 @@ void efuse_write_1byte(struct ieee80211_hw *hw, u16 address, u8 value)  } -static void read_efuse_byte(struct ieee80211_hw *hw, u16 _offset, u8 *pbuf) +void read_efuse_byte(struct ieee80211_hw *hw, u16 _offset, u8 *pbuf)  {  	struct rtl_priv *rtlpriv = rtl_priv(hw);  	u32 value32; @@ -233,26 +235,45 @@ void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf)  {  	struct rtl_priv *rtlpriv = rtl_priv(hw);  	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); -	u8 efuse_tbl[EFUSE_MAP_LEN]; +	u8 *efuse_tbl;  	u8 rtemp8[1];  	u16 efuse_addr = 0;  	u8 offset, wren;  	u16 i;  	u16 j; -	u16 efuse_word[EFUSE_MAX_SECTION][EFUSE_MAX_WORD_UNIT]; +	const u16 efuse_max_section = +		rtlpriv->cfg->maps[EFUSE_MAX_SECTION_MAP]; +	const u32 efuse_len = +		rtlpriv->cfg->maps[EFUSE_REAL_CONTENT_SIZE]; +	u16 **efuse_word;  	u16 efuse_utilized = 0;  	u8 efuse_usage; -	if ((_offset + _size_byte) > EFUSE_MAP_LEN) { +	if ((_offset + _size_byte) > rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE]) {  		RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,  			 ("read_efuse(): Invalid offset(%#x) with read "  			  "bytes(%#x)!!\n", _offset, _size_byte));  		return;  	} -	for (i = 0; i < EFUSE_MAX_SECTION; i++) +	/* allocate memory for efuse_tbl and efuse_word */ +	efuse_tbl = kmalloc(rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE] * +			    sizeof(u8), GFP_ATOMIC); +	if (!efuse_tbl) +		return; +	efuse_word = kmalloc(EFUSE_MAX_WORD_UNIT * sizeof(u16 *), GFP_ATOMIC); +	if (!efuse_word) +		goto done; +	for (i = 0; i < EFUSE_MAX_WORD_UNIT; i++) { +		efuse_word[i] = kmalloc(efuse_max_section * sizeof(u16), +					GFP_ATOMIC); +		if (!efuse_word[i]) +			goto done; +	} + +	for (i = 0; i < efuse_max_section; i++)  		for (j = 0; j < EFUSE_MAX_WORD_UNIT; j++) -			efuse_word[i][j] = 0xFFFF; +			efuse_word[j][i] = 0xFFFF;  	read_efuse_byte(hw, efuse_addr, rtemp8);  	if (*rtemp8 != 0xFF) { @@ -262,10 +283,10 @@ void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf)  		efuse_addr++;  	} -	while ((*rtemp8 != 0xFF) && (efuse_addr < EFUSE_REAL_CONTENT_LEN)) { +	while ((*rtemp8 != 0xFF) && (efuse_addr < efuse_len)) {  		offset = ((*rtemp8 >> 4) & 0x0f); -		if (offset < EFUSE_MAX_SECTION) { +		if (offset < efuse_max_section) {  			wren = (*rtemp8 & 0x0f);  			RTPRINT(rtlpriv, FEEPROM, EFUSE_READ_ALL,  				("offset-%d Worden=%x\n", offset, wren)); @@ -279,9 +300,10 @@ void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf)  					read_efuse_byte(hw, efuse_addr, rtemp8);  					efuse_addr++;  					efuse_utilized++; -					efuse_word[offset][i] = (*rtemp8 & 0xff); +					efuse_word[i][offset] = +							 (*rtemp8 & 0xff); -					if (efuse_addr >= EFUSE_REAL_CONTENT_LEN) +					if (efuse_addr >= efuse_len)  						break;  					RTPRINT(rtlpriv, FEEPROM, @@ -291,10 +313,10 @@ void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf)  					read_efuse_byte(hw, efuse_addr, rtemp8);  					efuse_addr++;  					efuse_utilized++; -					efuse_word[offset][i] |= +					efuse_word[i][offset] |=  					    (((u16)*rtemp8 << 8) & 0xff00); -					if (efuse_addr >= EFUSE_REAL_CONTENT_LEN) +					if (efuse_addr >= efuse_len)  						break;  				} @@ -305,18 +327,18 @@ void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf)  		RTPRINT(rtlpriv, FEEPROM, EFUSE_READ_ALL,  			("Addr=%d\n", efuse_addr));  		read_efuse_byte(hw, efuse_addr, rtemp8); -		if (*rtemp8 != 0xFF && (efuse_addr < 512)) { +		if (*rtemp8 != 0xFF && (efuse_addr < efuse_len)) {  			efuse_utilized++;  			efuse_addr++;  		}  	} -	for (i = 0; i < EFUSE_MAX_SECTION; i++) { +	for (i = 0; i < efuse_max_section; i++) {  		for (j = 0; j < EFUSE_MAX_WORD_UNIT; j++) {  			efuse_tbl[(i * 8) + (j * 2)] = -			    (efuse_word[i][j] & 0xff); +			    (efuse_word[j][i] & 0xff);  			efuse_tbl[(i * 8) + ((j * 2) + 1)] = -			    ((efuse_word[i][j] >> 8) & 0xff); +			    ((efuse_word[j][i] >> 8) & 0xff);  		}  	} @@ -324,12 +346,17 @@ void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf)  		pbuf[i] = efuse_tbl[_offset + i];  	rtlefuse->efuse_usedbytes = efuse_utilized; -	efuse_usage = (u8)((efuse_utilized * 100) / EFUSE_REAL_CONTENT_LEN); +	efuse_usage = (u8) ((efuse_utilized * 100) / efuse_len);  	rtlefuse->efuse_usedpercentage = efuse_usage;  	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_EFUSE_BYTES,  				      (u8 *)&efuse_utilized);  	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_EFUSE_USAGE,  				      (u8 *)&efuse_usage); +done: +	for (i = 0; i < EFUSE_MAX_WORD_UNIT; i++) +		kfree(efuse_word[i]); +	kfree(efuse_word); +	kfree(efuse_tbl);  }  bool efuse_shadow_update_chk(struct ieee80211_hw *hw) @@ -338,11 +365,11 @@ bool efuse_shadow_update_chk(struct ieee80211_hw *hw)  	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));  	u8 section_idx, i, Base;  	u16 words_need = 0, hdr_num = 0, totalbytes, efuse_used; -	bool bwordchanged, bresult = true; +	bool wordchanged, result = true;  	for (section_idx = 0; section_idx < 16; section_idx++) {  		Base = section_idx * 8; -		bwordchanged = false; +		wordchanged = false;  		for (i = 0; i < 8; i = i + 2) {  			if ((rtlefuse->efuse_map[EFUSE_INIT_MAP][Base + i] != @@ -351,11 +378,11 @@ bool efuse_shadow_update_chk(struct ieee80211_hw *hw)  			     rtlefuse->efuse_map[EFUSE_MODIFY_MAP][Base + i +  								   1])) {  				words_need++; -				bwordchanged = true; +				wordchanged = true;  			}  		} -		if (bwordchanged == true) +		if (wordchanged == true)  			hdr_num++;  	} @@ -364,14 +391,14 @@ bool efuse_shadow_update_chk(struct ieee80211_hw *hw)  	if ((totalbytes + efuse_used) >=  	    (EFUSE_MAX_SIZE - EFUSE_OOB_PROTECT_BYTES)) -		bresult = false; +		result = false;  	RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,  		 ("efuse_shadow_update_chk(): totalbytes(%#x), "  		  "hdr_num(%#x), words_need(%#x), efuse_used(%d)\n",  		  totalbytes, hdr_num, words_need, efuse_used)); -	return bresult; +	return result;  }  void efuse_shadow_read(struct ieee80211_hw *hw, u8 type, @@ -394,7 +421,7 @@ void efuse_shadow_write(struct ieee80211_hw *hw, u8 type, u16 offset,  	else if (type == 2)  		efuse_shadow_write_2byte(hw, offset, (u16) value);  	else if (type == 4) -		efuse_shadow_write_4byte(hw, offset, (u32) value); +		efuse_shadow_write_4byte(hw, offset, value);  } @@ -478,9 +505,10 @@ void rtl_efuse_shadow_map_update(struct ieee80211_hw *hw)  	struct rtl_priv *rtlpriv = rtl_priv(hw);  	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); -	if (rtlefuse->autoload_failflag == true) { -		memset(&rtlefuse->efuse_map[EFUSE_INIT_MAP][0], 0xFF, 128); -	} else +	if (rtlefuse->autoload_failflag == true) +		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], @@ -572,7 +600,7 @@ static int efuse_one_byte_read(struct ieee80211_hw *hw, u16 addr, u8 *data)  {  	struct rtl_priv *rtlpriv = rtl_priv(hw);  	u8 tmpidx = 0; -	int bresult; +	int result;  	rtl_write_byte(rtlpriv, rtlpriv->cfg->maps[EFUSE_CTRL] + 1,  		       (u8) (addr & 0xff)); @@ -592,19 +620,18 @@ static int efuse_one_byte_read(struct ieee80211_hw *hw, u16 addr, u8 *data)  	if (tmpidx < 100) {  		*data = rtl_read_byte(rtlpriv, rtlpriv->cfg->maps[EFUSE_CTRL]); -		bresult = true; +		result = true;  	} else {  		*data = 0xff; -		bresult = false; +		result = false;  	} -	return bresult; +	return result;  }  static int efuse_one_byte_write(struct ieee80211_hw *hw, u16 addr, u8 data)  {  	struct rtl_priv *rtlpriv = rtl_priv(hw);  	u8 tmpidx = 0; -	bool bresult;  	RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,  		 ("Addr = %x Data=%x\n", addr, data)); @@ -626,17 +653,16 @@ static int efuse_one_byte_write(struct ieee80211_hw *hw, u16 addr, u8 data)  	}  	if (tmpidx < 100) -		bresult = true; -	else -		bresult = false; +		return true; -	return bresult; +	return false;  }  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); -	read_efuse(hw, 0, 128, efuse); +	read_efuse(hw, 0, rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE], efuse);  	efuse_power_switch(hw, false, false);  } @@ -644,7 +670,7 @@ static void efuse_read_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,  				u8 efuse_data, u8 offset, u8 *tmpdata,  				u8 *readstate)  { -	bool bdataempty = true; +	bool dataempty = true;  	u8 hoffset;  	u8 tmpidx;  	u8 hworden; @@ -660,13 +686,13 @@ static void efuse_read_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,  			    &efuse_data)) {  				tmpdata[tmpidx] = efuse_data;  				if (efuse_data != 0xff) -					bdataempty = true; +					dataempty = true;  			}  		} -		if (bdataempty == true) +		if (dataempty == true) {  			*readstate = PG_STATE_DATA; -		else { +		} else {  			*efuse_addr = *efuse_addr + (word_cnts * 2) + 1;  			*readstate = PG_STATE_HEADER;  		} @@ -680,12 +706,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 bcontinual = true; - +	bool continual = true;  	u8 efuse_data, word_cnts = 0;  	u16 efuse_addr = 0; -	u8 hworden = 0;  	u8 tmpdata[8];  	if (data == NULL) @@ -696,7 +719,7 @@ static int efuse_pg_packet_read(struct ieee80211_hw *hw, u8 offset, u8 *data)  	memset(data, 0xff, PGPKT_DATA_SIZE * sizeof(u8));  	memset(tmpdata, 0xff, PGPKT_DATA_SIZE * sizeof(u8)); -	while (bcontinual && (efuse_addr < EFUSE_MAX_SIZE)) { +	while (continual && (efuse_addr < EFUSE_MAX_SIZE)) {  		if (readstate & PG_STATE_HEADER) {  			if (efuse_one_byte_read(hw, efuse_addr, &efuse_data)  			    && (efuse_data != 0xFF)) @@ -705,9 +728,9 @@ static int efuse_pg_packet_read(struct ieee80211_hw *hw, u8 offset, u8 *data)  						      offset, tmpdata,  						      &readstate);  			else -				bcontinual = false; +				continual = false;  		} else if (readstate & PG_STATE_DATA) { -			efuse_word_enable_data_read(hworden, tmpdata, data); +			efuse_word_enable_data_read(0, tmpdata, data);  			efuse_addr = efuse_addr + (word_cnts * 2) + 1;  			readstate = PG_STATE_HEADER;  		} @@ -725,13 +748,13 @@ 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 *bcontinual, +			u8 efuse_data, u8 offset, int *continual,  			u8 *write_state, struct pgpkt_struct *target_pkt, -			int *repeat_times, int *bresult, u8 word_en) +			int *repeat_times, int *result, u8 word_en)  {  	struct rtl_priv *rtlpriv = rtl_priv(hw);  	struct pgpkt_struct tmp_pkt; -	int bdataempty = true; +	bool dataempty = true;  	u8 originaldata[8 * sizeof(u8)];  	u8 badworden = 0x0F;  	u8 match_word_en, tmp_word_en; @@ -751,10 +774,10 @@ static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,  			u16 address = *efuse_addr + 1 + tmpindex;  			if (efuse_one_byte_read(hw, address,  			     &efuse_data) && (efuse_data != 0xFF)) -				bdataempty = false; +				dataempty = false;  		} -		if (bdataempty == false) { +		if (dataempty == false) {  			*efuse_addr = *efuse_addr + (tmp_word_cnts * 2) + 1;  			*write_state = PG_STATE_HEADER;  		} else { @@ -799,24 +822,25 @@ 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) {  					*efuse_addr = efuse_get_current_size(hw);  					target_pkt->offset = offset;  					target_pkt->word_en = tmp_word_en; -				} else -					*bcontinual = false; +				} else { +					*continual = false; +				}  				*write_state = PG_STATE_HEADER;  				*repeat_times += 1;  				if (*repeat_times > EFUSE_REPEAT_THRESHOLD_) { -					*bcontinual = false; -					*bresult = false; +					*continual = false; +					*result = false;  				}  			} else {  				*efuse_addr += (2 * tmp_word_cnts) + 1; @@ -830,9 +854,9 @@ static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,  }  static void efuse_write_data_case2(struct ieee80211_hw *hw, u16 *efuse_addr, -				   int *bcontinual, u8 *write_state, +				   int *continual, u8 *write_state,  				   struct pgpkt_struct target_pkt, -				   int *repeat_times, int *bresult) +				   int *repeat_times, int *result)  {  	struct rtl_priv *rtlpriv = rtl_priv(hw);  	struct pgpkt_struct tmp_pkt; @@ -846,14 +870,14 @@ static void efuse_write_data_case2(struct ieee80211_hw *hw, u16 *efuse_addr,  	efuse_one_byte_write(hw, *efuse_addr, pg_header);  	efuse_one_byte_read(hw, *efuse_addr, &tmp_header); -	if (tmp_header == pg_header) +	if (tmp_header == pg_header) {  		*write_state = PG_STATE_DATA; -	else if (tmp_header == 0xFF) { +	} else if (tmp_header == 0xFF) {  		*write_state = PG_STATE_HEADER;  		*repeat_times += 1;  		if (*repeat_times > EFUSE_REPEAT_THRESHOLD_) { -			*bcontinual = false; -			*bresult = false; +			*continual = false; +			*result = false;  		}  	} else {  		tmp_pkt.offset = (tmp_header >> 4) & 0x0F; @@ -875,17 +899,19 @@ static void efuse_write_data_case2(struct ieee80211_hw *hw, u16 *efuse_addr,  						      reorg_worden,  						      originaldata);  				*efuse_addr = efuse_get_current_size(hw); -			 } else +			} else {  				*efuse_addr = *efuse_addr + (tmp_word_cnts * 2)  					      + 1; -		} else +			} +		} else {  			*efuse_addr = *efuse_addr + (tmp_word_cnts * 2) + 1; +		}  		*write_state = PG_STATE_HEADER;  		*repeat_times += 1;  		if (*repeat_times > EFUSE_REPEAT_THRESHOLD_) { -			*bcontinual = false; -			*bresult = false; +			*continual = false; +			*result = false;  		}  		RTPRINT(rtlpriv, FEEPROM, EFUSE_PG, @@ -899,7 +925,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 bcontinual = true, bdataempty = true, bresult = true; +	int continual = true, dataempty = true, result = true;  	u16 efuse_addr = 0;  	u8 efuse_data;  	u8 target_word_cnts = 0; @@ -923,11 +949,11 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,  	RTPRINT(rtlpriv, FEEPROM, EFUSE_PG, ("efuse Power ON\n")); -	while (bcontinual && (efuse_addr < +	while (continual && (efuse_addr <  	       (EFUSE_MAX_SIZE - EFUSE_OOB_PROTECT_BYTES))) {  		if (write_state == PG_STATE_HEADER) { -			bdataempty = true; +			dataempty = true;  			badworden = 0x0F;  			RTPRINT(rtlpriv, FEEPROM, EFUSE_PG,  				("efuse PG_STATE_HEADER\n")); @@ -936,32 +962,30 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,  			    (efuse_data != 0xFF))  				efuse_write_data_case1(hw, &efuse_addr,  						       efuse_data, offset, -						       &bcontinual, +						       &continual,  						       &write_state, &target_pkt, -						       &repeat_times, &bresult, +						       &repeat_times, &result,  						       word_en);  			else  				efuse_write_data_case2(hw, &efuse_addr, -						       &bcontinual, +						       &continual,  						       &write_state,  						       target_pkt,  						       &repeat_times, -						       &bresult); +						       &result);  		} 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);  			if ((badworden & 0x0F) == 0x0F) { -				bcontinual = false; +				continual = false;  			} else { -				efuse_addr = -				    efuse_addr + (2 * target_word_cnts) + 1; +				efuse_addr += (2 * target_word_cnts) + 1;  				target_pkt.offset = offset;  				target_pkt.word_en = badworden; @@ -971,8 +995,8 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,  				write_state = PG_STATE_HEADER;  				repeat_times++;  				if (repeat_times > EFUSE_REPEAT_THRESHOLD_) { -					bcontinual = false; -					bresult = false; +					continual = false; +					result = false;  				}  				RTPRINT(rtlpriv, FEEPROM, EFUSE_PG,  					("efuse PG_STATE_HEADER-3\n")); @@ -1072,13 +1096,15 @@ static u8 efuse_word_enable_data_write(struct ieee80211_hw *hw,  	return badworden;  } -static void efuse_power_switch(struct ieee80211_hw *hw, u8 bwrite, u8 pwrstate) +static void efuse_power_switch(struct ieee80211_hw *hw, u8 write, u8 pwrstate)  {  	struct rtl_priv *rtlpriv = rtl_priv(hw); +	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));  	u8 tempval;  	u16 tmpV16; -	if (pwrstate == true) { +	if (pwrstate && (rtlhal->hw_type != +		HARDWARE_TYPE_RTL8192SE)) {  		tmpV16 = rtl_read_word(rtlpriv,  				       rtlpriv->cfg->maps[SYS_ISO_CTRL]);  		if (!(tmpV16 & rtlpriv->cfg->maps[EFUSE_PWC_EV12V])) { @@ -1106,20 +1132,29 @@ static void efuse_power_switch(struct ieee80211_hw *hw, u8 bwrite, u8 pwrstate)  		}  	} -	if (pwrstate == true) { -		if (bwrite == true) { +	if (pwrstate) { +		if (write) {  			tempval = rtl_read_byte(rtlpriv,  						rtlpriv->cfg->maps[EFUSE_TEST] +  						3); -			tempval &= 0x0F; -			tempval |= (VOLTAGE_V25 << 4); + +			if (rtlhal->hw_type != HARDWARE_TYPE_RTL8192SE) { +				tempval &= 0x0F; +				tempval |= (VOLTAGE_V25 << 4); +			} +  			rtl_write_byte(rtlpriv,  				       rtlpriv->cfg->maps[EFUSE_TEST] + 3,  				       (tempval | 0x80));  		} +		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192SE) { +			rtl_write_byte(rtlpriv, rtlpriv->cfg->maps[EFUSE_CLK], +						0x03); +		} +  	} else { -		if (bwrite == true) { +		if (write) {  			tempval = rtl_read_byte(rtlpriv,  						rtlpriv->cfg->maps[EFUSE_TEST] +  						3); @@ -1128,18 +1163,23 @@ static void efuse_power_switch(struct ieee80211_hw *hw, u8 bwrite, u8 pwrstate)  				       (tempval & 0x7F));  		} +		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192SE) { +			rtl_write_byte(rtlpriv, rtlpriv->cfg->maps[EFUSE_CLK], +						0x02); +		} +  	}  }  static u16 efuse_get_current_size(struct ieee80211_hw *hw)  { -	int bcontinual = true; +	int continual = true;  	u16 efuse_addr = 0;  	u8 hoffset, hworden;  	u8 efuse_data, word_cnts; -	while (bcontinual && efuse_one_byte_read(hw, efuse_addr, &efuse_data) +	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; @@ -1147,7 +1187,7 @@ static u16 efuse_get_current_size(struct ieee80211_hw *hw)  			word_cnts = efuse_calculate_word_cnts(hworden);  			efuse_addr = efuse_addr + (word_cnts * 2) + 1;  		} else { -			bcontinual = false; +			continual = false;  		}  	} |