2 * Thomas Horsten <thh@lasat.com>
3 * Copyright (C) 2000 LASAT Networks A/S.
5 * This program is free software; you can distribute it and/or modify it
6 * under the terms of the GNU General Public License (Version 2) as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
18 * Routines specific to the LASAT boards
20 #include <linux/types.h>
21 #include <asm/lasat/lasat.h>
23 #include <linux/config.h>
24 #include <linux/module.h>
25 #include <linux/sysctl.h>
26 #include <linux/stddef.h>
27 #include <linux/init.h>
29 #include <linux/ctype.h>
30 #include <linux/string.h>
31 #include <linux/net.h>
32 #include <linux/inet.h>
33 #include <asm/uaccess.h>
38 static DECLARE_MUTEX(lasat_info_sem
);
40 /* Strategy function to write EEPROM after changing string entry */
41 int sysctl_lasatstring(ctl_table
*table
, int *name
, int nlen
,
42 void *oldval
, size_t *oldlenp
,
43 void *newval
, size_t newlen
, void **context
)
46 down(&lasat_info_sem
);
47 r
= sysctl_string(table
, name
,
48 nlen
, oldval
, oldlenp
, newval
, newlen
, context
);
53 if (newval
&& newlen
) {
54 lasat_write_eeprom_info();
61 /* And the same for proc */
62 int proc_dolasatstring(ctl_table
*table
, int write
, struct file
*filp
,
63 void *buffer
, size_t *lenp
, loff_t
*ppos
)
66 down(&lasat_info_sem
);
67 r
= proc_dostring(table
, write
, filp
, buffer
, lenp
, ppos
);
72 lasat_write_eeprom_info();
77 /* proc function to write EEPROM after changing int entry */
78 int proc_dolasatint(ctl_table
*table
, int write
, struct file
*filp
,
79 void *buffer
, size_t *lenp
, loff_t
*ppos
)
82 down(&lasat_info_sem
);
83 r
= proc_dointvec(table
, write
, filp
, buffer
, lenp
, ppos
);
88 lasat_write_eeprom_info();
96 /* proc function to read/write RealTime Clock */
97 int proc_dolasatrtc(ctl_table
*table
, int write
, struct file
*filp
,
98 void *buffer
, size_t *lenp
, loff_t
*ppos
)
101 down(&lasat_info_sem
);
103 rtctmp
= ds1603_read();
104 /* check for time < 0 and set to 0 */
108 r
= proc_dointvec(table
, write
, filp
, buffer
, lenp
, ppos
);
109 if ( (!write
) || r
) {
119 /* Sysctl for setting the IP addresses */
120 int sysctl_lasat_intvec(ctl_table
*table
, int *name
, int nlen
,
121 void *oldval
, size_t *oldlenp
,
122 void *newval
, size_t newlen
, void **context
)
125 down(&lasat_info_sem
);
126 r
= sysctl_intvec(table
, name
, nlen
, oldval
, oldlenp
, newval
, newlen
, context
);
131 if (newval
&& newlen
) {
132 lasat_write_eeprom_info();
140 int sysctl_lasat_rtc(ctl_table
*table
, int *name
, int nlen
,
141 void *oldval
, size_t *oldlenp
,
142 void *newval
, size_t newlen
, void **context
)
145 down(&lasat_info_sem
);
146 rtctmp
= ds1603_read();
149 r
= sysctl_intvec(table
, name
, nlen
, oldval
, oldlenp
, newval
, newlen
, context
);
154 if (newval
&& newlen
) {
163 static char lasat_bcastaddr
[16];
165 void update_bcastaddr(void)
169 ip
= (lasat_board_info
.li_eeprom_info
.ipaddr
&
170 lasat_board_info
.li_eeprom_info
.netmask
) |
171 ~lasat_board_info
.li_eeprom_info
.netmask
;
173 sprintf(lasat_bcastaddr
, "%d.%d.%d.%d",
180 static char proc_lasat_ipbuf
[32];
181 /* Parsing of IP address */
182 int proc_lasat_ip(ctl_table
*table
, int write
, struct file
*filp
,
183 void *buffer
, size_t *lenp
, loff_t
*ppos
)
189 if (!table
->data
|| !table
->maxlen
|| !*lenp
||
195 down(&lasat_info_sem
);
199 while (len
< *lenp
) {
200 if(get_user(c
, p
++)) {
204 if (c
== 0 || c
== '\n')
208 if (len
>= sizeof(proc_lasat_ipbuf
)-1)
209 len
= sizeof(proc_lasat_ipbuf
) - 1;
210 if (copy_from_user(proc_lasat_ipbuf
, buffer
, len
))
215 proc_lasat_ipbuf
[len
] = 0;
217 /* Now see if we can convert it to a valid IP */
218 ip
= in_aton(proc_lasat_ipbuf
);
219 *(unsigned int *)(table
->data
) = ip
;
220 lasat_write_eeprom_info();
222 ip
= *(unsigned int *)(table
->data
);
223 sprintf(proc_lasat_ipbuf
, "%d.%d.%d.%d",
228 len
= strlen(proc_lasat_ipbuf
);
232 if(copy_to_user(buffer
, proc_lasat_ipbuf
, len
)) {
237 if(put_user('\n', ((char *) buffer
) + len
)) {
250 #endif /* defined(CONFIG_INET) */
252 static int sysctl_lasat_eeprom_value(ctl_table
*table
, int *name
, int nlen
,
253 void *oldval
, size_t *oldlenp
,
254 void *newval
, size_t newlen
,
259 down(&lasat_info_sem
);
260 r
= sysctl_intvec(table
, name
, nlen
, oldval
, oldlenp
, newval
, newlen
, context
);
266 if (newval
&& newlen
)
268 if (name
&& *name
== LASAT_PRID
)
269 lasat_board_info
.li_eeprom_info
.prid
= *(int*)newval
;
271 lasat_write_eeprom_info();
272 lasat_init_board_info();
279 int proc_lasat_eeprom_value(ctl_table
*table
, int write
, struct file
*filp
,
280 void *buffer
, size_t *lenp
, loff_t
*ppos
)
283 down(&lasat_info_sem
);
284 r
= proc_dointvec(table
, write
, filp
, buffer
, lenp
, ppos
);
285 if ( (!write
) || r
) {
289 if (filp
&& filp
->f_dentry
)
291 if (!strcmp(filp
->f_dentry
->d_name
.name
, "prid"))
292 lasat_board_info
.li_eeprom_info
.prid
= lasat_board_info
.li_prid
;
293 if (!strcmp(filp
->f_dentry
->d_name
.name
, "debugaccess"))
294 lasat_board_info
.li_eeprom_info
.debugaccess
= lasat_board_info
.li_debugaccess
;
296 lasat_write_eeprom_info();
301 extern int lasat_boot_to_service
;
305 static ctl_table lasat_table
[] = {
306 {LASAT_CPU_HZ
, "cpu-hz", &lasat_board_info
.li_cpu_hz
, sizeof(int),
307 0444, NULL
, &proc_dointvec
, &sysctl_intvec
},
308 {LASAT_BUS_HZ
, "bus-hz", &lasat_board_info
.li_bus_hz
, sizeof(int),
309 0444, NULL
, &proc_dointvec
, &sysctl_intvec
},
310 {LASAT_MODEL
, "bmid", &lasat_board_info
.li_bmid
, sizeof(int),
311 0444, NULL
, &proc_dointvec
, &sysctl_intvec
},
312 {LASAT_PRID
, "prid", &lasat_board_info
.li_prid
, sizeof(int),
313 0644, NULL
, &proc_lasat_eeprom_value
, &sysctl_lasat_eeprom_value
},
315 {LASAT_IPADDR
, "ipaddr", &lasat_board_info
.li_eeprom_info
.ipaddr
, sizeof(int),
316 0644, NULL
, &proc_lasat_ip
, &sysctl_lasat_intvec
},
317 {LASAT_NETMASK
, "netmask", &lasat_board_info
.li_eeprom_info
.netmask
, sizeof(int),
318 0644, NULL
, &proc_lasat_ip
, &sysctl_lasat_intvec
},
319 {LASAT_BCAST
, "bcastaddr", &lasat_bcastaddr
,
320 sizeof(lasat_bcastaddr
), 0600, NULL
,
321 &proc_dostring
, &sysctl_string
},
323 {LASAT_PASSWORD
, "passwd_hash", &lasat_board_info
.li_eeprom_info
.passwd_hash
, sizeof(lasat_board_info
.li_eeprom_info
.passwd_hash
),
324 0600, NULL
, &proc_dolasatstring
, &sysctl_lasatstring
},
325 {LASAT_SBOOT
, "boot-service", &lasat_boot_to_service
, sizeof(int),
326 0644, NULL
, &proc_dointvec
, &sysctl_intvec
},
328 {LASAT_RTC
, "rtc", &rtctmp
, sizeof(int),
329 0644, NULL
, &proc_dolasatrtc
, &sysctl_lasat_rtc
},
331 {LASAT_NAMESTR
, "namestr", &lasat_board_info
.li_namestr
, sizeof(lasat_board_info
.li_namestr
),
332 0444, NULL
, &proc_dostring
, &sysctl_string
},
333 {LASAT_TYPESTR
, "typestr", &lasat_board_info
.li_typestr
, sizeof(lasat_board_info
.li_typestr
),
334 0444, NULL
, &proc_dostring
, &sysctl_string
},
338 #define CTL_LASAT 1 // CTL_ANY ???
339 static ctl_table lasat_root_table
[] = {
340 { CTL_LASAT
, "lasat", NULL
, 0, 0555, lasat_table
},
344 static int __init
lasat_register_sysctl(void)
346 struct ctl_table_header
*lasat_table_header
;
349 register_sysctl_table(lasat_root_table
, 0);
354 __initcall(lasat_register_sysctl
);
355 #endif /* CONFIG_SYSCTL */