162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci Copyright (C) 2004 - 2009 Ivo van Doorn <IvDoorn@gmail.com> 462306a36Sopenharmony_ci <http://rt2x00.serialmonkey.com> 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci/* 962306a36Sopenharmony_ci Module: rt2x00 1062306a36Sopenharmony_ci Abstract: rt2x00 generic register information. 1162306a36Sopenharmony_ci */ 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#ifndef RT2X00REG_H 1462306a36Sopenharmony_ci#define RT2X00REG_H 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* 1762306a36Sopenharmony_ci * RX crypto status 1862306a36Sopenharmony_ci */ 1962306a36Sopenharmony_cienum rx_crypto { 2062306a36Sopenharmony_ci RX_CRYPTO_SUCCESS = 0, 2162306a36Sopenharmony_ci RX_CRYPTO_FAIL_ICV = 1, 2262306a36Sopenharmony_ci RX_CRYPTO_FAIL_MIC = 2, 2362306a36Sopenharmony_ci RX_CRYPTO_FAIL_KEY = 3, 2462306a36Sopenharmony_ci}; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci/* 2762306a36Sopenharmony_ci * Antenna values 2862306a36Sopenharmony_ci */ 2962306a36Sopenharmony_cienum antenna { 3062306a36Sopenharmony_ci ANTENNA_SW_DIVERSITY = 0, 3162306a36Sopenharmony_ci ANTENNA_A = 1, 3262306a36Sopenharmony_ci ANTENNA_B = 2, 3362306a36Sopenharmony_ci ANTENNA_HW_DIVERSITY = 3, 3462306a36Sopenharmony_ci}; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci/* 3762306a36Sopenharmony_ci * Led mode values. 3862306a36Sopenharmony_ci */ 3962306a36Sopenharmony_cienum led_mode { 4062306a36Sopenharmony_ci LED_MODE_DEFAULT = 0, 4162306a36Sopenharmony_ci LED_MODE_TXRX_ACTIVITY = 1, 4262306a36Sopenharmony_ci LED_MODE_SIGNAL_STRENGTH = 2, 4362306a36Sopenharmony_ci LED_MODE_ASUS = 3, 4462306a36Sopenharmony_ci LED_MODE_ALPHA = 4, 4562306a36Sopenharmony_ci}; 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci/* 4862306a36Sopenharmony_ci * TSF sync values 4962306a36Sopenharmony_ci */ 5062306a36Sopenharmony_cienum tsf_sync { 5162306a36Sopenharmony_ci TSF_SYNC_NONE = 0, 5262306a36Sopenharmony_ci TSF_SYNC_INFRA = 1, 5362306a36Sopenharmony_ci TSF_SYNC_ADHOC = 2, 5462306a36Sopenharmony_ci TSF_SYNC_AP_NONE = 3, 5562306a36Sopenharmony_ci}; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci/* 5862306a36Sopenharmony_ci * Device states 5962306a36Sopenharmony_ci */ 6062306a36Sopenharmony_cienum dev_state { 6162306a36Sopenharmony_ci STATE_DEEP_SLEEP = 0, 6262306a36Sopenharmony_ci STATE_SLEEP = 1, 6362306a36Sopenharmony_ci STATE_STANDBY = 2, 6462306a36Sopenharmony_ci STATE_AWAKE = 3, 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci/* 6762306a36Sopenharmony_ci * Additional device states, these values are 6862306a36Sopenharmony_ci * not strict since they are not directly passed 6962306a36Sopenharmony_ci * into the device. 7062306a36Sopenharmony_ci */ 7162306a36Sopenharmony_ci STATE_RADIO_ON, 7262306a36Sopenharmony_ci STATE_RADIO_OFF, 7362306a36Sopenharmony_ci STATE_RADIO_IRQ_ON, 7462306a36Sopenharmony_ci STATE_RADIO_IRQ_OFF, 7562306a36Sopenharmony_ci}; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci/* 7862306a36Sopenharmony_ci * IFS backoff values 7962306a36Sopenharmony_ci */ 8062306a36Sopenharmony_cienum ifs { 8162306a36Sopenharmony_ci IFS_BACKOFF = 0, 8262306a36Sopenharmony_ci IFS_SIFS = 1, 8362306a36Sopenharmony_ci IFS_NEW_BACKOFF = 2, 8462306a36Sopenharmony_ci IFS_NONE = 3, 8562306a36Sopenharmony_ci}; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci/* 8862306a36Sopenharmony_ci * IFS backoff values for HT devices 8962306a36Sopenharmony_ci */ 9062306a36Sopenharmony_cienum txop { 9162306a36Sopenharmony_ci TXOP_HTTXOP = 0, 9262306a36Sopenharmony_ci TXOP_PIFS = 1, 9362306a36Sopenharmony_ci TXOP_SIFS = 2, 9462306a36Sopenharmony_ci TXOP_BACKOFF = 3, 9562306a36Sopenharmony_ci}; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci/* 9862306a36Sopenharmony_ci * Cipher types for hardware encryption 9962306a36Sopenharmony_ci */ 10062306a36Sopenharmony_cienum cipher { 10162306a36Sopenharmony_ci CIPHER_NONE = 0, 10262306a36Sopenharmony_ci CIPHER_WEP64 = 1, 10362306a36Sopenharmony_ci CIPHER_WEP128 = 2, 10462306a36Sopenharmony_ci CIPHER_TKIP = 3, 10562306a36Sopenharmony_ci CIPHER_AES = 4, 10662306a36Sopenharmony_ci/* 10762306a36Sopenharmony_ci * The following fields were added by rt61pci and rt73usb. 10862306a36Sopenharmony_ci */ 10962306a36Sopenharmony_ci CIPHER_CKIP64 = 5, 11062306a36Sopenharmony_ci CIPHER_CKIP128 = 6, 11162306a36Sopenharmony_ci CIPHER_TKIP_NO_MIC = 7, /* Don't send to device */ 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci/* 11462306a36Sopenharmony_ci * Max cipher type. 11562306a36Sopenharmony_ci * Note that CIPHER_NONE isn't counted, and CKIP64 and CKIP128 11662306a36Sopenharmony_ci * are excluded due to limitations in mac80211. 11762306a36Sopenharmony_ci */ 11862306a36Sopenharmony_ci CIPHER_MAX = 4, 11962306a36Sopenharmony_ci}; 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci/* 12262306a36Sopenharmony_ci * Rate modulations 12362306a36Sopenharmony_ci */ 12462306a36Sopenharmony_cienum rate_modulation { 12562306a36Sopenharmony_ci RATE_MODE_CCK = 0, 12662306a36Sopenharmony_ci RATE_MODE_OFDM = 1, 12762306a36Sopenharmony_ci RATE_MODE_HT_MIX = 2, 12862306a36Sopenharmony_ci RATE_MODE_HT_GREENFIELD = 3, 12962306a36Sopenharmony_ci}; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci/* 13262306a36Sopenharmony_ci * Firmware validation error codes 13362306a36Sopenharmony_ci */ 13462306a36Sopenharmony_cienum firmware_errors { 13562306a36Sopenharmony_ci FW_OK, 13662306a36Sopenharmony_ci FW_BAD_CRC, 13762306a36Sopenharmony_ci FW_BAD_LENGTH, 13862306a36Sopenharmony_ci FW_BAD_VERSION, 13962306a36Sopenharmony_ci}; 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci/* 14262306a36Sopenharmony_ci * Register handlers. 14362306a36Sopenharmony_ci * We store the position of a register field inside a field structure, 14462306a36Sopenharmony_ci * This will simplify the process of setting and reading a certain field 14562306a36Sopenharmony_ci * inside the register while making sure the process remains byte order safe. 14662306a36Sopenharmony_ci */ 14762306a36Sopenharmony_cistruct rt2x00_field8 { 14862306a36Sopenharmony_ci u8 bit_offset; 14962306a36Sopenharmony_ci u8 bit_mask; 15062306a36Sopenharmony_ci}; 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_cistruct rt2x00_field16 { 15362306a36Sopenharmony_ci u16 bit_offset; 15462306a36Sopenharmony_ci u16 bit_mask; 15562306a36Sopenharmony_ci}; 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_cistruct rt2x00_field32 { 15862306a36Sopenharmony_ci u32 bit_offset; 15962306a36Sopenharmony_ci u32 bit_mask; 16062306a36Sopenharmony_ci}; 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci/* 16362306a36Sopenharmony_ci * Power of two check, this will check 16462306a36Sopenharmony_ci * if the mask that has been given contains and contiguous set of bits. 16562306a36Sopenharmony_ci * Note that we cannot use the is_power_of_2() function since this 16662306a36Sopenharmony_ci * check must be done at compile-time. 16762306a36Sopenharmony_ci */ 16862306a36Sopenharmony_ci#define is_power_of_two(x) ( !((x) & ((x)-1)) ) 16962306a36Sopenharmony_ci#define low_bit_mask(x) ( ((x)-1) & ~(x) ) 17062306a36Sopenharmony_ci#define is_valid_mask(x) is_power_of_two(1LU + (x) + low_bit_mask(x)) 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci/* 17362306a36Sopenharmony_ci * Macros to find first set bit in a variable. 17462306a36Sopenharmony_ci * These macros behave the same as the __ffs() functions but 17562306a36Sopenharmony_ci * the most important difference that this is done during 17662306a36Sopenharmony_ci * compile-time rather then run-time. 17762306a36Sopenharmony_ci */ 17862306a36Sopenharmony_ci#define compile_ffs2(__x) \ 17962306a36Sopenharmony_ci __builtin_choose_expr(((__x) & 0x1), 0, 1) 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci#define compile_ffs4(__x) \ 18262306a36Sopenharmony_ci __builtin_choose_expr(((__x) & 0x3), \ 18362306a36Sopenharmony_ci (compile_ffs2((__x))), \ 18462306a36Sopenharmony_ci (compile_ffs2((__x) >> 2) + 2)) 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci#define compile_ffs8(__x) \ 18762306a36Sopenharmony_ci __builtin_choose_expr(((__x) & 0xf), \ 18862306a36Sopenharmony_ci (compile_ffs4((__x))), \ 18962306a36Sopenharmony_ci (compile_ffs4((__x) >> 4) + 4)) 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci#define compile_ffs16(__x) \ 19262306a36Sopenharmony_ci __builtin_choose_expr(((__x) & 0xff), \ 19362306a36Sopenharmony_ci (compile_ffs8((__x))), \ 19462306a36Sopenharmony_ci (compile_ffs8((__x) >> 8) + 8)) 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci#define compile_ffs32(__x) \ 19762306a36Sopenharmony_ci __builtin_choose_expr(((__x) & 0xffff), \ 19862306a36Sopenharmony_ci (compile_ffs16((__x))), \ 19962306a36Sopenharmony_ci (compile_ffs16((__x) >> 16) + 16)) 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci/* 20262306a36Sopenharmony_ci * This macro will check the requirements for the FIELD{8,16,32} macros 20362306a36Sopenharmony_ci * The mask should be a constant non-zero contiguous set of bits which 20462306a36Sopenharmony_ci * does not exceed the given typelimit. 20562306a36Sopenharmony_ci */ 20662306a36Sopenharmony_ci#define FIELD_CHECK(__mask, __type) \ 20762306a36Sopenharmony_ci BUILD_BUG_ON(!(__mask) || \ 20862306a36Sopenharmony_ci !is_valid_mask(__mask) || \ 20962306a36Sopenharmony_ci (__mask) != (__type)(__mask)) \ 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci#define FIELD8(__mask) \ 21262306a36Sopenharmony_ci({ \ 21362306a36Sopenharmony_ci FIELD_CHECK(__mask, u8); \ 21462306a36Sopenharmony_ci (struct rt2x00_field8) { \ 21562306a36Sopenharmony_ci compile_ffs8(__mask), (__mask) \ 21662306a36Sopenharmony_ci }; \ 21762306a36Sopenharmony_ci}) 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci#define FIELD16(__mask) \ 22062306a36Sopenharmony_ci({ \ 22162306a36Sopenharmony_ci FIELD_CHECK(__mask, u16); \ 22262306a36Sopenharmony_ci (struct rt2x00_field16) { \ 22362306a36Sopenharmony_ci compile_ffs16(__mask), (__mask) \ 22462306a36Sopenharmony_ci }; \ 22562306a36Sopenharmony_ci}) 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci#define FIELD32(__mask) \ 22862306a36Sopenharmony_ci({ \ 22962306a36Sopenharmony_ci FIELD_CHECK(__mask, u32); \ 23062306a36Sopenharmony_ci (struct rt2x00_field32) { \ 23162306a36Sopenharmony_ci compile_ffs32(__mask), (__mask) \ 23262306a36Sopenharmony_ci }; \ 23362306a36Sopenharmony_ci}) 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci#define SET_FIELD(__reg, __type, __field, __value)\ 23662306a36Sopenharmony_ci({ \ 23762306a36Sopenharmony_ci typecheck(__type, __field); \ 23862306a36Sopenharmony_ci *(__reg) &= ~((__field).bit_mask); \ 23962306a36Sopenharmony_ci *(__reg) |= ((__value) << \ 24062306a36Sopenharmony_ci ((__field).bit_offset)) & \ 24162306a36Sopenharmony_ci ((__field).bit_mask); \ 24262306a36Sopenharmony_ci}) 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci#define GET_FIELD(__reg, __type, __field) \ 24562306a36Sopenharmony_ci({ \ 24662306a36Sopenharmony_ci typecheck(__type, __field); \ 24762306a36Sopenharmony_ci ((__reg) & ((__field).bit_mask)) >> \ 24862306a36Sopenharmony_ci ((__field).bit_offset); \ 24962306a36Sopenharmony_ci}) 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci#define rt2x00_set_field32(__reg, __field, __value) \ 25262306a36Sopenharmony_ci SET_FIELD(__reg, struct rt2x00_field32, __field, __value) 25362306a36Sopenharmony_ci#define rt2x00_get_field32(__reg, __field) \ 25462306a36Sopenharmony_ci GET_FIELD(__reg, struct rt2x00_field32, __field) 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci#define rt2x00_set_field16(__reg, __field, __value) \ 25762306a36Sopenharmony_ci SET_FIELD(__reg, struct rt2x00_field16, __field, __value) 25862306a36Sopenharmony_ci#define rt2x00_get_field16(__reg, __field) \ 25962306a36Sopenharmony_ci GET_FIELD(__reg, struct rt2x00_field16, __field) 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci#define rt2x00_set_field8(__reg, __field, __value) \ 26262306a36Sopenharmony_ci SET_FIELD(__reg, struct rt2x00_field8, __field, __value) 26362306a36Sopenharmony_ci#define rt2x00_get_field8(__reg, __field) \ 26462306a36Sopenharmony_ci GET_FIELD(__reg, struct rt2x00_field8, __field) 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci#endif /* RT2X00REG_H */ 267