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