patch-2.3.31 linux/drivers/net/aironet4500.h

Next file: linux/drivers/net/aironet4500_card.c
Previous file: linux/drivers/net/Makefile
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.3.30/linux/drivers/net/aironet4500.h linux/drivers/net/aironet4500.h
@@ -0,0 +1,1638 @@
+/*
+ *	 Aironet 4500 Pcmcia driver
+ *
+ *		Elmer Joandi, Januar 1999
+ *	Copyright Elmer Joandi, all rights restricted
+ *	
+ *
+ *	Revision 0.1 ,started  30.12.1998
+ *
+ *
+ */
+ 
+
+#ifndef AIRONET4500_H
+#define	AIRONET4500_H
+// redefined to avoid PCMCIA includes
+
+#include <linux/version.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+
+#if (LINUX_VERSION_CODE < 0x2030e)
+#define NET_DEVICE device 
+#else 
+#define NET_DEVICE net_device
+#endif                         
+
+#if LINUX_VERSION_CODE < 0x20300
+#define init_MUTEX(a)  *(a) = MUTEX;
+#endif
+
+#include <linux/types.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/delay.h>
+#include <linux/time.h>
+#include <linux/802_11.h>
+
+//damn idiot PCMCIA stuff
+#ifndef DEV_NAME_LEN
+	#define DEV_NAME_LEN 32
+#endif
+
+struct pcmcia_junkdev_node_t {
+    char		dev_name[DEV_NAME_LEN];
+    u_short		major, minor;
+    struct dev_node_t	*next;
+};
+
+#ifndef CS_RELEASE
+typedef struct pcmcia_junkdev_node_t dev_node_t;
+#endif
+
+
+
+#if LINUX_VERSION_CODE <= 0x20100
+
+typedef struct  { volatile int lock ;} my_spinlock_t;
+
+#define my_spin_lock_irqsave(a,b) {\
+	save_flags(b);\
+	cli();\
+	(a)->lock++;while(0);\
+	if ((a)->lock != 1 )\
+		printk("awc_spinlock high at locking \n");\
+}
+
+#define my_spin_unlock_irqrestore(a,b) {\
+	cli(); (a)->lock--;while(0);\
+	if ((a)->lock != 0 )\
+		printk("awc_spinlock !=0  at unlocking \n");\
+	restore_flags(b);\
+}
+	
+
+#else
+#if LINUX_VERSION_CODE < 0x20300
+#include <asm/spinlock.h>
+#else
+#include <linux/spinlock.h>
+#endif
+#ifndef __SMP__ 
+// #warning non-SMP 2.2 kernel
+#endif
+typedef spinlock_t 			my_spinlock_t	;
+#define my_spin_lock_irqsave(a,b) 	spin_lock_irqsave(a,b)
+#define my_spin_unlock_irqrestore(a,b) 	spin_unlock_irqrestore(a,b)
+
+#endif //kernel version
+
+
+#if LINUX_VERSION_CODE <= 0x20100
+#define in_interrupt() intr_count
+#endif
+
+
+#define AWC_ERROR	-1
+#define AWC_SUCCESS	0
+
+struct awc_cis {
+	unsigned char cis[0x301];
+	unsigned char unknown302[0xdf];
+	unsigned short configuration_register;
+	unsigned short pin_replacement_register;
+	unsigned short socket_and_copy_register;
+
+};
+
+
+
+/***************************  REGISTER OFFSETS *********************/
+#define awc_Command_register 		0x00
+#define awc_Param0_register 		0x02
+#define awc_Param1_register 		0x04
+#define awc_Param2_register 		0x06
+#define awc_Status_register 		0x08
+#define awc_Resp0_register 		0x0A
+#define awc_Resp1_register 		0x0C
+#define awc_Resp2_register 		0x0E
+#define awc_EvStat_register 		0x30
+#define awc_EvIntEn_register 		0x32
+#define awc_EvAck_register 		0x34
+#define awc_SWSupport0_register 	0x28
+#define awc_SWSupport1_register 	0x2A
+#define awc_SWSupport2_register 	0x2C
+#define awc_SWSupport3_register 	0x2E
+#define awc_LinkStatus_register 	0x10
+// Memory access  RID FID
+#define awc_Select0_register 		0x18
+#define awc_Offset0_register 		0x1C
+#define awc_Data0_register 		0x36
+#define awc_Select1_register 		0x1A
+#define awc_Offset1_register 		0x1E
+#define awc_Data1_register 		0x38
+//
+#define awc_RxFID_register 		0x20
+#define awc_TxAllocFID_register 	0x22
+#define awc_TxComplFID_register 	0x24
+#define awc_AuxPage_register 		0x3A
+#define awc_AuxOffset_register 		0x3C
+#define awc_AuxData_register 		0x3E
+
+
+struct awc_bap {
+	u16 select;
+	u16 offset;
+	u16 data;
+	volatile int lock;
+	volatile int	status;
+	struct semaphore sem;
+	my_spinlock_t spinlock;
+	unsigned long flags;
+};
+
+
+
+#define AWC_COMMAND_STATE_WAIT_CMD_BUSY		1
+#define AWC_COMMAND_STATE_WAIT_CMD_ACK		2
+#define AWC_COMMAND_STATE_WAIT_BAP_BUSY		3
+#define AWC_COMMAND_STATE_BAP_NOT_SET		4
+#define AWC_COMMAND_STATE_BAP_SET		5
+
+struct awc_command {
+	volatile int		state;
+	volatile int		lock_state;
+	struct NET_DEVICE *		dev;
+	struct awc_private *	priv;
+	u16			port;
+	struct awc_bap * 	bap;
+	u16			command;
+	u16			par0;
+	u16			par1;
+	u16			par2;
+	u16			status;
+	u16			resp0;
+	u16			resp1;
+	u16			resp2;
+	u16			rid;
+	u16			offset;
+	u16			len;
+	void *			buff;
+
+};
+
+
+
+
+#define DOWN(a) down_interruptible( a ) ; 
+//	if (in_interrupt()) { down_interruptible( a ) ; } else printk("semaphore DOWN in interrupt tried \n");
+#define UP(a)   up( a ) ;
+//	if (in_interrupt()) {up( a ) ; } else printk("semaphore UP in interrupt tried \n");
+
+/*	if (!in_interrupt())\
+	printk("bap lock under cli but not in int\n");\
+*/
+#define AWC_BAP_LOCK_UNDER_CLI_REAL(cmd) \
+ 	if (!cmd.priv) {\
+		printk(KERN_CRIT "awc4500: no priv present in command !");\
+	}\
+	cmd.bap = &(cmd.priv->bap1);\
+	if (cmd.bap){\
+		my_spin_lock_irqsave(&(cmd.bap->spinlock),cmd.bap->flags);\
+		cmd.bap->lock++;\
+		if (cmd.bap->lock > 1)\
+			printk("Bap 1 lock high\n");\
+		cmd.lock_state |= AWC_BAP_LOCKED;\
+	}
+
+#define AWC_BAP_LOCK_NOT_CLI_REAL(cmd) {\
+	if (in_interrupt())\
+	printk("bap lock not cli in int\n");\
+ 	if (!cmd.priv) {\
+		printk(KERN_CRIT "awc4500: no priv present in command,lockup follows !");\
+	}\
+	cmd.bap = &(cmd.priv->bap0);\
+	my_spin_lock_irqsave(&(cmd.bap->spinlock),cmd.bap->flags);\
+	DOWN(&(cmd.priv->bap0.sem));\
+	cmd.bap->lock++;\
+	if (cmd.bap->lock > 1)\
+		printk("Bap 0 lock high\n");\
+	cmd.lock_state |= AWC_BAP_SEMALOCKED;\
+}
+
+#define AWC_BAP_LOCK_NOT_CLI_CLI_REAL(cmd) {\
+	cmd.bap = &(cmd.priv->bap0);\
+	my_spin_lock_irqsave(&(cmd.bap->spinlock),cmd.bap->flags);\
+	cmd.bap->lock++;\
+	if (cmd.bap->lock > 1)\
+		printk("Bap 0 lock high\n");\
+	cmd.lock_state |= AWC_BAP_LOCKED;\
+}
+
+#define BAP_LOCK_ANY(cmd)\
+	if (in_interrupt())	AWC_BAP_LOCK_NOT_CLI_CLI_REAL(cmd)\
+	else AWC_BAP_LOCK_NOT_CLI_REAL(cmd)
+	
+#define AWC_BAP_LOCK_NOT_CLI(cmd)	BAP_LOCK_ANY(cmd)
+#define AWC_BAP_LOCK_UNDER_CLI(cmd)	AWC_BAP_LOCK_UNDER_CLI_REAL(cmd)
+/*
+	if (!cmd.priv->bap1.lock ) {BAP_LOCK_ANY(cmd);}\
+	else AWC_BAP_LOCK_NOT_CLI_CLI_REAL(cmd);
+*/	
+#define AWC_BAP_LOCKED 		0x01
+#define AWC_BAP_SEMALOCKED 	0x02
+
+#define AWC_BAP_BUSY	0x8000
+#define AWC_BAP_ERR	0x4000
+#define AWC_BAP_DONE	0x2000
+
+#define AWC_CLI		1
+#define AWC_NOT_CLI 	2
+
+/*#define WAIT61x3	inb(0x61);\
+         		inb(0x61);\
+                    	inb(0x61);
+*/ 
+#define WAIT61x3 	udelay(bap_sleep)                  	
+
+#define AWC_INIT_COMMAND(context, a_com, a_dev,a_cmmand,a_pr0, a_rid, a_offset, a_len, a_buff) {\
+	memset(&a_com,0,sizeof(a_com) );\
+	a_com.dev = a_dev;\
+	a_com.priv = a_dev->priv;\
+	a_com.port = a_dev->base_addr;\
+	a_com.bap = NULL;\
+	a_com.command = a_cmmand;\
+	a_com.par0 = a_pr0;\
+	a_com.rid = a_rid;\
+	a_com.offset = a_offset;\
+	a_com.len = a_len;\
+	a_com.buff = a_buff;\
+	a_com.lock_state = 0;\
+};
+
+/* väga veider asi järgnevast 
+ makrost välja jäetud	if (cmd.bap) AWC_IN((cmd.bap)->data);\
+*/
+
+#define AWC_BAP_UNLOCK(com) { \
+	if (com.bap){ \
+		if ( (com.lock_state & AWC_BAP_SEMALOCKED) &&\
+		     (com.lock_state & AWC_BAP_LOCKED) ){\
+		     	printk("Both Sema and simple lock \n");\
+		}\
+		if ( com.lock_state & AWC_BAP_SEMALOCKED ){\
+			 com.bap->lock--; \
+			 com.lock_state &= ~AWC_BAP_SEMALOCKED;\
+			 UP(&(com.bap->sem)); \
+			 my_spin_unlock_irqrestore(&(cmd.bap->spinlock),cmd.bap->flags);\
+		} else if (com.lock_state & AWC_BAP_LOCKED){\
+			 com.bap->lock--; \
+			 com.lock_state &= ~AWC_BAP_LOCKED;\
+			 my_spin_unlock_irqrestore(&(cmd.bap->spinlock),cmd.bap->flags);\
+		}\
+	}\
+}
+
+#define AWC_RELEASE_COMMAND(com) {\
+		AWC_BAP_UNLOCK(cmd);\
+	}
+
+
+
+#define awc_manufacturer_code 	0x015F
+#define awc_product_code	0x0005
+
+
+#define awc_write(base,register,u16value) outw(u16value, (base)+(register))
+#define awc_read(base,register)           inw((base)+(register))
+#define AWC_OUT(base,val)		outw(val, base)
+#define AWC_IN(base)			inw(base)
+
+
+#define awc_read_response(cmd)	{	\
+	cmd->status=awc_read(cmd->port,awc_Status_register);\
+	cmd->resp0=awc_read(cmd->port,awc_Resp0_register);\
+	cmd->resp1=awc_read(cmd->port,awc_Resp1_register);\
+	cmd->resp2=awc_read(cmd->port,awc_Resp2_register);\
+};
+
+#define awc_command_busy(base)		(awc_read(base,awc_Command_register) & 0x8000)
+#define awc_command_read(base)		awc_read(base,awc_Command_register)
+#define awc_command_write(base,cmd)	awc_write(base,awc_Command_register,cmd) 
+#define awc_event_status_Awake(base)	(awc_read(base,awc_EvStat_register) & 0x0100)
+#define awc_event_status_Link(base)	(awc_read(base,awc_EvStat_register) & 0x0080)
+#define awc_event_status_Cmd(base)	(awc_read(base,awc_EvStat_register) & 0x0010)
+#define awc_event_status_Alloc(base)	(awc_read(base,awc_EvStat_register) & 0x0008)
+#define awc_event_status_TxExc(base)	(awc_read(base,awc_EvStat_register) & 0x0004)
+#define awc_event_status_Tx(base)	(awc_read(base,awc_EvStat_register) & 0x0002)
+#define awc_event_status_TxResp(base)	(awc_read(base,awc_EvStat_register) & 0x0006)
+#define awc_event_status_Rx(base)	(awc_read(base,awc_EvStat_register) & 0x0001)
+#define awc_event_status(base)		(awc_read(base,awc_EvStat_register))
+
+#define awc_Link_Status(base)		awc_read(base,awc_LinkStatus_register)
+
+#define awc_Rx_Fid(base)		awc_read(base,awc_RxFID_register)
+#define awc_Tx_Allocated_Fid(base)	awc_read(base,awc_TxAllocFID_register)
+#define awc_Tx_Compl_Fid(base)		awc_read(base,awc_TxComplFID_register)
+
+#define awc_event_ack_ClrStckCmdBsy(base) awc_write(base,awc_EvAck_register, 0x4000)
+#define awc_event_ack_WakeUp(base)	awc_write(base,awc_EvAck_register, 0x2000)
+#define awc_event_ack_Awaken(base)	awc_write(base,awc_EvAck_register, 0x0100)
+#define awc_event_ack_Link(base)	awc_write(base,awc_EvAck_register, 0x0080)
+#define awc_event_ack_Cmd(base)		awc_write(base,awc_EvAck_register, 0x0010)
+#define awc_event_ack_Alloc(base)	awc_write(base,awc_EvAck_register, 0x0008)
+#define awc_event_ack_TxExc(base)	awc_write(base,awc_EvAck_register, 0x0004)
+#define awc_event_ack_Tx(base)		awc_write(base,awc_EvAck_register, 0x0002)
+#define awc_event_ack_Rx(base)		awc_write(base,awc_EvAck_register, 0x0001)
+
+#define awc_event_ack(base,ints)	awc_write(base,awc_EvAck_register,ints)
+
+#define awc_ints_enabled(base)		(awc_read(base,awc_EvIntEn_register))
+#define awc_ints_enable(base,ints)	awc_write(base,awc_EvIntEn_register,ints)
+
+
+
+/************************  	RX TX 	BUFF	************************/
+
+
+struct aironet4500_radio_rx_header {
+	u32	RxTime;
+	u16	Status;
+	u16	PayloadLength;
+	u8	Reserved0;
+	u8	RSSI;
+	u8	Rate;
+	u8	Frequency;
+	u8	Rx_association_count;
+	u8 	Reserved1[3];
+	u8	PLCP_header[4];
+
+};
+
+
+struct aironet4500_radio_tx_header {
+	u32	SWSupport;
+	u16	Status;
+	#define aironet4500_tx_status_max_retries	0x0002
+	#define aironet4500_tx_status_lifetime_exceeded	0x0004
+	#define aironet4500_tx_status_AID_failure	0x0008
+	#define aironet4500_tx_status_MAC_disabled	0x0010
+	#define aironet4500_tx_status_association_lost	0x0020
+	u16	PayloadLength;
+	u16	TX_Control;
+	#define aironet4500_tx_control_tx_ok_event_enable 	0x0002
+	#define aironet4500_tx_control_tx_fail_event_enable 	0x0004
+	#define aironet4500_tx_control_header_type_802_11 	0x0008
+	#define aironet4500_tx_control_payload_type_llc 	0x0010
+	#define aironet4500_tx_control_no_release 		0x0020
+	#define aironet4500_tx_control_reuse_fid \
+		(aironet4500_tx_control_tx_ok_event_enable |\
+		 aironet4500_tx_control_tx_fail_event_enable |\
+		  aironet4500_tx_control_no_release)
+	#define aironet4500_tx_control_no_retries 		0x0040
+	#define aironet4500_tx_control_clear_AID 		0x0080
+	#define aironet4500_tx_control_strict_order 		0x0100
+	#define aironet4500_tx_control_use_rts 			0x0200
+	u16	AID;
+	u8	Tx_Long_Retry;
+	u8	Tx_Short_Retry;
+	u8	tx_association_count;
+	u8	tx_bit_rate;
+	#define	aironet4500_tx_bit_rate_automatic 0
+	#define aironet4500_tx_bit_rate_500kbps	1
+	#define aironet4500_tx_bit_rate_1Mbps	2
+	#define aironet4500_tx_bit_rate_2Mbps	4
+	u8	Max_Long_Retry;
+	u8	Max_Short_Retry;
+	u8	Reserved0[2];
+};
+
+
+struct aironet4500_rx_fid {
+
+	u16						rid;
+	struct aironet4500_radio_rx_header 		radio_rx;
+	struct ieee_802_11_header 	   		ieee_802_11;
+	u16 						gap_length;
+	struct ieee_802_3_header	   		ieee_802_3;
+	u8					*	payload;
+};
+
+
+struct aironet4500_tx_fid {
+
+	u16						fid;
+	u16						fid_size;
+	struct aironet4500_radio_tx_header 		radio_tx;
+	struct ieee_802_11_header 	   		ieee_802_11;
+	u16 						gap_length;
+	#define aironet4500_gap_len_without_802_3	6
+	#define aironet4500_gap_len_with_802_3		0
+	struct ieee_802_3_header	   		ieee_802_3;
+	u8					*	payload;	
+};
+
+struct awc_fid {
+
+	u32	type;
+	#define p80211_llc_snap		0x0100
+	#define p80211_8021H		0x0200
+	#define p80211_8022		0x0400
+	#define p80211_8023		0x0800
+	#define p80211_snap_8021H	0x1000
+	#define p80211copy_path_skb	0x2000
+
+	u8	priority;
+	u8	busy;
+	
+	#define awc_tx_fid_complete_read 0x01
+	u16	state;
+	union {
+		struct aironet4500_tx_fid tx;
+		struct aironet4500_rx_fid rx;	
+	} u;
+	
+	struct ieee_802_11_snap_header snap;
+	struct ieee_802_11_802_1H_header bridge;
+	u16			bridge_size;
+	struct ieee_802_11_802_2_header p8022;
+
+	u16			pkt_len;
+	u8	* mac;
+	struct sk_buff *	skb;
+	long long		transmit_start_time;
+	struct awc_fid	*	next;
+	struct awc_fid	*	prev;
+	
+};
+
+
+
+struct awc_fid_queue {
+
+
+	struct awc_fid * head;
+	struct awc_fid * tail;
+	int	size;
+	my_spinlock_t lock;
+};
+
+
+extern inline void
+awc_fid_queue_init(struct awc_fid_queue * queue){
+
+	unsigned long flags;
+#ifdef __SMP__
+	queue->lock.lock = 0;	
+#endif
+	memset(queue,0, sizeof(struct awc_fid_queue));	
+	
+	my_spin_lock_irqsave(&queue->lock,flags);
+	queue->head = NULL;
+	queue->tail = NULL;
+	queue->size = 0;
+	my_spin_unlock_irqrestore(&queue->lock,flags);	
+};
+
+extern inline void
+awc_fid_queue_push_tail(	struct awc_fid_queue * 	queue,
+				struct awc_fid *	fid){
+
+	unsigned long flags;
+
+	my_spin_lock_irqsave(&queue->lock,flags);	
+	
+	fid->prev = queue->tail;
+	fid->next = NULL;
+	
+	if (queue->tail){
+		queue->tail->next = fid;
+	} 	
+	queue->tail  = fid;
+	
+	if (!queue->head)
+		queue->head = fid;
+	queue->size++;
+
+	my_spin_unlock_irqrestore(&queue->lock,flags);
+		
+};
+
+
+extern inline void
+awc_fid_queue_push_head(	struct awc_fid_queue * 	queue,
+				struct awc_fid *	fid){
+
+	unsigned long flags;
+
+	my_spin_lock_irqsave(&queue->lock,flags);	
+	
+	fid->prev = NULL;
+	fid->next = queue->head;
+	
+	if (queue->head){
+		queue->head->prev = fid;
+	} 	
+	queue->head  = fid;
+	
+	if (!queue->tail)
+		queue->tail = fid;
+	queue->size++;
+	
+	
+	my_spin_unlock_irqrestore(&queue->lock,flags);
+	
+};
+
+
+
+extern inline void
+awc_fid_queue_rm(		struct awc_fid_queue * 	queue,
+				struct awc_fid *	fid){
+
+
+	if (fid->prev) {
+		fid->prev->next = fid->next;
+	};
+
+	if (fid->next) {
+		fid->next->prev = fid->prev;
+	};
+	
+	if (fid == queue->tail) {
+		queue->tail = fid->prev;
+	};
+	if (fid == queue->head) {
+		queue->head = fid->next;
+	};
+	fid->next = NULL;
+	fid->prev = NULL;
+	queue->size--;
+	if (queue->size ==0 ){
+		queue->tail = NULL;
+		queue->head = NULL;
+	}		
+};
+
+extern inline void
+awc_fid_queue_remove(		struct awc_fid_queue * 	queue,
+				struct awc_fid *	fid){
+	unsigned long flags;
+	my_spin_lock_irqsave(&queue->lock,flags);	
+	
+	awc_fid_queue_rm(queue,fid);
+	
+	my_spin_unlock_irqrestore(&queue->lock,flags);
+	
+};
+
+
+
+extern inline struct awc_fid * 
+awc_fid_queue_pop_head(		struct awc_fid_queue * 	queue){
+
+	unsigned long flags;
+	struct awc_fid * fid;
+	
+	my_spin_lock_irqsave(&queue->lock,flags);	
+
+	fid = queue->head;
+	if (fid)
+		awc_fid_queue_rm(queue,fid);
+		
+	
+	my_spin_unlock_irqrestore(&queue->lock,flags);
+	
+	return fid;
+};
+
+
+
+
+extern inline struct awc_fid * 
+awc_fid_queue_pop_tail(		struct awc_fid_queue * 	queue){
+
+	unsigned long flags;
+	struct awc_fid * fid;
+	
+	my_spin_lock_irqsave(&queue->lock,flags);	
+
+	fid = queue->tail;
+	if (fid)
+			awc_fid_queue_rm(queue,fid);
+	
+	my_spin_unlock_irqrestore(&queue->lock,flags);
+	
+	return fid;
+};
+
+
+
+#define AWC_TX_HEAD_SIZE		0x44
+#define AWC_TX_ALLOC_SMALL_SIZE 	150
+#define AWC_RX_BUFFS			50
+
+
+/*****************************     	RID & CONFIG 	***********************/
+
+struct awc_config{
+    unsigned short    Len;                                /* sizeof(PC4500_CONFIG) */
+    unsigned short    OperatingMode;                      /* operating mode        */
+
+    #define           MODE_STA_IBSS                0
+    #define           MODE_STA_ESS                 1
+    #define           MODE_AP                      2
+    #define           MODE_AP_RPTR                 3
+    #define           MODE_ETHERNET_HOST           (0<<8)    /* rx payloads converted */
+    #define           MODE_LLC_HOST                (1<<8)    /* rx payloads left as is */
+    #define           MODE_AIRONET_EXTEND          (1<<9)    /* enable Aironet extenstions */
+    #define           MODE_AP_INTERFACE            (1<<10) /* enable ap interface extensions */
+    unsigned short    ReceiveMode;                        /* receive mode */
+    #define           RXMODE_BC_MC_ADDR            0
+    #define           RXMODE_BC_ADDR               1         /* ignore multicasts */
+    #define           RXMODE_ADDR                  2         /* ignore multicast and broadcast */
+    #define           RXMODE_RFMON                 3         /* wireless monitor mode */
+    #define           RXMODE_RFMON_ANYBSS 4
+    #define           RXMODE_LANMON                5         /* lan style monitor -- data packets only */
+    #define           RXMODE_DISABLE_802_3_HEADER  0x100    /* disables 802.3 header on rx */
+
+    unsigned short    FragmentThreshold;
+    unsigned short    RtsThreshold;
+    unsigned char     StationMacAddress[6];
+    unsigned char     Rates[8];
+    unsigned short    ShortRetryLimit;
+    unsigned short    LongRetryLimit;
+    unsigned short    TxLifetime;                         /* in kusec */
+    unsigned short    RxLifetime;                         /* in kusec */
+    unsigned short    Stationary;
+    unsigned short    Ordering;
+    unsigned short    DeviceType;                         /* for overriding device type */
+    unsigned short    _reserved1[5];                         /*---------- Scanning/Associating ----------*/
+    unsigned short    ScanMode;
+    #define           SCANMODE_ACTIVE              0
+    #define           SCANMODE_PASSIVE             1
+    #define           SCANMODE_AIROSCAN            2
+    unsigned short    ProbeDelay;                         /* in kusec */
+    unsigned short    ProbeEnergyTimeout;                 /* in kusec */
+    unsigned short    ProbeResponseTimeout;
+    unsigned short    BeaconListenTimeout;
+    unsigned short    JoinNetTimeout;
+    unsigned short    AuthenticationTimeout;
+    unsigned short    AuthenticationType;
+    #define           AUTH_OPEN                    1
+    #define           AUTH_SHAREDKEY               2
+    #define           AUTH_EXCLUDENONWEP           4
+    unsigned short    AssociationTimeout;
+    unsigned short    SpecifiedApTimeout;
+    unsigned short    OfflineScanInterval;
+    unsigned short    OfflineScanDuration;
+    unsigned short    LinkLossDelay;
+    unsigned short    MaxBeaconLostTime;
+    unsigned short    RefreshInterval;
+   #define           DISABLE_REFRESH           0xFFFF
+   unsigned short    _reserved1a[1];                      /*---------- Power save operation ----------*/
+   unsigned short    PowerSaveMode;
+   #define           POWERSAVE_CAM             0
+   #define           POWERSAVE_PSP             1
+   #define           POWERSAVE_PSP_CAM         2
+   unsigned short    SleepForDtims;
+   unsigned short    ListenInterval;
+   unsigned short    FastListenInterval;
+   unsigned short    ListenDecay;
+   unsigned short    FastListenDelay;
+   unsigned short    _reserved2[2];                       /*---------- Ap/Ibss config items ----------*/
+   unsigned short    BeaconPeriod;
+   unsigned short    AtimDuration;
+   unsigned short    HopPeriod;
+   unsigned short    ChannelSet;
+   unsigned short    Channel;
+   unsigned short    DtimPeriod;
+   unsigned short    _reserved3[2];                       /*---------- Radio configuration ----------*/
+   unsigned short    RadioType;
+   #define           RADIOTYPE_DEFAULT         0
+   #define           RADIOTYPE_802_11          1
+   #define           RADIOTYPE_LEGACY          2
+   unsigned char     u8RxDiversity;
+   unsigned char     u8TxDiversity;
+   unsigned short    TxPower;
+   #define           TXPOWER_DEFAULT           0
+   unsigned short    RssiThreshold;
+   #define           RSSI_DEFAULT              0
+   unsigned short    RadioSpecific[4];                 /*---------- Aironet Extensions ----------*/
+   unsigned char     NodeName[16];
+   unsigned short    ArlThreshold;
+   unsigned short    ArlDecay;
+   unsigned short    ArlDelay;
+   unsigned short    _reserved4[1];                       /*---------- Aironet Extensions ----------*/
+   unsigned short    MagicAction;
+   #define           MAGIC_ACTION_STSCHG       1
+   #define           MACIC_ACTION_RESUME       2
+   #define           MAGIC_IGNORE_MCAST        (1<<8)
+   #define           MAGIC_IGNORE_BCAST        (1<<9)
+   #define           MAGIC_SWITCH_TO_PSP       (0<<10)
+   #define           MAGIC_STAY_IN_CAM         (1<<10)
+};
+
+
+
+struct awc_SSID {
+	u16 	lenght;
+	u8	SSID[32];
+};
+
+struct awc_SSIDs {
+	u16 	ridLen;
+	struct awc_SSID SSID[3];
+
+};
+
+struct awc_fixed_APs{
+	u16	ridLen;
+	u8	AP[4][6];
+};
+
+struct awc_driver_name{
+	u16	ridLen;
+	u8	name[16];
+};
+
+struct awc_encapsulation{
+	u16 	etherType;
+	u16	Action;
+};
+
+struct awc_enc_trans{
+	u16				ridLen;
+	struct awc_encapsulation 	rules[8];
+};
+
+struct awc_wep_key {
+	u16	ridLen;
+	u16	KeyIndex;
+	u8	Address[6];
+	u16	KeyLen;
+	u8	Key[16];
+};
+
+struct awc_modulation {
+	u16	ridLen;
+	u16	Modulation;
+};
+
+struct awc_cap{
+	u16		ridLen;
+	u8		OUI[3];
+	u8		ProductNum[3];
+	u8		ManufacturerName[32];
+	u8		ProductName[16];
+	u8		ProductVersion[8];
+	u8		FactoryAddress[6];
+	u8		AironetAddress[6];
+	u16		RadioType;
+	u16		RegDomain;
+	u8		Callid[6];
+	u8		SupportedRates[8];
+	u8		RxDiversity;
+	u8		TxDiversity;
+	u16		TxPowerLevels[8];
+	u16		HardwareVersion;
+	u16		HardwareCapabilities;
+	u16		TemperatureRange;
+	u16		SoftwareVersion;
+	u16		SoftwareSubVersion;
+	u16		InterfaceVersion;
+	u16		SoftwareCapabilities;
+	u8		BootBlockVersionMajor;
+	u8              BootBlockVersionMinor;
+	        
+};
+
+
+struct awc_status{
+	u16	ridLen;
+	u8	MacAddress[6];
+	u16	OperationalMode;
+	u16	ErrorCode;
+	u16	CurrentSignalQuality;
+	u16	SSIDlength;
+	u8	SSID[32];
+	u8	ApName[16];
+	u8	CurrentBssid[32];
+	u8	PreviousBSSIDs[3][6];
+	u16	BeaconPeriod;
+	u16	DtimPeriod;
+	u16	AtimDuration;
+	u16	HopPeriod;
+	u16	ChannelSet;
+	u16	Channel;
+
+	u16	HopsToBackbone;
+	u16	ApTotalLoad;
+	u16	OurGeneratedLoad;
+	u16	AccumulatedArl;
+	
+};
+
+
+struct awc_AP{
+	u16	ridLen;
+	u16	TIM_Addr;
+	u16	Airo_Addr;
+};
+
+struct awc_Statistics_32 {
+
+	u32	RidLen;
+	u32	RxOverrunErr;
+	u32	RxPlcpCrcErr;
+	u32	RxPlcpFormat;
+	u32	RxPlcpLength;
+	u32	RxMacCrcErr;
+	u32	RxMacCrcOk;
+	u32	RxWepErr;
+	u32	RxWepOk;
+	u32	RetryLong;
+	u32	RetryShort;
+	u32	MaxRetries;
+	u32	NoAck;
+
+	u32	NoCts;
+	u32	RxAck;
+	u32	RxCts;
+	u32	TxAck;
+	u32	TxRts;
+	u32	TxCts;
+	u32	TxMc;
+	u32	TxBc;
+	u32	TxUcFrags;
+	u32	TxUcPackets;
+	u32	TxBeacon;
+	u32	RxBeacon;
+	u32	TxSinColl;
+	u32	TxMulColl;
+	u32	DefersNo;
+	u32	DefersProt;
+	u32	DefersEngy;
+	u32	DupFram;
+	u32	RxFragDisc;
+	u32	TxAged;
+	u32	RxAged;
+	u32	LostSync_Max;
+	u32	LostSync_Mis;
+	u32	LostSync_Arl;
+	u32	LostSync_Dea;
+	u32	LostSync_Disa;
+	u32	LostSync_Tsf;
+	u32	HostTxMc;
+	u32	HostTxBc;
+	u32	HostTxUc;
+	u32	HostTxFail;
+	u32	HostRxMc;
+	u32	HostRxBc;
+	u32	HostRxUc;
+	u32	HostRxDiscar;
+	u32	HmacTxMc;
+	u32	HmacTxBc;
+	u32	HmacTxUc;
+	u32	HmacTxFail;
+	u32	HmacRxMc;
+	u32	HmacRxBc;
+	u32	HmacRxUc;
+	u32	HmacRxDisca;
+	u32	HmacRxAcce;
+	u32	SsidMismatch;
+	u32	ApMismatch;
+	u32	RatesMismatc;
+	u32	AuthReject;
+	u32	AuthTimeout;
+	u32	AssocReject;
+	u32	AssocTimeout;
+	u32	NewReason;
+	u32	AuthFail_1;
+	u32	AuthFail_2;
+	u32	AuthFail_3;
+	u32	AuthFail_4;
+	u32	AuthFail_5;
+	u32	AuthFail_6;
+	u32	AuthFail_7;
+	u32	AuthFail_8;
+	u32	AuthFail_9;
+	u32	AuthFail_10;
+	u32	AuthFail_11;
+	u32	AuthFail_12;
+	u32	AuthFail_13;
+	u32	AuthFail_14;
+	u32	AuthFail_15;
+	u32	AuthFail_16;
+	u32	AuthFail_17;
+	u32	AuthFail_18;
+	u32	AuthFail_19;
+	u32	RxMan;
+	u32	TxMan;
+	u32	RxRefresh;
+	u32	TxRefresh;
+	u32	RxPoll;
+	u32	TxPoll;
+	u32	HostRetries;
+	u32	LostSync_HostReq;
+	u32	HostTxBytes;
+	u32	HostRxBytes;
+	u32	ElapsedUsec;
+	u32	ElapsedSec;
+	u32	LostSyncBett;
+};
+
+struct awc_Statistics_16 {
+
+	u16	RidLen;
+	u16	RxOverrunErr;
+	u16	RxPlcpCrcErr;
+	u16	RxPlcpFormat;
+	u16	RxPlcpLength;
+	u16	RxMacCrcErr;
+	u16	RxMacCrcOk;
+	u16	RxWepErr;
+	u16	RxWepOk;
+	u16	RetryLong;
+	u16	RetryShort;
+	u16	MaxRetries;
+	u16	NoAck;
+	u16	NoCts;
+	u16	RxAck;
+	u16	RxCts;
+	u16	TxAck;
+	u16	TxRts;
+	u16	TxCts;
+	u16	TxMc;
+	u16	TxBc;
+	u16	TxUcFrags;
+	u16	TxUcPackets;
+	u16	TxBeacon;
+	u16	RxBeacon;
+	u16	TxSinColl;
+	u16	TxMulColl;
+	u16	DefersNo;
+	u16	DefersProt;
+	u16	DefersEngy;
+	u16	DupFram;
+	u16	RxFragDisc;
+	u16	TxAged;
+	u16	RxAged;
+	u16	LostSync_Max;
+	u16	LostSync_Mis;
+	u16	LostSync_Arl;
+	u16	LostSync_Dea;
+	u16	LostSync_Disa;
+	u16	LostSync_Tsf;
+	u16	HostTxMc;
+	u16	HostTxBc;
+	u16	HostTxUc;
+	u16	HostTxFail;
+	u16	HostRxMc;
+	u16	HostRxBc;
+	u16	HostRxUc;
+	u16	HostRxDiscar;
+	u16	HmacTxMc;
+	u16	HmacTxBc;
+	u16	HmacTxUc;
+	u16	HmacTxFail;
+	u16	HmacRxMc;
+	u16	HmacRxBc;
+	u16	HmacRxUc;
+	u16	HmacRxDisca;
+	u16	HmacRxAcce;
+	u16	SsidMismatch;
+	u16	ApMismatch;
+	u16	RatesMismatc;
+	u16	AuthReject;
+	u16	AuthTimeout;
+	u16	AssocReject;
+	u16	AssocTimeout;
+	u16	NewReason;
+	u16	AuthFail_1;
+	u16	AuthFail_2;
+	u16	AuthFail_3;
+	u16	AuthFail_4;
+	u16	AuthFail_5;
+	u16	AuthFail_6;
+	u16	AuthFail_7;
+	u16	AuthFail_8;
+	u16	AuthFail_9;
+	u16	AuthFail_10;
+	u16	AuthFail_11;
+	u16	AuthFail_12;
+	u16	AuthFail_13;
+	u16	AuthFail_14;
+	u16	AuthFail_15;
+	u16	AuthFail_16;
+	u16	AuthFail_17;
+	u16	AuthFail_18;
+	u16	AuthFail_19;
+	u16	RxMan;
+	u16	TxMan;
+	u16	RxRefresh;
+	u16	TxRefresh;
+	u16	RxPoll;
+	u16	TxPoll;
+	u16	HostRetries;
+	u16	LostSync_HostReq;
+	u16	HostTxBytes;
+	u16	HostRxBytes;
+	u16	ElapsedUsec;
+	u16	ElapsedSec;
+	u16	LostSyncBett;
+};
+
+
+#define AWC_TXCTL_TXOK 		(1<<1)	/* report if tx is ok */
+#define AWC_TXCTL_TXEX 		(1<<2)	/* report if tx fails */
+#define AWC_TXCTL_802_3		(0<<3)	/* 802.3 packet */
+#define AWC_TXCTL_802_11    	(1<<3)	/* 802.11 mac packet */
+#define AWC_TXCTL_ETHERNET  	(0<<4)	/* payload has ethertype */
+#define AWC_TXCTL_LLC  		(1<<4)	/* payload is llc */
+#define AWC_TXCTL_RELEASE   	(0<<5)	/* release after completion */
+#define AWC_TXCTL_NORELEASE 	(1<<5)	/* on completion returns to host */
+
+
+/************************* LINK STATUS STUFF *******************/
+
+#define	awc_link_status_loss_of_sync_missed_beacons	0x8000
+#define	awc_link_status_loss_of_sync_max_retries 	0x8001
+#define	awc_link_status_loss_of_sync_ARL_exceed  	0x8002
+#define	awc_link_status_loss_of_sync_host_request 	0x8003
+#define	awc_link_status_loss_of_sync_TSF_sync		0x8004
+#define	awc_link_status_deauthentication		0x8100
+#define	awc_link_status_disassociation			0x8200
+#define	awc_link_status_association_failed		0x8400
+#define	awc_link_status_authentication_failed		0x0300
+#define	awc_link_status_associated			0x0400
+
+struct awc_strings {
+	int	par;
+	unsigned int	mask;
+	const char * string;
+
+};
+
+#define awc_link_status_strings {\
+{awc_link_status_loss_of_sync_missed_beacons,	0xFFFF,"Loss of sync -- missed beacons"},\
+{awc_link_status_loss_of_sync_max_retries,	0xFFFF,"Loss of sync -- max retries"},\
+{awc_link_status_loss_of_sync_ARL_exceed,	0xFFFF,"Loss of sync -- average retry level (ARL) exceeded"},\
+{awc_link_status_loss_of_sync_host_request,	0xFFFF,"Loss of sync -- host request"},\
+{awc_link_status_loss_of_sync_TSF_sync,		0xFFFF,"Loss of sync -- TSF synchronization"},\
+{awc_link_status_deauthentication,		0xFF00,"Deauthentication "},\
+{awc_link_status_disassociation,		0xFF00,"Disassocation "},\
+{awc_link_status_association_failed ,		0xFF00,"Association failed "},\
+{awc_link_status_authentication_failed,		0xFF00,"Authentication failure"},\
+{awc_link_status_associated,			0xFFFF,"Associated "},\
+{0,0,NULL}\
+} 
+
+
+/****************************** COMMANDS and DEFAULTS and STATUSES ***********/
+
+/****************************** COMMANDS */
+
+
+// Command definitions
+
+
+
+
+#define awc4500wout(base, com, p0,p1,p2) {\
+	awc_write(base,awc_Param0_register, p0);\
+	awc_write(base,awc_Param1_register, p1);\
+	awc_write(base,awc_Param2_register, p2);\
+	WAIT61x3;\
+	awc_write(base,awc_Command_register, com);\
+	WAIT61x3;\
+}
+#define awc_wout(cmd, com, p0,p1,p2) {\
+	awc_write(base,awc_Param0_register, p0);\
+	awc_write(base,awc_Param1_register, p1);\
+	awc_write(base,awc_Param2_register, p2);\
+	WAIT61x3;\
+	awc_write(base,awc_Command_register, com);\
+	WAIT61x3;\
+}
+
+
+#define awc_command_NOP(cmd)			awc_wout( cmd,0x0000,0,0,0) // 	NOP
+#define awc_command_Enable_All(cmd)		awc_wout( cmd,0x0001,0,0,0) // 	Enable
+#define awc_command_Enable_MAC(cmd)		awc_wout( cmd,0x0101,0,0,0) // 	Enable Mac
+#define awc_command_Enable_Rx(cmd)		awc_wout( cmd,0x0201,0,0,0) // 	Enable Rx
+#define awc_command_Disable_MAC(cmd)		awc_wout( cmd,0x0002,0,0,0) // 	Disable
+#define awc_command_Sync_Loss(cmd)		awc_wout( cmd,0x0003,0,0,0) // 	Force a Loss of Sync
+#define awc_command_Soft_Reset(cmd)		awc_wout( cmd,0x0004,0,0,0) // 	Firmware Restart (soft reset)
+#define awc_command_Host_Sleep(cmd)		awc_wout( cmd,0x0005,0,0,0) // 	Host Sleep (must be issued as 0x0085)
+#define awc_command_Magic_Packet(cmd)		awc_wout( cmd,0x0006,0,0,0) // 	Magic Packet
+#define awc_command_Read_Configuration(cmd)	awc_wout( cmd,0x0008,0,0,0) // 	Read the Configuration from nonvolatile  storage
+#define awc_command_Allocate_TX_Buff(cmd,size)	awc_wout( cmd,0x000A,size,0,0) // 	Allocate Transmit Buffer
+#define awc_command_TX(cmd,FID)			awc_wout( cmd,0x000B,FID ,0,0) // 	Transmit
+#define awc_command_Deallocate(cmd,FID)		awc_wout( cmd,0x000C,FID ,0,0) // 	Deallocate
+#define awc_command_NOP2(cmd)			awc_wout( cmd,0x0010,0,0,0) // 	NOP (same as 0x0000)
+#define awc_command_Read_RID(cmd,RID)		awc_wout( cmd,0x0021,RID ,0,0) // 	Read RID
+#define awc_command_Write_RID(cmd,RID)		awc_wout( cmd,0x0121,RID ,0,0) // 	Write RID
+#define awc_command_Allocate_Buff(cmd,size)	awc_wout( cmd,0x0028,size,0,0) // 	Allocate Buffer
+#define awc_command_PSP_Nodes(cmd)		awc_wout( cmd,0x0030,0,0,0) // 	PSP nodes (AP only)
+#define awc_command_Set_Phy_register(cmd,phy_register,clear_bits, set_bits)\
+							awc_wout( cmd,0x003E,phy_register,clear_bits, set_bits) // 	Set PHY register
+#define awc_command_TX_Test(cmd,command, frequency, pattern)		awc_wout( cmd,0x003F,command, frequency, pattern) // 	Transmitter Test
+#define awc_command_RX_Test(cmd)		awc_wout( cmd,0x013F,0,0,0) // 	RX Test
+#define awc_command_Sleep(cmd)			awc_wout( cmd,0x0085,0,0,0) // 	Go to Sleep (No Ack bit is mandatory)
+#define awc_command_Save_Configuration(cmd)	awc_wout( cmd,0x0108,0,0,0) // 	Save the configuration to nonvolatile
+
+
+#define AWC_COMMAND_NOOP_BULL 		0x000
+#define AWC_COMMAND_ENABLE		0x001
+#define AWC_COMMAND_ENABLE_MAC		0x101
+#define AWC_COMMAND_ENABLE_RX		0x201
+#define AWC_COMMAND_DISABLE		0x002
+#define AWC_COMMAND_LOSE_SYNC		0x003
+#define AWC_COMMAND_SOFT_RESET		0x004
+#define AWC_COMMAND_HOST_SLEEP		0x085
+#define AWC_COMMAND_MAGIC_PACKET	0x006
+#define AWC_COMMAND_READ_CONF		0x008
+#define AWC_COMMAND_SAVE_CONF		0x108
+#define AWC_COMMAND_TX_ALLOC		0x00A
+#define AWC_COMMAND_TX			0x00B
+#define AWC_COMMAND_DEALLOC		0x00C
+#define AWC_COMMAND_NOOP		0x010
+#define AWC_COMMAND_READ_RID		0x021
+#define AWC_COMMAND_WRITE_RID		0x121
+#define AWC_COMMAND_ALLOC		0x028
+#define AWC_COMMAND_PSP_NODES		0x030
+#define AWC_COMMAND_SET_PHY		0x03E
+#define AWC_COMMAND_TX_TEST		0x03F
+#define AWC_COMMAND_SLEEP		0x085
+
+
+#define awc_command_name_strings {\
+	{0x0000, 0x00FF,"awc_command_NOP " },\
+	{0x0001, 0x00FF,"awc_command_Enable_All " },\
+	{0x0101, 0x01FF,"awc_command_Enable_MAC " },\
+	{0x0201, 0x01FF,"awc_command_Enable_Rx " },\
+	{0x0002, 0x00FF,"awc_command_Disable_MAC " },\
+	{0x0003, 0x00FF,"awc_command_Sync_Loss " },\
+	{0x0004, 0x00FF,"awc_command_Soft_Reset " },\
+	{0x0005, 0x00FF,"awc_command_Host_Sleep " },\
+	{0x0006, 0x00FF,"awc_command_Magic_Packet " },\
+	{0x0008, 0x00FF,"awc_command_Read_Configuration " },\
+	{0x000A, 0x00FF,"awc_command_Allocate_TX_Buff " },\
+	{0x000B, 0x00FF,"awc_command_TX " },\
+	{0x000C, 0x00FF,"awc_command_Deallocate " },\
+	{0x0010, 0x00FF,"awc_command_NOP2 " },\
+	{0x0021, 0x00FF,"awc_command_Read_RID " },\
+	{0x0121, 0x01FF,"awc_command_Write_RID " },\
+	{0x0028, 0x00FF,"awc_command_Allocate_Buff " },\
+	{0x0030, 0x00FF,"awc_command_PSP_Nodes " },\
+	{0x003E, 0x00FF,"awc_command_Set_Phy_register " },\
+	{0x003F, 0x00FF,"awc_command_TX_Test " },\
+	{0x013F, 0x01FF,"awc_command_RX_Test " },\
+	{0x0085, 0x00FF,"awc_command_Sleep " },\
+	{0x0108, 0x01FF,"awc_command_Save_Configuration " },\
+	{0x0000, 0x00FF, NULL}\
+};
+
+
+/***************************** STATUSES */
+
+#define awc_reply_success 0x0000
+
+#define awc_reply_error_strings {\
+   { 0x0000, 0x00FF,"    Success"},\
+   { 0x0001, 0x00FF,"    Illegal command."},\
+   { 0x0002, 0x00FF,"    Illegal format."},\
+   { 0x0003, 0x00FF,"    Invalid FID."},\
+   { 0x0004, 0x00FF,"    Invalid RID."},\
+   { 0x0005, 0x00FF,"    Too Large"},\
+   { 0x0006, 0x00FF,"    MAC is not disabled."},\
+   { 0x0007, 0x00FF,"    Alloc is still busy processing previous alloc"},\
+   { 0x0008, 0x00FF,"    Invalid Mode Field"},\
+   { 0x0009, 0x00FF,"    Tx is not allowed in monitor mode"},\
+   { 0x000A, 0x00FF,"    Loop test or memory test error"},\
+   { 0x000B, 0x00FF,"    Cannot read this RID."},\
+   { 0x000C, 0x00FF,"    Cannot write to this RID."},\
+   { 0x000D, 0x00FF,"    Tag not found."},\
+   { 0x0080, 0x00FF,"    Config mode is invalid."},\
+   { 0x0081, 0x00FF,"    Config hop interval is invalid."},\
+   { 0x0082, 0x00FF,"    Config beacon interval is invalid."},\
+   { 0x0083, 0x00FF,"    Config receive mode is invalid."},\
+   { 0x0084, 0x00FF,"    Config MAC address is invalid."},\
+   { 0x0085, 0x00FF,"    Config rates are invalid."},\
+   { 0x0086, 0x00FF,"    Config ordering field is invalid."},\
+   { 0x0087, 0x00FF,"    Config scan mode is invalid."},\
+   { 0x0088, 0x00FF,"    Config authentication type is invalid."},\
+   { 0x0089, 0x00FF,"    Config power save mode is invalid."},\
+   { 0x008A, 0x00FF,"    Config radio type is invalid."},\
+   { 0x008B, 0x00FF,"    Config diversity is invalid."},\
+   { 0x008C, 0x00FF,"    Config SSID list is invalid."},\
+   { 0x008D, 0x00FF,"    Config specified AP list is invalid."},\
+   { 0x0000, 0x00FF, NULL}\
+};
+
+#define awc_reply_command_failed( status) ((status & 0x7F00) == 0x7F)
+
+
+/*************************   PHY and TEST commands   ****************/
+
+
+// this might be wrong and reading is not implemented(was not in spec properly)
+#define awc_Set_PLCP_Word(PLCP_Word)\
+	awc_command_Set_Phy_register(base,0x8000,0 ,PLCP_Word)
+#define awc_Set_TX_Test_Freq(Tx_Test_Freq)\
+	awc_command_Set_Phy_register(base,0x8002,0 ,Tx_Test_Freq)
+#define awc_Set_Tx_Power(Tx_Power)\
+	awc_command_Set_Phy_register(base,0x8004,0 ,Tx_Power)
+#define awc_Set_RSSI_Treshold(RSSI_Treshold)\
+	awc_command_Set_Phy_register(base,0x8006,0 ,RSSI_Treshold)
+#define awc_Get_PLCP_Word(PLCP_Word)\
+	awc_command_Set_Phy_register(base,0x8000,0 ,0)
+#define awc_Get_TX_Test_Freq(Tx_Test_Freq)\
+	awc_command_Set_Phy_register(base,0x8002,0 ,0)
+#define awc_Get_Tx_Power(Tx_Power)\
+	awc_command_Set_Phy_register(base,0x8004,0 ,0)
+#define awc_Get_RSSI_Treshold(RSSI_Treshold)\
+	awc_command_Set_Phy_register(base,0x8006,0 ,0)
+
+
+#define awc_tx_test_code_end 	0x0000   //  Ends the transmitter test
+#define awc_tx_test_code_loop	0x0001   //  Loop back to the beginning of the commands
+#define awc_tx_test_code_start	0x0002   //  Start transmitting
+#define awc_tx_test_code_stop	0x0003   //  Stop transmitting
+#define awc_tx_test_code_delayu 0x0004   //  Delay for N usec where N is the next word
+#define awc_tx_test_code_delayk 0x0005   //  Delay for N Kusec where N is the next word
+#define awc_tx_test_code_next	0x0006   //  Go to the next frequency in the frequency RID
+#define awc_tx_test_code_rx	0x0007   //  Start receive mode
+
+#define awc_tx_test_code_strings {\
+{  awc_tx_test_code_end , 	0x000f ,"    Ends the transmitter test"},\
+{  awc_tx_test_code_loop , 	0x000f ,"     Loop back to the beginning of the commands"},\
+{  awc_tx_test_code_start , 	0x000f ,"    Start transmitting"},\
+{  awc_tx_test_code_stop ,	0x000f ,"    Stop transmitting"},\
+{  awc_tx_test_code_delayu , 	0x000f ,"    Delay for N usec where N is the next word"},\
+{  awc_tx_test_code_delayk , 	0x000f ,"    Delay for N Kusec where N is the next word"},\
+{  awc_tx_test_code_next , 	0x000f ,"    Go to the next frequency in the frequency RID"},\
+{  awc_tx_test_code_rx 	,	0x000f ,"    Start receive mode"},\
+{ 			0   , 0x000f ,NULL}\
+};
+
+
+
+#define AWC_COMMSTAT_HARD_RESET		0x0000001
+#define AWC_COMMSTAT_WAKE		0x0000002
+#define AWC_COMMSTAT_SOFT_RESET		0x0000004
+#define AWC_COMMSTAT_CONFIGURE		0x0000008
+#define AWC_COMMSTAT_READ_CONF		0x0000010
+#define AWC_COMMSTAT_SAVE_CONF		0x0000020
+#define AWC_COMMSTAT_DEALLOC		0x0000040
+#define AWC_COMMSTAT_ALLOC_TX		0x0000080
+#define AWC_COMMSTAT_ALLOC_TEST		0x0000100
+#define AWC_COMMSTAT_ENABLE_MAC		0x0000200
+#define AWC_COMMSTAT_ENABLE_RX		0x0000400
+#define AWC_COMMSTAT_DISABLE_MAC	0x0000800
+#define AWC_COMMSTAT_RX_ACK		0x0001000
+#define AWC_COMMSTAT_TX_ACK		0x0002000
+#define AWC_COMMSTAT_AWAKEN_ACK		0x0004000
+#define AWC_COMMSTAT_TX_FAIL_ACK	0x0008000
+#define AWC_COMMSTAT_LINK_ACK		0x0010000
+#define AWC_COMMSTAT_CLR_CMD		0x0020000
+#define AWC_COMMSTAT_ALLOC_ACK		0x0040000
+#define AWC_COMMSTAT_HOST_SLEEP		0x0080000
+#define AWC_COMMSTAT_RX			0x0100000
+#define AWC_COMMSTAT_TX			0x0200000
+#define AWC_COMMSTAT_SLEEP		0x0400000
+#define AWC_COMMSTAT_PSP_NODES		0x0800000
+#define AWC_COMMSTAT_SET_TX_POWER 	0x1000000
+
+
+/*****************************     R  I  D	***************/
+
+#define AWC_NOF_RIDS	18
+extern int awc_rid_setup(struct NET_DEVICE * dev);
+
+struct aironet4500_rid_selector{
+	const u16 selector;
+	const unsigned 	MAC_Disable_at_write:1;
+	const unsigned	read_only:1;
+	const unsigned  may_change:1;
+	const char *	name;
+};
+
+
+
+
+
+extern const struct aironet4500_rid_selector aironet4500_RID_Select_General_Config;
+extern const struct aironet4500_rid_selector aironet4500_RID_Select_SSID_list;
+extern const struct aironet4500_rid_selector aironet4500_RID_Select_AP_list	;
+extern const struct aironet4500_rid_selector aironet4500_RID_Select_Driver_name;
+extern const struct aironet4500_rid_selector aironet4500_RID_Select_Encapsulation;
+extern const struct aironet4500_rid_selector aironet4500_RID_Select_Active_Config;
+extern const struct aironet4500_rid_selector aironet4500_RID_Select_Capabilities;
+extern const struct aironet4500_rid_selector aironet4500_RID_Select_AP_Info	;
+extern const struct aironet4500_rid_selector aironet4500_RID_Select_Radio_Info;
+extern const struct aironet4500_rid_selector aironet4500_RID_Select_Status	;
+extern const struct aironet4500_rid_selector aironet4500_RID_Select_Modulation	;
+extern const struct aironet4500_rid_selector aironet4500_RID_Select_WEP_volatile	;
+extern const struct aironet4500_rid_selector aironet4500_RID_Select_WEP_nonvolatile	;
+extern const struct aironet4500_rid_selector aironet4500_RID_Select_16_stats;
+extern const struct aironet4500_rid_selector aironet4500_RID_Select_16_stats_delta;
+extern const struct aironet4500_rid_selector aironet4500_RID_Select_16_stats_clear;
+extern const struct aironet4500_rid_selector aironet4500_RID_Select_32_stats;
+extern const struct aironet4500_rid_selector aironet4500_RID_Select_32_stats_delta;
+extern const struct aironet4500_rid_selector aironet4500_RID_Select_32_stats_clear;
+
+#define awc_def_gen_RID(offset,name, bits,mask,value,value_name)\
+ {&aironet4500_RID_Select_General_Config,offset, bits,1,1,0,0, mask, value, name, value_name}
+#define awc_def_SSID_RID(offset,name, bits,mask,value,value_name)\
+  {&aironet4500_RID_Select_SSID_list,offset, bits,1,1,0,0, mask, value, name, value_name}
+#define awc_def_AP_List_RID(offset,name, bits,mask,value,value_name)\
+ {&aironet4500_RID_Select_AP_list,offset, bits,1,1,0,0, mask, value, name, value_name}
+#define awc_def_Dname_RID(offset,name, bits,mask,value,value_name)\
+ {&aironet4500_RID_Select_Driver_name,offset, bits,1,1,0,0, mask, value, name, value_name}
+#define awc_def_act_RID(offset,name, bits,mask,value,value_name)\
+ {&aironet4500_RID_Select_Active_Config,offset, bits,1,1,0,0, mask, value, name, value_name}
+#define awc_def_Cap_RID(offset,name, bits,mask,value,value_name)\
+ {&aironet4500_RID_Select_Capabilities,offset, bits,1,1,0,0, mask, value, name, value_name}
+#define awc_def_AP_RID(offset,name, bits,mask,value,value_name)\
+ {&aironet4500_RID_Select_AP_Info,offset, bits,1,1,0,0, mask, value, name, value_name}
+#define awc_def_Radio_RID(offset,name, bits,mask,value,value_name)\
+ {&aironet4500_RID_Select_Radio_Info,offset, bits,1,1,0,0, mask, value, name, value_name}
+#define awc_def_Stat_RID(offset,name, bits,mask,value,value_name)\
+ {&aironet4500_RID_Select_Status,offset, bits,1,1,0,0, mask, value, name, value_name}
+#define awc_def_Enc_RID(offset,name, bits,mask,value,value_name)\
+ {&aironet4500_RID_Select_Encapsulation,offset, bits,1,1,0,0, mask, value, name, value_name}
+
+#define awc_def_WEPv_RID(offset,name, bits,mask,value,value_name)\
+ {&aironet4500_RID_Select_WEP_volatile,offset, bits,1,1,0,0, mask, value, name, value_name}
+#define awc_def_WEPnv_RID(offset,name, bits,mask,value,value_name)\
+ {&aironet4500_RID_Select_WEP_nonvolatile,offset, bits,1,1,0,0, mask, value, name, value_name}
+#define awc_def_Modulation_RID(offset,name, bits,mask,value,value_name)\
+ {&aironet4500_RID_Select_Modulation,offset, bits,1,1,0,0, mask, value, name, value_name}
+
+#define awc_def_Stats_RID(o16,offset,name, value_name)\
+ {&aironet4500_RID_Select_32_stats,offset, 32,1,1,0,0, 0xffffffff, 0, name, value_name}
+#define awc_def_Stats_delta_RID(o16,offset,name, value_name)\
+ {&aironet4500_RID_Select_32_stats_delta,offset, 32,1,1,0,0, 0xffffffff, 0, name, value_name}
+#define awc_def_Stats_clear_RID(o16,offset,name, value_name)\
+ {&aironet4500_RID_Select_32_stats_delta,offset,32,1,1,0,0, 0xffffffff,  0, name,value_name}
+
+#define awc_def_Stats16_RID(offset,o32,name, value_name)\
+ {&aironet4500_RID_Select_16_stats,offset, 16,1,1,0,0, 0xffffffff, 0, name, value_name}
+#define awc_def_Stats16_delta_RID(offset,o32,name, value_name)\
+ {&aironet4500_RID_Select_16_stats_delta,offset, 16,1,1,0,0, 0xffffffff,  0, name,value_name}
+#define awc_def_Stats16_clear_RID(offset,o32,name, value_name)\
+ {&aironet4500_RID_Select_16_stats_delta,offset, 16,1,1,0,0, 0xffffffff,  0, name,value_name}
+
+
+#define aironet4500_RID_Select_strings {\
+{ 0xFF10, 0xffff, "General Configuration"},\
+{ 0xFF11, 0xffff, "Valid SSID list" },\
+{ 0xFF12, 0xffff, "Valid AP list"},\
+{ 0xFF13, 0xffff, "Driver name"},\
+{ 0xFF14, 0xffff, "Ethernet Protocol"},\
+{ 0xFF15, 0xffff, "WEP volatile"},\
+{ 0xFF16, 0xffff, "WEP nonvolatile"},\
+{ 0xFF17, 0xffff, "Modulation"},\
+{ 0xFF20, 0xffff, "Actual Configuration"},\
+{ 0xFF00, 0xffff, "Capabilities"},\
+{ 0xFF01, 0xffff, "AP Info"},\
+{ 0xFF02, 0xffff, "Radio Info"},\
+{ 0xFF50, 0xffff, "Status"},\
+{ 0xFF60, 0xffff, "Cumulative 16-bit Statistics"},\
+{ 0xFF61, 0xffff, "Delta 16-bit Statistics"},\
+{ 0xFF62, 0xffff, "Delta 16-bit Statistics and Clear"},\
+{ 0xFF68, 0xffff, "Cumulative 32-bit Statistics"},\
+{ 0xFF69, 0xffff, "Delta 32-bit Statistics "},\
+{ 0xFF6A, 0xffff, "Delta 32-bit Statistics and Clear"},\
+{ 0x0000, 0xffff, NULL}\
+}
+
+
+
+
+
+struct aironet4500_RID {
+	const struct aironet4500_rid_selector	*  selector;
+	const u32 	offset;
+	const u8 	bits;
+	const u8 	array;
+	const u32 	units;
+	const unsigned read_only:1;
+	const unsigned null_terminated:1;
+	const u32 	mask;
+	const u32 	value;
+	const char * name;
+	const char * value_name;
+		
+};
+
+struct aironet4500_RID_names{
+	struct aironet4500_RID rid;
+	char *name;
+};
+
+struct aironet4500_RID_names_values{
+	struct aironet4500_RID rid;
+	char *name;
+	u32	mask;	
+};
+
+struct awc_rid_dir{
+	const struct aironet4500_rid_selector *	selector;
+	const int size;
+	const struct aironet4500_RID * rids;
+	struct NET_DEVICE * dev ;
+	void * 	buff;
+	int	bufflen; // just checking
+};
+
+extern int awc_nof_rids;
+extern struct awc_rid_dir  awc_rids[];
+
+
+
+
+
+struct awc_private {
+	dev_node_t node;
+
+
+	int dummy_test;
+	struct awc_config 		config; // card RID mirrors
+	struct awc_config 		general_config; // 
+	struct awc_SSIDs  		SSIDs;
+	struct awc_fixed_APs 		fixed_APs;
+	struct awc_driver_name		driver_name;
+	struct awc_enc_trans		enc_trans;
+	struct awc_cap			capabilities;
+	struct awc_status		status;
+	struct awc_AP			AP;
+	struct awc_Statistics_32 	statistics;
+	struct awc_Statistics_32 	statistics_delta;
+	struct awc_Statistics_32 	statistics_delta_clear;
+	struct awc_Statistics_16 	statistics16;
+	struct awc_Statistics_16 	statistics16_delta;
+	struct awc_Statistics_16 	statistics16_delta_clear;
+	struct awc_wep_key		wep_volatile;
+	struct awc_wep_key		wep_nonvolatile;
+	struct awc_modulation		modulation;
+
+	struct awc_rid_dir		rid_dir[AWC_NOF_RIDS];
+	int	rids_read;
+	
+	
+	struct awc_bap		bap0;
+	struct awc_bap		bap1;
+	int			sleeping_bap;
+	
+	struct awc_fid_queue    tx_small_ready;
+	struct awc_fid_queue    tx_large_ready;
+	struct awc_fid_queue    tx_post_process;
+	struct awc_fid_queue    tx_in_transmit;
+	my_spinlock_t		queues_lock;
+
+	struct awc_fid_queue    rx_ready;
+	struct awc_fid_queue    rx_post_process;
+
+
+	
+	struct semaphore	tx_buff_semaphore;
+	volatile int		tx_buffs_in_use;
+	volatile int 		tx_small_buffs_in_use;
+	volatile int		tx_buffs_total;
+	volatile int		tx_small_buffs_total;
+	int			large_buff_mem;
+	int			small_buff_no;
+	
+	int tx_timeout;
+	
+	volatile int		mac_enabled;
+	u16			link_status;
+	u8			link_status_changed;
+	
+	volatile int		ejected;
+	volatile int		bh_running;
+	volatile int		bh_active;
+	volatile int		tx_chain_active;
+	volatile u16		enabled_interrupts;
+	volatile u16		waiting_interrupts;
+	volatile int		interrupt_count;
+	
+	// Command serialize stuff
+        struct semaphore 	command_semaphore;
+        volatile int		unlock_command_postponed;
+        struct awc_command	cmd;
+        long long		async_command_start;
+        volatile int		command_semaphore_on;
+        struct tq_struct 	immediate_bh;
+	volatile int		process_tx_results;
+
+	u8			p2p[6];
+	u8			bssid[6];
+	int			p2p_uc;
+	int			p2p_found;
+	int			p802_11_send;
+	
+	struct enet_statistics  stats;
+	
+	struct ctl_table * proc_table;
+
+	void	* 		bus;
+	int 			card_type;
+};
+
+extern int 		awc_init(struct NET_DEVICE * dev);
+extern void 		awc_reset(struct NET_DEVICE *dev);
+extern int 		awc_config(struct NET_DEVICE *dev);
+extern int 		awc_open(struct NET_DEVICE *dev);
+extern void 		awc_tx_timeout(struct NET_DEVICE *dev);
+extern int 		awc_tx_done(struct awc_fid * rx_fid); 
+extern int 		awc_start_xmit(struct sk_buff *, struct NET_DEVICE *);
+extern void 		awc_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+extern struct enet_statistics *	awc_get_stats(struct NET_DEVICE *dev);
+extern int 		awc_rx(struct NET_DEVICE *dev, struct awc_fid * rx_fid);
+extern void		awc_set_multicast_list(struct NET_DEVICE *dev);
+extern int awc_change_mtu(struct NET_DEVICE *dev, int new_mtu);  
+extern int 		awc_close(struct NET_DEVICE *dev);
+extern int		awc_private_init(struct NET_DEVICE * dev);
+extern int awc_register_proc(int (*awc_proc_set_device) (int),int (*awc_proc_unset_device)(int));
+extern int awc_unregister_proc(void);
+extern int (* awc_proc_set_fun) (int) ;
+extern int (* awc_proc_unset_fun) (int) ;
+extern int	awc_interrupt_process(struct NET_DEVICE * dev);
+extern int	awc_readrid(struct NET_DEVICE * dev, struct aironet4500_RID * rid, void *pBuf );
+extern int 	awc_writerid(struct NET_DEVICE * dev, struct aironet4500_RID * rid, void *pBuf);
+extern int 	awc_readrid_dir(struct NET_DEVICE * dev, struct awc_rid_dir * rid );
+extern int 	awc_writerid_dir(struct NET_DEVICE * dev, struct awc_rid_dir * rid);
+extern int 	awc_tx_alloc(struct NET_DEVICE * dev) ;
+extern int	awc_tx_dealloc(struct NET_DEVICE * dev);
+extern struct awc_fid *awc_tx_fid_lookup(struct NET_DEVICE * dev, u16 fid);
+extern int 	awc_issue_soft_reset(struct NET_DEVICE * dev);
+extern int	awc_issue_noop(struct NET_DEVICE * dev);
+extern int 	awc_dump_registers(struct NET_DEVICE * dev);
+extern unsigned short  awc_issue_command_and_block(struct awc_command * cmd);
+extern int	awc_enable_MAC(struct NET_DEVICE * dev);
+extern int	awc_disable_MAC(struct NET_DEVICE * dev);
+extern int	awc_read_all_rids(struct NET_DEVICE * dev);
+extern int	awc_write_all_rids(struct NET_DEVICE * dev);
+extern int	awc_receive_packet(struct NET_DEVICE * dev);
+extern int	awc_transmit_packet(struct NET_DEVICE * dev, struct awc_fid * tx_buff) ;
+extern int	awc_tx_complete_check(struct NET_DEVICE * dev);
+extern int	awc_interrupt_process(struct NET_DEVICE * dev);
+extern void 	awc_bh(struct NET_DEVICE *dev);
+extern int 	awc_802_11_find_copy_path(struct NET_DEVICE * dev, struct awc_fid * rx_buff);
+extern void 	awc_802_11_router_rx(struct NET_DEVICE * dev,struct awc_fid * rx_buff);
+extern int 	awc_802_11_tx_find_path_and_post(struct NET_DEVICE * dev, struct sk_buff * skb);
+extern void 	awc_802_11_after_tx_packet_to_card_write(struct NET_DEVICE * dev, struct awc_fid * tx_buff);
+extern void 	awc_802_11_after_failed_tx_packet_to_card_write(struct NET_DEVICE * dev,struct awc_fid * tx_buff);
+extern void 	awc_802_11_after_tx_complete(struct NET_DEVICE * dev, struct awc_fid * tx_buff);
+extern void 	awc_802_11_failed_rx_copy(struct NET_DEVICE * dev,struct awc_fid * rx_buff);
+extern int 	awc_tx_alloc(struct NET_DEVICE * dev) ;
+extern int 	awc_tx_dealloc_fid(struct NET_DEVICE * dev,struct awc_fid * fid);
+extern int	awc_tx_dealloc(struct NET_DEVICE * dev);
+extern struct awc_fid *
+	awc_tx_fid_lookup_and_remove(struct NET_DEVICE * dev, u16 fid_handle);
+extern int 	awc_queues_init(struct NET_DEVICE * dev);
+extern int 	awc_queues_destroy(struct NET_DEVICE * dev);
+extern int 	awc_rids_setup(struct NET_DEVICE * dev);
+
+
+
+extern int		awc_debug;
+extern int bap_sleep ;
+extern int bap_sleep_after_setup ;
+extern int sleep_before_command  ;
+extern int bap_sleep_before_write;
+extern int sleep_in_command    ;
+extern int tx_queue_len ;
+extern int tx_rate;
+extern int awc_full_stats;
+
+#define MAX_AWCS	4
+extern struct NET_DEVICE * aironet4500_devices[MAX_AWCS];
+
+
+#ifdef AWC_DEBUG
+	#define DEBUG(a,args...) if (awc_debug & a) printk( args)
+	#define AWC_ENTRY_EXIT_DEBUG(a)  if (awc_debug & 8) printk( a)
+#else
+	#define DEBUG(a, args...)
+	#define AWC_ENTRY_EXIT_DEBUG(a)
+#endif
+
+#if LINUX_VERSION_CODE < 0x20100
+#ifndef test_and_set_bit
+          #define test_and_set_bit(a,b)           set_bit(a,b)
+#endif                         
+#endif
+
+#if LINUX_VERSION_CODE  < 0x20100
+	#define FREE_SKB(a) dev_kfree_skb(a, FREE_WRITE)
+#else
+	#define FREE_SKB(a) dev_kfree_skb(a)
+#endif
+
+#endif /* AIRONET4500_H */

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)