| /* ----------------------------------------------------------------------------- |
| * Copyright (c) 2011 Ozmo Inc |
| * Released under the GNU General Public License Version 2 (GPLv2). |
| * ----------------------------------------------------------------------------- |
| */ |
| #ifndef _OZPD_H_ |
| #define _OZPD_H_ |
| |
| #include <linux/interrupt.h> |
| #include "ozeltbuf.h" |
| |
| /* PD state |
| */ |
| #define OZ_PD_S_IDLE 0x1 |
| #define OZ_PD_S_CONNECTED 0x2 |
| #define OZ_PD_S_SLEEP 0x4 |
| #define OZ_PD_S_STOPPED 0x8 |
| |
| /* Timer event types. |
| */ |
| #define OZ_TIMER_TOUT 1 |
| #define OZ_TIMER_HEARTBEAT 2 |
| #define OZ_TIMER_STOP 3 |
| |
| /* |
| *External spinlock variable |
| */ |
| extern spinlock_t g_polling_lock; |
| |
| /* Data structure that hold information on a frame for transmisson. This is |
| * built when the frame is first transmitted and is used to rebuild the frame |
| * if a re-transmission is required. |
| */ |
| struct oz_tx_frame { |
| struct list_head link; |
| struct list_head elt_list; |
| struct oz_hdr hdr; |
| struct sk_buff *skb; |
| int total_size; |
| }; |
| |
| struct oz_isoc_stream { |
| struct list_head link; |
| u8 ep_num; |
| u8 frame_num; |
| u8 nb_units; |
| int size; |
| struct sk_buff *skb; |
| struct oz_hdr *oz_hdr; |
| }; |
| |
| struct oz_farewell { |
| struct list_head link; |
| u8 ep_num; |
| u8 index; |
| u8 len; |
| u8 report[0]; |
| }; |
| |
| /* Data structure that holds information on a specific peripheral device (PD). |
| */ |
| struct oz_pd { |
| struct list_head link; |
| atomic_t ref_count; |
| u8 mac_addr[ETH_ALEN]; |
| unsigned state; |
| unsigned state_flags; |
| unsigned send_flags; |
| u16 total_apps; |
| u16 paused_apps; |
| u8 session_id; |
| u8 param_rsp_status; |
| u8 pd_info; |
| u8 isoc_sent; |
| u32 last_rx_pkt_num; |
| u32 last_tx_pkt_num; |
| struct timespec last_rx_timestamp; |
| u32 trigger_pkt_num; |
| unsigned long pulse_time; |
| unsigned long pulse_period; |
| unsigned long presleep; |
| unsigned long keep_alive; |
| struct oz_elt_buf elt_buff; |
| void *app_ctx[OZ_NB_APPS]; |
| spinlock_t app_lock[OZ_NB_APPS]; |
| int max_tx_size; |
| u8 mode; |
| u8 ms_per_isoc; |
| unsigned isoc_latency; |
| unsigned max_stream_buffering; |
| int nb_queued_frames; |
| int nb_queued_isoc_frames; |
| spinlock_t tx_frame_lock; |
| struct list_head *last_sent_frame; |
| struct list_head tx_queue; |
| struct list_head farewell_list; |
| spinlock_t stream_lock; |
| struct list_head stream_list; |
| struct net_device *net_dev; |
| struct hrtimer heartbeat; |
| struct hrtimer timeout; |
| u8 timeout_type; |
| struct tasklet_struct heartbeat_tasklet; |
| struct tasklet_struct timeout_tasklet; |
| struct work_struct workitem; |
| }; |
| |
| #define OZ_MAX_QUEUED_FRAMES 4 |
| |
| struct oz_pd *oz_pd_alloc(const u8 *mac_addr); |
| void oz_pd_destroy(struct oz_pd *pd); |
| void oz_pd_get(struct oz_pd *pd); |
| void oz_pd_put(struct oz_pd *pd); |
| void oz_pd_set_state(struct oz_pd *pd, unsigned state); |
| void oz_pd_indicate_farewells(struct oz_pd *pd); |
| int oz_pd_sleep(struct oz_pd *pd); |
| void oz_pd_stop(struct oz_pd *pd); |
| void oz_pd_heartbeat(struct oz_pd *pd, u16 apps); |
| int oz_services_start(struct oz_pd *pd, u16 apps, int resume); |
| void oz_services_stop(struct oz_pd *pd, u16 apps, int pause); |
| int oz_prepare_frame(struct oz_pd *pd, int empty); |
| void oz_send_queued_frames(struct oz_pd *pd, int backlog); |
| void oz_retire_tx_frames(struct oz_pd *pd, u8 lpn); |
| int oz_isoc_stream_create(struct oz_pd *pd, u8 ep_num); |
| int oz_isoc_stream_delete(struct oz_pd *pd, u8 ep_num); |
| int oz_send_isoc_unit(struct oz_pd *pd, u8 ep_num, const u8 *data, int len); |
| void oz_handle_app_elt(struct oz_pd *pd, u8 app_id, struct oz_elt *elt); |
| void oz_apps_init(void); |
| void oz_apps_term(void); |
| |
| extern struct kmem_cache *oz_elt_info_cache; |
| extern struct kmem_cache *oz_tx_frame_cache; |
| |
| #endif /* Sentry */ |