aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/staging/ozwpan/ozevent.c116
-rw-r--r--drivers/staging/ozwpan/ozevent.h31
-rw-r--r--drivers/staging/ozwpan/ozeventdef.h47
3 files changed, 194 insertions, 0 deletions
diff --git a/drivers/staging/ozwpan/ozevent.c b/drivers/staging/ozwpan/ozevent.c
new file mode 100644
index 00000000000..73703d3e96b
--- /dev/null
+++ b/drivers/staging/ozwpan/ozevent.c
@@ -0,0 +1,116 @@
1/* -----------------------------------------------------------------------------
2 * Copyright (c) 2011 Ozmo Inc
3 * Released under the GNU General Public License Version 2 (GPLv2).
4 * -----------------------------------------------------------------------------
5 */
6#include "ozconfig.h"
7#ifdef WANT_EVENT_TRACE
8#include <linux/jiffies.h>
9#include <linux/uaccess.h>
10#include "oztrace.h"
11#include "ozevent.h"
12/*------------------------------------------------------------------------------
13 */
14unsigned long g_evt_mask = 0xffffffff;
15/*------------------------------------------------------------------------------
16 */
17#define OZ_MAX_EVTS 2048 /* Must be power of 2 */
18DEFINE_SPINLOCK(g_eventlock);
19static int g_evt_in;
20static int g_evt_out;
21static int g_missed_events;
22static struct oz_event g_events[OZ_MAX_EVTS];
23/*------------------------------------------------------------------------------
24 * Context: process
25 */
26void oz_event_init(void)
27{
28 oz_trace("Event tracing initialized\n");
29 g_evt_in = g_evt_out = 0;
30 g_missed_events = 0;
31}
32/*------------------------------------------------------------------------------
33 * Context: process
34 */
35void oz_event_term(void)
36{
37 oz_trace("Event tracing terminated\n");
38}
39/*------------------------------------------------------------------------------
40 * Context: any
41 */
42void oz_event_log2(u8 evt, u8 ctx1, u16 ctx2, void *ctx3, unsigned ctx4)
43{
44 unsigned long irqstate;
45 int ix;
46 spin_lock_irqsave(&g_eventlock, irqstate);
47 ix = (g_evt_in + 1) & (OZ_MAX_EVTS - 1);
48 if (ix != g_evt_out) {
49 struct oz_event *e = &g_events[g_evt_in];
50 e->jiffies = jiffies;
51 e->evt = evt;
52 e->ctx1 = ctx1;
53 e->ctx2 = ctx2;
54 e->ctx3 = ctx3;
55 e->ctx4 = ctx4;
56 g_evt_in = ix;
57 } else {
58 g_missed_events++;
59 }
60 spin_unlock_irqrestore(&g_eventlock, irqstate);
61}
62/*------------------------------------------------------------------------------
63 * Context: process
64 */
65int oz_events_copy(struct oz_evtlist __user *lst)
66{
67 int first;
68 int ix;
69 struct hdr {
70 int count;
71 int missed;
72 } hdr;
73 ix = g_evt_out;
74 hdr.count = g_evt_in - ix;
75 if (hdr.count < 0)
76 hdr.count += OZ_MAX_EVTS;
77 if (hdr.count > OZ_EVT_LIST_SZ)
78 hdr.count = OZ_EVT_LIST_SZ;
79 hdr.missed = g_missed_events;
80 g_missed_events = 0;
81 if (copy_to_user((void __user *)lst, &hdr, sizeof(hdr)))
82 return -EFAULT;
83 first = OZ_MAX_EVTS - ix;
84 if (first > hdr.count)
85 first = hdr.count;
86 if (first) {
87 int sz = first*sizeof(struct oz_event);
88 void __user *p = (void __user *)lst->evts;
89 if (copy_to_user(p, &g_events[ix], sz))
90 return -EFAULT;
91 if (hdr.count > first) {
92 p = (void __user *)&lst->evts[first];
93 sz = (hdr.count-first)*sizeof(struct oz_event);
94 if (copy_to_user(p, g_events, sz))
95 return -EFAULT;
96 }
97 }
98 ix += hdr.count;
99 if (ix >= OZ_MAX_EVTS)
100 ix -= OZ_MAX_EVTS;
101 g_evt_out = ix;
102 return 0;
103}
104/*------------------------------------------------------------------------------
105 * Context: process
106 */
107void oz_events_clear(void)
108{
109 unsigned long irqstate;
110 spin_lock_irqsave(&g_eventlock, irqstate);
111 g_evt_in = g_evt_out = 0;
112 g_missed_events = 0;
113 spin_unlock_irqrestore(&g_eventlock, irqstate);
114}
115#endif /* WANT_EVENT_TRACE */
116
diff --git a/drivers/staging/ozwpan/ozevent.h b/drivers/staging/ozwpan/ozevent.h
new file mode 100644
index 00000000000..f033d014c6f
--- /dev/null
+++ b/drivers/staging/ozwpan/ozevent.h
@@ -0,0 +1,31 @@
1/* -----------------------------------------------------------------------------
2 * Copyright (c) 2011 Ozmo Inc
3 * Released under the GNU General Public License Version 2 (GPLv2).
4 * -----------------------------------------------------------------------------
5 */
6#ifndef _OZEVENT_H
7#define _OZEVENT_H
8#include "ozconfig.h"
9#include "ozeventdef.h"
10
11#ifdef WANT_EVENT_TRACE
12extern unsigned long g_evt_mask;
13void oz_event_init(void);
14void oz_event_term(void);
15void oz_event_log2(u8 evt, u8 ctx1, u16 ctx2, void *ctx3, unsigned ctx4);
16#define oz_event_log(__evt, __ctx1, __ctx2, __ctx3, __ctx4) \
17 do { \
18 if ((1<<(__evt)) & g_evt_mask) \
19 oz_event_log2(__evt, __ctx1, __ctx2, __ctx3, __ctx4); \
20 } while (0)
21int oz_events_copy(struct oz_evtlist __user *lst);
22void oz_events_clear(void);
23#else
24#define oz_event_init()
25#define oz_event_term()
26#define oz_event_log(__evt, __ctx1, __ctx2, __ctx3, __ctx4)
27#define oz_events_copy(__lst)
28#define oz_events_clear()
29#endif /* WANT_EVENT_TRACE */
30
31#endif /* _OZEVENT_H */
diff --git a/drivers/staging/ozwpan/ozeventdef.h b/drivers/staging/ozwpan/ozeventdef.h
new file mode 100644
index 00000000000..cfe4163965d
--- /dev/null
+++ b/drivers/staging/ozwpan/ozeventdef.h
@@ -0,0 +1,47 @@
1/* -----------------------------------------------------------------------------
2 * Copyright (c) 2011 Ozmo Inc
3 * Released under the GNU General Public License Version 2 (GPLv2).
4 * -----------------------------------------------------------------------------
5 */
6#ifndef _OZEVENTDEF_H
7#define _OZEVENTDEF_H
8
9#define OZ_EVT_RX_FRAME 0
10#define OZ_EVT_RX_PROCESS 1
11#define OZ_EVT_TX_FRAME 2
12#define OZ_EVT_TX_ISOC 3
13#define OZ_EVT_URB_SUBMIT 4
14#define OZ_EVT_URB_DONE 5
15#define OZ_EVT_URB_CANCEL 6
16#define OZ_EVT_CTRL_REQ 7
17#define OZ_EVT_CTRL_CNF 8
18#define OZ_EVT_CTRL_LOCAL 9
19#define OZ_EVT_CONNECT_REQ 10
20#define OZ_EVT_CONNECT_RSP 11
21#define OZ_EVT_EP_CREDIT 12
22#define OZ_EVT_EP_BUFFERING 13
23#define OZ_EVT_TX_ISOC_DONE 14
24#define OZ_EVT_TX_ISOC_DROP 15
25#define OZ_EVT_TIMER_CTRL 16
26#define OZ_EVT_TIMER 17
27#define OZ_EVT_PD_STATE 18
28#define OZ_EVT_SERVICE 19
29#define OZ_EVT_DEBUG 20
30
31struct oz_event {
32 unsigned long jiffies;
33 unsigned char evt;
34 unsigned char ctx1;
35 unsigned short ctx2;
36 void *ctx3;
37 unsigned ctx4;
38};
39
40#define OZ_EVT_LIST_SZ 256
41struct oz_evtlist {
42 int count;
43 int missed;
44 struct oz_event evts[OZ_EVT_LIST_SZ];
45};
46
47#endif /* _OZEVENTDEF_H */