[go: nahoru, domu]

1bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly/* -----------------------------------------------------------------------------
2bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly * Copyright (c) 2011 Ozmo Inc
3bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly * Released under the GNU General Public License Version 2 (GPLv2).
4bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly * -----------------------------------------------------------------------------
5bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly */
6bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly#ifndef _OZPD_H_
7bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly#define _OZPD_H_
8bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly
98fd070077410b26847ef6f5856850df417e7b83eRupesh Gujare#include <linux/interrupt.h>
10bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly#include "ozeltbuf.h"
11bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly
12bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly/* PD state
13bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly */
14bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly#define OZ_PD_S_IDLE		0x1
15bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly#define OZ_PD_S_CONNECTED	0x2
16bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly#define OZ_PD_S_SLEEP		0x4
17bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly#define OZ_PD_S_STOPPED		0x8
18bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly
19bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly/* Timer event types.
20bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly */
21bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly#define OZ_TIMER_TOUT		1
22bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly#define OZ_TIMER_HEARTBEAT	2
23bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly#define OZ_TIMER_STOP		3
24bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly
2546374d3f7850dc639e2ad47ff911831d3d26d5d2Jérôme Pinot/*
266b029336d93d8f9a94b0256b1f7d9c1768eedba7Surendra Patil *External spinlock variable
276b029336d93d8f9a94b0256b1f7d9c1768eedba7Surendra Patil */
286b029336d93d8f9a94b0256b1f7d9c1768eedba7Surendra Patilextern spinlock_t g_polling_lock;
296b029336d93d8f9a94b0256b1f7d9c1768eedba7Surendra Patil
30bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly/* Data structure that hold information on a frame for transmisson. This is
31bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly * built when the frame is first transmitted and is used to rebuild the frame
32bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly * if a re-transmission is required.
33bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly */
34bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kellystruct oz_tx_frame {
35bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	struct list_head link;
36bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	struct list_head elt_list;
37bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	struct oz_hdr hdr;
3833e6ada17fffc54c24607d5acb279363b30ac401Rupesh Gujare	struct sk_buff *skb;
39bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	int total_size;
40bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly};
41bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly
42bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kellystruct oz_isoc_stream {
43bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	struct list_head link;
44bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	u8 ep_num;
45bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	u8 frame_num;
46bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	u8 nb_units;
47bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	int size;
48bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	struct sk_buff *skb;
49bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	struct oz_hdr *oz_hdr;
50bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly};
51bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly
52bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kellystruct oz_farewell {
53bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	struct list_head link;
54bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	u8 ep_num;
55bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	u8 index;
56bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	u8 len;
57b2271b5bdf1fd8b7d5442e2452e9242b88c56e8fRupesh Gujare	u8 report[0];
58bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly};
59bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly
60bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly/* Data structure that holds information on a specific peripheral device (PD).
61bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly */
62bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kellystruct oz_pd {
63bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	struct list_head link;
64bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	atomic_t	ref_count;
65bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	u8		mac_addr[ETH_ALEN];
66bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	unsigned	state;
67bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	unsigned	state_flags;
68bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	unsigned	send_flags;
69bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	u16		total_apps;
70bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	u16		paused_apps;
71bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	u8		session_id;
72bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	u8		param_rsp_status;
73bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	u8		pd_info;
74bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	u8		isoc_sent;
75bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	u32		last_rx_pkt_num;
76bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	u32		last_tx_pkt_num;
778fd070077410b26847ef6f5856850df417e7b83eRupesh Gujare	struct timespec last_rx_timestamp;
78bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	u32		trigger_pkt_num;
798fd070077410b26847ef6f5856850df417e7b83eRupesh Gujare	unsigned long	pulse_time;
808fd070077410b26847ef6f5856850df417e7b83eRupesh Gujare	unsigned long	pulse_period;
818fd070077410b26847ef6f5856850df417e7b83eRupesh Gujare	unsigned long	presleep;
828fd070077410b26847ef6f5856850df417e7b83eRupesh Gujare	unsigned long	keep_alive;
83bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	struct oz_elt_buf elt_buff;
84a9686e786896297f9f1d74a2cac4ffccc7b3e50eChristoph Jaeger	void		*app_ctx[OZ_NB_APPS];
85a9686e786896297f9f1d74a2cac4ffccc7b3e50eChristoph Jaeger	spinlock_t	app_lock[OZ_NB_APPS];
86bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	int		max_tx_size;
87bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	u8		mode;
88bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	u8		ms_per_isoc;
8986d03a0f4f575dda7988800a3da8d6e9f776a819Rupesh Gujare	unsigned	isoc_latency;
90bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	unsigned	max_stream_buffering;
91bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	int		nb_queued_frames;
9233e6ada17fffc54c24607d5acb279363b30ac401Rupesh Gujare	int		nb_queued_isoc_frames;
93bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	spinlock_t	tx_frame_lock;
94bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	struct list_head *last_sent_frame;
95bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	struct list_head tx_queue;
96bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	struct list_head farewell_list;
97bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	spinlock_t	stream_lock;
98bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	struct list_head stream_list;
99bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly	struct net_device *net_dev;
1008fd070077410b26847ef6f5856850df417e7b83eRupesh Gujare	struct hrtimer  heartbeat;
1018fd070077410b26847ef6f5856850df417e7b83eRupesh Gujare	struct hrtimer  timeout;
1028fd070077410b26847ef6f5856850df417e7b83eRupesh Gujare	u8      timeout_type;
1038fd070077410b26847ef6f5856850df417e7b83eRupesh Gujare	struct tasklet_struct   heartbeat_tasklet;
1048fd070077410b26847ef6f5856850df417e7b83eRupesh Gujare	struct tasklet_struct   timeout_tasklet;
1056af47622398d65e4cb3a52af5de52c6b447270d5Rupesh Gujare	struct work_struct workitem;
106bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly};
107bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly
108bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly#define OZ_MAX_QUEUED_FRAMES	4
109bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly
110dc7f5b3594fdb846890192fd75793a791d7ba83bPeter Huewestruct oz_pd *oz_pd_alloc(const u8 *mac_addr);
111bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kellyvoid oz_pd_destroy(struct oz_pd *pd);
112bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kellyvoid oz_pd_get(struct oz_pd *pd);
113bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kellyvoid oz_pd_put(struct oz_pd *pd);
114bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kellyvoid oz_pd_set_state(struct oz_pd *pd, unsigned state);
115bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kellyvoid oz_pd_indicate_farewells(struct oz_pd *pd);
116bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kellyint oz_pd_sleep(struct oz_pd *pd);
117bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kellyvoid oz_pd_stop(struct oz_pd *pd);
118bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kellyvoid oz_pd_heartbeat(struct oz_pd *pd, u16 apps);
119bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kellyint oz_services_start(struct oz_pd *pd, u16 apps, int resume);
120bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kellyvoid oz_services_stop(struct oz_pd *pd, u16 apps, int pause);
121bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kellyint oz_prepare_frame(struct oz_pd *pd, int empty);
122bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kellyvoid oz_send_queued_frames(struct oz_pd *pd, int backlog);
123bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kellyvoid oz_retire_tx_frames(struct oz_pd *pd, u8 lpn);
124bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kellyint oz_isoc_stream_create(struct oz_pd *pd, u8 ep_num);
125bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kellyint oz_isoc_stream_delete(struct oz_pd *pd, u8 ep_num);
126dc7f5b3594fdb846890192fd75793a791d7ba83bPeter Hueweint oz_send_isoc_unit(struct oz_pd *pd, u8 ep_num, const u8 *data, int len);
127bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kellyvoid oz_handle_app_elt(struct oz_pd *pd, u8 app_id, struct oz_elt *elt);
128bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kellyvoid oz_apps_init(void);
129bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kellyvoid oz_apps_term(void);
130bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly
1312b8b61aaef59751fe85c1b2df51a848a6c50d202Christoph Jaegerextern struct kmem_cache *oz_elt_info_cache;
13250222db4b03ac8f3259c6d39bbd585ed3358f70fChristoph Jaegerextern struct kmem_cache *oz_tx_frame_cache;
1332b8b61aaef59751fe85c1b2df51a848a6c50d202Christoph Jaeger
134bc3157dde35ac3b2ec12229edcfaca58cd7925c0Chris Kelly#endif /* Sentry */
135