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
25 /* Data structure that hold information on a frame for transmisson. This is
26 * built when the frame is first transmitted and is used to rebuild the frame
27 * if a re-transmission is required.
30 struct list_head link
;
31 struct list_head elt_list
;
37 struct oz_isoc_stream
{
38 struct list_head link
;
44 struct oz_hdr
*oz_hdr
;
48 struct list_head link
;
55 /* Data structure that holds information on a specific peripheral device (PD).
58 struct list_head link
;
60 u8 mac_addr
[ETH_ALEN
];
72 struct timespec last_rx_timestamp
;
74 unsigned long pulse_time
;
75 unsigned long pulse_period
;
76 unsigned long presleep
;
77 unsigned long keep_alive
;
78 struct oz_elt_buf elt_buff
;
79 void *app_ctx
[OZ_APPID_MAX
];
80 spinlock_t app_lock
[OZ_APPID_MAX
];
84 unsigned isoc_latency
;
85 unsigned max_stream_buffering
;
87 int nb_queued_isoc_frames
;
88 struct list_head
*tx_pool
;
90 spinlock_t tx_frame_lock
;
91 struct list_head
*last_sent_frame
;
92 struct list_head tx_queue
;
93 struct list_head farewell_list
;
94 spinlock_t stream_lock
;
95 struct list_head stream_list
;
96 struct net_device
*net_dev
;
97 struct hrtimer heartbeat
;
98 struct hrtimer timeout
;
100 struct tasklet_struct heartbeat_tasklet
;
101 struct tasklet_struct timeout_tasklet
;
102 struct work_struct workitem
;
105 #define OZ_MAX_QUEUED_FRAMES 4
107 struct oz_pd
*oz_pd_alloc(const u8
*mac_addr
);
108 void oz_pd_destroy(struct oz_pd
*pd
);
109 void oz_pd_get(struct oz_pd
*pd
);
110 void oz_pd_put(struct oz_pd
*pd
);
111 void oz_pd_set_state(struct oz_pd
*pd
, unsigned state
);
112 void oz_pd_indicate_farewells(struct oz_pd
*pd
);
113 int oz_pd_sleep(struct oz_pd
*pd
);
114 void oz_pd_stop(struct oz_pd
*pd
);
115 void oz_pd_heartbeat(struct oz_pd
*pd
, u16 apps
);
116 int oz_services_start(struct oz_pd
*pd
, u16 apps
, int resume
);
117 void oz_services_stop(struct oz_pd
*pd
, u16 apps
, int pause
);
118 int oz_prepare_frame(struct oz_pd
*pd
, int empty
);
119 void oz_send_queued_frames(struct oz_pd
*pd
, int backlog
);
120 void oz_retire_tx_frames(struct oz_pd
*pd
, u8 lpn
);
121 int oz_isoc_stream_create(struct oz_pd
*pd
, u8 ep_num
);
122 int oz_isoc_stream_delete(struct oz_pd
*pd
, u8 ep_num
);
123 int oz_send_isoc_unit(struct oz_pd
*pd
, u8 ep_num
, const u8
*data
, int len
);
124 void oz_handle_app_elt(struct oz_pd
*pd
, u8 app_id
, struct oz_elt
*elt
);
125 void oz_apps_init(void);
126 void oz_apps_term(void);