sysctl: pass kernel pointers to ->proc_handler
[linux-block.git] / arch / mips / lasat / sysctl.c
CommitLineData
41173abc 1// SPDX-License-Identifier: GPL-2.0-only
1f21d2bd
BM
2/*
3 * Thomas Horsten <thh@lasat.com>
4 * Copyright (C) 2000 LASAT Networks A/S.
5 *
1f21d2bd
BM
6 * Routines specific to the LASAT boards
7 */
8#include <linux/types.h>
9#include <asm/lasat/lasat.h>
10
1f21d2bd
BM
11#include <linux/sysctl.h>
12#include <linux/stddef.h>
13#include <linux/init.h>
14#include <linux/fs.h>
15#include <linux/ctype.h>
16#include <linux/string.h>
17#include <linux/net.h>
18#include <linux/inet.h>
1f21d2bd
BM
19#include <linux/uaccess.h>
20
4b550488
RB
21#include <asm/time.h>
22
1f34f2e4 23#ifdef CONFIG_DS1603
1f21d2bd 24#include "ds1603.h"
1f34f2e4 25#endif
1f21d2bd 26
1f21d2bd
BM
27
28/* And the same for proc */
d3478d5b 29int proc_dolasatstring(struct ctl_table *table, int write,
1f21d2bd
BM
30 void *buffer, size_t *lenp, loff_t *ppos)
31{
32 int r;
33
8d65af78 34 r = proc_dostring(table, write, buffer, lenp, ppos);
1f34f2e4 35 if ((!write) || r)
1f21d2bd 36 return r;
1f34f2e4 37
1f21d2bd 38 lasat_write_eeprom_info();
1f21d2bd
BM
39
40 return 0;
41}
42
1f34f2e4 43#ifdef CONFIG_DS1603
1f21d2bd
BM
44static int rtctmp;
45
1f21d2bd 46/* proc function to read/write RealTime Clock */
d3478d5b 47int proc_dolasatrtc(struct ctl_table *table, int write,
1f21d2bd
BM
48 void *buffer, size_t *lenp, loff_t *ppos)
49{
2ee96632 50 struct timespec64 ts;
1f21d2bd
BM
51 int r;
52
1f21d2bd 53 if (!write) {
2ee96632 54 read_persistent_clock64(&ts);
d4f587c6 55 rtctmp = ts.tv_sec;
1f21d2bd
BM
56 /* check for time < 0 and set to 0 */
57 if (rtctmp < 0)
58 rtctmp = 0;
59 }
8d65af78 60 r = proc_dointvec(table, write, buffer, lenp, ppos);
1f34f2e4 61 if (r)
1f21d2bd 62 return r;
1f34f2e4 63
f06e7aa4
BW
64 if (write) {
65 /*
66 * Due to the RTC hardware limitation, we can not actually
67 * use the full 64-bit range here.
68 */
69 ts.tv_sec = rtctmp;
70 ts.tv_nsec = 0;
71
72 update_persistent_clock64(ts);
73 }
1f21d2bd
BM
74
75 return 0;
76}
77#endif
78
1f21d2bd 79#ifdef CONFIG_INET
d3478d5b 80int proc_lasat_ip(struct ctl_table *table, int write,
1f21d2bd
BM
81 void *buffer, size_t *lenp, loff_t *ppos)
82{
83 unsigned int ip;
84 char *p, c;
85 int len;
1f34f2e4 86 char ipbuf[32];
1f21d2bd
BM
87
88 if (!table->data || !table->maxlen || !*lenp ||
89 (*ppos && !write)) {
90 *lenp = 0;
91 return 0;
92 }
93
1f21d2bd
BM
94 if (write) {
95 len = 0;
96 p = buffer;
97 while (len < *lenp) {
32927393
CH
98 c = *p;
99 p++;
1f21d2bd
BM
100 if (c == 0 || c == '\n')
101 break;
102 len++;
103 }
1f34f2e4
TH
104 if (len >= sizeof(ipbuf)-1)
105 len = sizeof(ipbuf) - 1;
32927393 106 memcpy(ipbuf, buffer, len);
1f34f2e4 107 ipbuf[len] = 0;
1f21d2bd
BM
108 *ppos += *lenp;
109 /* Now see if we can convert it to a valid IP */
1f34f2e4 110 ip = in_aton(ipbuf);
1f21d2bd
BM
111 *(unsigned int *)(table->data) = ip;
112 lasat_write_eeprom_info();
113 } else {
114 ip = *(unsigned int *)(table->data);
1f34f2e4 115 sprintf(ipbuf, "%d.%d.%d.%d",
70342287
RB
116 (ip) & 0xff,
117 (ip >> 8) & 0xff,
1f21d2bd
BM
118 (ip >> 16) & 0xff,
119 (ip >> 24) & 0xff);
1f34f2e4 120 len = strlen(ipbuf);
1f21d2bd
BM
121 if (len > *lenp)
122 len = *lenp;
123 if (len)
32927393 124 memcpy(buffer, ipbuf, len);
1f21d2bd 125 if (len < *lenp) {
32927393 126 *((char *)buffer + len) = '\n';
1f21d2bd
BM
127 len++;
128 }
129 *lenp = len;
130 *ppos += len;
131 }
1f21d2bd
BM
132
133 return 0;
134}
1f34f2e4 135#endif
1f21d2bd 136
d3478d5b 137int proc_lasat_prid(struct ctl_table *table, int write,
1f21d2bd
BM
138 void *buffer, size_t *lenp, loff_t *ppos)
139{
140 int r;
141
8d65af78 142 r = proc_dointvec(table, write, buffer, lenp, ppos);
1f34f2e4 143 if (r < 0)
1f21d2bd 144 return r;
1f34f2e4
TH
145 if (write) {
146 lasat_board_info.li_eeprom_info.prid =
147 lasat_board_info.li_prid;
148 lasat_write_eeprom_info();
149 lasat_init_board_info();
1f21d2bd 150 }
1f21d2bd
BM
151 return 0;
152}
153
154extern int lasat_boot_to_service;
155
d3478d5b 156static struct ctl_table lasat_table[] = {
1f21d2bd 157 {
1f21d2bd
BM
158 .procname = "cpu-hz",
159 .data = &lasat_board_info.li_cpu_hz,
160 .maxlen = sizeof(int),
161 .mode = 0444,
6d456111 162 .proc_handler = proc_dointvec,
1f21d2bd
BM
163 },
164 {
1f21d2bd
BM
165 .procname = "bus-hz",
166 .data = &lasat_board_info.li_bus_hz,
167 .maxlen = sizeof(int),
168 .mode = 0444,
6d456111 169 .proc_handler = proc_dointvec,
1f21d2bd
BM
170 },
171 {
1f21d2bd
BM
172 .procname = "bmid",
173 .data = &lasat_board_info.li_bmid,
174 .maxlen = sizeof(int),
175 .mode = 0444,
6d456111 176 .proc_handler = proc_dointvec,
1f21d2bd
BM
177 },
178 {
1f21d2bd
BM
179 .procname = "prid",
180 .data = &lasat_board_info.li_prid,
181 .maxlen = sizeof(int),
182 .mode = 0644,
6d456111 183 .proc_handler = proc_lasat_prid,
606d62fa 184 },
1f21d2bd
BM
185#ifdef CONFIG_INET
186 {
1f21d2bd
BM
187 .procname = "ipaddr",
188 .data = &lasat_board_info.li_eeprom_info.ipaddr,
189 .maxlen = sizeof(int),
190 .mode = 0644,
6d456111 191 .proc_handler = proc_lasat_ip,
1f21d2bd
BM
192 },
193 {
1f21d2bd
BM
194 .procname = "netmask",
195 .data = &lasat_board_info.li_eeprom_info.netmask,
196 .maxlen = sizeof(int),
197 .mode = 0644,
6d456111 198 .proc_handler = proc_lasat_ip,
1f21d2bd 199 },
1f21d2bd
BM
200#endif
201 {
1f21d2bd
BM
202 .procname = "passwd_hash",
203 .data = &lasat_board_info.li_eeprom_info.passwd_hash,
204 .maxlen =
205 sizeof(lasat_board_info.li_eeprom_info.passwd_hash),
206 .mode = 0600,
6d456111 207 .proc_handler = proc_dolasatstring,
1f21d2bd
BM
208 },
209 {
1f21d2bd
BM
210 .procname = "boot-service",
211 .data = &lasat_boot_to_service,
212 .maxlen = sizeof(int),
213 .mode = 0644,
6d456111 214 .proc_handler = proc_dointvec,
1f21d2bd
BM
215 },
216#ifdef CONFIG_DS1603
217 {
1f21d2bd
BM
218 .procname = "rtc",
219 .data = &rtctmp,
220 .maxlen = sizeof(int),
221 .mode = 0644,
6d456111 222 .proc_handler = proc_dolasatrtc,
1f21d2bd
BM
223 },
224#endif
225 {
1f21d2bd
BM
226 .procname = "namestr",
227 .data = &lasat_board_info.li_namestr,
228 .maxlen = sizeof(lasat_board_info.li_namestr),
229 .mode = 0444,
6d456111 230 .proc_handler = proc_dostring,
1f21d2bd
BM
231 },
232 {
1f21d2bd
BM
233 .procname = "typestr",
234 .data = &lasat_board_info.li_typestr,
235 .maxlen = sizeof(lasat_board_info.li_typestr),
236 .mode = 0444,
6d456111 237 .proc_handler = proc_dostring,
1f21d2bd
BM
238 },
239 {}
240};
241
d3478d5b 242static struct ctl_table lasat_root_table[] = {
1f21d2bd 243 {
1f21d2bd
BM
244 .procname = "lasat",
245 .mode = 0555,
246 .child = lasat_table
247 },
248 {}
249};
250
251static int __init lasat_register_sysctl(void)
252{
253 struct ctl_table_header *lasat_table_header;
254
255 lasat_table_header =
256 register_sysctl_table(lasat_root_table);
1f34f2e4
TH
257 if (!lasat_table_header) {
258 printk(KERN_ERR "Unable to register LASAT sysctl\n");
259 return -ENOMEM;
260 }
1f21d2bd
BM
261
262 return 0;
263}
264
1bab0b62 265arch_initcall(lasat_register_sysctl);