1/* -----------------------------------------------------------------------------
2 * Copyright (c) 2011 Ozmo Inc
3 * Released under the GNU General Public License Version 2 (GPLv2).
4 * -----------------------------------------------------------------------------
5 */
6#ifndef _OZELTBUF_H
7#define _OZELTBUF_H
8
9#include "ozprotocol.h"
10
11/*-----------------------------------------------------------------------------
12 */
13struct oz_pd;
14typedef void (*oz_elt_callback_t)(struct oz_pd *pd, long context);
15
16struct oz_elt_stream {
17	struct list_head link;
18	struct list_head elt_list;
19	atomic_t ref_count;
20	unsigned buf_count;
21	unsigned max_buf_count;
22	u8 frame_number;
23	u8 id;
24};
25
26#define OZ_MAX_ELT_PAYLOAD	255
27struct oz_elt_info {
28	struct list_head link;
29	struct list_head link_order;
30	u8 flags;
31	u8 app_id;
32	oz_elt_callback_t callback;
33	long context;
34	struct oz_elt_stream *stream;
35	u8 data[sizeof(struct oz_elt) + OZ_MAX_ELT_PAYLOAD];
36	int length;
37};
38/* Flags values */
39#define OZ_EI_F_MARKED		0x1
40
41struct oz_elt_buf {
42	spinlock_t lock;
43	struct list_head stream_list;
44	struct list_head order_list;
45	struct list_head isoc_list;
46	u8 tx_seq_num[OZ_NB_APPS];
47};
48
49void oz_elt_buf_init(struct oz_elt_buf *buf);
50void oz_elt_buf_term(struct oz_elt_buf *buf);
51struct oz_elt_info *oz_elt_info_alloc(struct oz_elt_buf *buf);
52void oz_elt_info_free(struct oz_elt_buf *buf, struct oz_elt_info *ei);
53void oz_elt_info_free_chain(struct oz_elt_buf *buf, struct list_head *list);
54int oz_elt_stream_create(struct oz_elt_buf *buf, u8 id, int max_buf_count);
55int oz_elt_stream_delete(struct oz_elt_buf *buf, u8 id);
56void oz_elt_stream_get(struct oz_elt_stream *st);
57void oz_elt_stream_put(struct oz_elt_stream *st);
58int oz_queue_elt_info(struct oz_elt_buf *buf, u8 isoc, u8 id,
59		struct oz_elt_info *ei);
60int oz_select_elts_for_tx(struct oz_elt_buf *buf, u8 isoc, unsigned *len,
61		unsigned max_len, struct list_head *list);
62int oz_are_elts_available(struct oz_elt_buf *buf);
63
64#endif /* _OZELTBUF_H */
65
66