sysdep.h
上传用户:wudi5211
上传日期:2010-01-21
资源大小:607k
文件大小:21k
源码类别:

嵌入式Linux

开发平台:

C/C++

  1. /*
  2.  * sysdep.h -- centralizing compatibility issues between 2.0, 2.2, 2.4
  3.  *
  4.  * Copyright (C) 2001 Alessandro Rubini and Jonathan Corbet
  5.  * Copyright (C) 2001 O'Reilly & Associates
  6.  *
  7.  * The source code in this file can be freely used, adapted,
  8.  * and redistributed in source or binary form, so long as an
  9.  * acknowledgment appears in derived source files.  The citation
  10.  * should list that the code comes from the book "Linux Device
  11.  * Drivers" by Alessandro Rubini and Jonathan Corbet, published
  12.  * by O'Reilly & Associates.   No warranty is attached;
  13.  * we cannot take responsibility for errors or fitness for use.
  14.  *
  15.  * $Id: sysdep.h,v 1.62 2001/07/18 22:28:16 rubini Exp $
  16.  */
  17. #ifndef _SYSDEP_H_
  18. #define _SYSDEP_H_
  19. #ifndef LINUX_VERSION_CODE
  20. #  include <linux/version.h>
  21. #endif
  22. #ifndef KERNEL_VERSION /* pre-2.1.90 didn't have it */
  23. #  define KERNEL_VERSION(vers,rel,seq) ( ((vers)<<16) | ((rel)<<8) | (seq) )
  24. #endif
  25. /* only allow 2.0.x  2.2.y and 2.4.z */
  26. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,0,0) /* not < 2.0 */
  27. #  error "This kernel is too old: not supported by this file"
  28. #endif
  29. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) /* not > 2.4, by now */
  30. #  error "This kernel is too recent: not supported by this file"
  31. #endif
  32. #if (LINUX_VERSION_CODE & 0xff00) == 1 /* not 2.1 */
  33. #  error "Please don't use linux-2.1, use 2.2 or 2.4 instead"
  34. #endif
  35. #if (LINUX_VERSION_CODE & 0xff00) == 3 /* not 2.3 */
  36. #  error "Please don't use linux-2.3, use 2.4 instead"
  37. #endif
  38. /* remember about the current version */
  39. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0)
  40. #  define LINUX_20
  41. #elif LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
  42. #  define LINUX_22
  43. #else
  44. #  define LINUX_24
  45. #endif
  46. /* we can't support versioning in pre-2.4 because we #define some functions */
  47. #if !defined(LINUX_24) && defined(CONFIG_MODVERSIONS)
  48. #  error "This sysdep.h can't support CONFIG_MODVERSIONS"
  49. #  error "and old kernels at the same time."
  50. #  error "Either use 2.4 or avoid using versioning"
  51. #endif
  52. #ifndef LINUX_20 /* include vmalloc.h if this is 2.2/2.4 */
  53. #  ifdef VM_READ /* a typical flag defined by mm.h */
  54. #    include <linux/vmalloc.h>
  55. #  endif
  56. #endif
  57. #include <linux/sched.h>
  58. /* Modularization issues */
  59. #ifdef LINUX_20
  60. #  define __USE_OLD_SYMTAB__
  61. #  define EXPORT_NO_SYMBOLS register_symtab(NULL);
  62. #  define REGISTER_SYMTAB(tab) register_symtab(tab)
  63. #else
  64. #  define REGISTER_SYMTAB(tab) /* nothing */
  65. #endif
  66. #ifdef __USE_OLD_SYMTAB__
  67. #  define __MODULE_STRING(s)         /* nothing */
  68. #  define MODULE_PARM(v,t)           /* nothing */
  69. #  define MODULE_PARM_DESC(v,t)      /* nothing */
  70. #  define MODULE_AUTHOR(n)           /* nothing */
  71. #  define MODULE_DESCRIPTION(d)      /* nothing */
  72. #  define MODULE_SUPPORTED_DEVICE(n) /* nothing */
  73. #endif
  74. /*
  75.  * In version 2.2 (up to 2.2.19, at least), the macro for request_module()
  76.  * when no kmod is there is wrong. It's a "do {} while 0" but it shouldbe int
  77.  */
  78. #ifdef LINUX_22
  79. #  ifndef CONFIG_KMOD
  80. #    undef request_module
  81. #    define request_module(name) -ENOSYS
  82. #  endif
  83. #endif
  84. #ifndef LINUX_20
  85. #  include <linux/init.h>     /* module_init/module_exit */
  86. #endif
  87. #ifndef module_init
  88. #  define module_init(x)        int init_module(void) { return x(); }
  89. #  define module_exit(x)        void cleanup_module(void) { x(); }
  90. #endif
  91. #ifndef SET_MODULE_OWNER
  92. #  define SET_MODULE_OWNER(structure) /* nothing */
  93. #endif
  94. /*
  95.  * "select" changed in 2.1.23. The implementation is twin, but this
  96.  * header is new
  97.  *
  98.  */
  99. #ifdef LINUX_20
  100. #  define __USE_OLD_SELECT__
  101. #else
  102. #  include <linux/poll.h>
  103. #endif
  104. #ifdef LINUX_20
  105. #  define INODE_FROM_F(filp) ((filp)->f_inode)
  106. #else
  107. #  define INODE_FROM_F(filp) ((filp)->f_dentry->d_inode)
  108. #endif
  109. /* Other changes in the fops are solved using wrappers */
  110. /*
  111.  * Wait queues changed with 2.3
  112.  */
  113. #ifndef DECLARE_WAIT_QUEUE_HEAD
  114. #  define DECLARE_WAIT_QUEUE_HEAD(head) struct wait_queue *head = NULL
  115.    typedef  struct wait_queue *wait_queue_head_t;
  116. #  define init_waitqueue_head(head) (*(head)) = NULL
  117. /* offer wake_up_sync as an alias for wake_up */
  118. #  define wake_up_sync(head) wake_up(head)
  119. #  define wake_up_interruptible_sync(head) wake_up_interruptible(head)
  120. /* Pretend we have add_wait_queue_exclusive */
  121. #  define add_wait_queue_exclusive(q,entry) add_wait_queue ((q), (entry))
  122. #endif /* no DECLARE_WAIT_QUEUE_HEAD */
  123. /*
  124.  * Define wait_event for 2.0 kernels.  (This ripped off directly from
  125.  * the 2.2.18 sched.h)
  126.  */
  127. #ifdef LINUX_20
  128. #define __wait_event(wq, condition) 
  129. do {
  130. struct wait_queue __wait;
  131. __wait.task = current;
  132. add_wait_queue(&wq, &__wait);
  133. for (;;) {
  134. current->state = TASK_UNINTERRUPTIBLE;
  135. mb();
  136. if (condition)
  137. break;
  138. schedule();
  139. }
  140. current->state = TASK_RUNNING;
  141. remove_wait_queue(&wq, &__wait);
  142. } while (0)
  143. #define wait_event(wq, condition) 
  144. do {
  145. if (condition)  
  146. break;
  147. __wait_event(wq, condition);
  148. } while (0)
  149. #define __wait_event_interruptible(wq, condition, ret)
  150. do {
  151. struct wait_queue __wait;
  152. __wait.task = current;
  153. add_wait_queue(&wq, &__wait);
  154. for (;;) {
  155. current->state = TASK_INTERRUPTIBLE;
  156. mb();
  157. if (condition)
  158. break;
  159. if (!signal_pending(current)) {
  160. schedule();
  161. continue;
  162. }
  163. ret = -ERESTARTSYS;
  164. break;
  165. }
  166. current->state = TASK_RUNNING;
  167. remove_wait_queue(&wq, &__wait);
  168. } while (0)
  169. #define wait_event_interruptible(wq, condition)
  170. ({
  171. int __ret = 0;
  172. if (!(condition))
  173. __wait_event_interruptible(wq, condition, __ret);
  174. __ret;
  175. })
  176. #endif
  177. /*
  178.  * 2.3 added tasklets
  179.  */
  180. #ifdef LINUX_24
  181. #  define HAVE_TASKLETS
  182. #endif
  183. /* FIXME: implement the other versions of wake_up etc */
  184. /*
  185.  * access to user space: use the 2.2 functions,
  186.  * and implement them as macros for 2.0
  187.  */
  188. #ifdef LINUX_20
  189. #  include <asm/segment.h>
  190. #  define access_ok(t,a,sz)           (verify_area((t),(void *) (a),(sz)) ? 0 : 1)
  191. #  define verify_area_20              verify_area
  192. #  define   copy_to_user(t,f,n)         (memcpy_tofs((t), (f), (n)), 0)
  193. #  define copy_from_user(t,f,n)       (memcpy_fromfs((t), (f), (n)), 0)
  194. #  define   __copy_to_user(t,f,n)       copy_to_user((t), (f), (n))
  195. #  define __copy_from_user(t,f,n)     copy_from_user((t), (f), (n))
  196. #  define PUT_USER(val,add)           (put_user((val),(add)), 0)
  197. #  define __PUT_USER(val,add)         PUT_USER((val),(add))
  198. #  define GET_USER(dest,add)          ((dest)=get_user((add)), 0)
  199. #  define __GET_USER(dest,add)        GET_USER((dest),(add))
  200. #else
  201. #  include <asm/uaccess.h>
  202. #  include <asm/io.h>
  203. #  define verify_area_20(t,a,sz) (0) /* == success */
  204. #  define   PUT_USER   put_user
  205. #  define __PUT_USER __put_user
  206. #  define   GET_USER   get_user
  207. #  define __GET_USER __get_user
  208. #endif
  209. /*
  210.  * Allocation issues
  211.  */
  212. #ifdef GFP_USER /* only if mm.h has been included */
  213. #  ifdef LINUX_20
  214. #    define __GFP_DMA GFP_DMA /* 2.0 didn't have the leading __ */
  215. #  endif
  216. #  ifndef LINUX_24
  217. #    define __GFP_HIGHMEM  0  /* was not there */
  218. #    define GFP_HIGHUSER   0   /* idem */
  219. #  endif
  220. #  ifdef LINUX_20
  221. #    define __get_free_pages(a,b) __get_free_pages((a),(b),0)
  222. #  endif
  223. #  ifndef LINUX_24
  224. #    define get_zeroed_page get_free_page
  225. #  endif
  226. #endif
  227. /* ioremap */
  228. #if defined(LINUX_20) && defined(_LINUX_MM_H)
  229. #  define ioremap_nocache ioremap
  230. #  ifndef __i386__
  231.    /* This simple approach works for non-PC platforms. */
  232. #    define ioremap vremap
  233. #    define iounmap vfree
  234. #  else /* the PC has <expletive> ISA; 2.2 and 2.4 remap it, 2.0 needs not */
  235. extern inline void *ioremap(unsigned long phys_addr, unsigned long size)
  236. {
  237.     if (phys_addr >= 0xA0000 && phys_addr + size <= 0x100000)
  238.         return (void *)phys_addr;
  239.     return vremap(phys_addr, size);
  240. }
  241. extern inline void iounmap(void *addr)
  242. {
  243.     if ((unsigned long)addr >= 0xA0000
  244.             && (unsigned long)addr < 0x100000)
  245.         return;
  246.     vfree(addr);
  247. }
  248. #  endif
  249. #endif
  250. /* Also, define check_mem_region etc */
  251. #ifndef LINUX_24
  252. #  define check_mem_region(a,b)     0 /* success */
  253. #  define request_mem_region(a,b,c) /* nothing */
  254. #  define release_mem_region(a,b)   /* nothing */
  255. #endif
  256. /* implement capable() for 2.0 */
  257. #ifdef LINUX_20
  258. #  define capable(anything)  suser()
  259. #endif
  260. /* The use_count of exec_domain and binfmt changed in 2.1.23 */
  261. #ifdef LINUX_20
  262. #  define INCRCOUNT(p)  ((p)->module ? __MOD_INC_USE_COUNT((p)->module) : 0)
  263. #  define DECRCOUNT(p)  ((p)->module ? __MOD_DEC_USE_COUNT((p)->module) : 0)
  264. #  define CURRCOUNT(p)  ((p)->module && (p)->module->usecount)
  265. #else
  266. #  define INCRCOUNT(p)  ((p)->use_count++)
  267. #  define DECRCOUNT(p)  ((p)->use_count--)
  268. #  define CURRCOUNT(p)  ((p)->use_count)
  269. #endif
  270. /*
  271.  * /proc has changed a lot across the versions...
  272.  */
  273. #ifdef LINUX_20
  274. #  define USE_PROC_REGISTER
  275. #endif
  276. /*
  277.  * 2.2 didn't have create_proc_{read|info}_entry yet.
  278.  * And it looks like there are no other "interesting" entry point, as
  279.  * the rest is somehow esotique (mknod, symlink, ...)
  280.  */
  281. #ifdef LINUX_22
  282. #  ifdef PROC_SUPER_MAGIC  /* Only if procfs is being used */
  283. extern inline struct proc_dir_entry *create_proc_read_entry(const char *name,
  284.                           mode_t mode, struct proc_dir_entry *base, 
  285.                           read_proc_t *read_proc, void * data)
  286. {
  287.     struct proc_dir_entry *res=create_proc_entry(name,mode,base);
  288.     if (res) {
  289.         res->read_proc=read_proc;
  290.         res->data=data;
  291.     }
  292.     return res;
  293. }
  294. #    ifndef create_proc_info_entry /* added in 2.2.18 */
  295. typedef int (get_info_t)(char *, char **, off_t, int, int);
  296. extern inline struct proc_dir_entry *create_proc_info_entry(const char *name,
  297.         mode_t mode, struct proc_dir_entry *base, get_info_t *get_info)
  298. {
  299.         struct proc_dir_entry *res=create_proc_entry(name,mode,base);
  300.         if (res) res->get_info=get_info;
  301.         return res;
  302. }
  303. #    endif  /* no create_proc_info_entry */
  304. #  endif
  305. #endif
  306. #ifdef LINUX_20
  307. #  define test_and_set_bit(nr,addr)  test_bit((nr),(addr))
  308. #  define test_and_clear_bit(nr,addr) clear_bit((nr),(addr))
  309. #  define test_and_change_bit(nr,addr) change_bit((nr),(addr))
  310. #endif
  311. /* 2.0 had no read and write memory barriers, and 2.2 lacks the
  312.    set_ functions */
  313. #ifndef LINUX_24
  314. #  ifdef LINUX_20
  315. #    define wmb() mb() /* this is a big penalty on non-reordering platfs */
  316. #    define rmb() mb() /* this is a big penalty on non-reordering platfs */
  317. #  endif /* LINUX_20 */
  318. #define set_mb() do { var = value; mb(); } while (0)
  319. #define set_wmb() do { var = value; wmb(); } while (0)
  320. #endif /* ! LINUX_24 */
  321. /* 2.1.30 removed these functions. Let's define them, just in case */
  322. #ifndef LINUX_20
  323. #  define queue_task_irq      queue_task
  324. #  define queue_task_irq_off  queue_task
  325. #endif
  326. /* 2.1.10 and 2.1.43 introduced new functions. They are worth using */
  327. #ifdef LINUX_20
  328. #  include <asm/byteorder.h>
  329. #  ifdef __LITTLE_ENDIAN
  330. #    define cpu_to_le16(x) (x)
  331. #    define cpu_to_le32(x) (x)
  332. #    define cpu_to_be16(x) htons((x))
  333. #    define cpu_to_be32(x) htonl((x))
  334. #  else
  335. #    define cpu_to_be16(x) (x)
  336. #    define cpu_to_be32(x) (x)
  337.      extern inline __u16 cpu_to_le16(__u16 x) { return (x<<8) | (x>>8);}
  338.      extern inline __u32 cpu_to_le32(__u32 x) { return (x>>24) |
  339.              ((x>>8)&0xff00) | ((x<<8)&0xff0000) | (x<<24);}
  340. #  endif
  341. #  define le16_to_cpu(x)  cpu_to_le16(x)
  342. #  define le32_to_cpu(x)  cpu_to_le32(x)
  343. #  define be16_to_cpu(x)  cpu_to_be16(x)
  344. #  define be32_to_cpu(x)  cpu_to_be32(x)
  345. #  define cpu_to_le16p(addr) (cpu_to_le16(*(addr)))
  346. #  define cpu_to_le32p(addr) (cpu_to_le32(*(addr)))
  347. #  define cpu_to_be16p(addr) (cpu_to_be16(*(addr)))
  348. #  define cpu_to_be32p(addr) (cpu_to_be32(*(addr)))
  349.    extern inline void cpu_to_le16s(__u16 *a) {*a = cpu_to_le16(*a);}
  350.    extern inline void cpu_to_le32s(__u16 *a) {*a = cpu_to_le32(*a);}
  351.    extern inline void cpu_to_be16s(__u16 *a) {*a = cpu_to_be16(*a);}
  352.    extern inline void cpu_to_be32s(__u16 *a) {*a = cpu_to_be32(*a);}
  353. #  define le16_to_cpup(x) cpu_to_le16p(x)
  354. #  define le32_to_cpup(x) cpu_to_le32p(x)
  355. #  define be16_to_cpup(x) cpu_to_be16p(x)
  356. #  define be32_to_cpup(x) cpu_to_be32p(x)
  357. #  define le16_to_cpus(x) cpu_to_le16s(x)
  358. #  define le32_to_cpus(x) cpu_to_le32s(x)
  359. #  define be16_to_cpus(x) cpu_to_be16s(x)
  360. #  define be32_to_cpus(x) cpu_to_be32s(x)
  361. #endif
  362. #ifdef LINUX_20
  363. #  define __USE_OLD_REBUILD_HEADER__
  364. #endif
  365. /*
  366.  * 2.0 didn't include sema_init, so we make our own - but only if it
  367.  * looks like semaphore.h got included.
  368.  */
  369. #ifdef LINUX_20
  370. #  ifdef MUTEX_LOCKED   /* Only if semaphore.h included */
  371.      extern inline void sema_init (struct semaphore *sem, int val)
  372.      {
  373.          sem->count = val;
  374.          sem->waking = sem->lock = 0;
  375.          sem->wait = NULL;
  376.      }
  377. #  endif
  378. #endif /* LINUX_20 */
  379. /*
  380.  * In 2.0, there is no real need for spinlocks, and they weren't really
  381.  * implemented anyway.
  382.  *
  383.  * XXX the _irqsave variant should be defined eventually to do the
  384.  * right thing.
  385.  */
  386. #ifdef LINUX_20
  387. typedef int spinlock_t;
  388. #  define spin_lock(lock)
  389. #  define spin_unlock(lock)
  390. #  define spin_lock_init(lock)
  391. #  define spin_lock_irqsave(lock,flags) do { 
  392.         save_flags(flags); cli(); } while (0);
  393. #  define spin_unlock_irqrestore(lock,flags) restore_flags(flags);
  394. #endif
  395. /*
  396.  * 2.1 stuffed the "flush" method into the middle of the file_operations
  397.  * structure.  The FOP_NO_FLUSH symbol is for drivers that do not implement
  398.  * flush (most of them), it can be inserted in initializers for all 2.x
  399.  * kernel versions.
  400.  */
  401. #ifdef LINUX_20
  402. #  define FOP_NO_FLUSH   /* nothing */
  403. #  define TAG_LLSEEK    lseek
  404. #  define TAG_POLL      select
  405. #else
  406. #  define FOP_NO_FLUSH  NULL,
  407. #  define TAG_LLSEEK    llseek
  408. #  define TAG_POLL      poll
  409. #endif
  410. /*
  411.  * fasync changed in 2.2.
  412.  */
  413. #ifdef LINUX_20
  414. /*  typedef struct inode *fasync_file; */
  415. #  define fasync_file struct inode *
  416. #else
  417.   typedef int fasync_file;
  418. #endif
  419. /* kill_fasync had less arguments, and a different indirection in the first */
  420. #ifndef LINUX_24
  421. #  define kill_fasync(ptrptr,sig,band)  kill_fasync(*(ptrptr),(sig))
  422. #endif
  423. /* other things that are virtualized: define the new functions for the old k */
  424. #ifdef LINUX_20
  425. #  define in_interrupt() (intr_count!=0)
  426. #  define mdelay(x) udelay((x)*1000)
  427. #  define signal_pending(current)  ((current)->signal & ~(current)->blocked)
  428. #endif
  429. #ifdef LINUX_PCI_H /* only if PCI stuff is being used */
  430. #  ifdef LINUX_20
  431. #    include "pci-compat.h" /* a whole set of replacement functions */
  432. #  else
  433. #    define  pci_release_device(d) /* placeholder, used in 2.0 to free stuff */
  434. #  endif
  435. #endif
  436. /*
  437.  * Some task state stuff
  438.  */
  439. #ifndef set_current_state
  440. #  define set_current_state(s) current->state = (s);
  441. #endif
  442. #ifdef LINUX_20
  443. extern inline void schedule_timeout(int timeout)
  444. {
  445.     current->timeout = jiffies + timeout;
  446.     current->state = TASK_INTERRUPTIBLE;
  447.     schedule();
  448.     current->timeout = 0;
  449. }
  450. extern inline long sleep_on_timeout(wait_queue_head_t *q, signed long timeout)
  451. {
  452.     signed long early = 0;
  453.         
  454.     current->timeout = jiffies + timeout;
  455.     sleep_on (q);
  456.     if (current->timeout > 0) {
  457.         early = current->timeout - jiffies;
  458.         current->timeout = 0;
  459.     }
  460.     return early;
  461. }
  462. extern inline long interruptible_sleep_on_timeout(wait_queue_head_t *q,
  463.                 signed long timeout)
  464. {
  465.     signed long early = 0;
  466.         
  467.     current->timeout = jiffies + timeout;
  468.     interruptible_sleep_on (q);
  469.     if (current->timeout > 0) {
  470.         early = current->timeout - jiffies;
  471.         current->timeout = 0;
  472.     }
  473.     return early;
  474. }
  475. #endif /* LINUX_20 */
  476. /*
  477.  * Schedule_task was a late 2.4 addition.
  478.  */
  479. #ifndef LINUX_24
  480. extern inline int schedule_task(struct tq_struct *task)
  481. {
  482.         queue_task(task, &tq_scheduler);
  483.         return 1;
  484. }
  485. #endif
  486. /*
  487.  * Timing issues
  488.  */
  489. #ifdef LINUX_20
  490. #  define get_fast_time do_gettimeofday
  491. #endif
  492. #ifdef _LINUX_DELAY_H /* only if linux/delay.h is included */
  493. #  ifndef mdelay /* linux-2.0 */
  494. #    ifndef MAX_UDELAY_MS
  495. #      define MAX_UDELAY_MS   5
  496. #    endif
  497. #    define mdelay(n) (
  498.         (__builtin_constant_p(n) && (n)<=MAX_UDELAY_MS) ? udelay((n)*1000) : 
  499.         ({unsigned long msec=(n); while (msec--) udelay(1000);}))
  500. #  endif /* mdelay */
  501. #endif /* _LINUX_DELAY_H */
  502. /*
  503.  * No del_timer_sync before 2.4
  504.  */
  505. #ifndef LINUX_24
  506. #  define del_timer_sync(timer) del_timer(timer)  /* and hope */
  507. #endif
  508. /*
  509.  * mod_timer wasn't present in 2.0
  510.  */
  511. #ifdef LINUX_20
  512. static inline int mod_timer(struct timer_list *timer, unsigned long expires)
  513. {
  514.     int pending = del_timer(timer);
  515.     if (pending) {
  516.         timer->expires = expires;
  517.         add_timer(timer);
  518.     }
  519.     return pending;
  520. }
  521. #endif
  522. /*
  523.  * Various changes in mmap and friends.
  524.  */
  525. #ifndef NOPAGE_SIGBUS
  526. #  define NOPAGE_SIGBUS  NULL  /* return value of the nopage memory method */
  527. #  define NOPAGE_OOM     NULL  /* No real equivalent in older kernels */
  528. #endif
  529. #ifndef VM_RESERVED            /* Added 2.4.0-test10 */
  530. #  define VM_RESERVED 0
  531. #endif
  532. #ifdef LINUX_24 /* use "vm_pgoff" to get an offset */
  533. #define VMA_OFFSET(vma)  ((vma)->vm_pgoff << PAGE_SHIFT)
  534. #else /* use "vm_offset" */
  535. #define VMA_OFFSET(vma)  ((vma)->vm_offset)
  536. #endif
  537. #ifdef MAP_NR
  538. #define virt_to_page(page) (mem_map + MAP_NR(page))
  539. #endif
  540. #ifndef get_page
  541. #  define get_page(p) atomic_inc(&(p)->count)
  542. #endif
  543. /*
  544.  * No DMA lock in 2.0.
  545.  */
  546. #ifdef LINUX_20
  547. static inline unsigned long claim_dma_lock(void)
  548. {
  549.     unsigned long flags;
  550.     save_flags(flags);
  551.     cli();
  552.     return flags;
  553. }
  554. static inline void release_dma_lock(unsigned long flags)
  555. {
  556.     restore_flags(flags);
  557. }
  558. #endif
  559. /*
  560.  * I/O memory was not managed by ealier kernels, define them as success
  561.  */
  562. #if 0 /* FIXME: what is the right way to do request_mem_region? */
  563. #ifndef LINUX_24
  564. #  define check_mem_region(start, len)          0
  565. #  define request_mem_region(start, len, name)  0
  566. #  define release_mem_region(start, len)        0
  567.    /*
  568.     * Also, request_ and release_ region used to return void. Return 0 instead
  569.     */
  570. #  define request_region(s, l, n)  ({request_region((s),(l),(n));0;})
  571. #  define release_region(s, l)     ({release_region((s),(l));0;})
  572. #endif /* not LINUX_24 */
  573. #endif
  574. /*
  575.  * Block layer stuff.
  576.  */
  577. #ifndef LINUX_24
  578. /* BLK_DEFAULT_QUEUE for use with these macros only!!!! */
  579. #define BLK_DEFAULT_QUEUE(major) blk_dev[(major)].request_fn
  580. #define blk_init_queue(where,request_fn) where = request_fn;
  581. #define blk_cleanup_queue(where) where = NULL;
  582. /* No QUEUE_EMPTY in older kernels */
  583. #ifndef QUEUE_EMPTY  /* Driver can redefine it too */
  584. #  define QUEUE_EMPTY (CURRENT != NULL)
  585. #endif
  586. #ifdef RO_IOCTLS
  587. static inline int blk_ioctl(kdev_t dev, unsigned int cmd, unsigned long arg)
  588. {
  589.     int err;
  590.     switch (cmd) {
  591.       case BLKRAGET: /* return the readahead value */
  592.         if (!arg)  return -EINVAL;
  593.         err = ! access_ok(VERIFY_WRITE, arg, sizeof(long));
  594.         if (err) return -EFAULT;
  595.         PUT_USER(read_ahead[MAJOR(dev)],(long *) arg);
  596.         return 0;
  597.       case BLKRASET: /* set the readahead value */
  598.         if (!capable(CAP_SYS_ADMIN)) return -EACCES;
  599.         if (arg > 0xff) return -EINVAL; /* limit it */
  600.         read_ahead[MAJOR(dev)] = arg;
  601.         return 0;
  602.       case BLKFLSBUF: /* flush */
  603.         if (! capable(CAP_SYS_ADMIN)) return -EACCES; /* only root */
  604.         fsync_dev(dev);
  605.         invalidate_buffers(dev);
  606.         return 0;
  607.         RO_IOCTLS(dev, arg);
  608.     }
  609.     return -ENOTTY;
  610. }
  611. #endif  /* RO_IOCTLS */
  612. #ifdef LINUX_EXTENDED_PARTITION /* defined in genhd.h */
  613. static inline void register_disk(struct gendisk *gdev, kdev_t dev,
  614.                 unsigned minors, struct file_operations *ops, long size)
  615. {
  616.     if (! gdev)
  617.         return;
  618.     resetup_one_dev(gdev, MINOR(dev) >> gdev->minor_shift);
  619. }
  620. #endif /* LINUX_EXTENDED_PARTITION */
  621. #else  /* it is Linux 2.4 */
  622. #define HAVE_BLKPG_H
  623. #endif /* LINUX_24 */
  624. #ifdef LINUX_20 /* physical and virtual addresses had the same value */
  625. #  define __pa(a) (a)
  626. #  define __va(a) (a)
  627. #endif
  628. /*
  629.  * Network driver compatibility
  630.  */
  631. /*
  632.  * 2.0 dev_kfree_skb had an extra arg.  The following is a little dangerous
  633.  * in that it assumes that FREE_WRITE is always wanted.  Very few 2.0 drivers
  634.  * use FREE_READ, but the number is *not* zero...
  635.  *
  636.  * Also: implement the non-checking versions of a couple skb functions -
  637.  * but they still check in 2.0.
  638.  */
  639. #ifdef LINUX_20
  640. #  define dev_kfree_skb(skb) dev_kfree_skb((skb), FREE_WRITE);
  641. #  define __skb_push(skb, len) skb_push((skb), (len))
  642. #  define __skb_put(skb, len)  skb_put((skb), (len))
  643. #endif
  644. /*
  645.  * Softnet changes in 2.4
  646.  */
  647. #ifndef LINUX_24
  648. #  ifdef _LINUX_NETDEVICE_H /* only if netdevice.h was included */
  649. #  define netif_start_queue(dev) clear_bit(0, (void *) &(dev)->tbusy);
  650. #  define netif_stop_queue(dev)  set_bit(0, (void *) &(dev)->tbusy);
  651. static inline void netif_wake_queue(struct device *dev)
  652. {
  653.     clear_bit(0, (void *) &(dev)->tbusy);
  654.     mark_bh(NET_BH);
  655. }
  656. /* struct device became struct net_device */
  657. #  define net_device device
  658. #  endif /* netdevice.h */
  659. #endif /* ! LINUX_24 */
  660. /*
  661.  * Memory barrier stuff, define what's missing from older kernel versions
  662.  */
  663. #ifdef switch_to /* this is always a macro, defined in <asm/sysstem.h> */
  664. #  ifndef set_mb
  665. #    define set_mb(var, value) do {(var) = (value); mb();}  while 0
  666. #  endif
  667. #  ifndef set_rmb
  668. #    define set_rmb(var, value) do {(var) = (value); rmb();}  while 0
  669. #  endif
  670. #  ifndef set_wmb
  671. #    define set_wmb(var, value) do {(var) = (value); wmb();}  while 0
  672. #  endif
  673. /* The hw barriers are defined as sw barriers. A correct thing if this
  674.    specific kernel/platform is supported but has no specific instruction */
  675. #  ifndef mb
  676. #    define mb barrier
  677. #  endif
  678. #  ifndef rmb
  679. #    define rmb barrier
  680. #  endif
  681. #  ifndef wmb
  682. #    define wmb barrier
  683. #  endif
  684. #endif /* switch to (i.e. <asm/system.h>) */
  685. #endif /* _SYSDEP_H_ */