device_lock.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. /*
  2. * Routines to access hardware
  3. *
  4. * Copyright (c) 2013 Realtek Semiconductor Corp.
  5. *
  6. * This module is proprietary property of RealTek and
  7. * possession or use of this module requires release permission of RealTek.
  8. */
  9. #include "osdep_service.h"
  10. #include "device_lock.h"
  11. //------------------------------------------------------
  12. #define DEVICE_MUTEX_IS_INIT(device) (mutex_init & (1<<device))
  13. #define DEVICE_MUTEX_SET_INIT(device) (mutex_init |= (1<<device))
  14. #define DEVICE_MUTEX_CLR_INIT(device) (mutex_init &= (~(1<<device)))
  15. static u32 mutex_init = 0;
  16. static _mutex device_mutex[RT_DEV_LOCK_MAX];
  17. //======================================================
  18. static void device_mutex_init(RT_DEV_LOCK_E device)
  19. {
  20. if(!DEVICE_MUTEX_IS_INIT(device)){
  21. _lock lock;
  22. _irqL irqL;
  23. rtw_enter_critical(&lock, &irqL);
  24. if(!DEVICE_MUTEX_IS_INIT(device)){
  25. rtw_mutex_init(&device_mutex[device]);
  26. DEVICE_MUTEX_SET_INIT(device);
  27. }
  28. rtw_exit_critical(&lock, &irqL);
  29. }
  30. }
  31. //======================================================
  32. void device_mutex_free(RT_DEV_LOCK_E device)
  33. {
  34. if(DEVICE_MUTEX_IS_INIT(device)){
  35. _lock lock;
  36. _irqL irqL;
  37. rtw_enter_critical(&lock, &irqL);
  38. if(DEVICE_MUTEX_IS_INIT(device)){
  39. rtw_mutex_free(&device_mutex[device]);
  40. DEVICE_MUTEX_CLR_INIT(device);
  41. }
  42. rtw_exit_critical(&lock, &irqL);
  43. }
  44. }
  45. //======================================================
  46. void device_mutex_lock(RT_DEV_LOCK_E device)
  47. {
  48. device_mutex_init(device);
  49. while(rtw_mutex_get_timeout(&device_mutex[device], 10000)<0)
  50. DBG_INFO("device lock timeout: %d\n", (int)device);
  51. }
  52. //======================================================
  53. void device_mutex_unlock(RT_DEV_LOCK_E device)
  54. {
  55. device_mutex_init(device);
  56. rtw_mutex_put(&device_mutex[device]);
  57. }