1/****************************************************************************
2**+-----------------------------------------------------------------------+**
3**|                                                                       |**
4**| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved.      |**
5**| All rights reserved.                                                  |**
6**|                                                                       |**
7**| Redistribution and use in source and binary forms, with or without    |**
8**| modification, are permitted provided that the following conditions    |**
9**| are met:                                                              |**
10**|                                                                       |**
11**|  * Redistributions of source code must retain the above copyright     |**
12**|    notice, this list of conditions and the following disclaimer.      |**
13**|  * Redistributions in binary form must reproduce the above copyright  |**
14**|    notice, this list of conditions and the following disclaimer in    |**
15**|    the documentation and/or other materials provided with the         |**
16**|    distribution.                                                      |**
17**|  * Neither the name Texas Instruments nor the names of its            |**
18**|    contributors may be used to endorse or promote products derived    |**
19**|    from this software without specific prior written permission.      |**
20**|                                                                       |**
21**| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |**
22**| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |**
23**| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
24**| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |**
25**| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
26**| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |**
27**| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
28**| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
29**| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |**
30**| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
31**| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |**
32**|                                                                       |**
33**+-----------------------------------------------------------------------+**
34****************************************************************************/
35
36
37#ifndef ESTA_DRV_INCLUDE_FILE
38#define ESTA_DRV_INCLUDE_FILE
39
40#include <linux/version.h>
41#include <linux/completion.h>
42#include <linux/netdevice.h>
43#include <linux/interrupt.h>
44#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
45#include <asm/arch/gpio.h>
46#ifdef CONFIG_ANDROID_POWER
47#include <linux/android_power.h>
48#endif
49#else
50#include <asm/gpio.h>
51#ifdef CONFIG_HAS_WAKELOCK
52#include <linux/wakelock.h>
53#endif
54#endif
55
56#ifdef CONFIG_TROUT_PWRSINK
57#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
58#include <asm/arch/trout_pwrsink.h>
59#else
60#include <mach/trout_pwrsink.h>
61#endif
62#endif
63
64#ifdef CONFIG_HTC_PWRSINK
65#include <mach/htc_pwrsink.h>
66#endif
67
68#include "osTIType.h"
69#include "osAdapter.h"
70#include "paramOut.h"
71#ifndef GWSI_DRIVER /* for GWSI Stand Alone */
72#include "configMgr.h"
73#endif
74#include "linux_ioctl_common.h"
75
76#define TIWLAN_DRV_NAME    "tiwlan"
77#define TIWLAN_DRV_IF_NAME TIWLAN_DRV_NAME"%d"
78#define TIWLAN_DRV_NAME_WIRELESS_PROTO "IEEE 802.11-DS"
79#define TIWLAN_DBG_PROC    "wifidbg"
80
81#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
82#define NETDEV_SET_PRIVATE(dev, drv)	dev->priv = drv
83#define NETDEV_GET_PRIVATE(dev)		dev->priv
84#else
85#define NETDEV_SET_PRIVATE(dev, drv)	dev->ml_priv = drv
86#define NETDEV_GET_PRIVATE(dev)		dev->ml_priv
87#endif
88
89void *wifi_kernel_prealloc(int section, unsigned long size);
90
91#ifdef TIWLAN_MSM7000
92#ifdef CONFIG_WIFI_CONTROL_FUNC
93#include <linux/platform_device.h>
94#include <linux/wifi_tiwlan.h>
95int msm_wifi_power(int on);
96int msm_wifi_reset(int on);
97#else
98extern int trout_wifi_power(int on);
99extern int trout_wifi_reset(int on);
100extern int trout_wifi_set_carddetect(int val);
101#define msm_wifi_power(a)       trout_wifi_power(a)
102#define msm_wifi_reset(a)       trout_wifi_reset(a)
103#endif
104#endif
105
106#ifdef CONFIG_HAS_WAKELOCK
107#define CONFIG_ANDROID_POWER
108typedef struct wake_lock android_suspend_lock_t;
109#define android_unlock_suspend(a)             wake_unlock(a)
110#define android_lock_suspend(a)               wake_lock(a)
111#define android_lock_suspend_auto_expire(a,t) wake_lock_timeout(a,t)
112#define android_init_suspend_wakelock(a,n)    wake_lock_init(a,WAKE_LOCK_SUSPEND,n)
113#define android_uninit_suspend_lock(a)        wake_lock_destroy(a)
114#endif
115
116#ifndef TIWLAN_OMAP1610_REGBASE
117
118#if defined(TIWLAN_OMAP1610_INNOVATOR)
119#define TIWLAN_OMAP1610_REGBASE 0xEC100000    /* VA*/
120#elif defined(TIWLAN_OMAP1610_WIPP) || defined(TIWLAN_OMAP1610_CRTWIPP)
121#ifndef OMAP_WLAN_BASE
122#define OMAP_WLAN_BASE  0
123#endif
124#define TIWLAN_OMAP1610_REGBASE (OMAP_WLAN_BASE+0x100000)
125#else
126/* Dm: #error TIWLAN_OMAP1610_REGBASE not defined for this platform */
127#endif
128
129#endif /* #ifndef TIWLAN_OMAP1610_REGBASE */
130
131#ifdef TIWLAN_OMAP1610_REGBASE
132
133#define TIWLAN_OMAP1610_REGSIZE 0x10000
134#define TIWLAN_OMAP1610_MEMBASE (TIWLAN_OMAP1610_REGBASE | 0x20000)
135#define TIWLAN_OMAP1610_MEMSIZE 0x10000
136
137#endif /* #ifdef TIWLAN_OMAP1610_REGBASE */
138
139#ifndef TIWLAN_OMAP1610_IRQ
140
141#if defined(TIWLAN_OMAP1610_INNOVATOR)
142#define TIWLAN_OMAP1610_IRQ     (OMAP_GPIO_IRQ(8))
143#elif defined(TIWLAN_OMAP1610_CRTWIPP)
144#define TIWLAN_OMAP1610_IRQ     (OMAP_GPIO_IRQ(2))
145#elif defined(TIWLAN_OMAP1610_WIPP)
146#define TIWLAN_OMAP1610_IRQ     (OMAP_GPIO_IRQ(2))
147#endif
148
149#endif /* TIWLAN_OMAP1610_IRQ */
150#define TIWLAN_IRQ_POLL_INTERVAL  HZ/100  /* Used when no Intr are handled from the FW */
151
152
153#ifdef TI_DBG
154#define ti_dprintf(log, fmt, args...) do { \
155   if (log != TIWLAN_LOG_OTHER) {   \
156      printk(KERN_INFO fmt, ## args); \
157   } \
158} while (0)
159#else
160#define ti_dprintf(log, fmt, args...)
161#endif
162
163
164#define ti_nodprintf(log, fmt, args...)
165
166typedef enum {
167   TIWLAN_LOG_ERROR,
168   TIWLAN_LOG_INFO,
169   TIWLAN_LOG_OTHER,
170   TIWLAN_LOG_DUMMY
171} tiwlan_log_t;
172
173typedef struct tiwlan_region {
174      unsigned long pa;
175      void *va;
176      unsigned long size;
177} tiwlan_region_t;
178
179/* Driver structure */
180typedef struct tiwlan_net_dev tiwlan_net_dev_t;
181
182#if defined (__KERNEL__)
183/* Request/response to/from control tasklet */
184typedef struct tiwlan_req {
185      struct list_head list;
186      tiwlan_net_dev_t *drv;
187      struct
188      {
189            struct {
190                  int (*f)(struct tiwlan_req *req);
191                  unsigned long p1;
192                  unsigned long p2;
193                  unsigned long p3;
194                  unsigned long p4;
195                  int reply_expected;     /* 1=reply expected */
196                  struct completion comp;
197            } req;
198            int reply;
199      } u;
200} tiwlan_req_t;
201
202/* Timer structure */
203typedef struct timer_obj {
204      tiwlan_req_t req;
205         /* Timer handler function ->p1 */
206         /* Timer handler function parameter ->p2 */
207         /* Periodic ->p3 */
208         /* jiffies ->p4 */
209      struct timer_list  timer;
210      int use_count;
211} timer_obj_t;
212
213
214#ifdef DRIVER_PROFILING
215
216/* Profiler banchmark function type */
217typedef void (*tiwlan_pfofile_t) (void*, unsigned);
218
219/* Maximum number of profile banchmarks */
220#define MAX_PROFILE_BM 10
221
222#endif
223
224#if defined(CONFIG_TROUT_PWRSINK) || defined(CONFIG_HTC_PWRSINK)
225#define PWRSINK_WIFI_PERCENT_BASE 4
226#endif
227
228/* #define DM_USE_WORKQUEUE */
229
230/* Driver structure */
231struct tiwlan_net_dev {
232      struct list_head list;
233
234      tiwlan_region_t acx_mem;
235      tiwlan_region_t acx_reg;
236      tiwlan_region_t eeprom_image;
237      tiwlan_region_t firmware_image;
238      int irq;
239#ifdef DM_USE_WORKQUEUE
240      struct workqueue_struct *tiwlan_wq; /* Work Queue */
241      struct work_struct tirq;         /* Work Task for interrupt */
242      struct work_struct tw;           /* Work Task for other stuff */
243      mem_MSDU_T *txmit_msdu_next;
244      mem_MSDU_T *txmit_msdu_last;
245      struct work_struct txmit;        /* Work Task for transmit */
246#else
247      struct tasklet_struct tl;        /* Control tasklet */
248#endif
249#if defined(CONFIG_TROUT_PWRSINK) || defined(CONFIG_HTC_PWRSINK)
250      struct delayed_work trxw;        /* Work Task for rx watchdog */
251#endif
252#ifdef CONFIG_ANDROID_POWER
253      android_suspend_lock_t irq_wake_lock; /* Suspend Lock to keep system awake */
254      android_suspend_lock_t xmit_wake_lock;
255      android_suspend_lock_t timer_wake_lock;
256      android_suspend_lock_t rx_wake_lock;
257      android_suspend_lock_t exec_wake_lock;
258      int receive_packet;              /* 1=packet was pushed to network stack */
259#endif
260      int interrupt_pending;           /* 1=tasklet has to handle interrupts when awakes */
261      int dma_done;
262      struct list_head request_q;      /* Requests queue: -> tasklet */
263      spinlock_t lock;
264      unsigned long flags;
265      struct timer_list poll_timer;    /* Polling timer. Used only when working without interrupts */
266      int started;                     /* 1=config manager started. 0=config manager stopped */
267      int initialized;                 /* 1=succeeded to pass init stage, 0=otherwise */
268      int unload_driver;               /* Driver unload indicator */
269      struct net_device_stats stats;
270      int alloc_msdu_failures;         /* Extra statistics */
271      initTable_t  init_table;
272      TIWLN_ADAPTER_T adapter;
273      struct sock *wl_sock;
274      struct completion comp;
275      struct net_device *netdev;
276      void *priv;                      /* Pointer to struct net_device */
277
278#ifdef DRIVER_PROFILING
279      tiwlan_pfofile_t fpro [MAX_PROFILE_BM];   /* Profiler functions */
280
281      unsigned max_number_of_timers;            /* Maximum number of allocated timers */
282      unsigned cur_number_of_timers;            /* Current number of allocated timers */
283
284      unsigned max_heap_bytes_allocated;        /* Maximum number of allocated bytes on the heap */
285      unsigned cur_heap_bytes_allocated;        /* Current number of allocated bytes on the heap */
286      unsigned max_buf_bytes_allocated;         /* Maximum number of allocated bytes on the heap for TX/RX buffers */
287
288      unsigned cpu_usage_estimator_start_time;  /* Time measured when CPU estimation was started */
289      unsigned cpu_usage_estimator_stop_time;   /* Time measured when CPU estimation was stopped */
290      unsigned cpu_usage_estimator_resolution;  /* Resolution of the CPU estimation in us */
291      unsigned total_us_of_cpu_time;            /* Total number of CPU time used by the driver since CPU estimator started */
292      unsigned total_us_of_bus_access_cpu_time; /* Total number of CPU time used by the bus driver since CPU estimator started */
293      unsigned driver_entry_start_time;         /* Time measured at the start of last driver entry point */
294      unsigned bus_driver_entry_start_time;     /* Time measured at the start of last bus driver entry point */
295#endif
296
297#ifdef GWSI_DRIVER
298      void *gwsi;                      /* GWSI manager handler */
299      void *gwsi_ev;                   /* GWSI event handler */
300      char  gwsi_tester_buf [4096];    /* GWSI tester buffer */
301#endif
302};
303
304
305#define VENDOR_ID_TI            0x104c
306#define DEVICE_ID_TI_WLAN       0x9066
307
308/* tiwlan_send_wait_reply
309   This internal interface function creates request and sends
310   it to the control tasklet for processing.
311   The calling process is blocked until the request is replied.
312   Function f is being called in the context of the control tasklet.
313   The request block that is passed to the function as a parameter
314   contains p1, p2, p3, p4.
315   The function return code is propagated back to the caller.
316   tiwlan_send_req_and_wait returns (*f) return code or
317   -ENOMEM if failed to allocate a request.
318*/
319int tiwlan_send_wait_reply(tiwlan_net_dev_t *drv,
320                           int (*f)(tiwlan_req_t *req),
321                           unsigned long p1,
322                           unsigned long p2,
323                           unsigned long p3,
324                           unsigned long p4);
325
326#endif /* #if defined (__KERNEL__)*/
327
328int tiwlan_init_drv(tiwlan_net_dev_t *drv, tiwlan_dev_init_t *init_info);
329int tiwlan_start_drv(tiwlan_net_dev_t *drv);
330int tiwlan_stop_drv(tiwlan_net_dev_t *drv);
331int tiwlan_stop_and_destroy_drv(tiwlan_net_dev_t *drv);
332int tiwlan_stop_and_destroy_drv_request(tiwlan_req_t *req);
333int tiwlan_ioctl_init(struct net_device *dev);
334
335#endif /* ESTA_DRV_INCLUDE_FILE*/
336