Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx
[pandora-kernel.git] / drivers / net / wireless / rtlwifi / rtl8192ce / phy.c
index d0541e8..abe0fcc 100644 (file)
@@ -38,7 +38,9 @@
 #include "dm.h"
 #include "table.h"
 
-u32 rtl92ce_phy_query_rf_reg(struct ieee80211_hw *hw,
+static bool _rtl92c_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);
+
+u32 rtl92c_phy_query_rf_reg(struct ieee80211_hw *hw,
                            enum radio_path rfpath, u32 regaddr, u32 bitmask)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -73,9 +75,47 @@ u32 rtl92ce_phy_query_rf_reg(struct ieee80211_hw *hw,
        return readback_value;
 }
 
+bool rtl92c_phy_mac_config(struct ieee80211_hw *hw)
+{
+       struct rtl_priv *rtlpriv = rtl_priv(hw);
+       struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
+       bool is92c = IS_92C_SERIAL(rtlhal->version);
+       bool rtstatus = _rtl92c_phy_config_mac_with_headerfile(hw);
+
+       if (is92c)
+               rtl_write_byte(rtlpriv, 0x14, 0x71);
+       return rtstatus;
+}
+
+bool rtl92c_phy_bb_config(struct ieee80211_hw *hw)
+{
+       bool rtstatus = true;
+       struct rtl_priv *rtlpriv = rtl_priv(hw);
+       u16 regval;
+       u32 regvaldw;
+       u8 reg_hwparafile = 1;
+
+       _rtl92c_phy_init_bb_rf_register_definition(hw);
+       regval = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
+       rtl_write_word(rtlpriv, REG_SYS_FUNC_EN,
+                      regval | BIT(13) | BIT(0) | BIT(1));
+       rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL, 0x83);
+       rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL + 1, 0xdb);
+       rtl_write_byte(rtlpriv, REG_RF_CTRL, RF_EN | RF_RSTB | RF_SDMRSTB);
+       rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN,
+                      FEN_PPLL | FEN_PCIEA | FEN_DIO_PCIE |
+                      FEN_BB_GLB_RSTn | FEN_BBRSTB);
+       rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL + 1, 0x80);
+       regvaldw = rtl_read_dword(rtlpriv, REG_LEDCFG0);
+       rtl_write_dword(rtlpriv, REG_LEDCFG0, regvaldw | BIT(23));
+       if (reg_hwparafile == 1)
+               rtstatus = _rtl92c_phy_bb8192c_config_parafile(hw);
+       return rtstatus;
+}
+
 void rtl92ce_phy_set_rf_reg(struct ieee80211_hw *hw,
-                          enum radio_path rfpath,
-                          u32 regaddr, u32 bitmask, u32 data)
+                           enum radio_path rfpath,
+                           u32 regaddr, u32 bitmask, u32 data)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
@@ -121,45 +161,7 @@ void rtl92ce_phy_set_rf_reg(struct ieee80211_hw *hw,
                                               bitmask, data, rfpath));
 }
 
-bool rtl92ce_phy_mac_config(struct ieee80211_hw *hw)
-{
-       struct rtl_priv *rtlpriv = rtl_priv(hw);
-       struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
-       bool is92c = IS_92C_SERIAL(rtlhal->version);
-       bool rtstatus = _rtl92ce_phy_config_mac_with_headerfile(hw);
-
-       if (is92c)
-               rtl_write_byte(rtlpriv, 0x14, 0x71);
-       return rtstatus;
-}
-
-bool rtl92ce_phy_bb_config(struct ieee80211_hw *hw)
-{
-       bool rtstatus = true;
-       struct rtl_priv *rtlpriv = rtl_priv(hw);
-       u16 regval;
-       u32 regvaldw;
-       u8 reg_hwparafile = 1;
-
-       _rtl92c_phy_init_bb_rf_register_definition(hw);
-       regval = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
-       rtl_write_word(rtlpriv, REG_SYS_FUNC_EN,
-                      regval | BIT(13) | BIT(0) | BIT(1));
-       rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL, 0x83);
-       rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL + 1, 0xdb);
-       rtl_write_byte(rtlpriv, REG_RF_CTRL, RF_EN | RF_RSTB | RF_SDMRSTB);
-       rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN,
-                      FEN_PPLL | FEN_PCIEA | FEN_DIO_PCIE |
-                      FEN_BB_GLB_RSTn | FEN_BBRSTB);
-       rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL + 1, 0x80);
-       regvaldw = rtl_read_dword(rtlpriv, REG_LEDCFG0);
-       rtl_write_dword(rtlpriv, REG_LEDCFG0, regvaldw | BIT(23));
-       if (reg_hwparafile == 1)
-               rtstatus = _rtl92c_phy_bb8192c_config_parafile(hw);
-       return rtstatus;
-}
-
-bool _rtl92ce_phy_config_mac_with_headerfile(struct ieee80211_hw *hw)
+static bool _rtl92c_phy_config_mac_with_headerfile(struct ieee80211_hw *hw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        u32 i;
@@ -177,7 +179,7 @@ bool _rtl92ce_phy_config_mac_with_headerfile(struct ieee80211_hw *hw)
 }
 
 bool _rtl92ce_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
-                                                 u8 configtype)
+                                           u8 configtype)
 {
        int i;
        u32 *phy_regarray_table;
@@ -236,7 +238,7 @@ bool _rtl92ce_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
 }
 
 bool _rtl92ce_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
-                                                   u8 configtype)
+                                             u8 configtype)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        int i;
@@ -274,7 +276,7 @@ bool _rtl92ce_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
        return true;
 }
 
-bool rtl92ce_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
+bool rtl92c_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
                                          enum radio_path rfpath)
 {
 
@@ -378,8 +380,10 @@ void rtl92ce_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
                  rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
                  "20MHz" : "40MHz"))
 
-           if (is_hal_stop(rtlhal))
+       if (is_hal_stop(rtlhal)) {
+               rtlphy->set_bwmode_inprogress = false;
                return;
+       }
 
        reg_bw_opmode = rtl_read_byte(rtlpriv, REG_BWOPMODE);
        reg_prsr_rsc = rtl_read_byte(rtlpriv, REG_RRSR + 2);
@@ -389,16 +393,13 @@ void rtl92ce_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
                reg_bw_opmode |= BW_OPMODE_20MHZ;
                rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
                break;
-
        case HT_CHANNEL_WIDTH_20_40:
                reg_bw_opmode &= ~BW_OPMODE_20MHZ;
                rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
-
                reg_prsr_rsc =
                    (reg_prsr_rsc & 0x90) | (mac->cur_40_prime_sc << 5);
                rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_prsr_rsc);
                break;
-
        default:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
                         ("unknown bandwidth: %#X\n", rtlphy->current_chan_bw));
@@ -414,10 +415,12 @@ void rtl92ce_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
        case HT_CHANNEL_WIDTH_20_40:
                rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x1);
                rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1);
+
                rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCK_SIDEBAND,
                              (mac->cur_40_prime_sc >> 1));
                rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00, mac->cur_40_prime_sc);
                rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 0);
+
                rtl_set_bbreg(hw, 0x818, (BIT(26) | BIT(27)),
                              (mac->cur_40_prime_sc ==
                               HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1);
@@ -427,7 +430,7 @@ void rtl92ce_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
                         ("unknown bandwidth: %#X\n", rtlphy->current_chan_bw));
                break;
        }
-       rtl92c_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
+       rtl92ce_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
        rtlphy->set_bwmode_inprogress = false;
        RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, ("<==\n"));
 }
@@ -477,6 +480,36 @@ void _rtl92ce_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
        }
 }
 
+static void _rtl92ce_phy_set_rf_sleep(struct ieee80211_hw *hw)
+{
+       u32 u4b_tmp;
+       u8 delay = 5;
+       struct rtl_priv *rtlpriv = rtl_priv(hw);
+
+       rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
+       rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
+       rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
+       u4b_tmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK);
+       while (u4b_tmp != 0 && delay > 0) {
+               rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x0);
+               rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
+               rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
+               u4b_tmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK);
+               delay--;
+       }
+       if (delay == 0) {
+               rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);
+               rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
+               rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
+               rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
+               RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
+                        ("Switch RF timeout !!!.\n"));
+               return;
+       }
+       rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
+       rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22);
+}
+
 static bool _rtl92ce_phy_set_rf_power_state(struct ieee80211_hw *hw,
                                            enum rf_pwrstate rfpwr_state)
 {
@@ -523,33 +556,6 @@ static bool _rtl92ce_phy_set_rf_power_state(struct ieee80211_hw *hw,
                        break;
                }
        case ERFOFF:{
-                       for (queue_id = 0, i = 0;
-                            queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
-                               ring = &pcipriv->dev.tx_ring[queue_id];
-                               if (skb_queue_len(&ring->queue) == 0 ||
-                                   queue_id == BEACON_QUEUE) {
-                                       queue_id++;
-                                       continue;
-                               } else {
-                                       RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                                                ("eRf Off/Sleep: %d times "
-                                                 "TcbBusyQueue[%d] "
-                                                 "=%d before doze!\n", (i + 1),
-                                                 queue_id,
-                                                 skb_queue_len(&ring->queue)));
-                                       udelay(10);
-                                       i++;
-                               }
-                               if (i >= MAX_DOZE_WAITING_TIMES_9x) {
-                                       RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                                                ("\nERFOFF: %d times "
-                                                 "TcbBusyQueue[%d] = %d !\n",
-                                                 MAX_DOZE_WAITING_TIMES_9x,
-                                                 queue_id,
-                                                 skb_queue_len(&ring->queue)));
-                                       break;
-                               }
-                       }
                        if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
                                RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
                                         ("IPS Set eRf nic disable\n"));
@@ -581,6 +587,7 @@ static bool _rtl92ce_phy_set_rf_power_state(struct ieee80211_hw *hw,
                                                  "TcbBusyQueue[%d] =%d before "
                                                  "doze!\n", (i + 1), queue_id,
                                                  skb_queue_len(&ring->queue)));
+
                                        udelay(10);
                                        i++;
                                }
@@ -599,7 +606,7 @@ static bool _rtl92ce_phy_set_rf_power_state(struct ieee80211_hw *hw,
                                  jiffies_to_msecs(jiffies -
                                                   ppsc->last_awake_jiffies)));
                        ppsc->last_sleep_jiffies = jiffies;
-                       _rtl92c_phy_set_rf_sleep(hw);
+                       _rtl92ce_phy_set_rf_sleep(hw);
                        break;
                }
        default:
@@ -614,10 +621,11 @@ static bool _rtl92ce_phy_set_rf_power_state(struct ieee80211_hw *hw,
        return bresult;
 }
 
-bool rtl92ce_phy_set_rf_power_state(struct ieee80211_hw *hw,
+bool rtl92c_phy_set_rf_power_state(struct ieee80211_hw *hw,
                                   enum rf_pwrstate rfpwr_state)
 {
        struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
+
        bool bresult = false;
 
        if (rfpwr_state == ppsc->rfpwr_state)