Index: head/sys/dev/usb/wlan/if_urtwn.c =================================================================== --- head/sys/dev/usb/wlan/if_urtwn.c +++ head/sys/dev/usb/wlan/if_urtwn.c @@ -1707,27 +1707,22 @@ 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_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 @@ 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 @@ } /* 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; Index: head/sys/dev/usb/wlan/if_urtwnreg.h =================================================================== --- head/sys/dev/usb/wlan/if_urtwnreg.h +++ head/sys/dev/usb/wlan/if_urtwnreg.h @@ -953,7 +953,7 @@ 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 @@ 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 Index: head/sys/dev/usb/wlan/if_urtwnvar.h =================================================================== --- head/sys/dev/usb/wlan/if_urtwnvar.h +++ head/sys/dev/usb/wlan/if_urtwnvar.h @@ -141,7 +141,7 @@ 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 @@ 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 @@ 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;