15a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li/****************************************************************************** 25a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * 3ca742cd9766ff519b0e927a9296e29541ee13c7bLarry Finger * Copyright(c) 2009-2012 Realtek Corporation. 45a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * 55a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * This program is free software; you can redistribute it and/or modify it 65a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * under the terms of version 2 of the GNU General Public License as 75a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * published by the Free Software Foundation. 85a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * 95a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * This program is distributed in the hope that it will be useful, but WITHOUT 105a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 115a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 125a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * more details. 135a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * 145a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * You should have received a copy of the GNU General Public License along with 155a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * this program; if not, write to the Free Software Foundation, Inc., 165a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA 175a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * 185a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * The full GNU General Public License is included in this distribution in the 195a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * file called LICENSE. 205a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * 215a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * Contact Information: 225a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * wlanfae <wlanfae@realtek.com> 235a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park, 245a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * Hsinchu 300, Taiwan. 255a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * 265a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * Larry Finger <Larry.Finger@lwfinger.net> 275a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * 285a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li *****************************************************************************/ 295a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 305a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li#include "../wifi.h" 315a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li#include "../core.h" 325a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li#include "../pci.h" 33b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger#include "../base.h" 34b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger#include "../pci.h" 355a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li#include "reg.h" 365a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li#include "def.h" 375a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li#include "phy.h" 385a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li#include "dm.h" 395a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li#include "fw.h" 405a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li#include "hw.h" 415a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li#include "sw.h" 425a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li#include "trx.h" 435a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li#include "led.h" 445a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 45d273bb20c00340748e3ca9730f87524ec5abbd64Larry Finger#include <linux/module.h> 46d273bb20c00340748e3ca9730f87524ec5abbd64Larry Finger 475a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Listatic void rtl92s_init_aspm_vars(struct ieee80211_hw *hw) 485a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li{ 495a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 505a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 515a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li /*close ASPM for AMD defaultly */ 525a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpci->const_amdpci_aspm = 0; 535a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 545a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li /* 555a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * ASPM PS mode. 565a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * 0 - Disable ASPM, 575a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * 1 - Enable ASPM without Clock Req, 585a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * 2 - Enable ASPM with Clock Req, 595a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * 3 - Alwyas Enable ASPM with Clock Req, 605a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * 4 - Always Enable ASPM without Clock Req. 615a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * set defult to RTL8192CE:3 RTL8192E:2 625a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * */ 63fc7707a469785fe786ddc66d723c150226ddc40eChaoming Li rtlpci->const_pci_aspm = 2; 645a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 655a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li /*Setting for PCI-E device */ 665a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpci->const_devicepci_aspm_setting = 0x03; 675a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 685a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li /*Setting for PCI-E bridge */ 695a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpci->const_hostpci_aspm_setting = 0x02; 705a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 715a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li /* 725a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * In Hw/Sw Radio Off situation. 735a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * 0 - Default, 745a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * 1 - From ASPM setting without low Mac Pwr, 755a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * 2 - From ASPM setting with low Mac Pwr, 765a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * 3 - Bus D3 775a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * set default to RTL8192CE:0 RTL8192SE:2 785a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li */ 795a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpci->const_hwsw_rfoff_d3 = 2; 805a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 815a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li /* 825a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * This setting works for those device with 835a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * backdoor ASPM setting such as EPHY setting. 845a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * 0 - Not support ASPM, 855a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * 1 - Support ASPM, 865a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * 2 - According to chipset. 875a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li */ 885a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpci->const_support_pciaspm = 2; 895a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li} 905a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 91b0302aba812bcc39291cdab9ad7e37008f352a91Larry Fingerstatic void rtl92se_fw_cb(const struct firmware *firmware, void *context) 92b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger{ 93b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger struct ieee80211_hw *hw = context; 94b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw); 95b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger struct rtl_priv *rtlpriv = rtl_priv(hw); 96b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger struct rtl_pci *rtlpci = rtl_pcidev(pcipriv); 97b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger struct rt_firmware *pfirmware = NULL; 98b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger int err; 99b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger 100b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD, 101b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger "Firmware callback routine entered!\n"); 102b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger complete(&rtlpriv->firmware_loading_complete); 103b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger if (!firmware) { 104b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger pr_err("Firmware %s not available\n", rtlpriv->cfg->fw_name); 105b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger rtlpriv->max_fw_size = 0; 106b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger return; 107b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger } 108b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger if (firmware->size > rtlpriv->max_fw_size) { 109b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 110b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger "Firmware is too big!\n"); 1113fccdcf5091eaaa0d7582bedbc035163b40714b9Tim Gardner rtlpriv->max_fw_size = 0; 112b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger release_firmware(firmware); 113b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger return; 114b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger } 115b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger pfirmware = (struct rt_firmware *)rtlpriv->rtlhal.pfirmware; 116b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger memcpy(pfirmware->sz_fw_tmpbuffer, firmware->data, firmware->size); 117b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger pfirmware->sz_fw_tmpbufferlen = firmware->size; 118b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger release_firmware(firmware); 119b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger 120b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger err = ieee80211_register_hw(hw); 121b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger if (err) { 122b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 123b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger "Can't register mac80211 hw\n"); 124b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger return; 125b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger } else { 126b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger rtlpriv->mac80211.mac80211_registered = 1; 127b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger } 128b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger rtlpci->irq_alloc = 1; 129b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger set_bit(RTL_STATUS_INTERFACE_START, &rtlpriv->status); 130b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger 131b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger /*init rfkill */ 132b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger rtl_init_rfkill(hw); 133b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger} 134b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger 1355a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Listatic int rtl92s_init_sw_vars(struct ieee80211_hw *hw) 1365a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li{ 1375a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li struct rtl_priv *rtlpriv = rtl_priv(hw); 1385a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1395a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li int err = 0; 1405a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li u16 earlyrxthreshold = 7; 1415a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 1423db1cd5c05f35fb43eb134df6f321de4e63141f2Rusty Russell rtlpriv->dm.dm_initialgain_enable = true; 1435a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpriv->dm.dm_flag = 0; 1443db1cd5c05f35fb43eb134df6f321de4e63141f2Rusty Russell rtlpriv->dm.disable_framebursting = false; 1455a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpriv->dm.thermalvalue = 0; 1465a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpriv->dm.useramask = true; 1475a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 1485a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li /* compatible 5G band 91se just 2.4G band & smsp */ 1495a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpriv->rtlhal.current_bandtype = BAND_ON_2_4G; 1505a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpriv->rtlhal.bandset = BAND_ON_2_4G; 1515a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpriv->rtlhal.macphymode = SINGLEMAC_SINGLEPHY; 1525a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 1535a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpci->transmit_config = 0; 1545a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 1555a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpci->receive_config = 1565a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li RCR_APPFCS | 1575a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li RCR_APWRMGT | 1585a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li /*RCR_ADD3 |*/ 1595a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li RCR_AMF | 1605a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li RCR_ADF | 1615a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li RCR_APP_MIC | 1625a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li RCR_APP_ICV | 1635a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li RCR_AICV | 1645a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li /* Accept ICV error, CRC32 Error */ 1655a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li RCR_ACRC32 | 1665a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li RCR_AB | 1675a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li /* Accept Broadcast, Multicast */ 1685a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li RCR_AM | 1695a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li /* Accept Physical match */ 1705a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li RCR_APM | 1715a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li /* Accept Destination Address packets */ 1725a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li /*RCR_AAP |*/ 1735a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li RCR_APP_PHYST_STAFF | 1745a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li /* Accept PHY status */ 1755a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li RCR_APP_PHYST_RXFF | 1765a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li (earlyrxthreshold << RCR_FIFO_OFFSET); 1775a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 1785a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpci->irq_mask[0] = (u32) 1795a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li (IMR_ROK | 1805a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li IMR_VODOK | 1815a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li IMR_VIDOK | 1825a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li IMR_BEDOK | 1835a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li IMR_BKDOK | 1845a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li IMR_HCCADOK | 1855a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li IMR_MGNTDOK | 1865a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li IMR_COMDOK | 1875a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li IMR_HIGHDOK | 1885a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li IMR_BDOK | 1895a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li IMR_RXCMDOK | 1905a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li /*IMR_TIMEOUT0 |*/ 1915a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li IMR_RDU | 1925a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li IMR_RXFOVW | 1935a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li IMR_BCNINT 1945a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li /*| IMR_TXFOVW*/ 1955a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li /*| IMR_TBDOK | 1965a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li IMR_TBDER*/); 1975a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 1985a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpci->irq_mask[1] = (u32) 0; 1995a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 2005a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpci->shortretry_limit = 0x30; 2015a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpci->longretry_limit = 0x30; 2025a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 2035a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpci->first_init = true; 2045a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 20573a253ca9865cf743c9bc1c97982cb343f535655Larry Finger /* for debug level */ 20673a253ca9865cf743c9bc1c97982cb343f535655Larry Finger rtlpriv->dbg.global_debuglevel = rtlpriv->cfg->mod_params->debug; 2075a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li /* for LPS & IPS */ 2085a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps; 2095a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps; 2105a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps; 2117664beeb2fb2d7ed13b2609dab8b84724263f135Larry Finger if (!rtlpriv->psc.inactiveps) 212d9595ce30bd860a1c5bcafef8430f46faa26d6ebJoe Perches pr_info("Power Save off (module option)\n"); 2137664beeb2fb2d7ed13b2609dab8b84724263f135Larry Finger if (!rtlpriv->psc.fwctrl_lps) 214d9595ce30bd860a1c5bcafef8430f46faa26d6ebJoe Perches pr_info("FW Power Save off (module option)\n"); 2155a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpriv->psc.reg_fwctrl_lps = 3; 2165a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpriv->psc.reg_max_lps_awakeintvl = 5; 2175a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li /* for ASPM, you can close aspm through 2185a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * set const_support_pciaspm = 0 */ 2195a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtl92s_init_aspm_vars(hw); 2205a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 2215a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li if (rtlpriv->psc.reg_fwctrl_lps == 1) 2225a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpriv->psc.fwctrl_psmode = FW_PS_MIN_MODE; 2235a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li else if (rtlpriv->psc.reg_fwctrl_lps == 2) 2245a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpriv->psc.fwctrl_psmode = FW_PS_MAX_MODE; 2255a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li else if (rtlpriv->psc.reg_fwctrl_lps == 3) 2265a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpriv->psc.fwctrl_psmode = FW_PS_DTIM_MODE; 2275a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 2285a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li /* for firmware buf */ 2295a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpriv->rtlhal.pfirmware = vzalloc(sizeof(struct rt_firmware)); 230e404decb0fb017be80552adee894b35307b6c7b4Joe Perches if (!rtlpriv->rtlhal.pfirmware) 2315a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li return 1; 2325a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 2333fccdcf5091eaaa0d7582bedbc035163b40714b9Tim Gardner rtlpriv->max_fw_size = RTL8190_MAX_RAW_FIRMWARE_CODE_SIZE; 234b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger 235292b11926fec139c0ff103bc229bc6c079d0862fJoe Perches pr_info("Driver for Realtek RTL8192SE/RTL8191SE\n" 236292b11926fec139c0ff103bc229bc6c079d0862fJoe Perches "Loading firmware %s\n", rtlpriv->cfg->fw_name); 2375a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li /* request fw */ 238b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name, 239b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger rtlpriv->io.dev, GFP_KERNEL, hw, 240b0302aba812bcc39291cdab9ad7e37008f352a91Larry Finger rtl92se_fw_cb); 2415a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li if (err) { 2425a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 243f30d7507a8116e2099a9135c873411db8c0a3dc6Joe Perches "Failed to request firmware!\n"); 2445a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li return 1; 2455a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li } 2465a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 2475a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li return err; 2485a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li} 2495a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 2505a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Listatic void rtl92s_deinit_sw_vars(struct ieee80211_hw *hw) 2515a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li{ 2525a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li struct rtl_priv *rtlpriv = rtl_priv(hw); 2535a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 2545a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li if (rtlpriv->rtlhal.pfirmware) { 2555a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li vfree(rtlpriv->rtlhal.pfirmware); 2565a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li rtlpriv->rtlhal.pfirmware = NULL; 2575a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li } 2585a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li} 2595a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 2605a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Listatic struct rtl_hal_ops rtl8192se_hal_ops = { 2615a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .init_sw_vars = rtl92s_init_sw_vars, 2625a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .deinit_sw_vars = rtl92s_deinit_sw_vars, 2635a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .read_eeprom_info = rtl92se_read_eeprom_info, 2645a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .interrupt_recognized = rtl92se_interrupt_recognized, 2655a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .hw_init = rtl92se_hw_init, 2665a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .hw_disable = rtl92se_card_disable, 2675a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .hw_suspend = rtl92se_suspend, 2685a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .hw_resume = rtl92se_resume, 2695a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .enable_interrupt = rtl92se_enable_interrupt, 2705a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .disable_interrupt = rtl92se_disable_interrupt, 2715a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .set_network_type = rtl92se_set_network_type, 2725a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .set_chk_bssid = rtl92se_set_check_bssid, 2735a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .set_qos = rtl92se_set_qos, 2745a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .set_bcn_reg = rtl92se_set_beacon_related_registers, 2755a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .set_bcn_intv = rtl92se_set_beacon_interval, 2765a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .update_interrupt_mask = rtl92se_update_interrupt_mask, 2775a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .get_hw_reg = rtl92se_get_hw_reg, 2785a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .set_hw_reg = rtl92se_set_hw_reg, 2795a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .update_rate_tbl = rtl92se_update_hal_rate_tbl, 2805a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .fill_tx_desc = rtl92se_tx_fill_desc, 2815a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .fill_tx_cmddesc = rtl92se_tx_fill_cmddesc, 2825a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .query_rx_desc = rtl92se_rx_query_desc, 2835a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .set_channel_access = rtl92se_update_channel_access_setting, 2845a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .radio_onoff_checking = rtl92se_gpio_radio_on_off_checking, 2855a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .set_bw_mode = rtl92s_phy_set_bw_mode, 2865a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .switch_channel = rtl92s_phy_sw_chnl, 2875a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .dm_watchdog = rtl92s_dm_watchdog, 2885a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .scan_operation_backup = rtl92s_phy_scan_operation_backup, 2895a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .set_rf_power_state = rtl92s_phy_set_rf_power_state, 2905a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .led_control = rtl92se_led_control, 2915a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .set_desc = rtl92se_set_desc, 2925a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .get_desc = rtl92se_get_desc, 2935a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .tx_polling = rtl92se_tx_polling, 2945a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .enable_hw_sec = rtl92se_enable_hw_security_config, 2955a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .set_key = rtl92se_set_key, 2965a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .init_sw_leds = rtl92se_init_sw_leds, 2975a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .get_bbreg = rtl92s_phy_query_bb_reg, 2985a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .set_bbreg = rtl92s_phy_set_bb_reg, 2995a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .get_rfreg = rtl92s_phy_query_rf_reg, 3005a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .set_rfreg = rtl92s_phy_set_rf_reg, 3015a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li}; 3025a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 3035a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Listatic struct rtl_mod_params rtl92se_mod_params = { 3045a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .sw_crypto = false, 3055a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .inactiveps = true, 3065a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .swctrl_lps = true, 3075a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .fwctrl_lps = false, 30873a253ca9865cf743c9bc1c97982cb343f535655Larry Finger .debug = DBG_EMERG, 3095a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li}; 3105a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 3115a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li/* Because memory R/W bursting will cause system hang/crash 3125a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li * for 92se, so we don't read back after every write action */ 3135a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Listatic struct rtl_hal_cfg rtl92se_hal_cfg = { 3145a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .bar_id = 1, 3155a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .write_readback = false, 3165a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .name = "rtl92s_pci", 3175a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .fw_name = "rtlwifi/rtl8192sefw.bin", 3185a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .ops = &rtl8192se_hal_ops, 3195a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .mod_params = &rtl92se_mod_params, 3205a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 3215a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[SYS_ISO_CTRL] = REG_SYS_ISO_CTRL, 3225a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[SYS_FUNC_EN] = REG_SYS_FUNC_EN, 3235a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[SYS_CLK] = SYS_CLKR, 3245a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[MAC_RCR_AM] = RCR_AM, 3255a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[MAC_RCR_AB] = RCR_AB, 3265a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[MAC_RCR_ACRC32] = RCR_ACRC32, 3275a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[MAC_RCR_ACF] = RCR_ACF, 3285a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[MAC_RCR_AAP] = RCR_AAP, 3295a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 3305a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[EFUSE_TEST] = REG_EFUSE_TEST, 3315a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[EFUSE_CTRL] = REG_EFUSE_CTRL, 3325a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[EFUSE_CLK] = REG_EFUSE_CLK, 3335a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[EFUSE_CLK_CTRL] = REG_EFUSE_CTRL, 3345a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[EFUSE_PWC_EV12V] = 0, /* nouse for 8192se */ 3355a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[EFUSE_FEN_ELDR] = 0, /* nouse for 8192se */ 3365a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[EFUSE_LOADER_CLK_EN] = 0,/* nouse for 8192se */ 3375a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[EFUSE_ANA8M] = EFUSE_ANA8M, 3385a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[EFUSE_HWSET_MAX_SIZE] = HWSET_MAX_SIZE_92S, 3395a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[EFUSE_MAX_SECTION_MAP] = EFUSE_MAX_SECTION, 3405a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[EFUSE_REAL_CONTENT_SIZE] = EFUSE_REAL_CONTENT_LEN, 3415c079d8848740278e70100797265a2965197c84fChaoming Li .maps[EFUSE_OOB_PROTECT_BYTES_LEN] = EFUSE_OOB_PROTECT_BYTES, 3425a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 3435a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RWCAM] = REG_RWCAM, 3445a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[WCAMI] = REG_WCAMI, 3455a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RCAMO] = REG_RCAMO, 3465a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[CAMDBG] = REG_CAMDBG, 3475a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[SECR] = REG_SECR, 3485a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[SEC_CAM_NONE] = CAM_NONE, 3495a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[SEC_CAM_WEP40] = CAM_WEP40, 3505a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[SEC_CAM_TKIP] = CAM_TKIP, 3515a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[SEC_CAM_AES] = CAM_AES, 3525a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[SEC_CAM_WEP104] = CAM_WEP104, 3535a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 3545a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_BCNDMAINT6] = IMR_BCNDMAINT6, 3555a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_BCNDMAINT5] = IMR_BCNDMAINT5, 3565a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_BCNDMAINT4] = IMR_BCNDMAINT4, 3575a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_BCNDMAINT3] = IMR_BCNDMAINT3, 3585a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_BCNDMAINT2] = IMR_BCNDMAINT2, 3595a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_BCNDMAINT1] = IMR_BCNDMAINT1, 3605a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_BCNDOK8] = IMR_BCNDOK8, 3615a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_BCNDOK7] = IMR_BCNDOK7, 3625a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_BCNDOK6] = IMR_BCNDOK6, 3635a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_BCNDOK5] = IMR_BCNDOK5, 3645a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_BCNDOK4] = IMR_BCNDOK4, 3655a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_BCNDOK3] = IMR_BCNDOK3, 3665a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_BCNDOK2] = IMR_BCNDOK2, 3675a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_BCNDOK1] = IMR_BCNDOK1, 3685a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_TIMEOUT2] = IMR_TIMEOUT2, 3695a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_TIMEOUT1] = IMR_TIMEOUT1, 3705a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 3715a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_TXFOVW] = IMR_TXFOVW, 3725a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_PSTIMEOUT] = IMR_PSTIMEOUT, 3735a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_BcnInt] = IMR_BCNINT, 3745a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_RXFOVW] = IMR_RXFOVW, 3755a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_RDU] = IMR_RDU, 3765a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_ATIMEND] = IMR_ATIMEND, 3775a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_BDOK] = IMR_BDOK, 3785a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_MGNTDOK] = IMR_MGNTDOK, 3795a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_TBDER] = IMR_TBDER, 3805a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_HIGHDOK] = IMR_HIGHDOK, 3815a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_COMDOK] = IMR_COMDOK, 3825a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_TBDOK] = IMR_TBDOK, 3835a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_BKDOK] = IMR_BKDOK, 3845a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_BEDOK] = IMR_BEDOK, 3855a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_VIDOK] = IMR_VIDOK, 3865a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_VODOK] = IMR_VODOK, 3875a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IMR_ROK] = IMR_ROK, 3885a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .maps[RTL_IBSS_INT_MASKS] = (IMR_BCNINT | IMR_TBDOK | IMR_TBDER), 3895a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 3908e35337731abb901f3ae20ebc3f44a50ba6953e9Larry Finger .maps[RTL_RC_CCK_RATE1M] = DESC92_RATE1M, 3918e35337731abb901f3ae20ebc3f44a50ba6953e9Larry Finger .maps[RTL_RC_CCK_RATE2M] = DESC92_RATE2M, 3928e35337731abb901f3ae20ebc3f44a50ba6953e9Larry Finger .maps[RTL_RC_CCK_RATE5_5M] = DESC92_RATE5_5M, 3938e35337731abb901f3ae20ebc3f44a50ba6953e9Larry Finger .maps[RTL_RC_CCK_RATE11M] = DESC92_RATE11M, 3948e35337731abb901f3ae20ebc3f44a50ba6953e9Larry Finger .maps[RTL_RC_OFDM_RATE6M] = DESC92_RATE6M, 3958e35337731abb901f3ae20ebc3f44a50ba6953e9Larry Finger .maps[RTL_RC_OFDM_RATE9M] = DESC92_RATE9M, 3968e35337731abb901f3ae20ebc3f44a50ba6953e9Larry Finger .maps[RTL_RC_OFDM_RATE12M] = DESC92_RATE12M, 3978e35337731abb901f3ae20ebc3f44a50ba6953e9Larry Finger .maps[RTL_RC_OFDM_RATE18M] = DESC92_RATE18M, 3988e35337731abb901f3ae20ebc3f44a50ba6953e9Larry Finger .maps[RTL_RC_OFDM_RATE24M] = DESC92_RATE24M, 3998e35337731abb901f3ae20ebc3f44a50ba6953e9Larry Finger .maps[RTL_RC_OFDM_RATE36M] = DESC92_RATE36M, 4008e35337731abb901f3ae20ebc3f44a50ba6953e9Larry Finger .maps[RTL_RC_OFDM_RATE48M] = DESC92_RATE48M, 4018e35337731abb901f3ae20ebc3f44a50ba6953e9Larry Finger .maps[RTL_RC_OFDM_RATE54M] = DESC92_RATE54M, 4028e35337731abb901f3ae20ebc3f44a50ba6953e9Larry Finger 4038e35337731abb901f3ae20ebc3f44a50ba6953e9Larry Finger .maps[RTL_RC_HT_RATEMCS7] = DESC92_RATEMCS7, 4048e35337731abb901f3ae20ebc3f44a50ba6953e9Larry Finger .maps[RTL_RC_HT_RATEMCS15] = DESC92_RATEMCS15, 4055a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li}; 4065a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 4075a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Listatic struct pci_device_id rtl92se_pci_ids[] __devinitdata = { 4085a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li {RTL_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8192, rtl92se_hal_cfg)}, 4095a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li {RTL_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8171, rtl92se_hal_cfg)}, 4105a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li {RTL_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8172, rtl92se_hal_cfg)}, 4115a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li {RTL_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8173, rtl92se_hal_cfg)}, 4125a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li {RTL_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8174, rtl92se_hal_cfg)}, 4135a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li {}, 4145a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li}; 4155a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 4165a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming LiMODULE_DEVICE_TABLE(pci, rtl92se_pci_ids); 4175a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 4185a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming LiMODULE_AUTHOR("lizhaoming <chaoming_li@realsil.com.cn>"); 4195a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming LiMODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>"); 4207664beeb2fb2d7ed13b2609dab8b84724263f135Larry FingerMODULE_AUTHOR("Larry Finger <Larry.Finger@lwfinger.net>"); 4215a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming LiMODULE_LICENSE("GPL"); 4225a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming LiMODULE_DESCRIPTION("Realtek 8192S/8191S 802.11n PCI wireless"); 4235a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming LiMODULE_FIRMWARE("rtlwifi/rtl8192sefw.bin"); 4245a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 4255a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Limodule_param_named(swenc, rtl92se_mod_params.sw_crypto, bool, 0444); 42673a253ca9865cf743c9bc1c97982cb343f535655Larry Fingermodule_param_named(debug, rtl92se_mod_params.debug, int, 0444); 4275a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Limodule_param_named(ips, rtl92se_mod_params.inactiveps, bool, 0444); 4285a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Limodule_param_named(swlps, rtl92se_mod_params.swctrl_lps, bool, 0444); 4295a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Limodule_param_named(fwlps, rtl92se_mod_params.fwctrl_lps, bool, 0444); 4307664beeb2fb2d7ed13b2609dab8b84724263f135Larry FingerMODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n"); 4317664beeb2fb2d7ed13b2609dab8b84724263f135Larry FingerMODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n"); 4327664beeb2fb2d7ed13b2609dab8b84724263f135Larry FingerMODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n"); 4337664beeb2fb2d7ed13b2609dab8b84724263f135Larry FingerMODULE_PARM_DESC(fwlps, "Set to 1 to use FW control power save (default 1)\n"); 43473a253ca9865cf743c9bc1c97982cb343f535655Larry FingerMODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)"); 4355a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 436603be3885b9d518ff4822b357e2687b6ff02f1acLarry Fingerstatic const struct dev_pm_ops rtlwifi_pm_ops = { 437603be3885b9d518ff4822b357e2687b6ff02f1acLarry Finger .suspend = rtl_pci_suspend, 438603be3885b9d518ff4822b357e2687b6ff02f1acLarry Finger .resume = rtl_pci_resume, 439603be3885b9d518ff4822b357e2687b6ff02f1acLarry Finger .freeze = rtl_pci_suspend, 440603be3885b9d518ff4822b357e2687b6ff02f1acLarry Finger .thaw = rtl_pci_resume, 441603be3885b9d518ff4822b357e2687b6ff02f1acLarry Finger .poweroff = rtl_pci_suspend, 442603be3885b9d518ff4822b357e2687b6ff02f1acLarry Finger .restore = rtl_pci_resume, 443603be3885b9d518ff4822b357e2687b6ff02f1acLarry Finger}; 444603be3885b9d518ff4822b357e2687b6ff02f1acLarry Finger 4455a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Listatic struct pci_driver rtl92se_driver = { 4465a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .name = KBUILD_MODNAME, 4475a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .id_table = rtl92se_pci_ids, 4485a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .probe = rtl_pci_probe, 4495a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li .remove = rtl_pci_disconnect, 450603be3885b9d518ff4822b357e2687b6ff02f1acLarry Finger .driver.pm = &rtlwifi_pm_ops, 4515a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li}; 4525a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 4535a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Listatic int __init rtl92se_module_init(void) 4545a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li{ 4555a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li int ret = 0; 4565a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 4575a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li ret = pci_register_driver(&rtl92se_driver); 4585a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li if (ret) 4599d833ed752e91c71792dd8ebfd0f865e6a568a37Joe Perches RT_ASSERT(false, "No device found\n"); 4605a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 4615a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li return ret; 4625a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li} 4635a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 4645a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Listatic void __exit rtl92se_module_exit(void) 4655a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li{ 4665a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li pci_unregister_driver(&rtl92se_driver); 4675a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li} 4685a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Li 4695a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Limodule_init(rtl92se_module_init); 4705a183eec6247d3d992afbd3a1a9658571d9c4970Chaoming Limodule_exit(rtl92se_module_exit); 471