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