diff options
Diffstat (limited to 'drivers/net/wireless/arlan-proc.c')
-rw-r--r-- | drivers/net/wireless/arlan-proc.c | 1262 |
1 files changed, 1262 insertions, 0 deletions
diff --git a/drivers/net/wireless/arlan-proc.c b/drivers/net/wireless/arlan-proc.c new file mode 100644 index 000000000000..a2cca521f444 --- /dev/null +++ b/drivers/net/wireless/arlan-proc.c | |||
@@ -0,0 +1,1262 @@ | |||
1 | #include <linux/config.h> | ||
2 | #include "arlan.h" | ||
3 | |||
4 | #include <linux/sysctl.h> | ||
5 | |||
6 | #ifdef CONFIG_PROC_FS | ||
7 | |||
8 | /* void enableReceive(struct net_device* dev); | ||
9 | */ | ||
10 | |||
11 | |||
12 | |||
13 | #define ARLAN_STR_SIZE 0x2ff0 | ||
14 | #define DEV_ARLAN_INFO 1 | ||
15 | #define DEV_ARLAN 1 | ||
16 | #define SARLG(type,var) {\ | ||
17 | pos += sprintf(arlan_drive_info+pos, "%s\t=\t0x%x\n", #var, READSHMB(priva->card->var)); \ | ||
18 | } | ||
19 | |||
20 | #define SARLBN(type,var,nn) {\ | ||
21 | pos += sprintf(arlan_drive_info+pos, "%s\t=\t0x",#var);\ | ||
22 | for (i=0; i < nn; i++ ) pos += sprintf(arlan_drive_info+pos, "%02x",READSHMB(priva->card->var[i]));\ | ||
23 | pos += sprintf(arlan_drive_info+pos, "\n"); \ | ||
24 | } | ||
25 | |||
26 | #define SARLBNpln(type,var,nn) {\ | ||
27 | for (i=0; i < nn; i++ ) pos += sprintf(arlan_drive_info+pos, "%02x",READSHMB(priva->card->var[i]));\ | ||
28 | } | ||
29 | |||
30 | #define SARLSTR(var,nn) {\ | ||
31 | char tmpStr[400];\ | ||
32 | int tmpLn = nn;\ | ||
33 | if (nn > 399 ) tmpLn = 399; \ | ||
34 | memcpy(tmpStr,(char *) priva->conf->var,tmpLn);\ | ||
35 | tmpStr[tmpLn] = 0; \ | ||
36 | pos += sprintf(arlan_drive_info+pos, "%s\t=\t%s \n",#var,priva->conf->var);\ | ||
37 | } | ||
38 | |||
39 | #define SARLUC(var) SARLG(u_char, var) | ||
40 | #define SARLUCN(var,nn) SARLBN(u_char,var, nn) | ||
41 | #define SARLUS(var) SARLG(u_short, var) | ||
42 | #define SARLUSN(var,nn) SARLBN(u_short,var, nn) | ||
43 | #define SARLUI(var) SARLG(u_int, var) | ||
44 | |||
45 | #define SARLUSA(var) {\ | ||
46 | u_short tmpVar;\ | ||
47 | memcpy(&tmpVar, (short *) priva->conf->var,2); \ | ||
48 | pos += sprintf(arlan_drive_info+pos, "%s\t=\t0x%x\n",#var, tmpVar);\ | ||
49 | } | ||
50 | |||
51 | #define SARLUIA(var) {\ | ||
52 | u_int tmpVar;\ | ||
53 | memcpy(&tmpVar, (int* )priva->conf->var,4); \ | ||
54 | pos += sprintf(arlan_drive_info+pos, "%s\t=\t0x%x\n",#var, tmpVar);\ | ||
55 | } | ||
56 | |||
57 | |||
58 | static const char *arlan_diagnostic_info_string(struct net_device *dev) | ||
59 | { | ||
60 | |||
61 | struct arlan_private *priv = netdev_priv(dev); | ||
62 | volatile struct arlan_shmem __iomem *arlan = priv->card; | ||
63 | u_char diagnosticInfo; | ||
64 | |||
65 | READSHM(diagnosticInfo, arlan->diagnosticInfo, u_char); | ||
66 | |||
67 | switch (diagnosticInfo) | ||
68 | { | ||
69 | case 0xFF: | ||
70 | return "Diagnostic info is OK"; | ||
71 | case 0xFE: | ||
72 | return "ERROR EPROM Checksum error "; | ||
73 | case 0xFD: | ||
74 | return "ERROR Local Ram Test Failed "; | ||
75 | case 0xFC: | ||
76 | return "ERROR SCC failure "; | ||
77 | case 0xFB: | ||
78 | return "ERROR BackBone failure "; | ||
79 | case 0xFA: | ||
80 | return "ERROR transceiver not found "; | ||
81 | case 0xF9: | ||
82 | return "ERROR no more address space "; | ||
83 | case 0xF8: | ||
84 | return "ERROR Checksum error "; | ||
85 | case 0xF7: | ||
86 | return "ERROR Missing SS Code"; | ||
87 | case 0xF6: | ||
88 | return "ERROR Invalid config format"; | ||
89 | case 0xF5: | ||
90 | return "ERROR Reserved errorcode F5"; | ||
91 | case 0xF4: | ||
92 | return "ERROR Invalid spreading code/channel number"; | ||
93 | case 0xF3: | ||
94 | return "ERROR Load Code Error"; | ||
95 | case 0xF2: | ||
96 | return "ERROR Reserver errorcode F2 "; | ||
97 | case 0xF1: | ||
98 | return "ERROR Invalid command receivec by LAN card "; | ||
99 | case 0xF0: | ||
100 | return "ERROR Invalid parameter found in command "; | ||
101 | case 0xEF: | ||
102 | return "ERROR On-chip timer failure "; | ||
103 | case 0xEE: | ||
104 | return "ERROR T410 timer failure "; | ||
105 | case 0xED: | ||
106 | return "ERROR Too Many TxEnable commands "; | ||
107 | case 0xEC: | ||
108 | return "ERROR EEPROM error on radio module "; | ||
109 | default: | ||
110 | return "ERROR unknown Diagnostic info reply code "; | ||
111 | } | ||
112 | } | ||
113 | |||
114 | static const char *arlan_hardware_type_string(struct net_device *dev) | ||
115 | { | ||
116 | u_char hardwareType; | ||
117 | struct arlan_private *priv = netdev_priv(dev); | ||
118 | volatile struct arlan_shmem __iomem *arlan = priv->card; | ||
119 | |||
120 | READSHM(hardwareType, arlan->hardwareType, u_char); | ||
121 | switch (hardwareType) | ||
122 | { | ||
123 | case 0x00: | ||
124 | return "type A450"; | ||
125 | case 0x01: | ||
126 | return "type A650 "; | ||
127 | case 0x04: | ||
128 | return "type TMA coproc"; | ||
129 | case 0x0D: | ||
130 | return "type A650E "; | ||
131 | case 0x18: | ||
132 | return "type TMA coproc Australian"; | ||
133 | case 0x19: | ||
134 | return "type A650A "; | ||
135 | case 0x26: | ||
136 | return "type TMA coproc European"; | ||
137 | case 0x2E: | ||
138 | return "type A655 "; | ||
139 | case 0x2F: | ||
140 | return "type A655A "; | ||
141 | case 0x30: | ||
142 | return "type A655E "; | ||
143 | case 0x0B: | ||
144 | return "type A670 "; | ||
145 | case 0x0C: | ||
146 | return "type A670E "; | ||
147 | case 0x2D: | ||
148 | return "type A670A "; | ||
149 | case 0x0F: | ||
150 | return "type A411T"; | ||
151 | case 0x16: | ||
152 | return "type A411TA"; | ||
153 | case 0x1B: | ||
154 | return "type A440T"; | ||
155 | case 0x1C: | ||
156 | return "type A412T"; | ||
157 | case 0x1E: | ||
158 | return "type A412TA"; | ||
159 | case 0x22: | ||
160 | return "type A411TE"; | ||
161 | case 0x24: | ||
162 | return "type A412TE"; | ||
163 | case 0x27: | ||
164 | return "type A671T "; | ||
165 | case 0x29: | ||
166 | return "type A671TA "; | ||
167 | case 0x2B: | ||
168 | return "type A671TE "; | ||
169 | case 0x31: | ||
170 | return "type A415T "; | ||
171 | case 0x33: | ||
172 | return "type A415TA "; | ||
173 | case 0x35: | ||
174 | return "type A415TE "; | ||
175 | case 0x37: | ||
176 | return "type A672"; | ||
177 | case 0x39: | ||
178 | return "type A672A "; | ||
179 | case 0x3B: | ||
180 | return "type A672T"; | ||
181 | case 0x6B: | ||
182 | return "type IC2200"; | ||
183 | default: | ||
184 | return "type A672T"; | ||
185 | } | ||
186 | } | ||
187 | #ifdef ARLAN_DEBUGGING | ||
188 | static void arlan_print_diagnostic_info(struct net_device *dev) | ||
189 | { | ||
190 | int i; | ||
191 | u_char diagnosticInfo; | ||
192 | u_short diagnosticOffset; | ||
193 | u_char hardwareType; | ||
194 | struct arlan_private *priv = netdev_priv(dev); | ||
195 | volatile struct arlan_shmem __iomem *arlan = priv->card; | ||
196 | |||
197 | // ARLAN_DEBUG_ENTRY("arlan_print_diagnostic_info"); | ||
198 | |||
199 | if (READSHMB(arlan->configuredStatusFlag) == 0) | ||
200 | printk("Arlan: Card NOT configured\n"); | ||
201 | else | ||
202 | printk("Arlan: Card is configured\n"); | ||
203 | |||
204 | READSHM(diagnosticInfo, arlan->diagnosticInfo, u_char); | ||
205 | READSHM(diagnosticOffset, arlan->diagnosticOffset, u_short); | ||
206 | |||
207 | printk(KERN_INFO "%s\n", arlan_diagnostic_info_string(dev)); | ||
208 | |||
209 | if (diagnosticInfo != 0xff) | ||
210 | printk("%s arlan: Diagnostic Offset %d \n", dev->name, diagnosticOffset); | ||
211 | |||
212 | printk("arlan: LAN CODE ID = "); | ||
213 | for (i = 0; i < 6; i++) | ||
214 | DEBUGSHM(1, "%03d:", arlan->lanCardNodeId[i], u_char); | ||
215 | printk("\n"); | ||
216 | |||
217 | printk("arlan: Arlan BroadCast address = "); | ||
218 | for (i = 0; i < 6; i++) | ||
219 | DEBUGSHM(1, "%03d:", arlan->broadcastAddress[i], u_char); | ||
220 | printk("\n"); | ||
221 | |||
222 | READSHM(hardwareType, arlan->hardwareType, u_char); | ||
223 | printk(KERN_INFO "%s\n", arlan_hardware_type_string(dev)); | ||
224 | |||
225 | |||
226 | DEBUGSHM(1, "arlan: channelNumber=%d\n", arlan->channelNumber, u_char); | ||
227 | DEBUGSHM(1, "arlan: channelSet=%d\n", arlan->channelSet, u_char); | ||
228 | DEBUGSHM(1, "arlan: spreadingCode=%d\n", arlan->spreadingCode, u_char); | ||
229 | DEBUGSHM(1, "arlan: radioNodeId=%d\n", arlan->radioNodeId, u_short); | ||
230 | DEBUGSHM(1, "arlan: SID =%d\n", arlan->SID, u_short); | ||
231 | DEBUGSHM(1, "arlan: rxOffset=%d\n", arlan->rxOffset, u_short); | ||
232 | |||
233 | DEBUGSHM(1, "arlan: registration mode is %d\n", arlan->registrationMode, u_char); | ||
234 | |||
235 | printk("arlan: name= "); | ||
236 | IFDEBUG(1) | ||
237 | |||
238 | for (i = 0; i < 16; i++) | ||
239 | { | ||
240 | char c; | ||
241 | READSHM(c, arlan->name[i], char); | ||
242 | if (c) | ||
243 | printk("%c", c); | ||
244 | } | ||
245 | printk("\n"); | ||
246 | |||
247 | // ARLAN_DEBUG_EXIT("arlan_print_diagnostic_info"); | ||
248 | |||
249 | } | ||
250 | |||
251 | |||
252 | /****************************** TEST MEMORY **************/ | ||
253 | |||
254 | static int arlan_hw_test_memory(struct net_device *dev) | ||
255 | { | ||
256 | u_char *ptr; | ||
257 | int i; | ||
258 | int memlen = sizeof(struct arlan_shmem) - 0xF; /* avoid control register */ | ||
259 | volatile char *arlan_mem = (char *) (dev->mem_start); | ||
260 | struct arlan_private *priv = netdev_priv(dev); | ||
261 | volatile struct arlan_shmem __iomem *arlan = priv->card; | ||
262 | char pattern; | ||
263 | |||
264 | ptr = NULL; | ||
265 | |||
266 | /* hold card in reset state */ | ||
267 | setHardwareReset(dev); | ||
268 | |||
269 | /* test memory */ | ||
270 | pattern = 0; | ||
271 | for (i = 0; i < memlen; i++) | ||
272 | WRITESHM(arlan_mem[i], ((u_char) pattern++), u_char); | ||
273 | |||
274 | pattern = 0; | ||
275 | for (i = 0; i < memlen; i++) | ||
276 | { | ||
277 | char res; | ||
278 | READSHM(res, arlan_mem[i], char); | ||
279 | if (res != pattern++) | ||
280 | { | ||
281 | printk(KERN_ERR "Arlan driver memory test 1 failed \n"); | ||
282 | return -1; | ||
283 | } | ||
284 | } | ||
285 | |||
286 | pattern = 0; | ||
287 | for (i = 0; i < memlen; i++) | ||
288 | WRITESHM(arlan_mem[i], ~(pattern++), char); | ||
289 | |||
290 | pattern = 0; | ||
291 | for (i = 0; i < memlen; i++) | ||
292 | { | ||
293 | char res; | ||
294 | READSHM(res, arlan_mem[i], char); | ||
295 | if (res != ~(pattern++)) | ||
296 | { | ||
297 | printk(KERN_ERR "Arlan driver memory test 2 failed \n"); | ||
298 | return -1; | ||
299 | } | ||
300 | } | ||
301 | |||
302 | /* zero memory */ | ||
303 | for (i = 0; i < memlen; i++) | ||
304 | WRITESHM(arlan_mem[i], 0x00, char); | ||
305 | |||
306 | IFDEBUG(1) printk(KERN_INFO "Arlan: memory tests ok\n"); | ||
307 | |||
308 | /* set reset flag and then release reset */ | ||
309 | WRITESHM(arlan->resetFlag, 0xff, u_char); | ||
310 | |||
311 | clearChannelAttention(dev); | ||
312 | clearHardwareReset(dev); | ||
313 | |||
314 | /* wait for reset flag to become zero, we'll wait for two seconds */ | ||
315 | if (arlan_command(dev, ARLAN_COMMAND_LONG_WAIT_NOW)) | ||
316 | { | ||
317 | printk(KERN_ERR "%s arlan: failed to come back from memory test\n", dev->name); | ||
318 | return -1; | ||
319 | } | ||
320 | return 0; | ||
321 | } | ||
322 | |||
323 | static int arlan_setup_card_by_book(struct net_device *dev) | ||
324 | { | ||
325 | u_char irqLevel, configuredStatusFlag; | ||
326 | struct arlan_private *priv = netdev_priv(dev); | ||
327 | volatile struct arlan_shmem __iomem *arlan = priv->card; | ||
328 | |||
329 | // ARLAN_DEBUG_ENTRY("arlan_setup_card"); | ||
330 | |||
331 | READSHM(configuredStatusFlag, arlan->configuredStatusFlag, u_char); | ||
332 | |||
333 | IFDEBUG(10) | ||
334 | if (configuredStatusFlag != 0) | ||
335 | IFDEBUG(10) printk("arlan: CARD IS CONFIGURED\n"); | ||
336 | else | ||
337 | IFDEBUG(10) printk("arlan: card is NOT configured\n"); | ||
338 | |||
339 | if (testMemory || (READSHMB(arlan->diagnosticInfo) != 0xff)) | ||
340 | if (arlan_hw_test_memory(dev)) | ||
341 | return -1; | ||
342 | |||
343 | DEBUGSHM(4, "arlan configuredStatus = %d \n", arlan->configuredStatusFlag, u_char); | ||
344 | DEBUGSHM(4, "arlan driver diagnostic: 0x%2x\n", arlan->diagnosticInfo, u_char); | ||
345 | |||
346 | /* issue nop command - no interrupt */ | ||
347 | arlan_command(dev, ARLAN_COMMAND_NOOP); | ||
348 | if (arlan_command(dev, ARLAN_COMMAND_WAIT_NOW) != 0) | ||
349 | return -1; | ||
350 | |||
351 | IFDEBUG(50) printk("1st Noop successfully executed !!\n"); | ||
352 | |||
353 | /* try to turn on the arlan interrupts */ | ||
354 | clearClearInterrupt(dev); | ||
355 | setClearInterrupt(dev); | ||
356 | setInterruptEnable(dev); | ||
357 | |||
358 | /* issue nop command - with interrupt */ | ||
359 | |||
360 | arlan_command(dev, ARLAN_COMMAND_NOOPINT); | ||
361 | if (arlan_command(dev, ARLAN_COMMAND_WAIT_NOW) != 0) | ||
362 | return -1; | ||
363 | |||
364 | |||
365 | IFDEBUG(50) printk("2nd Noop successfully executed !!\n"); | ||
366 | |||
367 | READSHM(irqLevel, arlan->irqLevel, u_char) | ||
368 | |||
369 | if (irqLevel != dev->irq) | ||
370 | { | ||
371 | IFDEBUG(1) printk(KERN_WARNING "arlan dip switches set irq to %d\n", irqLevel); | ||
372 | printk(KERN_WARNING "device driver irq set to %d - does not match\n", dev->irq); | ||
373 | dev->irq = irqLevel; | ||
374 | } | ||
375 | else | ||
376 | IFDEBUG(2) printk("irq level is OK\n"); | ||
377 | |||
378 | |||
379 | IFDEBUG(3) arlan_print_diagnostic_info(dev); | ||
380 | |||
381 | arlan_command(dev, ARLAN_COMMAND_CONF); | ||
382 | |||
383 | READSHM(configuredStatusFlag, arlan->configuredStatusFlag, u_char); | ||
384 | if (configuredStatusFlag == 0) | ||
385 | { | ||
386 | printk(KERN_WARNING "arlan configure failed\n"); | ||
387 | return -1; | ||
388 | } | ||
389 | arlan_command(dev, ARLAN_COMMAND_LONG_WAIT_NOW); | ||
390 | arlan_command(dev, ARLAN_COMMAND_RX); | ||
391 | arlan_command(dev, ARLAN_COMMAND_LONG_WAIT_NOW); | ||
392 | printk(KERN_NOTICE "%s: arlan driver version %s loaded\n", | ||
393 | dev->name, arlan_version); | ||
394 | |||
395 | // ARLAN_DEBUG_EXIT("arlan_setup_card"); | ||
396 | |||
397 | return 0; /* no errors */ | ||
398 | } | ||
399 | #endif | ||
400 | |||
401 | #ifdef ARLAN_PROC_INTERFACE | ||
402 | #ifdef ARLAN_PROC_SHM_DUMP | ||
403 | |||
404 | static char arlan_drive_info[ARLAN_STR_SIZE] = "A655\n\0"; | ||
405 | |||
406 | static int arlan_sysctl_info(ctl_table * ctl, int write, struct file *filp, | ||
407 | void __user *buffer, size_t * lenp, loff_t *ppos) | ||
408 | { | ||
409 | int i; | ||
410 | int retv, pos, devnum; | ||
411 | struct arlan_private *priva = NULL; | ||
412 | struct net_device *dev; | ||
413 | pos = 0; | ||
414 | if (write) | ||
415 | { | ||
416 | printk("wrirte: "); | ||
417 | for (i = 0; i < 100; i++) | ||
418 | printk("adi %x \n", arlan_drive_info[i]); | ||
419 | } | ||
420 | if (ctl->procname == NULL || arlan_drive_info == NULL) | ||
421 | { | ||
422 | printk(KERN_WARNING " procname is NULL in sysctl_table or arlan_drive_info is NULL \n at arlan module\n "); | ||
423 | return -1; | ||
424 | } | ||
425 | devnum = ctl->procname[5] - '0'; | ||
426 | if (devnum < 0 || devnum > MAX_ARLANS - 1) | ||
427 | { | ||
428 | printk(KERN_WARNING "too strange devnum in procfs parse\n "); | ||
429 | return -1; | ||
430 | } | ||
431 | else if (arlan_device[devnum] == NULL) | ||
432 | { | ||
433 | if (ctl->procname) | ||
434 | pos += sprintf(arlan_drive_info + pos, "\t%s\n\n", ctl->procname); | ||
435 | pos += sprintf(arlan_drive_info + pos, "No device found here \n"); | ||
436 | goto final; | ||
437 | } | ||
438 | else | ||
439 | priva = arlan_device[devnum]->priv; | ||
440 | |||
441 | if (priva == NULL) | ||
442 | { | ||
443 | printk(KERN_WARNING " Could not find the device private in arlan procsys, bad\n "); | ||
444 | return -1; | ||
445 | } | ||
446 | dev = arlan_device[devnum]; | ||
447 | |||
448 | memcpy_fromio(priva->conf, priva->card, sizeof(struct arlan_shmem)); | ||
449 | |||
450 | pos = sprintf(arlan_drive_info, "Arlan info \n"); | ||
451 | /* Header Signature */ | ||
452 | SARLSTR(textRegion, 48); | ||
453 | SARLUC(resetFlag); | ||
454 | pos += sprintf(arlan_drive_info + pos, "diagnosticInfo\t=\t%s \n", arlan_diagnostic_info_string(dev)); | ||
455 | SARLUC(diagnosticInfo); | ||
456 | SARLUS(diagnosticOffset); | ||
457 | SARLUCN(_1, 12); | ||
458 | SARLUCN(lanCardNodeId, 6); | ||
459 | SARLUCN(broadcastAddress, 6); | ||
460 | pos += sprintf(arlan_drive_info + pos, "hardwareType =\t %s \n", arlan_hardware_type_string(dev)); | ||
461 | SARLUC(hardwareType); | ||
462 | SARLUC(majorHardwareVersion); | ||
463 | SARLUC(minorHardwareVersion); | ||
464 | SARLUC(radioModule); | ||
465 | SARLUC(defaultChannelSet); | ||
466 | SARLUCN(_2, 47); | ||
467 | |||
468 | /* Control/Status Block - 0x0080 */ | ||
469 | SARLUC(interruptInProgress); | ||
470 | SARLUC(cntrlRegImage); | ||
471 | |||
472 | SARLUCN(_3, 14); | ||
473 | SARLUC(commandByte); | ||
474 | SARLUCN(commandParameter, 15); | ||
475 | |||
476 | /* Receive Status - 0x00a0 */ | ||
477 | SARLUC(rxStatus); | ||
478 | SARLUC(rxFrmType); | ||
479 | SARLUS(rxOffset); | ||
480 | SARLUS(rxLength); | ||
481 | SARLUCN(rxSrc, 6); | ||
482 | SARLUC(rxBroadcastFlag); | ||
483 | SARLUC(rxQuality); | ||
484 | SARLUC(scrambled); | ||
485 | SARLUCN(_4, 1); | ||
486 | |||
487 | /* Transmit Status - 0x00b0 */ | ||
488 | SARLUC(txStatus); | ||
489 | SARLUC(txAckQuality); | ||
490 | SARLUC(numRetries); | ||
491 | SARLUCN(_5, 14); | ||
492 | SARLUCN(registeredRouter, 6); | ||
493 | SARLUCN(backboneRouter, 6); | ||
494 | SARLUC(registrationStatus); | ||
495 | SARLUC(configuredStatusFlag); | ||
496 | SARLUCN(_6, 1); | ||
497 | SARLUCN(ultimateDestAddress, 6); | ||
498 | SARLUCN(immedDestAddress, 6); | ||
499 | SARLUCN(immedSrcAddress, 6); | ||
500 | SARLUS(rxSequenceNumber); | ||
501 | SARLUC(assignedLocaltalkAddress); | ||
502 | SARLUCN(_7, 27); | ||
503 | |||
504 | /* System Parameter Block */ | ||
505 | |||
506 | /* - Driver Parameters (Novell Specific) */ | ||
507 | |||
508 | SARLUS(txTimeout); | ||
509 | SARLUS(transportTime); | ||
510 | SARLUCN(_8, 4); | ||
511 | |||
512 | /* - Configuration Parameters */ | ||
513 | SARLUC(irqLevel); | ||
514 | SARLUC(spreadingCode); | ||
515 | SARLUC(channelSet); | ||
516 | SARLUC(channelNumber); | ||
517 | SARLUS(radioNodeId); | ||
518 | SARLUCN(_9, 2); | ||
519 | SARLUC(scramblingDisable); | ||
520 | SARLUC(radioType); | ||
521 | SARLUS(routerId); | ||
522 | SARLUCN(_10, 9); | ||
523 | SARLUC(txAttenuation); | ||
524 | SARLUIA(systemId); | ||
525 | SARLUS(globalChecksum); | ||
526 | SARLUCN(_11, 4); | ||
527 | SARLUS(maxDatagramSize); | ||
528 | SARLUS(maxFrameSize); | ||
529 | SARLUC(maxRetries); | ||
530 | SARLUC(receiveMode); | ||
531 | SARLUC(priority); | ||
532 | SARLUC(rootOrRepeater); | ||
533 | SARLUCN(specifiedRouter, 6); | ||
534 | SARLUS(fastPollPeriod); | ||
535 | SARLUC(pollDecay); | ||
536 | SARLUSA(fastPollDelay); | ||
537 | SARLUC(arlThreshold); | ||
538 | SARLUC(arlDecay); | ||
539 | SARLUCN(_12, 1); | ||
540 | SARLUS(specRouterTimeout); | ||
541 | SARLUCN(_13, 5); | ||
542 | |||
543 | /* Scrambled Area */ | ||
544 | SARLUIA(SID); | ||
545 | SARLUCN(encryptionKey, 12); | ||
546 | SARLUIA(_14); | ||
547 | SARLUSA(waitTime); | ||
548 | SARLUSA(lParameter); | ||
549 | SARLUCN(_15, 3); | ||
550 | SARLUS(headerSize); | ||
551 | SARLUS(sectionChecksum); | ||
552 | |||
553 | SARLUC(registrationMode); | ||
554 | SARLUC(registrationFill); | ||
555 | SARLUS(pollPeriod); | ||
556 | SARLUS(refreshPeriod); | ||
557 | SARLSTR(name, 16); | ||
558 | SARLUCN(NID, 6); | ||
559 | SARLUC(localTalkAddress); | ||
560 | SARLUC(codeFormat); | ||
561 | SARLUC(numChannels); | ||
562 | SARLUC(channel1); | ||
563 | SARLUC(channel2); | ||
564 | SARLUC(channel3); | ||
565 | SARLUC(channel4); | ||
566 | SARLUCN(SSCode, 59); | ||
567 | |||
568 | /* SARLUCN( _16, 0x140); | ||
569 | */ | ||
570 | /* Statistics Block - 0x0300 */ | ||
571 | SARLUC(hostcpuLock); | ||
572 | SARLUC(lancpuLock); | ||
573 | SARLUCN(resetTime, 18); | ||
574 | SARLUIA(numDatagramsTransmitted); | ||
575 | SARLUIA(numReTransmissions); | ||
576 | SARLUIA(numFramesDiscarded); | ||
577 | SARLUIA(numDatagramsReceived); | ||
578 | SARLUIA(numDuplicateReceivedFrames); | ||
579 | SARLUIA(numDatagramsDiscarded); | ||
580 | SARLUS(maxNumReTransmitDatagram); | ||
581 | SARLUS(maxNumReTransmitFrames); | ||
582 | SARLUS(maxNumConsecutiveDuplicateFrames); | ||
583 | /* misaligned here so we have to go to characters */ | ||
584 | SARLUIA(numBytesTransmitted); | ||
585 | SARLUIA(numBytesReceived); | ||
586 | SARLUIA(numCRCErrors); | ||
587 | SARLUIA(numLengthErrors); | ||
588 | SARLUIA(numAbortErrors); | ||
589 | SARLUIA(numTXUnderruns); | ||
590 | SARLUIA(numRXOverruns); | ||
591 | SARLUIA(numHoldOffs); | ||
592 | SARLUIA(numFramesTransmitted); | ||
593 | SARLUIA(numFramesReceived); | ||
594 | SARLUIA(numReceiveFramesLost); | ||
595 | SARLUIA(numRXBufferOverflows); | ||
596 | SARLUIA(numFramesDiscardedAddrMismatch); | ||
597 | SARLUIA(numFramesDiscardedSIDMismatch); | ||
598 | SARLUIA(numPollsTransmistted); | ||
599 | SARLUIA(numPollAcknowledges); | ||
600 | SARLUIA(numStatusTimeouts); | ||
601 | SARLUIA(numNACKReceived); | ||
602 | SARLUS(auxCmd); | ||
603 | SARLUCN(dumpPtr, 4); | ||
604 | SARLUC(dumpVal); | ||
605 | SARLUC(wireTest); | ||
606 | |||
607 | /* next 4 seems too long for procfs, over single page ? | ||
608 | SARLUCN( _17, 0x86); | ||
609 | SARLUCN( txBuffer, 0x800); | ||
610 | SARLUCN( rxBuffer, 0x800); | ||
611 | SARLUCN( _18, 0x0bff); | ||
612 | */ | ||
613 | |||
614 | pos += sprintf(arlan_drive_info + pos, "rxRing\t=\t0x"); | ||
615 | for (i = 0; i < 0x50; i++) | ||
616 | pos += sprintf(arlan_drive_info + pos, "%02x", ((char *) priva->conf)[priva->conf->rxOffset + i]); | ||
617 | pos += sprintf(arlan_drive_info + pos, "\n"); | ||
618 | |||
619 | SARLUC(configStatus); | ||
620 | SARLUC(_22); | ||
621 | SARLUC(progIOCtrl); | ||
622 | SARLUC(shareMBase); | ||
623 | SARLUC(controlRegister); | ||
624 | |||
625 | pos += sprintf(arlan_drive_info + pos, " total %d chars\n", pos); | ||
626 | if (ctl) | ||
627 | if (ctl->procname) | ||
628 | pos += sprintf(arlan_drive_info + pos, " driver name : %s\n", ctl->procname); | ||
629 | final: | ||
630 | *lenp = pos; | ||
631 | |||
632 | if (!write) | ||
633 | retv = proc_dostring(ctl, write, filp, buffer, lenp, ppos); | ||
634 | else | ||
635 | { | ||
636 | *lenp = 0; | ||
637 | return -1; | ||
638 | } | ||
639 | return retv; | ||
640 | } | ||
641 | |||
642 | |||
643 | static int arlan_sysctl_info161719(ctl_table * ctl, int write, struct file *filp, | ||
644 | void __user *buffer, size_t * lenp, loff_t *ppos) | ||
645 | { | ||
646 | int i; | ||
647 | int retv, pos, devnum; | ||
648 | struct arlan_private *priva = NULL; | ||
649 | |||
650 | pos = 0; | ||
651 | devnum = ctl->procname[5] - '0'; | ||
652 | if (arlan_device[devnum] == NULL) | ||
653 | { | ||
654 | pos += sprintf(arlan_drive_info + pos, "No device found here \n"); | ||
655 | goto final; | ||
656 | } | ||
657 | else | ||
658 | priva = arlan_device[devnum]->priv; | ||
659 | if (priva == NULL) | ||
660 | { | ||
661 | printk(KERN_WARNING " Could not find the device private in arlan procsys, bad\n "); | ||
662 | return -1; | ||
663 | } | ||
664 | memcpy_fromio(priva->conf, priva->card, sizeof(struct arlan_shmem)); | ||
665 | SARLUCN(_16, 0xC0); | ||
666 | SARLUCN(_17, 0x6A); | ||
667 | SARLUCN(_18, 14); | ||
668 | SARLUCN(_19, 0x86); | ||
669 | SARLUCN(_21, 0x3fd); | ||
670 | |||
671 | final: | ||
672 | *lenp = pos; | ||
673 | retv = proc_dostring(ctl, write, filp, buffer, lenp, ppos); | ||
674 | return retv; | ||
675 | } | ||
676 | |||
677 | static int arlan_sysctl_infotxRing(ctl_table * ctl, int write, struct file *filp, | ||
678 | void __user *buffer, size_t * lenp, loff_t *ppos) | ||
679 | { | ||
680 | int i; | ||
681 | int retv, pos, devnum; | ||
682 | struct arlan_private *priva = NULL; | ||
683 | |||
684 | pos = 0; | ||
685 | devnum = ctl->procname[5] - '0'; | ||
686 | if (arlan_device[devnum] == NULL) | ||
687 | { | ||
688 | pos += sprintf(arlan_drive_info + pos, "No device found here \n"); | ||
689 | goto final; | ||
690 | } | ||
691 | else | ||
692 | priva = arlan_device[devnum]->priv; | ||
693 | if (priva == NULL) | ||
694 | { | ||
695 | printk(KERN_WARNING " Could not find the device private in arlan procsys, bad\n "); | ||
696 | return -1; | ||
697 | } | ||
698 | memcpy_fromio(priva->conf, priva->card, sizeof(struct arlan_shmem)); | ||
699 | SARLBNpln(u_char, txBuffer, 0x800); | ||
700 | final: | ||
701 | *lenp = pos; | ||
702 | retv = proc_dostring(ctl, write, filp, buffer, lenp, ppos); | ||
703 | return retv; | ||
704 | } | ||
705 | |||
706 | static int arlan_sysctl_inforxRing(ctl_table * ctl, int write, struct file *filp, | ||
707 | void __user *buffer, size_t * lenp, loff_t *ppos) | ||
708 | { | ||
709 | int i; | ||
710 | int retv, pos, devnum; | ||
711 | struct arlan_private *priva = NULL; | ||
712 | |||
713 | pos = 0; | ||
714 | devnum = ctl->procname[5] - '0'; | ||
715 | if (arlan_device[devnum] == NULL) | ||
716 | { | ||
717 | pos += sprintf(arlan_drive_info + pos, "No device found here \n"); | ||
718 | goto final; | ||
719 | } else | ||
720 | priva = arlan_device[devnum]->priv; | ||
721 | if (priva == NULL) | ||
722 | { | ||
723 | printk(KERN_WARNING " Could not find the device private in arlan procsys, bad\n "); | ||
724 | return -1; | ||
725 | } | ||
726 | memcpy_fromio(priva->conf, priva->card, sizeof(struct arlan_shmem)); | ||
727 | SARLBNpln(u_char, rxBuffer, 0x800); | ||
728 | final: | ||
729 | *lenp = pos; | ||
730 | retv = proc_dostring(ctl, write, filp, buffer, lenp, ppos); | ||
731 | return retv; | ||
732 | } | ||
733 | |||
734 | static int arlan_sysctl_info18(ctl_table * ctl, int write, struct file *filp, | ||
735 | void __user *buffer, size_t * lenp, loff_t *ppos) | ||
736 | { | ||
737 | int i; | ||
738 | int retv, pos, devnum; | ||
739 | struct arlan_private *priva = NULL; | ||
740 | |||
741 | pos = 0; | ||
742 | devnum = ctl->procname[5] - '0'; | ||
743 | if (arlan_device[devnum] == NULL) | ||
744 | { | ||
745 | pos += sprintf(arlan_drive_info + pos, "No device found here \n"); | ||
746 | goto final; | ||
747 | } | ||
748 | else | ||
749 | priva = arlan_device[devnum]->priv; | ||
750 | if (priva == NULL) | ||
751 | { | ||
752 | printk(KERN_WARNING " Could not find the device private in arlan procsys, bad\n "); | ||
753 | return -1; | ||
754 | } | ||
755 | memcpy_fromio(priva->conf, priva->card, sizeof(struct arlan_shmem)); | ||
756 | SARLBNpln(u_char, _18, 0x800); | ||
757 | |||
758 | final: | ||
759 | *lenp = pos; | ||
760 | retv = proc_dostring(ctl, write, filp, buffer, lenp, ppos); | ||
761 | return retv; | ||
762 | } | ||
763 | |||
764 | |||
765 | #endif /* #ifdef ARLAN_PROC_SHM_DUMP */ | ||
766 | |||
767 | |||
768 | static char conf_reset_result[200]; | ||
769 | |||
770 | static int arlan_configure(ctl_table * ctl, int write, struct file *filp, | ||
771 | void __user *buffer, size_t * lenp, loff_t *ppos) | ||
772 | { | ||
773 | int pos = 0; | ||
774 | int devnum = ctl->procname[6] - '0'; | ||
775 | struct arlan_private *priv; | ||
776 | |||
777 | if (devnum < 0 || devnum > MAX_ARLANS - 1) | ||
778 | { | ||
779 | printk(KERN_WARNING "too strange devnum in procfs parse\n "); | ||
780 | return -1; | ||
781 | } | ||
782 | else if (arlan_device[devnum] != NULL) | ||
783 | { | ||
784 | priv = arlan_device[devnum]->priv; | ||
785 | |||
786 | arlan_command(arlan_device[devnum], ARLAN_COMMAND_CLEAN_AND_CONF); | ||
787 | } | ||
788 | else | ||
789 | return -1; | ||
790 | |||
791 | *lenp = pos; | ||
792 | return proc_dostring(ctl, write, filp, buffer, lenp, ppos); | ||
793 | } | ||
794 | |||
795 | static int arlan_sysctl_reset(ctl_table * ctl, int write, struct file *filp, | ||
796 | void __user *buffer, size_t * lenp, loff_t *ppos) | ||
797 | { | ||
798 | int pos = 0; | ||
799 | int devnum = ctl->procname[5] - '0'; | ||
800 | struct arlan_private *priv; | ||
801 | |||
802 | if (devnum < 0 || devnum > MAX_ARLANS - 1) | ||
803 | { | ||
804 | printk(KERN_WARNING "too strange devnum in procfs parse\n "); | ||
805 | return -1; | ||
806 | } | ||
807 | else if (arlan_device[devnum] != NULL) | ||
808 | { | ||
809 | priv = arlan_device[devnum]->priv; | ||
810 | arlan_command(arlan_device[devnum], ARLAN_COMMAND_CLEAN_AND_RESET); | ||
811 | |||
812 | } else | ||
813 | return -1; | ||
814 | *lenp = pos + 3; | ||
815 | return proc_dostring(ctl, write, filp, buffer, lenp, ppos); | ||
816 | } | ||
817 | |||
818 | |||
819 | /* Place files in /proc/sys/dev/arlan */ | ||
820 | #define CTBLN(num,card,nam) \ | ||
821 | { .ctl_name = num,\ | ||
822 | .procname = #nam,\ | ||
823 | .data = &(arlan_conf[card].nam),\ | ||
824 | .maxlen = sizeof(int), .mode = 0600, .proc_handler = &proc_dointvec} | ||
825 | #ifdef ARLAN_DEBUGGING | ||
826 | |||
827 | #define ARLAN_PROC_DEBUG_ENTRIES \ | ||
828 | { .ctl_name = 48, .procname = "entry_exit_debug",\ | ||
829 | .data = &arlan_entry_and_exit_debug,\ | ||
830 | .maxlen = sizeof(int), .mode = 0600, .proc_handler = &proc_dointvec},\ | ||
831 | { .ctl_name = 49, .procname = "debug", .data = &arlan_debug,\ | ||
832 | .maxlen = sizeof(int), .mode = 0600, .proc_handler = &proc_dointvec}, | ||
833 | #else | ||
834 | #define ARLAN_PROC_DEBUG_ENTRIES | ||
835 | #endif | ||
836 | |||
837 | #define ARLAN_SYSCTL_TABLE_TOTAL(cardNo)\ | ||
838 | CTBLN(1,cardNo,spreadingCode),\ | ||
839 | CTBLN(2,cardNo, channelNumber),\ | ||
840 | CTBLN(3,cardNo, scramblingDisable),\ | ||
841 | CTBLN(4,cardNo, txAttenuation),\ | ||
842 | CTBLN(5,cardNo, systemId), \ | ||
843 | CTBLN(6,cardNo, maxDatagramSize),\ | ||
844 | CTBLN(7,cardNo, maxFrameSize),\ | ||
845 | CTBLN(8,cardNo, maxRetries),\ | ||
846 | CTBLN(9,cardNo, receiveMode),\ | ||
847 | CTBLN(10,cardNo, priority),\ | ||
848 | CTBLN(11,cardNo, rootOrRepeater),\ | ||
849 | CTBLN(12,cardNo, SID),\ | ||
850 | CTBLN(13,cardNo, registrationMode),\ | ||
851 | CTBLN(14,cardNo, registrationFill),\ | ||
852 | CTBLN(15,cardNo, localTalkAddress),\ | ||
853 | CTBLN(16,cardNo, codeFormat),\ | ||
854 | CTBLN(17,cardNo, numChannels),\ | ||
855 | CTBLN(18,cardNo, channel1),\ | ||
856 | CTBLN(19,cardNo, channel2),\ | ||
857 | CTBLN(20,cardNo, channel3),\ | ||
858 | CTBLN(21,cardNo, channel4),\ | ||
859 | CTBLN(22,cardNo, txClear),\ | ||
860 | CTBLN(23,cardNo, txRetries),\ | ||
861 | CTBLN(24,cardNo, txRouting),\ | ||
862 | CTBLN(25,cardNo, txScrambled),\ | ||
863 | CTBLN(26,cardNo, rxParameter),\ | ||
864 | CTBLN(27,cardNo, txTimeoutMs),\ | ||
865 | CTBLN(28,cardNo, waitCardTimeout),\ | ||
866 | CTBLN(29,cardNo, channelSet), \ | ||
867 | {.ctl_name = 30, .procname = "name",\ | ||
868 | .data = arlan_conf[cardNo].siteName,\ | ||
869 | .maxlen = 16, .mode = 0600, .proc_handler = &proc_dostring},\ | ||
870 | CTBLN(31,cardNo,waitTime),\ | ||
871 | CTBLN(32,cardNo,lParameter),\ | ||
872 | CTBLN(33,cardNo,_15),\ | ||
873 | CTBLN(34,cardNo,headerSize),\ | ||
874 | CTBLN(36,cardNo,tx_delay_ms),\ | ||
875 | CTBLN(37,cardNo,retries),\ | ||
876 | CTBLN(38,cardNo,ReTransmitPacketMaxSize),\ | ||
877 | CTBLN(39,cardNo,waitReTransmitPacketMaxSize),\ | ||
878 | CTBLN(40,cardNo,fastReTransCount),\ | ||
879 | CTBLN(41,cardNo,driverRetransmissions),\ | ||
880 | CTBLN(42,cardNo,txAckTimeoutMs),\ | ||
881 | CTBLN(43,cardNo,registrationInterrupts),\ | ||
882 | CTBLN(44,cardNo,hardwareType),\ | ||
883 | CTBLN(45,cardNo,radioType),\ | ||
884 | CTBLN(46,cardNo,writeEEPROM),\ | ||
885 | CTBLN(47,cardNo,writeRadioType),\ | ||
886 | ARLAN_PROC_DEBUG_ENTRIES\ | ||
887 | CTBLN(50,cardNo,in_speed),\ | ||
888 | CTBLN(51,cardNo,out_speed),\ | ||
889 | CTBLN(52,cardNo,in_speed10),\ | ||
890 | CTBLN(53,cardNo,out_speed10),\ | ||
891 | CTBLN(54,cardNo,in_speed_max),\ | ||
892 | CTBLN(55,cardNo,out_speed_max),\ | ||
893 | CTBLN(56,cardNo,measure_rate),\ | ||
894 | CTBLN(57,cardNo,pre_Command_Wait),\ | ||
895 | CTBLN(58,cardNo,rx_tweak1),\ | ||
896 | CTBLN(59,cardNo,rx_tweak2),\ | ||
897 | CTBLN(60,cardNo,tx_queue_len),\ | ||
898 | |||
899 | |||
900 | |||
901 | static ctl_table arlan_conf_table0[] = | ||
902 | { | ||
903 | ARLAN_SYSCTL_TABLE_TOTAL(0) | ||
904 | |||
905 | #ifdef ARLAN_PROC_SHM_DUMP | ||
906 | { | ||
907 | .ctl_name = 150, | ||
908 | .procname = "arlan0-txRing", | ||
909 | .data = &arlan_drive_info, | ||
910 | .maxlen = ARLAN_STR_SIZE, | ||
911 | .mode = 0400, | ||
912 | .proc_handler = &arlan_sysctl_infotxRing, | ||
913 | }, | ||
914 | { | ||
915 | .ctl_name = 151, | ||
916 | .procname = "arlan0-rxRing", | ||
917 | .data = &arlan_drive_info, | ||
918 | .maxlen = ARLAN_STR_SIZE, | ||
919 | .mode = 0400, | ||
920 | .proc_handler = &arlan_sysctl_inforxRing, | ||
921 | }, | ||
922 | { | ||
923 | .ctl_name = 152, | ||
924 | .procname = "arlan0-18", | ||
925 | .data = &arlan_drive_info, | ||
926 | .maxlen = ARLAN_STR_SIZE, | ||
927 | .mode = 0400, | ||
928 | .proc_handler = &arlan_sysctl_info18, | ||
929 | }, | ||
930 | { | ||
931 | .ctl_name = 153, | ||
932 | .procname = "arlan0-ring", | ||
933 | .data = &arlan_drive_info, | ||
934 | .maxlen = ARLAN_STR_SIZE, | ||
935 | .mode = 0400, | ||
936 | .proc_handler = &arlan_sysctl_info161719, | ||
937 | }, | ||
938 | { | ||
939 | .ctl_name = 154, | ||
940 | .procname = "arlan0-shm-cpy", | ||
941 | .data = &arlan_drive_info, | ||
942 | .maxlen = ARLAN_STR_SIZE, | ||
943 | .mode = 0400, | ||
944 | .proc_handler = &arlan_sysctl_info, | ||
945 | }, | ||
946 | #endif | ||
947 | { | ||
948 | .ctl_name = 155, | ||
949 | .procname = "config0", | ||
950 | .data = &conf_reset_result, | ||
951 | .maxlen = 100, | ||
952 | .mode = 0400, | ||
953 | .proc_handler = &arlan_configure | ||
954 | }, | ||
955 | { | ||
956 | .ctl_name = 156, | ||
957 | .procname = "reset0", | ||
958 | .data = &conf_reset_result, | ||
959 | .maxlen = 100, | ||
960 | .mode = 0400, | ||
961 | .proc_handler = &arlan_sysctl_reset, | ||
962 | }, | ||
963 | { .ctl_name = 0 } | ||
964 | }; | ||
965 | |||
966 | static ctl_table arlan_conf_table1[] = | ||
967 | { | ||
968 | |||
969 | ARLAN_SYSCTL_TABLE_TOTAL(1) | ||
970 | |||
971 | #ifdef ARLAN_PROC_SHM_DUMP | ||
972 | { | ||
973 | .ctl_name = 150, | ||
974 | .procname = "arlan1-txRing", | ||
975 | .data = &arlan_drive_info, | ||
976 | .maxlen = ARLAN_STR_SIZE, | ||
977 | .mode = 0400, | ||
978 | .proc_handler = &arlan_sysctl_infotxRing, | ||
979 | }, | ||
980 | { | ||
981 | .ctl_name = 151, | ||
982 | .procname = "arlan1-rxRing", | ||
983 | .data = &arlan_drive_info, | ||
984 | .maxlen = ARLAN_STR_SIZE, | ||
985 | .mode = 0400, | ||
986 | .proc_handler = &arlan_sysctl_inforxRing, | ||
987 | }, | ||
988 | { | ||
989 | .ctl_name = 152, | ||
990 | .procname = "arlan1-18", | ||
991 | .data = &arlan_drive_info, | ||
992 | .maxlen = ARLAN_STR_SIZE, | ||
993 | .mode = 0400, | ||
994 | .proc_handler = &arlan_sysctl_info18, | ||
995 | }, | ||
996 | { | ||
997 | .ctl_name = 153, | ||
998 | .procname = "arlan1-ring", | ||
999 | .data = &arlan_drive_info, | ||
1000 | .maxlen = ARLAN_STR_SIZE, | ||
1001 | .mode = 0400, | ||
1002 | .proc_handler = &arlan_sysctl_info161719, | ||
1003 | }, | ||
1004 | { | ||
1005 | .ctl_name = 154, | ||
1006 | .procname = "arlan1-shm-cpy", | ||
1007 | .data = &arlan_drive_info, | ||
1008 | .maxlen = ARLAN_STR_SIZE, | ||
1009 | .mode = 0400, | ||
1010 | .proc_handler = &arlan_sysctl_info, | ||
1011 | }, | ||
1012 | #endif | ||
1013 | { | ||
1014 | .ctl_name = 155, | ||
1015 | .procname = "config1", | ||
1016 | .data = &conf_reset_result, | ||
1017 | .maxlen = 100, | ||
1018 | .mode = 0400, | ||
1019 | .proc_handler = &arlan_configure, | ||
1020 | }, | ||
1021 | { | ||
1022 | .ctl_name = 156, | ||
1023 | .procname = "reset1", | ||
1024 | .data = &conf_reset_result, | ||
1025 | .maxlen = 100, | ||
1026 | .mode = 0400, | ||
1027 | .proc_handler = &arlan_sysctl_reset, | ||
1028 | }, | ||
1029 | { .ctl_name = 0 } | ||
1030 | }; | ||
1031 | |||
1032 | static ctl_table arlan_conf_table2[] = | ||
1033 | { | ||
1034 | |||
1035 | ARLAN_SYSCTL_TABLE_TOTAL(2) | ||
1036 | |||
1037 | #ifdef ARLAN_PROC_SHM_DUMP | ||
1038 | { | ||
1039 | .ctl_name = 150, | ||
1040 | .procname = "arlan2-txRing", | ||
1041 | .data = &arlan_drive_info, | ||
1042 | .maxlen = ARLAN_STR_SIZE, | ||
1043 | .mode = 0400, | ||
1044 | .proc_handler = &arlan_sysctl_infotxRing, | ||
1045 | }, | ||
1046 | { | ||
1047 | .ctl_name = 151, | ||
1048 | .procname = "arlan2-rxRing", | ||
1049 | .data = &arlan_drive_info, | ||
1050 | .maxlen = ARLAN_STR_SIZE, | ||
1051 | .mode = 0400, | ||
1052 | .proc_handler = &arlan_sysctl_inforxRing, | ||
1053 | }, | ||
1054 | { | ||
1055 | .ctl_name = 152, | ||
1056 | .procname = "arlan2-18", | ||
1057 | .data = &arlan_drive_info, | ||
1058 | .maxlen = ARLAN_STR_SIZE, | ||
1059 | .mode = 0400, | ||
1060 | .proc_handler = &arlan_sysctl_info18, | ||
1061 | }, | ||
1062 | { | ||
1063 | .ctl_name = 153, | ||
1064 | .procname = "arlan2-ring", | ||
1065 | .data = &arlan_drive_info, | ||
1066 | .maxlen = ARLAN_STR_SIZE, | ||
1067 | .mode = 0400, | ||
1068 | .proc_handler = &arlan_sysctl_info161719, | ||
1069 | }, | ||
1070 | { | ||
1071 | .ctl_name = 154, | ||
1072 | .procname = "arlan2-shm-cpy", | ||
1073 | .data = &arlan_drive_info, | ||
1074 | .maxlen = ARLAN_STR_SIZE, | ||
1075 | .mode = 0400, | ||
1076 | .proc_handler = &arlan_sysctl_info, | ||
1077 | }, | ||
1078 | #endif | ||
1079 | { | ||
1080 | .ctl_name = 155, | ||
1081 | .procname = "config2", | ||
1082 | .data = &conf_reset_result, | ||
1083 | .maxlen = 100, | ||
1084 | .mode = 0400, | ||
1085 | .proc_handler = &arlan_configure, | ||
1086 | }, | ||
1087 | { | ||
1088 | .ctl_name = 156, | ||
1089 | .procname = "reset2", | ||
1090 | .data = &conf_reset_result, | ||
1091 | .maxlen = 100, | ||
1092 | .mode = 0400, | ||
1093 | .proc_handler = &arlan_sysctl_reset, | ||
1094 | }, | ||
1095 | { .ctl_name = 0 } | ||
1096 | }; | ||
1097 | |||
1098 | static ctl_table arlan_conf_table3[] = | ||
1099 | { | ||
1100 | |||
1101 | ARLAN_SYSCTL_TABLE_TOTAL(3) | ||
1102 | |||
1103 | #ifdef ARLAN_PROC_SHM_DUMP | ||
1104 | { | ||
1105 | .ctl_name = 150, | ||
1106 | .procname = "arlan3-txRing", | ||
1107 | .data = &arlan_drive_info, | ||
1108 | .maxlen = ARLAN_STR_SIZE, | ||
1109 | .mode = 0400, | ||
1110 | .proc_handler = &arlan_sysctl_infotxRing, | ||
1111 | }, | ||
1112 | { | ||
1113 | .ctl_name = 151, | ||
1114 | .procname = "arlan3-rxRing", | ||
1115 | .data = &arlan_drive_info, | ||
1116 | .maxlen = ARLAN_STR_SIZE, | ||
1117 | .mode = 0400, | ||
1118 | .proc_handler = &arlan_sysctl_inforxRing, | ||
1119 | }, | ||
1120 | { | ||
1121 | .ctl_name = 152, | ||
1122 | .procname = "arlan3-18", | ||
1123 | .data = &arlan_drive_info, | ||
1124 | .maxlen = ARLAN_STR_SIZE, | ||
1125 | .mode = 0400, | ||
1126 | .proc_handler = &arlan_sysctl_info18, | ||
1127 | }, | ||
1128 | { | ||
1129 | .ctl_name = 153, | ||
1130 | .procname = "arlan3-ring", | ||
1131 | .data = &arlan_drive_info, | ||
1132 | .maxlen = ARLAN_STR_SIZE, | ||
1133 | .mode = 0400, | ||
1134 | .proc_handler = &arlan_sysctl_info161719, | ||
1135 | }, | ||
1136 | { | ||
1137 | .ctl_name = 154, | ||
1138 | .procname = "arlan3-shm-cpy", | ||
1139 | .data = &arlan_drive_info, | ||
1140 | .maxlen = ARLAN_STR_SIZE, | ||
1141 | .mode = 0400, | ||
1142 | .proc_handler = &arlan_sysctl_info, | ||
1143 | }, | ||
1144 | #endif | ||
1145 | { | ||
1146 | .ctl_name = 155, | ||
1147 | .procname = "config3", | ||
1148 | .data = &conf_reset_result, | ||
1149 | .maxlen = 100, | ||
1150 | .mode = 0400, | ||
1151 | .proc_handler = &arlan_configure, | ||
1152 | }, | ||
1153 | { | ||
1154 | .ctl_name = 156, | ||
1155 | .procname = "reset3", | ||
1156 | .data = &conf_reset_result, | ||
1157 | .maxlen = 100, | ||
1158 | .mode = 0400, | ||
1159 | .proc_handler = &arlan_sysctl_reset, | ||
1160 | }, | ||
1161 | { .ctl_name = 0 } | ||
1162 | }; | ||
1163 | |||
1164 | |||
1165 | |||
1166 | static ctl_table arlan_table[] = | ||
1167 | { | ||
1168 | { | ||
1169 | .ctl_name = 0, | ||
1170 | .procname = "arlan0", | ||
1171 | .maxlen = 0, | ||
1172 | .mode = 0600, | ||
1173 | .child = arlan_conf_table0, | ||
1174 | }, | ||
1175 | { | ||
1176 | .ctl_name = 0, | ||
1177 | .procname = "arlan1", | ||
1178 | .maxlen = 0, | ||
1179 | .mode = 0600, | ||
1180 | .child = arlan_conf_table1, | ||
1181 | }, | ||
1182 | { | ||
1183 | .ctl_name = 0, | ||
1184 | .procname = "arlan2", | ||
1185 | .maxlen = 0, | ||
1186 | .mode = 0600, | ||
1187 | .child = arlan_conf_table2, | ||
1188 | }, | ||
1189 | { | ||
1190 | .ctl_name = 0, | ||
1191 | .procname = "arlan3", | ||
1192 | .maxlen = 0, | ||
1193 | .mode = 0600, | ||
1194 | .child = arlan_conf_table3, | ||
1195 | }, | ||
1196 | { .ctl_name = 0 } | ||
1197 | }; | ||
1198 | |||
1199 | #else | ||
1200 | |||
1201 | static ctl_table arlan_table[MAX_ARLANS + 1] = | ||
1202 | { | ||
1203 | { .ctl_name = 0 } | ||
1204 | }; | ||
1205 | #endif | ||
1206 | #else | ||
1207 | |||
1208 | static ctl_table arlan_table[MAX_ARLANS + 1] = | ||
1209 | { | ||
1210 | { .ctl_name = 0 } | ||
1211 | }; | ||
1212 | #endif | ||
1213 | |||
1214 | |||
1215 | // static int mmtu = 1234; | ||
1216 | |||
1217 | static ctl_table arlan_root_table[] = | ||
1218 | { | ||
1219 | { | ||
1220 | .ctl_name = 254, | ||
1221 | .procname = "arlan", | ||
1222 | .maxlen = 0, | ||
1223 | .mode = 0555, | ||
1224 | .child = arlan_table, | ||
1225 | }, | ||
1226 | { .ctl_name = 0 } | ||
1227 | }; | ||
1228 | |||
1229 | /* Make sure that /proc/sys/dev is there */ | ||
1230 | //static ctl_table arlan_device_root_table[] = | ||
1231 | //{ | ||
1232 | // {CTL_DEV, "dev", NULL, 0, 0555, arlan_root_table}, | ||
1233 | // {0} | ||
1234 | //}; | ||
1235 | |||
1236 | |||
1237 | #ifdef CONFIG_PROC_FS | ||
1238 | static struct ctl_table_header *arlan_device_sysctl_header; | ||
1239 | |||
1240 | int __init init_arlan_proc(void) | ||
1241 | { | ||
1242 | |||
1243 | int i = 0; | ||
1244 | if (arlan_device_sysctl_header) | ||
1245 | return 0; | ||
1246 | for (i = 0; i < MAX_ARLANS && arlan_device[i]; i++) | ||
1247 | arlan_table[i].ctl_name = i + 1; | ||
1248 | arlan_device_sysctl_header = register_sysctl_table(arlan_root_table, 0); | ||
1249 | if (!arlan_device_sysctl_header) | ||
1250 | return -1; | ||
1251 | |||
1252 | return 0; | ||
1253 | |||
1254 | } | ||
1255 | |||
1256 | void __exit cleanup_arlan_proc(void) | ||
1257 | { | ||
1258 | unregister_sysctl_table(arlan_device_sysctl_header); | ||
1259 | arlan_device_sysctl_header = NULL; | ||
1260 | |||
1261 | } | ||
1262 | #endif | ||