urtwn: add ROM structure for RTL8188EU

- Add the structure with already known fields offsets
  (some of them were taken from this driver,
  some (channel_plan, rf_* fields) - from TP-LINK official driver)
- Fix a typo / dehardcode a constant in RTL8192C ROM structure.

Tested with RTL8188EU, STA mode

Reviewed by:	kevlo
Approved by:	adrian (mentor)
Differential Revision:	https://reviews.freebsd.org/D4274
This commit is contained in:
avos 2016-01-17 00:52:21 +00:00
parent c9a5e0d116
commit f6c1bea004
3 changed files with 47 additions and 23 deletions

View File

@ -1707,27 +1707,22 @@ urtwn_read_rom(struct urtwn_softc *sc)
static int
urtwn_r88e_read_rom(struct urtwn_softc *sc)
{
uint8_t *rom = sc->rom.r88e_rom;
uint16_t addr;
int error, i;
struct r88e_rom *rom = &sc->rom.r88e_rom;
int error;
error = urtwn_efuse_read(sc, rom, sizeof(sc->rom.r88e_rom));
error = urtwn_efuse_read(sc, (uint8_t *)rom, sizeof(sc->rom.r88e_rom));
if (error != 0)
return (error);
addr = 0x10;
for (i = 0; i < 6; i++)
sc->cck_tx_pwr[i] = rom[addr++];
for (i = 0; i < 5; i++)
sc->ht40_tx_pwr[i] = rom[addr++];
sc->bw20_tx_pwr_diff = (rom[addr] & 0xf0) >> 4;
sc->bw20_tx_pwr_diff = (rom->tx_pwr_diff >> 4);
if (sc->bw20_tx_pwr_diff & 0x08)
sc->bw20_tx_pwr_diff |= 0xf0;
sc->ofdm_tx_pwr_diff = (rom[addr] & 0xf);
sc->ofdm_tx_pwr_diff = (rom->tx_pwr_diff & 0xf);
if (sc->ofdm_tx_pwr_diff & 0x08)
sc->ofdm_tx_pwr_diff |= 0xf0;
sc->regulatory = MS(rom[0xc1], R92C_ROM_RF1_REGULATORY);
IEEE80211_ADDR_COPY(sc->sc_ic.ic_macaddr, &rom[0xd7]);
sc->regulatory = MS(rom->rf_board_opt, R92C_ROM_RF1_REGULATORY);
DPRINTF("regulatory type=%d\n", sc->regulatory);
IEEE80211_ADDR_COPY(sc->sc_ic.ic_macaddr, rom->macaddr);
sc->sc_rf_write = urtwn_r88e_rf_write;
sc->sc_power_on = urtwn_r88e_power_on;
@ -3620,7 +3615,7 @@ urtwn_bb_init(struct urtwn_softc *sc)
urtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(0), 0x69553420);
urtwn_ms_delay(sc);
crystalcap = sc->rom.r88e_rom[0xb9];
crystalcap = sc->rom.r88e_rom.crystalcap;
if (crystalcap == 0xff)
crystalcap = 0x20;
crystalcap &= 0x3f;
@ -4002,6 +3997,7 @@ urtwn_r88e_get_txpower(struct urtwn_softc *sc, int chain,
uint16_t power[URTWN_RIDX_COUNT])
{
struct ieee80211com *ic = &sc->sc_ic;
struct r88e_rom *rom = &sc->rom.r88e_rom;
uint16_t cckpow, ofdmpow, bw20pow, htpow;
const struct urtwn_r88e_txpwr *base;
int ridx, chan, group;
@ -4040,14 +4036,14 @@ urtwn_r88e_get_txpower(struct urtwn_softc *sc, int chain,
}
/* Compute per-CCK rate Tx power. */
cckpow = sc->cck_tx_pwr[group];
cckpow = rom->cck_tx_pwr[group];
for (ridx = URTWN_RIDX_CCK1; ridx <= URTWN_RIDX_CCK11; ridx++) {
power[ridx] += cckpow;
if (power[ridx] > R92C_MAX_TX_PWR)
power[ridx] = R92C_MAX_TX_PWR;
}
htpow = sc->ht40_tx_pwr[group];
htpow = rom->ht40_tx_pwr[group];
/* Compute per-OFDM rate Tx power. */
ofdmpow = htpow + sc->ofdm_tx_pwr_diff;

View File

@ -953,7 +953,7 @@ struct r92c_rom {
uint16_t reserved3;
uint8_t usb_phy;
uint8_t reserved4[3];
uint8_t macaddr[6];
uint8_t macaddr[IEEE80211_ADDR_LEN];
uint8_t string[61]; /* "Realtek" */
uint8_t subcustomer_id;
uint8_t cck_tx_pwr[R92C_MAX_CHAINS][3];
@ -982,7 +982,37 @@ struct r92c_rom {
uint8_t rf_opt4;
uint8_t channel_plan;
uint8_t version;
uint8_t curstomer_id;
uint8_t customer_id;
} __packed;
/*
* RTL8188EU ROM image.
*/
struct r88e_rom {
uint8_t reserved1[16];
uint8_t cck_tx_pwr[6];
uint8_t ht40_tx_pwr[5];
uint8_t tx_pwr_diff;
uint8_t reserved2[156];
uint8_t channel_plan;
uint8_t crystalcap;
uint8_t reserved3[7];
uint8_t rf_board_opt;
uint8_t rf_feature_opt;
uint8_t rf_bt_opt;
uint8_t version;
uint8_t customer_id;
uint8_t reserved4[3];
uint8_t rf_ant_opt;
uint8_t reserved5[6];
uint16_t vid;
uint16_t pid;
uint8_t usb_opt;
uint8_t reserved6[2];
uint8_t macaddr[IEEE80211_ADDR_LEN];
uint8_t reserved7[2];
uint8_t string[33]; /* "realtek 802.11n NIC" */
uint8_t reserved8[256];
} __packed;
#define URTWN_EFUSE_MAX_LEN 512

View File

@ -141,7 +141,7 @@ enum {
union urtwn_rom {
struct r92c_rom r92c_rom;
uint8_t r88e_rom[URTWN_EFUSE_MAX_LEN];
struct r88e_rom r88e_rom;
};
struct urtwn_softc {
@ -176,6 +176,8 @@ struct urtwn_softc {
uint8_t board_type;
uint8_t regulatory;
uint8_t pa_setting;
int8_t ofdm_tx_pwr_diff;
int8_t bw20_tx_pwr_diff;
int avg_pwdb;
int thcal_state;
int thcal_lctemp;
@ -199,10 +201,6 @@ struct urtwn_softc {
void *fw_virtaddr;
union urtwn_rom rom;
uint8_t cck_tx_pwr[6];
uint8_t ht40_tx_pwr[5];
int8_t bw20_tx_pwr_diff;
int8_t ofdm_tx_pwr_diff;
uint16_t last_rom_addr;
struct callout sc_watchdog_ch;