Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nu11secur1ty
GitHub Repository: nu11secur1ty/Kali-Linux
Path: blob/master/ALFA-W1F1/RTL8814AU/core/efuse/rtw_efuse.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
*****************************************************************************/
15
#define _RTW_EFUSE_C_
16
17
#include <drv_types.h>
18
#include <hal_data.h>
19
20
#include "../hal/efuse/efuse_mask.h"
21
22
/*------------------------Define local variable------------------------------*/
23
u8 fakeEfuseBank = {0};
24
u32 fakeEfuseUsedBytes = {0};
25
u8 fakeEfuseContent[EFUSE_MAX_HW_SIZE] = {0};
26
u8 fakeEfuseInitMap[EFUSE_MAX_MAP_LEN] = {0};
27
u8 fakeEfuseModifiedMap[EFUSE_MAX_MAP_LEN] = {0};
28
29
u32 BTEfuseUsedBytes = {0};
30
u8 BTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE];
31
u8 BTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN] = {0};
32
u8 BTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN] = {0};
33
34
u32 fakeBTEfuseUsedBytes = {0};
35
u8 fakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE];
36
u8 fakeBTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN] = {0};
37
u8 fakeBTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN] = {0};
38
39
u8 maskfileBuffer[64];
40
u8 btmaskfileBuffer[64];
41
42
/*------------------------Define local variable------------------------------*/
43
BOOLEAN rtw_file_efuse_IsMasked(PADAPTER pAdapter, u16 Offset, u8 *maskbuf)
44
{
45
int r = Offset / 16;
46
int c = (Offset % 16) / 2;
47
int result = 0;
48
49
if (pAdapter->registrypriv.boffefusemask)
50
return FALSE;
51
52
if (c < 4) /* Upper double word */
53
result = (maskbuf[r] & (0x10 << c));
54
else
55
result = (maskbuf[r] & (0x01 << (c - 4)));
56
57
return (result > 0) ? 0 : 1;
58
}
59
BOOLEAN efuse_IsBT_Masked(PADAPTER pAdapter, u16 Offset)
60
{
61
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);
62
63
if (pAdapter->registrypriv.boffefusemask)
64
return FALSE;
65
66
#ifdef CONFIG_BT_EFUSE_MASK
67
#ifdef CONFIG_USB_HCI
68
if (IS_HARDWARE_TYPE_8822C(pAdapter))
69
return (IS_BT_MASKED(8822C, _MUSB, Offset)) ? TRUE : FALSE;
70
#endif
71
#ifdef CONFIG_PCI_HCI
72
if (IS_HARDWARE_TYPE_8822C(pAdapter))
73
return (IS_BT_MASKED(8822C, _MPCIE, Offset)) ? TRUE : FALSE;
74
#endif
75
#ifdef CONFIG_SDIO_HCI
76
if (IS_HARDWARE_TYPE_8822C(pAdapter))
77
return (IS_BT_MASKED(8822C, _MSDIO, Offset)) ? TRUE : FALSE;
78
#endif
79
#endif /* CONFIG_BT_EFUSE_MASK */
80
return FALSE;
81
}
82
83
void rtw_bt_efuse_mask_array(PADAPTER pAdapter, u8 *pArray)
84
{
85
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);
86
87
#ifdef CONFIG_BT_EFUSE_MASK
88
#ifdef CONFIG_USB_HCI
89
if (IS_HARDWARE_TYPE_8822CU(pAdapter))
90
GET_MASK_ARRAY(8822C, _MUSB, pArray);
91
#endif
92
#ifdef CONFIG_PCI_HCI
93
if (IS_HARDWARE_TYPE_8822CE(pAdapter))
94
GET_MASK_ARRAY(8822C, _MPCIE, pArray);
95
#endif
96
#ifdef CONFIG_SDIO_HCI
97
if (IS_HARDWARE_TYPE_8822CS(pAdapter))
98
GET_MASK_ARRAY(8822C, _MSDIO, pArray);
99
#endif
100
#endif /* CONFIG_BT_EFUSE_MASK */
101
102
}
103
104
u16 rtw_get_bt_efuse_mask_arraylen(PADAPTER pAdapter)
105
{
106
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
107
108
#ifdef CONFIG_BT_EFUSE_MASK
109
#ifdef CONFIG_USB_HCI
110
if (IS_HARDWARE_TYPE_8822CU(pAdapter))
111
return GET_BT_MASK_ARRAY_LEN(8822C, _MUSB);
112
#endif
113
#ifdef CONFIG_PCI_HCI
114
if (IS_HARDWARE_TYPE_8822CE(pAdapter))
115
return GET_BT_MASK_ARRAY_LEN(8822C, _MPCIE);
116
#endif
117
#ifdef CONFIG_SDIO_HCI
118
if (IS_HARDWARE_TYPE_8822CS(pAdapter))
119
return GET_BT_MASK_ARRAY_LEN(8822C, _MSDIO);
120
#endif
121
#endif /* CONFIG_BT_EFUSE_MASK */
122
123
return 0;
124
}
125
126
BOOLEAN efuse_IsMasked(PADAPTER pAdapter, u16 Offset)
127
{
128
129
if (pAdapter->registrypriv.boffefusemask)
130
return FALSE;
131
132
#ifdef CONFIG_USB_HCI
133
#if defined(CONFIG_RTL8188E)
134
if (IS_HARDWARE_TYPE_8188E(pAdapter))
135
return (IS_MASKED(8188E, _MUSB, Offset)) ? TRUE : FALSE;
136
#endif
137
#if defined(CONFIG_RTL8812A)
138
if (IS_HARDWARE_TYPE_8812(pAdapter))
139
return (IS_MASKED(8812A, _MUSB, Offset)) ? TRUE : FALSE;
140
#endif
141
#if defined(CONFIG_RTL8821A)
142
#if 0
143
if (IS_HARDWARE_TYPE_8811AU(pAdapter))
144
return (IS_MASKED(8811A, _MUSB, Offset)) ? TRUE : FALSE;
145
#endif
146
if (IS_HARDWARE_TYPE_8821(pAdapter))
147
return (IS_MASKED(8821A, _MUSB, Offset)) ? TRUE : FALSE;
148
#endif
149
#if defined(CONFIG_RTL8192E)
150
if (IS_HARDWARE_TYPE_8192E(pAdapter))
151
return (IS_MASKED(8192E, _MUSB, Offset)) ? TRUE : FALSE;
152
#endif
153
#if defined(CONFIG_RTL8723B)
154
if (IS_HARDWARE_TYPE_8723B(pAdapter))
155
return (IS_MASKED(8723B, _MUSB, Offset)) ? TRUE : FALSE;
156
#endif
157
#if defined(CONFIG_RTL8703B)
158
if (IS_HARDWARE_TYPE_8703B(pAdapter))
159
return (IS_MASKED(8703B, _MUSB, Offset)) ? TRUE : FALSE;
160
#endif
161
#if defined(CONFIG_RTL8814A)
162
if (IS_HARDWARE_TYPE_8814A(pAdapter))
163
return (IS_MASKED(8814A, _MUSB, Offset)) ? TRUE : FALSE;
164
#endif
165
#if defined(CONFIG_RTL8188F)
166
if (IS_HARDWARE_TYPE_8188F(pAdapter))
167
return (IS_MASKED(8188F, _MUSB, Offset)) ? TRUE : FALSE;
168
#endif
169
#if defined(CONFIG_RTL8188GTV)
170
if (IS_HARDWARE_TYPE_8188GTV(pAdapter))
171
return (IS_MASKED(8188GTV, _MUSB, Offset)) ? TRUE : FALSE;
172
#endif
173
#if defined(CONFIG_RTL8822B)
174
if (IS_HARDWARE_TYPE_8822B(pAdapter))
175
return (IS_MASKED(8822B, _MUSB, Offset)) ? TRUE : FALSE;
176
#endif
177
#if defined(CONFIG_RTL8723D)
178
if (IS_HARDWARE_TYPE_8723D(pAdapter))
179
return (IS_MASKED(8723D, _MUSB, Offset)) ? TRUE : FALSE;
180
#endif
181
#if defined(CONFIG_RTL8710B)
182
if (IS_HARDWARE_TYPE_8710B(pAdapter))
183
return (IS_MASKED(8710B, _MUSB, Offset)) ? TRUE : FALSE;
184
#endif
185
#if defined(CONFIG_RTL8821C)
186
if (IS_HARDWARE_TYPE_8821CU(pAdapter))
187
return (IS_MASKED(8821C, _MUSB, Offset)) ? TRUE : FALSE;
188
#endif
189
190
#if defined(CONFIG_RTL8192F)
191
if (IS_HARDWARE_TYPE_8192FU(pAdapter))
192
return (IS_MASKED(8192F, _MUSB, Offset)) ? TRUE : FALSE;
193
#endif
194
#if defined(CONFIG_RTL8822C)
195
if (IS_HARDWARE_TYPE_8822C(pAdapter))
196
return (IS_MASKED(8822C, _MUSB, Offset)) ? TRUE : FALSE;
197
#endif
198
#if defined(CONFIG_RTL8814B)
199
if (IS_HARDWARE_TYPE_8814B(pAdapter))
200
return (IS_MASKED(8814B, _MUSB, Offset)) ? TRUE : FALSE;
201
#endif
202
#endif /*CONFIG_USB_HCI*/
203
204
#ifdef CONFIG_PCI_HCI
205
#if defined(CONFIG_RTL8188E)
206
if (IS_HARDWARE_TYPE_8188E(pAdapter))
207
return (IS_MASKED(8188E, _MPCIE, Offset)) ? TRUE : FALSE;
208
#endif
209
#if defined(CONFIG_RTL8192E)
210
if (IS_HARDWARE_TYPE_8192E(pAdapter))
211
return (IS_MASKED(8192E, _MPCIE, Offset)) ? TRUE : FALSE;
212
#endif
213
#if defined(CONFIG_RTL8812A)
214
if (IS_HARDWARE_TYPE_8812(pAdapter))
215
return (IS_MASKED(8812A, _MPCIE, Offset)) ? TRUE : FALSE;
216
#endif
217
#if defined(CONFIG_RTL8821A)
218
if (IS_HARDWARE_TYPE_8821(pAdapter))
219
return (IS_MASKED(8821A, _MPCIE, Offset)) ? TRUE : FALSE;
220
#endif
221
#if defined(CONFIG_RTL8723B)
222
if (IS_HARDWARE_TYPE_8723B(pAdapter))
223
return (IS_MASKED(8723B, _MPCIE, Offset)) ? TRUE : FALSE;
224
#endif
225
#if defined(CONFIG_RTL8814A)
226
if (IS_HARDWARE_TYPE_8814A(pAdapter))
227
return (IS_MASKED(8814A, _MPCIE, Offset)) ? TRUE : FALSE;
228
#endif
229
#if defined(CONFIG_RTL8822B)
230
if (IS_HARDWARE_TYPE_8822B(pAdapter))
231
return (IS_MASKED(8822B, _MPCIE, Offset)) ? TRUE : FALSE;
232
#endif
233
#if defined(CONFIG_RTL8821C)
234
if (IS_HARDWARE_TYPE_8821CE(pAdapter))
235
return (IS_MASKED(8821C, _MPCIE, Offset)) ? TRUE : FALSE;
236
#endif
237
238
#if defined(CONFIG_RTL8192F)
239
if (IS_HARDWARE_TYPE_8192FE(pAdapter))
240
return (IS_MASKED(8192F, _MPCIE, Offset)) ? TRUE : FALSE;
241
#endif
242
#if defined(CONFIG_RTL8822C)
243
if (IS_HARDWARE_TYPE_8822C(pAdapter))
244
return (IS_MASKED(8822C, _MPCIE, Offset)) ? TRUE : FALSE;
245
#endif
246
#if defined(CONFIG_RTL8814B)
247
if (IS_HARDWARE_TYPE_8814B(pAdapter))
248
return (IS_MASKED(8814B, _MPCIE, Offset)) ? TRUE : FALSE;
249
#endif
250
#endif /*CONFIG_PCI_HCI*/
251
252
#ifdef CONFIG_SDIO_HCI
253
#ifdef CONFIG_RTL8188E_SDIO
254
if (IS_HARDWARE_TYPE_8188E(pAdapter))
255
return (IS_MASKED(8188E, _MSDIO, Offset)) ? TRUE : FALSE;
256
#endif
257
#ifdef CONFIG_RTL8723B
258
if (IS_HARDWARE_TYPE_8723BS(pAdapter))
259
return (IS_MASKED(8723B, _MSDIO, Offset)) ? TRUE : FALSE;
260
#endif
261
#ifdef CONFIG_RTL8188F
262
if (IS_HARDWARE_TYPE_8188F(pAdapter))
263
return (IS_MASKED(8188F, _MSDIO, Offset)) ? TRUE : FALSE;
264
#endif
265
#ifdef CONFIG_RTL8188GTV
266
if (IS_HARDWARE_TYPE_8188GTV(pAdapter))
267
return (IS_MASKED(8188GTV, _MSDIO, Offset)) ? TRUE : FALSE;
268
#endif
269
#ifdef CONFIG_RTL8192E
270
if (IS_HARDWARE_TYPE_8192ES(pAdapter))
271
return (IS_MASKED(8192E, _MSDIO, Offset)) ? TRUE : FALSE;
272
#endif
273
#if defined(CONFIG_RTL8821A)
274
if (IS_HARDWARE_TYPE_8821S(pAdapter))
275
return (IS_MASKED(8821A, _MSDIO, Offset)) ? TRUE : FALSE;
276
#endif
277
#if defined(CONFIG_RTL8821C)
278
if (IS_HARDWARE_TYPE_8821CS(pAdapter))
279
return (IS_MASKED(8821C, _MSDIO, Offset)) ? TRUE : FALSE;
280
#endif
281
#if defined(CONFIG_RTL8822B)
282
if (IS_HARDWARE_TYPE_8822B(pAdapter))
283
return (IS_MASKED(8822B, _MSDIO, Offset)) ? TRUE : FALSE;
284
#endif
285
#if defined(CONFIG_RTL8192F)
286
if (IS_HARDWARE_TYPE_8192FS(pAdapter))
287
return (IS_MASKED(8192F, _MSDIO, Offset)) ? TRUE : FALSE;
288
#endif
289
#if defined(CONFIG_RTL8822C)
290
if (IS_HARDWARE_TYPE_8822C(pAdapter))
291
return (IS_MASKED(8822C, _MSDIO, Offset)) ? TRUE : FALSE;
292
#endif
293
#endif /*CONFIG_SDIO_HCI*/
294
295
return FALSE;
296
}
297
298
void rtw_efuse_mask_array(PADAPTER pAdapter, u8 *pArray)
299
{
300
301
#ifdef CONFIG_USB_HCI
302
#if defined(CONFIG_RTL8188E)
303
if (IS_HARDWARE_TYPE_8188E(pAdapter))
304
GET_MASK_ARRAY(8188E, _MUSB, pArray);
305
#endif
306
#if defined(CONFIG_RTL8812A)
307
if (IS_HARDWARE_TYPE_8812(pAdapter))
308
GET_MASK_ARRAY(8812A, _MUSB, pArray);
309
#endif
310
#if defined(CONFIG_RTL8821A)
311
if (IS_HARDWARE_TYPE_8821(pAdapter))
312
GET_MASK_ARRAY(8821A, _MUSB, pArray);
313
#endif
314
#if defined(CONFIG_RTL8192E)
315
if (IS_HARDWARE_TYPE_8192E(pAdapter))
316
GET_MASK_ARRAY(8192E, _MUSB, pArray);
317
#endif
318
#if defined(CONFIG_RTL8723B)
319
if (IS_HARDWARE_TYPE_8723B(pAdapter))
320
GET_MASK_ARRAY(8723B, _MUSB, pArray);
321
#endif
322
#if defined(CONFIG_RTL8703B)
323
if (IS_HARDWARE_TYPE_8703B(pAdapter))
324
GET_MASK_ARRAY(8703B, _MUSB, pArray);
325
#endif
326
#if defined(CONFIG_RTL8188F)
327
if (IS_HARDWARE_TYPE_8188F(pAdapter))
328
GET_MASK_ARRAY(8188F, _MUSB, pArray);
329
#endif
330
#if defined(CONFIG_RTL8188GTV)
331
if (IS_HARDWARE_TYPE_8188GTV(pAdapter))
332
GET_MASK_ARRAY(8188GTV, _MUSB, pArray);
333
#endif
334
#if defined(CONFIG_RTL8814A)
335
if (IS_HARDWARE_TYPE_8814A(pAdapter))
336
GET_MASK_ARRAY(8814A, _MUSB, pArray);
337
#endif
338
#if defined(CONFIG_RTL8822B)
339
if (IS_HARDWARE_TYPE_8822B(pAdapter))
340
GET_MASK_ARRAY(8822B, _MUSB, pArray);
341
#endif
342
#if defined(CONFIG_RTL8821C)
343
if (IS_HARDWARE_TYPE_8821CU(pAdapter))
344
GET_MASK_ARRAY(8821C, _MUSB, pArray);
345
#endif
346
#if defined(CONFIG_RTL8192F)
347
if (IS_HARDWARE_TYPE_8192FU(pAdapter))
348
GET_MASK_ARRAY(8192F, _MUSB, pArray);
349
#endif
350
#if defined(CONFIG_RTL8822C)
351
if (IS_HARDWARE_TYPE_8822C(pAdapter))
352
GET_MASK_ARRAY(8822C, _MUSB, pArray);
353
#endif
354
#if defined(CONFIG_RTL8814B)
355
if (IS_HARDWARE_TYPE_8814B(pAdapter))
356
GET_MASK_ARRAY(8814B, _MUSB, pArray);
357
#endif
358
#endif /*CONFIG_USB_HCI*/
359
360
#ifdef CONFIG_PCI_HCI
361
#if defined(CONFIG_RTL8188E)
362
if (IS_HARDWARE_TYPE_8188E(pAdapter))
363
GET_MASK_ARRAY(8188E, _MPCIE, pArray);
364
#endif
365
#if defined(CONFIG_RTL8192E)
366
if (IS_HARDWARE_TYPE_8192E(pAdapter))
367
GET_MASK_ARRAY(8192E, _MPCIE, pArray);
368
#endif
369
#if defined(CONFIG_RTL8812A)
370
if (IS_HARDWARE_TYPE_8812(pAdapter))
371
GET_MASK_ARRAY(8812A, _MPCIE, pArray);
372
#endif
373
#if defined(CONFIG_RTL8821A)
374
if (IS_HARDWARE_TYPE_8821(pAdapter))
375
GET_MASK_ARRAY(8821A, _MPCIE, pArray);
376
#endif
377
#if defined(CONFIG_RTL8723B)
378
if (IS_HARDWARE_TYPE_8723B(pAdapter))
379
GET_MASK_ARRAY(8723B, _MPCIE, pArray);
380
#endif
381
#if defined(CONFIG_RTL8814A)
382
if (IS_HARDWARE_TYPE_8814A(pAdapter))
383
GET_MASK_ARRAY(8814A, _MPCIE, pArray);
384
#endif
385
#if defined(CONFIG_RTL8822B)
386
if (IS_HARDWARE_TYPE_8822B(pAdapter))
387
GET_MASK_ARRAY(8822B, _MPCIE, pArray);
388
#endif
389
#if defined(CONFIG_RTL8821C)
390
if (IS_HARDWARE_TYPE_8821CE(pAdapter))
391
GET_MASK_ARRAY(8821C, _MPCIE, pArray);
392
#endif
393
#if defined(CONFIG_RTL8192F)
394
if (IS_HARDWARE_TYPE_8192FE(pAdapter))
395
GET_MASK_ARRAY(8192F, _MPCIE, pArray);
396
#endif
397
#if defined(CONFIG_RTL8822C)
398
if (IS_HARDWARE_TYPE_8822C(pAdapter))
399
GET_MASK_ARRAY(8822C, _MPCIE, pArray);
400
#endif
401
#if defined(CONFIG_RTL8814B)
402
if (IS_HARDWARE_TYPE_8814B(pAdapter))
403
GET_MASK_ARRAY(8814B, _MPCIE, pArray);
404
#endif
405
#endif /*CONFIG_PCI_HCI*/
406
407
#ifdef CONFIG_SDIO_HCI
408
#if defined(CONFIG_RTL8188E)
409
if (IS_HARDWARE_TYPE_8188E(pAdapter))
410
GET_MASK_ARRAY(8188E, _MSDIO, pArray);
411
#endif
412
#if defined(CONFIG_RTL8723B)
413
if (IS_HARDWARE_TYPE_8723BS(pAdapter))
414
GET_MASK_ARRAY(8723B, _MSDIO, pArray);
415
#endif
416
#if defined(CONFIG_RTL8188F)
417
if (IS_HARDWARE_TYPE_8188F(pAdapter))
418
GET_MASK_ARRAY(8188F, _MSDIO, pArray);
419
#endif
420
#if defined(CONFIG_RTL8188GTV)
421
if (IS_HARDWARE_TYPE_8188GTV(pAdapter))
422
GET_MASK_ARRAY(8188GTV, _MSDIO, pArray);
423
#endif
424
#if defined(CONFIG_RTL8192E)
425
if (IS_HARDWARE_TYPE_8192ES(pAdapter))
426
GET_MASK_ARRAY(8192E, _MSDIO, pArray);
427
#endif
428
#if defined(CONFIG_RTL8821A)
429
if (IS_HARDWARE_TYPE_8821S(pAdapter))
430
GET_MASK_ARRAY(8821A, _MSDIO, pArray);
431
#endif
432
#if defined(CONFIG_RTL8821C)
433
if (IS_HARDWARE_TYPE_8821CS(pAdapter))
434
GET_MASK_ARRAY(8821C , _MSDIO, pArray);
435
#endif
436
#if defined(CONFIG_RTL8822B)
437
if (IS_HARDWARE_TYPE_8822B(pAdapter))
438
GET_MASK_ARRAY(8822B , _MSDIO, pArray);
439
#endif
440
#if defined(CONFIG_RTL8192F)
441
if (IS_HARDWARE_TYPE_8192FS(pAdapter))
442
GET_MASK_ARRAY(8192F, _MSDIO, pArray);
443
#endif
444
#if defined(CONFIG_RTL8822C)
445
if (IS_HARDWARE_TYPE_8822C(pAdapter))
446
GET_MASK_ARRAY(8822C , _MSDIO, pArray);
447
#endif
448
#endif /*CONFIG_SDIO_HCI*/
449
}
450
451
u16 rtw_get_efuse_mask_arraylen(PADAPTER pAdapter)
452
{
453
454
#ifdef CONFIG_USB_HCI
455
#if defined(CONFIG_RTL8188E)
456
if (IS_HARDWARE_TYPE_8188E(pAdapter))
457
return GET_MASK_ARRAY_LEN(8188E, _MUSB);
458
#endif
459
#if defined(CONFIG_RTL8812A)
460
if (IS_HARDWARE_TYPE_8812(pAdapter))
461
return GET_MASK_ARRAY_LEN(8812A, _MUSB);
462
#endif
463
#if defined(CONFIG_RTL8821A)
464
if (IS_HARDWARE_TYPE_8821(pAdapter))
465
return GET_MASK_ARRAY_LEN(8821A, _MUSB);
466
#endif
467
#if defined(CONFIG_RTL8192E)
468
if (IS_HARDWARE_TYPE_8192E(pAdapter))
469
return GET_MASK_ARRAY_LEN(8192E, _MUSB);
470
#endif
471
#if defined(CONFIG_RTL8723B)
472
if (IS_HARDWARE_TYPE_8723B(pAdapter))
473
return GET_MASK_ARRAY_LEN(8723B, _MUSB);
474
#endif
475
#if defined(CONFIG_RTL8703B)
476
if (IS_HARDWARE_TYPE_8703B(pAdapter))
477
return GET_MASK_ARRAY_LEN(8703B, _MUSB);
478
#endif
479
#if defined(CONFIG_RTL8188F)
480
if (IS_HARDWARE_TYPE_8188F(pAdapter))
481
return GET_MASK_ARRAY_LEN(8188F, _MUSB);
482
#endif
483
#if defined(CONFIG_RTL8188GTV)
484
if (IS_HARDWARE_TYPE_8188GTV(pAdapter))
485
return GET_MASK_ARRAY_LEN(8188GTV, _MUSB);
486
#endif
487
#if defined(CONFIG_RTL8814A)
488
if (IS_HARDWARE_TYPE_8814A(pAdapter))
489
return GET_MASK_ARRAY_LEN(8814A, _MUSB);
490
#endif
491
#if defined(CONFIG_RTL8822B)
492
if (IS_HARDWARE_TYPE_8822B(pAdapter))
493
return GET_MASK_ARRAY_LEN(8822B, _MUSB);
494
#endif
495
#if defined(CONFIG_RTL8821C)
496
if (IS_HARDWARE_TYPE_8821CU(pAdapter))
497
return GET_MASK_ARRAY_LEN(8821C, _MUSB);
498
#endif
499
#if defined(CONFIG_RTL8192F)
500
if (IS_HARDWARE_TYPE_8192FU(pAdapter))
501
return GET_MASK_ARRAY_LEN(8192F, _MUSB);
502
#endif
503
#if defined(CONFIG_RTL8822C)
504
if (IS_HARDWARE_TYPE_8822C(pAdapter))
505
return GET_MASK_ARRAY_LEN(8822C, _MUSB);
506
#endif
507
#if defined(CONFIG_RTL8814B)
508
if (IS_HARDWARE_TYPE_8814B(pAdapter)) {
509
return GET_MASK_ARRAY_LEN(8814B, _MUSB);
510
}
511
#endif
512
#endif /*CONFIG_USB_HCI*/
513
514
#ifdef CONFIG_PCI_HCI
515
#if defined(CONFIG_RTL8188E)
516
if (IS_HARDWARE_TYPE_8188E(pAdapter))
517
return GET_MASK_ARRAY_LEN(8188E, _MPCIE);
518
#endif
519
#if defined(CONFIG_RTL8192E)
520
if (IS_HARDWARE_TYPE_8192E(pAdapter))
521
return GET_MASK_ARRAY_LEN(8192E, _MPCIE);
522
#endif
523
#if defined(CONFIG_RTL8812A)
524
if (IS_HARDWARE_TYPE_8812(pAdapter))
525
return GET_MASK_ARRAY_LEN(8812A, _MPCIE);
526
#endif
527
#if defined(CONFIG_RTL8821A)
528
if (IS_HARDWARE_TYPE_8821(pAdapter))
529
return GET_MASK_ARRAY_LEN(8821A, _MPCIE);
530
#endif
531
#if defined(CONFIG_RTL8723B)
532
if (IS_HARDWARE_TYPE_8723B(pAdapter))
533
return GET_MASK_ARRAY_LEN(8723B, _MPCIE);
534
#endif
535
#if defined(CONFIG_RTL8814A)
536
if (IS_HARDWARE_TYPE_8814A(pAdapter))
537
return GET_MASK_ARRAY_LEN(8814A, _MPCIE);
538
#endif
539
#if defined(CONFIG_RTL8822B)
540
if (IS_HARDWARE_TYPE_8822B(pAdapter))
541
return GET_MASK_ARRAY_LEN(8822B, _MPCIE);
542
#endif
543
#if defined(CONFIG_RTL8821C)
544
if (IS_HARDWARE_TYPE_8821CE(pAdapter))
545
return GET_MASK_ARRAY_LEN(8821C, _MPCIE);
546
#endif
547
#if defined(CONFIG_RTL8192F)
548
if (IS_HARDWARE_TYPE_8192FE(pAdapter))
549
return GET_MASK_ARRAY_LEN(8192F, _MPCIE);
550
#endif
551
#if defined(CONFIG_RTL8822C)
552
if (IS_HARDWARE_TYPE_8822C(pAdapter))
553
return GET_MASK_ARRAY_LEN(8822C, _MPCIE);
554
#endif
555
#if defined(CONFIG_RTL8814B)
556
if (IS_HARDWARE_TYPE_8814B(pAdapter))
557
return GET_MASK_ARRAY_LEN(8814B, _MPCIE);
558
#endif
559
#endif /*CONFIG_PCI_HCI*/
560
561
#ifdef CONFIG_SDIO_HCI
562
#if defined(CONFIG_RTL8188E)
563
if (IS_HARDWARE_TYPE_8188E(pAdapter))
564
return GET_MASK_ARRAY_LEN(8188E, _MSDIO);
565
#endif
566
#if defined(CONFIG_RTL8723B)
567
if (IS_HARDWARE_TYPE_8723BS(pAdapter))
568
return GET_MASK_ARRAY_LEN(8723B, _MSDIO);
569
#endif
570
#if defined(CONFIG_RTL8188F)
571
if (IS_HARDWARE_TYPE_8188F(pAdapter))
572
return GET_MASK_ARRAY_LEN(8188F, _MSDIO);
573
#endif
574
#if defined(CONFIG_RTL8188GTV)
575
if (IS_HARDWARE_TYPE_8188GTV(pAdapter))
576
return GET_MASK_ARRAY_LEN(8188GTV, _MSDIO);
577
#endif
578
#if defined(CONFIG_RTL8192E)
579
if (IS_HARDWARE_TYPE_8192ES(pAdapter))
580
return GET_MASK_ARRAY_LEN(8192E, _MSDIO);
581
#endif
582
#if defined(CONFIG_RTL8821A)
583
if (IS_HARDWARE_TYPE_8821S(pAdapter))
584
return GET_MASK_ARRAY_LEN(8821A, _MSDIO);
585
#endif
586
#if defined(CONFIG_RTL8821C)
587
if (IS_HARDWARE_TYPE_8821CS(pAdapter))
588
return GET_MASK_ARRAY_LEN(8821C, _MSDIO);
589
#endif
590
#if defined(CONFIG_RTL8822B)
591
if (IS_HARDWARE_TYPE_8822B(pAdapter))
592
return GET_MASK_ARRAY_LEN(8822B, _MSDIO);
593
#endif
594
#if defined(CONFIG_RTL8192F)
595
if (IS_HARDWARE_TYPE_8192FS(pAdapter))
596
return GET_MASK_ARRAY_LEN(8192F, _MSDIO);
597
#endif
598
#if defined(CONFIG_RTL8822C)
599
if (IS_HARDWARE_TYPE_8822C(pAdapter))
600
return GET_MASK_ARRAY_LEN(8822C, _MSDIO);
601
#endif
602
#endif/*CONFIG_SDIO_HCI*/
603
return 0;
604
}
605
606
static void rtw_mask_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)
607
{
608
u16 i = 0;
609
610
if (padapter->registrypriv.boffefusemask == 0) {
611
for (i = 0; i < cnts; i++) {
612
if (padapter->registrypriv.bFileMaskEfuse == _TRUE) {
613
if (rtw_file_efuse_IsMasked(padapter, addr + i, maskfileBuffer)) /*use file efuse mask.*/
614
data[i] = 0xff;
615
else
616
RTW_DBG("data[%x] = %x\n", i, data[i]);
617
} else {
618
if (efuse_IsMasked(padapter, addr + i))
619
data[i] = 0xff;
620
else
621
RTW_DBG("data[%x] = %x\n", i, data[i]);
622
}
623
}
624
}
625
}
626
627
u8 rtw_efuse_mask_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)
628
{
629
u8 ret = _SUCCESS;
630
u16 mapLen = 0;
631
632
EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (void *)&mapLen, _FALSE);
633
634
ret = rtw_efuse_map_read(padapter, addr, cnts , data);
635
636
rtw_mask_map_read(padapter, addr, cnts , data);
637
638
return ret;
639
640
}
641
642
/* ***********************************************************
643
* Efuse related code
644
* *********************************************************** */
645
static u8 hal_EfuseSwitchToBank(
646
PADAPTER padapter,
647
u8 bank,
648
u8 bPseudoTest)
649
{
650
u8 bRet = _FALSE;
651
u32 value32 = 0;
652
#ifdef HAL_EFUSE_MEMORY
653
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
654
PEFUSE_HAL pEfuseHal = &pHalData->EfuseHal;
655
#endif
656
657
658
RTW_INFO("%s: Efuse switch bank to %d\n", __FUNCTION__, bank);
659
if (bPseudoTest) {
660
#ifdef HAL_EFUSE_MEMORY
661
pEfuseHal->fakeEfuseBank = bank;
662
#else
663
fakeEfuseBank = bank;
664
#endif
665
bRet = _TRUE;
666
} else {
667
value32 = rtw_read32(padapter, 0x34);
668
bRet = _TRUE;
669
switch (bank) {
670
case 0:
671
value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_WIFI_SEL_0);
672
break;
673
case 1:
674
value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_BT_SEL_0);
675
break;
676
case 2:
677
value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_BT_SEL_1);
678
break;
679
case 3:
680
value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_BT_SEL_2);
681
break;
682
default:
683
value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_WIFI_SEL_0);
684
bRet = _FALSE;
685
break;
686
}
687
rtw_write32(padapter, 0x34, value32);
688
}
689
690
return bRet;
691
}
692
693
void rtw_efuse_analyze(PADAPTER padapter, u8 Type, u8 Fake)
694
{
695
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
696
PEFUSE_HAL pEfuseHal = &(pHalData->EfuseHal);
697
u16 eFuse_Addr = 0;
698
u8 offset, wden;
699
u16 i, j;
700
u8 efuseHeader = 0, efuseExtHdr = 0, efuseData[EFUSE_MAX_WORD_UNIT*2] = {0}, dataCnt = 0;
701
u16 efuseHeader2Byte = 0;
702
u8 *eFuseWord = NULL;// [EFUSE_MAX_SECTION_NUM][EFUSE_MAX_WORD_UNIT];
703
u8 offset_2_0 = 0;
704
u8 pgSectionCnt = 0;
705
u8 wd_cnt = 0;
706
u8 max_section = 64;
707
u16 mapLen = 0, maprawlen = 0;
708
boolean bExtHeader = _FALSE;
709
u8 efuseType = EFUSE_WIFI;
710
boolean bPseudoTest = _FALSE;
711
u8 bank = 0, startBank = 0, endBank = 1-1;
712
boolean bCheckNextBank = FALSE;
713
u8 protectBytesBank = 0;
714
u16 efuse_max = 0;
715
u8 ParseEfuseExtHdr, ParseEfuseHeader, ParseOffset, ParseWDEN, ParseOffset2_0;
716
717
eFuseWord = rtw_zmalloc(EFUSE_MAX_SECTION_NUM * (EFUSE_MAX_WORD_UNIT * 2));
718
719
RTW_INFO("\n");
720
if (Type == 0) {
721
if (Fake == 0) {
722
RTW_INFO("\n\tEFUSE_Analyze Wifi Content\n");
723
efuseType = EFUSE_WIFI;
724
bPseudoTest = FALSE;
725
startBank = 0;
726
endBank = 0;
727
} else {
728
RTW_INFO("\n\tEFUSE_Analyze Wifi Pseudo Content\n");
729
efuseType = EFUSE_WIFI;
730
bPseudoTest = TRUE;
731
startBank = 0;
732
endBank = 0;
733
}
734
} else {
735
if (Fake == 0) {
736
RTW_INFO("\n\tEFUSE_Analyze BT Content\n");
737
efuseType = EFUSE_BT;
738
bPseudoTest = FALSE;
739
startBank = 1;
740
endBank = EFUSE_MAX_BANK - 1;
741
} else {
742
RTW_INFO("\n\tEFUSE_Analyze BT Pseudo Content\n");
743
efuseType = EFUSE_BT;
744
bPseudoTest = TRUE;
745
startBank = 1;
746
endBank = EFUSE_MAX_BANK - 1;
747
if (IS_HARDWARE_TYPE_8821(padapter))
748
endBank = 3 - 1;/*EFUSE_MAX_BANK_8821A - 1;*/
749
}
750
}
751
752
RTW_INFO("\n\r 1Byte header, [7:4]=offset, [3:0]=word enable\n");
753
RTW_INFO("\n\r 2Byte header, header[7:5]=offset[2:0], header[4:0]=0x0F\n");
754
RTW_INFO("\n\r 2Byte header, extHeader[7:4]=offset[6:3], extHeader[3:0]=word enable\n");
755
756
EFUSE_GetEfuseDefinition(padapter, efuseType, TYPE_EFUSE_MAP_LEN, (void *)&mapLen, bPseudoTest);
757
EFUSE_GetEfuseDefinition(padapter, efuseType, TYPE_EFUSE_MAX_SECTION, (void *)&max_section, bPseudoTest);
758
EFUSE_GetEfuseDefinition(padapter, efuseType, TYPE_EFUSE_PROTECT_BYTES_BANK, (void *)&protectBytesBank, bPseudoTest);
759
EFUSE_GetEfuseDefinition(padapter, efuseType, TYPE_EFUSE_CONTENT_LEN_BANK, (void *)&efuse_max, bPseudoTest);
760
EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_REAL_CONTENT_LEN, (void *)&maprawlen, _FALSE);
761
762
_rtw_memset(eFuseWord, 0xff, EFUSE_MAX_SECTION_NUM * (EFUSE_MAX_WORD_UNIT * 2));
763
_rtw_memset(pEfuseHal->fakeEfuseInitMap, 0xff, EFUSE_MAX_MAP_LEN);
764
765
if (IS_HARDWARE_TYPE_8821(padapter))
766
endBank = 3 - 1;/*EFUSE_MAX_BANK_8821A - 1;*/
767
768
for (bank = startBank; bank <= endBank; bank++) {
769
if (!hal_EfuseSwitchToBank(padapter, bank, bPseudoTest)) {
770
RTW_INFO("EFUSE_SwitchToBank() Fail!!\n");
771
goto out_free_buffer;
772
}
773
774
eFuse_Addr = bank * EFUSE_MAX_BANK_SIZE;
775
776
efuse_OneByteRead(padapter, eFuse_Addr++, &efuseHeader, bPseudoTest);
777
778
if (efuseHeader == 0xFF && bank == startBank && Fake != TRUE) {
779
RTW_INFO("Non-PGed Efuse\n");
780
goto out_free_buffer;
781
}
782
RTW_INFO("EFUSE_REAL_CONTENT_LEN = %d\n", maprawlen);
783
784
while ((efuseHeader != 0xFF) && ((efuseType == EFUSE_WIFI && (eFuse_Addr < maprawlen)) || (efuseType == EFUSE_BT && (eFuse_Addr < (endBank + 1) * EFUSE_MAX_BANK_SIZE)))) {
785
786
RTW_INFO("Analyzing: Offset: 0x%X\n", eFuse_Addr);
787
788
/* Check PG header for section num.*/
789
if (EXT_HEADER(efuseHeader)) {
790
bExtHeader = TRUE;
791
offset_2_0 = GET_HDR_OFFSET_2_0(efuseHeader);
792
efuse_OneByteRead(padapter, eFuse_Addr++, &efuseExtHdr, bPseudoTest);
793
794
if (efuseExtHdr != 0xff) {
795
if (ALL_WORDS_DISABLED(efuseExtHdr)) {
796
/* Read next pg header*/
797
efuse_OneByteRead(padapter, eFuse_Addr++, &efuseHeader, bPseudoTest);
798
continue;
799
} else {
800
offset = ((efuseExtHdr & 0xF0) >> 1) | offset_2_0;
801
wden = (efuseExtHdr & 0x0F);
802
efuseHeader2Byte = (efuseExtHdr<<8)|efuseHeader;
803
RTW_INFO("Find efuseHeader2Byte = 0x%04X, offset=%d, wden=0x%x\n",
804
efuseHeader2Byte, offset, wden);
805
}
806
} else {
807
RTW_INFO("Error, efuse[%d]=0xff, efuseExtHdr=0xff\n", eFuse_Addr-1);
808
break;
809
}
810
} else {
811
offset = ((efuseHeader >> 4) & 0x0f);
812
wden = (efuseHeader & 0x0f);
813
}
814
815
_rtw_memset(efuseData, '\0', EFUSE_MAX_WORD_UNIT * 2);
816
dataCnt = 0;
817
818
if (offset < max_section) {
819
for (i = 0; i < EFUSE_MAX_WORD_UNIT; i++) {
820
/* Check word enable condition in the section */
821
if (!(wden & (0x01<<i))) {
822
if (!((efuseType == EFUSE_WIFI && (eFuse_Addr + 2 < maprawlen)) ||
823
(efuseType == EFUSE_BT && (eFuse_Addr + 2 < (endBank + 1) * EFUSE_MAX_BANK_SIZE)))) {
824
RTW_INFO("eFuse_Addr exceeds, break\n");
825
break;
826
}
827
efuse_OneByteRead(padapter, eFuse_Addr++, &efuseData[dataCnt++], bPseudoTest);
828
eFuseWord[(offset * 8) + (i * 2)] = (efuseData[dataCnt - 1]);
829
efuse_OneByteRead(padapter, eFuse_Addr++, &efuseData[dataCnt++], bPseudoTest);
830
eFuseWord[(offset * 8) + (i * 2 + 1)] = (efuseData[dataCnt - 1]);
831
}
832
}
833
}
834
835
if (bExtHeader) {
836
RTW_INFO("Efuse PG Section (%d) = ", pgSectionCnt);
837
RTW_INFO("[ %04X ], [", efuseHeader2Byte);
838
839
} else {
840
RTW_INFO("Efuse PG Section (%d) = ", pgSectionCnt);
841
RTW_INFO("[ %02X ], [", efuseHeader);
842
}
843
844
for (j = 0; j < dataCnt; j++)
845
RTW_INFO(" %02X ", efuseData[j]);
846
847
RTW_INFO("]\n");
848
849
850
if (bExtHeader) {
851
ParseEfuseExtHdr = (efuseHeader2Byte & 0xff00) >> 8;
852
ParseEfuseHeader = (efuseHeader2Byte & 0xff);
853
ParseOffset2_0 = GET_HDR_OFFSET_2_0(ParseEfuseHeader);
854
ParseOffset = ((ParseEfuseExtHdr & 0xF0) >> 1) | ParseOffset2_0;
855
ParseWDEN = (ParseEfuseExtHdr & 0x0F);
856
RTW_INFO("Header=0x%x, ExtHeader=0x%x, ", ParseEfuseHeader, ParseEfuseExtHdr);
857
} else {
858
ParseEfuseHeader = efuseHeader;
859
ParseOffset = ((ParseEfuseHeader >> 4) & 0x0f);
860
ParseWDEN = (ParseEfuseHeader & 0x0f);
861
RTW_INFO("Header=0x%x, ", ParseEfuseHeader);
862
}
863
RTW_INFO("offset=0x%x(%d), word enable=0x%x\n", ParseOffset, ParseOffset, ParseWDEN);
864
865
wd_cnt = 0;
866
for (i = 0; i < EFUSE_MAX_WORD_UNIT; i++) {
867
if (!(wden & (0x01 << i))) {
868
RTW_INFO("Map[ %02X ] = %02X %02X\n", ((offset * EFUSE_MAX_WORD_UNIT * 2) + (i * 2)), efuseData[wd_cnt * 2 + 0], efuseData[wd_cnt * 2 + 1]);
869
wd_cnt++;
870
}
871
}
872
873
pgSectionCnt++;
874
bExtHeader = FALSE;
875
efuse_OneByteRead(padapter, eFuse_Addr++, &efuseHeader, bPseudoTest);
876
if (efuseHeader == 0xFF) {
877
if ((eFuse_Addr + protectBytesBank) >= efuse_max)
878
bCheckNextBank = TRUE;
879
else
880
bCheckNextBank = FALSE;
881
}
882
}
883
if (!bCheckNextBank) {
884
RTW_INFO("Not need to check next bank, eFuse_Addr=%d, protectBytesBank=%d, efuse_max=%d\n",
885
eFuse_Addr, protectBytesBank, efuse_max);
886
break;
887
}
888
}
889
/* switch bank back to 0 for BT/wifi later use*/
890
hal_EfuseSwitchToBank(padapter, 0, bPseudoTest);
891
892
/* 3. Collect 16 sections and 4 word unit into Efuse map.*/
893
for (i = 0; i < max_section; i++) {
894
for (j = 0; j < EFUSE_MAX_WORD_UNIT; j++) {
895
pEfuseHal->fakeEfuseInitMap[(i*8)+(j*2)] = (eFuseWord[(i*8)+(j*2)]);
896
pEfuseHal->fakeEfuseInitMap[(i*8)+((j*2)+1)] = (eFuseWord[(i*8)+((j*2)+1)]);
897
}
898
}
899
900
RTW_INFO("\n\tEFUSE Analyze Map\n");
901
i = 0;
902
j = 0;
903
904
for (i = 0; i < mapLen; i++) {
905
if (i % 16 == 0)
906
RTW_PRINT_SEL(RTW_DBGDUMP, "0x%03x: ", i);
907
_RTW_PRINT_SEL(RTW_DBGDUMP, "%02X%s"
908
, pEfuseHal->fakeEfuseInitMap[i]
909
, ((i + 1) % 16 == 0) ? "\n" : (((i + 1) % 8 == 0) ? " " : " ")
910
);
911
}
912
_RTW_PRINT_SEL(RTW_DBGDUMP, "\n");
913
914
out_free_buffer:
915
if (eFuseWord)
916
rtw_mfree((u8 *)eFuseWord, EFUSE_MAX_SECTION_NUM * (EFUSE_MAX_WORD_UNIT * 2));
917
}
918
919
void efuse_PreUpdateAction(
920
PADAPTER pAdapter,
921
u32 *BackupRegs)
922
{
923
if (IS_HARDWARE_TYPE_8812AU(pAdapter) || IS_HARDWARE_TYPE_8822BU(pAdapter)) {
924
/* <20131115, Kordan> Turn off Rx to prevent from being busy when writing the EFUSE. (Asked by Chunchu.)*/
925
BackupRegs[0] = phy_query_mac_reg(pAdapter, REG_RCR, bMaskDWord);
926
BackupRegs[1] = phy_query_mac_reg(pAdapter, REG_RXFLTMAP0, bMaskDWord);
927
BackupRegs[2] = phy_query_mac_reg(pAdapter, REG_RXFLTMAP0+4, bMaskDWord);
928
#ifdef CONFIG_RTL8812A
929
BackupRegs[3] = phy_query_mac_reg(pAdapter, REG_AFE_MISC, bMaskDWord);
930
#endif
931
PlatformEFIOWrite4Byte(pAdapter, REG_RCR, 0x1);
932
PlatformEFIOWrite1Byte(pAdapter, REG_RXFLTMAP0, 0);
933
PlatformEFIOWrite1Byte(pAdapter, REG_RXFLTMAP0+1, 0);
934
PlatformEFIOWrite1Byte(pAdapter, REG_RXFLTMAP0+2, 0);
935
PlatformEFIOWrite1Byte(pAdapter, REG_RXFLTMAP0+3, 0);
936
PlatformEFIOWrite1Byte(pAdapter, REG_RXFLTMAP0+4, 0);
937
PlatformEFIOWrite1Byte(pAdapter, REG_RXFLTMAP0+5, 0);
938
#ifdef CONFIG_RTL8812A
939
/* <20140410, Kordan> 0x11 = 0x4E, lower down LX_SPS0 voltage. (Asked by Chunchu)*/
940
phy_set_mac_reg(pAdapter, REG_AFE_MISC, bMaskByte1, 0x4E);
941
#endif
942
RTW_INFO(" %s , done\n", __func__);
943
944
}
945
}
946
947
948
void efuse_PostUpdateAction(
949
PADAPTER pAdapter,
950
u32 *BackupRegs)
951
{
952
if (IS_HARDWARE_TYPE_8812AU(pAdapter) || IS_HARDWARE_TYPE_8822BU(pAdapter)) {
953
/* <20131115, Kordan> Turn on Rx and restore the registers. (Asked by Chunchu.)*/
954
phy_set_mac_reg(pAdapter, REG_RCR, bMaskDWord, BackupRegs[0]);
955
phy_set_mac_reg(pAdapter, REG_RXFLTMAP0, bMaskDWord, BackupRegs[1]);
956
phy_set_mac_reg(pAdapter, REG_RXFLTMAP0+4, bMaskDWord, BackupRegs[2]);
957
#ifdef CONFIG_RTL8812A
958
phy_set_mac_reg(pAdapter, REG_AFE_MISC, bMaskDWord, BackupRegs[3]);
959
#endif
960
RTW_INFO(" %s , done\n", __func__);
961
}
962
}
963
964
965
#ifdef RTW_HALMAC
966
#include "../../hal/hal_halmac.h"
967
968
void Efuse_PowerSwitch(PADAPTER adapter, u8 write, u8 pwrstate)
969
{
970
}
971
972
void BTEfuse_PowerSwitch(PADAPTER adapter, u8 write, u8 pwrstate)
973
{
974
}
975
976
u8 efuse_GetCurrentSize(PADAPTER adapter, u16 *size)
977
{
978
*size = 0;
979
980
return _FAIL;
981
}
982
983
u16 efuse_GetMaxSize(PADAPTER adapter)
984
{
985
struct dvobj_priv *d;
986
u32 size = 0;
987
int err;
988
989
d = adapter_to_dvobj(adapter);
990
err = rtw_halmac_get_physical_efuse_size(d, &size);
991
if (err)
992
return 0;
993
994
return size;
995
}
996
997
u16 efuse_GetavailableSize(PADAPTER adapter)
998
{
999
struct dvobj_priv *d;
1000
u32 size = 0;
1001
int err;
1002
1003
d = adapter_to_dvobj(adapter);
1004
err = rtw_halmac_get_available_efuse_size(d, &size);
1005
if (err)
1006
return 0;
1007
1008
return size;
1009
}
1010
1011
1012
u8 efuse_bt_GetCurrentSize(PADAPTER adapter, u16 *usesize)
1013
{
1014
u8 *efuse_map;
1015
1016
*usesize = 0;
1017
efuse_map = rtw_malloc(EFUSE_BT_MAP_LEN);
1018
if (efuse_map == NULL) {
1019
RTW_DBG("%s: malloc FAIL\n", __FUNCTION__);
1020
return _FAIL;
1021
}
1022
1023
/* for get bt phy efuse last use byte */
1024
hal_ReadEFuse_BT_logic_map(adapter, 0x00, EFUSE_BT_MAP_LEN, efuse_map);
1025
*usesize = fakeBTEfuseUsedBytes;
1026
1027
if (efuse_map)
1028
rtw_mfree(efuse_map, EFUSE_BT_MAP_LEN);
1029
1030
return _SUCCESS;
1031
}
1032
1033
u16 efuse_bt_GetMaxSize(PADAPTER adapter)
1034
{
1035
return EFUSE_BT_REAL_CONTENT_LEN;
1036
}
1037
1038
void EFUSE_GetEfuseDefinition(PADAPTER adapter, u8 efusetype, u8 type, void *out, BOOLEAN test)
1039
{
1040
struct dvobj_priv *d;
1041
u32 v32 = 0;
1042
1043
1044
d = adapter_to_dvobj(adapter);
1045
1046
if (adapter->hal_func.EFUSEGetEfuseDefinition) {
1047
adapter->hal_func.EFUSEGetEfuseDefinition(adapter, efusetype, type, out, test);
1048
return;
1049
}
1050
1051
if (EFUSE_WIFI == efusetype) {
1052
switch (type) {
1053
case TYPE_EFUSE_MAP_LEN:
1054
rtw_halmac_get_logical_efuse_size(d, &v32);
1055
*(u16 *)out = (u16)v32;
1056
return;
1057
1058
case TYPE_EFUSE_REAL_CONTENT_LEN:
1059
rtw_halmac_get_physical_efuse_size(d, &v32);
1060
*(u16 *)out = (u16)v32;
1061
return;
1062
}
1063
} else if (EFUSE_BT == efusetype) {
1064
switch (type) {
1065
case TYPE_EFUSE_MAP_LEN:
1066
*(u16 *)out = EFUSE_BT_MAP_LEN;
1067
return;
1068
1069
case TYPE_EFUSE_REAL_CONTENT_LEN:
1070
*(u16 *)out = EFUSE_BT_REAL_CONTENT_LEN;
1071
return;
1072
}
1073
}
1074
}
1075
1076
/*
1077
* read/write raw efuse data
1078
*/
1079
u8 rtw_efuse_access(PADAPTER adapter, u8 write, u16 addr, u16 cnts, u8 *data)
1080
{
1081
struct dvobj_priv *d;
1082
u8 *efuse = NULL;
1083
u32 size;
1084
int err;
1085
1086
1087
d = adapter_to_dvobj(adapter);
1088
err = rtw_halmac_get_physical_efuse_size(d, &size);
1089
if (err){
1090
size = EFUSE_MAX_SIZE;
1091
RTW_INFO(" physical_efuse_size err size %d\n", size);
1092
}
1093
1094
if ((addr + cnts) > size)
1095
return _FAIL;
1096
1097
if (_TRUE == write) {
1098
err = rtw_halmac_write_physical_efuse(d, addr, cnts, data);
1099
if (err)
1100
return _FAIL;
1101
} else {
1102
if (cnts > 16)
1103
efuse = rtw_zmalloc(size);
1104
1105
if (efuse) {
1106
err = rtw_halmac_read_physical_efuse_map(d, efuse, size);
1107
if (err) {
1108
rtw_mfree(efuse, size);
1109
return _FAIL;
1110
}
1111
1112
_rtw_memcpy(data, efuse + addr, cnts);
1113
rtw_mfree(efuse, size);
1114
} else {
1115
err = rtw_halmac_read_physical_efuse(d, addr, cnts, data);
1116
if (err)
1117
return _FAIL;
1118
}
1119
}
1120
1121
return _SUCCESS;
1122
}
1123
1124
static inline void dump_buf(u8 *buf, u32 len)
1125
{
1126
u32 i;
1127
1128
RTW_INFO("-----------------Len %d----------------\n", len);
1129
for (i = 0; i < len; i++)
1130
printk("%2.2x-", *(buf + i));
1131
printk("\n");
1132
}
1133
1134
/*
1135
* read/write raw efuse data
1136
*/
1137
u8 rtw_efuse_bt_access(PADAPTER adapter, u8 write, u16 addr, u16 cnts, u8 *data)
1138
{
1139
struct dvobj_priv *d;
1140
u8 *efuse = NULL;
1141
u32 size;
1142
int err = _FAIL;
1143
1144
1145
d = adapter_to_dvobj(adapter);
1146
1147
size = EFUSE_BT_REAL_CONTENT_LEN;
1148
1149
if ((addr + cnts) > size)
1150
return _FAIL;
1151
1152
if (_TRUE == write) {
1153
err = rtw_halmac_write_bt_physical_efuse(d, addr, cnts, data);
1154
if (err == -1) {
1155
RTW_ERR("%s: rtw_halmac_write_bt_physical_efuse fail!\n", __FUNCTION__);
1156
return _FAIL;
1157
}
1158
RTW_INFO("%s: rtw_halmac_write_bt_physical_efuse OK! data 0x%x\n", __FUNCTION__, *data);
1159
} else {
1160
efuse = rtw_zmalloc(size);
1161
1162
if (efuse) {
1163
err = rtw_halmac_read_bt_physical_efuse_map(d, efuse, size);
1164
1165
if (err == -1) {
1166
RTW_ERR("%s: rtw_halmac_read_bt_physical_efuse_map fail!\n", __FUNCTION__);
1167
rtw_mfree(efuse, size);
1168
return _FAIL;
1169
}
1170
dump_buf(efuse + addr, cnts);
1171
1172
_rtw_memcpy(data, efuse + addr, cnts);
1173
1174
RTW_INFO("%s: rtw_halmac_read_bt_physical_efuse_map ok! data 0x%x\n", __FUNCTION__, *data);
1175
rtw_mfree(efuse, size);
1176
}
1177
}
1178
1179
return _SUCCESS;
1180
}
1181
1182
u8 rtw_efuse_map_read(PADAPTER adapter, u16 addr, u16 cnts, u8 *data)
1183
{
1184
struct dvobj_priv *d;
1185
u8 *efuse = NULL;
1186
u32 size, i;
1187
int err;
1188
u32 backupRegs[4] = {0};
1189
u8 status = _SUCCESS;
1190
1191
efuse_PreUpdateAction(adapter, backupRegs);
1192
1193
d = adapter_to_dvobj(adapter);
1194
err = rtw_halmac_get_logical_efuse_size(d, &size);
1195
if (err) {
1196
status = _FAIL;
1197
RTW_DBG("halmac_get_logical_efuse_size fail\n");
1198
goto exit;
1199
}
1200
/* size error handle */
1201
if ((addr + cnts) > size) {
1202
if (addr < size)
1203
cnts = size - addr;
1204
else {
1205
status = _FAIL;
1206
RTW_DBG(" %s() ,addr + cnts) > size fail\n", __func__);
1207
goto exit;
1208
}
1209
}
1210
1211
if (cnts > 16)
1212
efuse = rtw_zmalloc(size);
1213
1214
if (efuse) {
1215
err = rtw_halmac_read_logical_efuse_map(d, efuse, size, NULL, 0);
1216
if (err) {
1217
rtw_mfree(efuse, size);
1218
status = _FAIL;
1219
RTW_DBG(" %s() ,halmac_read_logical_efus map fail\n", __func__);
1220
goto exit;
1221
}
1222
1223
_rtw_memcpy(data, efuse + addr, cnts);
1224
rtw_mfree(efuse, size);
1225
} else {
1226
err = rtw_halmac_read_logical_efuse(d, addr, cnts, data);
1227
if (err) {
1228
status = _FAIL;
1229
RTW_DBG(" %s() ,halmac_read_logical_efus data fail\n", __func__);
1230
goto exit;
1231
}
1232
}
1233
status = _SUCCESS;
1234
exit:
1235
efuse_PostUpdateAction(adapter, backupRegs);
1236
1237
return status;
1238
}
1239
1240
u8 rtw_efuse_map_write(PADAPTER adapter, u16 addr, u16 cnts, u8 *data)
1241
{
1242
struct dvobj_priv *d;
1243
u8 *efuse = NULL;
1244
u32 size;
1245
int err;
1246
u8 mask_buf[64] = "";
1247
u16 mask_len = sizeof(u8) * rtw_get_efuse_mask_arraylen(adapter);
1248
u32 backupRegs[4] = {0};
1249
u8 status = _SUCCESS;;
1250
1251
efuse_PreUpdateAction(adapter, backupRegs);
1252
1253
d = adapter_to_dvobj(adapter);
1254
err = rtw_halmac_get_logical_efuse_size(d, &size);
1255
if (err) {
1256
status = _FAIL;
1257
goto exit;
1258
}
1259
1260
if ((addr + cnts) > size) {
1261
status = _FAIL;
1262
goto exit;
1263
}
1264
1265
efuse = rtw_zmalloc(size);
1266
if (!efuse) {
1267
status = _FAIL;
1268
goto exit;
1269
}
1270
1271
err = rtw_halmac_read_logical_efuse_map(d, efuse, size, NULL, 0);
1272
if (err) {
1273
rtw_mfree(efuse, size);
1274
status = _FAIL;
1275
goto exit;
1276
}
1277
1278
_rtw_memcpy(efuse + addr, data, cnts);
1279
1280
if (adapter->registrypriv.boffefusemask == 0) {
1281
RTW_INFO("Use mask Array Len: %d\n", mask_len);
1282
1283
if (mask_len != 0) {
1284
if (adapter->registrypriv.bFileMaskEfuse == _TRUE)
1285
_rtw_memcpy(mask_buf, maskfileBuffer, mask_len);
1286
else
1287
rtw_efuse_mask_array(adapter, mask_buf);
1288
1289
err = rtw_halmac_write_logical_efuse_map(d, efuse, size, mask_buf, mask_len);
1290
} else
1291
err = rtw_halmac_write_logical_efuse_map(d, efuse, size, NULL, 0);
1292
} else {
1293
_rtw_memset(mask_buf, 0xFF, sizeof(mask_buf));
1294
RTW_INFO("Efuse mask off\n");
1295
err = rtw_halmac_write_logical_efuse_map(d, efuse, size, mask_buf, size/16);
1296
}
1297
1298
if (err) {
1299
rtw_mfree(efuse, size);
1300
status = _FAIL;
1301
goto exit;
1302
}
1303
1304
rtw_mfree(efuse, size);
1305
status = _SUCCESS;
1306
exit :
1307
efuse_PostUpdateAction(adapter, backupRegs);
1308
1309
return status;
1310
}
1311
1312
int Efuse_PgPacketRead(PADAPTER adapter, u8 offset, u8 *data, BOOLEAN test)
1313
{
1314
return _FALSE;
1315
}
1316
1317
int Efuse_PgPacketWrite(PADAPTER adapter, u8 offset, u8 word_en, u8 *data, BOOLEAN test)
1318
{
1319
return _FALSE;
1320
}
1321
1322
static void rtw_bt_mask_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)
1323
{
1324
u16 i = 0;
1325
1326
if (padapter->registrypriv.boffefusemask == 0) {
1327
for (i = 0; i < cnts; i++) {
1328
if (padapter->registrypriv.bBTFileMaskEfuse == _TRUE) {
1329
if (rtw_file_efuse_IsMasked(padapter, addr + i, btmaskfileBuffer)) /*use BT file efuse mask.*/
1330
data[i] = 0xff;
1331
else
1332
RTW_DBG("data[%x] = %x\n", i, data[i]);
1333
} else {
1334
if (efuse_IsBT_Masked(padapter, addr + i)) /*use drv internal efuse mask.*/
1335
data[i] = 0xff;
1336
else
1337
RTW_DBG("data[%x] = %x\n", i, data[i]);
1338
}
1339
}
1340
}
1341
1342
}
1343
1344
u8 rtw_BT_efuse_map_read(PADAPTER adapter, u16 addr, u16 cnts, u8 *data)
1345
{
1346
hal_ReadEFuse_BT_logic_map(adapter, addr, cnts, data);
1347
1348
rtw_bt_mask_map_read(adapter, addr, cnts, data);
1349
1350
return _SUCCESS;
1351
}
1352
1353
u8 rtw_BT_efuse_map_write(PADAPTER adapter, u16 addr, u16 cnts, u8 *data)
1354
{
1355
#define RT_ASSERT_RET(expr) \
1356
if (!(expr)) { \
1357
printk("Assertion failed! %s at ......\n", #expr); \
1358
printk(" ......%s,%s, line=%d\n",__FILE__, __FUNCTION__, __LINE__); \
1359
return _FAIL; \
1360
}
1361
1362
u8 offset, word_en;
1363
u8 *efuse = NULL;
1364
u8 *map;
1365
u8 newdata[PGPKT_DATA_SIZE];
1366
s32 i = 0, j = 0, idx;
1367
u8 ret = _SUCCESS;
1368
u16 mapLen = 1024;
1369
1370
if ((addr + cnts) > mapLen)
1371
return _FAIL;
1372
1373
RT_ASSERT_RET(PGPKT_DATA_SIZE == 8); /* have to be 8 byte alignment */
1374
RT_ASSERT_RET((mapLen & 0x7) == 0); /* have to be PGPKT_DATA_SIZE alignment for memcpy */
1375
1376
efuse = rtw_zmalloc(mapLen);
1377
if (!efuse)
1378
return _FAIL;
1379
1380
map = rtw_zmalloc(mapLen);
1381
if (map == NULL) {
1382
rtw_mfree(efuse, mapLen);
1383
return _FAIL;
1384
}
1385
1386
_rtw_memset(map, 0xFF, mapLen);
1387
1388
ret = rtw_BT_efuse_map_read(adapter, 0, mapLen, map);
1389
if (ret == _FAIL)
1390
goto exit;
1391
1392
_rtw_memcpy(efuse , map, mapLen);
1393
_rtw_memcpy(efuse + addr, data, cnts);
1394
1395
if (adapter->registrypriv.boffefusemask == 0) {
1396
for (i = 0; i < cnts; i++) {
1397
if (adapter->registrypriv.bFileMaskEfuse == _TRUE) {
1398
if (rtw_file_efuse_IsMasked(adapter, addr + i, btmaskfileBuffer)) /*use file efuse mask. */
1399
efuse[addr + i] = map[addr + i];
1400
} else {
1401
if (efuse_IsBT_Masked(adapter, addr + i))
1402
efuse[addr + i] = map[addr + i];
1403
}
1404
RTW_INFO("%s , efuse[%x] = %x, map = %x\n", __func__, addr + i, efuse[ addr + i], map[addr + i]);
1405
}
1406
}
1407
1408
idx = 0;
1409
offset = (addr >> 3);
1410
while (idx < cnts) {
1411
word_en = 0xF;
1412
j = (addr + idx) & 0x7;
1413
_rtw_memcpy(newdata, &map[offset << 3], PGPKT_DATA_SIZE);
1414
for (i = j; i < PGPKT_DATA_SIZE && idx < cnts; i++, idx++) {
1415
if (efuse[idx] != map[addr + idx]) {
1416
word_en &= ~BIT(i >> 1);
1417
newdata[i] = efuse[idx];
1418
}
1419
}
1420
1421
if (word_en != 0xF) {
1422
ret = EfusePgPacketWrite_BT(adapter, offset, word_en, newdata, _FALSE);
1423
RTW_INFO("offset=%x\n", offset);
1424
RTW_INFO("word_en=%x\n", word_en);
1425
RTW_INFO("%s: data=", __FUNCTION__);
1426
for (i = 0; i < PGPKT_DATA_SIZE; i++)
1427
RTW_INFO("0x%02X ", newdata[i]);
1428
RTW_INFO("\n");
1429
if (ret == _FAIL)
1430
break;
1431
}
1432
offset++;
1433
}
1434
exit:
1435
rtw_mfree(map, mapLen);
1436
return _SUCCESS;
1437
}
1438
1439
void hal_ReadEFuse_BT_logic_map(
1440
PADAPTER padapter,
1441
u16 _offset,
1442
u16 _size_byte,
1443
u8 *pbuf
1444
)
1445
{
1446
1447
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
1448
1449
u8 *efuseTbl, *phyefuse;
1450
u8 bank;
1451
u16 eFuse_Addr = 0;
1452
u8 efuseHeader, efuseExtHdr, efuseData;
1453
u8 offset, wden;
1454
u16 i, total, used;
1455
u8 efuse_usage;
1456
1457
1458
/* */
1459
/* Do NOT excess total size of EFuse table. Added by Roger, 2008.11.10. */
1460
/* */
1461
if ((_offset + _size_byte) > EFUSE_BT_MAP_LEN) {
1462
RTW_INFO("%s: Invalid offset(%#x) with read bytes(%#x)!!\n", __FUNCTION__, _offset, _size_byte);
1463
return;
1464
}
1465
1466
efuseTbl = rtw_malloc(EFUSE_BT_MAP_LEN);
1467
phyefuse = rtw_malloc(EFUSE_BT_REAL_CONTENT_LEN);
1468
if (efuseTbl == NULL || phyefuse == NULL) {
1469
RTW_INFO("%s: efuseTbl or phyefuse malloc fail!\n", __FUNCTION__);
1470
goto exit;
1471
}
1472
1473
/* 0xff will be efuse default value instead of 0x00. */
1474
_rtw_memset(efuseTbl, 0xFF, EFUSE_BT_MAP_LEN);
1475
_rtw_memset(phyefuse, 0xFF, EFUSE_BT_REAL_CONTENT_LEN);
1476
1477
if (rtw_efuse_bt_access(padapter, _FALSE, 0, EFUSE_BT_REAL_CONTENT_LEN, phyefuse))
1478
dump_buf(phyefuse, EFUSE_BT_REAL_BANK_CONTENT_LEN);
1479
1480
total = BANK_NUM;
1481
for (bank = 1; bank <= total; bank++) { /* 8723d Max bake 0~2 */
1482
eFuse_Addr = 0;
1483
1484
while (AVAILABLE_EFUSE_ADDR(eFuse_Addr)) {
1485
/* ReadEFuseByte(padapter, eFuse_Addr++, &efuseHeader, bPseudoTest); */
1486
efuseHeader = phyefuse[eFuse_Addr++];
1487
1488
if (efuseHeader == 0xFF)
1489
break;
1490
RTW_INFO("%s: efuse[%#X]=0x%02x (header)\n", __FUNCTION__, (((bank - 1) * EFUSE_BT_REAL_CONTENT_LEN) + eFuse_Addr - 1), efuseHeader);
1491
1492
/* Check PG header for section num. */
1493
if (EXT_HEADER(efuseHeader)) { /* extended header */
1494
offset = GET_HDR_OFFSET_2_0(efuseHeader);
1495
RTW_INFO("%s: extended header offset_2_0=0x%X\n", __FUNCTION__, offset);
1496
1497
/* ReadEFuseByte(padapter, eFuse_Addr++, &efuseExtHdr, bPseudoTest); */
1498
efuseExtHdr = phyefuse[eFuse_Addr++];
1499
1500
RTW_INFO("%s: efuse[%#X]=0x%02x (ext header)\n", __FUNCTION__, (((bank - 1) * EFUSE_BT_REAL_CONTENT_LEN) + eFuse_Addr - 1), efuseExtHdr);
1501
if (ALL_WORDS_DISABLED(efuseExtHdr))
1502
continue;
1503
1504
offset |= ((efuseExtHdr & 0xF0) >> 1);
1505
wden = (efuseExtHdr & 0x0F);
1506
} else {
1507
offset = ((efuseHeader >> 4) & 0x0f);
1508
wden = (efuseHeader & 0x0f);
1509
}
1510
1511
if (offset < EFUSE_BT_MAX_SECTION) {
1512
u16 addr;
1513
1514
/* Get word enable value from PG header */
1515
RTW_INFO("%s: Offset=%d Worden=%#X\n", __FUNCTION__, offset, wden);
1516
1517
addr = offset * PGPKT_DATA_SIZE;
1518
for (i = 0; i < EFUSE_MAX_WORD_UNIT; i++) {
1519
/* Check word enable condition in the section */
1520
if (!(wden & (0x01 << i))) {
1521
efuseData = 0;
1522
/* ReadEFuseByte(padapter, eFuse_Addr++, &efuseData, bPseudoTest); */
1523
efuseData = phyefuse[eFuse_Addr++];
1524
1525
RTW_INFO("%s: efuse[%#X]=0x%02X\n", __FUNCTION__, eFuse_Addr - 1, efuseData);
1526
efuseTbl[addr] = efuseData;
1527
1528
efuseData = 0;
1529
/* ReadEFuseByte(padapter, eFuse_Addr++, &efuseData, bPseudoTest); */
1530
efuseData = phyefuse[eFuse_Addr++];
1531
1532
RTW_INFO("%s: efuse[%#X]=0x%02X\n", __FUNCTION__, eFuse_Addr - 1, efuseData);
1533
efuseTbl[addr + 1] = efuseData;
1534
}
1535
addr += 2;
1536
}
1537
} else {
1538
RTW_INFO("%s: offset(%d) is illegal!!\n", __FUNCTION__, offset);
1539
eFuse_Addr += Efuse_CalculateWordCnts(wden) * 2;
1540
}
1541
}
1542
1543
if ((eFuse_Addr - 1) < total) {
1544
RTW_INFO("%s: bank(%d) data end at %#x\n", __FUNCTION__, bank, eFuse_Addr - 1);
1545
break;
1546
}
1547
}
1548
1549
/* switch bank back to bank 0 for later BT and wifi use. */
1550
//hal_EfuseSwitchToBank(padapter, 0, bPseudoTest);
1551
1552
/* Copy from Efuse map to output pointer memory!!! */
1553
for (i = 0; i < _size_byte; i++)
1554
pbuf[i] = efuseTbl[_offset + i];
1555
/* Calculate Efuse utilization */
1556
total = EFUSE_BT_REAL_BANK_CONTENT_LEN;
1557
1558
used = eFuse_Addr - 1;
1559
1560
if (total)
1561
efuse_usage = (u8)((used * 100) / total);
1562
else
1563
efuse_usage = 100;
1564
1565
fakeBTEfuseUsedBytes = used;
1566
RTW_INFO("%s: BTEfuseUsed last Bytes = %#x\n", __FUNCTION__, fakeBTEfuseUsedBytes);
1567
1568
exit:
1569
if (efuseTbl)
1570
rtw_mfree(efuseTbl, EFUSE_BT_MAP_LEN);
1571
if (phyefuse)
1572
rtw_mfree(phyefuse, EFUSE_BT_REAL_BANK_CONTENT_LEN);
1573
}
1574
1575
1576
static u8 hal_EfusePartialWriteCheck(
1577
PADAPTER padapter,
1578
u8 efuseType,
1579
u16 *pAddr,
1580
PPGPKT_STRUCT pTargetPkt,
1581
u8 bPseudoTest)
1582
{
1583
u8 bRet = _FALSE;
1584
u16 startAddr = 0, efuse_max_available_len = EFUSE_BT_REAL_BANK_CONTENT_LEN, efuse_max = EFUSE_BT_REAL_BANK_CONTENT_LEN;
1585
u8 efuse_data = 0;
1586
1587
startAddr = (u16)fakeBTEfuseUsedBytes;
1588
1589
startAddr %= efuse_max;
1590
RTW_INFO("%s: startAddr=%#X\n", __FUNCTION__, startAddr);
1591
1592
while (1) {
1593
if (startAddr >= efuse_max_available_len) {
1594
bRet = _FALSE;
1595
RTW_INFO("%s: startAddr(%d) >= efuse_max_available_len(%d)\n",
1596
__FUNCTION__, startAddr, efuse_max_available_len);
1597
break;
1598
}
1599
if (rtw_efuse_bt_access(padapter, _FALSE, startAddr, 1, &efuse_data)&& (efuse_data != 0xFF)) {
1600
bRet = _FALSE;
1601
RTW_INFO("%s: Something Wrong! last bytes(%#X=0x%02X) is not 0xFF\n",
1602
__FUNCTION__, startAddr, efuse_data);
1603
break;
1604
} else {
1605
/* not used header, 0xff */
1606
*pAddr = startAddr;
1607
/* RTW_INFO("%s: Started from unused header offset=%d\n", __FUNCTION__, startAddr)); */
1608
bRet = _TRUE;
1609
break;
1610
}
1611
}
1612
1613
return bRet;
1614
}
1615
1616
1617
static u8 hal_EfusePgPacketWrite2ByteHeader(
1618
PADAPTER padapter,
1619
u8 efuseType,
1620
u16 *pAddr,
1621
PPGPKT_STRUCT pTargetPkt,
1622
u8 bPseudoTest)
1623
{
1624
u16 efuse_addr, efuse_max_available_len = EFUSE_BT_REAL_BANK_CONTENT_LEN;
1625
u8 pg_header = 0, tmp_header = 0;
1626
u8 repeatcnt = 0;
1627
1628
/* RTW_INFO("%s\n", __FUNCTION__); */
1629
1630
efuse_addr = *pAddr;
1631
if (efuse_addr >= efuse_max_available_len) {
1632
RTW_INFO("%s: addr(%d) over avaliable(%d)!!\n", __FUNCTION__, efuse_addr, efuse_max_available_len);
1633
return _FALSE;
1634
}
1635
1636
pg_header = ((pTargetPkt->offset & 0x07) << 5) | 0x0F;
1637
/* RTW_INFO("%s: pg_header=0x%x\n", __FUNCTION__, pg_header); */
1638
1639
do {
1640
1641
rtw_efuse_bt_access(padapter, _TRUE, efuse_addr, 1, &pg_header);
1642
rtw_efuse_bt_access(padapter, _FALSE, efuse_addr, 1, &tmp_header);
1643
1644
if (tmp_header != 0xFF)
1645
break;
1646
if (repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) {
1647
RTW_INFO("%s: Repeat over limit for pg_header!!\n", __FUNCTION__);
1648
return _FALSE;
1649
}
1650
} while (1);
1651
1652
if (tmp_header != pg_header) {
1653
RTW_ERR("%s: PG Header Fail!!(pg=0x%02X read=0x%02X)\n", __FUNCTION__, pg_header, tmp_header);
1654
return _FALSE;
1655
}
1656
1657
/* to write ext_header */
1658
efuse_addr++;
1659
pg_header = ((pTargetPkt->offset & 0x78) << 1) | pTargetPkt->word_en;
1660
1661
do {
1662
rtw_efuse_bt_access(padapter, _TRUE, efuse_addr, 1, &pg_header);
1663
rtw_efuse_bt_access(padapter, _FALSE, efuse_addr, 1, &tmp_header);
1664
1665
if (tmp_header != 0xFF)
1666
break;
1667
if (repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) {
1668
RTW_INFO("%s: Repeat over limit for ext_header!!\n", __FUNCTION__);
1669
return _FALSE;
1670
}
1671
} while (1);
1672
1673
if (tmp_header != pg_header) { /* offset PG fail */
1674
RTW_ERR("%s: PG EXT Header Fail!!(pg=0x%02X read=0x%02X)\n", __FUNCTION__, pg_header, tmp_header);
1675
return _FALSE;
1676
}
1677
1678
*pAddr = efuse_addr;
1679
1680
return _TRUE;
1681
}
1682
1683
1684
static u8 hal_EfusePgPacketWrite1ByteHeader(
1685
PADAPTER pAdapter,
1686
u8 efuseType,
1687
u16 *pAddr,
1688
PPGPKT_STRUCT pTargetPkt,
1689
u8 bPseudoTest)
1690
{
1691
u8 pg_header = 0, tmp_header = 0;
1692
u16 efuse_addr = *pAddr;
1693
u8 repeatcnt = 0;
1694
1695
1696
/* RTW_INFO("%s\n", __FUNCTION__); */
1697
pg_header = ((pTargetPkt->offset << 4) & 0xf0) | pTargetPkt->word_en;
1698
1699
do {
1700
rtw_efuse_bt_access(pAdapter, _TRUE, efuse_addr, 1, &pg_header);
1701
rtw_efuse_bt_access(pAdapter, _FALSE, efuse_addr, 1, &tmp_header);
1702
1703
if (tmp_header != 0xFF)
1704
break;
1705
if (repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) {
1706
RTW_INFO("%s: Repeat over limit for pg_header!!\n", __FUNCTION__);
1707
return _FALSE;
1708
}
1709
} while (1);
1710
1711
if (tmp_header != pg_header) {
1712
RTW_ERR("%s: PG Header Fail!!(pg=0x%02X read=0x%02X)\n", __FUNCTION__, pg_header, tmp_header);
1713
return _FALSE;
1714
}
1715
1716
*pAddr = efuse_addr;
1717
1718
return _TRUE;
1719
}
1720
1721
static u8 hal_EfusePgPacketWriteHeader(
1722
PADAPTER padapter,
1723
u8 efuseType,
1724
u16 *pAddr,
1725
PPGPKT_STRUCT pTargetPkt,
1726
u8 bPseudoTest)
1727
{
1728
u8 bRet = _FALSE;
1729
1730
if (pTargetPkt->offset >= EFUSE_MAX_SECTION_BASE)
1731
bRet = hal_EfusePgPacketWrite2ByteHeader(padapter, efuseType, pAddr, pTargetPkt, bPseudoTest);
1732
else
1733
bRet = hal_EfusePgPacketWrite1ByteHeader(padapter, efuseType, pAddr, pTargetPkt, bPseudoTest);
1734
1735
return bRet;
1736
}
1737
1738
1739
static u8
1740
Hal_EfuseWordEnableDataWrite(
1741
PADAPTER padapter,
1742
u16 efuse_addr,
1743
u8 word_en,
1744
u8 *data,
1745
u8 bPseudoTest)
1746
{
1747
u16 tmpaddr = 0;
1748
u16 start_addr = efuse_addr;
1749
u8 badworden = 0x0F;
1750
u8 tmpdata[PGPKT_DATA_SIZE];
1751
1752
1753
/* RTW_INFO("%s: efuse_addr=%#x word_en=%#x\n", __FUNCTION__, efuse_addr, word_en); */
1754
_rtw_memset(tmpdata, 0xFF, PGPKT_DATA_SIZE);
1755
1756
if (!(word_en & BIT(0))) {
1757
tmpaddr = start_addr;
1758
rtw_efuse_bt_access(padapter, _TRUE, start_addr++, 1, &data[0]);
1759
rtw_efuse_bt_access(padapter, _TRUE, start_addr++, 1, &data[1]);
1760
rtw_efuse_bt_access(padapter, _FALSE, tmpaddr, 1, &tmpdata[0]);
1761
rtw_efuse_bt_access(padapter, _FALSE, tmpaddr + 1, 1, &tmpdata[1]);
1762
if ((data[0] != tmpdata[0]) || (data[1] != tmpdata[1]))
1763
badworden &= (~BIT(0));
1764
}
1765
if (!(word_en & BIT(1))) {
1766
tmpaddr = start_addr;
1767
rtw_efuse_bt_access(padapter, _TRUE, start_addr++, 1, &data[2]);
1768
rtw_efuse_bt_access(padapter, _TRUE, start_addr++, 1, &data[3]);
1769
rtw_efuse_bt_access(padapter, _FALSE, tmpaddr, 1, &tmpdata[2]);
1770
rtw_efuse_bt_access(padapter, _FALSE, tmpaddr + 1, 1, &tmpdata[3]);
1771
if ((data[2] != tmpdata[2]) || (data[3] != tmpdata[3]))
1772
badworden &= (~BIT(1));
1773
}
1774
if (!(word_en & BIT(2))) {
1775
tmpaddr = start_addr;
1776
rtw_efuse_bt_access(padapter, _TRUE, start_addr++, 1, &data[4]);
1777
rtw_efuse_bt_access(padapter, _TRUE, start_addr++, 1, &data[5]);
1778
rtw_efuse_bt_access(padapter, _FALSE, tmpaddr, 1, &tmpdata[4]);
1779
rtw_efuse_bt_access(padapter, _FALSE, tmpaddr + 1, 1, &tmpdata[5]);
1780
if ((data[4] != tmpdata[4]) || (data[5] != tmpdata[5]))
1781
badworden &= (~BIT(2));
1782
}
1783
if (!(word_en & BIT(3))) {
1784
tmpaddr = start_addr;
1785
rtw_efuse_bt_access(padapter, _TRUE, start_addr++, 1, &data[6]);
1786
rtw_efuse_bt_access(padapter, _TRUE, start_addr++, 1, &data[7]);
1787
rtw_efuse_bt_access(padapter, _FALSE, tmpaddr, 1, &tmpdata[6]);
1788
rtw_efuse_bt_access(padapter, _FALSE, tmpaddr + 1, 1, &tmpdata[7]);
1789
1790
if ((data[6] != tmpdata[6]) || (data[7] != tmpdata[7]))
1791
badworden &= (~BIT(3));
1792
}
1793
1794
return badworden;
1795
}
1796
1797
static void
1798
hal_EfuseConstructPGPkt(
1799
u8 offset,
1800
u8 word_en,
1801
u8 *pData,
1802
PPGPKT_STRUCT pTargetPkt)
1803
{
1804
_rtw_memset(pTargetPkt->data, 0xFF, PGPKT_DATA_SIZE);
1805
pTargetPkt->offset = offset;
1806
pTargetPkt->word_en = word_en;
1807
efuse_WordEnableDataRead(word_en, pData, pTargetPkt->data);
1808
pTargetPkt->word_cnts = Efuse_CalculateWordCnts(pTargetPkt->word_en);
1809
}
1810
1811
static u8
1812
hal_EfusePgPacketWriteData(
1813
PADAPTER pAdapter,
1814
u8 efuseType,
1815
u16 *pAddr,
1816
PPGPKT_STRUCT pTargetPkt,
1817
u8 bPseudoTest)
1818
{
1819
u16 efuse_addr;
1820
u8 badworden;
1821
1822
efuse_addr = *pAddr;
1823
badworden = Hal_EfuseWordEnableDataWrite(pAdapter, efuse_addr + 1, pTargetPkt->word_en, pTargetPkt->data, bPseudoTest);
1824
if (badworden != 0x0F) {
1825
RTW_INFO("%s: Fail!!\n", __FUNCTION__);
1826
return _FALSE;
1827
} else
1828
RTW_INFO("%s: OK!!\n", __FUNCTION__);
1829
1830
return _TRUE;
1831
}
1832
1833
u8 efuse_OneByteRead(struct _ADAPTER *a, u16 addr, u8 *data, u8 bPseudoTest)
1834
{
1835
struct dvobj_priv *d;
1836
int err;
1837
u8 ret = _TRUE;
1838
1839
d = adapter_to_dvobj(a);
1840
err = rtw_halmac_read_physical_efuse(d, addr, 1, data);
1841
if (err) {
1842
RTW_ERR("%s: addr=0x%x FAIL!!!\n", __FUNCTION__, addr);
1843
ret = _FALSE;
1844
}
1845
1846
return ret;
1847
1848
}
1849
1850
static u16
1851
hal_EfuseGetCurrentSize_BT(
1852
PADAPTER padapter,
1853
u8 bPseudoTest)
1854
{
1855
#ifdef HAL_EFUSE_MEMORY
1856
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
1857
PEFUSE_HAL pEfuseHal = &pHalData->EfuseHal;
1858
#endif
1859
u16 btusedbytes;
1860
u16 efuse_addr;
1861
u8 bank, startBank;
1862
u8 hoffset = 0, hworden = 0;
1863
u8 efuse_data, word_cnts = 0;
1864
u16 retU2 = 0;
1865
1866
1867
btusedbytes = fakeBTEfuseUsedBytes;
1868
1869
efuse_addr = (u16)((btusedbytes % EFUSE_BT_REAL_BANK_CONTENT_LEN));
1870
startBank = (u8)(1 + (btusedbytes / EFUSE_BT_REAL_BANK_CONTENT_LEN));
1871
1872
RTW_INFO("%s: start from bank=%d addr=0x%X\n", __FUNCTION__, startBank, efuse_addr);
1873
retU2 = EFUSE_BT_REAL_CONTENT_LEN - EFUSE_PROTECT_BYTES_BANK;
1874
1875
for (bank = startBank; bank < 3; bank++) {
1876
if (hal_EfuseSwitchToBank(padapter, bank, bPseudoTest) == _FALSE) {
1877
RTW_ERR("%s: switch bank(%d) Fail!!\n", __FUNCTION__, bank);
1878
/* bank = EFUSE_MAX_BANK; */
1879
break;
1880
}
1881
1882
/* only when bank is switched we have to reset the efuse_addr. */
1883
if (bank != startBank)
1884
efuse_addr = 0;
1885
1886
1887
while (AVAILABLE_EFUSE_ADDR(efuse_addr)) {
1888
if (rtw_efuse_bt_access(padapter, _FALSE, efuse_addr, 1, &efuse_data) == _FALSE) {
1889
RTW_ERR("%s: efuse_OneByteRead Fail! addr=0x%X !!\n", __FUNCTION__, efuse_addr);
1890
/* bank = EFUSE_MAX_BANK; */
1891
break;
1892
}
1893
RTW_INFO("%s: efuse_OneByteRead ! addr=0x%X !efuse_data=0x%X! bank =%d\n", __FUNCTION__, efuse_addr, efuse_data, bank);
1894
1895
if (efuse_data == 0xFF)
1896
break;
1897
1898
if (EXT_HEADER(efuse_data)) {
1899
hoffset = GET_HDR_OFFSET_2_0(efuse_data);
1900
efuse_addr++;
1901
rtw_efuse_bt_access(padapter, _FALSE, efuse_addr, 1, &efuse_data);
1902
RTW_INFO("%s: efuse_OneByteRead EXT_HEADER ! addr=0x%X !efuse_data=0x%X! bank =%d\n", __FUNCTION__, efuse_addr, efuse_data, bank);
1903
1904
if (ALL_WORDS_DISABLED(efuse_data)) {
1905
efuse_addr++;
1906
continue;
1907
}
1908
1909
/* hoffset = ((hoffset & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1); */
1910
hoffset |= ((efuse_data & 0xF0) >> 1);
1911
hworden = efuse_data & 0x0F;
1912
} else {
1913
hoffset = (efuse_data >> 4) & 0x0F;
1914
hworden = efuse_data & 0x0F;
1915
}
1916
1917
RTW_INFO(FUNC_ADPT_FMT": Offset=%d Worden=%#X\n",
1918
FUNC_ADPT_ARG(padapter), hoffset, hworden);
1919
1920
word_cnts = Efuse_CalculateWordCnts(hworden);
1921
/* read next header */
1922
efuse_addr += (word_cnts * 2) + 1;
1923
}
1924
/* Check if we need to check next bank efuse */
1925
if (efuse_addr < retU2)
1926
break;/* don't need to check next bank. */
1927
}
1928
retU2 = ((bank - 1) * EFUSE_BT_REAL_BANK_CONTENT_LEN) + efuse_addr;
1929
1930
fakeBTEfuseUsedBytes = retU2;
1931
RTW_INFO("%s: CurrentSize=%d\n", __FUNCTION__, retU2);
1932
return retU2;
1933
}
1934
1935
1936
static u8
1937
hal_BT_EfusePgCheckAvailableAddr(
1938
PADAPTER pAdapter,
1939
u8 bPseudoTest)
1940
{
1941
u16 max_available = EFUSE_BT_REAL_CONTENT_LEN - EFUSE_PROTECT_BYTES_BANK;
1942
u16 current_size = 0;
1943
1944
RTW_INFO("%s: max_available=%d\n", __FUNCTION__, max_available);
1945
current_size = hal_EfuseGetCurrentSize_BT(pAdapter, bPseudoTest);
1946
if (current_size >= max_available) {
1947
RTW_INFO("%s: Error!! current_size(%d)>max_available(%d)\n", __FUNCTION__, current_size, max_available);
1948
return _FALSE;
1949
}
1950
return _TRUE;
1951
}
1952
1953
u8 EfusePgPacketWrite_BT(
1954
PADAPTER pAdapter,
1955
u8 offset,
1956
u8 word_en,
1957
u8 *pData,
1958
u8 bPseudoTest)
1959
{
1960
PGPKT_STRUCT targetPkt;
1961
u16 startAddr = 0;
1962
u8 efuseType = EFUSE_BT;
1963
1964
if (!hal_BT_EfusePgCheckAvailableAddr(pAdapter, bPseudoTest))
1965
return _FALSE;
1966
1967
hal_EfuseConstructPGPkt(offset, word_en, pData, &targetPkt);
1968
1969
if (!hal_EfusePartialWriteCheck(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest))
1970
return _FALSE;
1971
1972
if (!hal_EfusePgPacketWriteHeader(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest))
1973
return _FALSE;
1974
1975
if (!hal_EfusePgPacketWriteData(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest))
1976
return _FALSE;
1977
1978
return _TRUE;
1979
}
1980
1981
1982
#else /* !RTW_HALMAC */
1983
/* ------------------------------------------------------------------------------ */
1984
#define REG_EFUSE_CTRL 0x0030
1985
#define EFUSE_CTRL REG_EFUSE_CTRL /* E-Fuse Control. */
1986
/* ------------------------------------------------------------------------------ */
1987
1988
1989
BOOLEAN
1990
Efuse_Read1ByteFromFakeContent(
1991
PADAPTER pAdapter,
1992
u16 Offset,
1993
u8 *Value);
1994
BOOLEAN
1995
Efuse_Read1ByteFromFakeContent(
1996
PADAPTER pAdapter,
1997
u16 Offset,
1998
u8 *Value)
1999
{
2000
if (Offset >= EFUSE_MAX_HW_SIZE)
2001
return _FALSE;
2002
/* DbgPrint("Read fake content, offset = %d\n", Offset); */
2003
if (fakeEfuseBank == 0)
2004
*Value = fakeEfuseContent[Offset];
2005
else
2006
*Value = fakeBTEfuseContent[fakeEfuseBank - 1][Offset];
2007
return _TRUE;
2008
}
2009
2010
BOOLEAN
2011
Efuse_Write1ByteToFakeContent(
2012
PADAPTER pAdapter,
2013
u16 Offset,
2014
u8 Value);
2015
BOOLEAN
2016
Efuse_Write1ByteToFakeContent(
2017
PADAPTER pAdapter,
2018
u16 Offset,
2019
u8 Value)
2020
{
2021
if (Offset >= EFUSE_MAX_HW_SIZE)
2022
return _FALSE;
2023
if (fakeEfuseBank == 0)
2024
fakeEfuseContent[Offset] = Value;
2025
else
2026
fakeBTEfuseContent[fakeEfuseBank - 1][Offset] = Value;
2027
return _TRUE;
2028
}
2029
2030
/*-----------------------------------------------------------------------------
2031
* Function: Efuse_PowerSwitch
2032
*
2033
* Overview: When we want to enable write operation, we should change to
2034
* pwr on state. When we stop write, we should switch to 500k mode
2035
* and disable LDO 2.5V.
2036
*
2037
* Input: NONE
2038
*
2039
* Output: NONE
2040
*
2041
* Return: NONE
2042
*
2043
* Revised History:
2044
* When Who Remark
2045
* 11/17/2008 MHC Create Version 0.
2046
*
2047
*---------------------------------------------------------------------------*/
2048
void
2049
Efuse_PowerSwitch(
2050
PADAPTER pAdapter,
2051
u8 bWrite,
2052
u8 PwrState)
2053
{
2054
pAdapter->hal_func.EfusePowerSwitch(pAdapter, bWrite, PwrState);
2055
}
2056
2057
void
2058
BTEfuse_PowerSwitch(
2059
PADAPTER pAdapter,
2060
u8 bWrite,
2061
u8 PwrState)
2062
{
2063
if (pAdapter->hal_func.BTEfusePowerSwitch)
2064
pAdapter->hal_func.BTEfusePowerSwitch(pAdapter, bWrite, PwrState);
2065
}
2066
2067
/*-----------------------------------------------------------------------------
2068
* Function: efuse_GetCurrentSize
2069
*
2070
* Overview: Get current efuse size!!!
2071
*
2072
* Input: NONE
2073
*
2074
* Output: NONE
2075
*
2076
* Return: NONE
2077
*
2078
* Revised History:
2079
* When Who Remark
2080
* 11/16/2008 MHC Create Version 0.
2081
*
2082
*---------------------------------------------------------------------------*/
2083
u16
2084
Efuse_GetCurrentSize(
2085
PADAPTER pAdapter,
2086
u8 efuseType,
2087
BOOLEAN bPseudoTest)
2088
{
2089
u16 ret = 0;
2090
2091
ret = pAdapter->hal_func.EfuseGetCurrentSize(pAdapter, efuseType, bPseudoTest);
2092
2093
return ret;
2094
}
2095
2096
/*
2097
* Description:
2098
* Execute E-Fuse read byte operation.
2099
* Refered from SD1 Richard.
2100
*
2101
* Assumption:
2102
* 1. Boot from E-Fuse and successfully auto-load.
2103
* 2. PASSIVE_LEVEL (USB interface)
2104
*
2105
* Created by Roger, 2008.10.21.
2106
* */
2107
void
2108
ReadEFuseByte(
2109
PADAPTER Adapter,
2110
u16 _offset,
2111
u8 *pbuf,
2112
BOOLEAN bPseudoTest)
2113
{
2114
u32 value32;
2115
u8 readbyte;
2116
u16 retry;
2117
/* systime start=rtw_get_current_time(); */
2118
2119
if (bPseudoTest) {
2120
Efuse_Read1ByteFromFakeContent(Adapter, _offset, pbuf);
2121
return;
2122
}
2123
if (IS_HARDWARE_TYPE_8723B(Adapter)) {
2124
/* <20130121, Kordan> For SMIC S55 EFUSE specificatoin. */
2125
/* 0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8]) */
2126
phy_set_mac_reg(Adapter, EFUSE_TEST, BIT11, 0);
2127
}
2128
/* Write Address */
2129
rtw_write8(Adapter, EFUSE_CTRL + 1, (_offset & 0xff));
2130
readbyte = rtw_read8(Adapter, EFUSE_CTRL + 2);
2131
rtw_write8(Adapter, EFUSE_CTRL + 2, ((_offset >> 8) & 0x03) | (readbyte & 0xfc));
2132
2133
/* Write bit 32 0 */
2134
readbyte = rtw_read8(Adapter, EFUSE_CTRL + 3);
2135
rtw_write8(Adapter, EFUSE_CTRL + 3, (readbyte & 0x7f));
2136
2137
/* Check bit 32 read-ready */
2138
retry = 0;
2139
value32 = rtw_read32(Adapter, EFUSE_CTRL);
2140
/* while(!(((value32 >> 24) & 0xff) & 0x80) && (retry<10)) */
2141
while (!(((value32 >> 24) & 0xff) & 0x80) && (retry < 10000)) {
2142
value32 = rtw_read32(Adapter, EFUSE_CTRL);
2143
retry++;
2144
}
2145
2146
/* 20100205 Joseph: Add delay suggested by SD1 Victor. */
2147
/* This fix the problem that Efuse read error in high temperature condition. */
2148
/* Designer says that there shall be some delay after ready bit is set, or the */
2149
/* result will always stay on last data we read. */
2150
rtw_udelay_os(50);
2151
value32 = rtw_read32(Adapter, EFUSE_CTRL);
2152
2153
*pbuf = (u8)(value32 & 0xff);
2154
/* RTW_INFO("ReadEFuseByte _offset:%08u, in %d ms\n",_offset ,rtw_get_passing_time_ms(start)); */
2155
2156
}
2157
2158
/*
2159
* Description:
2160
* 1. Execute E-Fuse read byte operation according as map offset and
2161
* save to E-Fuse table.
2162
* 2. Refered from SD1 Richard.
2163
*
2164
* Assumption:
2165
* 1. Boot from E-Fuse and successfully auto-load.
2166
* 2. PASSIVE_LEVEL (USB interface)
2167
*
2168
* Created by Roger, 2008.10.21.
2169
*
2170
* 2008/12/12 MH 1. Reorganize code flow and reserve bytes. and add description.
2171
* 2. Add efuse utilization collect.
2172
* 2008/12/22 MH Read Efuse must check if we write section 1 data again!!! Sec1
2173
* write addr must be after sec5.
2174
* */
2175
2176
void
2177
efuse_ReadEFuse(
2178
PADAPTER Adapter,
2179
u8 efuseType,
2180
u16 _offset,
2181
u16 _size_byte,
2182
u8 *pbuf,
2183
BOOLEAN bPseudoTest
2184
);
2185
void
2186
efuse_ReadEFuse(
2187
PADAPTER Adapter,
2188
u8 efuseType,
2189
u16 _offset,
2190
u16 _size_byte,
2191
u8 *pbuf,
2192
BOOLEAN bPseudoTest
2193
)
2194
{
2195
Adapter->hal_func.ReadEFuse(Adapter, efuseType, _offset, _size_byte, pbuf, bPseudoTest);
2196
}
2197
2198
void
2199
EFUSE_GetEfuseDefinition(
2200
PADAPTER pAdapter,
2201
u8 efuseType,
2202
u8 type,
2203
void *pOut,
2204
BOOLEAN bPseudoTest
2205
)
2206
{
2207
pAdapter->hal_func.EFUSEGetEfuseDefinition(pAdapter, efuseType, type, pOut, bPseudoTest);
2208
}
2209
2210
2211
/* 11/16/2008 MH Read one byte from real Efuse. */
2212
u8
2213
efuse_OneByteRead(
2214
PADAPTER pAdapter,
2215
u16 addr,
2216
u8 *data,
2217
BOOLEAN bPseudoTest)
2218
{
2219
u32 tmpidx = 0;
2220
u8 bResult;
2221
u8 readbyte;
2222
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
2223
2224
/* RTW_INFO("===> EFUSE_OneByteRead(), addr = %x\n", addr); */
2225
/* RTW_INFO("===> EFUSE_OneByteRead() start, 0x34 = 0x%X\n", rtw_read32(pAdapter, EFUSE_TEST)); */
2226
2227
if (bPseudoTest) {
2228
bResult = Efuse_Read1ByteFromFakeContent(pAdapter, addr, data);
2229
return bResult;
2230
}
2231
2232
#ifdef CONFIG_RTL8710B
2233
/* <20171208, Peter>, Dont do the following write16(0x34) */
2234
if (IS_HARDWARE_TYPE_8710B(pAdapter)) {
2235
bResult = pAdapter->hal_func.efuse_indirect_read4(pAdapter, addr, data);
2236
return bResult;
2237
}
2238
#endif
2239
2240
if (IS_HARDWARE_TYPE_8723B(pAdapter) ||
2241
(IS_HARDWARE_TYPE_8192E(pAdapter) && (!IS_A_CUT(pHalData->version_id))) ||
2242
(IS_VENDOR_8188E_I_CUT_SERIES(pAdapter)) || (IS_CHIP_VENDOR_SMIC(pHalData->version_id))
2243
) {
2244
/* <20130121, Kordan> For SMIC EFUSE specificatoin. */
2245
/* 0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8]) */
2246
/* phy_set_mac_reg(pAdapter, 0x34, BIT11, 0); */
2247
rtw_write16(pAdapter, 0x34, rtw_read16(pAdapter, 0x34) & (~BIT11));
2248
}
2249
2250
/* -----------------e-fuse reg ctrl --------------------------------- */
2251
/* address */
2252
rtw_write8(pAdapter, EFUSE_CTRL + 1, (u8)(addr & 0xff));
2253
rtw_write8(pAdapter, EFUSE_CTRL + 2, ((u8)((addr >> 8) & 0x03)) |
2254
(rtw_read8(pAdapter, EFUSE_CTRL + 2) & 0xFC));
2255
2256
/* rtw_write8(pAdapter, EFUSE_CTRL+3, 0x72); */ /* read cmd */
2257
/* Write bit 32 0 */
2258
readbyte = rtw_read8(pAdapter, EFUSE_CTRL + 3);
2259
rtw_write8(pAdapter, EFUSE_CTRL + 3, (readbyte & 0x7f));
2260
2261
while (!(0x80 & rtw_read8(pAdapter, EFUSE_CTRL + 3)) && (tmpidx < 1000)) {
2262
rtw_mdelay_os(1);
2263
tmpidx++;
2264
}
2265
if (tmpidx < 100) {
2266
*data = rtw_read8(pAdapter, EFUSE_CTRL);
2267
bResult = _TRUE;
2268
} else {
2269
*data = 0xff;
2270
bResult = _FALSE;
2271
RTW_INFO("%s: [ERROR] addr=0x%x bResult=%d time out 1s !!!\n", __FUNCTION__, addr, bResult);
2272
RTW_INFO("%s: [ERROR] EFUSE_CTRL =0x%08x !!!\n", __FUNCTION__, rtw_read32(pAdapter, EFUSE_CTRL));
2273
}
2274
2275
return bResult;
2276
}
2277
2278
/* 11/16/2008 MH Write one byte to reald Efuse. */
2279
u8
2280
efuse_OneByteWrite(
2281
PADAPTER pAdapter,
2282
u16 addr,
2283
u8 data,
2284
BOOLEAN bPseudoTest)
2285
{
2286
u8 tmpidx = 0;
2287
u8 bResult = _FALSE;
2288
u32 efuseValue = 0;
2289
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
2290
2291
/* RTW_INFO("===> EFUSE_OneByteWrite(), addr = %x data=%x\n", addr, data); */
2292
/* RTW_INFO("===> EFUSE_OneByteWrite() start, 0x34 = 0x%X\n", rtw_read32(pAdapter, EFUSE_TEST)); */
2293
2294
if (bPseudoTest) {
2295
bResult = Efuse_Write1ByteToFakeContent(pAdapter, addr, data);
2296
return bResult;
2297
}
2298
2299
Efuse_PowerSwitch(pAdapter, _TRUE, _TRUE);
2300
2301
/* -----------------e-fuse reg ctrl --------------------------------- */
2302
/* address */
2303
2304
2305
efuseValue = rtw_read32(pAdapter, EFUSE_CTRL);
2306
efuseValue |= (BIT21 | BIT31);
2307
efuseValue &= ~(0x3FFFF);
2308
efuseValue |= ((addr << 8 | data) & 0x3FFFF);
2309
2310
/* <20130227, Kordan> 8192E MP chip A-cut had better not set 0x34[11] until B-Cut. */
2311
if (IS_HARDWARE_TYPE_8723B(pAdapter) ||
2312
(IS_HARDWARE_TYPE_8192E(pAdapter) && (!IS_A_CUT(pHalData->version_id))) ||
2313
(IS_VENDOR_8188E_I_CUT_SERIES(pAdapter)) || (IS_CHIP_VENDOR_SMIC(pHalData->version_id))
2314
) {
2315
/* <20130121, Kordan> For SMIC EFUSE specificatoin. */
2316
/* 0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8]) */
2317
/* phy_set_mac_reg(pAdapter, 0x34, BIT11, 1); */
2318
rtw_write16(pAdapter, 0x34, rtw_read16(pAdapter, 0x34) | (BIT11));
2319
rtw_write32(pAdapter, EFUSE_CTRL, 0x90600000 | ((addr << 8 | data)));
2320
} else
2321
rtw_write32(pAdapter, EFUSE_CTRL, efuseValue);
2322
2323
rtw_mdelay_os(1);
2324
2325
while ((0x80 & rtw_read8(pAdapter, EFUSE_CTRL + 3)) && (tmpidx < 100)) {
2326
rtw_mdelay_os(1);
2327
tmpidx++;
2328
}
2329
2330
if (tmpidx < 100)
2331
bResult = _TRUE;
2332
else {
2333
bResult = _FALSE;
2334
RTW_INFO("%s: [ERROR] addr=0x%x ,efuseValue=0x%x ,bResult=%d time out 1s !!!\n",
2335
__FUNCTION__, addr, efuseValue, bResult);
2336
RTW_INFO("%s: [ERROR] EFUSE_CTRL =0x%08x !!!\n", __FUNCTION__, rtw_read32(pAdapter, EFUSE_CTRL));
2337
}
2338
2339
/* disable Efuse program enable */
2340
if (IS_HARDWARE_TYPE_8723B(pAdapter) ||
2341
(IS_HARDWARE_TYPE_8192E(pAdapter) && (!IS_A_CUT(pHalData->version_id))) ||
2342
(IS_VENDOR_8188E_I_CUT_SERIES(pAdapter)) || (IS_CHIP_VENDOR_SMIC(pHalData->version_id))
2343
)
2344
phy_set_mac_reg(pAdapter, EFUSE_TEST, BIT(11), 0);
2345
2346
Efuse_PowerSwitch(pAdapter, _TRUE, _FALSE);
2347
2348
return bResult;
2349
}
2350
2351
int
2352
Efuse_PgPacketRead(PADAPTER pAdapter,
2353
u8 offset,
2354
u8 *data,
2355
BOOLEAN bPseudoTest)
2356
{
2357
int ret = 0;
2358
2359
ret = pAdapter->hal_func.Efuse_PgPacketRead(pAdapter, offset, data, bPseudoTest);
2360
2361
return ret;
2362
}
2363
2364
int
2365
Efuse_PgPacketWrite(PADAPTER pAdapter,
2366
u8 offset,
2367
u8 word_en,
2368
u8 *data,
2369
BOOLEAN bPseudoTest)
2370
{
2371
int ret;
2372
2373
ret = pAdapter->hal_func.Efuse_PgPacketWrite(pAdapter, offset, word_en, data, bPseudoTest);
2374
2375
return ret;
2376
}
2377
2378
2379
int
2380
Efuse_PgPacketWrite_BT(PADAPTER pAdapter,
2381
u8 offset,
2382
u8 word_en,
2383
u8 *data,
2384
BOOLEAN bPseudoTest)
2385
{
2386
int ret;
2387
2388
ret = pAdapter->hal_func.Efuse_PgPacketWrite_BT(pAdapter, offset, word_en, data, bPseudoTest);
2389
2390
return ret;
2391
}
2392
2393
2394
u8
2395
Efuse_WordEnableDataWrite(PADAPTER pAdapter,
2396
u16 efuse_addr,
2397
u8 word_en,
2398
u8 *data,
2399
BOOLEAN bPseudoTest)
2400
{
2401
u8 ret = 0;
2402
2403
ret = pAdapter->hal_func.Efuse_WordEnableDataWrite(pAdapter, efuse_addr, word_en, data, bPseudoTest);
2404
2405
return ret;
2406
}
2407
2408
static u8 efuse_read8(PADAPTER padapter, u16 address, u8 *value)
2409
{
2410
return efuse_OneByteRead(padapter, address, value, _FALSE);
2411
}
2412
2413
static u8 efuse_write8(PADAPTER padapter, u16 address, u8 *value)
2414
{
2415
return efuse_OneByteWrite(padapter, address, *value, _FALSE);
2416
}
2417
2418
/*
2419
* read/wirte raw efuse data
2420
*/
2421
u8 rtw_efuse_access(PADAPTER padapter, u8 bWrite, u16 start_addr, u16 cnts, u8 *data)
2422
{
2423
int i = 0;
2424
u16 real_content_len = 0, max_available_size = 0;
2425
u8 res = _FAIL ;
2426
u8(*rw8)(PADAPTER, u16, u8 *);
2427
u32 backupRegs[4] = {0};
2428
2429
2430
EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_REAL_CONTENT_LEN, (void *)&real_content_len, _FALSE);
2431
EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (void *)&max_available_size, _FALSE);
2432
2433
if (start_addr > real_content_len)
2434
return _FAIL;
2435
2436
if (_TRUE == bWrite) {
2437
if ((start_addr + cnts) > max_available_size)
2438
return _FAIL;
2439
rw8 = &efuse_write8;
2440
} else
2441
rw8 = &efuse_read8;
2442
2443
efuse_PreUpdateAction(padapter, backupRegs);
2444
2445
Efuse_PowerSwitch(padapter, bWrite, _TRUE);
2446
2447
/* e-fuse one byte read / write */
2448
for (i = 0; i < cnts; i++) {
2449
if (start_addr >= real_content_len) {
2450
res = _FAIL;
2451
break;
2452
}
2453
2454
res = rw8(padapter, start_addr++, data++);
2455
if (_FAIL == res)
2456
break;
2457
}
2458
2459
Efuse_PowerSwitch(padapter, bWrite, _FALSE);
2460
2461
efuse_PostUpdateAction(padapter, backupRegs);
2462
2463
return res;
2464
}
2465
/* ------------------------------------------------------------------------------ */
2466
u16 efuse_GetMaxSize(PADAPTER padapter)
2467
{
2468
u16 max_size;
2469
2470
max_size = 0;
2471
EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI , TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (void *)&max_size, _FALSE);
2472
return max_size;
2473
}
2474
/* ------------------------------------------------------------------------------ */
2475
u8 efuse_GetCurrentSize(PADAPTER padapter, u16 *size)
2476
{
2477
Efuse_PowerSwitch(padapter, _FALSE, _TRUE);
2478
*size = Efuse_GetCurrentSize(padapter, EFUSE_WIFI, _FALSE);
2479
Efuse_PowerSwitch(padapter, _FALSE, _FALSE);
2480
2481
return _SUCCESS;
2482
}
2483
/* ------------------------------------------------------------------------------ */
2484
u16 efuse_bt_GetMaxSize(PADAPTER padapter)
2485
{
2486
u16 max_size;
2487
2488
max_size = 0;
2489
EFUSE_GetEfuseDefinition(padapter, EFUSE_BT , TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (void *)&max_size, _FALSE);
2490
return max_size;
2491
}
2492
2493
u8 efuse_bt_GetCurrentSize(PADAPTER padapter, u16 *size)
2494
{
2495
Efuse_PowerSwitch(padapter, _FALSE, _TRUE);
2496
*size = Efuse_GetCurrentSize(padapter, EFUSE_BT, _FALSE);
2497
Efuse_PowerSwitch(padapter, _FALSE, _FALSE);
2498
2499
return _SUCCESS;
2500
}
2501
2502
u8 rtw_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)
2503
{
2504
u16 mapLen = 0;
2505
2506
EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (void *)&mapLen, _FALSE);
2507
2508
if ((addr + cnts) > mapLen)
2509
return _FAIL;
2510
2511
Efuse_PowerSwitch(padapter, _FALSE, _TRUE);
2512
2513
efuse_ReadEFuse(padapter, EFUSE_WIFI, addr, cnts, data, _FALSE);
2514
2515
Efuse_PowerSwitch(padapter, _FALSE, _FALSE);
2516
2517
return _SUCCESS;
2518
}
2519
2520
u8 rtw_BT_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)
2521
{
2522
u16 mapLen = 0;
2523
2524
EFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_EFUSE_MAP_LEN, (void *)&mapLen, _FALSE);
2525
2526
if ((addr + cnts) > mapLen)
2527
return _FAIL;
2528
2529
Efuse_PowerSwitch(padapter, _FALSE, _TRUE);
2530
2531
efuse_ReadEFuse(padapter, EFUSE_BT, addr, cnts, data, _FALSE);
2532
2533
Efuse_PowerSwitch(padapter, _FALSE, _FALSE);
2534
2535
return _SUCCESS;
2536
}
2537
2538
/* ------------------------------------------------------------------------------ */
2539
u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)
2540
{
2541
#define RT_ASSERT_RET(expr) \
2542
if (!(expr)) { \
2543
printk("Assertion failed! %s at ......\n", #expr); \
2544
printk(" ......%s,%s, line=%d\n",__FILE__, __FUNCTION__, __LINE__); \
2545
return _FAIL; \
2546
}
2547
2548
u8 *efuse = NULL;
2549
u8 offset, word_en;
2550
u8 *map = NULL;
2551
u8 newdata[PGPKT_DATA_SIZE];
2552
s32 i, j, idx, chk_total_byte;
2553
u8 ret = _SUCCESS;
2554
u16 mapLen = 0, startAddr = 0, efuse_max_available_len = 0;
2555
u32 backupRegs[4] = {0};
2556
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
2557
PEFUSE_HAL pEfuseHal = &pHalData->EfuseHal;
2558
2559
2560
EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (void *)&mapLen, _FALSE);
2561
EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, &efuse_max_available_len, _FALSE);
2562
2563
if ((addr + cnts) > mapLen)
2564
return _FAIL;
2565
2566
RT_ASSERT_RET(PGPKT_DATA_SIZE == 8); /* have to be 8 byte alignment */
2567
RT_ASSERT_RET((mapLen & 0x7) == 0); /* have to be PGPKT_DATA_SIZE alignment for memcpy */
2568
2569
efuse = rtw_zmalloc(mapLen);
2570
if (!efuse)
2571
return _FAIL;
2572
2573
map = rtw_zmalloc(mapLen);
2574
if (map == NULL) {
2575
rtw_mfree(efuse, mapLen);
2576
return _FAIL;
2577
}
2578
2579
_rtw_memset(map, 0xFF, mapLen);
2580
2581
ret = rtw_efuse_map_read(padapter, 0, mapLen, map);
2582
if (ret == _FAIL)
2583
goto exit;
2584
2585
_rtw_memcpy(efuse , map, mapLen);
2586
_rtw_memcpy(efuse + addr, data, cnts);
2587
2588
if (padapter->registrypriv.boffefusemask == 0) {
2589
for (i = 0; i < cnts; i++) {
2590
if (padapter->registrypriv.bFileMaskEfuse == _TRUE) {
2591
if (rtw_file_efuse_IsMasked(padapter, addr + i, maskfileBuffer)) /*use file efuse mask. */
2592
efuse[addr + i] = map[addr + i];
2593
} else {
2594
if (efuse_IsMasked(padapter, addr + i))
2595
efuse[addr + i] = map[addr + i];
2596
}
2597
RTW_INFO("%s , data[%d] = %x, map[addr+i]= %x\n", __func__, addr + i, efuse[ addr + i], map[addr + i]);
2598
}
2599
}
2600
/*Efuse_PowerSwitch(padapter, _TRUE, _TRUE);*/
2601
2602
chk_total_byte = 0;
2603
idx = 0;
2604
offset = (addr >> 3);
2605
2606
while (idx < cnts) {
2607
word_en = 0xF;
2608
j = (addr + idx) & 0x7;
2609
for (i = j; i < PGPKT_DATA_SIZE && idx < cnts; i++, idx++) {
2610
if (efuse[addr + idx] != map[addr + idx])
2611
word_en &= ~BIT(i >> 1);
2612
}
2613
2614
if (word_en != 0xF) {
2615
chk_total_byte += Efuse_CalculateWordCnts(word_en) * 2;
2616
2617
if (offset >= EFUSE_MAX_SECTION_BASE) /* Over EFUSE_MAX_SECTION 16 for 2 ByteHeader */
2618
chk_total_byte += 2;
2619
else
2620
chk_total_byte += 1;
2621
}
2622
2623
offset++;
2624
}
2625
2626
RTW_INFO("Total PG bytes Count = %d\n", chk_total_byte);
2627
rtw_hal_get_hwreg(padapter, HW_VAR_EFUSE_BYTES, (u8 *)&startAddr);
2628
2629
if (startAddr == 0) {
2630
startAddr = Efuse_GetCurrentSize(padapter, EFUSE_WIFI, _FALSE);
2631
RTW_INFO("%s: Efuse_GetCurrentSize startAddr=%#X\n", __func__, startAddr);
2632
}
2633
RTW_DBG("%s: startAddr=%#X\n", __func__, startAddr);
2634
2635
if ((startAddr + chk_total_byte) >= efuse_max_available_len) {
2636
RTW_INFO("%s: startAddr(0x%X) + PG data len %d >= efuse_max_available_len(0x%X)\n",
2637
__func__, startAddr, chk_total_byte, efuse_max_available_len);
2638
ret = _FAIL;
2639
goto exit;
2640
}
2641
2642
efuse_PreUpdateAction(padapter, backupRegs);
2643
2644
idx = 0;
2645
offset = (addr >> 3);
2646
while (idx < cnts) {
2647
word_en = 0xF;
2648
j = (addr + idx) & 0x7;
2649
_rtw_memcpy(newdata, &map[offset << 3], PGPKT_DATA_SIZE);
2650
for (i = j; i < PGPKT_DATA_SIZE && idx < cnts; i++, idx++) {
2651
if (efuse[addr + idx] != map[addr + idx]) {
2652
word_en &= ~BIT(i >> 1);
2653
newdata[i] = efuse[addr + idx];
2654
#ifdef CONFIG_RTL8723B
2655
if (addr + idx == 0x8) {
2656
if (IS_C_CUT(pHalData->version_id) || IS_B_CUT(pHalData->version_id)) {
2657
if (pHalData->adjuseVoltageVal == 6) {
2658
newdata[i] = map[addr + idx];
2659
RTW_INFO(" %s ,\n adjuseVoltageVal = %d ,newdata[%d] = %x\n", __func__, pHalData->adjuseVoltageVal, i, newdata[i]);
2660
}
2661
}
2662
}
2663
#endif
2664
}
2665
}
2666
2667
if (word_en != 0xF) {
2668
ret = Efuse_PgPacketWrite(padapter, offset, word_en, newdata, _FALSE);
2669
RTW_INFO("offset=%x\n", offset);
2670
RTW_INFO("word_en=%x\n", word_en);
2671
2672
for (i = 0; i < PGPKT_DATA_SIZE; i++)
2673
RTW_INFO("data=%x \t", newdata[i]);
2674
if (ret == _FAIL)
2675
break;
2676
}
2677
2678
offset++;
2679
}
2680
2681
/*Efuse_PowerSwitch(padapter, _TRUE, _FALSE);*/
2682
2683
efuse_PostUpdateAction(padapter, backupRegs);
2684
2685
exit:
2686
2687
rtw_mfree(map, mapLen);
2688
rtw_mfree(efuse, mapLen);
2689
2690
return ret;
2691
}
2692
2693
2694
u8 rtw_BT_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)
2695
{
2696
#define RT_ASSERT_RET(expr) \
2697
if (!(expr)) { \
2698
printk("Assertion failed! %s at ......\n", #expr); \
2699
printk(" ......%s,%s, line=%d\n",__FILE__, __FUNCTION__, __LINE__); \
2700
return _FAIL; \
2701
}
2702
2703
u8 offset, word_en;
2704
u8 *map;
2705
u8 newdata[PGPKT_DATA_SIZE];
2706
s32 i = 0, j = 0, idx;
2707
u8 ret = _SUCCESS;
2708
u16 mapLen = 0;
2709
2710
EFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_EFUSE_MAP_LEN, (void *)&mapLen, _FALSE);
2711
2712
if ((addr + cnts) > mapLen)
2713
return _FAIL;
2714
2715
RT_ASSERT_RET(PGPKT_DATA_SIZE == 8); /* have to be 8 byte alignment */
2716
RT_ASSERT_RET((mapLen & 0x7) == 0); /* have to be PGPKT_DATA_SIZE alignment for memcpy */
2717
2718
map = rtw_zmalloc(mapLen);
2719
if (map == NULL)
2720
return _FAIL;
2721
2722
ret = rtw_BT_efuse_map_read(padapter, 0, mapLen, map);
2723
if (ret == _FAIL)
2724
goto exit;
2725
RTW_INFO("OFFSET\tVALUE(hex)\n");
2726
for (i = 0; i < 1024; i += 16) { /* set 512 because the iwpriv's extra size have limit 0x7FF */
2727
RTW_INFO("0x%03x\t", i);
2728
for (j = 0; j < 8; j++)
2729
RTW_INFO("%02X ", map[i + j]);
2730
RTW_INFO("\t");
2731
for (; j < 16; j++)
2732
RTW_INFO("%02X ", map[i + j]);
2733
RTW_INFO("\n");
2734
}
2735
RTW_INFO("\n");
2736
Efuse_PowerSwitch(padapter, _TRUE, _TRUE);
2737
2738
idx = 0;
2739
offset = (addr >> 3);
2740
while (idx < cnts) {
2741
word_en = 0xF;
2742
j = (addr + idx) & 0x7;
2743
_rtw_memcpy(newdata, &map[offset << 3], PGPKT_DATA_SIZE);
2744
for (i = j; i < PGPKT_DATA_SIZE && idx < cnts; i++, idx++) {
2745
if (data[idx] != map[addr + idx]) {
2746
word_en &= ~BIT(i >> 1);
2747
newdata[i] = data[idx];
2748
}
2749
}
2750
2751
if (word_en != 0xF) {
2752
RTW_INFO("offset=%x\n", offset);
2753
RTW_INFO("word_en=%x\n", word_en);
2754
RTW_INFO("%s: data=", __FUNCTION__);
2755
for (i = 0; i < PGPKT_DATA_SIZE; i++)
2756
RTW_INFO("0x%02X ", newdata[i]);
2757
RTW_INFO("\n");
2758
ret = Efuse_PgPacketWrite_BT(padapter, offset, word_en, newdata, _FALSE);
2759
if (ret == _FAIL)
2760
break;
2761
}
2762
2763
offset++;
2764
}
2765
2766
Efuse_PowerSwitch(padapter, _TRUE, _FALSE);
2767
2768
exit:
2769
2770
rtw_mfree(map, mapLen);
2771
2772
return ret;
2773
}
2774
2775
/*-----------------------------------------------------------------------------
2776
* Function: Efuse_ReadAllMap
2777
*
2778
* Overview: Read All Efuse content
2779
*
2780
* Input: NONE
2781
*
2782
* Output: NONE
2783
*
2784
* Return: NONE
2785
*
2786
* Revised History:
2787
* When Who Remark
2788
* 11/11/2008 MHC Create Version 0.
2789
*
2790
*---------------------------------------------------------------------------*/
2791
void
2792
Efuse_ReadAllMap(
2793
PADAPTER pAdapter,
2794
u8 efuseType,
2795
u8 *Efuse,
2796
BOOLEAN bPseudoTest);
2797
void
2798
Efuse_ReadAllMap(
2799
PADAPTER pAdapter,
2800
u8 efuseType,
2801
u8 *Efuse,
2802
BOOLEAN bPseudoTest)
2803
{
2804
u16 mapLen = 0;
2805
2806
Efuse_PowerSwitch(pAdapter, _FALSE, _TRUE);
2807
2808
EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_MAP_LEN, (void *)&mapLen, bPseudoTest);
2809
2810
efuse_ReadEFuse(pAdapter, efuseType, 0, mapLen, Efuse, bPseudoTest);
2811
2812
Efuse_PowerSwitch(pAdapter, _FALSE, _FALSE);
2813
}
2814
2815
/*-----------------------------------------------------------------------------
2816
* Function: efuse_ShadowWrite1Byte
2817
* efuse_ShadowWrite2Byte
2818
* efuse_ShadowWrite4Byte
2819
*
2820
* Overview: Write efuse modify map by one/two/four byte.
2821
*
2822
* Input: NONE
2823
*
2824
* Output: NONE
2825
*
2826
* Return: NONE
2827
*
2828
* Revised History:
2829
* When Who Remark
2830
* 11/12/2008 MHC Create Version 0.
2831
*
2832
*---------------------------------------------------------------------------*/
2833
#ifdef PLATFORM
2834
static void
2835
efuse_ShadowWrite1Byte(
2836
PADAPTER pAdapter,
2837
u16 Offset,
2838
u8 Value);
2839
#endif /* PLATFORM */
2840
static void
2841
efuse_ShadowWrite1Byte(
2842
PADAPTER pAdapter,
2843
u16 Offset,
2844
u8 Value)
2845
{
2846
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);
2847
2848
pHalData->efuse_eeprom_data[Offset] = Value;
2849
2850
} /* efuse_ShadowWrite1Byte */
2851
2852
/* ---------------Write Two Bytes */
2853
static void
2854
efuse_ShadowWrite2Byte(
2855
PADAPTER pAdapter,
2856
u16 Offset,
2857
u16 Value)
2858
{
2859
2860
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);
2861
2862
2863
pHalData->efuse_eeprom_data[Offset] = Value & 0x00FF;
2864
pHalData->efuse_eeprom_data[Offset + 1] = Value >> 8;
2865
2866
} /* efuse_ShadowWrite1Byte */
2867
2868
/* ---------------Write Four Bytes */
2869
static void
2870
efuse_ShadowWrite4Byte(
2871
PADAPTER pAdapter,
2872
u16 Offset,
2873
u32 Value)
2874
{
2875
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);
2876
2877
pHalData->efuse_eeprom_data[Offset] = (u8)(Value & 0x000000FF);
2878
pHalData->efuse_eeprom_data[Offset + 1] = (u8)((Value >> 8) & 0x0000FF);
2879
pHalData->efuse_eeprom_data[Offset + 2] = (u8)((Value >> 16) & 0x00FF);
2880
pHalData->efuse_eeprom_data[Offset + 3] = (u8)((Value >> 24) & 0xFF);
2881
2882
} /* efuse_ShadowWrite1Byte */
2883
2884
2885
/*-----------------------------------------------------------------------------
2886
* Function: EFUSE_ShadowWrite
2887
*
2888
* Overview: Write efuse modify map for later update operation to use!!!!!
2889
*
2890
* Input: NONE
2891
*
2892
* Output: NONE
2893
*
2894
* Return: NONE
2895
*
2896
* Revised History:
2897
* When Who Remark
2898
* 11/12/2008 MHC Create Version 0.
2899
*
2900
*---------------------------------------------------------------------------*/
2901
void
2902
EFUSE_ShadowWrite(
2903
PADAPTER pAdapter,
2904
u8 Type,
2905
u16 Offset,
2906
u32 Value);
2907
void
2908
EFUSE_ShadowWrite(
2909
PADAPTER pAdapter,
2910
u8 Type,
2911
u16 Offset,
2912
u32 Value)
2913
{
2914
#if (MP_DRIVER == 0)
2915
return;
2916
#endif
2917
if (pAdapter->registrypriv.mp_mode == 0)
2918
return;
2919
2920
2921
if (Type == 1)
2922
efuse_ShadowWrite1Byte(pAdapter, Offset, (u8)Value);
2923
else if (Type == 2)
2924
efuse_ShadowWrite2Byte(pAdapter, Offset, (u16)Value);
2925
else if (Type == 4)
2926
efuse_ShadowWrite4Byte(pAdapter, Offset, (u32)Value);
2927
2928
} /* EFUSE_ShadowWrite */
2929
2930
#endif /* !RTW_HALMAC */
2931
/*-----------------------------------------------------------------------------
2932
* Function: efuse_ShadowRead1Byte
2933
* efuse_ShadowRead2Byte
2934
* efuse_ShadowRead4Byte
2935
*
2936
* Overview: Read from efuse init map by one/two/four bytes !!!!!
2937
*
2938
* Input: NONE
2939
*
2940
* Output: NONE
2941
*
2942
* Return: NONE
2943
*
2944
* Revised History:
2945
* When Who Remark
2946
* 11/12/2008 MHC Create Version 0.
2947
*
2948
*---------------------------------------------------------------------------*/
2949
static void
2950
efuse_ShadowRead1Byte(
2951
PADAPTER pAdapter,
2952
u16 Offset,
2953
u8 *Value)
2954
{
2955
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);
2956
2957
*Value = pHalData->efuse_eeprom_data[Offset];
2958
2959
} /* EFUSE_ShadowRead1Byte */
2960
2961
/* ---------------Read Two Bytes */
2962
static void
2963
efuse_ShadowRead2Byte(
2964
PADAPTER pAdapter,
2965
u16 Offset,
2966
u16 *Value)
2967
{
2968
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);
2969
2970
*Value = pHalData->efuse_eeprom_data[Offset];
2971
*Value |= pHalData->efuse_eeprom_data[Offset + 1] << 8;
2972
2973
} /* EFUSE_ShadowRead2Byte */
2974
2975
/* ---------------Read Four Bytes */
2976
static void
2977
efuse_ShadowRead4Byte(
2978
PADAPTER pAdapter,
2979
u16 Offset,
2980
u32 *Value)
2981
{
2982
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);
2983
2984
*Value = pHalData->efuse_eeprom_data[Offset];
2985
*Value |= pHalData->efuse_eeprom_data[Offset + 1] << 8;
2986
*Value |= pHalData->efuse_eeprom_data[Offset + 2] << 16;
2987
*Value |= pHalData->efuse_eeprom_data[Offset + 3] << 24;
2988
2989
} /* efuse_ShadowRead4Byte */
2990
2991
/*-----------------------------------------------------------------------------
2992
* Function: EFUSE_ShadowRead
2993
*
2994
* Overview: Read from pHalData->efuse_eeprom_data
2995
*---------------------------------------------------------------------------*/
2996
void
2997
EFUSE_ShadowRead(
2998
PADAPTER pAdapter,
2999
u8 Type,
3000
u16 Offset,
3001
u32 *Value)
3002
{
3003
if (Type == 1)
3004
efuse_ShadowRead1Byte(pAdapter, Offset, (u8 *)Value);
3005
else if (Type == 2)
3006
efuse_ShadowRead2Byte(pAdapter, Offset, (u16 *)Value);
3007
else if (Type == 4)
3008
efuse_ShadowRead4Byte(pAdapter, Offset, (u32 *)Value);
3009
3010
} /* EFUSE_ShadowRead */
3011
3012
/* 11/16/2008 MH Add description. Get current efuse area enabled word!!. */
3013
u8
3014
Efuse_CalculateWordCnts(u8 word_en)
3015
{
3016
u8 word_cnts = 0;
3017
if (!(word_en & BIT(0)))
3018
word_cnts++; /* 0 : write enable */
3019
if (!(word_en & BIT(1)))
3020
word_cnts++;
3021
if (!(word_en & BIT(2)))
3022
word_cnts++;
3023
if (!(word_en & BIT(3)))
3024
word_cnts++;
3025
return word_cnts;
3026
}
3027
3028
/*-----------------------------------------------------------------------------
3029
* Function: efuse_WordEnableDataRead
3030
*
3031
* Overview: Read allowed word in current efuse section data.
3032
*
3033
* Input: NONE
3034
*
3035
* Output: NONE
3036
*
3037
* Return: NONE
3038
*
3039
* Revised History:
3040
* When Who Remark
3041
* 11/16/2008 MHC Create Version 0.
3042
* 11/21/2008 MHC Fix Write bug when we only enable late word.
3043
*
3044
*---------------------------------------------------------------------------*/
3045
void
3046
efuse_WordEnableDataRead(u8 word_en,
3047
u8 *sourdata,
3048
u8 *targetdata)
3049
{
3050
if (!(word_en & BIT(0))) {
3051
targetdata[0] = sourdata[0];
3052
targetdata[1] = sourdata[1];
3053
}
3054
if (!(word_en & BIT(1))) {
3055
targetdata[2] = sourdata[2];
3056
targetdata[3] = sourdata[3];
3057
}
3058
if (!(word_en & BIT(2))) {
3059
targetdata[4] = sourdata[4];
3060
targetdata[5] = sourdata[5];
3061
}
3062
if (!(word_en & BIT(3))) {
3063
targetdata[6] = sourdata[6];
3064
targetdata[7] = sourdata[7];
3065
}
3066
}
3067
3068
/*-----------------------------------------------------------------------------
3069
* Function: EFUSE_ShadowMapUpdate
3070
*
3071
* Overview: Transfer current EFUSE content to shadow init and modify map.
3072
*
3073
* Input: NONE
3074
*
3075
* Output: NONE
3076
*
3077
* Return: NONE
3078
*
3079
* Revised History:
3080
* When Who Remark
3081
* 11/13/2008 MHC Create Version 0.
3082
*
3083
*---------------------------------------------------------------------------*/
3084
void EFUSE_ShadowMapUpdate(
3085
PADAPTER pAdapter,
3086
u8 efuseType,
3087
BOOLEAN bPseudoTest)
3088
{
3089
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);
3090
u16 mapLen = 0;
3091
#ifdef RTW_HALMAC
3092
u8 *efuse_map = NULL;
3093
int err;
3094
3095
3096
mapLen = EEPROM_MAX_SIZE;
3097
efuse_map = pHalData->efuse_eeprom_data;
3098
/* efuse default content is 0xFF */
3099
_rtw_memset(efuse_map, 0xFF, EEPROM_MAX_SIZE);
3100
3101
EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_MAP_LEN, (void *)&mapLen, bPseudoTest);
3102
if (!mapLen) {
3103
RTW_WARN("%s: <ERROR> fail to get efuse size!\n", __FUNCTION__);
3104
mapLen = EEPROM_MAX_SIZE;
3105
}
3106
if (mapLen > EEPROM_MAX_SIZE) {
3107
RTW_WARN("%s: <ERROR> size of efuse data(%d) is large than expected(%d)!\n",
3108
__FUNCTION__, mapLen, EEPROM_MAX_SIZE);
3109
mapLen = EEPROM_MAX_SIZE;
3110
}
3111
3112
if (pHalData->bautoload_fail_flag == _FALSE) {
3113
err = rtw_halmac_read_logical_efuse_map(adapter_to_dvobj(pAdapter), efuse_map, mapLen, NULL, 0);
3114
if (err)
3115
RTW_ERR("%s: <ERROR> fail to get efuse map!\n", __FUNCTION__);
3116
}
3117
#else /* !RTW_HALMAC */
3118
EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_MAP_LEN, (void *)&mapLen, bPseudoTest);
3119
3120
if (pHalData->bautoload_fail_flag == _TRUE)
3121
_rtw_memset(pHalData->efuse_eeprom_data, 0xFF, mapLen);
3122
else {
3123
#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE
3124
if (_SUCCESS != retriveAdaptorInfoFile(pAdapter->registrypriv.adaptor_info_caching_file_path, pHalData->efuse_eeprom_data)) {
3125
#endif
3126
3127
Efuse_ReadAllMap(pAdapter, efuseType, pHalData->efuse_eeprom_data, bPseudoTest);
3128
3129
#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE
3130
storeAdaptorInfoFile(pAdapter->registrypriv.adaptor_info_caching_file_path, pHalData->efuse_eeprom_data);
3131
}
3132
#endif
3133
}
3134
3135
/* PlatformMoveMemory((void *)&pHalData->EfuseMap[EFUSE_MODIFY_MAP][0], */
3136
/* (void *)&pHalData->EfuseMap[EFUSE_INIT_MAP][0], mapLen); */
3137
#endif /* !RTW_HALMAC */
3138
3139
rtw_mask_map_read(pAdapter, 0x00, mapLen, pHalData->efuse_eeprom_data);
3140
3141
rtw_dump_cur_efuse(pAdapter);
3142
} /* EFUSE_ShadowMapUpdate */
3143
3144
const u8 _mac_hidden_max_bw_to_hal_bw_cap[MAC_HIDDEN_MAX_BW_NUM] = {
3145
0,
3146
0,
3147
(BW_CAP_160M | BW_CAP_80M | BW_CAP_40M | BW_CAP_20M | BW_CAP_10M | BW_CAP_5M),
3148
(BW_CAP_5M),
3149
(BW_CAP_10M | BW_CAP_5M),
3150
(BW_CAP_20M | BW_CAP_10M | BW_CAP_5M),
3151
(BW_CAP_40M | BW_CAP_20M | BW_CAP_10M | BW_CAP_5M),
3152
(BW_CAP_80M | BW_CAP_40M | BW_CAP_20M | BW_CAP_10M | BW_CAP_5M),
3153
};
3154
3155
const u8 _mac_hidden_proto_to_hal_proto_cap[MAC_HIDDEN_PROTOCOL_NUM] = {
3156
0,
3157
0,
3158
(PROTO_CAP_11N | PROTO_CAP_11G | PROTO_CAP_11B),
3159
(PROTO_CAP_11AC | PROTO_CAP_11N | PROTO_CAP_11G | PROTO_CAP_11B),
3160
};
3161
3162
u8 mac_hidden_wl_func_to_hal_wl_func(u8 func)
3163
{
3164
u8 wl_func = 0;
3165
3166
if (func & BIT0)
3167
wl_func |= WL_FUNC_MIRACAST;
3168
if (func & BIT1)
3169
wl_func |= WL_FUNC_P2P;
3170
if (func & BIT2)
3171
wl_func |= WL_FUNC_TDLS;
3172
if (func & BIT3)
3173
wl_func |= WL_FUNC_FTM;
3174
3175
return wl_func;
3176
}
3177
3178
#ifdef PLATFORM_LINUX
3179
#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE
3180
/* #include <rtw_eeprom.h> */
3181
3182
int isAdaptorInfoFileValid(void)
3183
{
3184
return _TRUE;
3185
}
3186
3187
int storeAdaptorInfoFile(char *path, u8 *efuse_data)
3188
{
3189
int ret = _SUCCESS;
3190
3191
if (path && efuse_data) {
3192
ret = rtw_store_to_file(path, efuse_data, EEPROM_MAX_SIZE_512);
3193
if (ret == EEPROM_MAX_SIZE)
3194
ret = _SUCCESS;
3195
else
3196
ret = _FAIL;
3197
} else {
3198
RTW_INFO("%s NULL pointer\n", __FUNCTION__);
3199
ret = _FAIL;
3200
}
3201
return ret;
3202
}
3203
3204
int retriveAdaptorInfoFile(char *path, u8 *efuse_data)
3205
{
3206
int ret = _SUCCESS;
3207
mm_segment_t oldfs;
3208
struct file *fp;
3209
3210
if (path && efuse_data) {
3211
3212
ret = rtw_retrieve_from_file(path, efuse_data, EEPROM_MAX_SIZE);
3213
3214
if (ret == EEPROM_MAX_SIZE)
3215
ret = _SUCCESS;
3216
else
3217
ret = _FAIL;
3218
3219
#if 0
3220
if (isAdaptorInfoFileValid())
3221
return 0;
3222
else
3223
return _FAIL;
3224
#endif
3225
3226
} else {
3227
RTW_INFO("%s NULL pointer\n", __FUNCTION__);
3228
ret = _FAIL;
3229
}
3230
return ret;
3231
}
3232
#endif /* CONFIG_ADAPTOR_INFO_CACHING_FILE */
3233
3234
u8 rtw_efuse_file_read(PADAPTER padapter, u8 *filepatch, u8 *buf, u32 len)
3235
{
3236
char *ptmpbuf = NULL, *ptr;
3237
u8 val8;
3238
u32 count, i, j;
3239
int err;
3240
u32 bufsize = 4096;
3241
3242
ptmpbuf = rtw_zmalloc(bufsize);
3243
if (ptmpbuf == NULL)
3244
return _FALSE;
3245
3246
count = rtw_retrieve_from_file(filepatch, ptmpbuf, bufsize);
3247
if (count <= 90) {
3248
rtw_mfree(ptmpbuf, bufsize);
3249
RTW_ERR("%s, filepatch %s, size=%d, FAIL!!\n", __FUNCTION__, filepatch, count);
3250
return _FALSE;
3251
}
3252
i = 0;
3253
j = 0;
3254
ptr = ptmpbuf;
3255
while ((j < len) && (i < count)) {
3256
if (ptmpbuf[i] == '\0')
3257
break;
3258
3259
ptr = strpbrk(&ptmpbuf[i], " \t\n\r");
3260
if (ptr) {
3261
if (ptr == &ptmpbuf[i]) {
3262
i++;
3263
continue;
3264
}
3265
/* Add string terminating null */
3266
*ptr = 0;
3267
} else {
3268
ptr = &ptmpbuf[count-1];
3269
}
3270
3271
err = sscanf(&ptmpbuf[i], "%hhx", &val8);
3272
if (err != 1) {
3273
RTW_WARN("Something wrong to parse efuse file, string=%s\n", &ptmpbuf[i]);
3274
} else {
3275
buf[j] = val8;
3276
RTW_DBG("i=%d, j=%d, 0x%02x\n", i, j, buf[j]);
3277
j++;
3278
}
3279
i = ptr - ptmpbuf + 1;
3280
}
3281
rtw_mfree(ptmpbuf, bufsize);
3282
RTW_INFO("%s, filepatch %s, size=%d, done\n", __FUNCTION__, filepatch, count);
3283
return _TRUE;
3284
}
3285
3286
#ifdef CONFIG_EFUSE_CONFIG_FILE
3287
u32 rtw_read_efuse_from_file(const char *path, u8 *buf, int map_size)
3288
{
3289
u32 i;
3290
u8 c;
3291
u8 temp[3];
3292
u8 temp_i;
3293
u8 end = _FALSE;
3294
u32 ret = _FAIL;
3295
3296
u8 *file_data = NULL;
3297
u32 file_size, read_size, pos = 0;
3298
u8 *map = NULL;
3299
3300
if (rtw_is_file_readable_with_size(path, &file_size) != _TRUE) {
3301
RTW_PRINT("%s %s is not readable\n", __func__, path);
3302
goto exit;
3303
}
3304
3305
file_data = rtw_vmalloc(file_size);
3306
if (!file_data) {
3307
RTW_ERR("%s rtw_vmalloc(%d) fail\n", __func__, file_size);
3308
goto exit;
3309
}
3310
3311
read_size = rtw_retrieve_from_file(path, file_data, file_size);
3312
if (read_size == 0) {
3313
RTW_ERR("%s read from %s fail\n", __func__, path);
3314
goto exit;
3315
}
3316
3317
map = rtw_vmalloc(map_size);
3318
if (!map) {
3319
RTW_ERR("%s rtw_vmalloc(%d) fail\n", __func__, map_size);
3320
goto exit;
3321
}
3322
_rtw_memset(map, 0xff, map_size);
3323
3324
temp[2] = 0; /* end of string '\0' */
3325
3326
for (i = 0 ; i < map_size ; i++) {
3327
temp_i = 0;
3328
3329
while (1) {
3330
if (pos >= read_size) {
3331
end = _TRUE;
3332
break;
3333
}
3334
c = file_data[pos++];
3335
3336
/* bypass spece or eol or null before first hex digit */
3337
if (temp_i == 0 && (is_eol(c) == _TRUE || is_space(c) == _TRUE || is_null(c) == _TRUE))
3338
continue;
3339
3340
if (IsHexDigit(c) == _FALSE) {
3341
RTW_ERR("%s invalid 8-bit hex format for offset:0x%03x\n", __func__, i);
3342
goto exit;
3343
}
3344
3345
temp[temp_i++] = c;
3346
3347
if (temp_i == 2) {
3348
/* parse value */
3349
if (sscanf(temp, "%hhx", &map[i]) != 1) {
3350
RTW_ERR("%s sscanf fail for offset:0x%03x\n", __func__, i);
3351
goto exit;
3352
}
3353
break;
3354
}
3355
}
3356
3357
if (end == _TRUE) {
3358
if (temp_i != 0) {
3359
RTW_ERR("%s incomplete 8-bit hex format for offset:0x%03x\n", __func__, i);
3360
goto exit;
3361
}
3362
break;
3363
}
3364
}
3365
3366
RTW_PRINT("efuse file:%s, 0x%03x byte content read\n", path, i);
3367
3368
_rtw_memcpy(buf, map, map_size);
3369
3370
ret = _SUCCESS;
3371
3372
exit:
3373
if (file_data)
3374
rtw_vmfree(file_data, file_size);
3375
if (map)
3376
rtw_vmfree(map, map_size);
3377
3378
return ret;
3379
}
3380
3381
u32 rtw_read_macaddr_from_file(const char *path, u8 *buf)
3382
{
3383
u32 i;
3384
u8 temp[3];
3385
u32 ret = _FAIL;
3386
3387
u8 file_data[17];
3388
u32 read_size;
3389
u8 addr[ETH_ALEN];
3390
3391
if (rtw_is_file_readable(path) != _TRUE) {
3392
RTW_PRINT("%s %s is not readable\n", __func__, path);
3393
goto exit;
3394
}
3395
3396
read_size = rtw_retrieve_from_file(path, file_data, 17);
3397
if (read_size != 17) {
3398
RTW_ERR("%s read from %s fail\n", __func__, path);
3399
goto exit;
3400
}
3401
3402
temp[2] = 0; /* end of string '\0' */
3403
3404
for (i = 0 ; i < ETH_ALEN ; i++) {
3405
if (IsHexDigit(file_data[i * 3]) == _FALSE || IsHexDigit(file_data[i * 3 + 1]) == _FALSE) {
3406
RTW_ERR("%s invalid 8-bit hex format for address offset:%u\n", __func__, i);
3407
goto exit;
3408
}
3409
3410
if (i < ETH_ALEN - 1 && file_data[i * 3 + 2] != ':') {
3411
RTW_ERR("%s invalid separator after address offset:%u\n", __func__, i);
3412
goto exit;
3413
}
3414
3415
temp[0] = file_data[i * 3];
3416
temp[1] = file_data[i * 3 + 1];
3417
if (sscanf(temp, "%hhx", &addr[i]) != 1) {
3418
RTW_ERR("%s sscanf fail for address offset:0x%03x\n", __func__, i);
3419
goto exit;
3420
}
3421
}
3422
3423
_rtw_memcpy(buf, addr, ETH_ALEN);
3424
3425
RTW_PRINT("wifi_mac file: %s\n", path);
3426
#ifdef CONFIG_RTW_DEBUG
3427
RTW_INFO(MAC_FMT"\n", MAC_ARG(buf));
3428
#endif
3429
3430
ret = _SUCCESS;
3431
3432
exit:
3433
return ret;
3434
}
3435
#endif /* CONFIG_EFUSE_CONFIG_FILE */
3436
3437
#endif /* PLATFORM_LINUX */
3438
3439