File Index
Files and directories
Sign in
FILE

hal_com.c

File preview with syntax highlighting.

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