diff options
Diffstat (limited to 'drivers/net/wireless/rtlwifi/efuse.c')
| -rw-r--r-- | drivers/net/wireless/rtlwifi/efuse.c | 42 | 
1 files changed, 32 insertions, 10 deletions
diff --git a/drivers/net/wireless/rtlwifi/efuse.c b/drivers/net/wireless/rtlwifi/efuse.c index 8e2f9afb125..41a03b12463 100644 --- a/drivers/net/wireless/rtlwifi/efuse.c +++ b/drivers/net/wireless/rtlwifi/efuse.c @@ -35,8 +35,6 @@ static const u8 MAX_PGPKT_SIZE = 9;  static const u8 PGPKT_DATA_SIZE = 8;  static const int EFUSE_MAX_SIZE = 512; -static const u8 EFUSE_OOB_PROTECT_BYTES = 15; -  static const struct efuse_map RTL8712_SDIO_EFUSE_TABLE[] = {  	{0, 0, 0, 2},  	{0, 1, 0, 2}, @@ -240,6 +238,7 @@ void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf)  	u8 rtemp8[1];  	u16 efuse_addr = 0;  	u8 offset, wren; +	u8 u1temp = 0;  	u16 i;  	u16 j;  	const u16 efuse_max_section = @@ -285,10 +284,31 @@ void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf)  	}  	while ((*rtemp8 != 0xFF) && (efuse_addr < efuse_len)) { -		offset = ((*rtemp8 >> 4) & 0x0f); +		/*  Check PG header for section num.  */ +		if ((*rtemp8 & 0x1F) == 0x0F) {/* extended header */ +			u1temp = ((*rtemp8 & 0xE0) >> 5); +			read_efuse_byte(hw, efuse_addr, rtemp8); -		if (offset < efuse_max_section) { +			if ((*rtemp8 & 0x0F) == 0x0F) { +				efuse_addr++; +				read_efuse_byte(hw, efuse_addr, rtemp8); + +				if (*rtemp8 != 0xFF && +				    (efuse_addr < efuse_len)) { +					efuse_addr++; +				} +				continue; +			} else { +				offset = ((*rtemp8 & 0xF0) >> 1) | u1temp; +				wren = (*rtemp8 & 0x0F); +				efuse_addr++; +			} +		} else { +			offset = ((*rtemp8 >> 4) & 0x0f);  			wren = (*rtemp8 & 0x0f); +		} + +		if (offset < efuse_max_section) {  			RTPRINT(rtlpriv, FEEPROM, EFUSE_READ_ALL,  				"offset-%d Worden=%x\n", offset, wren); @@ -391,7 +411,8 @@ bool efuse_shadow_update_chk(struct ieee80211_hw *hw)  	efuse_used = rtlefuse->efuse_usedbytes;  	if ((totalbytes + efuse_used) >= -	    (EFUSE_MAX_SIZE - EFUSE_OOB_PROTECT_BYTES)) +	    (EFUSE_MAX_SIZE - +	     rtlpriv->cfg->maps[EFUSE_OOB_PROTECT_BYTES_LEN]))  		result = false;  	RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, @@ -932,8 +953,8 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,  	u8 badworden = 0x0F;  	static int repeat_times; -	if (efuse_get_current_size(hw) >= -	    (EFUSE_MAX_SIZE - EFUSE_OOB_PROTECT_BYTES)) { +	if (efuse_get_current_size(hw) >= (EFUSE_MAX_SIZE - +	    rtlpriv->cfg->maps[EFUSE_OOB_PROTECT_BYTES_LEN])) {  		RTPRINT(rtlpriv, FEEPROM, EFUSE_PG,  			"efuse_pg_packet_write error\n");  		return false; @@ -949,8 +970,8 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,  	RTPRINT(rtlpriv, FEEPROM, EFUSE_PG,  "efuse Power ON\n"); -	while (continual && (efuse_addr < -	       (EFUSE_MAX_SIZE - EFUSE_OOB_PROTECT_BYTES))) { +	while (continual && (efuse_addr < (EFUSE_MAX_SIZE - +	       rtlpriv->cfg->maps[EFUSE_OOB_PROTECT_BYTES_LEN]))) {  		if (write_state == PG_STATE_HEADER) {  			badworden = 0x0F; @@ -1003,7 +1024,8 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,  		}  	} -	if (efuse_addr >= (EFUSE_MAX_SIZE - EFUSE_OOB_PROTECT_BYTES)) { +	if (efuse_addr >= (EFUSE_MAX_SIZE - +	    rtlpriv->cfg->maps[EFUSE_OOB_PROTECT_BYTES_LEN])) {  		RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,  			 "efuse_addr(%#x) Out of size!!\n", efuse_addr);  	}  |