OSDN Git Service

rtlwifi: Add rx ampdu cfg for btcoexist.
authorPing-Ke Shih <pkshih@realtek.com>
Sun, 18 Jun 2017 16:12:47 +0000 (11:12 -0500)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 21 Jun 2017 15:28:06 +0000 (18:28 +0300)
If RX ampdu is too long, BT will have less time.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Larry 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: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/realtek/rtlwifi/base.c
drivers/net/wireless/realtek/rtlwifi/base.h
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c
drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c
drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.h
drivers/net/wireless/realtek/rtlwifi/wifi.h

index 897ec3c..c6fef54 100644 (file)
@@ -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
index a619fc9..21fa456 100644 (file)
@@ -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);
index 451039a..226927a 100644 (file)
@@ -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)
index 3b976da..96c1ccb 100644 (file)
@@ -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();
index 9eeb4fd..c1c32d6 100644 (file)
@@ -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);
 
index 41ebdb9..0591ade 100644 (file)
@@ -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 {