Quote:
Originally Posted by rjlee
Can you post the source code?
If it's a kernel version problem, then you might want to take a look at the kernel changes. A somewhat more readable form than the official changelog can be found at http://kernelnewbies.org/Linux26Changes
Incidentally, 2.6.26 is the current version, so you might try upgrading and seeing if that fixes the problem. But, without knowing what the problem is, that's quite a long shot.
|
#include <linux/pci.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/sched.h>
#include <linux/delay.h>
#include <asm/uaccess.h>
#include <linux/interrupt.h>
#include "park_irigb.h"
MODULE_LICENSE("GPL");
#define DEBUG 1
void* PCM_Mapped_Addr[MAXCARDS];
void *Base_Addr[MAXCARDS];
unsigned short pcm_irq[MAXCARDS];
unsigned long mem_size[MAXCARDS];
UCHAR cardsfound=0;
int cards[MAXCARDS];
pid_t processno;
int Tcrflag[MAXCARDS];
int SignalNo;
int Pid;
Uchar g_PortReg;
Uchar g_LeapReg;
UCHAR bIntFlag[MAXCARDS] ;
UCHAR bD0_D1Flag[MAXCARDS];
UCHAR bD3Flag[MAXCARDS] ;
UCHAR bD7Flag[MAXCARDS] ;
UCHAR bD2Flag[MAXCARDS] ;
UCHAR signalflag=0;
int GetDetails();
int pcm_interrupt_handler(int i,void *v,struct pt_regs *pt_reg);
int pcm_interrupt_handler(int i,void *v,struct pt_regs *pt_reg)
{
/* UCHAR card;
UCHAR intRegister;
card=*(UCHAR*)v;
intRegister = readb((UCHAR *)PCM_Mapped_Addr[0]+STATUS_REG);
if(intRegister != 0x3f)
if(intRegister != 0x3e)
if(intRegister != 0x3c)
if(intRegister != 0x38)
{
#ifdef DEBUG
printk("Interrupt Genarated is from other Device %x\n",card);
#endif
return -1;
}
#ifdef DEBUG
printk("Inside the Interrupt Service Routine Card: %d\n",card);
#endif
// Send Signal
*/
kill_proc ( Pid, SignalNo, 0 );
//Clearing the Timer Interrupt
writeb(0xFF,(UCHAR *)PCM_Mapped_Addr[0]+0x00);
readb((UCHAR *)PCM_Mapped_Addr[0]+0x00);
return IRQ_HANDLED;
}
int GetDetails()
{
unsigned long max,min;
int i,j;
struct pci_dev *de=NULL,*df=NULL;
ULONG k=0;
for(i=0;i<MAXCARDS;i++)
{
while(!(de = pci_find_device(VENDOR,DEVICE,de)))
{
k++;
if(k>256*256)
break;
}
if(k>256*256)
break;
if(i == 0)
{
df=de;
}
else
{
if(df==de)
break;
}
for(j=0;j<(6*4);j+=4)
{
pci_read_config_dword(de,0x10+j,(u32 *)&Base_Addr[i]);
if(Base_Addr[i])
{
// Calculate Size
min=pci_resource_start(de,j/4);
max=pci_resource_end(de,j/4);
mem_size[i]=(max-min)+1;
break;
}
}
pcm_irq[i]=de->irq;
(unsigned long)Base_Addr[i]=((unsigned long)Base_Addr[i])&0xfffffff0;
(void *)PCM_Mapped_Addr[i]=(void *)ioremap((unsigned long)Base_Addr[i],mem_size[i]);
#ifdef DEBUG
printk("<1>device %lx : Irq :%x Size:%lx\n",(u32 *)Base_Addr[i],pcm_irq[i],mem_size[i]);
printk("<1>Mapped Addr : %lx\n",PCM_Mapped_Addr[i]);
#endif
}
return i;
}
static int pcm_open(struct inode *inode, struct file *filp)
{
return 0;
}
static int pcm_close(struct inode *inode, struct file *filp)
{
return 0;
}
ssize_t pcm_read(struct file *filp, char *buff, size_t count, loff_t *offset)
{
return 0;
}
ssize_t pcm_write(struct file *filp, const char *buf, size_t count, loff_t *offset)
{
return 0;
}
int pcm_control(struct inode *inode, struct file *filp, unsigned int command, unsigned long argument)
{
return 0;
}
struct file_operations pcm_fops = {
read : pcm_read,
write : pcm_write,
open : pcm_open,
release : pcm_close,
ioctl : pcm_control,
owner : THIS_MODULE,
};
int pcm_init(void)
{
int major,i=0,q=0;
cardsfound=GetDetails();
if(cardsfound<=0)
return -10;
#ifdef DEBUG
printk("<1>Cards Found : %d\n",cardsfound);
#endif
// Interrupt Handler
for(i=0;i<cardsfound;i++)
{
cards[i]=i;
q=request_irq(pcm_irq[0],pcm_interrupt_handler,SA_INTERRUPT | SA_SHIRQ,"TCR",&cards[0]);
}
printk("int request:%d\n",q);
major = register_chrdev(TCR_MAJOR,"TCR_DEV",&pcm_fops);
return 0;
}
/****************************************************************************
CLOSE OF DRIVER MODULE
*****************************************************************************/
void pcm_cleanup(void)
{
int i=0;
printk("<1> Unloading Driver \n");
unregister_chrdev(TCR_MAJOR,"TCR_DEV");
for(i=0;i<cardsfound;i++)
{
free_irq(pcm_irq[i],&cards[i]);
}
}
module_init(pcm_init);
module_exit(pcm_cleanup);