1 /******************************************************************************
3 * Copyright(c) 2009-2013 Realtek Corporation.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
22 * Larry Finger <Larry.Finger@lwfinger.net>
24 *****************************************************************************/
26 #include <linux/vmalloc.h>
27 #include <linux/module.h>
30 #include "halbt_precomp.h"
32 static struct rtl_btc_ops rtl_btc_operation
= {
33 .btc_init_variables
= rtl_btc_init_variables
,
34 .btc_init_hal_vars
= rtl_btc_init_hal_vars
,
35 .btc_init_hw_config
= rtl_btc_init_hw_config
,
36 .btc_ips_notify
= rtl_btc_ips_notify
,
37 .btc_lps_notify
= rtl_btc_lps_notify
,
38 .btc_scan_notify
= rtl_btc_scan_notify
,
39 .btc_connect_notify
= rtl_btc_connect_notify
,
40 .btc_mediastatus_notify
= rtl_btc_mediastatus_notify
,
41 .btc_periodical
= rtl_btc_periodical
,
42 .btc_halt_notify
= rtl_btc_halt_notify
,
43 .btc_btinfo_notify
= rtl_btc_btinfo_notify
,
44 .btc_is_limited_dig
= rtl_btc_is_limited_dig
,
45 .btc_is_disable_edca_turbo
= rtl_btc_is_disable_edca_turbo
,
46 .btc_is_bt_disabled
= rtl_btc_is_bt_disabled
,
47 .btc_special_packet_notify
= rtl_btc_special_packet_notify
,
50 void rtl_btc_init_variables(struct rtl_priv
*rtlpriv
)
52 exhalbtc_initlize_variables(rtlpriv
);
55 void rtl_btc_init_hal_vars(struct rtl_priv
*rtlpriv
)
61 ant_num
= rtl_get_hwpg_ant_num(rtlpriv
);
62 RT_TRACE(rtlpriv
, COMP_INIT
, DBG_DMESG
,
63 "%s, antNum is %d\n", __func__
, ant_num
);
65 bt_exist
= rtl_get_hwpg_bt_exist(rtlpriv
);
66 RT_TRACE(rtlpriv
, COMP_INIT
, DBG_DMESG
,
67 "%s, bt_exist is %d\n", __func__
, bt_exist
);
68 exhalbtc_set_bt_exist(bt_exist
);
70 bt_type
= rtl_get_hwpg_bt_type(rtlpriv
);
71 RT_TRACE(rtlpriv
, COMP_INIT
, DBG_DMESG
, "%s, bt_type is %d\n",
73 exhalbtc_set_chip_type(bt_type
);
75 exhalbtc_set_ant_num(BT_COEX_ANT_TYPE_PG
, ant_num
);
78 void rtl_btc_init_hw_config(struct rtl_priv
*rtlpriv
)
80 exhalbtc_init_hw_config(&gl_bt_coexist
);
81 exhalbtc_init_coex_dm(&gl_bt_coexist
);
84 void rtl_btc_ips_notify(struct rtl_priv
*rtlpriv
, u8 type
)
86 exhalbtc_ips_notify(&gl_bt_coexist
, type
);
89 void rtl_btc_lps_notify(struct rtl_priv
*rtlpriv
, u8 type
)
91 exhalbtc_lps_notify(&gl_bt_coexist
, type
);
94 void rtl_btc_scan_notify(struct rtl_priv
*rtlpriv
, u8 scantype
)
96 exhalbtc_scan_notify(&gl_bt_coexist
, scantype
);
99 void rtl_btc_connect_notify(struct rtl_priv
*rtlpriv
, u8 action
)
101 exhalbtc_connect_notify(&gl_bt_coexist
, action
);
104 void rtl_btc_mediastatus_notify(struct rtl_priv
*rtlpriv
,
105 enum rt_media_status mstatus
)
107 exhalbtc_mediastatus_notify(&gl_bt_coexist
, mstatus
);
110 void rtl_btc_periodical(struct rtl_priv
*rtlpriv
)
112 /*rtl_bt_dm_monitor();*/
113 exhalbtc_periodical(&gl_bt_coexist
);
116 void rtl_btc_halt_notify(void)
118 exhalbtc_halt_notify(&gl_bt_coexist
);
121 void rtl_btc_btinfo_notify(struct rtl_priv
*rtlpriv
, u8
*tmp_buf
, u8 length
)
123 exhalbtc_bt_info_notify(&gl_bt_coexist
, tmp_buf
, length
);
126 bool rtl_btc_is_limited_dig(struct rtl_priv
*rtlpriv
)
128 return gl_bt_coexist
.bt_info
.limited_dig
;
131 bool rtl_btc_is_disable_edca_turbo(struct rtl_priv
*rtlpriv
)
133 bool bt_change_edca
= false;
135 u32 edca_bt_hs_uplink
= 0x5ea42b, edca_bt_hs_downlink
= 0x5ea42b;
137 u32 edca_addr
= 0x504;
139 cur_edca_val
= rtl_read_dword(rtlpriv
, edca_addr
);
140 if (halbtc_is_wifi_uplink(rtlpriv
)) {
141 if (cur_edca_val
!= edca_bt_hs_uplink
) {
142 edca_hs
= edca_bt_hs_uplink
;
143 bt_change_edca
= true;
146 if (cur_edca_val
!= edca_bt_hs_downlink
) {
147 edca_hs
= edca_bt_hs_downlink
;
148 bt_change_edca
= true;
153 rtl_write_dword(rtlpriv
, edca_addr
, edca_hs
);
158 bool rtl_btc_is_bt_disabled(struct rtl_priv
*rtlpriv
)
160 /* It seems 'bt_disabled' is never be initialized or set. */
161 if (gl_bt_coexist
.bt_info
.bt_disabled
)
167 void rtl_btc_special_packet_notify(struct rtl_priv
*rtlpriv
, u8 pkt_type
)
169 return exhalbtc_special_packet_notify(&gl_bt_coexist
, pkt_type
);
172 struct rtl_btc_ops
*rtl_btc_get_ops_pointer(void)
174 return &rtl_btc_operation
;
176 EXPORT_SYMBOL(rtl_btc_get_ops_pointer
);
178 u8
rtl_get_hwpg_ant_num(struct rtl_priv
*rtlpriv
)
182 if (rtlpriv
->btcoexist
.btc_info
.ant_num
== ANT_X2
)
190 enum rt_media_status
mgnt_link_status_query(struct ieee80211_hw
*hw
)
192 struct rtl_priv
*rtlpriv
= rtl_priv(hw
);
193 struct rtl_mac
*mac
= rtl_mac(rtl_priv(hw
));
194 enum rt_media_status m_status
= RT_MEDIA_DISCONNECT
;
196 u8 bibss
= (mac
->opmode
== NL80211_IFTYPE_ADHOC
) ? 1 : 0;
198 if (bibss
|| rtlpriv
->mac80211
.link_state
>= MAC80211_LINKED
)
199 m_status
= RT_MEDIA_CONNECT
;
204 u8
rtl_get_hwpg_bt_exist(struct rtl_priv
*rtlpriv
)
206 return rtlpriv
->btcoexist
.btc_info
.btcoexist
;
209 u8
rtl_get_hwpg_bt_type(struct rtl_priv
*rtlpriv
)
211 return rtlpriv
->btcoexist
.btc_info
.bt_type
;
214 MODULE_AUTHOR("Page He <page_he@realsil.com.cn>");
215 MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>");
216 MODULE_AUTHOR("Larry Finger <Larry.FInger@lwfinger.net>");
217 MODULE_LICENSE("GPL");
218 MODULE_DESCRIPTION("Realtek 802.11n PCI wireless core");
220 static int __init
rtl_btcoexist_module_init(void)
225 static void __exit
rtl_btcoexist_module_exit(void)
230 module_init(rtl_btcoexist_module_init
);
231 module_exit(rtl_btcoexist_module_exit
);