diff options
Diffstat (limited to 'drivers/net/wireless/rtlwifi/core.c')
-rw-r--r-- | drivers/net/wireless/rtlwifi/core.c | 72 |
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 | } |
96 | EXPORT_SYMBOL(rtl_bb_delay); | 96 | EXPORT_SYMBOL(rtl_bb_delay); |
97 | 97 | ||
98 | void rtl_fw_cb(const struct firmware *firmware, void *context) | 98 | static 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 | |||
142 | void rtl_fw_cb(const struct firmware *firmware, void *context) | ||
143 | { | ||
144 | rtl_fw_do_work(firmware, context, false); | ||
145 | } | ||
132 | EXPORT_SYMBOL(rtl_fw_cb); | 146 | EXPORT_SYMBOL(rtl_fw_cb); |
133 | 147 | ||
148 | void rtl_wowlan_fw_cb(const struct firmware *firmware, void *context) | ||
149 | { | ||
150 | rtl_fw_do_work(firmware, context, true); | ||
151 | } | ||
152 | EXPORT_SYMBOL(rtl_wowlan_fw_cb); | ||
153 | |||
134 | /*mutex for start & stop is must here. */ | 154 | /*mutex for start & stop is must here. */ |
135 | static int rtl_op_start(struct ieee80211_hw *hw) | 155 | static 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 | ||
1013 | static 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 | |||
993 | static void rtl_op_bss_info_changed(struct ieee80211_hw *hw, | 1023 | static 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 | } |
1853 | EXPORT_SYMBOL_GPL(rtl_btc_status_false); | 1884 | EXPORT_SYMBOL_GPL(rtl_btc_status_false); |
1885 | |||
1886 | void 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 | } | ||
1921 | EXPORT_SYMBOL(rtl_dm_diginit); | ||