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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  Copyright (C) 1997 Cullen Jennings
  3.  *  Copyright (C) 1998 Elmer.Joandi@ut.ee, +37-255-13500
  4.  *  GNU General Public License applies
  5.  */
  6. #include <linux/version.h>
  7. #include <linux/module.h>
  8. #include <linux/config.h>
  9. #include <linux/kernel.h>
  10. #include <linux/types.h>
  11. #include <linux/skbuff.h>
  12. #include <linux/if_ether.h> /* For the statistics structure. */
  13. #include <linux/if_arp.h> /* For ARPHRD_ETHER */
  14. #include <linux/ptrace.h>
  15. #include <linux/ioport.h>
  16. #include <linux/in.h>
  17. #include <linux/slab.h>
  18. #include <linux/string.h>
  19. #include <linux/timer.h>
  20. #include <linux/init.h>
  21. #include <asm/system.h>
  22. #include <asm/bitops.h>
  23. #include <asm/io.h>
  24. #include <linux/errno.h>
  25. #include <linux/delay.h>
  26. #include <linux/netdevice.h>
  27. #include <linux/etherdevice.h>
  28. //#define ARLAN_DEBUGGING 1
  29. #define ARLAN_PROC_INTERFACE
  30. #define MAX_ARLANS 4 /* not more than 4 ! */
  31. #define ARLAN_PROC_SHM_DUMP /* shows all card registers, makes driver way larger */
  32. #define ARLAN_MAX_MULTICAST_ADDRS 16
  33. #define ARLAN_RCV_CLEAN  0
  34. #define ARLAN_RCV_PROMISC 1
  35. #define ARLAN_RCV_CONTROL 2
  36. #ifdef CONFIG_PROC_FS
  37. extern int  init_arlan_proc(void);
  38. #endif
  39. extern struct net_device *arlan_device[MAX_ARLANS];
  40. extern int arlan_debug;
  41. extern char * siteName;
  42. extern int arlan_entry_debug;
  43. extern int arlan_exit_debug;
  44. extern int testMemory;
  45. extern const char* arlan_version;
  46. extern int     arlan_command(struct net_device * dev, int command);
  47.  
  48. #define SIDUNKNOWN -1
  49. #define radioNodeIdUNKNOWN -1
  50. #define encryptionKeyUNKNOWN '';
  51. #define irqUNKNOWN 0
  52. #define memUNKNOWN 0
  53. #define debugUNKNOWN 0
  54. #define probeUNKNOWN 1
  55. #define numDevicesUNKNOWN 1
  56. #define testMemoryUNKNOWN 1
  57. #define spreadingCodeUNKNOWN 0
  58. #define channelNumberUNKNOWN 0
  59. #define channelSetUNKNOWN 0
  60. #define systemIdUNKNOWN -1
  61. #define registrationModeUNKNOWN -1
  62. #define siteNameUNKNOWN "LinuxSite"
  63. #define IFDEBUG( L ) if ( (L) & arlan_debug ) 
  64. #define ARLAN_FAKE_HDR_LEN 12 
  65. #ifdef ARLAN_DEBUGGING
  66. #define DEBUG 1
  67. #define ARLAN_ENTRY_EXIT_DEBUGGING 1
  68. #define ARLAN_DEBUG(a,b) printk(KERN_DEBUG a, b)
  69. #else
  70. #define ARLAN_DEBUG(a,b) 
  71. #endif
  72. struct arlan_shmem
  73. {
  74.       /* Header Signature */ 
  75.       volatile char textRegion[48];
  76.       volatile u_char resetFlag;
  77.       volatile u_char  diagnosticInfo;
  78.       volatile u_short diagnosticOffset;
  79.       volatile u_char _1[12];
  80.       volatile u_char lanCardNodeId[6];
  81.       volatile u_char broadcastAddress[6];
  82.       volatile u_char hardwareType;
  83.       volatile u_char majorHardwareVersion;
  84.       volatile u_char minorHardwareVersion;
  85.       volatile u_char radioModule;// shows EEPROM, can be overridden at 0x111
  86.       volatile u_char defaultChannelSet; // shows EEProm, can be overriiden at 0x10A
  87.       volatile u_char _2[47];
  88.       
  89.       /* Control/Status Block - 0x0080 */
  90.       volatile u_char interruptInProgress; /* not used by lancpu */
  91.       volatile u_char cntrlRegImage; /* not used by lancpu */
  92.       volatile u_char _3[13];
  93.       volatile u_char dumpByte;
  94.       volatile u_char commandByte; /* non-zero = active */
  95.       volatile u_char commandParameter[15];
  96.       /* Receive Status - 0x00a0 */
  97.       volatile u_char rxStatus; /* 1- data, 2-control, 0xff - registr change */
  98.       volatile u_char rxFrmType;
  99.       volatile u_short rxOffset;
  100.       volatile u_short rxLength;
  101.       volatile u_char rxSrc[6];
  102.       volatile u_char rxBroadcastFlag;
  103.       volatile u_char rxQuality;
  104.       volatile u_char scrambled;
  105.       volatile u_char _4[1];
  106.       
  107.       /* Transmit Status - 0x00b0 */
  108.       volatile u_char txStatus;
  109.       volatile u_char txAckQuality;
  110.       volatile u_char numRetries;
  111.       volatile u_char _5[14];
  112.       volatile u_char registeredRouter[6];
  113.       volatile u_char backboneRouter[6];
  114.       volatile u_char registrationStatus;
  115.       volatile u_char configuredStatusFlag;
  116.       volatile u_char _6[1];
  117.       volatile u_char ultimateDestAddress[6];
  118.       volatile u_char immedDestAddress[6];
  119.       volatile u_char immedSrcAddress[6];
  120.       volatile u_short rxSequenceNumber;
  121.       volatile u_char assignedLocaltalkAddress;
  122.       volatile u_char _7[27];
  123.       /* System Parameter Block */
  124.       /* - Driver Parameters (Novell Specific) */
  125.       volatile u_short txTimeout;
  126.       volatile u_short transportTime;
  127.       volatile u_char _8[4];
  128.       /* - Configuration Parameters */
  129.       volatile u_char irqLevel;
  130.       volatile u_char spreadingCode;
  131.       volatile u_char channelSet;
  132.       volatile u_char channelNumber;
  133.       volatile u_short radioNodeId;
  134.       volatile u_char _9[2];
  135.       volatile u_char scramblingDisable;
  136.       volatile u_char radioType;
  137.       volatile u_short routerId;
  138.       volatile u_char _10[9];
  139.       volatile u_char txAttenuation;
  140.       volatile u_char systemId[4]; 
  141.       volatile u_short globalChecksum;
  142.       volatile u_char _11[4];
  143.       volatile u_short maxDatagramSize;
  144.       volatile u_short maxFrameSize;
  145.       volatile u_char maxRetries;
  146.       volatile u_char receiveMode;
  147.       volatile u_char priority;
  148.       volatile u_char rootOrRepeater;
  149.       volatile u_char specifiedRouter[6];
  150.       volatile u_short fastPollPeriod;
  151.       volatile u_char pollDecay;
  152.       volatile u_char fastPollDelay[2];
  153.       volatile u_char arlThreshold;
  154.       volatile u_char arlDecay;
  155.       volatile u_char _12[1];
  156.       volatile u_short specRouterTimeout;
  157.       volatile u_char _13[5];
  158.       /* Scrambled Area */
  159.       volatile u_char SID[4];
  160.       volatile u_char encryptionKey[12];
  161.       volatile u_char _14[2];
  162.       volatile u_char waitTime[2];
  163.       volatile u_char lParameter[2];
  164.       volatile u_char _15[3];
  165.       volatile u_short headerSize;
  166.       volatile u_short sectionChecksum;
  167.       volatile u_char registrationMode;
  168.       volatile u_char registrationFill;
  169.       volatile u_short pollPeriod;
  170.       volatile u_short refreshPeriod;
  171.       volatile u_char name[16];
  172.       volatile u_char NID[6];
  173.       volatile u_char localTalkAddress;
  174.       volatile u_char codeFormat;
  175.       volatile u_char numChannels;
  176.       volatile u_char channel1;
  177.       volatile u_char channel2;
  178.       volatile u_char channel3;
  179.       volatile u_char channel4;
  180.       volatile u_char SSCode[59];
  181.       volatile u_char _16[0xC0];
  182.       volatile u_short auxCmd;
  183.       volatile u_char  dumpPtr[4];
  184.       volatile u_char dumpVal;
  185.       volatile u_char _17[0x6A];
  186.       volatile u_char wireTest;
  187.       volatile u_char _18[14];
  188.       /* Statistics Block - 0x0300 */
  189.       volatile u_char hostcpuLock;
  190.       volatile u_char lancpuLock;
  191.       volatile u_char resetTime[18];
  192.       
  193.       volatile u_char numDatagramsTransmitted[4];
  194.       volatile u_char numReTransmissions[4];
  195.       volatile u_char numFramesDiscarded[4];
  196.       volatile u_char numDatagramsReceived[4];
  197.       volatile u_char numDuplicateReceivedFrames[4];
  198.       volatile u_char numDatagramsDiscarded[4];
  199.       
  200.       volatile u_short maxNumReTransmitDatagram;
  201.       volatile u_short maxNumReTransmitFrames;
  202.       volatile u_short maxNumConsecutiveDuplicateFrames;
  203.       /* misaligned here so we have to go to characters */
  204.      
  205.       volatile u_char numBytesTransmitted[4];
  206.       volatile u_char numBytesReceived[4];
  207.       volatile u_char numCRCErrors[4];
  208.       volatile u_char numLengthErrors[4];
  209.       volatile u_char numAbortErrors[4];
  210.       volatile u_char numTXUnderruns[4];
  211.       volatile u_char numRXOverruns[4];
  212.       volatile u_char numHoldOffs[4];
  213.       volatile u_char numFramesTransmitted[4];
  214.       volatile u_char numFramesReceived[4];
  215.       volatile u_char numReceiveFramesLost[4];
  216.       volatile u_char numRXBufferOverflows[4];
  217.       volatile u_char numFramesDiscardedAddrMismatch[4];
  218.       volatile u_char numFramesDiscardedSIDMismatch[4];
  219.       volatile u_char numPollsTransmistted[4];
  220.       volatile u_char numPollAcknowledges[4];
  221.       volatile u_char numStatusTimeouts[4];
  222.       volatile u_char numNACKReceived[4];
  223.       volatile u_char _19[0x86];
  224.       volatile u_char txBuffer[0x800];
  225.       volatile u_char rxBuffer[0x800];
  226.       volatile u_char _20[0x800];
  227.       volatile u_char _21[0x3fb];
  228.       volatile u_char configStatus;
  229.       volatile u_char _22;
  230.       volatile u_char progIOCtrl;
  231.       volatile u_char shareMBase;
  232.       volatile u_char controlRegister;
  233. };
  234. struct arlan_conf_stru {
  235.       int spreadingCode;
  236.       int channelSet;
  237.       int channelNumber;
  238.       int scramblingDisable;
  239.       int txAttenuation;
  240.       int systemId; 
  241.       int maxDatagramSize;
  242.       int maxFrameSize;
  243.       int maxRetries;
  244.       int receiveMode;
  245.       int priority;
  246.       int rootOrRepeater;
  247.       int SID;
  248.       int radioNodeId;
  249.       int registrationMode;
  250.       int registrationFill;
  251.       int localTalkAddress;
  252.       int codeFormat;
  253.       int numChannels;
  254.       int channel1;
  255.       int channel2;
  256.       int channel3;
  257.       int channel4;
  258.       int txClear;
  259.       int txRetries;
  260.       int txRouting;
  261.       int txScrambled;
  262.       int rxParameter;
  263.       int txTimeoutMs;
  264.       int txAckTimeoutMs;
  265.       int waitCardTimeout;
  266.       int waitTime;
  267.       int lParameter;
  268.       int _15;
  269.       int headerSize;
  270.       int async;
  271.       int retries;
  272.       int tx_delay_ms;
  273.       int waitReTransmitPacketMaxSize;
  274.       int ReTransmitPacketMaxSize;
  275.       int fastReTransCount;
  276.       int driverRetransmissions;
  277.       int registrationInterrupts;
  278.       int hardwareType;
  279.       int radioType;
  280.       int writeRadioType;
  281.       int writeEEPROM;
  282.       char siteName[17];
  283.       int measure_rate;
  284.       int in_speed;
  285.       int out_speed;
  286.       int in_speed10;
  287.       int out_speed10;
  288.       int in_speed_max;
  289.       int out_speed_max;
  290.       int pre_Command_Wait;
  291.       int rx_tweak1;
  292.       int rx_tweak2;
  293.       int tx_queue_len;
  294. };
  295. extern struct arlan_conf_stru arlan_conf[MAX_ARLANS];
  296. struct TxParam
  297. {
  298.       volatile short  offset;
  299.       volatile  short  length;
  300.       volatile u_char  dest[6];
  301.       volatile unsigned char clear;
  302.       volatile unsigned char retries;
  303.       volatile unsigned char routing;
  304.       volatile unsigned char scrambled;
  305. };
  306. struct TxRingPoint  {
  307. struct TxParam txParam;
  308. };
  309. #define TX_RING_SIZE 2
  310. /* Information that need to be kept for each board. */
  311. struct arlan_private {
  312.       struct net_device_stats stats;
  313.       long open_time; /* Useless example local info. */
  314.       struct arlan_shmem * card;
  315.       struct arlan_shmem * conf;
  316.       struct TxParam txParam;      
  317.       int multicastLength;
  318.       char  multicastList[ARLAN_MAX_MULTICAST_ADDRS][6];
  319.       int promiscModeEnabled;
  320.       struct arlan_conf_stru * Conf;      
  321.       int bad;
  322.       int  reset;
  323.       long long lastReset;
  324.       struct timer_list timer;
  325.       struct timer_list tx_delay_timer;
  326.       struct timer_list tx_retry_timer;
  327.       struct timer_list rx_check_timer;
  328.       struct semaphore card_lock;
  329.       atomic_t  card_users;
  330.       atomic_t delay_on;
  331.       atomic_t  retr_on;
  332.       int registrationLostCount;
  333.       int reRegisterExp;
  334.       int nof_tx;
  335.       int nof_tx_ack;
  336.       int last_nof_tx;
  337.       int last_nof_tx_ack;
  338.       int irq_test_done;
  339.       int last_command_was_rx;
  340.       struct TxParam txRing[TX_RING_SIZE];
  341.       char reTransmitBuff[0x800];
  342.       volatile int txLast;
  343.       volatile int txNew;
  344.       volatile int txOffset;
  345.       volatile char ReTransmitRequested;
  346.       volatile long long tx_done_delayed;
  347.       volatile long long registrationLastSeen;
  348.       volatile char under_command;
  349.       volatile char under_toggle;
  350.       volatile long long tx_last_sent;
  351.       volatile long long tx_last_cleared;
  352.       volatile u_char under_tx;
  353.       volatile int  retransmissions;
  354.       volatile int tx_chain_active;
  355.       volatile int  timer_chain_active;
  356.       volatile int  interrupt_ack_requested;
  357.       volatile long command_lock;
  358.       volatile int rx_command_needed;
  359.       volatile int tx_command_needed;
  360.       volatile int  waiting_command_mask;
  361.       volatile int  card_polling_interval;
  362.       volatile int  last_command_buff_free_time;
  363.       volatile int numResets;
  364.       volatile int  under_reset;
  365.       volatile int  under_config;
  366.       volatile int  rx_command_given;
  367.       volatile long  tx_command_given;
  368.       volatile long interrupt_processing_active;
  369.       volatile long long  last_tx_time;
  370.       volatile long long last_rx_time;
  371.       volatile long long last_rx_int_ack_time;
  372.       int in_bytes;
  373.       int out_bytes;
  374.       int in_time;
  375.       int out_time;
  376.       int in_time10;
  377.       int out_time10;
  378.       int in_bytes10;
  379.       int out_bytes10;
  380. };
  381. #define ARLAN_CLEAR 0x00
  382. #define ARLAN_RESET  0x01
  383. #define ARLAN_CHANNEL_ATTENTION 0x02
  384. #define ARLAN_INTERRUPT_ENABLE  0x04
  385. #define ARLAN_CLEAR_INTERRUPT  0x08
  386. #define ARLAN_POWER  0x40
  387. #define ARLAN_ACCESS 0x80
  388. #define ARLAN_COM_CONF                0x01
  389. #define ARLAN_COM_RX_ENABLE           0x03
  390. #define ARLAN_COM_RX_ABORT            0x04
  391. #define ARLAN_COM_TX_ENABLE           0x05
  392. #define ARLAN_COM_TX_ABORT            0x06
  393. #define ARLAN_COM_NOP       0x07
  394. #define ARLAN_COM_STANDBY             0x08
  395. #define ARLAN_COM_ACTIVATE            0x09
  396. #define ARLAN_COM_GOTO_SLOW_POLL      0x0a
  397. #define ARLAN_COM_INT                 0x80
  398. #define TXLAST(dev) (((struct arlan_private *)dev->priv)->txRing[((struct arlan_private *)dev->priv)->txLast])
  399. #define TXHEAD(dev) (((struct arlan_private *)dev->priv)->txRing[0])
  400. #define TXTAIL(dev) (((struct arlan_private *)dev->priv)->txRing[1])
  401. #define TXBuffStart(dev) 
  402.  ((int)(((struct arlan_private *)dev->priv)->card)->txBuffer) - ((int)(((struct arlan_private *)dev->priv)->card) )
  403. #define TXBuffEnd(dev) 
  404.  ((int)(((struct arlan_private *)dev->priv)->card)->rxBuffer) - ((int)(((struct arlan_private *)dev->priv)->card)
  405.  
  406. #define READSHM(to,from,atype) {
  407. atype tmp;
  408. memcpy_fromio(&(tmp),&(from),sizeof(atype));
  409. to = tmp;
  410. }
  411. #define READSHMEM(from,atype)
  412. atype from; 
  413. READSHM(from, arlan->from, atype);
  414. #define WRITESHM(to,from,atype) 
  415. { atype tmpSHM = from;
  416. memcpy_toio(&(to),&tmpSHM,sizeof(atype));
  417. }
  418. #define DEBUGSHM(levelSHM,stringSHM,stuff,atype) 
  419. { atype tmpSHM; 
  420. memcpy_fromio(&tmpSHM,&(stuff),sizeof(atype));
  421. IFDEBUG(levelSHM) printk(stringSHM,tmpSHM);
  422. }
  423. #define WRITESHMB(to, val) 
  424. writeb(val,&(to))
  425. #define READSHMB(to) 
  426. readb(&(to))
  427. #define WRITESHMS(to, val) 
  428. writew(val,&(to))
  429. #define READSHMS(to) 
  430. readw(&(to))
  431. #define WRITESHMI(to, val) 
  432. writel(val,&(to))
  433. #define READSHMI(to) 
  434. readl(&(to))
  435. #define registrationBad(dev)
  436.    ( (   READSHMB(((struct arlan_private *)dev->priv)->card->registrationMode)    > 0) && 
  437.      (   READSHMB(((struct arlan_private *)dev->priv)->card->registrationStatus) == 0)    )
  438. #define readControlRegister(dev)
  439.   READSHMB(((struct arlan_private *)dev->priv)->card->cntrlRegImage)
  440. #define writeControlRegister(dev, v){
  441.    WRITESHMB(((struct arlan_private *)dev->priv)->card->cntrlRegImage ,((v) &0xF) );
  442.    WRITESHMB(((struct arlan_private *)dev->priv)->card->controlRegister ,(v)  );}
  443. #define arlan_interrupt_lancpu(dev) {
  444.    int cr;   
  445.    
  446.    priv->under_toggle++;   
  447.    cr = readControlRegister(dev);
  448.    if (cr & ARLAN_CHANNEL_ATTENTION){ 
  449.       writeControlRegister(dev, (cr & ~ARLAN_CHANNEL_ATTENTION));
  450.    }else  
  451.       writeControlRegister(dev, (cr | ARLAN_CHANNEL_ATTENTION));
  452.    priv->under_toggle=0;     
  453. }
  454. #define clearChannelAttention(dev){ 
  455.    writeControlRegister(dev,readControlRegister(dev) & ~ARLAN_CHANNEL_ATTENTION);}
  456. #define setHardwareReset(dev) {
  457.    writeControlRegister(dev,readControlRegister(dev) | ARLAN_RESET);}
  458. #define clearHardwareReset(dev) {
  459.    writeControlRegister(dev,readControlRegister(dev) & ~ARLAN_RESET);}
  460. #define setInterruptEnable(dev){
  461.    writeControlRegister(dev,readControlRegister(dev) | ARLAN_INTERRUPT_ENABLE)  ;}
  462. #define clearInterruptEnable(dev){
  463.    writeControlRegister(dev,readControlRegister(dev) & ~ARLAN_INTERRUPT_ENABLE)  ;}
  464. #define setClearInterrupt(dev){
  465.    writeControlRegister(dev,readControlRegister(dev) | ARLAN_CLEAR_INTERRUPT)   ;}
  466. #define clearClearInterrupt(dev){
  467.    writeControlRegister(dev,readControlRegister(dev) & ~ARLAN_CLEAR_INTERRUPT);}
  468. #define setPowerOff(dev){
  469.    writeControlRegister(dev,readControlRegister(dev) | (ARLAN_POWER && ARLAN_ACCESS));
  470.    writeControlRegister(dev,readControlRegister(dev) & ~ARLAN_ACCESS);}
  471. #define setPowerOn(dev){
  472.    writeControlRegister(dev,readControlRegister(dev) & ~(ARLAN_POWER));   }
  473. #define arlan_lock_card_access(dev){
  474.    writeControlRegister(dev,readControlRegister(dev) & ~ARLAN_ACCESS);}
  475. #define arlan_unlock_card_access(dev){
  476.    writeControlRegister(dev,readControlRegister(dev) | ARLAN_ACCESS ); }  
  477. #define ARLAN_COMMAND_RX 0x000001
  478. #define ARLAN_COMMAND_NOOP 0x000002
  479. #define ARLAN_COMMAND_NOOPINT 0x000004
  480. #define ARLAN_COMMAND_TX 0x000008
  481. #define ARLAN_COMMAND_CONF 0x000010
  482. #define ARLAN_COMMAND_RESET 0x000020
  483. #define ARLAN_COMMAND_TX_ABORT 0x000040
  484. #define ARLAN_COMMAND_RX_ABORT 0x000080
  485. #define ARLAN_COMMAND_POWERDOWN 0x000100
  486. #define ARLAN_COMMAND_POWERUP 0x000200
  487. #define ARLAN_COMMAND_SLOW_POLL  0x000400
  488. #define ARLAN_COMMAND_ACTIVATE  0x000800
  489. #define ARLAN_COMMAND_INT_ACK 0x001000
  490. #define ARLAN_COMMAND_INT_ENABLE 0x002000
  491. #define ARLAN_COMMAND_WAIT_NOW 0x004000
  492. #define ARLAN_COMMAND_LONG_WAIT_NOW 0x008000
  493. #define ARLAN_COMMAND_STANDBY 0x010000
  494. #define ARLAN_COMMAND_INT_RACK 0x020000
  495. #define ARLAN_COMMAND_INT_RENABLE 0x040000
  496. #define ARLAN_COMMAND_CONF_WAIT 0x080000
  497. #define ARLAN_COMMAND_TBUSY_CLEAR 0x100000
  498. #define ARLAN_COMMAND_CLEAN_AND_CONF (ARLAN_COMMAND_TX_ABORT
  499. | ARLAN_COMMAND_RX_ABORT
  500. | ARLAN_COMMAND_CONF)
  501. #define ARLAN_COMMAND_CLEAN_AND_RESET   (ARLAN_COMMAND_TX_ABORT
  502. | ARLAN_COMMAND_RX_ABORT
  503. | ARLAN_COMMAND_RESET)
  504.  
  505. #define ARLAN_DEBUG_CHAIN_LOCKS 0x00001
  506. #define ARLAN_DEBUG_RESET 0x00002
  507. #define ARLAN_DEBUG_TIMING 0x00004
  508. #define ARLAN_DEBUG_CARD_STATE 0x00008
  509. #define ARLAN_DEBUG_TX_CHAIN 0x00010
  510. #define ARLAN_DEBUG_MULTICAST 0x00020
  511. #define ARLAN_DEBUG_HEADER_DUMP 0x00040
  512. #define ARLAN_DEBUG_INTERRUPT 0x00080
  513. #define ARLAN_DEBUG_STARTUP 0x00100
  514. #define ARLAN_DEBUG_SHUTDOWN 0x00200
  515.