X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/cc1811f284f00d214e198cb20b466d261201385b..b34a548a5dfd2f0b068fd835a4cd51680d851068:/lincan/include/can_queue.h diff --git a/lincan/include/can_queue.h b/lincan/include/can_queue.h index 2fc422f..aacfd84 100644 --- a/lincan/include/can_queue.h +++ b/lincan/include/can_queue.h @@ -39,6 +39,7 @@ * @flist: pointer to list of the free slots associated with queue * @entry: pointer to the memory allocated for the list slots. * @fifo_lock: the lock to ensure atomicity of slot manipulation operations. + * @slotnr: number of allocated slots * * This structure represents CAN FIFO queue. It is implemented as * a single linked list of slots prepared for processing. The empty slots @@ -52,6 +53,7 @@ struct canque_fifo_t { struct canque_slot_t *flist; /* points the first entry in the free list */ struct canque_slot_t *entry; /* points to first allocated entry */ can_spinlock_t fifo_lock; /* can_spin_lock_irqsave / can_spin_unlock_irqrestore */ + int slotsnr; }; #define CAN_FIFOF_DESTROY_b 15 @@ -65,6 +67,8 @@ struct canque_fifo_t { #define CAN_FIFOF_INACTIVE_b 7 #define CAN_FIFOF_FREEONEMPTY_b 6 #define CAN_FIFOF_READY_b 5 +#define CAN_FIFOF_NOTIFYPEND_b 4 +#define CAN_FIFOF_RTL_MEM_b 3 #define CAN_FIFOF_DESTROY (1<fifo_flags) @@ -137,7 +143,7 @@ int canque_fifo_put_inslot(struct canque_fifo_t *fifo, struct canque_slot_t *slo can_spin_irqflags_t flags; slot->next=NULL; can_spin_lock_irqsave(&fifo->fifo_lock, flags); - if(*fifo->tail) printk(KERN_CRIT "canque_fifo_put_inslot: fifo->tail != NULL\n"); + if(*fifo->tail) can_printk(KERN_CRIT "canque_fifo_put_inslot: fifo->tail != NULL\n"); *fifo->tail=slot; fifo->tail=&slot->next; ret=0; @@ -253,9 +259,7 @@ int canque_fifo_again_outslot(struct canque_fifo_t *fifo, struct canque_slot_t * int canque_fifo_flush_slots(struct canque_fifo_t *fifo); -int canque_fifo_init_slots(struct canque_fifo_t *fifo, int slotsnr); - -int canque_fifo_done(struct canque_fifo_t *fifo); +int canque_fifo_init_slots(struct canque_fifo_t *fifo); #define CANQUEUE_PRIO_NR 3 @@ -281,6 +285,9 @@ struct chip_t; * @edge_used: the atomic usage counter, mainly used for safe destruction of the edge. * @edge_prio: the assigned queue priority from the range 0 to %CANQUEUE_PRIO_NR-1 * @edge_num: edge sequential number intended for debugging purposes only + * @pending_peers: edges with pending delayed events (RTL->Linux calls) + * @pending_inops: bitmask of pending operations + * @pending_outops: bitmask of pending operations * * This structure represents one direction connection from messages source * (@inends) to message consumer (@outends) fifo ends hub. The edge contains @@ -298,6 +305,11 @@ struct canque_edge_t { atomic_t edge_used; int edge_prio; int edge_num; + #ifdef CAN_WITH_RTL + struct list_head pending_peers; + unsigned long pending_inops; + unsigned long pending_outops; + #endif /*CAN_WITH_RTL*/ }; /** @@ -322,6 +334,7 @@ struct canque_edge_t { * @context: space to store ends user specific information * @endinfo: space to store some other ends usage specific informations * mainly for waking-up by the notify calls. + * @dead_peers: used to chain ends wanting for postponed destruction * * Structure represents place to connect edges to for CAN communication entity. * The zero, one or more incoming and outgoing edges can be connected to @@ -345,10 +358,23 @@ struct canque_ends_t { struct fasync_struct *fasync; #endif /*CAN_ENABLE_KERN_FASYNC*/ } fileinfo; + #ifdef CAN_WITH_RTL + struct { + rtl_spinlock_t rtl_lock; + rtl_wait_t rtl_readq; + rtl_wait_t rtl_writeq; + rtl_wait_t rtl_emptyq; + unsigned long pend_flags; + } rtlinfo; + #endif /*CAN_WITH_RTL*/ struct { - wait_queue_head_t daemonq; struct msgobj_t *msgobj; struct chip_t *chip; + #ifndef CAN_WITH_RTL + wait_queue_head_t daemonq; + #else /*CAN_WITH_RTL*/ + pthread_t worker_thread; + #endif /*CAN_WITH_RTL*/ } chipinfo; } endinfo; struct list_head dead_peers; @@ -367,7 +393,8 @@ struct canque_ends_t { #define CANQUEUE_NOTIFY_ERRTX_SEND 0x11002 /* tx send error */ #define CANQUEUE_NOTIFY_ERRTX_BUS 0x11003 /* tx bus error */ -#define CAN_ENDSF_DEAD (1<<0) +#define CAN_ENDSF_DEAD (1<<0) +#define CAN_ENDSF_MEM_RTL (1<<1) /** * canque_notify_inends - request to send notification to the input ends @@ -636,6 +663,10 @@ struct canque_edge_t *canque_next_outedge(struct canque_ends_t *qends, struct ca /* Linux kernel specific functions */ +int canque_fifo_init_kern(struct canque_fifo_t *fifo, int slotsnr); + +int canque_fifo_done_kern(struct canque_fifo_t *fifo); + struct canque_edge_t *canque_new_edge_kern(int slotsnr); int canque_get_inslot4id_wait_kern(struct canque_ends_t *qends, @@ -651,7 +682,33 @@ int canqueue_ends_init_kern(struct canque_ends_t *qends); int canqueue_ends_dispose_kern(struct canque_ends_t *qends, int sync); +void canqueue_ends_dispose_postpone(struct canque_ends_t *qends); + void canqueue_kern_initialize(void); +#ifdef CAN_WITH_RTL +/* RT-Linux specific functions */ + +void canqueue_rtl_initialize(void); +void canqueue_rtl_done(void); + +int canqueue_rtl2lin_check_and_pend(struct canque_ends_t *qends, + struct canque_edge_t *qedge, int what); + +struct canque_edge_t *canque_new_edge_rtl(int slotsnr); + +void canque_dispose_edge_rtl(struct canque_edge_t *qedge); + +void canque_ends_free_rtl(struct canque_ends_t *qends); + +int canqueue_ends_dispose_rtl(struct canque_ends_t *qends, int sync); + +#else /*CAN_WITH_RTL*/ + +static inline int canqueue_rtl2lin_check_and_pend(struct canque_ends_t *qends, + struct canque_edge_t *qedge, int what) { return 0; } + +#endif /*CAN_WITH_RTL*/ + #endif /*_CAN_QUEUE_H*/