static int hertz = HZ;
static int samplerate = 100;
-MODULE_PARM(ixjdebug, "i");
+module_param(ixjdebug, int, 0);
/************************************************************************
*
return 0;
}
-static IXJ_REGFUNC ixj_DownloadG729 = &Stub;
-static IXJ_REGFUNC ixj_DownloadTS85 = &Stub;
static IXJ_REGFUNC ixj_PreRead = &Stub;
static IXJ_REGFUNC ixj_PostRead = &Stub;
static IXJ_REGFUNC ixj_PreWrite = &Stub;
static IXJ_REGFUNC ixj_PostWrite = &Stub;
-static IXJ_REGFUNC ixj_PreIoctl = &Stub;
-static IXJ_REGFUNC ixj_PostIoctl = &Stub;
static void ixj_read_frame(IXJ *j);
static void ixj_write_frame(IXJ *j);
return 0;
}
-static int ixj_register(int index, IXJ_REGFUNC regfunc)
-{
- int cnt;
- int retval = 0;
- switch (index) {
- case G729LOADER:
- ixj_DownloadG729 = regfunc;
- for (cnt = 0; cnt < IXJMAX; cnt++) {
- IXJ *j = get_ixj(cnt);
- while(test_and_set_bit(cnt, (void *)&j->busyflags) != 0) {
- set_current_state(TASK_INTERRUPTIBLE);
- schedule_timeout(1);
- }
- ixj_DownloadG729(j, 0L);
- clear_bit(cnt, &j->busyflags);
- }
- break;
- case TS85LOADER:
- ixj_DownloadTS85 = regfunc;
- for (cnt = 0; cnt < IXJMAX; cnt++) {
- IXJ *j = get_ixj(cnt);
- while(test_and_set_bit(cnt, (void *)&j->busyflags) != 0) {
- set_current_state(TASK_INTERRUPTIBLE);
- schedule_timeout(1);
- }
- ixj_DownloadTS85(j, 0L);
- clear_bit(cnt, &j->busyflags);
- }
- break;
- case PRE_READ:
- ixj_PreRead = regfunc;
- break;
- case POST_READ:
- ixj_PostRead = regfunc;
- break;
- case PRE_WRITE:
- ixj_PreWrite = regfunc;
- break;
- case POST_WRITE:
- ixj_PostWrite = regfunc;
- break;
- case PRE_IOCTL:
- ixj_PreIoctl = regfunc;
- break;
- case POST_IOCTL:
- ixj_PostIoctl = regfunc;
- break;
- default:
- retval = 1;
- }
- return retval;
-}
-
-EXPORT_SYMBOL(ixj_register);
-
-static int ixj_unregister(int index)
-{
- int retval = 0;
- switch (index) {
- case G729LOADER:
- ixj_DownloadG729 = &Stub;
- break;
- case TS85LOADER:
- ixj_DownloadTS85 = &Stub;
- break;
- case PRE_READ:
- ixj_PreRead = &Stub;
- break;
- case POST_READ:
- ixj_PostRead = &Stub;
- break;
- case PRE_WRITE:
- ixj_PreWrite = &Stub;
- break;
- case POST_WRITE:
- ixj_PostWrite = &Stub;
- break;
- case PRE_IOCTL:
- ixj_PreIoctl = &Stub;
- break;
- case POST_IOCTL:
- ixj_PostIoctl = &Stub;
- break;
- default:
- retval = 1;
- }
- return retval;
-}
-
-EXPORT_SYMBOL(ixj_unregister);
-
static void ixj_init_timer(IXJ *j)
{
init_timer(&j->timer);
return 0;
}
-int ixj_release(struct inode *inode, struct file *file_p)
+static int ixj_release(struct inode *inode, struct file *file_p)
{
IXJ_TONE ti;
int cnt;
return fasync_helper(fd, file_p, mode, &j->async_queue);
}
-struct file_operations ixj_fops =
+static struct file_operations ixj_fops =
{
.owner = THIS_MODULE,
.read = ixj_enhanced_read,
0,
};
-MODULE_PARM(dspio, "1-" __MODULE_STRING(IXJMAX) "i");
-MODULE_PARM(xio, "1-" __MODULE_STRING(IXJMAX) "i");
+module_param_array(dspio, int, NULL, 0);
+module_param_array(xio, int, NULL, 0);
MODULE_DESCRIPTION("Quicknet VoIP Telephony card module - www.quicknet.net");
MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
MODULE_LICENSE("GPL");
cleanup();
}
-int __init ixj_probe_isapnp(int *cnt)
+static IXJ *new_ixj(unsigned long port)
+{
+ IXJ *res;
+ if (!request_region(port, 16, "ixj DSP")) {
+ printk(KERN_INFO "ixj: can't get I/O address 0x%lx\n", port);
+ return NULL;
+ }
+ res = ixj_alloc();
+ if (!res) {
+ release_region(port, 16);
+ printk(KERN_INFO "ixj: out of memory\n");
+ return NULL;
+ }
+ res->DSPbase = port;
+ return res;
+}
+
+static int __init ixj_probe_isapnp(int *cnt)
{
int probe = 0;
int func = 0x110;
return -ENODEV;
}
- result = check_region(pnp_port_start(dev, 0), 16);
- if (result) {
- printk(KERN_INFO "ixj: can't get I/O address 0x%lx\n", pnp_port_start(dev, 0));
+ j = new_ixj(pnp_port_start(dev, 0));
+ if (!j)
break;
- }
-
- j = ixj_alloc();
- j->DSPbase = pnp_port_start(dev,0);
- request_region(j->DSPbase, 16, "ixj DSP");
if (func != 0x110)
j->XILINXbase = pnp_port_start(dev, 1); /* get real port */
return probe;
}
-int __init ixj_probe_isa(int *cnt)
+static int __init ixj_probe_isa(int *cnt)
{
- int i, result, probe;
+ int i, probe;
/* Use passed parameters for older kernels without PnP */
for (i = 0; i < IXJMAX; i++) {
if (dspio[i]) {
- IXJ *j;
+ IXJ *j = new_ixj(dspio[i]);
- if ((result = check_region(ixj[*cnt].DSPbase, 16)) < 0) {
- printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", ixj[*cnt].DSPbase);
+ if (!j)
break;
- }
-
- j = ixj_alloc();
-
- j->DSPbase = dspio[i];
- request_region(j->DSPbase, 16, "ixj DSP");
j->XILINXbase = xio[i];
j->cardtype = 0;
return 0;
}
-int __init ixj_probe_pci(int *cnt)
+static int __init ixj_probe_pci(int *cnt)
{
struct pci_dev *pci = NULL;
int i, probe = 0;
IXJ *j = NULL;
- int result;
for (i = 0; i < IXJMAX - *cnt; i++) {
pci = pci_find_device(0x15E2, 0x0500, pci);
if (pci_enable_device(pci))
break;
- if ((result = check_region(pci_resource_start(pci, 0), 16)) < 0) {
- printk(KERN_INFO "ixj: can't get I/O address\n");
+ j = new_ixj(pci_resource_start(pci, 0));
+ if (!j)
break;
- }
- /* Grab a device slot */
- j = ixj_alloc();
- if(j == NULL)
- break;
-
- j->DSPbase = pci_resource_start(pci, 0);
j->serial = (PCIEE_GetSerialNumber)pci_resource_start(pci, 2);
j->XILINXbase = j->DSPbase + 0x10;
- request_region(j->DSPbase, 16, "ixj DSP");
j->cardtype = QTI_PHONEJACK_PCI;
j->board = *cnt;
probe = ixj_selfprobe(j);