X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/c6d6f58c34e1b6a4c03d1e86d1abf48eeb6f5624..f82bd1d22c6e3c27e06ded96e89463888cff2b8e:/lincan/include/can_sysdep.h diff --git a/lincan/include/can_sysdep.h b/lincan/include/can_sysdep.h index 9e6adf5..7117044 100644 --- a/lincan/include/can_sysdep.h +++ b/lincan/include/can_sysdep.h @@ -1,6 +1,14 @@ #ifndef _CAN_SYSDEP_H #define _CAN_SYSDEP_H +#ifdef CAN_WITH_RTL +#include +#include +#include +#include +#include +#endif /*CAN_WITH_RTL*/ + /*#define __NO_VERSION__*/ /*#include */ @@ -13,17 +21,32 @@ #include #include #include + #include #include #include #include +/*optional features*/ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)) +#define CAN_ENABLE_KERN_FASYNC +#ifdef CONFIG_PCI +#define CAN_ENABLE_PCI_SUPPORT +#endif +#ifdef CONFIG_OC_LINCAN_VME +#define CAN_ENABLE_VME_SUPPORT +#endif +#endif + #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)) #include #else #include #endif +#ifdef CAN_ENABLE_PCI_SUPPORT +#include "linux/pci.h" +#endif /*CAN_ENABLE_PCI_SUPPORT*/ /* Next is not sctrictly correct, because of 2.3.0, 2.3.1, 2.3.2 kernels need next definitions too */ @@ -41,6 +64,34 @@ #define DECLARE_MUTEX(name) struct semaphore name=MUTEX #endif /* 2.2.19 */ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)) && !defined(DECLARE_TASKLET) + #define tasklet_struct tq_struct + #define DECLARE_TASKLET(_name, _func, _data) \ + struct tq_struct _name = { sync: 0, routine: _func, data: (void*)_data } + + /* void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsigned long data); */ + #define tasklet_init(_tasklet, _func, _data) \ + do{ \ + /* (_tasklet)->next=NULL; */ \ + /* Above not needed for 2.2.x and buggy for 2.4.x */ \ + (_tasklet)->sync=0; \ + (_tasklet)->routine=_func; \ + (_tasklet)->data=(void*)_data; \ + }while(0) + + /* void tasklet_schedule(struct tasklet_struct *t) */ + #define tasklet_schedule(_tasklet) \ + do{ \ + queue_task(_tasklet,&tq_immediate); \ + mark_bh(IMMEDIATE_BH); \ + }while(0) + + /* void tasklet_kill(struct tasklet_struct *t); */ + #define tasklet_kill(_tasklet) \ + synchronize_irq() + +#endif /* 2.4.0 */ + #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,7)) || (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) @@ -54,13 +105,24 @@ #endif /* Linux kernel < 2.5.7 or >= 2.6.0 */ - +#ifndef CAN_WITH_RTL #if ((LINUX_VERSION_CODE < KERNEL_VERSION(2,5,68)) && !defined(IRQ_RETVAL)) - typedef void irqreturn_t; - #define IRQ_NONE - #define IRQ_HANDLED - #define IRQ_RETVAL(x) + typedef void can_irqreturn_t; + #define CAN_IRQ_NONE + #define CAN_IRQ_HANDLED + #define CAN_IRQ_RETVAL(x) +#else /* <=2.5.67 */ + typedef irqreturn_t can_irqreturn_t; + #define CAN_IRQ_NONE IRQ_NONE + #define CAN_IRQ_HANDLED IRQ_HANDLED + #define CAN_IRQ_RETVAL IRQ_RETVAL #endif /* <=2.5.67 */ +#else /*CAN_WITH_RTL*/ + typedef int can_irqreturn_t; + #define CAN_IRQ_NONE 0 + #define CAN_IRQ_HANDLED 1 + #define CAN_IRQ_RETVAL(x) ((x) != 0) +#endif /*CAN_WITH_RTL*/ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,33)) #define can_synchronize_irq(irqnum) synchronize_irq() @@ -72,4 +134,58 @@ #define del_timer_sync del_timer #endif /* <2.4.0 */ +#ifndef CAN_WITH_RTL +/* Standard LINUX kernel */ + +#define can_spinlock_t spinlock_t +#define can_spin_irqflags_t unsigned long +#define can_spin_lock spin_lock +#define can_spin_unlock spin_unlock +#define can_spin_lock_irqsave spin_lock_irqsave +#define can_spin_unlock_irqrestore spin_unlock_irqrestore +#define can_spin_lock_init spin_lock_init + +#if defined(CONFIG_PREEMPT) || (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) +#define can_preempt_disable preempt_disable +#define can_preempt_enable preempt_enable +#else /*CONFIG_PREEMPT*/ +#define can_preempt_disable() do { } while (0) +#define can_preempt_enable() do { } while (0) +#endif /*CONFIG_PREEMPT*/ + +#define can_enable_irq enable_irq +#define can_disable_irq disable_irq + +#define can_printk printk + +#else /*CAN_WITH_RTL*/ + +#define can_spinlock_t rtl_spinlock_t +#define can_spin_irqflags_t rtl_irqstate_t +#define can_spin_lock rtl_spin_lock +#define can_spin_unlock rtl_spin_unlock +#define can_spin_lock_irqsave rtl_spin_lock_irqsave +#define can_spin_unlock_irqrestore rtl_spin_unlock_irqrestore +#define can_spin_lock_init rtl_spin_lock_init + +#define can_preempt_disable() do { } while (0) +#define can_preempt_enable() do { } while (0) + +#define can_enable_irq rtl_hard_enable_irq +#define can_disable_irq rtl_hard_disable_irq + +#define can_printk rtl_printf + +/* + * terrible hack to test rtl_file private_data concept, ugh !!! + * this would result in crash on architectures, where + * sizeof(int) < sizeof(void *) + */ +#define can_set_rtl_file_private_data(fptr, p) do{ fptr->f_minor=(long)(p); } while(0) +#define can_get_rtl_file_private_data(fptr) ((void*)((fptr)->f_minor)) + +extern can_spinlock_t can_irq_manipulation_lock; + +#endif /*CAN_WITH_RTL*/ + #endif /*_CAN_SYSDEP_H*/