arlan-proc.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:26k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #include <linux/config.h>
  2. #include "arlan.h"
  3. #include <linux/sysctl.h>
  4. #ifdef CONFIG_PROC_FS
  5. #include <linux/version.h>
  6. /* void enableReceive(struct net_device* dev);
  7. */
  8. #define ARLAN_STR_SIZE  0x2ff0
  9. #define DEV_ARLAN_INFO  1
  10. #define DEV_ARLAN  1
  11. #define SARLG(type,var) {
  12. pos += sprintf(arlan_drive_info+pos, "%st=t0x%xn", #var, READSHMB(priva->card->var));
  13. }
  14. #define SARLBN(type,var,nn) {
  15. pos += sprintf(arlan_drive_info+pos, "%st=t0x",#var);
  16. for (i=0; i < nn; i++ ) pos += sprintf(arlan_drive_info+pos, "%02x",READSHMB(priva->card->var[i]));
  17. pos += sprintf(arlan_drive_info+pos, "n");
  18. }
  19. #define SARLBNpln(type,var,nn) {
  20. for (i=0; i < nn; i++ ) pos += sprintf(arlan_drive_info+pos, "%02x",READSHMB(priva->card->var[i]));
  21. }
  22. #define SARLSTR(var,nn) {
  23. char tmpStr[400];
  24. int  tmpLn = nn;
  25. if (nn > 399 ) tmpLn = 399; 
  26. memcpy(tmpStr,(char *) priva->conf->var,tmpLn);
  27. tmpStr[tmpLn] = 0; 
  28. pos += sprintf(arlan_drive_info+pos, "%st=t%s n",#var,priva->conf->var);
  29. }
  30. #define SARLUC(var)   SARLG(u_char, var)
  31. #define SARLUCN(var,nn) SARLBN(u_char,var, nn)
  32. #define SARLUS(var) SARLG(u_short, var)
  33. #define SARLUSN(var,nn) SARLBN(u_short,var, nn)
  34. #define SARLUI(var) SARLG(u_int, var)
  35. #define SARLUSA(var) {
  36. u_short tmpVar;
  37. memcpy(&tmpVar, (short *) priva->conf->var,2); 
  38. pos += sprintf(arlan_drive_info+pos, "%st=t0x%xn",#var, tmpVar);
  39. }
  40. #define SARLUIA(var) {
  41. u_int tmpVar;
  42. memcpy(&tmpVar, (int* )priva->conf->var,4); 
  43. pos += sprintf(arlan_drive_info+pos, "%st=t0x%xn",#var, tmpVar);
  44. }
  45. static const char *arlan_diagnostic_info_string(struct net_device *dev)
  46. {
  47. volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card;
  48. u_char diagnosticInfo;
  49. READSHM(diagnosticInfo, arlan->diagnosticInfo, u_char);
  50. switch (diagnosticInfo)
  51. {
  52. case 0xFF:
  53. return "Diagnostic info is OK";
  54. case 0xFE:
  55. return "ERROR EPROM Checksum error ";
  56. case 0xFD:
  57. return "ERROR Local Ram Test Failed ";
  58. case 0xFC:
  59. return "ERROR SCC failure ";
  60. case 0xFB:
  61. return "ERROR BackBone failure ";
  62. case 0xFA:
  63. return "ERROR tranceiver not found ";
  64. case 0xF9:
  65. return "ERROR no more address space ";
  66. case 0xF8:
  67. return "ERROR Checksum error  ";
  68. case 0xF7:
  69. return "ERROR Missing SS Code";
  70. case 0xF6:
  71. return "ERROR Invalid config format";
  72. case 0xF5:
  73. return "ERROR Reserved errorcode F5";
  74. case 0xF4:
  75. return "ERROR Invalid spreading code/channel number";
  76. case 0xF3:
  77. return "ERROR Load Code Error";
  78. case 0xF2:
  79. return "ERROR Reserver errorcode F2 ";
  80. case 0xF1:
  81. return "ERROR Invalid command receivec by LAN card ";
  82. case 0xF0:
  83. return "ERROR Invalid parameter found in command ";
  84. case 0xEF:
  85. return "ERROR On-chip timer failure ";
  86. case 0xEE:
  87. return "ERROR T410 timer failure ";
  88. case 0xED:
  89. return "ERROR Too Many TxEnable commands ";
  90. case 0xEC:
  91. return "ERROR EEPROM error on radio module ";
  92. default:
  93. return "ERROR unknown Diagnostic info reply code ";
  94.   }
  95. };
  96. static const char *arlan_hardware_type_string(struct net_device *dev)
  97. {
  98. u_char hardwareType;
  99. volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card;
  100. READSHM(hardwareType, arlan->hardwareType, u_char);
  101. switch (hardwareType)
  102. {
  103. case 0x00:
  104. return "type A450";
  105. case 0x01:
  106. return "type A650 ";
  107. case 0x04:
  108. return "type TMA coproc";
  109. case 0x0D:
  110. return "type A650E ";
  111. case 0x18:
  112. return "type TMA coproc Australian";
  113. case 0x19:
  114. return "type A650A ";
  115. case 0x26:
  116. return "type TMA coproc European";
  117. case 0x2E:
  118. return "type A655 ";
  119. case 0x2F:
  120. return "type A655A ";
  121. case 0x30:
  122. return "type A655E ";
  123. case 0x0B:
  124. return "type A670 ";
  125. case 0x0C:
  126. return "type A670E ";
  127. case 0x2D:
  128. return "type A670A ";
  129. case 0x0F:
  130. return "type A411T";
  131. case 0x16:
  132. return "type A411TA";
  133. case 0x1B:
  134. return "type A440T";
  135. case 0x1C:
  136. return "type A412T";
  137. case 0x1E:
  138. return "type A412TA";
  139. case 0x22:
  140. return "type A411TE";
  141. case 0x24:
  142. return "type A412TE";
  143. case 0x27:
  144. return "type A671T ";
  145. case 0x29:
  146. return "type A671TA ";
  147. case 0x2B:
  148. return "type A671TE ";
  149. case 0x31:
  150. return "type A415T ";
  151. case 0x33:
  152. return "type A415TA ";
  153. case 0x35:
  154. return "type A415TE ";
  155. case 0x37:
  156. return "type A672";
  157. case 0x39:
  158. return "type A672A ";
  159. case 0x3B:
  160. return "type A672T";
  161. case 0x6B:
  162. return "type IC2200";
  163. default:
  164. return "type A672T";
  165. }
  166. }
  167. #ifdef ARLAN_DEBUGGING
  168. static void arlan_print_diagnostic_info(struct net_device *dev)
  169. {
  170. int i;
  171. u_char diagnosticInfo;
  172. u_short diagnosticOffset;
  173. u_char hardwareType;
  174. volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card;
  175. //  ARLAN_DEBUG_ENTRY("arlan_print_diagnostic_info");
  176. if (READSHMB(arlan->configuredStatusFlag) == 0)
  177. printk("Arlan: Card NOT configuredn");
  178. else
  179. printk("Arlan: Card is configuredn");
  180. READSHM(diagnosticInfo, arlan->diagnosticInfo, u_char);
  181. READSHM(diagnosticOffset, arlan->diagnosticOffset, u_short);
  182. printk(KERN_INFO "%sn", arlan_diagnostic_info_string(dev));
  183. if (diagnosticInfo != 0xff)
  184. printk("%s arlan: Diagnostic Offset %d n", dev->name, diagnosticOffset);
  185. printk("arlan: LAN CODE ID = ");
  186. for (i = 0; i < 6; i++)
  187. DEBUGSHM(1, "%03d:", arlan->lanCardNodeId[i], u_char);
  188. printk("n");
  189. printk("arlan: Arlan BroadCast address  = ");
  190. for (i = 0; i < 6; i++)
  191. DEBUGSHM(1, "%03d:", arlan->broadcastAddress[i], u_char);
  192. printk("n");
  193. READSHM(hardwareType, arlan->hardwareType, u_char);
  194. printk(KERN_INFO "%sn", arlan_hardware_type_string(dev));
  195. DEBUGSHM(1, "arlan: channelNumber=%dn", arlan->channelNumber, u_char);
  196. DEBUGSHM(1, "arlan: channelSet=%dn", arlan->channelSet, u_char);
  197. DEBUGSHM(1, "arlan: spreadingCode=%dn", arlan->spreadingCode, u_char);
  198. DEBUGSHM(1, "arlan: radioNodeId=%dn", arlan->radioNodeId, u_short);
  199. DEBUGSHM(1, "arlan: SID =%dn", arlan->SID, u_short);
  200. DEBUGSHM(1, "arlan: rxOffset=%dn", arlan->rxOffset, u_short);
  201. DEBUGSHM(1, "arlan: registration mode is %dn", arlan->registrationMode, u_char);
  202. printk("arlan: name= ");
  203. IFDEBUG(1)
  204. for (i = 0; i < 16; i++)
  205. {
  206. char c;
  207. READSHM(c, arlan->name[i], char);
  208. if (c)
  209. printk("%c", c);
  210. }
  211. printk("n");
  212. //   ARLAN_DEBUG_EXIT("arlan_print_diagnostic_info");
  213. }
  214. /****************************** TEST  MEMORY **************/
  215. static int arlan_hw_test_memory(struct net_device *dev)
  216. {
  217. u_char *ptr;
  218. int i;
  219. int memlen = sizeof(struct arlan_shmem) - 0xF; /* avoid control register */
  220. volatile char *arlan_mem = (char *) (dev->mem_start);
  221. volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card;
  222. char pattern;
  223. ptr = NULL;
  224. /* hold card in reset state */
  225. setHardwareReset(dev);
  226. /* test memory */
  227. pattern = 0;
  228. for (i = 0; i < memlen; i++)
  229. WRITESHM(arlan_mem[i], ((u_char) pattern++), u_char);
  230. pattern = 0;
  231. for (i = 0; i < memlen; i++)
  232. {
  233. char res;
  234. READSHM(res, arlan_mem[i], char);
  235. if (res != pattern++)
  236. {
  237. printk(KERN_ERR "Arlan driver memory test 1 failed n");
  238. return -1;
  239. }
  240. }
  241. pattern = 0;
  242. for (i = 0; i < memlen; i++)
  243. WRITESHM(arlan_mem[i], ~(pattern++), char);
  244. pattern = 0;
  245. for (i = 0; i < memlen; i++)
  246. {
  247. char res;
  248. READSHM(res, arlan_mem[i], char);
  249. if (res != ~(pattern++))
  250. {
  251. printk(KERN_ERR "Arlan driver memory test 2 failed n");
  252. return -1;
  253. }
  254. }
  255. /* zero memory */
  256. for (i = 0; i < memlen; i++)
  257. WRITESHM(arlan_mem[i], 0x00, char);
  258. IFDEBUG(1) printk(KERN_INFO "Arlan: memory tests okn");
  259. /* set reset flag and then release reset */
  260. WRITESHM(arlan->resetFlag, 0xff, u_char);
  261. clearChannelAttention(dev);
  262. clearHardwareReset(dev);
  263. /* wait for reset flag to become zero, we'll wait for two seconds */
  264. if (arlan_command(dev, ARLAN_COMMAND_LONG_WAIT_NOW))
  265. {
  266. printk(KERN_ERR "%s arlan: failed to come back from memory testn", dev->name);
  267. return -1;
  268. }
  269. return 0;
  270. }
  271. static int arlan_setup_card_by_book(struct net_device *dev)
  272. {
  273. u_char irqLevel, configuredStatusFlag;
  274. volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card;
  275. // ARLAN_DEBUG_ENTRY("arlan_setup_card");
  276. READSHM(configuredStatusFlag, arlan->configuredStatusFlag, u_char);
  277. IFDEBUG(10)
  278. if (configuredStatusFlag != 0)
  279. IFDEBUG(10) printk("arlan: CARD IS CONFIGUREDn");
  280. else
  281. IFDEBUG(10) printk("arlan: card is NOT configuredn");
  282. if (testMemory || (READSHMB(arlan->diagnosticInfo) != 0xff))
  283. if (arlan_hw_test_memory(dev))
  284. return -1;
  285. DEBUGSHM(4, "arlan configuredStatus = %d n", arlan->configuredStatusFlag, u_char);
  286. DEBUGSHM(4, "arlan driver diagnostic: 0x%2xn", arlan->diagnosticInfo, u_char);
  287. /* issue nop command - no interrupt */
  288. arlan_command(dev, ARLAN_COMMAND_NOOP);
  289. if (arlan_command(dev, ARLAN_COMMAND_WAIT_NOW) != 0)
  290. return -1;
  291. IFDEBUG(50) printk("1st Noop successfully executed !!n");
  292. /* try to turn on the arlan interrupts */
  293. clearClearInterrupt(dev);
  294. setClearInterrupt(dev);
  295. setInterruptEnable(dev);
  296. /* issue nop command - with interrupt */
  297. arlan_command(dev, ARLAN_COMMAND_NOOPINT);
  298. if (arlan_command(dev, ARLAN_COMMAND_WAIT_NOW) != 0)
  299. return -1;
  300. IFDEBUG(50) printk("2nd Noop successfully executed !!n");
  301. READSHM(irqLevel, arlan->irqLevel, u_char)
  302. if (irqLevel != dev->irq)
  303. {
  304. IFDEBUG(1) printk(KERN_WARNING "arlan dip switches set irq to %dn", irqLevel);
  305. printk(KERN_WARNING "device driver irq set to %d - does not matchn", dev->irq);
  306. dev->irq = irqLevel;
  307. }
  308. else
  309. IFDEBUG(2) printk("irq level is OKn");
  310. IFDEBUG(3) arlan_print_diagnostic_info(dev);
  311. arlan_command(dev, ARLAN_COMMAND_CONF);
  312. READSHM(configuredStatusFlag, arlan->configuredStatusFlag, u_char);
  313. if (configuredStatusFlag == 0)
  314. {
  315. printk(KERN_WARNING "arlan configure failedn");
  316. return -1;
  317. }
  318. arlan_command(dev, ARLAN_COMMAND_LONG_WAIT_NOW);
  319. arlan_command(dev, ARLAN_COMMAND_RX);
  320. arlan_command(dev, ARLAN_COMMAND_LONG_WAIT_NOW);
  321. printk(KERN_NOTICE "%s: arlan driver version %s loadedn",
  322.        dev->name, arlan_version);
  323. // ARLAN_DEBUG_EXIT("arlan_setup_card");
  324. return 0; /* no errors */
  325. }
  326. #endif
  327. #ifdef ARLAN_PROC_INTERFACE
  328. #ifdef ARLAN_PROC_SHM_DUMP
  329. static char arlan_drive_info[ARLAN_STR_SIZE] = "A655n";
  330. static int arlan_sysctl_info(ctl_table * ctl, int write, struct file *filp,
  331.       void *buffer, size_t * lenp)
  332. {
  333. int i;
  334. int retv, pos, devnum;
  335. struct arlan_private *priva = NULL;
  336. struct net_device *dev;
  337. pos = 0;
  338. if (write)
  339. {
  340. printk("wrirte: ");
  341. for (i = 0; i < 100; i++)
  342. printk("adi %x n", arlan_drive_info[i]);
  343. }
  344. if (ctl->procname == NULL || arlan_drive_info == NULL)
  345. {
  346. printk(KERN_WARNING " procname is NULL in sysctl_table or arlan_drive_info is NULL n at arlan modulen ");
  347. return -1;
  348. }
  349. devnum = ctl->procname[5] - '0';
  350. if (devnum < 0 || devnum > MAX_ARLANS - 1)
  351. {
  352. printk(KERN_WARNING "too strange devnum in procfs parsen ");
  353. return -1;
  354. }
  355. else if (arlan_device[devnum] == NULL)
  356. {
  357. if (ctl->procname)
  358. pos += sprintf(arlan_drive_info + pos, "t%snn", ctl->procname);
  359. pos += sprintf(arlan_drive_info + pos, "No device found here n");
  360. goto final;
  361. }
  362. else
  363. priva = arlan_device[devnum]->priv;
  364. if (priva == NULL)
  365. {
  366. printk(KERN_WARNING " Could not find the device private in arlan procsys, badn ");
  367. return -1;
  368. }
  369. dev = arlan_device[devnum];
  370. memcpy_fromio(priva->conf, priva->card, sizeof(struct arlan_shmem));
  371. pos = sprintf(arlan_drive_info, "Arlan  info n");
  372. /* Header Signature */
  373. SARLSTR(textRegion, 48);
  374. SARLUC(resetFlag);
  375. pos += sprintf(arlan_drive_info + pos, "diagnosticInfot=t%s n", arlan_diagnostic_info_string(dev));
  376. SARLUC(diagnosticInfo);
  377. SARLUS(diagnosticOffset);
  378. SARLUCN(_1, 12);
  379. SARLUCN(lanCardNodeId, 6);
  380. SARLUCN(broadcastAddress, 6);
  381. pos += sprintf(arlan_drive_info + pos, "hardwareType =t  %s n", arlan_hardware_type_string(dev));
  382. SARLUC(hardwareType);
  383. SARLUC(majorHardwareVersion);
  384. SARLUC(minorHardwareVersion);
  385. SARLUC(radioModule);
  386. SARLUC(defaultChannelSet);
  387. SARLUCN(_2, 47);
  388. /* Control/Status Block - 0x0080 */
  389. SARLUC(interruptInProgress);
  390. SARLUC(cntrlRegImage);
  391. SARLUCN(_3, 14);
  392. SARLUC(commandByte);
  393. SARLUCN(commandParameter, 15);
  394. /* Receive Status - 0x00a0 */
  395. SARLUC(rxStatus);
  396. SARLUC(rxFrmType);
  397. SARLUS(rxOffset);
  398. SARLUS(rxLength);
  399. SARLUCN(rxSrc, 6);
  400. SARLUC(rxBroadcastFlag);
  401. SARLUC(rxQuality);
  402. SARLUC(scrambled);
  403. SARLUCN(_4, 1);
  404. /* Transmit Status - 0x00b0 */
  405. SARLUC(txStatus);
  406. SARLUC(txAckQuality);
  407. SARLUC(numRetries);
  408. SARLUCN(_5, 14);
  409. SARLUCN(registeredRouter, 6);
  410. SARLUCN(backboneRouter, 6);
  411. SARLUC(registrationStatus);
  412. SARLUC(configuredStatusFlag);
  413. SARLUCN(_6, 1);
  414. SARLUCN(ultimateDestAddress, 6);
  415. SARLUCN(immedDestAddress, 6);
  416. SARLUCN(immedSrcAddress, 6);
  417. SARLUS(rxSequenceNumber);
  418. SARLUC(assignedLocaltalkAddress);
  419. SARLUCN(_7, 27);
  420. /* System Parameter Block */
  421. /* - Driver Parameters (Novell Specific) */
  422. SARLUS(txTimeout);
  423. SARLUS(transportTime);
  424. SARLUCN(_8, 4);
  425. /* - Configuration Parameters */
  426. SARLUC(irqLevel);
  427. SARLUC(spreadingCode);
  428. SARLUC(channelSet);
  429. SARLUC(channelNumber);
  430. SARLUS(radioNodeId);
  431. SARLUCN(_9, 2);
  432. SARLUC(scramblingDisable);
  433. SARLUC(radioType);
  434. SARLUS(routerId);
  435. SARLUCN(_10, 9);
  436. SARLUC(txAttenuation);
  437. SARLUIA(systemId);
  438. SARLUS(globalChecksum);
  439. SARLUCN(_11, 4);
  440. SARLUS(maxDatagramSize);
  441. SARLUS(maxFrameSize);
  442. SARLUC(maxRetries);
  443. SARLUC(receiveMode);
  444. SARLUC(priority);
  445. SARLUC(rootOrRepeater);
  446. SARLUCN(specifiedRouter, 6);
  447. SARLUS(fastPollPeriod);
  448. SARLUC(pollDecay);
  449. SARLUSA(fastPollDelay);
  450. SARLUC(arlThreshold);
  451. SARLUC(arlDecay);
  452. SARLUCN(_12, 1);
  453. SARLUS(specRouterTimeout);
  454. SARLUCN(_13, 5);
  455. /* Scrambled Area */
  456. SARLUIA(SID);
  457. SARLUCN(encryptionKey, 12);
  458. SARLUIA(_14);
  459. SARLUSA(waitTime);
  460. SARLUSA(lParameter);
  461. SARLUCN(_15, 3);
  462. SARLUS(headerSize);
  463. SARLUS(sectionChecksum);
  464. SARLUC(registrationMode);
  465. SARLUC(registrationFill);
  466. SARLUS(pollPeriod);
  467. SARLUS(refreshPeriod);
  468. SARLSTR(name, 16);
  469. SARLUCN(NID, 6);
  470. SARLUC(localTalkAddress);
  471. SARLUC(codeFormat);
  472. SARLUC(numChannels);
  473. SARLUC(channel1);
  474. SARLUC(channel2);
  475. SARLUC(channel3);
  476. SARLUC(channel4);
  477. SARLUCN(SSCode, 59);
  478. /*      SARLUCN( _16, 0x140);
  479.  */
  480. /* Statistics Block - 0x0300 */
  481. SARLUC(hostcpuLock);
  482. SARLUC(lancpuLock);
  483. SARLUCN(resetTime, 18);
  484. SARLUIA(numDatagramsTransmitted);
  485. SARLUIA(numReTransmissions);
  486. SARLUIA(numFramesDiscarded);
  487. SARLUIA(numDatagramsReceived);
  488. SARLUIA(numDuplicateReceivedFrames);
  489. SARLUIA(numDatagramsDiscarded);
  490. SARLUS(maxNumReTransmitDatagram);
  491. SARLUS(maxNumReTransmitFrames);
  492. SARLUS(maxNumConsecutiveDuplicateFrames);
  493. /* misaligned here so we have to go to characters */
  494. SARLUIA(numBytesTransmitted);
  495. SARLUIA(numBytesReceived);
  496. SARLUIA(numCRCErrors);
  497. SARLUIA(numLengthErrors);
  498. SARLUIA(numAbortErrors);
  499. SARLUIA(numTXUnderruns);
  500. SARLUIA(numRXOverruns);
  501. SARLUIA(numHoldOffs);
  502. SARLUIA(numFramesTransmitted);
  503. SARLUIA(numFramesReceived);
  504. SARLUIA(numReceiveFramesLost);
  505. SARLUIA(numRXBufferOverflows);
  506. SARLUIA(numFramesDiscardedAddrMismatch);
  507. SARLUIA(numFramesDiscardedSIDMismatch);
  508. SARLUIA(numPollsTransmistted);
  509. SARLUIA(numPollAcknowledges);
  510. SARLUIA(numStatusTimeouts);
  511. SARLUIA(numNACKReceived);
  512. SARLUS(auxCmd);
  513. SARLUCN(dumpPtr, 4);
  514. SARLUC(dumpVal);
  515. SARLUC(wireTest);
  516. /* next 4 seems too long for procfs, over single page ?
  517. SARLUCN( _17, 0x86);
  518. SARLUCN( txBuffer, 0x800);
  519. SARLUCN( rxBuffer,  0x800); 
  520. SARLUCN( _18, 0x0bff);
  521.  */
  522. pos += sprintf(arlan_drive_info + pos, "rxRingt=t0x");
  523. for (i = 0; i < 0x50; i++)
  524. pos += sprintf(arlan_drive_info + pos, "%02x", ((char *) priva->conf)[priva->conf->rxOffset + i]);
  525. pos += sprintf(arlan_drive_info + pos, "n");
  526. SARLUC(configStatus);
  527. SARLUC(_22);
  528. SARLUC(progIOCtrl);
  529. SARLUC(shareMBase);
  530. SARLUC(controlRegister);
  531. pos += sprintf(arlan_drive_info + pos, " total %d charsn", pos);
  532. if (ctl)
  533. if (ctl->procname)
  534. pos += sprintf(arlan_drive_info + pos, " driver name : %sn", ctl->procname);
  535. final:
  536. *lenp = pos;
  537. if (!write)
  538. retv = proc_dostring(ctl, write, filp, buffer, lenp);
  539. else
  540. {
  541. *lenp = 0;
  542. return -1;
  543. }
  544. return retv;
  545. }
  546. static int arlan_sysctl_info161719(ctl_table * ctl, int write, struct file *filp,
  547.     void *buffer, size_t * lenp)
  548. {
  549. int i;
  550. int retv, pos, devnum;
  551. struct arlan_private *priva = NULL;
  552. pos = 0;
  553. devnum = ctl->procname[5] - '0';
  554. if (arlan_device[devnum] == NULL)
  555. {
  556. pos += sprintf(arlan_drive_info + pos, "No device found here n");
  557. goto final;
  558. }
  559. else
  560. priva = arlan_device[devnum]->priv;
  561. if (priva == NULL)
  562. {
  563. printk(KERN_WARNING " Could not find the device private in arlan procsys, badn ");
  564. return -1;
  565. }
  566. memcpy_fromio(priva->conf, priva->card, sizeof(struct arlan_shmem));
  567. SARLUCN(_16, 0xC0);
  568. SARLUCN(_17, 0x6A);
  569. SARLUCN(_18, 14);
  570. SARLUCN(_19, 0x86);
  571. SARLUCN(_21, 0x3fd);
  572. final:
  573. *lenp = pos;
  574. retv = proc_dostring(ctl, write, filp, buffer, lenp);
  575. return retv;
  576. }
  577. static int arlan_sysctl_infotxRing(ctl_table * ctl, int write, struct file *filp,
  578.     void *buffer, size_t * lenp)
  579. {
  580. int i;
  581. int retv, pos, devnum;
  582. struct arlan_private *priva = NULL;
  583. pos = 0;
  584. devnum = ctl->procname[5] - '0';
  585. if (arlan_device[devnum] == NULL)
  586. {
  587.   pos += sprintf(arlan_drive_info + pos, "No device found here n");
  588.   goto final;
  589. }
  590. else
  591. priva = arlan_device[devnum]->priv;
  592. if (priva == NULL)
  593. {
  594. printk(KERN_WARNING " Could not find the device private in arlan procsys, badn ");
  595. return -1;
  596. }
  597. memcpy_fromio(priva->conf, priva->card, sizeof(struct arlan_shmem));
  598. SARLBNpln(u_char, txBuffer, 0x800);
  599. final:
  600. *lenp = pos;
  601. retv = proc_dostring(ctl, write, filp, buffer, lenp);
  602. return retv;
  603. }
  604. static int arlan_sysctl_inforxRing(ctl_table * ctl, int write, struct file *filp,
  605.     void *buffer, size_t * lenp)
  606. {
  607. int i;
  608. int retv, pos, devnum;
  609. struct arlan_private *priva = NULL;
  610. pos = 0;
  611. devnum = ctl->procname[5] - '0';
  612. if (arlan_device[devnum] == NULL)
  613. {
  614.   pos += sprintf(arlan_drive_info + pos, "No device found here n");
  615.   goto final;
  616. } else
  617. priva = arlan_device[devnum]->priv;
  618. if (priva == NULL)
  619. {
  620. printk(KERN_WARNING " Could not find the device private in arlan procsys, badn ");
  621. return -1;
  622. }
  623. memcpy_fromio(priva->conf, priva->card, sizeof(struct arlan_shmem));
  624. SARLBNpln(u_char, rxBuffer, 0x800);
  625. final:
  626. *lenp = pos;
  627. retv = proc_dostring(ctl, write, filp, buffer, lenp);
  628. return retv;
  629. }
  630. static int arlan_sysctl_info18(ctl_table * ctl, int write, struct file *filp,
  631. void *buffer, size_t * lenp)
  632. {
  633. int i;
  634. int retv, pos, devnum;
  635. struct arlan_private *priva = NULL;
  636. pos = 0;
  637. devnum = ctl->procname[5] - '0';
  638. if (arlan_device[devnum] == NULL)
  639. {
  640. pos += sprintf(arlan_drive_info + pos, "No device found here n");
  641. goto final;
  642. }
  643. else
  644. priva = arlan_device[devnum]->priv;
  645. if (priva == NULL)
  646. {
  647. printk(KERN_WARNING " Could not find the device private in arlan procsys, badn ");
  648. return -1;
  649. }
  650. memcpy_fromio(priva->conf, priva->card, sizeof(struct arlan_shmem));
  651. SARLBNpln(u_char, _18, 0x800);
  652. final:
  653. *lenp = pos;
  654. retv = proc_dostring(ctl, write, filp, buffer, lenp);
  655. return retv;
  656. }
  657. #endif /* #ifdef ARLAN_PROC_SHM_DUMP */
  658. static char conf_reset_result[200];
  659. static int arlan_configure(ctl_table * ctl, int write, struct file *filp,
  660.     void *buffer, size_t * lenp)
  661. {
  662. int pos = 0;
  663. int devnum = ctl->procname[6] - '0';
  664. struct arlan_private *priv;
  665. if (devnum < 0 || devnum > MAX_ARLANS - 1)
  666. {
  667.   printk(KERN_WARNING "too strange devnum in procfs parsen ");
  668.   return -1;
  669. }
  670. else if (arlan_device[devnum] != NULL)
  671. {
  672.   priv = arlan_device[devnum]->priv;
  673.   arlan_command(arlan_device[devnum], ARLAN_COMMAND_CLEAN_AND_CONF);
  674. }
  675. else
  676. return -1;
  677. *lenp = pos;
  678. return proc_dostring(ctl, write, filp, buffer, lenp);
  679. }
  680. static int arlan_sysctl_reset(ctl_table * ctl, int write, struct file *filp,
  681.        void *buffer, size_t * lenp)
  682. {
  683. int pos = 0;
  684. int devnum = ctl->procname[5] - '0';
  685. struct arlan_private *priv;
  686. if (devnum < 0 || devnum > MAX_ARLANS - 1)
  687. {
  688.   printk(KERN_WARNING "too strange devnum in procfs parsen ");
  689.   return -1;
  690. }
  691. else if (arlan_device[devnum] != NULL)
  692. {
  693. priv = arlan_device[devnum]->priv;
  694. arlan_command(arlan_device[devnum], ARLAN_COMMAND_CLEAN_AND_RESET);
  695. } else
  696. return -1;
  697. *lenp = pos + 3;
  698. return proc_dostring(ctl, write, filp, buffer, lenp);
  699. }
  700. /* Place files in /proc/sys/dev/arlan */
  701. #define CTBLN(num,card,nam) 
  702.         {num , #nam, &(arlan_conf[card].nam), 
  703.          sizeof(int), 0600, NULL, &proc_dointvec}
  704. #ifdef ARLAN_DEBUGGING
  705. #define ARLAN_PROC_DEBUG_ENTRIES {48, "entry_exit_debug", &arlan_entry_and_exit_debug, 
  706.                 sizeof(int), 0600, NULL, &proc_dointvec},
  707. {49, "debug", &arlan_debug, 
  708.                 sizeof(int), 0600, NULL, &proc_dointvec},
  709. #else 
  710. #define ARLAN_PROC_DEBUG_ENTRIES
  711. #endif
  712. #define ARLAN_SYSCTL_TABLE_TOTAL(cardNo)
  713. CTBLN(1,cardNo,spreadingCode),
  714. CTBLN(2,cardNo, channelNumber),
  715. CTBLN(3,cardNo, scramblingDisable),
  716. CTBLN(4,cardNo, txAttenuation),
  717. CTBLN(5,cardNo, systemId), 
  718. CTBLN(6,cardNo, maxDatagramSize),
  719. CTBLN(7,cardNo, maxFrameSize),
  720. CTBLN(8,cardNo, maxRetries),
  721. CTBLN(9,cardNo, receiveMode),
  722. CTBLN(10,cardNo, priority),
  723. CTBLN(11,cardNo, rootOrRepeater),
  724. CTBLN(12,cardNo, SID),
  725. CTBLN(13,cardNo, registrationMode),
  726. CTBLN(14,cardNo, registrationFill),
  727. CTBLN(15,cardNo, localTalkAddress),
  728. CTBLN(16,cardNo, codeFormat),
  729. CTBLN(17,cardNo, numChannels),
  730. CTBLN(18,cardNo, channel1),
  731. CTBLN(19,cardNo, channel2),
  732. CTBLN(20,cardNo, channel3),
  733. CTBLN(21,cardNo, channel4),
  734. CTBLN(22,cardNo, txClear),
  735. CTBLN(23,cardNo, txRetries),
  736. CTBLN(24,cardNo, txRouting),
  737. CTBLN(25,cardNo, txScrambled),
  738. CTBLN(26,cardNo, rxParameter),
  739. CTBLN(27,cardNo, txTimeoutMs),
  740. CTBLN(28,cardNo, waitCardTimeout),
  741. CTBLN(29,cardNo, channelSet), 
  742. {30, "name", arlan_conf[cardNo].siteName, 
  743.                 16, 0600, NULL, &proc_dostring},
  744. CTBLN(31,cardNo,waitTime),
  745. CTBLN(32,cardNo,lParameter),
  746. CTBLN(33,cardNo,_15),
  747. CTBLN(34,cardNo,headerSize),
  748. CTBLN(35,cardNo,async),
  749. CTBLN(36,cardNo,tx_delay_ms),
  750. CTBLN(37,cardNo,retries),
  751. CTBLN(38,cardNo,ReTransmitPacketMaxSize),
  752. CTBLN(39,cardNo,waitReTransmitPacketMaxSize),
  753. CTBLN(40,cardNo,fastReTransCount),
  754. CTBLN(41,cardNo,driverRetransmissions),
  755. CTBLN(42,cardNo,txAckTimeoutMs),
  756. CTBLN(43,cardNo,registrationInterrupts),
  757. CTBLN(44,cardNo,hardwareType),
  758. CTBLN(45,cardNo,radioType),
  759. CTBLN(46,cardNo,writeEEPROM),
  760. CTBLN(47,cardNo,writeRadioType),
  761. ARLAN_PROC_DEBUG_ENTRIES
  762. CTBLN(50,cardNo,in_speed),
  763. CTBLN(51,cardNo,out_speed),
  764. CTBLN(52,cardNo,in_speed10),
  765. CTBLN(53,cardNo,out_speed10),
  766. CTBLN(54,cardNo,in_speed_max),
  767. CTBLN(55,cardNo,out_speed_max),
  768. CTBLN(56,cardNo,measure_rate),
  769. CTBLN(57,cardNo,pre_Command_Wait),
  770. CTBLN(58,cardNo,rx_tweak1),
  771. CTBLN(59,cardNo,rx_tweak2),
  772. CTBLN(60,cardNo,tx_queue_len),
  773. static ctl_table arlan_conf_table0[] =
  774. {
  775. ARLAN_SYSCTL_TABLE_TOTAL(0)
  776. #ifdef ARLAN_PROC_SHM_DUMP
  777. {150, "arlan0-txRing", &arlan_drive_info,
  778.  ARLAN_STR_SIZE, 0400, NULL, &arlan_sysctl_infotxRing},
  779. {151, "arlan0-rxRing", &arlan_drive_info,
  780.  ARLAN_STR_SIZE, 0400, NULL, &arlan_sysctl_inforxRing},
  781. {152, "arlan0-18", &arlan_drive_info,
  782.  ARLAN_STR_SIZE, 0400, NULL, &arlan_sysctl_info18},
  783. {153, "arlan0-ring", &arlan_drive_info,
  784.  ARLAN_STR_SIZE, 0400, NULL, &arlan_sysctl_info161719},
  785. {154, "arlan0-shm-cpy", &arlan_drive_info,
  786.  ARLAN_STR_SIZE, 0400, NULL, &arlan_sysctl_info},
  787. #endif
  788. {155, "config0", &conf_reset_result, 
  789.  100, 0400, NULL, &arlan_configure}, 
  790. {156, "reset0", &conf_reset_result, 
  791.  100, 0400, NULL, &arlan_sysctl_reset}, 
  792. {0}
  793. };
  794. static ctl_table arlan_conf_table1[] =
  795. {
  796. ARLAN_SYSCTL_TABLE_TOTAL(1)
  797. #ifdef ARLAN_PROC_SHM_DUMP
  798. {150, "arlan1-txRing", &arlan_drive_info,
  799.  ARLAN_STR_SIZE, 0400, NULL, &arlan_sysctl_infotxRing},
  800. {151, "arlan1-rxRing", &arlan_drive_info,
  801.  ARLAN_STR_SIZE, 0400, NULL, &arlan_sysctl_inforxRing},
  802. {152, "arlan1-18", &arlan_drive_info,
  803.  ARLAN_STR_SIZE, 0400, NULL, &arlan_sysctl_info18},
  804. {153, "arlan1-ring", &arlan_drive_info,
  805.  ARLAN_STR_SIZE, 0400, NULL, &arlan_sysctl_info161719},
  806. {154, "arlan1-shm-cpy", &arlan_drive_info,
  807.  ARLAN_STR_SIZE, 0400, NULL, &arlan_sysctl_info},
  808. #endif
  809. {155, "config1", &conf_reset_result,
  810.  100, 0400, NULL, &arlan_configure},
  811. {156, "reset1", &conf_reset_result,
  812.  100, 0400, NULL, &arlan_sysctl_reset},
  813. {0}
  814. };
  815. static ctl_table arlan_conf_table2[] =
  816. {
  817. ARLAN_SYSCTL_TABLE_TOTAL(2)
  818. #ifdef ARLAN_PROC_SHM_DUMP
  819. {150, "arlan2-txRing", &arlan_drive_info,
  820.  ARLAN_STR_SIZE, 0400, NULL, &arlan_sysctl_infotxRing},
  821. {151, "arlan2-rxRing", &arlan_drive_info,
  822.  ARLAN_STR_SIZE, 0400, NULL, &arlan_sysctl_inforxRing},
  823. {152, "arlan2-18", &arlan_drive_info,
  824.  ARLAN_STR_SIZE, 0400, NULL, &arlan_sysctl_info18},
  825. {153, "arlan2-ring", &arlan_drive_info,
  826.  ARLAN_STR_SIZE, 0400, NULL, &arlan_sysctl_info161719},
  827. {154, "arlan2-shm-cpy", &arlan_drive_info,
  828.  ARLAN_STR_SIZE, 0400, NULL, &arlan_sysctl_info},
  829. #endif
  830. {155, "config2", &conf_reset_result,
  831.  100, 0400, NULL, &arlan_configure},
  832. {156, "reset2", &conf_reset_result,
  833.  100, 0400, NULL, &arlan_sysctl_reset},
  834. {0}
  835. };
  836. static ctl_table arlan_conf_table3[] =
  837. {
  838. ARLAN_SYSCTL_TABLE_TOTAL(3)
  839. #ifdef ARLAN_PROC_SHM_DUMP
  840. {150, "arlan3-txRing", &arlan_drive_info,
  841.  ARLAN_STR_SIZE, 0400, NULL, &arlan_sysctl_infotxRing},
  842. {151, "arlan3-rxRing", &arlan_drive_info,
  843.  ARLAN_STR_SIZE, 0400, NULL, &arlan_sysctl_inforxRing},
  844. {152, "arlan3-18", &arlan_drive_info,
  845.  ARLAN_STR_SIZE, 0400, NULL, &arlan_sysctl_info18},
  846. {153, "arlan3-ring", &arlan_drive_info,
  847.  ARLAN_STR_SIZE, 0400, NULL, &arlan_sysctl_info161719},
  848. {154, "arlan3-shm-cpy", &arlan_drive_info,
  849.  ARLAN_STR_SIZE, 0400, NULL, &arlan_sysctl_info},
  850. #endif
  851. {155, "config3", &conf_reset_result,
  852.  100, 0400, NULL, &arlan_configure},
  853. {156, "reset3", &conf_reset_result,
  854.  100, 0400, NULL, &arlan_sysctl_reset},
  855. {0}
  856. };
  857. static ctl_table arlan_table[] =
  858. {
  859. {0, "arlan0", NULL, 0, 0600, arlan_conf_table0},
  860. {0, "arlan1", NULL, 0, 0600, arlan_conf_table1},
  861. {0, "arlan2", NULL, 0, 0600, arlan_conf_table2},
  862. {0, "arlan3", NULL, 0, 0600, arlan_conf_table3},
  863. {0}
  864. };
  865. #else
  866. static ctl_table arlan_table[MAX_ARLANS + 1] =
  867. {
  868. {0}
  869. };
  870. #endif
  871. #else
  872. static ctl_table arlan_table[MAX_ARLANS + 1] =
  873. {
  874. {0}
  875. };
  876. #endif
  877. // static int mmtu = 1234;
  878. static ctl_table arlan_root_table[] =
  879. {
  880. {254, "arlan", NULL, 0, 0555, arlan_table},
  881. {0}
  882. };
  883. /* Make sure that /proc/sys/dev is there */
  884. //static ctl_table arlan_device_root_table[] =
  885. //{
  886. // {CTL_DEV, "dev", NULL, 0, 0555, arlan_root_table},
  887. // {0}
  888. //};
  889. static struct ctl_table_header *arlan_device_sysctl_header;
  890. int init_arlan_proc(void)
  891. {
  892. int i = 0;
  893. if (arlan_device_sysctl_header)
  894. return 0;
  895. for (i = 0; i < MAX_ARLANS && arlan_device[i]; i++)
  896. arlan_table[i].ctl_name = i + 1;
  897. arlan_device_sysctl_header = register_sysctl_table(arlan_root_table, 0);
  898. if (!arlan_device_sysctl_header)
  899. return -1;
  900. return 0;
  901. };
  902. #ifdef MODULE
  903. int init_module(void)
  904. {
  905. return init_arlan_proc();
  906. };
  907. void cleanup_module(void)
  908. {
  909. unregister_sysctl_table(arlan_device_sysctl_header);
  910. arlan_device_sysctl_header = NULL;
  911. return;
  912. };
  913. #endif // MODULE
  914. MODULE_LICENSE("GPL");