1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
/*********************************************************************
*
* Filename: irmod.h
* Version: 0.3
* Description: IrDA module and utilities functions
* Status: Experimental.
* Author: Dag Brattli <dagb@cs.uit.no>
* Created at: Mon Dec 15 13:58:52 1997
* Modified at: Fri Jan 28 13:15:24 2000
* Modified by: Dag Brattli <dagb@cs.uit.no>
*
* Copyright (c) 1998-2000 Dag Brattli, All Rights Reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* Neither Dag Brattli nor University of Tromsø admit liability nor
* provide warranty for any of this software. This material is
* provided "AS-IS" and at no charg.
*
********************************************************************/
#ifndef IRMOD_H
#define IRMOD_H
#include <linux/skbuff.h>
#include <linux/miscdevice.h>
#include <net/irda/irqueue.h>
#define IRMGR_IOC_MAGIC 'm'
#define IRMGR_IOCTNPC _IO(IRMGR_IOC_MAGIC, 1)
#define IRMGR_IOC_MAXNR 1
/*
* Events that we pass to the user space manager
*/
typedef enum {
EVENT_DEVICE_DISCOVERED = 0,
EVENT_REQUEST_MODULE,
EVENT_IRLAN_START,
EVENT_IRLAN_STOP,
EVENT_IRLPT_START, /* Obsolete */
EVENT_IRLPT_STOP, /* Obsolete */
EVENT_IROBEX_START, /* Obsolete */
EVENT_IROBEX_STOP, /* Obsolete */
EVENT_IRDA_STOP,
EVENT_NEED_PROCESS_CONTEXT,
} IRMGR_EVENT;
/*
* Event information passed to the IrManager daemon process
*/
struct irmanager_event {
IRMGR_EVENT event;
char devname[10];
char info[32];
int service;
__u32 saddr;
__u32 daddr;
};
typedef void (*TODO_CALLBACK)( void *self, __u32 param);
/*
* Same as irmanager_event but this one can be queued and inclueds some
* addtional information
*/
struct irda_event {
irda_queue_t q; /* Must be first */
struct irmanager_event event;
};
/*
* Funtions with needs to be called with a process context
*/
struct irda_todo {
irda_queue_t q; /* Must be first */
void *self;
TODO_CALLBACK callback;
__u32 param;
};
/*
* Main structure for the IrDA device (not much here :-)
*/
struct irda_cb {
struct miscdevice dev;
wait_queue_head_t wait_queue;
int in_use;
irda_queue_t *event_queue; /* Events queued for the irmanager */
irda_queue_t *todo_queue; /* Todo list */
};
int irmod_init_module(void);
void irmod_cleanup_module(void);
/*
* Function irda_lock (lock)
*
* Lock variable. Returns false if the lock is already set.
*
*/
static inline int irda_lock(int *lock)
{
if (test_and_set_bit( 0, (void *) lock)) {
IRDA_DEBUG(3, __FUNCTION__
"(), Trying to lock, already locked variable!\n");
return FALSE;
}
return TRUE;
}
inline int irda_unlock(int *lock);
void irda_notify_init(notify_t *notify);
void irda_execute_as_process(void *self, TODO_CALLBACK callback, __u32 param);
void irmanager_notify(struct irmanager_event *event);
extern void irda_proc_modcount(struct inode *, int);
void irda_mod_inc_use_count(void);
void irda_mod_dec_use_count(void);
#endif /* IRMOD_H */
|