1// SPDX-License-Identifier: GPL-2.0
2/* Copyright(c) 2009-2014  Realtek Corporation.*/
3
4#include "../wifi.h"
5#include "../efuse.h"
6#include "../base.h"
7#include "../regd.h"
8#include "../cam.h"
9#include "../ps.h"
10#include "../pci.h"
11#include "reg.h"
12#include "def.h"
13#include "phy.h"
14#include "../rtl8723com/phy_common.h"
15#include "dm.h"
16#include "../rtl8723com/dm_common.h"
17#include "fw.h"
18#include "../rtl8723com/fw_common.h"
19#include "led.h"
20#include "hw.h"
21#include "../pwrseqcmd.h"
22#include "pwrseq.h"
23#include "../btcoexist/rtl_btc.h"
24#include <linux/kernel.h>
25
26#define LLT_CONFIG	5
27
28static void _rtl8723be_return_beacon_queue_skb(struct ieee80211_hw *hw)
29{
30	struct rtl_priv *rtlpriv = rtl_priv(hw);
31	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
32	struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[BEACON_QUEUE];
33	struct sk_buff_head free_list;
34	unsigned long flags;
35
36	skb_queue_head_init(&free_list);
37	spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
38	while (skb_queue_len(&ring->queue)) {
39		struct rtl_tx_desc *entry = &ring->desc[ring->idx];
40		struct sk_buff *skb = __skb_dequeue(&ring->queue);
41
42		dma_unmap_single(&rtlpci->pdev->dev,
43				 rtlpriv->cfg->ops->get_desc(hw, (u8 *)entry,
44						true, HW_DESC_TXBUFF_ADDR),
45				 skb->len, DMA_TO_DEVICE);
46		__skb_queue_tail(&free_list, skb);
47		ring->idx = (ring->idx + 1) % ring->entries;
48	}
49	spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
50
51	__skb_queue_purge(&free_list);
52}
53
54static void _rtl8723be_set_bcn_ctrl_reg(struct ieee80211_hw *hw,
55					u8 set_bits, u8 clear_bits)
56{
57	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
58	struct rtl_priv *rtlpriv = rtl_priv(hw);
59
60	rtlpci->reg_bcn_ctrl_val |= set_bits;
61	rtlpci->reg_bcn_ctrl_val &= ~clear_bits;
62
63	rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8)rtlpci->reg_bcn_ctrl_val);
64}
65
66static void _rtl8723be_stop_tx_beacon(struct ieee80211_hw *hw)
67{
68	struct rtl_priv *rtlpriv = rtl_priv(hw);
69	u8 tmp1byte;
70
71	tmp1byte = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
72	rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp1byte & (~BIT(6)));
73	rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0x64);
74	tmp1byte = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2);
75	tmp1byte &= ~(BIT(0));
76	rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte);
77}
78
79static void _rtl8723be_resume_tx_beacon(struct ieee80211_hw *hw)
80{
81	struct rtl_priv *rtlpriv = rtl_priv(hw);
82	u8 tmp1byte;
83
84	tmp1byte = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
85	rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp1byte | BIT(6));
86	rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff);
87	tmp1byte = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2);
88	tmp1byte |= BIT(1);
89	rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte);
90}
91
92static void _rtl8723be_enable_bcn_sub_func(struct ieee80211_hw *hw)
93{
94	_rtl8723be_set_bcn_ctrl_reg(hw, 0, BIT(1));
95}
96
97static void _rtl8723be_disable_bcn_sub_func(struct ieee80211_hw *hw)
98{
99	_rtl8723be_set_bcn_ctrl_reg(hw, BIT(1), 0);
100}
101
102static void _rtl8723be_set_fw_clock_on(struct ieee80211_hw *hw, u8 rpwm_val,
103				       bool b_need_turn_off_ckk)
104{
105	struct rtl_priv *rtlpriv = rtl_priv(hw);
106	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
107	bool b_support_remote_wake_up;
108	u32 count = 0, isr_regaddr, content;
109	bool b_schedule_timer = b_need_turn_off_ckk;
110	rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
111				      (u8 *)(&b_support_remote_wake_up));
112
113	if (!rtlhal->fw_ready)
114		return;
115	if (!rtlpriv->psc.fw_current_inpsmode)
116		return;
117
118	while (1) {
119		spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
120		if (rtlhal->fw_clk_change_in_progress) {
121			while (rtlhal->fw_clk_change_in_progress) {
122				spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
123				count++;
124				udelay(100);
125				if (count > 1000)
126					return;
127				spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
128			}
129			spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
130		} else {
131			rtlhal->fw_clk_change_in_progress = false;
132			spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
133			break;
134		}
135	}
136
137	if (IS_IN_LOW_POWER_STATE(rtlhal->fw_ps_state)) {
138		rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_SET_RPWM,
139					      (u8 *)(&rpwm_val));
140		if (FW_PS_IS_ACK(rpwm_val)) {
141			isr_regaddr = REG_HISR;
142			content = rtl_read_dword(rtlpriv, isr_regaddr);
143			while (!(content & IMR_CPWM) && (count < 500)) {
144				udelay(50);
145				count++;
146				content = rtl_read_dword(rtlpriv, isr_regaddr);
147			}
148
149			if (content & IMR_CPWM) {
150				rtl_write_word(rtlpriv, isr_regaddr, 0x0100);
151				rtlhal->fw_ps_state = FW_PS_STATE_RF_ON;
152				rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
153					"Receive CPWM INT!!! Set pHalData->FwPSState = %X\n",
154					rtlhal->fw_ps_state);
155			}
156		}
157
158		spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
159		rtlhal->fw_clk_change_in_progress = false;
160		spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
161		if (b_schedule_timer)
162			mod_timer(&rtlpriv->works.fw_clockoff_timer,
163				  jiffies + MSECS(10));
164	} else  {
165		spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
166		rtlhal->fw_clk_change_in_progress = false;
167		spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
168	}
169}
170
171static void _rtl8723be_set_fw_clock_off(struct ieee80211_hw *hw, u8 rpwm_val)
172{
173	struct rtl_priv *rtlpriv = rtl_priv(hw);
174	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
175	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
176	struct rtl8192_tx_ring *ring;
177	enum rf_pwrstate rtstate;
178	bool b_schedule_timer = false;
179	u8 queue;
180
181	if (!rtlhal->fw_ready)
182		return;
183	if (!rtlpriv->psc.fw_current_inpsmode)
184		return;
185	if (!rtlhal->allow_sw_to_change_hwclc)
186		return;
187	rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RF_STATE, (u8 *)(&rtstate));
188	if (rtstate == ERFOFF || rtlpriv->psc.inactive_pwrstate == ERFOFF)
189		return;
190
191	for (queue = 0; queue < RTL_PCI_MAX_TX_QUEUE_COUNT; queue++) {
192		ring = &rtlpci->tx_ring[queue];
193		if (skb_queue_len(&ring->queue)) {
194			b_schedule_timer = true;
195			break;
196		}
197	}
198
199	if (b_schedule_timer) {
200		mod_timer(&rtlpriv->works.fw_clockoff_timer,
201			  jiffies + MSECS(10));
202		return;
203	}
204
205	if (FW_PS_STATE(rtlhal->fw_ps_state) != FW_PS_STATE_RF_OFF_LOW_PWR) {
206		spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
207		if (!rtlhal->fw_clk_change_in_progress) {
208			rtlhal->fw_clk_change_in_progress = true;
209			spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
210			rtlhal->fw_ps_state = FW_PS_STATE(rpwm_val);
211			rtl_write_word(rtlpriv, REG_HISR, 0x0100);
212			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
213						      (u8 *)(&rpwm_val));
214			spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
215			rtlhal->fw_clk_change_in_progress = false;
216			spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
217		} else {
218			spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
219			mod_timer(&rtlpriv->works.fw_clockoff_timer,
220				  jiffies + MSECS(10));
221		}
222	}
223
224}
225
226static void _rtl8723be_set_fw_ps_rf_on(struct ieee80211_hw *hw)
227{
228	u8 rpwm_val = 0;
229	rpwm_val |= (FW_PS_STATE_RF_OFF | FW_PS_ACK);
230	_rtl8723be_set_fw_clock_on(hw, rpwm_val, true);
231}
232
233static void _rtl8723be_fwlps_leave(struct ieee80211_hw *hw)
234{
235	struct rtl_priv *rtlpriv = rtl_priv(hw);
236	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
237	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
238	bool fw_current_inps = false;
239	u8 rpwm_val = 0, fw_pwrmode = FW_PS_ACTIVE_MODE;
240
241	if (ppsc->low_power_enable) {
242		rpwm_val = (FW_PS_STATE_ALL_ON | FW_PS_ACK);/* RF on */
243		_rtl8723be_set_fw_clock_on(hw, rpwm_val, false);
244		rtlhal->allow_sw_to_change_hwclc = false;
245		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
246					      (u8 *)(&fw_pwrmode));
247		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
248					      (u8 *)(&fw_current_inps));
249	} else {
250		rpwm_val = FW_PS_STATE_ALL_ON;	/* RF on */
251		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
252					      (u8 *)(&rpwm_val));
253		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
254					      (u8 *)(&fw_pwrmode));
255		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
256					      (u8 *)(&fw_current_inps));
257	}
258
259}
260
261static void _rtl8723be_fwlps_enter(struct ieee80211_hw *hw)
262{
263	struct rtl_priv *rtlpriv = rtl_priv(hw);
264	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
265	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
266	bool fw_current_inps = true;
267	u8 rpwm_val;
268
269	if (ppsc->low_power_enable) {
270		rpwm_val = FW_PS_STATE_RF_OFF_LOW_PWR;	/* RF off */
271		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
272					      (u8 *)(&fw_current_inps));
273		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
274					      (u8 *)(&ppsc->fwctrl_psmode));
275		rtlhal->allow_sw_to_change_hwclc = true;
276		_rtl8723be_set_fw_clock_off(hw, rpwm_val);
277	} else {
278		rpwm_val = FW_PS_STATE_RF_OFF;	/* RF off */
279		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
280					      (u8 *)(&fw_current_inps));
281		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
282					      (u8 *)(&ppsc->fwctrl_psmode));
283		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
284					      (u8 *)(&rpwm_val));
285	}
286
287}
288
289void rtl8723be_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
290{
291	struct rtl_priv *rtlpriv = rtl_priv(hw);
292	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
293	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
294
295	switch (variable) {
296	case HW_VAR_RCR:
297		*((u32 *)(val)) = rtlpci->receive_config;
298		break;
299	case HW_VAR_RF_STATE:
300		*((enum rf_pwrstate *)(val)) = ppsc->rfpwr_state;
301		break;
302	case HW_VAR_FWLPS_RF_ON:{
303		enum rf_pwrstate rfstate;
304		u32 val_rcr;
305
306		rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RF_STATE,
307					      (u8 *)(&rfstate));
308		if (rfstate == ERFOFF) {
309			*((bool *)(val)) = true;
310		} else {
311			val_rcr = rtl_read_dword(rtlpriv, REG_RCR);
312			val_rcr &= 0x00070000;
313			if (val_rcr)
314				*((bool *)(val)) = false;
315			else
316				*((bool *)(val)) = true;
317		}
318		}
319		break;
320	case HW_VAR_FW_PSMODE_STATUS:
321		*((bool *)(val)) = ppsc->fw_current_inpsmode;
322		break;
323	case HW_VAR_CORRECT_TSF:{
324		u64 tsf;
325		u32 *ptsf_low = (u32 *)&tsf;
326		u32 *ptsf_high = ((u32 *)&tsf) + 1;
327
328		*ptsf_high = rtl_read_dword(rtlpriv, (REG_TSFTR + 4));
329		*ptsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
330
331		*((u64 *)(val)) = tsf;
332		}
333		break;
334	case HAL_DEF_WOWLAN:
335		break;
336	default:
337		rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
338			"switch case %#x not processed\n", variable);
339		break;
340	}
341}
342
343static void _rtl8723be_download_rsvd_page(struct ieee80211_hw *hw)
344{
345	struct rtl_priv *rtlpriv = rtl_priv(hw);
346	u8 tmp_regcr, tmp_reg422, bcnvalid_reg;
347	u8 count = 0, dlbcn_count = 0;
348	bool b_recover = false;
349
350	tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
351	rtl_write_byte(rtlpriv, REG_CR + 1,
352		       (tmp_regcr | BIT(0)));
353
354	_rtl8723be_set_bcn_ctrl_reg(hw, 0, BIT(3));
355	_rtl8723be_set_bcn_ctrl_reg(hw, BIT(4), 0);
356
357	tmp_reg422 = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
358	rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp_reg422 & (~BIT(6)));
359	if (tmp_reg422 & BIT(6))
360		b_recover = true;
361
362	do {
363		bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2);
364		rtl_write_byte(rtlpriv, REG_TDECTRL + 2,
365			       (bcnvalid_reg | BIT(0)));
366		_rtl8723be_return_beacon_queue_skb(hw);
367
368		rtl8723be_set_fw_rsvdpagepkt(hw, 0);
369		bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2);
370		count = 0;
371		while (!(bcnvalid_reg & BIT(0)) && count < 20) {
372			count++;
373			udelay(10);
374			bcnvalid_reg = rtl_read_byte(rtlpriv,
375						     REG_TDECTRL + 2);
376		}
377		dlbcn_count++;
378	} while (!(bcnvalid_reg & BIT(0)) && dlbcn_count < 5);
379
380	if (bcnvalid_reg & BIT(0))
381		rtl_write_byte(rtlpriv, REG_TDECTRL + 2, BIT(0));
382
383	_rtl8723be_set_bcn_ctrl_reg(hw, BIT(3), 0);
384	_rtl8723be_set_bcn_ctrl_reg(hw, 0, BIT(4));
385
386	if (b_recover)
387		rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp_reg422);
388
389	tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
390	rtl_write_byte(rtlpriv, REG_CR + 1, (tmp_regcr & ~(BIT(0))));
391}
392
393void rtl8723be_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
394{
395	struct rtl_priv *rtlpriv = rtl_priv(hw);
396	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
397	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
398	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
399	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
400	u8 idx;
401
402	switch (variable) {
403	case HW_VAR_ETHER_ADDR:
404		for (idx = 0; idx < ETH_ALEN; idx++)
405			rtl_write_byte(rtlpriv, (REG_MACID + idx), val[idx]);
406		break;
407	case HW_VAR_BASIC_RATE:{
408		u16 b_rate_cfg = ((u16 *)val)[0];
409		u8 rate_index = 0;
410		b_rate_cfg = b_rate_cfg & 0x15f;
411		b_rate_cfg |= 0x01;
412		rtl_write_byte(rtlpriv, REG_RRSR, b_rate_cfg & 0xff);
413		rtl_write_byte(rtlpriv, REG_RRSR + 1, (b_rate_cfg >> 8) & 0xff);
414		while (b_rate_cfg > 0x1) {
415			b_rate_cfg = (b_rate_cfg >> 1);
416			rate_index++;
417		}
418		rtl_write_byte(rtlpriv, REG_INIRTS_RATE_SEL, rate_index);
419		}
420		break;
421	case HW_VAR_BSSID:
422		for (idx = 0; idx < ETH_ALEN; idx++)
423			rtl_write_byte(rtlpriv, (REG_BSSID + idx), val[idx]);
424
425		break;
426	case HW_VAR_SIFS:
427		rtl_write_byte(rtlpriv, REG_SIFS_CTX + 1, val[0]);
428		rtl_write_byte(rtlpriv, REG_SIFS_TRX + 1, val[1]);
429
430		rtl_write_byte(rtlpriv, REG_SPEC_SIFS + 1, val[0]);
431		rtl_write_byte(rtlpriv, REG_MAC_SPEC_SIFS + 1, val[0]);
432
433		if (!mac->ht_enable)
434			rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM, 0x0e0e);
435		else
436			rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM,
437				       *((u16 *)val));
438		break;
439	case HW_VAR_SLOT_TIME:{
440		u8 e_aci;
441
442		rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD,
443			"HW_VAR_SLOT_TIME %x\n", val[0]);
444
445		rtl_write_byte(rtlpriv, REG_SLOT, val[0]);
446
447		for (e_aci = 0; e_aci < AC_MAX; e_aci++) {
448			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AC_PARAM,
449						      (u8 *)(&e_aci));
450		}
451		}
452		break;
453	case HW_VAR_ACK_PREAMBLE:{
454		u8 reg_tmp;
455		u8 short_preamble = (bool)(*(u8 *)val);
456		reg_tmp = rtl_read_byte(rtlpriv, REG_TRXPTCL_CTL + 2);
457		if (short_preamble) {
458			reg_tmp |= 0x02;
459			rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL + 2, reg_tmp);
460		} else {
461			reg_tmp &= 0xFD;
462			rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL + 2, reg_tmp);
463		}
464		}
465		break;
466	case HW_VAR_WPA_CONFIG:
467		rtl_write_byte(rtlpriv, REG_SECCFG, *((u8 *)val));
468		break;
469	case HW_VAR_AMPDU_MIN_SPACE:{
470		u8 min_spacing_to_set;
471		u8 sec_min_space;
472
473		min_spacing_to_set = *((u8 *)val);
474		if (min_spacing_to_set <= 7) {
475			sec_min_space = 0;
476
477			if (min_spacing_to_set < sec_min_space)
478				min_spacing_to_set = sec_min_space;
479
480			mac->min_space_cfg = ((mac->min_space_cfg & 0xf8) |
481					      min_spacing_to_set);
482
483			*val = min_spacing_to_set;
484
485			rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD,
486				"Set HW_VAR_AMPDU_MIN_SPACE: %#x\n",
487				mac->min_space_cfg);
488
489			rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
490				       mac->min_space_cfg);
491		}
492		}
493		break;
494	case HW_VAR_SHORTGI_DENSITY:{
495		u8 density_to_set;
496
497		density_to_set = *((u8 *)val);
498		mac->min_space_cfg |= (density_to_set << 3);
499
500		rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD,
501			"Set HW_VAR_SHORTGI_DENSITY: %#x\n",
502			mac->min_space_cfg);
503
504		rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
505			       mac->min_space_cfg);
506		}
507		break;
508	case HW_VAR_AMPDU_FACTOR:{
509		u8 regtoset_normal[4] = {0x41, 0xa8, 0x72, 0xb9};
510		u8 factor_toset;
511		u8 *p_regtoset = NULL;
512		u8 index = 0;
513
514		p_regtoset = regtoset_normal;
515
516		factor_toset = *((u8 *)val);
517		if (factor_toset <= 3) {
518			factor_toset = (1 << (factor_toset + 2));
519			if (factor_toset > 0xf)
520				factor_toset = 0xf;
521
522			for (index = 0; index < 4; index++) {
523				if ((p_regtoset[index] & 0xf0) >
524				    (factor_toset << 4))
525					p_regtoset[index] =
526						(p_regtoset[index] & 0x0f) |
527						(factor_toset << 4);
528
529				if ((p_regtoset[index] & 0x0f) > factor_toset)
530					p_regtoset[index] =
531						(p_regtoset[index] & 0xf0) |
532						(factor_toset);
533
534				rtl_write_byte(rtlpriv,
535					       (REG_AGGLEN_LMT + index),
536					       p_regtoset[index]);
537
538			}
539
540			rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD,
541				"Set HW_VAR_AMPDU_FACTOR: %#x\n",
542				factor_toset);
543		}
544		}
545		break;
546	case HW_VAR_AC_PARAM:{
547		u8 e_aci = *((u8 *)val);
548		rtl8723_dm_init_edca_turbo(hw);
549
550		if (rtlpci->acm_method != EACMWAY2_SW)
551			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ACM_CTRL,
552						      (u8 *)(&e_aci));
553		}
554		break;
555	case HW_VAR_ACM_CTRL:{
556		u8 e_aci = *((u8 *)val);
557		union aci_aifsn *p_aci_aifsn =
558				(union aci_aifsn *)(&(mac->ac[0].aifs));
559		u8 acm = p_aci_aifsn->f.acm;
560		u8 acm_ctrl = rtl_read_byte(rtlpriv, REG_ACMHWCTRL);
561
562		acm_ctrl =
563		    acm_ctrl | ((rtlpci->acm_method == 2) ? 0x0 : 0x1);
564
565		if (acm) {
566			switch (e_aci) {
567			case AC0_BE:
568				acm_ctrl |= ACMHW_BEQEN;
569				break;
570			case AC2_VI:
571				acm_ctrl |= ACMHW_VIQEN;
572				break;
573			case AC3_VO:
574				acm_ctrl |= ACMHW_VOQEN;
575				break;
576			default:
577				rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
578					"HW_VAR_ACM_CTRL acm set failed: eACI is %d\n",
579					acm);
580				break;
581			}
582		} else {
583			switch (e_aci) {
584			case AC0_BE:
585				acm_ctrl &= (~ACMHW_BEQEN);
586				break;
587			case AC2_VI:
588				acm_ctrl &= (~ACMHW_VIQEN);
589				break;
590			case AC3_VO:
591				acm_ctrl &= (~ACMHW_VOQEN);
592				break;
593			default:
594				rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
595					"switch case %#x not processed\n",
596					e_aci);
597				break;
598			}
599		}
600
601		rtl_dbg(rtlpriv, COMP_QOS, DBG_TRACE,
602			"SetHwReg8190pci(): [HW_VAR_ACM_CTRL] Write 0x%X\n",
603			acm_ctrl);
604		rtl_write_byte(rtlpriv, REG_ACMHWCTRL, acm_ctrl);
605		}
606		break;
607	case HW_VAR_RCR:
608		rtl_write_dword(rtlpriv, REG_RCR, ((u32 *)(val))[0]);
609		rtlpci->receive_config = ((u32 *)(val))[0];
610		break;
611	case HW_VAR_RETRY_LIMIT:{
612		u8 retry_limit = ((u8 *)(val))[0];
613
614		rtl_write_word(rtlpriv, REG_RL,
615			       retry_limit << RETRY_LIMIT_SHORT_SHIFT |
616			       retry_limit << RETRY_LIMIT_LONG_SHIFT);
617		}
618		break;
619	case HW_VAR_DUAL_TSF_RST:
620		rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, (BIT(0) | BIT(1)));
621		break;
622	case HW_VAR_EFUSE_BYTES:
623		rtlefuse->efuse_usedbytes = *((u16 *)val);
624		break;
625	case HW_VAR_EFUSE_USAGE:
626		rtlefuse->efuse_usedpercentage = *((u8 *)val);
627		break;
628	case HW_VAR_IO_CMD:
629		rtl8723be_phy_set_io_cmd(hw, (*(enum io_type *)val));
630		break;
631	case HW_VAR_SET_RPWM:{
632		u8 rpwm_val;
633
634		rpwm_val = rtl_read_byte(rtlpriv, REG_PCIE_HRPWM);
635		udelay(1);
636
637		if (rpwm_val & BIT(7)) {
638			rtl_write_byte(rtlpriv, REG_PCIE_HRPWM, (*(u8 *)val));
639		} else {
640			rtl_write_byte(rtlpriv, REG_PCIE_HRPWM,
641				       ((*(u8 *)val) | BIT(7)));
642		}
643		}
644		break;
645	case HW_VAR_H2C_FW_PWRMODE:
646		rtl8723be_set_fw_pwrmode_cmd(hw, (*(u8 *)val));
647		break;
648	case HW_VAR_FW_PSMODE_STATUS:
649		ppsc->fw_current_inpsmode = *((bool *)val);
650		break;
651	case HW_VAR_RESUME_CLK_ON:
652		_rtl8723be_set_fw_ps_rf_on(hw);
653		break;
654	case HW_VAR_FW_LPS_ACTION:{
655		bool b_enter_fwlps = *((bool *)val);
656
657		if (b_enter_fwlps)
658			_rtl8723be_fwlps_enter(hw);
659		else
660			_rtl8723be_fwlps_leave(hw);
661		}
662		break;
663	case HW_VAR_H2C_FW_JOINBSSRPT:{
664		u8 mstatus = (*(u8 *)val);
665
666		if (mstatus == RT_MEDIA_CONNECT) {
667			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID, NULL);
668			_rtl8723be_download_rsvd_page(hw);
669		}
670		rtl8723be_set_fw_media_status_rpt_cmd(hw, mstatus);
671		}
672		break;
673	case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:
674		rtl8723be_set_p2p_ps_offload_cmd(hw, (*(u8 *)val));
675		break;
676	case HW_VAR_AID:{
677		u16 u2btmp;
678		u2btmp = rtl_read_word(rtlpriv, REG_BCN_PSR_RPT);
679		u2btmp &= 0xC000;
680		rtl_write_word(rtlpriv, REG_BCN_PSR_RPT,
681			       (u2btmp | mac->assoc_id));
682		}
683		break;
684	case HW_VAR_CORRECT_TSF:{
685		u8 btype_ibss = ((u8 *)(val))[0];
686
687		if (btype_ibss)
688			_rtl8723be_stop_tx_beacon(hw);
689
690		_rtl8723be_set_bcn_ctrl_reg(hw, 0, BIT(3));
691
692		rtl_write_dword(rtlpriv, REG_TSFTR,
693				(u32) (mac->tsf & 0xffffffff));
694		rtl_write_dword(rtlpriv, REG_TSFTR + 4,
695				(u32) ((mac->tsf >> 32) & 0xffffffff));
696
697		_rtl8723be_set_bcn_ctrl_reg(hw, BIT(3), 0);
698
699		if (btype_ibss)
700			_rtl8723be_resume_tx_beacon(hw);
701		}
702		break;
703	case HW_VAR_KEEP_ALIVE:{
704		u8 array[2];
705		array[0] = 0xff;
706		array[1] = *((u8 *)val);
707		rtl8723be_fill_h2c_cmd(hw, H2C_8723B_KEEP_ALIVE_CTRL, 2, array);
708		}
709		break;
710	default:
711		rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
712			"switch case %#x not processed\n", variable);
713		break;
714	}
715}
716
717static bool _rtl8723be_llt_write(struct ieee80211_hw *hw, u32 address, u32 data)
718{
719	struct rtl_priv *rtlpriv = rtl_priv(hw);
720	bool status = true;
721	long count = 0;
722	u32 value = _LLT_INIT_ADDR(address) | _LLT_INIT_DATA(data) |
723		    _LLT_OP(_LLT_WRITE_ACCESS);
724
725	rtl_write_dword(rtlpriv, REG_LLT_INIT, value);
726
727	do {
728		value = rtl_read_dword(rtlpriv, REG_LLT_INIT);
729		if (_LLT_NO_ACTIVE == _LLT_OP_VALUE(value))
730			break;
731
732		if (count > POLLING_LLT_THRESHOLD) {
733			pr_err("Failed to polling write LLT done at address %d!\n",
734			       address);
735			status = false;
736			break;
737		}
738	} while (++count);
739
740	return status;
741}
742
743static bool _rtl8723be_llt_table_init(struct ieee80211_hw *hw)
744{
745	struct rtl_priv *rtlpriv = rtl_priv(hw);
746	unsigned short i;
747	u8 txpktbuf_bndy;
748	u8 maxpage;
749	bool status;
750
751	maxpage = 255;
752	txpktbuf_bndy = 245;
753
754	rtl_write_dword(rtlpriv, REG_TRXFF_BNDY,
755			(0x27FF0000 | txpktbuf_bndy));
756	rtl_write_byte(rtlpriv, REG_TDECTRL + 1, txpktbuf_bndy);
757
758	rtl_write_byte(rtlpriv, REG_TXPKTBUF_BCNQ_BDNY, txpktbuf_bndy);
759	rtl_write_byte(rtlpriv, REG_TXPKTBUF_MGQ_BDNY, txpktbuf_bndy);
760
761	rtl_write_byte(rtlpriv, 0x45D, txpktbuf_bndy);
762	rtl_write_byte(rtlpriv, REG_PBP, 0x31);
763	rtl_write_byte(rtlpriv, REG_RX_DRVINFO_SZ, 0x4);
764
765	for (i = 0; i < (txpktbuf_bndy - 1); i++) {
766		status = _rtl8723be_llt_write(hw, i, i + 1);
767		if (!status)
768			return status;
769	}
770
771	status = _rtl8723be_llt_write(hw, (txpktbuf_bndy - 1), 0xFF);
772
773	if (!status)
774		return status;
775
776	for (i = txpktbuf_bndy; i < maxpage; i++) {
777		status = _rtl8723be_llt_write(hw, i, (i + 1));
778		if (!status)
779			return status;
780	}
781
782	status = _rtl8723be_llt_write(hw, maxpage, txpktbuf_bndy);
783	if (!status)
784		return status;
785
786	rtl_write_dword(rtlpriv, REG_RQPN, 0x80e40808);
787	rtl_write_byte(rtlpriv, REG_RQPN_NPQ, 0x00);
788
789	return true;
790}
791
792static void _rtl8723be_gen_refresh_led_state(struct ieee80211_hw *hw)
793{
794	struct rtl_priv *rtlpriv = rtl_priv(hw);
795	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
796	enum rtl_led_pin pin0 = rtlpriv->ledctl.sw_led0;
797
798	if (rtlpriv->rtlhal.up_first_time)
799		return;
800
801	if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS)
802		rtl8723be_sw_led_on(hw, pin0);
803	else if (ppsc->rfoff_reason == RF_CHANGE_BY_INIT)
804		rtl8723be_sw_led_on(hw, pin0);
805	else
806		rtl8723be_sw_led_off(hw, pin0);
807}
808
809static bool _rtl8723be_init_mac(struct ieee80211_hw *hw)
810{
811	struct rtl_priv *rtlpriv = rtl_priv(hw);
812	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
813	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
814	unsigned char bytetmp;
815	unsigned short wordtmp;
816
817	rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x00);
818
819	/*Auto Power Down to CHIP-off State*/
820	bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO + 1) & (~BIT(7));
821	rtl_write_byte(rtlpriv, REG_APS_FSMCO + 1, bytetmp);
822
823	/* HW Power on sequence */
824	if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK,
825				      PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,
826				      RTL8723_NIC_ENABLE_FLOW)) {
827		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
828			"init MAC Fail as power on failure\n");
829		return false;
830	}
831
832	if (rtlpriv->cfg->ops->get_btc_status())
833		rtlpriv->btcoexist.btc_ops->btc_power_on_setting(rtlpriv);
834
835	bytetmp = rtl_read_byte(rtlpriv, REG_MULTI_FUNC_CTRL);
836	rtl_write_byte(rtlpriv, REG_MULTI_FUNC_CTRL, bytetmp | BIT(3));
837
838	bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO) | BIT(4);
839	rtl_write_byte(rtlpriv, REG_APS_FSMCO, bytetmp);
840
841	bytetmp = rtl_read_byte(rtlpriv, REG_CR);
842	bytetmp = 0xff;
843	rtl_write_byte(rtlpriv, REG_CR, bytetmp);
844	mdelay(2);
845
846	bytetmp = rtl_read_byte(rtlpriv, REG_HWSEQ_CTRL);
847	bytetmp |= 0x7f;
848	rtl_write_byte(rtlpriv, REG_HWSEQ_CTRL, bytetmp);
849	mdelay(2);
850
851	bytetmp = rtl_read_byte(rtlpriv, REG_SYS_CFG + 3);
852	if (bytetmp & BIT(0)) {
853		bytetmp = rtl_read_byte(rtlpriv, 0x7c);
854		rtl_write_byte(rtlpriv, 0x7c, bytetmp | BIT(6));
855	}
856
857	bytetmp = rtl_read_byte(rtlpriv, REG_SYS_CLKR);
858	rtl_write_byte(rtlpriv, REG_SYS_CLKR, bytetmp | BIT(3));
859	bytetmp = rtl_read_byte(rtlpriv, REG_GPIO_MUXCFG + 1);
860	rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG + 1, bytetmp & (~BIT(4)));
861
862	rtl_write_word(rtlpriv, REG_CR, 0x2ff);
863
864	if (!rtlhal->mac_func_enable) {
865		if (!_rtl8723be_llt_table_init(hw))
866			return false;
867	}
868
869	rtl_write_dword(rtlpriv, REG_HISR, 0xffffffff);
870	rtl_write_dword(rtlpriv, REG_HISRE, 0xffffffff);
871
872	/* Enable FW Beamformer Interrupt */
873	bytetmp = rtl_read_byte(rtlpriv, REG_FWIMR + 3);
874	rtl_write_byte(rtlpriv, REG_FWIMR + 3, bytetmp | BIT(6));
875
876	wordtmp = rtl_read_word(rtlpriv, REG_TRXDMA_CTRL);
877	wordtmp &= 0xf;
878	wordtmp |= 0xF5B1;
879	rtl_write_word(rtlpriv, REG_TRXDMA_CTRL, wordtmp);
880
881	rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 1, 0x1F);
882	rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
883	rtl_write_word(rtlpriv, REG_RXFLTMAP2, 0xFFFF);
884	rtl_write_dword(rtlpriv, REG_TCR, rtlpci->transmit_config);
885
886	rtl_write_dword(rtlpriv, REG_BCNQ_DESA,
887			((u64) rtlpci->tx_ring[BEACON_QUEUE].dma) &
888			DMA_BIT_MASK(32));
889	rtl_write_dword(rtlpriv, REG_MGQ_DESA,
890			(u64) rtlpci->tx_ring[MGNT_QUEUE].dma &
891			DMA_BIT_MASK(32));
892	rtl_write_dword(rtlpriv, REG_VOQ_DESA,
893			(u64) rtlpci->tx_ring[VO_QUEUE].dma & DMA_BIT_MASK(32));
894	rtl_write_dword(rtlpriv, REG_VIQ_DESA,
895			(u64) rtlpci->tx_ring[VI_QUEUE].dma & DMA_BIT_MASK(32));
896	rtl_write_dword(rtlpriv, REG_BEQ_DESA,
897			(u64) rtlpci->tx_ring[BE_QUEUE].dma & DMA_BIT_MASK(32));
898	rtl_write_dword(rtlpriv, REG_BKQ_DESA,
899			(u64) rtlpci->tx_ring[BK_QUEUE].dma & DMA_BIT_MASK(32));
900	rtl_write_dword(rtlpriv, REG_HQ_DESA,
901			(u64) rtlpci->tx_ring[HIGH_QUEUE].dma &
902			DMA_BIT_MASK(32));
903	rtl_write_dword(rtlpriv, REG_RX_DESA,
904			(u64) rtlpci->rx_ring[RX_MPDU_QUEUE].dma &
905			DMA_BIT_MASK(32));
906
907	bytetmp = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG + 3);
908	rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 3, bytetmp | 0x77);
909
910	rtl_write_dword(rtlpriv, REG_INT_MIG, 0);
911
912	rtl_write_dword(rtlpriv, REG_MCUTST_1, 0x0);
913
914	rtl_write_byte(rtlpriv, REG_SECONDARY_CCA_CTRL, 0x3);
915
916	/* <20130114, Kordan> The following setting is
917	 * only for DPDT and Fixed board type.
918	 * TODO:  A better solution is configure it
919	 * according EFUSE during the run-time.
920	 */
921	rtl_set_bbreg(hw, 0x64, BIT(20), 0x0);/* 0x66[4]=0 */
922	rtl_set_bbreg(hw, 0x64, BIT(24), 0x0);/* 0x66[8]=0 */
923	rtl_set_bbreg(hw, 0x40, BIT(4), 0x0)/* 0x40[4]=0 */;
924	rtl_set_bbreg(hw, 0x40, BIT(3), 0x1)/* 0x40[3]=1 */;
925	rtl_set_bbreg(hw, 0x4C, BIT(24) | BIT(23), 0x2)/* 0x4C[24:23]=10 */;
926	rtl_set_bbreg(hw, 0x944, BIT(1) | BIT(0), 0x3)/* 0x944[1:0]=11 */;
927	rtl_set_bbreg(hw, 0x930, MASKBYTE0, 0x77)/* 0x930[7:0]=77 */;
928	rtl_set_bbreg(hw, 0x38, BIT(11), 0x1)/* 0x38[11]=1 */;
929
930	bytetmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
931	rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, bytetmp & (~BIT(2)));
932
933	_rtl8723be_gen_refresh_led_state(hw);
934	return true;
935}
936
937static void _rtl8723be_hw_configure(struct ieee80211_hw *hw)
938{
939	struct rtl_priv *rtlpriv = rtl_priv(hw);
940	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
941	u32 reg_rrsr;
942
943	reg_rrsr = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
944	/* Init value for RRSR. */
945	rtl_write_dword(rtlpriv, REG_RRSR, reg_rrsr);
946
947	/* ARFB table 9 for 11ac 5G 2SS */
948	rtl_write_dword(rtlpriv, REG_ARFR0 + 4, 0xfffff000);
949
950	/* ARFB table 10 for 11ac 5G 1SS */
951	rtl_write_dword(rtlpriv, REG_ARFR1 + 4, 0x003ff000);
952
953	/* CF-End setting. */
954	rtl_write_word(rtlpriv, REG_FWHW_TXQ_CTRL, 0x1F00);
955
956	/* 0x456 = 0x70, sugguested by Zhilin */
957	rtl_write_byte(rtlpriv, REG_AMPDU_MAX_TIME, 0x70);
958
959	/* Set retry limit */
960	rtl_write_word(rtlpriv, REG_RL, 0x0707);
961
962	/* Set Data / Response auto rate fallack retry count */
963	rtl_write_dword(rtlpriv, REG_DARFRC, 0x01000000);
964	rtl_write_dword(rtlpriv, REG_DARFRC + 4, 0x07060504);
965	rtl_write_dword(rtlpriv, REG_RARFRC, 0x01000000);
966	rtl_write_dword(rtlpriv, REG_RARFRC + 4, 0x07060504);
967
968	rtlpci->reg_bcn_ctrl_val = 0x1d;
969	rtl_write_byte(rtlpriv, REG_BCN_CTRL, rtlpci->reg_bcn_ctrl_val);
970
971	/* TBTT prohibit hold time. Suggested by designer TimChen. */
972	rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff); /* 8 ms */
973
974	rtl_write_word(rtlpriv, REG_NAV_PROT_LEN, 0x0040);
975
976	/*For Rx TP. Suggested by SD1 Richard. Added by tynli. 2010.04.12.*/
977	rtl_write_dword(rtlpriv, REG_FAST_EDCA_CTRL, 0x03086666);
978
979	rtl_write_byte(rtlpriv, REG_HT_SINGLE_AMPDU, 0x80);
980
981	rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x20);
982
983	rtl_write_byte(rtlpriv, REG_MAX_AGGR_NUM, 0x1F);
984}
985
986static u8 _rtl8723be_dbi_read(struct rtl_priv *rtlpriv, u16 addr)
987{
988	u16 read_addr = addr & 0xfffc;
989	u8 ret = 0, tmp = 0, count = 0;
990
991	rtl_write_word(rtlpriv, REG_DBI_ADDR, read_addr);
992	rtl_write_byte(rtlpriv, REG_DBI_FLAG, 0x2);
993	tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
994	count = 0;
995	while (tmp && count < 20) {
996		udelay(10);
997		tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
998		count++;
999	}
1000	if (0 == tmp) {
1001		read_addr = REG_DBI_RDATA + addr % 4;
1002		ret = rtl_read_byte(rtlpriv, read_addr);
1003	}
1004
1005	return ret;
1006}
1007
1008static void _rtl8723be_dbi_write(struct rtl_priv *rtlpriv, u16 addr, u8 data)
1009{
1010	u8 tmp = 0, count = 0;
1011	u16 write_addr = 0, remainder = addr % 4;
1012
1013	/* Write DBI 1Byte Data */
1014	write_addr = REG_DBI_WDATA + remainder;
1015	rtl_write_byte(rtlpriv, write_addr, data);
1016
1017	/* Write DBI 2Byte Address & Write Enable */
1018	write_addr = (addr & 0xfffc) | (BIT(0) << (remainder + 12));
1019	rtl_write_word(rtlpriv, REG_DBI_ADDR, write_addr);
1020
1021	/* Write DBI Write Flag */
1022	rtl_write_byte(rtlpriv, REG_DBI_FLAG, 0x1);
1023
1024	tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1025	count = 0;
1026	while (tmp && count < 20) {
1027		udelay(10);
1028		tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1029		count++;
1030	}
1031}
1032
1033static u16 _rtl8723be_mdio_read(struct rtl_priv *rtlpriv, u8 addr)
1034{
1035	u16 ret = 0;
1036	u8 tmp = 0, count = 0;
1037
1038	rtl_write_byte(rtlpriv, REG_MDIO_CTL, addr | BIT(6));
1039	tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(6);
1040	count = 0;
1041	while (tmp && count < 20) {
1042		udelay(10);
1043		tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(6);
1044		count++;
1045	}
1046
1047	if (0 == tmp)
1048		ret = rtl_read_word(rtlpriv, REG_MDIO_RDATA);
1049
1050	return ret;
1051}
1052
1053static void _rtl8723be_mdio_write(struct rtl_priv *rtlpriv, u8 addr, u16 data)
1054{
1055	u8 tmp = 0, count = 0;
1056
1057	rtl_write_word(rtlpriv, REG_MDIO_WDATA, data);
1058	rtl_write_byte(rtlpriv, REG_MDIO_CTL, addr | BIT(5));
1059	tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(5);
1060	count = 0;
1061	while (tmp && count < 20) {
1062		udelay(10);
1063		tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(5);
1064		count++;
1065	}
1066}
1067
1068static void _rtl8723be_enable_aspm_back_door(struct ieee80211_hw *hw)
1069{
1070	struct rtl_priv *rtlpriv = rtl_priv(hw);
1071	u8 tmp8 = 0;
1072	u16 tmp16 = 0;
1073
1074	/* <Roger_Notes> Overwrite following ePHY parameter for
1075	 * some platform compatibility issue,
1076	 * especially when CLKReq is enabled, 2012.11.09.
1077	 */
1078	tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x01);
1079	if (tmp16 != 0x0663)
1080		_rtl8723be_mdio_write(rtlpriv, 0x01, 0x0663);
1081
1082	tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x04);
1083	if (tmp16 != 0x7544)
1084		_rtl8723be_mdio_write(rtlpriv, 0x04, 0x7544);
1085
1086	tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x06);
1087	if (tmp16 != 0xB880)
1088		_rtl8723be_mdio_write(rtlpriv, 0x06, 0xB880);
1089
1090	tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x07);
1091	if (tmp16 != 0x4000)
1092		_rtl8723be_mdio_write(rtlpriv, 0x07, 0x4000);
1093
1094	tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x08);
1095	if (tmp16 != 0x9003)
1096		_rtl8723be_mdio_write(rtlpriv, 0x08, 0x9003);
1097
1098	tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x09);
1099	if (tmp16 != 0x0D03)
1100		_rtl8723be_mdio_write(rtlpriv, 0x09, 0x0D03);
1101
1102	tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x0A);
1103	if (tmp16 != 0x4037)
1104		_rtl8723be_mdio_write(rtlpriv, 0x0A, 0x4037);
1105
1106	tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x0B);
1107	if (tmp16 != 0x0070)
1108		_rtl8723be_mdio_write(rtlpriv, 0x0B, 0x0070);
1109
1110	/* Configuration Space offset 0x70f BIT7 is used to control L0S */
1111	tmp8 = _rtl8723be_dbi_read(rtlpriv, 0x70f);
1112	_rtl8723be_dbi_write(rtlpriv, 0x70f, tmp8 | BIT(7) |
1113			     ASPM_L1_LATENCY << 3);
1114
1115	/* Configuration Space offset 0x719 Bit3 is for L1
1116	 * BIT4 is for clock request
1117	 */
1118	tmp8 = _rtl8723be_dbi_read(rtlpriv, 0x719);
1119	_rtl8723be_dbi_write(rtlpriv, 0x719, tmp8 | BIT(3) | BIT(4));
1120}
1121
1122void rtl8723be_enable_hw_security_config(struct ieee80211_hw *hw)
1123{
1124	struct rtl_priv *rtlpriv = rtl_priv(hw);
1125	u8 sec_reg_value;
1126
1127	rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG,
1128		"PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n",
1129		rtlpriv->sec.pairwise_enc_algorithm,
1130		rtlpriv->sec.group_enc_algorithm);
1131
1132	if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) {
1133		rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
1134			"not open hw encryption\n");
1135		return;
1136	}
1137
1138	sec_reg_value = SCR_TXENCENABLE | SCR_RXDECENABLE;
1139
1140	if (rtlpriv->sec.use_defaultkey) {
1141		sec_reg_value |= SCR_TXUSEDK;
1142		sec_reg_value |= SCR_RXUSEDK;
1143	}
1144
1145	sec_reg_value |= (SCR_RXBCUSEDK | SCR_TXBCUSEDK);
1146
1147	rtl_write_byte(rtlpriv, REG_CR + 1, 0x02);
1148
1149	rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
1150		"The SECR-value %x\n", sec_reg_value);
1151
1152	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_WPA_CONFIG, &sec_reg_value);
1153}
1154
1155static void _rtl8723be_poweroff_adapter(struct ieee80211_hw *hw)
1156{
1157	struct rtl_priv *rtlpriv = rtl_priv(hw);
1158	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1159	u8 u1b_tmp;
1160
1161	rtlhal->mac_func_enable = false;
1162	/* Combo (PCIe + USB) Card and PCIe-MF Card */
1163	/* 1. Run LPS WL RFOFF flow */
1164	rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1165				 PWR_INTF_PCI_MSK, RTL8723_NIC_LPS_ENTER_FLOW);
1166
1167	/* 2. 0x1F[7:0] = 0 */
1168	/* turn off RF */
1169	/* rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x00); */
1170	if ((rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) &&
1171	    rtlhal->fw_ready) {
1172		rtl8723be_firmware_selfreset(hw);
1173	}
1174
1175	/* Reset MCU. Suggested by Filen. */
1176	u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
1177	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, (u1b_tmp & (~BIT(2))));
1178
1179	/* g.	MCUFWDL 0x80[1:0]=0	 */
1180	/* reset MCU ready status */
1181	rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);
1182
1183	/* HW card disable configuration. */
1184	rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1185				 PWR_INTF_PCI_MSK, RTL8723_NIC_DISABLE_FLOW);
1186
1187	/* Reset MCU IO Wrapper */
1188	u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
1189	rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, (u1b_tmp & (~BIT(0))));
1190	u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
1191	rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, u1b_tmp | BIT(0));
1192
1193	/* 7. RSV_CTRL 0x1C[7:0] = 0x0E */
1194	/* lock ISO/CLK/Power control register */
1195	rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x0e);
1196}
1197
1198static bool _rtl8723be_check_pcie_dma_hang(struct rtl_priv *rtlpriv)
1199{
1200	u8 tmp;
1201
1202	/* write reg 0x350 Bit[26]=1. Enable debug port. */
1203	tmp = rtl_read_byte(rtlpriv, REG_DBI_CTRL + 3);
1204	if (!(tmp & BIT(2))) {
1205		rtl_write_byte(rtlpriv, REG_DBI_CTRL + 3, (tmp | BIT(2)));
1206		mdelay(100); /* Suggested by DD Justin_tsai. */
1207	}
1208
1209	/* read reg 0x350 Bit[25] if 1 : RX hang
1210	 * read reg 0x350 Bit[24] if 1 : TX hang
1211	 */
1212	tmp = rtl_read_byte(rtlpriv, REG_DBI_CTRL + 3);
1213	if ((tmp & BIT(0)) || (tmp & BIT(1))) {
1214		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1215			"CheckPcieDMAHang8723BE(): true!!\n");
1216		return true;
1217	}
1218	return false;
1219}
1220
1221static void _rtl8723be_reset_pcie_interface_dma(struct rtl_priv *rtlpriv,
1222						bool mac_power_on)
1223{
1224	u8 tmp;
1225	bool release_mac_rx_pause;
1226	u8 backup_pcie_dma_pause;
1227
1228	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1229		"ResetPcieInterfaceDMA8723BE()\n");
1230
1231	/* Revise Note: Follow the document "PCIe RX DMA Hang Reset Flow_v03"
1232	 * released by SD1 Alan.
1233	 * 2013.05.07, by tynli.
1234	 */
1235
1236	/* 1. disable register write lock
1237	 *	write 0x1C bit[1:0] = 2'h0
1238	 *	write 0xCC bit[2] = 1'b1
1239	 */
1240	tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL);
1241	tmp &= ~(BIT(1) | BIT(0));
1242	rtl_write_byte(rtlpriv, REG_RSV_CTRL, tmp);
1243	tmp = rtl_read_byte(rtlpriv, REG_PMC_DBG_CTRL2);
1244	tmp |= BIT(2);
1245	rtl_write_byte(rtlpriv, REG_PMC_DBG_CTRL2, tmp);
1246
1247	/* 2. Check and pause TRX DMA
1248	 *	write 0x284 bit[18] = 1'b1
1249	 *	write 0x301 = 0xFF
1250	 */
1251	tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1252	if (tmp & BIT(2)) {
1253		/* Already pause before the function for another purpose. */
1254		release_mac_rx_pause = false;
1255	} else {
1256		rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, (tmp | BIT(2)));
1257		release_mac_rx_pause = true;
1258	}
1259
1260	backup_pcie_dma_pause = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG + 1);
1261	if (backup_pcie_dma_pause != 0xFF)
1262		rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xFF);
1263
1264	if (mac_power_on) {
1265		/* 3. reset TRX function
1266		 *	write 0x100 = 0x00
1267		 */
1268		rtl_write_byte(rtlpriv, REG_CR, 0);
1269	}
1270
1271	/* 4. Reset PCIe DMA
1272	 *	write 0x003 bit[0] = 0
1273	 */
1274	tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
1275	tmp &= ~(BIT(0));
1276	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmp);
1277
1278	/* 5. Enable PCIe DMA
1279	 *	write 0x003 bit[0] = 1
1280	 */
1281	tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
1282	tmp |= BIT(0);
1283	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmp);
1284
1285	if (mac_power_on) {
1286		/* 6. enable TRX function
1287		 *	write 0x100 = 0xFF
1288		 */
1289		rtl_write_byte(rtlpriv, REG_CR, 0xFF);
1290
1291		/* We should init LLT & RQPN and
1292		 * prepare Tx/Rx descrptor address later
1293		 * because MAC function is reset.
1294		 */
1295	}
1296
1297	/* 7. Restore PCIe autoload down bit
1298	 *	write 0xF8 bit[17] = 1'b1
1299	 */
1300	tmp = rtl_read_byte(rtlpriv, REG_MAC_PHY_CTRL_NORMAL + 2);
1301	tmp |= BIT(1);
1302	rtl_write_byte(rtlpriv, REG_MAC_PHY_CTRL_NORMAL + 2, tmp);
1303
1304	/* In MAC power on state, BB and RF maybe in ON state,
1305	 * if we release TRx DMA here
1306	 * it will cause packets to be started to Tx/Rx,
1307	 * so we release Tx/Rx DMA later.
1308	 */
1309	if (!mac_power_on) {
1310		/* 8. release TRX DMA
1311		 *	write 0x284 bit[18] = 1'b0
1312		 *	write 0x301 = 0x00
1313		 */
1314		if (release_mac_rx_pause) {
1315			tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1316			rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL,
1317				       (tmp & (~BIT(2))));
1318		}
1319		rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1,
1320			       backup_pcie_dma_pause);
1321	}
1322
1323	/* 9. lock system register
1324	 *	write 0xCC bit[2] = 1'b0
1325	 */
1326	tmp = rtl_read_byte(rtlpriv, REG_PMC_DBG_CTRL2);
1327	tmp &= ~(BIT(2));
1328	rtl_write_byte(rtlpriv, REG_PMC_DBG_CTRL2, tmp);
1329}
1330
1331int rtl8723be_hw_init(struct ieee80211_hw *hw)
1332{
1333	struct rtl_priv *rtlpriv = rtl_priv(hw);
1334	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1335	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1336	struct rtl_phy *rtlphy = &(rtlpriv->phy);
1337	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1338	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1339	bool rtstatus = true;
1340	int err;
1341	u8 tmp_u1b;
1342	unsigned long flags;
1343
1344	/* reenable interrupts to not interfere with other devices */
1345	local_save_flags(flags);
1346	local_irq_enable();
1347
1348	rtlhal->fw_ready = false;
1349	rtlpriv->rtlhal.being_init_adapter = true;
1350	rtlpriv->intf_ops->disable_aspm(hw);
1351
1352	tmp_u1b = rtl_read_byte(rtlpriv, REG_CR);
1353	if (tmp_u1b != 0 && tmp_u1b != 0xea) {
1354		rtlhal->mac_func_enable = true;
1355	} else {
1356		rtlhal->mac_func_enable = false;
1357		rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON;
1358	}
1359
1360	if (_rtl8723be_check_pcie_dma_hang(rtlpriv)) {
1361		_rtl8723be_reset_pcie_interface_dma(rtlpriv,
1362						    rtlhal->mac_func_enable);
1363		rtlhal->mac_func_enable = false;
1364	}
1365	if (rtlhal->mac_func_enable) {
1366		_rtl8723be_poweroff_adapter(hw);
1367		rtlhal->mac_func_enable = false;
1368	}
1369	rtstatus = _rtl8723be_init_mac(hw);
1370	if (!rtstatus) {
1371		pr_err("Init MAC failed\n");
1372		err = 1;
1373		goto exit;
1374	}
1375
1376	tmp_u1b = rtl_read_byte(rtlpriv, REG_SYS_CFG);
1377	rtl_write_byte(rtlpriv, REG_SYS_CFG, tmp_u1b & 0x7F);
1378
1379	err = rtl8723_download_fw(hw, true, FW_8723B_POLLING_TIMEOUT_COUNT);
1380	if (err) {
1381		rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
1382			"Failed to download FW. Init HW without FW now..\n");
1383		err = 1;
1384		goto exit;
1385	}
1386	rtlhal->fw_ready = true;
1387
1388	rtlhal->last_hmeboxnum = 0;
1389	rtl8723be_phy_mac_config(hw);
1390	/* because last function modify RCR, so we update
1391	 * rcr var here, or TP will unstable for receive_config
1392	 * is wrong, RX RCR_ACRC32 will cause TP unstable & Rx
1393	 * RCR_APP_ICV will cause mac80211 unassoc for cisco 1252
1394	 */
1395	rtlpci->receive_config = rtl_read_dword(rtlpriv, REG_RCR);
1396	rtlpci->receive_config &= ~(RCR_ACRC32 | RCR_AICV);
1397	rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
1398
1399	rtl8723be_phy_bb_config(hw);
1400	rtl8723be_phy_rf_config(hw);
1401
1402	rtlphy->rfreg_chnlval[0] = rtl_get_rfreg(hw, (enum radio_path)0,
1403						 RF_CHNLBW, RFREG_OFFSET_MASK);
1404	rtlphy->rfreg_chnlval[1] = rtl_get_rfreg(hw, (enum radio_path)1,
1405						 RF_CHNLBW, RFREG_OFFSET_MASK);
1406	rtlphy->rfreg_chnlval[0] &= 0xFFF03FF;
1407	rtlphy->rfreg_chnlval[0] |= (BIT(10) | BIT(11));
1408
1409	_rtl8723be_hw_configure(hw);
1410	rtlhal->mac_func_enable = true;
1411	rtl_cam_reset_all_entry(hw);
1412	rtl8723be_enable_hw_security_config(hw);
1413
1414	ppsc->rfpwr_state = ERFON;
1415
1416	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ETHER_ADDR, mac->mac_addr);
1417	_rtl8723be_enable_aspm_back_door(hw);
1418	rtlpriv->intf_ops->enable_aspm(hw);
1419
1420	rtl8723be_bt_hw_init(hw);
1421
1422	if (ppsc->rfpwr_state == ERFON) {
1423		rtl8723be_phy_set_rfpath_switch(hw, 1);
1424		/* when use 1ant NIC, iqk will disturb BT music
1425		 * root cause is not clear now, is something
1426		 * related with 'mdelay' and Reg[0x948]
1427		 */
1428		if (rtlpriv->btcoexist.btc_info.ant_num == ANT_X2 ||
1429		    !rtlpriv->cfg->ops->get_btc_status()) {
1430			rtl8723be_phy_iq_calibrate(hw,
1431						   (rtlphy->iqk_initialized ?
1432						    true : false));
1433			rtlphy->iqk_initialized = true;
1434		}
1435		rtl8723be_dm_check_txpower_tracking(hw);
1436		rtl8723be_phy_lc_calibrate(hw);
1437	}
1438	rtl_write_byte(rtlpriv, REG_NAV_UPPER, ((30000 + 127) / 128));
1439
1440	/* Release Rx DMA. */
1441	tmp_u1b = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1442	if (tmp_u1b & BIT(2)) {
1443		/* Release Rx DMA if needed */
1444		tmp_u1b &= (~BIT(2));
1445		rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, tmp_u1b);
1446	}
1447	/* Release Tx/Rx PCIE DMA. */
1448	rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0);
1449
1450	rtl8723be_dm_init(hw);
1451exit:
1452	local_irq_restore(flags);
1453	rtlpriv->rtlhal.being_init_adapter = false;
1454	return err;
1455}
1456
1457static enum version_8723e _rtl8723be_read_chip_version(struct ieee80211_hw *hw)
1458{
1459	struct rtl_priv *rtlpriv = rtl_priv(hw);
1460	struct rtl_phy *rtlphy = &(rtlpriv->phy);
1461	enum version_8723e version = VERSION_UNKNOWN;
1462	u32 value32;
1463
1464	value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG1);
1465	if ((value32 & (CHIP_8723B)) != CHIP_8723B)
1466		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "unknown chip version\n");
1467	else
1468		version = (enum version_8723e)CHIP_8723B;
1469
1470	rtlphy->rf_type = RF_1T1R;
1471
1472	/* treat rtl8723be chip as  MP version in default */
1473	version = (enum version_8723e)(version | NORMAL_CHIP);
1474
1475	value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG);
1476	/* cut version */
1477	version |= (enum version_8723e)(value32 & CHIP_VER_RTL_MASK);
1478	/* Manufacture */
1479	if (((value32 & EXT_VENDOR_ID) >> 18) == 0x01)
1480		version = (enum version_8723e)(version | CHIP_VENDOR_SMIC);
1481
1482	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1483		"Chip RF Type: %s\n", (rtlphy->rf_type == RF_2T2R) ?
1484		"RF_2T2R" : "RF_1T1R");
1485
1486	return version;
1487}
1488
1489static int _rtl8723be_set_media_status(struct ieee80211_hw *hw,
1490				       enum nl80211_iftype type)
1491{
1492	struct rtl_priv *rtlpriv = rtl_priv(hw);
1493	u8 bt_msr = rtl_read_byte(rtlpriv, MSR) & 0xfc;
1494	enum led_ctl_mode ledaction = LED_CTL_NO_LINK;
1495	u8 mode = MSR_NOLINK;
1496
1497	switch (type) {
1498	case NL80211_IFTYPE_UNSPECIFIED:
1499		mode = MSR_NOLINK;
1500		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
1501			"Set Network type to NO LINK!\n");
1502		break;
1503	case NL80211_IFTYPE_ADHOC:
1504	case NL80211_IFTYPE_MESH_POINT:
1505		mode = MSR_ADHOC;
1506		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
1507			"Set Network type to Ad Hoc!\n");
1508		break;
1509	case NL80211_IFTYPE_STATION:
1510		mode = MSR_INFRA;
1511		ledaction = LED_CTL_LINK;
1512		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
1513			"Set Network type to STA!\n");
1514		break;
1515	case NL80211_IFTYPE_AP:
1516		mode = MSR_AP;
1517		ledaction = LED_CTL_LINK;
1518		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
1519			"Set Network type to AP!\n");
1520		break;
1521	default:
1522		pr_err("Network type %d not support!\n", type);
1523		return 1;
1524	}
1525
1526	/* MSR_INFRA == Link in infrastructure network;
1527	 * MSR_ADHOC == Link in ad hoc network;
1528	 * Therefore, check link state is necessary.
1529	 *
1530	 * MSR_AP == AP mode; link state is not cared here.
1531	 */
1532	if (mode != MSR_AP && rtlpriv->mac80211.link_state < MAC80211_LINKED) {
1533		mode = MSR_NOLINK;
1534		ledaction = LED_CTL_NO_LINK;
1535	}
1536
1537	if (mode == MSR_NOLINK || mode == MSR_INFRA) {
1538		_rtl8723be_stop_tx_beacon(hw);
1539		_rtl8723be_enable_bcn_sub_func(hw);
1540	} else if (mode == MSR_ADHOC || mode == MSR_AP) {
1541		_rtl8723be_resume_tx_beacon(hw);
1542		_rtl8723be_disable_bcn_sub_func(hw);
1543	} else {
1544		rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
1545			"Set HW_VAR_MEDIA_STATUS: No such media status(%x).\n",
1546			mode);
1547	}
1548
1549	rtl_write_byte(rtlpriv, MSR, bt_msr | mode);
1550	rtlpriv->cfg->ops->led_control(hw, ledaction);
1551	if (mode == MSR_AP)
1552		rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
1553	else
1554		rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66);
1555	return 0;
1556}
1557
1558void rtl8723be_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid)
1559{
1560	struct rtl_priv *rtlpriv = rtl_priv(hw);
1561	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1562	u32 reg_rcr = rtlpci->receive_config;
1563
1564	if (rtlpriv->psc.rfpwr_state != ERFON)
1565		return;
1566
1567	if (check_bssid) {
1568		reg_rcr |= (RCR_CBSSID_DATA | RCR_CBSSID_BCN);
1569		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
1570					      (u8 *)(&reg_rcr));
1571		_rtl8723be_set_bcn_ctrl_reg(hw, 0, BIT(4));
1572	} else if (!check_bssid) {
1573		reg_rcr &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN));
1574		_rtl8723be_set_bcn_ctrl_reg(hw, BIT(4), 0);
1575		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
1576					      (u8 *)(&reg_rcr));
1577	}
1578
1579}
1580
1581int rtl8723be_set_network_type(struct ieee80211_hw *hw,
1582			       enum nl80211_iftype type)
1583{
1584	struct rtl_priv *rtlpriv = rtl_priv(hw);
1585
1586	if (_rtl8723be_set_media_status(hw, type))
1587		return -EOPNOTSUPP;
1588
1589	if (rtlpriv->mac80211.link_state == MAC80211_LINKED) {
1590		if (type != NL80211_IFTYPE_AP)
1591			rtl8723be_set_check_bssid(hw, true);
1592	} else {
1593		rtl8723be_set_check_bssid(hw, false);
1594	}
1595
1596	return 0;
1597}
1598
1599/* don't set REG_EDCA_BE_PARAM here
1600 * because mac80211 will send pkt when scan
1601 */
1602void rtl8723be_set_qos(struct ieee80211_hw *hw, int aci)
1603{
1604	struct rtl_priv *rtlpriv = rtl_priv(hw);
1605
1606	rtl8723_dm_init_edca_turbo(hw);
1607	switch (aci) {
1608	case AC1_BK:
1609		rtl_write_dword(rtlpriv, REG_EDCA_BK_PARAM, 0xa44f);
1610		break;
1611	case AC0_BE:
1612		break;
1613	case AC2_VI:
1614		rtl_write_dword(rtlpriv, REG_EDCA_VI_PARAM, 0x5e4322);
1615		break;
1616	case AC3_VO:
1617		rtl_write_dword(rtlpriv, REG_EDCA_VO_PARAM, 0x2f3222);
1618		break;
1619	default:
1620		WARN_ONCE(true, "rtl8723be: invalid aci: %d !\n", aci);
1621		break;
1622	}
1623}
1624
1625void rtl8723be_enable_interrupt(struct ieee80211_hw *hw)
1626{
1627	struct rtl_priv *rtlpriv = rtl_priv(hw);
1628	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1629
1630	rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF);
1631	rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF);
1632	rtlpci->irq_enabled = true;
1633
1634	/*enable system interrupt*/
1635	rtl_write_dword(rtlpriv, REG_HSIMR, rtlpci->sys_irq_mask & 0xFFFFFFFF);
1636}
1637
1638void rtl8723be_disable_interrupt(struct ieee80211_hw *hw)
1639{
1640	struct rtl_priv *rtlpriv = rtl_priv(hw);
1641	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1642
1643	rtl_write_dword(rtlpriv, REG_HIMR, IMR_DISABLED);
1644	rtl_write_dword(rtlpriv, REG_HIMRE, IMR_DISABLED);
1645	rtlpci->irq_enabled = false;
1646	/*synchronize_irq(rtlpci->pdev->irq);*/
1647}
1648
1649void rtl8723be_card_disable(struct ieee80211_hw *hw)
1650{
1651	struct rtl_priv *rtlpriv = rtl_priv(hw);
1652	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1653	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1654	enum nl80211_iftype opmode;
1655
1656	mac->link_state = MAC80211_NOLINK;
1657	opmode = NL80211_IFTYPE_UNSPECIFIED;
1658	_rtl8723be_set_media_status(hw, opmode);
1659	if (rtlpriv->rtlhal.driver_is_goingto_unload ||
1660	    ppsc->rfoff_reason > RF_CHANGE_BY_PS)
1661		rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_OFF);
1662	RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
1663	_rtl8723be_poweroff_adapter(hw);
1664
1665	/* after power off we should do iqk again */
1666	if (!rtlpriv->cfg->ops->get_btc_status())
1667		rtlpriv->phy.iqk_initialized = false;
1668}
1669
1670void rtl8723be_interrupt_recognized(struct ieee80211_hw *hw,
1671				    struct rtl_int *intvec)
1672{
1673	struct rtl_priv *rtlpriv = rtl_priv(hw);
1674	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1675
1676	intvec->inta = rtl_read_dword(rtlpriv, ISR) & rtlpci->irq_mask[0];
1677	rtl_write_dword(rtlpriv, ISR, intvec->inta);
1678
1679	intvec->intb = rtl_read_dword(rtlpriv, REG_HISRE) &
1680				      rtlpci->irq_mask[1];
1681	rtl_write_dword(rtlpriv, REG_HISRE, intvec->intb);
1682}
1683
1684void rtl8723be_set_beacon_related_registers(struct ieee80211_hw *hw)
1685{
1686	struct rtl_priv *rtlpriv = rtl_priv(hw);
1687	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1688	u16 bcn_interval, atim_window;
1689
1690	bcn_interval = mac->beacon_interval;
1691	atim_window = 2;	/*FIX MERGE */
1692	rtl8723be_disable_interrupt(hw);
1693	rtl_write_word(rtlpriv, REG_ATIMWND, atim_window);
1694	rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
1695	rtl_write_word(rtlpriv, REG_BCNTCFG, 0x660f);
1696	rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_CCK, 0x18);
1697	rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_OFDM, 0x18);
1698	rtl_write_byte(rtlpriv, 0x606, 0x30);
1699	rtl8723be_enable_interrupt(hw);
1700}
1701
1702void rtl8723be_set_beacon_interval(struct ieee80211_hw *hw)
1703{
1704	struct rtl_priv *rtlpriv = rtl_priv(hw);
1705	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1706	u16 bcn_interval = mac->beacon_interval;
1707
1708	rtl_dbg(rtlpriv, COMP_BEACON, DBG_DMESG,
1709		"beacon_interval:%d\n", bcn_interval);
1710	rtl8723be_disable_interrupt(hw);
1711	rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
1712	rtl8723be_enable_interrupt(hw);
1713}
1714
1715void rtl8723be_update_interrupt_mask(struct ieee80211_hw *hw,
1716				   u32 add_msr, u32 rm_msr)
1717{
1718	struct rtl_priv *rtlpriv = rtl_priv(hw);
1719	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1720
1721	rtl_dbg(rtlpriv, COMP_INTR, DBG_LOUD,
1722		"add_msr:%x, rm_msr:%x\n", add_msr, rm_msr);
1723
1724	if (add_msr)
1725		rtlpci->irq_mask[0] |= add_msr;
1726	if (rm_msr)
1727		rtlpci->irq_mask[0] &= (~rm_msr);
1728	rtl8723be_disable_interrupt(hw);
1729	rtl8723be_enable_interrupt(hw);
1730}
1731
1732static u8 _rtl8723be_get_chnl_group(u8 chnl)
1733{
1734	u8 group;
1735
1736	if (chnl < 3)
1737		group = 0;
1738	else if (chnl < 9)
1739		group = 1;
1740	else
1741		group = 2;
1742	return group;
1743}
1744
1745static void _rtl8723be_read_power_value_fromprom(struct ieee80211_hw *hw,
1746					struct txpower_info_2g *pw2g,
1747					struct txpower_info_5g *pw5g,
1748					bool autoload_fail, u8 *hwinfo)
1749{
1750	struct rtl_priv *rtlpriv = rtl_priv(hw);
1751	u32 path, addr = EEPROM_TX_PWR_INX, group, cnt = 0;
1752
1753	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1754		"hal_ReadPowerValueFromPROM8723BE(): PROMContent[0x%x]=0x%x\n",
1755		(addr + 1), hwinfo[addr + 1]);
1756	if (0xFF == hwinfo[addr + 1])  /*YJ,add,120316*/
1757		autoload_fail = true;
1758
1759	if (autoload_fail) {
1760		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1761			"auto load fail : Use Default value!\n");
1762		for (path = 0; path < MAX_RF_PATH; path++) {
1763			/* 2.4G default value */
1764			for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) {
1765				pw2g->index_cck_base[path][group] = 0x2D;
1766				pw2g->index_bw40_base[path][group] = 0x2D;
1767			}
1768			for (cnt = 0; cnt < MAX_TX_COUNT; cnt++) {
1769				if (cnt == 0) {
1770					pw2g->bw20_diff[path][0] = 0x02;
1771					pw2g->ofdm_diff[path][0] = 0x04;
1772				} else {
1773					pw2g->bw20_diff[path][cnt] = 0xFE;
1774					pw2g->bw40_diff[path][cnt] = 0xFE;
1775					pw2g->cck_diff[path][cnt] = 0xFE;
1776					pw2g->ofdm_diff[path][cnt] = 0xFE;
1777				}
1778			}
1779		}
1780		return;
1781	}
1782
1783	for (path = 0; path < MAX_RF_PATH; path++) {
1784		/*2.4G default value*/
1785		for (group = 0; group < MAX_CHNL_GROUP_24G; group++) {
1786			pw2g->index_cck_base[path][group] = hwinfo[addr++];
1787			if (pw2g->index_cck_base[path][group] == 0xFF)
1788				pw2g->index_cck_base[path][group] = 0x2D;
1789
1790		}
1791		for (group = 0; group < MAX_CHNL_GROUP_24G - 1; group++) {
1792			pw2g->index_bw40_base[path][group] = hwinfo[addr++];
1793			if (pw2g->index_bw40_base[path][group] == 0xFF)
1794				pw2g->index_bw40_base[path][group] = 0x2D;
1795		}
1796		for (cnt = 0; cnt < MAX_TX_COUNT; cnt++) {
1797			if (cnt == 0) {
1798				pw2g->bw40_diff[path][cnt] = 0;
1799				if (hwinfo[addr] == 0xFF) {
1800					pw2g->bw20_diff[path][cnt] = 0x02;
1801				} else {
1802					pw2g->bw20_diff[path][cnt] =
1803						(hwinfo[addr] & 0xf0) >> 4;
1804					/*bit sign number to 8 bit sign number*/
1805					if (pw2g->bw20_diff[path][cnt] & BIT(3))
1806						pw2g->bw20_diff[path][cnt] |=
1807									  0xF0;
1808				}
1809
1810				if (hwinfo[addr] == 0xFF) {
1811					pw2g->ofdm_diff[path][cnt] = 0x04;
1812				} else {
1813					pw2g->ofdm_diff[path][cnt] =
1814							(hwinfo[addr] & 0x0f);
1815					/*bit sign number to 8 bit sign number*/
1816					if (pw2g->ofdm_diff[path][cnt] & BIT(3))
1817						pw2g->ofdm_diff[path][cnt] |=
1818									  0xF0;
1819				}
1820				pw2g->cck_diff[path][cnt] = 0;
1821				addr++;
1822			} else {
1823				if (hwinfo[addr] == 0xFF) {
1824					pw2g->bw40_diff[path][cnt] = 0xFE;
1825				} else {
1826					pw2g->bw40_diff[path][cnt] =
1827						(hwinfo[addr] & 0xf0) >> 4;
1828					if (pw2g->bw40_diff[path][cnt] & BIT(3))
1829						pw2g->bw40_diff[path][cnt] |=
1830									  0xF0;
1831				}
1832
1833				if (hwinfo[addr] == 0xFF) {
1834					pw2g->bw20_diff[path][cnt] = 0xFE;
1835				} else {
1836					pw2g->bw20_diff[path][cnt] =
1837							(hwinfo[addr] & 0x0f);
1838					if (pw2g->bw20_diff[path][cnt] & BIT(3))
1839						pw2g->bw20_diff[path][cnt] |=
1840									  0xF0;
1841				}
1842				addr++;
1843
1844				if (hwinfo[addr] == 0xFF) {
1845					pw2g->ofdm_diff[path][cnt] = 0xFE;
1846				} else {
1847					pw2g->ofdm_diff[path][cnt] =
1848						(hwinfo[addr] & 0xf0) >> 4;
1849					if (pw2g->ofdm_diff[path][cnt] & BIT(3))
1850						pw2g->ofdm_diff[path][cnt] |=
1851									  0xF0;
1852				}
1853
1854				if (hwinfo[addr] == 0xFF)
1855					pw2g->cck_diff[path][cnt] = 0xFE;
1856				else {
1857					pw2g->cck_diff[path][cnt] =
1858							(hwinfo[addr] & 0x0f);
1859					if (pw2g->cck_diff[path][cnt] & BIT(3))
1860						pw2g->cck_diff[path][cnt] |=
1861									 0xF0;
1862				}
1863				addr++;
1864			}
1865		}
1866
1867		/*5G default value*/
1868		for (group = 0; group < MAX_CHNL_GROUP_5G; group++) {
1869			pw5g->index_bw40_base[path][group] = hwinfo[addr++];
1870			if (pw5g->index_bw40_base[path][group] == 0xFF)
1871				pw5g->index_bw40_base[path][group] = 0xFE;
1872		}
1873
1874		for (cnt = 0; cnt < MAX_TX_COUNT; cnt++) {
1875			if (cnt == 0) {
1876				pw5g->bw40_diff[path][cnt] = 0;
1877
1878				if (hwinfo[addr] == 0xFF) {
1879					pw5g->bw20_diff[path][cnt] = 0;
1880				} else {
1881					pw5g->bw20_diff[path][0] =
1882						(hwinfo[addr] & 0xf0) >> 4;
1883					if (pw5g->bw20_diff[path][cnt] & BIT(3))
1884						pw5g->bw20_diff[path][cnt] |=
1885									  0xF0;
1886				}
1887
1888				if (hwinfo[addr] == 0xFF)
1889					pw5g->ofdm_diff[path][cnt] = 0x04;
1890				else {
1891					pw5g->ofdm_diff[path][0] =
1892							(hwinfo[addr] & 0x0f);
1893					if (pw5g->ofdm_diff[path][cnt] & BIT(3))
1894						pw5g->ofdm_diff[path][cnt] |=
1895									  0xF0;
1896				}
1897				addr++;
1898			} else {
1899				if (hwinfo[addr] == 0xFF) {
1900					pw5g->bw40_diff[path][cnt] = 0xFE;
1901				} else {
1902					pw5g->bw40_diff[path][cnt] =
1903						(hwinfo[addr] & 0xf0) >> 4;
1904					if (pw5g->bw40_diff[path][cnt] & BIT(3))
1905						pw5g->bw40_diff[path][cnt] |= 0xF0;
1906				}
1907
1908				if (hwinfo[addr] == 0xFF) {
1909					pw5g->bw20_diff[path][cnt] = 0xFE;
1910				} else {
1911					pw5g->bw20_diff[path][cnt] =
1912							(hwinfo[addr] & 0x0f);
1913					if (pw5g->bw20_diff[path][cnt] & BIT(3))
1914						pw5g->bw20_diff[path][cnt] |= 0xF0;
1915				}
1916				addr++;
1917			}
1918		}
1919
1920		if (hwinfo[addr] == 0xFF) {
1921			pw5g->ofdm_diff[path][1] = 0xFE;
1922			pw5g->ofdm_diff[path][2] = 0xFE;
1923		} else {
1924			pw5g->ofdm_diff[path][1] = (hwinfo[addr] & 0xf0) >> 4;
1925			pw5g->ofdm_diff[path][2] = (hwinfo[addr] & 0x0f);
1926		}
1927		addr++;
1928
1929		if (hwinfo[addr] == 0xFF)
1930			pw5g->ofdm_diff[path][3] = 0xFE;
1931		else
1932			pw5g->ofdm_diff[path][3] = (hwinfo[addr] & 0x0f);
1933		addr++;
1934
1935		for (cnt = 1; cnt < MAX_TX_COUNT; cnt++) {
1936			if (pw5g->ofdm_diff[path][cnt] == 0xFF)
1937				pw5g->ofdm_diff[path][cnt] = 0xFE;
1938			else if (pw5g->ofdm_diff[path][cnt] & BIT(3))
1939				pw5g->ofdm_diff[path][cnt] |= 0xF0;
1940		}
1941	}
1942}
1943
1944static void _rtl8723be_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1945						   bool autoload_fail,
1946						   u8 *hwinfo)
1947{
1948	struct rtl_priv *rtlpriv = rtl_priv(hw);
1949	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1950	struct txpower_info_2g pw2g;
1951	struct txpower_info_5g pw5g;
1952	u8 rf_path, index;
1953	u8 i;
1954
1955	_rtl8723be_read_power_value_fromprom(hw, &pw2g, &pw5g, autoload_fail,
1956					     hwinfo);
1957
1958	for (rf_path = 0; rf_path < 2; rf_path++) {
1959		for (i = 0; i < 14; i++) {
1960			index = _rtl8723be_get_chnl_group(i+1);
1961
1962			rtlefuse->txpwrlevel_cck[rf_path][i] =
1963					pw2g.index_cck_base[rf_path][index];
1964			rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
1965					pw2g.index_bw40_base[rf_path][index];
1966		}
1967		for (i = 0; i < MAX_TX_COUNT; i++) {
1968			rtlefuse->txpwr_ht20diff[rf_path][i] =
1969						pw2g.bw20_diff[rf_path][i];
1970			rtlefuse->txpwr_ht40diff[rf_path][i] =
1971						pw2g.bw40_diff[rf_path][i];
1972			rtlefuse->txpwr_legacyhtdiff[rf_path][i] =
1973						pw2g.ofdm_diff[rf_path][i];
1974		}
1975
1976		for (i = 0; i < 14; i++) {
1977			RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
1978				"RF(%d)-Ch(%d) [CCK / HT40_1S ] = [0x%x / 0x%x ]\n",
1979				rf_path, i,
1980				rtlefuse->txpwrlevel_cck[rf_path][i],
1981				rtlefuse->txpwrlevel_ht40_1s[rf_path][i]);
1982		}
1983	}
1984
1985	if (!autoload_fail)
1986		rtlefuse->eeprom_thermalmeter =
1987					hwinfo[EEPROM_THERMAL_METER_88E];
1988	else
1989		rtlefuse->eeprom_thermalmeter = EEPROM_DEFAULT_THERMALMETER;
1990
1991	if (rtlefuse->eeprom_thermalmeter == 0xff || autoload_fail) {
1992		rtlefuse->apk_thermalmeterignore = true;
1993		rtlefuse->eeprom_thermalmeter = EEPROM_DEFAULT_THERMALMETER;
1994	}
1995
1996	rtlefuse->thermalmeter[0] = rtlefuse->eeprom_thermalmeter;
1997	RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
1998		"thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter);
1999
2000	if (!autoload_fail) {
2001		rtlefuse->eeprom_regulatory =
2002			hwinfo[EEPROM_RF_BOARD_OPTION_88E] & 0x07;/*bit0~2*/
2003		if (hwinfo[EEPROM_RF_BOARD_OPTION_88E] == 0xFF)
2004			rtlefuse->eeprom_regulatory = 0;
2005	} else {
2006		rtlefuse->eeprom_regulatory = 0;
2007	}
2008	RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
2009		"eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory);
2010}
2011
2012static u8 _rtl8723be_read_package_type(struct ieee80211_hw *hw)
2013{
2014	u8 package_type;
2015	u8 value;
2016
2017	efuse_power_switch(hw, false, true);
2018	if (!efuse_one_byte_read(hw, 0x1FB, &value))
2019		value = 0;
2020	efuse_power_switch(hw, false, false);
2021
2022	switch (value & 0x7) {
2023	case 0x4:
2024		package_type = PACKAGE_TFBGA79;
2025		break;
2026	case 0x5:
2027		package_type = PACKAGE_TFBGA90;
2028		break;
2029	case 0x6:
2030		package_type = PACKAGE_QFN68;
2031		break;
2032	case 0x7:
2033		package_type = PACKAGE_TFBGA80;
2034		break;
2035	default:
2036		package_type = PACKAGE_DEFAULT;
2037		break;
2038	}
2039
2040	return package_type;
2041}
2042
2043static void _rtl8723be_read_adapter_info(struct ieee80211_hw *hw,
2044					 bool pseudo_test)
2045{
2046	struct rtl_priv *rtlpriv = rtl_priv(hw);
2047	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2048	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2049	int params[] = {RTL8723BE_EEPROM_ID, EEPROM_VID, EEPROM_DID,
2050			EEPROM_SVID, EEPROM_SMID, EEPROM_MAC_ADDR,
2051			EEPROM_CHANNELPLAN, EEPROM_VERSION, EEPROM_CUSTOMER_ID,
2052			COUNTRY_CODE_WORLD_WIDE_13};
2053	u8 *hwinfo;
2054	int i;
2055	bool is_toshiba_smid1 = false;
2056	bool is_toshiba_smid2 = false;
2057	bool is_samsung_smid = false;
2058	bool is_lenovo_smid = false;
2059	u16 toshiba_smid1[] = {
2060		0x6151, 0x6152, 0x6154, 0x6155, 0x6177, 0x6178, 0x6179, 0x6180,
2061		0x7151, 0x7152, 0x7154, 0x7155, 0x7177, 0x7178, 0x7179, 0x7180,
2062		0x8151, 0x8152, 0x8154, 0x8155, 0x8181, 0x8182, 0x8184, 0x8185,
2063		0x9151, 0x9152, 0x9154, 0x9155, 0x9181, 0x9182, 0x9184, 0x9185
2064	};
2065	u16 toshiba_smid2[] = {
2066		0x6181, 0x6184, 0x6185, 0x7181, 0x7182, 0x7184, 0x7185, 0x8181,
2067		0x8182, 0x8184, 0x8185, 0x9181, 0x9182, 0x9184, 0x9185
2068	};
2069	u16 samsung_smid[] = {
2070		0x6191, 0x6192, 0x6193, 0x7191, 0x7192, 0x7193, 0x8191, 0x8192,
2071		0x8193, 0x9191, 0x9192, 0x9193
2072	};
2073	u16 lenovo_smid[] = {
2074		0x8195, 0x9195, 0x7194, 0x8200, 0x8201, 0x8202, 0x9199, 0x9200
2075	};
2076
2077	if (pseudo_test) {
2078		/* needs to be added */
2079		return;
2080	}
2081
2082	hwinfo = kzalloc(HWSET_MAX_SIZE, GFP_KERNEL);
2083	if (!hwinfo)
2084		return;
2085
2086	if (rtl_get_hwinfo(hw, rtlpriv, HWSET_MAX_SIZE, hwinfo, params))
2087		goto exit;
2088
2089	/*parse xtal*/
2090	rtlefuse->crystalcap = hwinfo[EEPROM_XTAL_8723BE];
2091	if (rtlefuse->crystalcap == 0xFF)
2092		rtlefuse->crystalcap = 0x20;
2093
2094	_rtl8723be_read_txpower_info_from_hwpg(hw, rtlefuse->autoload_failflag,
2095					       hwinfo);
2096
2097	rtl8723be_read_bt_coexist_info_from_hwpg(hw,
2098						 rtlefuse->autoload_failflag,
2099						 hwinfo);
2100
2101	if (rtlpriv->btcoexist.btc_info.btcoexist == 1)
2102		rtlefuse->board_type |= BIT(2); /* ODM_BOARD_BT */
2103
2104	rtlhal->board_type = rtlefuse->board_type;
2105	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2106		"board_type = 0x%x\n", rtlefuse->board_type);
2107
2108	rtlhal->package_type = _rtl8723be_read_package_type(hw);
2109
2110	/* set channel plan from efuse */
2111	rtlefuse->channel_plan = rtlefuse->eeprom_channelplan;
2112
2113	if (rtlhal->oem_id == RT_CID_DEFAULT) {
2114		/* Does this one have a Toshiba SMID from group 1? */
2115		for (i = 0; i < ARRAY_SIZE(toshiba_smid1); i++) {
2116			if (rtlefuse->eeprom_smid == toshiba_smid1[i]) {
2117				is_toshiba_smid1 = true;
2118				break;
2119			}
2120		}
2121		/* Does this one have a Toshiba SMID from group 2? */
2122		for (i = 0; i < ARRAY_SIZE(toshiba_smid2); i++) {
2123			if (rtlefuse->eeprom_smid == toshiba_smid2[i]) {
2124				is_toshiba_smid2 = true;
2125				break;
2126			}
2127		}
2128		/* Does this one have a Samsung SMID? */
2129		for (i = 0; i < ARRAY_SIZE(samsung_smid); i++) {
2130			if (rtlefuse->eeprom_smid == samsung_smid[i]) {
2131				is_samsung_smid = true;
2132				break;
2133			}
2134		}
2135		/* Does this one have a Lenovo SMID? */
2136		for (i = 0; i < ARRAY_SIZE(lenovo_smid); i++) {
2137			if (rtlefuse->eeprom_smid == lenovo_smid[i]) {
2138				is_lenovo_smid = true;
2139				break;
2140			}
2141		}
2142		switch (rtlefuse->eeprom_oemid) {
2143		case EEPROM_CID_DEFAULT:
2144			if (rtlefuse->eeprom_did == 0x8176) {
2145				if (rtlefuse->eeprom_svid == 0x10EC &&
2146				    is_toshiba_smid1) {
2147					rtlhal->oem_id = RT_CID_TOSHIBA;
2148				} else if (rtlefuse->eeprom_svid == 0x1025) {
2149					rtlhal->oem_id = RT_CID_819X_ACER;
2150				} else if (rtlefuse->eeprom_svid == 0x10EC &&
2151					   is_samsung_smid) {
2152					rtlhal->oem_id = RT_CID_819X_SAMSUNG;
2153				} else if (rtlefuse->eeprom_svid == 0x10EC &&
2154					   is_lenovo_smid) {
2155					rtlhal->oem_id = RT_CID_819X_LENOVO;
2156				} else if ((rtlefuse->eeprom_svid == 0x10EC &&
2157					    rtlefuse->eeprom_smid == 0x8197) ||
2158					   (rtlefuse->eeprom_svid == 0x10EC &&
2159					    rtlefuse->eeprom_smid == 0x9196)) {
2160					rtlhal->oem_id = RT_CID_819X_CLEVO;
2161				} else if ((rtlefuse->eeprom_svid == 0x1028 &&
2162					    rtlefuse->eeprom_smid == 0x8194) ||
2163					   (rtlefuse->eeprom_svid == 0x1028 &&
2164					    rtlefuse->eeprom_smid == 0x8198) ||
2165					   (rtlefuse->eeprom_svid == 0x1028 &&
2166					    rtlefuse->eeprom_smid == 0x9197) ||
2167					   (rtlefuse->eeprom_svid == 0x1028 &&
2168					    rtlefuse->eeprom_smid == 0x9198)) {
2169					rtlhal->oem_id = RT_CID_819X_DELL;
2170				} else if ((rtlefuse->eeprom_svid == 0x103C &&
2171					    rtlefuse->eeprom_smid == 0x1629)) {
2172					rtlhal->oem_id = RT_CID_819X_HP;
2173				} else if ((rtlefuse->eeprom_svid == 0x1A32 &&
2174					   rtlefuse->eeprom_smid == 0x2315)) {
2175					rtlhal->oem_id = RT_CID_819X_QMI;
2176				} else if ((rtlefuse->eeprom_svid == 0x10EC &&
2177					   rtlefuse->eeprom_smid == 0x8203)) {
2178					rtlhal->oem_id = RT_CID_819X_PRONETS;
2179				} else if ((rtlefuse->eeprom_svid == 0x1043 &&
2180					   rtlefuse->eeprom_smid == 0x84B5)) {
2181					rtlhal->oem_id = RT_CID_819X_EDIMAX_ASUS;
2182				} else {
2183					rtlhal->oem_id = RT_CID_DEFAULT;
2184				}
2185			} else if (rtlefuse->eeprom_did == 0x8178) {
2186				if (rtlefuse->eeprom_svid == 0x10EC &&
2187				    is_toshiba_smid2)
2188					rtlhal->oem_id = RT_CID_TOSHIBA;
2189				else if (rtlefuse->eeprom_svid == 0x1025)
2190					rtlhal->oem_id = RT_CID_819X_ACER;
2191				else if ((rtlefuse->eeprom_svid == 0x10EC &&
2192					  rtlefuse->eeprom_smid == 0x8186))
2193					rtlhal->oem_id = RT_CID_819X_PRONETS;
2194				else if ((rtlefuse->eeprom_svid == 0x1043 &&
2195					  rtlefuse->eeprom_smid == 0x84B6))
2196					rtlhal->oem_id =
2197							RT_CID_819X_EDIMAX_ASUS;
2198				else
2199					rtlhal->oem_id = RT_CID_DEFAULT;
2200			} else {
2201					rtlhal->oem_id = RT_CID_DEFAULT;
2202			}
2203			break;
2204		case EEPROM_CID_TOSHIBA:
2205			rtlhal->oem_id = RT_CID_TOSHIBA;
2206			break;
2207		case EEPROM_CID_CCX:
2208			rtlhal->oem_id = RT_CID_CCX;
2209			break;
2210		case EEPROM_CID_QMI:
2211			rtlhal->oem_id = RT_CID_819X_QMI;
2212			break;
2213		case EEPROM_CID_WHQL:
2214			break;
2215		default:
2216			rtlhal->oem_id = RT_CID_DEFAULT;
2217			break;
2218		}
2219	}
2220exit:
2221	kfree(hwinfo);
2222}
2223
2224static void _rtl8723be_hal_customized_behavior(struct ieee80211_hw *hw)
2225{
2226	struct rtl_priv *rtlpriv = rtl_priv(hw);
2227	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2228
2229	rtlpriv->ledctl.led_opendrain = true;
2230	switch (rtlhal->oem_id) {
2231	case RT_CID_819X_HP:
2232		rtlpriv->ledctl.led_opendrain = true;
2233		break;
2234	case RT_CID_819X_LENOVO:
2235	case RT_CID_DEFAULT:
2236	case RT_CID_TOSHIBA:
2237	case RT_CID_CCX:
2238	case RT_CID_819X_ACER:
2239	case RT_CID_WHQL:
2240	default:
2241		break;
2242	}
2243	rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG,
2244		"RT Customized ID: 0x%02X\n", rtlhal->oem_id);
2245}
2246
2247void rtl8723be_read_eeprom_info(struct ieee80211_hw *hw)
2248{
2249	struct rtl_priv *rtlpriv = rtl_priv(hw);
2250	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2251	struct rtl_phy *rtlphy = &(rtlpriv->phy);
2252	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2253	u8 tmp_u1b;
2254
2255	rtlhal->version = _rtl8723be_read_chip_version(hw);
2256	if (get_rf_type(rtlphy) == RF_1T1R)
2257		rtlpriv->dm.rfpath_rxenable[0] = true;
2258	else
2259		rtlpriv->dm.rfpath_rxenable[0] =
2260		    rtlpriv->dm.rfpath_rxenable[1] = true;
2261	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "VersionID = 0x%4x\n",
2262		rtlhal->version);
2263	tmp_u1b = rtl_read_byte(rtlpriv, REG_9346CR);
2264	if (tmp_u1b & BIT(4)) {
2265		rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EEPROM\n");
2266		rtlefuse->epromtype = EEPROM_93C46;
2267	} else {
2268		rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EFUSE\n");
2269		rtlefuse->epromtype = EEPROM_BOOT_EFUSE;
2270	}
2271	if (tmp_u1b & BIT(5)) {
2272		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
2273		rtlefuse->autoload_failflag = false;
2274		_rtl8723be_read_adapter_info(hw, false);
2275	} else {
2276		pr_err("Autoload ERR!!\n");
2277	}
2278	_rtl8723be_hal_customized_behavior(hw);
2279}
2280
2281static u8 _rtl8723be_mrate_idx_to_arfr_id(struct ieee80211_hw *hw,
2282					  u8 rate_index)
2283{
2284	u8 ret = 0;
2285	switch (rate_index) {
2286	case RATR_INX_WIRELESS_NGB:
2287		ret = 1;
2288		break;
2289	case RATR_INX_WIRELESS_N:
2290	case RATR_INX_WIRELESS_NG:
2291		ret = 5;
2292		break;
2293	case RATR_INX_WIRELESS_NB:
2294		ret = 3;
2295		break;
2296	case RATR_INX_WIRELESS_GB:
2297		ret = 6;
2298		break;
2299	case RATR_INX_WIRELESS_G:
2300		ret = 7;
2301		break;
2302	case RATR_INX_WIRELESS_B:
2303		ret = 8;
2304		break;
2305	default:
2306		ret = 0;
2307		break;
2308	}
2309	return ret;
2310}
2311
2312static void rtl8723be_update_hal_rate_mask(struct ieee80211_hw *hw,
2313					   struct ieee80211_sta *sta,
2314					   u8 rssi_level, bool update_bw)
2315{
2316	struct rtl_priv *rtlpriv = rtl_priv(hw);
2317	struct rtl_phy *rtlphy = &(rtlpriv->phy);
2318	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2319	struct rtl_sta_info *sta_entry = NULL;
2320	u32 ratr_bitmap;
2321	u8 ratr_index;
2322	u8 curtxbw_40mhz = (sta->deflink.ht_cap.cap &
2323			      IEEE80211_HT_CAP_SUP_WIDTH_20_40) ? 1 : 0;
2324	u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
2325				1 : 0;
2326	u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
2327				1 : 0;
2328	enum wireless_mode wirelessmode = 0;
2329	bool shortgi = false;
2330	u8 rate_mask[7];
2331	u8 macid = 0;
2332
2333	sta_entry = (struct rtl_sta_info *)sta->drv_priv;
2334	wirelessmode = sta_entry->wireless_mode;
2335	if (mac->opmode == NL80211_IFTYPE_STATION ||
2336	    mac->opmode == NL80211_IFTYPE_MESH_POINT)
2337		curtxbw_40mhz = mac->bw_40;
2338	else if (mac->opmode == NL80211_IFTYPE_AP ||
2339		 mac->opmode == NL80211_IFTYPE_ADHOC)
2340		macid = sta->aid + 1;
2341
2342	ratr_bitmap = sta->deflink.supp_rates[0];
2343
2344	if (mac->opmode == NL80211_IFTYPE_ADHOC)
2345		ratr_bitmap = 0xfff;
2346
2347	ratr_bitmap |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
2348			sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
2349	switch (wirelessmode) {
2350	case WIRELESS_MODE_B:
2351		ratr_index = RATR_INX_WIRELESS_B;
2352		if (ratr_bitmap & 0x0000000c)
2353			ratr_bitmap &= 0x0000000d;
2354		else
2355			ratr_bitmap &= 0x0000000f;
2356		break;
2357	case WIRELESS_MODE_G:
2358		ratr_index = RATR_INX_WIRELESS_GB;
2359
2360		if (rssi_level == 1)
2361			ratr_bitmap &= 0x00000f00;
2362		else if (rssi_level == 2)
2363			ratr_bitmap &= 0x00000ff0;
2364		else
2365			ratr_bitmap &= 0x00000ff5;
2366		break;
2367	case WIRELESS_MODE_N_24G:
2368	case WIRELESS_MODE_N_5G:
2369		ratr_index = RATR_INX_WIRELESS_NGB;
2370		if (rtlphy->rf_type == RF_1T1R) {
2371			if (curtxbw_40mhz) {
2372				if (rssi_level == 1)
2373					ratr_bitmap &= 0x000f0000;
2374				else if (rssi_level == 2)
2375					ratr_bitmap &= 0x000ff000;
2376				else
2377					ratr_bitmap &= 0x000ff015;
2378			} else {
2379				if (rssi_level == 1)
2380					ratr_bitmap &= 0x000f0000;
2381				else if (rssi_level == 2)
2382					ratr_bitmap &= 0x000ff000;
2383				else
2384					ratr_bitmap &= 0x000ff005;
2385			}
2386		} else {
2387			if (curtxbw_40mhz) {
2388				if (rssi_level == 1)
2389					ratr_bitmap &= 0x0f8f0000;
2390				else if (rssi_level == 2)
2391					ratr_bitmap &= 0x0f8ff000;
2392				else
2393					ratr_bitmap &= 0x0f8ff015;
2394			} else {
2395				if (rssi_level == 1)
2396					ratr_bitmap &= 0x0f8f0000;
2397				else if (rssi_level == 2)
2398					ratr_bitmap &= 0x0f8ff000;
2399				else
2400					ratr_bitmap &= 0x0f8ff005;
2401			}
2402		}
2403		if ((curtxbw_40mhz && curshortgi_40mhz) ||
2404		    (!curtxbw_40mhz && curshortgi_20mhz)) {
2405			if (macid == 0)
2406				shortgi = true;
2407			else if (macid == 1)
2408				shortgi = false;
2409		}
2410		break;
2411	default:
2412		ratr_index = RATR_INX_WIRELESS_NGB;
2413
2414		if (rtlphy->rf_type == RF_1T2R)
2415			ratr_bitmap &= 0x000ff0ff;
2416		else
2417			ratr_bitmap &= 0x0f0ff0ff;
2418		break;
2419	}
2420
2421	sta_entry->ratr_index = ratr_index;
2422
2423	rtl_dbg(rtlpriv, COMP_RATR, DBG_DMESG,
2424		"ratr_bitmap :%x\n", ratr_bitmap);
2425	*(u32 *)&rate_mask = (ratr_bitmap & 0x0fffffff) |
2426				       (ratr_index << 28);
2427	rate_mask[0] = macid;
2428	rate_mask[1] = _rtl8723be_mrate_idx_to_arfr_id(hw, ratr_index) |
2429						      (shortgi ? 0x80 : 0x00);
2430	rate_mask[2] = curtxbw_40mhz | ((!update_bw) << 3);
2431
2432	rate_mask[3] = (u8)(ratr_bitmap & 0x000000ff);
2433	rate_mask[4] = (u8)((ratr_bitmap & 0x0000ff00) >> 8);
2434	rate_mask[5] = (u8)((ratr_bitmap & 0x00ff0000) >> 16);
2435	rate_mask[6] = (u8)((ratr_bitmap & 0xff000000) >> 24);
2436
2437	rtl_dbg(rtlpriv, COMP_RATR, DBG_DMESG,
2438		"Rate_index:%x, ratr_val:%x, %x:%x:%x:%x:%x:%x:%x\n",
2439		ratr_index, ratr_bitmap,
2440		rate_mask[0], rate_mask[1],
2441		rate_mask[2], rate_mask[3],
2442		rate_mask[4], rate_mask[5],
2443		rate_mask[6]);
2444	rtl8723be_fill_h2c_cmd(hw, H2C_8723B_RA_MASK, 7, rate_mask);
2445	_rtl8723be_set_bcn_ctrl_reg(hw, BIT(3), 0);
2446}
2447
2448void rtl8723be_update_hal_rate_tbl(struct ieee80211_hw *hw,
2449				   struct ieee80211_sta *sta,
2450				   u8 rssi_level, bool update_bw)
2451{
2452	struct rtl_priv *rtlpriv = rtl_priv(hw);
2453	if (rtlpriv->dm.useramask)
2454		rtl8723be_update_hal_rate_mask(hw, sta, rssi_level, update_bw);
2455}
2456
2457void rtl8723be_update_channel_access_setting(struct ieee80211_hw *hw)
2458{
2459	struct rtl_priv *rtlpriv = rtl_priv(hw);
2460	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2461	u16 sifs_timer;
2462
2463	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SLOT_TIME, &mac->slot_time);
2464	if (!mac->ht_enable)
2465		sifs_timer = 0x0a0a;
2466	else
2467		sifs_timer = 0x0e0e;
2468	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SIFS, (u8 *)&sifs_timer);
2469}
2470
2471bool rtl8723be_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
2472{
2473	struct rtl_priv *rtlpriv = rtl_priv(hw);
2474	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
2475	struct rtl_phy *rtlphy = &(rtlpriv->phy);
2476	enum rf_pwrstate e_rfpowerstate_toset;
2477	u8 u1tmp;
2478	bool b_actuallyset = false;
2479
2480	if (rtlpriv->rtlhal.being_init_adapter)
2481		return false;
2482
2483	if (ppsc->swrf_processing)
2484		return false;
2485
2486	spin_lock(&rtlpriv->locks.rf_ps_lock);
2487	if (ppsc->rfchange_inprogress) {
2488		spin_unlock(&rtlpriv->locks.rf_ps_lock);
2489		return false;
2490	} else {
2491		ppsc->rfchange_inprogress = true;
2492		spin_unlock(&rtlpriv->locks.rf_ps_lock);
2493	}
2494
2495	rtl_write_byte(rtlpriv, REG_GPIO_IO_SEL_2,
2496		       rtl_read_byte(rtlpriv, REG_GPIO_IO_SEL_2) & ~(BIT(1)));
2497
2498	u1tmp = rtl_read_byte(rtlpriv, REG_GPIO_PIN_CTRL_2);
2499
2500	if (rtlphy->polarity_ctl)
2501		e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFOFF : ERFON;
2502	else
2503		e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFON : ERFOFF;
2504
2505	if ((ppsc->hwradiooff) && (e_rfpowerstate_toset == ERFON)) {
2506		rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
2507			"GPIOChangeRF  - HW Radio ON, RF ON\n");
2508
2509		e_rfpowerstate_toset = ERFON;
2510		ppsc->hwradiooff = false;
2511		b_actuallyset = true;
2512	} else if (!ppsc->hwradiooff && (e_rfpowerstate_toset == ERFOFF)) {
2513		rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
2514			"GPIOChangeRF  - HW Radio OFF, RF OFF\n");
2515
2516		e_rfpowerstate_toset = ERFOFF;
2517		ppsc->hwradiooff = true;
2518		b_actuallyset = true;
2519	}
2520
2521	if (b_actuallyset) {
2522		spin_lock(&rtlpriv->locks.rf_ps_lock);
2523		ppsc->rfchange_inprogress = false;
2524		spin_unlock(&rtlpriv->locks.rf_ps_lock);
2525	} else {
2526		if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC)
2527			RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
2528
2529		spin_lock(&rtlpriv->locks.rf_ps_lock);
2530		ppsc->rfchange_inprogress = false;
2531		spin_unlock(&rtlpriv->locks.rf_ps_lock);
2532	}
2533
2534	*valid = 1;
2535	return !ppsc->hwradiooff;
2536
2537}
2538
2539void rtl8723be_set_key(struct ieee80211_hw *hw, u32 key_index,
2540		       u8 *p_macaddr, bool is_group, u8 enc_algo,
2541		       bool is_wepkey, bool clear_all)
2542{
2543	struct rtl_priv *rtlpriv = rtl_priv(hw);
2544	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2545	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2546	u8 *macaddr = p_macaddr;
2547	u32 entry_id = 0;
2548	bool is_pairwise = false;
2549
2550	static u8 cam_const_addr[4][6] = {
2551		{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
2552		{0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
2553		{0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
2554		{0x00, 0x00, 0x00, 0x00, 0x00, 0x03}
2555	};
2556	static u8 cam_const_broad[] = {
2557		0xff, 0xff, 0xff, 0xff, 0xff, 0xff
2558	};
2559
2560	if (clear_all) {
2561		u8 idx = 0;
2562		u8 cam_offset = 0;
2563		u8 clear_number = 5;
2564
2565		rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG, "clear_all\n");
2566
2567		for (idx = 0; idx < clear_number; idx++) {
2568			rtl_cam_mark_invalid(hw, cam_offset + idx);
2569			rtl_cam_empty_entry(hw, cam_offset + idx);
2570
2571			if (idx < 5) {
2572				memset(rtlpriv->sec.key_buf[idx], 0,
2573				       MAX_KEY_LEN);
2574				rtlpriv->sec.key_len[idx] = 0;
2575			}
2576		}
2577
2578	} else {
2579		switch (enc_algo) {
2580		case WEP40_ENCRYPTION:
2581			enc_algo = CAM_WEP40;
2582			break;
2583		case WEP104_ENCRYPTION:
2584			enc_algo = CAM_WEP104;
2585			break;
2586		case TKIP_ENCRYPTION:
2587			enc_algo = CAM_TKIP;
2588			break;
2589		case AESCCMP_ENCRYPTION:
2590			enc_algo = CAM_AES;
2591			break;
2592		default:
2593			rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
2594				"switch case %#x not processed\n", enc_algo);
2595			enc_algo = CAM_TKIP;
2596			break;
2597		}
2598
2599		if (is_wepkey || rtlpriv->sec.use_defaultkey) {
2600			macaddr = cam_const_addr[key_index];
2601			entry_id = key_index;
2602		} else {
2603			if (is_group) {
2604				macaddr = cam_const_broad;
2605				entry_id = key_index;
2606			} else {
2607				if (mac->opmode == NL80211_IFTYPE_AP) {
2608					entry_id = rtl_cam_get_free_entry(hw,
2609								p_macaddr);
2610					if (entry_id >=  TOTAL_CAM_ENTRY) {
2611						pr_err("Can not find free hw security cam entry\n");
2612						return;
2613					}
2614				} else {
2615					entry_id = CAM_PAIRWISE_KEY_POSITION;
2616				}
2617
2618				key_index = PAIRWISE_KEYIDX;
2619				is_pairwise = true;
2620			}
2621		}
2622
2623		if (rtlpriv->sec.key_len[key_index] == 0) {
2624			rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
2625				"delete one entry, entry_id is %d\n",
2626				entry_id);
2627			if (mac->opmode == NL80211_IFTYPE_AP)
2628				rtl_cam_del_entry(hw, p_macaddr);
2629			rtl_cam_delete_one_entry(hw, p_macaddr, entry_id);
2630		} else {
2631			rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
2632				"add one entry\n");
2633			if (is_pairwise) {
2634				rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
2635					"set Pairwise key\n");
2636
2637				rtl_cam_add_one_entry(hw, macaddr, key_index,
2638					       entry_id, enc_algo,
2639					       CAM_CONFIG_NO_USEDK,
2640					       rtlpriv->sec.key_buf[key_index]);
2641			} else {
2642				rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
2643					"set group key\n");
2644
2645				if (mac->opmode == NL80211_IFTYPE_ADHOC) {
2646					rtl_cam_add_one_entry(hw,
2647						rtlefuse->dev_addr,
2648						PAIRWISE_KEYIDX,
2649						CAM_PAIRWISE_KEY_POSITION,
2650						enc_algo,
2651						CAM_CONFIG_NO_USEDK,
2652						rtlpriv->sec.key_buf
2653						[entry_id]);
2654				}
2655
2656				rtl_cam_add_one_entry(hw, macaddr, key_index,
2657						entry_id, enc_algo,
2658						CAM_CONFIG_NO_USEDK,
2659						rtlpriv->sec.key_buf[entry_id]);
2660			}
2661		}
2662	}
2663}
2664
2665void rtl8723be_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
2666					      bool auto_load_fail, u8 *hwinfo)
2667{
2668	struct rtl_priv *rtlpriv = rtl_priv(hw);
2669	struct rtl_mod_params *mod_params = rtlpriv->cfg->mod_params;
2670	u8 value;
2671	u32 tmpu_32;
2672
2673	if (!auto_load_fail) {
2674		tmpu_32 = rtl_read_dword(rtlpriv, REG_MULTI_FUNC_CTRL);
2675		if (tmpu_32 & BIT(18))
2676			rtlpriv->btcoexist.btc_info.btcoexist = 1;
2677		else
2678			rtlpriv->btcoexist.btc_info.btcoexist = 0;
2679		value = hwinfo[EEPROM_RF_BT_SETTING_8723B];
2680		rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8723B;
2681		rtlpriv->btcoexist.btc_info.ant_num = (value & 0x1);
2682		rtlpriv->btcoexist.btc_info.single_ant_path =
2683			 (value & 0x40 ? ANT_AUX : ANT_MAIN);	/*0xc3[6]*/
2684	} else {
2685		rtlpriv->btcoexist.btc_info.btcoexist = 0;
2686		rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8723B;
2687		rtlpriv->btcoexist.btc_info.ant_num = ANT_X2;
2688		rtlpriv->btcoexist.btc_info.single_ant_path = ANT_MAIN;
2689	}
2690
2691	/* override ant_num / ant_path */
2692	if (mod_params->ant_sel) {
2693		rtlpriv->btcoexist.btc_info.ant_num =
2694			(mod_params->ant_sel == 1 ? ANT_X1 : ANT_X2);
2695
2696		rtlpriv->btcoexist.btc_info.single_ant_path =
2697			(mod_params->ant_sel == 1 ? ANT_AUX : ANT_MAIN);
2698	}
2699}
2700
2701void rtl8723be_bt_reg_init(struct ieee80211_hw *hw)
2702{
2703	struct rtl_priv *rtlpriv = rtl_priv(hw);
2704
2705	/* 0:Low, 1:High, 2:From Efuse. */
2706	rtlpriv->btcoexist.reg_bt_iso = 2;
2707	/* 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter. */
2708	rtlpriv->btcoexist.reg_bt_sco = 3;
2709	/* 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. */
2710	rtlpriv->btcoexist.reg_bt_sco = 0;
2711}
2712
2713void rtl8723be_bt_hw_init(struct ieee80211_hw *hw)
2714{
2715	struct rtl_priv *rtlpriv = rtl_priv(hw);
2716
2717	if (rtlpriv->cfg->ops->get_btc_status())
2718		rtlpriv->btcoexist.btc_ops->btc_init_hw_config(rtlpriv);
2719
2720}
2721
2722void rtl8723be_suspend(struct ieee80211_hw *hw)
2723{
2724}
2725
2726void rtl8723be_resume(struct ieee80211_hw *hw)
2727{
2728}
2729