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