1#ifndef __WINBOND_WBHAL_S_H 2#define __WINBOND_WBHAL_S_H 3 4#include <linux/types.h> 5#include <linux/if_ether.h> /* for ETH_ALEN */ 6 7#define HAL_LED_SET_MASK 0x001c 8#define HAL_LED_SET_SHIFT 2 9 10/* supported RF type */ 11#define RF_MAXIM_2825 0 12#define RF_MAXIM_2827 1 13#define RF_MAXIM_2828 2 14#define RF_MAXIM_2829 3 15#define RF_MAXIM_V1 15 16#define RF_AIROHA_2230 16 17#define RF_AIROHA_7230 17 18#define RF_AIROHA_2230S 18 19#define RF_WB_242 33 20#define RF_WB_242_1 34 21#define RF_DECIDE_BY_INF 255 22 23/* 24 * ---------------------------------------------------------------- 25 * The follow define connect to upper layer 26 * User must modify for connection between HAL and upper layer 27 * ---------------------------------------------------------------- 28 */ 29 30/* 31 * ============================== 32 * Common define 33 * ============================== 34 */ 35/* Bit 5 */ 36#define HAL_USB_MODE_BURST(_H) (_H->SoftwareSet & 0x20) 37 38/* Scan interval */ 39#define SCAN_MAX_CHNL_TIME (50) 40 41/* For TxL2 Frame typr recognise */ 42#define FRAME_TYPE_802_3_DATA 0 43#define FRAME_TYPE_802_11_MANAGEMENT 1 44#define FRAME_TYPE_802_11_MANAGEMENT_CHALLENGE 2 45#define FRAME_TYPE_802_11_CONTROL 3 46#define FRAME_TYPE_802_11_DATA 4 47#define FRAME_TYPE_PROMISCUOUS 5 48 49/* The follow definition is used for convert the frame------------ */ 50#define DOT_11_SEQUENCE_OFFSET 22 /* Sequence control offset */ 51#define DOT_3_TYPE_OFFSET 12 52#define DOT_11_MAC_HEADER_SIZE 24 53#define DOT_11_SNAP_SIZE 6 54#define DOT_11_TYPE_OFFSET 30 /* The start offset of 802.11 Frame. Type encapsulation. */ 55#define DEFAULT_SIFSTIME 10 56#define DEFAULT_FRAGMENT_THRESHOLD 2346 /* No fragment */ 57#define DEFAULT_MSDU_LIFE_TIME 0xffff 58 59#define LONG_PREAMBLE_PLUS_PLCPHEADER_TIME (144 + 48) 60#define SHORT_PREAMBLE_PLUS_PLCPHEADER_TIME (72 + 24) 61#define PREAMBLE_PLUS_SIGNAL_PLUS_SIGNALEXTENSION (16 + 4 + 6) 62#define Tsym 4 63 64/* Frame Type of Bits (2, 3)----------------------------------- */ 65#define MAC_TYPE_MANAGEMENT 0x00 66#define MAC_TYPE_CONTROL 0x04 67#define MAC_TYPE_DATA 0x08 68#define MASK_FRAGMENT_NUMBER 0x000F 69#define SEQUENCE_NUMBER_SHIFT 4 70 71#define HAL_WOL_TYPE_WAKEUP_FRAME 0x01 72#define HAL_WOL_TYPE_MAGIC_PACKET 0x02 73 74#define HAL_KEYTYPE_WEP40 0 75#define HAL_KEYTYPE_WEP104 1 76#define HAL_KEYTYPE_TKIP 2 /* 128 bit key */ 77#define HAL_KEYTYPE_AES_CCMP 3 /* 128 bit key */ 78 79/* For VM state */ 80enum { 81 VM_STOP = 0, 82 VM_RUNNING, 83 VM_COMPLETED 84}; 85 86/* 87 * ================================ 88 * Normal Key table format 89 * ================================ 90 */ 91 92/* The order of KEY index is MAPPING_KEY_START_INDEX > GROUP_KEY_START_INDEX */ 93#define MAX_KEY_TABLE 24 /* 24 entry for storing key data */ 94#define GROUP_KEY_START_INDEX 4 95#define MAPPING_KEY_START_INDEX 8 96 97/* 98 * ========================================= 99 * Descriptor 100 * ========================================= 101 */ 102#define MAX_DESCRIPTOR_BUFFER_INDEX 8 /* Have to multiple of 2 */ 103#define FLAG_ERROR_TX_MASK 0x000000bf 104#define FLAG_ERROR_RX_MASK 0x0000083f 105 106#define FLAG_BAND_RX_MASK 0x10000000 /* Bit 28 */ 107 108typedef struct _R00_DESCRIPTOR { 109 union { 110 u32 value; 111#ifdef _BIG_ENDIAN_ 112 struct { 113 u32 R00_packet_or_buffer_status:1; 114 u32 R00_packet_in_fifo:1; 115 u32 R00_RESERVED:2; 116 u32 R00_receive_byte_count:12; 117 u32 R00_receive_time_index:16; 118 }; 119#else 120 struct { 121 u32 R00_receive_time_index:16; 122 u32 R00_receive_byte_count:12; 123 u32 R00_RESERVED:2; 124 u32 R00_packet_in_fifo:1; 125 u32 R00_packet_or_buffer_status:1; 126 }; 127#endif 128 }; 129} R00_DESCRIPTOR, *PR00_DESCRIPTOR; 130 131typedef struct _T00_DESCRIPTOR { 132 union { 133 u32 value; 134#ifdef _BIG_ENDIAN_ 135 struct { 136 u32 T00_first_mpdu:1; /* for hardware use */ 137 u32 T00_last_mpdu:1; /* for hardware use */ 138 u32 T00_IsLastMpdu:1;/* 0:not 1:Yes for software used */ 139 u32 T00_IgnoreResult:1;/* The same mechanism with T00 setting. */ 140 u32 T00_RESERVED_ID:2;/* 3 bit ID reserved */ 141 u32 T00_tx_packet_id:4; 142 u32 T00_RESERVED:4; 143 u32 T00_header_length:6; 144 u32 T00_frame_length:12; 145 }; 146#else 147 struct { 148 u32 T00_frame_length:12; 149 u32 T00_header_length:6; 150 u32 T00_RESERVED:4; 151 u32 T00_tx_packet_id:4; 152 u32 T00_RESERVED_ID:2; /* 3 bit ID reserved */ 153 u32 T00_IgnoreResult:1; /* The same mechanism with T00 setting. */ 154 u32 T00_IsLastMpdu:1; /* 0:not 1:Yes for software used */ 155 u32 T00_last_mpdu:1; /* for hardware use */ 156 u32 T00_first_mpdu:1; /* for hardware use */ 157 }; 158#endif 159 }; 160} T00_DESCRIPTOR, *PT00_DESCRIPTOR; 161 162typedef struct _R01_DESCRIPTOR { 163 union { 164 u32 value; 165#ifdef _BIG_ENDIAN_ 166 struct { 167 u32 R01_RESERVED:3; 168 u32 R01_mod_type:1; 169 u32 R01_pre_type:1; 170 u32 R01_data_rate:3; 171 u32 R01_AGC_state:8; 172 u32 R01_LNA_state:2; 173 u32 R01_decryption_method:2; 174 u32 R01_mic_error:1; 175 u32 R01_replay:1; 176 u32 R01_broadcast_frame:1; 177 u32 R01_multicast_frame:1; 178 u32 R01_directed_frame:1; 179 u32 R01_receive_frame_antenna_selection:1; 180 u32 R01_frame_receive_during_atim_window:1; 181 u32 R01_protocol_version_error:1; 182 u32 R01_authentication_frame_icv_error:1; 183 u32 R01_null_key_to_authentication_frame:1; 184 u32 R01_icv_error:1; 185 u32 R01_crc_error:1; 186 }; 187#else 188 struct { 189 u32 R01_crc_error:1; 190 u32 R01_icv_error:1; 191 u32 R01_null_key_to_authentication_frame:1; 192 u32 R01_authentication_frame_icv_error:1; 193 u32 R01_protocol_version_error:1; 194 u32 R01_frame_receive_during_atim_window:1; 195 u32 R01_receive_frame_antenna_selection:1; 196 u32 R01_directed_frame:1; 197 u32 R01_multicast_frame:1; 198 u32 R01_broadcast_frame:1; 199 u32 R01_replay:1; 200 u32 R01_mic_error:1; 201 u32 R01_decryption_method:2; 202 u32 R01_LNA_state:2; 203 u32 R01_AGC_state:8; 204 u32 R01_data_rate:3; 205 u32 R01_pre_type:1; 206 u32 R01_mod_type:1; 207 u32 R01_RESERVED:3; 208 }; 209#endif 210 }; 211} R01_DESCRIPTOR, *PR01_DESCRIPTOR; 212 213typedef struct _T01_DESCRIPTOR { 214 union { 215 u32 value; 216#ifdef _BIG_ENDIAN_ 217 struct { 218 u32 T01_rts_cts_duration:16; 219 u32 T01_fall_back_rate:3; 220 u32 T01_add_rts:1; 221 u32 T01_add_cts:1; 222 u32 T01_modulation_type:1; 223 u32 T01_plcp_header_length:1; 224 u32 T01_transmit_rate:3; 225 u32 T01_wep_id:2; 226 u32 T01_add_challenge_text:1; 227 u32 T01_inhibit_crc:1; 228 u32 T01_loop_back_wep_mode:1; 229 u32 T01_retry_abort_ebable:1; 230 }; 231#else 232 struct { 233 u32 T01_retry_abort_ebable:1; 234 u32 T01_loop_back_wep_mode:1; 235 u32 T01_inhibit_crc:1; 236 u32 T01_add_challenge_text:1; 237 u32 T01_wep_id:2; 238 u32 T01_transmit_rate:3; 239 u32 T01_plcp_header_length:1; 240 u32 T01_modulation_type:1; 241 u32 T01_add_cts:1; 242 u32 T01_add_rts:1; 243 u32 T01_fall_back_rate:3; 244 u32 T01_rts_cts_duration:16; 245 }; 246#endif 247 }; 248} T01_DESCRIPTOR, *PT01_DESCRIPTOR; 249 250typedef struct _T02_DESCRIPTOR { 251 union { 252 u32 value; 253#ifdef _BIG_ENDIAN_ 254 struct { 255 u32 T02_IsLastMpdu:1; /* The same mechanism with T00 setting */ 256 u32 T02_IgnoreResult:1; /* The same mechanism with T00 setting. */ 257 u32 T02_RESERVED_ID:2; /* The same mechanism with T00 setting */ 258 u32 T02_Tx_PktID:4; 259 u32 T02_MPDU_Cnt:4; 260 u32 T02_RTS_Cnt:4; 261 u32 T02_RESERVED:7; 262 u32 T02_transmit_complete:1; 263 u32 T02_transmit_abort_due_to_TBTT:1; 264 u32 T02_effective_transmission_rate:1; 265 u32 T02_transmit_without_encryption_due_to_wep_on_false:1; 266 u32 T02_discard_due_to_null_wep_key:1; 267 u32 T02_RESERVED_1:1; 268 u32 T02_out_of_MaxTxMSDULiftTime:1; 269 u32 T02_transmit_abort:1; 270 u32 T02_transmit_fail:1; 271 }; 272#else 273 struct { 274 u32 T02_transmit_fail:1; 275 u32 T02_transmit_abort:1; 276 u32 T02_out_of_MaxTxMSDULiftTime:1; 277 u32 T02_RESERVED_1:1; 278 u32 T02_discard_due_to_null_wep_key:1; 279 u32 T02_transmit_without_encryption_due_to_wep_on_false:1; 280 u32 T02_effective_transmission_rate:1; 281 u32 T02_transmit_abort_due_to_TBTT:1; 282 u32 T02_transmit_complete:1; 283 u32 T02_RESERVED:7; 284 u32 T02_RTS_Cnt:4; 285 u32 T02_MPDU_Cnt:4; 286 u32 T02_Tx_PktID:4; 287 u32 T02_RESERVED_ID:2; /* The same mechanism with T00 setting */ 288 u32 T02_IgnoreResult:1; /* The same mechanism with T00 setting. */ 289 u32 T02_IsLastMpdu:1; /* The same mechanism with T00 setting */ 290 }; 291#endif 292 }; 293} T02_DESCRIPTOR, *PT02_DESCRIPTOR; 294 295struct wb35_descriptor { /* Skip length = 8 DWORD */ 296 /* ID for descriptor ---, The field doesn't be cleard in the operation of Descriptor definition */ 297 u8 Descriptor_ID; 298 /* ----------------------The above region doesn't be cleared by DESCRIPTOR_RESET------ */ 299 u8 RESERVED[3]; 300 301 u16 FragmentThreshold; 302 u8 InternalUsed; /* Only can be used by operation of descriptor definition */ 303 u8 Type; /* 0: 802.3 1:802.11 data frame 2:802.11 management frame */ 304 305 u8 PreambleMode;/* 0: short 1:long */ 306 u8 TxRate; 307 u8 FragmentCount; 308 u8 EapFix; /* For speed up key install */ 309 310 /* For R00 and T00 ------------------------------ */ 311 union { 312 R00_DESCRIPTOR R00; 313 T00_DESCRIPTOR T00; 314 }; 315 316 /* For R01 and T01 ------------------------------ */ 317 union { 318 R01_DESCRIPTOR R01; 319 T01_DESCRIPTOR T01; 320 }; 321 322 /* For R02 and T02 ------------------------------ */ 323 union { 324 u32 R02; 325 T02_DESCRIPTOR T02; 326 }; 327 328 /* For R03 and T03 ------------------------------ */ 329 /* For software used */ 330 union { 331 u32 R03; 332 u32 T03; 333 struct { 334 u8 buffer_number; 335 u8 buffer_start_index; 336 u16 buffer_total_size; 337 }; 338 }; 339 340 /* For storing the buffer */ 341 u16 buffer_size[MAX_DESCRIPTOR_BUFFER_INDEX]; 342 void *buffer_address[MAX_DESCRIPTOR_BUFFER_INDEX]; 343}; 344 345 346#define DEFAULT_NULL_PACKET_COUNT 180000 /* 180 seconds */ 347 348#define MAX_TXVGA_EEPROM 9 /* How many word(u16) of EEPROM will be used for TxVGA */ 349#define MAX_RF_PARAMETER 32 350 351typedef struct _TXVGA_FOR_50 { 352 u8 ChanNo; 353 u8 TxVgaValue; 354} TXVGA_FOR_50; 355 356 357/* 358 * ============================================== 359 * Device related include 360 * ============================================== 361 */ 362 363#include "wbusb_s.h" 364#include "wb35reg_s.h" 365#include "wb35tx_s.h" 366#include "wb35rx_s.h" 367 368/* For Hal using ============================================ */ 369struct hw_data { 370 /* For compatible with 33 */ 371 u32 revision; 372 u32 BB3c_cal; /* The value for Tx calibration comes from EEPROM */ 373 u32 BB54_cal; /* The value for Rx calibration comes from EEPROM */ 374 375 /* For surprise remove */ 376 u32 SurpriseRemove; /* 0: Normal 1: Surprise remove */ 377 u8 IsKeyPreSet; 378 u8 CalOneTime; 379 380 u8 VCO_trim; 381 382 u32 FragCount; 383 u32 DMAFix; /* V1_DMA_FIX The variable can be removed if driver want to save mem space for V2. */ 384 385 /* 386 * =============================================== 387 * Definition for MAC address 388 * =============================================== 389 */ 390 u8 PermanentMacAddress[ETH_ALEN + 2]; /* The Ethernet addr that are stored in EEPROM. + 2 to 8-byte alignment */ 391 u8 CurrentMacAddress[ETH_ALEN + 2]; /* The Enthernet addr that are in used. + 2 to 8-byte alignment */ 392 393 /* 394 * ========================================= 395 * Definition for 802.11 396 * ========================================= 397 */ 398 u8 *bssid_pointer; /* Used by hal_get_bssid for return value */ 399 u8 bssid[8]; /* Only 6 byte will be used. 8 byte is required for read buffer */ 400 u8 ssid[32]; /* maximum ssid length is 32 byte */ 401 402 u16 AID; 403 u8 ssid_length; 404 u8 Channel; 405 406 u16 ListenInterval; 407 u16 CapabilityInformation; 408 409 u16 BeaconPeriod; 410 u16 ProbeDelay; 411 412 u8 bss_type;/* 0: IBSS_NET or 1:ESS_NET */ 413 u8 preamble;/* 0: short preamble, 1: long preamble */ 414 u8 slot_time_select; /* 9 or 20 value */ 415 u8 phy_type; /* Phy select */ 416 417 u32 phy_para[MAX_RF_PARAMETER]; 418 u32 phy_number; 419 420 u32 CurrentRadioSw; /* 0:On 1:Off */ 421 u32 CurrentRadioHw; /* 0:On 1:Off */ 422 423 u8 *power_save_point; /* Used by hal_get_power_save_mode for return value */ 424 u8 cwmin; 425 u8 desired_power_save; 426 u8 dtim; /* Is running dtim */ 427 u8 mapping_key_replace_index; /* In Key table, the next index be replaced */ 428 429 u16 MaxReceiveLifeTime; 430 u16 FragmentThreshold; 431 u16 FragmentThreshold_tmp; 432 u16 cwmax; 433 434 u8 Key_slot[MAX_KEY_TABLE][8]; /* Ownership record for key slot. For Alignment */ 435 u32 Key_content[MAX_KEY_TABLE][12]; /* 10DW for each entry + 2 for burst command (Off and On valid bit) */ 436 u8 CurrentDefaultKeyIndex; 437 u32 CurrentDefaultKeyLength; 438 439 /* 440 * ================================================== 441 * Variable for each module 442 * ================================================== 443 */ 444 struct wb_usb WbUsb; /* Need WbUsb.h */ 445 struct wb35_reg reg; /* Need Wb35Reg.h */ 446 struct wb35_tx Wb35Tx; /* Need Wb35Tx.h */ 447 struct wb35_rx Wb35Rx; /* Need Wb35Rx.h */ 448 449 struct timer_list LEDTimer; /* For LED */ 450 451 u32 LEDpoint; /* For LED */ 452 453 u32 dto_tx_retry_count; 454 u32 dto_tx_frag_count; 455 u32 rx_ok_count[13]; /* index=0: total rx ok */ 456 u32 rx_err_count[13]; /* index=0: total rx err */ 457 458 /* for Tx debug */ 459 u32 tx_TBTT_start_count; 460 u32 tx_ETR_count; 461 u32 tx_WepOn_false_count; 462 u32 tx_Null_key_count; 463 u32 tx_retry_count[8]; 464 465 u8 PowerIndexFromEEPROM; /* For 2412MHz */ 466 u8 power_index; 467 u8 IsWaitJoinComplete; /* TRUE: set join request */ 468 u8 band; 469 470 u16 SoftwareSet; 471 u16 Reserved_s; 472 473 u32 IsInitOK; /* 0: Driver starting 1: Driver init OK */ 474 475 /* For Phy calibration */ 476 s32 iq_rsdl_gain_tx_d2; 477 s32 iq_rsdl_phase_tx_d2; 478 u32 txvga_setting_for_cal; 479 480 u8 TxVgaSettingInEEPROM[(((MAX_TXVGA_EEPROM * 2) + 3) & ~0x03)]; /* For EEPROM value */ 481 u8 TxVgaFor24[16]; /* Max is 14, 2 for alignment */ 482 TXVGA_FOR_50 TxVgaFor50[36]; /* 35 channels in 5G. 35x2 = 70 byte. 2 for alignments */ 483 484 u16 Scan_Interval; 485 u16 RESERVED6; 486 487 /* LED control */ 488 u32 LED_control; 489 /* 490 * LED_control 4 byte: Gray_Led_1[3] Gray_Led_0[2] Led[1] Led[0] 491 * Gray_Led 492 * For Led gray setting 493 * Led 494 * 0: normal control, 495 * LED behavior will decide by EEPROM setting 496 * 1: Turn off specific LED 497 * 2: Always on specific LED 498 * 3: slow blinking specific LED 499 * 4: fast blinking specific LED 500 * 5: WPS led control is set. Led0 is Red, Led1 id Green 501 * 502 * Led[1] is parameter for WPS LED mode 503 * 1:InProgress 504 * 2: Error 505 * 3: Session overlap 506 * 4: Success control 507 */ 508 u32 LED_LinkOn; /* Turn LED on control */ 509 u32 LED_Scanning; /* Let LED in scan process control */ 510 u32 LED_Blinking; /* Temp variable for shining */ 511 u32 RxByteCountLast; 512 u32 TxByteCountLast; 513 514 atomic_t SurpriseRemoveCount; 515 516 /* For global timer */ 517 u32 time_count; /* TICK_TIME_100ms 1 = 100ms */ 518 519 /* For error recover */ 520 u32 HwStop; 521 522 /* For avoid AP disconnect */ 523 u32 NullPacketCount; 524}; 525 526#endif 527