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 */ 80 enum { 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 108 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 }; 130 131 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 }; 161 162 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 }; 212 213 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 }; 249 250 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 }; 294 295 struct 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 struct R00_descriptor R00; 313 struct T00_descriptor T00; 314 }; 315 316 /* For R01 and T01 ------------------------------ */ 317 union { 318 struct R01_descriptor R01; 319 struct T01_descriptor T01; 320 }; 321 322 /* For R02 and T02 ------------------------------ */ 323 union { 324 u32 R02; 325 struct 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 #define MAX_TXVGA_EEPROM 9 /* How many word(u16) of EEPROM will be used for TxVGA */ 346 #define MAX_RF_PARAMETER 32 347 348 struct txvga_for_50 { 349 u8 ChanNo; 350 u8 TxVgaValue; 351 }; 352 353 /* 354 * ============================================== 355 * Device related include 356 * ============================================== 357 */ 358 359 #include "wb35reg_s.h" 360 #include "wb35tx_s.h" 361 #include "wb35rx_s.h" 362 363 /* For Hal using ============================================ */ 364 struct hw_data { 365 /* For compatible with 33 */ 366 u32 revision; 367 u32 BB3c_cal; /* The value for Tx calibration comes from EEPROM */ 368 u32 BB54_cal; /* The value for Rx calibration comes from EEPROM */ 369 370 /* For surprise remove */ 371 u32 SurpriseRemove; /* 0: Normal 1: Surprise remove */ 372 u8 IsKeyPreSet; 373 u8 CalOneTime; 374 375 u8 VCO_trim; 376 377 u32 FragCount; 378 u32 DMAFix; /* V1_DMA_FIX The variable can be removed if driver want to save mem space for V2. */ 379 380 /* 381 * =============================================== 382 * Definition for MAC address 383 * =============================================== 384 */ 385 u8 PermanentMacAddress[ETH_ALEN + 2]; /* The Ethernet addr that are stored in EEPROM. + 2 to 8-byte alignment */ 386 u8 CurrentMacAddress[ETH_ALEN + 2]; /* The Enthernet addr that are in used. + 2 to 8-byte alignment */ 387 388 /* 389 * ========================================= 390 * Definition for 802.11 391 * ========================================= 392 */ 393 u8 *bssid_pointer; /* Used by hal_get_bssid for return value */ 394 u8 bssid[8]; /* Only 6 byte will be used. 8 byte is required for read buffer */ 395 u8 ssid[32]; /* maximum ssid length is 32 byte */ 396 397 u16 AID; 398 u8 ssid_length; 399 u8 Channel; 400 401 u16 ListenInterval; 402 u16 CapabilityInformation; 403 404 u16 BeaconPeriod; 405 u16 ProbeDelay; 406 407 u8 bss_type;/* 0: IBSS_NET or 1:ESS_NET */ 408 u8 preamble;/* 0: short preamble, 1: long preamble */ 409 u8 slot_time_select; /* 9 or 20 value */ 410 u8 phy_type; /* Phy select */ 411 412 u32 phy_para[MAX_RF_PARAMETER]; 413 u32 phy_number; 414 415 u32 CurrentRadioSw; /* 0:On 1:Off */ 416 u32 CurrentRadioHw; /* 0:On 1:Off */ 417 418 u8 *power_save_point; /* Used by hal_get_power_save_mode for return value */ 419 u8 cwmin; 420 u8 desired_power_save; 421 u8 dtim; /* Is running dtim */ 422 u8 mapping_key_replace_index; /* In Key table, the next index be replaced */ 423 424 u16 MaxReceiveLifeTime; 425 u16 FragmentThreshold; 426 u16 FragmentThreshold_tmp; 427 u16 cwmax; 428 429 u8 Key_slot[MAX_KEY_TABLE][8]; /* Ownership record for key slot. For Alignment */ 430 u32 Key_content[MAX_KEY_TABLE][12]; /* 10DW for each entry + 2 for burst command (Off and On valid bit) */ 431 u8 CurrentDefaultKeyIndex; 432 u32 CurrentDefaultKeyLength; 433 434 /* 435 * ================================================== 436 * Variable for each module 437 * ================================================== 438 */ 439 struct usb_device *udev; 440 struct wb35_reg reg; /* Need Wb35Reg.h */ 441 struct wb35_tx Wb35Tx; /* Need Wb35Tx.h */ 442 struct wb35_rx Wb35Rx; /* Need Wb35Rx.h */ 443 444 struct timer_list LEDTimer; /* For LED */ 445 446 u32 LEDpoint; /* For LED */ 447 448 u32 dto_tx_retry_count; 449 u32 dto_tx_frag_count; 450 u32 rx_ok_count[13]; /* index=0: total rx ok */ 451 u32 rx_err_count[13]; /* index=0: total rx err */ 452 453 /* for Tx debug */ 454 u32 tx_TBTT_start_count; 455 u32 tx_ETR_count; 456 u32 tx_WepOn_false_count; 457 u32 tx_Null_key_count; 458 u32 tx_retry_count[8]; 459 460 u8 PowerIndexFromEEPROM; /* For 2412MHz */ 461 u8 power_index; 462 u8 IsWaitJoinComplete; /* TRUE: set join request */ 463 u8 band; 464 465 u16 SoftwareSet; 466 u16 Reserved_s; 467 468 u32 IsInitOK; /* 0: Driver starting 1: Driver init OK */ 469 470 /* For Phy calibration */ 471 s32 iq_rsdl_gain_tx_d2; 472 s32 iq_rsdl_phase_tx_d2; 473 u32 txvga_setting_for_cal; 474 475 u8 TxVgaSettingInEEPROM[(((MAX_TXVGA_EEPROM * 2) + 3) & ~0x03)]; /* For EEPROM value */ 476 u8 TxVgaFor24[16]; /* Max is 14, 2 for alignment */ 477 struct txvga_for_50 TxVgaFor50[36]; /* 35 channels in 5G. 35x2 = 70 byte. 2 for alignments */ 478 479 u16 Scan_Interval; 480 u16 RESERVED6; 481 482 /* LED control */ 483 u32 LED_control; 484 /* 485 * LED_control 4 byte: Gray_Led_1[3] Gray_Led_0[2] Led[1] Led[0] 486 * Gray_Led 487 * For Led gray setting 488 * Led 489 * 0: normal control, 490 * LED behavior will decide by EEPROM setting 491 * 1: Turn off specific LED 492 * 2: Always on specific LED 493 * 3: slow blinking specific LED 494 * 4: fast blinking specific LED 495 * 5: WPS led control is set. Led0 is Red, Led1 id Green 496 * 497 * Led[1] is parameter for WPS LED mode 498 * 1:InProgress 499 * 2: Error 500 * 3: Session overlap 501 * 4: Success control 502 */ 503 u32 LED_LinkOn; /* Turn LED on control */ 504 u32 LED_Scanning; /* Let LED in scan process control */ 505 u32 LED_Blinking; /* Temp variable for shining */ 506 u32 RxByteCountLast; 507 u32 TxByteCountLast; 508 509 /* For global timer */ 510 u32 time_count; /* TICK_TIME_100ms 1 = 100ms */ 511 }; 512 513 #endif 514