1  // SPDX-License-Identifier: GPL-2.0
2  /******************************************************************************
3   *
4   * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
5   *
6   ******************************************************************************/
7  
8  #include <linux/kernel.h>
9  #include <drv_types.h>
10  #include "hal_com_h2c.h"
11  
12  #include "odm_precomp.h"
13  
rtw_hal_data_init(struct adapter * padapter)14  u8 rtw_hal_data_init(struct adapter *padapter)
15  {
16  	if (is_primary_adapter(padapter)) {	/* if (padapter->isprimary) */
17  		padapter->hal_data_sz = sizeof(struct hal_com_data);
18  		padapter->HalData = vzalloc(padapter->hal_data_sz);
19  		if (!padapter->HalData)
20  			return _FAIL;
21  	}
22  	return _SUCCESS;
23  }
24  
rtw_hal_data_deinit(struct adapter * padapter)25  void rtw_hal_data_deinit(struct adapter *padapter)
26  {
27  	if (is_primary_adapter(padapter)) {	/* if (padapter->isprimary) */
28  		if (padapter->HalData) {
29  			vfree(padapter->HalData);
30  			padapter->HalData = NULL;
31  			padapter->hal_data_sz = 0;
32  		}
33  	}
34  }
35  
36  
dump_chip_info(struct hal_version ChipVersion)37  void dump_chip_info(struct hal_version	ChipVersion)
38  {
39  	char buf[128];
40  	size_t cnt = 0;
41  
42  	cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "Chip Version Info: CHIP_8723B_%s_",
43  			IS_NORMAL_CHIP(ChipVersion) ? "Normal_Chip" : "Test_Chip");
44  
45  	if (IS_CHIP_VENDOR_TSMC(ChipVersion))
46  		cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "TSMC_");
47  	else if (IS_CHIP_VENDOR_UMC(ChipVersion))
48  		cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "UMC_");
49  	else if (IS_CHIP_VENDOR_SMIC(ChipVersion))
50  		cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "SMIC_");
51  
52  	if (IS_A_CUT(ChipVersion))
53  		cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "A_CUT_");
54  	else if (IS_B_CUT(ChipVersion))
55  		cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "B_CUT_");
56  	else if (IS_C_CUT(ChipVersion))
57  		cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "C_CUT_");
58  	else if (IS_D_CUT(ChipVersion))
59  		cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "D_CUT_");
60  	else if (IS_E_CUT(ChipVersion))
61  		cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "E_CUT_");
62  	else if (IS_I_CUT(ChipVersion))
63  		cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "I_CUT_");
64  	else if (IS_J_CUT(ChipVersion))
65  		cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "J_CUT_");
66  	else if (IS_K_CUT(ChipVersion))
67  		cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "K_CUT_");
68  	else
69  		cnt += scnprintf(buf + cnt, sizeof(buf) - cnt,
70  				"UNKNOWN_CUT(%d)_", ChipVersion.CUTVersion);
71  
72  	cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "1T1R_");
73  
74  	cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "RomVer(%d)\n", ChipVersion.ROMVer);
75  }
76  
77  
78  #define	EEPROM_CHANNEL_PLAN_BY_HW_MASK	0x80
79  
80  /*
81   * Description:
82   *Use hardware(efuse), driver parameter(registry) and default channel plan
83   *to decide which one should be used.
84   *
85   * Parameters:
86   *padapter			pointer of adapter
87   *hw_channel_plan		channel plan from HW (efuse/eeprom)
88   *					BIT[7] software configure mode; 0:Enable, 1:disable
89   *					BIT[6:0] Channel Plan
90   *sw_channel_plan		channel plan from SW (registry/module param)
91   *def_channel_plan	channel plan used when HW/SW both invalid
92   *AutoLoadFail		efuse autoload fail or not
93   *
94   * Return:
95   *Final channel plan decision
96   *
97   */
hal_com_config_channel_plan(struct adapter * padapter,u8 hw_channel_plan,u8 sw_channel_plan,u8 def_channel_plan,bool AutoLoadFail)98  u8 hal_com_config_channel_plan(
99  	struct adapter *padapter,
100  	u8 hw_channel_plan,
101  	u8 sw_channel_plan,
102  	u8 def_channel_plan,
103  	bool AutoLoadFail
104  )
105  {
106  	struct hal_com_data *pHalData;
107  	u8 chnlPlan;
108  
109  	pHalData = GET_HAL_DATA(padapter);
110  	pHalData->bDisableSWChannelPlan = false;
111  	chnlPlan = def_channel_plan;
112  
113  	if (0xFF == hw_channel_plan)
114  		AutoLoadFail = true;
115  
116  	if (!AutoLoadFail) {
117  		u8 hw_chnlPlan;
118  
119  		hw_chnlPlan = hw_channel_plan & (~EEPROM_CHANNEL_PLAN_BY_HW_MASK);
120  		if (rtw_is_channel_plan_valid(hw_chnlPlan)) {
121  			if (hw_channel_plan & EEPROM_CHANNEL_PLAN_BY_HW_MASK)
122  				pHalData->bDisableSWChannelPlan = true;
123  
124  			chnlPlan = hw_chnlPlan;
125  		}
126  	}
127  
128  	if (
129  		(false == pHalData->bDisableSWChannelPlan) &&
130  		rtw_is_channel_plan_valid(sw_channel_plan)
131  	)
132  		chnlPlan = sw_channel_plan;
133  
134  	return chnlPlan;
135  }
136  
HAL_IsLegalChannel(struct adapter * adapter,u32 Channel)137  bool HAL_IsLegalChannel(struct adapter *adapter, u32 Channel)
138  {
139  	bool bLegalChannel = true;
140  
141  	if ((Channel <= 14) && (Channel >= 1)) {
142  		if (is_supported_24g(adapter->registrypriv.wireless_mode) == false)
143  			bLegalChannel = false;
144  	} else {
145  		bLegalChannel = false;
146  	}
147  
148  	return bLegalChannel;
149  }
150  
MRateToHwRate(u8 rate)151  u8 MRateToHwRate(u8 rate)
152  {
153  	u8 ret = DESC_RATE1M;
154  
155  	switch (rate) {
156  	case MGN_1M:
157  		ret = DESC_RATE1M;
158  		break;
159  	case MGN_2M:
160  		ret = DESC_RATE2M;
161  		break;
162  	case MGN_5_5M:
163  		ret = DESC_RATE5_5M;
164  		break;
165  	case MGN_11M:
166  		ret = DESC_RATE11M;
167  		break;
168  	case MGN_6M:
169  		ret = DESC_RATE6M;
170  		break;
171  	case MGN_9M:
172  		ret = DESC_RATE9M;
173  		break;
174  	case MGN_12M:
175  		ret = DESC_RATE12M;
176  		break;
177  	case MGN_18M:
178  		ret = DESC_RATE18M;
179  		break;
180  	case MGN_24M:
181  		ret = DESC_RATE24M;
182  		break;
183  	case MGN_36M:
184  		ret = DESC_RATE36M;
185  		break;
186  	case MGN_48M:
187  		ret = DESC_RATE48M;
188  		break;
189  	case MGN_54M:
190  		ret = DESC_RATE54M;
191  		break;
192  	case MGN_MCS0:
193  		ret = DESC_RATEMCS0;
194  		break;
195  	case MGN_MCS1:
196  		ret = DESC_RATEMCS1;
197  		break;
198  	case MGN_MCS2:
199  		ret = DESC_RATEMCS2;
200  		break;
201  	case MGN_MCS3:
202  		ret = DESC_RATEMCS3;
203  		break;
204  	case MGN_MCS4:
205  		ret = DESC_RATEMCS4;
206  		break;
207  	case MGN_MCS5:
208  		ret = DESC_RATEMCS5;
209  		break;
210  	case MGN_MCS6:
211  		ret = DESC_RATEMCS6;
212  		break;
213  	case MGN_MCS7:
214  		ret = DESC_RATEMCS7;
215  		break;
216  	default:
217  		break;
218  	}
219  
220  	return ret;
221  }
222  
HwRateToMRate(u8 rate)223  u8 HwRateToMRate(u8 rate)
224  {
225  	u8 ret_rate = MGN_1M;
226  
227  	switch (rate) {
228  	case DESC_RATE1M:
229  		ret_rate = MGN_1M;
230  		break;
231  	case DESC_RATE2M:
232  		ret_rate = MGN_2M;
233  		break;
234  	case DESC_RATE5_5M:
235  		ret_rate = MGN_5_5M;
236  		break;
237  	case DESC_RATE11M:
238  		ret_rate = MGN_11M;
239  		break;
240  	case DESC_RATE6M:
241  		ret_rate = MGN_6M;
242  		break;
243  	case DESC_RATE9M:
244  		ret_rate = MGN_9M;
245  		break;
246  	case DESC_RATE12M:
247  		ret_rate = MGN_12M;
248  		break;
249  	case DESC_RATE18M:
250  		ret_rate = MGN_18M;
251  		break;
252  	case DESC_RATE24M:
253  		ret_rate = MGN_24M;
254  		break;
255  	case DESC_RATE36M:
256  		ret_rate = MGN_36M;
257  		break;
258  	case DESC_RATE48M:
259  		ret_rate = MGN_48M;
260  		break;
261  	case DESC_RATE54M:
262  		ret_rate = MGN_54M;
263  		break;
264  	case DESC_RATEMCS0:
265  		ret_rate = MGN_MCS0;
266  		break;
267  	case DESC_RATEMCS1:
268  		ret_rate = MGN_MCS1;
269  		break;
270  	case DESC_RATEMCS2:
271  		ret_rate = MGN_MCS2;
272  		break;
273  	case DESC_RATEMCS3:
274  		ret_rate = MGN_MCS3;
275  		break;
276  	case DESC_RATEMCS4:
277  		ret_rate = MGN_MCS4;
278  		break;
279  	case DESC_RATEMCS5:
280  		ret_rate = MGN_MCS5;
281  		break;
282  	case DESC_RATEMCS6:
283  		ret_rate = MGN_MCS6;
284  		break;
285  	case DESC_RATEMCS7:
286  		ret_rate = MGN_MCS7;
287  		break;
288  	default:
289  		break;
290  	}
291  
292  	return ret_rate;
293  }
294  
HalSetBrateCfg(struct adapter * Adapter,u8 * mBratesOS,u16 * pBrateCfg)295  void HalSetBrateCfg(struct adapter *Adapter, u8 *mBratesOS, u16 *pBrateCfg)
296  {
297  	u8 i, is_brate, brate;
298  
299  	for (i = 0; i < NDIS_802_11_LENGTH_RATES_EX; i++) {
300  
301  		is_brate = mBratesOS[i] & IEEE80211_BASIC_RATE_MASK;
302  		brate = mBratesOS[i] & 0x7f;
303  
304  		if (is_brate) {
305  			switch (brate) {
306  			case IEEE80211_CCK_RATE_1MB:
307  				*pBrateCfg |= RATE_1M;
308  				break;
309  			case IEEE80211_CCK_RATE_2MB:
310  				*pBrateCfg |= RATE_2M;
311  				break;
312  			case IEEE80211_CCK_RATE_5MB:
313  				*pBrateCfg |= RATE_5_5M;
314  				break;
315  			case IEEE80211_CCK_RATE_11MB:
316  				*pBrateCfg |= RATE_11M;
317  				break;
318  			case IEEE80211_OFDM_RATE_6MB:
319  				*pBrateCfg |= RATE_6M;
320  				break;
321  			case IEEE80211_OFDM_RATE_9MB:
322  				*pBrateCfg |= RATE_9M;
323  				break;
324  			case IEEE80211_OFDM_RATE_12MB:
325  				*pBrateCfg |= RATE_12M;
326  				break;
327  			case IEEE80211_OFDM_RATE_18MB:
328  				*pBrateCfg |= RATE_18M;
329  				break;
330  			case IEEE80211_OFDM_RATE_24MB:
331  				*pBrateCfg |= RATE_24M;
332  				break;
333  			case IEEE80211_OFDM_RATE_36MB:
334  				*pBrateCfg |= RATE_36M;
335  				break;
336  			case IEEE80211_OFDM_RATE_48MB:
337  				*pBrateCfg |= RATE_48M;
338  				break;
339  			case IEEE80211_OFDM_RATE_54MB:
340  				*pBrateCfg |= RATE_54M;
341  				break;
342  			}
343  		}
344  	}
345  }
346  
_OneOutPipeMapping(struct adapter * padapter)347  static void _OneOutPipeMapping(struct adapter *padapter)
348  {
349  	struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
350  
351  	pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
352  	pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */
353  	pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[0];/* BE */
354  	pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];/* BK */
355  
356  	pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
357  	pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
358  	pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
359  	pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
360  }
361  
_TwoOutPipeMapping(struct adapter * padapter,bool bWIFICfg)362  static void _TwoOutPipeMapping(struct adapter *padapter, bool bWIFICfg)
363  {
364  	struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
365  
366  	if (bWIFICfg) { /* WMM */
367  
368  		/* 	BK,	BE,	VI,	VO,	BCN,	CMD, MGT, HIGH, HCCA */
369  		/*   0,		1,	0,	1,	0,	0,	0,	0,		0	}; */
370  		/* 0:ep_0 num, 1:ep_1 num */
371  
372  		pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[1];/* VO */
373  		pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */
374  		pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];/* BE */
375  		pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];/* BK */
376  
377  		pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
378  		pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
379  		pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
380  		pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
381  
382  	} else { /* typical setting */
383  
384  
385  		/* BK,	BE,	VI,	VO,	BCN,	CMD, MGT, HIGH, HCCA */
386  		/*   1,		1,	0,	0,	0,	0,	0,	0,		0	}; */
387  		/* 0:ep_0 num, 1:ep_1 num */
388  
389  		pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
390  		pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */
391  		pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];/* BE */
392  		pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];/* BK */
393  
394  		pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
395  		pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
396  		pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
397  		pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
398  
399  	}
400  
401  }
402  
_ThreeOutPipeMapping(struct adapter * padapter,bool bWIFICfg)403  static void _ThreeOutPipeMapping(struct adapter *padapter, bool bWIFICfg)
404  {
405  	struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
406  
407  	if (bWIFICfg) { /* for WMM */
408  
409  		/* 	BK,	BE,	VI,	VO,	BCN,	CMD, MGT, HIGH, HCCA */
410  		/*   1,		2,	1,	0,	0,	0,	0,	0,		0	}; */
411  		/* 0:H, 1:N, 2:L */
412  
413  		pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
414  		pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];/* VI */
415  		pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];/* BE */
416  		pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];/* BK */
417  
418  		pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
419  		pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
420  		pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
421  		pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
422  
423  	} else { /* typical setting */
424  
425  
426  		/* 	BK,	BE,	VI,	VO,	BCN,	CMD, MGT, HIGH, HCCA */
427  		/*   2,		2,	1,	0,	0,	0,	0,	0,		0	}; */
428  		/* 0:H, 1:N, 2:L */
429  
430  		pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
431  		pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];/* VI */
432  		pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];/* BE */
433  		pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[2];/* BK */
434  
435  		pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
436  		pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
437  		pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
438  		pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
439  	}
440  
441  }
442  
Hal_MappingOutPipe(struct adapter * padapter,u8 NumOutPipe)443  bool Hal_MappingOutPipe(struct adapter *padapter, u8 NumOutPipe)
444  {
445  	struct registry_priv *pregistrypriv = &padapter->registrypriv;
446  
447  	bool bWIFICfg = (pregistrypriv->wifi_spec) ? true : false;
448  
449  	bool result = true;
450  
451  	switch (NumOutPipe) {
452  	case 2:
453  		_TwoOutPipeMapping(padapter, bWIFICfg);
454  		break;
455  	case 3:
456  	case 4:
457  		_ThreeOutPipeMapping(padapter, bWIFICfg);
458  		break;
459  	case 1:
460  		_OneOutPipeMapping(padapter);
461  		break;
462  	default:
463  		result = false;
464  		break;
465  	}
466  
467  	return result;
468  
469  }
470  
hal_init_macaddr(struct adapter * adapter)471  void hal_init_macaddr(struct adapter *adapter)
472  {
473  	rtw_hal_set_hwreg(adapter, HW_VAR_MAC_ADDR, adapter->eeprompriv.mac_addr);
474  }
475  
rtw_init_hal_com_default_value(struct adapter * Adapter)476  void rtw_init_hal_com_default_value(struct adapter *Adapter)
477  {
478  	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
479  
480  	pHalData->AntDetection = 1;
481  }
482  
483  /*
484  * C2H event format:
485  * Field	 TRIGGER		CONTENT	   CMD_SEQ	CMD_LEN		 CMD_ID
486  * BITS	 [127:120]	[119:16]      [15:8]		  [7:4]		   [3:0]
487  */
488  
c2h_evt_clear(struct adapter * adapter)489  void c2h_evt_clear(struct adapter *adapter)
490  {
491  	rtw_write8(adapter, REG_C2HEVT_CLEAR, C2H_EVT_HOST_CLOSE);
492  }
493  
494  /*
495  * C2H event format:
496  * Field    TRIGGER    CMD_LEN    CONTENT    CMD_SEQ    CMD_ID
497  * BITS    [127:120]   [119:112]    [111:16]	     [15:8]         [7:0]
498  */
c2h_evt_read_88xx(struct adapter * adapter,u8 * buf)499  s32 c2h_evt_read_88xx(struct adapter *adapter, u8 *buf)
500  {
501  	s32 ret = _FAIL;
502  	struct c2h_evt_hdr_88xx *c2h_evt;
503  	int i;
504  	u8 trigger;
505  
506  	if (!buf)
507  		goto exit;
508  
509  	trigger = rtw_read8(adapter, REG_C2HEVT_CLEAR);
510  
511  	if (trigger == C2H_EVT_HOST_CLOSE)
512  		goto exit; /* Not ready */
513  	else if (trigger != C2H_EVT_FW_CLOSE)
514  		goto clear_evt; /* Not a valid value */
515  
516  	c2h_evt = (struct c2h_evt_hdr_88xx *)buf;
517  
518  	memset(c2h_evt, 0, 16);
519  
520  	c2h_evt->id = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL);
521  	c2h_evt->seq = rtw_read8(adapter, REG_C2HEVT_CMD_SEQ_88XX);
522  	c2h_evt->plen = rtw_read8(adapter, REG_C2HEVT_CMD_LEN_88XX);
523  
524  	/* Read the content */
525  	for (i = 0; i < c2h_evt->plen; i++)
526  		c2h_evt->payload[i] = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + 2 + i);
527  
528  	ret = _SUCCESS;
529  
530  clear_evt:
531  	/*
532  	* Clear event to notify FW we have read the command.
533  	* If this field isn't clear, the FW won't update the next command message.
534  	*/
535  	c2h_evt_clear(adapter);
536  exit:
537  	return ret;
538  }
539  
rtw_get_mgntframe_raid(struct adapter * adapter,unsigned char network_type)540  u8 rtw_get_mgntframe_raid(struct adapter *adapter, unsigned char network_type)
541  {
542  	return (network_type & WIRELESS_11B) ? RATEID_IDX_B : RATEID_IDX_G;
543  }
544  
rtw_hal_update_sta_rate_mask(struct adapter * padapter,struct sta_info * psta)545  void rtw_hal_update_sta_rate_mask(struct adapter *padapter, struct sta_info *psta)
546  {
547  	u8 i, limit;
548  	u32 tx_ra_bitmap;
549  
550  	if (!psta)
551  		return;
552  
553  	tx_ra_bitmap = 0;
554  
555  	/* b/g mode ra_bitmap */
556  	for (i = 0; i < sizeof(psta->bssrateset); i++) {
557  		if (psta->bssrateset[i])
558  			tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f);
559  	}
560  
561  	/* n mode ra_bitmap */
562  	if (psta->htpriv.ht_option) {
563  		limit = 8; /*   1R */
564  
565  		for (i = 0; i < limit; i++) {
566  			if (psta->htpriv.ht_cap.mcs.rx_mask[i/8] & BIT(i%8))
567  				tx_ra_bitmap |= BIT(i+12);
568  		}
569  	}
570  
571  	psta->ra_mask = tx_ra_bitmap;
572  	psta->init_rate = get_highest_rate_idx(tx_ra_bitmap)&0x3f;
573  }
574  
hw_var_port_switch(struct adapter * adapter)575  void hw_var_port_switch(struct adapter *adapter)
576  {
577  }
578  
SetHwReg(struct adapter * adapter,u8 variable,u8 * val)579  void SetHwReg(struct adapter *adapter, u8 variable, u8 *val)
580  {
581  	struct hal_com_data *hal_data = GET_HAL_DATA(adapter);
582  	struct dm_odm_t *odm = &(hal_data->odmpriv);
583  
584  	switch (variable) {
585  	case HW_VAR_PORT_SWITCH:
586  		hw_var_port_switch(adapter);
587  		break;
588  	case HW_VAR_INIT_RTS_RATE:
589  		rtw_warn_on(1);
590  		break;
591  	case HW_VAR_SEC_CFG:
592  	{
593  		u16 reg_scr;
594  
595  		reg_scr = rtw_read16(adapter, REG_SECCFG);
596  		rtw_write16(adapter, REG_SECCFG, reg_scr|SCR_CHK_KEYID|SCR_RxDecEnable|SCR_TxEncEnable);
597  	}
598  		break;
599  	case HW_VAR_SEC_DK_CFG:
600  	{
601  		struct security_priv *sec = &adapter->securitypriv;
602  		u8 reg_scr = rtw_read8(adapter, REG_SECCFG);
603  
604  		if (val) { /* Enable default key related setting */
605  			reg_scr |= SCR_TXBCUSEDK;
606  			if (sec->dot11AuthAlgrthm != dot11AuthAlgrthm_8021X)
607  				reg_scr |= (SCR_RxUseDK|SCR_TxUseDK);
608  		} else /* Disable default key related setting */
609  			reg_scr &= ~(SCR_RXBCUSEDK|SCR_TXBCUSEDK|SCR_RxUseDK|SCR_TxUseDK);
610  
611  		rtw_write8(adapter, REG_SECCFG, reg_scr);
612  	}
613  		break;
614  	case HW_VAR_DM_FLAG:
615  		odm->SupportAbility = *((u32 *)val);
616  		break;
617  	case HW_VAR_DM_FUNC_OP:
618  		if (*((u8 *)val) == true) {
619  			/* save dm flag */
620  			odm->BK_SupportAbility = odm->SupportAbility;
621  		} else {
622  			/* restore dm flag */
623  			odm->SupportAbility = odm->BK_SupportAbility;
624  		}
625  		break;
626  	case HW_VAR_DM_FUNC_SET:
627  		if (*((u32 *)val) == DYNAMIC_ALL_FUNC_ENABLE) {
628  			struct dm_priv *dm = &hal_data->dmpriv;
629  			dm->DMFlag = dm->InitDMFlag;
630  			odm->SupportAbility = dm->InitODMFlag;
631  		} else {
632  			odm->SupportAbility |= *((u32 *)val);
633  		}
634  		break;
635  	case HW_VAR_DM_FUNC_CLR:
636  		/*
637  		* input is already a mask to clear function
638  		* don't invert it again! George, Lucas@20130513
639  		*/
640  		odm->SupportAbility &= *((u32 *)val);
641  		break;
642  	case HW_VAR_AMPDU_MIN_SPACE:
643  		/* TODO - Is something needed here? */
644  		break;
645  	case HW_VAR_WIRELESS_MODE:
646  		/* TODO - Is something needed here? */
647  		break;
648  	default:
649  		netdev_dbg(adapter->pnetdev,
650  			   FUNC_ADPT_FMT " variable(%d) not defined!\n",
651  			   FUNC_ADPT_ARG(adapter), variable);
652  		break;
653  	}
654  }
655  
GetHwReg(struct adapter * adapter,u8 variable,u8 * val)656  void GetHwReg(struct adapter *adapter, u8 variable, u8 *val)
657  {
658  	struct hal_com_data *hal_data = GET_HAL_DATA(adapter);
659  	struct dm_odm_t *odm = &(hal_data->odmpriv);
660  
661  	switch (variable) {
662  	case HW_VAR_BASIC_RATE:
663  		*((u16 *)val) = hal_data->BasicRateSet;
664  		break;
665  	case HW_VAR_DM_FLAG:
666  		*((u32 *)val) = odm->SupportAbility;
667  		break;
668  	default:
669  		netdev_dbg(adapter->pnetdev,
670  			   FUNC_ADPT_FMT " variable(%d) not defined!\n",
671  			   FUNC_ADPT_ARG(adapter), variable);
672  		break;
673  	}
674  }
675  
676  
677  
678  
SetHalDefVar(struct adapter * adapter,enum hal_def_variable variable,void * value)679  u8 SetHalDefVar(
680  	struct adapter *adapter, enum hal_def_variable variable, void *value
681  )
682  {
683  	struct hal_com_data *hal_data = GET_HAL_DATA(adapter);
684  	struct dm_odm_t *odm = &(hal_data->odmpriv);
685  	u8 bResult = _SUCCESS;
686  
687  	switch (variable) {
688  	case HAL_DEF_DBG_RX_INFO_DUMP:
689  
690  		if (odm->bLinked) {
691  			#ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
692  			rtw_dump_raw_rssi_info(adapter);
693  			#endif
694  		}
695  		break;
696  	case HW_DEF_ODM_DBG_FLAG:
697  		ODM_CmnInfoUpdate(odm, ODM_CMNINFO_DBG_COMP, *((u64 *)value));
698  		break;
699  	case HW_DEF_ODM_DBG_LEVEL:
700  		ODM_CmnInfoUpdate(odm, ODM_CMNINFO_DBG_LEVEL, *((u32 *)value));
701  		break;
702  	case HAL_DEF_DBG_DM_FUNC:
703  	{
704  		u8 dm_func = *((u8 *)value);
705  		struct dm_priv *dm = &hal_data->dmpriv;
706  
707  		if (dm_func == 0) { /* disable all dynamic func */
708  			odm->SupportAbility = DYNAMIC_FUNC_DISABLE;
709  		} else if (dm_func == 1) {/* disable DIG */
710  			odm->SupportAbility  &= (~DYNAMIC_BB_DIG);
711  		} else if (dm_func == 2) {/* disable High power */
712  			odm->SupportAbility  &= (~DYNAMIC_BB_DYNAMIC_TXPWR);
713  		} else if (dm_func == 3) {/* disable tx power tracking */
714  			odm->SupportAbility  &= (~DYNAMIC_RF_CALIBRATION);
715  		} else if (dm_func == 4) {/* disable BT coexistence */
716  			dm->DMFlag &= (~DYNAMIC_FUNC_BT);
717  		} else if (dm_func == 5) {/* disable antenna diversity */
718  			odm->SupportAbility  &= (~DYNAMIC_BB_ANT_DIV);
719  		} else if (dm_func == 6) {/* turn on all dynamic func */
720  			if (!(odm->SupportAbility  & DYNAMIC_BB_DIG)) {
721  				struct dig_t	*pDigTable = &odm->DM_DigTable;
722  				pDigTable->CurIGValue = rtw_read8(adapter, 0xc50);
723  			}
724  			dm->DMFlag |= DYNAMIC_FUNC_BT;
725  			odm->SupportAbility = DYNAMIC_ALL_FUNC_ENABLE;
726  		}
727  	}
728  		break;
729  	case HAL_DEF_DBG_DUMP_RXPKT:
730  		hal_data->bDumpRxPkt = *((u8 *)value);
731  		break;
732  	case HAL_DEF_DBG_DUMP_TXPKT:
733  		hal_data->bDumpTxPkt = *((u8 *)value);
734  		break;
735  	case HAL_DEF_ANT_DETECT:
736  		hal_data->AntDetection = *((u8 *)value);
737  		break;
738  	default:
739  		netdev_dbg(adapter->pnetdev,
740  			   "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n",
741  			   __func__, variable);
742  		bResult = _FAIL;
743  		break;
744  	}
745  
746  	return bResult;
747  }
748  
GetHalDefVar(struct adapter * adapter,enum hal_def_variable variable,void * value)749  u8 GetHalDefVar(
750  	struct adapter *adapter, enum hal_def_variable variable, void *value
751  )
752  {
753  	struct hal_com_data *hal_data = GET_HAL_DATA(adapter);
754  	u8 bResult = _SUCCESS;
755  
756  	switch (variable) {
757  	case HAL_DEF_UNDERCORATEDSMOOTHEDPWDB:
758  		{
759  			struct mlme_priv *pmlmepriv;
760  			struct sta_priv *pstapriv;
761  			struct sta_info *psta;
762  
763  			pmlmepriv = &adapter->mlmepriv;
764  			pstapriv = &adapter->stapriv;
765  			psta = rtw_get_stainfo(pstapriv, pmlmepriv->cur_network.network.mac_address);
766  			if (psta)
767  				*((int *)value) = psta->rssi_stat.UndecoratedSmoothedPWDB;
768  		}
769  		break;
770  	case HAL_DEF_DBG_DM_FUNC:
771  		*((u32 *)value) = hal_data->odmpriv.SupportAbility;
772  		break;
773  	case HAL_DEF_DBG_DUMP_RXPKT:
774  		*((u8 *)value) = hal_data->bDumpRxPkt;
775  		break;
776  	case HAL_DEF_DBG_DUMP_TXPKT:
777  		*((u8 *)value) = hal_data->bDumpTxPkt;
778  		break;
779  	case HAL_DEF_ANT_DETECT:
780  		*((u8 *)value) = hal_data->AntDetection;
781  		break;
782  	case HAL_DEF_MACID_SLEEP:
783  		*(u8 *)value = false;
784  		break;
785  	case HAL_DEF_TX_PAGE_SIZE:
786  		*((u32 *)value) = PAGE_SIZE_128;
787  		break;
788  	default:
789  		netdev_dbg(adapter->pnetdev,
790  			   "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n",
791  			   __func__, variable);
792  		bResult = _FAIL;
793  		break;
794  	}
795  
796  	return bResult;
797  }
798  
GetHalODMVar(struct adapter * Adapter,enum hal_odm_variable eVariable,void * pValue1,void * pValue2)799  void GetHalODMVar(
800  	struct adapter *Adapter,
801  	enum hal_odm_variable eVariable,
802  	void *pValue1,
803  	void *pValue2
804  )
805  {
806  	switch (eVariable) {
807  	default:
808  		break;
809  	}
810  }
811  
SetHalODMVar(struct adapter * Adapter,enum hal_odm_variable eVariable,void * pValue1,bool bSet)812  void SetHalODMVar(
813  	struct adapter *Adapter,
814  	enum hal_odm_variable eVariable,
815  	void *pValue1,
816  	bool bSet
817  )
818  {
819  	struct hal_com_data	*pHalData = GET_HAL_DATA(Adapter);
820  	struct dm_odm_t *podmpriv = &pHalData->odmpriv;
821  	/* _irqL irqL; */
822  	switch (eVariable) {
823  	case HAL_ODM_STA_INFO:
824  		{
825  			struct sta_info *psta = pValue1;
826  			if (bSet) {
827  				ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS, psta->mac_id, psta);
828  			} else {
829  				/* spin_lock_bh(&pHalData->odm_stainfo_lock); */
830  				ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS, psta->mac_id, NULL);
831  
832  				/* spin_unlock_bh(&pHalData->odm_stainfo_lock); */
833  		    }
834  		}
835  		break;
836  	case HAL_ODM_P2P_STATE:
837  			ODM_CmnInfoUpdate(podmpriv, ODM_CMNINFO_WIFI_DIRECT, bSet);
838  		break;
839  	case HAL_ODM_WIFI_DISPLAY_STATE:
840  			ODM_CmnInfoUpdate(podmpriv, ODM_CMNINFO_WIFI_DISPLAY, bSet);
841  		break;
842  
843  	default:
844  		break;
845  	}
846  }
847  
848  
eqNByte(u8 * str1,u8 * str2,u32 num)849  bool eqNByte(u8 *str1, u8 *str2, u32 num)
850  {
851  	if (num == 0)
852  		return false;
853  	while (num > 0) {
854  		num--;
855  		if (str1[num] != str2[num])
856  			return false;
857  	}
858  	return true;
859  }
860  
GetU1ByteIntegerFromStringInDecimal(char * Str,u8 * pInt)861  bool GetU1ByteIntegerFromStringInDecimal(char *Str, u8 *pInt)
862  {
863  	u16 i = 0;
864  	*pInt = 0;
865  
866  	while (Str[i] != '\0') {
867  		if (Str[i] >= '0' && Str[i] <= '9') {
868  			*pInt *= 10;
869  			*pInt += (Str[i] - '0');
870  		} else
871  			return false;
872  
873  		++i;
874  	}
875  
876  	return true;
877  }
878  
rtw_hal_check_rxfifo_full(struct adapter * adapter)879  void rtw_hal_check_rxfifo_full(struct adapter *adapter)
880  {
881  	struct dvobj_priv *psdpriv = adapter->dvobj;
882  	struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
883  	int save_cnt = false;
884  
885  	/* switch counter to RX fifo */
886  	/* printk("8723b or 8192e , MAC_667 set 0xf0\n"); */
887  	rtw_write8(adapter, REG_RXERR_RPT+3, rtw_read8(adapter, REG_RXERR_RPT+3)|0xf0);
888  	save_cnt = true;
889  	/* todo: other chips */
890  
891  	if (save_cnt) {
892  		/* rtw_write8(adapter, REG_RXERR_RPT+3, rtw_read8(adapter, REG_RXERR_RPT+3)|0xa0); */
893  		pdbgpriv->dbg_rx_fifo_last_overflow = pdbgpriv->dbg_rx_fifo_curr_overflow;
894  		pdbgpriv->dbg_rx_fifo_curr_overflow = rtw_read16(adapter, REG_RXERR_RPT);
895  		pdbgpriv->dbg_rx_fifo_diff_overflow = pdbgpriv->dbg_rx_fifo_curr_overflow-pdbgpriv->dbg_rx_fifo_last_overflow;
896  	}
897  }
898  
899  #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
rtw_dump_raw_rssi_info(struct adapter * padapter)900  void rtw_dump_raw_rssi_info(struct adapter *padapter)
901  {
902  	u8 isCCKrate, rf_path;
903  	struct hal_com_data *pHalData =  GET_HAL_DATA(padapter);
904  	struct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info;
905  
906  	isCCKrate = psample_pkt_rssi->data_rate <= DESC_RATE11M;
907  
908  	if (isCCKrate)
909  		psample_pkt_rssi->mimo_signal_strength[0] = psample_pkt_rssi->pwdball;
910  
911  	for (rf_path = 0; rf_path < pHalData->NumTotalRFPath; rf_path++) {
912  		if (!isCCKrate) {
913  			printk(", rx_ofdm_pwr:%d(dBm), rx_ofdm_snr:%d(dB)\n",
914  			psample_pkt_rssi->ofdm_pwr[rf_path], psample_pkt_rssi->ofdm_snr[rf_path]);
915  		} else {
916  			printk("\n");
917  		}
918  	}
919  }
920  
rtw_store_phy_info(struct adapter * padapter,union recv_frame * prframe)921  void rtw_store_phy_info(struct adapter *padapter, union recv_frame *prframe)
922  {
923  	u8 isCCKrate, rf_path;
924  	struct hal_com_data *pHalData =  GET_HAL_DATA(padapter);
925  	struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
926  
927  	struct odm_phy_info *pPhyInfo  = (PODM_PHY_INFO_T)(&pattrib->phy_info);
928  	struct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info;
929  
930  	psample_pkt_rssi->data_rate = pattrib->data_rate;
931  	isCCKrate = pattrib->data_rate <= DESC_RATE11M;
932  
933  	psample_pkt_rssi->pwdball = pPhyInfo->rx_pwd_ba11;
934  	psample_pkt_rssi->pwr_all = pPhyInfo->recv_signal_power;
935  
936  	for (rf_path = 0; rf_path < pHalData->NumTotalRFPath; rf_path++) {
937  		psample_pkt_rssi->mimo_signal_strength[rf_path] = pPhyInfo->rx_mimo_signal_strength[rf_path];
938  		psample_pkt_rssi->mimo_signal_quality[rf_path] = pPhyInfo->rx_mimo_signal_quality[rf_path];
939  		if (!isCCKrate) {
940  			psample_pkt_rssi->ofdm_pwr[rf_path] = pPhyInfo->RxPwr[rf_path];
941  			psample_pkt_rssi->ofdm_snr[rf_path] = pPhyInfo->RxSNR[rf_path];
942  		}
943  	}
944  }
945  #endif
946  
947  static u32 Array_kfreemap[] = {
948  	0xf8, 0xe,
949  	0xf6, 0xc,
950  	0xf4, 0xa,
951  	0xf2, 0x8,
952  	0xf0, 0x6,
953  	0xf3, 0x4,
954  	0xf5, 0x2,
955  	0xf7, 0x0,
956  	0xf9, 0x0,
957  	0xfc, 0x0,
958  };
959  
rtw_bb_rf_gain_offset(struct adapter * padapter)960  void rtw_bb_rf_gain_offset(struct adapter *padapter)
961  {
962  	u8 value = padapter->eeprompriv.EEPROMRFGainOffset;
963  	u32 res, i = 0;
964  	u32 *Array = Array_kfreemap;
965  	u32 v1 = 0, v2 = 0, target = 0;
966  
967  	if (value & BIT4) {
968  		if (padapter->eeprompriv.EEPROMRFGainVal != 0xff) {
969  			res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);
970  			res &= 0xfff87fff;
971  			/* res &= 0xfff87fff; */
972  			for (i = 0; i < ARRAY_SIZE(Array_kfreemap); i += 2) {
973  				v1 = Array[i];
974  				v2 = Array[i+1];
975  				if (v1 == padapter->eeprompriv.EEPROMRFGainVal) {
976  					target = v2;
977  					break;
978  				}
979  			}
980  			PHY_SetRFReg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, BIT18|BIT17|BIT16|BIT15, target);
981  
982  			/* res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f)<< 15; */
983  			/* rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, RF_GAIN_OFFSET_MASK, res); */
984  			res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);
985  		}
986  	}
987  }
988