Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/net/irda/irsysctl.c
15109 views
1
/*********************************************************************
2
*
3
* Filename: irsysctl.c
4
* Version: 1.0
5
* Description: Sysctl interface for IrDA
6
* Status: Experimental.
7
* Author: Dag Brattli <[email protected]>
8
* Created at: Sun May 24 22:12:06 1998
9
* Modified at: Fri Jun 4 02:50:15 1999
10
* Modified by: Dag Brattli <[email protected]>
11
*
12
* Copyright (c) 1997, 1999 Dag Brattli, All Rights Reserved.
13
* Copyright (c) 2000-2001 Jean Tourrilhes <[email protected]>
14
*
15
* This program is free software; you can redistribute it and/or
16
* modify it under the terms of the GNU General Public License as
17
* published by the Free Software Foundation; either version 2 of
18
* the License, or (at your option) any later version.
19
*
20
* Neither Dag Brattli nor University of Tromsø admit liability nor
21
* provide warranty for any of this software. This material is
22
* provided "AS-IS" and at no charge.
23
*
24
********************************************************************/
25
26
#include <linux/mm.h>
27
#include <linux/ctype.h>
28
#include <linux/sysctl.h>
29
#include <linux/init.h>
30
31
#include <net/irda/irda.h> /* irda_debug */
32
#include <net/irda/irlmp.h>
33
#include <net/irda/timer.h>
34
#include <net/irda/irias_object.h>
35
36
extern int sysctl_discovery;
37
extern int sysctl_discovery_slots;
38
extern int sysctl_discovery_timeout;
39
extern int sysctl_slot_timeout;
40
extern int sysctl_fast_poll_increase;
41
extern char sysctl_devname[];
42
extern int sysctl_max_baud_rate;
43
extern int sysctl_min_tx_turn_time;
44
extern int sysctl_max_tx_data_size;
45
extern int sysctl_max_tx_window;
46
extern int sysctl_max_noreply_time;
47
extern int sysctl_warn_noreply_time;
48
extern int sysctl_lap_keepalive_time;
49
50
extern struct irlmp_cb *irlmp;
51
52
/* this is needed for the proc_dointvec_minmax - Jean II */
53
static int max_discovery_slots = 16; /* ??? */
54
static int min_discovery_slots = 1;
55
/* IrLAP 6.13.2 says 25ms to 10+70ms - allow higher since some devices
56
* seems to require it. (from Dag's comment) */
57
static int max_slot_timeout = 160;
58
static int min_slot_timeout = 20;
59
static int max_max_baud_rate = 16000000; /* See qos.c - IrLAP spec */
60
static int min_max_baud_rate = 2400;
61
static int max_min_tx_turn_time = 10000; /* See qos.c - IrLAP spec */
62
static int min_min_tx_turn_time;
63
static int max_max_tx_data_size = 2048; /* See qos.c - IrLAP spec */
64
static int min_max_tx_data_size = 64;
65
static int max_max_tx_window = 7; /* See qos.c - IrLAP spec */
66
static int min_max_tx_window = 1;
67
static int max_max_noreply_time = 40; /* See qos.c - IrLAP spec */
68
static int min_max_noreply_time = 3;
69
static int max_warn_noreply_time = 3; /* 3s == standard */
70
static int min_warn_noreply_time = 1; /* 1s == min WD_TIMER */
71
static int max_lap_keepalive_time = 10000; /* 10s */
72
static int min_lap_keepalive_time = 100; /* 100us */
73
/* For other sysctl, I've no idea of the range. Maybe Dag could help
74
* us on that - Jean II */
75
76
static int do_devname(ctl_table *table, int write,
77
void __user *buffer, size_t *lenp, loff_t *ppos)
78
{
79
int ret;
80
81
ret = proc_dostring(table, write, buffer, lenp, ppos);
82
if (ret == 0 && write) {
83
struct ias_value *val;
84
85
val = irias_new_string_value(sysctl_devname);
86
if (val)
87
irias_object_change_attribute("Device", "DeviceName", val);
88
}
89
return ret;
90
}
91
92
93
static int do_discovery(ctl_table *table, int write,
94
void __user *buffer, size_t *lenp, loff_t *ppos)
95
{
96
int ret;
97
98
ret = proc_dointvec(table, write, buffer, lenp, ppos);
99
if (ret)
100
return ret;
101
102
if (irlmp == NULL)
103
return -ENODEV;
104
105
if (sysctl_discovery)
106
irlmp_start_discovery_timer(irlmp, sysctl_discovery_timeout*HZ);
107
else
108
del_timer_sync(&irlmp->discovery_timer);
109
110
return ret;
111
}
112
113
/* One file */
114
static ctl_table irda_table[] = {
115
{
116
.procname = "discovery",
117
.data = &sysctl_discovery,
118
.maxlen = sizeof(int),
119
.mode = 0644,
120
.proc_handler = do_discovery,
121
},
122
{
123
.procname = "devname",
124
.data = sysctl_devname,
125
.maxlen = 65,
126
.mode = 0644,
127
.proc_handler = do_devname,
128
},
129
#ifdef CONFIG_IRDA_DEBUG
130
{
131
.procname = "debug",
132
.data = &irda_debug,
133
.maxlen = sizeof(int),
134
.mode = 0644,
135
.proc_handler = proc_dointvec
136
},
137
#endif
138
#ifdef CONFIG_IRDA_FAST_RR
139
{
140
.procname = "fast_poll_increase",
141
.data = &sysctl_fast_poll_increase,
142
.maxlen = sizeof(int),
143
.mode = 0644,
144
.proc_handler = proc_dointvec
145
},
146
#endif
147
{
148
.procname = "discovery_slots",
149
.data = &sysctl_discovery_slots,
150
.maxlen = sizeof(int),
151
.mode = 0644,
152
.proc_handler = proc_dointvec_minmax,
153
.extra1 = &min_discovery_slots,
154
.extra2 = &max_discovery_slots
155
},
156
{
157
.procname = "discovery_timeout",
158
.data = &sysctl_discovery_timeout,
159
.maxlen = sizeof(int),
160
.mode = 0644,
161
.proc_handler = proc_dointvec
162
},
163
{
164
.procname = "slot_timeout",
165
.data = &sysctl_slot_timeout,
166
.maxlen = sizeof(int),
167
.mode = 0644,
168
.proc_handler = proc_dointvec_minmax,
169
.extra1 = &min_slot_timeout,
170
.extra2 = &max_slot_timeout
171
},
172
{
173
.procname = "max_baud_rate",
174
.data = &sysctl_max_baud_rate,
175
.maxlen = sizeof(int),
176
.mode = 0644,
177
.proc_handler = proc_dointvec_minmax,
178
.extra1 = &min_max_baud_rate,
179
.extra2 = &max_max_baud_rate
180
},
181
{
182
.procname = "min_tx_turn_time",
183
.data = &sysctl_min_tx_turn_time,
184
.maxlen = sizeof(int),
185
.mode = 0644,
186
.proc_handler = proc_dointvec_minmax,
187
.extra1 = &min_min_tx_turn_time,
188
.extra2 = &max_min_tx_turn_time
189
},
190
{
191
.procname = "max_tx_data_size",
192
.data = &sysctl_max_tx_data_size,
193
.maxlen = sizeof(int),
194
.mode = 0644,
195
.proc_handler = proc_dointvec_minmax,
196
.extra1 = &min_max_tx_data_size,
197
.extra2 = &max_max_tx_data_size
198
},
199
{
200
.procname = "max_tx_window",
201
.data = &sysctl_max_tx_window,
202
.maxlen = sizeof(int),
203
.mode = 0644,
204
.proc_handler = proc_dointvec_minmax,
205
.extra1 = &min_max_tx_window,
206
.extra2 = &max_max_tx_window
207
},
208
{
209
.procname = "max_noreply_time",
210
.data = &sysctl_max_noreply_time,
211
.maxlen = sizeof(int),
212
.mode = 0644,
213
.proc_handler = proc_dointvec_minmax,
214
.extra1 = &min_max_noreply_time,
215
.extra2 = &max_max_noreply_time
216
},
217
{
218
.procname = "warn_noreply_time",
219
.data = &sysctl_warn_noreply_time,
220
.maxlen = sizeof(int),
221
.mode = 0644,
222
.proc_handler = proc_dointvec_minmax,
223
.extra1 = &min_warn_noreply_time,
224
.extra2 = &max_warn_noreply_time
225
},
226
{
227
.procname = "lap_keepalive_time",
228
.data = &sysctl_lap_keepalive_time,
229
.maxlen = sizeof(int),
230
.mode = 0644,
231
.proc_handler = proc_dointvec_minmax,
232
.extra1 = &min_lap_keepalive_time,
233
.extra2 = &max_lap_keepalive_time
234
},
235
{ }
236
};
237
238
static struct ctl_path irda_path[] = {
239
{ .procname = "net", },
240
{ .procname = "irda", },
241
{ }
242
};
243
244
static struct ctl_table_header *irda_table_header;
245
246
/*
247
* Function irda_sysctl_register (void)
248
*
249
* Register our sysctl interface
250
*
251
*/
252
int __init irda_sysctl_register(void)
253
{
254
irda_table_header = register_sysctl_paths(irda_path, irda_table);
255
if (!irda_table_header)
256
return -ENOMEM;
257
258
return 0;
259
}
260
261
/*
262
* Function irda_sysctl_unregister (void)
263
*
264
* Unregister our sysctl interface
265
*
266
*/
267
void irda_sysctl_unregister(void)
268
{
269
unregister_sysctl_table(irda_table_header);
270
}
271
272
273
274
275