View | Details | Raw Unified | Return to bug 60713 | Differences between
and this patch

Collapse All | Expand All

(-)linux-2.6/drivers/net/wireless/rtlwifi/base.c (-55 / +45 lines)
Lines 37-42 Link Here
37
37
38
#include <linux/ip.h>
38
#include <linux/ip.h>
39
#include <linux/module.h>
39
#include <linux/module.h>
40
#include <linux/udp.h>
40
41
41
/*
42
/*
42
 *NOTICE!!!: This file will be very big, we should
43
 *NOTICE!!!: This file will be very big, we should
Lines 1074-1137 u8 rtl_is_special_data(struct ieee80211_ Link Here
1074
	if (!ieee80211_is_data(fc))
1075
	if (!ieee80211_is_data(fc))
1075
		return false;
1076
		return false;
1076
1077
1078
	ip = (const struct iphdr *)(skb->data + mac_hdr_len +
1079
				    SNAP_SIZE + PROTOC_TYPE_SIZE);
1080
	ether_type = be16_to_cpup((__be16 *)
1081
				  (skb->data + mac_hdr_len + SNAP_SIZE));
1082
1083
	switch (ether_type) {
1084
	case ETH_P_IP: {
1085
		struct udphdr *udp;
1086
		u16 src;
1087
		u16 dst;
1088
1089
		if (ip->protocol != IPPROTO_UDP)
1090
			return false;
1091
		udp = (struct udphdr *)((u8 *)ip + (ip->ihl << 2));
1092
		src = be16_to_cpu(udp->source);
1093
		dst = be16_to_cpu(udp->dest);
1094
1095
		/* If this case involves port 68 (UDP BOOTP client) connecting
1096
		 * with port 67 (UDP BOOTP server), then return true so that
1097
		 * the lowest speed is used.
1098
		 */
1099
		if (!((src == 68 && dst == 67) || (src == 67 && dst == 68)))
1100
			return false;
1077
1101
1078
	ip = (struct iphdr *)((u8 *) skb->data + mac_hdr_len +
1102
		RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
1079
			      SNAP_SIZE + PROTOC_TYPE_SIZE);
1103
			 "dhcp %s !!\n", is_tx ? "Tx" : "Rx");
1080
	ether_type = *(u16 *) ((u8 *) skb->data + mac_hdr_len + SNAP_SIZE);
1104
		break;
1081
	/*	ether_type = ntohs(ether_type); */
1105
	}
1082
1106
	case ETH_P_ARP:
1083
	if (ETH_P_IP == ether_type) {
1107
		break;
1084
		if (IPPROTO_UDP == ip->protocol) {
1108
	case ETH_P_PAE:
1085
			struct udphdr *udp = (struct udphdr *)((u8 *) ip +
1086
							       (ip->ihl << 2));
1087
			if (((((u8 *) udp)[1] == 68) &&
1088
			     (((u8 *) udp)[3] == 67)) ||
1089
			    ((((u8 *) udp)[1] == 67) &&
1090
			     (((u8 *) udp)[3] == 68))) {
1091
				/*
1092
				 * 68 : UDP BOOTP client
1093
				 * 67 : UDP BOOTP server
1094
				 */
1095
				RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV),
1096
					 DBG_DMESG, "dhcp %s !!\n",
1097
					 is_tx ? "Tx" : "Rx");
1098
1099
				if (is_tx) {
1100
					rtlpriv->enter_ps = false;
1101
					schedule_work(&rtlpriv->
1102
						      works.lps_change_work);
1103
					ppsc->last_delaylps_stamp_jiffies =
1104
					    jiffies;
1105
				}
1106
1107
				return true;
1108
			}
1109
		}
1110
	} else if (ETH_P_ARP == ether_type) {
1111
		if (is_tx) {
1112
			rtlpriv->enter_ps = false;
1113
			schedule_work(&rtlpriv->works.lps_change_work);
1114
			ppsc->last_delaylps_stamp_jiffies = jiffies;
1115
		}
1116
1117
		return true;
1118
	} else if (ETH_P_PAE == ether_type) {
1119
		RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
1109
		RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
1120
			 "802.1X %s EAPOL pkt!!\n", is_tx ? "Tx" : "Rx");
1110
			 "802.1X %s EAPOL pkt!!\n", is_tx ? "Tx" : "Rx");
1121
1111
		break;
1122
		if (is_tx) {
1112
	case ETH_P_IPV6:
1123
			rtlpriv->enter_ps = false;
1113
		/* TODO: Is this right? */
1124
			schedule_work(&rtlpriv->works.lps_change_work);
1114
		return false;
1125
			ppsc->last_delaylps_stamp_jiffies = jiffies;
1115
	default:
1126
		}
1116
		return false;
1127
1128
		return true;
1129
	} else if (ETH_P_IPV6 == ether_type) {
1130
		/* IPv6 */
1131
		return true;
1132
	}
1117
	}
1133
1118
	if (is_tx) {
1134
	return false;
1119
		rtlpriv->enter_ps = false;
1120
		schedule_work(&rtlpriv->works.lps_change_work);
1121
		ppsc->last_delaylps_stamp_jiffies = jiffies;
1122
	}
1123
	return true;
1135
}
1124
}
1136
EXPORT_SYMBOL_GPL(rtl_is_special_data);
1125
EXPORT_SYMBOL_GPL(rtl_is_special_data);
1137
1126
Lines 1448-1454 void rtl_watchdog_wq_callback(void *data Link Here
1448
			/* if we can't recv beacon for 6s, we should
1437
			/* if we can't recv beacon for 6s, we should
1449
			 * reconnect this AP
1438
			 * reconnect this AP
1450
			 */
1439
			 */
1451
			if (rtlpriv->link_info.roam_times >= 3) {
1440
			if ((rtlpriv->link_info.roam_times >= 3) &&
1441
			    !is_zero_ether_addr(rtlpriv->mac80211.bssid)) {
1452
				RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1442
				RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1453
					 "AP off, try to reconnect now\n");
1443
					 "AP off, try to reconnect now\n");
1454
				rtlpriv->link_info.roam_times = 0;
1444
				rtlpriv->link_info.roam_times = 0;
(-)linux-2.6/drivers/net/wireless/rtlwifi/wifi.h (-21 / +18 lines)
Lines 77-87 Link Here
77
#define RTL_SLOT_TIME_9				9
77
#define RTL_SLOT_TIME_9				9
78
#define RTL_SLOT_TIME_20			20
78
#define RTL_SLOT_TIME_20			20
79
79
80
/*related with tcp/ip. */
80
/*related to tcp/ip. */
81
/*if_ehther.h*/
82
#define ETH_P_PAE		0x888E	/*Port Access Entity (IEEE 802.1X) */
83
#define ETH_P_IP		0x0800	/*Internet Protocol packet */
84
#define ETH_P_ARP		0x0806	/*Address Resolution packet */
85
#define SNAP_SIZE		6
81
#define SNAP_SIZE		6
86
#define PROTOC_TYPE_SIZE	2
82
#define PROTOC_TYPE_SIZE	2
87
83
Lines 1039-1044 struct rtl_ht_agg { Link Here
1039
1035
1040
struct rssi_sta {
1036
struct rssi_sta {
1041
	long undec_sm_pwdb;
1037
	long undec_sm_pwdb;
1038
	long undec_sm_cck;
1042
};
1039
};
1043
1040
1044
struct rtl_tid_data {
1041
struct rtl_tid_data {
Lines 1329-1336 struct fast_ant_training { Link Here
1329
struct rtl_dm {
1326
struct rtl_dm {
1330
	/*PHY status for Dynamic Management */
1327
	/*PHY status for Dynamic Management */
1331
	long entry_min_undec_sm_pwdb;
1328
	long entry_min_undec_sm_pwdb;
1329
	long undec_sm_cck;
1332
	long undec_sm_pwdb;	/*out dm */
1330
	long undec_sm_pwdb;	/*out dm */
1333
	long entry_max_undec_sm_pwdb;
1331
	long entry_max_undec_sm_pwdb;
1332
	s32 ofdm_pkt_cnt;
1334
	bool dm_initialgain_enable;
1333
	bool dm_initialgain_enable;
1335
	bool dynamic_txpower_enable;
1334
	bool dynamic_txpower_enable;
1336
	bool current_turbo_edca;
1335
	bool current_turbo_edca;
Lines 1345-1350 struct rtl_dm { Link Here
1345
	bool inform_fw_driverctrldm;
1344
	bool inform_fw_driverctrldm;
1346
	bool current_mrc_switch;
1345
	bool current_mrc_switch;
1347
	u8 txpowercount;
1346
	u8 txpowercount;
1347
	u8 powerindex_backup[6];
1348
1348
1349
	u8 thermalvalue_rxgain;
1349
	u8 thermalvalue_rxgain;
1350
	u8 thermalvalue_iqk;
1350
	u8 thermalvalue_iqk;
Lines 1356-1362 struct rtl_dm { Link Here
1356
	bool done_txpower;
1356
	bool done_txpower;
1357
	u8 dynamic_txhighpower_lvl;	/*Tx high power level */
1357
	u8 dynamic_txhighpower_lvl;	/*Tx high power level */
1358
	u8 dm_flag;		/*Indicate each dynamic mechanism's status. */
1358
	u8 dm_flag;		/*Indicate each dynamic mechanism's status. */
1359
	u8 dm_flag_tmp;
1359
	u8 dm_type;
1360
	u8 dm_type;
1361
	u8 dm_rssi_sel;
1360
	u8 txpower_track_control;
1362
	u8 txpower_track_control;
1361
	bool interrupt_migration;
1363
	bool interrupt_migration;
1362
	bool disable_tx_int;
1364
	bool disable_tx_int;
Lines 1810-1815 struct rtl_hal_cfg { Link Here
1810
	bool write_readback;
1812
	bool write_readback;
1811
	char *name;
1813
	char *name;
1812
	char *fw_name;
1814
	char *fw_name;
1815
	char *alt_fw_name;
1813
	struct rtl_hal_ops *ops;
1816
	struct rtl_hal_ops *ops;
1814
	struct rtl_mod_params *mod_params;
1817
	struct rtl_mod_params *mod_params;
1815
	struct rtl_hal_usbint_cfg *usb_interface_cfg;
1818
	struct rtl_hal_usbint_cfg *usb_interface_cfg;
Lines 1954-1959 struct dig_t { Link Here
1954
	u8 pre_ccastate;
1957
	u8 pre_ccastate;
1955
	u8 cur_ccasate;
1958
	u8 cur_ccasate;
1956
	u8 large_fa_hit;
1959
	u8 large_fa_hit;
1960
	u8 dig_dynamic_min;
1957
	u8 forbidden_igi;
1961
	u8 forbidden_igi;
1958
	u8 dig_state;
1962
	u8 dig_state;
1959
	u8 dig_highpwrstate;
1963
	u8 dig_highpwrstate;
Lines 2034-2055 struct rtl_priv { Link Here
2034
	struct dig_t dm_digtable;
2038
	struct dig_t dm_digtable;
2035
	struct ps_t dm_pstable;
2039
	struct ps_t dm_pstable;
2036
2040
2037
	/* section shared by individual drivers */
2041
	u32 reg_874;
2038
	union {
2042
	u32 reg_c70;
2039
		struct {	/* data buffer pointer for USB reads */
2043
	u32 reg_85c;
2040
			__le32 *usb_data;
2044
	u32 reg_a74;
2041
			int usb_data_index;
2045
	bool reg_init;	/* true if regs saved */
2042
			bool initialized;
2046
	bool bt_operation_on;
2043
		};
2047
	__le32 *usb_data;
2044
		struct {	/* section for 8723ae */
2048
	int usb_data_index;
2045
			bool reg_init;	/* true if regs saved */
2049
	bool initialized;
2046
			u32 reg_874;
2047
			u32 reg_c70;
2048
			u32 reg_85c;
2049
			u32 reg_a74;
2050
			bool bt_operation_on;
2051
		};
2052
	};
2053
	bool enter_ps;	/* true when entering PS */
2050
	bool enter_ps;	/* true when entering PS */
2054
	u8 rate_mask[5];
2051
	u8 rate_mask[5];
2055
2052
(-)linux-2.6/drivers/net/wireless/rtlwifi/core.c (+11 lines)
Lines 46-55 void rtl_fw_cb(const struct firmware *fi Link Here
46
			 "Firmware callback routine entered!\n");
46
			 "Firmware callback routine entered!\n");
47
	complete(&rtlpriv->firmware_loading_complete);
47
	complete(&rtlpriv->firmware_loading_complete);
48
	if (!firmware) {
48
	if (!firmware) {
49
		if (rtlpriv->cfg->alt_fw_name) {
50
			err = request_firmware(&firmware,
51
					       rtlpriv->cfg->alt_fw_name,
52
					       rtlpriv->io.dev);
53
			pr_info("Loading alternative firmware %s\n",
54
				rtlpriv->cfg->alt_fw_name);
55
			if (!err)
56
				goto found_alt;
57
		}
49
		pr_err("Firmware %s not available\n", rtlpriv->cfg->fw_name);
58
		pr_err("Firmware %s not available\n", rtlpriv->cfg->fw_name);
50
		rtlpriv->max_fw_size = 0;
59
		rtlpriv->max_fw_size = 0;
51
		return;
60
		return;
52
	}
61
	}
62
found_alt:
53
	if (firmware->size > rtlpriv->max_fw_size) {
63
	if (firmware->size > rtlpriv->max_fw_size) {
54
		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
64
		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
55
			 "Firmware is too big!\n");
65
			 "Firmware is too big!\n");
Lines 184-189 static int rtl_op_add_interface(struct i Link Here
184
					rtlpriv->cfg->maps
194
					rtlpriv->cfg->maps
185
					[RTL_IBSS_INT_MASKS]);
195
					[RTL_IBSS_INT_MASKS]);
186
		}
196
		}
197
		mac->link_state = MAC80211_LINKED;
187
		break;
198
		break;
188
	case NL80211_IFTYPE_ADHOC:
199
	case NL80211_IFTYPE_ADHOC:
189
		RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
200
		RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
(-)linux-2.6/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c (-3 / +13 lines)
Lines 49-54 MODULE_AUTHOR("Larry Finger <Larry.Finge Link Here
49
MODULE_LICENSE("GPL");
49
MODULE_LICENSE("GPL");
50
MODULE_DESCRIPTION("Realtek 8192C/8188C 802.11n USB wireless");
50
MODULE_DESCRIPTION("Realtek 8192C/8188C 802.11n USB wireless");
51
MODULE_FIRMWARE("rtlwifi/rtl8192cufw.bin");
51
MODULE_FIRMWARE("rtlwifi/rtl8192cufw.bin");
52
MODULE_FIRMWARE("rtlwifi/rtl8192cufw_A.bin");
53
MODULE_FIRMWARE("rtlwifi/rtl8192cufw_B.bin");
54
MODULE_FIRMWARE("rtlwifi/rtl8192cufw_TMSC.bin");
52
55
53
static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
56
static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
54
{
57
{
Lines 68-81 static int rtl92cu_init_sw_vars(struct i Link Here
68
			 "Can't alloc buffer for fw\n");
71
			 "Can't alloc buffer for fw\n");
69
		return 1;
72
		return 1;
70
	}
73
	}
71
74
	if (IS_VENDOR_UMC_A_CUT(rtlpriv->rtlhal.version) &&
75
	    !IS_92C_SERIAL(rtlpriv->rtlhal.version)) {
76
		rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cufw_A.bin";
77
	} else if (IS_81xxC_VENDOR_UMC_B_CUT(rtlpriv->rtlhal.version)) {
78
		rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cufw_B.bin";
79
	} else {
80
		rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cufw_TMSC.bin";
81
	}
82
	/* provide name of alternative file */
83
	rtlpriv->cfg->alt_fw_name = "rtlwifi/rtl8192cufw.bin";
72
	pr_info("Loading firmware %s\n", rtlpriv->cfg->fw_name);
84
	pr_info("Loading firmware %s\n", rtlpriv->cfg->fw_name);
73
	rtlpriv->max_fw_size = 0x4000;
85
	rtlpriv->max_fw_size = 0x4000;
74
	err = request_firmware_nowait(THIS_MODULE, 1,
86
	err = request_firmware_nowait(THIS_MODULE, 1,
75
				      rtlpriv->cfg->fw_name, rtlpriv->io.dev,
87
				      rtlpriv->cfg->fw_name, rtlpriv->io.dev,
76
				      GFP_KERNEL, hw, rtl_fw_cb);
88
				      GFP_KERNEL, hw, rtl_fw_cb);
77
78
79
	return err;
89
	return err;
80
}
90
}
81
91
(-)linux-2.6/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h (+14 lines)
Lines 91-96 Link Here
91
#define TX_POWER_NEAR_FIELD_THRESH_LVL2		74
91
#define TX_POWER_NEAR_FIELD_THRESH_LVL2		74
92
#define TX_POWER_NEAR_FIELD_THRESH_LVL1		67
92
#define TX_POWER_NEAR_FIELD_THRESH_LVL1		67
93
93
94
#define DYNAMIC_FUNC_DISABLE			0x0
95
#define DYNAMIC_FUNC_DIG			BIT(0)
96
#define DYNAMIC_FUNC_HP				BIT(1)
97
#define DYNAMIC_FUNC_SS				BIT(2) /*Tx Power Tracking*/
98
#define DYNAMIC_FUNC_BT				BIT(3)
99
#define DYNAMIC_FUNC_ANT_DIV			BIT(4)
100
101
#define	RSSI_CCK				0
102
#define	RSSI_OFDM				1
103
#define	RSSI_DEFAULT				2
104
94
struct swat_t {
105
struct swat_t {
95
	u8 failure_cnt;
106
	u8 failure_cnt;
96
	u8 try_flag;
107
	u8 try_flag;
Lines 167-171 void rtl92c_phy_lc_calibrate(struct ieee Link Here
167
void rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery);
178
void rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery);
168
void rtl92c_dm_dynamic_txpower(struct ieee80211_hw *hw);
179
void rtl92c_dm_dynamic_txpower(struct ieee80211_hw *hw);
169
void rtl92c_dm_bt_coexist(struct ieee80211_hw *hw);
180
void rtl92c_dm_bt_coexist(struct ieee80211_hw *hw);
181
void dm_savepowerindex(struct ieee80211_hw *hw);
182
void dm_writepowerindex(struct ieee80211_hw *hw, u8 value);
183
void dm_restorepowerindex(struct ieee80211_hw *hw);
170
184
171
#endif
185
#endif
(-)linux-2.6/drivers/net/wireless/rtlwifi/usb.c (-1 / +3 lines)
Lines 484-489 static void _rtl_usb_rx_process_agg(stru Link Here
484
			if (unicast)
484
			if (unicast)
485
				rtlpriv->link_info.num_rx_inperiod++;
485
				rtlpriv->link_info.num_rx_inperiod++;
486
		}
486
		}
487
		/* static bcn for roaming */
488
		rtl_beacon_statistic(hw, skb);
487
	}
489
	}
488
}
490
}
489
491
Lines 555-561 static void _rtl_rx_pre_process(struct i Link Here
555
	}
557
	}
556
}
558
}
557
559
558
#define __RX_SKB_MAX_QUEUED	32
560
#define __RX_SKB_MAX_QUEUED	64
559
561
560
static void _rtl_rx_work(unsigned long param)
562
static void _rtl_rx_work(unsigned long param)
561
{
563
{
(-)linux-2.6/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c (-111 / +219 lines)
Lines 158-163 static const u8 cckswing_table_ch14[CCK_ Link Here
158
	{0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00}
158
	{0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00}
159
};
159
};
160
160
161
static u32 power_index_reg[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
162
163
void dm_restorepowerindex(struct ieee80211_hw *hw)
164
{
165
	struct rtl_priv *rtlpriv = rtl_priv(hw);
166
	u8	index;
167
168
	for (index = 0; index < 6; index++)
169
		rtl_write_byte(rtlpriv, power_index_reg[index],
170
			       rtlpriv->dm.powerindex_backup[index]);
171
}
172
EXPORT_SYMBOL_GPL(dm_restorepowerindex);
173
174
void dm_writepowerindex(struct ieee80211_hw *hw, u8 value)
175
{
176
	struct rtl_priv *rtlpriv = rtl_priv(hw);
177
	u8 index;
178
179
	for (index = 0; index < 6; index++)
180
		rtl_write_byte(rtlpriv, power_index_reg[index], value);
181
}
182
EXPORT_SYMBOL_GPL(dm_writepowerindex);
183
184
void dm_savepowerindex(struct ieee80211_hw *hw)
185
{
186
	struct rtl_priv *rtlpriv = rtl_priv(hw);
187
	u8 index;
188
	u8 tmp;
189
190
	for (index = 0; index < 6; index++) {
191
		tmp = rtl_read_byte(rtlpriv, power_index_reg[index]);
192
		rtlpriv->dm.powerindex_backup[index] = tmp;
193
	}
194
}
195
EXPORT_SYMBOL_GPL(dm_savepowerindex);
196
161
static void rtl92c_dm_diginit(struct ieee80211_hw *hw)
197
static void rtl92c_dm_diginit(struct ieee80211_hw *hw)
162
{
198
{
163
	struct rtl_priv *rtlpriv = rtl_priv(hw);
199
	struct rtl_priv *rtlpriv = rtl_priv(hw);
Lines 180-186 static void rtl92c_dm_diginit(struct iee Link Here
180
	dm_digtable->back_range_max = DM_DIG_BACKOFF_MAX;
216
	dm_digtable->back_range_max = DM_DIG_BACKOFF_MAX;
181
	dm_digtable->back_range_min = DM_DIG_BACKOFF_MIN;
217
	dm_digtable->back_range_min = DM_DIG_BACKOFF_MIN;
182
	dm_digtable->pre_cck_pd_state = CCK_PD_STAGE_MAX;
218
	dm_digtable->pre_cck_pd_state = CCK_PD_STAGE_MAX;
183
	dm_digtable->cur_cck_pd_state = CCK_PD_STAGE_MAX;
219
	dm_digtable->cur_cck_pd_state = CCK_PD_STAGE_LowRssi;
220
221
	dm_digtable->forbidden_igi = DM_DIG_MIN;
222
	dm_digtable->large_fa_hit = 0;
223
	dm_digtable->recover_cnt = 0;
224
	dm_digtable->dig_dynamic_min  = 0x25;
184
}
225
}
185
226
186
static u8 rtl92c_dm_initial_gain_min_pwdb(struct ieee80211_hw *hw)
227
static u8 rtl92c_dm_initial_gain_min_pwdb(struct ieee80211_hw *hw)
Lines 206-212 static u8 rtl92c_dm_initial_gain_min_pwd Link Here
206
		rssi_val_min = rtlpriv->dm.entry_min_undec_sm_pwdb;
247
		rssi_val_min = rtlpriv->dm.entry_min_undec_sm_pwdb;
207
	}
248
	}
208
249
209
	return (u8) rssi_val_min;
250
	if (rssi_val_min > 100)
251
		rssi_val_min = 100;
252
	return (u8)rssi_val_min;
210
}
253
}
211
254
212
static void rtl92c_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw)
255
static void rtl92c_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw)
Lines 224-232 static void rtl92c_dm_false_alarm_counte Link Here
224
267
225
	ret_value = rtl_get_bbreg(hw, ROFDM_PHYCOUNTER3, MASKDWORD);
268
	ret_value = rtl_get_bbreg(hw, ROFDM_PHYCOUNTER3, MASKDWORD);
226
	falsealm_cnt->cnt_mcs_fail = (ret_value & 0xffff);
269
	falsealm_cnt->cnt_mcs_fail = (ret_value & 0xffff);
270
271
	 ret_value = rtl_get_bbreg(hw, ROFDM0_FRAMESYNC, MASKDWORD);
272
	falsealm_cnt->cnt_fast_fsync_fail = (ret_value & 0xffff);
273
	falsealm_cnt->cnt_sb_search_fail = ((ret_value & 0xffff0000) >> 16);
274
227
	falsealm_cnt->cnt_ofdm_fail = falsealm_cnt->cnt_parity_fail +
275
	falsealm_cnt->cnt_ofdm_fail = falsealm_cnt->cnt_parity_fail +
228
	    falsealm_cnt->cnt_rate_illegal +
276
				      falsealm_cnt->cnt_rate_illegal +
229
	    falsealm_cnt->cnt_crc8_fail + falsealm_cnt->cnt_mcs_fail;
277
				      falsealm_cnt->cnt_crc8_fail +
278
				      falsealm_cnt->cnt_mcs_fail +
279
				      falsealm_cnt->cnt_fast_fsync_fail +
280
				      falsealm_cnt->cnt_sb_search_fail;
230
281
231
	rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(14), 1);
282
	rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(14), 1);
232
	ret_value = rtl_get_bbreg(hw, RCCK0_FACOUNTERLOWER, MASKBYTE0);
283
	ret_value = rtl_get_bbreg(hw, RCCK0_FACOUNTERLOWER, MASKBYTE0);
Lines 271-282 static void rtl92c_dm_ctrl_initgain_by_f Link Here
271
		value_igi++;
322
		value_igi++;
272
	else if (rtlpriv->falsealm_cnt.cnt_all >= DM_DIG_FA_TH2)
323
	else if (rtlpriv->falsealm_cnt.cnt_all >= DM_DIG_FA_TH2)
273
		value_igi += 2;
324
		value_igi += 2;
325
274
	if (value_igi > DM_DIG_FA_UPPER)
326
	if (value_igi > DM_DIG_FA_UPPER)
275
		value_igi = DM_DIG_FA_UPPER;
327
		value_igi = DM_DIG_FA_UPPER;
276
	else if (value_igi < DM_DIG_FA_LOWER)
328
	else if (value_igi < DM_DIG_FA_LOWER)
277
		value_igi = DM_DIG_FA_LOWER;
329
		value_igi = DM_DIG_FA_LOWER;
330
278
	if (rtlpriv->falsealm_cnt.cnt_all > 10000)
331
	if (rtlpriv->falsealm_cnt.cnt_all > 10000)
279
		value_igi = 0x32;
332
		value_igi = DM_DIG_FA_UPPER;
280
333
281
	dm_digtable->cur_igvalue = value_igi;
334
	dm_digtable->cur_igvalue = value_igi;
282
	rtl92c_dm_write_dig(hw);
335
	rtl92c_dm_write_dig(hw);
Lines 286-317 static void rtl92c_dm_ctrl_initgain_by_r Link Here
286
{
339
{
287
	struct rtl_priv *rtlpriv = rtl_priv(hw);
340
	struct rtl_priv *rtlpriv = rtl_priv(hw);
288
	struct dig_t *digtable = &rtlpriv->dm_digtable;
341
	struct dig_t *digtable = &rtlpriv->dm_digtable;
342
	u32 isbt;
289
343
290
	if (rtlpriv->falsealm_cnt.cnt_all > digtable->fa_highthresh) {
344
	/* modify DIG lower bound, deal with abnorally large false alarm */
291
		if ((digtable->back_val - 2) < digtable->back_range_min)
345
	if (rtlpriv->falsealm_cnt.cnt_all > 10000) {
292
			digtable->back_val = digtable->back_range_min;
346
		digtable->large_fa_hit++;
293
		else
347
		if (digtable->forbidden_igi < digtable->cur_igvalue) {
294
			digtable->back_val -= 2;
348
			digtable->forbidden_igi = digtable->cur_igvalue;
295
	} else if (rtlpriv->falsealm_cnt.cnt_all < digtable->fa_lowthresh) {
349
			digtable->large_fa_hit = 1;
296
		if ((digtable->back_val + 2) > digtable->back_range_max)
350
		}
297
			digtable->back_val = digtable->back_range_max;
351
298
		else
352
		if (digtable->large_fa_hit >= 3) {
299
			digtable->back_val += 2;
353
			if ((digtable->forbidden_igi + 1) >
354
			    digtable->rx_gain_max)
355
				digtable->rx_gain_min = digtable->rx_gain_max;
356
			else
357
				digtable->rx_gain_min = (digtable->forbidden_igi + 1);
358
			digtable->recover_cnt = 3600; /* 3600=2hr */
359
		}
360
	} else {
361
		/* Recovery mechanism for IGI lower bound */
362
		if (digtable->recover_cnt != 0) {
363
			digtable->recover_cnt--;
364
		} else {
365
			if (digtable->large_fa_hit == 0) {
366
				if ((digtable->forbidden_igi-1) < DM_DIG_MIN) {
367
					digtable->forbidden_igi = DM_DIG_MIN;
368
					digtable->rx_gain_min = DM_DIG_MIN;
369
				} else {
370
					digtable->forbidden_igi--;
371
					digtable->rx_gain_min = digtable->forbidden_igi + 1;
372
				}
373
			} else if (digtable->large_fa_hit == 3) {
374
				digtable->large_fa_hit = 0;
375
			}
376
		}
300
	}
377
	}
378
	if (rtlpriv->falsealm_cnt.cnt_all < 250) {
379
		isbt = rtl_read_byte(rtlpriv, 0x4fd) & 0x01;
301
380
302
	if ((digtable->rssi_val_min + 10 - digtable->back_val) >
381
		if (!isbt) {
303
	    digtable->rx_gain_max)
382
			if (rtlpriv->falsealm_cnt.cnt_all >
383
			    digtable->fa_lowthresh) {
384
				if ((digtable->back_val - 2) <
385
				   digtable->back_range_min)
386
					digtable->back_val = digtable->back_range_min;
387
				else
388
					digtable->back_val -= 2;
389
			} else if (rtlpriv->falsealm_cnt.cnt_all <
390
				   digtable->fa_lowthresh) {
391
				if ((digtable->back_val + 2) >
392
				    digtable->back_range_max)
393
					digtable->back_val = digtable->back_range_max;
394
				else
395
					digtable->back_val += 2;
396
			}
397
		} else {
398
			digtable->back_val = DM_DIG_BACKOFF_DEFAULT;
399
		}
400
	} else {
401
		/* Adjust initial gain by false alarm */
402
		if (rtlpriv->falsealm_cnt.cnt_all > 1000)
403
			digtable->cur_igvalue = digtable->pre_igvalue + 2;
404
		else if (rtlpriv->falsealm_cnt.cnt_all > 750)
405
			digtable->cur_igvalue = digtable->pre_igvalue + 1;
406
		else if (rtlpriv->falsealm_cnt.cnt_all < 500)
407
			digtable->cur_igvalue = digtable->pre_igvalue - 1;
408
	}
409
410
	/* Check initial gain by upper/lower bound */
411
	if (digtable->cur_igvalue > digtable->rx_gain_max)
304
		digtable->cur_igvalue = digtable->rx_gain_max;
412
		digtable->cur_igvalue = digtable->rx_gain_max;
305
	else if ((digtable->rssi_val_min + 10 -
306
		  digtable->back_val) < digtable->rx_gain_min)
307
		digtable->cur_igvalue = digtable->rx_gain_min;
308
	else
309
		digtable->cur_igvalue = digtable->rssi_val_min + 10 -
310
		    digtable->back_val;
311
413
312
	RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
414
	if (digtable->cur_igvalue < digtable->rx_gain_min)
313
		 "rssi_val_min = %x back_val %x\n",
415
		digtable->cur_igvalue = digtable->rx_gain_min;
314
		 digtable->rssi_val_min, digtable->back_val);
315
416
316
	rtl92c_dm_write_dig(hw);
417
	rtl92c_dm_write_dig(hw);
317
}
418
}
Lines 329-335 static void rtl92c_dm_initial_gain_multi Link Here
329
		multi_sta = true;
430
		multi_sta = true;
330
431
331
	if (!multi_sta ||
432
	if (!multi_sta ||
332
	    dm_digtable->cursta_cstate != DIG_STA_DISCONNECT) {
433
	    dm_digtable->cursta_cstate == DIG_STA_DISCONNECT) {
333
		initialized = false;
434
		initialized = false;
334
		dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX;
435
		dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX;
335
		return;
436
		return;
Lines 375-381 static void rtl92c_dm_initial_gain_sta(s Link Here
375
	RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
476
	RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
376
		 "presta_cstate = %x, cursta_cstate = %x\n",
477
		 "presta_cstate = %x, cursta_cstate = %x\n",
377
		 dm_digtable->presta_cstate, dm_digtable->cursta_cstate);
478
		 dm_digtable->presta_cstate, dm_digtable->cursta_cstate);
378
379
	if (dm_digtable->presta_cstate == dm_digtable->cursta_cstate ||
479
	if (dm_digtable->presta_cstate == dm_digtable->cursta_cstate ||
380
	    dm_digtable->cursta_cstate == DIG_STA_BEFORE_CONNECT ||
480
	    dm_digtable->cursta_cstate == DIG_STA_BEFORE_CONNECT ||
381
	    dm_digtable->cursta_cstate == DIG_STA_CONNECT) {
481
	    dm_digtable->cursta_cstate == DIG_STA_CONNECT) {
Lines 383-388 static void rtl92c_dm_initial_gain_sta(s Link Here
383
		if (dm_digtable->cursta_cstate != DIG_STA_DISCONNECT) {
483
		if (dm_digtable->cursta_cstate != DIG_STA_DISCONNECT) {
384
			dm_digtable->rssi_val_min =
484
			dm_digtable->rssi_val_min =
385
			    rtl92c_dm_initial_gain_min_pwdb(hw);
485
			    rtl92c_dm_initial_gain_min_pwdb(hw);
486
			if (dm_digtable->rssi_val_min > 100)
487
				dm_digtable->rssi_val_min = 100;
386
			rtl92c_dm_ctrl_initgain_by_rssi(hw);
488
			rtl92c_dm_ctrl_initgain_by_rssi(hw);
387
		}
489
		}
388
	} else {
490
	} else {
Lines 398-408 static void rtl92c_dm_initial_gain_sta(s Link Here
398
static void rtl92c_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
500
static void rtl92c_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
399
{
501
{
400
	struct rtl_priv *rtlpriv = rtl_priv(hw);
502
	struct rtl_priv *rtlpriv = rtl_priv(hw);
401
	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
402
	struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
503
	struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
403
504
404
	if (dm_digtable->cursta_cstate == DIG_STA_CONNECT) {
505
	if (dm_digtable->cursta_cstate == DIG_STA_CONNECT) {
405
		dm_digtable->rssi_val_min = rtl92c_dm_initial_gain_min_pwdb(hw);
506
		dm_digtable->rssi_val_min = rtl92c_dm_initial_gain_min_pwdb(hw);
507
		if (dm_digtable->rssi_val_min > 100)
508
			dm_digtable->rssi_val_min = 100;
406
509
407
		if (dm_digtable->pre_cck_pd_state == CCK_PD_STAGE_LowRssi) {
510
		if (dm_digtable->pre_cck_pd_state == CCK_PD_STAGE_LowRssi) {
408
			if (dm_digtable->rssi_val_min <= 25)
511
			if (dm_digtable->rssi_val_min <= 25)
Lines 424-471 static void rtl92c_dm_cck_packet_detecti Link Here
424
	}
527
	}
425
528
426
	if (dm_digtable->pre_cck_pd_state != dm_digtable->cur_cck_pd_state) {
529
	if (dm_digtable->pre_cck_pd_state != dm_digtable->cur_cck_pd_state) {
427
		if (dm_digtable->cur_cck_pd_state == CCK_PD_STAGE_LowRssi) {
530
		if ((dm_digtable->cur_cck_pd_state == CCK_PD_STAGE_LowRssi) ||
428
			if (rtlpriv->falsealm_cnt.cnt_cck_fail > 800)
531
		    (dm_digtable->cur_cck_pd_state == CCK_PD_STAGE_MAX))
429
				dm_digtable->cur_cck_fa_state =
532
			rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2, 0x83);
430
				    CCK_FA_STAGE_High;
533
		else
431
			else
432
				dm_digtable->cur_cck_fa_state = CCK_FA_STAGE_Low;
433
434
			if (dm_digtable->pre_cck_fa_state !=
435
			    dm_digtable->cur_cck_fa_state) {
436
				if (dm_digtable->cur_cck_fa_state ==
437
				    CCK_FA_STAGE_Low)
438
					rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2,
439
						      0x83);
440
				else
441
					rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2,
442
						      0xcd);
443
444
				dm_digtable->pre_cck_fa_state =
445
				    dm_digtable->cur_cck_fa_state;
446
			}
447
448
			rtl_set_bbreg(hw, RCCK0_SYSTEM, MASKBYTE1, 0x40);
449
450
			if (IS_92C_SERIAL(rtlhal->version))
451
				rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT,
452
					      MASKBYTE2, 0xd7);
453
		} else {
454
			rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2, 0xcd);
534
			rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2, 0xcd);
455
			rtl_set_bbreg(hw, RCCK0_SYSTEM, MASKBYTE1, 0x47);
456
535
457
			if (IS_92C_SERIAL(rtlhal->version))
458
				rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT,
459
					      MASKBYTE2, 0xd3);
460
		}
461
		dm_digtable->pre_cck_pd_state = dm_digtable->cur_cck_pd_state;
536
		dm_digtable->pre_cck_pd_state = dm_digtable->cur_cck_pd_state;
462
	}
537
	}
463
464
	RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, "CCKPDStage=%x\n",
465
		 dm_digtable->cur_cck_pd_state);
466
467
	RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, "is92C=%x\n",
468
		 IS_92C_SERIAL(rtlhal->version));
469
}
538
}
470
539
471
static void rtl92c_dm_ctrl_initgain_by_twoport(struct ieee80211_hw *hw)
540
static void rtl92c_dm_ctrl_initgain_by_twoport(struct ieee80211_hw *hw)
Lines 482-487 static void rtl92c_dm_ctrl_initgain_by_t Link Here
482
	else
551
	else
483
		dm_digtable->cursta_cstate = DIG_STA_DISCONNECT;
552
		dm_digtable->cursta_cstate = DIG_STA_DISCONNECT;
484
553
554
	dm_digtable->curmultista_cstate = DIG_MULTISTA_DISCONNECT;
555
485
	rtl92c_dm_initial_gain_sta(hw);
556
	rtl92c_dm_initial_gain_sta(hw);
486
	rtl92c_dm_initial_gain_multi_sta(hw);
557
	rtl92c_dm_initial_gain_multi_sta(hw);
487
	rtl92c_dm_cck_packet_detection_thresh(hw);
558
	rtl92c_dm_cck_packet_detection_thresh(hw);
Lines 493-515 static void rtl92c_dm_ctrl_initgain_by_t Link Here
493
static void rtl92c_dm_dig(struct ieee80211_hw *hw)
564
static void rtl92c_dm_dig(struct ieee80211_hw *hw)
494
{
565
{
495
	struct rtl_priv *rtlpriv = rtl_priv(hw);
566
	struct rtl_priv *rtlpriv = rtl_priv(hw);
496
	struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
497
567
498
	if (rtlpriv->dm.dm_initialgain_enable == false)
568
	if (rtlpriv->dm.dm_initialgain_enable == false)
499
		return;
569
		return;
500
	if (dm_digtable->dig_enable_flag == false)
570
	if (!rtlpriv->dm.dm_flag & DYNAMIC_FUNC_DIG)
501
		return;
571
		return;
502
572
503
	rtl92c_dm_ctrl_initgain_by_twoport(hw);
573
	rtl92c_dm_ctrl_initgain_by_twoport(hw);
504
505
}
574
}
506
575
507
static void rtl92c_dm_init_dynamic_txpower(struct ieee80211_hw *hw)
576
static void rtl92c_dm_init_dynamic_txpower(struct ieee80211_hw *hw)
508
{
577
{
509
	struct rtl_priv *rtlpriv = rtl_priv(hw);
578
	struct rtl_priv *rtlpriv = rtl_priv(hw);
510
579
511
	rtlpriv->dm.dynamic_txpower_enable = false;
580
	if (rtlpriv->rtlhal.interface == INTF_USB &&
512
581
	    rtlpriv->rtlhal.board_type & 0x1) {
582
		dm_savepowerindex(hw);
583
		rtlpriv->dm.dynamic_txpower_enable = true;
584
	} else {
585
		rtlpriv->dm.dynamic_txpower_enable = false;
586
	}
513
	rtlpriv->dm.last_dtp_lvl = TXHIGHPWRLEVEL_NORMAL;
587
	rtlpriv->dm.last_dtp_lvl = TXHIGHPWRLEVEL_NORMAL;
514
	rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
588
	rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
515
}
589
}
Lines 524-532 void rtl92c_dm_write_dig(struct ieee8021 Link Here
524
		 dm_digtable->cur_igvalue, dm_digtable->pre_igvalue,
598
		 dm_digtable->cur_igvalue, dm_digtable->pre_igvalue,
525
		 dm_digtable->back_val);
599
		 dm_digtable->back_val);
526
600
527
	dm_digtable->cur_igvalue += 2;
601
	if (rtlpriv->rtlhal.interface == INTF_USB &&
528
	if (dm_digtable->cur_igvalue > 0x3f)
602
	    !dm_digtable->dig_enable_flag) {
529
		dm_digtable->cur_igvalue = 0x3f;
603
		dm_digtable->pre_igvalue = 0x17;
604
		return;
605
	}
606
	dm_digtable->cur_igvalue -= 1;
607
	if (dm_digtable->cur_igvalue < DM_DIG_MIN)
608
		dm_digtable->cur_igvalue = DM_DIG_MIN;
530
609
531
	if (dm_digtable->pre_igvalue != dm_digtable->cur_igvalue) {
610
	if (dm_digtable->pre_igvalue != dm_digtable->cur_igvalue) {
532
		rtl_set_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f,
611
		rtl_set_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f,
Lines 536-569 void rtl92c_dm_write_dig(struct ieee8021 Link Here
536
615
537
		dm_digtable->pre_igvalue = dm_digtable->cur_igvalue;
616
		dm_digtable->pre_igvalue = dm_digtable->cur_igvalue;
538
	}
617
	}
618
	RT_TRACE(rtlpriv, COMP_DIG, DBG_WARNING,
619
		 "dig values 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
620
		 dm_digtable->cur_igvalue, dm_digtable->pre_igvalue,
621
		 dm_digtable->rssi_val_min, dm_digtable->back_val,
622
		 dm_digtable->rx_gain_max, dm_digtable->rx_gain_min,
623
		 dm_digtable->large_fa_hit, dm_digtable->forbidden_igi);
539
}
624
}
540
EXPORT_SYMBOL(rtl92c_dm_write_dig);
625
EXPORT_SYMBOL(rtl92c_dm_write_dig);
541
626
542
static void rtl92c_dm_pwdb_monitor(struct ieee80211_hw *hw)
627
static void rtl92c_dm_pwdb_monitor(struct ieee80211_hw *hw)
543
{
628
{
544
	struct rtl_priv *rtlpriv = rtl_priv(hw);
629
	struct rtl_priv *rtlpriv = rtl_priv(hw);
630
	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
545
	long tmpentry_max_pwdb = 0, tmpentry_min_pwdb = 0xff;
631
	long tmpentry_max_pwdb = 0, tmpentry_min_pwdb = 0xff;
546
632
547
	u8 h2c_parameter[3] = { 0 };
633
	if (mac->link_state != MAC80211_LINKED)
634
		return;
548
635
549
	return;
636
	if (mac->opmode == NL80211_IFTYPE_ADHOC ||
637
	    mac->opmode == NL80211_IFTYPE_AP) {
638
		/* TODO: Handle ADHOC and AP Mode */
639
	}
550
640
551
	if (tmpentry_max_pwdb != 0) {
641
	if (tmpentry_max_pwdb != 0)
552
		rtlpriv->dm.entry_max_undec_sm_pwdb = tmpentry_max_pwdb;
642
		rtlpriv->dm.entry_max_undec_sm_pwdb = tmpentry_max_pwdb;
553
	} else {
643
	else
554
		rtlpriv->dm.entry_max_undec_sm_pwdb = 0;
644
		rtlpriv->dm.entry_max_undec_sm_pwdb = 0;
555
	}
556
645
557
	if (tmpentry_min_pwdb != 0xff) {
646
	if (tmpentry_min_pwdb != 0xff)
558
		rtlpriv->dm.entry_min_undec_sm_pwdb = tmpentry_min_pwdb;
647
		rtlpriv->dm.entry_min_undec_sm_pwdb = tmpentry_min_pwdb;
559
	} else {
648
	else
560
		rtlpriv->dm.entry_min_undec_sm_pwdb = 0;
649
		rtlpriv->dm.entry_min_undec_sm_pwdb = 0;
561
	}
562
650
563
	h2c_parameter[2] = (u8) (rtlpriv->dm.undec_sm_pwdb & 0xFF);
651
/* TODO:
564
	h2c_parameter[0] = 0;
652
 *	if (mac->opmode == NL80211_IFTYPE_STATION) {
565
653
 *		if (rtlpriv->rtlhal.fw_ready) {
566
	rtl92c_fill_h2c_cmd(hw, H2C_RSSI_REPORT, 3, h2c_parameter);
654
 *			u32 param = (u32)(rtlpriv->dm.undec_sm_pwdb << 16);
655
 *			rtl8192c_set_rssi_cmd(hw, param);
656
 *		}
657
 *	}
658
 */
567
}
659
}
568
660
569
void rtl92c_dm_init_edca_turbo(struct ieee80211_hw *hw)
661
void rtl92c_dm_init_edca_turbo(struct ieee80211_hw *hw)
Lines 673-679 static void rtl92c_dm_txpower_tracking_c Link Here
673
	s8 cck_index = 0;
765
	s8 cck_index = 0;
674
	int i;
766
	int i;
675
	bool is2t = IS_92C_SERIAL(rtlhal->version);
767
	bool is2t = IS_92C_SERIAL(rtlhal->version);
676
	s8 txpwr_level[2] = {0, 0};
768
	s8 txpwr_level[3] = {0, 0, 0};
677
	u8 ofdm_min_index = 6, rf;
769
	u8 ofdm_min_index = 6, rf;
678
770
679
	rtlpriv->dm.txpower_trackinginit = true;
771
	rtlpriv->dm.txpower_trackinginit = true;
Lines 773-778 static void rtl92c_dm_txpower_tracking_c Link Here
773
				rtlpriv->dm.ofdm_index[i] = ofdm_index_old[i];
865
				rtlpriv->dm.ofdm_index[i] = ofdm_index_old[i];
774
			rtlpriv->dm.cck_index = cck_index_old;
866
			rtlpriv->dm.cck_index = cck_index_old;
775
		}
867
		}
868
		/* Handle USB High PA boards */
776
869
777
		delta = (thermalvalue > rtlpriv->dm.thermalvalue) ?
870
		delta = (thermalvalue > rtlpriv->dm.thermalvalue) ?
778
		    (thermalvalue - rtlpriv->dm.thermalvalue) :
871
		    (thermalvalue - rtlpriv->dm.thermalvalue) :
Lines 1163-1184 void rtl92c_dm_rf_saving(struct ieee8021 Link Here
1163
{
1256
{
1164
	struct rtl_priv *rtlpriv = rtl_priv(hw);
1257
	struct rtl_priv *rtlpriv = rtl_priv(hw);
1165
	struct ps_t *dm_pstable = &rtlpriv->dm_pstable;
1258
	struct ps_t *dm_pstable = &rtlpriv->dm_pstable;
1166
	static u8 initialize;
1167
	static u32 reg_874, reg_c70, reg_85c, reg_a74;
1168
1259
1169
	if (initialize == 0) {
1260
	if (!rtlpriv->reg_init) {
1170
		reg_874 = (rtl_get_bbreg(hw, RFPGA0_XCD_RFINTERFACESW,
1261
		rtlpriv->reg_874 = (rtl_get_bbreg(hw,
1171
					 MASKDWORD) & 0x1CC000) >> 14;
1262
						  RFPGA0_XCD_RFINTERFACESW,
1263
						  MASKDWORD) & 0x1CC000) >> 14;
1172
1264
1173
		reg_c70 = (rtl_get_bbreg(hw, ROFDM0_AGCPARAMETER1,
1265
		rtlpriv->reg_c70 = (rtl_get_bbreg(hw, ROFDM0_AGCPARAMETER1,
1174
					 MASKDWORD) & BIT(3)) >> 3;
1266
				    MASKDWORD) & BIT(3)) >> 3;
1175
1267
1176
		reg_85c = (rtl_get_bbreg(hw, RFPGA0_XCD_SWITCHCONTROL,
1268
		rtlpriv->reg_85c = (rtl_get_bbreg(hw, RFPGA0_XCD_SWITCHCONTROL,
1177
					 MASKDWORD) & 0xFF000000) >> 24;
1269
				    MASKDWORD) & 0xFF000000) >> 24;
1178
1270
1179
		reg_a74 = (rtl_get_bbreg(hw, 0xa74, MASKDWORD) & 0xF000) >> 12;
1271
		rtlpriv->reg_a74 = (rtl_get_bbreg(hw, 0xa74, MASKDWORD) &
1272
				    0xF000) >> 12;
1180
1273
1181
		initialize = 1;
1274
		rtlpriv->reg_init = true;
1182
	}
1275
	}
1183
1276
1184
	if (!bforce_in_normal) {
1277
	if (!bforce_in_normal) {
Lines 1215-1226 void rtl92c_dm_rf_saving(struct ieee8021 Link Here
1215
			rtl_set_bbreg(hw, 0x818, BIT(28), 0x1);
1308
			rtl_set_bbreg(hw, 0x818, BIT(28), 0x1);
1216
		} else {
1309
		} else {
1217
			rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW,
1310
			rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW,
1218
				      0x1CC000, reg_874);
1311
				      0x1CC000, rtlpriv->reg_874);
1219
			rtl_set_bbreg(hw, ROFDM0_AGCPARAMETER1, BIT(3),
1312
			rtl_set_bbreg(hw, ROFDM0_AGCPARAMETER1, BIT(3),
1220
				      reg_c70);
1313
				      rtlpriv->reg_c70);
1221
			rtl_set_bbreg(hw, RFPGA0_XCD_SWITCHCONTROL, 0xFF000000,
1314
			rtl_set_bbreg(hw, RFPGA0_XCD_SWITCHCONTROL, 0xFF000000,
1222
				      reg_85c);
1315
				      rtlpriv->reg_85c);
1223
			rtl_set_bbreg(hw, 0xa74, 0xF000, reg_a74);
1316
			rtl_set_bbreg(hw, 0xa74, 0xF000, rtlpriv->reg_a74);
1224
			rtl_set_bbreg(hw, 0x818, BIT(28), 0x0);
1317
			rtl_set_bbreg(hw, 0x818, BIT(28), 0x0);
1225
		}
1318
		}
1226
1319
Lines 1236-1241 static void rtl92c_dm_dynamic_bb_powersa Link Here
1236
	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1329
	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1237
	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1330
	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1238
1331
1332
	/* Determine the minimum RSSI */
1239
	if (((mac->link_state == MAC80211_NOLINK)) &&
1333
	if (((mac->link_state == MAC80211_NOLINK)) &&
1240
	    (rtlpriv->dm.entry_min_undec_sm_pwdb == 0)) {
1334
	    (rtlpriv->dm.entry_min_undec_sm_pwdb == 0)) {
1241
		dm_pstable->rssi_val_min = 0;
1335
		dm_pstable->rssi_val_min = 0;
Lines 1264-1269 static void rtl92c_dm_dynamic_bb_powersa Link Here
1264
			 dm_pstable->rssi_val_min);
1358
			 dm_pstable->rssi_val_min);
1265
	}
1359
	}
1266
1360
1361
	/* Power Saving for 92C */
1267
	if (IS_92C_SERIAL(rtlhal->version))
1362
	if (IS_92C_SERIAL(rtlhal->version))
1268
		;/* rtl92c_dm_1r_cca(hw); */
1363
		;/* rtl92c_dm_1r_cca(hw); */
1269
	else
1364
	else
Lines 1275-1286 void rtl92c_dm_init(struct ieee80211_hw Link Here
1275
	struct rtl_priv *rtlpriv = rtl_priv(hw);
1370
	struct rtl_priv *rtlpriv = rtl_priv(hw);
1276
1371
1277
	rtlpriv->dm.dm_type = DM_TYPE_BYDRIVER;
1372
	rtlpriv->dm.dm_type = DM_TYPE_BYDRIVER;
1373
	rtlpriv->dm.dm_flag = DYNAMIC_FUNC_DISABLE | DYNAMIC_FUNC_DIG;
1374
	rtlpriv->dm.undec_sm_pwdb = -1;
1375
	rtlpriv->dm.undec_sm_cck = -1;
1376
	rtlpriv->dm.dm_initialgain_enable = true;
1278
	rtl92c_dm_diginit(hw);
1377
	rtl92c_dm_diginit(hw);
1378
1379
	rtlpriv->dm.dm_flag |= HAL_DM_HIPWR_DISABLE;
1279
	rtl92c_dm_init_dynamic_txpower(hw);
1380
	rtl92c_dm_init_dynamic_txpower(hw);
1381
1280
	rtl92c_dm_init_edca_turbo(hw);
1382
	rtl92c_dm_init_edca_turbo(hw);
1281
	rtl92c_dm_init_rate_adaptive_mask(hw);
1383
	rtl92c_dm_init_rate_adaptive_mask(hw);
1384
	rtlpriv->dm.dm_flag |= DYNAMIC_FUNC_SS;
1282
	rtl92c_dm_initialize_txpower_tracking(hw);
1385
	rtl92c_dm_initialize_txpower_tracking(hw);
1283
	rtl92c_dm_init_dynamic_bb_powersaving(hw);
1386
	rtl92c_dm_init_dynamic_bb_powersaving(hw);
1387
1388
	rtlpriv->dm.ofdm_pkt_cnt = 0;
1389
	rtlpriv->dm.dm_rssi_sel = RSSI_DEFAULT;
1284
}
1390
}
1285
EXPORT_SYMBOL(rtl92c_dm_init);
1391
EXPORT_SYMBOL(rtl92c_dm_init);
1286
1392
Lines 1331-1337 void rtl92c_dm_dynamic_txpower(struct ie Link Here
1331
	}
1437
	}
1332
1438
1333
	if (undec_sm_pwdb >= TX_POWER_NEAR_FIELD_THRESH_LVL2) {
1439
	if (undec_sm_pwdb >= TX_POWER_NEAR_FIELD_THRESH_LVL2) {
1334
		rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1;
1440
		rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL2;
1335
		RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1441
		RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1336
			 "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x0)\n");
1442
			 "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x0)\n");
1337
	} else if ((undec_sm_pwdb < (TX_POWER_NEAR_FIELD_THRESH_LVL2 - 3)) &&
1443
	} else if ((undec_sm_pwdb < (TX_POWER_NEAR_FIELD_THRESH_LVL2 - 3)) &&
Lines 1351-1358 void rtl92c_dm_dynamic_txpower(struct ie Link Here
1351
			 "PHY_SetTxPowerLevel8192S() Channel = %d\n",
1457
			 "PHY_SetTxPowerLevel8192S() Channel = %d\n",
1352
			 rtlphy->current_channel);
1458
			 rtlphy->current_channel);
1353
		rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel);
1459
		rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel);
1460
		if (rtlpriv->dm.dynamic_txhighpower_lvl ==
1461
		    TXHIGHPWRLEVEL_NORMAL)
1462
			dm_restorepowerindex(hw);
1463
		else if (rtlpriv->dm.dynamic_txhighpower_lvl ==
1464
			 TXHIGHPWRLEVEL_LEVEL1)
1465
			dm_writepowerindex(hw, 0x14);
1466
		else if (rtlpriv->dm.dynamic_txhighpower_lvl ==
1467
			 TXHIGHPWRLEVEL_LEVEL2)
1468
			dm_writepowerindex(hw, 0x10);
1354
	}
1469
	}
1355
1356
	rtlpriv->dm.last_dtp_lvl = rtlpriv->dm.dynamic_txhighpower_lvl;
1470
	rtlpriv->dm.last_dtp_lvl = rtlpriv->dm.dynamic_txhighpower_lvl;
1357
}
1471
}
1358
1472
Lines 1423-1434 u8 rtl92c_bt_rssi_state_change(struct ie Link Here
1423
	else
1537
	else
1424
		curr_bt_rssi_state &= (~BT_RSSI_STATE_SPECIAL_LOW);
1538
		curr_bt_rssi_state &= (~BT_RSSI_STATE_SPECIAL_LOW);
1425
1539
1426
	/* Set Tx Power according to BT status. */
1427
	if (undec_sm_pwdb >= 30)
1428
		curr_bt_rssi_state |=  BT_RSSI_STATE_TXPOWER_LOW;
1429
	else if (undec_sm_pwdb < 25)
1430
		curr_bt_rssi_state &= (~BT_RSSI_STATE_TXPOWER_LOW);
1431
1432
	/* Check BT state related to BT_Idle in B/G mode. */
1540
	/* Check BT state related to BT_Idle in B/G mode. */
1433
	if (undec_sm_pwdb < 15)
1541
	if (undec_sm_pwdb < 15)
1434
		curr_bt_rssi_state |=  BT_RSSI_STATE_BG_EDCA_LOW;
1542
		curr_bt_rssi_state |=  BT_RSSI_STATE_BG_EDCA_LOW;
(-)linux-2.6/drivers/net/wireless/rtlwifi/rtl8192cu/dm.c (+9 lines)
Lines 101-106 void rtl92cu_dm_dynamic_txpower(struct i Link Here
101
			 "PHY_SetTxPowerLevel8192S() Channel = %d\n",
101
			 "PHY_SetTxPowerLevel8192S() Channel = %d\n",
102
			 rtlphy->current_channel);
102
			 rtlphy->current_channel);
103
		rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel);
103
		rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel);
104
		if (rtlpriv->dm.dynamic_txhighpower_lvl ==
105
		    TXHIGHPWRLEVEL_NORMAL)
106
			dm_restorepowerindex(hw);
107
		else if (rtlpriv->dm.dynamic_txhighpower_lvl ==
108
			 TXHIGHPWRLEVEL_LEVEL1)
109
			dm_writepowerindex(hw, 0x14);
110
		else if (rtlpriv->dm.dynamic_txhighpower_lvl ==
111
			 TXHIGHPWRLEVEL_LEVEL2)
112
			dm_writepowerindex(hw, 0x10);
104
	}
113
	}
105
114
106
	rtlpriv->dm.last_dtp_lvl = rtlpriv->dm.dynamic_txhighpower_lvl;
115
	rtlpriv->dm.last_dtp_lvl = rtlpriv->dm.dynamic_txhighpower_lvl;
(-)linux-2.6/drivers/net/wireless/rtlwifi/rtl8192cu/dm.h (+3 lines)
Lines 30-32 Link Here
30
#include "../rtl8192ce/dm.h"
30
#include "../rtl8192ce/dm.h"
31
31
32
void rtl92cu_dm_dynamic_txpower(struct ieee80211_hw *hw);
32
void rtl92cu_dm_dynamic_txpower(struct ieee80211_hw *hw);
33
void dm_savepowerindex(struct ieee80211_hw *hw);
34
void dm_writepowerindex(struct ieee80211_hw *hw, u8 value);
35
void dm_restorepowerindex(struct ieee80211_hw *hw);
(-)linux-2.6/drivers/net/wireless/rtlwifi/rtl8192cu/rf.c (-13 / +16 lines)
Lines 85-101 void rtl92cu_phy_rf6052_set_cck_txpower( Link Here
85
	if (mac->act_scanning) {
85
	if (mac->act_scanning) {
86
		tx_agc[RF90_PATH_A] = 0x3f3f3f3f;
86
		tx_agc[RF90_PATH_A] = 0x3f3f3f3f;
87
		tx_agc[RF90_PATH_B] = 0x3f3f3f3f;
87
		tx_agc[RF90_PATH_B] = 0x3f3f3f3f;
88
		if (turbo_scanoff) {
88
		for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {
89
			for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {
89
			tx_agc[idx1] = ppowerlevel[idx1] |
90
				tx_agc[idx1] = ppowerlevel[idx1] |
90
			    (ppowerlevel[idx1] << 8) |
91
				    (ppowerlevel[idx1] << 8) |
91
			    (ppowerlevel[idx1] << 16) |
92
				    (ppowerlevel[idx1] << 16) |
92
			    (ppowerlevel[idx1] << 24);
93
				    (ppowerlevel[idx1] << 24);
93
			if (rtlhal->interface == INTF_USB) {
94
				if (rtlhal->interface == INTF_USB) {
94
				if (tx_agc[idx1] > 0x20 &&
95
					if (tx_agc[idx1] > 0x20 &&
95
				    rtlefuse->external_pa)
96
					    rtlefuse->external_pa)
96
					tx_agc[idx1] = 0x20;
97
						tx_agc[idx1] = 0x20;
98
				}
99
			}
97
			}
100
		}
98
		}
101
	} else {
99
	} else {
Lines 107-113 void rtl92cu_phy_rf6052_set_cck_txpower( Link Here
107
			   TXHIGHPWRLEVEL_LEVEL2) {
105
			   TXHIGHPWRLEVEL_LEVEL2) {
108
			tx_agc[RF90_PATH_A] = 0x00000000;
106
			tx_agc[RF90_PATH_A] = 0x00000000;
109
			tx_agc[RF90_PATH_B] = 0x00000000;
107
			tx_agc[RF90_PATH_B] = 0x00000000;
110
		} else{
108
		} else {
111
			for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {
109
			for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {
112
				tx_agc[idx1] = ppowerlevel[idx1] |
110
				tx_agc[idx1] = ppowerlevel[idx1] |
113
				    (ppowerlevel[idx1] << 8) |
111
				    (ppowerlevel[idx1] << 8) |
Lines 373-379 static void _rtl92c_write_ofdm_power_reg Link Here
373
			    regoffset == RTXAGC_B_MCS07_MCS04)
371
			    regoffset == RTXAGC_B_MCS07_MCS04)
374
				regoffset = 0xc98;
372
				regoffset = 0xc98;
375
			for (i = 0; i < 3; i++) {
373
			for (i = 0; i < 3; i++) {
376
				writeVal = (writeVal > 6) ? (writeVal - 6) : 0;
374
				if (i != 2)
375
					writeVal = (writeVal > 8) ?
376
						   (writeVal - 8) : 0;
377
				else
378
					writeVal = (writeVal > 6) ?
379
						   (writeVal - 6) : 0;
377
				rtl_write_byte(rtlpriv, (u32)(regoffset + i),
380
				rtl_write_byte(rtlpriv, (u32)(regoffset + i),
378
					      (u8)writeVal);
381
					      (u8)writeVal);
379
			}
382
			}
(-)linux-2.6/drivers/net/wireless/rtlwifi/stats.c (+14 lines)
Lines 176-181 static void rtl_process_pwdb(struct ieee Link Here
176
	struct rtl_sta_info *drv_priv = NULL;
176
	struct rtl_sta_info *drv_priv = NULL;
177
	struct ieee80211_sta *sta = NULL;
177
	struct ieee80211_sta *sta = NULL;
178
	long undec_sm_pwdb;
178
	long undec_sm_pwdb;
179
	long undec_sm_cck;
179
180
180
	rcu_read_lock();
181
	rcu_read_lock();
181
	if (rtlpriv->mac80211.opmode != NL80211_IFTYPE_STATION)
182
	if (rtlpriv->mac80211.opmode != NL80211_IFTYPE_STATION)
Lines 185-196 static void rtl_process_pwdb(struct ieee Link Here
185
	if (sta) {
186
	if (sta) {
186
		drv_priv = (struct rtl_sta_info *) sta->drv_priv;
187
		drv_priv = (struct rtl_sta_info *) sta->drv_priv;
187
		undec_sm_pwdb = drv_priv->rssi_stat.undec_sm_pwdb;
188
		undec_sm_pwdb = drv_priv->rssi_stat.undec_sm_pwdb;
189
		undec_sm_cck = drv_priv->rssi_stat.undec_sm_cck;
188
	} else {
190
	} else {
189
		undec_sm_pwdb = rtlpriv->dm.undec_sm_pwdb;
191
		undec_sm_pwdb = rtlpriv->dm.undec_sm_pwdb;
192
		undec_sm_cck = rtlpriv->dm.undec_sm_cck;
190
	}
193
	}
191
194
192
	if (undec_sm_pwdb < 0)
195
	if (undec_sm_pwdb < 0)
193
		undec_sm_pwdb = pstatus->rx_pwdb_all;
196
		undec_sm_pwdb = pstatus->rx_pwdb_all;
197
	if (undec_sm_cck < 0)
198
		undec_sm_cck = pstatus->rx_pwdb_all;
194
	if (pstatus->rx_pwdb_all > (u32) undec_sm_pwdb) {
199
	if (pstatus->rx_pwdb_all > (u32) undec_sm_pwdb) {
195
		undec_sm_pwdb = (((undec_sm_pwdb) *
200
		undec_sm_pwdb = (((undec_sm_pwdb) *
196
		      (RX_SMOOTH_FACTOR - 1)) +
201
		      (RX_SMOOTH_FACTOR - 1)) +
Lines 200-205 static void rtl_process_pwdb(struct ieee Link Here
200
		undec_sm_pwdb = (((undec_sm_pwdb) * (RX_SMOOTH_FACTOR - 1)) +
205
		undec_sm_pwdb = (((undec_sm_pwdb) * (RX_SMOOTH_FACTOR - 1)) +
201
		     (pstatus->rx_pwdb_all)) / (RX_SMOOTH_FACTOR);
206
		     (pstatus->rx_pwdb_all)) / (RX_SMOOTH_FACTOR);
202
	}
207
	}
208
	if (pstatus->rx_pwdb_all > (u32) undec_sm_cck) {
209
		undec_sm_cck = (((undec_sm_pwdb) *
210
		      (RX_SMOOTH_FACTOR - 1)) +
211
		     (pstatus->rx_pwdb_all)) / (RX_SMOOTH_FACTOR);
212
		undec_sm_cck = undec_sm_cck + 1;
213
	} else {
214
		undec_sm_pwdb = (((undec_sm_cck) * (RX_SMOOTH_FACTOR - 1)) +
215
		     (pstatus->rx_pwdb_all)) / (RX_SMOOTH_FACTOR);
216
	}
203
217
204
	if (sta) {
218
	if (sta) {
205
		drv_priv->rssi_stat.undec_sm_pwdb = undec_sm_pwdb;
219
		drv_priv->rssi_stat.undec_sm_pwdb = undec_sm_pwdb;

Return to bug 60713