Mercurial > pt1
diff driver/pt1_pci.c @ 120:3914cc1b2375
- adapted to 3.x kernels
- replaced lock/unlock_kernel with mutex
- enlarged read size
- changed the order in clean up so that the module no longer hangs on being removed
- changed channel step of bs17 as the upstream
- adopted some useful patches
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Fri, 06 Jan 2012 17:32:36 +0900 |
parents | 7662d0ecd74b |
children | f2ae5ddeed7e |
line wrap: on
line diff
--- a/driver/pt1_pci.c Fri Nov 19 11:19:25 2010 +0900 +++ b/driver/pt1_pci.c Fri Jan 06 17:32:36 2012 +0900 @@ -33,7 +33,6 @@ #include <linux/cdev.h> #include <linux/ioctl.h> -#include <linux/smp_lock.h> #include "pt1_com.h" #include "pt1_pci.h" @@ -79,6 +78,7 @@ #define DMA_RING_MAX 511 // 1RINGにいくつ詰めるか(1023はNGで511まで) #define CHANEL_DMA_SIZE (2*1024*1024) // 地デジ用(16Mbps) #define BS_CHANEL_DMA_SIZE (4*1024*1024) // BS用(32Mbps) +#define READ_SIZE (16*DMA_SIZE) typedef struct _DMA_CONTROL{ dma_addr_t ring_dma[DMA_RING_MAX] ; // DMA情報 @@ -307,15 +307,15 @@ } } - // 頻度を落す(4Kで起動させる) + // 頻度を落す(wait until READ_SIZE) for(lp = 0 ; lp < MAX_CHANNEL ; lp++){ channel = dev_conf->channel[real_channel[lp]] ; - if((channel->size >= DMA_SIZE) && (channel->valid == TRUE)){ + if((channel->size >= READ_SIZE) && (channel->valid == TRUE)){ wake_up(&channel->wait_q); } } } - schedule_timeout_interruptible(msecs_to_jiffies(1)); + schedule_timeout_interruptible(msecs_to_jiffies(10)); } return 0 ; } @@ -404,9 +404,9 @@ __u32 size ; unsigned long dummy; - // 4K単位で起こされるのを待つ(CPU負荷対策) - if(channel->size < DMA_SIZE){ - wait_event_timeout(channel->wait_q, (channel->size >= DMA_SIZE), + // READ_SIZE単位で起こされるのを待つ(CPU負荷対策) + if(channel->size < READ_SIZE){ + wait_event_timeout(channel->wait_q, (channel->size >= READ_SIZE), msecs_to_jiffies(500)); } mutex_lock(&channel->lock); @@ -534,6 +534,7 @@ return 0 ; case STOP_REC: SetStream(channel->ptr->regs, channel->channel, FALSE); + schedule_timeout_interruptible(msecs_to_jiffies(100)); return 0 ; case GET_SIGNAL_STRENGTH: switch(channel->type){ @@ -571,11 +572,12 @@ static long pt1_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg0) { + PT1_CHANNEL *channel = file->private_data; long ret; - lock_kernel(); + mutex_lock(&channel->lock); ret = pt1_do_ioctl(file, cmd, arg0); - unlock_kernel(); + mutex_unlock(&channel->lock); return ret; } @@ -607,9 +609,10 @@ .read = pt1_read, #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36) .ioctl = pt1_ioctl, -#endif +#else .unlocked_ioctl = pt1_unlocked_ioctl, .compat_ioctl = pt1_compat_ioctl, +#endif .llseek = no_llseek, }; @@ -1004,8 +1007,8 @@ static void __exit pt1_pci_cleanup(void) { + pci_unregister_driver(&pt1_driver); class_destroy(pt1video_class); - pci_unregister_driver(&pt1_driver); } module_init(pt1_pci_init);