aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rtlwifi/core.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/rtlwifi/core.c')
-rw-r--r--drivers/net/wireless/rtlwifi/core.c72
1 files changed, 70 insertions, 2 deletions
diff --git a/drivers/net/wireless/rtlwifi/core.c b/drivers/net/wireless/rtlwifi/core.c
index 5fc6f52641bd..a31a12775f1a 100644
--- a/drivers/net/wireless/rtlwifi/core.c
+++ b/drivers/net/wireless/rtlwifi/core.c
@@ -95,7 +95,8 @@ void rtl_bb_delay(struct ieee80211_hw *hw, u32 addr, u32 data)
95} 95}
96EXPORT_SYMBOL(rtl_bb_delay); 96EXPORT_SYMBOL(rtl_bb_delay);
97 97
98void rtl_fw_cb(const struct firmware *firmware, void *context) 98static void rtl_fw_do_work(const struct firmware *firmware, void *context,
99 bool is_wow)
99{ 100{
100 struct ieee80211_hw *hw = context; 101 struct ieee80211_hw *hw = context;
101 struct rtl_priv *rtlpriv = rtl_priv(hw); 102 struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -125,12 +126,31 @@ found_alt:
125 release_firmware(firmware); 126 release_firmware(firmware);
126 return; 127 return;
127 } 128 }
128 memcpy(rtlpriv->rtlhal.pfirmware, firmware->data, firmware->size); 129 if (!is_wow) {
130 memcpy(rtlpriv->rtlhal.pfirmware, firmware->data,
131 firmware->size);
132 rtlpriv->rtlhal.fwsize = firmware->size;
133 } else {
134 memcpy(rtlpriv->rtlhal.wowlan_firmware, firmware->data,
135 firmware->size);
136 rtlpriv->rtlhal.wowlan_fwsize = firmware->size;
137 }
129 rtlpriv->rtlhal.fwsize = firmware->size; 138 rtlpriv->rtlhal.fwsize = firmware->size;
130 release_firmware(firmware); 139 release_firmware(firmware);
131} 140}
141
142void rtl_fw_cb(const struct firmware *firmware, void *context)
143{
144 rtl_fw_do_work(firmware, context, false);
145}
132EXPORT_SYMBOL(rtl_fw_cb); 146EXPORT_SYMBOL(rtl_fw_cb);
133 147
148void rtl_wowlan_fw_cb(const struct firmware *firmware, void *context)
149{
150 rtl_fw_do_work(firmware, context, true);
151}
152EXPORT_SYMBOL(rtl_wowlan_fw_cb);
153
134/*mutex for start & stop is must here. */ 154/*mutex for start & stop is must here. */
135static int rtl_op_start(struct ieee80211_hw *hw) 155static int rtl_op_start(struct ieee80211_hw *hw)
136{ 156{
@@ -990,6 +1010,16 @@ static int rtl_op_conf_tx(struct ieee80211_hw *hw,
990 return 0; 1010 return 0;
991} 1011}
992 1012
1013static void send_beacon_frame(struct ieee80211_hw *hw,
1014 struct ieee80211_vif *vif)
1015{
1016 struct rtl_priv *rtlpriv = rtl_priv(hw);
1017 struct sk_buff *skb = ieee80211_beacon_get(hw, vif);
1018
1019 if (skb)
1020 rtlpriv->intf_ops->adapter_tx(hw, NULL, skb, NULL);
1021}
1022
993static void rtl_op_bss_info_changed(struct ieee80211_hw *hw, 1023static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
994 struct ieee80211_vif *vif, 1024 struct ieee80211_vif *vif,
995 struct ieee80211_bss_conf *bss_conf, 1025 struct ieee80211_bss_conf *bss_conf,
@@ -1020,6 +1050,7 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
1020 1050
1021 if (rtlpriv->cfg->ops->linked_set_reg) 1051 if (rtlpriv->cfg->ops->linked_set_reg)
1022 rtlpriv->cfg->ops->linked_set_reg(hw); 1052 rtlpriv->cfg->ops->linked_set_reg(hw);
1053 send_beacon_frame(hw, vif);
1023 } 1054 }
1024 } 1055 }
1025 if ((changed & BSS_CHANGED_BEACON_ENABLED && 1056 if ((changed & BSS_CHANGED_BEACON_ENABLED &&
@@ -1851,3 +1882,40 @@ bool rtl_btc_status_false(void)
1851 return false; 1882 return false;
1852} 1883}
1853EXPORT_SYMBOL_GPL(rtl_btc_status_false); 1884EXPORT_SYMBOL_GPL(rtl_btc_status_false);
1885
1886void rtl_dm_diginit(struct ieee80211_hw *hw, u32 cur_igvalue)
1887{
1888 struct rtl_priv *rtlpriv = rtl_priv(hw);
1889 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
1890
1891 dm_digtable->dig_enable_flag = true;
1892 dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX;
1893 dm_digtable->cur_igvalue = cur_igvalue;
1894 dm_digtable->pre_igvalue = 0;
1895 dm_digtable->cur_sta_cstate = DIG_STA_DISCONNECT;
1896 dm_digtable->presta_cstate = DIG_STA_DISCONNECT;
1897 dm_digtable->curmultista_cstate = DIG_MULTISTA_DISCONNECT;
1898 dm_digtable->rssi_lowthresh = DM_DIG_THRESH_LOW;
1899 dm_digtable->rssi_highthresh = DM_DIG_THRESH_HIGH;
1900 dm_digtable->fa_lowthresh = DM_FALSEALARM_THRESH_LOW;
1901 dm_digtable->fa_highthresh = DM_FALSEALARM_THRESH_HIGH;
1902 dm_digtable->rx_gain_max = DM_DIG_MAX;
1903 dm_digtable->rx_gain_min = DM_DIG_MIN;
1904 dm_digtable->back_val = DM_DIG_BACKOFF_DEFAULT;
1905 dm_digtable->back_range_max = DM_DIG_BACKOFF_MAX;
1906 dm_digtable->back_range_min = DM_DIG_BACKOFF_MIN;
1907 dm_digtable->pre_cck_cca_thres = 0xff;
1908 dm_digtable->cur_cck_cca_thres = 0x83;
1909 dm_digtable->forbidden_igi = DM_DIG_MIN;
1910 dm_digtable->large_fa_hit = 0;
1911 dm_digtable->recover_cnt = 0;
1912 dm_digtable->dig_min_0 = 0x25;
1913 dm_digtable->dig_min_1 = 0x25;
1914 dm_digtable->media_connect_0 = false;
1915 dm_digtable->media_connect_1 = false;
1916 rtlpriv->dm.dm_initialgain_enable = true;
1917 dm_digtable->bt30_cur_igi = 0x32;
1918 dm_digtable->pre_cck_pd_state = CCK_PD_STAGE_MAX;
1919 dm_digtable->cur_cck_pd_state = CCK_PD_STAGE_LOWRSSI;
1920}
1921EXPORT_SYMBOL(rtl_dm_diginit);