4 #include <asm/atomic.h>
5 #include <linux/skbuff.h>
6 #include <linux/wait.h>
7 #include "eemcs_ccci.h"
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
15 typedef enum _CCCI_CDEV_STATE
{
22 struct sk_buff
*remaining_rx_skb
; /* the pointer for streaming read */
23 atomic_t remaining_rx_cnt
;
24 KAL_UINT32 remaining_len
;
29 KAL_CHAR cdev_name
[32];
30 KAL_UINT8 eemcs_port_id
;
32 atomic_t cdev_state
; /*0: close 1:open*/
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
41 wait_queue_head_t rx_waitq
;
42 struct sk_buff_head rx_skb_list
;
44 atomic_t rx_pkt_drop_cnt
; /* happen when user memory is not enough */
47 wait_queue_head_t tx_waitq
;
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 */
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
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
);
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)
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)
118 #ifdef CCCI_SDIO_HEAD
119 #define CCCI_CDEV_HEADER_ROOM (sizeof(SDIO_H)+sizeof(CCCI_BUFF_T))
121 #define CCCI_CDEV_HEADER_ROOM (sizeof(CCCI_BUFF_T))
124 //#define ccci_cdev_mem_alloc(sz) dev_alloc_skb(sz)
125 #define ccci_cdev_mem_alloc(sz, flag) __dev_alloc_skb(sz, flag)
127 KAL_INT32
eemcs_char_mod_init(void);
128 void eemcs_char_exit(void);
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);
134 #endif //_EEMCS_CHAR_H
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
148 4. update ccci_cdev_name, ccci_cdev_name_select, ccci_expose_cccih
149 5. modify port_to_tx_cccich function
150 *********************************************************************/