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