mt76: update to the latest version
[oweals/openwrt.git] / package / kernel / mac80211 / patches / 653-0003-rtl8xxxu-Add-initial-code-to-parse-8188eu-efuse.patch
1 From 6d5b4ef30046d74efe773613767d13d9ab95ed3d Mon Sep 17 00:00:00 2001
2 From: Jes Sorensen <Jes.Sorensen@redhat.com>
3 Date: Mon, 27 Jun 2016 15:19:04 -0400
4 Subject: [PATCH] rtl8xxxu: Add initial code to parse 8188eu efuse
5
6 This obtains the MAC address, but work is still needed to handle TX
7 power settings.
8
9 Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
10 ---
11  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h   | 40 ++++++++++++++++++++++
12  .../net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c | 34 ++++++++++++++++++
13  2 files changed, 74 insertions(+)
14
15 --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
16 +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
17 @@ -872,6 +872,45 @@ struct rtl8192eu_efuse {
18         u8 res14[0xc3];
19  };
20  
21 +struct rtl8188eu_efuse {
22 +       __le16 rtl_id;
23 +       u8 res0[0x0e];
24 +       u8 cck_tx_power_index_A[3];     /* 0x10 */
25 +       u8 cck_tx_power_index_B[3];
26 +       u8 ht40_1s_tx_power_index_A[3]; /* 0x16 */
27 +       u8 ht40_1s_tx_power_index_B[3];
28 +       u8 res1[0x9c];
29 +       u8 channel_plan;                /* 0xb8 */
30 +       u8 xtal_k;
31 +       u8 thermal_meter;
32 +       u8 iqk_lck;
33 +       u8 res2[5];
34 +       u8 rf_board_option;
35 +       u8 rf_feature_option;
36 +       u8 rf_bt_setting;
37 +       u8 eeprom_version;
38 +       u8 eeprom_customer_id;
39 +       u8 res3[3];
40 +       u8 rf_antenna_option;           /* 0xc9 */
41 +       u8 res4[6];
42 +       u8 vid;                         /* 0xd0 */
43 +       u8 res5[1];
44 +       u8 pid;                         /* 0xd2 */
45 +       u8 res6[1];
46 +       u8 usb_optional_function;
47 +       u8 res7[2];
48 +       u8 mac_addr[ETH_ALEN];          /* 0xd7 */
49 +       u8 res8[2];
50 +       u8 vendor_name[7];
51 +       u8 res9[2];
52 +       u8 device_name[0x0b];           /* 0xe8 */
53 +       u8 res10[2];
54 +       u8 serial[0x0b];                /* 0xf5 */
55 +       u8 res11[0x30];
56 +       u8 unknown[0x0d];               /* 0x130 */
57 +       u8 res12[0xc3];
58 +};
59 +
60  struct rtl8xxxu_reg8val {
61         u16 reg;
62         u8 val;
63 @@ -1290,6 +1329,7 @@ struct rtl8xxxu_priv {
64                 struct rtl8723bu_efuse efuse8723bu;
65                 struct rtl8192cu_efuse efuse8192;
66                 struct rtl8192eu_efuse efuse8192eu;
67 +               struct rtl8188eu_efuse efuse8188eu;
68         } efuse_wifi;
69         u32 adda_backup[RTL8XXXU_ADDA_REGS];
70         u32 mac_backup[RTL8XXXU_MAC_REGS];
71 --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
72 +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
73 @@ -42,6 +42,40 @@
74  
75  static int rtl8188eu_parse_efuse(struct rtl8xxxu_priv *priv)
76  {
77 +       struct rtl8188eu_efuse *efuse = &priv->efuse_wifi.efuse8188eu;
78 +       int i;
79 +
80 +       if (efuse->rtl_id != cpu_to_le16(0x8129))
81 +               return -EINVAL;
82 +
83 +       ether_addr_copy(priv->mac_addr, efuse->mac_addr);
84 +
85 +       memcpy(priv->cck_tx_power_index_A, efuse->cck_tx_power_index_A,
86 +              sizeof(efuse->cck_tx_power_index_A));
87 +       memcpy(priv->cck_tx_power_index_B, efuse->cck_tx_power_index_B,
88 +              sizeof(efuse->cck_tx_power_index_B));
89 +
90 +       memcpy(priv->ht40_1s_tx_power_index_A,
91 +              priv->efuse_wifi.efuse8188eu.ht40_1s_tx_power_index_A,
92 +              sizeof(priv->ht40_1s_tx_power_index_A));
93 +       memcpy(priv->ht40_1s_tx_power_index_B,
94 +              priv->efuse_wifi.efuse8188eu.ht40_1s_tx_power_index_B,
95 +              sizeof(priv->ht40_1s_tx_power_index_B));
96 +
97 +       dev_info(&priv->udev->dev, "Vendor: %.7s\n", efuse->vendor_name);
98 +       dev_info(&priv->udev->dev, "Product: %.11s\n", efuse->device_name);
99 +       dev_info(&priv->udev->dev, "Serial: %.11s\n", efuse->serial);
100 +
101 +       if (rtl8xxxu_debug & RTL8XXXU_DEBUG_EFUSE) {
102 +               unsigned char *raw = priv->efuse_wifi.raw;
103 +
104 +               dev_info(&priv->udev->dev,
105 +                        "%s: dumping efuse (0x%02zx bytes):\n",
106 +                        __func__, sizeof(struct rtl8188eu_efuse));
107 +               for (i = 0; i < sizeof(struct rtl8188eu_efuse); i += 8)
108 +                       dev_info(&priv->udev->dev, "%02x: %8ph\n", i, &raw[i]);
109 +       }
110 +
111         return 0;
112  }
113