File: /usr/src/linux/drivers/net/arlan.c

1     /*
2      *  Copyright (C) 1997 Cullen Jennings
3      *  Copyright (C) 1998 Elmer Joandiu, elmer@ylenurme.ee
4      *  GNU General Public License applies
5      * This module provides support for the Arlan 655 card made by Aironet
6      */
7     
8     #include <linux/config.h>
9     #include "arlan.h"
10     
11     static const char *arlan_version = "C.Jennigs 97 & Elmer.Joandi@ut.ee  Oct'98, http://www.ylenurme.ee/~elmer/655/";
12     
13     struct net_device *arlan_device[MAX_ARLANS];
14     int last_arlan;
15     
16     static int SID = SIDUNKNOWN;
17     static int radioNodeId = radioNodeIdUNKNOWN;
18     static char encryptionKey[12] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};
19     static char *siteName = siteNameUNKNOWN;
20     static int mem = memUNKNOWN;
21     int arlan_debug = debugUNKNOWN;
22     static int probe = probeUNKNOWN;
23     static int numDevices = numDevicesUNKNOWN;
24     static int spreadingCode = spreadingCodeUNKNOWN;
25     static int channelNumber = channelNumberUNKNOWN;
26     static int channelSet = channelSetUNKNOWN;
27     static int systemId = systemIdUNKNOWN;
28     static int registrationMode = registrationModeUNKNOWN;
29     static int keyStart;
30     static int tx_delay_ms;
31     static int retries = 5;
32     static int async = 1;
33     static int tx_queue_len = 1;
34     static int arlan_EEPROM_bad;
35     
36     #ifdef ARLAN_DEBUGGING
37     
38     static int arlan_entry_debug;
39     static int arlan_exit_debug;
40     static int testMemory = testMemoryUNKNOWN;
41     static int irq = irqUNKNOWN;
42     static int txScrambled = 1;
43     static int mdebug;
44     #endif
45     
46     #if LINUX_VERSION_CODE > 0x20100
47     MODULE_PARM(irq, "i");
48     MODULE_PARM(mem, "i");
49     MODULE_PARM(probe, "i");
50     MODULE_PARM(arlan_debug, "i");
51     MODULE_PARM(numDevices, "i");
52     MODULE_PARM(testMemory, "i");
53     MODULE_PARM(spreadingCode, "i");
54     MODULE_PARM(channelNumber, "i");
55     MODULE_PARM(channelSet, "i");
56     MODULE_PARM(systemId, "i");
57     MODULE_PARM(registrationMode, "i");
58     MODULE_PARM(radioNodeId, "i");
59     MODULE_PARM(SID, "i");
60     MODULE_PARM(txScrambled, "i");
61     MODULE_PARM(keyStart, "i");
62     MODULE_PARM(mdebug, "i");
63     MODULE_PARM(tx_delay_ms, "i");
64     MODULE_PARM(retries, "i");
65     MODULE_PARM(async, "i");
66     MODULE_PARM(tx_queue_len, "i");
67     MODULE_PARM(arlan_entry_debug, "i");
68     MODULE_PARM(arlan_exit_debug, "i");
69     MODULE_PARM(arlan_entry_and_exit_debug, "i");
70     MODULE_PARM(arlan_EEPROM_bad, "i");
71     MODULE_PARM_DESC(irq, "(unused)");
72     MODULE_PARM_DESC(mem, "Arlan memory address for single device probing");
73     MODULE_PARM_DESC(probe, "Arlan probe at initialization (0-1)");
74     MODULE_PARM_DESC(arlan_debug, "Arlan debug enable (0-1)");
75     MODULE_PARM_DESC(numDevices, "Number of Arlan devices; ignored if >1");
76     MODULE_PARM_DESC(testMemory, "(unused)");
77     MODULE_PARM_DESC(mdebug, "Arlan multicast debugging (0-1)");
78     MODULE_PARM_DESC(retries, "Arlan maximum packet retransmisions");
79     #ifdef ARLAN_ENTRY_EXIT_DEBUGGING
80     MODULE_PARM_DESC(arlan_entry_debug, "Arlan driver function entry debugging");
81     MODULE_PARM_DESC(arlan_exit_debug, "Arlan driver function exit debugging");
82     MODULE_PARM_DESC(arlan_entry_and_exit_debug, "Arlan driver function entry and exit debugging");
83     #else
84     MODULE_PARM_DESC(arlan_entry_debug, "(ignored)");
85     MODULE_PARM_DESC(arlan_exit_debug, "(ignored)");
86     MODULE_PARM_DESC(arlan_entry_and_exit_debug, "(ignored)");
87     #endif
88     
89     EXPORT_SYMBOL(arlan_device);
90     EXPORT_SYMBOL(arlan_conf);
91     EXPORT_SYMBOL(last_arlan);
92     
93     
94     //        #warning kernel 2.1.110 tested
95     #define myATOMIC_INIT(a,b) atomic_set(&(a),b)
96     
97     #else
98     #define test_and_set_bit	set_bit
99     #if LINUX_VERSION_CODE != 0x20024
100      //        #warning kernel  2.0.36  tested
101     #endif
102     #define myATOMIC_INIT(a,b) a = b;
103     
104     #endif
105     
106     struct arlan_conf_stru arlan_conf[MAX_ARLANS];
107     static int arlans_found;
108     
109     static  int 	arlan_probe_here(struct net_device *dev, int ioaddr);
110     static  int 	arlan_open(struct net_device *dev);
111     static  int 	arlan_tx(struct sk_buff *skb, struct net_device *dev);
112     static  void 	arlan_interrupt(int irq, void *dev_id, struct pt_regs *regs);
113     static  int 	arlan_close(struct net_device *dev);
114     static  struct net_device_stats *
115     		arlan_statistics		(struct net_device *dev);
116     static  void 	arlan_set_multicast		(struct net_device *dev);
117     static  int 	arlan_hw_tx			(struct net_device* dev, char *buf, int length );
118     static  int	arlan_hw_config			(struct net_device * dev);
119     static  void 	arlan_tx_done_interrupt		(struct net_device * dev, int status);
120     static  void	arlan_rx_interrupt		(struct net_device * dev, u_char rxStatus, u_short, u_short);
121     static  void	arlan_process_interrupt		(struct net_device * dev);
122     static	void	arlan_tx_timeout		(struct net_device *dev);
123     int	arlan_command(struct net_device * dev, int command);
124     
125     EXPORT_SYMBOL(arlan_command);
126     
127     extern inline long long arlan_time(void)
128     {
129     	struct timeval timev;
130     	do_gettimeofday(&timev);
131     	return ((long long) timev.tv_sec * 1000000 + timev.tv_usec);
132     };
133     
134     #ifdef ARLAN_ENTRY_EXIT_DEBUGGING
135     #define ARLAN_DEBUG_ENTRY(name) \
136     	{\
137     	struct timeval timev;\
138     	do_gettimeofday(&timev);\
139     		if (arlan_entry_debug || arlan_entry_and_exit_debug)\
140     			printk("--->>>" name " %ld " "\n",((long int) timev.tv_sec * 1000000 + timev.tv_usec));\
141     	}
142     #define ARLAN_DEBUG_EXIT(name) \
143     	{\
144     	struct timeval timev;\
145     	do_gettimeofday(&timev);\
146     		if (arlan_exit_debug || arlan_entry_and_exit_debug)\
147     			printk("<<<---" name " %ld " "\n",((long int) timev.tv_sec * 1000000 + timev.tv_usec) );\
148     	}
149     #else
150     #define ARLAN_DEBUG_ENTRY(name)
151     #define ARLAN_DEBUG_EXIT(name)
152     #endif
153     
154     
155     #define arlan_interrupt_ack(dev)\
156             clearClearInterrupt(dev);\
157             setClearInterrupt(dev);
158     
159     
160     #define ARLAN_COMMAND_LOCK(dev) \
161     	if (atomic_dec_and_test(&((struct arlan_private * )dev->priv)->card_users))\
162        		arlan_wait_command_complete_short(dev,__LINE__);
163     #define ARLAN_COMMAND_UNLOCK(dev) \
164     	atomic_inc(&((struct arlan_private * )dev->priv)->card_users);
165     
166     
167     #define ARLAN_COMMAND_INC(dev) \
168      	{((struct arlan_private *) dev->priv)->under_command++;}
169     #define ARLAN_COMMAND_ZERO(dev) \
170      	{((struct arlan_private *) dev->priv)->under_command =0;}
171     #define ARLAN_UNDER_COMMAND(dev)\
172     	(((struct arlan_private *) dev->priv)->under_command)
173     
174     #define ARLAN_COMMAND_START(dev) ARLAN_COMMAND_INC(dev)
175     #define ARLAN_COMMAND_END(dev) ARLAN_COMMAND_ZERO(dev)
176     #define ARLAN_TOGGLE_START(dev)\
177      	{((struct arlan_private *) dev->priv)->under_toggle++;}
178     #define ARLAN_TOGGLE_END(dev)\
179      	{((struct arlan_private *) dev->priv)->under_toggle=0;}
180     #define ARLAN_UNDER_TOGGLE(dev)\
181      	(((struct arlan_private *) dev->priv)->under_toggle)
182     
183     
184     
185     extern inline int arlan_drop_tx(struct net_device *dev)
186     {
187     	struct arlan_private *priv = ((struct arlan_private *) dev->priv);
188     
189     	priv->stats.tx_errors++;
190     	if (priv->Conf->tx_delay_ms)
191     	{
192     		priv->tx_done_delayed = jiffies + priv->Conf->tx_delay_ms * HZ / 1000 + 1;
193     	}
194     	else
195     	{
196     		priv->waiting_command_mask &= ~ARLAN_COMMAND_TX;
197     		TXHEAD(dev).offset = 0;
198     		TXTAIL(dev).offset = 0;
199     		priv->txLast = 0;
200     		priv->txOffset = 0;
201     		priv->bad = 0;
202     		if (!priv->under_reset && !priv->under_config)
203     			netif_wake_queue (dev);
204     	}
205     	return 1;
206     };
207     
208     
209     int arlan_command(struct net_device *dev, int command_p)
210     {
211     
212     	volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card;
213     	struct arlan_conf_stru *conf = ((struct arlan_private *) dev->priv)->Conf;
214     	struct arlan_private *priv = (struct arlan_private *) dev->priv;
215     	int udelayed = 0;
216     	int i = 0;
217     	long long time_mks = arlan_time();
218     
219     	ARLAN_DEBUG_ENTRY("arlan_command");
220     
221     	if (priv->card_polling_interval)
222     		priv->card_polling_interval = 1;
223     
224     	if (arlan_debug & ARLAN_DEBUG_CHAIN_LOCKS)
225     		printk(KERN_DEBUG "arlan_command, %lx lock %lx  commandByte %x waiting %x incoming %x \n",
226     		jiffies, priv->command_lock, READSHMB(arlan->commandByte),
227     		       priv->waiting_command_mask, command_p);
228     
229     	priv->waiting_command_mask |= command_p;
230     
231     	if (priv->waiting_command_mask & ARLAN_COMMAND_RESET)
232     		if (jiffies - priv->lastReset < 5 * HZ)
233     			priv->waiting_command_mask &= ~ARLAN_COMMAND_RESET;
234     
235     	if (priv->waiting_command_mask & ARLAN_COMMAND_INT_ACK)
236     	{
237     		arlan_interrupt_ack(dev);
238     		priv->waiting_command_mask &= ~ARLAN_COMMAND_INT_ACK;
239     	}
240     	if (priv->waiting_command_mask & ARLAN_COMMAND_INT_ENABLE)
241     	{
242     		setInterruptEnable(dev);
243     		priv->waiting_command_mask &= ~ARLAN_COMMAND_INT_ENABLE;
244     	}
245     
246     	/* Card access serializing lock */
247     
248     	if (test_and_set_bit(0, (void *) &priv->command_lock))
249     	{
250     		if (arlan_debug & ARLAN_DEBUG_CHAIN_LOCKS)
251     			printk(KERN_DEBUG "arlan_command: entered when command locked \n");
252     		goto command_busy_end;
253     	}
254     	/* Check cards status and waiting */
255     
256     	if (priv->waiting_command_mask & (ARLAN_COMMAND_LONG_WAIT_NOW | ARLAN_COMMAND_WAIT_NOW))
257     	{
258     		while (priv->waiting_command_mask & (ARLAN_COMMAND_LONG_WAIT_NOW | ARLAN_COMMAND_WAIT_NOW))
259     		{
260     			if (READSHMB(arlan->resetFlag) ||
261     				READSHMB(arlan->commandByte))	/* || 
262     								   (readControlRegister(dev) & ARLAN_ACCESS))
263     								 */
264     				udelay(40);
265     			else
266     				priv->waiting_command_mask &= ~(ARLAN_COMMAND_LONG_WAIT_NOW | ARLAN_COMMAND_WAIT_NOW);
267     
268     			udelayed++;
269     
270     			if (priv->waiting_command_mask & ARLAN_COMMAND_LONG_WAIT_NOW)
271     			{
272     				if (udelayed * 40 > 1000000)
273     				{
274     					printk(KERN_ERR "%s long wait too long \n", dev->name);
275     					priv->waiting_command_mask |= ARLAN_COMMAND_RESET;
276     					break;
277     				}
278     			}
279     			else if (priv->waiting_command_mask & ARLAN_COMMAND_WAIT_NOW)
280     			{
281     				if (udelayed * 40 > 1000)
282     				{
283     					printk(KERN_ERR "%s short wait too long \n", dev->name);
284     					goto bad_end;
285     				}
286     			}
287     		}
288     	}
289     	else
290     	{
291     		i = 0;
292     		while ((READSHMB(arlan->resetFlag) ||
293     			READSHMB(arlan->commandByte)) &&
294     			conf->pre_Command_Wait > (i++) * 10)
295     			udelay(10);
296     
297     
298     		if ((READSHMB(arlan->resetFlag) ||
299     			READSHMB(arlan->commandByte)) &&
300     			!(priv->waiting_command_mask & ARLAN_COMMAND_RESET))
301     		{
302     			goto card_busy_end;
303     		}
304     	}
305     	if (priv->waiting_command_mask & ARLAN_COMMAND_RESET)
306     		priv->under_reset = 1;
307     	if (priv->waiting_command_mask & ARLAN_COMMAND_CONF)
308     		priv->under_config = 1;
309     
310     	/* Issuing command */
311     	arlan_lock_card_access(dev);
312     	if (priv->waiting_command_mask & ARLAN_COMMAND_POWERUP)
313     	{
314     	//     if (readControlRegister(dev) & (ARLAN_ACCESS && ARLAN_POWER))
315     		setPowerOn(dev);
316     		arlan_interrupt_lancpu(dev);
317     		priv->waiting_command_mask &= ~ARLAN_COMMAND_POWERUP;
318     		priv->waiting_command_mask |= ARLAN_COMMAND_RESET;
319     		priv->card_polling_interval = HZ / 10;
320     	}
321     	else if (priv->waiting_command_mask & ARLAN_COMMAND_ACTIVATE)
322     	{
323     		WRITESHMB(arlan->commandByte, ARLAN_COM_ACTIVATE);
324     		arlan_interrupt_lancpu(dev);
325     		priv->waiting_command_mask &= ~ARLAN_COMMAND_ACTIVATE;
326     		priv->card_polling_interval = HZ / 10;
327     	}
328     	else if (priv->waiting_command_mask & ARLAN_COMMAND_RX_ABORT)
329     	{
330     		if (priv->rx_command_given)
331     		{
332     			WRITESHMB(arlan->commandByte, ARLAN_COM_RX_ABORT);
333     			arlan_interrupt_lancpu(dev);
334     			priv->rx_command_given = 0;
335     		}
336     		priv->waiting_command_mask &= ~ARLAN_COMMAND_RX_ABORT;
337     		priv->card_polling_interval = 1;
338     	}
339     	else if (priv->waiting_command_mask & ARLAN_COMMAND_TX_ABORT)
340     	{
341     		if (priv->tx_command_given)
342     		{
343     			WRITESHMB(arlan->commandByte, ARLAN_COM_TX_ABORT);
344     			arlan_interrupt_lancpu(dev);
345     			priv->tx_command_given = 0;
346     		}
347     		priv->waiting_command_mask &= ~ARLAN_COMMAND_TX_ABORT;
348     		priv->card_polling_interval = 1;
349     	}
350     	else if (priv->waiting_command_mask & ARLAN_COMMAND_RESET)
351     	{
352     		priv->under_reset=1;
353     		netif_stop_queue (dev);
354     
355     		arlan_drop_tx(dev);
356     		if (priv->tx_command_given || priv->rx_command_given)
357     		{
358     			printk(KERN_ERR "%s: Reset under tx or rx command \n", dev->name);
359     		};
360     		netif_stop_queue (dev);
361     		if (arlan_debug & ARLAN_DEBUG_RESET)
362     			printk(KERN_ERR "%s: Doing chip reset\n", dev->name);
363     		priv->lastReset = jiffies;
364     		WRITESHM(arlan->commandByte, 0, u_char);
365     		/* hold card in reset state */
366     		setHardwareReset(dev);
367     		/* set reset flag and then release reset */
368     		WRITESHM(arlan->resetFlag, 0xff, u_char);
369     		clearChannelAttention(dev);
370     		clearHardwareReset(dev);
371     		priv->numResets++;
372     		priv->card_polling_interval = HZ / 4;
373     		priv->waiting_command_mask &= ~ARLAN_COMMAND_RESET;
374     		priv->waiting_command_mask |= ARLAN_COMMAND_INT_RACK;
375     //		priv->waiting_command_mask |= ARLAN_COMMAND_INT_RENABLE; 
376     //		priv->waiting_command_mask |= ARLAN_COMMAND_RX;
377     	}
378     	else if (priv->waiting_command_mask & ARLAN_COMMAND_INT_RACK)
379     	{
380     		clearHardwareReset(dev);
381     		clearClearInterrupt(dev);
382     		setClearInterrupt(dev);
383     		setInterruptEnable(dev);
384     		priv->waiting_command_mask &= ~ARLAN_COMMAND_INT_RACK;
385     		priv->waiting_command_mask |= ARLAN_COMMAND_CONF;
386     		priv->under_config = 1;
387     		priv->under_reset = 0;
388     	}
389     	else if (priv->waiting_command_mask & ARLAN_COMMAND_INT_RENABLE)
390     	{
391     		setInterruptEnable(dev);
392     		priv->waiting_command_mask &= ~ARLAN_COMMAND_INT_RENABLE;
393     	}
394     	else if (priv->waiting_command_mask & ARLAN_COMMAND_CONF)
395     	{
396     		if (priv->tx_command_given || priv->rx_command_given)
397     		{
398     			printk(KERN_ERR "%s: Reset under tx or rx command \n", dev->name);
399     		}
400     		arlan_drop_tx(dev);
401     		setInterruptEnable(dev);
402     		arlan_hw_config(dev);
403     		arlan_interrupt_lancpu(dev);
404     		priv->waiting_command_mask &= ~ARLAN_COMMAND_CONF;
405     		priv->card_polling_interval = HZ / 10;
406     //		priv->waiting_command_mask |= ARLAN_COMMAND_INT_RACK;   
407     //		priv->waiting_command_mask |= ARLAN_COMMAND_INT_ENABLE; 
408     		priv->waiting_command_mask |= ARLAN_COMMAND_CONF_WAIT;
409     	}
410     	else if (priv->waiting_command_mask & ARLAN_COMMAND_CONF_WAIT)
411     	{
412     		if (READSHMB(arlan->configuredStatusFlag) != 0 &&
413     			READSHMB(arlan->diagnosticInfo) == 0xff)
414     		{
415     			priv->waiting_command_mask &= ~ARLAN_COMMAND_CONF_WAIT;
416     			priv->waiting_command_mask |= ARLAN_COMMAND_RX;
417     			priv->waiting_command_mask |= ARLAN_COMMAND_TBUSY_CLEAR;
418     			priv->card_polling_interval = HZ / 10;
419     			priv->tx_command_given = 0;
420     			priv->under_config = 0;
421     		}
422     		else
423     		{
424     			priv->card_polling_interval = 1;
425     			if (arlan_debug & ARLAN_DEBUG_TIMING)
426     				printk(KERN_ERR "configure delayed \n");
427     		}
428     	}
429     	else if (priv->waiting_command_mask & ARLAN_COMMAND_RX)
430     	{
431     		if (!registrationBad(dev))
432     		{
433     			setInterruptEnable(dev);
434     			memset_io((void *) arlan->commandParameter, 0, 0xf);
435     			WRITESHMB(arlan->commandByte, ARLAN_COM_INT | ARLAN_COM_RX_ENABLE);
436     			WRITESHMB(arlan->commandParameter[0], conf->rxParameter);
437     			arlan_interrupt_lancpu(dev);
438     			priv->rx_command_given = 0; // mnjah, bad
439     			priv->last_rx_time = arlan_time();
440     			priv->waiting_command_mask &= ~ARLAN_COMMAND_RX;
441     			priv->card_polling_interval = 1;
442     		}
443     		else
444     			priv->card_polling_interval = 2;
445     	}
446     	else if (priv->waiting_command_mask & ARLAN_COMMAND_TBUSY_CLEAR)
447     	{
448     		if ( !registrationBad(dev) &&
449     		     (netif_queue_stopped(dev) || !netif_running(dev)) )
450     			{
451     				priv->waiting_command_mask &= ~ARLAN_COMMAND_TBUSY_CLEAR;
452     				netif_wake_queue (dev);
453     			};
454     	}
455     	else if (priv->waiting_command_mask & ARLAN_COMMAND_TX)
456     	{
457     		if (!test_and_set_bit(0, (void *) &priv->tx_command_given))
458     		{
459     			if ((time_mks - priv->last_tx_time > conf->rx_tweak1) ||
460     				(time_mks - priv->last_rx_int_ack_time < conf->rx_tweak2))
461     			{
462     				setInterruptEnable(dev);
463     				memset_io((void *) arlan->commandParameter, 0, 0xf);
464     				WRITESHMB(arlan->commandByte, ARLAN_COM_TX_ENABLE | ARLAN_COM_INT);
465     				memcpy_toio((void *) arlan->commandParameter, &TXLAST(dev), 14);
466     //				for ( i=1 ; i < 15 ; i++) printk("%02x:",READSHMB(arlan->commandParameter[i]));
467     				priv->last_command_was_rx = 0;
468     				priv->tx_last_sent = jiffies;
469     				arlan_interrupt_lancpu(dev);
470     				priv->last_tx_time = arlan_time();
471     				priv->tx_command_given = 1;
472     				priv->waiting_command_mask &= ~ARLAN_COMMAND_TX;
473     				priv->card_polling_interval = 1;
474     			}
475     			else
476     			{
477     				priv->tx_command_given = 0;
478     				priv->card_polling_interval = 1;
479     			}
480     		} 
481     		else if (arlan_debug & ARLAN_DEBUG_CHAIN_LOCKS)
482     			printk(KERN_ERR "tx command when tx chain locked \n");
483     	}
484     	else if (priv->waiting_command_mask & ARLAN_COMMAND_NOOPINT)
485     	{
486     		{
487     			WRITESHMB(arlan->commandByte, ARLAN_COM_NOP | ARLAN_COM_INT);
488     		}
489     		arlan_interrupt_lancpu(dev);
490     		priv->waiting_command_mask &= ~ARLAN_COMMAND_NOOPINT;
491     		priv->card_polling_interval = HZ / 3;
492     	}
493     	else if (priv->waiting_command_mask & ARLAN_COMMAND_NOOP)
494     	{
495     		WRITESHMB(arlan->commandByte, ARLAN_COM_NOP);
496     		arlan_interrupt_lancpu(dev);
497     		priv->waiting_command_mask &= ~ARLAN_COMMAND_NOOP;
498     		priv->card_polling_interval = HZ / 3;
499     	}
500     	else if (priv->waiting_command_mask & ARLAN_COMMAND_SLOW_POLL)
501     	{
502     		WRITESHMB(arlan->commandByte, ARLAN_COM_GOTO_SLOW_POLL);
503     		arlan_interrupt_lancpu(dev);
504     		priv->waiting_command_mask &= ~ARLAN_COMMAND_SLOW_POLL;
505     		priv->card_polling_interval = HZ / 3;
506     	} 
507     	else if (priv->waiting_command_mask & ARLAN_COMMAND_POWERDOWN)
508     	{
509     		setPowerOff(dev);
510     		if (arlan_debug & ARLAN_DEBUG_CARD_STATE)
511     			printk(KERN_WARNING "%s: Arlan Going Standby\n", dev->name);
512     		priv->waiting_command_mask &= ~ARLAN_COMMAND_POWERDOWN;
513     		priv->card_polling_interval = 3 * HZ;
514     	}
515     	arlan_unlock_card_access(dev);
516     	for (i = 0; READSHMB(arlan->commandByte) && i < 20; i++)
517     		udelay(10);
518     	if (READSHMB(arlan->commandByte))
519     		if (arlan_debug & ARLAN_DEBUG_CARD_STATE)
520     			printk(KERN_ERR "card busy leaving command %x \n", priv->waiting_command_mask);
521     
522     	priv->command_lock = 0;
523     	ARLAN_DEBUG_EXIT("arlan_command");
524     	priv->last_command_buff_free_time = jiffies;
525     	return 0;
526     
527     card_busy_end:
528     	if (jiffies - priv->last_command_buff_free_time > HZ)
529     		priv->waiting_command_mask |= ARLAN_COMMAND_CLEAN_AND_RESET;
530     
531     	if (arlan_debug & ARLAN_DEBUG_CARD_STATE)
532     		printk(KERN_ERR "%s arlan_command card busy end \n", dev->name);
533     	priv->command_lock = 0;
534     	ARLAN_DEBUG_EXIT("arlan_command");
535     	return 1;
536     
537     bad_end:
538     	printk(KERN_ERR "%s arlan_command bad end \n", dev->name);
539     
540     	priv->command_lock = 0;
541     	ARLAN_DEBUG_EXIT("arlan_command");
542     
543     	return -1;
544     
545     command_busy_end:
546     	if (arlan_debug & ARLAN_DEBUG_CARD_STATE)
547     		printk(KERN_ERR "%s arlan_command command busy end \n", dev->name);
548     	ARLAN_DEBUG_EXIT("arlan_command");
549     	return 2;
550     
551     };
552     
553     extern inline void arlan_command_process(struct net_device *dev)
554     {
555     	struct arlan_private *priv = ((struct arlan_private *) dev->priv);
556     
557     	int times = 0;
558     	while (priv->waiting_command_mask && times < 8)
559     	{
560     		if (priv->waiting_command_mask)
561     		{
562     			if (arlan_command(dev, 0))
563     				break;
564     			times++;
565     		}
566     		/* if long command, we wont repeat trying */ ;
567     		if (priv->card_polling_interval > 1)
568     			break;
569     		times++;
570     	}
571     }
572     
573     
574     extern inline void arlan_retransmit_now(struct net_device *dev)
575     {
576     	struct arlan_private *priv = ((struct arlan_private *) dev->priv);
577     
578     
579     	ARLAN_DEBUG_ENTRY("arlan_retransmit_now");
580     	if (TXLAST(dev).offset == 0)
581     	{
582     		if (TXHEAD(dev).offset)
583     		{
584     			priv->txLast = 0;
585     			IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk(KERN_DEBUG "TX buff switch to head \n");
586     
587     		}
588     		else if (TXTAIL(dev).offset)
589     		{
590     			IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk(KERN_DEBUG "TX buff switch to tail \n");
591     			priv->txLast = 1;
592     		}
593     		else
594     			IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk(KERN_ERR "ReTransmit buff empty");
595     		priv->txOffset = 0;
596     		netif_wake_queue (dev);
597     		return;
598     
599     	}
600     	arlan_command(dev, ARLAN_COMMAND_TX);
601     
602     	priv->nof_tx++;
603     
604     	priv->Conf->driverRetransmissions++;
605     	priv->retransmissions++;
606     
607     	IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk("Retransmit %d bytes \n", TXLAST(dev).length);
608     
609     	ARLAN_DEBUG_EXIT("arlan_retransmit_now");
610     }
611     
612     
613     
614     static void arlan_registration_timer(unsigned long data)
615     {
616     	struct net_device *dev = (struct net_device *) data;
617     	struct arlan_private *priv = (struct arlan_private *) dev->priv;
618     
619     	int lostTime = ((int) (jiffies - priv->registrationLastSeen)) * 1000 / HZ;
620     	int bh_mark_needed = 0;
621     	int next_tick = 1;
622     
623     
624     	priv->timer_chain_active = 1;
625     
626     
627     	if (registrationBad(dev))
628     	{
629     		//debug=100;
630     		priv->registrationLostCount++;
631     		if (lostTime > 7000 && lostTime < 7200)
632     		{
633     			printk(KERN_NOTICE "%s registration Lost \n", dev->name);
634     		}
635     		if (lostTime / priv->reRegisterExp > 2000)
636     			arlan_command(dev, ARLAN_COMMAND_CLEAN_AND_CONF);
637     		if (lostTime / (priv->reRegisterExp) > 3500)
638     			arlan_command(dev, ARLAN_COMMAND_CLEAN_AND_RESET);
639     		if (priv->reRegisterExp < 400)
640     			priv->reRegisterExp += 2;
641     		if (lostTime > 7200)
642     		{
643     			next_tick = HZ;
644     			arlan_command(dev, ARLAN_COMMAND_CLEAN_AND_RESET);
645     		}
646     	}
647     	else
648     	{
649     		if (priv->Conf->registrationMode && lostTime > 10000 &&
650     			priv->registrationLostCount)
651     		{
652     			printk(KERN_NOTICE "%s registration is back after %d milliseconds\n", dev->name,
653     				((int) (jiffies - priv->registrationLastSeen) * 1000) / HZ);
654     		}
655     		priv->registrationLastSeen = jiffies;
656     		priv->registrationLostCount = 0;
657     		priv->reRegisterExp = 1;
658     		if (!netif_running(dev) )
659     			netif_wake_queue(dev);
660     		if (priv->tx_last_sent > priv->tx_last_cleared &&
661     			jiffies - priv->tx_last_sent > 5*HZ ){
662     			arlan_command(dev, ARLAN_COMMAND_CLEAN_AND_RESET);		
663     			priv->tx_last_cleared = jiffies;
664     		};
665     	}
666     
667     
668     	if (!registrationBad(dev) && priv->ReTransmitRequested)
669     	{
670     		IFDEBUG(ARLAN_DEBUG_TX_CHAIN)
671     			printk(KERN_ERR "Retransmit from timer \n");
672     		priv->ReTransmitRequested = 0;
673     		arlan_retransmit_now(dev);
674     	}
675     	if (!registrationBad(dev) &&
676     		priv->tx_done_delayed < jiffies &&
677     		priv->tx_done_delayed != 0)
678     	{
679     		TXLAST(dev).offset = 0;
680     		if (priv->txLast)
681     			priv->txLast = 0;
682     		else if (TXTAIL(dev).offset)
683     			priv->txLast = 1;
684     		if (TXLAST(dev).offset)
685     		{
686     			arlan_retransmit_now(dev);
687     			dev->trans_start = jiffies;
688     		}
689     		if (!(TXHEAD(dev).offset && TXTAIL(dev).offset))
690     		{
691     			priv->txOffset = 0;
692     			netif_wake_queue (dev);
693     		}
694     		priv->tx_done_delayed = 0;
695     		bh_mark_needed = 1;
696     	}
697     	if (bh_mark_needed)
698     	{
699     		priv->txOffset = 0;
700     		netif_wake_queue (dev);
701     	}
702     	arlan_process_interrupt(dev);
703     
704     	if (next_tick < priv->card_polling_interval)
705     		next_tick = priv->card_polling_interval;
706     
707     	priv->timer_chain_active = 0;
708     	priv->timer.expires = jiffies + next_tick;
709     
710     	add_timer(&priv->timer);
711     }
712     
713     
714     #ifdef ARLAN_DEBUGGING
715     
716     static void arlan_print_registers(struct net_device *dev, int line)
717     {
718     	volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card;
719     
720     	u_char hostcpuLock, lancpuLock, controlRegister, cntrlRegImage,
721     		txStatus, rxStatus, interruptInProgress, commandByte;
722     
723     
724     	ARLAN_DEBUG_ENTRY("arlan_print_registers");
725     	READSHM(interruptInProgress, arlan->interruptInProgress, u_char);
726     	READSHM(hostcpuLock, arlan->hostcpuLock, u_char);
727     	READSHM(lancpuLock, arlan->lancpuLock, u_char);
728     	READSHM(controlRegister, arlan->controlRegister, u_char);
729     	READSHM(cntrlRegImage, arlan->cntrlRegImage, u_char);
730     	READSHM(txStatus, arlan->txStatus, u_char);
731     	READSHM(rxStatus, arlan->rxStatus, u_char);
732     	READSHM(commandByte, arlan->commandByte, u_char);
733     
734     	printk(KERN_WARNING "line %04d IP %02x HL %02x LL %02x CB %02x CR %02x CRI %02x TX %02x RX %02x\n",
735     		line, interruptInProgress, hostcpuLock, lancpuLock, commandByte,
736     		controlRegister, cntrlRegImage, txStatus, rxStatus);
737     
738     	ARLAN_DEBUG_EXIT("arlan_print_registers");
739     }
740     #endif
741     
742     
743     static int arlan_hw_tx(struct net_device *dev, char *buf, int length)
744     {
745     	int i;
746     
747     	struct arlan_private *priv = (struct arlan_private *) dev->priv;
748     	volatile struct arlan_shmem *arlan = priv->card;
749     	struct arlan_conf_stru *conf = priv->Conf;
750     
751     	int tailStarts = 0x800;
752     	int headEnds = 0x0;
753     
754     
755     	ARLAN_DEBUG_ENTRY("arlan_hw_tx");
756     	if (TXHEAD(dev).offset)
757     		headEnds = (((TXHEAD(dev).offset + TXHEAD(dev).length - (((int) arlan->txBuffer) - ((int) arlan))) / 64) + 1) * 64;
758     	if (TXTAIL(dev).offset)
759     		tailStarts = 0x800 - (((TXTAIL(dev).offset - (((int) arlan->txBuffer) - ((int) arlan))) / 64) + 2) * 64;
760     
761     
762     	if (!TXHEAD(dev).offset && length < tailStarts)
763     	{
764     		IFDEBUG(ARLAN_DEBUG_TX_CHAIN)
765     			printk(KERN_ERR "TXHEAD insert, tailStart %d\n", tailStarts);
766     
767     		TXHEAD(dev).offset =
768     			(((int) arlan->txBuffer) - ((int) arlan));
769     		TXHEAD(dev).length = length - ARLAN_FAKE_HDR_LEN;
770     		for (i = 0; i < 6; i++)
771     			TXHEAD(dev).dest[i] = buf[i];
772     		TXHEAD(dev).clear = conf->txClear;
773     		TXHEAD(dev).retries = conf->txRetries;	/* 0 is use default */
774     		TXHEAD(dev).routing = conf->txRouting;
775     		TXHEAD(dev).scrambled = conf->txScrambled;
776     		memcpy_toio(((char *) arlan + TXHEAD(dev).offset), buf + ARLAN_FAKE_HDR_LEN, TXHEAD(dev).length);
777     	}
778     	else if (!TXTAIL(dev).offset && length < (0x800 - headEnds))
779     	{
780     		IFDEBUG(ARLAN_DEBUG_TX_CHAIN)
781     			printk(KERN_ERR "TXTAIL insert, headEnd %d\n", headEnds);
782     
783     		TXTAIL(dev).offset =
784     			(((int) arlan->txBuffer) - ((int) arlan)) + 0x800 - (length / 64 + 2) * 64;
785     		TXTAIL(dev).length = length - ARLAN_FAKE_HDR_LEN;
786     		for (i = 0; i < 6; i++)
787     			TXTAIL(dev).dest[i] = buf[i];
788     		TXTAIL(dev).clear = conf->txClear;
789     		TXTAIL(dev).retries = conf->txRetries;
790     		TXTAIL(dev).routing = conf->txRouting;
791     		TXTAIL(dev).scrambled = conf->txScrambled;
792     		memcpy_toio(((char *) arlan + TXTAIL(dev).offset), buf + ARLAN_FAKE_HDR_LEN, TXTAIL(dev).length);
793     	}
794     	else
795     	{
796     		netif_stop_queue (dev);
797     		return -1;
798     		IFDEBUG(ARLAN_DEBUG_TX_CHAIN)
799     			printk(KERN_ERR "TX TAIL & HEAD full, return, tailStart %d headEnd %d\n", tailStarts, headEnds);
800     	}
801     	priv->out_bytes += length;
802     	priv->out_bytes10 += length;
803     	if (conf->measure_rate < 1)
804     		conf->measure_rate = 1;
805     	if (jiffies - priv->out_time > conf->measure_rate * HZ)
806     	{
807     		conf->out_speed = priv->out_bytes / conf->measure_rate;
808     		priv->out_bytes = 0;
809     		priv->out_time = jiffies;
810     	}
811     	if (jiffies - priv->out_time10 > conf->measure_rate * HZ * 10)
812     	{
813     		conf->out_speed10 = priv->out_bytes10 / (10 * conf->measure_rate);
814     		priv->out_bytes10 = 0;
815     		priv->out_time10 = jiffies;
816     	}
817     	if (TXHEAD(dev).offset && TXTAIL(dev).offset)
818     	{
819     		netif_stop_queue (dev);
820     		return 0;
821     	}
822     	else
823     		netif_start_queue (dev);
824     
825     
826     	IFDEBUG(ARLAN_DEBUG_HEADER_DUMP)
827     		printk(KERN_WARNING "%s Transmit t %2x:%2x:%2x:%2x:%2x:%2x f %2x:%2x:%2x:%2x:%2x:%2x \n", dev->name,
828     		   (unsigned char) buf[0], (unsigned char) buf[1], (unsigned char) buf[2], (unsigned char) buf[3],
829     		   (unsigned char) buf[4], (unsigned char) buf[5], (unsigned char) buf[6], (unsigned char) buf[7],
830     		   (unsigned char) buf[8], (unsigned char) buf[9], (unsigned char) buf[10], (unsigned char) buf[11]);
831     
832     	IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk(KERN_ERR "TX command prepare for buffer %d\n", priv->txLast);
833     
834     	arlan_command(dev, ARLAN_COMMAND_TX);
835     
836     	priv->last_command_was_rx = 0;
837     	priv->tx_last_sent = jiffies;
838     	priv->nof_tx++;
839     
840     	IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk("%s TX Qued %d bytes \n", dev->name, length);
841     
842     	ARLAN_DEBUG_EXIT("arlan_hw_tx");
843     
844     	return 0;
845     }
846     
847     
848     static int arlan_hw_config(struct net_device *dev)
849     {
850     	volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card;
851     	struct arlan_conf_stru *conf = ((struct arlan_private *) dev->priv)->Conf;
852     	struct arlan_private *priv = (struct arlan_private *) dev->priv;
853     
854     	ARLAN_DEBUG_ENTRY("arlan_hw_config");
855     
856     	printk(KERN_NOTICE "%s arlan configure called \n", dev->name);
857     	if (arlan_EEPROM_bad)
858     		printk(KERN_NOTICE "arlan configure with eeprom bad option \n");
859     
860     
861     	WRITESHM(arlan->spreadingCode, conf->spreadingCode, u_char);
862     	WRITESHM(arlan->channelSet, conf->channelSet, u_char);
863     
864     	if (arlan_EEPROM_bad)
865     		WRITESHM(arlan->defaultChannelSet, conf->channelSet, u_char);
866     
867     	WRITESHM(arlan->channelNumber, conf->channelNumber, u_char);
868     
869     	WRITESHM(arlan->scramblingDisable, conf->scramblingDisable, u_char);
870     	WRITESHM(arlan->txAttenuation, conf->txAttenuation, u_char);
871     
872     	WRITESHM(arlan->systemId, conf->systemId, u_int);
873     
874     	WRITESHM(arlan->maxRetries, conf->maxRetries, u_char);
875     	WRITESHM(arlan->receiveMode, conf->receiveMode, u_char);
876     	WRITESHM(arlan->priority, conf->priority, u_char);
877     	WRITESHM(arlan->rootOrRepeater, conf->rootOrRepeater, u_char);
878     	WRITESHM(arlan->SID, conf->SID, u_int);
879     
880     	WRITESHM(arlan->registrationMode, conf->registrationMode, u_char);
881     
882     	WRITESHM(arlan->registrationFill, conf->registrationFill, u_char);
883     	WRITESHM(arlan->localTalkAddress, conf->localTalkAddress, u_char);
884     	WRITESHM(arlan->codeFormat, conf->codeFormat, u_char);
885     	WRITESHM(arlan->numChannels, conf->numChannels, u_char);
886     	WRITESHM(arlan->channel1, conf->channel1, u_char);
887     	WRITESHM(arlan->channel2, conf->channel2, u_char);
888     	WRITESHM(arlan->channel3, conf->channel3, u_char);
889     	WRITESHM(arlan->channel4, conf->channel4, u_char);
890     	WRITESHM(arlan->radioNodeId, conf->radioNodeId, u_short);
891     	WRITESHM(arlan->SID, conf->SID, u_int);
892     	WRITESHM(arlan->waitTime, conf->waitTime, u_short);
893     	WRITESHM(arlan->lParameter, conf->lParameter, u_short);
894     	memcpy_toio(&(arlan->_15), &(conf->_15), 3);
895     	WRITESHM(arlan->_15, conf->_15, u_short);
896     	WRITESHM(arlan->headerSize, conf->headerSize, u_short);
897     	if (arlan_EEPROM_bad)
898     		WRITESHM(arlan->hardwareType, conf->hardwareType, u_char);
899     	WRITESHM(arlan->radioType, conf->radioType, u_char);
900     	if (arlan_EEPROM_bad)
901     		WRITESHM(arlan->radioModule, conf->radioType, u_char);
902     
903     	memcpy_toio(arlan->encryptionKey + keyStart, encryptionKey, 8);
904     	memcpy_toio(arlan->name, conf->siteName, 16);
905     
906     	WRITESHMB(arlan->commandByte, ARLAN_COM_INT | ARLAN_COM_CONF);	/* do configure */
907     	memset_io(arlan->commandParameter, 0, 0xf);	/* 0xf */
908     	memset_io(arlan->commandParameter + 1, 0, 2);
909     	if (conf->writeEEPROM)
910     	{
911     		  memset_io(arlan->commandParameter, conf->writeEEPROM, 1);
912     //		conf->writeEEPROM=0;
913     	}
914     	if (conf->registrationMode && conf->registrationInterrupts)
915     		memset_io(arlan->commandParameter + 3, 1, 1);
916     	else
917     		memset_io(arlan->commandParameter + 3, 0, 1);
918     
919     	priv->irq_test_done = 0;
920     
921     	if (conf->tx_queue_len)
922     		dev->tx_queue_len = conf->tx_queue_len;
923     	udelay(100);
924     
925     	ARLAN_DEBUG_EXIT("arlan_hw_config");
926     	return 0;
927     }
928     
929     
930     static int arlan_read_card_configuration(struct net_device *dev)
931     {
932     	u_char tlx415;
933     	volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card;
934     	struct arlan_conf_stru *conf = ((struct arlan_private *) dev->priv)->Conf;
935     
936     	ARLAN_DEBUG_ENTRY("arlan_read_card_configuration");
937     
938     	if (radioNodeId == radioNodeIdUNKNOWN)
939     	{
940     		READSHM(conf->radioNodeId, arlan->radioNodeId, u_short);
941     	}
942     	else
943     		conf->radioNodeId = radioNodeId;
944     		
945     	if (SID == SIDUNKNOWN)
946     	{
947     		READSHM(conf->SID, arlan->SID, u_int);
948     	}
949     	else conf->SID = SID;
950     		
951     	if (spreadingCode == spreadingCodeUNKNOWN)
952     	{
953     		  READSHM(conf->spreadingCode, arlan->spreadingCode, u_char);
954     	}
955     	else
956     		conf->spreadingCode = spreadingCode;
957     		
958     	if (channelSet == channelSetUNKNOWN)
959     	{
960     		READSHM(conf->channelSet, arlan->channelSet, u_char);
961     	}
962     	else conf->channelSet = channelSet;
963     
964     	if (channelNumber == channelNumberUNKNOWN)
965     	{
966     		READSHM(conf->channelNumber, arlan->channelNumber, u_char);
967     	}
968     	else conf->channelNumber = channelNumber;
969     	
970     	READSHM(conf->scramblingDisable, arlan->scramblingDisable, u_char);
971     	READSHM(conf->txAttenuation, arlan->txAttenuation, u_char);
972     	
973     	if (systemId == systemIdUNKNOWN)
974     	{
975     		READSHM(conf->systemId, arlan->systemId, u_int);
976     	} 
977     	else conf->systemId = systemId;
978     	
979     	READSHM(conf->maxDatagramSize, arlan->maxDatagramSize, u_short);
980     	READSHM(conf->maxFrameSize, arlan->maxFrameSize, u_short);
981     	READSHM(conf->maxRetries, arlan->maxRetries, u_char);
982     	READSHM(conf->receiveMode, arlan->receiveMode, u_char);
983     	READSHM(conf->priority, arlan->priority, u_char);
984     	READSHM(conf->rootOrRepeater, arlan->rootOrRepeater, u_char);
985     
986     	if (SID == SIDUNKNOWN)
987     	{
988     		  READSHM(conf->SID, arlan->SID, u_int);
989     	}
990     	else conf->SID = SID;
991     	
992     	if (registrationMode == registrationModeUNKNOWN)
993     	{
994     		  READSHM(conf->registrationMode, arlan->registrationMode, u_char);
995     	}
996     	else conf->registrationMode = registrationMode;
997     	
998     	READSHM(conf->registrationFill, arlan->registrationFill, u_char);
999     	READSHM(conf->localTalkAddress, arlan->localTalkAddress, u_char);
1000     	READSHM(conf->codeFormat, arlan->codeFormat, u_char);
1001     	READSHM(conf->numChannels, arlan->numChannels, u_char);
1002     	READSHM(conf->channel1, arlan->channel1, u_char);
1003     	READSHM(conf->channel2, arlan->channel2, u_char);
1004     	READSHM(conf->channel3, arlan->channel3, u_char);
1005     	READSHM(conf->channel4, arlan->channel4, u_char);
1006     	READSHM(conf->waitTime, arlan->waitTime, u_short);
1007     	READSHM(conf->lParameter, arlan->lParameter, u_short);
1008     	READSHM(conf->_15, arlan->_15, u_short);
1009     	READSHM(conf->headerSize, arlan->headerSize, u_short);
1010     	READSHM(conf->hardwareType, arlan->hardwareType, u_char);
1011     	READSHM(conf->radioType, arlan->radioModule, u_char);
1012     	
1013     	if (conf->radioType == 0)
1014     		conf->radioType = 0xc;
1015     
1016     	WRITESHM(arlan->configStatus, 0xA5, u_char);
1017     	READSHM(tlx415, arlan->configStatus, u_char);
1018     	
1019     	if (tlx415 != 0xA5)
1020     		printk(KERN_INFO "%s tlx415 chip \n", dev->name);
1021     	
1022     	conf->txClear = 0;
1023     	conf->txRetries = 1;
1024     	conf->txRouting = 1;
1025     	conf->txScrambled = 0;
1026     	conf->rxParameter = 1;
1027     	conf->txTimeoutMs = 4000;
1028     	conf->waitCardTimeout = 100000;
1029     	conf->receiveMode = ARLAN_RCV_CLEAN;
1030     	memcpy_fromio(conf->siteName, arlan->name, 16);
1031     	conf->siteName[16] = '\0';
1032     	conf->retries = retries;
1033     	conf->tx_delay_ms = tx_delay_ms;
1034     	conf->async = async;
1035     	conf->ReTransmitPacketMaxSize = 200;
1036     	conf->waitReTransmitPacketMaxSize = 200;
1037     	conf->txAckTimeoutMs = 900;
1038     	conf->fastReTransCount = 3;
1039     
1040     	ARLAN_DEBUG_EXIT("arlan_read_card_configuration");
1041     
1042     	return 0;
1043     }
1044     
1045     
1046     static int lastFoundAt = 0xbe000;
1047     
1048     
1049     /*
1050      * This is the real probe routine. Linux has a history of friendly device
1051      * probes on the ISA bus. A good device probes avoids doing writes, and
1052      * verifies that the correct device exists and functions.
1053      */
1054     
1055     static int __init arlan_check_fingerprint(int memaddr)
1056     {
1057     	static char probeText[] = "TELESYSTEM SLW INC.    ARLAN \0";
1058     	char tempBuf[49];
1059     	volatile struct arlan_shmem *arlan = (struct arlan_shmem *) memaddr;
1060     
1061     	ARLAN_DEBUG_ENTRY("arlan_check_fingerprint");
1062     	if (check_mem_region(virt_to_phys((void *)memaddr),0x2000 )){
1063     		// printk(KERN_WARNING "arlan: memory region %lx excluded from probing \n",virt_to_phys((void*)memaddr));
1064     		return -ENODEV;
1065     	};
1066     	memcpy_fromio(tempBuf, arlan->textRegion, 29);
1067     	tempBuf[30] = 0;
1068     
1069     	/* check for card at this address */
1070     	if (0 != strncmp(tempBuf, probeText, 29)){
1071     // not 		release_mem_region(virt_to_phys((void*)memaddr),0x2000);
1072     		return -ENODEV;
1073     	}
1074     
1075     //   printk(KERN_INFO "arlan found at 0x%x \n",memaddr);
1076     	ARLAN_DEBUG_EXIT("arlan_check_fingerprint");
1077     
1078     	return 0;
1079     
1080     
1081     }
1082     
1083     static int __init arlan_probe_everywhere(struct net_device *dev)
1084     {
1085     	int m;
1086     	int probed = 0;
1087     	int found = 0;
1088     
1089     	SET_MODULE_OWNER(dev);
1090     
1091     	ARLAN_DEBUG_ENTRY("arlan_probe_everywhere");
1092     	if (mem != 0 && numDevices == 1)	/* Check a single specified location. */
1093     	{
1094     		if (arlan_probe_here(dev, (int) phys_to_virt(  mem) ) == 0)
1095     			return 0;
1096     		else
1097     			return -ENODEV;
1098     	}
1099     	for (m = (int)phys_to_virt(lastFoundAt) + 0x2000; m <= (int)phys_to_virt(0xDE000); m += 0x2000)
1100     	{
1101     		if (arlan_probe_here(dev, m) == 0)
1102     		{
1103     			found++;
1104     			lastFoundAt = (int)virt_to_phys((void*)m);
1105     			break;
1106     		}
1107     		probed++;
1108     	}
1109     	if (found == 0 && probed != 0)
1110     	{
1111     		if (lastFoundAt == 0xbe000)
1112     			printk(KERN_ERR "arlan: No Arlan devices found \n");
1113     		return -ENODEV;
1114     	}
1115     	else
1116     		return 0;
1117     
1118     	ARLAN_DEBUG_EXIT("arlan_probe_everywhere");
1119     
1120     	return -ENODEV;
1121     }
1122     
1123     static int __init arlan_find_devices(void)
1124     {
1125     	int m;
1126     	int found = 0;
1127     
1128     	ARLAN_DEBUG_ENTRY("arlan_find_devices");
1129     	if (mem != 0 && numDevices == 1)	/* Check a single specified location. */
1130     		return 1;
1131     	for (m =(int) phys_to_virt(0xc0000); m <=(int) phys_to_virt(0xDE000); m += 0x2000)
1132     	{
1133     		if (arlan_check_fingerprint(m) == 0)
1134     			found++;
1135     	}
1136     	ARLAN_DEBUG_EXIT("arlan_find_devices");
1137     
1138     	return found;
1139     }
1140     
1141     
1142     static int arlan_change_mtu(struct net_device *dev, int new_mtu)
1143     {
1144     	struct arlan_conf_stru *conf = ((struct arlan_private *) dev->priv)->Conf;
1145     
1146     	ARLAN_DEBUG_ENTRY("arlan_change_mtu");
1147     	if (new_mtu > 2032)
1148     		return -EINVAL;
1149     	dev->mtu = new_mtu;
1150     	if (new_mtu < 256)
1151     		new_mtu = 256;	/* cards book suggests 1600 */
1152     	conf->maxDatagramSize = new_mtu;
1153     	conf->maxFrameSize = new_mtu + 48;
1154     
1155     	arlan_command(dev, ARLAN_COMMAND_CLEAN_AND_CONF);
1156     	printk(KERN_NOTICE "%s mtu changed to %d \n", dev->name, new_mtu);
1157     
1158     	ARLAN_DEBUG_EXIT("arlan_change_mtu");
1159     
1160     	return 0;
1161     }
1162     
1163     static int arlan_mac_addr(struct net_device *dev, void *p)
1164     {
1165     	struct sockaddr *addr = p;
1166     
1167     
1168     	ARLAN_DEBUG_ENTRY("arlan_mac_addr");
1169     	return -EINVAL;
1170     
1171     	if (!netif_running(dev))
1172     		return -EBUSY;
1173     	memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
1174     
1175     	ARLAN_DEBUG_EXIT("arlan_mac_addr");
1176     	return 0;
1177     }
1178     
1179     
1180     
1181     
1182     static int __init
1183     	      arlan_allocate_device(int num, struct net_device *devs)
1184     {
1185     
1186     	struct net_device *dev;
1187     
1188     	ARLAN_DEBUG_ENTRY("arlan_allocate_device");
1189     
1190     	if (!devs)
1191     		dev = init_etherdev(0, sizeof(struct arlan_private));
1192     	else
1193     	{
1194     		dev = devs;
1195     		dev->priv = kmalloc(sizeof(struct arlan_private), GFP_KERNEL);
1196     	};
1197     
1198     	if (dev == NULL || dev->priv == NULL)
1199     	{
1200     		printk(KERN_CRIT "init_etherdev failed ");
1201     		return 0;
1202     	}
1203     
1204     	memset(dev->priv,0,sizeof(struct arlan_private));
1205     
1206     	((struct arlan_private *) dev->priv)->conf =
1207     	    kmalloc(sizeof(struct arlan_shmem), GFP_KERNEL);
1208     
1209     	if (dev == NULL || dev->priv == NULL ||
1210     	    ((struct arlan_private *) dev->priv)->conf == NULL)
1211     	{
1212     		return 0;
1213     		printk(KERN_CRIT " No memory at arlan_allocate_device \n");
1214     	}
1215     	/* Fill in the 'dev' fields. */
1216     	dev->base_addr = 0;
1217     	dev->mem_start = 0;
1218     	dev->mem_end = 0;
1219     	dev->mtu = 1500;
1220     	dev->flags = 0;		/* IFF_BROADCAST & IFF_MULTICAST & IFF_PROMISC; */
1221     	dev->irq = 0;
1222     	dev->dma = 0;
1223     	dev->tx_queue_len = tx_queue_len;
1224     	ether_setup(dev);
1225     	dev->tx_queue_len = tx_queue_len;
1226     	dev->open = arlan_open;
1227     	dev->stop = arlan_close;
1228     	dev->hard_start_xmit = arlan_tx;
1229     	dev->get_stats = arlan_statistics;
1230     	dev->set_multicast_list = arlan_set_multicast;
1231     	dev->change_mtu = arlan_change_mtu;
1232     	dev->set_mac_address = arlan_mac_addr;
1233     	dev->tx_timeout = arlan_tx_timeout;
1234     	dev->watchdog_timeo = 3*HZ;
1235     	
1236     	((struct arlan_private *) dev->priv)->irq_test_done = 0;
1237     	arlan_device[num] = dev;
1238     	((struct arlan_private *) arlan_device[num]->priv)->Conf = &(arlan_conf[num]);
1239     
1240     	((struct arlan_private *) dev->priv)->Conf->pre_Command_Wait = 40;
1241     	((struct arlan_private *) dev->priv)->Conf->rx_tweak1 = 30;
1242     	((struct arlan_private *) dev->priv)->Conf->rx_tweak2 = 0;
1243     
1244     	ARLAN_DEBUG_EXIT("arlan_allocate_device");
1245     	return (int) dev;
1246     }
1247     
1248     
1249     static int __init arlan_probe_here(struct net_device *dev, int memaddr)
1250     {
1251     	volatile struct arlan_shmem *arlan;
1252     
1253     	ARLAN_DEBUG_ENTRY("arlan_probe_here");
1254     
1255     	if (arlan_check_fingerprint(memaddr))
1256     		return -ENODEV;
1257     
1258     	printk(KERN_NOTICE "%s: Arlan found at %x, \n ", dev->name, (int) virt_to_phys((void*)memaddr));
1259     
1260     	if (!arlan_allocate_device(arlans_found, dev))
1261     		return -1;
1262     
1263     	((struct arlan_private *) dev->priv)->card = (struct arlan_shmem *) memaddr;
1264     	arlan = (void *) memaddr;
1265     
1266     	dev->mem_start = memaddr;
1267     	dev->mem_end = memaddr + 0x1FFF;
1268     
1269     	if (dev->irq < 2)
1270     	{
1271     		READSHM(dev->irq, arlan->irqLevel, u_char);
1272     	} else if (dev->irq == 2)
1273     		dev->irq = 9;
1274     
1275     	arlan_read_card_configuration(dev);
1276     
1277     	ARLAN_DEBUG_EXIT("arlan_probe_here");
1278     	return 0;
1279     }
1280     
1281     
1282     
1283     
1284     static int arlan_open(struct net_device *dev)
1285     {
1286     	struct arlan_private *priv = (struct arlan_private *) dev->priv;
1287     	volatile struct arlan_shmem *arlan = priv->card;
1288     	int ret = 0;
1289     
1290     	ARLAN_DEBUG_ENTRY("arlan_open");
1291     
1292     	if (dev->mem_start == 0)
1293     		ret = arlan_probe_everywhere(dev);
1294     	if (ret != 0)
1295     		return ret;
1296     
1297     	arlan = ((struct arlan_private *) dev->priv)->card;
1298     	ret = request_irq(dev->irq, &arlan_interrupt, 0, dev->name, dev);
1299     	if (ret)
1300     	{
1301     		printk(KERN_ERR "%s: unable to get IRQ %d .\n",
1302     			dev->name, dev->irq);
1303     		return ret;
1304     	}
1305     
1306     
1307     	priv->bad = 0;
1308     	priv->lastReset = 0;
1309     	priv->reset = 0;
1310     	priv->open_time = jiffies;
1311     	memcpy_fromio(dev->dev_addr, arlan->lanCardNodeId, 6);
1312     	memset(dev->broadcast, 0xff, 6);
1313     	priv->txOffset = 0;
1314     	dev->tx_queue_len = tx_queue_len;
1315     	priv->interrupt_processing_active = 0;
1316     	priv->command_lock = 0;
1317     
1318     	netif_start_queue (dev);
1319     
1320     	init_MUTEX(&priv->card_lock);
1321     	myATOMIC_INIT(priv->card_users, 1);	/* damn 2.0.33 */
1322     	priv->registrationLostCount = 0;
1323     	priv->registrationLastSeen = jiffies;
1324     	priv->txLast = 0;
1325     	priv->tx_command_given = 0;
1326     	priv->rx_command_given = 0;
1327     	
1328     	priv->reRegisterExp = 1;
1329     	priv->nof_tx = 0;
1330     	priv->nof_tx_ack = 0;
1331     	priv->last_command_was_rx = 0;
1332     	priv->tx_last_sent = jiffies - 1;
1333     	priv->tx_last_cleared = jiffies;
1334     	priv->Conf->writeEEPROM = 0;
1335     	priv->Conf->registrationInterrupts = 1;
1336     
1337     	init_timer(&priv->timer);
1338     	priv->timer.expires = jiffies + HZ / 10;
1339     	priv->timer.data = (unsigned long) dev;
1340     	priv->timer.function = &arlan_registration_timer;	/* timer handler */
1341     
1342     	arlan_command(dev, ARLAN_COMMAND_POWERUP | ARLAN_COMMAND_LONG_WAIT_NOW);
1343     	mdelay(200);
1344     	add_timer(&priv->timer);
1345     
1346     #ifdef CONFIG_PROC_FS
1347     #ifndef MODULE
1348     	if (arlan_device[0])
1349     		init_arlan_proc();
1350     #endif
1351     #endif
1352     	ARLAN_DEBUG_EXIT("arlan_open");
1353     	return 0;
1354     }
1355     
1356     
1357     static void arlan_tx_timeout (struct net_device *dev)
1358     {
1359     	printk(KERN_ERR "%s: arlan transmit timed out, kernel decided\n", dev->name);
1360     	/* Try to restart the adaptor. */
1361     	arlan_command(dev, ARLAN_COMMAND_CLEAN_AND_RESET);
1362     	// dev->trans_start = jiffies;
1363     	// netif_start_queue (dev);
1364     }
1365     
1366     
1367     static int arlan_tx(struct sk_buff *skb, struct net_device *dev)
1368     {
1369     	struct arlan_private *priv = ((struct arlan_private *) dev->priv);
1370     	short length;
1371     	unsigned char *buf;
1372     
1373     	ARLAN_DEBUG_ENTRY("arlan_tx");
1374     	
1375     	length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
1376     	buf = skb->data;
1377     
1378     	if (priv->txOffset + length + 0x12 > 0x800) {
1379     		printk(KERN_ERR "TX RING overflow \n");
1380     		netif_stop_queue (dev);
1381     	}
1382     
1383     	if (arlan_hw_tx(dev, buf, length) == -1)
1384     		goto bad_end;
1385     
1386     	dev->trans_start = jiffies;
1387     
1388     	dev_kfree_skb(skb);
1389     
1390     	arlan_process_interrupt(dev);
1391     	priv->tx_chain_active = 0;
1392     	ARLAN_DEBUG_EXIT("arlan_tx");
1393     	return 0;
1394     
1395     bad_end:
1396     	arlan_process_interrupt(dev);
1397     	priv->tx_chain_active = 0;
1398     	netif_stop_queue (dev);
1399     	ARLAN_DEBUG_EXIT("arlan_tx");
1400     	return 1;
1401     }
1402     
1403     
1404     extern inline int DoNotReTransmitCrap(struct net_device *dev)
1405     {
1406     	struct arlan_private *priv = ((struct arlan_private *) dev->priv);
1407     
1408     	if (TXLAST(dev).length < priv->Conf->ReTransmitPacketMaxSize)
1409     		return 1;
1410     	return 0;
1411     
1412     }
1413     
1414     extern inline int DoNotWaitReTransmitCrap(struct net_device *dev)
1415     {
1416     	struct arlan_private *priv = ((struct arlan_private *) dev->priv);
1417     
1418     	if (TXLAST(dev).length < priv->Conf->waitReTransmitPacketMaxSize)
1419     		return 1;
1420     	return 0;
1421     }
1422     
1423     extern inline void arlan_queue_retransmit(struct net_device *dev)
1424     {
1425     	struct arlan_private *priv = ((struct arlan_private *) dev->priv);
1426     
1427     	ARLAN_DEBUG_ENTRY("arlan_queue_retransmit");
1428     
1429     	if (DoNotWaitReTransmitCrap(dev))
1430     	{
1431     		  arlan_drop_tx(dev);
1432     	} else
1433     		priv->ReTransmitRequested++;
1434     
1435     	ARLAN_DEBUG_EXIT("arlan_queue_retransmit");
1436     };
1437     
1438     static inline void RetryOrFail(struct net_device *dev)
1439     {
1440     	struct arlan_private *priv = ((struct arlan_private *) dev->priv);
1441     
1442     	ARLAN_DEBUG_ENTRY("RetryOrFail");
1443     
1444     	if (priv->retransmissions > priv->Conf->retries ||
1445     	    DoNotReTransmitCrap(dev))
1446     	{
1447     		arlan_drop_tx(dev);
1448     	}
1449     	else if (priv->bad <= priv->Conf->fastReTransCount)
1450     	{
1451     		arlan_retransmit_now(dev);
1452     	}
1453     	else arlan_queue_retransmit(dev);
1454     
1455     	ARLAN_DEBUG_EXIT("RetryOrFail");
1456     }
1457     
1458     
1459     static void arlan_tx_done_interrupt(struct net_device *dev, int status)
1460     {
1461     	struct arlan_private *priv = ((struct arlan_private *) dev->priv);
1462     
1463     	ARLAN_DEBUG_ENTRY("arlan_tx_done_interrupt");
1464     
1465     	priv->tx_last_cleared = jiffies;
1466     	priv->tx_command_given = 0;
1467     	priv->nof_tx_ack++;
1468     	switch (status)
1469     	{
1470     		case 1:
1471     		{
1472     			IFDEBUG(ARLAN_DEBUG_TX_CHAIN)
1473     				printk("arlan intr: transmit OK\n");
1474     			priv->stats.tx_packets++;
1475     			priv->bad = 0;
1476     			priv->reset = 0;
1477     			priv->retransmissions = 0;
1478     			if (priv->Conf->tx_delay_ms)
1479     			{
1480     				priv->tx_done_delayed = jiffies + (priv->Conf->tx_delay_ms * HZ) / 1000 + 1;;
1481     			}
1482     			else
1483     			{
1484     				TXLAST(dev).offset = 0;
1485     				if (priv->txLast)
1486     					priv->txLast = 0;
1487     				else if (TXTAIL(dev).offset)
1488     					priv->txLast = 1;
1489     				if (TXLAST(dev).offset)
1490     				{
1491     					arlan_retransmit_now(dev);
1492     					dev->trans_start = jiffies;
1493     				}
1494     				if (!TXHEAD(dev).offset || !TXTAIL(dev).offset)
1495     				{
1496     					priv->txOffset = 0;
1497     					netif_wake_queue (dev);
1498     				}
1499     			}
1500     		}
1501     		break;
1502     		
1503     		case 2:
1504     		{
1505     			IFDEBUG(ARLAN_DEBUG_TX_CHAIN)
1506     				printk("arlan intr: transmit timed out\n");
1507     			priv->bad += 1;
1508     			//arlan_queue_retransmit(dev);
1509     			RetryOrFail(dev);
1510     		}
1511     		break;
1512     
1513     		case 3:
1514     		{
1515     			IFDEBUG(ARLAN_DEBUG_TX_CHAIN)
1516     				printk("arlan intr: transmit max retries\n");
1517     			priv->bad += 1;
1518     			priv->reset = 0;
1519     			//arlan_queue_retransmit(dev);
1520     			RetryOrFail(dev);
1521     		}
1522     		break;
1523     		
1524     		case 4:
1525     		{
1526     			IFDEBUG(ARLAN_DEBUG_TX_CHAIN)
1527     				printk("arlan intr: transmit aborted\n");
1528     			priv->bad += 1;
1529     			arlan_queue_retransmit(dev);
1530     			//RetryOrFail(dev);
1531     		}
1532     		break;
1533     
1534     		case 5:
1535     		{
1536     			IFDEBUG(ARLAN_DEBUG_TX_CHAIN)
1537     				printk("arlan intr: transmit not registered\n");
1538     			priv->bad += 1;
1539     			//debug=101;
1540     			arlan_queue_retransmit(dev);
1541     		}
1542     		break;
1543     
1544     		case 6:
1545     		{
1546     			IFDEBUG(ARLAN_DEBUG_TX_CHAIN) 
1547     				printk("arlan intr: transmit destination full\n");
1548     			priv->bad += 1;
1549     			priv->reset = 0;
1550     			//arlan_drop_tx(dev);
1551     			arlan_queue_retransmit(dev);
1552     		}
1553     		break;
1554     
1555     		case 7:
1556     		{
1557     			IFDEBUG(ARLAN_DEBUG_TX_CHAIN)
1558     				printk("arlan intr: transmit unknown ack\n");
1559     			priv->bad += 1;
1560     			priv->reset = 0;
1561     			arlan_queue_retransmit(dev);
1562     		}
1563     		break;
1564     		
1565     		case 8:
1566     		{
1567     			IFDEBUG(ARLAN_DEBUG_TX_CHAIN)
1568     				printk("arlan intr: transmit dest mail box full\n");
1569     			priv->bad += 1;
1570     			priv->reset = 0;
1571     			//arlan_drop_tx(dev);
1572     			arlan_queue_retransmit(dev);
1573     		}
1574     		break;
1575     
1576     		case 9:
1577     		{
1578     			IFDEBUG(ARLAN_DEBUG_TX_CHAIN)
1579     				printk("arlan intr: transmit root dest not reg.\n");
1580     			priv->bad += 1;
1581     			priv->reset = 1;
1582     			//arlan_drop_tx(dev);
1583     			arlan_queue_retransmit(dev);
1584     		}
1585     		break;
1586     
1587     		default:
1588     		{
1589     			printk(KERN_ERR "arlan intr: transmit status unknown\n");
1590     			priv->bad += 1;
1591     			priv->reset = 1;
1592     			arlan_drop_tx(dev);
1593     		}
1594     	}
1595     
1596     	ARLAN_DEBUG_EXIT("arlan_tx_done_interrupt");
1597     }
1598     
1599     
1600     static void arlan_rx_interrupt(struct net_device *dev, u_char rxStatus, u_short rxOffset, u_short pkt_len)
1601     {
1602     	char *skbtmp;
1603     	int i = 0;
1604     
1605     	struct arlan_private *priv = (struct arlan_private *) dev->priv;
1606     	volatile struct arlan_shmem *arlan = priv->card;
1607     	struct arlan_conf_stru *conf = priv->Conf;
1608     
1609     
1610     	ARLAN_DEBUG_ENTRY("arlan_rx_interrupt");
1611     	// by spec,   not                WRITESHMB(arlan->rxStatus,0x00);
1612     	// prohibited here              arlan_command(dev, ARLAN_COMMAND_RX);
1613     
1614     	if (pkt_len < 10 || pkt_len > 2048)
1615     	{
1616     		printk(KERN_WARNING "%s: got too short or long packet, len %d \n", dev->name, pkt_len);
1617     		return;
1618     	}
1619     	if (rxOffset + pkt_len > 0x2000)
1620     	{
1621     		printk("%s: got too long packet, len %d offset %x\n", dev->name, pkt_len, rxOffset);
1622     		return;
1623     	}
1624     	priv->in_bytes += pkt_len;
1625     	priv->in_bytes10 += pkt_len;
1626     	if (conf->measure_rate < 1)
1627     		conf->measure_rate = 1;
1628     	if (jiffies - priv->in_time > conf->measure_rate * HZ)
1629     	{
1630     		conf->in_speed = priv->in_bytes / conf->measure_rate;
1631     		priv->in_bytes = 0;
1632     		priv->in_time = jiffies;
1633     	}
1634     	if (jiffies - priv->in_time10 > conf->measure_rate * HZ * 10)
1635     	{
1636     		conf->in_speed10 = priv->in_bytes10 / (10 * conf->measure_rate);
1637     		priv->in_bytes10 = 0;
1638     		priv->in_time10 = jiffies;
1639     	}
1640     	DEBUGSHM(1, "arlan rcv pkt rxStatus= %d ", arlan->rxStatus, u_char);
1641     	switch (rxStatus)
1642     	{
1643     		case 1:
1644     		case 2:
1645     		case 3:
1646     		{
1647     			/* Malloc up new buffer. */
1648     			struct sk_buff *skb;
1649     
1650     			DEBUGSHM(50, "arlan recv pkt offs=%d\n", arlan->rxOffset, u_short);
1651     			DEBUGSHM(1, "arlan rxFrmType = %d \n", arlan->rxFrmType, u_char);
1652     			DEBUGSHM(1, KERN_INFO "arlan rx scrambled = %d \n", arlan->scrambled, u_char);
1653     
1654     			/* here we do multicast filtering to avoid slow 8-bit memcopy */
1655     #ifdef ARLAN_MULTICAST
1656     			if (!(dev->flags & IFF_ALLMULTI) &&
1657     				!(dev->flags & IFF_PROMISC) &&
1658     				dev->mc_list)
1659     			{
1660     				char hw_dst_addr[6];
1661     				struct dev_mc_list *dmi = dev->mc_list;
1662     				int i;
1663     
1664     				memcpy_fromio(hw_dst_addr, arlan->ultimateDestAddress, 6);
1665     				if (hw_dst_addr[0] == 0x01)
1666     				{
1667     					if (mdebug)
1668     						if (hw_dst_addr[1] == 0x00)
1669     							printk(KERN_ERR "%s mcast 0x0100 \n", dev->name);
1670     						else if (hw_dst_addr[1] == 0x40)
1671     							printk(KERN_ERR "%s m/bcast 0x0140 \n", dev->name);
1672     					while (dmi)
1673     					{							if (dmi->dmi_addrlen == 6)
1674     						{
1675     							if (arlan_debug & ARLAN_DEBUG_HEADER_DUMP)
1676     								printk(KERN_ERR "%s mcl %2x:%2x:%2x:%2x:%2x:%2x \n", dev->name,
1677     										 dmi->dmi_addr[0], dmi->dmi_addr[1], dmi->dmi_addr[2],
1678     										 dmi->dmi_addr[3], dmi->dmi_addr[4], dmi->dmi_addr[5]);
1679     							for (i = 0; i < 6; i++)
1680     								if (dmi->dmi_addr[i] != hw_dst_addr[i])
1681     									break;
1682     							if (i == 6)
1683     								break;
1684     						}
1685     						else
1686     							printk(KERN_ERR "%s: invalid multicast address length given.\n", dev->name);
1687     						dmi = dmi->next;
1688     					}
1689     					/* we reach here if multicast filtering is on and packet 
1690     					 * is multicast and not for receive */
1691     					goto end_of_interrupt;
1692     				}
1693     			}
1694     #endif				// ARLAN_MULTICAST
1695     			/* multicast filtering ends here */
1696     			pkt_len += ARLAN_FAKE_HDR_LEN;
1697     
1698     			skb = dev_alloc_skb(pkt_len + 4);
1699     			if (skb == NULL)
1700     			{
1701     				printk(KERN_ERR "%s: Memory squeeze, dropping packet.\n", dev->name);
1702     				priv->stats.rx_dropped++;
1703     				break;
1704     			}
1705     			skb_reserve(skb, 2);
1706     			skb->dev = dev;
1707     			skbtmp = skb_put(skb, pkt_len);
1708     
1709     			memcpy_fromio(skbtmp + ARLAN_FAKE_HDR_LEN, ((char *) arlan) + rxOffset, pkt_len - ARLAN_FAKE_HDR_LEN);
1710     			memcpy_fromio(skbtmp, arlan->ultimateDestAddress, 6);
1711     			memcpy_fromio(skbtmp + 6, arlan->rxSrc, 6);
1712     			WRITESHMB(arlan->rxStatus, 0x00);
1713     			arlan_command(dev, ARLAN_COMMAND_RX);
1714     
1715     			IFDEBUG(ARLAN_DEBUG_HEADER_DUMP)
1716     			{
1717     				char immedDestAddress[6];
1718     				char immedSrcAddress[6];
1719     				memcpy_fromio(immedDestAddress, arlan->immedDestAddress, 6);
1720     				memcpy_fromio(immedSrcAddress, arlan->immedSrcAddress, 6);
1721     
1722     				printk(KERN_WARNING "%s t %2x:%2x:%2x:%2x:%2x:%2x f %2x:%2x:%2x:%2x:%2x:%2x imd %2x:%2x:%2x:%2x:%2x:%2x ims %2x:%2x:%2x:%2x:%2x:%2x\n", dev->name,
1723     					(unsigned char) skbtmp[0], (unsigned char) skbtmp[1], (unsigned char) skbtmp[2], (unsigned char) skbtmp[3],
1724     					(unsigned char) skbtmp[4], (unsigned char) skbtmp[5], (unsigned char) skbtmp[6], (unsigned char) skbtmp[7],
1725     					(unsigned char) skbtmp[8], (unsigned char) skbtmp[9], (unsigned char) skbtmp[10], (unsigned char) skbtmp[11],
1726     					immedDestAddress[0], immedDestAddress[1], immedDestAddress[2],
1727     					immedDestAddress[3], immedDestAddress[4], immedDestAddress[5],
1728     					immedSrcAddress[0], immedSrcAddress[1], immedSrcAddress[2],
1729     					immedSrcAddress[3], immedSrcAddress[4], immedSrcAddress[5]);
1730     			}
1731     			skb->protocol = eth_type_trans(skb, dev);
1732     			IFDEBUG(ARLAN_DEBUG_HEADER_DUMP)
1733     				if (skb->protocol != 0x608 && skb->protocol != 0x8)
1734     				{
1735     					for (i = 0; i <= 22; i++)
1736     						printk("%02x:", (u_char) skbtmp[i + 12]);
1737     					printk(KERN_ERR "\n");
1738     					printk(KERN_WARNING "arlan kernel pkt type trans %x \n", skb->protocol);
1739     				}
1740     			netif_rx(skb);
1741     			dev->last_rx = jiffies;
1742     			priv->stats.rx_packets++;
1743     			priv->stats.rx_bytes += pkt_len;
1744     		}
1745     		break;
1746     		
1747     		default:
1748     			printk(KERN_ERR "arlan intr: received unknown status\n");
1749     			priv->stats.rx_crc_errors++;
1750     			break;
1751     	}
1752     	ARLAN_DEBUG_EXIT("arlan_rx_interrupt");
1753     }
1754     
1755     static void arlan_process_interrupt(struct net_device *dev)
1756     {
1757     	struct arlan_private *priv = (struct arlan_private *) dev->priv;
1758     	volatile struct arlan_shmem *arlan = priv->card;
1759     	u_char rxStatus = READSHMB(arlan->rxStatus);
1760     	u_char txStatus = READSHMB(arlan->txStatus);
1761     	u_short rxOffset = READSHMS(arlan->rxOffset);
1762     	u_short pkt_len = READSHMS(arlan->rxLength);
1763     	int interrupt_count = 0;
1764     
1765     	ARLAN_DEBUG_ENTRY("arlan_process_interrupt");
1766     
1767     	if (test_and_set_bit(0, (void *) &priv->interrupt_processing_active))
1768     	{
1769     		if (arlan_debug & ARLAN_DEBUG_CHAIN_LOCKS)
1770     			printk(KERN_ERR "interrupt chain reentering \n");
1771     		goto end_int_process;
1772     	}
1773     	while ((rxStatus || txStatus || priv->interrupt_ack_requested)
1774     			&& (interrupt_count < 5))
1775     	{
1776     		if (rxStatus)
1777     			priv->last_rx_int_ack_time = arlan_time();
1778     
1779     		arlan_command(dev, ARLAN_COMMAND_INT_ACK);
1780     		arlan_command(dev, ARLAN_COMMAND_INT_ENABLE);
1781     		
1782     		IFDEBUG(ARLAN_DEBUG_INTERRUPT)
1783     			printk(KERN_ERR "%s:  got IRQ rx %x tx %x comm %x rxOff %x rxLen %x \n",
1784     					dev->name, rxStatus, txStatus, READSHMB(arlan->commandByte),
1785     					rxOffset, pkt_len);
1786     
1787     		if (rxStatus == 0 && txStatus == 0)
1788     		{
1789     			priv->last_command_was_rx = 0;
1790     			if (priv->irq_test_done)
1791     			{
1792     				if (!registrationBad(dev))
1793     					IFDEBUG(ARLAN_DEBUG_INTERRUPT) printk(KERN_ERR "%s unknown interrupt(nop? regLost ?) reason tx %d rx %d ",
1794     										    dev->name, txStatus, rxStatus);
1795     			} else {
1796     				IFDEBUG(ARLAN_DEBUG_INTERRUPT)
1797     					printk(KERN_INFO "%s irq $%d test OK \n", dev->name, dev->irq);
1798     
1799     			}
1800     			priv->interrupt_ack_requested = 0;
1801     			goto ends;
1802     		}
1803     		if (txStatus != 0)
1804     		{
1805     			WRITESHMB(arlan->txStatus, 0x00);
1806     			arlan_tx_done_interrupt(dev, txStatus);
1807     			goto ends;
1808     		}
1809     		if (rxStatus == 1 || rxStatus == 2)
1810     		{		/* a packet waiting */
1811     			arlan_rx_interrupt(dev, rxStatus, rxOffset, pkt_len);
1812     			goto ends;
1813     		}
1814     		if (rxStatus > 2 && rxStatus < 0xff)
1815     		{
1816     			priv->last_command_was_rx = 0;
1817     			WRITESHMB(arlan->rxStatus, 0x00);
1818     			printk(KERN_ERR "%s unknown rxStatus reason tx %d rx %d ",
1819     				dev->name, txStatus, rxStatus);
1820     			goto ends;
1821     		}
1822     		if (rxStatus == 0xff)
1823     		{
1824     			priv->last_command_was_rx = 0;
1825     			WRITESHMB(arlan->rxStatus, 0x00);
1826     			arlan_command(dev, ARLAN_COMMAND_RX);
1827     			if (registrationBad(dev))
1828     				netif_device_detach(dev);
1829     			if (!registrationBad(dev))
1830     			{
1831     				priv->registrationLastSeen = jiffies;
1832     				if (!netif_queue_stopped(dev) && !priv->under_reset && !priv->under_config)
1833     					netif_wake_queue (dev);
1834     			}
1835     			goto ends;
1836     		}
1837     ends:
1838     
1839     		arlan_command_process(dev);
1840     
1841     		rxStatus = READSHMB(arlan->rxStatus);
1842     		txStatus = READSHMB(arlan->txStatus);
1843     		rxOffset = READSHMS(arlan->rxOffset);
1844     		pkt_len = READSHMS(arlan->rxLength);
1845     
1846     
1847     		priv->irq_test_done = 1;
1848     
1849     		interrupt_count++;
1850     	}
1851     	priv->interrupt_processing_active = 0;
1852     
1853     end_int_process:
1854     	arlan_command_process(dev);
1855     
1856     	ARLAN_DEBUG_EXIT("arlan_process_interrupt");
1857     	return;
1858     }
1859     
1860     static void arlan_interrupt(int irq, void *dev_id, struct pt_regs *regs)
1861     {
1862     	struct net_device *dev = dev_id;
1863     	struct arlan_private *priv = (struct arlan_private *) dev->priv;
1864     	volatile struct arlan_shmem *arlan = priv->card;
1865     	u_char rxStatus = READSHMB(arlan->rxStatus);
1866     	u_char txStatus = READSHMB(arlan->txStatus);
1867     
1868     	ARLAN_DEBUG_ENTRY("arlan_interrupt");
1869     
1870     
1871     	if (!rxStatus && !txStatus)
1872     		priv->interrupt_ack_requested++;
1873     
1874     	arlan_process_interrupt(dev);
1875     	
1876     	priv->irq_test_done = 1;
1877     
1878     	ARLAN_DEBUG_EXIT("arlan_interrupt");
1879     	return;
1880     
1881     }
1882     
1883     
1884     static int arlan_close(struct net_device *dev)
1885     {
1886     	struct arlan_private *priv = (struct arlan_private *) dev->priv;
1887     
1888     	if (!dev)
1889     	{
1890     		printk(KERN_CRIT "arlan: No Device\n");
1891     		return 0;
1892     	}
1893     	priv = (struct arlan_private *) dev->priv;
1894     	if (!priv)
1895     	{
1896     		printk(KERN_CRIT "arlan: No Device priv \n");
1897     		return 0;
1898     	}
1899     	ARLAN_DEBUG_ENTRY("arlan_close");
1900     
1901     	del_timer(&priv->timer);
1902     
1903     	arlan_command(dev, ARLAN_COMMAND_POWERDOWN);
1904     
1905     	IFDEBUG(ARLAN_DEBUG_STARTUP)
1906     		printk(KERN_NOTICE "%s: Closing device\n", dev->name);
1907     
1908     	priv->open_time = 0;
1909     	netif_stop_queue(dev);
1910     	free_irq(dev->irq, dev);
1911     
1912     	ARLAN_DEBUG_EXIT("arlan_close");
1913     	return 0;
1914     }
1915     
1916     #ifdef ARLAN_DEBUGGING
1917     static long alignLong(volatile u_char * ptr)
1918     {
1919     	long ret;
1920     	memcpy_fromio(&ret, (void *) ptr, 4);
1921     	return ret;
1922     }
1923     #endif
1924     
1925     /*
1926      * Get the current statistics.
1927      * This may be called with the card open or closed.
1928      */
1929     
1930     static struct net_device_stats *arlan_statistics(struct net_device *dev)
1931     {
1932     	struct arlan_private *priv = (struct arlan_private *) dev->priv;
1933     	volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card;
1934     
1935     
1936     	ARLAN_DEBUG_ENTRY("arlan_statistics");
1937     
1938     	/* Update the statistics from the device registers. */
1939     
1940     	READSHM(priv->stats.collisions, arlan->numReTransmissions, u_int);
1941     	READSHM(priv->stats.rx_crc_errors, arlan->numCRCErrors, u_int);
1942     	READSHM(priv->stats.rx_dropped, arlan->numFramesDiscarded, u_int);
1943     	READSHM(priv->stats.rx_fifo_errors, arlan->numRXBufferOverflows, u_int);
1944     	READSHM(priv->stats.rx_frame_errors, arlan->numReceiveFramesLost, u_int);
1945     	READSHM(priv->stats.rx_over_errors, arlan->numRXOverruns, u_int);
1946     	READSHM(priv->stats.rx_packets, arlan->numDatagramsReceived, u_int);
1947     	READSHM(priv->stats.tx_aborted_errors, arlan->numAbortErrors, u_int);
1948     	READSHM(priv->stats.tx_carrier_errors, arlan->numStatusTimeouts, u_int);
1949     	READSHM(priv->stats.tx_dropped, arlan->numDatagramsDiscarded, u_int);
1950     	READSHM(priv->stats.tx_fifo_errors, arlan->numTXUnderruns, u_int);
1951     	READSHM(priv->stats.tx_packets, arlan->numDatagramsTransmitted, u_int);
1952     	READSHM(priv->stats.tx_window_errors, arlan->numHoldOffs, u_int);
1953     
1954     	ARLAN_DEBUG_EXIT("arlan_statistics");
1955     
1956     	return &priv->stats;
1957     }
1958     
1959     
1960     static void arlan_set_multicast(struct net_device *dev)
1961     {
1962     	volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card;
1963     	struct arlan_conf_stru *conf = ((struct arlan_private *) dev->priv)->Conf;
1964     	int board_conf_needed = 0;
1965     
1966     
1967     	ARLAN_DEBUG_ENTRY("arlan_set_multicast");
1968     
1969     	if (dev->flags & IFF_PROMISC)
1970     	{
1971     		unsigned char recMode;
1972     		READSHM(recMode, arlan->receiveMode, u_char);
1973     		conf->receiveMode = (ARLAN_RCV_PROMISC | ARLAN_RCV_CONTROL);
1974     		if (conf->receiveMode != recMode)
1975     			board_conf_needed = 1;
1976     	}
1977     	else
1978     	{
1979     		/* turn off promiscuous mode  */
1980     		unsigned char recMode;
1981     		READSHM(recMode, arlan->receiveMode, u_char);
1982     		conf->receiveMode = ARLAN_RCV_CLEAN | ARLAN_RCV_CONTROL;
1983     		if (conf->receiveMode != recMode)
1984     			board_conf_needed = 1;
1985     	}
1986     	if (board_conf_needed)
1987     		arlan_command(dev, ARLAN_COMMAND_CONF);
1988     
1989     	ARLAN_DEBUG_EXIT("arlan_set_multicast");
1990     }
1991     
1992     
1993     int __init arlan_probe(struct net_device *dev)
1994     {
1995     	printk("Arlan driver %s\n", arlan_version);
1996     
1997     	if (arlan_probe_everywhere(dev))
1998     		return -ENODEV;
1999     
2000     	arlans_found++;
2001     
2002     	if (arlans_found == 1)
2003     		siteName = kmalloc(100, GFP_KERNEL);
2004     	return 0;
2005     }
2006     
2007     #ifdef  MODULE
2008     
2009     int init_module(void)
2010     {
2011     	int i = 0;
2012     
2013     	ARLAN_DEBUG_ENTRY("init_module");
2014     
2015     	if (channelSet != channelSetUNKNOWN || channelNumber != channelNumberUNKNOWN || systemId != systemIdUNKNOWN)
2016     	{
2017     		printk(KERN_WARNING "arlan: wrong module params for multiple devices\n ");
2018     		return -1;
2019     	}
2020     	numDevices = arlan_find_devices();
2021     	if (numDevices == 0)
2022     	{
2023     		printk(KERN_ERR "arlan: no devices found \n");
2024     		return -1;
2025     	}
2026     
2027     	siteName = kmalloc(100, GFP_KERNEL);
2028     	if(siteName==NULL)
2029     	{
2030     		printk(KERN_ERR "arlan: No memory for site name.\n");
2031     		return -1;
2032     	}
2033     	for (i = 0; i < numDevices && i < MAX_ARLANS; i++)
2034     	{
2035     		if (!arlan_allocate_device(i, NULL))
2036     			return -1;
2037     		if (arlan_device[i] == NULL)
2038     		{
2039     			printk(KERN_CRIT "arlan: Not Enough memory \n");
2040     			return -1;
2041     		}
2042     		if (probe)
2043     			arlan_probe_everywhere(arlan_device[i]);
2044     //		arlan_command(arlan_device[i], ARLAN_COMMAND_POWERDOWN );
2045     	}
2046     	printk(KERN_INFO "Arlan driver %s\n", arlan_version);
2047     	ARLAN_DEBUG_EXIT("init_module");
2048     	return 0;
2049     }
2050     
2051     
2052     void cleanup_module(void)
2053     {
2054     	int i = 0;
2055     
2056     	ARLAN_DEBUG_ENTRY("cleanup_module");
2057     
2058     	IFDEBUG(ARLAN_DEBUG_SHUTDOWN)
2059     		printk(KERN_INFO "arlan: unloading module\n");
2060     	for (i = 0; i < MAX_ARLANS; i++)
2061     	{
2062     		if (arlan_device[i])
2063     		{
2064     			arlan_command(arlan_device[i], ARLAN_COMMAND_POWERDOWN );
2065     
2066     //			release_mem_region(virt_to_phys(arlan_device[i]->mem_start), 0x2000 );
2067     			unregister_netdev(arlan_device[i]);
2068     			if (arlan_device[i]->priv)
2069     			{
2070     				if (((struct arlan_private *) arlan_device[i]->priv)->conf)
2071     					kfree(((struct arlan_private *) arlan_device[i]->priv)->conf);
2072     				kfree(arlan_device[i]);
2073     			}
2074     			arlan_device[i] = NULL;
2075     		}
2076     	}
2077     	ARLAN_DEBUG_EXIT("cleanup_module");
2078     }
2079     
2080     
2081     #endif
2082