Commit | Line | Data |
---|---|---|
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 | 29 | int 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 |
44 | static int rtctmp; |
45 | ||
1f21d2bd | 46 | /* proc function to read/write RealTime Clock */ |
d3478d5b | 47 | int 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 | 80 | int 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 | 137 | int 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 | ||
154 | extern int lasat_boot_to_service; | |
155 | ||
d3478d5b | 156 | static 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 | 242 | static struct ctl_table lasat_root_table[] = { |
1f21d2bd | 243 | { |
1f21d2bd BM |
244 | .procname = "lasat", |
245 | .mode = 0555, | |
246 | .child = lasat_table | |
247 | }, | |
248 | {} | |
249 | }; | |
250 | ||
251 | static 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 | 265 | arch_initcall(lasat_register_sysctl); |