1b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger/****************************************************************************** 2b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * 3b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * Copyright(c) 2009-2014 Realtek Corporation. 4b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * 5b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * This program is free software; you can redistribute it and/or modify it 6b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * under the terms of version 2 of the GNU General Public License as 7b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * published by the Free Software Foundation. 8b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * 9b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * This program is distributed in the hope that it will be useful, but WITHOUT 10b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * more details. 13b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * 14b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * The full GNU General Public License is included in this distribution in the 15b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * file called LICENSE. 16b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * 17b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * Contact Information: 18b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * wlanfae <wlanfae@realtek.com> 19b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park, 20b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * Hsinchu 300, Taiwan. 21b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * 22b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * Larry Finger <Larry.Finger@lwfinger.net> 23b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * 24b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger *****************************************************************************/ 25b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 26b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger#include "../wifi.h" 27b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger#include "../core.h" 28b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger#include "../pci.h" 29b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger#include "reg.h" 30b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger#include "def.h" 31b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger#include "phy.h" 32b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger#include "dm.h" 33b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger#include "hw.h" 34b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger#include "sw.h" 35b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger#include "fw.h" 36b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger#include "trx.h" 37b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger#include "led.h" 38b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger#include "table.h" 39b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 40b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger#include "../btcoexist/rtl_btc.h" 41b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 42b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger#include <linux/vmalloc.h> 43b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger#include <linux/module.h> 44b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 45b1a3bfc97cd95681c511515534b84843998f3ea0Larry Fingerstatic void rtl92ee_init_aspm_vars(struct ieee80211_hw *hw) 46b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger{ 47b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 48b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 49b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger /*close ASPM for AMD defaultly */ 50b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpci->const_amdpci_aspm = 0; 51b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 52b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger /** 53b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * ASPM PS mode. 54b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * 0 - Disable ASPM, 55b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * 1 - Enable ASPM without Clock Req, 56b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * 2 - Enable ASPM with Clock Req, 57b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * 3 - Alwyas Enable ASPM with Clock Req, 58b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * 4 - Always Enable ASPM without Clock Req. 59b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * set defult to RTL8192CE:3 RTL8192E:2 60b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger */ 61b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpci->const_pci_aspm = 3; 62b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 63b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger /*Setting for PCI-E device */ 64b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpci->const_devicepci_aspm_setting = 0x03; 65b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 66b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger /*Setting for PCI-E bridge */ 67b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpci->const_hostpci_aspm_setting = 0x02; 68b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 69b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger /** 70b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * In Hw/Sw Radio Off situation. 71b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * 0 - Default, 72b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * 1 - From ASPM setting without low Mac Pwr, 73b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * 2 - From ASPM setting with low Mac Pwr, 74b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * 3 - Bus D3 75b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * set default to RTL8192CE:0 RTL8192SE:2 76b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger */ 77b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpci->const_hwsw_rfoff_d3 = 0; 78b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 79b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger /** 80b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * This setting works for those device with 81b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * backdoor ASPM setting such as EPHY setting. 82b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * 0 - Not support ASPM, 83b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * 1 - Support ASPM, 84b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * 2 - According to chipset. 85b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger */ 86b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpci->const_support_pciaspm = 1; 87b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger} 88b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 89b1a3bfc97cd95681c511515534b84843998f3ea0Larry Fingerint rtl92ee_init_sw_vars(struct ieee80211_hw *hw) 90b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger{ 91b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger struct rtl_priv *rtlpriv = rtl_priv(hw); 92b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 93b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger int err = 0; 94b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 95b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtl92ee_bt_reg_init(hw); 96b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support; 97b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpriv->btcoexist.btc_ops = rtl_btc_get_ops_pointer(); 98b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 99b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpriv->dm.dm_initialgain_enable = 1; 100b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpriv->dm.dm_flag = 0; 101b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpriv->dm.disable_framebursting = 0; 102b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpci->transmit_config = CFENDFORM | BIT(15); 103b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 104b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger /*just 2.4G band*/ 105b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpriv->rtlhal.current_bandtype = BAND_ON_2_4G; 106b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpriv->rtlhal.bandset = BAND_ON_2_4G; 107b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpriv->rtlhal.macphymode = SINGLEMAC_SINGLEPHY; 108b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 109b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpci->receive_config = (RCR_APPFCS | 110b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger RCR_APP_MIC | 111b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger RCR_APP_ICV | 112b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger RCR_APP_PHYST_RXFF | 113b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger RCR_HTC_LOC_CTRL | 114b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger RCR_AMF | 115b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger RCR_ACF | 116b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger RCR_ADF | 117b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger RCR_AICV | 118b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger RCR_ACRC32 | 119b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger RCR_AB | 120b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger RCR_AM | 121b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger RCR_APM | 122b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 0); 123b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 124b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpci->irq_mask[0] = (u32)(IMR_PSTIMEOUT | 125b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger IMR_C2HCMD | 126b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger IMR_HIGHDOK | 127b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger IMR_MGNTDOK | 128b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger IMR_BKDOK | 129b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger IMR_BEDOK | 130b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger IMR_VIDOK | 131b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger IMR_VODOK | 132b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger IMR_RDU | 133b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger IMR_ROK | 134b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 0); 135b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpci->irq_mask[1] = (u32)(IMR_RXFOVW | 0); 136b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 137b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger /* for debug level */ 138b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpriv->dbg.global_debuglevel = rtlpriv->cfg->mod_params->debug; 139b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger /* for LPS & IPS */ 140b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps; 141b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps; 142b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps; 143b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support; 144b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger if (rtlpriv->cfg->mod_params->disable_watchdog) 145b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger pr_info("watchdog disabled\n"); 146b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpriv->psc.reg_fwctrl_lps = 3; 147b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpriv->psc.reg_max_lps_awakeintvl = 5; 148b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger /* for ASPM, you can close aspm through 149b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger * set const_support_pciaspm = 0 150b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger */ 151b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtl92ee_init_aspm_vars(hw); 152b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 153b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger if (rtlpriv->psc.reg_fwctrl_lps == 1) 154b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpriv->psc.fwctrl_psmode = FW_PS_MIN_MODE; 155b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger else if (rtlpriv->psc.reg_fwctrl_lps == 2) 156b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpriv->psc.fwctrl_psmode = FW_PS_MAX_MODE; 157b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger else if (rtlpriv->psc.reg_fwctrl_lps == 3) 158b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpriv->psc.fwctrl_psmode = FW_PS_DTIM_MODE; 159b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 160b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger /* for early mode */ 161b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpriv->rtlhal.earlymode_enable = false; 162b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 163b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger /*low power */ 164b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpriv->psc.low_power_enable = false; 165b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 166b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger /* for firmware buf */ 167b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpriv->rtlhal.pfirmware = vzalloc(0x8000); 168b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger if (!rtlpriv->rtlhal.pfirmware) { 169b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 170b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger "Can't alloc buffer for fw\n"); 171b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger return 1; 172b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger } 173b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 174b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger /* request fw */ 175b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpriv->cfg->fw_name = "rtlwifi/rtl8192eefw.bin"; 176b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 177b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpriv->max_fw_size = 0x8000; 178b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name); 179b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name, 180b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpriv->io.dev, GFP_KERNEL, hw, 181b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtl_fw_cb); 182b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger if (err) { 183b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 184b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger "Failed to request firmware!\n"); 185b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger return 1; 186b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger } 187b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 188b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger return 0; 189b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger} 190b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 191b1a3bfc97cd95681c511515534b84843998f3ea0Larry Fingervoid rtl92ee_deinit_sw_vars(struct ieee80211_hw *hw) 192b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger{ 193b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger struct rtl_priv *rtlpriv = rtl_priv(hw); 194b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 195b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger if (rtlpriv->rtlhal.pfirmware) { 196b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger vfree(rtlpriv->rtlhal.pfirmware); 197b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger rtlpriv->rtlhal.pfirmware = NULL; 198b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger } 199b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger} 200b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 201b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger/* get bt coexist status */ 202b1a3bfc97cd95681c511515534b84843998f3ea0Larry Fingerbool rtl92ee_get_btc_status(void) 203b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger{ 204b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger return true; 205b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger} 206b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 207b1a3bfc97cd95681c511515534b84843998f3ea0Larry Fingerstatic struct rtl_hal_ops rtl8192ee_hal_ops = { 208b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .init_sw_vars = rtl92ee_init_sw_vars, 209b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .deinit_sw_vars = rtl92ee_deinit_sw_vars, 210b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .read_eeprom_info = rtl92ee_read_eeprom_info, 211b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .interrupt_recognized = rtl92ee_interrupt_recognized,/*need check*/ 212b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .hw_init = rtl92ee_hw_init, 213b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .hw_disable = rtl92ee_card_disable, 214b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .hw_suspend = rtl92ee_suspend, 215b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .hw_resume = rtl92ee_resume, 216b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .enable_interrupt = rtl92ee_enable_interrupt, 217b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .disable_interrupt = rtl92ee_disable_interrupt, 218b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .set_network_type = rtl92ee_set_network_type, 219b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .set_chk_bssid = rtl92ee_set_check_bssid, 220b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .set_qos = rtl92ee_set_qos, 221b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .set_bcn_reg = rtl92ee_set_beacon_related_registers, 222b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .set_bcn_intv = rtl92ee_set_beacon_interval, 223b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .update_interrupt_mask = rtl92ee_update_interrupt_mask, 224b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .get_hw_reg = rtl92ee_get_hw_reg, 225b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .set_hw_reg = rtl92ee_set_hw_reg, 226b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .update_rate_tbl = rtl92ee_update_hal_rate_tbl, 227b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .pre_fill_tx_bd_desc = rtl92ee_pre_fill_tx_bd_desc, 228b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .rx_desc_buff_remained_cnt = rtl92ee_rx_desc_buff_remained_cnt, 229b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .rx_check_dma_ok = rtl92ee_rx_check_dma_ok, 230b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .fill_tx_desc = rtl92ee_tx_fill_desc, 231b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .fill_tx_cmddesc = rtl92ee_tx_fill_cmddesc, 232b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .query_rx_desc = rtl92ee_rx_query_desc, 233b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .set_channel_access = rtl92ee_update_channel_access_setting, 234b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .radio_onoff_checking = rtl92ee_gpio_radio_on_off_checking, 235b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .set_bw_mode = rtl92ee_phy_set_bw_mode, 236b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .switch_channel = rtl92ee_phy_sw_chnl, 237b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .dm_watchdog = rtl92ee_dm_watchdog, 238b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .scan_operation_backup = rtl92ee_phy_scan_operation_backup, 239b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .set_rf_power_state = rtl92ee_phy_set_rf_power_state, 240b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .led_control = rtl92ee_led_control, 241b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .set_desc = rtl92ee_set_desc, 242b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .get_desc = rtl92ee_get_desc, 243b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .is_tx_desc_closed = rtl92ee_is_tx_desc_closed, 244b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .tx_polling = rtl92ee_tx_polling, 245b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .enable_hw_sec = rtl92ee_enable_hw_security_config, 246b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .set_key = rtl92ee_set_key, 247b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .init_sw_leds = rtl92ee_init_sw_leds, 248b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .get_bbreg = rtl92ee_phy_query_bb_reg, 249b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .set_bbreg = rtl92ee_phy_set_bb_reg, 250b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .get_rfreg = rtl92ee_phy_query_rf_reg, 251b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .set_rfreg = rtl92ee_phy_set_rf_reg, 252b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .fill_h2c_cmd = rtl92ee_fill_h2c_cmd, 253b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .get_btc_status = rtl92ee_get_btc_status, 254b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .rx_command_packet = rtl92ee_rx_command_packet, 255b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger}; 256b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 257b1a3bfc97cd95681c511515534b84843998f3ea0Larry Fingerstatic struct rtl_mod_params rtl92ee_mod_params = { 258b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .sw_crypto = false, 259b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .inactiveps = false, 260b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .swctrl_lps = false, 261b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .fwctrl_lps = true, 262b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .msi_support = true, 263b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .debug = DBG_EMERG, 264b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger}; 265b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 266b1a3bfc97cd95681c511515534b84843998f3ea0Larry Fingerstatic struct rtl_hal_cfg rtl92ee_hal_cfg = { 267b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .bar_id = 2, 268b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .write_readback = true, 269b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .name = "rtl92ee_pci", 270b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .fw_name = "rtlwifi/rtl8192eefw.bin", 271b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .ops = &rtl8192ee_hal_ops, 272b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .mod_params = &rtl92ee_mod_params, 273b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 274b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[SYS_ISO_CTRL] = REG_SYS_ISO_CTRL, 275b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[SYS_FUNC_EN] = REG_SYS_FUNC_EN, 276b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[SYS_CLK] = REG_SYS_CLKR, 277b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[MAC_RCR_AM] = AM, 278b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[MAC_RCR_AB] = AB, 279b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[MAC_RCR_ACRC32] = ACRC32, 280b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[MAC_RCR_ACF] = ACF, 281b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[MAC_RCR_AAP] = AAP, 282b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[MAC_HIMR] = REG_HIMR, 283b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[MAC_HIMRE] = REG_HIMRE, 284b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 285b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[EFUSE_ACCESS] = REG_EFUSE_ACCESS, 286b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 287b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[EFUSE_TEST] = REG_EFUSE_TEST, 288b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[EFUSE_CTRL] = REG_EFUSE_CTRL, 289b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[EFUSE_CLK] = 0, 290b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[EFUSE_CLK_CTRL] = REG_EFUSE_CTRL, 291b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[EFUSE_PWC_EV12V] = PWC_EV12V, 292b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[EFUSE_FEN_ELDR] = FEN_ELDR, 293b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[EFUSE_LOADER_CLK_EN] = LOADER_CLK_EN, 294b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[EFUSE_ANA8M] = ANA8M, 295b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[EFUSE_HWSET_MAX_SIZE] = HWSET_MAX_SIZE, 296b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[EFUSE_MAX_SECTION_MAP] = EFUSE_MAX_SECTION, 297b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[EFUSE_REAL_CONTENT_SIZE] = EFUSE_REAL_CONTENT_LEN, 298b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[EFUSE_OOB_PROTECT_BYTES_LEN] = EFUSE_OOB_PROTECT_BYTES, 299b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 300b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RWCAM] = REG_CAMCMD, 301b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[WCAMI] = REG_CAMWRITE, 302b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RCAMO] = REG_CAMREAD, 303b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[CAMDBG] = REG_CAMDBG, 304b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[SECR] = REG_SECCFG, 305b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[SEC_CAM_NONE] = CAM_NONE, 306b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[SEC_CAM_WEP40] = CAM_WEP40, 307b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[SEC_CAM_TKIP] = CAM_TKIP, 308b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[SEC_CAM_AES] = CAM_AES, 309b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[SEC_CAM_WEP104] = CAM_WEP104, 310b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 311b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_BCNDMAINT6] = IMR_BCNDMAINT6, 312b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_BCNDMAINT5] = IMR_BCNDMAINT5, 313b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_BCNDMAINT4] = IMR_BCNDMAINT4, 314b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_BCNDMAINT3] = IMR_BCNDMAINT3, 315b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_BCNDMAINT2] = IMR_BCNDMAINT2, 316b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_BCNDMAINT1] = IMR_BCNDMAINT1, 317b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_BCNDOK7] = IMR_BCNDOK7, 318b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_BCNDOK6] = IMR_BCNDOK6, 319b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_BCNDOK5] = IMR_BCNDOK5, 320b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_BCNDOK4] = IMR_BCNDOK4, 321b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_BCNDOK3] = IMR_BCNDOK3, 322b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_BCNDOK2] = IMR_BCNDOK2, 323b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_BCNDOK1] = IMR_BCNDOK1, 324b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 325b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_TXFOVW] = IMR_TXFOVW, 326b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_PSTIMEOUT] = IMR_PSTIMEOUT, 327b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_BCNINT] = IMR_BCNDMAINT0, 328b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_RXFOVW] = IMR_RXFOVW, 329b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_RDU] = IMR_RDU, 330b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_ATIMEND] = IMR_ATIMEND, 331b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_BDOK] = IMR_BCNDOK0, 332b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_MGNTDOK] = IMR_MGNTDOK, 333b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_TBDER] = IMR_TBDER, 334b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_HIGHDOK] = IMR_HIGHDOK, 335b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_TBDOK] = IMR_TBDOK, 336b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_BKDOK] = IMR_BKDOK, 337b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_BEDOK] = IMR_BEDOK, 338b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_VIDOK] = IMR_VIDOK, 339b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_VODOK] = IMR_VODOK, 340b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IMR_ROK] = IMR_ROK, 341b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_IBSS_INT_MASKS] = (IMR_BCNDMAINT0 | IMR_TBDOK | IMR_TBDER), 342b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 343b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_RC_CCK_RATE1M] = DESC92C_RATE1M, 344b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_RC_CCK_RATE2M] = DESC92C_RATE2M, 345b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_RC_CCK_RATE5_5M] = DESC92C_RATE5_5M, 346b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_RC_CCK_RATE11M] = DESC92C_RATE11M, 347b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_RC_OFDM_RATE6M] = DESC92C_RATE6M, 348b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_RC_OFDM_RATE9M] = DESC92C_RATE9M, 349b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_RC_OFDM_RATE12M] = DESC92C_RATE12M, 350b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_RC_OFDM_RATE18M] = DESC92C_RATE18M, 351b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_RC_OFDM_RATE24M] = DESC92C_RATE24M, 352b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_RC_OFDM_RATE36M] = DESC92C_RATE36M, 353b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_RC_OFDM_RATE48M] = DESC92C_RATE48M, 354b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_RC_OFDM_RATE54M] = DESC92C_RATE54M, 355b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 356b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_RC_HT_RATEMCS7] = DESC92C_RATEMCS7, 357b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .maps[RTL_RC_HT_RATEMCS15] = DESC92C_RATEMCS15, 358b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger}; 359b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 360b1a3bfc97cd95681c511515534b84843998f3ea0Larry Fingerstatic struct pci_device_id rtl92ee_pci_ids[] = { 361b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger {RTL_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x818B, rtl92ee_hal_cfg)}, 362b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger {}, 363b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger}; 364b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 365b1a3bfc97cd95681c511515534b84843998f3ea0Larry FingerMODULE_DEVICE_TABLE(pci, rtl92ee_pci_ids); 366b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 367b1a3bfc97cd95681c511515534b84843998f3ea0Larry FingerMODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>"); 368b1a3bfc97cd95681c511515534b84843998f3ea0Larry FingerMODULE_AUTHOR("Larry Finger <Larry.Finger@lwfinger.net>"); 369b1a3bfc97cd95681c511515534b84843998f3ea0Larry FingerMODULE_LICENSE("GPL"); 370b1a3bfc97cd95681c511515534b84843998f3ea0Larry FingerMODULE_DESCRIPTION("Realtek 8192EE 802.11n PCI wireless"); 371b1a3bfc97cd95681c511515534b84843998f3ea0Larry FingerMODULE_FIRMWARE("rtlwifi/rtl8192eefw.bin"); 372b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 373b1a3bfc97cd95681c511515534b84843998f3ea0Larry Fingermodule_param_named(swenc, rtl92ee_mod_params.sw_crypto, bool, 0444); 374b1a3bfc97cd95681c511515534b84843998f3ea0Larry Fingermodule_param_named(debug, rtl92ee_mod_params.debug, int, 0444); 375b1a3bfc97cd95681c511515534b84843998f3ea0Larry Fingermodule_param_named(ips, rtl92ee_mod_params.inactiveps, bool, 0444); 376b1a3bfc97cd95681c511515534b84843998f3ea0Larry Fingermodule_param_named(swlps, rtl92ee_mod_params.swctrl_lps, bool, 0444); 377b1a3bfc97cd95681c511515534b84843998f3ea0Larry Fingermodule_param_named(fwlps, rtl92ee_mod_params.fwctrl_lps, bool, 0444); 378b1a3bfc97cd95681c511515534b84843998f3ea0Larry Fingermodule_param_named(msi, rtl92ee_mod_params.msi_support, bool, 0444); 379b1a3bfc97cd95681c511515534b84843998f3ea0Larry Fingermodule_param_named(disable_watchdog, rtl92ee_mod_params.disable_watchdog, 380b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger bool, 0444); 381b1a3bfc97cd95681c511515534b84843998f3ea0Larry FingerMODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n"); 382b1a3bfc97cd95681c511515534b84843998f3ea0Larry FingerMODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n"); 383b1a3bfc97cd95681c511515534b84843998f3ea0Larry FingerMODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n"); 384b1a3bfc97cd95681c511515534b84843998f3ea0Larry FingerMODULE_PARM_DESC(fwlps, "Set to 1 to use FW control power save (default 1)\n"); 385b1a3bfc97cd95681c511515534b84843998f3ea0Larry FingerMODULE_PARM_DESC(msi, "Set to 1 to use MSI interrupts mode (default 1)\n"); 386b1a3bfc97cd95681c511515534b84843998f3ea0Larry FingerMODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)"); 387b1a3bfc97cd95681c511515534b84843998f3ea0Larry FingerMODULE_PARM_DESC(disable_watchdog, "Set to 1 to disable the watchdog (default 0)\n"); 388b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 389b1a3bfc97cd95681c511515534b84843998f3ea0Larry Fingerstatic SIMPLE_DEV_PM_OPS(rtlwifi_pm_ops, rtl_pci_suspend, rtl_pci_resume); 390b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 391b1a3bfc97cd95681c511515534b84843998f3ea0Larry Fingerstatic struct pci_driver rtl92ee_driver = { 392b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .name = KBUILD_MODNAME, 393b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .id_table = rtl92ee_pci_ids, 394b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .probe = rtl_pci_probe, 395b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .remove = rtl_pci_disconnect, 396b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger .driver.pm = &rtlwifi_pm_ops, 397b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger}; 398b1a3bfc97cd95681c511515534b84843998f3ea0Larry Finger 399b1a3bfc97cd95681c511515534b84843998f3ea0Larry Fingermodule_pci_driver(rtl92ee_driver); 400