From: Ping-Ke Shih <[email protected]>

If RX ampdu is too long, BT will have less time.

Signed-off-by: Ping-Ke Shih <[email protected]>
Signed-off-by: Larry Finger <[email protected]>
Cc: Yan-Hsuan Chuang <[email protected]>
Cc: Birming Chiu <[email protected]>
Cc: Shaofu <[email protected]>
Cc: Steven Ting <[email protected]>
---
 drivers/net/wireless/realtek/rtlwifi/base.c        | 27 ++++++++++++++++++++++
 drivers/net/wireless/realtek/rtlwifi/base.h        |  1 +
 .../realtek/rtlwifi/btcoexist/halbtcoutsrc.c       | 16 +++++++++++--
 .../wireless/realtek/rtlwifi/btcoexist/rtl_btc.c   | 12 ++++++++++
 .../wireless/realtek/rtlwifi/btcoexist/rtl_btc.h   |  2 ++
 drivers/net/wireless/realtek/rtlwifi/wifi.h        |  2 ++
 6 files changed, 58 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/base.c 
b/drivers/net/wireless/realtek/rtlwifi/base.c
index 897ec3cfa8c8..c6fef54f6543 100644
--- a/drivers/net/wireless/realtek/rtlwifi/base.c
+++ b/drivers/net/wireless/realtek/rtlwifi/base.c
@@ -1582,6 +1582,7 @@ int rtl_rx_agg_start(struct ieee80211_hw *hw,
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_tid_data *tid_data;
        struct rtl_sta_info *sta_entry = NULL;
+       u8 reject_agg;
 
        if (sta == NULL)
                return -EINVAL;
@@ -1589,6 +1590,14 @@ int rtl_rx_agg_start(struct ieee80211_hw *hw,
        if (unlikely(tid >= MAX_TID_COUNT))
                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;
        if (!sta_entry)
                return -ENXIO;
@@ -1643,6 +1652,24 @@ int rtl_tx_agg_oper(struct ieee80211_hw *hw,
        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
diff --git a/drivers/net/wireless/realtek/rtlwifi/base.h 
b/drivers/net/wireless/realtek/rtlwifi/base.h
index a619fc92a9c0..21fa4562f631 100644
--- a/drivers/net/wireless/realtek/rtlwifi/base.h
+++ b/drivers/net/wireless/realtek/rtlwifi/base.h
@@ -147,6 +147,7 @@ int rtl_rx_agg_start(struct ieee80211_hw *hw,
                     struct ieee80211_sta *sta, u16 tid);
 int rtl_rx_agg_stop(struct ieee80211_hw *hw,
                    struct ieee80211_sta *sta, u16 tid);
+void rtl_rx_ampdu_apply(struct rtl_priv *rtlpriv);
 void rtl_watchdog_wq_callback(void *data);
 void rtl_fwevt_wq_callback(void *data);
 void rtl_c2hcmd_wq_callback(void *data);
diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c 
b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c
index 451039ac7b0a..226927a752f8 100644
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c
@@ -272,14 +272,24 @@ static void halbtc_disable_low_power(struct btc_coexist 
*btcoexist,
 static void halbtc_aggregation_check(struct btc_coexist *btcoexist)
 {
        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
         * This function is not allowed to continuous called
         * 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) {
-               ;/* TODO: reject */
+               need_to_act = true;
                btcoexist->bt_info.pre_reject_agg_pkt =
                        btcoexist->bt_info.reject_agg_pkt;
        } else {
@@ -304,8 +314,10 @@ static void halbtc_aggregation_check(struct btc_coexist 
*btcoexist)
                        btcoexist->bt_info.pre_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)
diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c 
b/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c
index 3b976dab712f..96c1ccbf70ac 100644
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c
@@ -46,6 +46,7 @@ static struct rtl_btc_ops rtl_btc_operation = {
        .btc_is_bt_disabled = rtl_btc_is_bt_disabled,
        .btc_special_packet_notify = rtl_btc_special_packet_notify,
        .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)
@@ -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);
 }
 
+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)
 {
        exhalbtc_initlize_variables();
diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.h 
b/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.h
index 9eeb4fdeaec1..c1c32d685c5d 100644
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.h
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.h
@@ -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);
 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_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);
 
diff --git a/drivers/net/wireless/realtek/rtlwifi/wifi.h 
b/drivers/net/wireless/realtek/rtlwifi/wifi.h
index 41ebdb9d3627..0591adedce76 100644
--- a/drivers/net/wireless/realtek/rtlwifi/wifi.h
+++ b/drivers/net/wireless/realtek/rtlwifi/wifi.h
@@ -2561,6 +2561,8 @@ struct rtl_btc_ops {
        void (*btc_special_packet_notify)(struct rtl_priv *rtlpriv,
                                          u8 pkt_type);
        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 {
-- 
2.12.3

Reply via email to