653-0003-rtl8xxxu-Add-initial-code-to-parse-8188eu-efuse.patch 3.4 KB

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