1 /* -----------------------------------------------------------------------------
2 * Copyright (c) 2011 Ozmo Inc
3 * Released under the GNU General Public License Version 2 (GPLv2).
4 * -----------------------------------------------------------------------------
9 #include <linux/interrupt.h>
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
21 #define OZ_TIMER_TOUT 1
22 #define OZ_TIMER_HEARTBEAT 2
23 #define OZ_TIMER_STOP 3
26 *External spinlock variable
28 extern spinlock_t g_polling_lock;
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.
35 struct list_head link;
36 struct list_head elt_list;
42 struct oz_isoc_stream {
43 struct list_head link;
49 struct oz_hdr *oz_hdr;
53 struct list_head link;
60 /* Data structure that holds information on a specific peripheral device (PD).
63 struct list_head link;
65 u8 mac_addr[ETH_ALEN];
77 struct timespec last_rx_timestamp;
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];
89 unsigned isoc_latency;
90 unsigned max_stream_buffering;
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;
103 struct tasklet_struct heartbeat_tasklet;
104 struct tasklet_struct timeout_tasklet;
105 struct work_struct workitem;
108 #define OZ_MAX_QUEUED_FRAMES 4
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);
131 extern struct kmem_cache *oz_elt_info_cache;
132 extern struct kmem_cache *oz_tx_frame_cache;