| /* |
| * Aironet 4500 Pcmcia driver |
| * |
| * Elmer Joandi, Januar 1999 |
| * Copyright: GPL |
| * |
| * |
| * 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> |
| */ |
| |
| /* |
| #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 |
| |
| |
| |
| #include <linux/spinlock.h> |
| |
| |
| #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; |
| |
| }; |
| |
| |
| /* timeout for transmit watchdog timer, AP default is 8 sec */ |
| #define AWC_TX_TIMEOUT (HZ * 8) |
| |
| |
| |
| /*************************** 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; |
| 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_LOCK_COMMAND_ISSUING(a) spin_lock_irqsave(&a->command_issuing_spinlock,a->command_issuing_spinlock_flags); |
| #define AWC_UNLOCK_COMMAND_ISSUING(a) spin_unlock_irqrestore(&a->command_issuing_spinlock,a->command_issuing_spinlock_flags); |
| |
| #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 (both_bap_lock)\ |
| spin_lock_irqsave(&cmd.priv->both_bap_spinlock,cmd.priv->both_bap_spinlock_flags);\ |
| if (cmd.bap){\ |
| 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);\ |
| if (both_bap_lock)\ |
| spin_lock_irqsave(&cmd.priv->both_bap_spinlock,cmd.priv->both_bap_spinlock_flags);\ |
| 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);\ |
| if (both_bap_lock)\ |
| spin_lock_irqsave(&cmd.priv->both_bap_spinlock,cmd.priv->both_bap_spinlock_flags);\ |
| 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)); \ |
| 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;\ |
| spin_unlock_irqrestore(&(cmd.bap->spinlock),cmd.bap->flags);\ |
| }\ |
| }\ |
| if (both_bap_lock)\ |
| spin_unlock_irqrestore(&cmd.priv->both_bap_spinlock,cmd.priv->both_bap_spinlock_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; |
| spinlock_t spinlock; |
| }; |
| |
| |
| extern __inline__ void |
| awc_fid_queue_init(struct awc_fid_queue * queue){ |
| |
| unsigned long flags; |
| memset(queue,0, sizeof(struct awc_fid_queue)); |
| spin_lock_init(&queue->spinlock); |
| spin_lock_irqsave(&queue->spinlock,flags); |
| queue->head = NULL; |
| queue->tail = NULL; |
| queue->size = 0; |
| spin_unlock_irqrestore(&queue->spinlock,flags); |
| }; |
| |
| static inline void |
| awc_fid_queue_push_tail( struct awc_fid_queue * queue, |
| struct awc_fid * fid){ |
| |
| unsigned long flags; |
| |
| spin_lock_irqsave(&queue->spinlock,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++; |
| |
| spin_unlock_irqrestore(&queue->spinlock,flags); |
| |
| }; |
| |
| |
| static inline void |
| awc_fid_queue_push_head( struct awc_fid_queue * queue, |
| struct awc_fid * fid){ |
| |
| unsigned long flags; |
| |
| spin_lock_irqsave(&queue->spinlock,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++; |
| |
| spin_unlock_irqrestore(&queue->spinlock,flags); |
| }; |
| |
| |
| |
| static 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; |
| } |
| }; |
| |
| static inline void |
| awc_fid_queue_remove( struct awc_fid_queue * queue, |
| struct awc_fid * fid){ |
| unsigned long flags; |
| spin_lock_irqsave(&queue->spinlock,flags); |
| |
| awc_fid_queue_rm(queue,fid); |
| |
| spin_unlock_irqrestore(&queue->spinlock,flags); |
| |
| }; |
| |
| |
| |
| static inline struct awc_fid * |
| awc_fid_queue_pop_head( struct awc_fid_queue * queue){ |
| |
| unsigned long flags; |
| struct awc_fid * fid; |
| |
| spin_lock_irqsave(&queue->spinlock,flags); |
| |
| fid = queue->head; |
| if (fid) |
| awc_fid_queue_rm(queue,fid); |
| |
| spin_unlock_irqrestore(&queue->spinlock,flags); |
| |
| return fid; |
| }; |
| |
| |
| |
| |
| static inline struct awc_fid * |
| awc_fid_queue_pop_tail( struct awc_fid_queue * queue){ |
| |
| unsigned long flags; |
| struct awc_fid * fid; |
| |
| spin_lock_irqsave(&queue->spinlock,flags); |
| |
| fid = queue->tail; |
| if (fid) |
| awc_fid_queue_rm(queue,fid); |
| |
| spin_unlock_irqrestore(&queue->spinlock,flags); |
| |
| return fid; |
| }; |
| |
| |
| |
| #define AWC_TX_HEAD_SIZE 0x44 |
| #define AWC_TX_ALLOC_SMALL_SIZE 200 |
| #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; // somewhere back in times PCMCIA needed that |
| |
| int dummy_test; // left for cleanup |
| // card rid inmemory copy |
| 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; |
| |
| // here are just references to rids |
| 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; |
| 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; |
| |
| volatile int mac_enabled; |
| u16 link_status; |
| u8 link_status_changed; |
| |
| volatile int ejected; |
| volatile int bh_running; |
| volatile int bh_active; |
| volatile long tx_chain_active; |
| volatile u16 enabled_interrupts; |
| volatile u16 waiting_interrupts; |
| volatile int interrupt_count; |
| |
| // Command serialize stuff |
| //changed to spinlock struct semaphore command_semaphore; |
| spinlock_t both_bap_spinlock; // on SMP, card should theorethically live without that |
| unsigned long both_bap_spinlock_flags; |
| spinlock_t bap_setup_spinlock; // on SMP, card should theoretically live without that |
| unsigned long bap_setup_spinlock_flags; |
| spinlock_t command_issuing_spinlock; |
| unsigned long command_issuing_spinlock_flags; |
| spinlock_t interrupt_spinlock; |
| |
| 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; |
| int simple_bridge; |
| int force_rts_on_shorter; |
| int force_tx_rate; |
| int ip_tos_reliability_rts; |
| int ip_tos_troughput_no_retries; |
| int full_stats; |
| int debug; |
| |
| struct net_device_stats 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_start_xmit(struct sk_buff *, struct net_device *); |
| extern void awc_interrupt(int irq, void *dev_id, struct pt_regs *regs); |
| extern struct net_device_stats * awc_get_stats(struct net_device *dev); |
| 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 both_bap_lock; |
| extern int bap_setup_spinlock; |
| 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]; |
| |
| #define AWC_DEBUG 1 |
| |
| #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 |
| |
| #endif /* AIRONET4500_H */ |