Search Linux Wireless

[PATCH] rtlwifi: rtl8192cu: Modify _rtl92cu_phy_set_rf_power_state().

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I change the RTL8192CE routines to the RTL8192CU routines
in the _rtl92cu_phy_set_rf_power_state().
These RTL8192CU routines are copy codes of vendor driver.

Signed-off-by: Taehee Yoo <ap420073@xxxxxxxxx>
---
 drivers/net/wireless/rtlwifi/rtl8192cu/phy.c | 153 +++++++++------------------
 1 file changed, 50 insertions(+), 103 deletions(-)

diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c b/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c
index 12f6d47..0b65f25 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c
@@ -416,116 +416,63 @@ static bool _rtl92cu_phy_set_rf_power_state(struct ieee80211_hw *hw,
 					    enum rf_pwrstate rfpwr_state)
 {
 	struct rtl_priv *rtlpriv = rtl_priv(hw);
-	struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
-	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
+	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
+	struct rtl_phy *rtlphy = &rtlpriv->phy;
 	bool bresult = true;
-	u8 i, queue_id;
-	struct rtl8192_tx_ring *ring = NULL;
+	u8 value8;
 
 	switch (rfpwr_state) {
 	case ERFON:
-		if ((ppsc->rfpwr_state == ERFOFF) &&
-		    RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
-			bool rtstatus;
-			u32 InitializeCount = 0;
-
-			do {
-				InitializeCount++;
-				RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
-					 "IPS Set eRf nic enable\n");
-				rtstatus = rtl_ps_enable_nic(hw);
-			} while (!rtstatus && (InitializeCount < 10));
-			RT_CLEAR_PS_LEVEL(ppsc,
-					  RT_RF_OFF_LEVL_HALT_NIC);
-		} else {
-			RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
-				 "Set ERFON sleeped:%d ms\n",
-				 jiffies_to_msecs(jiffies -
-						  ppsc->last_sleep_jiffies));
-			ppsc->last_awake_jiffies = jiffies;
-			rtl92ce_phy_set_rf_on(hw);
-		}
-		if (mac->link_state == MAC80211_LINKED) {
-			rtlpriv->cfg->ops->led_control(hw,
-						       LED_CTL_LINK);
-		} else {
-			rtlpriv->cfg->ops->led_control(hw,
-						       LED_CTL_NO_LINK);
-		}
-		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,
-					 "ERFOFF: %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");
-			rtl_ps_disable_nic(hw);
-			RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
-		} else {
-			if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) {
-				rtlpriv->cfg->ops->led_control(hw,
-							 LED_CTL_NO_LINK);
-			} else {
-				rtlpriv->cfg->ops->led_control(hw,
-							 LED_CTL_POWER_OFF);
-			}
-		}
+		value8 = rtl_read_byte(rtlpriv, REG_SPS0_CTRL);
+		value8 |= (BIT(0) | BIT(3));
+		rtl_write_byte(rtlpriv, REG_SPS0_CTRL, value8);
+
+		if (rtlphy->rf_type == RF_2T2R)
+			rtl_set_bbreg(hw, rFPGA0_XAB_RFPARAMETER, 0x380038, 1);
+		else
+			rtl_set_bbreg(hw, rFPGA0_XAB_RFPARAMETER, 0x38, 1);
+
+		rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, 0xf0, 1);
+		rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(1), 0);
+
+		if (rtlphy->rf_type == RF_2T2R)
+			rtl_set_bbreg(hw, 0xe70, 0xffffffff, 0x63DB25A0);
+		else
+			rtl_set_bbreg(hw, 0xe70, 0xffffffff, 0x631B25A0);
+
+		rtl_set_rfreg(hw, RF90_PATH_A, 0, 0xfffff, 0x32D95);
+
+		if (rtlphy->rf_type == RF_2T2R)
+			rtl_set_rfreg(hw, RF90_PATH_B, 0, 0xfffff, 0x32D95);
 		break;
 	case ERFSLEEP:
-		if (ppsc->rfpwr_state == ERFOFF)
-			return false;
-		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++;
-				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,
-					 "ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
-					 MAX_DOZE_WAITING_TIMES_9x,
-					 queue_id,
-					 skb_queue_len(&ring->queue));
-				break;
-			}
-		}
-		RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
-			 "Set ERFSLEEP awaked:%d ms\n",
-			 jiffies_to_msecs(jiffies - ppsc->last_awake_jiffies));
-		ppsc->last_sleep_jiffies = jiffies;
-		_rtl92c_phy_set_rf_sleep(hw);
+	case ERFOFF:
+		value8 = rtl_read_byte(rtlpriv, REG_SPS0_CTRL);
+		if (IS_81XXC_VENDOR_UMC_B_CUT(rtlhal->version))
+			value8 &= ~BIT(0);
+		else
+			value8 &= ~(BIT(0) | BIT(3));
+
+		if (rtlphy->rf_type == RF_2T2R)
+			rtl_set_bbreg(hw, rFPGA0_XAB_RFPARAMETER, 0x380038, 0);
+		else if (rtlphy->rf_type == RF_1T1R)
+			rtl_set_bbreg(hw, rFPGA0_XAB_RFPARAMETER, 0x38, 0);
+
+		rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, 0xf0, 0);
+		rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(1), 1);
+
+		if (rtlphy->rf_type == RF_2T2R)
+			rtl_set_bbreg(hw, 0xe70, 0xffffffff, 0x00DB25A0);
+		else if (rtlphy->rf_type == RF_1T1R)
+			rtl_set_bbreg(hw, 0xe70, 0xffffffff, 0x001B25A0);
+
+		rtl_set_rfreg(hw, RF90_PATH_A, 0, 0xfffff, 0);
+
+		if (rtlphy->rf_type == RF_2T2R)
+			rtl_set_rfreg(hw, RF90_PATH_B, 0, 0xfffff, 0);
+
+		rtl_write_byte(rtlpriv, REG_SPS0_CTRL, value8);
 		break;
 	default:
 		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux