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