diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2013-05-05 08:24:42 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2013-05-05 08:27:03 +0200 | 
| commit | f99e44a7f3352d7131c7526207f153f13ec5acd4 (patch) | |
| tree | 0f448b21128c478053ee7f7765b865954c4eebe8 /drivers/net/wireless/rtlwifi/rtl8192c | |
| parent | fd29f424d458118f02e89596505c68a63dcb3007 (diff) | |
| parent | ce857229e0c3adc211944a13a5579ef84fd7b4af (diff) | |
Merge branch 'linus' into core/urgent
Update with Linus tree so fixes for the same can be applied.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'drivers/net/wireless/rtlwifi/rtl8192c')
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c | 105 | ||||
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c | 99 | ||||
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h | 4 | 
3 files changed, 124 insertions, 84 deletions
| diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c index b793a659a465..d2d57a27a7c1 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c +++ b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c @@ -174,8 +174,8 @@ static void rtl92c_dm_diginit(struct ieee80211_hw *hw)  	dm_digtable->rssi_highthresh = DM_DIG_THRESH_HIGH;  	dm_digtable->fa_lowthresh = DM_FALSEALARM_THRESH_LOW;  	dm_digtable->fa_highthresh = DM_FALSEALARM_THRESH_HIGH; -	dm_digtable->rx_gain_range_max = DM_DIG_MAX; -	dm_digtable->rx_gain_range_min = DM_DIG_MIN; +	dm_digtable->rx_gain_max = DM_DIG_MAX; +	dm_digtable->rx_gain_min = DM_DIG_MIN;  	dm_digtable->back_val = DM_DIG_BACKOFF_DEFAULT;  	dm_digtable->back_range_max = DM_DIG_BACKOFF_MAX;  	dm_digtable->back_range_min = DM_DIG_BACKOFF_MIN; @@ -300,11 +300,11 @@ static void rtl92c_dm_ctrl_initgain_by_rssi(struct ieee80211_hw *hw)  	}  	if ((digtable->rssi_val_min + 10 - digtable->back_val) > -	    digtable->rx_gain_range_max) -		digtable->cur_igvalue = digtable->rx_gain_range_max; +	    digtable->rx_gain_max) +		digtable->cur_igvalue = digtable->rx_gain_max;  	else if ((digtable->rssi_val_min + 10 - -		  digtable->back_val) < digtable->rx_gain_range_min) -		digtable->cur_igvalue = digtable->rx_gain_range_min; +		  digtable->back_val) < digtable->rx_gain_min) +		digtable->cur_igvalue = digtable->rx_gain_min;  	else  		digtable->cur_igvalue = digtable->rssi_val_min + 10 -  		    digtable->back_val; @@ -669,7 +669,7 @@ static void rtl92c_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw  	u8 thermalvalue, delta, delta_lck, delta_iqk;  	long ele_a, ele_d, temp_cck, val_x, value32;  	long val_y, ele_c = 0; -	u8 ofdm_index[2], ofdm_index_old[2], cck_index_old = 0; +	u8 ofdm_index[2], ofdm_index_old[2] = {0, 0}, cck_index_old = 0;  	s8 cck_index = 0;  	int i;  	bool is2t = IS_92C_SERIAL(rtlhal->version); @@ -717,7 +717,7 @@ static void rtl92c_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw  			for (i = 0; i < OFDM_TABLE_LENGTH; i++) {  				if (ele_d == (ofdmswing_table[i] &  				    MASKOFDM_D)) { - +					ofdm_index_old[1] = (u8) i;  					RT_TRACE(rtlpriv, COMP_POWER_TRACKING,  						 DBG_LOUD,  						 "Initial pathB ele_d reg0x%x = 0x%lx, ofdm_index=0x%x\n", @@ -1147,75 +1147,6 @@ void rtl92c_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw)  }  EXPORT_SYMBOL(rtl92c_dm_init_rate_adaptive_mask); -static void rtl92c_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw) -{ -	struct rtl_priv *rtlpriv = rtl_priv(hw); -	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); -	struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); -	struct rate_adaptive *p_ra = &(rtlpriv->ra); -	u32 low_rssi_thresh, high_rssi_thresh; -	struct ieee80211_sta *sta = NULL; - -	if (is_hal_stop(rtlhal)) { -		RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD, -			 "<---- driver is going to unload\n"); -		return; -	} - -	if (!rtlpriv->dm.useramask) { -		RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD, -			 "<---- driver does not control rate adaptive mask\n"); -		return; -	} - -	if (mac->link_state == MAC80211_LINKED && -	    mac->opmode == NL80211_IFTYPE_STATION) { -		switch (p_ra->pre_ratr_state) { -		case DM_RATR_STA_HIGH: -			high_rssi_thresh = 50; -			low_rssi_thresh = 20; -			break; -		case DM_RATR_STA_MIDDLE: -			high_rssi_thresh = 55; -			low_rssi_thresh = 20; -			break; -		case DM_RATR_STA_LOW: -			high_rssi_thresh = 50; -			low_rssi_thresh = 25; -			break; -		default: -			high_rssi_thresh = 50; -			low_rssi_thresh = 20; -			break; -		} - -		if (rtlpriv->dm.undec_sm_pwdb > (long)high_rssi_thresh) -			p_ra->ratr_state = DM_RATR_STA_HIGH; -		else if (rtlpriv->dm.undec_sm_pwdb > (long)low_rssi_thresh) -			p_ra->ratr_state = DM_RATR_STA_MIDDLE; -		else -			p_ra->ratr_state = DM_RATR_STA_LOW; - -		if (p_ra->pre_ratr_state != p_ra->ratr_state) { -			RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD, "RSSI = %ld\n", -				 rtlpriv->dm.undec_sm_pwdb); -			RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD, -				 "RSSI_LEVEL = %d\n", p_ra->ratr_state); -			RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD, -				 "PreState = %d, CurState = %d\n", -				 p_ra->pre_ratr_state, p_ra->ratr_state); - -			rcu_read_lock(); -			sta = ieee80211_find_sta(mac->vif, mac->bssid); -			rtlpriv->cfg->ops->update_rate_tbl(hw, sta, -					p_ra->ratr_state); - -			p_ra->pre_ratr_state = p_ra->ratr_state; -			rcu_read_unlock(); -		} -	} -} -  static void rtl92c_dm_init_dynamic_bb_powersaving(struct ieee80211_hw *hw)  {  	struct rtl_priv *rtlpriv = rtl_priv(hw); @@ -1437,6 +1368,9 @@ void rtl92c_dm_watchdog(struct ieee80211_hw *hw)  	rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FWLPS_RF_ON,  				      (u8 *) (&fw_ps_awake)); +	if (ppsc->p2p_ps_info.p2p_ps_mode) +		fw_ps_awake = false; +  	if ((ppsc->rfpwr_state == ERFON) && ((!fw_current_inpsmode) &&  					     fw_ps_awake)  	    && (!ppsc->rfchange_inprogress)) { @@ -1446,7 +1380,7 @@ void rtl92c_dm_watchdog(struct ieee80211_hw *hw)  		rtl92c_dm_dynamic_bb_powersaving(hw);  		rtl92c_dm_dynamic_txpower(hw);  		rtl92c_dm_check_txpower_tracking(hw); -		rtl92c_dm_refresh_rate_adaptive_mask(hw); +		/* rtl92c_dm_refresh_rate_adaptive_mask(hw); */  		rtl92c_dm_bt_coexist(hw);  		rtl92c_dm_check_edca_turbo(hw);  	} @@ -1651,7 +1585,7 @@ static void rtl92c_bt_set_normal(struct ieee80211_hw *hw)  	}  } -static void rtl92c_bt_ant_isolation(struct ieee80211_hw *hw) +static void rtl92c_bt_ant_isolation(struct ieee80211_hw *hw, u8 tmp1byte)  {  	struct rtl_priv *rtlpriv = rtl_priv(hw);  	struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw); @@ -1673,9 +1607,9 @@ static void rtl92c_bt_ant_isolation(struct ieee80211_hw *hw)  			    BT_RSSI_STATE_SPECIAL_LOW)) {  			rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, 0xa0);  		} else if (rtlpcipriv->bt_coexist.bt_service == BT_PAN) { -			rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, 0x00); +			rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, tmp1byte);  		} else { -			rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, 0x00); +			rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, tmp1byte);  		}  	} @@ -1726,12 +1660,17 @@ static void rtl92c_check_bt_change(struct ieee80211_hw *hw)  {  	struct rtl_priv *rtlpriv = rtl_priv(hw);  	struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw); +	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); +	u8 tmp1byte = 0; +	if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version) && +	    rtlpcipriv->bt_coexist.bt_coexistence) +		tmp1byte |= BIT(5);  	if (rtlpcipriv->bt_coexist.bt_cur_state) {  		if (rtlpcipriv->bt_coexist.bt_ant_isolation) -			rtl92c_bt_ant_isolation(hw); +			rtl92c_bt_ant_isolation(hw, tmp1byte);  	} else { -		rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, 0x00); +		rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, tmp1byte);  		rtlpriv->cfg->ops->set_rfreg(hw, RF90_PATH_A, 0x1e, 0xf0,  				rtlpcipriv->bt_coexist.bt_rfreg_origin_1e); diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c index 883f23ae9519..04a41628ceed 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c +++ b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c @@ -552,7 +552,9 @@ void rtl92c_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)  	RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode);  	SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, mode); -	SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode, 1); +	SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode, +					 (rtlpriv->mac80211.p2p) ? +					 ppsc->smart_ps : 1);  	SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(u1_h2c_set_pwrmode,  					      ppsc->reg_max_lps_awakeintvl); @@ -808,3 +810,98 @@ void rtl92c_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus)  	rtl92c_fill_h2c_cmd(hw, H2C_JOINBSSRPT, 1, u1_joinbssrpt_parm);  }  EXPORT_SYMBOL(rtl92c_set_fw_joinbss_report_cmd); + +static void rtl92c_set_p2p_ctw_period_cmd(struct ieee80211_hw *hw, u8 ctwindow) +{ +	u8 u1_ctwindow_period[1] = {ctwindow}; + +	rtl92c_fill_h2c_cmd(hw, H2C_P2P_PS_CTW_CMD, 1, u1_ctwindow_period); +} + +void rtl92c_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state) +{ +	struct rtl_priv *rtlpriv = rtl_priv(hw); +	struct rtl_ps_ctl *rtlps = rtl_psc(rtl_priv(hw)); +	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); +	struct rtl_p2p_ps_info *p2pinfo = &(rtlps->p2p_ps_info); +	struct p2p_ps_offload_t *p2p_ps_offload = &rtlhal->p2p_ps_offload; +	u8	i; +	u16	ctwindow; +	u32	start_time, tsf_low; + +	switch (p2p_ps_state) { +	case P2P_PS_DISABLE: +		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_DISABLE\n"); +		memset(p2p_ps_offload, 0, sizeof(struct p2p_ps_offload_t)); +		break; +	case P2P_PS_ENABLE: +		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_ENABLE\n"); +		/* update CTWindow value. */ +		if (p2pinfo->ctwindow > 0) { +			p2p_ps_offload->ctwindow_en = 1; +			ctwindow = p2pinfo->ctwindow; +			rtl92c_set_p2p_ctw_period_cmd(hw, ctwindow); +		} +		/* hw only support 2 set of NoA */ +		for (i = 0; i < p2pinfo->noa_num; i++) { +			/* To control the register setting for which NOA*/ +			rtl_write_byte(rtlpriv, 0x5cf, (i << 4)); +			if (i == 0) +				p2p_ps_offload->noa0_en = 1; +			else +				p2p_ps_offload->noa1_en = 1; + +			/* config P2P NoA Descriptor Register */ +			rtl_write_dword(rtlpriv, 0x5E0, +					p2pinfo->noa_duration[i]); +			rtl_write_dword(rtlpriv, 0x5E4, +					p2pinfo->noa_interval[i]); + +			/*Get Current TSF value */ +			tsf_low = rtl_read_dword(rtlpriv, REG_TSFTR); + +			start_time = p2pinfo->noa_start_time[i]; +			if (p2pinfo->noa_count_type[i] != 1) { +				while (start_time <= (tsf_low+(50*1024))) { +					start_time += p2pinfo->noa_interval[i]; +					if (p2pinfo->noa_count_type[i] != 255) +						p2pinfo->noa_count_type[i]--; +				} +			} +			rtl_write_dword(rtlpriv, 0x5E8, start_time); +			rtl_write_dword(rtlpriv, 0x5EC, +					p2pinfo->noa_count_type[i]); +		} + +		if ((p2pinfo->opp_ps == 1) || (p2pinfo->noa_num > 0)) { +			/* rst p2p circuit */ +			rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, BIT(4)); + +			p2p_ps_offload->offload_en = 1; + +			if (P2P_ROLE_GO == rtlpriv->mac80211.p2p) { +				p2p_ps_offload->role = 1; +				p2p_ps_offload->allstasleep = 0; +			} else { +				p2p_ps_offload->role = 0; +			} + +			p2p_ps_offload->discovery = 0; +		} +		break; +	case P2P_PS_SCAN: +		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN\n"); +		p2p_ps_offload->discovery = 1; +		break; +	case P2P_PS_SCAN_DONE: +		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN_DONE\n"); +		p2p_ps_offload->discovery = 0; +		p2pinfo->p2p_ps_state = P2P_PS_ENABLE; +		break; +	default: +		break; +	} + +	rtl92c_fill_h2c_cmd(hw, H2C_P2P_PS_OFFLOAD, 1, (u8 *)p2p_ps_offload); +} +EXPORT_SYMBOL_GPL(rtl92c_set_p2p_ps_offload_cmd); diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h index 780ea5b1e24c..15b2055e6212 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h +++ b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h @@ -67,6 +67,9 @@ enum rtl8192c_h2c_cmd {  	H2C_RSVDPAGE = 3,  	H2C_RSSI_REPORT = 5,  	H2C_RA_MASK = 6, +	H2C_MACID_PS_MODE = 7, +	H2C_P2P_PS_OFFLOAD = 8, +	H2C_P2P_PS_CTW_CMD = 32,  	MAX_H2CCMD  }; @@ -95,5 +98,6 @@ void rtl92c_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode);  void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished);  void rtl92c_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus);  void usb_writeN_async(struct rtl_priv *rtlpriv, u32 addr, void *data, u16 len); +void rtl92c_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state);  #endif | 
