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
- Lines: 1639
- Date:
Tue Dec 7 23:58:21 1999
- Orig file:
v2.3.30/linux/drivers/net/aironet4500.h
- Orig date:
Wed Dec 31 16:00:00 1969
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)