Commit 2635664e authored by Ping-Ke Shih's avatar Ping-Ke Shih Committed by Kalle Valo

rtlwifi: Add rx ampdu cfg for btcoexist.

If RX ampdu is too long, BT will have less time.
Signed-off-by: default avatarPing-Ke Shih <pkshih@realtek.com>
Signed-off-by: default avatarLarry Finger <Larry.Finger@lwfinger.net>
Cc: Yan-Hsuan Chuang <yhchuang@realtek.com>
Cc: Birming Chiu <birming@realtek.com>
Cc: Shaofu <shaofu@realtek.com>
Cc: Steven Ting <steventing@realtek.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 54685f9c
...@@ -1582,6 +1582,7 @@ int rtl_rx_agg_start(struct ieee80211_hw *hw, ...@@ -1582,6 +1582,7 @@ int rtl_rx_agg_start(struct ieee80211_hw *hw,
struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_priv *rtlpriv = rtl_priv(hw);
struct rtl_tid_data *tid_data; struct rtl_tid_data *tid_data;
struct rtl_sta_info *sta_entry = NULL; struct rtl_sta_info *sta_entry = NULL;
u8 reject_agg;
if (sta == NULL) if (sta == NULL)
return -EINVAL; return -EINVAL;
...@@ -1589,6 +1590,14 @@ int rtl_rx_agg_start(struct ieee80211_hw *hw, ...@@ -1589,6 +1590,14 @@ int rtl_rx_agg_start(struct ieee80211_hw *hw,
if (unlikely(tid >= MAX_TID_COUNT)) if (unlikely(tid >= MAX_TID_COUNT))
return -EINVAL; return -EINVAL;
if (rtlpriv->cfg->ops->get_btc_status()) {
rtlpriv->btcoexist.btc_ops->btc_get_ampdu_cfg(rtlpriv,
&reject_agg,
NULL, NULL);
if (reject_agg)
return -EINVAL;
}
sta_entry = (struct rtl_sta_info *)sta->drv_priv; sta_entry = (struct rtl_sta_info *)sta->drv_priv;
if (!sta_entry) if (!sta_entry)
return -ENXIO; return -ENXIO;
...@@ -1643,6 +1652,24 @@ int rtl_tx_agg_oper(struct ieee80211_hw *hw, ...@@ -1643,6 +1652,24 @@ int rtl_tx_agg_oper(struct ieee80211_hw *hw,
return 0; return 0;
} }
void rtl_rx_ampdu_apply(struct rtl_priv *rtlpriv)
{
struct rtl_btc_ops *btc_ops = rtlpriv->btcoexist.btc_ops;
u8 reject_agg, ctrl_agg_size = 0, agg_size;
if (rtlpriv->cfg->ops->get_btc_status())
btc_ops->btc_get_ampdu_cfg(rtlpriv, &reject_agg,
&ctrl_agg_size, &agg_size);
RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
"Set RX AMPDU: coex - reject=%d, ctrl_agg_size=%d, size=%d",
reject_agg, ctrl_agg_size, agg_size);
rtlpriv->hw->max_rx_aggregation_subframes =
(ctrl_agg_size ? agg_size : IEEE80211_MAX_AMPDU_BUF);
}
EXPORT_SYMBOL(rtl_rx_ampdu_apply);
/********************************************************* /*********************************************************
* *
* wq & timer callback functions * wq & timer callback functions
......
...@@ -147,6 +147,7 @@ int rtl_rx_agg_start(struct ieee80211_hw *hw, ...@@ -147,6 +147,7 @@ int rtl_rx_agg_start(struct ieee80211_hw *hw,
struct ieee80211_sta *sta, u16 tid); struct ieee80211_sta *sta, u16 tid);
int rtl_rx_agg_stop(struct ieee80211_hw *hw, int rtl_rx_agg_stop(struct ieee80211_hw *hw,
struct ieee80211_sta *sta, u16 tid); struct ieee80211_sta *sta, u16 tid);
void rtl_rx_ampdu_apply(struct rtl_priv *rtlpriv);
void rtl_watchdog_wq_callback(void *data); void rtl_watchdog_wq_callback(void *data);
void rtl_fwevt_wq_callback(void *data); void rtl_fwevt_wq_callback(void *data);
void rtl_c2hcmd_wq_callback(void *data); void rtl_c2hcmd_wq_callback(void *data);
......
...@@ -272,14 +272,24 @@ static void halbtc_disable_low_power(struct btc_coexist *btcoexist, ...@@ -272,14 +272,24 @@ static void halbtc_disable_low_power(struct btc_coexist *btcoexist,
static void halbtc_aggregation_check(struct btc_coexist *btcoexist) static void halbtc_aggregation_check(struct btc_coexist *btcoexist)
{ {
bool need_to_act = false; bool need_to_act = false;
static unsigned long pre_time;
unsigned long cur_time = 0;
struct rtl_priv *rtlpriv = btcoexist->adapter;
/* To void continuous deleteBA=>addBA=>deleteBA=>addBA /* To void continuous deleteBA=>addBA=>deleteBA=>addBA
* This function is not allowed to continuous called * This function is not allowed to continuous called
* It can only be called after 8 seconds * It can only be called after 8 seconds
*/ */
cur_time = jiffies;
if (jiffies_to_msecs(cur_time - pre_time) <= 8000) {
/* over 8 seconds you can execute this function again. */
return;
}
pre_time = cur_time;
if (btcoexist->bt_info.reject_agg_pkt) { if (btcoexist->bt_info.reject_agg_pkt) {
;/* TODO: reject */ need_to_act = true;
btcoexist->bt_info.pre_reject_agg_pkt = btcoexist->bt_info.pre_reject_agg_pkt =
btcoexist->bt_info.reject_agg_pkt; btcoexist->bt_info.reject_agg_pkt;
} else { } else {
...@@ -304,8 +314,10 @@ static void halbtc_aggregation_check(struct btc_coexist *btcoexist) ...@@ -304,8 +314,10 @@ static void halbtc_aggregation_check(struct btc_coexist *btcoexist)
btcoexist->bt_info.pre_agg_buf_size = btcoexist->bt_info.pre_agg_buf_size =
btcoexist->bt_info.agg_buf_size; btcoexist->bt_info.agg_buf_size;
} }
}
if (need_to_act)
rtl_rx_ampdu_apply(rtlpriv);
}
} }
static u32 halbtc_get_bt_patch_version(struct btc_coexist *btcoexist) static u32 halbtc_get_bt_patch_version(struct btc_coexist *btcoexist)
......
...@@ -46,6 +46,7 @@ static struct rtl_btc_ops rtl_btc_operation = { ...@@ -46,6 +46,7 @@ static struct rtl_btc_ops rtl_btc_operation = {
.btc_is_bt_disabled = rtl_btc_is_bt_disabled, .btc_is_bt_disabled = rtl_btc_is_bt_disabled,
.btc_special_packet_notify = rtl_btc_special_packet_notify, .btc_special_packet_notify = rtl_btc_special_packet_notify,
.btc_record_pwr_mode = rtl_btc_record_pwr_mode, .btc_record_pwr_mode = rtl_btc_record_pwr_mode,
.btc_get_ampdu_cfg = rtl_btc_get_ampdu_cfg,
}; };
void rtl_btc_record_pwr_mode(struct rtl_priv *rtlpriv, u8 *buf, u8 len) void rtl_btc_record_pwr_mode(struct rtl_priv *rtlpriv, u8 *buf, u8 len)
...@@ -60,6 +61,17 @@ void rtl_btc_record_pwr_mode(struct rtl_priv *rtlpriv, u8 *buf, u8 len) ...@@ -60,6 +61,17 @@ void rtl_btc_record_pwr_mode(struct rtl_priv *rtlpriv, u8 *buf, u8 len)
memcpy(gl_bt_coexist.pwr_mode_val, buf, safe_len); memcpy(gl_bt_coexist.pwr_mode_val, buf, safe_len);
} }
void rtl_btc_get_ampdu_cfg(struct rtl_priv *rtlpriv, u8 *reject_agg,
u8 *ctrl_agg_size, u8 *agg_size)
{
if (reject_agg)
*reject_agg = gl_bt_coexist.bt_info.reject_agg_pkt;
if (ctrl_agg_size)
*ctrl_agg_size = gl_bt_coexist.bt_info.bt_ctrl_agg_buf_size;
if (agg_size)
*agg_size = gl_bt_coexist.bt_info.agg_buf_size;
}
void rtl_btc_init_variables(struct rtl_priv *rtlpriv) void rtl_btc_init_variables(struct rtl_priv *rtlpriv)
{ {
exhalbtc_initlize_variables(); exhalbtc_initlize_variables();
......
...@@ -44,6 +44,8 @@ bool rtl_btc_is_disable_edca_turbo(struct rtl_priv *rtlpriv); ...@@ -44,6 +44,8 @@ bool rtl_btc_is_disable_edca_turbo(struct rtl_priv *rtlpriv);
bool rtl_btc_is_bt_disabled(struct rtl_priv *rtlpriv); bool rtl_btc_is_bt_disabled(struct rtl_priv *rtlpriv);
void rtl_btc_special_packet_notify(struct rtl_priv *rtlpriv, u8 pkt_type); void rtl_btc_special_packet_notify(struct rtl_priv *rtlpriv, u8 pkt_type);
void rtl_btc_record_pwr_mode(struct rtl_priv *rtlpriv, u8 *buf, u8 len); void rtl_btc_record_pwr_mode(struct rtl_priv *rtlpriv, u8 *buf, u8 len);
void rtl_btc_get_ampdu_cfg(struct rtl_priv *rtlpriv, u8 *reject_agg,
u8 *ctrl_agg_size, u8 *agg_size);
struct rtl_btc_ops *rtl_btc_get_ops_pointer(void); struct rtl_btc_ops *rtl_btc_get_ops_pointer(void);
......
...@@ -2561,6 +2561,8 @@ struct rtl_btc_ops { ...@@ -2561,6 +2561,8 @@ struct rtl_btc_ops {
void (*btc_special_packet_notify)(struct rtl_priv *rtlpriv, void (*btc_special_packet_notify)(struct rtl_priv *rtlpriv,
u8 pkt_type); u8 pkt_type);
void (*btc_record_pwr_mode)(struct rtl_priv *rtlpriv, u8 *buf, u8 len); void (*btc_record_pwr_mode)(struct rtl_priv *rtlpriv, u8 *buf, u8 len);
void (*btc_get_ampdu_cfg)(struct rtl_priv *rtlpriv, u8 *reject_agg,
u8 *ctrl_agg_size, u8 *agg_size);
}; };
struct proxim { struct proxim {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment