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