rtlwifi: fix some bugs and add btcoex functions
[email protected]
maintainerv3 cover rtlwifi: fix some bugs and add btcoex functions
From: Ping-Ke Shih <[email protected]>
Fix some bugs reported by QC, and continue to submit btcoex patches for further use.
v3:
* remove the commit that adds sta_statistics op, because Johannes fixes
it in cfg80211 (Thanks!)
* for 'typedef' comment, add a commit to resolve old typedef, and remove typedef from the commit "rtlwifi: btcoex: Add common function for qeurying BT information"
v2:
* add my sob to commit log if missing, and remove trivial comments.
Larry Finger (1):
rtlwifi: btcoex: Remove typedef statements
Ping-Ke Shih (7):
rtlwifi: Use mutex to replace spin_lock to protect IPS and LPS
rtlwifi: fix scan channel 1 fail after IPS
rtlwifi: enable mac80211 fast-tx support
rtlwifi: btcoex: Add power_on_setting routine
rtlwifi: btcoex: Remove global variables from btcoex
rtlwifi: btcoex: Add common function for qeurying BT information
rtlwifi: btcoex: add rfe_type parameter to btcoex
Steven Ting (1):
rtlwifi: Support A-MSDU in A-MPDU capability
Tsang-Shian Lin (1):
rtlwifi: unlink bss when un-association
drivers/net/wireless/realtek/rtlwifi/base.c | 9 +- .../realtek/rtlwifi/btcoexist/halbtcoutsrc.c | 398 +++++++++++++++++---- .../realtek/rtlwifi/btcoexist/halbtcoutsrc.h | 178 +++++---- .../wireless/realtek/rtlwifi/btcoexist/rtl_btc.c | 234 ++++++++++-- .../wireless/realtek/rtlwifi/btcoexist/rtl_btc.h | 4 +- drivers/net/wireless/realtek/rtlwifi/core.c | 24 ++ drivers/net/wireless/realtek/rtlwifi/pci.c | 5 +- drivers/net/wireless/realtek/rtlwifi/ps.c | 29 +- drivers/net/wireless/realtek/rtlwifi/usb.c | 1 - drivers/net/wireless/realtek/rtlwifi/wifi.h | 16 +- 10 files changed, 694 insertions(+), 204 deletions(-)
Signature · 1 line
2.15.1
[email protected]
maintainerPATCH v3 1/10 rtlwifi: Use mutex to replace spin_lock to protect IPS and LPS
From: Ping-Ke Shih <[email protected]>
Enter/leavel IPS and LPS are large critical section, and they can't use sleep function because running in atomic-context, which own a spin_lock. In commit ba9f93f82aba ("rtlwifi: Fix enter/exit power_save"), it moves LPS functions to thread-context, so this commit can simply change LPS's spin lock to mutex.
Considering IPS functions, rtl_ips_nic_on() may be called by TX tasklet (softirq-context) that check whether packet is auth frame. Fortunately, current mac80211 will ask driver to leave IPS using op_config with changed flag IEEE80211_CONF_CHANGE_IDLE, before issuing auth frame, so IPS functions can run in thread-context and use mutex to protect critical section, too.
Also, this commit removes some useless spin locks.
--- drivers/net/wireless/realtek/rtlwifi/base.c | 6 ++---- drivers/net/wireless/realtek/rtlwifi/ps.c | 24 ++++++++++-------------- drivers/net/wireless/realtek/rtlwifi/usb.c | 1 - drivers/net/wireless/realtek/rtlwifi/wifi.h | 10 ++-------- 4 files changed, 14 insertions(+), 27 deletions(-)
drivers/net/wireless/realtek/rtlwifi/base.c +2 -4
@@ -551,7 +551,8 @@ int rtl_init_core(struct ieee80211_hw *hw)/* <4> locks */ mutex_init (&rtlpriv->locks.conf_mutex); -spin_lock_init (&rtlpriv->locks.ips_lock); +mutex_init (&rtlpriv->locks.ips_mutex); +mutex_init (&rtlpriv->locks.lps_mutex);spin_lock_init (&rtlpriv->locks.irq_th_lock);spin_lock_init (&rtlpriv->locks.h2c_lock);spin_lock_init (&rtlpriv->locks.rf_ps_lock);
@@ -561,9 +562,7 @@ int rtl_init_core(struct ieee80211_hw *hw)spin_lock_init (&rtlpriv->locks.c2hcmd_lock);spin_lock_init (&rtlpriv->locks.scan_list_lock);spin_lock_init (&rtlpriv->locks.cck_and_rw_pagea_lock); -spin_lock_init (&rtlpriv->locks.check_sendpkt_lock);spin_lock_init (&rtlpriv->locks.fw_ps_lock); -spin_lock_init (&rtlpriv->locks.lps_lock);spin_lock_init (&rtlpriv->locks.iqk_lock);/* <5> init list */ INIT_LIST_HEAD (&rtlpriv->entry_list);
@@ -1229,7 +1228,6 @@ bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb) }if (ieee80211_is_auth (fc)) {RT_TRACE (rtlpriv,COMP_SEND ,DBG_DMESG ,"MAC80211_LINKING\n" ); -rtl_ips_nic_on (hw); mac->link_state =MAC80211_LINKING ;/* Dul mac */
drivers/net/wireless/realtek/rtlwifi/ps.c +10 -14
@@ -289,7 +289,7 @@ void rtl_ips_nic_on(struct ieee80211_hw *hw)cancel_delayed_work (&rtlpriv->works.ips_nic_off_wq); -spin_lock (&rtlpriv->locks.ips_lock); +mutex_lock (&rtlpriv->locks.ips_mutex);if (ppsc->inactiveps) { rtstate = ppsc->rfpwr_state;
@@ -306,7 +306,7 @@ void rtl_ips_nic_on(struct ieee80211_hw *hw) ppsc->inactive_pwrstate); } } -spin_unlock (&rtlpriv->locks.ips_lock); +mutex_unlock (&rtlpriv->locks.ips_mutex); }EXPORT_SYMBOL_GPL (rtl_ips_nic_on);
@@ -415,7 +415,6 @@ static void rtl_lps_enter_core(struct ieee80211_hw *hw)struct rtl_mac *mac =rtl_mac (rtl_priv (hw));struct rtl_ps_ctl *ppsc =rtl_psc (rtl_priv (hw));struct rtl_priv *rtlpriv =rtl_priv (hw); -unsigned long flag;if (!ppsc->fwctrl_lps)return ;
@@ -436,7 +435,7 @@ static void rtl_lps_enter_core(struct ieee80211_hw *hw)if (mac->link_state !=MAC80211_LINKED )return ; -spin_lock_irqsave (&rtlpriv->locks.lps_lock, flag); +mutex_lock (&rtlpriv->locks.lps_mutex);/* Don't need to check (ppsc->dot11_psmode == EACTIVE), because * bt_ccoexist may ask to enter lps.
@@ -446,7 +445,7 @@ static void rtl_lps_enter_core(struct ieee80211_hw *hw) "Enter 802.11 power save mode...\n");rtl_lps_set_psmode (hw,EAUTOPS ); -spin_unlock_irqrestore (&rtlpriv->locks.lps_lock, flag); +mutex_unlock (&rtlpriv->locks.lps_mutex); }/* Interrupt safe routine to leave the leisure power save mode.*/
@@ -455,9 +454,8 @@ static void rtl_lps_leave_core(struct ieee80211_hw *hw)struct rtl_priv *rtlpriv =rtl_priv (hw);struct rtl_ps_ctl *ppsc =rtl_psc (rtl_priv (hw));struct rtl_hal *rtlhal =rtl_hal (rtl_priv (hw)); -unsigned long flag; -spin_lock_irqsave (&rtlpriv->locks.lps_lock, flag); +mutex_lock (&rtlpriv->locks.lps_mutex);if (ppsc->fwctrl_lps) {if (ppsc->dot11_psmode !=EACTIVE ) {
@@ -478,7 +476,7 @@ static void rtl_lps_leave_core(struct ieee80211_hw *hw)rtl_lps_set_psmode (hw,EACTIVE ); } } -spin_unlock_irqrestore (&rtlpriv->locks.lps_lock, flag); +mutex_unlock (&rtlpriv->locks.lps_mutex); }/* For sw LPS*/
@@ -568,7 +566,6 @@ void rtl_swlps_rf_awake(struct ieee80211_hw *hw)struct rtl_priv *rtlpriv =rtl_priv (hw);struct rtl_ps_ctl *ppsc =rtl_psc (rtl_priv (hw));struct rtl_mac *mac =rtl_mac (rtl_priv (hw)); -unsigned long flag;if (!rtlpriv->psc.swctrl_lps)return ;
@@ -581,9 +578,9 @@ void rtl_swlps_rf_awake(struct ieee80211_hw *hw)RT_CLEAR_PS_LEVEL (ppsc,RT_PS_LEVEL_ASPM ); } -spin_lock_irqsave (&rtlpriv->locks.lps_lock, flag); +mutex_lock (&rtlpriv->locks.lps_mutex);rtl_ps_set_rf_state (hw,ERFON ,RF_CHANGE_BY_PS ); -spin_unlock_irqrestore (&rtlpriv->locks.lps_lock, flag); +mutex_unlock (&rtlpriv->locks.lps_mutex); }void rtl_swlps_rfon_wq_callback (void *data)
@@ -600,7 +597,6 @@ void rtl_swlps_rf_sleep(struct ieee80211_hw *hw)struct rtl_priv *rtlpriv =rtl_priv (hw);struct rtl_mac *mac =rtl_mac (rtl_priv (hw));struct rtl_ps_ctl *ppsc =rtl_psc (rtl_priv (hw)); -unsigned long flag;u8 sleep_intv;if (!rtlpriv->psc.sw_ps_enabled)
@@ -624,9 +620,9 @@ void rtl_swlps_rf_sleep(struct ieee80211_hw *hw) }spin_unlock (&rtlpriv->locks.rf_ps_lock); -spin_lock_irqsave (&rtlpriv->locks.lps_lock, flag); +mutex_lock (&rtlpriv->locks.lps_mutex);rtl_ps_set_rf_state (hw,ERFSLEEP ,RF_CHANGE_BY_PS ); -spin_unlock_irqrestore (&rtlpriv->locks.lps_lock, flag); +mutex_unlock (&rtlpriv->locks.lps_mutex);if (ppsc->reg_rfps_level &RT_RF_OFF_LEVL_ASPM && !RT_IN_PS_LEVEL (ppsc,RT_PS_LEVEL_ASPM )) {
drivers/net/wireless/realtek/rtlwifi/usb.c +0 -1
@@ -962,7 +962,6 @@ static void _rtl_usb_tx_preprocess(struct ieee80211_hw *hw,memset (&tcb_desc,0 ,sizeof (struct rtl_tcb_desc ));if (ieee80211_is_auth (fc)) {RT_TRACE (rtlpriv,COMP_SEND ,DBG_DMESG ,"MAC80211_LINKING\n" ); -rtl_ips_nic_on (hw); }if (rtlpriv->psc.sw_ps_enabled) {
drivers/net/wireless/realtek/rtlwifi/wifi.h +2 -8
@@ -2325,17 +2325,14 @@ struct rtl_hal_cfg {struct rtl_locks {/* mutex */ struct mutex conf_mutex; -struct mutex ps_mutex; +struct mutex ips_mutex;/* mutex for enter/leave IPS */ +struct mutex lps_mutex;/* mutex for enter/leave LPS */ /*spin lock */ -spinlock_t ips_lock;spinlock_t irq_th_lock; -spinlock_t irq_pci_lock; -spinlock_t tx_lock;spinlock_t h2c_lock;spinlock_t rf_ps_lock;spinlock_t rf_lock; -spinlock_t lps_lock;spinlock_t waitq_lock;spinlock_t entry_list_lock;spinlock_t usb_lock;
@@ -2348,9 +2345,6 @@ struct rtl_locks {/*Dual mac*/ spinlock_t cck_and_rw_pagea_lock; -/*Easy concurrent*/ -spinlock_t check_sendpkt_lock; -spinlock_t iqk_lock; };
Signature · 1 line
2.15.1
Re: [v3, 01/10] rtlwifi: Use mutex to replace spin_lock to protect IPS and LPS
Quoted 15 lines · Ping-Ke Shih
From: Ping-Ke Shih <[email protected]>
Enter/leavel IPS and LPS are large critical section, and they can't use sleep function because running in atomic-context, which own a
spin_lock. In commitba9f93f82aba("rtlwifi: Fix enter/exitpower_save"), it moves LPS functions to thread-context, so this commit can simply change LPS's spin lock to mutex.
Considering IPS functions,rtl_ips_nic_on()may be called by TX tasklet (softirq-context) that check whether packet is auth frame. Fortunately, current mac80211 will ask driver to leave IPS usingop_configwith changed flagIEEE80211_CONF_CHANGE_IDLE, before issuing auth frame, so IPS functions can run in thread-context and use mutex to protect critical section, too.
Also, this commit removes some useless spin locks.
Quoted 1 line
Signed-off-by Ping-Ke Shih <[email protected]>
8 patches applied to wireless-drivers-next.git, thanks.
a3fa3669d18c rtlwifi: Use mutex to replace spin_lock to protect IPS and LPS c8abbe79cce6 rtlwifi: fix scan channel 1 fail after IPS 37e89a0e5aa0 rtlwifi: unlink bss when un-associationa44709bba70f rtlwifi: btcoex: Add power_on_setting routine 40d9dd4f1c5d rtlwifi: btcoex: Remove global variables from btcoex 3afb7da4693c rtlwifi: btcoex: Remove typedef statements b2283dad6bfd rtlwifi: btcoex: Add common function for qeurying BT information 188b6b092e3a rtlwifi: btcoex: add rfe_type parameter to btcoex
Signature · 3 lines
https://patchwork.kernel.org/patch/10168581/ https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
[email protected]
maintainerPATCH v3 2/10 rtlwifi: fix scan channel 1 fail after IPS
In reply to [email protected]From: Ping-Ke Shih <[email protected]>
If there is no connection, driver will enter IPS state. Meanwhile, it fails to scan channel 1 by the command 'iw dev wlan0 scan freq 2412', because hardware channel setting lose after IPS. Thus, restore channel setting from hw->conf.channel set by last rtl_op_config().
--- drivers/net/wireless/realtek/rtlwifi/ps.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/wireless/realtek/rtlwifi/ps.c +5 -0
@@ -51,6 +51,11 @@ bool rtl_ps_enable_nic(struct ieee80211_hw *hw) &rtlmac->retry_long);RT_CLEAR_PS_LEVEL (ppsc,RT_RF_OFF_LEVL_HALT_NIC ); + rtlpriv->cfg->ops->switch_channel (hw); + rtlpriv->cfg->ops->set_channel_access (hw); + rtlpriv->cfg->ops->set_bw_mode (hw, +cfg80211_get_chandef_type (&hw->conf.chandef)); +/*<3> Enable Interrupt */ rtlpriv->cfg->ops->enable_interrupt (hw);
Signature · 1 line
2.15.1
[email protected]
maintainerPATCH v3 3/10 rtlwifi: unlink bss when un-association
In reply to [email protected]From: Tsang-Shian Lin <[email protected]>
When AP change bandwidth setting from 20M to 40M, STA may use old 20M AP information to association with AP. Driver unlink bss in the .bss_info_changed of ieee80211_ops to make sure that later scan can get correct AP bandwidth capability.
--- drivers/net/wireless/realtek/rtlwifi/core.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
drivers/net/wireless/realtek/rtlwifi/core.c +18 -0
@@ -1162,6 +1162,8 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,RT_TRACE (rtlpriv,COMP_MAC80211 ,DBG_DMESG ,"BSS_CHANGED_ASSOC\n" ); }else { +struct cfg80211_bss *bss =NULL ; + mstatus =RT_MEDIA_DISCONNECT ;if (mac->link_state ==MAC80211_LINKED )
@@ -1169,6 +1171,22 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,if (ppsc->p2p_ps_info.p2p_ps_mode >P2P_PS_NONE )rtl_p2p_ps_cmd (hw,P2P_PS_DISABLE ); mac->link_state =MAC80211_NOLINK ; + + bss =cfg80211_get_bss (hw->wiphy,NULL , + (u8 *)mac->bssid,NULL ,0 , +IEEE80211_BSS_TYPE_ESS , +IEEE80211_PRIVACY_OFF ); + +RT_TRACE (rtlpriv,COMP_MAC80211 ,DBG_DMESG , +"bssid = %pMF\n" , mac->bssid); + +if (bss) { +cfg80211_unlink_bss (hw->wiphy, bss); +cfg80211_put_bss (hw->wiphy, bss); +RT_TRACE (rtlpriv,COMP_MAC80211 ,DBG_DMESG , +"cfg80211_unlink !!\n" ); + } +eth_zero_addr (mac->bssid); mac->vendor =PEER_UNKNOWN ; mac->mode =0 ;
Signature · 1 line
2.15.1
[email protected]
maintainerPATCH v3 4/10 rtlwifi: enable mac80211 fast-tx support
In reply to [email protected]From: Ping-Ke Shih <[email protected]>
To enable the mac80211 fast-tx feature, the hw/driver needs to support dynamic power saving and fragmentation. Since our driver does not need to fragment packet into smaller pieces, we just hook an empty callback of set_frag_threshold to avoid fragmentation in mac80211.
After this, the mac80211 will not fragment the packets and can transmit them faster by cache the header information.
--- drivers/net/wireless/realtek/rtlwifi/base.c | 2 ++ drivers/net/wireless/realtek/rtlwifi/core.c | 6 ++++++ 2 files changed, 8 insertions(+)
drivers/net/wireless/realtek/rtlwifi/base.c +2 -0
@@ -395,6 +395,8 @@ static void _rtl_init_mac80211(struct ieee80211_hw *hw)ieee80211_hw_set (hw,CONNECTION_MONITOR );ieee80211_hw_set (hw,MFP_CAPABLE );ieee80211_hw_set (hw,REPORTS_TX_ACK_STATUS ); +ieee80211_hw_set (hw,SUPPORTS_TX_FRAG ); +ieee80211_hw_set (hw,SUPPORT_FAST_XMIT );/* swlps or hwlps has been set in diff chip in init_sw_vars */ if (rtlpriv->psc.swctrl_lps) {
drivers/net/wireless/realtek/rtlwifi/core.c +6 -0
@@ -992,6 +992,11 @@ static int _rtl_get_hal_qnum(u16 queue)return qnum; } +static int rtl_op_set_frag_threshold (struct ieee80211_hw *hw,u32 value) +{ +return -EOPNOTSUPP ; +} +/* *for mac80211 VO = 0, VI = 1, BE = 2, BK = 3 *for rtl819x BE = 0, BK = 1, VI = 2, VO = 3
@@ -1896,6 +1901,7 @@ const struct ieee80211_ops rtl_ops = { .config = rtl_op_config, .configure_filter = rtl_op_configure_filter, .set_key = rtl_op_set_key, + .set_frag_threshold = rtl_op_set_frag_threshold, .conf_tx = rtl_op_conf_tx, .bss_info_changed = rtl_op_bss_info_changed, .get_tsf = rtl_op_get_tsf,
Signature · 1 line
2.15.1
Re: [PATCH v3 04/10] rtlwifi: enable mac80211 fast-tx support
Quoted 9 lines · On 1/17/2018 7:15 AM, [email protected] wrote:
From: Ping-Ke Shih <[email protected]>
To enable the mac80211 fast-tx feature, the hw/driver needs to support dynamic power saving and fragmentation. Since our driver does not need to fragment packet into smaller pieces, we just hook an empty callback of
set_frag_thresholdto avoid fragmentation in mac80211.After this, the mac80211 will not fragment the packets and can transmit them faster by cache the header information.
NACK. Please refer to earlier discussion [1].
Regards,
Arend
[1] https://patchwork.kernel.org/patch/10157389/
Quoted 6 lines
Signed-off-by Yan-Hsuan Chuang <[email protected]>Signed-off-by Ping-Ke Shih <[email protected]>--- drivers/net/wireless/realtek/rtlwifi/base.c | 2 ++ drivers/net/wireless/realtek/rtlwifi/core.c | 6 ++++++ 2 files changed, 8 insertions(+)
Re: [PATCH v3 04/10] rtlwifi: enable mac80211 fast-tx support
Quoted 8 lines · Arend van Spriel
Quoted 7 lines · On 1/17/2018 7:15 AM, [email protected] wrote:
From: Ping-Ke Shih <[email protected]>
To enable the mac80211 fast-tx feature, the hw/driver needs to support dynamic power saving and fragmentation. Since our driver does not need to fragment packet into smaller pieces, we just hook an empty callback of
set_frag_thresholdto avoid fragmentation in mac80211.
Quoted 4 lines
Quoted 2 lines
After this, the mac80211 will not fragment the packets and can transmit them faster by cache the header information.
NACK. Please refer to earlier discussion [1].
I dropped this patch.
Signature · 1 line
Kalle Valo
[email protected]
maintainerPATCH v3 5/10 rtlwifi: Support A-MSDU in A-MPDU capability
In reply to [email protected]From: Steven Ting <[email protected]>
Due to the fact that A-MSDU deaggregation is done in software, we set this flag to support the A-MSDU in A-MPDU
--- drivers/net/wireless/realtek/rtlwifi/base.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/realtek/rtlwifi/base.c +1 -0
@@ -397,6 +397,7 @@ static void _rtl_init_mac80211(struct ieee80211_hw *hw)ieee80211_hw_set (hw,REPORTS_TX_ACK_STATUS );ieee80211_hw_set (hw,SUPPORTS_TX_FRAG );ieee80211_hw_set (hw,SUPPORT_FAST_XMIT ); +ieee80211_hw_set (hw,SUPPORTS_AMSDU_IN_AMPDU );/* swlps or hwlps has been set in diff chip in init_sw_vars */ if (rtlpriv->psc.swctrl_lps) {
Signature · 1 line
2.15.1
Re: [v3,05/10] rtlwifi: Support A-MSDU in A-MPDU capability
Quoted 7 lines · Ping-Ke Shih
From: Steven Ting <[email protected]>
Due to the fact that A-MSDU deaggregation is done in software, we set this flag to support the A-MSDU in A-MPDU
Signed-off-by Steven Ting <[email protected]>Signed-off-by Ping-Ke Shih <[email protected]>
This didn't apply anymore as I had dropped patch 4, please resend.
Patch set to Changes Requested.
Signature · 3 lines
https://patchwork.kernel.org/patch/10168565/ https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
[email protected]
maintainerPATCH v3 6/10 rtlwifi: btcoex: Add power_on_setting routine
In reply to [email protected]From: Ping-Ke Shih <[email protected]>
After mac power-on sequence, wifi will start to work so notify btcoex the event to configure registers especially related to antenna. This will not only help to assign antenna but also to yield better user experience.
--- drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h | 1 + drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c | 6 ++++++ drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.h | 1 + drivers/net/wireless/realtek/rtlwifi/wifi.h | 1 + 4 files changed, 9 insertions(+)
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h +1 -0
@@ -608,6 +608,7 @@ extern struct btc_coexist gl_bt_coexist;bool exhalbtc_initlize_variables (void );bool exhalbtc_bind_bt_coex_withadapter (void *adapter); +void exhalbtc_power_on_setting (struct btc_coexist *btcoexist);void exhalbtc_init_hw_config (struct btc_coexist *btcoexist,bool wifi_only);void exhalbtc_init_coex_dm (struct btc_coexist *btcoexist);void exhalbtc_ips_notify (struct btc_coexist *btcoexist,u8 type);
drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c +6 -0
@@ -32,6 +32,7 @@static struct rtl_btc_ops rtl_btc_operation = { .btc_init_variables = rtl_btc_init_variables, .btc_init_hal_vars = rtl_btc_init_hal_vars, + .btc_power_on_setting = rtl_btc_power_on_setting, .btc_init_hw_config = rtl_btc_init_hw_config, .btc_ips_notify = rtl_btc_ips_notify, .btc_lps_notify = rtl_btc_lps_notify,
@@ -116,6 +117,11 @@ void rtl_btc_init_hal_vars(struct rtl_priv *rtlpriv)*/ } +void rtl_btc_power_on_setting (struct rtl_priv *rtlpriv) +{ +exhalbtc_power_on_setting (&gl_bt_coexist); +} +void rtl_btc_init_hw_config (struct rtl_priv *rtlpriv) {u8 bt_exist;
drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.h +1 -0
@@ -29,6 +29,7 @@void rtl_btc_init_variables (struct rtl_priv *rtlpriv);void rtl_btc_init_hal_vars (struct rtl_priv *rtlpriv); +void rtl_btc_power_on_setting (struct rtl_priv *rtlpriv);void rtl_btc_init_hw_config (struct rtl_priv *rtlpriv);void rtl_btc_ips_notify (struct rtl_priv *rtlpriv,u8 type);void rtl_btc_lps_notify (struct rtl_priv *rtlpriv,u8 type);
drivers/net/wireless/realtek/rtlwifi/wifi.h +1 -0
@@ -2557,6 +2557,7 @@ struct bt_coexist_info {struct rtl_btc_ops {void (*btc_init_variables) (struct rtl_priv *rtlpriv);void (*btc_init_hal_vars) (struct rtl_priv *rtlpriv); +void (*btc_power_on_setting)(struct rtl_priv *rtlpriv);void (*btc_init_hw_config) (struct rtl_priv *rtlpriv);void (*btc_ips_notify) (struct rtl_priv *rtlpriv,u8 type);void (*btc_lps_notify)(struct rtl_priv *rtlpriv,u8 type);
Signature · 1 line
2.15.1
[email protected]
maintainerPATCH v3 7/10 rtlwifi: btcoex: Remove global variables from btcoex
In reply to [email protected]From: Ping-Ke Shih <[email protected]>
Remove global variables, so btcoexist can support multiple instances simultaneously.
--- .../realtek/rtlwifi/btcoexist/halbtcoutsrc.c | 79 ++++----- .../realtek/rtlwifi/btcoexist/halbtcoutsrc.h | 21 +-- .../wireless/realtek/rtlwifi/btcoexist/rtl_btc.c | 182 +++++++++++++++++---- .../wireless/realtek/rtlwifi/btcoexist/rtl_btc.h | 3 +- drivers/net/wireless/realtek/rtlwifi/pci.c | 5 +- drivers/net/wireless/realtek/rtlwifi/wifi.h | 5 +- 6 files changed, 217 insertions(+), 78 deletions(-)
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c +42 -37
@@ -25,14 +25,6 @@#include "halbt_precomp.h" -/*********************************************** -* Global variables -***********************************************/ - -struct btc_coexist gl_bt_coexist; - -u32 btc_dbg_type[BTC_MSG_MAX ]; -/*************************************************** * Debug related function ***************************************************/
@@ -970,9 +962,12 @@ bool halbtc_under_ips(struct btc_coexist *btcoexist)/***************************************************************** * Extern functions called by other module *****************************************************************/ -bool exhalbtc_initlize_variables (void ) +bool exhalbtc_initlize_variables (struct rtl_priv *rtlpriv) { -struct btc_coexist *btcoexist = &gl_bt_coexist; +struct btc_coexist *btcoexist =rtl_btc_coexist (rtlpriv); + +if (!btcoexist) +return false;halbtc_dbg_init ();
@@ -1008,9 +1003,12 @@ bool exhalbtc_initlize_variables(void)bool exhalbtc_bind_bt_coex_withadapter (void *adapter) { -struct btc_coexist *btcoexist = &gl_bt_coexist;struct rtl_priv *rtlpriv = adapter; -u8 ant_num =2 , chip_type; +struct btc_coexist *btcoexist =rtl_btc_coexist (rtlpriv); +u8 ant_num =2 , chip_type, single_ant_path =0 ; + +if (!btcoexist) +return false;if (btcoexist->binded)return false;
@@ -1041,10 +1039,16 @@ bool exhalbtc_bind_bt_coex_withadapter(void *adapter) btcoexist->bt_info.miracast_plus_bt = false; chip_type =rtl_get_hwpg_bt_type (rtlpriv); -exhalbtc_set_chip_type (chip_type); +exhalbtc_set_chip_type (btcoexist, chip_type); ant_num =rtl_get_hwpg_ant_num (rtlpriv);exhalbtc_set_ant_num (rtlpriv,BT_COEX_ANT_TYPE_PG , ant_num); +/* set default antenna position to main port */ + btcoexist->board_info.btdm_ant_pos =BTC_ANTENNA_AT_MAIN_PORT ; + + single_ant_path =rtl_get_hwpg_single_ant_path (rtlpriv); +exhalbtc_set_single_ant_path (btcoexist, single_ant_path); +if (rtl_get_hwpg_package_type (rtlpriv) ==0 ) btcoexist->board_info.tfbga_package = false;else if (rtl_get_hwpg_package_type (rtlpriv) ==1 )
@@ -1549,30 +1553,25 @@ void exhalbtc_stack_update_profile_info(void) { } -void exhalbtc_update_min_bt_rssi (s8 bt_rssi) +void exhalbtc_update_min_bt_rssi (struct btc_coexist *btcoexist,s8 bt_rssi) { -struct btc_coexist *btcoexist = &gl_bt_coexist; -if (!halbtc_is_bt_coexist_available (btcoexist))return ; btcoexist->stack_info.min_bt_rssi = bt_rssi; } -void exhalbtc_set_hci_version (u16 hci_version) +void exhalbtc_set_hci_version (struct btc_coexist *btcoexist,u16 hci_version) { -struct btc_coexist *btcoexist = &gl_bt_coexist; -if (!halbtc_is_bt_coexist_available (btcoexist))return ; btcoexist->stack_info.hci_version = hci_version; } -void exhalbtc_set_bt_patch_version (u16 bt_hci_version,u16 bt_patch_version) +void exhalbtc_set_bt_patch_version (struct btc_coexist *btcoexist, +u16 bt_hci_version,u16 bt_patch_version) { -struct btc_coexist *btcoexist = &gl_bt_coexist; -if (!halbtc_is_bt_coexist_available (btcoexist))return ;
@@ -1580,7 +1579,7 @@ void exhalbtc_set_bt_patch_version(u16 bt_hci_version, u16 bt_patch_version) btcoexist->bt_info.bt_hci_ver = bt_hci_version; } -void exhalbtc_set_chip_type (u8 chip_type) +void exhalbtc_set_chip_type (struct btc_coexist *btcoexist,u8 chip_type) {switch (chip_type) {default :
@@ -1588,48 +1587,54 @@ void exhalbtc_set_chip_type(u8 chip_type)case BT_ISSC_3WIRE :case BT_ACCEL :case BT_RTL8756 : - gl_bt_coexist.board_info.bt_chip_type =BTC_CHIP_UNDEF ; + btcoexist->board_info.bt_chip_type =BTC_CHIP_UNDEF ;break ;case BT_CSR_BC4 : - gl_bt_coexist.board_info.bt_chip_type =BTC_CHIP_CSR_BC4 ; + btcoexist->board_info.bt_chip_type =BTC_CHIP_CSR_BC4 ;break ;case BT_CSR_BC8 : - gl_bt_coexist.board_info.bt_chip_type =BTC_CHIP_CSR_BC8 ; + btcoexist->board_info.bt_chip_type =BTC_CHIP_CSR_BC8 ;break ;case BT_RTL8723A : - gl_bt_coexist.board_info.bt_chip_type =BTC_CHIP_RTL8723A ; + btcoexist->board_info.bt_chip_type =BTC_CHIP_RTL8723A ;break ;case BT_RTL8821A : - gl_bt_coexist.board_info.bt_chip_type =BTC_CHIP_RTL8821 ; + btcoexist->board_info.bt_chip_type =BTC_CHIP_RTL8821 ;break ;case BT_RTL8723B : - gl_bt_coexist.board_info.bt_chip_type =BTC_CHIP_RTL8723B ; + btcoexist->board_info.bt_chip_type =BTC_CHIP_RTL8723B ;break ; } }void exhalbtc_set_ant_num (struct rtl_priv *rtlpriv,u8 type,u8 ant_num) { +struct btc_coexist *btcoexist =rtl_btc_coexist (rtlpriv); + +if (!btcoexist) +return ; +if (BT_COEX_ANT_TYPE_PG == type) { - gl_bt_coexist.board_info.pg_ant_num = ant_num; - gl_bt_coexist.board_info.btdm_ant_num = ant_num; + btcoexist->board_info.pg_ant_num = ant_num; + btcoexist->board_info.btdm_ant_num = ant_num; }else if (BT_COEX_ANT_TYPE_ANTDIV == type) { - gl_bt_coexist.board_info.btdm_ant_num = ant_num; + btcoexist->board_info.btdm_ant_num = ant_num; }else if (type ==BT_COEX_ANT_TYPE_DETECTED ) { - gl_bt_coexist.board_info.btdm_ant_num = ant_num; + btcoexist->board_info.btdm_ant_num = ant_num;if (rtlpriv->cfg->mod_params->ant_sel ==1 ) - gl_bt_coexist.board_info.btdm_ant_pos = + btcoexist->board_info.btdm_ant_pos =BTC_ANTENNA_AT_AUX_PORT ;else - gl_bt_coexist.board_info.btdm_ant_pos = + btcoexist->board_info.btdm_ant_pos =BTC_ANTENNA_AT_MAIN_PORT ; } }/* Currently used by 8723b only, S0 or S1 */ -void exhalbtc_set_single_ant_path (u8 single_ant_path) +void exhalbtc_set_single_ant_path (struct btc_coexist *btcoexist, +u8 single_ant_path) { - gl_bt_coexist.board_info.single_ant_path = single_ant_path; + btcoexist->board_info.single_ant_path = single_ant_path; } void exhalbtc_display_bt_coex_info(struct btc_coexist *btcoexist,
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h +11 -10
@@ -103,8 +103,6 @@ enum btc_msg_type { BTC_MSG_MAX }; -extern u32 btc_dbg_type[]; -/* following is for BTC_MSG_INTERFACE */ #define INTF_INIT BIT0#define INTF_NOTIFY BIT2
@@ -604,9 +602,10 @@ struct btc_coexist {bool halbtc_is_wifi_uplink (struct rtl_priv *adapter); -extern struct btc_coexist gl_bt_coexist; +#define rtl_btc_coexist (rtlpriv) \ + ((struct btc_coexist *)((rtlpriv)->btcoexist.btc_context)) -bool exhalbtc_initlize_variables (void ); +bool exhalbtc_initlize_variables (struct rtl_priv *rtlpriv);bool exhalbtc_bind_bt_coex_withadapter (void *adapter);void exhalbtc_power_on_setting (struct btc_coexist *btcoexist);void exhalbtc_init_hw_config (struct btc_coexist *btcoexist,bool wifi_only);
@@ -628,11 +627,12 @@ void exhalbtc_periodical(struct btc_coexist *btcoexist);void exhalbtc_dbg_control (struct btc_coexist *btcoexist,u8 code,u8 len,u8 *data);void exhalbtc_stack_update_profile_info (void ); -void exhalbtc_set_hci_version (u16 hci_version); -void exhalbtc_set_bt_patch_version (u16 bt_hci_version,u16 bt_patch_version); -void exhalbtc_update_min_bt_rssi (s8 bt_rssi); -void exhalbtc_set_bt_exist (bool bt_exist); -void exhalbtc_set_chip_type (u8 chip_type); +void exhalbtc_set_hci_version (struct btc_coexist *btcoexist,u16 hci_version); +void exhalbtc_set_bt_patch_version (struct btc_coexist *btcoexist, +u16 bt_hci_version,u16 bt_patch_version); +void exhalbtc_update_min_bt_rssi (struct btc_coexist *btcoexist,s8 bt_rssi); +void exhalbtc_set_bt_exist (struct btc_coexist *btcoexist,bool bt_exist); +void exhalbtc_set_chip_type (struct btc_coexist *btcoexist,u8 chip_type);void exhalbtc_set_ant_num (struct rtl_priv *rtlpriv,u8 type,u8 ant_num);void exhalbtc_display_bt_coex_info (struct btc_coexist *btcoexist,struct seq_file *m);
@@ -640,6 +640,7 @@ void exhalbtc_signal_compensation(struct btc_coexist *btcoexist, u8 *rssi_wifi, u8 *rssi_bt);void exhalbtc_lps_leave (struct btc_coexist *btcoexist);void exhalbtc_low_wifi_traffic_notify (struct btc_coexist *btcoexist); -void exhalbtc_set_single_ant_path (u8 single_ant_path); +void exhalbtc_set_single_ant_path (struct btc_coexist *btcoexist, +u8 single_ant_path);#endif
drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c +154 -28
318 lines not on this page · raw message
drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.h +2 -1
@@ -28,6 +28,7 @@#include "halbt_precomp.h" void rtl_btc_init_variables (struct rtl_priv *rtlpriv); +void rtl_btc_deinit_variables (struct rtl_priv *rtlpriv);void rtl_btc_init_hal_vars (struct rtl_priv *rtlpriv);void rtl_btc_power_on_setting (struct rtl_priv *rtlpriv);void rtl_btc_init_hw_config (struct rtl_priv *rtlpriv);
@@ -38,7 +39,7 @@ void rtl_btc_connect_notify(struct rtl_priv *rtlpriv, u8 action);void rtl_btc_mediastatus_notify (struct rtl_priv *rtlpriv,enum rt_media_status mstatus);void rtl_btc_periodical (struct rtl_priv *rtlpriv); -void rtl_btc_halt_notify (void ); +void rtl_btc_halt_notify (struct rtl_priv *rtlpriv);void rtl_btc_btinfo_notify (struct rtl_priv *rtlpriv,u8 *tmpbuf,u8 length);void rtl_btc_btmpinfo_notify (struct rtl_priv *rtlpriv,u8 *tmp_buf,u8 length);bool rtl_btc_is_limited_dig (struct rtl_priv *rtlpriv);
drivers/net/wireless/realtek/rtlwifi/pci.c +4 -1
@@ -1841,7 +1841,10 @@ static void rtl_pci_stop(struct ieee80211_hw *hw)u8 rf_timeout =0 ;if (rtlpriv->cfg->ops->get_btc_status ()) - rtlpriv->btcoexist.btc_ops->btc_halt_notify (); + rtlpriv->btcoexist.btc_ops->btc_halt_notify (rtlpriv); + +if (rtlpriv->btcoexist.btc_ops) + rtlpriv->btcoexist.btc_ops->btc_deinit_variables (rtlpriv);/*should be before disable interrupt&adapter *and will do it immediately.
drivers/net/wireless/realtek/rtlwifi/wifi.h +4 -1
@@ -2500,6 +2500,8 @@ struct rtl_btc_info {struct bt_coexist_info {struct rtl_btc_ops *btc_ops;struct rtl_btc_info btc_info; +/* btc context */ +void *btc_context;/* EEPROM BT info. */ u8 eeprom_bt_coexist;u8 eeprom_bt_type;
@@ -2556,6 +2558,7 @@ struct bt_coexist_info {struct rtl_btc_ops {void (*btc_init_variables) (struct rtl_priv *rtlpriv); +void (*btc_deinit_variables)(struct rtl_priv *rtlpriv);void (*btc_init_hal_vars) (struct rtl_priv *rtlpriv);void (*btc_power_on_setting)(struct rtl_priv *rtlpriv);void (*btc_init_hw_config) (struct rtl_priv *rtlpriv);
@@ -2566,7 +2569,7 @@ struct rtl_btc_ops {void (*btc_mediastatus_notify) (struct rtl_priv *rtlpriv,enum rt_media_status mstatus);void (*btc_periodical) (struct rtl_priv *rtlpriv); -void (*btc_halt_notify) (void ); +void (*btc_halt_notify)(struct rtl_priv *rtlpriv);void (*btc_btinfo_notify) (struct rtl_priv *rtlpriv,u8 *tmp_buf,u8 length); void (*btc_btmpinfo_notify)(struct rtl_priv *rtlpriv,
Signature · 1 line
2.15.1
[email protected]
maintainerPATCH v3 8/10 rtlwifi: btcoex: Remove typedef statements
In reply to [email protected]From: Larry Finger <[email protected]>
Each of these typedefs are only referenced in a single location later in this header. Thus, they are easily removed.
--- .../realtek/rtlwifi/btcoexist/halbtcoutsrc.h | 98 +++++++--------------- 1 file changed, 31 insertions(+), 67 deletions(-)
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h +31 -67
@@ -421,50 +421,6 @@ enum btc_notify_type_stack_operation {BTC_STACK_OP_MAX }; -typedef u8 (*bfp_btc_r1 )(void *btc_context,u32 reg_addr); - -typedef u16 (*bfp_btc_r2 )(void *btc_context,u32 reg_addr); - -typedef u32 (*bfp_btc_r4 )(void *btc_context,u32 reg_addr); - -typedef void (*bfp_btc_w1 )(void *btc_context,u32 reg_addr,u32 data); - -typedef void (*bfp_btc_w1_bit_mak )(void *btc_context,u32 reg_addr, -u32 bit_mask,u8 data1b); - -typedef void (*bfp_btc_w2 )(void *btc_context,u32 reg_addr,u16 data); - -typedef void (*bfp_btc_w4 )(void *btc_context,u32 reg_addr,u32 data); - -typedef void (*bfp_btc_local_reg_w1 )(void *btc_context,u32 reg_addr,u8 data); -typedef void (*bfp_btc_wr_1byte_bit_mask )(void *btc_context,u32 reg_addr, -u8 bit_mask,u8 data); - -typedef void (*bfp_btc_set_bb_reg )(void *btc_context,u32 reg_addr, -u32 bit_mask,u32 data); - -typedef u32 (*bfp_btc_get_bb_reg )(void *btc_context,u32 reg_addr, -u32 bit_mask); - -typedef void (*bfp_btc_set_rf_reg )(void *btc_context,u8 rf_path,u32 reg_addr, -u32 bit_mask,u32 data); - -typedef u32 (*bfp_btc_get_rf_reg )(void *btc_context,u8 rf_path, -u32 reg_addr,u32 bit_mask); - -typedef void (*bfp_btc_fill_h2c )(void *btc_context,u8 element_id, -u32 cmd_len,u8 *cmd_buffer); - -typedef bool (*bfp_btc_get )(void *btcoexist,u8 get_type,void *out_buf); - -typedef bool (*bfp_btc_set )(void *btcoexist,u8 set_type,void *in_buf); - -typedef void (*bfp_btc_set_bt_reg )(void *btc_context,u8 reg_type,u32 offset, -u32 value); - -typedef void (*bfp_btc_disp_dbg_msg )(void *btcoexist,u8 disp_type, -struct seq_file *m); -struct btc_bt_info {bool bt_disabled;u8 rssi_adjust_for_agc_table_on;
@@ -575,29 +531,37 @@ struct btc_coexist {u8 pwr_mode_val[10 ];/* function pointers - io related */ -bfp_btc_r1 btc_read_1byte; -bfp_btc_w1 btc_write_1byte; -bfp_btc_w1_bit_mak btc_write_1byte_bitmask; -bfp_btc_r2 btc_read_2byte; -bfp_btc_w2 btc_write_2byte; -bfp_btc_r4 btc_read_4byte; -bfp_btc_w4 btc_write_4byte; -bfp_btc_local_reg_w1 btc_write_local_reg_1byte; - -bfp_btc_set_bb_reg btc_set_bb_reg; -bfp_btc_get_bb_reg btc_get_bb_reg; - -bfp_btc_set_rf_reg btc_set_rf_reg; -bfp_btc_get_rf_reg btc_get_rf_reg; - -bfp_btc_fill_h2c btc_fill_h2c; - -bfp_btc_disp_dbg_msg btc_disp_dbg_msg; - -bfp_btc_get btc_get; -bfp_btc_set btc_set; - -bfp_btc_set_bt_reg btc_set_bt_reg; +u8 (*btc_read_1byte)(void *btc_context,u32 reg_addr); +void (*btc_write_1byte)(void *btc_context,u32 reg_addr,u32 data); +void (*btc_write_1byte_bitmask)(void *btc_context,u32 reg_addr, +u32 bit_mask,u8 data1b); +u16 (*btc_read_2byte)(void *btc_context,u32 reg_addr); +void (*btc_write_2byte)(void *btc_context,u32 reg_addr,u16 data); +u32 (*btc_read_4byte)(void *btc_context,u32 reg_addr); +void (*btc_write_4byte)(void *btc_context,u32 reg_addr,u32 data); + +void (*btc_write_local_reg_1byte)(void *btc_context,u32 reg_addr, +u8 data); +void (*btc_set_bb_reg)(void *btc_context,u32 reg_addr, +u32 bit_mask,u32 data); +u32 (*btc_get_bb_reg)(void *btc_context,u32 reg_addr, +u32 bit_mask); +void (*btc_set_rf_reg)(void *btc_context,u8 rf_path,u32 reg_addr, +u32 bit_mask,u32 data); +u32 (*btc_get_rf_reg)(void *btc_context,u8 rf_path, +u32 reg_addr,u32 bit_mask); + +void (*btc_fill_h2c)(void *btc_context,u8 element_id, +u32 cmd_len,u8 *cmd_buffer); + +void (*btc_disp_dbg_msg)(void *btcoexist,u8 disp_type, +struct seq_file *m); + +bool (*btc_get)(void *btcoexist,u8 get_type,void *out_buf); +bool (*btc_set)(void *btcoexist,u8 set_type,void *in_buf); + +void (*btc_set_bt_reg)(void *btc_context,u8 reg_type,u32 offset, +u32 value); };bool halbtc_is_wifi_uplink (struct rtl_priv *adapter);
Signature · 1 line
2.15.1
[email protected]
maintainerPATCH v3 9/10 rtlwifi: btcoex: Add common function for qeurying BT information
In reply to [email protected]From: Ping-Ke Shih <[email protected]>
This commit implement the common function to sort old features, and add more new features that are get_supported_feature, get_supported_version, get_ant_det_val, ble_scan_type, ble_scan_para, bt_dev_info, forbidden_slot_val, afh_map and etc.
--- .../realtek/rtlwifi/btcoexist/halbtcoutsrc.c | 309 ++++++++++++++++++--- .../realtek/rtlwifi/btcoexist/halbtcoutsrc.h | 56 ++++ .../wireless/realtek/rtlwifi/btcoexist/rtl_btc.c | 48 +++- 3 files changed, 380 insertions(+), 33 deletions(-)
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c +277 -32
@@ -207,6 +207,102 @@ u8 rtl_get_hwpg_package_type(struct rtl_priv *rtlpriv)return rtlhal->package_type; } +static +bool halbtc_is_hw_mailbox_exist (struct btc_coexist *btcoexist) +{ +if (IS_HARDWARE_TYPE_8812 (btcoexist->adapter)) +return false; +else +return true; +} + +static +bool halbtc_send_bt_mp_operation (struct btc_coexist *btcoexist,u8 op_code, +u8 *cmd,u32 len,unsigned long wait_ms) +{ +struct rtl_priv *rtlpriv; +const u8 oper_ver =0 ; +u8 req_num; + +if (!halbtc_is_hw_mailbox_exist (btcoexist)) +return false; + +if (wait_ms)/* before h2c to avoid race condition */ +reinit_completion (&btcoexist->bt_mp_comp); + + rtlpriv = btcoexist->adapter; + +/* fill req_num by op_code, and rtl_btc_btmpinfo_notify() use it +* to know message type +*/ +switch (op_code) { +case BT_OP_GET_BT_VERSION : + req_num =BT_SEQ_GET_BT_VERSION ; +break ; +case BT_OP_GET_AFH_MAP_L : + req_num =BT_SEQ_GET_AFH_MAP_L ; +break ; +case BT_OP_GET_AFH_MAP_M : + req_num =BT_SEQ_GET_AFH_MAP_M ; +break ; +case BT_OP_GET_AFH_MAP_H : + req_num =BT_SEQ_GET_AFH_MAP_H ; +break ; +case BT_OP_GET_BT_COEX_SUPPORTED_FEATURE : + req_num =BT_SEQ_GET_BT_COEX_SUPPORTED_FEATURE ; +break ; +case BT_OP_GET_BT_COEX_SUPPORTED_VERSION : + req_num =BT_SEQ_GET_BT_COEX_SUPPORTED_VERSION ; +break ; +case BT_OP_GET_BT_ANT_DET_VAL : + req_num =BT_SEQ_GET_BT_ANT_DET_VAL ; +break ; +case BT_OP_GET_BT_BLE_SCAN_PARA : + req_num =BT_SEQ_GET_BT_BLE_SCAN_PARA ; +break ; +case BT_OP_GET_BT_BLE_SCAN_TYPE : + req_num =BT_SEQ_GET_BT_BLE_SCAN_TYPE ; +break ; +case BT_OP_GET_BT_DEVICE_INFO : + req_num =BT_SEQ_GET_BT_DEVICE_INFO ; +break ; +case BT_OP_GET_BT_FORBIDDEN_SLOT_VAL : + req_num =BT_SEQ_GET_BT_FORB_SLOT_VAL ; +break ; +case BT_OP_WRITE_REG_ADDR : +case BT_OP_WRITE_REG_VALUE : +case BT_OP_READ_REG : +default : + req_num =BT_SEQ_DONT_CARE ; +break ; + } + + cmd[0 ] |= (oper_ver &0x0f );/* Set OperVer */ + cmd[0 ] |= ((req_num <<4 ) &0xf0 );/* Set ReqNum */ + cmd[1 ] = op_code; + rtlpriv->cfg->ops->fill_h2c_cmd (rtlpriv->mac80211.hw,0x67 , len, cmd); + +/* wait? */ +if (!wait_ms) +return true; + +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"btmpinfo wait req_num=%d wait=%ld\n" , req_num, wait_ms); + +if (in_interrupt ()) +return false; + +if (wait_for_completion_timeout (&btcoexist->bt_mp_comp, +msecs_to_jiffies (wait_ms)) ==0 ) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_DMESG , +"btmpinfo wait (req_num=%d) timeout\n" , req_num); + +return false;/* timeout */ + } + +return true; +} +static void halbtc_leave_lps (struct btc_coexist *btcoexist) {struct rtl_priv *rtlpriv;
@@ -334,24 +430,79 @@ static void halbtc_aggregation_check(struct btc_coexist *btcoexist)static u32 halbtc_get_bt_patch_version (struct btc_coexist *btcoexist) { -struct rtl_priv *rtlpriv = btcoexist->adapter;u8 cmd_buffer[4 ] = {0 }; -u8 oper_ver =0 ; -u8 req_num =0x0E ;if (btcoexist->bt_info.bt_real_fw_ver) goto label_done; - cmd_buffer[0 ] |= (oper_ver &0x0f );/* Set OperVer */ - cmd_buffer[0 ] |= ((req_num <<4 ) &0xf0 );/* Set ReqNum */ - cmd_buffer[1 ] =0 ;/* BT_OP_GET_BT_VERSION = 0 */ - rtlpriv->cfg->ops->fill_h2c_cmd (rtlpriv->mac80211.hw,0x67 ,4 , - &cmd_buffer[0 ]); +/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ +halbtc_send_bt_mp_operation (btcoexist,BT_OP_GET_BT_VERSION , + cmd_buffer,4 ,200 ); label_done:return btcoexist->bt_info.bt_real_fw_ver; } +static u32 halbtc_get_bt_coex_supported_feature (void *btc_context) +{ +struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context; +u8 cmd_buffer[4 ] = {0 }; + +if (btcoexist->bt_info.bt_supported_feature) + goto label_done; + +/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ +halbtc_send_bt_mp_operation (btcoexist, +BT_OP_GET_BT_COEX_SUPPORTED_FEATURE , + cmd_buffer,4 ,200 ); + +label_done: +return btcoexist->bt_info.bt_supported_feature; +} + +static u32 halbtc_get_bt_coex_supported_version (void *btc_context) +{ +struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context; +u8 cmd_buffer[4 ] = {0 }; + +if (btcoexist->bt_info.bt_supported_version) + goto label_done; + +/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ +halbtc_send_bt_mp_operation (btcoexist, +BT_OP_GET_BT_COEX_SUPPORTED_VERSION , + cmd_buffer,4 ,200 ); + +label_done: +return btcoexist->bt_info.bt_supported_version; +} + +static u32 halbtc_get_bt_device_info (void *btc_context) +{ +struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context; +u8 cmd_buffer[4 ] = {0 }; + +/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ +halbtc_send_bt_mp_operation (btcoexist, +BT_OP_GET_BT_DEVICE_INFO , + cmd_buffer,4 ,200 ); + +return btcoexist->bt_info.bt_device_info; +} + +static u32 halbtc_get_bt_forbidden_slot_val (void *btc_context) +{ +struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context; +u8 cmd_buffer[4 ] = {0 }; + +/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ +halbtc_send_bt_mp_operation (btcoexist, +BT_OP_GET_BT_FORBIDDEN_SLOT_VAL , + cmd_buffer,4 ,200 ); + +return btcoexist->bt_info.bt_forb_slot_val; +} +u32 halbtc_get_wifi_link_status (struct btc_coexist *btcoexist) {/* return value:
@@ -513,6 +664,18 @@ static bool halbtc_get(void *void_btcoexist, u8 get_type, void *out_buf)case BTC_GET_U4_VENDOR : *u32_tmp =BTC_VENDOR_OTHER ;break ; +case BTC_GET_U4_SUPPORTED_VERSION : + *u32_tmp =halbtc_get_bt_coex_supported_version (btcoexist); +break ; +case BTC_GET_U4_SUPPORTED_FEATURE : + *u32_tmp =halbtc_get_bt_coex_supported_feature (btcoexist); +break ; +case BTC_GET_U4_BT_DEVICE_INFO : + *u32_tmp =halbtc_get_bt_device_info (btcoexist); +break ; +case BTC_GET_U4_BT_FORBIDDEN_SLOT_VAL : + *u32_tmp =halbtc_get_bt_forbidden_slot_val (btcoexist); +break ;case BTC_GET_U1_WIFI_DOT11_CHNL : *u8_tmp = rtlphy->current_channel;break ;
@@ -893,32 +1056,20 @@ static void halbtc_fill_h2c_cmd(void *bt_context, u8 element_id,void halbtc_set_bt_reg (void *btc_context,u8 reg_type,u32 offset,u32 set_val) {struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context; -struct rtl_priv *rtlpriv = btcoexist->adapter;u8 cmd_buffer1[4 ] = {0 };u8 cmd_buffer2[4 ] = {0 }; -u8 *addr_to_set = (u8 *)&offset; -u8 *value_to_set = (u8 *)&set_val; -u8 oper_ver =0 ; -u8 req_num =0 ; -if (IS_HARDWARE_TYPE_8723B (btcoexist->adapter)) { - cmd_buffer1[0 ] |= (oper_ver &0x0f );/* Set OperVer */ - cmd_buffer1[0 ] |= ((req_num <<4 ) &0xf0 );/* Set ReqNum */ - cmd_buffer1[1 ] =0x0d ;/* OpCode: BT_LO_OP_WRITE_REG_VALUE */ - cmd_buffer1[2 ] = value_to_set[0 ];/* Set WriteRegValue */ - rtlpriv->cfg->ops->fill_h2c_cmd (rtlpriv->mac80211.hw,0x67 ,4 , - &cmd_buffer1[0 ]); - -msleep (200 ); - req_num++; - - cmd_buffer2[0 ] |= (oper_ver &0x0f );/* Set OperVer */ - cmd_buffer2[0 ] |= ((req_num <<4 ) &0xf0 );/* Set ReqNum */ - cmd_buffer2[1 ] =0x0c ;/* OpCode: BT_LO_OP_WRITE_REG_ADDR */ - cmd_buffer2[3 ] = addr_to_set[0 ];/* Set WriteRegAddr */ - rtlpriv->cfg->ops->fill_h2c_cmd (rtlpriv->mac80211.hw,0x67 ,4 , - &cmd_buffer2[0 ]); - } +/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ + *((__le16 *)&cmd_buffer1[2 ]) =cpu_to_le16 ((u16 )set_val); +if (!halbtc_send_bt_mp_operation (btcoexist,BT_OP_WRITE_REG_VALUE , + cmd_buffer1,4 ,200 )) +return ; + +/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ + cmd_buffer2[2 ] = reg_type; + *((u8 *)&cmd_buffer2[3 ]) = (u8 )offset; +halbtc_send_bt_mp_operation (btcoexist,BT_OP_WRITE_REG_ADDR , + cmd_buffer2,4 ,200 ); } static void halbtc_display_dbg_msg(void *bt_context, u8 disp_type,
@@ -959,6 +1110,86 @@ bool halbtc_under_ips(struct btc_coexist *btcoexist)return false; } +static u8 halbtc_get_ant_det_val_from_bt (void *btc_context) +{ +struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context; +u8 cmd_buffer[4 ] = {0 }; + +/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ +halbtc_send_bt_mp_operation (btcoexist,BT_OP_GET_BT_ANT_DET_VAL , + cmd_buffer,4 ,200 ); + +/* need wait completion to return correct value */ + +return btcoexist->bt_info.bt_ant_det_val; +} + +static u8 halbtc_get_ble_scan_type_from_bt (void *btc_context) +{ +struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context; +u8 cmd_buffer[4 ] = {0 }; + +/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ +halbtc_send_bt_mp_operation (btcoexist,BT_OP_GET_BT_BLE_SCAN_TYPE , + cmd_buffer,4 ,200 ); + +/* need wait completion to return correct value */ + +return btcoexist->bt_info.bt_ble_scan_type; +} + +static u32 halbtc_get_ble_scan_para_from_bt (void *btc_context,u8 scan_type) +{ +struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context; +u8 cmd_buffer[4 ] = {0 }; + +/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ +halbtc_send_bt_mp_operation (btcoexist,BT_OP_GET_BT_BLE_SCAN_PARA , + cmd_buffer,4 ,200 ); + +/* need wait completion to return correct value */ + +return btcoexist->bt_info.bt_ble_scan_para; +} + +static bool halbtc_get_bt_afh_map_from_bt (void *btc_context,u8 map_type, +u8 *afh_map) +{ +struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context; +u8 cmd_buffer[2 ] = {0 }; +bool ret; +u32 *afh_map_l = (u32 *)afh_map; +u32 *afh_map_m = (u32 *)(afh_map +4 ); +u16 *afh_map_h = (u16 *)(afh_map +8 ); + +/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ + ret =halbtc_send_bt_mp_operation (btcoexist,BT_OP_GET_AFH_MAP_L , + cmd_buffer,2 ,200 ); +if (!ret) + goto exit; + + *afh_map_l = btcoexist->bt_info.afh_map_l; + +/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ + ret =halbtc_send_bt_mp_operation (btcoexist,BT_OP_GET_AFH_MAP_M , + cmd_buffer,2 ,200 ); +if (!ret) + goto exit; + + *afh_map_m = btcoexist->bt_info.afh_map_m; + +/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ + ret =halbtc_send_bt_mp_operation (btcoexist,BT_OP_GET_AFH_MAP_H , + cmd_buffer,2 ,200 ); +if (!ret) + goto exit; + + *afh_map_h = btcoexist->bt_info.afh_map_h; + +exit: +return ret; +} +/***************************************************************** * Extern functions called by other module *****************************************************************/
@@ -993,11 +1224,25 @@ bool exhalbtc_initlize_variables(struct rtl_priv *rtlpriv) btcoexist->btc_set = halbtc_set; btcoexist->btc_set_bt_reg = halbtc_set_bt_reg; - btcoexist->bt_info.bt_ctrl_buf_size = false; btcoexist->bt_info.agg_buf_size =5 ; btcoexist->bt_info.increase_scan_dev_num = false; + + btcoexist->btc_get_bt_coex_supported_feature = + halbtc_get_bt_coex_supported_feature; + btcoexist->btc_get_bt_coex_supported_version = + halbtc_get_bt_coex_supported_version; + btcoexist->btc_get_ant_det_val_from_bt = halbtc_get_ant_det_val_from_bt; + btcoexist->btc_get_ble_scan_type_from_bt = + halbtc_get_ble_scan_type_from_bt; + btcoexist->btc_get_ble_scan_para_from_bt = + halbtc_get_ble_scan_para_from_bt; + btcoexist->btc_get_bt_afh_map_from_bt = + halbtc_get_bt_afh_map_from_bt; + +init_completion (&btcoexist->bt_mp_comp); +return true; }
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h +56 -0
86 lines not on this page · raw message
drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c +47 -1
68 lines not on this page · raw message
Signature · 1 line
2.15.1
[email protected]
maintainerPATCH v3 10/10 rtlwifi: btcoex: add rfe_type parameter to btcoex
In reply to [email protected]From: Ping-Ke Shih <[email protected]>
btcoex configure antenna by rfe_type that is RF type programmed in efuse.
--- drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c | 10 ++++++++++ drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h | 2 ++ 2 files changed, 12 insertions(+)
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c +10 -0
@@ -207,6 +207,14 @@ u8 rtl_get_hwpg_package_type(struct rtl_priv *rtlpriv)return rtlhal->package_type; } +static +u8 rtl_get_hwpg_rfe_type (struct rtl_priv *rtlpriv) +{ +struct rtl_hal *rtlhal =rtl_hal (rtlpriv); + +return rtlhal->rfe_type; +} +static bool halbtc_is_hw_mailbox_exist (struct btc_coexist *btcoexist) {
@@ -1308,6 +1316,8 @@ bool exhalbtc_bind_bt_coex_withadapter(void *adapter)RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD ,"[BTCoex], Package Type = Non-TFBGA\n" ); + btcoexist->board_info.rfe_type =rtl_get_hwpg_rfe_type (rtlpriv); +return true; }
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h +2 -0
@@ -151,6 +151,8 @@ struct btc_board_info {u8 btdm_ant_pos;u8 single_ant_path;/* current used for 8723b only, 1=>s0, 0=>s1 */ bool tfbga_package; + +u8 rfe_type; };enum btc_dbg_opcode {
Signature · 1 line
2.15.1