aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rtlwifi/rtl8192ee/sw.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2014-10-05 21:34:39 -0400
committerDavid S. Miller <davem@davemloft.net>2014-10-05 21:34:39 -0400
commita4b4a2b7f98a45c71a906b1126cabea6446a9905 (patch)
tree0d501e78aeb9df90172a9435d673f31bf89290eb /drivers/net/wireless/rtlwifi/rtl8192ee/sw.c
parent61b37d2f54961b336a47a501e797a05df20c3b30 (diff)
parent3f08e47291879fb047d7d4464d2beaedfea4eb63 (diff)
Merge tag 'master-2014-10-02' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next
John W. Linville says: ==================== pull request: wireless-next 2014-10-03 Please pull tihs batch of updates intended for the 3.18 stream! For the iwlwifi bits, Emmanuel says: "I have here a few things that depend on the latest mac80211's changes: RRM, TPC, Quiet Period etc... Eyal keeps improving our rate control and we have a new device ID. This last patch should probably have gone to wireless.git, but at that stage, I preferred to send it to -next and CC stable." For (most of) the Atheros bits, Kalle says: "The only new feature is testmode support from me. Ben added a new method to crash the firmware with an assert for debug purposes. As usual, we have lots of smaller fixes from Michal. Matteo fixed a Kconfig dependency with debugfs. I fixed some warnings recently added to checkpatch." For the NFC bits, Samuel says: "We've had major updates for TI and ST Microelectronics drivers, and a few NCI related changes. For TI's trf7970a driver: - Target mode support for trf7970a - Suspend/resume support for trf7970a - DT properties additions to handle different quirks - A bunch of fixes for smartphone IOP related issues For ST Microelectronics' ST21NFCA and ST21NFCB drivers: - ISO15693 support for st21nfcb - checkpatch and sparse related warning fixes - Code cleanups and a few minor fixes Finally, Marvell added ISO15693 support to the NCI stack, together with a couple of NCI fixes." For the Bluetooth bits, Johan says: "This 3.18 pull request replaces the one I did on Monday ("bluetooth-next 2014-09-22", which hasn't been pulled yet). The additions since the last request are: - SCO connection fix for devices not supporting eSCO - Cleanups regarding the SCO establishment logic - Remove unnecessary return value from logging functions - Header compression fix for 6lowpan - Cleanups to the ieee802154/mrf24j40 driver Here's a copy from previous request that this one replaces: ' Here are some more patches for 3.18. They include various fixes to the btusb HCI driver, a fix for LE SMP, as well as adding Jukka to the MAINTAINERS file for generic 6LoWPAN (as requested by Alexander Aring). I've held on to this pull request a bit since we were waiting for a SCO related fix to get sorted out first. However, since the merge window is getting closer I decided not to wait for it. If we do get the fix sorted out there'll probably be a second small pull request later this week. '" And, "Unless 3.17 gets delayed this will probably be our last -next pull request for 3.18. We've got: - New Marvell hardware supportr - Multicast support for 6lowpan - Several of 6lowpan fixes & cleanups - Fix for a (false-positive) lockdep warning in L2CAP - Minor btusb cleanup" On top of all that comes the usual sort of updates to ath5k, ath9k, ath10k, brcmfmac, mwifiex, and wil6210. This time around there are also a number of rtlwifi updates to enable some new hardware and to reconcile the in-kernel drivers with some newer releases of the Realtek vendor drivers. Also of note is some device tree work for the bcma bus. Please let me know if there are problems! ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/wireless/rtlwifi/rtl8192ee/sw.c')
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/sw.c399
1 files changed, 399 insertions, 0 deletions
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/sw.c b/drivers/net/wireless/rtlwifi/rtl8192ee/sw.c
new file mode 100644
index 000000000000..9b5a7d5be121
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/sw.c
@@ -0,0 +1,399 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 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
26#include "../wifi.h"
27#include "../core.h"
28#include "../pci.h"
29#include "reg.h"
30#include "def.h"
31#include "phy.h"
32#include "dm.h"
33#include "hw.h"
34#include "sw.h"
35#include "fw.h"
36#include "trx.h"
37#include "led.h"
38#include "table.h"
39
40#include "../btcoexist/rtl_btc.h"
41
42#include <linux/vmalloc.h>
43#include <linux/module.h>
44
45static void rtl92ee_init_aspm_vars(struct ieee80211_hw *hw)
46{
47 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
48
49 /*close ASPM for AMD defaultly */
50 rtlpci->const_amdpci_aspm = 0;
51
52 /**
53 * ASPM PS mode.
54 * 0 - Disable ASPM,
55 * 1 - Enable ASPM without Clock Req,
56 * 2 - Enable ASPM with Clock Req,
57 * 3 - Alwyas Enable ASPM with Clock Req,
58 * 4 - Always Enable ASPM without Clock Req.
59 * set defult to RTL8192CE:3 RTL8192E:2
60 */
61 rtlpci->const_pci_aspm = 3;
62
63 /*Setting for PCI-E device */
64 rtlpci->const_devicepci_aspm_setting = 0x03;
65
66 /*Setting for PCI-E bridge */
67 rtlpci->const_hostpci_aspm_setting = 0x02;
68
69 /**
70 * In Hw/Sw Radio Off situation.
71 * 0 - Default,
72 * 1 - From ASPM setting without low Mac Pwr,
73 * 2 - From ASPM setting with low Mac Pwr,
74 * 3 - Bus D3
75 * set default to RTL8192CE:0 RTL8192SE:2
76 */
77 rtlpci->const_hwsw_rfoff_d3 = 0;
78
79 /**
80 * This setting works for those device with
81 * backdoor ASPM setting such as EPHY setting.
82 * 0 - Not support ASPM,
83 * 1 - Support ASPM,
84 * 2 - According to chipset.
85 */
86 rtlpci->const_support_pciaspm = 1;
87}
88
89int rtl92ee_init_sw_vars(struct ieee80211_hw *hw)
90{
91 struct rtl_priv *rtlpriv = rtl_priv(hw);
92 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
93 int err = 0;
94
95 rtl92ee_bt_reg_init(hw);
96 rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support;
97 rtlpriv->btcoexist.btc_ops = rtl_btc_get_ops_pointer();
98
99 rtlpriv->dm.dm_initialgain_enable = 1;
100 rtlpriv->dm.dm_flag = 0;
101 rtlpriv->dm.disable_framebursting = 0;
102 rtlpci->transmit_config = CFENDFORM | BIT(15);
103
104 /*just 2.4G band*/
105 rtlpriv->rtlhal.current_bandtype = BAND_ON_2_4G;
106 rtlpriv->rtlhal.bandset = BAND_ON_2_4G;
107 rtlpriv->rtlhal.macphymode = SINGLEMAC_SINGLEPHY;
108
109 rtlpci->receive_config = (RCR_APPFCS |
110 RCR_APP_MIC |
111 RCR_APP_ICV |
112 RCR_APP_PHYST_RXFF |
113 RCR_HTC_LOC_CTRL |
114 RCR_AMF |
115 RCR_ACF |
116 RCR_ADF |
117 RCR_AICV |
118 RCR_ACRC32 |
119 RCR_AB |
120 RCR_AM |
121 RCR_APM |
122 0);
123
124 rtlpci->irq_mask[0] = (u32)(IMR_PSTIMEOUT |
125 IMR_C2HCMD |
126 IMR_HIGHDOK |
127 IMR_MGNTDOK |
128 IMR_BKDOK |
129 IMR_BEDOK |
130 IMR_VIDOK |
131 IMR_VODOK |
132 IMR_RDU |
133 IMR_ROK |
134 0);
135 rtlpci->irq_mask[1] = (u32)(IMR_RXFOVW | 0);
136
137 /* for debug level */
138 rtlpriv->dbg.global_debuglevel = rtlpriv->cfg->mod_params->debug;
139 /* for LPS & IPS */
140 rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps;
141 rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps;
142 rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps;
143 rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support;
144 if (rtlpriv->cfg->mod_params->disable_watchdog)
145 pr_info("watchdog disabled\n");
146 rtlpriv->psc.reg_fwctrl_lps = 3;
147 rtlpriv->psc.reg_max_lps_awakeintvl = 5;
148 /* for ASPM, you can close aspm through
149 * set const_support_pciaspm = 0
150 */
151 rtl92ee_init_aspm_vars(hw);
152
153 if (rtlpriv->psc.reg_fwctrl_lps == 1)
154 rtlpriv->psc.fwctrl_psmode = FW_PS_MIN_MODE;
155 else if (rtlpriv->psc.reg_fwctrl_lps == 2)
156 rtlpriv->psc.fwctrl_psmode = FW_PS_MAX_MODE;
157 else if (rtlpriv->psc.reg_fwctrl_lps == 3)
158 rtlpriv->psc.fwctrl_psmode = FW_PS_DTIM_MODE;
159
160 /* for early mode */
161 rtlpriv->rtlhal.earlymode_enable = false;
162
163 /*low power */
164 rtlpriv->psc.low_power_enable = false;
165
166 /* for firmware buf */
167 rtlpriv->rtlhal.pfirmware = vzalloc(0x8000);
168 if (!rtlpriv->rtlhal.pfirmware) {
169 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
170 "Can't alloc buffer for fw\n");
171 return 1;
172 }
173
174 /* request fw */
175 rtlpriv->cfg->fw_name = "rtlwifi/rtl8192eefw.bin";
176
177 rtlpriv->max_fw_size = 0x8000;
178 pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name);
179 err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name,
180 rtlpriv->io.dev, GFP_KERNEL, hw,
181 rtl_fw_cb);
182 if (err) {
183 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
184 "Failed to request firmware!\n");
185 return 1;
186 }
187
188 return 0;
189}
190
191void rtl92ee_deinit_sw_vars(struct ieee80211_hw *hw)
192{
193 struct rtl_priv *rtlpriv = rtl_priv(hw);
194
195 if (rtlpriv->rtlhal.pfirmware) {
196 vfree(rtlpriv->rtlhal.pfirmware);
197 rtlpriv->rtlhal.pfirmware = NULL;
198 }
199}
200
201/* get bt coexist status */
202bool rtl92ee_get_btc_status(void)
203{
204 return true;
205}
206
207static struct rtl_hal_ops rtl8192ee_hal_ops = {
208 .init_sw_vars = rtl92ee_init_sw_vars,
209 .deinit_sw_vars = rtl92ee_deinit_sw_vars,
210 .read_eeprom_info = rtl92ee_read_eeprom_info,
211 .interrupt_recognized = rtl92ee_interrupt_recognized,/*need check*/
212 .hw_init = rtl92ee_hw_init,
213 .hw_disable = rtl92ee_card_disable,
214 .hw_suspend = rtl92ee_suspend,
215 .hw_resume = rtl92ee_resume,
216 .enable_interrupt = rtl92ee_enable_interrupt,
217 .disable_interrupt = rtl92ee_disable_interrupt,
218 .set_network_type = rtl92ee_set_network_type,
219 .set_chk_bssid = rtl92ee_set_check_bssid,
220 .set_qos = rtl92ee_set_qos,
221 .set_bcn_reg = rtl92ee_set_beacon_related_registers,
222 .set_bcn_intv = rtl92ee_set_beacon_interval,
223 .update_interrupt_mask = rtl92ee_update_interrupt_mask,
224 .get_hw_reg = rtl92ee_get_hw_reg,
225 .set_hw_reg = rtl92ee_set_hw_reg,
226 .update_rate_tbl = rtl92ee_update_hal_rate_tbl,
227 .pre_fill_tx_bd_desc = rtl92ee_pre_fill_tx_bd_desc,
228 .rx_desc_buff_remained_cnt = rtl92ee_rx_desc_buff_remained_cnt,
229 .rx_check_dma_ok = rtl92ee_rx_check_dma_ok,
230 .fill_tx_desc = rtl92ee_tx_fill_desc,
231 .fill_tx_cmddesc = rtl92ee_tx_fill_cmddesc,
232 .query_rx_desc = rtl92ee_rx_query_desc,
233 .set_channel_access = rtl92ee_update_channel_access_setting,
234 .radio_onoff_checking = rtl92ee_gpio_radio_on_off_checking,
235 .set_bw_mode = rtl92ee_phy_set_bw_mode,
236 .switch_channel = rtl92ee_phy_sw_chnl,
237 .dm_watchdog = rtl92ee_dm_watchdog,
238 .scan_operation_backup = rtl92ee_phy_scan_operation_backup,
239 .set_rf_power_state = rtl92ee_phy_set_rf_power_state,
240 .led_control = rtl92ee_led_control,
241 .set_desc = rtl92ee_set_desc,
242 .get_desc = rtl92ee_get_desc,
243 .is_tx_desc_closed = rtl92ee_is_tx_desc_closed,
244 .tx_polling = rtl92ee_tx_polling,
245 .enable_hw_sec = rtl92ee_enable_hw_security_config,
246 .set_key = rtl92ee_set_key,
247 .init_sw_leds = rtl92ee_init_sw_leds,
248 .get_bbreg = rtl92ee_phy_query_bb_reg,
249 .set_bbreg = rtl92ee_phy_set_bb_reg,
250 .get_rfreg = rtl92ee_phy_query_rf_reg,
251 .set_rfreg = rtl92ee_phy_set_rf_reg,
252 .fill_h2c_cmd = rtl92ee_fill_h2c_cmd,
253 .get_btc_status = rtl92ee_get_btc_status,
254 .rx_command_packet = rtl92ee_rx_command_packet,
255};
256
257static struct rtl_mod_params rtl92ee_mod_params = {
258 .sw_crypto = false,
259 .inactiveps = false,
260 .swctrl_lps = false,
261 .fwctrl_lps = true,
262 .msi_support = true,
263 .debug = DBG_EMERG,
264};
265
266static struct rtl_hal_cfg rtl92ee_hal_cfg = {
267 .bar_id = 2,
268 .write_readback = true,
269 .name = "rtl92ee_pci",
270 .fw_name = "rtlwifi/rtl8192eefw.bin",
271 .ops = &rtl8192ee_hal_ops,
272 .mod_params = &rtl92ee_mod_params,
273
274 .maps[SYS_ISO_CTRL] = REG_SYS_ISO_CTRL,
275 .maps[SYS_FUNC_EN] = REG_SYS_FUNC_EN,
276 .maps[SYS_CLK] = REG_SYS_CLKR,
277 .maps[MAC_RCR_AM] = AM,
278 .maps[MAC_RCR_AB] = AB,
279 .maps[MAC_RCR_ACRC32] = ACRC32,
280 .maps[MAC_RCR_ACF] = ACF,
281 .maps[MAC_RCR_AAP] = AAP,
282 .maps[MAC_HIMR] = REG_HIMR,
283 .maps[MAC_HIMRE] = REG_HIMRE,
284
285 .maps[EFUSE_ACCESS] = REG_EFUSE_ACCESS,
286
287 .maps[EFUSE_TEST] = REG_EFUSE_TEST,
288 .maps[EFUSE_CTRL] = REG_EFUSE_CTRL,
289 .maps[EFUSE_CLK] = 0,
290 .maps[EFUSE_CLK_CTRL] = REG_EFUSE_CTRL,
291 .maps[EFUSE_PWC_EV12V] = PWC_EV12V,
292 .maps[EFUSE_FEN_ELDR] = FEN_ELDR,
293 .maps[EFUSE_LOADER_CLK_EN] = LOADER_CLK_EN,
294 .maps[EFUSE_ANA8M] = ANA8M,
295 .maps[EFUSE_HWSET_MAX_SIZE] = HWSET_MAX_SIZE,
296 .maps[EFUSE_MAX_SECTION_MAP] = EFUSE_MAX_SECTION,
297 .maps[EFUSE_REAL_CONTENT_SIZE] = EFUSE_REAL_CONTENT_LEN,
298 .maps[EFUSE_OOB_PROTECT_BYTES_LEN] = EFUSE_OOB_PROTECT_BYTES,
299
300 .maps[RWCAM] = REG_CAMCMD,
301 .maps[WCAMI] = REG_CAMWRITE,
302 .maps[RCAMO] = REG_CAMREAD,
303 .maps[CAMDBG] = REG_CAMDBG,
304 .maps[SECR] = REG_SECCFG,
305 .maps[SEC_CAM_NONE] = CAM_NONE,
306 .maps[SEC_CAM_WEP40] = CAM_WEP40,
307 .maps[SEC_CAM_TKIP] = CAM_TKIP,
308 .maps[SEC_CAM_AES] = CAM_AES,
309 .maps[SEC_CAM_WEP104] = CAM_WEP104,
310
311 .maps[RTL_IMR_BCNDMAINT6] = IMR_BCNDMAINT6,
312 .maps[RTL_IMR_BCNDMAINT5] = IMR_BCNDMAINT5,
313 .maps[RTL_IMR_BCNDMAINT4] = IMR_BCNDMAINT4,
314 .maps[RTL_IMR_BCNDMAINT3] = IMR_BCNDMAINT3,
315 .maps[RTL_IMR_BCNDMAINT2] = IMR_BCNDMAINT2,
316 .maps[RTL_IMR_BCNDMAINT1] = IMR_BCNDMAINT1,
317 .maps[RTL_IMR_BCNDOK7] = IMR_BCNDOK7,
318 .maps[RTL_IMR_BCNDOK6] = IMR_BCNDOK6,
319 .maps[RTL_IMR_BCNDOK5] = IMR_BCNDOK5,
320 .maps[RTL_IMR_BCNDOK4] = IMR_BCNDOK4,
321 .maps[RTL_IMR_BCNDOK3] = IMR_BCNDOK3,
322 .maps[RTL_IMR_BCNDOK2] = IMR_BCNDOK2,
323 .maps[RTL_IMR_BCNDOK1] = IMR_BCNDOK1,
324
325 .maps[RTL_IMR_TXFOVW] = IMR_TXFOVW,
326 .maps[RTL_IMR_PSTIMEOUT] = IMR_PSTIMEOUT,
327 .maps[RTL_IMR_BCNINT] = IMR_BCNDMAINT0,
328 .maps[RTL_IMR_RXFOVW] = IMR_RXFOVW,
329 .maps[RTL_IMR_RDU] = IMR_RDU,
330 .maps[RTL_IMR_ATIMEND] = IMR_ATIMEND,
331 .maps[RTL_IMR_BDOK] = IMR_BCNDOK0,
332 .maps[RTL_IMR_MGNTDOK] = IMR_MGNTDOK,
333 .maps[RTL_IMR_TBDER] = IMR_TBDER,
334 .maps[RTL_IMR_HIGHDOK] = IMR_HIGHDOK,
335 .maps[RTL_IMR_TBDOK] = IMR_TBDOK,
336 .maps[RTL_IMR_BKDOK] = IMR_BKDOK,
337 .maps[RTL_IMR_BEDOK] = IMR_BEDOK,
338 .maps[RTL_IMR_VIDOK] = IMR_VIDOK,
339 .maps[RTL_IMR_VODOK] = IMR_VODOK,
340 .maps[RTL_IMR_ROK] = IMR_ROK,
341 .maps[RTL_IBSS_INT_MASKS] = (IMR_BCNDMAINT0 | IMR_TBDOK | IMR_TBDER),
342
343 .maps[RTL_RC_CCK_RATE1M] = DESC92C_RATE1M,
344 .maps[RTL_RC_CCK_RATE2M] = DESC92C_RATE2M,
345 .maps[RTL_RC_CCK_RATE5_5M] = DESC92C_RATE5_5M,
346 .maps[RTL_RC_CCK_RATE11M] = DESC92C_RATE11M,
347 .maps[RTL_RC_OFDM_RATE6M] = DESC92C_RATE6M,
348 .maps[RTL_RC_OFDM_RATE9M] = DESC92C_RATE9M,
349 .maps[RTL_RC_OFDM_RATE12M] = DESC92C_RATE12M,
350 .maps[RTL_RC_OFDM_RATE18M] = DESC92C_RATE18M,
351 .maps[RTL_RC_OFDM_RATE24M] = DESC92C_RATE24M,
352 .maps[RTL_RC_OFDM_RATE36M] = DESC92C_RATE36M,
353 .maps[RTL_RC_OFDM_RATE48M] = DESC92C_RATE48M,
354 .maps[RTL_RC_OFDM_RATE54M] = DESC92C_RATE54M,
355
356 .maps[RTL_RC_HT_RATEMCS7] = DESC92C_RATEMCS7,
357 .maps[RTL_RC_HT_RATEMCS15] = DESC92C_RATEMCS15,
358};
359
360static struct pci_device_id rtl92ee_pci_ids[] = {
361 {RTL_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x818B, rtl92ee_hal_cfg)},
362 {},
363};
364
365MODULE_DEVICE_TABLE(pci, rtl92ee_pci_ids);
366
367MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>");
368MODULE_AUTHOR("Larry Finger <Larry.Finger@lwfinger.net>");
369MODULE_LICENSE("GPL");
370MODULE_DESCRIPTION("Realtek 8192EE 802.11n PCI wireless");
371MODULE_FIRMWARE("rtlwifi/rtl8192eefw.bin");
372
373module_param_named(swenc, rtl92ee_mod_params.sw_crypto, bool, 0444);
374module_param_named(debug, rtl92ee_mod_params.debug, int, 0444);
375module_param_named(ips, rtl92ee_mod_params.inactiveps, bool, 0444);
376module_param_named(swlps, rtl92ee_mod_params.swctrl_lps, bool, 0444);
377module_param_named(fwlps, rtl92ee_mod_params.fwctrl_lps, bool, 0444);
378module_param_named(msi, rtl92ee_mod_params.msi_support, bool, 0444);
379module_param_named(disable_watchdog, rtl92ee_mod_params.disable_watchdog,
380 bool, 0444);
381MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n");
382MODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n");
383MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n");
384MODULE_PARM_DESC(fwlps, "Set to 1 to use FW control power save (default 1)\n");
385MODULE_PARM_DESC(msi, "Set to 1 to use MSI interrupts mode (default 1)\n");
386MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)");
387MODULE_PARM_DESC(disable_watchdog, "Set to 1 to disable the watchdog (default 0)\n");
388
389static SIMPLE_DEV_PM_OPS(rtlwifi_pm_ops, rtl_pci_suspend, rtl_pci_resume);
390
391static struct pci_driver rtl92ee_driver = {
392 .name = KBUILD_MODNAME,
393 .id_table = rtl92ee_pci_ids,
394 .probe = rtl_pci_probe,
395 .remove = rtl_pci_disconnect,
396 .driver.pm = &rtlwifi_pm_ops,
397};
398
399module_pci_driver(rtl92ee_driver);