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 "ozeltbuf.h"
10 
11 /* PD state
12  */
13 #define OZ_PD_S_IDLE		0x1
14 #define OZ_PD_S_CONNECTED	0x2
15 #define OZ_PD_S_SLEEP		0x4
16 #define OZ_PD_S_STOPPED		0x8
17 
18 /* Timer event types.
19  */
20 #define OZ_TIMER_TOUT		1
21 #define OZ_TIMER_HEARTBEAT	2
22 #define OZ_TIMER_STOP		3
23 
24 /* Data structure that hold information on a frame for transmisson. This is
25  * built when the frame is first transmitted and is used to rebuild the frame
26  * if a re-transmission is required.
27  */
28 struct oz_tx_frame {
29 	struct list_head link;
30 	struct list_head elt_list;
31 	struct oz_hdr hdr;
32 	int total_size;
33 };
34 
35 struct oz_isoc_stream {
36 	struct list_head link;
37 	u8 ep_num;
38 	u8 frame_num;
39 	u8 nb_units;
40 	int size;
41 	struct sk_buff *skb;
42 	struct oz_hdr *oz_hdr;
43 };
44 
45 struct oz_farewell {
46 	struct list_head link;
47 	u8 ep_num;
48 	u8 index;
49 	u8 report[1];
50 	u8 len;
51 };
52 
53 /* Data structure that holds information on a specific peripheral device (PD).
54  */
55 struct oz_pd {
56 	struct list_head link;
57 	atomic_t	ref_count;
58 	u8		mac_addr[ETH_ALEN];
59 	unsigned	state;
60 	unsigned	state_flags;
61 	unsigned	send_flags;
62 	u16		total_apps;
63 	u16		paused_apps;
64 	u8		session_id;
65 	u8		param_rsp_status;
66 	u8		pd_info;
67 	u8		isoc_sent;
68 	u32		last_rx_pkt_num;
69 	u32		last_tx_pkt_num;
70 	u32		trigger_pkt_num;
71 	unsigned long	pulse_time_j;
72 	unsigned long	timeout_time_j;
73 	unsigned long	pulse_period_j;
74 	unsigned long	presleep_j;
75 	unsigned long	keep_alive_j;
76 	unsigned long	last_rx_time_j;
77 	struct oz_elt_buf elt_buff;
78 	void		*app_ctx[OZ_APPID_MAX];
79 	spinlock_t	app_lock[OZ_APPID_MAX];
80 	int		max_tx_size;
81 	u8		heartbeat_requested;
82 	u8		mode;
83 	u8		ms_per_isoc;
84 	unsigned	max_stream_buffering;
85 	int		nb_queued_frames;
86 	struct list_head *tx_pool;
87 	int		tx_pool_count;
88 	spinlock_t	tx_frame_lock;
89 	struct list_head *last_sent_frame;
90 	struct list_head tx_queue;
91 	struct list_head farewell_list;
92 	spinlock_t	stream_lock;
93 	struct list_head stream_list;
94 	struct net_device *net_dev;
95 };
96 
97 #define OZ_MAX_QUEUED_FRAMES	4
98 
99 struct oz_pd *oz_pd_alloc(u8 *mac_addr);
100 void oz_pd_destroy(struct oz_pd *pd);
101 void oz_pd_get(struct oz_pd *pd);
102 void oz_pd_put(struct oz_pd *pd);
103 void oz_pd_set_state(struct oz_pd *pd, unsigned state);
104 void oz_pd_indicate_farewells(struct oz_pd *pd);
105 int oz_pd_sleep(struct oz_pd *pd);
106 void oz_pd_stop(struct oz_pd *pd);
107 void oz_pd_heartbeat(struct oz_pd *pd, u16 apps);
108 int oz_services_start(struct oz_pd *pd, u16 apps, int resume);
109 void oz_services_stop(struct oz_pd *pd, u16 apps, int pause);
110 int oz_prepare_frame(struct oz_pd *pd, int empty);
111 void oz_send_queued_frames(struct oz_pd *pd, int backlog);
112 void oz_retire_tx_frames(struct oz_pd *pd, u8 lpn);
113 int oz_isoc_stream_create(struct oz_pd *pd, u8 ep_num);
114 int oz_isoc_stream_delete(struct oz_pd *pd, u8 ep_num);
115 int oz_send_isoc_unit(struct oz_pd *pd, u8 ep_num, u8 *data, int len);
116 void oz_handle_app_elt(struct oz_pd *pd, u8 app_id, struct oz_elt *elt);
117 void oz_apps_init(void);
118 void oz_apps_term(void);
119 
120 #endif /* Sentry */
121 
122