1 /* ----------------------------------------------------------------------------- 2 * Copyright (c) 2011 Ozmo Inc 3 * Released under the GNU General Public License Version 2 (GPLv2). 4 * ----------------------------------------------------------------------------- 5 */ 6 #ifndef _OZPD_H_ 7 #define _OZPD_H_ 8 9 #include <linux/interrupt.h> 10 #include "ozeltbuf.h" 11 12 /* PD state 13 */ 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 18 19 /* Timer event types. 20 */ 21 #define OZ_TIMER_TOUT 1 22 #define OZ_TIMER_HEARTBEAT 2 23 #define OZ_TIMER_STOP 3 24 25 /* 26 *External spinlock variable 27 */ 28 extern spinlock_t g_polling_lock; 29 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. 33 */ 34 struct oz_tx_frame { 35 struct list_head link; 36 struct list_head elt_list; 37 struct oz_hdr hdr; 38 struct sk_buff *skb; 39 int total_size; 40 }; 41 42 struct oz_isoc_stream { 43 struct list_head link; 44 u8 ep_num; 45 u8 frame_num; 46 u8 nb_units; 47 int size; 48 struct sk_buff *skb; 49 struct oz_hdr *oz_hdr; 50 }; 51 52 struct oz_farewell { 53 struct list_head link; 54 u8 ep_num; 55 u8 index; 56 u8 len; 57 u8 report[0]; 58 }; 59 60 /* Data structure that holds information on a specific peripheral device (PD). 61 */ 62 struct oz_pd { 63 struct list_head link; 64 atomic_t ref_count; 65 u8 mac_addr[ETH_ALEN]; 66 unsigned state; 67 unsigned state_flags; 68 unsigned send_flags; 69 u16 total_apps; 70 u16 paused_apps; 71 u8 session_id; 72 u8 param_rsp_status; 73 u8 pd_info; 74 u8 isoc_sent; 75 u32 last_rx_pkt_num; 76 u32 last_tx_pkt_num; 77 struct timespec last_rx_timestamp; 78 u32 trigger_pkt_num; 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]; 86 int max_tx_size; 87 u8 mode; 88 u8 ms_per_isoc; 89 unsigned isoc_latency; 90 unsigned max_stream_buffering; 91 int nb_queued_frames; 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; 102 u8 timeout_type; 103 struct tasklet_struct heartbeat_tasklet; 104 struct tasklet_struct timeout_tasklet; 105 struct work_struct workitem; 106 }; 107 108 #define OZ_MAX_QUEUED_FRAMES 4 109 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); 130 131 extern struct kmem_cache *oz_elt_info_cache; 132 extern struct kmem_cache *oz_tx_frame_cache; 133 134 #endif /* Sentry */ 135