Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rtlwifi / efuse.c
index 8e2f9afb125a86874359639bd17fa568332ccefd..9e3894178e7773b3d6aca8a4cca70fc518fd6a96 100644 (file)
@@ -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);
        }
@@ -1102,8 +1124,11 @@ static void efuse_power_switch(struct ieee80211_hw *hw, u8 write, u8 pwrstate)
        u8 tempval;
        u16 tmpV16;
 
-       if (pwrstate && (rtlhal->hw_type !=
-               HARDWARE_TYPE_RTL8192SE)) {
+       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])) {
@@ -1153,6 +1178,10 @@ static void efuse_power_switch(struct ieee80211_hw *hw, u8 write, u8 pwrstate)
                }
 
        } else {
+               if (rtlhal->hw_type == HARDWARE_TYPE_RTL8188EE)
+                       rtl_write_byte(rtlpriv,
+                                      rtlpriv->cfg->maps[EFUSE_ACCESS], 0);
+
                if (write) {
                        tempval = rtl_read_byte(rtlpriv,
                                                rtlpriv->cfg->maps[EFUSE_TEST] +