--- zaptel-1.0.10/zaptel.c.orig 2005-09-02 22:27:45.000000000 +0200 +++ zaptel-1.0.10/zaptel.c 2005-11-22 19:25:39.000000000 +0100 @@ -148,12 +148,14 @@ /* Here are a couple important little additions for devfs */ #ifdef CONFIG_DEVFS_FS +#ifndef LINUX26 static devfs_handle_t zaptel_devfs_dir; static devfs_handle_t channel; static devfs_handle_t pseudo; static devfs_handle_t ctl; static devfs_handle_t timer; #endif +#endif /* udev necessary data structures. Yeah! */ #ifdef CONFIG_ZAP_UDEV @@ -1123,6 +1125,7 @@ } #ifdef CONFIG_DEVFS_FS +#ifndef LINUX26 static devfs_handle_t register_devfs_channel(struct zt_chan *chan, devfs_handle_t dir) { char path[100]; @@ -1165,6 +1168,36 @@ return chan_dev; } +#else +static dev_t register_devfs_channel(struct zt_chan *chan, dev_t dir) +{ +#ifdef HAS_DEVFS_MK_SYMLINK + char link[100]; + char path[100]; +#endif + dev_t chan_dev; + umode_t mode = S_IFCHR|S_IRUGO|S_IWUGO; + + /* create /dev/zap/span%d/%d channel device node */ + if ((chan_dev = devfs_mk_cdev(MKDEV(ZT_MAJOR, chan->channo), mode, "zap/span%d/%d", dir, chan->chanpos)) < 0) { + printk("zaptel: Something really bad happened. Unable to register devfs entry\n"); + return 0; + } + +#ifdef HAS_DEVFS_MK_SYMLINK + /* link /dev/zap/span%d/%d -> /dev/zap/%d ?!? */ + sprintf(path, "zap/span%d/%d", dir, chan->chanpos); + sprintf(link, "zap/%d", chan->channo); + devfs_mk_symlink(link, path); +#else + /* register /dev/zap/%d channel node directly */ + if(devfs_mk_cdev(MKDEV(ZT_MAJOR, chan->channo), mode, "zap/%d", chan->channo) < 0) { + printk("zaptel: Unable to register compat devfs entry\n"); + } +#endif + return chan_dev; +} +#endif #endif /* CONFIG_DEVFS_FS */ static int zt_chan_reg(struct zt_chan *chan) @@ -4404,6 +4437,7 @@ #endif #ifdef CONFIG_DEVFS_FS +#ifndef LINUX26 { char span_name[50]; sprintf(span_name, "span%d", span->spanno); @@ -4413,6 +4447,15 @@ chan->fhandle = register_devfs_channel(chan, chan->span->dhandle); /* Register our stuff with devfs */ } } +#else + { + devfs_mk_dir("zap/span%d", span->spanno); + for (x = 0; x < span->channels; x++) { + struct zt_chan *chan = &span->chans[x]; + register_devfs_channel(chan, span->spanno); /* Register our stuff with devfs */ + } + } +#endif #endif /* CONFIG_DEVFS_FS */ #ifdef CONFIG_ZAP_UDEV @@ -4460,11 +4503,22 @@ remove_proc_entry(tempfile, NULL); #endif /* CONFIG_PROC_FS */ #ifdef CONFIG_DEVFS_FS +#ifndef LINUX26 for (x = 0; x < span->channels; x++) { devfs_unregister(span->chans[x].fhandle); devfs_unregister(span->chans[x].fhandle_symlink); } devfs_unregister(span->dhandle); +#else + for (x = 0; x < span->channels; x++) { + /* remove symlink/compat device first */ + devfs_remove("zap/%d", span->chans[x].channo); + /* remove channel device */ + devfs_remove("zap/span%d/%d", span->spanno, span->chans[x].chanpos); + } + /* remove span dir */ + devfs_remove("zap/span%d", span->spanno); +#endif #endif /* CONFIG_DEVFS_FS */ #ifdef CONFIG_ZAP_UDEV @@ -6452,6 +6506,7 @@ #endif /* CONFIG_ZAP_UDEV */ #ifdef CONFIG_DEVFS_FS +#ifndef LINUX26 { umode_t mode = S_IFCHR|S_IRUGO|S_IWUGO; devfs_register_chrdev(ZT_MAJOR, "zaptel", &zt_fops); @@ -6463,6 +6518,22 @@ ctl = devfs_register(zaptel_devfs_dir, "ctl", DEVFS_FL_DEFAULT, ZT_MAJOR, 0, mode, &zt_fops, NULL); } #else + { + umode_t mode = S_IFCHR|S_IRUGO|S_IWUGO; + if ((res = register_chrdev(ZT_MAJOR, "zaptel", &zt_fops)) < 0) { + printk(KERN_ERR "Unable to register for device on %d, error: %d\n", ZT_MAJOR, res); + return res; + } + + devfs_mk_dir("zap"); + + devfs_mk_cdev(MKDEV(ZT_MAJOR, 253), mode, "zap/timer"); + devfs_mk_cdev(MKDEV(ZT_MAJOR, 254), mode, "zap/channel"); + devfs_mk_cdev(MKDEV(ZT_MAJOR, 255), mode, "zap/pseudo"); + devfs_mk_cdev(MKDEV(ZT_MAJOR, 0), mode, "zap/ctl"); + } +#endif +#else if ((res = register_chrdev(ZT_MAJOR, "zaptel", &zt_fops))) { printk(KERN_ERR "Unable to register tor device on %d\n", ZT_MAJOR); return res; @@ -6493,6 +6564,7 @@ if (tone_zones[x]) kfree(tone_zones[x]); #ifdef CONFIG_DEVFS_FS +#ifndef LINUX26 devfs_unregister(timer); devfs_unregister(channel); devfs_unregister(pseudo); @@ -6508,6 +6580,16 @@ class_destroy(zap_class); #endif /* CONFIG_ZAP_UDEV */ unregister_chrdev(ZT_MAJOR, "zaptel"); + + devfs_remove("zap/timer"); + devfs_remove("zap/ctl"); + devfs_remove("zap/pseudo"); + devfs_remove("zap/channel"); + + devfs_remove("zap"); +#endif +#else + unregister_chrdev(ZT_MAJOR, "zaptel"); #endif #ifdef CONFIG_ZAPTEL_WATCHDOG watchdog_cleanup(); --- zaptel-1.0.10/zaptel.h.orig 2005-11-15 15:28:44.000000000 +0100 +++ zaptel-1.0.10/zaptel.h 2005-11-22 19:25:39.000000000 +0100 @@ -52,18 +52,17 @@ #define zap_pci_module pci_register_driver #else #define zap_pci_module pci_module_init +/* devfs_mk_symlink has been removed in 2.6.10 */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10) +#define HAS_DEVFS_MK_SYMLINK +#endif #endif #include "ecdis.h" #include "fasthdlc.h" #endif #ifdef CONFIG_DEVFS_FS -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) #include -#else -#undef CONFIG_DEVFS_FS -//#warning "Zaptel doesn't support DEVFS in post 2.4 kernels. Disabling DEVFS in zaptel" -#endif #endif /* CONFIG_DEVFS_FS */ #include @@ -71,6 +70,8 @@ #define ELAST 500 #endif + + /* Per-span configuration values */ #define ZT_CONFIG_TXLEVEL 7 /* bits 0-2 are tx level */ @@ -1153,8 +1154,10 @@ #endif #ifdef CONFIG_DEVFS_FS +#ifndef LINUX26 devfs_handle_t fhandle; /* File handle in devfs for the channel */ devfs_handle_t fhandle_symlink; +#endif #endif /* CONFIG_DEVFS_FS */ }; @@ -1290,7 +1293,9 @@ int lastalarms; /* Previous alarms */ #ifdef CONFIG_DEVFS_FS +#ifndef LINUX26 devfs_handle_t dhandle; /* Directory name */ +#endif #endif /* If the watchdog detects no received data, it will call the watchdog routine */