17453645fSAndriy Voskoboinyk /*- 27453645fSAndriy Voskoboinyk * Copyright (c) 2016 Andriy Voskoboinyk <avos@FreeBSD.org> 37453645fSAndriy Voskoboinyk * All rights reserved. 47453645fSAndriy Voskoboinyk * 57453645fSAndriy Voskoboinyk * Redistribution and use in source and binary forms, with or without 67453645fSAndriy Voskoboinyk * modification, are permitted provided that the following conditions 77453645fSAndriy Voskoboinyk * are met: 87453645fSAndriy Voskoboinyk * 1. Redistributions of source code must retain the above copyright 97453645fSAndriy Voskoboinyk * notice, this list of conditions and the following disclaimer. 107453645fSAndriy Voskoboinyk * 2. Redistributions in binary form must reproduce the above copyright 117453645fSAndriy Voskoboinyk * notice, this list of conditions and the following disclaimer in the 127453645fSAndriy Voskoboinyk * documentation and/or other materials provided with the distribution. 137453645fSAndriy Voskoboinyk * 147453645fSAndriy Voskoboinyk * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 157453645fSAndriy Voskoboinyk * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 167453645fSAndriy Voskoboinyk * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 177453645fSAndriy Voskoboinyk * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 187453645fSAndriy Voskoboinyk * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 197453645fSAndriy Voskoboinyk * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 207453645fSAndriy Voskoboinyk * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 217453645fSAndriy Voskoboinyk * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 227453645fSAndriy Voskoboinyk * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 237453645fSAndriy Voskoboinyk * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 247453645fSAndriy Voskoboinyk * SUCH DAMAGE. 257453645fSAndriy Voskoboinyk */ 267453645fSAndriy Voskoboinyk 277453645fSAndriy Voskoboinyk #ifndef R12A_ROM_IMAGE_H 287453645fSAndriy Voskoboinyk #define R12A_ROM_IMAGE_H 297453645fSAndriy Voskoboinyk 307453645fSAndriy Voskoboinyk #include <dev/rtwn/rtl8812a/r12a_rom_defs.h> 317453645fSAndriy Voskoboinyk 327453645fSAndriy Voskoboinyk #define R12A_DEF_TX_PWR_2G 0x2d 337453645fSAndriy Voskoboinyk #define R12A_DEF_TX_PWR_5G 0xfe 347453645fSAndriy Voskoboinyk 357453645fSAndriy Voskoboinyk struct r12a_tx_pwr_2g { 367453645fSAndriy Voskoboinyk uint8_t cck[R12A_GROUP_2G]; 377453645fSAndriy Voskoboinyk uint8_t ht40[R12A_GROUP_2G - 1]; 387453645fSAndriy Voskoboinyk } __packed; 397453645fSAndriy Voskoboinyk 407453645fSAndriy Voskoboinyk struct r12a_tx_pwr_diff_2g { 417453645fSAndriy Voskoboinyk uint8_t ht20_ofdm; 427453645fSAndriy Voskoboinyk struct { 437453645fSAndriy Voskoboinyk uint8_t ht40_ht20; 447453645fSAndriy Voskoboinyk uint8_t ofdm_cck; 457453645fSAndriy Voskoboinyk } __packed diff123[R12A_MAX_TX_COUNT - 1]; 467453645fSAndriy Voskoboinyk } __packed; 477453645fSAndriy Voskoboinyk 487453645fSAndriy Voskoboinyk struct r12a_tx_pwr_5g { 497453645fSAndriy Voskoboinyk uint8_t ht40[R12A_GROUP_5G]; 507453645fSAndriy Voskoboinyk } __packed; 517453645fSAndriy Voskoboinyk 527453645fSAndriy Voskoboinyk struct r12a_tx_pwr_diff_5g { 537453645fSAndriy Voskoboinyk uint8_t ht20_ofdm; 547453645fSAndriy Voskoboinyk uint8_t ht40_ht20[R12A_MAX_TX_COUNT - 1]; 557453645fSAndriy Voskoboinyk uint8_t ofdm_ofdm[2]; 567453645fSAndriy Voskoboinyk uint8_t ht80_ht160[R12A_MAX_TX_COUNT]; 577453645fSAndriy Voskoboinyk } __packed; 587453645fSAndriy Voskoboinyk 597453645fSAndriy Voskoboinyk struct r12a_tx_pwr { 607453645fSAndriy Voskoboinyk struct r12a_tx_pwr_2g pwr_2g; 617453645fSAndriy Voskoboinyk struct r12a_tx_pwr_diff_2g pwr_diff_2g; 627453645fSAndriy Voskoboinyk struct r12a_tx_pwr_5g pwr_5g; 637453645fSAndriy Voskoboinyk struct r12a_tx_pwr_diff_5g pwr_diff_5g; 647453645fSAndriy Voskoboinyk } __packed; 657453645fSAndriy Voskoboinyk 667453645fSAndriy Voskoboinyk /* 677453645fSAndriy Voskoboinyk * RTL8812AU/RTL8821AU ROM image. 687453645fSAndriy Voskoboinyk */ 697453645fSAndriy Voskoboinyk struct r12a_rom { 707453645fSAndriy Voskoboinyk uint8_t reserved1[16]; 717453645fSAndriy Voskoboinyk struct r12a_tx_pwr tx_pwr[R12A_MAX_RF_PATH]; 727453645fSAndriy Voskoboinyk uint8_t channel_plan; 737453645fSAndriy Voskoboinyk uint8_t crystalcap; 747453645fSAndriy Voskoboinyk #define R12A_ROM_CRYSTALCAP_DEF 0x20 757453645fSAndriy Voskoboinyk 767453645fSAndriy Voskoboinyk uint8_t thermal_meter; 777453645fSAndriy Voskoboinyk uint8_t iqk_lck; 787453645fSAndriy Voskoboinyk uint8_t pa_type; 797453645fSAndriy Voskoboinyk #define R12A_ROM_IS_PA_EXT_2GHZ(pa_type) (((pa_type) & 0x30) == 0x30) 807453645fSAndriy Voskoboinyk #define R12A_ROM_IS_PA_EXT_5GHZ(pa_type) (((pa_type) & 0x03) == 0x03) 817453645fSAndriy Voskoboinyk #define R21A_ROM_IS_PA_EXT_2GHZ(pa_type) (((pa_type) & 0x10) == 0x10) 827453645fSAndriy Voskoboinyk #define R21A_ROM_IS_PA_EXT_5GHZ(pa_type) (((pa_type) & 0x01) == 0x01) 837453645fSAndriy Voskoboinyk 847453645fSAndriy Voskoboinyk uint8_t lna_type_2g; 857453645fSAndriy Voskoboinyk #define R12A_ROM_IS_LNA_EXT(lna_type) (((lna_type) & 0x88) == 0x88) 867453645fSAndriy Voskoboinyk #define R21A_ROM_IS_LNA_EXT(lna_type) (((lna_type) & 0x08) == 0x08) 877453645fSAndriy Voskoboinyk 887453645fSAndriy Voskoboinyk #define R12A_GET_ROM_PA_TYPE(lna_type, chain) \ 897453645fSAndriy Voskoboinyk (((lna_type) >> ((chain) * 4 + 2)) & 0x01) 907453645fSAndriy Voskoboinyk #define R12A_GET_ROM_LNA_TYPE(lna_type, chain) \ 917453645fSAndriy Voskoboinyk (((lna_type) >> ((chain) * 4)) & 0x03) 927453645fSAndriy Voskoboinyk 937453645fSAndriy Voskoboinyk uint8_t reserved2; 947453645fSAndriy Voskoboinyk uint8_t lna_type_5g; 957453645fSAndriy Voskoboinyk uint8_t reserved3; 967453645fSAndriy Voskoboinyk uint8_t rf_board_opt; 977453645fSAndriy Voskoboinyk #define R12A_BOARD_TYPE_COMBO_MF 5 987453645fSAndriy Voskoboinyk 997453645fSAndriy Voskoboinyk uint8_t rf_feature_opt; 1007453645fSAndriy Voskoboinyk uint8_t rf_bt_opt; 1017453645fSAndriy Voskoboinyk #define R12A_RF_BT_OPT_ANT_NUM 0x01 1027453645fSAndriy Voskoboinyk 1037453645fSAndriy Voskoboinyk uint8_t version; 1047453645fSAndriy Voskoboinyk uint8_t customer_id; 1057453645fSAndriy Voskoboinyk uint8_t tx_bbswing_2g; 1067453645fSAndriy Voskoboinyk uint8_t tx_bbswing_5g; 1077453645fSAndriy Voskoboinyk uint8_t tx_pwr_calib_rate; 1087453645fSAndriy Voskoboinyk uint8_t rf_ant_opt; 1097453645fSAndriy Voskoboinyk uint8_t rfe_option; 1107453645fSAndriy Voskoboinyk uint8_t reserved4[5]; 1117453645fSAndriy Voskoboinyk uint16_t vid_12a; 1127453645fSAndriy Voskoboinyk uint16_t pid_12a; 1137453645fSAndriy Voskoboinyk uint8_t reserved5[3]; 1147453645fSAndriy Voskoboinyk uint8_t macaddr_12a[IEEE80211_ADDR_LEN]; 115*f55d404dSKevin Lo uint8_t reserved6[2]; 116*f55d404dSKevin Lo uint8_t string_12a[8]; /* "Realtek " */ 117*f55d404dSKevin Lo uint8_t reserved7[25]; 1187453645fSAndriy Voskoboinyk uint16_t vid_21a; 1197453645fSAndriy Voskoboinyk uint16_t pid_21a; 120*f55d404dSKevin Lo uint8_t reserved8[3]; 1217453645fSAndriy Voskoboinyk uint8_t macaddr_21a[IEEE80211_ADDR_LEN]; 1227453645fSAndriy Voskoboinyk uint8_t reserved9[2]; 123*f55d404dSKevin Lo uint8_t string_21a[8]; /* "Realtek " */ 124*f55d404dSKevin Lo uint8_t reserved10[2]; 1257453645fSAndriy Voskoboinyk uint8_t string_ven[23]; /* XXX variable length? */ 126*f55d404dSKevin Lo uint8_t reserved11[208]; 1277453645fSAndriy Voskoboinyk } __packed; 1287453645fSAndriy Voskoboinyk 1297453645fSAndriy Voskoboinyk _Static_assert(sizeof(struct r12a_rom) == R12A_EFUSE_MAP_LEN, 1307453645fSAndriy Voskoboinyk "R12A_EFUSE_MAP_LEN must be equal to sizeof(struct r12a_rom)!"); 1317453645fSAndriy Voskoboinyk 1327453645fSAndriy Voskoboinyk #endif /* R12A_ROM_IMAGE_H */ 133