import PULS_20160108
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / misc / mediatek / eemcs / eemcs_char.h
1 #ifndef _EEMCS_CHAR_H
2 #define _EEMCS_CHAR_H
3 #include <asm/ioctl.h>
4 #include <asm/atomic.h>
5 #include <linux/skbuff.h>
6 #include <linux/wait.h>
7 #include "eemcs_ccci.h"
8 #include "eemcs_kal.h"
9
10 #define EEMCS_DEV_MAJOR 183
11 #define EEMCS_DEV_NAME "eemcs"
12 #define EEMCS_CDEV_MAX_NUM (END_OF_NORMAL_PORT-START_OF_NORMAL_PORT)
13 #define EEMCS_DEV_NAME_LEN 30
14
15 typedef enum _CCCI_CDEV_STATE{
16 CDEV_CLOSE = 0,
17 CDEV_OPEN = 1
18 }CCCI_CDEV_STATE;
19
20 typedef struct
21 {
22 struct sk_buff *remaining_rx_skb; /* the pointer for streaming read */
23 atomic_t remaining_rx_cnt;
24 KAL_UINT32 remaining_len;
25 }stream_buff_t;
26
27 typedef struct
28 {
29 KAL_CHAR cdev_name[32];
30 KAL_UINT8 eemcs_port_id;
31 ccci_ch_set ccci_ch;
32 atomic_t cdev_state; /*0: close 1:open*/
33 /* rx informaiont */
34 /* 1. [eemcs_cdev_rx_callback] enqueue rx_skb_list
35 * 2. [eemcs_cdev_rx_callback] rx_pkt_cnt ++
36 * 3. [eemcs_cdev_rx_callback] wake_up rx_waitq
37 * 4. [emcs_cdev_read] (wait_event_interruptible rx_waitq)
38 * 5. [emcs_cdev_read] rx_pkt_cnt --
39 * 6. [emcs_cdev_read] dequeue rx_skb_list
40 */
41 wait_queue_head_t rx_waitq;
42 struct sk_buff_head rx_skb_list;
43 atomic_t rx_pkt_cnt;
44 atomic_t rx_pkt_drop_cnt; /* happen when user memory is not enough */
45 stream_buff_t buff;
46 /* tx informaiont */
47 wait_queue_head_t tx_waitq;
48 atomic_t tx_pkt_cnt;
49 }eemcs_cdev_node_t;
50
51 typedef struct
52 {
53 struct class *dev_class; /* class_create/class_destroy/device_create/device_destroy */
54 struct cdev *eemcs_chrdev; /* cdev_alloc/cdev_del/cdev_init/cdev_add */
55 eemcs_cdev_node_t cdev_node[EEMCS_CDEV_MAX_NUM];
56 KAL_UINT32 expt_cb_id; /* exception callback function ID */
57 }eemcs_cdev_inst_t;
58
59
60
61 /* EMCS opeartion Error. */
62 // I for Internal use, O for device status, should cover by error handling..
63 #define EMCS_ERR_NONE 0
64 #define EMCS_ERR_TIMEOUT 20 /*[O] wait Interrupt or device read fail*/
65 #define EMCS_ERR_BT_STATUS 21 /*[I] invalid MD Status.*/
66 #define EMCS_ERR_CMDCRC 22 /*[O] invalid command*/
67 #define EMCS_ERR_LOAD_BIN 23 /*[O] MD BIN file open fail*/
68 #define EMCS_ERR_MSG_OVERFLOW 24 /*[O] receive message to long*/
69 #define EMCS_ERR_PKT_OVERFLOW 25 /*[I] send package big the tx limitaion*/
70 #define EMCS_ERR_INVALID_PARA 26 /*[I] emcs driver parameter check fail*/
71 #define EMCS_ERR_GET_OWNER 27 /*[O] get device ownership fail*/
72 #define EMCS_ERR_NOMEM 28
73 #define EMCS_ERR_NOINIT 29
74 #define EMCS_ERR_INVAL_PARA 30
75 #define EMCS_ERR_TX_FAIL 31
76 #define EMCS_ERR_RX_FAIL 32
77 #define EMCS_ERROR_BUSY 33
78 #define EMCS_ERROR_NODEV 34
79 #define EMCS_ERR_RESET_MD 35
80
81 #if defined(_EEMCS_CDEV_LB_UT_) || defined(_EEMCS_FS_UT)
82 KAL_UINT32 cdevut_register_callback(CCCI_CHANNEL_T chn, EEMCS_CCCI_CALLBACK func_ptr , KAL_UINT32 private_data) ;
83 KAL_UINT32 cdevut_unregister_callback(CCCI_CHANNEL_T chn);
84 inline KAL_INT32 cdevut_UL_write_skb_to_swq(CCCI_CHANNEL_T chn, struct sk_buff *skb);
85 inline KAL_UINT32 cdevut_UL_write_room_alloc(CCCI_CHANNEL_T chn);
86 inline KAL_UINT32 cdevut_UL_write_room_release(CCCI_CHANNEL_T chn);
87 KAL_UINT32 cdevut_UL_write_wait(CCCI_CHANNEL_T chn);
88 typedef void (*EEMCS_CCCI_EXCEPTION_IND_CALLBACK)(KAL_UINT32 msg_id);
89 KAL_UINT32 cdevut_register_expt_callback(EEMCS_CCCI_EXCEPTION_IND_CALLBACK func_ptr);
90 KAL_UINT32 cdevut_unregister_expt_callback(KAL_UINT32 cb_id);
91 void cdevut_turn_off_dlq_by_port(KAL_UINT32 port_idx);
92 void cdevut_turn_on_dlq_by_port(KAL_UINT32 port_idx);
93
94 #define ccci_cdev_register(ch_num,cb,para) cdevut_register_callback(ch_num,cb,para)
95 #define ccci_cdev_unregister(ch_num) cdevut_unregister_callback(ch_num)
96 #define ccci_cdev_write_desc_to_q(ch_num,desc_p) cdevut_UL_write_skb_to_swq(ch_num, desc_p)
97 #define ccci_cdev_write_space_alloc(ch_num) cdevut_UL_write_room_alloc(ch_num)
98 #define ccci_cdev_write_space_release(ch_num) cdevut_UL_write_room_release(ch_num)
99 #define ccci_cdev_write_wait(ch_num) cdevut_UL_write_wait(ch_num)
100 #define ccci_cdev_register_expt_callback(cb) cdevut_register_expt_callback(cb)
101 #define ccci_cdev_unregister_expt_callback(cb) cdevut_unregister_expt_callback(cb)
102 #define ccci_cdev_turn_off_dl_q(port_idx) cdevut_turn_off_dlq_by_port(port_idx)
103 #define ccci_cdev_turn_on_dl_q(port_idx) cdevut_turn_on_dlq_by_port(port_idx)
104
105 #else
106 #define ccci_cdev_register(ch_num,cb,para) eemcs_ccci_register_callback(ch_num,cb,para)
107 #define ccci_cdev_unregister(ch_num) eemcs_ccci_unregister_callback(ch_num)
108 #define ccci_cdev_write_desc_to_q(ch_num,desc_p) eemcs_ccci_UL_write_skb_to_swq(ch_num, desc_p)
109 #define ccci_cdev_write_space_alloc(ch_num) eemcs_ccci_UL_write_room_alloc(ch_num)
110 #define ccci_cdev_write_space_release(ch_num) eemcs_ccci_UL_write_room_release(ch_num)
111 #define ccci_cdev_write_wait(ch_num) eemcs_ccci_UL_write_wait(ch_num)
112 #define ccci_cdev_register_expt_callback(cb) eemcs_register_expt_callback(cb)
113 #define ccci_cdev_unregister_expt_callback(cb) eemcs_unregister_expt_callback(cb)
114 #define ccci_cdev_turn_off_dl_q(port_idx) eemcs_ccci_turn_off_dlq_by_port(port_idx)
115 #define ccci_cdev_turn_on_dl_q(port_idx) eemcs_ccci_turn_on_dlq_by_port(port_idx)
116 #endif
117
118 #ifdef CCCI_SDIO_HEAD
119 #define CCCI_CDEV_HEADER_ROOM (sizeof(SDIO_H)+sizeof(CCCI_BUFF_T))
120 #else
121 #define CCCI_CDEV_HEADER_ROOM (sizeof(CCCI_BUFF_T))
122 #endif
123
124 //#define ccci_cdev_mem_alloc(sz) dev_alloc_skb(sz)
125 #define ccci_cdev_mem_alloc(sz, flag) __dev_alloc_skb(sz, flag)
126
127 KAL_INT32 eemcs_char_mod_init(void);
128 void eemcs_char_exit(void);
129
130 void eemcs_fs_ut_callback(struct sk_buff *, KAL_UINT32);
131 bool eemcs_cdev_rst_port_closed(void);
132 void eemcs_cdev_reset(void);
133
134 #endif //_EEMCS_CHAR_H
135
136 /*********************************************************************
137 [SOP to add a char device node] 20130525 Ian
138 [EEMCS] mediatek/kernel/source/kernel/driver/eemcs
139 1. add channel in eemcs_ccci.h CCCI_CHANNEL_T
140 2. add port in eemcs_ccci.h CCCI_PORT
141 3. update ccci_port_info in eemcs_ccci.c
142 4. update ccci_cdev_name in eemcs_char.c
143 5. update exception port information ccci_expt_port_info in eemcs_expt.c
144 [eemcs_test] mediatek/source/external/eemcs_test
145 1. add channel in CCCI_CHANNEL_T
146 2. add port in CCCI_PORT
147 3. CCCI_CDEV_NUM++
148 4. update ccci_cdev_name, ccci_cdev_name_select, ccci_expose_cccih
149 5. modify port_to_tx_cccich function
150 *********************************************************************/