1 #ifndef SPRD_WLAN_COMMON_H_
2 #define SPRD_WLAN_COMMON_H_
4 #include <linux/proc_fs.h>
5 #include <linux/sipc.h>
6 #include <linux/mutex.h>
7 #include <linux/spinlock.h>
8 #include <linux/ieee80211.h>
9 #include <linux/printk.h>
10 #include <linux/inetdevice.h>
11 #include <linux/spinlock.h>
12 #include <net/cfg80211.h>
13 #include <linux/kernel.h>
14 #include <linux/errno.h>
15 #include <linux/module.h>
16 #include <linux/netdevice.h>
17 #include <linux/skbuff.h>
18 #include <net/ieee80211_radiotap.h>
19 #include <linux/etherdevice.h>
20 #include <linux/wireless.h>
21 #include <net/iw_handler.h>
22 #include <linux/string.h>
23 #include <linux/delay.h>
24 #include <linux/interrupt.h>
25 #include <linux/init.h>
26 #include <linux/wakelock.h>
27 #include <linux/workqueue.h>
28 #include <linux/ipv6.h>
30 #include <linux/inetdevice.h>
31 #include <asm/byteorder.h>
32 #include <linux/platform_device.h>
33 #include <linux/atomic.h>
34 #include <linux/wait.h>
35 #include <linux/semaphore.h>
36 #include <linux/vmalloc.h>
37 #include <linux/kthread.h>
38 #include <linux/time.h>
39 #include <linux/delay.h>
40 #include <linux/timer.h>
41 #include <linux/completion.h>
42 #include <asm/atomic.h>
43 #include <linux/ieee80211.h>
44 #include <linux/delay.h>
45 #include <linux/wakelock.h>
46 #include <linux/earlysuspend.h>
47 #include <mach/gpio.h>
49 #include <linux/of_gpio.h>
50 #include "wlan_fifo.h"
52 #include "wlan_cfg80211.h"
53 #include "wlan_msg_q.h"
56 /* #define WLAN_LESS_WAKEUP_CP */
57 #define WLAN_THREAD_SLEPP_POLICE
60 #define INCR_RING_BUFF_INDX(indx, max_num) ((((indx) + 1) < (max_num)) ? ((indx) + 1) : (0))
61 #define KERNEL_VERSION(a, b, c) (((a) << 16) + ((b) << 8) + (c))
62 #define LINUX_VERSION_CODE KERNEL_VERSION(3, 10, 0)
63 #define SDIO_ALIGN_SIZE (1024)
64 #define ALIGN_4BYTE(a) ((((a)+3)&(~3)))
65 #define MAX_TX_BUFFER_ID (12)
66 #define TEST_BIT(a, k) ((a>>k)&1)
67 #define CLEAR_BIT(a, k) ({a = (a&(~(1<<k))); 0; })
68 #define SET_BIT(a, k) ({a = (a | (1<<k)); 0; })
69 #define WLAN_SYSTEM_DBG TEST_BIT(g_dbg, 1)
70 #define WLAN_PATH_DBG TEST_BIT(g_dbg, 2)
71 #define WLAN_HEX_DBG TEST_BIT(g_dbg, 3)
72 #define ETH_PCAP TEST_BIT(g_dbg, 4)
73 #define MAC_PCAP TEST_BIT(g_dbg, 5)
75 #define SIOGETSSID (0x89F2)
77 /* HW_TX_SIZE, HW_RX_SIZE and PKT_AGGR_NUM must keep pace with CP
78 * TX: CP discrp number 38, use 3 blocks, 13k per block
79 * PKT_AGGR_NUM 12 = 38 / 3
83 #define HW_TX_SIZE (13312)
84 #define HW_RX_SIZE (12288)
85 #define PKT_AGGR_NUM (12)
86 #define MAX_TCP_SESSION (10)
88 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0))
89 #define KERNEL_DEBUG_LEVE "\001" "0"
91 #define KERNEL_DEBUG_LEVE "<0>"
94 #define printkd(fmt, ...) ({if (WLAN_SYSTEM_DBG)printk("[SC2331]" fmt, ##__VA_ARGS__); 0; })
95 #define printkp(fmt, ...) ({if (WLAN_PATH_DBG)printk("[SC2331]" fmt, ##__VA_ARGS__); 0; })
96 #define printke(fmt, ...) ({printk(KERNEL_DEBUG_LEVE "[SC2331]" fmt, ##__VA_ARGS__); 0; })
97 #define ASSERT(fmt, ...) ({printk(KERNEL_DEBUG_LEVE "[SC2331][ASSERT][%s][%d]" fmt "\n", __func__, __LINE__, ##__VA_ARGS__); 0; })
99 #define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"
100 #define MAC2STR(a) ((a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5])
103 unsigned char chn[16];
105 unsigned short bit_map;
109 unsigned long timeout;
110 unsigned long timeout_time;
131 struct semaphore sem;
137 sdio_chn_t sdio_tx_chn;
138 sdio_chn_t sdio_rx_chn;
141 unsigned int rx_record;
142 struct wake_lock wlan_lock;
143 struct early_suspend early_suspend;
145 struct timer_list wakeup_timer;
146 unsigned long wakeup_time;
154 struct task_struct *task;
155 struct semaphore sem;
160 unsigned int need_tx;
161 unsigned int done_tx;
162 unsigned int need_rx;
163 unsigned int done_rx;
165 /*exit_status: 0 --not exit; 1--already exit. */
166 atomic_t exit_status;
171 unsigned char mac[ETH_ALEN];
172 unsigned char netif_id;
174 unsigned char wmm_supp;
175 unsigned char status;
179 wait_queue_head_t waitQ;
181 struct mutex cmd_lock;
182 struct mutex mem_lock;
188 struct work_struct work;
189 unsigned short frame_type;
192 } register_frame_param_t;
195 #ifdef CONFIG_HAS_WAKELOCK
196 struct wake_lock scan_done_lock;
198 atomic_t scan_status;
199 struct cfg80211_scan_request *scan_request;
200 struct timer_list scan_timeout;
203 unsigned char ssid[IEEE80211_MAX_SSID_LEN];
204 unsigned char bssid[ETH_ALEN];
205 unsigned char cipher_type;
206 unsigned char key_index[2];
207 unsigned char key[2][4][WLAN_MAX_KEY_LEN];
208 unsigned char key_len[2][4];
209 unsigned char key_txrsc[2][WLAN_MAX_KEY_LEN];
210 unsigned char *scan_frame_array;
212 register_frame_param_t register_frame;
215 /* Best not to use the work to send deauth cmd
216 * FIXME in the future
219 struct work_struct work;
220 /* 60 length is enough, maybe FIXME */
221 unsigned char mac[60];
228 unsigned int data_seq;
229 unsigned int ack_seq;
230 struct timeval data_time;
231 struct timeval ack_time;
233 } wlan_tcp_session_t;
236 struct net_device *ndev;
237 struct wireless_dev wdev;
239 unsigned char mac[ETH_ALEN];
242 wlan_cfg80211_t cfg80211;
243 net_connect_dev_t connect_dev[8];
244 struct deauth_info deauth_info;
247 bool tcp_ack_suppress;
248 wlan_tcp_session_t tcp_session[MAX_TCP_SESSION];
249 struct wlan_cmd_hidden_ssid hssid;
256 wlan_thread_t wlan_core;
257 wlan_thread_t wlan_trans;
265 extern void core_down(void);
266 extern void core_up(void);
267 extern void trans_down(void);
268 extern void trans_up(void);
269 extern void up_wlan_rx_trans(void);
270 extern int wlan_module_init(struct device *dev);
271 extern int wlan_module_exit(struct device *dev);
272 extern int hex_dump(unsigned char *name, unsigned short nLen,
273 unsigned char *pData, unsigned short len);
274 extern void init_register_frame_param(wlan_vif_t *vif);
275 extern void init_send_deauth_work(wlan_vif_t *vif);
276 extern wlan_vif_t *ndev_to_vif(struct net_device *ndev);
277 extern wlan_vif_t *id_to_vif(unsigned char id);
278 extern int hostap_conf_load(char *filename, unsigned char *key_val);
279 extern int mac_addr_cfg(wlan_vif_t *vif, unsigned char vif_id);
280 extern int wlan_vif_init(wlan_vif_t *vif, int type, const char *name,
282 extern int wlan_wiphy_new(wlan_info_t *wlan);
283 extern int wlan_vif_free(wlan_vif_t *vif);
284 extern int wlan_wiphy_free(wlan_info_t *wlan);
285 extern void wlan_nl_init(void);
286 extern void wlan_nl_deinit(void);
288 extern bool get_sdiohal_status(void);
289 extern int sdio_chn_status(unsigned short chn, unsigned short *status);
290 extern int sdio_dev_read(unsigned int chn, void *read_buf, unsigned int *count);
291 extern int sdio_dev_write(unsigned int chn, void *data_buf, unsigned int count);
292 extern int sdiodev_readchn_init(int chn, void *callback, bool with_para);
293 extern int sdio_read_wlan(unsigned int chn, void *read_buf,
294 unsigned int *count);
295 extern int sdiodev_readchn_uninit(unsigned int chn);
296 extern void mdbg_at_cmd_read(void);
297 extern void mdbg_loopcheck_read(void);
298 extern void mdbg_assert_read(void);
300 extern void mdbg_sdio_read(void);
301 extern void marlin_pa_enable(bool enable);
302 extern int set_wlan_status(int status);
303 extern int set_marlin_wakeup(unsigned int chn, unsigned int user_id);
304 extern int set_marlin_sleep(unsigned int chn, unsigned int user_id);
305 extern char *get_cmd_name(int id);
306 extern unsigned int g_dbg;
307 extern wlan_info_t g_wlan;
308 extern msg_q_t *wlan_tcpack_q(wlan_vif_t *vif, unsigned char *frame,
310 extern int wlan_tcpack_tx(wlan_vif_t *vif, int *done);
311 extern int wlan_tcpack_buf_malloc(wlan_vif_t *vif);
312 extern int wlan_tcpack_buf_free(wlan_vif_t *vif);
313 extern int wlan_rx_buf_decode(unsigned char *buf, unsigned int max_len);
314 extern int wlan_tx_buf_decode(unsigned char *buf, unsigned int max_len);
315 extern void seq_point(unsigned char *frame, unsigned int len);
316 extern void ack_timeout_point(unsigned char *frame, unsigned int len);
317 extern void tcp_session_cfg(int cmd, int value);