Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nu11secur1ty
GitHub Repository: nu11secur1ty/Kali-Linux
Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/phydm_interface.c
1307 views
1
/******************************************************************************
2
*
3
* Copyright(c) 2007 - 2017 Realtek Corporation.
4
*
5
* This program is free software; you can redistribute it and/or modify it
6
* under the terms of version 2 of the GNU General Public License as
7
* published by the Free Software Foundation.
8
*
9
* This program is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12
* more details.
13
*
14
* The full GNU General Public License is included in this distribution in the
15
* file called LICENSE.
16
*
17
* Contact Information:
18
* wlanfae <[email protected]>
19
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20
* Hsinchu 300, Taiwan.
21
*
22
* Larry Finger <[email protected]>
23
*
24
*****************************************************************************/
25
26
/*@************************************************************
27
* include files
28
************************************************************/
29
30
#include "mp_precomp.h"
31
#include "phydm_precomp.h"
32
33
/*@
34
* ODM IO Relative API.
35
*/
36
37
u8 odm_read_1byte(struct dm_struct *dm, u32 reg_addr)
38
{
39
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
40
struct rtl8192cd_priv *priv = dm->priv;
41
return RTL_R8(reg_addr);
42
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
43
struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
44
45
return rtl_read_byte(rtlpriv, reg_addr);
46
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
47
struct rtw_dev *rtwdev = dm->adapter;
48
49
return rtw_read8(rtwdev, reg_addr);
50
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
51
void *adapter = dm->adapter;
52
return rtw_read8(adapter, reg_addr);
53
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
54
void *adapter = dm->adapter;
55
return PlatformEFIORead1Byte(adapter, reg_addr);
56
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
57
void *adapter = dm->adapter;
58
59
return rtw_read8(adapter, reg_addr);
60
#endif
61
}
62
63
u16 odm_read_2byte(struct dm_struct *dm, u32 reg_addr)
64
{
65
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
66
struct rtl8192cd_priv *priv = dm->priv;
67
return RTL_R16(reg_addr);
68
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
69
struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
70
71
return rtl_read_word(rtlpriv, reg_addr);
72
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
73
struct rtw_dev *rtwdev = dm->adapter;
74
75
return rtw_read16(rtwdev, reg_addr);
76
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
77
void *adapter = dm->adapter;
78
return rtw_read16(adapter, reg_addr);
79
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
80
void *adapter = dm->adapter;
81
return PlatformEFIORead2Byte(adapter, reg_addr);
82
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
83
void *adapter = dm->adapter;
84
85
return rtw_read16(adapter, reg_addr);
86
#endif
87
}
88
89
u32 odm_read_4byte(struct dm_struct *dm, u32 reg_addr)
90
{
91
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
92
struct rtl8192cd_priv *priv = dm->priv;
93
return RTL_R32(reg_addr);
94
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
95
struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
96
97
return rtl_read_dword(rtlpriv, reg_addr);
98
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
99
struct rtw_dev *rtwdev = dm->adapter;
100
101
return rtw_read32(rtwdev, reg_addr);
102
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
103
void *adapter = dm->adapter;
104
return rtw_read32(adapter, reg_addr);
105
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
106
void *adapter = dm->adapter;
107
return PlatformEFIORead4Byte(adapter, reg_addr);
108
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
109
void *adapter = dm->adapter;
110
111
return rtw_read32(adapter, reg_addr);
112
#endif
113
}
114
115
void odm_write_1byte(struct dm_struct *dm, u32 reg_addr, u8 data)
116
{
117
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
118
struct rtl8192cd_priv *priv = dm->priv;
119
RTL_W8(reg_addr, data);
120
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
121
struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
122
123
rtl_write_byte(rtlpriv, reg_addr, data);
124
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
125
struct rtw_dev *rtwdev = dm->adapter;
126
127
rtw_write8(rtwdev, reg_addr, data);
128
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
129
void *adapter = dm->adapter;
130
rtw_write8(adapter, reg_addr, data);
131
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
132
void *adapter = dm->adapter;
133
PlatformEFIOWrite1Byte(adapter, reg_addr, data);
134
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
135
void *adapter = dm->adapter;
136
137
rtw_write8(adapter, reg_addr, data);
138
#endif
139
140
if (dm->en_reg_mntr_byte)
141
pr_debug("1byte:addr=0x%x, data=0x%x\n", reg_addr, data);
142
}
143
144
void odm_write_2byte(struct dm_struct *dm, u32 reg_addr, u16 data)
145
{
146
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
147
struct rtl8192cd_priv *priv = dm->priv;
148
RTL_W16(reg_addr, data);
149
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
150
struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
151
152
rtl_write_word(rtlpriv, reg_addr, data);
153
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
154
struct rtw_dev *rtwdev = dm->adapter;
155
156
rtw_write16(rtwdev, reg_addr, data);
157
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
158
void *adapter = dm->adapter;
159
rtw_write16(adapter, reg_addr, data);
160
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
161
void *adapter = dm->adapter;
162
PlatformEFIOWrite2Byte(adapter, reg_addr, data);
163
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
164
void *adapter = dm->adapter;
165
166
rtw_write16(adapter, reg_addr, data);
167
#endif
168
169
if (dm->en_reg_mntr_byte)
170
pr_debug("2byte:addr=0x%x, data=0x%x\n", reg_addr, data);
171
}
172
173
void odm_write_4byte(struct dm_struct *dm, u32 reg_addr, u32 data)
174
{
175
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
176
struct rtl8192cd_priv *priv = dm->priv;
177
RTL_W32(reg_addr, data);
178
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
179
struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
180
181
rtl_write_dword(rtlpriv, reg_addr, data);
182
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
183
struct rtw_dev *rtwdev = dm->adapter;
184
185
rtw_write32(rtwdev, reg_addr, data);
186
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
187
void *adapter = dm->adapter;
188
rtw_write32(adapter, reg_addr, data);
189
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
190
void *adapter = dm->adapter;
191
PlatformEFIOWrite4Byte(adapter, reg_addr, data);
192
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
193
void *adapter = dm->adapter;
194
195
rtw_write32(adapter, reg_addr, data);
196
#endif
197
198
if (dm->en_reg_mntr_byte)
199
pr_debug("4byte:addr=0x%x, data=0x%x\n", reg_addr, data);
200
}
201
202
void odm_set_mac_reg(struct dm_struct *dm, u32 reg_addr, u32 bit_mask, u32 data)
203
{
204
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
205
phy_set_bb_reg(dm->priv, reg_addr, bit_mask, data);
206
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
207
void *adapter = dm->adapter;
208
PHY_SetBBReg(adapter, reg_addr, bit_mask, data);
209
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
210
struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
211
212
rtl_set_bbreg(rtlpriv->hw, reg_addr, bit_mask, data);
213
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
214
struct rtw_dev *rtwdev = dm->adapter;
215
216
rtw_set_reg_with_mask(rtwdev, reg_addr, bit_mask, data);
217
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
218
phy_set_bb_reg(dm->adapter, reg_addr, bit_mask, data);
219
#else
220
phy_set_bb_reg(dm->adapter, reg_addr, bit_mask, data);
221
#endif
222
223
if (dm->en_reg_mntr_mac)
224
pr_debug("MAC:addr=0x%x, mask=0x%x, data=0x%x\n",
225
reg_addr, bit_mask, data);
226
}
227
228
u32 odm_get_mac_reg(struct dm_struct *dm, u32 reg_addr, u32 bit_mask)
229
{
230
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
231
return phy_query_bb_reg(dm->priv, reg_addr, bit_mask);
232
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
233
return PHY_QueryMacReg(dm->adapter, reg_addr, bit_mask);
234
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
235
struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
236
237
return rtl_get_bbreg(rtlpriv->hw, reg_addr, bit_mask);
238
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
239
struct rtw_dev *rtwdev = dm->adapter;
240
241
return rtw_get_reg_with_mask(rtwdev, reg_addr, bit_mask);
242
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
243
return phy_query_bb_reg(dm->adapter, reg_addr, bit_mask);
244
#else
245
return phy_query_mac_reg(dm->adapter, reg_addr, bit_mask);
246
#endif
247
}
248
249
void odm_set_bb_reg(struct dm_struct *dm, u32 reg_addr, u32 bit_mask, u32 data)
250
{
251
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
252
phy_set_bb_reg(dm->priv, reg_addr, bit_mask, data);
253
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
254
void *adapter = dm->adapter;
255
PHY_SetBBReg(adapter, reg_addr, bit_mask, data);
256
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
257
struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
258
259
rtl_set_bbreg(rtlpriv->hw, reg_addr, bit_mask, data);
260
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
261
struct rtw_dev *rtwdev = dm->adapter;
262
263
rtw_set_reg_with_mask(rtwdev, reg_addr, bit_mask, data);
264
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
265
phy_set_bb_reg(dm->adapter, reg_addr, bit_mask, data);
266
#else
267
phy_set_bb_reg(dm->adapter, reg_addr, bit_mask, data);
268
#endif
269
270
if (dm->en_reg_mntr_bb)
271
pr_debug("BB:addr=0x%x, mask=0x%x, data=0x%x\n",
272
reg_addr, bit_mask, data);
273
}
274
275
u32 odm_get_bb_reg(struct dm_struct *dm, u32 reg_addr, u32 bit_mask)
276
{
277
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
278
return phy_query_bb_reg(dm->priv, reg_addr, bit_mask);
279
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
280
void *adapter = dm->adapter;
281
return PHY_QueryBBReg(adapter, reg_addr, bit_mask);
282
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
283
struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
284
285
return rtl_get_bbreg(rtlpriv->hw, reg_addr, bit_mask);
286
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
287
struct rtw_dev *rtwdev = dm->adapter;
288
289
return rtw_get_reg_with_mask(rtwdev, reg_addr, bit_mask);
290
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
291
return phy_query_bb_reg(dm->adapter, reg_addr, bit_mask);
292
#else
293
return phy_query_bb_reg(dm->adapter, reg_addr, bit_mask);
294
#endif
295
}
296
297
void odm_set_rf_reg(struct dm_struct *dm, u8 e_rf_path, u32 reg_addr,
298
u32 bit_mask, u32 data)
299
{
300
#if (DM_ODM_SUPPORT_TYPE & ODM_AP)
301
phy_set_rf_reg(dm->priv, e_rf_path, reg_addr, bit_mask, data);
302
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
303
void *adapter = dm->adapter;
304
PHY_SetRFReg(adapter, e_rf_path, reg_addr, bit_mask, data);
305
ODM_delay_us(2);
306
307
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
308
struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
309
310
rtl_set_rfreg(rtlpriv->hw, e_rf_path, reg_addr, bit_mask, data);
311
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
312
struct rtw_dev *rtwdev = dm->adapter;
313
314
rtw_write_rf(rtwdev, e_rf_path, reg_addr, bit_mask, data);
315
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
316
phy_set_rf_reg(dm->adapter, e_rf_path, reg_addr, bit_mask, data);
317
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
318
phy_set_rf_reg(dm->adapter, e_rf_path, reg_addr, bit_mask, data);
319
ODM_delay_us(2);
320
#endif
321
322
if (dm->en_reg_mntr_rf)
323
pr_debug("RF:path=0x%x, addr=0x%x, mask=0x%x, data=0x%x\n",
324
e_rf_path, reg_addr, bit_mask, data);
325
}
326
327
u32 odm_get_rf_reg(struct dm_struct *dm, u8 e_rf_path, u32 reg_addr,
328
u32 bit_mask)
329
{
330
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
331
return phy_query_rf_reg(dm->priv, e_rf_path, reg_addr, bit_mask, 1);
332
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
333
void *adapter = dm->adapter;
334
return PHY_QueryRFReg(adapter, e_rf_path, reg_addr, bit_mask);
335
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
336
struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
337
338
return rtl_get_rfreg(rtlpriv->hw, e_rf_path, reg_addr, bit_mask);
339
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
340
struct rtw_dev *rtwdev = dm->adapter;
341
342
return rtw_read_rf(rtwdev, e_rf_path, reg_addr, bit_mask);
343
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
344
return phy_query_rf_reg(dm->adapter, e_rf_path, reg_addr, bit_mask);
345
#else
346
return phy_query_rf_reg(dm->adapter, e_rf_path, reg_addr, bit_mask);
347
#endif
348
}
349
350
enum hal_status
351
phydm_set_reg_by_fw(struct dm_struct *dm, enum phydm_halmac_param config_type,
352
u32 offset, u32 data, u32 mask, enum rf_path e_rf_path,
353
u32 delay_time)
354
{
355
#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
356
return HAL_MAC_Config_PHY_WriteNByte(dm,
357
config_type,
358
offset,
359
data,
360
mask,
361
e_rf_path,
362
delay_time);
363
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
364
#if (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
365
PHYDM_DBG(dm, DBG_CMN, "Not support for CE MAC80211 driver!\n");
366
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
367
return -ENOTSUPP;
368
#else
369
return rtw_phydm_cfg_phy_para(dm,
370
config_type,
371
offset,
372
data,
373
mask,
374
e_rf_path,
375
delay_time);
376
#endif
377
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
378
PHYDM_DBG(dm, DBG_CMN, "Not support for CE MAC80211 driver!\n");
379
#endif
380
}
381
382
/*@
383
* ODM Memory relative API.
384
*/
385
void odm_allocate_memory(struct dm_struct *dm, void **ptr, u32 length)
386
{
387
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
388
*ptr = kmalloc(length, GFP_ATOMIC);
389
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
390
*ptr = kmalloc(length, GFP_ATOMIC);
391
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
392
*ptr = kmalloc(length, GFP_ATOMIC);
393
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
394
*ptr = rtw_zvmalloc(length);
395
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
396
void *adapter = dm->adapter;
397
PlatformAllocateMemory(adapter, ptr, length);
398
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
399
*ptr = rtw_zvmalloc(length);
400
#endif
401
}
402
403
/* @length could be ignored, used to detect memory leakage. */
404
void odm_free_memory(struct dm_struct *dm, void *ptr, u32 length)
405
{
406
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
407
kfree(ptr);
408
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
409
kfree(ptr);
410
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
411
kfree(ptr);
412
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
413
rtw_vmfree(ptr, length);
414
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
415
/* struct void* adapter = dm->adapter; */
416
PlatformFreeMemory(ptr, length);
417
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
418
rtw_vmfree(ptr, length);
419
#endif
420
}
421
422
void odm_move_memory(struct dm_struct *dm, void *dest, void *src, u32 length)
423
{
424
#if (DM_ODM_SUPPORT_TYPE & ODM_AP)
425
memcpy(dest, src, length);
426
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
427
memcpy(dest, src, length);
428
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
429
memcpy(dest, src, length);
430
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
431
_rtw_memcpy(dest, src, length);
432
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
433
PlatformMoveMemory(dest, src, length);
434
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
435
rtw_memcpy(dest, src, length);
436
#endif
437
}
438
439
void odm_memory_set(struct dm_struct *dm, void *pbuf, s8 value, u32 length)
440
{
441
#if (DM_ODM_SUPPORT_TYPE & ODM_AP)
442
memset(pbuf, value, length);
443
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
444
memset(pbuf, value, length);
445
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
446
memset(pbuf, value, length);
447
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
448
_rtw_memset(pbuf, value, length);
449
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
450
PlatformFillMemory(pbuf, length, value);
451
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
452
rtw_memset(pbuf, value, length);
453
#endif
454
}
455
456
s32 odm_compare_memory(struct dm_struct *dm, void *buf1, void *buf2, u32 length)
457
{
458
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
459
return memcmp(buf1, buf2, length);
460
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
461
return memcmp(buf1, buf2, length);
462
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
463
return memcmp(buf1, buf2, length);
464
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
465
return _rtw_memcmp(buf1, buf2, length);
466
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
467
return PlatformCompareMemory(buf1, buf2, length);
468
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
469
return rtw_memcmp(buf1, buf2, length);
470
#endif
471
}
472
473
/*@
474
* ODM MISC relative API.
475
*/
476
void odm_acquire_spin_lock(struct dm_struct *dm, enum rt_spinlock_type type)
477
{
478
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
479
480
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
481
struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
482
483
rtl_odm_acquirespinlock(rtlpriv, type);
484
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
485
struct rtw_dev *rtwdev = dm->adapter;
486
487
spin_lock(&rtwdev->hal.dm_lock);
488
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
489
void *adapter = dm->adapter;
490
rtw_odm_acquirespinlock(adapter, type);
491
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
492
void *adapter = dm->adapter;
493
PlatformAcquireSpinLock(adapter, type);
494
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
495
void *adapter = dm->adapter;
496
497
rtw_odm_acquirespinlock(adapter, type);
498
#endif
499
}
500
501
void odm_release_spin_lock(struct dm_struct *dm, enum rt_spinlock_type type)
502
{
503
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
504
505
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
506
struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
507
508
rtl_odm_releasespinlock(rtlpriv, type);
509
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
510
struct rtw_dev *rtwdev = dm->adapter;
511
512
spin_unlock(&rtwdev->hal.dm_lock);
513
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
514
void *adapter = dm->adapter;
515
rtw_odm_releasespinlock(adapter, type);
516
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
517
void *adapter = dm->adapter;
518
PlatformReleaseSpinLock(adapter, type);
519
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
520
void *adapter = dm->adapter;
521
522
rtw_odm_releasespinlock(adapter, type);
523
#endif
524
}
525
526
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
527
/*@
528
* Work item relative API. FOr MP driver only~!
529
* */
530
void odm_initialize_work_item(
531
struct dm_struct *dm,
532
PRT_WORK_ITEM work_item,
533
RT_WORKITEM_CALL_BACK callback,
534
void *context,
535
const char *id)
536
{
537
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
538
539
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
540
541
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
542
void *adapter = dm->adapter;
543
PlatformInitializeWorkItem(adapter, work_item, callback, context, id);
544
#endif
545
}
546
547
void odm_start_work_item(
548
PRT_WORK_ITEM p_rt_work_item)
549
{
550
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
551
552
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
553
554
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
555
PlatformStartWorkItem(p_rt_work_item);
556
#endif
557
}
558
559
void odm_stop_work_item(
560
PRT_WORK_ITEM p_rt_work_item)
561
{
562
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
563
564
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
565
566
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
567
PlatformStopWorkItem(p_rt_work_item);
568
#endif
569
}
570
571
void odm_free_work_item(
572
PRT_WORK_ITEM p_rt_work_item)
573
{
574
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
575
576
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
577
578
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
579
PlatformFreeWorkItem(p_rt_work_item);
580
#endif
581
}
582
583
void odm_schedule_work_item(
584
PRT_WORK_ITEM p_rt_work_item)
585
{
586
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
587
588
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
589
590
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
591
PlatformScheduleWorkItem(p_rt_work_item);
592
#endif
593
}
594
595
boolean
596
odm_is_work_item_scheduled(
597
PRT_WORK_ITEM p_rt_work_item)
598
{
599
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
600
601
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
602
603
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
604
return PlatformIsWorkItemScheduled(p_rt_work_item);
605
#endif
606
}
607
#endif
608
609
/*@
610
* ODM Timer relative API.
611
*/
612
613
void ODM_delay_ms(u32 ms)
614
{
615
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
616
delay_ms(ms);
617
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
618
mdelay(ms);
619
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
620
mdelay(ms);
621
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
622
rtw_mdelay_os(ms);
623
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
624
delay_ms(ms);
625
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
626
rtw_mdelay_os(ms);
627
#endif
628
}
629
630
void ODM_delay_us(u32 us)
631
{
632
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
633
delay_us(us);
634
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
635
udelay(us);
636
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
637
udelay(us);
638
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
639
rtw_udelay_os(us);
640
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
641
PlatformStallExecution(us);
642
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
643
rtw_udelay_os(us);
644
#endif
645
}
646
647
void ODM_sleep_ms(u32 ms)
648
{
649
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
650
delay_ms(ms);
651
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
652
msleep(ms);
653
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
654
msleep(ms);
655
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
656
rtw_msleep_os(ms);
657
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
658
delay_ms(ms);
659
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
660
rtw_msleep_os(ms);
661
#endif
662
}
663
664
void ODM_sleep_us(u32 us)
665
{
666
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
667
delay_us(us);
668
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
669
usleep_range(us, us + 1);
670
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
671
usleep_range(us, us + 1);
672
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
673
rtw_usleep_os(us);
674
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
675
PlatformStallExecution(us);
676
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
677
rtw_usleep_os(us);
678
#endif
679
}
680
681
void odm_set_timer(struct dm_struct *dm, struct phydm_timer_list *timer,
682
u32 ms_delay)
683
{
684
#if (DM_ODM_SUPPORT_TYPE & ODM_AP)
685
mod_timer(timer, jiffies + RTL_MILISECONDS_TO_JIFFIES(ms_delay));
686
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
687
mod_timer(timer, jiffies + msecs_to_jiffies(ms_delay));
688
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
689
mod_timer(&timer->timer, jiffies + msecs_to_jiffies(ms_delay));
690
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
691
_set_timer(timer, ms_delay); /* @ms */
692
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
693
void *adapter = dm->adapter;
694
PlatformSetTimer(adapter, timer, ms_delay);
695
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
696
rtw_set_timer(timer, ms_delay); /* @ms */
697
#endif
698
}
699
700
void odm_initialize_timer(struct dm_struct *dm, struct phydm_timer_list *timer,
701
void *call_back_func, void *context,
702
const char *sz_id)
703
{
704
#if (DM_ODM_SUPPORT_TYPE & ODM_AP)
705
init_timer(timer);
706
timer->function = call_back_func;
707
timer->data = (unsigned long)dm;
708
#if 0
709
/*@mod_timer(timer, jiffies+RTL_MILISECONDS_TO_JIFFIES(10)); */
710
#endif
711
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
712
timer_setup(timer, call_back_func, 0);
713
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
714
struct _ADAPTER *adapter = dm->adapter;
715
716
_init_timer(timer, adapter->pnetdev, call_back_func, dm);
717
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
718
void *adapter = dm->adapter;
719
720
PlatformInitializeTimer(adapter, timer, (RT_TIMER_CALL_BACK)call_back_func, context, sz_id);
721
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
722
struct _ADAPTER *adapter = dm->adapter;
723
724
rtw_init_timer(timer, adapter->pnetdev, (TIMER_FUN)call_back_func, dm, NULL);
725
#endif
726
}
727
728
void odm_cancel_timer(struct dm_struct *dm, struct phydm_timer_list *timer)
729
{
730
#if (DM_ODM_SUPPORT_TYPE & ODM_AP)
731
del_timer(timer);
732
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
733
del_timer(timer);
734
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
735
del_timer(&timer->timer);
736
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
737
_cancel_timer_ex(timer);
738
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
739
void *adapter = dm->adapter;
740
PlatformCancelTimer(adapter, timer);
741
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
742
rtw_cancel_timer(timer);
743
#endif
744
}
745
746
void odm_release_timer(struct dm_struct *dm, struct phydm_timer_list *timer)
747
{
748
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
749
750
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
751
752
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
753
754
void *adapter = dm->adapter;
755
756
/* @<20120301, Kordan> If the initilization fails,
757
* InitializeAdapterXxx will return regardless of InitHalDm.
758
* Hence, uninitialized timers cause BSOD when the driver
759
* releases resources since the init fail.
760
*/
761
if (timer == 0) {
762
PHYDM_DBG(dm, ODM_COMP_INIT,
763
"[%s] Timer is NULL! Please check!\n", __func__);
764
return;
765
}
766
767
PlatformReleaseTimer(adapter, timer);
768
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
769
rtw_del_timer(timer);
770
#endif
771
}
772
773
u8 phydm_trans_h2c_id(struct dm_struct *dm, u8 phydm_h2c_id)
774
{
775
u8 platform_h2c_id = phydm_h2c_id;
776
777
switch (phydm_h2c_id) {
778
/* @1 [0] */
779
case ODM_H2C_RSSI_REPORT:
780
781
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
782
#if (RTL8188E_SUPPORT == 1)
783
if (dm->support_ic_type == ODM_RTL8188E)
784
platform_h2c_id = H2C_88E_RSSI_REPORT;
785
else
786
#endif
787
platform_h2c_id = H2C_RSSI_REPORT;
788
789
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
790
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
791
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
792
platform_h2c_id = H2C_RSSI_SETTING;
793
794
#elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
795
#if ((RTL8881A_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1) || (RTL8197F_SUPPORT == 1) || (RTL8192F_SUPPORT == 1)) /*@jj add 20170822*/
796
if (dm->support_ic_type == ODM_RTL8881A || dm->support_ic_type == ODM_RTL8192E || dm->support_ic_type & PHYDM_IC_3081_SERIES)
797
platform_h2c_id = H2C_88XX_RSSI_REPORT;
798
else
799
#endif
800
#if (RTL8812A_SUPPORT == 1)
801
if (dm->support_ic_type == ODM_RTL8812)
802
platform_h2c_id = H2C_8812_RSSI_REPORT;
803
else
804
#endif
805
{
806
}
807
#endif
808
809
break;
810
811
/* @1 [3] */
812
case ODM_H2C_WIFI_CALIBRATION:
813
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
814
platform_h2c_id = H2C_WIFI_CALIBRATION;
815
816
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
817
#if (RTL8723B_SUPPORT == 1)
818
platform_h2c_id = H2C_8723B_BT_WLAN_CALIBRATION;
819
#endif
820
821
#elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
822
#endif
823
break;
824
825
/* @1 [4] */
826
case ODM_H2C_IQ_CALIBRATION:
827
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
828
platform_h2c_id = H2C_IQ_CALIBRATION;
829
830
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
831
#if ((RTL8812A_SUPPORT == 1) || (RTL8821A_SUPPORT == 1))
832
platform_h2c_id = H2C_8812_IQ_CALIBRATION;
833
#endif
834
#elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
835
#endif
836
837
break;
838
/* @1 [5] */
839
case ODM_H2C_RA_PARA_ADJUST:
840
841
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
842
platform_h2c_id = H2C_RA_PARA_ADJUST;
843
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
844
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
845
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
846
#if ((RTL8812A_SUPPORT == 1) || (RTL8821A_SUPPORT == 1))
847
platform_h2c_id = H2C_8812_RA_PARA_ADJUST;
848
#elif ((RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1))
849
platform_h2c_id = H2C_RA_PARA_ADJUST;
850
#elif (RTL8192E_SUPPORT == 1)
851
platform_h2c_id = H2C_8192E_RA_PARA_ADJUST;
852
#elif (RTL8723B_SUPPORT == 1)
853
platform_h2c_id = H2C_8723B_RA_PARA_ADJUST;
854
#endif
855
856
#elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
857
#if ((RTL8881A_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1) || (RTL8197F_SUPPORT == 1) || (RTL8192F_SUPPORT == 1)) /*@jj add 20170822*/
858
if (dm->support_ic_type == ODM_RTL8881A || dm->support_ic_type == ODM_RTL8192E || dm->support_ic_type & PHYDM_IC_3081_SERIES)
859
platform_h2c_id = H2C_88XX_RA_PARA_ADJUST;
860
else
861
#endif
862
#if (RTL8812A_SUPPORT == 1)
863
if (dm->support_ic_type == ODM_RTL8812)
864
platform_h2c_id = H2C_8812_RA_PARA_ADJUST;
865
else
866
#endif
867
{
868
}
869
#endif
870
871
break;
872
873
/* @1 [6] */
874
case PHYDM_H2C_DYNAMIC_TX_PATH:
875
876
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
877
#if (RTL8814A_SUPPORT == 1)
878
if (dm->support_ic_type == ODM_RTL8814A)
879
platform_h2c_id = H2C_8814A_DYNAMIC_TX_PATH;
880
#endif
881
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
882
#if (RTL8814A_SUPPORT == 1)
883
if (dm->support_ic_type == ODM_RTL8814A)
884
platform_h2c_id = H2C_DYNAMIC_TX_PATH;
885
#endif
886
#elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
887
#if (RTL8814A_SUPPORT == 1)
888
if (dm->support_ic_type == ODM_RTL8814A)
889
platform_h2c_id = H2C_88XX_DYNAMIC_TX_PATH;
890
#endif
891
892
#endif
893
894
break;
895
896
/* @[7]*/
897
case PHYDM_H2C_FW_TRACE_EN:
898
899
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
900
901
platform_h2c_id = H2C_FW_TRACE_EN;
902
903
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
904
905
platform_h2c_id = 0x49;
906
907
#elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
908
#if ((RTL8881A_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1) || (RTL8197F_SUPPORT == 1) || (RTL8192F_SUPPORT == 1)) /*@jj add 20170822*/
909
if (dm->support_ic_type == ODM_RTL8881A || dm->support_ic_type == ODM_RTL8192E || dm->support_ic_type & PHYDM_IC_3081_SERIES)
910
platform_h2c_id = H2C_88XX_FW_TRACE_EN;
911
else
912
#endif
913
#if (RTL8812A_SUPPORT == 1)
914
if (dm->support_ic_type == ODM_RTL8812)
915
platform_h2c_id = H2C_8812_FW_TRACE_EN;
916
else
917
#endif
918
{
919
}
920
921
#endif
922
923
break;
924
925
case PHYDM_H2C_TXBF:
926
#if ((RTL8192E_SUPPORT == 1) || (RTL8812A_SUPPORT == 1))
927
platform_h2c_id = 0x41; /*@H2C_TxBF*/
928
#endif
929
break;
930
931
case PHYDM_H2C_MU:
932
#if (RTL8822B_SUPPORT == 1)
933
platform_h2c_id = 0x4a; /*@H2C_MU*/
934
#endif
935
break;
936
937
default:
938
platform_h2c_id = phydm_h2c_id;
939
break;
940
}
941
942
return platform_h2c_id;
943
}
944
945
/*@ODM FW relative API.*/
946
947
void odm_fill_h2c_cmd(struct dm_struct *dm, u8 phydm_h2c_id, u32 cmd_len,
948
u8 *cmd_buf)
949
{
950
#if (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
951
struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
952
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
953
struct rtw_dev *rtwdev = dm->adapter;
954
u8 cmd_id, cmd_class;
955
u8 h2c_pkt[8];
956
#else
957
void *adapter = dm->adapter;
958
#endif
959
u8 h2c_id = phydm_trans_h2c_id(dm, phydm_h2c_id);
960
961
PHYDM_DBG(dm, DBG_RA, "[H2C] h2c_id=((0x%x))\n", h2c_id);
962
963
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
964
if (dm->support_ic_type == ODM_RTL8188E) {
965
if (!dm->ra_support88e)
966
FillH2CCmd88E(adapter, h2c_id, cmd_len, cmd_buf);
967
} else if (dm->support_ic_type == ODM_RTL8814A)
968
FillH2CCmd8814A(adapter, h2c_id, cmd_len, cmd_buf);
969
else if (dm->support_ic_type == ODM_RTL8822B)
970
FillH2CCmd8822B(adapter, h2c_id, cmd_len, cmd_buf);
971
else
972
FillH2CCmd(adapter, h2c_id, cmd_len, cmd_buf);
973
974
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
975
976
#ifdef DM_ODM_CE_MAC80211
977
rtlpriv->cfg->ops->fill_h2c_cmd(rtlpriv->hw, h2c_id, cmd_len, cmd_buf);
978
#elif defined(DM_ODM_CE_MAC80211_V2)
979
cmd_id = phydm_h2c_id & 0x1f;
980
cmd_class = (phydm_h2c_id >> RTW_H2C_CLASS_OFFSET) & 0x7;
981
memcpy(h2c_pkt + 1, cmd_buf, 7);
982
h2c_pkt[0] = phydm_h2c_id;
983
rtw_fw_send_h2c_packet(rtwdev, h2c_pkt, cmd_id, cmd_class);
984
/* TODO: implement fill h2c command for rtwlan */
985
#else
986
rtw_hal_fill_h2c_cmd(adapter, h2c_id, cmd_len, cmd_buf);
987
#endif
988
989
#elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
990
991
#if (RTL8812A_SUPPORT == 1)
992
if (dm->support_ic_type == ODM_RTL8812) {
993
fill_h2c_cmd8812(dm->priv, h2c_id, cmd_len, cmd_buf);
994
} else
995
#endif
996
{
997
GET_HAL_INTERFACE(dm->priv)->fill_h2c_cmd_handler(dm->priv, h2c_id, cmd_len, cmd_buf);
998
}
999
1000
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
1001
rtw_hal_fill_h2c_cmd(adapter, h2c_id, cmd_len, cmd_buf);
1002
1003
#endif
1004
}
1005
1006
u8 phydm_c2H_content_parsing(void *dm_void, u8 c2h_cmd_id, u8 c2h_cmd_len,
1007
u8 *tmp_buf)
1008
{
1009
struct dm_struct *dm = (struct dm_struct *)dm_void;
1010
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1011
void *adapter = dm->adapter;
1012
#endif
1013
u8 extend_c2h_sub_id = 0;
1014
u8 find_c2h_cmd = true;
1015
1016
if (c2h_cmd_len > 12 || c2h_cmd_len == 0) {
1017
pr_debug("[Warning] Error C2H ID=%d, len=%d\n",
1018
c2h_cmd_id, c2h_cmd_len);
1019
1020
find_c2h_cmd = false;
1021
return find_c2h_cmd;
1022
}
1023
1024
switch (c2h_cmd_id) {
1025
case PHYDM_C2H_DBG:
1026
phydm_fw_trace_handler(dm, tmp_buf, c2h_cmd_len);
1027
break;
1028
1029
case PHYDM_C2H_RA_RPT:
1030
phydm_c2h_ra_report_handler(dm, tmp_buf, c2h_cmd_len);
1031
break;
1032
1033
case PHYDM_C2H_RA_PARA_RPT:
1034
odm_c2h_ra_para_report_handler(dm, tmp_buf, c2h_cmd_len);
1035
break;
1036
#ifdef CONFIG_PATH_DIVERSITY
1037
case PHYDM_C2H_DYNAMIC_TX_PATH_RPT:
1038
if (dm->support_ic_type & (ODM_RTL8814A))
1039
phydm_c2h_dtp_handler(dm, tmp_buf, c2h_cmd_len);
1040
break;
1041
#endif
1042
1043
case PHYDM_C2H_IQK_FINISH:
1044
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1045
1046
if (dm->support_ic_type & (ODM_RTL8812 | ODM_RTL8821)) {
1047
RT_TRACE(COMP_MP, DBG_LOUD, ("== FW IQK Finish ==\n"));
1048
odm_acquire_spin_lock(dm, RT_IQK_SPINLOCK);
1049
dm->rf_calibrate_info.is_iqk_in_progress = false;
1050
odm_release_spin_lock(dm, RT_IQK_SPINLOCK);
1051
dm->rf_calibrate_info.iqk_progressing_time = 0;
1052
dm->rf_calibrate_info.iqk_progressing_time = odm_get_progressing_time(dm, dm->rf_calibrate_info.iqk_start_time);
1053
}
1054
1055
#endif
1056
break;
1057
1058
case PHYDM_C2H_CLM_MONITOR:
1059
phydm_clm_c2h_report_handler(dm, tmp_buf, c2h_cmd_len);
1060
break;
1061
1062
case PHYDM_C2H_DBG_CODE:
1063
phydm_fw_trace_handler_code(dm, tmp_buf, c2h_cmd_len);
1064
break;
1065
1066
case PHYDM_C2H_EXTEND:
1067
extend_c2h_sub_id = tmp_buf[0];
1068
if (extend_c2h_sub_id == PHYDM_EXTEND_C2H_DBG_PRINT)
1069
phydm_fw_trace_handler_8051(dm, tmp_buf, c2h_cmd_len);
1070
1071
break;
1072
1073
default:
1074
find_c2h_cmd = false;
1075
break;
1076
}
1077
1078
return find_c2h_cmd;
1079
}
1080
1081
u64 odm_get_current_time(struct dm_struct *dm)
1082
{
1083
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
1084
return (u64)rtw_get_current_time();
1085
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
1086
return jiffies;
1087
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
1088
return jiffies;
1089
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
1090
return rtw_get_current_time();
1091
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
1092
return PlatformGetCurrentTime();
1093
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
1094
return rtw_get_current_time();
1095
#endif
1096
}
1097
1098
u64 odm_get_progressing_time(struct dm_struct *dm, u64 start_time)
1099
{
1100
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
1101
return rtw_get_passing_time_ms((u32)start_time);
1102
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
1103
return jiffies_to_msecs(jiffies - start_time);
1104
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
1105
return jiffies_to_msecs(jiffies - start_time);
1106
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
1107
return rtw_get_passing_time_ms((systime)start_time);
1108
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
1109
return ((PlatformGetCurrentTime() - start_time) >> 10);
1110
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
1111
return rtw_get_passing_time_ms(start_time);
1112
#endif
1113
}
1114
1115
#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) && \
1116
(!defined(DM_ODM_CE_MAC80211) && !defined(DM_ODM_CE_MAC80211_V2))
1117
1118
void phydm_set_hw_reg_handler_interface(struct dm_struct *dm, u8 RegName,
1119
u8 *val)
1120
{
1121
#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
1122
struct _ADAPTER *adapter = dm->adapter;
1123
1124
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
1125
((PADAPTER)adapter)->HalFunc.SetHwRegHandler(adapter, RegName, val);
1126
#else
1127
adapter->hal_func.set_hw_reg_handler(adapter, RegName, val);
1128
#endif
1129
1130
#endif
1131
}
1132
1133
void phydm_get_hal_def_var_handler_interface(struct dm_struct *dm,
1134
enum _HAL_DEF_VARIABLE e_variable,
1135
void *value)
1136
{
1137
#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
1138
struct _ADAPTER *adapter = dm->adapter;
1139
1140
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
1141
((PADAPTER)adapter)->HalFunc.GetHalDefVarHandler(adapter, e_variable, value);
1142
#else
1143
adapter->hal_func.get_hal_def_var_handler(adapter, e_variable, value);
1144
#endif
1145
1146
#endif
1147
}
1148
1149
#endif
1150
1151
void odm_set_tx_power_index_by_rate_section(struct dm_struct *dm,
1152
enum rf_path path, u8 ch,
1153
u8 section)
1154
{
1155
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
1156
void *adapter = dm->adapter;
1157
PHY_SetTxPowerIndexByRateSection(adapter, path, ch, section);
1158
#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) && defined(DM_ODM_CE_MAC80211)
1159
void *adapter = dm->adapter;
1160
1161
phy_set_tx_power_index_by_rs(adapter, ch, path, section);
1162
#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
1163
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
1164
phy_set_tx_power_index_by_rate_section(dm->adapter, path, ch, section);
1165
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
1166
void *adapter = dm->adapter;
1167
1168
PHY_SetTxPowerIndexByRateSection(adapter, path, ch, section);
1169
#endif
1170
}
1171
1172
u8 odm_get_tx_power_index(struct dm_struct *dm, enum rf_path path, u8 rate,
1173
u8 bw, u8 ch)
1174
{
1175
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
1176
void *adapter = dm->adapter;
1177
1178
return PHY_GetTxPowerIndex(dm->adapter, path, rate, (CHANNEL_WIDTH)bw, ch);
1179
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
1180
void *adapter = dm->adapter;
1181
1182
return phy_get_tx_power_index(adapter, path, rate, bw, ch);
1183
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
1184
void *adapter = dm->adapter;
1185
1186
return phy_get_tx_power_index(adapter, path, rate, bw, ch);
1187
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
1188
return phy_get_tx_power_index(dm->adapter, path, rate, bw, ch);
1189
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
1190
void *adapter = dm->adapter;
1191
1192
return PHY_GetTxPowerIndex(dm->adapter, path, rate, bw, ch);
1193
#endif
1194
}
1195
1196
u8 odm_efuse_one_byte_read(struct dm_struct *dm, u16 addr, u8 *data,
1197
boolean b_pseu_do_test)
1198
{
1199
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
1200
void *adapter = dm->adapter;
1201
1202
return (u8)EFUSE_OneByteRead(adapter, addr, data, b_pseu_do_test);
1203
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
1204
void *adapter = dm->adapter;
1205
1206
return rtl_efuse_onebyte_read(adapter, addr, data, b_pseu_do_test);
1207
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
1208
return -1;
1209
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
1210
return efuse_onebyte_read(dm->adapter, addr, data, b_pseu_do_test);
1211
#elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
1212
return Efuse_OneByteRead(dm, addr, data);
1213
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
1214
void *adapter = dm->adapter;
1215
1216
return (u8)efuse_OneByteRead(adapter, addr, data, b_pseu_do_test);
1217
#endif
1218
}
1219
1220
void odm_efuse_logical_map_read(struct dm_struct *dm, u8 type, u16 offset,
1221
u32 *data)
1222
{
1223
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
1224
void *adapter = dm->adapter;
1225
1226
EFUSE_ShadowRead(adapter, type, offset, data);
1227
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
1228
void *adapter = dm->adapter;
1229
1230
rtl_efuse_logical_map_read(adapter, type, offset, data);
1231
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
1232
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
1233
efuse_logical_map_read(dm->adapter, type, offset, data);
1234
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
1235
void *adapter = dm->adapter;
1236
1237
EFUSE_ShadowRead(adapter, type, offset, data);
1238
#endif
1239
}
1240
1241
enum hal_status
1242
odm_iq_calibrate_by_fw(struct dm_struct *dm, u8 clear, u8 segment)
1243
{
1244
enum hal_status iqk_result = HAL_STATUS_FAILURE;
1245
1246
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
1247
struct _ADAPTER *adapter = dm->adapter;
1248
1249
if (HAL_MAC_FWIQK_Trigger(&GET_HAL_MAC_INFO(adapter), clear, segment) == 0)
1250
iqk_result = HAL_STATUS_SUCCESS;
1251
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
1252
#if (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
1253
void *adapter = dm->adapter;
1254
1255
iqk_result = rtl_phydm_fw_iqk(adapter, clear, segment);
1256
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
1257
#else
1258
iqk_result = rtw_phydm_fw_iqk(dm, clear, segment);
1259
#endif
1260
#elif (DM_ODM_SUPPORT_TYPE & ODM_IOT)
1261
iqk_result = rtw_phydm_fw_iqk(dm, clear, segment);
1262
#endif
1263
return iqk_result;
1264
}
1265
1266
enum hal_status
1267
odm_dpk_by_fw(struct dm_struct *dm)
1268
{
1269
enum hal_status dpk_result = HAL_STATUS_FAILURE;
1270
#if 0
1271
1272
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
1273
struct _ADAPTER *adapter = dm->adapter;
1274
1275
if (HAL_MAC_FWDPK_Trigger(&GET_HAL_MAC_INFO(adapter)) == 0)
1276
dpk_result = HAL_STATUS_SUCCESS;
1277
#else
1278
dpk_result = rtw_phydm_fw_dpk(dm);
1279
#endif
1280
1281
#endif
1282
return dpk_result;
1283
}
1284
1285
void phydm_cmn_sta_info_hook(struct dm_struct *dm, u8 mac_id,
1286
struct cmn_sta_info *pcmn_sta_info)
1287
{
1288
dm->phydm_sta_info[mac_id] = pcmn_sta_info;
1289
1290
if (is_sta_active(pcmn_sta_info))
1291
dm->phydm_macid_table[pcmn_sta_info->mac_id] = mac_id;
1292
}
1293
1294
void phydm_macid2sta_idx_table(struct dm_struct *dm, u8 entry_idx,
1295
struct cmn_sta_info *pcmn_sta_info)
1296
{
1297
if (is_sta_active(pcmn_sta_info))
1298
dm->phydm_macid_table[pcmn_sta_info->mac_id] = entry_idx;
1299
}
1300
1301
void phydm_add_interrupt_mask_handler(struct dm_struct *dm, u8 interrupt_type)
1302
{
1303
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1304
#elif (DM_ODM_SUPPORT_TYPE == ODM_AP)
1305
1306
struct rtl8192cd_priv *priv = dm->priv;
1307
1308
#if IS_EXIST_PCI || IS_EXIST_EMBEDDED
1309
if (dm->support_interface == ODM_ITRF_PCIE)
1310
GET_HAL_INTERFACE(priv)->AddInterruptMaskHandler(priv,
1311
interrupt_type)
1312
;
1313
#endif
1314
1315
#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
1316
#endif
1317
}
1318
1319
void phydm_enable_rx_related_interrupt_handler(struct dm_struct *dm)
1320
{
1321
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1322
#elif (DM_ODM_SUPPORT_TYPE == ODM_AP)
1323
1324
struct rtl8192cd_priv *priv = dm->priv;
1325
1326
#if IS_EXIST_PCI || IS_EXIST_EMBEDDED
1327
if (dm->support_interface == ODM_ITRF_PCIE)
1328
GET_HAL_INTERFACE(priv)->EnableRxRelatedInterruptHandler(priv);
1329
#endif
1330
1331
#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
1332
#endif
1333
}
1334
1335
#if 0
1336
boolean
1337
phydm_get_txbf_en(
1338
struct dm_struct *dm,
1339
u16 mac_id,
1340
u8 i
1341
)
1342
{
1343
boolean txbf_en = false;
1344
1345
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
1346
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && !defined(DM_ODM_CE_MAC80211)
1347
1348
#ifdef CONFIG_BEAMFORMING
1349
enum beamforming_cap beamform_cap;
1350
void *adapter = dm->adapter;
1351
#ifdef PHYDM_BEAMFORMING_SUPPORT
1352
beamform_cap =
1353
phydm_beamforming_get_entry_beam_cap_by_mac_id(dm, mac_id);
1354
#else/*@for drv beamforming*/
1355
beamform_cap =
1356
beamforming_get_entry_beam_cap_by_mac_id(&adapter->mlmepriv, mac_id);
1357
#endif
1358
if (beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT | BEAMFORMER_CAP_VHT_SU))
1359
txbf_en = true;
1360
else
1361
txbf_en = false;
1362
#endif /*@#ifdef CONFIG_BEAMFORMING*/
1363
1364
#elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
1365
1366
#ifdef PHYDM_BEAMFORMING_SUPPORT
1367
u8 idx = 0xff;
1368
boolean act_bfer = false;
1369
BEAMFORMING_CAP beamform_cap = BEAMFORMING_CAP_NONE;
1370
PRT_BEAMFORMING_ENTRY entry = NULL;
1371
struct rtl8192cd_priv *priv = dm->priv;
1372
#if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
1373
struct _BF_DIV_COEX_ *dm_bdc_table = &dm->dm_bdc_table;
1374
1375
dm_bdc_table->num_txbfee_client = 0;
1376
dm_bdc_table->num_txbfer_client = 0;
1377
#endif
1378
#endif
1379
1380
#ifdef PHYDM_BEAMFORMING_SUPPORT
1381
beamform_cap = Beamforming_GetEntryBeamCapByMacId(priv, mac_id);
1382
entry = Beamforming_GetEntryByMacId(priv, mac_id, &idx);
1383
if (beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT | BEAMFORMER_CAP_VHT_SU)) {
1384
if (entry->Sounding_En)
1385
txbf_en = true;
1386
else
1387
txbf_en = false;
1388
act_bfer = true;
1389
}
1390
#if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY)) /*@BDC*/
1391
if (act_bfer == true) {
1392
dm_bdc_table->w_bfee_client[i] = true; /* @AP act as BFer */
1393
dm_bdc_table->num_txbfee_client++;
1394
} else
1395
dm_bdc_table->w_bfee_client[i] = false; /* @AP act as BFer */
1396
1397
if (beamform_cap & (BEAMFORMEE_CAP_HT_EXPLICIT | BEAMFORMEE_CAP_VHT_SU)) {
1398
dm_bdc_table->w_bfer_client[i] = true; /* @AP act as BFee */
1399
dm_bdc_table->num_txbfer_client++;
1400
} else
1401
dm_bdc_table->w_bfer_client[i] = false; /* @AP act as BFer */
1402
1403
#endif
1404
#endif
1405
1406
#endif
1407
return txbf_en;
1408
}
1409
#endif
1410
1411
void phydm_iqk_wait(struct dm_struct *dm, u32 timeout)
1412
{
1413
#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
1414
#if (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
1415
PHYDM_DBG(dm, DBG_CMN, "Not support for CE MAC80211 driver!\n");
1416
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211_V2)
1417
#else
1418
void *adapter = dm->adapter;
1419
1420
rtl8812_iqk_wait(adapter, timeout);
1421
#endif
1422
#endif
1423
}
1424
1425
u8 phydm_get_hwrate_to_mrate(struct dm_struct *dm, u8 rate)
1426
{
1427
#if (DM_ODM_SUPPORT_TYPE == ODM_IOT)
1428
return HwRateToMRate(rate);
1429
#endif
1430
return 0;
1431
}
1432
1433
void phydm_set_crystalcap(struct dm_struct *dm, u8 crystal_cap)
1434
{
1435
#if (DM_ODM_SUPPORT_TYPE == ODM_IOT)
1436
ROM_odm_SetCrystalCap(dm, crystal_cap);
1437
#endif
1438
}
1439
1440
void phydm_run_in_thread_cmd(struct dm_struct *dm, void (*func)(void *),
1441
void *context)
1442
{
1443
#if (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
1444
PHYDM_DBG(dm, DBG_CMN, "Not support for CE MAC80211 driver!\n");
1445
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
1446
void *adapter = dm->adapter;
1447
1448
rtw_run_in_thread_cmd(adapter, func, context);
1449
#endif
1450
}
1451
1452
u8 phydm_get_tx_rate(struct dm_struct *dm)
1453
{
1454
struct _hal_rf_ *rf = &dm->rf_table;
1455
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
1456
struct _ADAPTER *adapter = dm->adapter;
1457
#endif
1458
u8 tx_rate = 0xff;
1459
u8 mpt_rate_index = 0;
1460
1461
if (*dm->mp_mode == 1) {
1462
#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
1463
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
1464
#if (MP_DRIVER == 1)
1465
PMPT_CONTEXT p_mpt_ctx = &adapter->MptCtx;
1466
1467
tx_rate = MptToMgntRate(p_mpt_ctx->MptRateIndex);
1468
#endif
1469
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
1470
#ifdef CONFIG_MP_INCLUDED
1471
if (rf->mp_rate_index)
1472
mpt_rate_index = *rf->mp_rate_index;
1473
1474
tx_rate = mpt_to_mgnt_rate(mpt_rate_index);
1475
#endif
1476
#endif
1477
#endif
1478
} else {
1479
u16 rate = *dm->forced_data_rate;
1480
1481
if (!rate) { /*auto rate*/
1482
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
1483
struct _ADAPTER *adapter = dm->adapter;
1484
1485
tx_rate = ((PADAPTER)adapter)->HalFunc.GetHwRateFromMRateHandler(dm->tx_rate);
1486
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
1487
tx_rate = dm->tx_rate;
1488
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
1489
if (dm->number_linked_client != 0)
1490
tx_rate = hw_rate_to_m_rate(dm->tx_rate);
1491
else
1492
tx_rate = rf->p_rate_index;
1493
#endif
1494
} else { /*force rate*/
1495
tx_rate = (u8)rate;
1496
}
1497
}
1498
1499
return tx_rate;
1500
}
1501
1502
u8 phydm_get_tx_power_dbm(struct dm_struct *dm, u8 rf_path,
1503
u8 rate, u8 bandwidth, u8 channel)
1504
{
1505
u8 tx_power_dbm = 0;
1506
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1507
struct _ADAPTER *adapter = dm->adapter;
1508
tx_power_dbm = PHY_GetTxPowerFinalAbsoluteValue(adapter, rf_path, rate, bandwidth, channel);
1509
#endif
1510
1511
#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
1512
tx_power_dbm = phy_get_tx_power_final_absolute_value(dm->adapter, rf_path, rate, bandwidth, channel);
1513
#endif
1514
1515
#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
1516
tx_power_dbm = PHY_GetTxPowerFinalAbsoluteValue(dm, rf_path, rate, bandwidth, channel);
1517
#endif
1518
return tx_power_dbm;
1519
}
1520
1521
u64 phydm_division64(u64 x, u64 y)
1522
{
1523
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
1524
do_div(x, y);
1525
return x;
1526
#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
1527
return x / y;
1528
#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
1529
return rtw_division64(x, y);
1530
#endif
1531
}
1532
1533