cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

core.c (56761B)


      1// SPDX-License-Identifier: GPL-2.0
      2/* Copyright(c) 2009-2012  Realtek Corporation.*/
      3
      4#include "wifi.h"
      5#include "core.h"
      6#include "cam.h"
      7#include "base.h"
      8#include "ps.h"
      9#include "pwrseqcmd.h"
     10
     11#include "btcoexist/rtl_btc.h"
     12#include <linux/firmware.h>
     13#include <linux/export.h>
     14#include <net/cfg80211.h>
     15
     16u8 channel5g[CHANNEL_MAX_NUMBER_5G] = {
     17	36, 38, 40, 42, 44, 46, 48,		/* Band 1 */
     18	52, 54, 56, 58, 60, 62, 64,		/* Band 2 */
     19	100, 102, 104, 106, 108, 110, 112,	/* Band 3 */
     20	116, 118, 120, 122, 124, 126, 128,	/* Band 3 */
     21	132, 134, 136, 138, 140, 142, 144,	/* Band 3 */
     22	149, 151, 153, 155, 157, 159, 161,	/* Band 4 */
     23	165, 167, 169, 171, 173, 175, 177	/* Band 4 */
     24};
     25EXPORT_SYMBOL(channel5g);
     26
     27u8 channel5g_80m[CHANNEL_MAX_NUMBER_5G_80M] = {
     28	42, 58, 106, 122, 138, 155, 171
     29};
     30EXPORT_SYMBOL(channel5g_80m);
     31
     32void rtl_addr_delay(u32 addr)
     33{
     34	if (addr == 0xfe)
     35		mdelay(50);
     36	else if (addr == 0xfd)
     37		msleep(5);
     38	else if (addr == 0xfc)
     39		msleep(1);
     40	else if (addr == 0xfb)
     41		usleep_range(50, 100);
     42	else if (addr == 0xfa)
     43		usleep_range(5, 10);
     44	else if (addr == 0xf9)
     45		usleep_range(1, 2);
     46}
     47EXPORT_SYMBOL(rtl_addr_delay);
     48
     49void rtl_rfreg_delay(struct ieee80211_hw *hw, enum radio_path rfpath, u32 addr,
     50		     u32 mask, u32 data)
     51{
     52	if (addr >= 0xf9 && addr <= 0xfe) {
     53		rtl_addr_delay(addr);
     54	} else {
     55		rtl_set_rfreg(hw, rfpath, addr, mask, data);
     56		udelay(1);
     57	}
     58}
     59EXPORT_SYMBOL(rtl_rfreg_delay);
     60
     61void rtl_bb_delay(struct ieee80211_hw *hw, u32 addr, u32 data)
     62{
     63	if (addr >= 0xf9 && addr <= 0xfe) {
     64		rtl_addr_delay(addr);
     65	} else {
     66		rtl_set_bbreg(hw, addr, MASKDWORD, data);
     67		udelay(1);
     68	}
     69}
     70EXPORT_SYMBOL(rtl_bb_delay);
     71
     72static void rtl_fw_do_work(const struct firmware *firmware, void *context,
     73			   bool is_wow)
     74{
     75	struct ieee80211_hw *hw = context;
     76	struct rtl_priv *rtlpriv = rtl_priv(hw);
     77	int err;
     78
     79	rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
     80		"Firmware callback routine entered!\n");
     81	if (!firmware) {
     82		if (rtlpriv->cfg->alt_fw_name) {
     83			err = request_firmware(&firmware,
     84					       rtlpriv->cfg->alt_fw_name,
     85					       rtlpriv->io.dev);
     86			pr_info("Loading alternative firmware %s\n",
     87				rtlpriv->cfg->alt_fw_name);
     88			if (!err)
     89				goto found_alt;
     90		}
     91		pr_err("Selected firmware is not available\n");
     92		rtlpriv->max_fw_size = 0;
     93		goto exit;
     94	}
     95found_alt:
     96	if (firmware->size > rtlpriv->max_fw_size) {
     97		pr_err("Firmware is too big!\n");
     98		release_firmware(firmware);
     99		goto exit;
    100	}
    101	if (!is_wow) {
    102		memcpy(rtlpriv->rtlhal.pfirmware, firmware->data,
    103		       firmware->size);
    104		rtlpriv->rtlhal.fwsize = firmware->size;
    105	} else {
    106		memcpy(rtlpriv->rtlhal.wowlan_firmware, firmware->data,
    107		       firmware->size);
    108		rtlpriv->rtlhal.wowlan_fwsize = firmware->size;
    109	}
    110	release_firmware(firmware);
    111
    112exit:
    113	complete(&rtlpriv->firmware_loading_complete);
    114}
    115
    116void rtl_fw_cb(const struct firmware *firmware, void *context)
    117{
    118	rtl_fw_do_work(firmware, context, false);
    119}
    120EXPORT_SYMBOL(rtl_fw_cb);
    121
    122void rtl_wowlan_fw_cb(const struct firmware *firmware, void *context)
    123{
    124	rtl_fw_do_work(firmware, context, true);
    125}
    126EXPORT_SYMBOL(rtl_wowlan_fw_cb);
    127
    128/*mutex for start & stop is must here. */
    129static int rtl_op_start(struct ieee80211_hw *hw)
    130{
    131	int err = 0;
    132	struct rtl_priv *rtlpriv = rtl_priv(hw);
    133	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
    134
    135	if (!is_hal_stop(rtlhal))
    136		return 0;
    137	if (!test_bit(RTL_STATUS_INTERFACE_START, &rtlpriv->status))
    138		return 0;
    139	mutex_lock(&rtlpriv->locks.conf_mutex);
    140	err = rtlpriv->intf_ops->adapter_start(hw);
    141	if (!err)
    142		rtl_watch_dog_timer_callback(&rtlpriv->works.watchdog_timer);
    143	mutex_unlock(&rtlpriv->locks.conf_mutex);
    144	return err;
    145}
    146
    147static void rtl_op_stop(struct ieee80211_hw *hw)
    148{
    149	struct rtl_priv *rtlpriv = rtl_priv(hw);
    150	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
    151	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
    152	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
    153	bool support_remote_wakeup = false;
    154
    155	if (is_hal_stop(rtlhal))
    156		return;
    157
    158	rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
    159				      (u8 *)(&support_remote_wakeup));
    160	/* here is must, because adhoc do stop and start,
    161	 * but stop with RFOFF may cause something wrong,
    162	 * like adhoc TP
    163	 */
    164	if (unlikely(ppsc->rfpwr_state == ERFOFF))
    165		rtl_ips_nic_on(hw);
    166
    167	mutex_lock(&rtlpriv->locks.conf_mutex);
    168	/* if wowlan supported, DON'T clear connected info */
    169	if (!(support_remote_wakeup &&
    170	      rtlhal->enter_pnp_sleep)) {
    171		mac->link_state = MAC80211_NOLINK;
    172		eth_zero_addr(mac->bssid);
    173		mac->vendor = PEER_UNKNOWN;
    174
    175		/* reset sec info */
    176		rtl_cam_reset_sec_info(hw);
    177
    178		rtl_deinit_deferred_work(hw, false);
    179	}
    180	rtlpriv->intf_ops->adapter_stop(hw);
    181
    182	mutex_unlock(&rtlpriv->locks.conf_mutex);
    183}
    184
    185static void rtl_op_tx(struct ieee80211_hw *hw,
    186		      struct ieee80211_tx_control *control,
    187		      struct sk_buff *skb)
    188{
    189	struct rtl_priv *rtlpriv = rtl_priv(hw);
    190	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
    191	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
    192	struct rtl_tcb_desc tcb_desc;
    193
    194	memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc));
    195
    196	if (unlikely(is_hal_stop(rtlhal) || ppsc->rfpwr_state != ERFON))
    197		goto err_free;
    198
    199	if (!test_bit(RTL_STATUS_INTERFACE_START, &rtlpriv->status))
    200		goto err_free;
    201
    202	if (!rtlpriv->intf_ops->waitq_insert(hw, control->sta, skb))
    203		rtlpriv->intf_ops->adapter_tx(hw, control->sta, skb, &tcb_desc);
    204	return;
    205
    206err_free:
    207	dev_kfree_skb_any(skb);
    208}
    209
    210static int rtl_op_add_interface(struct ieee80211_hw *hw,
    211		struct ieee80211_vif *vif)
    212{
    213	struct rtl_priv *rtlpriv = rtl_priv(hw);
    214	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
    215	int err = 0;
    216	u8 retry_limit = 0x30;
    217
    218	if (mac->vif) {
    219		rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
    220			"vif has been set!! mac->vif = 0x%p\n", mac->vif);
    221		return -EOPNOTSUPP;
    222	}
    223
    224	vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER;
    225
    226	rtl_ips_nic_on(hw);
    227
    228	mutex_lock(&rtlpriv->locks.conf_mutex);
    229	switch (ieee80211_vif_type_p2p(vif)) {
    230	case NL80211_IFTYPE_P2P_CLIENT:
    231		mac->p2p = P2P_ROLE_CLIENT;
    232		fallthrough;
    233	case NL80211_IFTYPE_STATION:
    234		if (mac->beacon_enabled == 1) {
    235			rtl_dbg(rtlpriv, COMP_MAC80211, DBG_LOUD,
    236				"NL80211_IFTYPE_STATION\n");
    237			mac->beacon_enabled = 0;
    238			rtlpriv->cfg->ops->update_interrupt_mask(hw, 0,
    239					rtlpriv->cfg->maps[RTL_IBSS_INT_MASKS]);
    240		}
    241		break;
    242	case NL80211_IFTYPE_ADHOC:
    243		rtl_dbg(rtlpriv, COMP_MAC80211, DBG_LOUD,
    244			"NL80211_IFTYPE_ADHOC\n");
    245
    246		mac->link_state = MAC80211_LINKED;
    247		rtlpriv->cfg->ops->set_bcn_reg(hw);
    248		if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G)
    249			mac->basic_rates = 0xfff;
    250		else
    251			mac->basic_rates = 0xff0;
    252		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_BASIC_RATE,
    253				(u8 *)(&mac->basic_rates));
    254
    255		retry_limit = 0x07;
    256		break;
    257	case NL80211_IFTYPE_P2P_GO:
    258		mac->p2p = P2P_ROLE_GO;
    259		fallthrough;
    260	case NL80211_IFTYPE_AP:
    261		rtl_dbg(rtlpriv, COMP_MAC80211, DBG_LOUD,
    262			"NL80211_IFTYPE_AP\n");
    263
    264		mac->link_state = MAC80211_LINKED;
    265		rtlpriv->cfg->ops->set_bcn_reg(hw);
    266		if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G)
    267			mac->basic_rates = 0xfff;
    268		else
    269			mac->basic_rates = 0xff0;
    270		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_BASIC_RATE,
    271					      (u8 *)(&mac->basic_rates));
    272
    273		retry_limit = 0x07;
    274		break;
    275	case NL80211_IFTYPE_MESH_POINT:
    276		rtl_dbg(rtlpriv, COMP_MAC80211, DBG_LOUD,
    277			"NL80211_IFTYPE_MESH_POINT\n");
    278
    279		mac->link_state = MAC80211_LINKED;
    280		rtlpriv->cfg->ops->set_bcn_reg(hw);
    281		if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G)
    282			mac->basic_rates = 0xfff;
    283		else
    284			mac->basic_rates = 0xff0;
    285		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_BASIC_RATE,
    286				(u8 *)(&mac->basic_rates));
    287
    288		retry_limit = 0x07;
    289		break;
    290	default:
    291		pr_err("operation mode %d is not supported!\n",
    292		       vif->type);
    293		err = -EOPNOTSUPP;
    294		goto out;
    295	}
    296
    297	if (mac->p2p) {
    298		rtl_dbg(rtlpriv, COMP_MAC80211, DBG_LOUD,
    299			"p2p role %x\n", vif->type);
    300		mac->basic_rates = 0xff0;/*disable cck rate for p2p*/
    301		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_BASIC_RATE,
    302				(u8 *)(&mac->basic_rates));
    303	}
    304	mac->vif = vif;
    305	mac->opmode = vif->type;
    306	rtlpriv->cfg->ops->set_network_type(hw, vif->type);
    307	memcpy(mac->mac_addr, vif->addr, ETH_ALEN);
    308	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ETHER_ADDR, mac->mac_addr);
    309
    310	mac->retry_long = retry_limit;
    311	mac->retry_short = retry_limit;
    312	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RETRY_LIMIT,
    313			(u8 *)(&retry_limit));
    314out:
    315	mutex_unlock(&rtlpriv->locks.conf_mutex);
    316	return err;
    317}
    318
    319static void rtl_op_remove_interface(struct ieee80211_hw *hw,
    320		struct ieee80211_vif *vif)
    321{
    322	struct rtl_priv *rtlpriv = rtl_priv(hw);
    323	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
    324
    325	mutex_lock(&rtlpriv->locks.conf_mutex);
    326
    327	/* Free beacon resources */
    328	if (vif->type == NL80211_IFTYPE_AP ||
    329	    vif->type == NL80211_IFTYPE_ADHOC ||
    330	    vif->type == NL80211_IFTYPE_MESH_POINT) {
    331		if (mac->beacon_enabled == 1) {
    332			mac->beacon_enabled = 0;
    333			rtlpriv->cfg->ops->update_interrupt_mask(hw, 0,
    334					rtlpriv->cfg->maps[RTL_IBSS_INT_MASKS]);
    335		}
    336	}
    337
    338	/*
    339	 *Note: We assume NL80211_IFTYPE_UNSPECIFIED as
    340	 *NO LINK for our hardware.
    341	 */
    342	mac->p2p = 0;
    343	mac->vif = NULL;
    344	mac->link_state = MAC80211_NOLINK;
    345	eth_zero_addr(mac->bssid);
    346	mac->vendor = PEER_UNKNOWN;
    347	mac->opmode = NL80211_IFTYPE_UNSPECIFIED;
    348	rtlpriv->cfg->ops->set_network_type(hw, mac->opmode);
    349
    350	mutex_unlock(&rtlpriv->locks.conf_mutex);
    351}
    352
    353static int rtl_op_change_interface(struct ieee80211_hw *hw,
    354				   struct ieee80211_vif *vif,
    355				   enum nl80211_iftype new_type, bool p2p)
    356{
    357	struct rtl_priv *rtlpriv = rtl_priv(hw);
    358	int ret;
    359
    360	rtl_op_remove_interface(hw, vif);
    361
    362	vif->type = new_type;
    363	vif->p2p = p2p;
    364	ret = rtl_op_add_interface(hw, vif);
    365	rtl_dbg(rtlpriv, COMP_MAC80211, DBG_LOUD,
    366		"p2p  %x\n", p2p);
    367	return ret;
    368}
    369
    370#ifdef CONFIG_PM
    371static u16 crc16_ccitt(u8 data, u16 crc)
    372{
    373	u8 shift_in, data_bit, crc_bit11, crc_bit4, crc_bit15;
    374	u8 i;
    375	u16 result;
    376
    377	for (i = 0; i < 8; i++) {
    378		crc_bit15 = ((crc & BIT(15)) ? 1 : 0);
    379		data_bit  = (data & (BIT(0) << i) ? 1 : 0);
    380		shift_in = crc_bit15 ^ data_bit;
    381
    382		result = crc << 1;
    383		if (shift_in == 0)
    384			result &= (~BIT(0));
    385		else
    386			result |= BIT(0);
    387
    388		crc_bit11 = ((crc & BIT(11)) ? 1 : 0) ^ shift_in;
    389		if (crc_bit11 == 0)
    390			result &= (~BIT(12));
    391		else
    392			result |= BIT(12);
    393
    394		crc_bit4 = ((crc & BIT(4)) ? 1 : 0) ^ shift_in;
    395		if (crc_bit4 == 0)
    396			result &= (~BIT(5));
    397		else
    398			result |= BIT(5);
    399
    400		crc = result;
    401	}
    402
    403	return crc;
    404}
    405
    406static u16 _calculate_wol_pattern_crc(u8 *pattern, u16 len)
    407{
    408	u16 crc = 0xffff;
    409	u32 i;
    410
    411	for (i = 0; i < len; i++)
    412		crc = crc16_ccitt(pattern[i], crc);
    413
    414	crc = ~crc;
    415
    416	return crc;
    417}
    418
    419static void _rtl_add_wowlan_patterns(struct ieee80211_hw *hw,
    420				     struct cfg80211_wowlan *wow)
    421{
    422	struct rtl_priv *rtlpriv = rtl_priv(hw);
    423	struct rtl_mac *mac = &rtlpriv->mac80211;
    424	struct cfg80211_pkt_pattern *patterns = wow->patterns;
    425	struct rtl_wow_pattern rtl_pattern;
    426	const u8 *pattern_os, *mask_os;
    427	u8 mask[MAX_WOL_BIT_MASK_SIZE] = {0};
    428	u8 content[MAX_WOL_PATTERN_SIZE] = {0};
    429	u8 broadcast_addr[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
    430	u8 multicast_addr1[2] = {0x33, 0x33};
    431	u8 multicast_addr2[3] = {0x01, 0x00, 0x5e};
    432	u8 i, mask_len;
    433	u16 j, len;
    434
    435	for (i = 0; i < wow->n_patterns; i++) {
    436		memset(&rtl_pattern, 0, sizeof(struct rtl_wow_pattern));
    437		memset(mask, 0, MAX_WOL_BIT_MASK_SIZE);
    438		if (patterns[i].pattern_len < 0 ||
    439		    patterns[i].pattern_len > MAX_WOL_PATTERN_SIZE) {
    440			rtl_dbg(rtlpriv, COMP_POWER, DBG_WARNING,
    441				"Pattern[%d] is too long\n", i);
    442			continue;
    443		}
    444		pattern_os = patterns[i].pattern;
    445		mask_len = DIV_ROUND_UP(patterns[i].pattern_len, 8);
    446		mask_os = patterns[i].mask;
    447		RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
    448			      "pattern content\n", pattern_os,
    449			       patterns[i].pattern_len);
    450		RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
    451			      "mask content\n", mask_os, mask_len);
    452		/* 1. unicast? multicast? or broadcast? */
    453		if (memcmp(pattern_os, broadcast_addr, 6) == 0)
    454			rtl_pattern.type = BROADCAST_PATTERN;
    455		else if (memcmp(pattern_os, multicast_addr1, 2) == 0 ||
    456			 memcmp(pattern_os, multicast_addr2, 3) == 0)
    457			rtl_pattern.type = MULTICAST_PATTERN;
    458		else if  (memcmp(pattern_os, mac->mac_addr, 6) == 0)
    459			rtl_pattern.type = UNICAST_PATTERN;
    460		else
    461			rtl_pattern.type = UNKNOWN_TYPE;
    462
    463		/* 2. translate mask_from_os to mask_for_hw */
    464
    465/******************************************************************************
    466 * pattern from OS uses 'ethenet frame', like this:
    467
    468		   |    6   |    6   |   2  |     20    |  Variable  |	4  |
    469		   |--------+--------+------+-----------+------------+-----|
    470		   |    802.3 Mac Header    | IP Header | TCP Packet | FCS |
    471		   |   DA   |   SA   | Type |
    472
    473 * BUT, packet catched by our HW is in '802.11 frame', begin from LLC,
    474
    475	|     24 or 30      |    6   |   2  |     20    |  Variable  |  4  |
    476	|-------------------+--------+------+-----------+------------+-----|
    477	| 802.11 MAC Header |       LLC     | IP Header | TCP Packet | FCS |
    478			    | Others | Tpye |
    479
    480 * Therefore, we need translate mask_from_OS to mask_to_hw.
    481 * We should left-shift mask by 6 bits, then set the new bit[0~5] = 0,
    482 * because new mask[0~5] means 'SA', but our HW packet begins from LLC,
    483 * bit[0~5] corresponds to first 6 Bytes in LLC, they just don't match.
    484 ******************************************************************************/
    485
    486		/* Shift 6 bits */
    487		for (j = 0; j < mask_len - 1; j++) {
    488			mask[j] = mask_os[j] >> 6;
    489			mask[j] |= (mask_os[j + 1] & 0x3F) << 2;
    490		}
    491		mask[j] = (mask_os[j] >> 6) & 0x3F;
    492		/* Set bit 0-5 to zero */
    493		mask[0] &= 0xC0;
    494
    495		RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
    496			      "mask to hw\n", mask, mask_len);
    497		for (j = 0; j < (MAX_WOL_BIT_MASK_SIZE + 1) / 4; j++) {
    498			rtl_pattern.mask[j] = mask[j * 4];
    499			rtl_pattern.mask[j] |= (mask[j * 4 + 1] << 8);
    500			rtl_pattern.mask[j] |= (mask[j * 4 + 2] << 16);
    501			rtl_pattern.mask[j] |= (mask[j * 4 + 3] << 24);
    502		}
    503
    504		/* To get the wake up pattern from the mask.
    505		 * We do not count first 12 bits which means
    506		 * DA[6] and SA[6] in the pattern to match HW design.
    507		 */
    508		len = 0;
    509		for (j = 12; j < patterns[i].pattern_len; j++) {
    510			if ((mask_os[j / 8] >> (j % 8)) & 0x01) {
    511				content[len] = pattern_os[j];
    512				len++;
    513			}
    514		}
    515
    516		RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
    517			      "pattern to hw\n", content, len);
    518		/* 3. calculate crc */
    519		rtl_pattern.crc = _calculate_wol_pattern_crc(content, len);
    520		rtl_dbg(rtlpriv, COMP_POWER, DBG_TRACE,
    521			"CRC_Remainder = 0x%x\n", rtl_pattern.crc);
    522
    523		/* 4. write crc & mask_for_hw to hw */
    524		rtlpriv->cfg->ops->add_wowlan_pattern(hw, &rtl_pattern, i);
    525	}
    526	rtl_write_byte(rtlpriv, 0x698, wow->n_patterns);
    527}
    528
    529static int rtl_op_suspend(struct ieee80211_hw *hw,
    530			  struct cfg80211_wowlan *wow)
    531{
    532	struct rtl_priv *rtlpriv = rtl_priv(hw);
    533	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
    534	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
    535
    536	rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG, "\n");
    537	if (WARN_ON(!wow))
    538		return -EINVAL;
    539
    540	/* to resolve s4 can not wake up*/
    541	rtlhal->last_suspend_sec = ktime_get_real_seconds();
    542
    543	if ((ppsc->wo_wlan_mode & WAKE_ON_PATTERN_MATCH) && wow->n_patterns)
    544		_rtl_add_wowlan_patterns(hw, wow);
    545
    546	rtlhal->driver_is_goingto_unload = true;
    547	rtlhal->enter_pnp_sleep = true;
    548
    549	rtl_lps_leave(hw, true);
    550	rtl_op_stop(hw);
    551	device_set_wakeup_enable(wiphy_dev(hw->wiphy), true);
    552	return 0;
    553}
    554
    555static int rtl_op_resume(struct ieee80211_hw *hw)
    556{
    557	struct rtl_priv *rtlpriv = rtl_priv(hw);
    558	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
    559	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
    560	time64_t now;
    561
    562	rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG, "\n");
    563	rtlhal->driver_is_goingto_unload = false;
    564	rtlhal->enter_pnp_sleep = false;
    565	rtlhal->wake_from_pnp_sleep = true;
    566
    567	/* to resolve s4 can not wake up*/
    568	now = ktime_get_real_seconds();
    569	if (now - rtlhal->last_suspend_sec < 5)
    570		return -1;
    571
    572	rtl_op_start(hw);
    573	device_set_wakeup_enable(wiphy_dev(hw->wiphy), false);
    574	ieee80211_resume_disconnect(mac->vif);
    575	rtlhal->wake_from_pnp_sleep = false;
    576	return 0;
    577}
    578#endif
    579
    580static int rtl_op_config(struct ieee80211_hw *hw, u32 changed)
    581{
    582	struct rtl_priv *rtlpriv = rtl_priv(hw);
    583	struct rtl_phy *rtlphy = &(rtlpriv->phy);
    584	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
    585	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
    586	struct ieee80211_conf *conf = &hw->conf;
    587
    588	if (mac->skip_scan)
    589		return 1;
    590
    591	mutex_lock(&rtlpriv->locks.conf_mutex);
    592	if (changed & IEEE80211_CONF_CHANGE_LISTEN_INTERVAL) {	/* BIT(2)*/
    593		rtl_dbg(rtlpriv, COMP_MAC80211, DBG_LOUD,
    594			"IEEE80211_CONF_CHANGE_LISTEN_INTERVAL\n");
    595	}
    596
    597	/*For IPS */
    598	if (changed & IEEE80211_CONF_CHANGE_IDLE) {
    599		if (hw->conf.flags & IEEE80211_CONF_IDLE)
    600			rtl_ips_nic_off(hw);
    601		else
    602			rtl_ips_nic_on(hw);
    603	} else {
    604		/*
    605		 *although rfoff may not cause by ips, but we will
    606		 *check the reason in set_rf_power_state function
    607		 */
    608		if (unlikely(ppsc->rfpwr_state == ERFOFF))
    609			rtl_ips_nic_on(hw);
    610	}
    611
    612	/*For LPS */
    613	if ((changed & IEEE80211_CONF_CHANGE_PS) &&
    614	    rtlpriv->psc.swctrl_lps && !rtlpriv->psc.fwctrl_lps) {
    615		cancel_delayed_work(&rtlpriv->works.ps_work);
    616		cancel_delayed_work(&rtlpriv->works.ps_rfon_wq);
    617		if (conf->flags & IEEE80211_CONF_PS) {
    618			rtlpriv->psc.sw_ps_enabled = true;
    619			/* sleep here is must, or we may recv the beacon and
    620			 * cause mac80211 into wrong ps state, this will cause
    621			 * power save nullfunc send fail, and further cause
    622			 * pkt loss, So sleep must quickly but not immediatly
    623			 * because that will cause nullfunc send by mac80211
    624			 * fail, and cause pkt loss, we have tested that 5mA
    625			 * is worked very well */
    626			if (!rtlpriv->psc.multi_buffered)
    627				queue_delayed_work(rtlpriv->works.rtl_wq,
    628						   &rtlpriv->works.ps_work,
    629						   MSECS(5));
    630		} else {
    631			rtl_swlps_rf_awake(hw);
    632			rtlpriv->psc.sw_ps_enabled = false;
    633		}
    634	}
    635
    636	if (changed & IEEE80211_CONF_CHANGE_RETRY_LIMITS) {
    637		rtl_dbg(rtlpriv, COMP_MAC80211, DBG_LOUD,
    638			"IEEE80211_CONF_CHANGE_RETRY_LIMITS %x\n",
    639			hw->conf.long_frame_max_tx_count);
    640		/* brought up everything changes (changed == ~0) indicates first
    641		 * open, so use our default value instead of that of wiphy.
    642		 */
    643		if (changed != ~0) {
    644			mac->retry_long = hw->conf.long_frame_max_tx_count;
    645			mac->retry_short = hw->conf.long_frame_max_tx_count;
    646			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RETRY_LIMIT,
    647				(u8 *)(&hw->conf.long_frame_max_tx_count));
    648		}
    649	}
    650
    651	if (changed & IEEE80211_CONF_CHANGE_CHANNEL &&
    652	    !rtlpriv->proximity.proxim_on) {
    653		struct ieee80211_channel *channel = hw->conf.chandef.chan;
    654		enum nl80211_chan_width width = hw->conf.chandef.width;
    655		enum nl80211_channel_type channel_type = NL80211_CHAN_NO_HT;
    656		u8 wide_chan = (u8) channel->hw_value;
    657
    658		/* channel_type is for 20&40M */
    659		if (width < NL80211_CHAN_WIDTH_80)
    660			channel_type =
    661				cfg80211_get_chandef_type(&hw->conf.chandef);
    662		if (mac->act_scanning)
    663			mac->n_channels++;
    664
    665		if (rtlpriv->dm.supp_phymode_switch &&
    666			mac->link_state < MAC80211_LINKED &&
    667			!mac->act_scanning) {
    668			if (rtlpriv->cfg->ops->chk_switch_dmdp)
    669				rtlpriv->cfg->ops->chk_switch_dmdp(hw);
    670		}
    671
    672		/*
    673		 *because we should back channel to
    674		 *current_network.chan in in scanning,
    675		 *So if set_chan == current_network.chan
    676		 *we should set it.
    677		 *because mac80211 tell us wrong bw40
    678		 *info for cisco1253 bw20, so we modify
    679		 *it here based on UPPER & LOWER
    680		 */
    681
    682		if (width >= NL80211_CHAN_WIDTH_80) {
    683			if (width == NL80211_CHAN_WIDTH_80) {
    684				u32 center = hw->conf.chandef.center_freq1;
    685				u32 primary =
    686				(u32)hw->conf.chandef.chan->center_freq;
    687
    688				rtlphy->current_chan_bw =
    689					HT_CHANNEL_WIDTH_80;
    690				mac->bw_80 = true;
    691				mac->bw_40 = true;
    692				if (center > primary) {
    693					mac->cur_80_prime_sc =
    694					PRIME_CHNL_OFFSET_LOWER;
    695					if (center - primary == 10) {
    696						mac->cur_40_prime_sc =
    697						PRIME_CHNL_OFFSET_UPPER;
    698
    699						wide_chan += 2;
    700					} else if (center - primary == 30) {
    701						mac->cur_40_prime_sc =
    702						PRIME_CHNL_OFFSET_LOWER;
    703
    704						wide_chan += 6;
    705					}
    706				} else {
    707					mac->cur_80_prime_sc =
    708					PRIME_CHNL_OFFSET_UPPER;
    709					if (primary - center == 10) {
    710						mac->cur_40_prime_sc =
    711						PRIME_CHNL_OFFSET_LOWER;
    712
    713						wide_chan -= 2;
    714					} else if (primary - center == 30) {
    715						mac->cur_40_prime_sc =
    716						PRIME_CHNL_OFFSET_UPPER;
    717
    718						wide_chan -= 6;
    719					}
    720				}
    721			}
    722		} else {
    723			switch (channel_type) {
    724			case NL80211_CHAN_HT20:
    725			case NL80211_CHAN_NO_HT:
    726					/* SC */
    727					mac->cur_40_prime_sc =
    728						PRIME_CHNL_OFFSET_DONT_CARE;
    729					rtlphy->current_chan_bw =
    730						HT_CHANNEL_WIDTH_20;
    731					mac->bw_40 = false;
    732					mac->bw_80 = false;
    733					break;
    734			case NL80211_CHAN_HT40MINUS:
    735					/* SC */
    736					mac->cur_40_prime_sc =
    737						PRIME_CHNL_OFFSET_UPPER;
    738					rtlphy->current_chan_bw =
    739						HT_CHANNEL_WIDTH_20_40;
    740					mac->bw_40 = true;
    741					mac->bw_80 = false;
    742
    743					/*wide channel */
    744					wide_chan -= 2;
    745
    746					break;
    747			case NL80211_CHAN_HT40PLUS:
    748					/* SC */
    749					mac->cur_40_prime_sc =
    750						PRIME_CHNL_OFFSET_LOWER;
    751					rtlphy->current_chan_bw =
    752						HT_CHANNEL_WIDTH_20_40;
    753					mac->bw_40 = true;
    754					mac->bw_80 = false;
    755
    756					/*wide channel */
    757					wide_chan += 2;
    758
    759					break;
    760			default:
    761					mac->bw_40 = false;
    762					mac->bw_80 = false;
    763					pr_err("switch case %#x not processed\n",
    764					       channel_type);
    765					break;
    766			}
    767		}
    768
    769		if (wide_chan <= 0)
    770			wide_chan = 1;
    771
    772		/* In scanning, when before we offchannel we may send a ps=1
    773		 * null to AP, and then we may send a ps = 0 null to AP quickly,
    774		 * but first null may have caused AP to put lots of packet to
    775		 * hw tx buffer. These packets must be tx'd before we go off
    776		 * channel so we must delay more time to let AP flush these
    777		 * packets before going offchannel, or dis-association or
    778		 * delete BA will be caused by AP
    779		 */
    780		if (rtlpriv->mac80211.offchan_delay) {
    781			rtlpriv->mac80211.offchan_delay = false;
    782			mdelay(50);
    783		}
    784
    785		rtlphy->current_channel = wide_chan;
    786
    787		rtlpriv->cfg->ops->switch_channel(hw);
    788		rtlpriv->cfg->ops->set_channel_access(hw);
    789		rtlpriv->cfg->ops->set_bw_mode(hw, channel_type);
    790	}
    791
    792	mutex_unlock(&rtlpriv->locks.conf_mutex);
    793
    794	return 0;
    795}
    796
    797static void rtl_op_configure_filter(struct ieee80211_hw *hw,
    798				    unsigned int changed_flags,
    799				    unsigned int *new_flags, u64 multicast)
    800{
    801	bool update_rcr = false;
    802	struct rtl_priv *rtlpriv = rtl_priv(hw);
    803	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
    804
    805	*new_flags &= RTL_SUPPORTED_FILTERS;
    806	if (0 == changed_flags)
    807		return;
    808
    809	/*TODO: we disable broadcast now, so enable here */
    810	if (changed_flags & FIF_ALLMULTI) {
    811		if (*new_flags & FIF_ALLMULTI) {
    812			mac->rx_conf |= rtlpriv->cfg->maps[MAC_RCR_AM] |
    813			    rtlpriv->cfg->maps[MAC_RCR_AB];
    814			rtl_dbg(rtlpriv, COMP_MAC80211, DBG_LOUD,
    815				"Enable receive multicast frame\n");
    816		} else {
    817			mac->rx_conf &= ~(rtlpriv->cfg->maps[MAC_RCR_AM] |
    818					  rtlpriv->cfg->maps[MAC_RCR_AB]);
    819			rtl_dbg(rtlpriv, COMP_MAC80211, DBG_LOUD,
    820				"Disable receive multicast frame\n");
    821		}
    822		update_rcr = true;
    823	}
    824
    825	if (changed_flags & FIF_FCSFAIL) {
    826		if (*new_flags & FIF_FCSFAIL) {
    827			mac->rx_conf |= rtlpriv->cfg->maps[MAC_RCR_ACRC32];
    828			rtl_dbg(rtlpriv, COMP_MAC80211, DBG_LOUD,
    829				"Enable receive FCS error frame\n");
    830		} else {
    831			mac->rx_conf &= ~rtlpriv->cfg->maps[MAC_RCR_ACRC32];
    832			rtl_dbg(rtlpriv, COMP_MAC80211, DBG_LOUD,
    833				"Disable receive FCS error frame\n");
    834		}
    835		if (!update_rcr)
    836			update_rcr = true;
    837	}
    838
    839	/* if ssid not set to hw don't check bssid
    840	 * here just used for linked scanning, & linked
    841	 * and nolink check bssid is set in set network_type
    842	 */
    843	if (changed_flags & FIF_BCN_PRBRESP_PROMISC &&
    844	    mac->link_state >= MAC80211_LINKED) {
    845		if (mac->opmode != NL80211_IFTYPE_AP &&
    846		    mac->opmode != NL80211_IFTYPE_MESH_POINT) {
    847			if (*new_flags & FIF_BCN_PRBRESP_PROMISC)
    848				rtlpriv->cfg->ops->set_chk_bssid(hw, false);
    849			else
    850				rtlpriv->cfg->ops->set_chk_bssid(hw, true);
    851			if (update_rcr)
    852				update_rcr = false;
    853		}
    854	}
    855
    856	if (changed_flags & FIF_CONTROL) {
    857		if (*new_flags & FIF_CONTROL) {
    858			mac->rx_conf |= rtlpriv->cfg->maps[MAC_RCR_ACF];
    859
    860			rtl_dbg(rtlpriv, COMP_MAC80211, DBG_LOUD,
    861				"Enable receive control frame.\n");
    862		} else {
    863			mac->rx_conf &= ~rtlpriv->cfg->maps[MAC_RCR_ACF];
    864			rtl_dbg(rtlpriv, COMP_MAC80211, DBG_LOUD,
    865				"Disable receive control frame.\n");
    866		}
    867		if (!update_rcr)
    868			update_rcr = true;
    869	}
    870
    871	if (changed_flags & FIF_OTHER_BSS) {
    872		if (*new_flags & FIF_OTHER_BSS) {
    873			mac->rx_conf |= rtlpriv->cfg->maps[MAC_RCR_AAP];
    874			rtl_dbg(rtlpriv, COMP_MAC80211, DBG_LOUD,
    875				"Enable receive other BSS's frame.\n");
    876		} else {
    877			mac->rx_conf &= ~rtlpriv->cfg->maps[MAC_RCR_AAP];
    878			rtl_dbg(rtlpriv, COMP_MAC80211, DBG_LOUD,
    879				"Disable receive other BSS's frame.\n");
    880		}
    881		if (!update_rcr)
    882			update_rcr = true;
    883	}
    884
    885	if (update_rcr)
    886		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
    887					      (u8 *)(&mac->rx_conf));
    888}
    889
    890static int rtl_op_sta_add(struct ieee80211_hw *hw,
    891			 struct ieee80211_vif *vif,
    892			 struct ieee80211_sta *sta)
    893{
    894	struct rtl_priv *rtlpriv = rtl_priv(hw);
    895	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
    896	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
    897	struct rtl_sta_info *sta_entry;
    898
    899	if (sta) {
    900		sta_entry = (struct rtl_sta_info *)sta->drv_priv;
    901		spin_lock_bh(&rtlpriv->locks.entry_list_lock);
    902		list_add_tail(&sta_entry->list, &rtlpriv->entry_list);
    903		spin_unlock_bh(&rtlpriv->locks.entry_list_lock);
    904		if (rtlhal->current_bandtype == BAND_ON_2_4G) {
    905			sta_entry->wireless_mode = WIRELESS_MODE_G;
    906			if (sta->deflink.supp_rates[0] <= 0xf)
    907				sta_entry->wireless_mode = WIRELESS_MODE_B;
    908			if (sta->deflink.ht_cap.ht_supported)
    909				sta_entry->wireless_mode = WIRELESS_MODE_N_24G;
    910
    911			if (vif->type == NL80211_IFTYPE_ADHOC)
    912				sta_entry->wireless_mode = WIRELESS_MODE_G;
    913		} else if (rtlhal->current_bandtype == BAND_ON_5G) {
    914			sta_entry->wireless_mode = WIRELESS_MODE_A;
    915			if (sta->deflink.ht_cap.ht_supported)
    916				sta_entry->wireless_mode = WIRELESS_MODE_N_5G;
    917			if (sta->deflink.vht_cap.vht_supported)
    918				sta_entry->wireless_mode = WIRELESS_MODE_AC_5G;
    919
    920			if (vif->type == NL80211_IFTYPE_ADHOC)
    921				sta_entry->wireless_mode = WIRELESS_MODE_A;
    922		}
    923		/*disable cck rate for p2p*/
    924		if (mac->p2p)
    925			sta->deflink.supp_rates[0] &= 0xfffffff0;
    926
    927		memcpy(sta_entry->mac_addr, sta->addr, ETH_ALEN);
    928		rtl_dbg(rtlpriv, COMP_MAC80211, DBG_DMESG,
    929			"Add sta addr is %pM\n", sta->addr);
    930		rtlpriv->cfg->ops->update_rate_tbl(hw, sta, 0, true);
    931	}
    932
    933	return 0;
    934}
    935
    936static int rtl_op_sta_remove(struct ieee80211_hw *hw,
    937				struct ieee80211_vif *vif,
    938				struct ieee80211_sta *sta)
    939{
    940	struct rtl_priv *rtlpriv = rtl_priv(hw);
    941	struct rtl_sta_info *sta_entry;
    942
    943	if (sta) {
    944		rtl_dbg(rtlpriv, COMP_MAC80211, DBG_DMESG,
    945			"Remove sta addr is %pM\n", sta->addr);
    946		sta_entry = (struct rtl_sta_info *)sta->drv_priv;
    947		sta_entry->wireless_mode = 0;
    948		sta_entry->ratr_index = 0;
    949		spin_lock_bh(&rtlpriv->locks.entry_list_lock);
    950		list_del(&sta_entry->list);
    951		spin_unlock_bh(&rtlpriv->locks.entry_list_lock);
    952	}
    953	return 0;
    954}
    955
    956static int _rtl_get_hal_qnum(u16 queue)
    957{
    958	int qnum;
    959
    960	switch (queue) {
    961	case 0:
    962		qnum = AC3_VO;
    963		break;
    964	case 1:
    965		qnum = AC2_VI;
    966		break;
    967	case 2:
    968		qnum = AC0_BE;
    969		break;
    970	case 3:
    971		qnum = AC1_BK;
    972		break;
    973	default:
    974		qnum = AC0_BE;
    975		break;
    976	}
    977	return qnum;
    978}
    979
    980/*
    981 *for mac80211 VO = 0, VI = 1, BE = 2, BK = 3
    982 *for rtl819x  BE = 0, BK = 1, VI = 2, VO = 3
    983 */
    984static int rtl_op_conf_tx(struct ieee80211_hw *hw,
    985			  struct ieee80211_vif *vif, u16 queue,
    986			  const struct ieee80211_tx_queue_params *param)
    987{
    988	struct rtl_priv *rtlpriv = rtl_priv(hw);
    989	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
    990	int aci;
    991
    992	if (queue >= AC_MAX) {
    993		rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
    994			"queue number %d is incorrect!\n", queue);
    995		return -EINVAL;
    996	}
    997
    998	aci = _rtl_get_hal_qnum(queue);
    999	mac->ac[aci].aifs = param->aifs;
   1000	mac->ac[aci].cw_min = cpu_to_le16(param->cw_min);
   1001	mac->ac[aci].cw_max = cpu_to_le16(param->cw_max);
   1002	mac->ac[aci].tx_op = cpu_to_le16(param->txop);
   1003	memcpy(&mac->edca_param[aci], param, sizeof(*param));
   1004	rtlpriv->cfg->ops->set_qos(hw, aci);
   1005	return 0;
   1006}
   1007
   1008static void send_beacon_frame(struct ieee80211_hw *hw,
   1009			      struct ieee80211_vif *vif)
   1010{
   1011	struct rtl_priv *rtlpriv = rtl_priv(hw);
   1012	struct sk_buff *skb = ieee80211_beacon_get(hw, vif);
   1013	struct rtl_tcb_desc tcb_desc;
   1014
   1015	if (skb) {
   1016		memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc));
   1017		rtlpriv->intf_ops->adapter_tx(hw, NULL, skb, &tcb_desc);
   1018	}
   1019}
   1020
   1021void rtl_update_beacon_work_callback(struct work_struct *work)
   1022{
   1023	struct rtl_works *rtlworks =
   1024	    container_of(work, struct rtl_works, update_beacon_work);
   1025	struct ieee80211_hw *hw = rtlworks->hw;
   1026	struct rtl_priv *rtlpriv = rtl_priv(hw);
   1027	struct ieee80211_vif *vif = rtlpriv->mac80211.vif;
   1028
   1029	if (!vif) {
   1030		WARN_ONCE(true, "no vif to update beacon\n");
   1031		return;
   1032	}
   1033
   1034	mutex_lock(&rtlpriv->locks.conf_mutex);
   1035	send_beacon_frame(hw, vif);
   1036	mutex_unlock(&rtlpriv->locks.conf_mutex);
   1037}
   1038EXPORT_SYMBOL_GPL(rtl_update_beacon_work_callback);
   1039
   1040static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
   1041				    struct ieee80211_vif *vif,
   1042				    struct ieee80211_bss_conf *bss_conf,
   1043				    u32 changed)
   1044{
   1045	struct rtl_priv *rtlpriv = rtl_priv(hw);
   1046	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
   1047	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
   1048	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
   1049
   1050	mutex_lock(&rtlpriv->locks.conf_mutex);
   1051	if (vif->type == NL80211_IFTYPE_ADHOC ||
   1052	    vif->type == NL80211_IFTYPE_AP ||
   1053	    vif->type == NL80211_IFTYPE_MESH_POINT) {
   1054		if (changed & BSS_CHANGED_BEACON ||
   1055		    (changed & BSS_CHANGED_BEACON_ENABLED &&
   1056		     bss_conf->enable_beacon)) {
   1057			if (mac->beacon_enabled == 0) {
   1058				rtl_dbg(rtlpriv, COMP_MAC80211, DBG_DMESG,
   1059					"BSS_CHANGED_BEACON_ENABLED\n");
   1060
   1061				/*start hw beacon interrupt. */
   1062				/*rtlpriv->cfg->ops->set_bcn_reg(hw); */
   1063				mac->beacon_enabled = 1;
   1064				rtlpriv->cfg->ops->update_interrupt_mask(hw,
   1065						rtlpriv->cfg->maps
   1066						[RTL_IBSS_INT_MASKS], 0);
   1067
   1068				if (rtlpriv->cfg->ops->linked_set_reg)
   1069					rtlpriv->cfg->ops->linked_set_reg(hw);
   1070				send_beacon_frame(hw, vif);
   1071			}
   1072		}
   1073		if ((changed & BSS_CHANGED_BEACON_ENABLED &&
   1074		    !bss_conf->enable_beacon)) {
   1075			if (mac->beacon_enabled == 1) {
   1076				rtl_dbg(rtlpriv, COMP_MAC80211, DBG_DMESG,
   1077					"ADHOC DISABLE BEACON\n");
   1078
   1079				mac->beacon_enabled = 0;
   1080				rtlpriv->cfg->ops->update_interrupt_mask(hw, 0,
   1081						rtlpriv->cfg->maps
   1082						[RTL_IBSS_INT_MASKS]);
   1083			}
   1084		}
   1085		if (changed & BSS_CHANGED_BEACON_INT) {
   1086			rtl_dbg(rtlpriv, COMP_BEACON, DBG_TRACE,
   1087				"BSS_CHANGED_BEACON_INT\n");
   1088			mac->beacon_interval = bss_conf->beacon_int;
   1089			rtlpriv->cfg->ops->set_bcn_intv(hw);
   1090		}
   1091	}
   1092
   1093	/*TODO: reference to enum ieee80211_bss_change */
   1094	if (changed & BSS_CHANGED_ASSOC) {
   1095		u8 mstatus;
   1096
   1097		if (bss_conf->assoc) {
   1098			struct ieee80211_sta *sta = NULL;
   1099			u8 keep_alive = 10;
   1100
   1101			mstatus = RT_MEDIA_CONNECT;
   1102			/* we should reset all sec info & cam
   1103			 * before set cam after linked, we should not
   1104			 * reset in disassoc, that will cause tkip->wep
   1105			 * fail because some flag will be wrong */
   1106			/* reset sec info */
   1107			rtl_cam_reset_sec_info(hw);
   1108			/* reset cam to fix wep fail issue
   1109			 * when change from wpa to wep */
   1110			rtl_cam_reset_all_entry(hw);
   1111
   1112			mac->link_state = MAC80211_LINKED;
   1113			mac->cnt_after_linked = 0;
   1114			mac->assoc_id = bss_conf->aid;
   1115			memcpy(mac->bssid, bss_conf->bssid, ETH_ALEN);
   1116
   1117			if (rtlpriv->cfg->ops->linked_set_reg)
   1118				rtlpriv->cfg->ops->linked_set_reg(hw);
   1119
   1120			rcu_read_lock();
   1121			sta = ieee80211_find_sta(vif, (u8 *)bss_conf->bssid);
   1122			if (!sta) {
   1123				rcu_read_unlock();
   1124				goto out;
   1125			}
   1126			rtl_dbg(rtlpriv, COMP_EASY_CONCURRENT, DBG_LOUD,
   1127				"send PS STATIC frame\n");
   1128			if (rtlpriv->dm.supp_phymode_switch) {
   1129				if (sta->deflink.ht_cap.ht_supported)
   1130					rtl_send_smps_action(hw, sta,
   1131							IEEE80211_SMPS_STATIC);
   1132			}
   1133
   1134			if (rtlhal->current_bandtype == BAND_ON_5G) {
   1135				mac->mode = WIRELESS_MODE_A;
   1136			} else {
   1137				if (sta->deflink.supp_rates[0] <= 0xf)
   1138					mac->mode = WIRELESS_MODE_B;
   1139				else
   1140					mac->mode = WIRELESS_MODE_G;
   1141			}
   1142
   1143			if (sta->deflink.ht_cap.ht_supported) {
   1144				if (rtlhal->current_bandtype == BAND_ON_2_4G)
   1145					mac->mode = WIRELESS_MODE_N_24G;
   1146				else
   1147					mac->mode = WIRELESS_MODE_N_5G;
   1148			}
   1149
   1150			if (sta->deflink.vht_cap.vht_supported) {
   1151				if (rtlhal->current_bandtype == BAND_ON_5G)
   1152					mac->mode = WIRELESS_MODE_AC_5G;
   1153				else
   1154					mac->mode = WIRELESS_MODE_AC_24G;
   1155			}
   1156
   1157			if (vif->type == NL80211_IFTYPE_STATION)
   1158				rtlpriv->cfg->ops->update_rate_tbl(hw, sta, 0,
   1159								   true);
   1160			rcu_read_unlock();
   1161
   1162			/* to avoid AP Disassociation caused by inactivity */
   1163			rtlpriv->cfg->ops->set_hw_reg(hw,
   1164						      HW_VAR_KEEP_ALIVE,
   1165						      (u8 *)(&keep_alive));
   1166
   1167			rtl_dbg(rtlpriv, COMP_MAC80211, DBG_DMESG,
   1168				"BSS_CHANGED_ASSOC\n");
   1169		} else {
   1170			struct cfg80211_bss *bss = NULL;
   1171
   1172			mstatus = RT_MEDIA_DISCONNECT;
   1173
   1174			if (mac->link_state == MAC80211_LINKED)
   1175				rtl_lps_leave(hw, true);
   1176			if (ppsc->p2p_ps_info.p2p_ps_mode > P2P_PS_NONE)
   1177				rtl_p2p_ps_cmd(hw, P2P_PS_DISABLE);
   1178			mac->link_state = MAC80211_NOLINK;
   1179
   1180			bss = cfg80211_get_bss(hw->wiphy, NULL,
   1181					       (u8 *)mac->bssid, NULL, 0,
   1182					       IEEE80211_BSS_TYPE_ESS,
   1183					       IEEE80211_PRIVACY_OFF);
   1184
   1185			rtl_dbg(rtlpriv, COMP_MAC80211, DBG_DMESG,
   1186				"bssid = %pMF\n", mac->bssid);
   1187
   1188			if (bss) {
   1189				cfg80211_unlink_bss(hw->wiphy, bss);
   1190				cfg80211_put_bss(hw->wiphy, bss);
   1191				rtl_dbg(rtlpriv, COMP_MAC80211, DBG_DMESG,
   1192					"cfg80211_unlink !!\n");
   1193			}
   1194
   1195			eth_zero_addr(mac->bssid);
   1196			mac->vendor = PEER_UNKNOWN;
   1197			mac->mode = 0;
   1198
   1199			if (rtlpriv->dm.supp_phymode_switch) {
   1200				if (rtlpriv->cfg->ops->chk_switch_dmdp)
   1201					rtlpriv->cfg->ops->chk_switch_dmdp(hw);
   1202			}
   1203			rtl_dbg(rtlpriv, COMP_MAC80211, DBG_DMESG,
   1204				"BSS_CHANGED_UN_ASSOC\n");
   1205		}
   1206		rtlpriv->cfg->ops->set_network_type(hw, vif->type);
   1207		/* For FW LPS:
   1208		 * To tell firmware we have connected or disconnected
   1209		 */
   1210		rtlpriv->cfg->ops->set_hw_reg(hw,
   1211					      HW_VAR_H2C_FW_JOINBSSRPT,
   1212					      (u8 *)(&mstatus));
   1213		ppsc->report_linked = (mstatus == RT_MEDIA_CONNECT) ?
   1214				      true : false;
   1215
   1216		if (rtlpriv->cfg->ops->get_btc_status())
   1217			rtlpriv->btcoexist.btc_ops->btc_mediastatus_notify(
   1218							rtlpriv, mstatus);
   1219	}
   1220
   1221	if (changed & BSS_CHANGED_ERP_CTS_PROT) {
   1222		rtl_dbg(rtlpriv, COMP_MAC80211, DBG_TRACE,
   1223			"BSS_CHANGED_ERP_CTS_PROT\n");
   1224		mac->use_cts_protect = bss_conf->use_cts_prot;
   1225	}
   1226
   1227	if (changed & BSS_CHANGED_ERP_PREAMBLE) {
   1228		rtl_dbg(rtlpriv, COMP_MAC80211, DBG_LOUD,
   1229			"BSS_CHANGED_ERP_PREAMBLE use short preamble:%x\n",
   1230			  bss_conf->use_short_preamble);
   1231
   1232		mac->short_preamble = bss_conf->use_short_preamble;
   1233		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ACK_PREAMBLE,
   1234					      (u8 *)(&mac->short_preamble));
   1235	}
   1236
   1237	if (changed & BSS_CHANGED_ERP_SLOT) {
   1238		rtl_dbg(rtlpriv, COMP_MAC80211, DBG_TRACE,
   1239			"BSS_CHANGED_ERP_SLOT\n");
   1240
   1241		if (bss_conf->use_short_slot)
   1242			mac->slot_time = RTL_SLOT_TIME_9;
   1243		else
   1244			mac->slot_time = RTL_SLOT_TIME_20;
   1245
   1246		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SLOT_TIME,
   1247					      (u8 *)(&mac->slot_time));
   1248	}
   1249
   1250	if (changed & BSS_CHANGED_HT) {
   1251		struct ieee80211_sta *sta = NULL;
   1252
   1253		rtl_dbg(rtlpriv, COMP_MAC80211, DBG_TRACE,
   1254			"BSS_CHANGED_HT\n");
   1255
   1256		rcu_read_lock();
   1257		sta = ieee80211_find_sta(vif, (u8 *)bss_conf->bssid);
   1258		if (sta) {
   1259			if (sta->deflink.ht_cap.ampdu_density >
   1260			    mac->current_ampdu_density)
   1261				mac->current_ampdu_density =
   1262				    sta->deflink.ht_cap.ampdu_density;
   1263			if (sta->deflink.ht_cap.ampdu_factor <
   1264			    mac->current_ampdu_factor)
   1265				mac->current_ampdu_factor =
   1266				    sta->deflink.ht_cap.ampdu_factor;
   1267		}
   1268		rcu_read_unlock();
   1269
   1270		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SHORTGI_DENSITY,
   1271					      (u8 *)(&mac->max_mss_density));
   1272		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AMPDU_FACTOR,
   1273					      &mac->current_ampdu_factor);
   1274		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AMPDU_MIN_SPACE,
   1275					      &mac->current_ampdu_density);
   1276	}
   1277
   1278	if (changed & BSS_CHANGED_BSSID) {
   1279		u32 basic_rates;
   1280		struct ieee80211_sta *sta = NULL;
   1281
   1282		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_BSSID,
   1283					      (u8 *)bss_conf->bssid);
   1284
   1285		rtl_dbg(rtlpriv, COMP_MAC80211, DBG_DMESG,
   1286			"bssid: %pM\n", bss_conf->bssid);
   1287
   1288		mac->vendor = PEER_UNKNOWN;
   1289		memcpy(mac->bssid, bss_conf->bssid, ETH_ALEN);
   1290
   1291		rcu_read_lock();
   1292		sta = ieee80211_find_sta(vif, (u8 *)bss_conf->bssid);
   1293		if (!sta) {
   1294			rcu_read_unlock();
   1295			goto out;
   1296		}
   1297
   1298		if (rtlhal->current_bandtype == BAND_ON_5G) {
   1299			mac->mode = WIRELESS_MODE_A;
   1300		} else {
   1301			if (sta->deflink.supp_rates[0] <= 0xf)
   1302				mac->mode = WIRELESS_MODE_B;
   1303			else
   1304				mac->mode = WIRELESS_MODE_G;
   1305		}
   1306
   1307		if (sta->deflink.ht_cap.ht_supported) {
   1308			if (rtlhal->current_bandtype == BAND_ON_2_4G)
   1309				mac->mode = WIRELESS_MODE_N_24G;
   1310			else
   1311				mac->mode = WIRELESS_MODE_N_5G;
   1312		}
   1313
   1314		if (sta->deflink.vht_cap.vht_supported) {
   1315			if (rtlhal->current_bandtype == BAND_ON_5G)
   1316				mac->mode = WIRELESS_MODE_AC_5G;
   1317			else
   1318				mac->mode = WIRELESS_MODE_AC_24G;
   1319		}
   1320
   1321		/* just station need it, because ibss & ap mode will
   1322		 * set in sta_add, and will be NULL here */
   1323		if (vif->type == NL80211_IFTYPE_STATION) {
   1324			struct rtl_sta_info *sta_entry;
   1325
   1326			sta_entry = (struct rtl_sta_info *)sta->drv_priv;
   1327			sta_entry->wireless_mode = mac->mode;
   1328		}
   1329
   1330		if (sta->deflink.ht_cap.ht_supported) {
   1331			mac->ht_enable = true;
   1332
   1333			/*
   1334			 * for cisco 1252 bw20 it's wrong
   1335			 * if (ht_cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) {
   1336			 *	mac->bw_40 = true;
   1337			 * }
   1338			 * */
   1339		}
   1340
   1341		if (sta->deflink.vht_cap.vht_supported)
   1342			mac->vht_enable = true;
   1343
   1344		if (changed & BSS_CHANGED_BASIC_RATES) {
   1345			/* for 5G must << RATE_6M_INDEX = 4,
   1346			 * because 5G have no cck rate*/
   1347			if (rtlhal->current_bandtype == BAND_ON_5G)
   1348				basic_rates = sta->deflink.supp_rates[1] << 4;
   1349			else
   1350				basic_rates = sta->deflink.supp_rates[0];
   1351
   1352			mac->basic_rates = basic_rates;
   1353			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_BASIC_RATE,
   1354					(u8 *)(&basic_rates));
   1355		}
   1356		rcu_read_unlock();
   1357	}
   1358out:
   1359	mutex_unlock(&rtlpriv->locks.conf_mutex);
   1360}
   1361
   1362static u64 rtl_op_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
   1363{
   1364	struct rtl_priv *rtlpriv = rtl_priv(hw);
   1365	u64 tsf;
   1366
   1367	rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_CORRECT_TSF, (u8 *)(&tsf));
   1368	return tsf;
   1369}
   1370
   1371static void rtl_op_set_tsf(struct ieee80211_hw *hw,
   1372			   struct ieee80211_vif *vif, u64 tsf)
   1373{
   1374	struct rtl_priv *rtlpriv = rtl_priv(hw);
   1375	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
   1376	u8 bibss = (mac->opmode == NL80211_IFTYPE_ADHOC) ? 1 : 0;
   1377
   1378	mac->tsf = tsf;
   1379	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_CORRECT_TSF, (u8 *)(&bibss));
   1380}
   1381
   1382static void rtl_op_reset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
   1383{
   1384	struct rtl_priv *rtlpriv = rtl_priv(hw);
   1385	u8 tmp = 0;
   1386
   1387	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_DUAL_TSF_RST, (u8 *)(&tmp));
   1388}
   1389
   1390static void rtl_op_sta_notify(struct ieee80211_hw *hw,
   1391			      struct ieee80211_vif *vif,
   1392			      enum sta_notify_cmd cmd,
   1393			      struct ieee80211_sta *sta)
   1394{
   1395	switch (cmd) {
   1396	case STA_NOTIFY_SLEEP:
   1397		break;
   1398	case STA_NOTIFY_AWAKE:
   1399		break;
   1400	default:
   1401		break;
   1402	}
   1403}
   1404
   1405static int rtl_op_ampdu_action(struct ieee80211_hw *hw,
   1406			       struct ieee80211_vif *vif,
   1407			       struct ieee80211_ampdu_params *params)
   1408{
   1409	struct rtl_priv *rtlpriv = rtl_priv(hw);
   1410	struct ieee80211_sta *sta = params->sta;
   1411	enum ieee80211_ampdu_mlme_action action = params->action;
   1412	u16 tid = params->tid;
   1413	u16 *ssn = &params->ssn;
   1414
   1415	switch (action) {
   1416	case IEEE80211_AMPDU_TX_START:
   1417		rtl_dbg(rtlpriv, COMP_MAC80211, DBG_TRACE,
   1418			"IEEE80211_AMPDU_TX_START: TID:%d\n", tid);
   1419		return rtl_tx_agg_start(hw, vif, sta, tid, ssn);
   1420	case IEEE80211_AMPDU_TX_STOP_CONT:
   1421	case IEEE80211_AMPDU_TX_STOP_FLUSH:
   1422	case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
   1423		rtl_dbg(rtlpriv, COMP_MAC80211, DBG_TRACE,
   1424			"IEEE80211_AMPDU_TX_STOP: TID:%d\n", tid);
   1425		return rtl_tx_agg_stop(hw, vif, sta, tid);
   1426	case IEEE80211_AMPDU_TX_OPERATIONAL:
   1427		rtl_dbg(rtlpriv, COMP_MAC80211, DBG_TRACE,
   1428			"IEEE80211_AMPDU_TX_OPERATIONAL:TID:%d\n", tid);
   1429		rtl_tx_agg_oper(hw, sta, tid);
   1430		break;
   1431	case IEEE80211_AMPDU_RX_START:
   1432		rtl_dbg(rtlpriv, COMP_MAC80211, DBG_TRACE,
   1433			"IEEE80211_AMPDU_RX_START:TID:%d\n", tid);
   1434		return rtl_rx_agg_start(hw, sta, tid);
   1435	case IEEE80211_AMPDU_RX_STOP:
   1436		rtl_dbg(rtlpriv, COMP_MAC80211, DBG_TRACE,
   1437			"IEEE80211_AMPDU_RX_STOP:TID:%d\n", tid);
   1438		return rtl_rx_agg_stop(hw, sta, tid);
   1439	default:
   1440		pr_err("IEEE80211_AMPDU_ERR!!!!:\n");
   1441		return -EOPNOTSUPP;
   1442	}
   1443	return 0;
   1444}
   1445
   1446static void rtl_op_sw_scan_start(struct ieee80211_hw *hw,
   1447				 struct ieee80211_vif *vif,
   1448				 const u8 *mac_addr)
   1449{
   1450	struct rtl_priv *rtlpriv = rtl_priv(hw);
   1451	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
   1452
   1453	rtl_dbg(rtlpriv, COMP_MAC80211, DBG_LOUD, "\n");
   1454	mac->act_scanning = true;
   1455	if (rtlpriv->link_info.higher_busytraffic) {
   1456		mac->skip_scan = true;
   1457		return;
   1458	}
   1459
   1460	if (rtlpriv->cfg->ops->get_btc_status())
   1461		rtlpriv->btcoexist.btc_ops->btc_scan_notify(rtlpriv, 1);
   1462	else if (rtlpriv->btcoexist.btc_ops)
   1463		rtlpriv->btcoexist.btc_ops->btc_scan_notify_wifi_only(rtlpriv,
   1464								      1);
   1465
   1466	if (rtlpriv->dm.supp_phymode_switch) {
   1467		if (rtlpriv->cfg->ops->chk_switch_dmdp)
   1468			rtlpriv->cfg->ops->chk_switch_dmdp(hw);
   1469	}
   1470
   1471	if (mac->link_state == MAC80211_LINKED) {
   1472		rtl_lps_leave(hw, true);
   1473		mac->link_state = MAC80211_LINKED_SCANNING;
   1474	} else {
   1475		rtl_ips_nic_on(hw);
   1476	}
   1477
   1478	/* Dul mac */
   1479	rtlpriv->rtlhal.load_imrandiqk_setting_for2g = false;
   1480
   1481	rtlpriv->cfg->ops->led_control(hw, LED_CTL_SITE_SURVEY);
   1482	rtlpriv->cfg->ops->scan_operation_backup(hw, SCAN_OPT_BACKUP_BAND0);
   1483}
   1484
   1485static void rtl_op_sw_scan_complete(struct ieee80211_hw *hw,
   1486				    struct ieee80211_vif *vif)
   1487{
   1488	struct rtl_priv *rtlpriv = rtl_priv(hw);
   1489	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
   1490
   1491	rtl_dbg(rtlpriv, COMP_MAC80211, DBG_LOUD, "\n");
   1492	mac->act_scanning = false;
   1493	mac->skip_scan = false;
   1494
   1495	rtlpriv->btcoexist.btc_info.ap_num = rtlpriv->scan_list.num;
   1496
   1497	if (rtlpriv->link_info.higher_busytraffic)
   1498		return;
   1499
   1500	/* p2p will use 1/6/11 to scan */
   1501	if (mac->n_channels == 3)
   1502		mac->p2p_in_use = true;
   1503	else
   1504		mac->p2p_in_use = false;
   1505	mac->n_channels = 0;
   1506	/* Dul mac */
   1507	rtlpriv->rtlhal.load_imrandiqk_setting_for2g = false;
   1508
   1509	if (mac->link_state == MAC80211_LINKED_SCANNING) {
   1510		mac->link_state = MAC80211_LINKED;
   1511		if (mac->opmode == NL80211_IFTYPE_STATION) {
   1512			/* fix fwlps issue */
   1513			rtlpriv->cfg->ops->set_network_type(hw, mac->opmode);
   1514		}
   1515	}
   1516
   1517	rtlpriv->cfg->ops->scan_operation_backup(hw, SCAN_OPT_RESTORE);
   1518	if (rtlpriv->cfg->ops->get_btc_status())
   1519		rtlpriv->btcoexist.btc_ops->btc_scan_notify(rtlpriv, 0);
   1520	else if (rtlpriv->btcoexist.btc_ops)
   1521		rtlpriv->btcoexist.btc_ops->btc_scan_notify_wifi_only(rtlpriv,
   1522								      0);
   1523}
   1524
   1525static int rtl_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
   1526			  struct ieee80211_vif *vif, struct ieee80211_sta *sta,
   1527			  struct ieee80211_key_conf *key)
   1528{
   1529	struct rtl_priv *rtlpriv = rtl_priv(hw);
   1530	u8 key_type = NO_ENCRYPTION;
   1531	u8 key_idx;
   1532	bool group_key = false;
   1533	bool wep_only = false;
   1534	int err = 0;
   1535	u8 mac_addr[ETH_ALEN];
   1536	u8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
   1537
   1538	rtlpriv->btcoexist.btc_info.in_4way = false;
   1539
   1540	if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) {
   1541		rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
   1542			"not open hw encryption\n");
   1543		return -ENOSPC;	/*User disabled HW-crypto */
   1544	}
   1545	/* To support IBSS, use sw-crypto for GTK */
   1546	if ((vif->type == NL80211_IFTYPE_ADHOC ||
   1547	     vif->type == NL80211_IFTYPE_MESH_POINT) &&
   1548	    !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE))
   1549		return -ENOSPC;
   1550	rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
   1551		"%s hardware based encryption for keyidx: %d, mac: %pM\n",
   1552		cmd == SET_KEY ? "Using" : "Disabling", key->keyidx,
   1553		sta ? sta->addr : bcast_addr);
   1554	rtlpriv->sec.being_setkey = true;
   1555	rtl_ips_nic_on(hw);
   1556	mutex_lock(&rtlpriv->locks.conf_mutex);
   1557	/* <1> get encryption alg */
   1558
   1559	switch (key->cipher) {
   1560	case WLAN_CIPHER_SUITE_WEP40:
   1561		key_type = WEP40_ENCRYPTION;
   1562		rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG, "alg:WEP40\n");
   1563		break;
   1564	case WLAN_CIPHER_SUITE_WEP104:
   1565		rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG, "alg:WEP104\n");
   1566		key_type = WEP104_ENCRYPTION;
   1567		break;
   1568	case WLAN_CIPHER_SUITE_TKIP:
   1569		key_type = TKIP_ENCRYPTION;
   1570		rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG, "alg:TKIP\n");
   1571		break;
   1572	case WLAN_CIPHER_SUITE_CCMP:
   1573		key_type = AESCCMP_ENCRYPTION;
   1574		rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG, "alg:CCMP\n");
   1575		break;
   1576	case WLAN_CIPHER_SUITE_AES_CMAC:
   1577		/* HW don't support CMAC encryption,
   1578		 * use software CMAC encryption
   1579		 */
   1580		key_type = AESCMAC_ENCRYPTION;
   1581		rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG, "alg:CMAC\n");
   1582		rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
   1583			"HW don't support CMAC encryption, use software CMAC encryption\n");
   1584		err = -EOPNOTSUPP;
   1585		goto out_unlock;
   1586	default:
   1587		pr_err("alg_err:%x!!!!:\n", key->cipher);
   1588		goto out_unlock;
   1589	}
   1590	if (key_type == WEP40_ENCRYPTION ||
   1591	   key_type == WEP104_ENCRYPTION ||
   1592	   vif->type == NL80211_IFTYPE_ADHOC)
   1593		rtlpriv->sec.use_defaultkey = true;
   1594
   1595	/* <2> get key_idx */
   1596	key_idx = (u8) (key->keyidx);
   1597	if (key_idx > 3)
   1598		goto out_unlock;
   1599	/* <3> if pairwise key enable_hw_sec */
   1600	group_key = !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE);
   1601
   1602	/* wep always be group key, but there are two conditions:
   1603	 * 1) wep only: is just for wep enc, in this condition
   1604	 * rtlpriv->sec.pairwise_enc_algorithm == NO_ENCRYPTION
   1605	 * will be true & enable_hw_sec will be set when wep
   1606	 * ke setting.
   1607	 * 2) wep(group) + AES(pairwise): some AP like cisco
   1608	 * may use it, in this condition enable_hw_sec will not
   1609	 * be set when wep key setting */
   1610	/* we must reset sec_info after lingked before set key,
   1611	 * or some flag will be wrong*/
   1612	if (vif->type == NL80211_IFTYPE_AP ||
   1613		vif->type == NL80211_IFTYPE_MESH_POINT) {
   1614		if (!group_key || key_type == WEP40_ENCRYPTION ||
   1615			key_type == WEP104_ENCRYPTION) {
   1616			if (group_key)
   1617				wep_only = true;
   1618			rtlpriv->cfg->ops->enable_hw_sec(hw);
   1619		}
   1620	} else {
   1621		if (!group_key || vif->type == NL80211_IFTYPE_ADHOC ||
   1622		    rtlpriv->sec.pairwise_enc_algorithm == NO_ENCRYPTION) {
   1623			if (rtlpriv->sec.pairwise_enc_algorithm ==
   1624			    NO_ENCRYPTION &&
   1625			   (key_type == WEP40_ENCRYPTION ||
   1626			    key_type == WEP104_ENCRYPTION))
   1627				wep_only = true;
   1628			rtlpriv->sec.pairwise_enc_algorithm = key_type;
   1629			rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
   1630				"set enable_hw_sec, key_type:%x(OPEN:0 WEP40:1 TKIP:2 AES:4 WEP104:5)\n",
   1631				key_type);
   1632			rtlpriv->cfg->ops->enable_hw_sec(hw);
   1633		}
   1634	}
   1635	/* <4> set key based on cmd */
   1636	switch (cmd) {
   1637	case SET_KEY:
   1638		if (wep_only) {
   1639			rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
   1640				"set WEP(group/pairwise) key\n");
   1641			/* Pairwise key with an assigned MAC address. */
   1642			rtlpriv->sec.pairwise_enc_algorithm = key_type;
   1643			rtlpriv->sec.group_enc_algorithm = key_type;
   1644			/*set local buf about wep key. */
   1645			memcpy(rtlpriv->sec.key_buf[key_idx],
   1646			       key->key, key->keylen);
   1647			rtlpriv->sec.key_len[key_idx] = key->keylen;
   1648			eth_zero_addr(mac_addr);
   1649		} else if (group_key) {	/* group key */
   1650			rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
   1651				"set group key\n");
   1652			/* group key */
   1653			rtlpriv->sec.group_enc_algorithm = key_type;
   1654			/*set local buf about group key. */
   1655			memcpy(rtlpriv->sec.key_buf[key_idx],
   1656			       key->key, key->keylen);
   1657			rtlpriv->sec.key_len[key_idx] = key->keylen;
   1658			memcpy(mac_addr, bcast_addr, ETH_ALEN);
   1659		} else {	/* pairwise key */
   1660			rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
   1661				"set pairwise key\n");
   1662			if (!sta) {
   1663				WARN_ONCE(true,
   1664					  "rtlwifi: pairwise key without mac_addr\n");
   1665
   1666				err = -EOPNOTSUPP;
   1667				goto out_unlock;
   1668			}
   1669			/* Pairwise key with an assigned MAC address. */
   1670			rtlpriv->sec.pairwise_enc_algorithm = key_type;
   1671			/*set local buf about pairwise key. */
   1672			memcpy(rtlpriv->sec.key_buf[PAIRWISE_KEYIDX],
   1673			       key->key, key->keylen);
   1674			rtlpriv->sec.key_len[PAIRWISE_KEYIDX] = key->keylen;
   1675			rtlpriv->sec.pairwise_key =
   1676			    rtlpriv->sec.key_buf[PAIRWISE_KEYIDX];
   1677			memcpy(mac_addr, sta->addr, ETH_ALEN);
   1678		}
   1679		rtlpriv->cfg->ops->set_key(hw, key_idx, mac_addr,
   1680					   group_key, key_type, wep_only,
   1681					   false);
   1682		/* <5> tell mac80211 do something: */
   1683		/*must use sw generate IV, or can not work !!!!. */
   1684		key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
   1685		key->hw_key_idx = key_idx;
   1686		if (key_type == TKIP_ENCRYPTION)
   1687			key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
   1688		/*use software CCMP encryption for management frames (MFP) */
   1689		if (key_type == AESCCMP_ENCRYPTION)
   1690			key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
   1691		break;
   1692	case DISABLE_KEY:
   1693		rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
   1694			"disable key delete one entry\n");
   1695		/*set local buf about wep key. */
   1696		if (vif->type == NL80211_IFTYPE_AP ||
   1697			vif->type == NL80211_IFTYPE_MESH_POINT) {
   1698			if (sta)
   1699				rtl_cam_del_entry(hw, sta->addr);
   1700		}
   1701		memset(rtlpriv->sec.key_buf[key_idx], 0, key->keylen);
   1702		rtlpriv->sec.key_len[key_idx] = 0;
   1703		eth_zero_addr(mac_addr);
   1704		/*
   1705		 *mac80211 will delete entrys one by one,
   1706		 *so don't use rtl_cam_reset_all_entry
   1707		 *or clear all entry here.
   1708		 */
   1709		rtl_wait_tx_report_acked(hw, 500); /* wait 500ms for TX ack */
   1710
   1711		rtl_cam_delete_one_entry(hw, mac_addr, key_idx);
   1712		break;
   1713	default:
   1714		pr_err("cmd_err:%x!!!!:\n", cmd);
   1715	}
   1716out_unlock:
   1717	mutex_unlock(&rtlpriv->locks.conf_mutex);
   1718	rtlpriv->sec.being_setkey = false;
   1719	return err;
   1720}
   1721
   1722static void rtl_op_rfkill_poll(struct ieee80211_hw *hw)
   1723{
   1724	struct rtl_priv *rtlpriv = rtl_priv(hw);
   1725
   1726	bool radio_state;
   1727	bool blocked;
   1728	u8 valid = 0;
   1729
   1730	if (!test_bit(RTL_STATUS_INTERFACE_START, &rtlpriv->status))
   1731		return;
   1732
   1733	mutex_lock(&rtlpriv->locks.conf_mutex);
   1734
   1735	/*if Radio On return true here */
   1736	radio_state = rtlpriv->cfg->ops->radio_onoff_checking(hw, &valid);
   1737
   1738	if (valid) {
   1739		if (unlikely(radio_state != rtlpriv->rfkill.rfkill_state)) {
   1740			rtlpriv->rfkill.rfkill_state = radio_state;
   1741
   1742			rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
   1743				"wireless radio switch turned %s\n",
   1744				radio_state ? "on" : "off");
   1745
   1746			blocked = !rtlpriv->rfkill.rfkill_state;
   1747			wiphy_rfkill_set_hw_state(hw->wiphy, blocked);
   1748		}
   1749	}
   1750
   1751	mutex_unlock(&rtlpriv->locks.conf_mutex);
   1752}
   1753
   1754/* this function is called by mac80211 to flush tx buffer
   1755 * before switch channle or power save, or tx buffer packet
   1756 * maybe send after offchannel or rf sleep, this may cause
   1757 * dis-association by AP */
   1758static void rtl_op_flush(struct ieee80211_hw *hw,
   1759			 struct ieee80211_vif *vif,
   1760			 u32 queues,
   1761			 bool drop)
   1762{
   1763	struct rtl_priv *rtlpriv = rtl_priv(hw);
   1764
   1765	if (rtlpriv->intf_ops->flush)
   1766		rtlpriv->intf_ops->flush(hw, queues, drop);
   1767}
   1768
   1769static int rtl_op_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
   1770			  bool set)
   1771{
   1772	struct rtl_priv *rtlpriv = rtl_priv(hw);
   1773	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
   1774
   1775	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192CU)
   1776		schedule_work(&rtlpriv->works.update_beacon_work);
   1777
   1778	return 0;
   1779}
   1780
   1781/*	Description:
   1782 *		This routine deals with the Power Configuration CMD
   1783 *		 parsing for RTL8723/RTL8188E Series IC.
   1784 *	Assumption:
   1785 *		We should follow specific format that was released from HW SD.
   1786 */
   1787bool rtl_hal_pwrseqcmdparsing(struct rtl_priv *rtlpriv, u8 cut_version,
   1788			      u8 faversion, u8 interface_type,
   1789			      struct wlan_pwr_cfg pwrcfgcmd[])
   1790{
   1791	struct wlan_pwr_cfg cfg_cmd;
   1792	bool polling_bit = false;
   1793	u32 ary_idx = 0;
   1794	u8 value = 0;
   1795	u32 offset = 0;
   1796	u32 polling_count = 0;
   1797	u32 max_polling_cnt = 5000;
   1798
   1799	do {
   1800		cfg_cmd = pwrcfgcmd[ary_idx];
   1801		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
   1802			"%s: offset(%#x),cut_msk(%#x), famsk(%#x), interface_msk(%#x), base(%#x), cmd(%#x), msk(%#x), value(%#x)\n",
   1803			__func__,
   1804			GET_PWR_CFG_OFFSET(cfg_cmd),
   1805					   GET_PWR_CFG_CUT_MASK(cfg_cmd),
   1806			GET_PWR_CFG_FAB_MASK(cfg_cmd),
   1807					     GET_PWR_CFG_INTF_MASK(cfg_cmd),
   1808			GET_PWR_CFG_BASE(cfg_cmd), GET_PWR_CFG_CMD(cfg_cmd),
   1809			GET_PWR_CFG_MASK(cfg_cmd), GET_PWR_CFG_VALUE(cfg_cmd));
   1810
   1811		if ((GET_PWR_CFG_FAB_MASK(cfg_cmd)&faversion) &&
   1812		    (GET_PWR_CFG_CUT_MASK(cfg_cmd)&cut_version) &&
   1813		    (GET_PWR_CFG_INTF_MASK(cfg_cmd)&interface_type)) {
   1814			switch (GET_PWR_CFG_CMD(cfg_cmd)) {
   1815			case PWR_CMD_READ:
   1816				rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
   1817					"rtl_hal_pwrseqcmdparsing(): PWR_CMD_READ\n");
   1818				break;
   1819			case PWR_CMD_WRITE:
   1820				rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
   1821					"%s(): PWR_CMD_WRITE\n", __func__);
   1822				offset = GET_PWR_CFG_OFFSET(cfg_cmd);
   1823
   1824				/*Read the value from system register*/
   1825				value = rtl_read_byte(rtlpriv, offset);
   1826				value &= (~(GET_PWR_CFG_MASK(cfg_cmd)));
   1827				value |= (GET_PWR_CFG_VALUE(cfg_cmd) &
   1828					  GET_PWR_CFG_MASK(cfg_cmd));
   1829
   1830				/*Write the value back to system register*/
   1831				rtl_write_byte(rtlpriv, offset, value);
   1832				break;
   1833			case PWR_CMD_POLLING:
   1834				rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
   1835					"rtl_hal_pwrseqcmdparsing(): PWR_CMD_POLLING\n");
   1836				polling_bit = false;
   1837				offset = GET_PWR_CFG_OFFSET(cfg_cmd);
   1838
   1839				do {
   1840					value = rtl_read_byte(rtlpriv, offset);
   1841
   1842					value &= GET_PWR_CFG_MASK(cfg_cmd);
   1843					if (value ==
   1844					    (GET_PWR_CFG_VALUE(cfg_cmd) &
   1845					     GET_PWR_CFG_MASK(cfg_cmd)))
   1846						polling_bit = true;
   1847					else
   1848						udelay(10);
   1849
   1850					if (polling_count++ > max_polling_cnt)
   1851						return false;
   1852				} while (!polling_bit);
   1853				break;
   1854			case PWR_CMD_DELAY:
   1855				rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
   1856					"%s: PWR_CMD_DELAY\n", __func__);
   1857				if (GET_PWR_CFG_VALUE(cfg_cmd) ==
   1858				    PWRSEQ_DELAY_US)
   1859					udelay(GET_PWR_CFG_OFFSET(cfg_cmd));
   1860				else
   1861					mdelay(GET_PWR_CFG_OFFSET(cfg_cmd));
   1862				break;
   1863			case PWR_CMD_END:
   1864				rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
   1865					"%s: PWR_CMD_END\n", __func__);
   1866				return true;
   1867			default:
   1868				WARN_ONCE(true,
   1869					  "rtlwifi: rtl_hal_pwrseqcmdparsing(): Unknown CMD!!\n");
   1870				break;
   1871			}
   1872		}
   1873		ary_idx++;
   1874	} while (1);
   1875
   1876	return true;
   1877}
   1878EXPORT_SYMBOL(rtl_hal_pwrseqcmdparsing);
   1879
   1880bool rtl_cmd_send_packet(struct ieee80211_hw *hw, struct sk_buff *skb)
   1881{
   1882	struct rtl_priv *rtlpriv = rtl_priv(hw);
   1883	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
   1884	struct rtl8192_tx_ring *ring;
   1885	struct rtl_tx_desc *pdesc;
   1886	unsigned long flags;
   1887	struct sk_buff *pskb = NULL;
   1888
   1889	ring = &rtlpci->tx_ring[BEACON_QUEUE];
   1890
   1891	spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
   1892	pskb = __skb_dequeue(&ring->queue);
   1893	if (pskb)
   1894		dev_kfree_skb_irq(pskb);
   1895
   1896	/*this is wrong, fill_tx_cmddesc needs update*/
   1897	pdesc = &ring->desc[0];
   1898
   1899	rtlpriv->cfg->ops->fill_tx_cmddesc(hw, (u8 *)pdesc, 1, 1, skb);
   1900
   1901	__skb_queue_tail(&ring->queue, skb);
   1902
   1903	spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
   1904
   1905	rtlpriv->cfg->ops->tx_polling(hw, BEACON_QUEUE);
   1906
   1907	return true;
   1908}
   1909EXPORT_SYMBOL(rtl_cmd_send_packet);
   1910const struct ieee80211_ops rtl_ops = {
   1911	.start = rtl_op_start,
   1912	.stop = rtl_op_stop,
   1913	.tx = rtl_op_tx,
   1914	.add_interface = rtl_op_add_interface,
   1915	.remove_interface = rtl_op_remove_interface,
   1916	.change_interface = rtl_op_change_interface,
   1917#ifdef CONFIG_PM
   1918	.suspend = rtl_op_suspend,
   1919	.resume = rtl_op_resume,
   1920#endif
   1921	.config = rtl_op_config,
   1922	.configure_filter = rtl_op_configure_filter,
   1923	.set_key = rtl_op_set_key,
   1924	.conf_tx = rtl_op_conf_tx,
   1925	.bss_info_changed = rtl_op_bss_info_changed,
   1926	.get_tsf = rtl_op_get_tsf,
   1927	.set_tsf = rtl_op_set_tsf,
   1928	.reset_tsf = rtl_op_reset_tsf,
   1929	.sta_notify = rtl_op_sta_notify,
   1930	.ampdu_action = rtl_op_ampdu_action,
   1931	.sw_scan_start = rtl_op_sw_scan_start,
   1932	.sw_scan_complete = rtl_op_sw_scan_complete,
   1933	.rfkill_poll = rtl_op_rfkill_poll,
   1934	.sta_add = rtl_op_sta_add,
   1935	.sta_remove = rtl_op_sta_remove,
   1936	.flush = rtl_op_flush,
   1937	.set_tim = rtl_op_set_tim,
   1938};
   1939EXPORT_SYMBOL_GPL(rtl_ops);
   1940
   1941bool rtl_btc_status_false(void)
   1942{
   1943	return false;
   1944}
   1945EXPORT_SYMBOL_GPL(rtl_btc_status_false);
   1946
   1947void rtl_dm_diginit(struct ieee80211_hw *hw, u32 cur_igvalue)
   1948{
   1949	struct rtl_priv *rtlpriv = rtl_priv(hw);
   1950	struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
   1951
   1952	dm_digtable->dig_enable_flag = true;
   1953	dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX;
   1954	dm_digtable->cur_igvalue = cur_igvalue;
   1955	dm_digtable->pre_igvalue = 0;
   1956	dm_digtable->cur_sta_cstate = DIG_STA_DISCONNECT;
   1957	dm_digtable->presta_cstate = DIG_STA_DISCONNECT;
   1958	dm_digtable->curmultista_cstate = DIG_MULTISTA_DISCONNECT;
   1959	dm_digtable->rssi_lowthresh = DM_DIG_THRESH_LOW;
   1960	dm_digtable->rssi_highthresh = DM_DIG_THRESH_HIGH;
   1961	dm_digtable->fa_lowthresh = DM_FALSEALARM_THRESH_LOW;
   1962	dm_digtable->fa_highthresh = DM_FALSEALARM_THRESH_HIGH;
   1963	dm_digtable->rx_gain_max = DM_DIG_MAX;
   1964	dm_digtable->rx_gain_min = DM_DIG_MIN;
   1965	dm_digtable->back_val = DM_DIG_BACKOFF_DEFAULT;
   1966	dm_digtable->back_range_max = DM_DIG_BACKOFF_MAX;
   1967	dm_digtable->back_range_min = DM_DIG_BACKOFF_MIN;
   1968	dm_digtable->pre_cck_cca_thres = 0xff;
   1969	dm_digtable->cur_cck_cca_thres = 0x83;
   1970	dm_digtable->forbidden_igi = DM_DIG_MIN;
   1971	dm_digtable->large_fa_hit = 0;
   1972	dm_digtable->recover_cnt = 0;
   1973	dm_digtable->dig_min_0 = 0x25;
   1974	dm_digtable->dig_min_1 = 0x25;
   1975	dm_digtable->media_connect_0 = false;
   1976	dm_digtable->media_connect_1 = false;
   1977	rtlpriv->dm.dm_initialgain_enable = true;
   1978	dm_digtable->bt30_cur_igi = 0x32;
   1979	dm_digtable->pre_cck_pd_state = CCK_PD_STAGE_MAX;
   1980	dm_digtable->cur_cck_pd_state = CCK_PD_STAGE_LOWRSSI;
   1981	dm_digtable->pre_cck_fa_state = 0;
   1982	dm_digtable->cur_cck_fa_state = 0;
   1983}
   1984EXPORT_SYMBOL(rtl_dm_diginit);