1/*
2 *	 Aironet 4500 Pcmcia driver
3 *
4 *		Elmer Joandi, Januar 1999
5 *	Copyright:	GPL
6 *
7 *
8 *	Revision 0.1 ,started  30.12.1998
9 *
10 *
11 */
12
13
14#ifndef AIRONET4500_H
15#define	AIRONET4500_H
16// redefined to avoid PCMCIA includes
17
18 #include <linux/version.h>
19/*#include <linux/module.h>
20 #include <linux/kernel.h>
21*/
22
23/*
24#include <linux/types.h>
25#include <linux/netdevice.h>
26#include <linux/etherdevice.h>
27#include <linux/delay.h>
28#include <linux/time.h>
29*/
30#include <linux/802_11.h>
31
32//damn idiot PCMCIA stuff
33#ifndef DEV_NAME_LEN
34	#define DEV_NAME_LEN 32
35#endif
36
37struct pcmcia_junkdev_node_t {
38    char		dev_name[DEV_NAME_LEN];
39    u_short		major, minor;
40    struct dev_node_t	*next;
41};
42
43#ifndef CS_RELEASE
44typedef struct pcmcia_junkdev_node_t dev_node_t;
45#endif
46
47
48
49#include <linux/spinlock.h>
50
51
52#define AWC_ERROR	-1
53#define AWC_SUCCESS	0
54
55struct awc_cis {
56	unsigned char cis[0x301];
57	unsigned char unknown302[0xdf];
58	unsigned short configuration_register;
59	unsigned short pin_replacement_register;
60	unsigned short socket_and_copy_register;
61
62};
63
64
65/* timeout for transmit watchdog timer, AP default is 8 sec */
66#define AWC_TX_TIMEOUT			(HZ * 8)
67
68
69
70/***************************  REGISTER OFFSETS *********************/
71#define awc_Command_register 		0x00
72#define awc_Param0_register 		0x02
73#define awc_Param1_register 		0x04
74#define awc_Param2_register 		0x06
75#define awc_Status_register 		0x08
76#define awc_Resp0_register 		0x0A
77#define awc_Resp1_register 		0x0C
78#define awc_Resp2_register 		0x0E
79#define awc_EvStat_register 		0x30
80#define awc_EvIntEn_register 		0x32
81#define awc_EvAck_register 		0x34
82#define awc_SWSupport0_register 	0x28
83#define awc_SWSupport1_register 	0x2A
84#define awc_SWSupport2_register 	0x2C
85#define awc_SWSupport3_register 	0x2E
86#define awc_LinkStatus_register 	0x10
87// Memory access  RID FID
88#define awc_Select0_register 		0x18
89#define awc_Offset0_register 		0x1C
90#define awc_Data0_register 		0x36
91#define awc_Select1_register 		0x1A
92#define awc_Offset1_register 		0x1E
93#define awc_Data1_register 		0x38
94//
95#define awc_RxFID_register 		0x20
96#define awc_TxAllocFID_register 	0x22
97#define awc_TxComplFID_register 	0x24
98#define awc_AuxPage_register 		0x3A
99#define awc_AuxOffset_register 		0x3C
100#define awc_AuxData_register 		0x3E
101
102
103struct awc_bap {
104	u16 select;
105	u16 offset;
106	u16 data;
107	volatile int lock;
108	volatile int	status;
109	struct semaphore sem;
110	spinlock_t spinlock;
111	unsigned long flags;
112};
113
114
115
116#define AWC_COMMAND_STATE_WAIT_CMD_BUSY		1
117#define AWC_COMMAND_STATE_WAIT_CMD_ACK		2
118#define AWC_COMMAND_STATE_WAIT_BAP_BUSY		3
119#define AWC_COMMAND_STATE_BAP_NOT_SET		4
120#define AWC_COMMAND_STATE_BAP_SET		5
121
122struct awc_command {
123	volatile int		state;
124	volatile int		lock_state;
125	struct net_device *		dev;
126	struct awc_private *	priv;
127	u16			port;
128	struct awc_bap * 	bap;
129	u16			command;
130	u16			par0;
131	u16			par1;
132	u16			par2;
133	u16			status;
134	u16			resp0;
135	u16			resp1;
136	u16			resp2;
137	u16			rid;
138	u16			offset;
139	u16			len;
140	void *			buff;
141
142};
143
144
145
146
147#define DOWN(a) down_interruptible( a ) ;
148//	if (in_interrupt()) { down_interruptible( a ) ; } else printk("semaphore DOWN in interrupt tried \n");
149#define UP(a)   up( a ) ;
150//	if (in_interrupt()) {up( a ) ; } else printk("semaphore UP in interrupt tried \n");
151
152/*	if (!in_interrupt())\
153	printk("bap lock under cli but not in int\n");\
154*/
155
156#define AWC_LOCK_COMMAND_ISSUING(a) spin_lock_irqsave(&a->command_issuing_spinlock,a->command_issuing_spinlock_flags);
157#define AWC_UNLOCK_COMMAND_ISSUING(a) spin_unlock_irqrestore(&a->command_issuing_spinlock,a->command_issuing_spinlock_flags);
158
159#define AWC_BAP_LOCK_UNDER_CLI_REAL(cmd) \
160 	if (!cmd.priv) {\
161		printk(KERN_CRIT "awc4500: no priv present in command !");\
162	}\
163	cmd.bap = &(cmd.priv->bap1);\
164	if (both_bap_lock)\
165	spin_lock_irqsave(&cmd.priv->both_bap_spinlock,cmd.priv->both_bap_spinlock_flags);\
166	if (cmd.bap){\
167		spin_lock_irqsave(&(cmd.bap->spinlock),cmd.bap->flags);\
168		cmd.bap->lock++;\
169		if (cmd.bap->lock > 1)\
170			printk("Bap 1 lock high\n");\
171		cmd.lock_state |= AWC_BAP_LOCKED;\
172	}
173
174#define AWC_BAP_LOCK_NOT_CLI_REAL(cmd) {\
175	if (in_interrupt())\
176	printk("bap lock not cli in int\n");\
177 	if (!cmd.priv) {\
178		printk(KERN_CRIT "awc4500: no priv present in command,lockup follows !");\
179	}\
180	cmd.bap = &(cmd.priv->bap0);\
181	if (both_bap_lock)\
182		spin_lock_irqsave(&cmd.priv->both_bap_spinlock,cmd.priv->both_bap_spinlock_flags);\
183	spin_lock_irqsave(&(cmd.bap->spinlock),cmd.bap->flags);\
184	DOWN(&(cmd.priv->bap0.sem));\
185	cmd.bap->lock++;\
186	if (cmd.bap->lock > 1)\
187		printk("Bap 0 lock high\n");\
188	cmd.lock_state |= AWC_BAP_SEMALOCKED;\
189}
190
191#define AWC_BAP_LOCK_NOT_CLI_CLI_REAL(cmd) {\
192	cmd.bap = &(cmd.priv->bap0);\
193	if (both_bap_lock)\
194		spin_lock_irqsave(&cmd.priv->both_bap_spinlock,cmd.priv->both_bap_spinlock_flags);\
195	spin_lock_irqsave(&(cmd.bap->spinlock),cmd.bap->flags);\
196	cmd.bap->lock++;\
197	if (cmd.bap->lock > 1)\
198		printk("Bap 0 lock high\n");\
199	cmd.lock_state |= AWC_BAP_LOCKED;\
200}
201
202#define BAP_LOCK_ANY(cmd)\
203	if (in_interrupt())	AWC_BAP_LOCK_NOT_CLI_CLI_REAL(cmd)\
204	else AWC_BAP_LOCK_NOT_CLI_REAL(cmd)
205
206#define AWC_BAP_LOCK_NOT_CLI(cmd)	BAP_LOCK_ANY(cmd)
207#define AWC_BAP_LOCK_UNDER_CLI(cmd)	AWC_BAP_LOCK_UNDER_CLI_REAL(cmd)
208/*
209	if (!cmd.priv->bap1.lock ) {BAP_LOCK_ANY(cmd);}\
210	else AWC_BAP_LOCK_NOT_CLI_CLI_REAL(cmd);
211*/
212#define AWC_BAP_LOCKED 		0x01
213#define AWC_BAP_SEMALOCKED 	0x02
214
215#define AWC_BAP_BUSY	0x8000
216#define AWC_BAP_ERR	0x4000
217#define AWC_BAP_DONE	0x2000
218
219#define AWC_CLI		1
220#define AWC_NOT_CLI 	2
221
222/*#define WAIT61x3	inb(0x61);\
223         		inb(0x61);\
224                    	inb(0x61);
225*/
226#define WAIT61x3 	udelay(bap_sleep)
227
228#define AWC_INIT_COMMAND(context, a_com, a_dev,a_cmmand,a_pr0, a_rid, a_offset, a_len, a_buff) {\
229	memset(&a_com,0,sizeof(a_com) );\
230	a_com.dev = a_dev;\
231	a_com.priv = a_dev->priv;\
232	a_com.port = a_dev->base_addr;\
233	a_com.bap = NULL;\
234	a_com.command = a_cmmand;\
235	a_com.par0 = a_pr0;\
236	a_com.rid = a_rid;\
237	a_com.offset = a_offset;\
238	a_com.len = a_len;\
239	a_com.buff = a_buff;\
240	a_com.lock_state = 0;\
241};
242
243/* v�ga veider asi j�rgnevast
244 makrost v�lja j�etud	if (cmd.bap) AWC_IN((cmd.bap)->data);\
245*/
246
247#define AWC_BAP_UNLOCK(com) { \
248	if (com.bap){ \
249		if ( (com.lock_state & AWC_BAP_SEMALOCKED) &&\
250		     (com.lock_state & AWC_BAP_LOCKED) ){\
251		     	printk("Both Sema and simple lock \n");\
252		}\
253		if ( com.lock_state & AWC_BAP_SEMALOCKED ){\
254			 com.bap->lock--; \
255			 com.lock_state &= ~AWC_BAP_SEMALOCKED;\
256			 UP(&(com.bap->sem)); \
257			 spin_unlock_irqrestore(&(cmd.bap->spinlock),cmd.bap->flags);\
258		} else if (com.lock_state & AWC_BAP_LOCKED){\
259			 com.bap->lock--; \
260			 com.lock_state &= ~AWC_BAP_LOCKED;\
261			 spin_unlock_irqrestore(&(cmd.bap->spinlock),cmd.bap->flags);\
262		}\
263	}\
264	if (both_bap_lock)\
265		spin_unlock_irqrestore(&cmd.priv->both_bap_spinlock,cmd.priv->both_bap_spinlock_flags);\
266}
267
268#define AWC_RELEASE_COMMAND(com) {\
269		AWC_BAP_UNLOCK(cmd);\
270	}
271
272
273
274#define awc_manufacturer_code 	0x015F
275#define awc_product_code	0x0005
276
277
278#define awc_write(base,register,u16value) outw(u16value, (base)+(register))
279#define awc_read(base,register)           inw((base)+(register))
280#define AWC_OUT(base,val)		outw(val, base)
281#define AWC_IN(base)			inw(base)
282
283
284#define awc_read_response(cmd)	{	\
285	cmd->status=awc_read(cmd->port,awc_Status_register);\
286	cmd->resp0=awc_read(cmd->port,awc_Resp0_register);\
287	cmd->resp1=awc_read(cmd->port,awc_Resp1_register);\
288	cmd->resp2=awc_read(cmd->port,awc_Resp2_register);\
289};
290
291#define awc_command_busy(base)		(awc_read(base,awc_Command_register) & 0x8000)
292#define awc_command_read(base)		awc_read(base,awc_Command_register)
293#define awc_command_write(base,cmd)	awc_write(base,awc_Command_register,cmd)
294#define awc_event_status_Awake(base)	(awc_read(base,awc_EvStat_register) & 0x0100)
295#define awc_event_status_Link(base)	(awc_read(base,awc_EvStat_register) & 0x0080)
296#define awc_event_status_Cmd(base)	(awc_read(base,awc_EvStat_register) & 0x0010)
297#define awc_event_status_Alloc(base)	(awc_read(base,awc_EvStat_register) & 0x0008)
298#define awc_event_status_TxExc(base)	(awc_read(base,awc_EvStat_register) & 0x0004)
299#define awc_event_status_Tx(base)	(awc_read(base,awc_EvStat_register) & 0x0002)
300#define awc_event_status_TxResp(base)	(awc_read(base,awc_EvStat_register) & 0x0006)
301#define awc_event_status_Rx(base)	(awc_read(base,awc_EvStat_register) & 0x0001)
302#define awc_event_status(base)		(awc_read(base,awc_EvStat_register))
303
304#define awc_Link_Status(base)		awc_read(base,awc_LinkStatus_register)
305
306#define awc_Rx_Fid(base)		awc_read(base,awc_RxFID_register)
307#define awc_Tx_Allocated_Fid(base)	awc_read(base,awc_TxAllocFID_register)
308#define awc_Tx_Compl_Fid(base)		awc_read(base,awc_TxComplFID_register)
309
310#define awc_event_ack_ClrStckCmdBsy(base) awc_write(base,awc_EvAck_register, 0x4000)
311#define awc_event_ack_WakeUp(base)	awc_write(base,awc_EvAck_register, 0x2000)
312#define awc_event_ack_Awaken(base)	awc_write(base,awc_EvAck_register, 0x0100)
313#define awc_event_ack_Link(base)	awc_write(base,awc_EvAck_register, 0x0080)
314#define awc_event_ack_Cmd(base)		awc_write(base,awc_EvAck_register, 0x0010)
315#define awc_event_ack_Alloc(base)	awc_write(base,awc_EvAck_register, 0x0008)
316#define awc_event_ack_TxExc(base)	awc_write(base,awc_EvAck_register, 0x0004)
317#define awc_event_ack_Tx(base)		awc_write(base,awc_EvAck_register, 0x0002)
318#define awc_event_ack_Rx(base)		awc_write(base,awc_EvAck_register, 0x0001)
319
320#define awc_event_ack(base,ints)	awc_write(base,awc_EvAck_register,ints)
321
322#define awc_ints_enabled(base)		(awc_read(base,awc_EvIntEn_register))
323#define awc_ints_enable(base,ints)	awc_write(base,awc_EvIntEn_register,ints)
324
325
326
327/************************  	RX TX 	BUFF	************************/
328
329
330struct aironet4500_radio_rx_header {
331	u32	RxTime;
332	u16	Status;
333	u16	PayloadLength;
334	u8	Reserved0;
335	u8	RSSI;
336	u8	Rate;
337	u8	Frequency;
338	u8	Rx_association_count;
339	u8 	Reserved1[3];
340	u8	PLCP_header[4];
341
342};
343
344
345struct aironet4500_radio_tx_header {
346	u32	SWSupport;
347	u16	Status;
348	#define aironet4500_tx_status_max_retries	0x0002
349	#define aironet4500_tx_status_lifetime_exceeded	0x0004
350	#define aironet4500_tx_status_AID_failure	0x0008
351	#define aironet4500_tx_status_MAC_disabled	0x0010
352	#define aironet4500_tx_status_association_lost	0x0020
353	u16	PayloadLength;
354	u16	TX_Control;
355	#define aironet4500_tx_control_tx_ok_event_enable 	0x0002
356	#define aironet4500_tx_control_tx_fail_event_enable 	0x0004
357	#define aironet4500_tx_control_header_type_802_11 	0x0008
358	#define aironet4500_tx_control_payload_type_llc 	0x0010
359	#define aironet4500_tx_control_no_release 		0x0020
360	#define aironet4500_tx_control_reuse_fid \
361		(aironet4500_tx_control_tx_ok_event_enable |\
362		 aironet4500_tx_control_tx_fail_event_enable |\
363		  aironet4500_tx_control_no_release)
364	#define aironet4500_tx_control_no_retries 		0x0040
365	#define aironet4500_tx_control_clear_AID 		0x0080
366	#define aironet4500_tx_control_strict_order 		0x0100
367	#define aironet4500_tx_control_use_rts 			0x0200
368	u16	AID;
369	u8	Tx_Long_Retry;
370	u8	Tx_Short_Retry;
371	u8	tx_association_count;
372	u8	tx_bit_rate;
373	#define	aironet4500_tx_bit_rate_automatic 0
374	#define aironet4500_tx_bit_rate_500kbps	1
375	#define aironet4500_tx_bit_rate_1Mbps	2
376	#define aironet4500_tx_bit_rate_2Mbps	4
377	u8	Max_Long_Retry;
378	u8	Max_Short_Retry;
379	u8	Reserved0[2];
380};
381
382
383struct aironet4500_rx_fid {
384
385	u16						rid;
386	struct aironet4500_radio_rx_header 		radio_rx;
387	struct ieee_802_11_header 	   		ieee_802_11;
388	u16 						gap_length;
389	struct ieee_802_3_header	   		ieee_802_3;
390	u8					*	payload;
391};
392
393
394struct aironet4500_tx_fid {
395
396	u16						fid;
397	u16						fid_size;
398	struct aironet4500_radio_tx_header 		radio_tx;
399	struct ieee_802_11_header 	   		ieee_802_11;
400	u16 						gap_length;
401	#define aironet4500_gap_len_without_802_3	6
402	#define aironet4500_gap_len_with_802_3		0
403	struct ieee_802_3_header	   		ieee_802_3;
404	u8					*	payload;
405};
406
407struct awc_fid {
408
409	u32	type;
410	#define p80211_llc_snap		0x0100
411	#define p80211_8021H		0x0200
412	#define p80211_8022		0x0400
413	#define p80211_8023		0x0800
414	#define p80211_snap_8021H	0x1000
415	#define p80211copy_path_skb	0x2000
416
417	u8	priority;
418	u8	busy;
419
420	#define awc_tx_fid_complete_read 0x01
421	u16	state;
422	union {
423		struct aironet4500_tx_fid tx;
424		struct aironet4500_rx_fid rx;
425	} u;
426
427	struct ieee_802_11_snap_header snap;
428	struct ieee_802_11_802_1H_header bridge;
429	u16			bridge_size;
430	struct ieee_802_11_802_2_header p8022;
431
432	u16			pkt_len;
433	u8	* mac;
434	struct sk_buff *	skb;
435	long long		transmit_start_time;
436	struct awc_fid	*	next;
437	struct awc_fid	*	prev;
438
439};
440
441
442
443struct awc_fid_queue {
444
445
446	struct awc_fid * head;
447	struct awc_fid * tail;
448	int	size;
449	spinlock_t spinlock;
450};
451
452
453extern  __inline__ void
454awc_fid_queue_init(struct awc_fid_queue * queue){
455
456	unsigned long flags;
457	memset(queue,0, sizeof(struct awc_fid_queue));
458	spin_lock_init(&queue->spinlock);
459	spin_lock_irqsave(&queue->spinlock,flags);
460	queue->head = NULL;
461	queue->tail = NULL;
462	queue->size = 0;
463	spin_unlock_irqrestore(&queue->spinlock,flags);
464};
465
466static inline void
467awc_fid_queue_push_tail(	struct awc_fid_queue * 	queue,
468				struct awc_fid *	fid){
469
470	unsigned long flags;
471
472	spin_lock_irqsave(&queue->spinlock,flags);
473
474	fid->prev = queue->tail;
475	fid->next = NULL;
476
477	if (queue->tail){
478		queue->tail->next = fid;
479	}
480	queue->tail  = fid;
481
482	if (!queue->head)
483		queue->head = fid;
484	queue->size++;
485
486	spin_unlock_irqrestore(&queue->spinlock,flags);
487
488};
489
490
491static inline void
492awc_fid_queue_push_head(	struct awc_fid_queue * 	queue,
493				struct awc_fid *	fid){
494
495	unsigned long flags;
496
497	spin_lock_irqsave(&queue->spinlock,flags);
498
499	fid->prev = NULL;
500	fid->next = queue->head;
501
502	if (queue->head){
503		queue->head->prev = fid;
504	}
505	queue->head  = fid;
506
507	if (!queue->tail)
508		queue->tail = fid;
509	queue->size++;
510
511	spin_unlock_irqrestore(&queue->spinlock,flags);
512};
513
514
515
516static inline void
517awc_fid_queue_rm(		struct awc_fid_queue * 	queue,
518				struct awc_fid *	fid){
519
520
521	if (fid->prev) {
522		fid->prev->next = fid->next;
523	};
524
525	if (fid->next) {
526		fid->next->prev = fid->prev;
527	};
528
529	if (fid == queue->tail) {
530		queue->tail = fid->prev;
531	};
532	if (fid == queue->head) {
533		queue->head = fid->next;
534	};
535	fid->next = NULL;
536	fid->prev = NULL;
537	queue->size--;
538	if (queue->size ==0 ){
539		queue->tail = NULL;
540		queue->head = NULL;
541	}
542};
543
544static inline void
545awc_fid_queue_remove(		struct awc_fid_queue * 	queue,
546				struct awc_fid *	fid){
547	unsigned long flags;
548	spin_lock_irqsave(&queue->spinlock,flags);
549
550	awc_fid_queue_rm(queue,fid);
551
552	spin_unlock_irqrestore(&queue->spinlock,flags);
553
554};
555
556
557
558static inline struct awc_fid *
559awc_fid_queue_pop_head(		struct awc_fid_queue * 	queue){
560
561	unsigned long flags;
562	struct awc_fid * fid;
563
564	spin_lock_irqsave(&queue->spinlock,flags);
565
566	fid = queue->head;
567	if (fid)
568		awc_fid_queue_rm(queue,fid);
569
570	spin_unlock_irqrestore(&queue->spinlock,flags);
571
572	return fid;
573};
574
575
576
577
578static inline struct awc_fid *
579awc_fid_queue_pop_tail(		struct awc_fid_queue * 	queue){
580
581	unsigned long flags;
582	struct awc_fid * fid;
583
584	spin_lock_irqsave(&queue->spinlock,flags);
585
586	fid = queue->tail;
587	if (fid)
588			awc_fid_queue_rm(queue,fid);
589
590	spin_unlock_irqrestore(&queue->spinlock,flags);
591
592	return fid;
593};
594
595
596
597#define AWC_TX_HEAD_SIZE		0x44
598#define AWC_TX_ALLOC_SMALL_SIZE 	200
599#define AWC_RX_BUFFS			50
600
601
602/*****************************     	RID & CONFIG 	***********************/
603
604struct awc_config{
605    unsigned short    Len;                                /* sizeof(PC4500_CONFIG) */
606    unsigned short    OperatingMode;                      /* operating mode        */
607
608    #define           MODE_STA_IBSS                0
609    #define           MODE_STA_ESS                 1
610    #define           MODE_AP                      2
611    #define           MODE_AP_RPTR                 3
612    #define           MODE_ETHERNET_HOST           (0<<8)    /* rx payloads converted */
613    #define           MODE_LLC_HOST                (1<<8)    /* rx payloads left as is */
614    #define           MODE_AIRONET_EXTEND          (1<<9)    /* enable Aironet extenstions */
615    #define           MODE_AP_INTERFACE            (1<<10) /* enable ap interface extensions */
616    unsigned short    ReceiveMode;                        /* receive mode */
617    #define           RXMODE_BC_MC_ADDR            0
618    #define           RXMODE_BC_ADDR               1         /* ignore multicasts */
619    #define           RXMODE_ADDR                  2         /* ignore multicast and broadcast */
620    #define           RXMODE_RFMON                 3         /* wireless monitor mode */
621    #define           RXMODE_RFMON_ANYBSS 4
622    #define           RXMODE_LANMON                5         /* lan style monitor -- data packets only */
623    #define           RXMODE_DISABLE_802_3_HEADER  0x100    /* disables 802.3 header on rx */
624
625    unsigned short    FragmentThreshold;
626    unsigned short    RtsThreshold;
627    unsigned char     StationMacAddress[6];
628    unsigned char     Rates[8];
629    unsigned short    ShortRetryLimit;
630    unsigned short    LongRetryLimit;
631    unsigned short    TxLifetime;                         /* in kusec */
632    unsigned short    RxLifetime;                         /* in kusec */
633    unsigned short    Stationary;
634    unsigned short    Ordering;
635    unsigned short    DeviceType;                         /* for overriding device type */
636    unsigned short    _reserved1[5];                         /*---------- Scanning/Associating ----------*/
637    unsigned short    ScanMode;
638    #define           SCANMODE_ACTIVE              0
639    #define           SCANMODE_PASSIVE             1
640    #define           SCANMODE_AIROSCAN            2
641    unsigned short    ProbeDelay;                         /* in kusec */
642    unsigned short    ProbeEnergyTimeout;                 /* in kusec */
643    unsigned short    ProbeResponseTimeout;
644    unsigned short    BeaconListenTimeout;
645    unsigned short    JoinNetTimeout;
646    unsigned short    AuthenticationTimeout;
647    unsigned short    AuthenticationType;
648    #define           AUTH_OPEN                    1
649    #define           AUTH_SHAREDKEY               2
650    #define           AUTH_EXCLUDENONWEP           4
651    unsigned short    AssociationTimeout;
652    unsigned short    SpecifiedApTimeout;
653    unsigned short    OfflineScanInterval;
654    unsigned short    OfflineScanDuration;
655    unsigned short    LinkLossDelay;
656    unsigned short    MaxBeaconLostTime;
657    unsigned short    RefreshInterval;
658   #define           DISABLE_REFRESH           0xFFFF
659   unsigned short    _reserved1a[1];                      /*---------- Power save operation ----------*/
660   unsigned short    PowerSaveMode;
661   #define           POWERSAVE_CAM             0
662   #define           POWERSAVE_PSP             1
663   #define           POWERSAVE_PSP_CAM         2
664   unsigned short    SleepForDtims;
665   unsigned short    ListenInterval;
666   unsigned short    FastListenInterval;
667   unsigned short    ListenDecay;
668   unsigned short    FastListenDelay;
669   unsigned short    _reserved2[2];                       /*---------- Ap/Ibss config items ----------*/
670   unsigned short    BeaconPeriod;
671   unsigned short    AtimDuration;
672   unsigned short    HopPeriod;
673   unsigned short    ChannelSet;
674   unsigned short    Channel;
675   unsigned short    DtimPeriod;
676   unsigned short    _reserved3[2];                       /*---------- Radio configuration ----------*/
677   unsigned short    RadioType;
678   #define           RADIOTYPE_DEFAULT         0
679   #define           RADIOTYPE_802_11          1
680   #define           RADIOTYPE_LEGACY          2
681   unsigned char     u8RxDiversity;
682   unsigned char     u8TxDiversity;
683   unsigned short    TxPower;
684   #define           TXPOWER_DEFAULT           0
685   unsigned short    RssiThreshold;
686   #define           RSSI_DEFAULT              0
687   unsigned short    RadioSpecific[4];                 /*---------- Aironet Extensions ----------*/
688   unsigned char     NodeName[16];
689   unsigned short    ArlThreshold;
690   unsigned short    ArlDecay;
691   unsigned short    ArlDelay;
692   unsigned short    _reserved4[1];                       /*---------- Aironet Extensions ----------*/
693   unsigned short    MagicAction;
694   #define           MAGIC_ACTION_STSCHG       1
695   #define           MACIC_ACTION_RESUME       2
696   #define           MAGIC_IGNORE_MCAST        (1<<8)
697   #define           MAGIC_IGNORE_BCAST        (1<<9)
698   #define           MAGIC_SWITCH_TO_PSP       (0<<10)
699   #define           MAGIC_STAY_IN_CAM         (1<<10)
700};
701
702
703
704struct awc_SSID {
705	u16 	lenght;
706	u8	SSID[32];
707};
708
709struct awc_SSIDs {
710	u16 	ridLen;
711	struct awc_SSID SSID[3];
712
713};
714
715struct awc_fixed_APs{
716	u16	ridLen;
717	u8	AP[4][6];
718};
719
720struct awc_driver_name{
721	u16	ridLen;
722	u8	name[16];
723};
724
725struct awc_encapsulation{
726	u16 	etherType;
727	u16	Action;
728};
729
730struct awc_enc_trans{
731	u16				ridLen;
732	struct awc_encapsulation 	rules[8];
733};
734
735struct awc_wep_key {
736	u16	ridLen;
737	u16	KeyIndex;
738	u8	Address[6];
739	u16	KeyLen;
740	u8	Key[16];
741};
742
743struct awc_modulation {
744	u16	ridLen;
745	u16	Modulation;
746};
747
748struct awc_cap{
749	u16		ridLen;
750	u8		OUI[3];
751	u8		ProductNum[3];
752	u8		ManufacturerName[32];
753	u8		ProductName[16];
754	u8		ProductVersion[8];
755	u8		FactoryAddress[6];
756	u8		AironetAddress[6];
757	u16		RadioType;
758	u16		RegDomain;
759	u8		Callid[6];
760	u8		SupportedRates[8];
761	u8		RxDiversity;
762	u8		TxDiversity;
763	u16		TxPowerLevels[8];
764	u16		HardwareVersion;
765	u16		HardwareCapabilities;
766	u16		TemperatureRange;
767	u16		SoftwareVersion;
768	u16		SoftwareSubVersion;
769	u16		InterfaceVersion;
770	u16		SoftwareCapabilities;
771	u8		BootBlockVersionMajor;
772	u8              BootBlockVersionMinor;
773
774};
775
776
777struct awc_status{
778	u16	ridLen;
779	u8	MacAddress[6];
780	u16	OperationalMode;
781	u16	ErrorCode;
782	u16	CurrentSignalQuality;
783	u16	SSIDlength;
784	u8	SSID[32];
785	u8	ApName[16];
786	u8	CurrentBssid[32];
787	u8	PreviousBSSIDs[3][6];
788	u16	BeaconPeriod;
789	u16	DtimPeriod;
790	u16	AtimDuration;
791	u16	HopPeriod;
792	u16	ChannelSet;
793	u16	Channel;
794
795	u16	HopsToBackbone;
796	u16	ApTotalLoad;
797	u16	OurGeneratedLoad;
798	u16	AccumulatedArl;
799
800};
801
802
803struct awc_AP{
804	u16	ridLen;
805	u16	TIM_Addr;
806	u16	Airo_Addr;
807};
808
809struct awc_Statistics_32 {
810
811	u32	RidLen;
812	u32	RxOverrunErr;
813	u32	RxPlcpCrcErr;
814	u32	RxPlcpFormat;
815	u32	RxPlcpLength;
816	u32	RxMacCrcErr;
817	u32	RxMacCrcOk;
818	u32	RxWepErr;
819	u32	RxWepOk;
820	u32	RetryLong;
821	u32	RetryShort;
822	u32	MaxRetries;
823	u32	NoAck;
824
825	u32	NoCts;
826	u32	RxAck;
827	u32	RxCts;
828	u32	TxAck;
829	u32	TxRts;
830	u32	TxCts;
831	u32	TxMc;
832	u32	TxBc;
833	u32	TxUcFrags;
834	u32	TxUcPackets;
835	u32	TxBeacon;
836	u32	RxBeacon;
837	u32	TxSinColl;
838	u32	TxMulColl;
839	u32	DefersNo;
840	u32	DefersProt;
841	u32	DefersEngy;
842	u32	DupFram;
843	u32	RxFragDisc;
844	u32	TxAged;
845	u32	RxAged;
846	u32	LostSync_Max;
847	u32	LostSync_Mis;
848	u32	LostSync_Arl;
849	u32	LostSync_Dea;
850	u32	LostSync_Disa;
851	u32	LostSync_Tsf;
852	u32	HostTxMc;
853	u32	HostTxBc;
854	u32	HostTxUc;
855	u32	HostTxFail;
856	u32	HostRxMc;
857	u32	HostRxBc;
858	u32	HostRxUc;
859	u32	HostRxDiscar;
860	u32	HmacTxMc;
861	u32	HmacTxBc;
862	u32	HmacTxUc;
863	u32	HmacTxFail;
864	u32	HmacRxMc;
865	u32	HmacRxBc;
866	u32	HmacRxUc;
867	u32	HmacRxDisca;
868	u32	HmacRxAcce;
869	u32	SsidMismatch;
870	u32	ApMismatch;
871	u32	RatesMismatc;
872	u32	AuthReject;
873	u32	AuthTimeout;
874	u32	AssocReject;
875	u32	AssocTimeout;
876	u32	NewReason;
877	u32	AuthFail_1;
878	u32	AuthFail_2;
879	u32	AuthFail_3;
880	u32	AuthFail_4;
881	u32	AuthFail_5;
882	u32	AuthFail_6;
883	u32	AuthFail_7;
884	u32	AuthFail_8;
885	u32	AuthFail_9;
886	u32	AuthFail_10;
887	u32	AuthFail_11;
888	u32	AuthFail_12;
889	u32	AuthFail_13;
890	u32	AuthFail_14;
891	u32	AuthFail_15;
892	u32	AuthFail_16;
893	u32	AuthFail_17;
894	u32	AuthFail_18;
895	u32	AuthFail_19;
896	u32	RxMan;
897	u32	TxMan;
898	u32	RxRefresh;
899	u32	TxRefresh;
900	u32	RxPoll;
901	u32	TxPoll;
902	u32	HostRetries;
903	u32	LostSync_HostReq;
904	u32	HostTxBytes;
905	u32	HostRxBytes;
906	u32	ElapsedUsec;
907	u32	ElapsedSec;
908	u32	LostSyncBett;
909};
910
911struct awc_Statistics_16 {
912
913	u16	RidLen;
914	u16	RxOverrunErr;
915	u16	RxPlcpCrcErr;
916	u16	RxPlcpFormat;
917	u16	RxPlcpLength;
918	u16	RxMacCrcErr;
919	u16	RxMacCrcOk;
920	u16	RxWepErr;
921	u16	RxWepOk;
922	u16	RetryLong;
923	u16	RetryShort;
924	u16	MaxRetries;
925	u16	NoAck;
926	u16	NoCts;
927	u16	RxAck;
928	u16	RxCts;
929	u16	TxAck;
930	u16	TxRts;
931	u16	TxCts;
932	u16	TxMc;
933	u16	TxBc;
934	u16	TxUcFrags;
935	u16	TxUcPackets;
936	u16	TxBeacon;
937	u16	RxBeacon;
938	u16	TxSinColl;
939	u16	TxMulColl;
940	u16	DefersNo;
941	u16	DefersProt;
942	u16	DefersEngy;
943	u16	DupFram;
944	u16	RxFragDisc;
945	u16	TxAged;
946	u16	RxAged;
947	u16	LostSync_Max;
948	u16	LostSync_Mis;
949	u16	LostSync_Arl;
950	u16	LostSync_Dea;
951	u16	LostSync_Disa;
952	u16	LostSync_Tsf;
953	u16	HostTxMc;
954	u16	HostTxBc;
955	u16	HostTxUc;
956	u16	HostTxFail;
957	u16	HostRxMc;
958	u16	HostRxBc;
959	u16	HostRxUc;
960	u16	HostRxDiscar;
961	u16	HmacTxMc;
962	u16	HmacTxBc;
963	u16	HmacTxUc;
964	u16	HmacTxFail;
965	u16	HmacRxMc;
966	u16	HmacRxBc;
967	u16	HmacRxUc;
968	u16	HmacRxDisca;
969	u16	HmacRxAcce;
970	u16	SsidMismatch;
971	u16	ApMismatch;
972	u16	RatesMismatc;
973	u16	AuthReject;
974	u16	AuthTimeout;
975	u16	AssocReject;
976	u16	AssocTimeout;
977	u16	NewReason;
978	u16	AuthFail_1;
979	u16	AuthFail_2;
980	u16	AuthFail_3;
981	u16	AuthFail_4;
982	u16	AuthFail_5;
983	u16	AuthFail_6;
984	u16	AuthFail_7;
985	u16	AuthFail_8;
986	u16	AuthFail_9;
987	u16	AuthFail_10;
988	u16	AuthFail_11;
989	u16	AuthFail_12;
990	u16	AuthFail_13;
991	u16	AuthFail_14;
992	u16	AuthFail_15;
993	u16	AuthFail_16;
994	u16	AuthFail_17;
995	u16	AuthFail_18;
996	u16	AuthFail_19;
997	u16	RxMan;
998	u16	TxMan;
999	u16	RxRefresh;
1000	u16	TxRefresh;
1001	u16	RxPoll;
1002	u16	TxPoll;
1003	u16	HostRetries;
1004	u16	LostSync_HostReq;
1005	u16	HostTxBytes;
1006	u16	HostRxBytes;
1007	u16	ElapsedUsec;
1008	u16	ElapsedSec;
1009	u16	LostSyncBett;
1010};
1011
1012
1013#define AWC_TXCTL_TXOK 		(1<<1)	/* report if tx is ok */
1014#define AWC_TXCTL_TXEX 		(1<<2)	/* report if tx fails */
1015#define AWC_TXCTL_802_3		(0<<3)	/* 802.3 packet */
1016#define AWC_TXCTL_802_11    	(1<<3)	/* 802.11 mac packet */
1017#define AWC_TXCTL_ETHERNET  	(0<<4)	/* payload has ethertype */
1018#define AWC_TXCTL_LLC  		(1<<4)	/* payload is llc */
1019#define AWC_TXCTL_RELEASE   	(0<<5)	/* release after completion */
1020#define AWC_TXCTL_NORELEASE 	(1<<5)	/* on completion returns to host */
1021
1022
1023/************************* LINK STATUS STUFF *******************/
1024
1025#define	awc_link_status_loss_of_sync_missed_beacons	0x8000
1026#define	awc_link_status_loss_of_sync_max_retries 	0x8001
1027#define	awc_link_status_loss_of_sync_ARL_exceed  	0x8002
1028#define	awc_link_status_loss_of_sync_host_request 	0x8003
1029#define	awc_link_status_loss_of_sync_TSF_sync		0x8004
1030#define	awc_link_status_deauthentication		0x8100
1031#define	awc_link_status_disassociation			0x8200
1032#define	awc_link_status_association_failed		0x8400
1033#define	awc_link_status_authentication_failed		0x0300
1034#define	awc_link_status_associated			0x0400
1035
1036struct awc_strings {
1037	int	par;
1038	unsigned int	mask;
1039	const char * string;
1040
1041};
1042
1043#define awc_link_status_strings {\
1044{awc_link_status_loss_of_sync_missed_beacons,	0xFFFF,"Loss of sync -- missed beacons"},\
1045{awc_link_status_loss_of_sync_max_retries,	0xFFFF,"Loss of sync -- max retries"},\
1046{awc_link_status_loss_of_sync_ARL_exceed,	0xFFFF,"Loss of sync -- average retry level (ARL) exceeded"},\
1047{awc_link_status_loss_of_sync_host_request,	0xFFFF,"Loss of sync -- host request"},\
1048{awc_link_status_loss_of_sync_TSF_sync,		0xFFFF,"Loss of sync -- TSF synchronization"},\
1049{awc_link_status_deauthentication,		0xFF00,"Deauthentication "},\
1050{awc_link_status_disassociation,		0xFF00,"Disassocation "},\
1051{awc_link_status_association_failed ,		0xFF00,"Association failed "},\
1052{awc_link_status_authentication_failed,		0xFF00,"Authentication failure"},\
1053{awc_link_status_associated,			0xFFFF,"Associated "},\
1054{0,0,NULL}\
1055}
1056
1057
1058/****************************** COMMANDS and DEFAULTS and STATUSES ***********/
1059
1060/****************************** COMMANDS */
1061
1062
1063// Command definitions
1064
1065
1066
1067
1068#define awc4500wout(base, com, p0,p1,p2) {\
1069	awc_write(base,awc_Param0_register, p0);\
1070	awc_write(base,awc_Param1_register, p1);\
1071	awc_write(base,awc_Param2_register, p2);\
1072	WAIT61x3;\
1073	awc_write(base,awc_Command_register, com);\
1074	WAIT61x3;\
1075}
1076#define awc_wout(cmd, com, p0,p1,p2) {\
1077	awc_write(base,awc_Param0_register, p0);\
1078	awc_write(base,awc_Param1_register, p1);\
1079	awc_write(base,awc_Param2_register, p2);\
1080	WAIT61x3;\
1081	awc_write(base,awc_Command_register, com);\
1082	WAIT61x3;\
1083}
1084
1085
1086#define awc_command_NOP(cmd)			awc_wout( cmd,0x0000,0,0,0) // 	NOP
1087#define awc_command_Enable_All(cmd)		awc_wout( cmd,0x0001,0,0,0) // 	Enable
1088#define awc_command_Enable_MAC(cmd)		awc_wout( cmd,0x0101,0,0,0) // 	Enable Mac
1089#define awc_command_Enable_Rx(cmd)		awc_wout( cmd,0x0201,0,0,0) // 	Enable Rx
1090#define awc_command_Disable_MAC(cmd)		awc_wout( cmd,0x0002,0,0,0) // 	Disable
1091#define awc_command_Sync_Loss(cmd)		awc_wout( cmd,0x0003,0,0,0) // 	Force a Loss of Sync
1092#define awc_command_Soft_Reset(cmd)		awc_wout( cmd,0x0004,0,0,0) // 	Firmware Restart (soft reset)
1093#define awc_command_Host_Sleep(cmd)		awc_wout( cmd,0x0005,0,0,0) // 	Host Sleep (must be issued as 0x0085)
1094#define awc_command_Magic_Packet(cmd)		awc_wout( cmd,0x0006,0,0,0) // 	Magic Packet
1095#define awc_command_Read_Configuration(cmd)	awc_wout( cmd,0x0008,0,0,0) // 	Read the Configuration from nonvolatile  storage
1096#define awc_command_Allocate_TX_Buff(cmd,size)	awc_wout( cmd,0x000A,size,0,0) // 	Allocate Transmit Buffer
1097#define awc_command_TX(cmd,FID)			awc_wout( cmd,0x000B,FID ,0,0) // 	Transmit
1098#define awc_command_Deallocate(cmd,FID)		awc_wout( cmd,0x000C,FID ,0,0) // 	Deallocate
1099#define awc_command_NOP2(cmd)			awc_wout( cmd,0x0010,0,0,0) // 	NOP (same as 0x0000)
1100#define awc_command_Read_RID(cmd,RID)		awc_wout( cmd,0x0021,RID ,0,0) // 	Read RID
1101#define awc_command_Write_RID(cmd,RID)		awc_wout( cmd,0x0121,RID ,0,0) // 	Write RID
1102#define awc_command_Allocate_Buff(cmd,size)	awc_wout( cmd,0x0028,size,0,0) // 	Allocate Buffer
1103#define awc_command_PSP_Nodes(cmd)		awc_wout( cmd,0x0030,0,0,0) // 	PSP nodes (AP only)
1104#define awc_command_Set_Phy_register(cmd,phy_register,clear_bits, set_bits)\
1105							awc_wout( cmd,0x003E,phy_register,clear_bits, set_bits) // 	Set PHY register
1106#define awc_command_TX_Test(cmd,command, frequency, pattern)		awc_wout( cmd,0x003F,command, frequency, pattern) // 	Transmitter Test
1107#define awc_command_RX_Test(cmd)		awc_wout( cmd,0x013F,0,0,0) // 	RX Test
1108#define awc_command_Sleep(cmd)			awc_wout( cmd,0x0085,0,0,0) // 	Go to Sleep (No Ack bit is mandatory)
1109#define awc_command_Save_Configuration(cmd)	awc_wout( cmd,0x0108,0,0,0) // 	Save the configuration to nonvolatile
1110
1111
1112#define AWC_COMMAND_NOOP_BULL 		0x000
1113#define AWC_COMMAND_ENABLE		0x001
1114#define AWC_COMMAND_ENABLE_MAC		0x101
1115#define AWC_COMMAND_ENABLE_RX		0x201
1116#define AWC_COMMAND_DISABLE		0x002
1117#define AWC_COMMAND_LOSE_SYNC		0x003
1118#define AWC_COMMAND_SOFT_RESET		0x004
1119#define AWC_COMMAND_HOST_SLEEP		0x085
1120#define AWC_COMMAND_MAGIC_PACKET	0x006
1121#define AWC_COMMAND_READ_CONF		0x008
1122#define AWC_COMMAND_SAVE_CONF		0x108
1123#define AWC_COMMAND_TX_ALLOC		0x00A
1124#define AWC_COMMAND_TX			0x00B
1125#define AWC_COMMAND_DEALLOC		0x00C
1126#define AWC_COMMAND_NOOP		0x010
1127#define AWC_COMMAND_READ_RID		0x021
1128#define AWC_COMMAND_WRITE_RID		0x121
1129#define AWC_COMMAND_ALLOC		0x028
1130#define AWC_COMMAND_PSP_NODES		0x030
1131#define AWC_COMMAND_SET_PHY		0x03E
1132#define AWC_COMMAND_TX_TEST		0x03F
1133#define AWC_COMMAND_SLEEP		0x085
1134
1135
1136#define awc_command_name_strings {\
1137	{0x0000, 0x00FF,"awc_command_NOP " },\
1138	{0x0001, 0x00FF,"awc_command_Enable_All " },\
1139	{0x0101, 0x01FF,"awc_command_Enable_MAC " },\
1140	{0x0201, 0x01FF,"awc_command_Enable_Rx " },\
1141	{0x0002, 0x00FF,"awc_command_Disable_MAC " },\
1142	{0x0003, 0x00FF,"awc_command_Sync_Loss " },\
1143	{0x0004, 0x00FF,"awc_command_Soft_Reset " },\
1144	{0x0005, 0x00FF,"awc_command_Host_Sleep " },\
1145	{0x0006, 0x00FF,"awc_command_Magic_Packet " },\
1146	{0x0008, 0x00FF,"awc_command_Read_Configuration " },\
1147	{0x000A, 0x00FF,"awc_command_Allocate_TX_Buff " },\
1148	{0x000B, 0x00FF,"awc_command_TX " },\
1149	{0x000C, 0x00FF,"awc_command_Deallocate " },\
1150	{0x0010, 0x00FF,"awc_command_NOP2 " },\
1151	{0x0021, 0x00FF,"awc_command_Read_RID " },\
1152	{0x0121, 0x01FF,"awc_command_Write_RID " },\
1153	{0x0028, 0x00FF,"awc_command_Allocate_Buff " },\
1154	{0x0030, 0x00FF,"awc_command_PSP_Nodes " },\
1155	{0x003E, 0x00FF,"awc_command_Set_Phy_register " },\
1156	{0x003F, 0x00FF,"awc_command_TX_Test " },\
1157	{0x013F, 0x01FF,"awc_command_RX_Test " },\
1158	{0x0085, 0x00FF,"awc_command_Sleep " },\
1159	{0x0108, 0x01FF,"awc_command_Save_Configuration " },\
1160	{0x0000, 0x00FF, NULL}\
1161};
1162
1163
1164/***************************** STATUSES */
1165
1166#define awc_reply_success 0x0000
1167
1168#define awc_reply_error_strings {\
1169   { 0x0000, 0x00FF,"    Success"},\
1170   { 0x0001, 0x00FF,"    Illegal command."},\
1171   { 0x0002, 0x00FF,"    Illegal format."},\
1172   { 0x0003, 0x00FF,"    Invalid FID."},\
1173   { 0x0004, 0x00FF,"    Invalid RID."},\
1174   { 0x0005, 0x00FF,"    Too Large"},\
1175   { 0x0006, 0x00FF,"    MAC is not disabled."},\
1176   { 0x0007, 0x00FF,"    Alloc is still busy processing previous alloc"},\
1177   { 0x0008, 0x00FF,"    Invalid Mode Field"},\
1178   { 0x0009, 0x00FF,"    Tx is not allowed in monitor mode"},\
1179   { 0x000A, 0x00FF,"    Loop test or memory test error"},\
1180   { 0x000B, 0x00FF,"    Cannot read this RID."},\
1181   { 0x000C, 0x00FF,"    Cannot write to this RID."},\
1182   { 0x000D, 0x00FF,"    Tag not found."},\
1183   { 0x0080, 0x00FF,"    Config mode is invalid."},\
1184   { 0x0081, 0x00FF,"    Config hop interval is invalid."},\
1185   { 0x0082, 0x00FF,"    Config beacon interval is invalid."},\
1186   { 0x0083, 0x00FF,"    Config receive mode is invalid."},\
1187   { 0x0084, 0x00FF,"    Config MAC address is invalid."},\
1188   { 0x0085, 0x00FF,"    Config rates are invalid."},\
1189   { 0x0086, 0x00FF,"    Config ordering field is invalid."},\
1190   { 0x0087, 0x00FF,"    Config scan mode is invalid."},\
1191   { 0x0088, 0x00FF,"    Config authentication type is invalid."},\
1192   { 0x0089, 0x00FF,"    Config power save mode is invalid."},\
1193   { 0x008A, 0x00FF,"    Config radio type is invalid."},\
1194   { 0x008B, 0x00FF,"    Config diversity is invalid."},\
1195   { 0x008C, 0x00FF,"    Config SSID list is invalid."},\
1196   { 0x008D, 0x00FF,"    Config specified AP list is invalid."},\
1197   { 0x0000, 0x00FF, NULL}\
1198};
1199
1200#define awc_reply_command_failed( status) ((status & 0x7F00) == 0x7F)
1201
1202
1203/*************************   PHY and TEST commands   ****************/
1204
1205
1206// this might be wrong and reading is not implemented(was not in spec properly)
1207#define awc_Set_PLCP_Word(PLCP_Word)\
1208	awc_command_Set_Phy_register(base,0x8000,0 ,PLCP_Word)
1209#define awc_Set_TX_Test_Freq(Tx_Test_Freq)\
1210	awc_command_Set_Phy_register(base,0x8002,0 ,Tx_Test_Freq)
1211#define awc_Set_Tx_Power(Tx_Power)\
1212	awc_command_Set_Phy_register(base,0x8004,0 ,Tx_Power)
1213#define awc_Set_RSSI_Treshold(RSSI_Treshold)\
1214	awc_command_Set_Phy_register(base,0x8006,0 ,RSSI_Treshold)
1215#define awc_Get_PLCP_Word(PLCP_Word)\
1216	awc_command_Set_Phy_register(base,0x8000,0 ,0)
1217#define awc_Get_TX_Test_Freq(Tx_Test_Freq)\
1218	awc_command_Set_Phy_register(base,0x8002,0 ,0)
1219#define awc_Get_Tx_Power(Tx_Power)\
1220	awc_command_Set_Phy_register(base,0x8004,0 ,0)
1221#define awc_Get_RSSI_Treshold(RSSI_Treshold)\
1222	awc_command_Set_Phy_register(base,0x8006,0 ,0)
1223
1224
1225#define awc_tx_test_code_end 	0x0000   //  Ends the transmitter test
1226#define awc_tx_test_code_loop	0x0001   //  Loop back to the beginning of the commands
1227#define awc_tx_test_code_start	0x0002   //  Start transmitting
1228#define awc_tx_test_code_stop	0x0003   //  Stop transmitting
1229#define awc_tx_test_code_delayu 0x0004   //  Delay for N usec where N is the next word
1230#define awc_tx_test_code_delayk 0x0005   //  Delay for N Kusec where N is the next word
1231#define awc_tx_test_code_next	0x0006   //  Go to the next frequency in the frequency RID
1232#define awc_tx_test_code_rx	0x0007   //  Start receive mode
1233
1234#define awc_tx_test_code_strings {\
1235{  awc_tx_test_code_end , 	0x000f ,"    Ends the transmitter test"},\
1236{  awc_tx_test_code_loop , 	0x000f ,"     Loop back to the beginning of the commands"},\
1237{  awc_tx_test_code_start , 	0x000f ,"    Start transmitting"},\
1238{  awc_tx_test_code_stop ,	0x000f ,"    Stop transmitting"},\
1239{  awc_tx_test_code_delayu , 	0x000f ,"    Delay for N usec where N is the next word"},\
1240{  awc_tx_test_code_delayk , 	0x000f ,"    Delay for N Kusec where N is the next word"},\
1241{  awc_tx_test_code_next , 	0x000f ,"    Go to the next frequency in the frequency RID"},\
1242{  awc_tx_test_code_rx 	,	0x000f ,"    Start receive mode"},\
1243{ 			0   , 0x000f ,NULL}\
1244};
1245
1246
1247
1248#define AWC_COMMSTAT_HARD_RESET		0x0000001
1249#define AWC_COMMSTAT_WAKE		0x0000002
1250#define AWC_COMMSTAT_SOFT_RESET		0x0000004
1251#define AWC_COMMSTAT_CONFIGURE		0x0000008
1252#define AWC_COMMSTAT_READ_CONF		0x0000010
1253#define AWC_COMMSTAT_SAVE_CONF		0x0000020
1254#define AWC_COMMSTAT_DEALLOC		0x0000040
1255#define AWC_COMMSTAT_ALLOC_TX		0x0000080
1256#define AWC_COMMSTAT_ALLOC_TEST		0x0000100
1257#define AWC_COMMSTAT_ENABLE_MAC		0x0000200
1258#define AWC_COMMSTAT_ENABLE_RX		0x0000400
1259#define AWC_COMMSTAT_DISABLE_MAC	0x0000800
1260#define AWC_COMMSTAT_RX_ACK		0x0001000
1261#define AWC_COMMSTAT_TX_ACK		0x0002000
1262#define AWC_COMMSTAT_AWAKEN_ACK		0x0004000
1263#define AWC_COMMSTAT_TX_FAIL_ACK	0x0008000
1264#define AWC_COMMSTAT_LINK_ACK		0x0010000
1265#define AWC_COMMSTAT_CLR_CMD		0x0020000
1266#define AWC_COMMSTAT_ALLOC_ACK		0x0040000
1267#define AWC_COMMSTAT_HOST_SLEEP		0x0080000
1268#define AWC_COMMSTAT_RX			0x0100000
1269#define AWC_COMMSTAT_TX			0x0200000
1270#define AWC_COMMSTAT_SLEEP		0x0400000
1271#define AWC_COMMSTAT_PSP_NODES		0x0800000
1272#define AWC_COMMSTAT_SET_TX_POWER 	0x1000000
1273
1274
1275/*****************************     R  I  D	***************/
1276
1277#define AWC_NOF_RIDS	18
1278extern int awc_rid_setup(struct net_device * dev);
1279
1280struct aironet4500_rid_selector{
1281	const u16 selector;
1282	const unsigned 	MAC_Disable_at_write:1;
1283	const unsigned	read_only:1;
1284	const unsigned  may_change:1;
1285	const char *	name;
1286};
1287
1288
1289
1290
1291
1292extern const struct aironet4500_rid_selector aironet4500_RID_Select_General_Config;
1293extern const struct aironet4500_rid_selector aironet4500_RID_Select_SSID_list;
1294extern const struct aironet4500_rid_selector aironet4500_RID_Select_AP_list	;
1295extern const struct aironet4500_rid_selector aironet4500_RID_Select_Driver_name;
1296extern const struct aironet4500_rid_selector aironet4500_RID_Select_Encapsulation;
1297extern const struct aironet4500_rid_selector aironet4500_RID_Select_Active_Config;
1298extern const struct aironet4500_rid_selector aironet4500_RID_Select_Capabilities;
1299extern const struct aironet4500_rid_selector aironet4500_RID_Select_AP_Info	;
1300extern const struct aironet4500_rid_selector aironet4500_RID_Select_Radio_Info;
1301extern const struct aironet4500_rid_selector aironet4500_RID_Select_Status	;
1302extern const struct aironet4500_rid_selector aironet4500_RID_Select_Modulation	;
1303extern const struct aironet4500_rid_selector aironet4500_RID_Select_WEP_volatile	;
1304extern const struct aironet4500_rid_selector aironet4500_RID_Select_WEP_nonvolatile	;
1305extern const struct aironet4500_rid_selector aironet4500_RID_Select_16_stats;
1306extern const struct aironet4500_rid_selector aironet4500_RID_Select_16_stats_delta;
1307extern const struct aironet4500_rid_selector aironet4500_RID_Select_16_stats_clear;
1308extern const struct aironet4500_rid_selector aironet4500_RID_Select_32_stats;
1309extern const struct aironet4500_rid_selector aironet4500_RID_Select_32_stats_delta;
1310extern const struct aironet4500_rid_selector aironet4500_RID_Select_32_stats_clear;
1311
1312#define awc_def_gen_RID(offset,name, bits,mask,value,value_name)\
1313 {&aironet4500_RID_Select_General_Config,offset, bits,1,1,0,0, mask, value, name, value_name}
1314#define awc_def_SSID_RID(offset,name, bits,mask,value,value_name)\
1315  {&aironet4500_RID_Select_SSID_list,offset, bits,1,1,0,0, mask, value, name, value_name}
1316#define awc_def_AP_List_RID(offset,name, bits,mask,value,value_name)\
1317 {&aironet4500_RID_Select_AP_list,offset, bits,1,1,0,0, mask, value, name, value_name}
1318#define awc_def_Dname_RID(offset,name, bits,mask,value,value_name)\
1319 {&aironet4500_RID_Select_Driver_name,offset, bits,1,1,0,0, mask, value, name, value_name}
1320#define awc_def_act_RID(offset,name, bits,mask,value,value_name)\
1321 {&aironet4500_RID_Select_Active_Config,offset, bits,1,1,0,0, mask, value, name, value_name}
1322#define awc_def_Cap_RID(offset,name, bits,mask,value,value_name)\
1323 {&aironet4500_RID_Select_Capabilities,offset, bits,1,1,0,0, mask, value, name, value_name}
1324#define awc_def_AP_RID(offset,name, bits,mask,value,value_name)\
1325 {&aironet4500_RID_Select_AP_Info,offset, bits,1,1,0,0, mask, value, name, value_name}
1326#define awc_def_Radio_RID(offset,name, bits,mask,value,value_name)\
1327 {&aironet4500_RID_Select_Radio_Info,offset, bits,1,1,0,0, mask, value, name, value_name}
1328#define awc_def_Stat_RID(offset,name, bits,mask,value,value_name)\
1329 {&aironet4500_RID_Select_Status,offset, bits,1,1,0,0, mask, value, name, value_name}
1330#define awc_def_Enc_RID(offset,name, bits,mask,value,value_name)\
1331 {&aironet4500_RID_Select_Encapsulation,offset, bits,1,1,0,0, mask, value, name, value_name}
1332
1333#define awc_def_WEPv_RID(offset,name, bits,mask,value,value_name)\
1334 {&aironet4500_RID_Select_WEP_volatile,offset, bits,1,1,0,0, mask, value, name, value_name}
1335#define awc_def_WEPnv_RID(offset,name, bits,mask,value,value_name)\
1336 {&aironet4500_RID_Select_WEP_nonvolatile,offset, bits,1,1,0,0, mask, value, name, value_name}
1337#define awc_def_Modulation_RID(offset,name, bits,mask,value,value_name)\
1338 {&aironet4500_RID_Select_Modulation,offset, bits,1,1,0,0, mask, value, name, value_name}
1339
1340#define awc_def_Stats_RID(o16,offset,name, value_name)\
1341 {&aironet4500_RID_Select_32_stats,offset, 32,1,1,0,0, 0xffffffff, 0, name, value_name}
1342#define awc_def_Stats_delta_RID(o16,offset,name, value_name)\
1343 {&aironet4500_RID_Select_32_stats_delta,offset, 32,1,1,0,0, 0xffffffff, 0, name, value_name}
1344#define awc_def_Stats_clear_RID(o16,offset,name, value_name)\
1345 {&aironet4500_RID_Select_32_stats_delta,offset,32,1,1,0,0, 0xffffffff,  0, name,value_name}
1346
1347#define awc_def_Stats16_RID(offset,o32,name, value_name)\
1348 {&aironet4500_RID_Select_16_stats,offset, 16,1,1,0,0, 0xffffffff, 0, name, value_name}
1349#define awc_def_Stats16_delta_RID(offset,o32,name, value_name)\
1350 {&aironet4500_RID_Select_16_stats_delta,offset, 16,1,1,0,0, 0xffffffff,  0, name,value_name}
1351#define awc_def_Stats16_clear_RID(offset,o32,name, value_name)\
1352 {&aironet4500_RID_Select_16_stats_delta,offset, 16,1,1,0,0, 0xffffffff,  0, name,value_name}
1353
1354
1355#define aironet4500_RID_Select_strings {\
1356{ 0xFF10, 0xffff, "General Configuration"},\
1357{ 0xFF11, 0xffff, "Valid SSID list" },\
1358{ 0xFF12, 0xffff, "Valid AP list"},\
1359{ 0xFF13, 0xffff, "Driver name"},\
1360{ 0xFF14, 0xffff, "Ethernet Protocol"},\
1361{ 0xFF15, 0xffff, "WEP volatile"},\
1362{ 0xFF16, 0xffff, "WEP nonvolatile"},\
1363{ 0xFF17, 0xffff, "Modulation"},\
1364{ 0xFF20, 0xffff, "Actual Configuration"},\
1365{ 0xFF00, 0xffff, "Capabilities"},\
1366{ 0xFF01, 0xffff, "AP Info"},\
1367{ 0xFF02, 0xffff, "Radio Info"},\
1368{ 0xFF50, 0xffff, "Status"},\
1369{ 0xFF60, 0xffff, "Cumulative 16-bit Statistics"},\
1370{ 0xFF61, 0xffff, "Delta 16-bit Statistics"},\
1371{ 0xFF62, 0xffff, "Delta 16-bit Statistics and Clear"},\
1372{ 0xFF68, 0xffff, "Cumulative 32-bit Statistics"},\
1373{ 0xFF69, 0xffff, "Delta 32-bit Statistics "},\
1374{ 0xFF6A, 0xffff, "Delta 32-bit Statistics and Clear"},\
1375{ 0x0000, 0xffff, NULL}\
1376}
1377
1378
1379
1380
1381
1382struct aironet4500_RID {
1383	const struct aironet4500_rid_selector	*  selector;
1384	const u32 	offset;
1385	const u8 	bits;
1386	const u8 	array;
1387	const u32 	units;
1388	const unsigned read_only:1;
1389	const unsigned null_terminated:1;
1390	const u32 	mask;
1391	const u32 	value;
1392	const char * name;
1393	const char * value_name;
1394
1395};
1396
1397struct aironet4500_RID_names{
1398	struct aironet4500_RID rid;
1399	char *name;
1400};
1401
1402struct aironet4500_RID_names_values{
1403	struct aironet4500_RID rid;
1404	char *name;
1405	u32	mask;
1406};
1407
1408struct awc_rid_dir{
1409	const struct aironet4500_rid_selector *	selector;
1410	const int size;
1411	const struct aironet4500_RID * rids;
1412	struct net_device * dev ;
1413	void * 	buff;
1414	int	bufflen; // just checking
1415};
1416
1417extern int awc_nof_rids;
1418extern struct awc_rid_dir  awc_rids[];
1419
1420
1421
1422
1423
1424struct awc_private {
1425	dev_node_t node; // somewhere back in times PCMCIA needed that
1426
1427	int dummy_test; // left for cleanup
1428	// card rid inmemory copy
1429	struct awc_config 		config; // card RID mirrors
1430	struct awc_config 		general_config; //
1431	struct awc_SSIDs  		SSIDs;
1432	struct awc_fixed_APs 		fixed_APs;
1433	struct awc_driver_name		driver_name;
1434	struct awc_enc_trans		enc_trans;
1435	struct awc_cap			capabilities;
1436	struct awc_status		status;
1437	struct awc_AP			AP;
1438	struct awc_Statistics_32 	statistics;
1439	struct awc_Statistics_32 	statistics_delta;
1440	struct awc_Statistics_32 	statistics_delta_clear;
1441	struct awc_Statistics_16 	statistics16;
1442	struct awc_Statistics_16 	statistics16_delta;
1443	struct awc_Statistics_16 	statistics16_delta_clear;
1444	struct awc_wep_key		wep_volatile;
1445	struct awc_wep_key		wep_nonvolatile;
1446	struct awc_modulation		modulation;
1447
1448	// here are just references to rids
1449	struct awc_rid_dir		rid_dir[AWC_NOF_RIDS];
1450	int	rids_read;
1451
1452
1453	struct awc_bap		bap0;
1454	struct awc_bap		bap1;
1455	int			sleeping_bap;
1456
1457	struct awc_fid_queue    tx_small_ready;
1458	struct awc_fid_queue    tx_large_ready;
1459	struct awc_fid_queue    tx_post_process;
1460	struct awc_fid_queue    tx_in_transmit;
1461	spinlock_t		queues_lock;
1462
1463	struct awc_fid_queue    rx_ready;
1464	struct awc_fid_queue    rx_post_process;
1465
1466
1467
1468	struct semaphore	tx_buff_semaphore;
1469	volatile int		tx_buffs_in_use;
1470	volatile int 		tx_small_buffs_in_use;
1471	volatile int		tx_buffs_total;
1472	volatile int		tx_small_buffs_total;
1473	int			large_buff_mem;
1474	int			small_buff_no;
1475
1476	volatile int		mac_enabled;
1477	u16			link_status;
1478	u8			link_status_changed;
1479
1480	volatile int		ejected;
1481	volatile int		bh_running;
1482	volatile int		bh_active;
1483	volatile long		tx_chain_active;
1484	volatile u16		enabled_interrupts;
1485	volatile u16		waiting_interrupts;
1486	volatile int		interrupt_count;
1487
1488	// Command serialize stuff
1489//changed to spinlock        struct semaphore 	command_semaphore;
1490	spinlock_t		both_bap_spinlock; // on SMP, card should theorethically live without that
1491	unsigned long		both_bap_spinlock_flags;
1492	spinlock_t		bap_setup_spinlock; // on SMP, card should theoretically live without that
1493	unsigned long		bap_setup_spinlock_flags;
1494	spinlock_t		command_issuing_spinlock;
1495	unsigned long		command_issuing_spinlock_flags;
1496	spinlock_t		interrupt_spinlock;
1497
1498        volatile int		unlock_command_postponed;
1499        struct awc_command	cmd;
1500        long long		async_command_start;
1501        volatile int		command_semaphore_on;
1502        struct tq_struct 	immediate_bh;
1503	volatile int		process_tx_results;
1504
1505	u8			p2p[6];
1506	u8			bssid[6];
1507	int			p2p_uc;
1508	int			p2p_found;
1509	int			p802_11_send;
1510	int			simple_bridge;
1511	int			force_rts_on_shorter;
1512	int			force_tx_rate;
1513	int			ip_tos_reliability_rts;
1514	int			ip_tos_troughput_no_retries;
1515	int 			full_stats;
1516	int 			debug;
1517
1518	struct net_device_stats stats;
1519
1520	struct ctl_table * proc_table;
1521
1522	void	* 		bus;
1523	int 			card_type;
1524};
1525
1526extern int 		awc_init(struct net_device * dev);
1527extern void 		awc_reset(struct net_device *dev);
1528extern int 		awc_config(struct net_device *dev);
1529extern int 		awc_open(struct net_device *dev);
1530extern void 		awc_tx_timeout(struct net_device *dev);
1531extern int 		awc_start_xmit(struct sk_buff *, struct net_device *);
1532extern void 		awc_interrupt(int irq, void *dev_id, struct pt_regs *regs);
1533extern struct net_device_stats *	awc_get_stats(struct net_device *dev);
1534extern void		awc_set_multicast_list(struct net_device *dev);
1535extern int awc_change_mtu(struct net_device *dev, int new_mtu);
1536extern int 		awc_close(struct net_device *dev);
1537extern int		awc_private_init(struct net_device * dev);
1538extern int awc_register_proc(int (*awc_proc_set_device) (int),int (*awc_proc_unset_device)(int));
1539extern int awc_unregister_proc(void);
1540extern int (* awc_proc_set_fun) (int) ;
1541extern int (* awc_proc_unset_fun) (int) ;
1542extern int	awc_interrupt_process(struct net_device * dev);
1543extern int	awc_readrid(struct net_device * dev, struct aironet4500_RID * rid, void *pBuf );
1544extern int 	awc_writerid(struct net_device * dev, struct aironet4500_RID * rid, void *pBuf);
1545extern int 	awc_readrid_dir(struct net_device * dev, struct awc_rid_dir * rid );
1546extern int 	awc_writerid_dir(struct net_device * dev, struct awc_rid_dir * rid);
1547extern int 	awc_tx_alloc(struct net_device * dev) ;
1548extern int	awc_tx_dealloc(struct net_device * dev);
1549extern struct awc_fid *awc_tx_fid_lookup(struct net_device * dev, u16 fid);
1550extern int 	awc_issue_soft_reset(struct net_device * dev);
1551extern int	awc_issue_noop(struct net_device * dev);
1552extern int 	awc_dump_registers(struct net_device * dev);
1553extern unsigned short  awc_issue_command_and_block(struct awc_command * cmd);
1554extern int	awc_enable_MAC(struct net_device * dev);
1555extern int	awc_disable_MAC(struct net_device * dev);
1556extern int	awc_read_all_rids(struct net_device * dev);
1557extern int	awc_write_all_rids(struct net_device * dev);
1558extern int	awc_receive_packet(struct net_device * dev);
1559extern int	awc_transmit_packet(struct net_device * dev, struct awc_fid * tx_buff) ;
1560extern int	awc_tx_complete_check(struct net_device * dev);
1561extern int	awc_interrupt_process(struct net_device * dev);
1562extern void 	awc_bh(struct net_device *dev);
1563extern int 	awc_802_11_find_copy_path(struct net_device * dev, struct awc_fid * rx_buff);
1564extern void 	awc_802_11_router_rx(struct net_device * dev,struct awc_fid * rx_buff);
1565extern int 	awc_802_11_tx_find_path_and_post(struct net_device * dev, struct sk_buff * skb);
1566extern void 	awc_802_11_after_tx_packet_to_card_write(struct net_device * dev, struct awc_fid * tx_buff);
1567extern void 	awc_802_11_after_failed_tx_packet_to_card_write(struct net_device * dev,struct awc_fid * tx_buff);
1568extern void 	awc_802_11_after_tx_complete(struct net_device * dev, struct awc_fid * tx_buff);
1569extern void 	awc_802_11_failed_rx_copy(struct net_device * dev,struct awc_fid * rx_buff);
1570extern int 	awc_tx_alloc(struct net_device * dev) ;
1571extern int 	awc_tx_dealloc_fid(struct net_device * dev,struct awc_fid * fid);
1572extern int	awc_tx_dealloc(struct net_device * dev);
1573extern struct awc_fid *
1574	awc_tx_fid_lookup_and_remove(struct net_device * dev, u16 fid_handle);
1575extern int 	awc_queues_init(struct net_device * dev);
1576extern int 	awc_queues_destroy(struct net_device * dev);
1577extern int 	awc_rids_setup(struct net_device * dev);
1578
1579
1580
1581extern int		awc_debug;
1582extern int bap_sleep ;
1583extern int bap_sleep_after_setup ;
1584extern int sleep_before_command  ;
1585extern int bap_sleep_before_write;
1586extern int sleep_in_command    ;
1587extern int both_bap_lock;
1588extern int bap_setup_spinlock;
1589extern int tx_queue_len ;
1590extern int tx_rate;
1591extern int awc_full_stats;
1592
1593#define MAX_AWCS	4
1594extern struct net_device * aironet4500_devices[MAX_AWCS];
1595
1596#define AWC_DEBUG 1
1597
1598#ifdef AWC_DEBUG
1599	#define DEBUG(a,args...) if (awc_debug & a) printk( args)
1600	#define AWC_ENTRY_EXIT_DEBUG(a)  if (awc_debug & 8) printk( a)
1601#else
1602	#define DEBUG(a, args...)
1603	#define AWC_ENTRY_EXIT_DEBUG(a)
1604#endif
1605
1606#endif /* AIRONET4500_H */
1607