OSDN Git Service

rtl8723au: Replace u1Byte with u8
[android-x86/external-modules-rtl8723au.git] / hal / odm_interface.c
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
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  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17  *
18  *
19  ******************************************************************************/
20
21 //============================================================
22 // include files
23 //============================================================
24
25 #include "odm_precomp.h"
26 //
27 // ODM IO Relative API.
28 //
29
30 u8
31 ODM_Read1Byte(
32         PDM_ODM_T               pDM_Odm,
33         u4Byte                  RegAddr
34         )
35 {
36 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
37         prtl8192cd_priv priv    = pDM_Odm->priv;
38         return  RTL_R8(RegAddr);
39 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
40         PADAPTER                Adapter = pDM_Odm->Adapter;
41         return rtw_read8(Adapter,RegAddr);
42 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
43         PADAPTER                Adapter = pDM_Odm->Adapter;
44         return  PlatformEFIORead1Byte(Adapter, RegAddr);
45 #endif
46
47 }
48
49
50 u2Byte
51 ODM_Read2Byte(
52         PDM_ODM_T               pDM_Odm,
53         u4Byte                  RegAddr
54         )
55 {
56 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
57         prtl8192cd_priv priv    = pDM_Odm->priv;
58         return  RTL_R16(RegAddr);
59 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
60         PADAPTER                Adapter = pDM_Odm->Adapter;
61         return rtw_read16(Adapter,RegAddr);
62 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
63         PADAPTER                Adapter = pDM_Odm->Adapter;
64         return  PlatformEFIORead2Byte(Adapter, RegAddr);
65 #endif
66
67 }
68
69
70 u4Byte
71 ODM_Read4Byte(
72         PDM_ODM_T               pDM_Odm,
73         u4Byte                  RegAddr
74         )
75 {
76 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
77         prtl8192cd_priv priv    = pDM_Odm->priv;
78         return  RTL_R32(RegAddr);
79 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
80         PADAPTER                Adapter = pDM_Odm->Adapter;
81         return rtw_read32(Adapter,RegAddr);
82 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
83         PADAPTER                Adapter = pDM_Odm->Adapter;
84         return  PlatformEFIORead4Byte(Adapter, RegAddr);
85 #endif
86
87 }
88
89
90 void
91 ODM_Write1Byte(
92         PDM_ODM_T               pDM_Odm,
93         u4Byte                  RegAddr,
94         u8                      Data
95         )
96 {
97 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
98         prtl8192cd_priv priv    = pDM_Odm->priv;
99         RTL_W8(RegAddr, Data);
100 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
101         PADAPTER                Adapter = pDM_Odm->Adapter;
102         rtw_write8(Adapter,RegAddr, Data);
103 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
104         PADAPTER                Adapter = pDM_Odm->Adapter;
105         PlatformEFIOWrite1Byte(Adapter, RegAddr, Data);
106 #endif
107
108 }
109
110
111 void
112 ODM_Write2Byte(
113         PDM_ODM_T               pDM_Odm,
114         u4Byte                  RegAddr,
115         u2Byte                  Data
116         )
117 {
118 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
119         prtl8192cd_priv priv    = pDM_Odm->priv;
120         RTL_W16(RegAddr, Data);
121 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
122         PADAPTER                Adapter = pDM_Odm->Adapter;
123         rtw_write16(Adapter,RegAddr, Data);
124 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
125         PADAPTER                Adapter = pDM_Odm->Adapter;
126         PlatformEFIOWrite2Byte(Adapter, RegAddr, Data);
127 #endif
128
129 }
130
131
132 void
133 ODM_Write4Byte(
134         PDM_ODM_T               pDM_Odm,
135         u4Byte                  RegAddr,
136         u4Byte                  Data
137         )
138 {
139 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
140         prtl8192cd_priv priv    = pDM_Odm->priv;
141         RTL_W32(RegAddr, Data);
142 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
143         PADAPTER                Adapter = pDM_Odm->Adapter;
144         rtw_write32(Adapter,RegAddr, Data);
145 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
146         PADAPTER                Adapter = pDM_Odm->Adapter;
147         PlatformEFIOWrite4Byte(Adapter, RegAddr, Data);
148 #endif
149
150 }
151
152
153 void
154 ODM_SetMACReg(
155         PDM_ODM_T       pDM_Odm,
156         u4Byte          RegAddr,
157         u4Byte          BitMask,
158         u4Byte          Data
159         )
160 {
161 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
162         PHY_SetBBReg(pDM_Odm->priv, RegAddr, BitMask, Data);
163 #elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP))
164         PADAPTER                Adapter = pDM_Odm->Adapter;
165         PHY_SetBBReg(Adapter, RegAddr, BitMask, Data);
166 #endif
167 }
168
169
170 u4Byte
171 ODM_GetMACReg(
172         PDM_ODM_T       pDM_Odm,
173         u4Byte          RegAddr,
174         u4Byte          BitMask
175         )
176 {
177 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
178         return PHY_QueryBBReg(pDM_Odm->priv, RegAddr, BitMask);
179 #elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP))
180         PADAPTER                Adapter = pDM_Odm->Adapter;
181         return PHY_QueryBBReg(Adapter, RegAddr, BitMask);
182 #endif
183 }
184
185
186 void
187 ODM_SetBBReg(
188         PDM_ODM_T       pDM_Odm,
189         u4Byte          RegAddr,
190         u4Byte          BitMask,
191         u4Byte          Data
192         )
193 {
194 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
195         PHY_SetBBReg(pDM_Odm->priv, RegAddr, BitMask, Data);
196 #elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP))
197         PADAPTER                Adapter = pDM_Odm->Adapter;
198         PHY_SetBBReg(Adapter, RegAddr, BitMask, Data);
199 #endif
200 }
201
202
203 u4Byte
204 ODM_GetBBReg(
205         PDM_ODM_T       pDM_Odm,
206         u4Byte          RegAddr,
207         u4Byte          BitMask
208         )
209 {
210 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
211         return PHY_QueryBBReg(pDM_Odm->priv, RegAddr, BitMask);
212 #elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP))
213         PADAPTER                Adapter = pDM_Odm->Adapter;
214         return PHY_QueryBBReg(Adapter, RegAddr, BitMask);
215 #endif
216 }
217
218
219 void
220 ODM_SetRFReg(
221         PDM_ODM_T                       pDM_Odm,
222         ODM_RF_RADIO_PATH_E     eRFPath,
223         u4Byte                          RegAddr,
224         u4Byte                          BitMask,
225         u4Byte                          Data
226         )
227 {
228 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
229         PHY_SetRFReg(pDM_Odm->priv, eRFPath, RegAddr, BitMask, Data);
230 #elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP))
231         PADAPTER                Adapter = pDM_Odm->Adapter;
232         PHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data);
233 #endif
234 }
235
236
237 u4Byte
238 ODM_GetRFReg(
239         PDM_ODM_T                       pDM_Odm,
240         ODM_RF_RADIO_PATH_E     eRFPath,
241         u4Byte                          RegAddr,
242         u4Byte                          BitMask
243         )
244 {
245 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
246         return PHY_QueryRFReg(pDM_Odm->priv, eRFPath, RegAddr, BitMask, 1);
247 #elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP))
248         PADAPTER                Adapter = pDM_Odm->Adapter;
249         return PHY_QueryRFReg(Adapter, eRFPath, RegAddr, BitMask);
250 #endif
251 }
252
253
254
255
256 //
257 // ODM Memory relative API.
258 //
259 void
260 ODM_AllocateMemory(
261         PDM_ODM_T       pDM_Odm,
262         void *          *pPtr,
263         u4Byte          length
264         )
265 {
266 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
267         *pPtr = kmalloc(length, GFP_ATOMIC);
268 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE )
269         *pPtr = rtw_zvmalloc(length);
270 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
271         PADAPTER                Adapter = pDM_Odm->Adapter;
272         PlatformAllocateMemory(Adapter, pPtr, length);
273 #endif
274 }
275
276 // length could be ignored, used to detect memory leakage.
277 void
278 ODM_FreeMemory(
279         PDM_ODM_T       pDM_Odm,
280         void *          pPtr,
281         u4Byte          length
282         )
283 {
284 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
285         kfree(pPtr);
286 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE )
287         rtw_vmfree(pPtr, length);
288 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
289         //PADAPTER    Adapter = pDM_Odm->Adapter;
290         PlatformFreeMemory(pPtr, length);
291 #endif
292 }
293
294
295 //
296 // ODM MISC relative API.
297 //
298 void
299 ODM_AcquireSpinLock(
300         PDM_ODM_T                       pDM_Odm,
301         RT_SPINLOCK_TYPE        type
302         )
303 {
304 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
305
306 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE )
307
308 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
309         PADAPTER                Adapter = pDM_Odm->Adapter;
310         PlatformAcquireSpinLock(Adapter, type);
311 #endif
312 }
313 void
314 ODM_ReleaseSpinLock(
315         PDM_ODM_T                       pDM_Odm,
316         RT_SPINLOCK_TYPE        type
317         )
318 {
319 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
320
321 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE )
322
323 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
324         PADAPTER                Adapter = pDM_Odm->Adapter;
325         PlatformReleaseSpinLock(Adapter, type);
326 #endif
327 }
328
329 //
330 // Work item relative API. FOr MP driver only~!
331 //
332 void
333 ODM_InitializeWorkItem(
334         PDM_ODM_T                                       pDM_Odm,
335         PRT_WORK_ITEM                           pRtWorkItem,
336         RT_WORKITEM_CALL_BACK           RtWorkItemCallback,
337         void *                                          pContext,
338         const char*                                     szID
339         )
340 {
341 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
342
343 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
344
345 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
346         PADAPTER                Adapter = pDM_Odm->Adapter;
347         PlatformInitializeWorkItem(Adapter, pRtWorkItem, RtWorkItemCallback, pContext, szID);
348 #endif
349 }
350
351
352 void
353 ODM_StartWorkItem(
354         PRT_WORK_ITEM   pRtWorkItem
355         )
356 {
357 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
358
359 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
360
361 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
362         PlatformStartWorkItem(pRtWorkItem);
363 #endif
364 }
365
366
367 void
368 ODM_StopWorkItem(
369         PRT_WORK_ITEM   pRtWorkItem
370         )
371 {
372 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
373
374 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
375
376 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
377         PlatformStopWorkItem(pRtWorkItem);
378 #endif
379 }
380
381
382 void
383 ODM_FreeWorkItem(
384         PRT_WORK_ITEM   pRtWorkItem
385         )
386 {
387 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
388
389 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
390
391 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
392         PlatformFreeWorkItem(pRtWorkItem);
393 #endif
394 }
395
396
397 void
398 ODM_ScheduleWorkItem(
399         PRT_WORK_ITEM   pRtWorkItem
400         )
401 {
402 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
403
404 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
405
406 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
407         PlatformScheduleWorkItem(pRtWorkItem);
408 #endif
409 }
410
411
412 void
413 ODM_IsWorkItemScheduled(
414         PRT_WORK_ITEM   pRtWorkItem
415         )
416 {
417 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
418
419 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
420
421 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
422         PlatformIsWorkItemScheduled(pRtWorkItem);
423 #endif
424 }
425
426
427
428 //
429 // ODM Timer relative API.
430 //
431 void
432 ODM_StallExecution(
433         u4Byte  usDelay
434         )
435 {
436 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
437
438 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
439         rtw_udelay_os(usDelay);
440 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
441         PlatformStallExecution(usDelay);
442 #endif
443 }
444
445 void
446 ODM_delay_ms(u4Byte     ms)
447 {
448 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
449         delay_ms(ms);
450 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
451         rtw_mdelay_os(ms);
452 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
453         delay_ms(ms);
454 #endif
455 }
456
457 void
458 ODM_delay_us(u4Byte     us)
459 {
460 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
461         delay_us(us);
462 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
463         rtw_udelay_os(us);
464 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
465         PlatformStallExecution(us);
466 #endif
467 }
468
469 void
470 ODM_sleep_ms(u4Byte     ms)
471 {
472 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
473
474 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
475         msleep(ms);
476 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
477 #endif
478 }
479
480 void
481 ODM_sleep_us(u4Byte     us)
482 {
483 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
484
485 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
486         rtw_usleep_os(us);
487 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
488 #endif
489 }
490
491 void
492 ODM_SetTimer(
493         PDM_ODM_T               pDM_Odm,
494         PRT_TIMER               pTimer,
495         u4Byte                  msDelay
496         )
497 {
498 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
499         mod_timer(pTimer, jiffies + (msDelay+9)/10);
500 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
501         _set_timer(pTimer,msDelay ); //ms
502 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
503         PADAPTER                Adapter = pDM_Odm->Adapter;
504         PlatformSetTimer(Adapter, pTimer, msDelay);
505 #endif
506
507 }
508
509 void
510 ODM_InitializeTimer(
511         PDM_ODM_T                       pDM_Odm,
512         PRT_TIMER                       pTimer,
513         RT_TIMER_CALL_BACK      CallBackFunc,
514         void *                          pContext,
515         const char*                     szID
516         )
517 {
518 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
519         pTimer->function = CallBackFunc;
520         pTimer->data = (unsigned long)pDM_Odm;
521         init_timer(pTimer);
522 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
523         PADAPTER Adapter = pDM_Odm->Adapter;
524         _init_timer(pTimer,Adapter->pnetdev,CallBackFunc,pDM_Odm);
525 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
526         PADAPTER Adapter = pDM_Odm->Adapter;
527         PlatformInitializeTimer(Adapter, pTimer, CallBackFunc,pContext,szID);
528 #endif
529 }
530
531
532 void
533 ODM_CancelTimer(
534         PDM_ODM_T               pDM_Odm,
535         PRT_TIMER               pTimer
536         )
537 {
538 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
539         del_timer_sync(pTimer);
540 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
541         _cancel_timer_ex(pTimer);
542 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
543         PADAPTER Adapter = pDM_Odm->Adapter;
544         PlatformCancelTimer(Adapter, pTimer);
545 #endif
546 }
547
548
549 void
550 ODM_ReleaseTimer(
551         PDM_ODM_T               pDM_Odm,
552         PRT_TIMER               pTimer
553         )
554 {
555 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
556
557 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
558
559 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
560
561         PADAPTER Adapter = pDM_Odm->Adapter;
562
563     // <20120301, Kordan> If the initilization fails, InitializeAdapterXxx will return regardless of InitHalDm.
564     // Hence, uninitialized timers cause BSOD when the driver releases resources since the init fail.
565     if (pTimer == 0)
566     {
567         ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_SERIOUS, ("=====>ODM_ReleaseTimer(), The timer is NULL! Please check it!\n"));
568         return;
569     }
570
571         PlatformReleaseTimer(Adapter, pTimer);
572 #endif
573 }
574
575
576 //
577 // ODM FW relative API.
578 //
579 #if (DM_ODM_SUPPORT_TYPE & ODM_MP)
580 void
581 ODM_FillH2CCmd(
582         PADAPTER                Adapter,
583         u8      ElementID,
584         u4Byte  CmdLen,
585         u8 *    pCmdBuffer
586 )
587 {
588         if(IS_HARDWARE_TYPE_JAGUAR(Adapter))
589         {
590                 switch(ElementID)
591                 {
592                 case ODM_H2C_RSSI_REPORT:
593                         FillH2CCmd8812(Adapter, H2C_8812_RSSI_REPORT, CmdLen, pCmdBuffer);
594                 default:
595                         break;
596                 }
597
598         }
599         else if(IS_HARDWARE_TYPE_8188E(Adapter))
600         {
601                 switch(ElementID)
602                 {
603                 case ODM_H2C_PSD_RESULT:
604                         FillH2CCmd88E(Adapter, H2C_88E_PSD_RESULT, CmdLen, pCmdBuffer);
605                 default:
606                         break;
607                 }
608         }
609         else
610         {
611                 switch(ElementID)
612                 {
613                 case ODM_H2C_RSSI_REPORT:
614                         FillH2CCmd92C(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer);
615                 case ODM_H2C_PSD_RESULT:
616                         FillH2CCmd92C(Adapter, H2C_92C_PSD_RESULT, CmdLen, pCmdBuffer);
617                 default:
618                         break;
619                 }
620         }
621 }
622 #else
623 u4Byte
624 ODM_FillH2CCmd(
625         u8 *            pH2CBuffer,
626         u4Byte          H2CBufferLen,
627         u4Byte          CmdNum,
628         pu4Byte         pElementID,
629         pu4Byte         pCmdLen,
630         u8 **           pCmbBuffer,
631         u8 *            CmdStartSeq
632         )
633 {
634 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
635
636 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
637
638 #elif(DM_ODM_SUPPORT_TYPE & ODM_MP)
639         //FillH2CCmd(pH2CBuffer, H2CBufferLen, CmdNum, pElementID, pCmdLen, pCmbBuffer, CmdStartSeq);
640         return  FALSE;
641 #endif
642
643         return  TRUE;
644 }
645 #endif