123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539 |
- /*
- * Copyright (C) 1997 Cullen Jennings
- * Copyright (C) 1998 Elmer.Joandi@ut.ee, +37-255-13500
- * GNU General Public License applies
- */
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/types.h>
- #include <linux/skbuff.h>
- #include <linux/if_ether.h> /* For the statistics structure. */
- #include <linux/if_arp.h> /* For ARPHRD_ETHER */
- #include <linux/ptrace.h>
- #include <linux/ioport.h>
- #include <linux/in.h>
- #include <linux/slab.h>
- #include <linux/string.h>
- #include <linux/timer.h>
- #include <linux/init.h>
- #include <linux/bitops.h>
- #include <asm/system.h>
- #include <asm/io.h>
- #include <linux/errno.h>
- #include <linux/delay.h>
- #include <linux/netdevice.h>
- #include <linux/etherdevice.h>
- //#define ARLAN_DEBUGGING 1
- #define ARLAN_PROC_INTERFACE
- #define MAX_ARLANS 4 /* not more than 4 ! */
- #define ARLAN_PROC_SHM_DUMP /* shows all card registers, makes driver way larger */
- #define ARLAN_MAX_MULTICAST_ADDRS 16
- #define ARLAN_RCV_CLEAN 0
- #define ARLAN_RCV_PROMISC 1
- #define ARLAN_RCV_CONTROL 2
- #ifdef CONFIG_PROC_FS
- extern int init_arlan_proc(void);
- extern void cleanup_arlan_proc(void);
- #else
- #define init_arlan_proc() ({ 0; })
- #define cleanup_arlan_proc() do { } while (0)
- #endif
- extern struct net_device *arlan_device[MAX_ARLANS];
- extern int arlan_debug;
- extern int arlan_entry_debug;
- extern int arlan_exit_debug;
- extern int testMemory;
- extern int arlan_command(struct net_device * dev, int command);
-
- #define SIDUNKNOWN -1
- #define radioNodeIdUNKNOWN -1
- #define irqUNKNOWN 0
- #define debugUNKNOWN 0
- #define testMemoryUNKNOWN 1
- #define spreadingCodeUNKNOWN 0
- #define channelNumberUNKNOWN 0
- #define channelSetUNKNOWN 0
- #define systemIdUNKNOWN -1
- #define registrationModeUNKNOWN -1
- #define IFDEBUG( L ) if ( (L) & arlan_debug )
- #define ARLAN_FAKE_HDR_LEN 12
- #ifdef ARLAN_DEBUGGING
- #define DEBUG 1
- #define ARLAN_ENTRY_EXIT_DEBUGGING 1
- #define ARLAN_DEBUG(a,b) printk(KERN_DEBUG a, b)
- #else
- #define ARLAN_DEBUG(a,b)
- #endif
- #define ARLAN_SHMEM_SIZE 0x2000
- struct arlan_shmem
- {
- /* Header Signature */
- volatile char textRegion[48];
- volatile u_char resetFlag;
- volatile u_char diagnosticInfo;
- volatile u_short diagnosticOffset;
- volatile u_char _1[12];
- volatile u_char lanCardNodeId[6];
- volatile u_char broadcastAddress[6];
- volatile u_char hardwareType;
- volatile u_char majorHardwareVersion;
- volatile u_char minorHardwareVersion;
- volatile u_char radioModule;// shows EEPROM, can be overridden at 0x111
- volatile u_char defaultChannelSet; // shows EEProm, can be overriiden at 0x10A
- volatile u_char _2[47];
-
- /* Control/Status Block - 0x0080 */
- volatile u_char interruptInProgress; /* not used by lancpu */
- volatile u_char cntrlRegImage; /* not used by lancpu */
- volatile u_char _3[13];
- volatile u_char dumpByte;
- volatile u_char commandByte; /* non-zero = active */
- volatile u_char commandParameter[15];
- /* Receive Status - 0x00a0 */
- volatile u_char rxStatus; /* 1- data, 2-control, 0xff - registr change */
- volatile u_char rxFrmType;
- volatile u_short rxOffset;
- volatile u_short rxLength;
- volatile u_char rxSrc[6];
- volatile u_char rxBroadcastFlag;
- volatile u_char rxQuality;
- volatile u_char scrambled;
- volatile u_char _4[1];
-
- /* Transmit Status - 0x00b0 */
- volatile u_char txStatus;
- volatile u_char txAckQuality;
- volatile u_char numRetries;
- volatile u_char _5[14];
- volatile u_char registeredRouter[6];
- volatile u_char backboneRouter[6];
- volatile u_char registrationStatus;
- volatile u_char configuredStatusFlag;
- volatile u_char _6[1];
- volatile u_char ultimateDestAddress[6];
- volatile u_char immedDestAddress[6];
- volatile u_char immedSrcAddress[6];
- volatile u_short rxSequenceNumber;
- volatile u_char assignedLocaltalkAddress;
- volatile u_char _7[27];
- /* System Parameter Block */
- /* - Driver Parameters (Novell Specific) */
- volatile u_short txTimeout;
- volatile u_short transportTime;
- volatile u_char _8[4];
- /* - Configuration Parameters */
- volatile u_char irqLevel;
- volatile u_char spreadingCode;
- volatile u_char channelSet;
- volatile u_char channelNumber;
- volatile u_short radioNodeId;
- volatile u_char _9[2];
- volatile u_char scramblingDisable;
- volatile u_char radioType;
- volatile u_short routerId;
- volatile u_char _10[9];
- volatile u_char txAttenuation;
- volatile u_char systemId[4];
- volatile u_short globalChecksum;
- volatile u_char _11[4];
- volatile u_short maxDatagramSize;
- volatile u_short maxFrameSize;
- volatile u_char maxRetries;
- volatile u_char receiveMode;
- volatile u_char priority;
- volatile u_char rootOrRepeater;
- volatile u_char specifiedRouter[6];
- volatile u_short fastPollPeriod;
- volatile u_char pollDecay;
- volatile u_char fastPollDelay[2];
- volatile u_char arlThreshold;
- volatile u_char arlDecay;
- volatile u_char _12[1];
- volatile u_short specRouterTimeout;
- volatile u_char _13[5];
- /* Scrambled Area */
- volatile u_char SID[4];
- volatile u_char encryptionKey[12];
- volatile u_char _14[2];
- volatile u_char waitTime[2];
- volatile u_char lParameter[2];
- volatile u_char _15[3];
- volatile u_short headerSize;
- volatile u_short sectionChecksum;
- volatile u_char registrationMode;
- volatile u_char registrationFill;
- volatile u_short pollPeriod;
- volatile u_short refreshPeriod;
- volatile u_char name[16];
- volatile u_char NID[6];
- volatile u_char localTalkAddress;
- volatile u_char codeFormat;
- volatile u_char numChannels;
- volatile u_char channel1;
- volatile u_char channel2;
- volatile u_char channel3;
- volatile u_char channel4;
- volatile u_char SSCode[59];
- volatile u_char _16[0xC0];
- volatile u_short auxCmd;
- volatile u_char dumpPtr[4];
- volatile u_char dumpVal;
- volatile u_char _17[0x6A];
- volatile u_char wireTest;
- volatile u_char _18[14];
- /* Statistics Block - 0x0300 */
- volatile u_char hostcpuLock;
- volatile u_char lancpuLock;
- volatile u_char resetTime[18];
-
- volatile u_char numDatagramsTransmitted[4];
- volatile u_char numReTransmissions[4];
- volatile u_char numFramesDiscarded[4];
- volatile u_char numDatagramsReceived[4];
- volatile u_char numDuplicateReceivedFrames[4];
- volatile u_char numDatagramsDiscarded[4];
-
- volatile u_short maxNumReTransmitDatagram;
- volatile u_short maxNumReTransmitFrames;
- volatile u_short maxNumConsecutiveDuplicateFrames;
- /* misaligned here so we have to go to characters */
-
- volatile u_char numBytesTransmitted[4];
- volatile u_char numBytesReceived[4];
- volatile u_char numCRCErrors[4];
- volatile u_char numLengthErrors[4];
- volatile u_char numAbortErrors[4];
- volatile u_char numTXUnderruns[4];
- volatile u_char numRXOverruns[4];
- volatile u_char numHoldOffs[4];
- volatile u_char numFramesTransmitted[4];
- volatile u_char numFramesReceived[4];
- volatile u_char numReceiveFramesLost[4];
- volatile u_char numRXBufferOverflows[4];
- volatile u_char numFramesDiscardedAddrMismatch[4];
- volatile u_char numFramesDiscardedSIDMismatch[4];
- volatile u_char numPollsTransmistted[4];
- volatile u_char numPollAcknowledges[4];
- volatile u_char numStatusTimeouts[4];
- volatile u_char numNACKReceived[4];
- volatile u_char _19[0x86];
- volatile u_char txBuffer[0x800];
- volatile u_char rxBuffer[0x800];
- volatile u_char _20[0x800];
- volatile u_char _21[0x3fb];
- volatile u_char configStatus;
- volatile u_char _22;
- volatile u_char progIOCtrl;
- volatile u_char shareMBase;
- volatile u_char controlRegister;
- };
- struct arlan_conf_stru {
- int spreadingCode;
- int channelSet;
- int channelNumber;
- int scramblingDisable;
- int txAttenuation;
- int systemId;
- int maxDatagramSize;
- int maxFrameSize;
- int maxRetries;
- int receiveMode;
- int priority;
- int rootOrRepeater;
- int SID;
- int radioNodeId;
- int registrationMode;
- int registrationFill;
- int localTalkAddress;
- int codeFormat;
- int numChannels;
- int channel1;
- int channel2;
- int channel3;
- int channel4;
- int txClear;
- int txRetries;
- int txRouting;
- int txScrambled;
- int rxParameter;
- int txTimeoutMs;
- int txAckTimeoutMs;
- int waitCardTimeout;
- int waitTime;
- int lParameter;
- int _15;
- int headerSize;
- int retries;
- int tx_delay_ms;
- int waitReTransmitPacketMaxSize;
- int ReTransmitPacketMaxSize;
- int fastReTransCount;
- int driverRetransmissions;
- int registrationInterrupts;
- int hardwareType;
- int radioType;
- int writeRadioType;
- int writeEEPROM;
- char siteName[17];
- int measure_rate;
- int in_speed;
- int out_speed;
- int in_speed10;
- int out_speed10;
- int in_speed_max;
- int out_speed_max;
- int pre_Command_Wait;
- int rx_tweak1;
- int rx_tweak2;
- int tx_queue_len;
- };
- extern struct arlan_conf_stru arlan_conf[MAX_ARLANS];
- struct TxParam
- {
- volatile short offset;
- volatile short length;
- volatile u_char dest[6];
- volatile unsigned char clear;
- volatile unsigned char retries;
- volatile unsigned char routing;
- volatile unsigned char scrambled;
- };
- #define TX_RING_SIZE 2
- /* Information that need to be kept for each board. */
- struct arlan_private {
- struct arlan_shmem __iomem * card;
- struct arlan_shmem * conf;
- struct arlan_conf_stru * Conf;
- int bad;
- int reset;
- unsigned long lastReset;
- struct timer_list timer;
- struct timer_list tx_delay_timer;
- struct timer_list tx_retry_timer;
- struct timer_list rx_check_timer;
- int registrationLostCount;
- int reRegisterExp;
- int irq_test_done;
- struct TxParam txRing[TX_RING_SIZE];
- char reTransmitBuff[0x800];
- int txLast;
- unsigned ReTransmitRequested;
- unsigned long tx_done_delayed;
- unsigned long registrationLastSeen;
- unsigned long tx_last_sent;
- unsigned long tx_last_cleared;
- unsigned long retransmissions;
- unsigned long interrupt_ack_requested;
- spinlock_t lock;
- unsigned long waiting_command_mask;
- unsigned long card_polling_interval;
- unsigned long last_command_buff_free_time;
- int under_reset;
- int under_config;
- int rx_command_given;
- int tx_command_given;
- unsigned long interrupt_processing_active;
- unsigned long last_rx_int_ack_time;
- unsigned long in_bytes;
- unsigned long out_bytes;
- unsigned long in_time;
- unsigned long out_time;
- unsigned long in_time10;
- unsigned long out_time10;
- unsigned long in_bytes10;
- unsigned long out_bytes10;
- int init_etherdev_alloc;
- };
- #define ARLAN_CLEAR 0x00
- #define ARLAN_RESET 0x01
- #define ARLAN_CHANNEL_ATTENTION 0x02
- #define ARLAN_INTERRUPT_ENABLE 0x04
- #define ARLAN_CLEAR_INTERRUPT 0x08
- #define ARLAN_POWER 0x40
- #define ARLAN_ACCESS 0x80
- #define ARLAN_COM_CONF 0x01
- #define ARLAN_COM_RX_ENABLE 0x03
- #define ARLAN_COM_RX_ABORT 0x04
- #define ARLAN_COM_TX_ENABLE 0x05
- #define ARLAN_COM_TX_ABORT 0x06
- #define ARLAN_COM_NOP 0x07
- #define ARLAN_COM_STANDBY 0x08
- #define ARLAN_COM_ACTIVATE 0x09
- #define ARLAN_COM_GOTO_SLOW_POLL 0x0a
- #define ARLAN_COM_INT 0x80
- #define TXLAST(dev) (((struct arlan_private *)netdev_priv(dev))->txRing[((struct arlan_private *)netdev_priv(dev))->txLast])
- #define TXHEAD(dev) (((struct arlan_private *)netdev_priv(dev))->txRing[0])
- #define TXTAIL(dev) (((struct arlan_private *)netdev_priv(dev))->txRing[1])
- #define TXBuffStart(dev) offsetof(struct arlan_shmem, txBuffer)
- #define TXBuffEnd(dev) offsetof(struct arlan_shmem, xxBuffer)
-
- #define READSHM(to,from,atype) {\
- atype tmp;\
- memcpy_fromio(&(tmp),&(from),sizeof(atype));\
- to = tmp;\
- }
- #define READSHMEM(from,atype)\
- atype from; \
- READSHM(from, arlan->from, atype);
- #define WRITESHM(to,from,atype) \
- { atype tmpSHM = from;\
- memcpy_toio(&(to),&tmpSHM,sizeof(atype));\
- }
- #define DEBUGSHM(levelSHM,stringSHM,stuff,atype) \
- { atype tmpSHM; \
- memcpy_fromio(&tmpSHM,&(stuff),sizeof(atype));\
- IFDEBUG(levelSHM) printk(stringSHM,tmpSHM);\
- }
- #define WRITESHMB(to, val) \
- writeb(val,&(to))
- #define READSHMB(to) \
- readb(&(to))
- #define WRITESHMS(to, val) \
- writew(val,&(to))
- #define READSHMS(to) \
- readw(&(to))
- #define WRITESHMI(to, val) \
- writel(val,&(to))
- #define READSHMI(to) \
- readl(&(to))
- #define registrationBad(dev)\
- ( ( READSHMB(((struct arlan_private *)netdev_priv(dev))->card->registrationMode) > 0) && \
- ( READSHMB(((struct arlan_private *)netdev_priv(dev))->card->registrationStatus) == 0) )
- #define readControlRegister(dev)\
- READSHMB(((struct arlan_private *)netdev_priv(dev))->card->cntrlRegImage)
- #define writeControlRegister(dev, v){\
- WRITESHMB(((struct arlan_private *)netdev_priv(dev))->card->cntrlRegImage ,((v) &0xF) );\
- WRITESHMB(((struct arlan_private *)netdev_priv(dev))->card->controlRegister ,(v) );}
- #define arlan_interrupt_lancpu(dev) {\
- int cr; \
- \
- cr = readControlRegister(dev);\
- if (cr & ARLAN_CHANNEL_ATTENTION){ \
- writeControlRegister(dev, (cr & ~ARLAN_CHANNEL_ATTENTION));\
- }else \
- writeControlRegister(dev, (cr | ARLAN_CHANNEL_ATTENTION));\
- }
- #define clearChannelAttention(dev){ \
- writeControlRegister(dev,readControlRegister(dev) & ~ARLAN_CHANNEL_ATTENTION);}
- #define setHardwareReset(dev) {\
- writeControlRegister(dev,readControlRegister(dev) | ARLAN_RESET);}
- #define clearHardwareReset(dev) {\
- writeControlRegister(dev,readControlRegister(dev) & ~ARLAN_RESET);}
- #define setInterruptEnable(dev){\
- writeControlRegister(dev,readControlRegister(dev) | ARLAN_INTERRUPT_ENABLE) ;}
- #define clearInterruptEnable(dev){\
- writeControlRegister(dev,readControlRegister(dev) & ~ARLAN_INTERRUPT_ENABLE) ;}
- #define setClearInterrupt(dev){\
- writeControlRegister(dev,readControlRegister(dev) | ARLAN_CLEAR_INTERRUPT) ;}
- #define clearClearInterrupt(dev){\
- writeControlRegister(dev,readControlRegister(dev) & ~ARLAN_CLEAR_INTERRUPT);}
- #define setPowerOff(dev){\
- writeControlRegister(dev,readControlRegister(dev) | (ARLAN_POWER && ARLAN_ACCESS));\
- writeControlRegister(dev,readControlRegister(dev) & ~ARLAN_ACCESS);}
- #define setPowerOn(dev){\
- writeControlRegister(dev,readControlRegister(dev) & ~(ARLAN_POWER)); }
- #define arlan_lock_card_access(dev){\
- writeControlRegister(dev,readControlRegister(dev) & ~ARLAN_ACCESS);}
- #define arlan_unlock_card_access(dev){\
- writeControlRegister(dev,readControlRegister(dev) | ARLAN_ACCESS ); }
- #define ARLAN_COMMAND_RX 0x000001
- #define ARLAN_COMMAND_NOOP 0x000002
- #define ARLAN_COMMAND_NOOPINT 0x000004
- #define ARLAN_COMMAND_TX 0x000008
- #define ARLAN_COMMAND_CONF 0x000010
- #define ARLAN_COMMAND_RESET 0x000020
- #define ARLAN_COMMAND_TX_ABORT 0x000040
- #define ARLAN_COMMAND_RX_ABORT 0x000080
- #define ARLAN_COMMAND_POWERDOWN 0x000100
- #define ARLAN_COMMAND_POWERUP 0x000200
- #define ARLAN_COMMAND_SLOW_POLL 0x000400
- #define ARLAN_COMMAND_ACTIVATE 0x000800
- #define ARLAN_COMMAND_INT_ACK 0x001000
- #define ARLAN_COMMAND_INT_ENABLE 0x002000
- #define ARLAN_COMMAND_WAIT_NOW 0x004000
- #define ARLAN_COMMAND_LONG_WAIT_NOW 0x008000
- #define ARLAN_COMMAND_STANDBY 0x010000
- #define ARLAN_COMMAND_INT_RACK 0x020000
- #define ARLAN_COMMAND_INT_RENABLE 0x040000
- #define ARLAN_COMMAND_CONF_WAIT 0x080000
- #define ARLAN_COMMAND_TBUSY_CLEAR 0x100000
- #define ARLAN_COMMAND_CLEAN_AND_CONF (ARLAN_COMMAND_TX_ABORT\
- | ARLAN_COMMAND_RX_ABORT\
- | ARLAN_COMMAND_CONF)
- #define ARLAN_COMMAND_CLEAN_AND_RESET (ARLAN_COMMAND_TX_ABORT\
- | ARLAN_COMMAND_RX_ABORT\
- | ARLAN_COMMAND_RESET)
-
- #define ARLAN_DEBUG_CHAIN_LOCKS 0x00001
- #define ARLAN_DEBUG_RESET 0x00002
- #define ARLAN_DEBUG_TIMING 0x00004
- #define ARLAN_DEBUG_CARD_STATE 0x00008
- #define ARLAN_DEBUG_TX_CHAIN 0x00010
- #define ARLAN_DEBUG_MULTICAST 0x00020
- #define ARLAN_DEBUG_HEADER_DUMP 0x00040
- #define ARLAN_DEBUG_INTERRUPT 0x00080
- #define ARLAN_DEBUG_STARTUP 0x00100
- #define ARLAN_DEBUG_SHUTDOWN 0x00200
-
|