Author: avos
Date: Sun Jan 17 00:52:21 2016
New Revision: 294198
URL: https://svnweb.freebsd.org/changeset/base/294198

Log:
  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

Modified:
  head/sys/dev/usb/wlan/if_urtwn.c
  head/sys/dev/usb/wlan/if_urtwnreg.h
  head/sys/dev/usb/wlan/if_urtwnvar.h

Modified: head/sys/dev/usb/wlan/if_urtwn.c
==============================================================================
--- head/sys/dev/usb/wlan/if_urtwn.c    Sun Jan 17 00:14:22 2016        
(r294197)
+++ head/sys/dev/usb/wlan/if_urtwn.c    Sun Jan 17 00:52:21 2016        
(r294198)
@@ -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_soft
     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_soft
        }
 
        /* 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;

Modified: head/sys/dev/usb/wlan/if_urtwnreg.h
==============================================================================
--- head/sys/dev/usb/wlan/if_urtwnreg.h Sun Jan 17 00:14:22 2016        
(r294197)
+++ head/sys/dev/usb/wlan/if_urtwnreg.h Sun Jan 17 00:52:21 2016        
(r294198)
@@ -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

Modified: head/sys/dev/usb/wlan/if_urtwnvar.h
==============================================================================
--- head/sys/dev/usb/wlan/if_urtwnvar.h Sun Jan 17 00:14:22 2016        
(r294197)
+++ head/sys/dev/usb/wlan/if_urtwnvar.h Sun Jan 17 00:52:21 2016        
(r294198)
@@ -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;
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to