ccci_chrdev.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #ifndef __CCCI_CHRDEV_H__
  2. #define __CCCI_CHRDEV_H__
  3. #include <linux/list.h>
  4. #include <linux/spinlock.h>
  5. #include <linux/wait.h>
  6. #include <linux/atomic.h>
  7. #include <linux/cdev.h>
  8. #include <ccci_layer.h>
  9. #define MAX_BUFFER_MESSAGES ((1 << 20)/sizeof(struct CCCI_BUFF_T))
  10. #define DEFAULT_BUFFER (CCCI_FIFO_MAX_LEN*2)
  11. #define recv_array_is_full(array) ({\
  12. unsigned int __nr = (array)->nr; \
  13. unsigned int __idx = (array)->in_idx; \
  14. WARN_ON(__idx > __nr); \
  15. __nr == __idx; })
  16. #define recv_array_is_empty(array) ({\
  17. unsigned int __nr = (array)->in_idx; \
  18. unsigned int __idx = (array)->out_idx; \
  19. WARN_ON(__idx > __nr); \
  20. __nr == __idx; })
  21. #define reset_recv_array(array) ({ \
  22. (array)->in_idx = 0; \
  23. (array)->out_idx = 0; })
  24. #define get_first_entry(list, type, mem) ({ \
  25. type *__ret;\
  26. if (list_empty(list))\
  27. __ret = NULL;\
  28. else\
  29. __ret = list_entry((list)->next, type, mem);\
  30. __ret; })
  31. #define get_last_entry(list, type, mem) ({ \
  32. type *__ret;\
  33. if (list_empty(list))\
  34. __ret = NULL;\
  35. else\
  36. __ret = list_entry((list)->prev, type, mem);\
  37. __ret; })
  38. #define ccci_get_first(_list) get_first_entry(_list, struct recv_array, list)
  39. #define ccci_get_last(_list) get_last_entry(_list, struct recv_array, list)
  40. #define ccci_is_last_recv(list) list_is_last((list)->next, list)
  41. struct recv_array {
  42. struct CCCI_BUFF_T *array;
  43. unsigned int nr;
  44. unsigned int in_idx;
  45. unsigned int out_idx;
  46. struct list_head list;
  47. };
  48. struct ccci_dev_client {
  49. spinlock_t lock;
  50. atomic_t user;
  51. pid_t pid;
  52. int ch_num;
  53. struct list_head dev_list;
  54. wait_queue_head_t wait_q;
  55. int md_id;
  56. void *ctlb;
  57. struct fasync_struct *fasync;
  58. unsigned int wakeup_waitq;
  59. };
  60. struct chr_ctl_block_t {
  61. int md_id;
  62. struct mutex chr_dev_mutex;
  63. struct list_head chr_dev_list;
  64. struct cdev ccci_chrdev;
  65. int major;
  66. int minor;
  67. };
  68. struct ccci_vir_client_t {
  69. spinlock_t lock;
  70. atomic_t user;
  71. pid_t pid;
  72. int index;
  73. struct list_head dev_list;
  74. wait_queue_head_t wait_q;
  75. int md_id;
  76. void *ctlb;
  77. struct fasync_struct *fasync;
  78. unsigned int wakeup_waitq;
  79. struct kfifo private_fifo;
  80. int fifo_ready;
  81. };
  82. struct vir_ctl_block_t {
  83. int md_id;
  84. struct mutex chr_dev_mutex;
  85. struct list_head chr_dev_list;
  86. struct cdev ccci_chrdev;
  87. int major;
  88. int minor;
  89. spinlock_t bind_lock;
  90. struct ccci_vir_client_t *system_msg_client;
  91. };
  92. extern int ccci_chrdev_init(int);
  93. extern void ccci_chrdev_exit(int);
  94. #endif /* __CCCI_CHRDEV_H__ */