techmik

osdep.c

Jun 4th, 2011
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 66.76 KB | None | 0 0
  1. /*********************************************************************************
  2.  
  3. AVerMedia TECHNOLOGIES, Inc.
  4. AVerMedia Linux Driver License Agreement
  5.  
  6.  
  7.  
  8. IMPORTANT: This AVerMeida Linux Driver is supplied to you by
  9. AVerMedia TECHNOLOGIES, Inc. ("AVerMedia") in consideration
  10. of your agreement to the following terms, and your use, installation,
  11. modification or redistribution of this AVerMedia Linux Driver
  12. constitutes acceptance of these terms. If you do not agree with
  13. these terms, please do not use, install, modify or redistribute
  14. this AVerMedia Linux Driver.
  15.  
  16. 1. License. Any driver sources, binaries, utilities, documentation
  17. and other materials accompanying this License, whether on disk,
  18. print or electronic documentation, in read only memory, or any
  19. other media, (collectively, the "AVerMedia Linux Driver") are
  20. licensed, not sold, to you by AVerMedia for use only under the terms
  21. of this License, and AVerMedia reserves all rights not expressly
  22. granted to you. The rights granted herein are limited to AVerMedia's
  23. intellectual property rights in the AVerMedia Linux Driver and do not
  24. include any other patents or intellectual property rights. You own
  25. the media on which the AVerMedia Linux Driver is recorded but AVerMedia
  26. retains ownership of the AVerMedia Linux Driver itself and its
  27. derivative works. The AVerMedia Linux Driver in this package and
  28. any copies, modifications and derivative works which this License
  29. authorizes you to make are subject to this License. The binaries
  30. part of AVerMedia Linux Driver is ported from Windows driver and
  31. is under some other NDA, so the original source code will not be
  32. released.
  33.  
  34. 2. Permitted Uses and Restrictions. You may use, copy, redistribute
  35. or install the original AVerMedia Linux Driver to test or demonstrate
  36. the AVerMedia Linux Driver with AVerMedia's products. You may also
  37. modify the released source code in order to improve the compatibilities,
  38. operability and functionalities with AVerMedia's products as long as
  39. this License in whole are remained and subsequently use, copy,
  40. redistribute or install the derivative works. You have no right to
  41. reverse engineer, decompile, disassemble the accompanying object files
  42. through the released source code, nor to modify, incorporate into or
  43. compile in combination with your own programs to operate with any
  44. product other than from AVerMedia. Your rights under this License
  45. will terminate automatically without notice from AVerMedia if you
  46. fail to comply with any term(s) of this License.
  47.  
  48. 3. Disclaimer of Warranty. The AVerMedia Linux Driver may be "alpha",
  49. "beta", "development", pre-release, untested, and/or not fully tested
  50. and may contain errors that could cause failures or loss of data, be
  51. incomplete or contain inaccuracies. YOU EXPRESSLY ACKNOWLEDGE AND AGREE
  52. THAT USE OF THE AVERMEDIA LINUX DRIVER IS AT YOUR SOLE RISK AND THAT THE
  53. ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY AND EFFORT
  54. IS WITH YOU. THE AVERMEDIA LINUX DRIVER IS PROVIDED "AS IS" WITH ALL
  55. FAULTS. THE USER ASSUMES TOTAL RESPONSIBILITY AND ALL RISKS ASSOCIATED
  56. WITH USE OF THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, RISKS OF ANY
  57. DEFECTS, INACCURACIES, PROGRAM ERRORS, DAMAGE TO OR LOSS OF DATA,
  58. PROGRAMS OR EQUIPMENT, UNAVAILABILITY OR INTERRUPTION OF OPERATIONS.
  59. AVERMEDIA DOES NOT MAKE, AND EXPRESSLY DISCLAIM, ANY EXPRESS OR IMPLIED
  60. WARRANTIES OF ANY KIND WHATSOEVER, INCLUDING, WITHOUT LIMITATION,
  61. ANY WARRANTIES OR FITNESS FOR A PARTICULAR PURPOSE, AND ANY WARRANTIES
  62. OF TITLE OR NON-INFRINGEMENT. AVERMEDIA DOES NOT WARRANT THAT THE USE
  63. OR OPERATION OF THE SOFTWARE WILL BE UNITERRUPTED OR ERROR FREE.
  64.  
  65. 4. Complete Agreement. This License constitutes the entire agreement
  66. between the parties with respect to the use of the AVerMedia Linux
  67. Driver licensed hereunder and supersedes all prior or contemporaneous
  68. understandings regarding such subject matter. No amendment to or
  69. modification of this License will be binding unless in writing and
  70. signed by AVerMedia. Any translation of this License is done for
  71. local requirements and in the event of a dispute between the English
  72. and any non-English versions, the English version of this License
  73. shall govern.
  74.  
  75. *********************************************************************************/
  76. #include <linux/module.h>
  77. #include <linux/version.h>
  78. #include <linux/types.h>
  79.  
  80. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)
  81. #include <asm/semaphore.h>
  82. #else
  83. #include <linux/semaphore.h>
  84. #endif
  85. #include <linux/slab.h>
  86. #include <linux/errno.h>
  87. #include <linux/sched.h>
  88. #include <linux/kref.h>
  89. #include <linux/smp_lock.h>
  90. #include <linux/proc_fs.h>
  91. #include <linux/list.h>
  92. #include <linux/kdev_t.h>
  93. #include <linux/device.h>
  94. #include <asm/uaccess.h>
  95. #include <linux/spinlock.h>
  96. #include <linux/mm.h>
  97. #include <asm/scatterlist.h>
  98. #include <linux/vmalloc.h>
  99. #include <linux/timer.h>
  100. #include <linux/pci.h>
  101. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,8)
  102. #include <linux/hardirq.h>
  103. #endif
  104.  
  105. #include <linux/delay.h>
  106. #include <linux/interrupt.h>
  107. #include <asm/atomic.h>
  108. #include <asm/io.h>
  109. #include <linux/signal.h>
  110.  
  111. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,15)
  112. #include <linux/mutex.h>
  113. #endif
  114.  
  115. #include <linux/poll.h>
  116. #include <linux/scatterlist.h>
  117.  
  118. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
  119. #include <asm/bug.h>
  120. #else
  121. #include <linux/bug.h>
  122. #endif
  123.  
  124. #include <linux/videodev2.h>
  125.  
  126. #include "osdep.h"
  127. #include "debug.h"
  128. #include "id.h"
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137. int SysWaitQueueHeadInit(pWait_queue_head_t *wq)
  138. {
  139. wait_queue_head_t *pWQ = kmalloc(sizeof(*pWQ), GFP_KERNEL);
  140.  
  141. if( pWQ ) {
  142. init_waitqueue_head(pWQ);
  143. *wq = (pWait_queue_head_t) pWQ;
  144. return 0;
  145. }
  146.  
  147. *wq = NULL;
  148. return -ENOMEM;
  149. }
  150.  
  151. int SysWaitQueueHeadFini(pWait_queue_head_t wq)
  152. {
  153. if( wq ) {
  154. kfree(wq);
  155. return 0;
  156. }
  157.  
  158. return -EINVAL;
  159. }
  160.  
  161.  
  162.  
  163.  
  164. int SysWaitQueueInit(pWait_queue_t *wq)
  165. {
  166. DECLARE_WAITQUEUE(tmp_wait_queue, current);
  167. *wq = (pWait_queue_t) kmalloc(sizeof(wait_queue_t), GFP_KERNEL);
  168.  
  169. if( !(*wq) ) return -ENOMEM;
  170. memcpy(*wq, &tmp_wait_queue, sizeof(wait_queue_t));
  171. return 0;
  172. }
  173.  
  174. int SysWaitQueueFini(pWait_queue_t wq)
  175. {
  176. if( wq ) {
  177. kfree(wq);
  178. return 0;
  179. }
  180.  
  181. return -EINVAL;
  182. }
  183.  
  184. void SysAddWaitQueue(pWait_queue_head_t wqh, pWait_queue_t wq)
  185. {
  186. wait_queue_head_t *pWQH = (wait_queue_head_t *) wqh;
  187. wait_queue_t *pWQ = (wait_queue_t *) wq;
  188.  
  189. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13)
  190. pWQ->task = current;
  191. #else
  192. pWQ->private = current;
  193. #endif
  194. add_wait_queue(pWQH, pWQ);
  195. }
  196.  
  197.  
  198.  
  199.  
  200.  
  201. void SysRemoveWaitQueue(pWait_queue_head_t wqh, pWait_queue_t wq)
  202. {
  203. wait_queue_head_t *pWQH = (wait_queue_head_t *) wqh;
  204. wait_queue_t *pWQ = (wait_queue_t *) wq;
  205.  
  206. remove_wait_queue(pWQH, pWQ);
  207. }
  208.  
  209. void SysWakeUp(pWait_queue_head_t wqh)
  210. {
  211. wake_up((wait_queue_head_t *)wqh);
  212. }
  213.  
  214.  
  215. void SysPollWait(void *FileContext, pWait_queue_head_t head, void *pollstruct)
  216. {
  217. poll_wait((struct file *)FileContext,
  218. (wait_queue_head_t *)head,
  219. (struct poll_table_struct *)pollstruct);
  220. }
  221.  
  222.  
  223.  
  224. #if 0
  225. #if 0
  226.  
  227.  
  228.  
  229.  
  230.  
  231. int SysSpinLockInit(pSpinlock_t *slock)
  232. {
  233. spinlock_t *plock = NULL;
  234.  
  235. #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  236. plock = kmalloc(sizeof(*plock), GFP_KERNEL);
  237.  
  238. if( plock ) {
  239. *plock = SPIN_LOCK_UNLOCKED;
  240. *slock = (pSpinlock_t) plock;
  241. return 0;
  242. }
  243. #else
  244. plock = kmalloc(1, GFP_KERNEL);
  245. *slock = (pSpinlock_t) plock;
  246. if( plock )
  247. return 0;
  248. #endif
  249.  
  250. *slock = NULL;
  251. return -ENOMEM;
  252. }
  253.  
  254. void SysSpinLock(pSpinlock_t slock)
  255. {
  256. spinlock_t *lock = slock;
  257. if( lock==NULL ) { BUG(); return; }
  258. #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  259. spin_lock(lock);
  260. #else
  261.  
  262. #endif
  263. }
  264.  
  265. void SysSpinUnlock(pSpinlock_t slock)
  266. {
  267. spinlock_t *lock = slock;
  268. if( lock==NULL ) { BUG(); return; }
  269. #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  270. spin_unlock(lock);
  271. #else
  272.  
  273. #endif
  274. }
  275.  
  276. void SysSpinLockIrqsave(pSpinlock_t slock, unsigned long *flags)
  277. {
  278. spinlock_t *lock = slock;
  279. if( lock==NULL ) { BUG(); return; }
  280. #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  281. spin_lock_irqsave(lock, *flags);
  282. #else
  283.  
  284. #endif
  285. }
  286.  
  287. void SysSpinUnlockIrqrestore(pSpinlock_t slock, unsigned long flags)
  288. {
  289. spinlock_t *lock = slock;
  290. if( lock==NULL ) { BUG(); return; }
  291. #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  292. spin_unlock_irqrestore(lock, flags);
  293. #else
  294.  
  295. #endif
  296. }
  297.  
  298. int SysSpinLockFini(pSpinlock_t slock)
  299. {
  300. if( slock ) {
  301. kfree(slock);
  302. return 0;
  303. }
  304.  
  305. return -EINVAL;
  306. }
  307.  
  308. #else
  309.  
  310. typedef struct _aver_spinlock_t
  311. {
  312. spinlock_t lock;
  313. unsigned int index;
  314. int used;
  315. }_aver_spinlock_t;
  316.  
  317. #define MAX_AVER_SPINLOCK 256
  318. static struct _aver_spinlock_t g_spinlock_ar[MAX_AVER_SPINLOCK];
  319. static atomic_t g_spinlock_lock;
  320.  
  321.  
  322. int SysSpinLockInit(pSpinlock_t *slock)
  323. {
  324. unsigned int i=0;
  325. *slock = NULL;
  326.  
  327. #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  328.  
  329.  
  330. while(1) {
  331. if( SysAtomicAddReturn(1, &g_spinlock_lock)==1 ) break;
  332. else {
  333. SysAtomicSubReturn(1, &g_spinlock_lock);
  334. mdelay(1);
  335. }
  336. }
  337.  
  338. for(i=0; i<MAX_AVER_SPINLOCK; ++i) {
  339. if( g_spinlock_ar[i].used==0 ) {
  340. g_spinlock_ar[i].used = 1;
  341. g_spinlock_ar[i].index = i;
  342. spin_lock_init(&g_spinlock_ar[i].lock);
  343.  
  344. *slock = (pSpinlock_t) (g_spinlock_ar+i);
  345. break;
  346. }
  347. }
  348.  
  349.  
  350. SysAtomicSubReturn(1, &g_spinlock_lock);
  351.  
  352. if( *slock ) {
  353.  
  354. return 0;
  355. }
  356. else {
  357.  
  358. BUG();
  359. }
  360.  
  361. #else
  362. *slock = (pSpinlock_t) 1;
  363. return 0;
  364. #endif
  365.  
  366. return -ENOMEM;
  367. }
  368.  
  369. void SysSpinLock(pSpinlock_t slock)
  370. {
  371. _aver_spinlock_t *lock = (_aver_spinlock_t *)slock;
  372. if( lock==NULL ) { BUG(); return; }
  373. #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  374. spin_lock(&lock->lock);
  375. #else
  376.  
  377. #endif
  378. }
  379.  
  380. void SysSpinUnlock(pSpinlock_t slock)
  381. {
  382. _aver_spinlock_t *lock = (_aver_spinlock_t *)slock;
  383. if( lock==NULL ) { BUG(); return; }
  384. #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  385. spin_unlock(&lock->lock);
  386. #else
  387.  
  388. #endif
  389. }
  390.  
  391. void SysSpinLockIrqsave(pSpinlock_t slock, unsigned long *flags)
  392. {
  393. _aver_spinlock_t *lock = (_aver_spinlock_t *)slock;
  394. if( lock==NULL ) { BUG(); return; }
  395. #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  396. spin_lock_irqsave(&lock->lock, *flags);
  397. #else
  398.  
  399. #endif
  400. }
  401.  
  402. void SysSpinUnlockIrqrestore(pSpinlock_t slock, unsigned long flags)
  403. {
  404. _aver_spinlock_t *lock = (_aver_spinlock_t *)slock;
  405. if( lock==NULL ) { BUG(); return; }
  406. #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  407. spin_unlock_irqrestore(&lock->lock, flags);
  408. #else
  409.  
  410. #endif
  411. }
  412.  
  413. int SysSpinLockFini(pSpinlock_t slock)
  414. {
  415. _aver_spinlock_t *lock = (_aver_spinlock_t *)slock;
  416.  
  417. #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  418. lock->used = 0;
  419. return 0;
  420. #endif
  421.  
  422. }
  423. #endif
  424. #endif
  425.  
  426. int SysSemInit(pSemaphore *sem, enum sem_type type)
  427. {
  428. struct semaphore *tmp;
  429.  
  430. *sem = NULL;
  431. tmp = kmalloc(sizeof(struct semaphore), GFP_KERNEL);
  432. if( !tmp ) return -ENOMEM;
  433.  
  434. if(st_Mutex == type) {
  435. init_MUTEX(tmp);
  436. *sem = (pSemaphore) tmp;
  437. }
  438. else if(st_MutexLocked == type) {
  439. init_MUTEX_LOCKED(tmp);
  440. *sem = (pSemaphore) tmp;
  441. }
  442. else {
  443. kfree(tmp);
  444. return -EINVAL;
  445. }
  446.  
  447. return 0;
  448. }
  449.  
  450. int SysSemDown(pSemaphore sem)
  451. {
  452. if(!sem) BUG();
  453. #if 0
  454. down_interruptible((struct semaphore *)sem);
  455. #else
  456. down((struct semaphore *)sem);
  457. #endif
  458. return 0;
  459. }
  460.  
  461.  
  462. int SysSemDownInterruptible(pSemaphore sem)
  463. {
  464. if(!sem) BUG();
  465. return down_interruptible((struct semaphore *)sem);
  466. }
  467.  
  468.  
  469. void SysSemUp(pSemaphore sem)
  470. {
  471. if(!sem) BUG();
  472. up((struct semaphore *)sem);
  473. }
  474.  
  475. void SysSemFini(pSemaphore sem)
  476. {
  477. if(!sem) BUG();
  478. kfree(sem);
  479. }
  480.  
  481. #if 1
  482.  
  483.  
  484. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17)
  485.  
  486. #if 0
  487. int _SysMutexInit(pMutex *pmutex, const char *name)
  488. {
  489. *pmutex = kmalloc(sizeof(Mutex), GFP_KERNEL);
  490. if( *pmutex==NULL ) return -ENOMEM;
  491.  
  492. (*pmutex)->context = kmalloc(sizeof(struct mutex), GFP_KERNEL);
  493. if( (*pmutex)->context==NULL ) {
  494. kfree((*pmutex));
  495. return -ENOMEM;
  496. }
  497. (*pmutex)->key = kmalloc(sizeof(struct lock_class_key), GFP_KERNEL);
  498. if( (*pmutex)->key==NULL ) {
  499. kfree((*pmutex)->context);
  500. kfree(*pmutex);
  501. return -ENOMEM;
  502. }
  503.  
  504. __mutex_init((struct mutex *)(*pmutex)->context,
  505. name,
  506. (struct lock_class_key *)(*pmutex)->key);
  507. return 0;
  508. }
  509.  
  510. void SysMutexLock(pMutex mutex)
  511. {
  512. mutex_lock((struct mutex *)mutex->context);
  513. }
  514.  
  515. int SysMutexLockInterruptible(pMutex mutex)
  516. {
  517. return mutex_lock_interruptible((struct mutex *)mutex->context);
  518. }
  519.  
  520. void SysMutexUnlock(pMutex mutex)
  521. {
  522. mutex_unlock((struct mutex *)mutex->context);
  523. }
  524.  
  525. void SysMutexFree(pMutex mutex)
  526. {
  527. kfree(mutex->context);
  528. kfree(mutex->key);
  529. kfree(mutex);
  530. }
  531.  
  532. #else
  533.  
  534. typedef struct _aver_mutex_t
  535. {
  536. struct mutex lock;
  537. struct lock_class_key key;
  538. unsigned int index;
  539. int used;
  540. }_aver_mutex_t;
  541.  
  542. #define MAX_AVER_MUTEX 256
  543. static struct _aver_mutex_t g_mutex_ar[MAX_AVER_MUTEX];
  544. static atomic_t g_mutex_lock;
  545.  
  546.  
  547. int _SysMutexInit(pMutex *pmutex, const char *name)
  548. {
  549. unsigned int i=0;
  550. *pmutex = NULL;
  551.  
  552.  
  553. while(1) {
  554. if( SysAtomicAddReturn(1, &g_mutex_lock)==1 ) break;
  555. else {
  556. SysAtomicSubReturn(1, &g_mutex_lock);
  557. mdelay(1);
  558. }
  559. }
  560.  
  561. for(i=0; i<MAX_AVER_MUTEX; ++i) {
  562. if( g_mutex_ar[i].used==0 ) {
  563. g_mutex_ar[i].used = 1;
  564. g_mutex_ar[i].index = i;
  565. __mutex_init(&g_mutex_ar[i].lock, name, &g_mutex_ar[i].key);
  566.  
  567. *pmutex = (pMutex)&(g_mutex_ar[i]);
  568. break;
  569. }
  570. }
  571.  
  572.  
  573. SysAtomicSubReturn(1, &g_mutex_lock);
  574.  
  575. if( *pmutex ) return 0;
  576. else return -ENOMEM;
  577. }
  578.  
  579. void SysMutexLock(pMutex mutex)
  580. {
  581. mutex_lock(& ((_aver_mutex_t *)mutex)->lock);
  582. }
  583.  
  584. int SysMutexLockInterruptible(pMutex mutex)
  585. {
  586. return mutex_lock_interruptible(& ((_aver_mutex_t *)mutex)->lock);
  587. }
  588.  
  589. void SysMutexUnlock(pMutex mutex)
  590. {
  591. mutex_unlock(& ((_aver_mutex_t *)mutex)->lock);
  592. }
  593.  
  594. void SysMutexFree(pMutex mutex)
  595. {
  596. _aver_mutex_t *m = (_aver_mutex_t *)mutex;
  597.  
  598. m->used = 0;
  599. }
  600.  
  601. #endif
  602.  
  603. #else
  604.  
  605.  
  606.  
  607. int _SysMutexInit(pMutex *pmutex, const char *name)
  608. {
  609. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,15)
  610. *pmutex = kmalloc(sizeof(struct mutex), GFP_KERNEL);
  611. if( *pmutex==NULL ) return -ENOMEM;
  612.  
  613. __mutex_init((struct mutex *)*pmutex, name);
  614. return 0;
  615. #else
  616. return SysSemInit((pSemaphore *)pmutex, st_Mutex);
  617. #endif
  618. }
  619.  
  620. void SysMutexLock(pMutex mutex)
  621. {
  622. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,15)
  623. mutex_lock((struct mutex *)mutex);
  624. #else
  625. SysSemDown((pSemaphore)mutex);
  626. #endif
  627. }
  628.  
  629. int SysMutexLockInterruptible(pMutex mutex)
  630. {
  631. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,15)
  632. return mutex_lock_interruptible((struct mutex *)mutex);
  633. #else
  634. return SysSemDownInterruptible((pSemaphore)mutex);
  635. #endif
  636. }
  637.  
  638. void SysMutexUnlock(pMutex mutex)
  639. {
  640. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,15)
  641. mutex_unlock((struct mutex *)mutex);
  642. #else
  643. SysSemUp((pSemaphore)mutex);
  644. #endif
  645. }
  646.  
  647. void SysMutexFree(pMutex mutex)
  648. {
  649. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,15)
  650. kfree(mutex);
  651. #else
  652. SysSemFini((pSemaphore)mutex);
  653. #endif
  654. }
  655.  
  656. #endif
  657.  
  658. #endif
  659.  
  660.  
  661. void SysJSleep(unsigned long j)
  662. {
  663. #if 0
  664. set_current_state(TASK_UNINTERRUPTIBLE);
  665. schedule_timeout(j);
  666. #else
  667. set_current_state(TASK_INTERRUPTIBLE);
  668. while(j) {
  669. j = schedule_timeout(j);
  670. }
  671. #endif
  672. }
  673.  
  674.  
  675. void SysMSleep(int miliSec)
  676. {
  677. #if 0
  678. unsigned long j = (HZ*miliSec)/1000;
  679. set_current_state(TASK_UNINTERRUPTIBLE);
  680. schedule_timeout(j);
  681. #else
  682. unsigned long j = msecs_to_jiffies(miliSec);
  683. set_current_state(TASK_INTERRUPTIBLE);
  684. while(j) {
  685. j = schedule_timeout(j);
  686. }
  687. #endif
  688. }
  689.  
  690. void SysUSleep(int microSec)
  691. {
  692. udelay(microSec);
  693. }
  694.  
  695.  
  696. void SysMDelay(int miliSec)
  697. {
  698. mdelay(miliSec);
  699. }
  700.  
  701. int SysInAtomic(void)
  702. {
  703. if(in_atomic() || irqs_disabled()) {
  704. return 1;
  705. }
  706. else {
  707. return 0;
  708. }
  709. }
  710.  
  711.  
  712. #if 0
  713.  
  714.  
  715.  
  716.  
  717.  
  718. void * SysKMalloc(unsigned int size, kmalloc_type flag)
  719. {
  720. u32 type;
  721. void *ptr = NULL;
  722.  
  723.  
  724. if(in_atomic() || irqs_disabled()) {
  725. flag = eKMALLOC_ATOMIC;
  726. }
  727.  
  728.  
  729. switch( flag ) {
  730. case eKMALLOC_ATOMIC:
  731. type = GFP_ATOMIC;
  732. break;
  733.  
  734. case eKMALLOC_KERNEL:
  735. type = GFP_KERNEL;
  736. break;
  737.  
  738. case eKMALLOC_DMA:
  739. type = GFP_DMA;
  740. break;
  741.  
  742. default:
  743. return ptr;
  744. }
  745.  
  746. if(in_atomic()) type = GFP_ATOMIC;
  747. ptr = kmalloc(size, type);
  748. if( ptr ) memset(ptr, 0, size);
  749. DBG_OSDEP("kmalloc %s @ %p\n",
  750. (GFP_DMA==type)? "DMA" :
  751. (GFP_KERNEL==type)? "KERN" :
  752. (GFP_ATOMIC==type)? "ATOMIC" : "Unknown",
  753. ptr);
  754.  
  755. return ptr;
  756. }
  757.  
  758. void SysKFree(void *ptr)
  759. {
  760. DBG_OSDEP("kfree %p\n", ptr);
  761. if(!ptr) BUG();
  762. kfree(ptr);
  763. }
  764.  
  765.  
  766. #else
  767.  
  768. #define AVER_MEM_BARRIER_LEN (16)
  769. #define AVER_MEM_BARRIER (0x7a)
  770.  
  771. typedef struct __aver_mem_hdr
  772. {
  773. const char *file;
  774. unsigned long line;
  775. unsigned long length;
  776. kmalloc_type flag;
  777.  
  778. unsigned char barrier[AVER_MEM_BARRIER_LEN];
  779. }__aver_mem_hdr;
  780.  
  781. static void PrintBarrier(unsigned char *barrier, unsigned long len)
  782. {
  783. unsigned long i;
  784. for(i=0; i<len; ++i) {
  785.  
  786. if( i%8 == 0 ) {
  787. SysPrintk("\nBarrier[%d] : ", i);
  788. }
  789.  
  790. SysPrintk("0x%02x ", barrier[i]);
  791. }
  792.  
  793. SysPrintk("\n");
  794. }
  795.  
  796.  
  797.  
  798.  
  799.  
  800. void * SysKMallocWithTag(unsigned int size, kmalloc_type flag, const char *file, unsigned long line)
  801. {
  802. u32 type;
  803. void *ptr = NULL;
  804. __aver_mem_hdr *hdr=NULL;
  805.  
  806.  
  807. if(in_atomic() || irqs_disabled()) {
  808. flag = eKMALLOC_ATOMIC;
  809. }
  810.  
  811.  
  812. switch( flag ) {
  813. case eKMALLOC_ATOMIC:
  814. type = GFP_ATOMIC;
  815. break;
  816.  
  817. case eKMALLOC_KERNEL:
  818. type = GFP_KERNEL;
  819. break;
  820.  
  821. case eKMALLOC_DMA:
  822. type = GFP_DMA;
  823. break;
  824.  
  825. default:
  826. return ptr;
  827. }
  828.  
  829. if(in_atomic()) type = GFP_ATOMIC;
  830.  
  831.  
  832. ptr = kmalloc(size+sizeof(__aver_mem_hdr)+AVER_MEM_BARRIER_LEN, type);
  833.  
  834.  
  835. if( ptr ) {
  836. hdr = (__aver_mem_hdr *)ptr;
  837. SysMemSet(ptr, 0, size+sizeof(__aver_mem_hdr)+AVER_MEM_BARRIER_LEN);
  838.  
  839.  
  840. hdr->file = file;
  841. hdr->line = line;
  842. hdr->length = size;
  843. hdr->flag = flag;
  844.  
  845. SysMemSet(hdr->barrier, AVER_MEM_BARRIER, AVER_MEM_BARRIER_LEN);
  846.  
  847. SysMemSet(ptr+size+sizeof(__aver_mem_hdr), AVER_MEM_BARRIER, AVER_MEM_BARRIER_LEN);
  848.  
  849. ptr = ((unsigned char *)ptr) + sizeof(__aver_mem_hdr);
  850. }
  851.  
  852. DBG_fOSDEP(" %s @ %p from %s line %ld, hdr @ %p\n",
  853. (GFP_DMA==type)? "DMA" :
  854. (GFP_KERNEL==type)? "KERN" :
  855. (GFP_ATOMIC==type)? "ATOMIC" : "Unknown",
  856. ptr, file, line, hdr);
  857.  
  858. return ptr;
  859. }
  860.  
  861. void SysKFreeWithTag(void *ptr, const char *file, unsigned long line)
  862. {
  863. unsigned long i;
  864. __aver_mem_hdr *hdr;
  865. DBG_fOSDEP(" %p, from %s line %ld\n", ptr, file, line);
  866. if(!ptr) BUG();
  867.  
  868.  
  869. hdr = (__aver_mem_hdr *) ((unsigned char *)ptr-sizeof(__aver_mem_hdr));
  870. DBG_fOSDEP("SysKFree header @ %p\n", hdr);
  871.  
  872.  
  873. for(i=0; i<AVER_MEM_BARRIER_LEN; ++i) {
  874. if( hdr->barrier[i] != AVER_MEM_BARRIER ) {
  875. SysPrintk("\n==============================================================\n");
  876. SysPrintk("SysKFree got memory %p with corrupted header, which follows.", ptr);
  877. PrintBarrier(hdr->barrier, AVER_MEM_BARRIER_LEN);
  878. SysPrintk("==============================================================\n\n");
  879. return;
  880. }
  881. }
  882.  
  883. DBG_fOSDEP("Mem allocate from %s, len %ld\n", hdr->file, hdr->line);
  884.  
  885.  
  886. for(i=0; i<AVER_MEM_BARRIER_LEN; ++i) {
  887. if( ((unsigned char *)ptr + hdr->length)[i] != AVER_MEM_BARRIER ) {
  888.  
  889. SysPrintk("\n==============================================================\n");
  890. SysPrintk("SysKFree detected memory corruption on ptr %p, size=%ld, flag=0x%x, allocated in file %s line %ld",
  891. ptr, hdr->length, hdr->flag, hdr->file, hdr->line);
  892.  
  893. PrintBarrier(((unsigned char *)ptr + hdr->length), AVER_MEM_BARRIER_LEN);
  894. SysPrintk("==============================================================\n\n");
  895. }
  896. }
  897.  
  898. kfree(hdr);
  899. }
  900.  
  901. #endif
  902.  
  903.  
  904. void SysMemSet(void *ptr, unsigned char val, unsigned int size)
  905. {
  906. memset(ptr, val, size);
  907. }
  908.  
  909. void *SysMemCpy(void *dest, const void *src, unsigned int size)
  910. {
  911. return memcpy(dest, src, size);
  912. }
  913.  
  914. int SysMemCmp(const void *dest, const void *src, unsigned int size)
  915. {
  916. return memcmp(dest, src, size);
  917. }
  918.  
  919. void *SysReAlloc(void *ptr, unsigned int oldsize, unsigned int newsize)
  920. {
  921. void *newptr = NULL;
  922.  
  923. newptr = SysKMalloc(newsize, eKMALLOC_KERNEL);
  924. SysMemCpy(newptr, ptr, oldsize);
  925. SysKFree(ptr);
  926. return newptr;
  927. }
  928.  
  929. void *SysMemMove(void *ptr, const void *src, unsigned int size)
  930. {
  931. return memmove(ptr, src, size);
  932. }
  933.  
  934.  
  935. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,8)
  936.  
  937.  
  938. int SysPrintk(const char *fmt, ...)
  939. {
  940. va_list args;
  941. int ret;
  942.  
  943. va_start(args, fmt);
  944. ret = vprintk(fmt, args);
  945. va_end(args);
  946.  
  947. #if 0
  948. if(SysInAtomic())
  949. SysMDelay(500);
  950. else
  951. SysMSleep(500);
  952. #endif
  953. return ret;
  954. }
  955.  
  956. int SysVPrintk(const char *fmt, va_list args)
  957. {
  958. return vprintk(fmt, args);
  959. }
  960.  
  961.  
  962. #else
  963.  
  964. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17)
  965. static spinlock_t logbuf_lock = __SPIN_LOCK_UNLOCKED(logbuf_lock);
  966. #else
  967. static spinlock_t logbuf_lock = SPIN_LOCK_UNLOCKED;
  968. #endif
  969.  
  970. static char logbuf[1024];
  971.  
  972. int SysPrintk(const char *fmt, ...)
  973. {
  974. va_list args;
  975. int ret;
  976.  
  977. va_start(args, fmt);
  978. ret = SysVPrintk(fmt, args);
  979. va_end(args);
  980.  
  981. return ret;
  982. }
  983.  
  984. int SysVPrintk(const char *fmt, va_list args)
  985. {
  986. int ret;
  987. unsigned long flags;
  988.  
  989. spin_lock_irqsave(&logbuf_lock, flags);
  990. ret = vsprintf(logbuf, fmt, args);
  991. spin_unlock_irqrestore(&logbuf_lock, flags);
  992.  
  993. ret = printk(logbuf);
  994.  
  995. return ret;
  996. }
  997.  
  998. #endif
  999.  
  1000.  
  1001. int SysSnPrintf(char *buf, unsigned int size, const char *fmt, ...)
  1002. {
  1003. va_list args;
  1004. int i;
  1005.  
  1006. va_start(args, fmt);
  1007. i=vsnprintf(buf, size, fmt, args);
  1008. va_end(args);
  1009. return i;
  1010. }
  1011.  
  1012.  
  1013.  
  1014.  
  1015.  
  1016.  
  1017. #if 0
  1018. void SysKrefInit(pKref *ppkref)
  1019. #else
  1020. void SysKrefInit(pKref *ppkref, cb_kref cb_func)
  1021. #endif
  1022. {
  1023. struct kref *pkref;
  1024.  
  1025. pkref = kmalloc(sizeof(*pkref), GFP_KERNEL);
  1026. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,8)
  1027. if( pkref ) kref_init(pkref);
  1028. #else
  1029. if( pkref ) kref_init(pkref, (void (*)(struct kref *))cb_func);
  1030. #endif
  1031. *ppkref = pkref;
  1032. }
  1033.  
  1034.  
  1035.  
  1036.  
  1037. void SysKrefPut(pKref kref, cb_kref cb_func)
  1038. {
  1039. struct kref *pkref = (struct kref *) kref;
  1040.  
  1041. DBG_fOSDEP("pkfre=%p, func=%p\n", pkref, cb_func);
  1042. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,8)
  1043. kref_put(pkref, (void (*)(struct kref *))cb_func);
  1044. #else
  1045. kref_put(pkref);
  1046. #endif
  1047. }
  1048.  
  1049.  
  1050.  
  1051.  
  1052.  
  1053. void SysKrefGet(pKref kref)
  1054. {
  1055. struct kref *pkref = (struct kref *) kref;
  1056. DBG_fOSDEP("pkfre=%p, func=%p\n", pkref);
  1057. kref_get(pkref);
  1058. }
  1059.  
  1060.  
  1061.  
  1062.  
  1063.  
  1064. void SysKrefFree(pKref kref)
  1065. {
  1066. if(!kref) BUG();
  1067. kfree(kref);
  1068. }
  1069.  
  1070. void SysLockKernel()
  1071. {
  1072. lock_kernel();
  1073. }
  1074.  
  1075. void SysUnlockKernel()
  1076. {
  1077. unlock_kernel();
  1078. }
  1079.  
  1080. unsigned long SysCopyToUser(void *to, const void *from, unsigned long n)
  1081. {
  1082. return copy_to_user(to, from, n);
  1083. }
  1084.  
  1085. unsigned long SysCopyFromUser(void *to, const void *from, unsigned long n)
  1086. {
  1087. return copy_from_user(to, from, n);
  1088. }
  1089.  
  1090. unsigned int SysStrLen(const char *str)
  1091. {
  1092. return strlen(str);
  1093. }
  1094.  
  1095.  
  1096. unsigned long SysSimpleStrtoul(const char *cp,char **endp,unsigned int base)
  1097. {
  1098. return simple_strtoul(cp, endp, base);
  1099. }
  1100.  
  1101.  
  1102. char *SysStrNCpy(char *dest, const char *src, size_t count)
  1103. {
  1104. return strncpy(dest, src, count);
  1105. }
  1106.  
  1107. void SysSetCurrentState(int state)
  1108. {
  1109. int tmp;
  1110.  
  1111. switch( state ) {
  1112. case PROC_RUNNING:
  1113. tmp = TASK_RUNNING; break;
  1114. case PROC_INTERRUPTIBLE:
  1115. tmp = TASK_INTERRUPTIBLE; break;
  1116. case PROC_UNINTERRUPTIBLE:
  1117. tmp = TASK_UNINTERRUPTIBLE; break;
  1118. default:
  1119. DBG_OSDEP("Task state unknown\n");
  1120. return;
  1121. }
  1122.  
  1123. set_current_state(tmp);
  1124. }
  1125.  
  1126. int SysSignalPending(void)
  1127. {
  1128. return signal_pending(current);
  1129. }
  1130.  
  1131. void SysSchedule(void)
  1132. {
  1133. schedule();
  1134. }
  1135.  
  1136.  
  1137.  
  1138. signed long SysScheduleTimeout(signed long timeout)
  1139. {
  1140. return schedule_timeout(timeout);
  1141. }
  1142.  
  1143. unsigned long SysGetHZ(void)
  1144. {
  1145. return HZ;
  1146. }
  1147.  
  1148.  
  1149. void SysGetPageParam(unsigned int *pg_sz, unsigned int *pg_shift)
  1150. {
  1151. if( pg_sz ) *pg_sz = PAGE_SIZE;
  1152. if( pg_shift ) *pg_shift = PAGE_SHIFT;
  1153. }
  1154.  
  1155. pPage SysVmallocToPage(u8 *va)
  1156. {
  1157. struct page *p = vmalloc_to_page(va);
  1158.  
  1159. return (pPage) p;
  1160. }
  1161.  
  1162. void *SysPageAddress(pPage pg)
  1163. {
  1164. return page_address((struct page *)pg);
  1165. }
  1166.  
  1167. int SysPageHighMem(pPage pg)
  1168. {
  1169. struct page *p = (struct page *)pg;
  1170. REF_PARAM(p);
  1171.  
  1172. return PageHighMem(p);
  1173. }
  1174.  
  1175. void SysGetPage(pPage pg)
  1176. {
  1177. struct page *p = (struct page *)pg;
  1178. get_page(p);
  1179. }
  1180.  
  1181. void SysPciDmaSyncSingleForCpu(pPci_dev pci, dma_addr_t pa, int size,
  1182. dma_type_t type)
  1183. {
  1184. pci_dma_sync_single_for_cpu(pci, pa, size, type);
  1185. }
  1186.  
  1187. void SysPciDmaSyncSgForCpu(pPci_dev pci, pScatterlist pSGList, int count,
  1188. dma_type_t type)
  1189. {
  1190. struct scatterlist *sg = (struct scatterlist *)pSGList;
  1191. pci_dma_sync_sg_for_cpu(pci, sg, count, type);
  1192. }
  1193.  
  1194.  
  1195.  
  1196.  
  1197.  
  1198.  
  1199.  
  1200. void SysFillSG(pScatterlist pSGList, int i, pPage pg, int sz)
  1201. {
  1202. struct scatterlist *sg = (struct scatterlist *)pSGList;
  1203.  
  1204.  
  1205.  
  1206. #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,23)
  1207. sg[i].page = (struct page *) pg;
  1208. sg[i].length = sz;
  1209. #else
  1210. sg_set_page(sg+i, pg, sz, 0);
  1211. sg_dma_len(sg+i) = sz;
  1212. #endif
  1213. }
  1214.  
  1215. dma_addr_t SysGetSgDmaAddress(pScatterlist pSG, int i)
  1216. {
  1217. struct scatterlist *sg = (struct scatterlist *)pSG;
  1218.  
  1219. return sg_dma_address(&sg[i]);
  1220. }
  1221.  
  1222. size_t SysGetSgDmaLen(pScatterlist pSG, int i)
  1223. {
  1224. struct scatterlist *sg = (struct scatterlist *)pSG;
  1225.  
  1226.  
  1227. return sg_dma_len(&sg[i]);
  1228. }
  1229.  
  1230. pPage SysGetSgPage(pScatterlist pSG, int i)
  1231. {
  1232. struct scatterlist *sg = (struct scatterlist *)pSG;
  1233.  
  1234. #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,23)
  1235. return sg[i].page;
  1236. #else
  1237. return sg_page(sg+i);
  1238. #endif
  1239. }
  1240.  
  1241. void SysSetSgDmaAddress(pScatterlist pSG, int i, dma_addr_t pa)
  1242. {
  1243. struct scatterlist *sg = (struct scatterlist *)pSG;
  1244.  
  1245. sg_dma_address(&sg[i]) = pa;
  1246. }
  1247.  
  1248. void SysSetSgDmaLen(pScatterlist pSG, int i, size_t len)
  1249. {
  1250. struct scatterlist *sg = (struct scatterlist *)pSG;
  1251.  
  1252. sg_dma_len(&sg[i]) = len;
  1253. }
  1254.  
  1255. pScatterlist SysSGAlloc(int count)
  1256. {
  1257. struct scatterlist *sg =
  1258. SysKMalloc(sizeof(*sg)*count, eKMALLOC_KERNEL);
  1259.  
  1260. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,23)
  1261. if( sg ) sg_init_table(sg, count);
  1262. #endif
  1263. return (pScatterlist)sg;
  1264. }
  1265.  
  1266.  
  1267.  
  1268.  
  1269.  
  1270. int SysPciMapSg(pPci_dev pci, pScatterlist pSG, int entry, dma_type_t type)
  1271. {
  1272. enum dma_data_direction dir = DMA_NONE;
  1273. switch( type ) {
  1274. case eDMA_DEV_WRITE:
  1275. dir = DMA_TO_DEVICE;
  1276. break;
  1277.  
  1278. case eDMA_DEV_READ:
  1279. dir = DMA_FROM_DEVICE;
  1280. break;
  1281.  
  1282. default:
  1283. return -EINVAL;
  1284. }
  1285.  
  1286. return pci_map_sg((struct pci_dev *)pci, (struct scatterlist *)pSG,
  1287. entry, dir);
  1288. }
  1289.  
  1290. void SysPciUnmapSg(pPci_dev pci, pScatterlist pSG, int entry, dma_type_t type)
  1291. {
  1292. enum dma_data_direction dir = DMA_NONE;
  1293. switch( type ) {
  1294. case eDMA_DEV_WRITE:
  1295. dir = DMA_TO_DEVICE;
  1296. break;
  1297.  
  1298. case eDMA_DEV_READ:
  1299. dir = DMA_FROM_DEVICE;
  1300. break;
  1301.  
  1302. default:
  1303. return;
  1304. }
  1305.  
  1306. pci_unmap_sg((struct pci_dev *)pci, (struct scatterlist *)pSG,
  1307. entry, dir);
  1308. }
  1309.  
  1310.  
  1311.  
  1312.  
  1313.  
  1314. dma_addr_t SysPciMapSingle(pPci_dev pci, void *va, int size, dma_type_t type)
  1315. {
  1316. dma_addr_t pa = (dma_addr_t)0;
  1317.  
  1318. enum dma_data_direction dir = DMA_NONE;
  1319. switch( type ) {
  1320. case eDMA_DEV_WRITE:
  1321. dir = DMA_TO_DEVICE;
  1322. break;
  1323.  
  1324. case eDMA_DEV_READ:
  1325. dir = DMA_FROM_DEVICE;
  1326. break;
  1327.  
  1328. default:
  1329. return pa;
  1330. }
  1331.  
  1332. pa = pci_map_single((struct pci_dev *)pci, va, size, dir);
  1333. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,26)
  1334. if( pci_dma_mapping_error((struct pci_dev *)pci, pa) ) pa = (dma_addr_t)0;
  1335. #else
  1336. if( pci_dma_mapping_error(pa) ) pa = (dma_addr_t)0;
  1337. #endif
  1338. return pa;
  1339. }
  1340.  
  1341. void SysPciUnmapSingle(pPci_dev pci, dma_addr_t pa, int size, dma_type_t type)
  1342. {
  1343. enum dma_data_direction dir = DMA_NONE;
  1344. switch( type ) {
  1345. case eDMA_DEV_WRITE:
  1346. dir = DMA_TO_DEVICE;
  1347. break;
  1348.  
  1349. case eDMA_DEV_READ:
  1350. dir = DMA_FROM_DEVICE;
  1351. break;
  1352.  
  1353. default:
  1354. return;
  1355. }
  1356.  
  1357. pci_unmap_single((struct pci_dev *)pci, pa, size, dir);
  1358. }
  1359.  
  1360. void *SysPciAllocConsistent(pPci_dev pci, size_t sz, dma_addr_t *pa)
  1361. {
  1362. return pci_alloc_consistent((struct pci_dev *)pci, sz, pa);
  1363. }
  1364.  
  1365. void SysPciFreeConsistent(pPci_dev pci, size_t sz, void *va, dma_addr_t pa)
  1366. {
  1367. return pci_free_consistent((struct pci_dev *)pci, sz, va, pa);
  1368. }
  1369.  
  1370. int SysPciEnableDevice(pPci_dev pci)
  1371. {
  1372. return pci_enable_device((struct pci_dev *)pci);
  1373. }
  1374.  
  1375. void SysPciSetMaster(pPci_dev pci)
  1376. {
  1377. pci_set_master((struct pci_dev *)pci);
  1378. }
  1379.  
  1380. int SysPciMMIOMap(pPci_dev pci, int resource, const char *devname,
  1381. unsigned long *mmio, unsigned int *mmio_size)
  1382. {
  1383. int err = 0;
  1384. struct pci_dev *pci_dev = (struct pci_dev *)pci;
  1385.  
  1386. DBG_OSDEP("pci=0x%p, resource=%d, name=%s\n", pci, resource, devname);
  1387.  
  1388. if (!request_mem_region(pci_resource_start(pci_dev, resource),
  1389. pci_resource_len(pci_dev, resource),
  1390. devname)) {
  1391. DBG_OSDEP("request_mem_region failed, err=%d\n", err);
  1392. err = -EBUSY;
  1393. goto done;
  1394. }
  1395.  
  1396. *mmio = (unsigned long)ioremap(pci_resource_start(pci_dev, resource),
  1397. pci_resource_len(pci_dev, resource));
  1398. if(!(*mmio)) {
  1399. DBG_OSDEP("ioremap failed\n");
  1400. err = -ENOMEM;
  1401. }
  1402.  
  1403. *mmio_size = pci_resource_len(pci_dev, resource);
  1404.  
  1405. DBG_OSDEP("done, mmio=0x%lx, size=%d\n", *mmio, *mmio_size);
  1406. done:
  1407. return err;
  1408. }
  1409.  
  1410. void SysPciMMIOUnMap(pPci_dev pci, int resource, unsigned long mmio)
  1411. {
  1412. struct pci_dev *pci_dev = (struct pci_dev *)pci;
  1413. DBG_OSDEP("pci=0x%p, resource=%d, mmio=0x%lx\n", pci, resource,
  1414. mmio);
  1415. iounmap((void *)mmio);
  1416. release_mem_region(pci_resource_start(pci_dev, resource),
  1417. pci_resource_len(pci_dev, resource));
  1418. }
  1419.  
  1420. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,8)
  1421. unsigned int SysIORead32(void *addr)
  1422. {
  1423. return ioread32(addr);
  1424. }
  1425.  
  1426. void SysIOWrite32(void *addr, unsigned int val)
  1427. {
  1428. iowrite32(val, addr);
  1429. }
  1430.  
  1431.  
  1432. unsigned int SysIORead16(void *addr)
  1433. {
  1434. return ioread16(addr);
  1435. }
  1436.  
  1437. void SysIOWrite16(void *addr, unsigned int val)
  1438. {
  1439. iowrite16(val, addr);
  1440. }
  1441.  
  1442. unsigned int SysIORead8(void *addr)
  1443. {
  1444. return ioread8(addr);
  1445. }
  1446.  
  1447. void SysIOWrite8(void *addr, unsigned int val)
  1448. {
  1449. iowrite8(val, addr);
  1450. }
  1451.  
  1452.  
  1453. #else
  1454.  
  1455. unsigned int SysIORead32(void *addr)
  1456. {
  1457. return readl(addr);
  1458. }
  1459.  
  1460. void SysIOWrite32(void *addr, unsigned int val)
  1461. {
  1462. return writel(val, addr);
  1463. }
  1464.  
  1465.  
  1466. unsigned int SysIORead16(void *addr)
  1467. {
  1468. return readw(addr);
  1469. }
  1470.  
  1471. void SysIOWrite16(void *addr, unsigned int val)
  1472. {
  1473. return writew(val, addr);
  1474. }
  1475.  
  1476. unsigned int SysIORead8(void *addr)
  1477. {
  1478. return readb(addr);
  1479. }
  1480.  
  1481. void SysIOWrite8(void *addr, unsigned int val)
  1482. {
  1483. return writeb(val, addr);
  1484. }
  1485.  
  1486.  
  1487. #endif
  1488.  
  1489. int SysPciReadCfgByte(pPci_dev pci, unsigned int w, u8 *v)
  1490. {
  1491. return pci_read_config_byte((struct pci_dev *)pci, w, v);
  1492. }
  1493.  
  1494. int SysPciReadCfgWord(pPci_dev pci, unsigned int w, u16 *v)
  1495. {
  1496. return pci_read_config_word((struct pci_dev *)pci, w, v);
  1497. }
  1498.  
  1499. int SysPciReadCfgDWord(pPci_dev pci, unsigned int w, u32 *v)
  1500. {
  1501. return pci_read_config_dword((struct pci_dev *)pci, w, v);
  1502. }
  1503.  
  1504. int SysPciWriteCfgByte(pPci_dev pci, unsigned int w, u8 v)
  1505. {
  1506. return pci_write_config_byte((struct pci_dev *)pci, w, v);
  1507. }
  1508.  
  1509. int SysPciWriteCfgWord(pPci_dev pci, unsigned int w, u16 v)
  1510. {
  1511. return pci_write_config_word((struct pci_dev *)pci, w, v);
  1512. }
  1513.  
  1514. int SysPciWriteCfgDWord(pPci_dev pci, unsigned int w, u32 v)
  1515. {
  1516. return pci_write_config_dword((struct pci_dev *)pci, w, v);
  1517. }
  1518.  
  1519. unsigned short SysPciVendorId(pPci_dev pci)
  1520. {
  1521. return ((struct pci_dev *)pci)->vendor;
  1522. }
  1523.  
  1524. unsigned short SysPciDeviceId(pPci_dev pci)
  1525. {
  1526. return ((struct pci_dev *)pci)->device;
  1527. }
  1528.  
  1529. unsigned short SysPciSubVendorId(pPci_dev pci)
  1530. {
  1531. return ((struct pci_dev *)pci)->subsystem_vendor;
  1532. }
  1533.  
  1534. unsigned short SysPciSubDeviceId(pPci_dev pci)
  1535. {
  1536. return ((struct pci_dev *)pci)->subsystem_device;
  1537. }
  1538.  
  1539. void *SysPciGetDevice(pPci_dev pci)
  1540. {
  1541. return &((struct pci_dev *)pci)->dev;
  1542. }
  1543.  
  1544. void SysPciSetDrvData(pPci_dev pci, void *data)
  1545. {
  1546. pci_set_drvdata((struct pci_dev *)pci, data);
  1547. }
  1548.  
  1549. void *SysPciGetDrvData(pPci_dev pci)
  1550. {
  1551. return pci_get_drvdata((struct pci_dev *)pci);
  1552. }
  1553.  
  1554. unsigned int SysPciGetIrq(pPci_dev pci)
  1555. {
  1556. return ((struct pci_dev *)pci)->irq;
  1557. }
  1558.  
  1559.  
  1560. void SysPciGetId(pPci_dev pci, unsigned short *vendor,
  1561. unsigned short *device, unsigned short *subvendor,
  1562. unsigned short *subdevice)
  1563. {
  1564. if( !pci )
  1565. return;
  1566. if(vendor)
  1567. *vendor = ((struct pci_dev *)pci)->vendor;
  1568. if(device)
  1569. *device = ((struct pci_dev *)pci)->device;
  1570. if(subvendor)
  1571. *subvendor = ((struct pci_dev *)pci)->subsystem_vendor;
  1572. if(subdevice)
  1573. *subdevice = ((struct pci_dev *)pci)->subsystem_device;
  1574. }
  1575.  
  1576.  
  1577. const char *SysPciName(pPci_dev pci)
  1578. {
  1579. return pci_name((struct pci_dev *)pci);
  1580. }
  1581.  
  1582.  
  1583.  
  1584.  
  1585.  
  1586. u8 *SysVmalloc32(unsigned long size)
  1587. {
  1588. return vmalloc_32(size);
  1589. }
  1590.  
  1591. void SysVFree(void *addr)
  1592. {
  1593. vfree(addr);
  1594. }
  1595.  
  1596.  
  1597.  
  1598.  
  1599.  
  1600.  
  1601. int SysInitTimer(pTimer_list *pTimer)
  1602. {
  1603.  
  1604. struct timer_list *timer = SysKMalloc(sizeof(*timer), eKMALLOC_KERNEL);
  1605.  
  1606. *pTimer = (pTimer_list) timer;
  1607. if( timer ) {
  1608. init_timer(timer);
  1609. return 0;
  1610. }
  1611.  
  1612. return -ENOMEM;
  1613. }
  1614.  
  1615.  
  1616.  
  1617.  
  1618.  
  1619. void SysFillTimer(pTimer_list Timer, cb_timer func, void *data)
  1620. {
  1621. struct timer_list *timer = (struct timer_list *)Timer;
  1622.  
  1623. timer->function = func;
  1624. timer->data = (unsigned long)data;
  1625. }
  1626.  
  1627.  
  1628.  
  1629.  
  1630.  
  1631. int SysModTimer(pTimer_list Timer, unsigned long ms)
  1632. {
  1633. ms *= HZ;
  1634. ms /= 1000;
  1635. return mod_timer((struct timer_list *)Timer, ms+jiffies);
  1636. }
  1637.  
  1638. int SysDelTimer(pTimer_list Timer)
  1639. {
  1640. return del_timer_sync((struct timer_list *)Timer);
  1641. }
  1642.  
  1643.  
  1644. unsigned long SysGetJiffies(void)
  1645. {
  1646. return jiffies;
  1647. }
  1648.  
  1649.  
  1650.  
  1651. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
  1652. struct jump_struct
  1653. {
  1654. struct work_struct w;
  1655. void *data;
  1656. cb_workqueue func;
  1657. };
  1658.  
  1659.  
  1660. static void work_handler(struct work_struct *work)
  1661. {
  1662. struct jump_struct *tmp = list_entry(work, struct jump_struct, w);
  1663. void *user_data = tmp->data;
  1664. cb_workqueue user_handler = tmp->func;
  1665.  
  1666. user_handler(user_data);
  1667. }
  1668. #endif
  1669.  
  1670. int SysInitWork(pWorkStruct *work, cb_workqueue func, void *data)
  1671. {
  1672. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
  1673. struct jump_struct *jump;
  1674.  
  1675. jump = SysKMalloc(sizeof(struct jump_struct), eKMALLOC_KERNEL);
  1676. memset(jump,0,sizeof(jump));
  1677.  
  1678. jump->data = data;
  1679. jump->func = func;
  1680.  
  1681.  
  1682. *work = (pWorkStruct) (jump);
  1683. INIT_WORK( &(jump->w), work_handler);
  1684. #else
  1685.  
  1686.  
  1687. struct work_struct *w = SysKMalloc(sizeof(*w), eKMALLOC_KERNEL);
  1688. if( !w ) return -ENOMEM;
  1689. *work = (pWorkStruct) w;
  1690. INIT_WORK(w, func, data);
  1691. #endif
  1692.  
  1693. return 0;
  1694. }
  1695.  
  1696.  
  1697. int SysSubmitWork(pWorkStruct work)
  1698. {
  1699.  
  1700.  
  1701.  
  1702. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
  1703. struct jump_struct *j = (struct jump_struct*)work;
  1704. return schedule_work(&(j->w));
  1705. #else
  1706. struct work_struct *w = (struct work_struct *)work;
  1707. return schedule_work(w);
  1708. #endif
  1709.  
  1710. }
  1711.  
  1712. void SysFlushWork(void)
  1713. {
  1714. flush_scheduled_work();
  1715. }
  1716.  
  1717. struct IrqContext
  1718. {
  1719. unsigned int irq;
  1720. KIrqHandler handler;
  1721. void* data;
  1722. };
  1723.  
  1724.  
  1725.  
  1726. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
  1727. static irqreturn_t irq_handler(int irq, void *context)
  1728. #else
  1729. static irqreturn_t irq_handler(int irq, void *context, struct pt_regs *regs)
  1730. #endif
  1731.  
  1732. {
  1733. int handled = 0;
  1734. struct IrqContext *ic = context;
  1735.  
  1736.  
  1737. if( !ic || !ic->handler ) return IRQ_RETVAL(handled);
  1738. handled = (ic->handler(ic->data)==0)? 1 : 0;
  1739.  
  1740. return IRQ_RETVAL(handled);
  1741. }
  1742.  
  1743. KIrqObject SysRequestIrq(unsigned int irq, KIrqHandler handler,
  1744. const char *name, void *data)
  1745. {
  1746. int ret = 0;
  1747. struct IrqContext *ic = SysKMalloc(sizeof(*ic), eKMALLOC_KERNEL);
  1748.  
  1749. if( !ic ) return NULL;
  1750. ic->irq = irq;
  1751. ic->handler = handler;
  1752. ic->data = data;
  1753.  
  1754. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
  1755. ret = request_irq(irq, irq_handler, SA_SHIRQ|SA_INTERRUPT, name, ic);
  1756. #else
  1757. ret = request_irq(irq, irq_handler, IRQF_SHARED, name, ic);
  1758. #endif
  1759. if( ret ) {
  1760. DBG_fOSDEP("request_irq failed with %d\n", ret);
  1761. SysKFree(ic);
  1762. return NULL;
  1763. }
  1764.  
  1765. return (KIrqObject)ic;
  1766. }
  1767.  
  1768. void SysFreeIrq(KIrqObject obj)
  1769. {
  1770. struct IrqContext *ic = obj;
  1771.  
  1772. if( !ic ) return;
  1773.  
  1774. free_irq(ic->irq, ic);
  1775. SysKFree(ic);
  1776. }
  1777.  
  1778. int SysPciEnableMsi(pPci_dev pci)
  1779. {
  1780. #ifdef CONFIG_PCI_MSI
  1781. struct pci_dev *pci_dev = (struct pci_dev *)pci;
  1782. return pci_enable_msi(pci_dev);
  1783. #else
  1784. return 0;
  1785. #endif
  1786. }
  1787.  
  1788. void SysPciDisableMsi(pPci_dev pci)
  1789. {
  1790. #ifdef CONFIG_PCI_MSI
  1791. struct pci_dev *pci_dev = (struct pci_dev *)pci;
  1792. pci_disable_msi(pci_dev);
  1793. #else
  1794. return;
  1795. #endif
  1796. }
  1797.  
  1798. int SysInitCompletion(pCompletion *pobj)
  1799. {
  1800. struct completion *comp = kmalloc(sizeof(*comp), GFP_KERNEL);
  1801. DBG_fOSDEP("obj=%p\n", comp);
  1802.  
  1803. if( !comp ) return -ENOMEM;
  1804.  
  1805. init_completion(comp);
  1806. *pobj = (void *)comp;
  1807.  
  1808. return 0;
  1809. }
  1810.  
  1811.  
  1812. int SysReInitCompletion(pCompletion pobj)
  1813. {
  1814. struct completion *comp = pobj;
  1815. DBG_fOSDEP("obj=%p\n", comp);
  1816. if( !comp ) return -EINVAL;
  1817.  
  1818. init_completion(comp);
  1819. return 0;
  1820. }
  1821.  
  1822.  
  1823. int SysCompleteAndExit(pCompletion obj, int retval)
  1824. {
  1825. DBG_fOSDEP("obj=%p\n", obj);
  1826. if( !obj ) return -EINVAL;
  1827. complete_and_exit((struct completion *)obj, retval);
  1828. return 0;
  1829. }
  1830.  
  1831. int SysComplete(pCompletion obj)
  1832. {
  1833. DBG_fOSDEP("obj=%p\n", obj);
  1834. if( !obj ) return -EINVAL;
  1835. complete((struct completion *)obj);
  1836. return 0;
  1837. }
  1838.  
  1839. int SysCompleteAll(pCompletion obj)
  1840. {
  1841. DBG_fOSDEP("obj=%p\n", obj);
  1842. if( !obj ) return -EINVAL;
  1843. complete_all((struct completion *)obj);
  1844. return 0;
  1845. }
  1846.  
  1847. int SysWaitForCompletion(pCompletion obj)
  1848. {
  1849. DBG_fOSDEP("obj=%p\n", obj);
  1850. wait_for_completion((struct completion *)obj);
  1851. DBG_fOSDEP("obj=%p, done\n", obj);
  1852. return 0;
  1853. }
  1854.  
  1855.  
  1856.  
  1857. long SysWaitForCompletionTimeout(pCompletion obj, int timeoutMiliSec)
  1858. {
  1859. unsigned long timeout;
  1860. long ret;
  1861. DBG_fOSDEP("obj=%p, timeout=%ld\n", obj, timeoutMiliSec);
  1862. timeout = (timeoutMiliSec*HZ)/1000;
  1863. ret = wait_for_completion_timeout((struct completion *)obj, timeout);
  1864. DBG_fOSDEP("obj=%p, done\n", obj);
  1865. return ret;
  1866. }
  1867.  
  1868.  
  1869. void SysFiniCompletion(pCompletion obj)
  1870. {
  1871. DBG_fOSDEP("obj=%p\n", obj);
  1872. kfree(obj);
  1873. }
  1874.  
  1875. int SysFileFlagIsNonBlock(void *f)
  1876. {
  1877. struct file *file = f;
  1878.  
  1879. return (file->f_flags & O_NONBLOCK);
  1880. }
  1881.  
  1882. void SysGetTimeOfDay(struct timeval *tv)
  1883. {
  1884. do_gettimeofday(tv);
  1885. }
  1886.  
  1887.  
  1888.  
  1889. int SysAtomicInit(pAtomic *patm)
  1890. {
  1891. atomic_t *pv = NULL;
  1892.  
  1893. if( !patm ) return -EINVAL;
  1894.  
  1895.  
  1896. pv = SysKMalloc(sizeof(atomic_t), eKMALLOC_KERNEL);
  1897. if( !pv ) return -ENOMEM;
  1898.  
  1899. atomic_set(pv, 0);
  1900. *patm = (void *)pv;
  1901. return 0;
  1902. }
  1903.  
  1904. void SysAtomicSet(pAtomic atm, int value)
  1905. {
  1906. atomic_set((atomic_t *)atm, value);
  1907. }
  1908.  
  1909. int SysAtomicGet(pAtomic atm)
  1910. {
  1911. return atomic_read((atomic_t *)atm);
  1912. }
  1913.  
  1914. void SysAtomicAdd(int value, pAtomic atm)
  1915. {
  1916. atomic_add(value, (atomic_t *)atm);
  1917. }
  1918.  
  1919. void SysAtomicSub(int value, pAtomic atm)
  1920. {
  1921. atomic_sub(value, (atomic_t *)atm);
  1922. }
  1923.  
  1924. void SysAtomicFini(pAtomic atm)
  1925. {
  1926.  
  1927. SysKFree(atm);
  1928. }
  1929.  
  1930.  
  1931.  
  1932.  
  1933. int SysAtomicAddReturn(int value, pAtomic atm)
  1934. {
  1935. return atomic_add_return(value, atm);
  1936. }
  1937.  
  1938. int SysAtomicSubReturn(int value, pAtomic atm)
  1939. {
  1940. return atomic_sub_return(value, atm);
  1941. }
  1942.  
  1943.  
  1944.  
  1945. void *SysGetCurrent(void)
  1946. {
  1947. return (void *)(current);
  1948. }
  1949.  
  1950.  
  1951.  
  1952.  
  1953. void SysSendSignalToSelf(int sig)
  1954. {
  1955. send_sig(sig, current, 0);
  1956. }
  1957.  
  1958.  
  1959.  
  1960.  
  1961.  
  1962.  
  1963. #ifndef CONFIG_CC_STACKPROTECTOR
  1964. void __stack_chk_fail(void)
  1965. {
  1966. return;
  1967. }
  1968. #endif
  1969.  
  1970.  
  1971.  
  1972.  
  1973. const char * aver_usb_board_name[] = {
  1974. [DiBcom_7700] = "Dibcom 7700",
  1975. [DiBcom_LDR7700]= "Dibcom 7700",
  1976. [Buffalo_M803] = "M803",
  1977. [AVer_A300] = "A300",
  1978. [AVer_A300LDR] = "A300",
  1979. [AVer_A302] = "A302",
  1980. [AVer_A302LDR] = "A302",
  1981. [AVer_A808] = "A808",
  1982. [AVer_A808LDR] = "A808",
  1983. [AVer_E568] = "E568",
  1984. [AVer_B300] = "A300",
  1985. [AVer_B302] = "A302",
  1986. [AVer_B808] = "A808",
  1987. [AVer_B568] = "E568",
  1988. [AVer_A828] = "A828",
  1989. [AVer_A301] = "A301",
  1990. [AVer_A333] = "A333",
  1991. [AVer_A825] = "A825",
  1992. [AVer_C038] = "C038",
  1993. [AVer_H8261] = "H826",
  1994. [AVer_H8262] = "H826",
  1995. [AVer_H826D1] = "H826D",
  1996. [AVer_H826D2] = "H826D",
  1997. [AVer_H826D3] = "H826D",
  1998. [AVer_A321D] = "A321D",
  1999. [AVer_A321] = "A321",
  2000. [AVer_A827] = "A827",
  2001. [AVer_A827J] = "A827",
  2002. [AVer_A827A1] = "A827",
  2003. [AVer_A827A2] = "A827",
  2004. [AVer_A827A3] = "A827",
  2005. [AVer_Max_Board_ID] = "Unknown"
  2006. };
  2007.  
  2008.  
  2009.  
  2010. const char *SysGetV4L2IOCTLName(unsigned int ioctl)
  2011. {
  2012. switch(ioctl) {
  2013.  
  2014. case VIDIOC_QUERYCAP : return "VIDIOC_QUERYCAP";
  2015. case VIDIOC_RESERVED : return "VIDIOC_RESERVED";
  2016. case VIDIOC_ENUM_FMT : return "VIDIOC_ENUM_FMT";
  2017. case VIDIOC_G_FMT : return "VIDIOC_G_FMT";
  2018. case VIDIOC_S_FMT : return "VIDIOC_S_FMT";
  2019. case VIDIOC_REQBUFS : return "VIDIOC_REQBUFS";
  2020. case VIDIOC_QUERYBUF : return "VIDIOC_QUERYBUF";
  2021. case VIDIOC_G_FBUF : return "VIDIOC_G_FBUF";
  2022. case VIDIOC_S_FBUF : return "VIDIOC_S_FBUF";
  2023. case VIDIOC_OVERLAY : return "VIDIOC_OVERLAY";
  2024. case VIDIOC_QBUF : return "VIDIOC_QBUF";
  2025. case VIDIOC_DQBUF : return "VIDIOC_DQBUF";
  2026. case VIDIOC_STREAMON : return "VIDIOC_STREAMON";
  2027. case VIDIOC_STREAMOFF : return "VIDIOC_STREAMOFF";
  2028. case VIDIOC_G_PARM : return "VIDIOC_G_PARM";
  2029. case VIDIOC_S_PARM : return "VIDIOC_S_PARM";
  2030. case VIDIOC_G_STD : return "VIDIOC_G_STD";
  2031. case VIDIOC_S_STD : return "VIDIOC_S_STD";
  2032. case VIDIOC_ENUMSTD : return "VIDIOC_ENUMSTD";
  2033. case VIDIOC_ENUMINPUT : return "VIDIOC_ENUMINPUT";
  2034. case VIDIOC_G_CTRL : return "VIDIOC_G_CTRL";
  2035. case VIDIOC_S_CTRL : return "VIDIOC_S_CTRL";
  2036. case VIDIOC_G_TUNER : return "VIDIOC_G_TUNER";
  2037. case VIDIOC_S_TUNER : return "VIDIOC_S_TUNER";
  2038. case VIDIOC_G_AUDIO : return "VIDIOC_G_AUDIO";
  2039. case VIDIOC_S_AUDIO : return "VIDIOC_S_AUDIO";
  2040. case VIDIOC_QUERYCTRL : return "VIDIOC_QUERYCTRL";
  2041. case VIDIOC_QUERYMENU : return "VIDIOC_QUERYMENU";
  2042. case VIDIOC_G_INPUT : return "VIDIOC_G_INPUT";
  2043. case VIDIOC_S_INPUT : return "VIDIOC_S_INPUT";
  2044. case VIDIOC_G_OUTPUT : return "VIDIOC_G_OUTPUT";
  2045. case VIDIOC_S_OUTPUT : return "VIDIOC_S_OUTPUT";
  2046. case VIDIOC_ENUMOUTPUT : return "VIDIOC_ENUMOUTPUT";
  2047. case VIDIOC_G_AUDOUT : return "VIDIOC_G_AUDOUT";
  2048. case VIDIOC_S_AUDOUT : return "VIDIOC_S_AUDOUT";
  2049. case VIDIOC_G_MODULATOR : return "VIDIOC_G_MODULATOR";
  2050. case VIDIOC_S_MODULATOR : return "VIDIOC_S_MODULATOR";
  2051. case VIDIOC_G_FREQUENCY : return "VIDIOC_G_FREQUENCY";
  2052. case VIDIOC_S_FREQUENCY : return "VIDIOC_S_FREQUENCY";
  2053. case VIDIOC_CROPCAP : return "VIDIOC_CROPCAP";
  2054. case VIDIOC_G_CROP : return "VIDIOC_G_CROP";
  2055. case VIDIOC_S_CROP : return "VIDIOC_S_CROP";
  2056. case VIDIOC_G_JPEGCOMP : return "VIDIOC_G_JPEGCOMP";
  2057. case VIDIOC_S_JPEGCOMP : return "VIDIOC_S_JPEGCOMP";
  2058. case VIDIOC_QUERYSTD : return "VIDIOC_QUERYSTD";
  2059. case VIDIOC_TRY_FMT : return "VIDIOC_TRY_FMT";
  2060. case VIDIOC_ENUMAUDIO : return "VIDIOC_ENUMAUDIO";
  2061. case VIDIOC_ENUMAUDOUT : return "VIDIOC_ENUMAUDOUT";
  2062. case VIDIOC_G_PRIORITY : return "VIDIOC_G_PRIORITY";
  2063. case VIDIOC_S_PRIORITY : return "VIDIOC_S_PRIORITY";
  2064. case VIDIOC_G_SLICED_VBI_CAP : return "VIDIOC_G_SLICED_VBI_CAP";
  2065. case VIDIOC_LOG_STATUS : return "VIDIOC_LOG_STATUS";
  2066.  
  2067. #ifdef VIDIOC_G_EXT_CTRLS
  2068. case VIDIOC_G_EXT_CTRLS : return "VIDIOC_G_EXT_CTRLS";
  2069. #endif
  2070.  
  2071. #ifdef VIDIOC_S_EXT_CTRLS
  2072. case VIDIOC_S_EXT_CTRLS : return "VIDIOC_S_EXT_CTRLS";
  2073. #endif
  2074.  
  2075. #ifdef VIDIOC_TRY_EXT_CTRLS
  2076. case VIDIOC_TRY_EXT_CTRLS : return "VIDIOC_TRY_EXT_CTRLS";
  2077. #endif
  2078.  
  2079. #ifdef VIDIOC_ENUM_FRAMESIZES
  2080. case VIDIOC_ENUM_FRAMESIZES : return "VIDIOC_ENUM_FRAMESIZES";
  2081. #endif
  2082.  
  2083. #ifdef VIDIOC_ENUM_FRAMEINTERVALS
  2084. case VIDIOC_ENUM_FRAMEINTERVALS : return "VIDIOC_ENUM_FRAMEINTERVALS";
  2085. #endif
  2086.  
  2087. #ifdef VIDIOC_G_ENC_INDEX
  2088. case VIDIOC_G_ENC_INDEX : return "VIDIOC_G_ENC_INDEX";
  2089. #endif
  2090.  
  2091. #ifdef VIDIOC_ENCODER_CMD
  2092. case VIDIOC_ENCODER_CMD : return "VIDIOC_ENCODER_CMD";
  2093. #endif
  2094.  
  2095. #ifdef VIDIOC_TRY_ENCODER_CMD
  2096. case VIDIOC_TRY_ENCODER_CMD : return "VIDIOC_TRY_ENCODER_CMD";
  2097. #endif
  2098.  
  2099. #ifdef VIDIOC_G_CHIP_IDENT
  2100. case VIDIOC_G_CHIP_IDENT : return "VIDIOC_G_CHIP_IDENT";
  2101. #endif
  2102.  
  2103. #ifdef VIDIOC_S_HW_FREQ_SEEK
  2104. case VIDIOC_S_HW_FREQ_SEEK : return "VIDIOC_S_HW_FREQ_SEEK";
  2105. #endif
  2106.  
  2107. #ifdef __OLD_VIDIOC_
  2108. case VIDIOC_OVERLAY_OLD : return "VIDIOC_OVERLAY_OLD";
  2109. case VIDIOC_S_PARM_OLD : return "VIDIOC_S_PARM_OLD";
  2110. case VIDIOC_S_CTRL_OLD : return "VIDIOC_S_CTRL_OLD";
  2111. case VIDIOC_G_AUDIO_OLD : return "VIDIOC_G_AUDIO_OLD";
  2112. case VIDIOC_G_AUDOUT_OLD : return "VIDIOC_G_AUDOUT_OLD";
  2113. case VIDIOC_CROPCAP_OLD : return "VIDIOC_CROPCAP_OLD";
  2114. #endif
  2115. default: return "Unknown IOCtrl";
  2116. }
  2117.  
  2118. return "Unknown IOCtrl";
  2119. }
  2120.  
  2121.  
  2122.  
  2123.  
  2124.  
  2125. DEFINE_SPINLOCK(g_spinlock_raw_0);
  2126. DEFINE_SPINLOCK(g_spinlock_raw_1);
  2127. DEFINE_SPINLOCK(g_spinlock_raw_2);
  2128. DEFINE_SPINLOCK(g_spinlock_raw_3);
  2129. DEFINE_SPINLOCK(g_spinlock_raw_4);
  2130. DEFINE_SPINLOCK(g_spinlock_raw_5);
  2131. DEFINE_SPINLOCK(g_spinlock_raw_6);
  2132. DEFINE_SPINLOCK(g_spinlock_raw_7);
  2133. DEFINE_SPINLOCK(g_spinlock_raw_8);
  2134. DEFINE_SPINLOCK(g_spinlock_raw_9);
  2135. DEFINE_SPINLOCK(g_spinlock_raw_10);
  2136. DEFINE_SPINLOCK(g_spinlock_raw_11);
  2137. DEFINE_SPINLOCK(g_spinlock_raw_12);
  2138. DEFINE_SPINLOCK(g_spinlock_raw_13);
  2139. DEFINE_SPINLOCK(g_spinlock_raw_14);
  2140. DEFINE_SPINLOCK(g_spinlock_raw_15);
  2141. DEFINE_SPINLOCK(g_spinlock_raw_16);
  2142. DEFINE_SPINLOCK(g_spinlock_raw_17);
  2143. DEFINE_SPINLOCK(g_spinlock_raw_18);
  2144. DEFINE_SPINLOCK(g_spinlock_raw_19);
  2145. DEFINE_SPINLOCK(g_spinlock_raw_20);
  2146. DEFINE_SPINLOCK(g_spinlock_raw_21);
  2147. DEFINE_SPINLOCK(g_spinlock_raw_22);
  2148. DEFINE_SPINLOCK(g_spinlock_raw_23);
  2149. DEFINE_SPINLOCK(g_spinlock_raw_24);
  2150. DEFINE_SPINLOCK(g_spinlock_raw_25);
  2151. DEFINE_SPINLOCK(g_spinlock_raw_26);
  2152. DEFINE_SPINLOCK(g_spinlock_raw_27);
  2153. DEFINE_SPINLOCK(g_spinlock_raw_28);
  2154. DEFINE_SPINLOCK(g_spinlock_raw_29);
  2155. DEFINE_SPINLOCK(g_spinlock_raw_30);
  2156. DEFINE_SPINLOCK(g_spinlock_raw_31);
  2157. DEFINE_SPINLOCK(g_spinlock_raw_32);
  2158. DEFINE_SPINLOCK(g_spinlock_raw_33);
  2159. DEFINE_SPINLOCK(g_spinlock_raw_34);
  2160. DEFINE_SPINLOCK(g_spinlock_raw_35);
  2161. DEFINE_SPINLOCK(g_spinlock_raw_36);
  2162. DEFINE_SPINLOCK(g_spinlock_raw_37);
  2163. DEFINE_SPINLOCK(g_spinlock_raw_38);
  2164. DEFINE_SPINLOCK(g_spinlock_raw_39);
  2165. DEFINE_SPINLOCK(g_spinlock_raw_40);
  2166. DEFINE_SPINLOCK(g_spinlock_raw_41);
  2167. DEFINE_SPINLOCK(g_spinlock_raw_42);
  2168. DEFINE_SPINLOCK(g_spinlock_raw_43);
  2169. DEFINE_SPINLOCK(g_spinlock_raw_44);
  2170. DEFINE_SPINLOCK(g_spinlock_raw_45);
  2171. DEFINE_SPINLOCK(g_spinlock_raw_46);
  2172. DEFINE_SPINLOCK(g_spinlock_raw_47);
  2173. DEFINE_SPINLOCK(g_spinlock_raw_48);
  2174. DEFINE_SPINLOCK(g_spinlock_raw_49);
  2175. DEFINE_SPINLOCK(g_spinlock_raw_50);
  2176. DEFINE_SPINLOCK(g_spinlock_raw_51);
  2177. DEFINE_SPINLOCK(g_spinlock_raw_52);
  2178. DEFINE_SPINLOCK(g_spinlock_raw_53);
  2179. DEFINE_SPINLOCK(g_spinlock_raw_54);
  2180. DEFINE_SPINLOCK(g_spinlock_raw_55);
  2181. DEFINE_SPINLOCK(g_spinlock_raw_56);
  2182. DEFINE_SPINLOCK(g_spinlock_raw_57);
  2183. DEFINE_SPINLOCK(g_spinlock_raw_58);
  2184. DEFINE_SPINLOCK(g_spinlock_raw_59);
  2185. DEFINE_SPINLOCK(g_spinlock_raw_60);
  2186. DEFINE_SPINLOCK(g_spinlock_raw_61);
  2187. DEFINE_SPINLOCK(g_spinlock_raw_62);
  2188. DEFINE_SPINLOCK(g_spinlock_raw_63);
  2189. DEFINE_SPINLOCK(g_spinlock_raw_64);
  2190. DEFINE_SPINLOCK(g_spinlock_raw_65);
  2191. DEFINE_SPINLOCK(g_spinlock_raw_66);
  2192. DEFINE_SPINLOCK(g_spinlock_raw_67);
  2193. DEFINE_SPINLOCK(g_spinlock_raw_68);
  2194. DEFINE_SPINLOCK(g_spinlock_raw_69);
  2195. DEFINE_SPINLOCK(g_spinlock_raw_70);
  2196. DEFINE_SPINLOCK(g_spinlock_raw_71);
  2197. DEFINE_SPINLOCK(g_spinlock_raw_72);
  2198. DEFINE_SPINLOCK(g_spinlock_raw_73);
  2199. DEFINE_SPINLOCK(g_spinlock_raw_74);
  2200. DEFINE_SPINLOCK(g_spinlock_raw_75);
  2201. DEFINE_SPINLOCK(g_spinlock_raw_76);
  2202. DEFINE_SPINLOCK(g_spinlock_raw_77);
  2203. DEFINE_SPINLOCK(g_spinlock_raw_78);
  2204. DEFINE_SPINLOCK(g_spinlock_raw_79);
  2205. DEFINE_SPINLOCK(g_spinlock_raw_80);
  2206. DEFINE_SPINLOCK(g_spinlock_raw_81);
  2207. DEFINE_SPINLOCK(g_spinlock_raw_82);
  2208. DEFINE_SPINLOCK(g_spinlock_raw_83);
  2209. DEFINE_SPINLOCK(g_spinlock_raw_84);
  2210. DEFINE_SPINLOCK(g_spinlock_raw_85);
  2211. DEFINE_SPINLOCK(g_spinlock_raw_86);
  2212. DEFINE_SPINLOCK(g_spinlock_raw_87);
  2213. DEFINE_SPINLOCK(g_spinlock_raw_88);
  2214. DEFINE_SPINLOCK(g_spinlock_raw_89);
  2215. DEFINE_SPINLOCK(g_spinlock_raw_90);
  2216. DEFINE_SPINLOCK(g_spinlock_raw_91);
  2217. DEFINE_SPINLOCK(g_spinlock_raw_92);
  2218. DEFINE_SPINLOCK(g_spinlock_raw_93);
  2219. DEFINE_SPINLOCK(g_spinlock_raw_94);
  2220. DEFINE_SPINLOCK(g_spinlock_raw_95);
  2221. DEFINE_SPINLOCK(g_spinlock_raw_96);
  2222. DEFINE_SPINLOCK(g_spinlock_raw_97);
  2223. DEFINE_SPINLOCK(g_spinlock_raw_98);
  2224. DEFINE_SPINLOCK(g_spinlock_raw_99);
  2225. DEFINE_SPINLOCK(g_spinlock_raw_100);
  2226. DEFINE_SPINLOCK(g_spinlock_raw_101);
  2227. DEFINE_SPINLOCK(g_spinlock_raw_102);
  2228. DEFINE_SPINLOCK(g_spinlock_raw_103);
  2229. DEFINE_SPINLOCK(g_spinlock_raw_104);
  2230. DEFINE_SPINLOCK(g_spinlock_raw_105);
  2231. DEFINE_SPINLOCK(g_spinlock_raw_106);
  2232. DEFINE_SPINLOCK(g_spinlock_raw_107);
  2233. DEFINE_SPINLOCK(g_spinlock_raw_108);
  2234. DEFINE_SPINLOCK(g_spinlock_raw_109);
  2235. DEFINE_SPINLOCK(g_spinlock_raw_110);
  2236. DEFINE_SPINLOCK(g_spinlock_raw_111);
  2237. DEFINE_SPINLOCK(g_spinlock_raw_112);
  2238. DEFINE_SPINLOCK(g_spinlock_raw_113);
  2239. DEFINE_SPINLOCK(g_spinlock_raw_114);
  2240. DEFINE_SPINLOCK(g_spinlock_raw_115);
  2241. DEFINE_SPINLOCK(g_spinlock_raw_116);
  2242. DEFINE_SPINLOCK(g_spinlock_raw_117);
  2243. DEFINE_SPINLOCK(g_spinlock_raw_118);
  2244. DEFINE_SPINLOCK(g_spinlock_raw_119);
  2245. DEFINE_SPINLOCK(g_spinlock_raw_120);
  2246. DEFINE_SPINLOCK(g_spinlock_raw_121);
  2247. DEFINE_SPINLOCK(g_spinlock_raw_122);
  2248. DEFINE_SPINLOCK(g_spinlock_raw_123);
  2249. DEFINE_SPINLOCK(g_spinlock_raw_124);
  2250. DEFINE_SPINLOCK(g_spinlock_raw_125);
  2251. DEFINE_SPINLOCK(g_spinlock_raw_126);
  2252. DEFINE_SPINLOCK(g_spinlock_raw_127);
  2253. DEFINE_SPINLOCK(g_spinlock_raw_128);
  2254. DEFINE_SPINLOCK(g_spinlock_raw_129);
  2255. DEFINE_SPINLOCK(g_spinlock_raw_130);
  2256. DEFINE_SPINLOCK(g_spinlock_raw_131);
  2257. DEFINE_SPINLOCK(g_spinlock_raw_132);
  2258. DEFINE_SPINLOCK(g_spinlock_raw_133);
  2259. DEFINE_SPINLOCK(g_spinlock_raw_134);
  2260. DEFINE_SPINLOCK(g_spinlock_raw_135);
  2261. DEFINE_SPINLOCK(g_spinlock_raw_136);
  2262. DEFINE_SPINLOCK(g_spinlock_raw_137);
  2263. DEFINE_SPINLOCK(g_spinlock_raw_138);
  2264. DEFINE_SPINLOCK(g_spinlock_raw_139);
  2265. DEFINE_SPINLOCK(g_spinlock_raw_140);
  2266. DEFINE_SPINLOCK(g_spinlock_raw_141);
  2267. DEFINE_SPINLOCK(g_spinlock_raw_142);
  2268. DEFINE_SPINLOCK(g_spinlock_raw_143);
  2269. DEFINE_SPINLOCK(g_spinlock_raw_144);
  2270. DEFINE_SPINLOCK(g_spinlock_raw_145);
  2271. DEFINE_SPINLOCK(g_spinlock_raw_146);
  2272. DEFINE_SPINLOCK(g_spinlock_raw_147);
  2273. DEFINE_SPINLOCK(g_spinlock_raw_148);
  2274. DEFINE_SPINLOCK(g_spinlock_raw_149);
  2275. DEFINE_SPINLOCK(g_spinlock_raw_150);
  2276. DEFINE_SPINLOCK(g_spinlock_raw_151);
  2277. DEFINE_SPINLOCK(g_spinlock_raw_152);
  2278. DEFINE_SPINLOCK(g_spinlock_raw_153);
  2279. DEFINE_SPINLOCK(g_spinlock_raw_154);
  2280. DEFINE_SPINLOCK(g_spinlock_raw_155);
  2281. DEFINE_SPINLOCK(g_spinlock_raw_156);
  2282. DEFINE_SPINLOCK(g_spinlock_raw_157);
  2283. DEFINE_SPINLOCK(g_spinlock_raw_158);
  2284. DEFINE_SPINLOCK(g_spinlock_raw_159);
  2285. DEFINE_SPINLOCK(g_spinlock_raw_160);
  2286. DEFINE_SPINLOCK(g_spinlock_raw_161);
  2287. DEFINE_SPINLOCK(g_spinlock_raw_162);
  2288. DEFINE_SPINLOCK(g_spinlock_raw_163);
  2289. DEFINE_SPINLOCK(g_spinlock_raw_164);
  2290. DEFINE_SPINLOCK(g_spinlock_raw_165);
  2291. DEFINE_SPINLOCK(g_spinlock_raw_166);
  2292. DEFINE_SPINLOCK(g_spinlock_raw_167);
  2293. DEFINE_SPINLOCK(g_spinlock_raw_168);
  2294. DEFINE_SPINLOCK(g_spinlock_raw_169);
  2295. DEFINE_SPINLOCK(g_spinlock_raw_170);
  2296. DEFINE_SPINLOCK(g_spinlock_raw_171);
  2297. DEFINE_SPINLOCK(g_spinlock_raw_172);
  2298. DEFINE_SPINLOCK(g_spinlock_raw_173);
  2299. DEFINE_SPINLOCK(g_spinlock_raw_174);
  2300. DEFINE_SPINLOCK(g_spinlock_raw_175);
  2301. DEFINE_SPINLOCK(g_spinlock_raw_176);
  2302. DEFINE_SPINLOCK(g_spinlock_raw_177);
  2303. DEFINE_SPINLOCK(g_spinlock_raw_178);
  2304. DEFINE_SPINLOCK(g_spinlock_raw_179);
  2305. DEFINE_SPINLOCK(g_spinlock_raw_180);
  2306. DEFINE_SPINLOCK(g_spinlock_raw_181);
  2307. DEFINE_SPINLOCK(g_spinlock_raw_182);
  2308. DEFINE_SPINLOCK(g_spinlock_raw_183);
  2309. DEFINE_SPINLOCK(g_spinlock_raw_184);
  2310. DEFINE_SPINLOCK(g_spinlock_raw_185);
  2311. DEFINE_SPINLOCK(g_spinlock_raw_186);
  2312. DEFINE_SPINLOCK(g_spinlock_raw_187);
  2313. DEFINE_SPINLOCK(g_spinlock_raw_188);
  2314. DEFINE_SPINLOCK(g_spinlock_raw_189);
  2315. DEFINE_SPINLOCK(g_spinlock_raw_190);
  2316. DEFINE_SPINLOCK(g_spinlock_raw_191);
  2317. DEFINE_SPINLOCK(g_spinlock_raw_192);
  2318. DEFINE_SPINLOCK(g_spinlock_raw_193);
  2319. DEFINE_SPINLOCK(g_spinlock_raw_194);
  2320. DEFINE_SPINLOCK(g_spinlock_raw_195);
  2321. DEFINE_SPINLOCK(g_spinlock_raw_196);
  2322. DEFINE_SPINLOCK(g_spinlock_raw_197);
  2323. DEFINE_SPINLOCK(g_spinlock_raw_198);
  2324. DEFINE_SPINLOCK(g_spinlock_raw_199);
  2325. DEFINE_SPINLOCK(g_spinlock_raw_200);
  2326. DEFINE_SPINLOCK(g_spinlock_raw_201);
  2327. DEFINE_SPINLOCK(g_spinlock_raw_202);
  2328. DEFINE_SPINLOCK(g_spinlock_raw_203);
  2329. DEFINE_SPINLOCK(g_spinlock_raw_204);
  2330. DEFINE_SPINLOCK(g_spinlock_raw_205);
  2331. DEFINE_SPINLOCK(g_spinlock_raw_206);
  2332. DEFINE_SPINLOCK(g_spinlock_raw_207);
  2333. DEFINE_SPINLOCK(g_spinlock_raw_208);
  2334. DEFINE_SPINLOCK(g_spinlock_raw_209);
  2335. DEFINE_SPINLOCK(g_spinlock_raw_210);
  2336. DEFINE_SPINLOCK(g_spinlock_raw_211);
  2337. DEFINE_SPINLOCK(g_spinlock_raw_212);
  2338. DEFINE_SPINLOCK(g_spinlock_raw_213);
  2339. DEFINE_SPINLOCK(g_spinlock_raw_214);
  2340. DEFINE_SPINLOCK(g_spinlock_raw_215);
  2341. DEFINE_SPINLOCK(g_spinlock_raw_216);
  2342. DEFINE_SPINLOCK(g_spinlock_raw_217);
  2343. DEFINE_SPINLOCK(g_spinlock_raw_218);
  2344. DEFINE_SPINLOCK(g_spinlock_raw_219);
  2345. DEFINE_SPINLOCK(g_spinlock_raw_220);
  2346. DEFINE_SPINLOCK(g_spinlock_raw_221);
  2347. DEFINE_SPINLOCK(g_spinlock_raw_222);
  2348. DEFINE_SPINLOCK(g_spinlock_raw_223);
  2349. DEFINE_SPINLOCK(g_spinlock_raw_224);
  2350. DEFINE_SPINLOCK(g_spinlock_raw_225);
  2351. DEFINE_SPINLOCK(g_spinlock_raw_226);
  2352. DEFINE_SPINLOCK(g_spinlock_raw_227);
  2353. DEFINE_SPINLOCK(g_spinlock_raw_228);
  2354. DEFINE_SPINLOCK(g_spinlock_raw_229);
  2355. DEFINE_SPINLOCK(g_spinlock_raw_230);
  2356. DEFINE_SPINLOCK(g_spinlock_raw_231);
  2357. DEFINE_SPINLOCK(g_spinlock_raw_232);
  2358. DEFINE_SPINLOCK(g_spinlock_raw_233);
  2359. DEFINE_SPINLOCK(g_spinlock_raw_234);
  2360. DEFINE_SPINLOCK(g_spinlock_raw_235);
  2361. DEFINE_SPINLOCK(g_spinlock_raw_236);
  2362. DEFINE_SPINLOCK(g_spinlock_raw_237);
  2363. DEFINE_SPINLOCK(g_spinlock_raw_238);
  2364. DEFINE_SPINLOCK(g_spinlock_raw_239);
  2365. DEFINE_SPINLOCK(g_spinlock_raw_240);
  2366. DEFINE_SPINLOCK(g_spinlock_raw_241);
  2367. DEFINE_SPINLOCK(g_spinlock_raw_242);
  2368. DEFINE_SPINLOCK(g_spinlock_raw_243);
  2369. DEFINE_SPINLOCK(g_spinlock_raw_244);
  2370. DEFINE_SPINLOCK(g_spinlock_raw_245);
  2371. DEFINE_SPINLOCK(g_spinlock_raw_246);
  2372. DEFINE_SPINLOCK(g_spinlock_raw_247);
  2373. DEFINE_SPINLOCK(g_spinlock_raw_248);
  2374. DEFINE_SPINLOCK(g_spinlock_raw_249);
  2375. DEFINE_SPINLOCK(g_spinlock_raw_250);
  2376. DEFINE_SPINLOCK(g_spinlock_raw_251);
  2377. DEFINE_SPINLOCK(g_spinlock_raw_252);
  2378. DEFINE_SPINLOCK(g_spinlock_raw_253);
  2379. DEFINE_SPINLOCK(g_spinlock_raw_254);
  2380. DEFINE_SPINLOCK(g_spinlock_raw_255);
  2381.  
  2382. typedef struct _aver_spinlock_t
  2383. {
  2384. spinlock_t *lock;
  2385. unsigned int index;
  2386. int used;
  2387. }_aver_spinlock_t;
  2388.  
  2389. #define MAX_AVER_SPINLOCK 256
  2390. static struct _aver_spinlock_t g_spinlock_ar[MAX_AVER_SPINLOCK] =
  2391. {
  2392. [0]={ &g_spinlock_raw_0, 0, 0 }, [1]={ &g_spinlock_raw_1, 1, 0 },
  2393. [2]={ &g_spinlock_raw_2, 2, 0 }, [3]={ &g_spinlock_raw_3, 3, 0 },
  2394. [4]={ &g_spinlock_raw_4, 4, 0 }, [5]={ &g_spinlock_raw_5, 5, 0 },
  2395. [6]={ &g_spinlock_raw_6, 6, 0 }, [7]={ &g_spinlock_raw_7, 7, 0 },
  2396. [8]={ &g_spinlock_raw_8, 8, 0 }, [9]={ &g_spinlock_raw_9, 9, 0 },
  2397. [10]={ &g_spinlock_raw_10, 10, 0 }, [11]={ &g_spinlock_raw_11, 11, 0 },
  2398. [12]={ &g_spinlock_raw_12, 12, 0 }, [13]={ &g_spinlock_raw_13, 13, 0 },
  2399. [14]={ &g_spinlock_raw_14, 14, 0 }, [15]={ &g_spinlock_raw_15, 15, 0 },
  2400. [16]={ &g_spinlock_raw_16, 16, 0 }, [17]={ &g_spinlock_raw_17, 17, 0 },
  2401. [18]={ &g_spinlock_raw_18, 18, 0 }, [19]={ &g_spinlock_raw_19, 19, 0 },
  2402. [20]={ &g_spinlock_raw_20, 20, 0 }, [21]={ &g_spinlock_raw_21, 21, 0 },
  2403. [22]={ &g_spinlock_raw_22, 22, 0 }, [23]={ &g_spinlock_raw_23, 23, 0 },
  2404. [24]={ &g_spinlock_raw_24, 24, 0 }, [25]={ &g_spinlock_raw_25, 25, 0 },
  2405. [26]={ &g_spinlock_raw_26, 26, 0 }, [27]={ &g_spinlock_raw_27, 27, 0 },
  2406. [28]={ &g_spinlock_raw_28, 28, 0 }, [29]={ &g_spinlock_raw_29, 29, 0 },
  2407. [30]={ &g_spinlock_raw_30, 30, 0 }, [31]={ &g_spinlock_raw_31, 31, 0 },
  2408. [32]={ &g_spinlock_raw_32, 32, 0 }, [33]={ &g_spinlock_raw_33, 33, 0 },
  2409. [34]={ &g_spinlock_raw_34, 34, 0 }, [35]={ &g_spinlock_raw_35, 35, 0 },
  2410. [36]={ &g_spinlock_raw_36, 36, 0 }, [37]={ &g_spinlock_raw_37, 37, 0 },
  2411. [38]={ &g_spinlock_raw_38, 38, 0 }, [39]={ &g_spinlock_raw_39, 39, 0 },
  2412. [40]={ &g_spinlock_raw_40, 40, 0 }, [41]={ &g_spinlock_raw_41, 41, 0 },
  2413. [42]={ &g_spinlock_raw_42, 42, 0 }, [43]={ &g_spinlock_raw_43, 43, 0 },
  2414. [44]={ &g_spinlock_raw_44, 44, 0 }, [45]={ &g_spinlock_raw_45, 45, 0 },
  2415. [46]={ &g_spinlock_raw_46, 46, 0 }, [47]={ &g_spinlock_raw_47, 47, 0 },
  2416. [48]={ &g_spinlock_raw_48, 48, 0 }, [49]={ &g_spinlock_raw_49, 49, 0 },
  2417. [50]={ &g_spinlock_raw_50, 50, 0 }, [51]={ &g_spinlock_raw_51, 51, 0 },
  2418. [52]={ &g_spinlock_raw_52, 52, 0 }, [53]={ &g_spinlock_raw_53, 53, 0 },
  2419. [54]={ &g_spinlock_raw_54, 54, 0 }, [55]={ &g_spinlock_raw_55, 55, 0 },
  2420. [56]={ &g_spinlock_raw_56, 56, 0 }, [57]={ &g_spinlock_raw_57, 57, 0 },
  2421. [58]={ &g_spinlock_raw_58, 58, 0 }, [59]={ &g_spinlock_raw_59, 59, 0 },
  2422. [60]={ &g_spinlock_raw_60, 60, 0 }, [61]={ &g_spinlock_raw_61, 61, 0 },
  2423. [62]={ &g_spinlock_raw_62, 62, 0 }, [63]={ &g_spinlock_raw_63, 63, 0 },
  2424. [64]={ &g_spinlock_raw_64, 64, 0 }, [65]={ &g_spinlock_raw_65, 65, 0 },
  2425. [66]={ &g_spinlock_raw_66, 66, 0 }, [67]={ &g_spinlock_raw_67, 67, 0 },
  2426. [68]={ &g_spinlock_raw_68, 68, 0 }, [69]={ &g_spinlock_raw_69, 69, 0 },
  2427. [70]={ &g_spinlock_raw_70, 70, 0 }, [71]={ &g_spinlock_raw_71, 71, 0 },
  2428. [72]={ &g_spinlock_raw_72, 72, 0 }, [73]={ &g_spinlock_raw_73, 73, 0 },
  2429. [74]={ &g_spinlock_raw_74, 74, 0 }, [75]={ &g_spinlock_raw_75, 75, 0 },
  2430. [76]={ &g_spinlock_raw_76, 76, 0 }, [77]={ &g_spinlock_raw_77, 77, 0 },
  2431. [78]={ &g_spinlock_raw_78, 78, 0 }, [79]={ &g_spinlock_raw_79, 79, 0 },
  2432. [80]={ &g_spinlock_raw_80, 80, 0 }, [81]={ &g_spinlock_raw_81, 81, 0 },
  2433. [82]={ &g_spinlock_raw_82, 82, 0 }, [83]={ &g_spinlock_raw_83, 83, 0 },
  2434. [84]={ &g_spinlock_raw_84, 84, 0 }, [85]={ &g_spinlock_raw_85, 85, 0 },
  2435. [86]={ &g_spinlock_raw_86, 86, 0 }, [87]={ &g_spinlock_raw_87, 87, 0 },
  2436. [88]={ &g_spinlock_raw_88, 88, 0 }, [89]={ &g_spinlock_raw_89, 89, 0 },
  2437. [90]={ &g_spinlock_raw_90, 90, 0 }, [91]={ &g_spinlock_raw_91, 91, 0 },
  2438. [92]={ &g_spinlock_raw_92, 92, 0 }, [93]={ &g_spinlock_raw_93, 93, 0 },
  2439. [94]={ &g_spinlock_raw_94, 94, 0 }, [95]={ &g_spinlock_raw_95, 95, 0 },
  2440. [96]={ &g_spinlock_raw_96, 96, 0 }, [97]={ &g_spinlock_raw_97, 97, 0 },
  2441. [98]={ &g_spinlock_raw_98, 98, 0 }, [99]={ &g_spinlock_raw_99, 99, 0 },
  2442. [100]={ &g_spinlock_raw_100, 100, 0 }, [101]={ &g_spinlock_raw_101, 101, 0 },
  2443. [102]={ &g_spinlock_raw_102, 102, 0 }, [103]={ &g_spinlock_raw_103, 103, 0 },
  2444. [104]={ &g_spinlock_raw_104, 104, 0 }, [105]={ &g_spinlock_raw_105, 105, 0 },
  2445. [106]={ &g_spinlock_raw_106, 106, 0 }, [107]={ &g_spinlock_raw_107, 107, 0 },
  2446. [108]={ &g_spinlock_raw_108, 108, 0 }, [109]={ &g_spinlock_raw_109, 109, 0 },
  2447. [110]={ &g_spinlock_raw_110, 110, 0 }, [111]={ &g_spinlock_raw_111, 111, 0 },
  2448. [112]={ &g_spinlock_raw_112, 112, 0 }, [113]={ &g_spinlock_raw_113, 113, 0 },
  2449. [114]={ &g_spinlock_raw_114, 114, 0 }, [115]={ &g_spinlock_raw_115, 115, 0 },
  2450. [116]={ &g_spinlock_raw_116, 116, 0 }, [117]={ &g_spinlock_raw_117, 117, 0 },
  2451. [118]={ &g_spinlock_raw_118, 118, 0 }, [119]={ &g_spinlock_raw_119, 119, 0 },
  2452. [120]={ &g_spinlock_raw_120, 120, 0 }, [121]={ &g_spinlock_raw_121, 121, 0 },
  2453. [122]={ &g_spinlock_raw_122, 122, 0 }, [123]={ &g_spinlock_raw_123, 123, 0 },
  2454. [124]={ &g_spinlock_raw_124, 124, 0 }, [125]={ &g_spinlock_raw_125, 125, 0 },
  2455. [126]={ &g_spinlock_raw_126, 126, 0 }, [127]={ &g_spinlock_raw_127, 127, 0 },
  2456. [128]={ &g_spinlock_raw_128, 128, 0 }, [129]={ &g_spinlock_raw_129, 129, 0 },
  2457. [130]={ &g_spinlock_raw_130, 130, 0 }, [131]={ &g_spinlock_raw_131, 131, 0 },
  2458. [132]={ &g_spinlock_raw_132, 132, 0 }, [133]={ &g_spinlock_raw_133, 133, 0 },
  2459. [134]={ &g_spinlock_raw_134, 134, 0 }, [135]={ &g_spinlock_raw_135, 135, 0 },
  2460. [136]={ &g_spinlock_raw_136, 136, 0 }, [137]={ &g_spinlock_raw_137, 137, 0 },
  2461. [138]={ &g_spinlock_raw_138, 138, 0 }, [139]={ &g_spinlock_raw_139, 139, 0 },
  2462. [140]={ &g_spinlock_raw_140, 140, 0 }, [141]={ &g_spinlock_raw_141, 141, 0 },
  2463. [142]={ &g_spinlock_raw_142, 142, 0 }, [143]={ &g_spinlock_raw_143, 143, 0 },
  2464. [144]={ &g_spinlock_raw_144, 144, 0 }, [145]={ &g_spinlock_raw_145, 145, 0 },
  2465. [146]={ &g_spinlock_raw_146, 146, 0 }, [147]={ &g_spinlock_raw_147, 147, 0 },
  2466. [148]={ &g_spinlock_raw_148, 148, 0 }, [149]={ &g_spinlock_raw_149, 149, 0 },
  2467. [150]={ &g_spinlock_raw_150, 150, 0 }, [151]={ &g_spinlock_raw_151, 151, 0 },
  2468. [152]={ &g_spinlock_raw_152, 152, 0 }, [153]={ &g_spinlock_raw_153, 153, 0 },
  2469. [154]={ &g_spinlock_raw_154, 154, 0 }, [155]={ &g_spinlock_raw_155, 155, 0 },
  2470. [156]={ &g_spinlock_raw_156, 156, 0 }, [157]={ &g_spinlock_raw_157, 157, 0 },
  2471. [158]={ &g_spinlock_raw_158, 158, 0 }, [159]={ &g_spinlock_raw_159, 159, 0 },
  2472. [160]={ &g_spinlock_raw_160, 160, 0 }, [161]={ &g_spinlock_raw_161, 161, 0 },
  2473. [162]={ &g_spinlock_raw_162, 162, 0 }, [163]={ &g_spinlock_raw_163, 163, 0 },
  2474. [164]={ &g_spinlock_raw_164, 164, 0 }, [165]={ &g_spinlock_raw_165, 165, 0 },
  2475. [166]={ &g_spinlock_raw_166, 166, 0 }, [167]={ &g_spinlock_raw_167, 167, 0 },
  2476. [168]={ &g_spinlock_raw_168, 168, 0 }, [169]={ &g_spinlock_raw_169, 169, 0 },
  2477. [170]={ &g_spinlock_raw_170, 170, 0 }, [171]={ &g_spinlock_raw_171, 171, 0 },
  2478. [172]={ &g_spinlock_raw_172, 172, 0 }, [173]={ &g_spinlock_raw_173, 173, 0 },
  2479. [174]={ &g_spinlock_raw_174, 174, 0 }, [175]={ &g_spinlock_raw_175, 175, 0 },
  2480. [176]={ &g_spinlock_raw_176, 176, 0 }, [177]={ &g_spinlock_raw_177, 177, 0 },
  2481. [178]={ &g_spinlock_raw_178, 178, 0 }, [179]={ &g_spinlock_raw_179, 179, 0 },
  2482. [180]={ &g_spinlock_raw_180, 180, 0 }, [181]={ &g_spinlock_raw_181, 181, 0 },
  2483. [182]={ &g_spinlock_raw_182, 182, 0 }, [183]={ &g_spinlock_raw_183, 183, 0 },
  2484. [184]={ &g_spinlock_raw_184, 184, 0 }, [185]={ &g_spinlock_raw_185, 185, 0 },
  2485. [186]={ &g_spinlock_raw_186, 186, 0 }, [187]={ &g_spinlock_raw_187, 187, 0 },
  2486. [188]={ &g_spinlock_raw_188, 188, 0 }, [189]={ &g_spinlock_raw_189, 189, 0 },
  2487. [190]={ &g_spinlock_raw_190, 190, 0 }, [191]={ &g_spinlock_raw_191, 191, 0 },
  2488. [192]={ &g_spinlock_raw_192, 192, 0 }, [193]={ &g_spinlock_raw_193, 193, 0 },
  2489. [194]={ &g_spinlock_raw_194, 194, 0 }, [195]={ &g_spinlock_raw_195, 195, 0 },
  2490. [196]={ &g_spinlock_raw_196, 196, 0 }, [197]={ &g_spinlock_raw_197, 197, 0 },
  2491. [198]={ &g_spinlock_raw_198, 198, 0 }, [199]={ &g_spinlock_raw_199, 199, 0 },
  2492. [200]={ &g_spinlock_raw_200, 200, 0 }, [201]={ &g_spinlock_raw_201, 201, 0 },
  2493. [202]={ &g_spinlock_raw_202, 202, 0 }, [203]={ &g_spinlock_raw_203, 203, 0 },
  2494. [204]={ &g_spinlock_raw_204, 204, 0 }, [205]={ &g_spinlock_raw_205, 205, 0 },
  2495. [206]={ &g_spinlock_raw_206, 206, 0 }, [207]={ &g_spinlock_raw_207, 207, 0 },
  2496. [208]={ &g_spinlock_raw_208, 208, 0 }, [209]={ &g_spinlock_raw_209, 209, 0 },
  2497. [210]={ &g_spinlock_raw_210, 210, 0 }, [211]={ &g_spinlock_raw_211, 211, 0 },
  2498. [212]={ &g_spinlock_raw_212, 212, 0 }, [213]={ &g_spinlock_raw_213, 213, 0 },
  2499. [214]={ &g_spinlock_raw_214, 214, 0 }, [215]={ &g_spinlock_raw_215, 215, 0 },
  2500. [216]={ &g_spinlock_raw_216, 216, 0 }, [217]={ &g_spinlock_raw_217, 217, 0 },
  2501. [218]={ &g_spinlock_raw_218, 218, 0 }, [219]={ &g_spinlock_raw_219, 219, 0 },
  2502. [220]={ &g_spinlock_raw_220, 220, 0 }, [221]={ &g_spinlock_raw_221, 221, 0 },
  2503. [222]={ &g_spinlock_raw_222, 222, 0 }, [223]={ &g_spinlock_raw_223, 223, 0 },
  2504. [224]={ &g_spinlock_raw_224, 224, 0 }, [225]={ &g_spinlock_raw_225, 225, 0 },
  2505. [226]={ &g_spinlock_raw_226, 226, 0 }, [227]={ &g_spinlock_raw_227, 227, 0 },
  2506. [228]={ &g_spinlock_raw_228, 228, 0 }, [229]={ &g_spinlock_raw_229, 229, 0 },
  2507. [230]={ &g_spinlock_raw_230, 230, 0 }, [231]={ &g_spinlock_raw_231, 231, 0 },
  2508. [232]={ &g_spinlock_raw_232, 232, 0 }, [233]={ &g_spinlock_raw_233, 233, 0 },
  2509. [234]={ &g_spinlock_raw_234, 234, 0 }, [235]={ &g_spinlock_raw_235, 235, 0 },
  2510. [236]={ &g_spinlock_raw_236, 236, 0 }, [237]={ &g_spinlock_raw_237, 237, 0 },
  2511. [238]={ &g_spinlock_raw_238, 238, 0 }, [239]={ &g_spinlock_raw_239, 239, 0 },
  2512. [240]={ &g_spinlock_raw_240, 240, 0 }, [241]={ &g_spinlock_raw_241, 241, 0 },
  2513. [242]={ &g_spinlock_raw_242, 242, 0 }, [243]={ &g_spinlock_raw_243, 243, 0 },
  2514. [244]={ &g_spinlock_raw_244, 244, 0 }, [245]={ &g_spinlock_raw_245, 245, 0 },
  2515. [246]={ &g_spinlock_raw_246, 246, 0 }, [247]={ &g_spinlock_raw_247, 247, 0 },
  2516. [248]={ &g_spinlock_raw_248, 248, 0 }, [249]={ &g_spinlock_raw_249, 249, 0 },
  2517. [250]={ &g_spinlock_raw_250, 250, 0 }, [251]={ &g_spinlock_raw_251, 251, 0 },
  2518. [252]={ &g_spinlock_raw_252, 252, 0 }, [253]={ &g_spinlock_raw_253, 253, 0 },
  2519. [254]={ &g_spinlock_raw_254, 254, 0 }, [255]={ &g_spinlock_raw_255, 255, 0 },
  2520. };
  2521.  
  2522. static atomic_t g_spinlock_lock;
  2523.  
  2524. int SysSpinLockInit(pSpinlock_t *slock)
  2525. {
  2526. unsigned int i=0;
  2527. *slock = NULL;
  2528.  
  2529. #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  2530.  
  2531.  
  2532. while(1) {
  2533. if( SysAtomicAddReturn(1, &g_spinlock_lock)==1 ) break;
  2534. else {
  2535. SysAtomicSubReturn(1, &g_spinlock_lock);
  2536. mdelay(1);
  2537. }
  2538. }
  2539.  
  2540. for(i=0; i<MAX_AVER_SPINLOCK; ++i) {
  2541. if( g_spinlock_ar[i].used==0 ) {
  2542. g_spinlock_ar[i].used = 1;
  2543.  
  2544. *slock = (pSpinlock_t) (g_spinlock_ar+i);
  2545. break;
  2546. }
  2547. }
  2548.  
  2549.  
  2550. SysAtomicSubReturn(1, &g_spinlock_lock);
  2551.  
  2552. if( *slock ) {
  2553.  
  2554. return 0;
  2555. }
  2556. else {
  2557.  
  2558. BUG();
  2559. }
  2560.  
  2561. #else
  2562. *slock = (pSpinlock_t) 1;
  2563. return 0;
  2564. #endif
  2565.  
  2566. return -ENOMEM;
  2567. }
  2568.  
  2569. void SysSpinLock(pSpinlock_t slock)
  2570. {
  2571. _aver_spinlock_t *lock = (_aver_spinlock_t *)slock;
  2572. if( lock==NULL ) { BUG(); return; }
  2573. #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  2574. spin_lock(lock->lock);
  2575. #else
  2576.  
  2577. #endif
  2578. }
  2579.  
  2580. void SysSpinUnlock(pSpinlock_t slock)
  2581. {
  2582. _aver_spinlock_t *lock = (_aver_spinlock_t *)slock;
  2583. if( lock==NULL ) { BUG(); return; }
  2584. #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  2585. spin_unlock(lock->lock);
  2586. #else
  2587.  
  2588. #endif
  2589. }
  2590.  
  2591. void SysSpinLockIrqsave(pSpinlock_t slock, unsigned long *flags)
  2592. {
  2593. _aver_spinlock_t *lock = (_aver_spinlock_t *)slock;
  2594. if( lock==NULL ) { BUG(); return; }
  2595. #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  2596. spin_lock_irqsave(lock->lock, *flags);
  2597. #else
  2598.  
  2599. #endif
  2600. }
  2601.  
  2602. void SysSpinUnlockIrqrestore(pSpinlock_t slock, unsigned long flags)
  2603. {
  2604. _aver_spinlock_t *lock = (_aver_spinlock_t *)slock;
  2605. if( lock==NULL ) { BUG(); return; }
  2606. #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  2607. spin_unlock_irqrestore(lock->lock, flags);
  2608. #else
  2609.  
  2610. #endif
  2611. }
  2612.  
  2613. int SysSpinLockFini(pSpinlock_t slock)
  2614. {
  2615. _aver_spinlock_t *lock = (_aver_spinlock_t *)slock;
  2616.  
  2617. #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
  2618. lock->used = 0;
  2619. return 0;
  2620. #endif
  2621.  
  2622. }
Advertisement
Add Comment
Please, Sign In to add comment