• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* -----------------------------------------------------------------------------
2  * Copyright (c) 2011 Ozmo Inc
3  * Released under the GNU General Public License Version 2 (GPLv2).
4  * -----------------------------------------------------------------------------
5  */
6 #ifndef _OZPD_H_
7 #define _OZPD_H_
8 
9 #include <linux/interrupt.h>
10 #include "ozeltbuf.h"
11 
12 /* PD state
13  */
14 #define OZ_PD_S_IDLE		0x1
15 #define OZ_PD_S_CONNECTED	0x2
16 #define OZ_PD_S_SLEEP		0x4
17 #define OZ_PD_S_STOPPED		0x8
18 
19 /* Timer event types.
20  */
21 #define OZ_TIMER_TOUT		1
22 #define OZ_TIMER_HEARTBEAT	2
23 #define OZ_TIMER_STOP		3
24 
25 /*
26  *External spinlock variable
27  */
28 extern spinlock_t g_polling_lock;
29 
30 /* Data structure that hold information on a frame for transmisson. This is
31  * built when the frame is first transmitted and is used to rebuild the frame
32  * if a re-transmission is required.
33  */
34 struct oz_tx_frame {
35 	struct list_head link;
36 	struct list_head elt_list;
37 	struct oz_hdr hdr;
38 	struct sk_buff *skb;
39 	int total_size;
40 };
41 
42 struct oz_isoc_stream {
43 	struct list_head link;
44 	u8 ep_num;
45 	u8 frame_num;
46 	u8 nb_units;
47 	int size;
48 	struct sk_buff *skb;
49 	struct oz_hdr *oz_hdr;
50 };
51 
52 struct oz_farewell {
53 	struct list_head link;
54 	u8 ep_num;
55 	u8 index;
56 	u8 len;
57 	u8 report[0];
58 };
59 
60 /* Data structure that holds information on a specific peripheral device (PD).
61  */
62 struct oz_pd {
63 	struct list_head link;
64 	atomic_t	ref_count;
65 	u8		mac_addr[ETH_ALEN];
66 	unsigned	state;
67 	unsigned	state_flags;
68 	unsigned	send_flags;
69 	u16		total_apps;
70 	u16		paused_apps;
71 	u8		session_id;
72 	u8		param_rsp_status;
73 	u8		pd_info;
74 	u8		isoc_sent;
75 	u32		last_rx_pkt_num;
76 	u32		last_tx_pkt_num;
77 	struct timespec last_rx_timestamp;
78 	u32		trigger_pkt_num;
79 	unsigned long	pulse_time;
80 	unsigned long	pulse_period;
81 	unsigned long	presleep;
82 	unsigned long	keep_alive;
83 	struct oz_elt_buf elt_buff;
84 	void		*app_ctx[OZ_NB_APPS];
85 	spinlock_t	app_lock[OZ_NB_APPS];
86 	int		max_tx_size;
87 	u8		mode;
88 	u8		ms_per_isoc;
89 	unsigned	isoc_latency;
90 	unsigned	max_stream_buffering;
91 	int		nb_queued_frames;
92 	int		nb_queued_isoc_frames;
93 	spinlock_t	tx_frame_lock;
94 	struct list_head *last_sent_frame;
95 	struct list_head tx_queue;
96 	struct list_head farewell_list;
97 	spinlock_t	stream_lock;
98 	struct list_head stream_list;
99 	struct net_device *net_dev;
100 	struct hrtimer  heartbeat;
101 	struct hrtimer  timeout;
102 	u8      timeout_type;
103 	struct tasklet_struct   heartbeat_tasklet;
104 	struct tasklet_struct   timeout_tasklet;
105 	struct work_struct workitem;
106 };
107 
108 #define OZ_MAX_QUEUED_FRAMES	4
109 
110 struct oz_pd *oz_pd_alloc(const u8 *mac_addr);
111 void oz_pd_destroy(struct oz_pd *pd);
112 void oz_pd_get(struct oz_pd *pd);
113 void oz_pd_put(struct oz_pd *pd);
114 void oz_pd_set_state(struct oz_pd *pd, unsigned state);
115 void oz_pd_indicate_farewells(struct oz_pd *pd);
116 int oz_pd_sleep(struct oz_pd *pd);
117 void oz_pd_stop(struct oz_pd *pd);
118 void oz_pd_heartbeat(struct oz_pd *pd, u16 apps);
119 int oz_services_start(struct oz_pd *pd, u16 apps, int resume);
120 void oz_services_stop(struct oz_pd *pd, u16 apps, int pause);
121 int oz_prepare_frame(struct oz_pd *pd, int empty);
122 void oz_send_queued_frames(struct oz_pd *pd, int backlog);
123 void oz_retire_tx_frames(struct oz_pd *pd, u8 lpn);
124 int oz_isoc_stream_create(struct oz_pd *pd, u8 ep_num);
125 int oz_isoc_stream_delete(struct oz_pd *pd, u8 ep_num);
126 int oz_send_isoc_unit(struct oz_pd *pd, u8 ep_num, const u8 *data, int len);
127 void oz_handle_app_elt(struct oz_pd *pd, u8 app_id, struct oz_elt *elt);
128 void oz_apps_init(void);
129 void oz_apps_term(void);
130 
131 extern struct kmem_cache *oz_elt_info_cache;
132 extern struct kmem_cache *oz_tx_frame_cache;
133 
134 #endif /* Sentry */
135