linux/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c
<<
>>
Prefs
   1/******************************************************************************
   2 *
   3 * Copyright(c) 2009-2013  Realtek Corporation.
   4 *
   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.
   8 *
   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
  12 * more details.
  13 *
  14 * The full GNU General Public License is included in this distribution in the
  15 * file called LICENSE.
  16 *
  17 * Contact Information:
  18 * wlanfae <wlanfae@realtek.com>
  19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
  20 * Hsinchu 300, Taiwan.
  21 *
  22 * Larry Finger <Larry.Finger@lwfinger.net>
  23 *
  24 *****************************************************************************/
  25#include "../wifi.h"
  26#include <linux/vmalloc.h>
  27#include <linux/module.h>
  28
  29#include "rtl_btc.h"
  30#include "halbt_precomp.h"
  31
  32static 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,
  48};
  49
  50void rtl_btc_init_variables(struct rtl_priv *rtlpriv)
  51{
  52        exhalbtc_initlize_variables(rtlpriv);
  53}
  54
  55void rtl_btc_init_hal_vars(struct rtl_priv *rtlpriv)
  56{
  57        u8 ant_num;
  58        u8 bt_exist;
  59        u8 bt_type;
  60
  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);
  64
  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);
  69
  70        bt_type = rtl_get_hwpg_bt_type(rtlpriv);
  71        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "%s, bt_type is %d\n",
  72                 __func__, bt_type);
  73        exhalbtc_set_chip_type(bt_type);
  74
  75        exhalbtc_set_ant_num(BT_COEX_ANT_TYPE_PG, ant_num);
  76}
  77
  78void rtl_btc_init_hw_config(struct rtl_priv *rtlpriv)
  79{
  80        exhalbtc_init_hw_config(&gl_bt_coexist);
  81        exhalbtc_init_coex_dm(&gl_bt_coexist);
  82}
  83
  84void rtl_btc_ips_notify(struct rtl_priv *rtlpriv, u8 type)
  85{
  86        exhalbtc_ips_notify(&gl_bt_coexist, type);
  87}
  88
  89void rtl_btc_lps_notify(struct rtl_priv *rtlpriv, u8 type)
  90{
  91        exhalbtc_lps_notify(&gl_bt_coexist, type);
  92}
  93
  94void rtl_btc_scan_notify(struct rtl_priv *rtlpriv, u8 scantype)
  95{
  96        exhalbtc_scan_notify(&gl_bt_coexist, scantype);
  97}
  98
  99void rtl_btc_connect_notify(struct rtl_priv *rtlpriv, u8 action)
 100{
 101        exhalbtc_connect_notify(&gl_bt_coexist, action);
 102}
 103
 104void rtl_btc_mediastatus_notify(struct rtl_priv *rtlpriv,
 105                                enum rt_media_status mstatus)
 106{
 107        exhalbtc_mediastatus_notify(&gl_bt_coexist, mstatus);
 108}
 109
 110void rtl_btc_periodical(struct rtl_priv *rtlpriv)
 111{
 112        /*rtl_bt_dm_monitor();*/
 113        exhalbtc_periodical(&gl_bt_coexist);
 114}
 115
 116void rtl_btc_halt_notify(void)
 117{
 118        exhalbtc_halt_notify(&gl_bt_coexist);
 119}
 120
 121void rtl_btc_btinfo_notify(struct rtl_priv *rtlpriv, u8 *tmp_buf, u8 length)
 122{
 123        exhalbtc_bt_info_notify(&gl_bt_coexist, tmp_buf, length);
 124}
 125
 126bool rtl_btc_is_limited_dig(struct rtl_priv *rtlpriv)
 127{
 128        return gl_bt_coexist.bt_info.limited_dig;
 129}
 130
 131bool rtl_btc_is_disable_edca_turbo(struct rtl_priv *rtlpriv)
 132{
 133        bool bt_change_edca = false;
 134        u32 cur_edca_val;
 135        u32 edca_bt_hs_uplink = 0x5ea42b, edca_bt_hs_downlink = 0x5ea42b;
 136        u32 edca_hs;
 137        u32 edca_addr = 0x504;
 138
 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;
 144                }
 145        } else {
 146                if (cur_edca_val != edca_bt_hs_downlink) {
 147                        edca_hs = edca_bt_hs_downlink;
 148                        bt_change_edca = true;
 149                }
 150        }
 151
 152        if (bt_change_edca)
 153                rtl_write_dword(rtlpriv, edca_addr, edca_hs);
 154
 155        return true;
 156}
 157
 158bool rtl_btc_is_bt_disabled(struct rtl_priv *rtlpriv)
 159{
 160        /* It seems 'bt_disabled' is never be initialized or set. */
 161        if (gl_bt_coexist.bt_info.bt_disabled)
 162                return true;
 163        else
 164                return false;
 165}
 166
 167void rtl_btc_special_packet_notify(struct rtl_priv *rtlpriv, u8 pkt_type)
 168{
 169        return exhalbtc_special_packet_notify(&gl_bt_coexist, pkt_type);
 170}
 171
 172struct rtl_btc_ops *rtl_btc_get_ops_pointer(void)
 173{
 174        return &rtl_btc_operation;
 175}
 176EXPORT_SYMBOL(rtl_btc_get_ops_pointer);
 177
 178u8 rtl_get_hwpg_ant_num(struct rtl_priv *rtlpriv)
 179{
 180        u8 num;
 181
 182        if (rtlpriv->btcoexist.btc_info.ant_num == ANT_X2)
 183                num = 2;
 184        else
 185                num = 1;
 186
 187        return num;
 188}
 189
 190enum rt_media_status mgnt_link_status_query(struct ieee80211_hw *hw)
 191{
 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;
 195
 196        u8 bibss = (mac->opmode == NL80211_IFTYPE_ADHOC) ? 1 : 0;
 197
 198        if (bibss || rtlpriv->mac80211.link_state >= MAC80211_LINKED)
 199                m_status = RT_MEDIA_CONNECT;
 200
 201        return m_status;
 202}
 203
 204u8 rtl_get_hwpg_bt_exist(struct rtl_priv *rtlpriv)
 205{
 206        return rtlpriv->btcoexist.btc_info.btcoexist;
 207}
 208
 209u8 rtl_get_hwpg_bt_type(struct rtl_priv *rtlpriv)
 210{
 211        return rtlpriv->btcoexist.btc_info.bt_type;
 212}
 213
 214MODULE_AUTHOR("Page He  <page_he@realsil.com.cn>");
 215MODULE_AUTHOR("Realtek WlanFAE  <wlanfae@realtek.com>");
 216MODULE_AUTHOR("Larry Finger     <Larry.FInger@lwfinger.net>");
 217MODULE_LICENSE("GPL");
 218MODULE_DESCRIPTION("Realtek 802.11n PCI wireless core");
 219
 220static int __init rtl_btcoexist_module_init(void)
 221{
 222        return 0;
 223}
 224
 225static void __exit rtl_btcoexist_module_exit(void)
 226{
 227        return;
 228}
 229
 230module_init(rtl_btcoexist_module_init);
 231module_exit(rtl_btcoexist_module_exit);
 232