13 #include <linux/module.h>
15 #include <linux/kernel.h>
16 #include <linux/sched.h>
17 #include <linux/poll.h>
21 #include <asm/uaccess.h>
29 static char *main_revision =
"$Revision: 1.25.6.2 $";
46 static char *
DRIVERNAME =
"Eicon DIVA - User IDI (http://www.melware.net)";
47 static char *DRIVERLNAME =
"diva_idi";
48 static char *
DEVNAME =
"DivasIDI";
57 static char *getrev(
const char *
revision)
61 if ((p =
strchr(revision,
':'))) {
80 static int remove_entity(
void *entity);
81 static void diva_um_timer_function(
unsigned long data);
89 static int um_idi_proc_show(
struct seq_file *
m,
void *
v)
96 strcpy(tmprev, main_revision);
97 seq_printf(m,
"revision : %s\n", getrev(tmprev));
111 .open = um_idi_proc_open,
117 static int __init create_um_idi_proc(
void)
119 um_idi_proc_entry = proc_create(DRIVERLNAME,
S_IRUGO, proc_net_eicon,
121 if (!um_idi_proc_entry)
126 static void remove_um_idi_proc(
void)
128 if (um_idi_proc_entry) {
130 um_idi_proc_entry =
NULL;
138 .write = um_idi_write,
141 .release = um_idi_release
144 static void divas_idi_unregister_chrdev(
void)
146 unregister_chrdev(major,
DEVNAME);
149 static int __init divas_idi_register_chrdev(
void)
151 if ((major = register_chrdev(0,
DEVNAME, &divas_idi_fops)) < 0)
164 static int __init divasi_init(
void)
171 strcpy(tmprev, main_revision);
174 if (!divas_idi_register_chrdev()) {
179 if (!create_um_idi_proc()) {
180 divas_idi_unregister_chrdev();
188 remove_um_idi_proc();
189 divas_idi_unregister_chrdev();
205 static void __exit divasi_exit(
void)
208 remove_um_idi_proc();
209 divas_idi_unregister_chrdev();
223 divas_um_idi_copy_to_user(
void *os_handle,
void *
dst,
const void *
src,
252 if (!(data = diva_os_malloc(0, count))) {
258 divas_um_idi_copy_to_user);
277 diva_os_free(0, data);
278 DBG_TRC((
"read: ret %d", ret));
284 divas_um_idi_copy_from_user(
void *os_handle,
void *dst,
const void *src,
291 static int um_idi_open_adapter(
struct file *file,
int adapter_nr)
304 p_os->
diva_timer_id.function = (
void *) diva_um_timer_function;
312 um_idi_write(
struct file *file,
const char __user *buf,
size_t count,
322 if (count ==
sizeof(
int)) {
324 ((
void *) &adapter_nr, buf,
326 if (!(um_idi_open_adapter(file, adapter_nr)))
343 if (!(data = diva_os_malloc(0, count))) {
352 divas_um_idi_copy_from_user);
365 diva_os_free(0, data);
366 DBG_TRC((
"write: ret %d", ret));
370 static unsigned int um_idi_poll(
struct file *file,
poll_table *
wait)
402 static int um_idi_open(
struct inode *
inode,
struct file *file)
408 static int um_idi_release(
struct inode *inode,
struct file *file)
411 unsigned int adapter_nr;
461 void diva_um_timer_function(
unsigned long data)
468 DBG_ERR((
"entity removal watchdog"))
475 static int remove_entity(
void *entity)
483 DBG_FTL((
"Zero entity on remove"))
490 DBG_FTL((
"Zero entity os context on remove"))
501 DBG_TRC((
"E(%08x) check remove", entity))
525 DBG_TRC((
"E(%08x) start remove", entity))
542 DBG_TRC((
"E(%08x) remove complete, aborted:%d", entity,