002-01-v6.9-wifi-rtl8xxxu-Fix-LED-control-code-of-RTL8192FU.patch 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. From 9475cc7ac31503521af95e38151e9d856e8ff30b Mon Sep 17 00:00:00 2001
  2. From: Bitterblue Smith <[email protected]>
  3. Date: Sun, 31 Dec 2023 00:45:54 +0200
  4. Subject: [PATCH 1/2] wifi: rtl8xxxu: Fix LED control code of RTL8192FU
  5. Some devices, like the Comfast CF-826F, use LED1, which already works.
  6. Others, like Asus USB-N13 C1, use LED0, which doesn't work correctly.
  7. Write the right values to the LED control registers to make LED0 work
  8. as well.
  9. This is unfortunately tested only with the Comfast CF-826F.
  10. Signed-off-by: Bitterblue Smith <[email protected]>
  11. Reviewed-by: Ping-Ke Shih <[email protected]>
  12. Signed-off-by: Kalle Valo <[email protected]>
  13. Link: https://msgid.link/[email protected]
  14. ---
  15. .../realtek/rtl8xxxu/rtl8xxxu_8192f.c | 32 +++++++++++++------
  16. .../wireless/realtek/rtl8xxxu/rtl8xxxu_regs.h | 15 +++++++++
  17. 2 files changed, 38 insertions(+), 9 deletions(-)
  18. --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192f.c
  19. +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192f.c
  20. @@ -2014,26 +2014,40 @@ static int rtl8192fu_led_brightness_set(
  21. struct rtl8xxxu_priv *priv = container_of(led_cdev,
  22. struct rtl8xxxu_priv,
  23. led_cdev);
  24. - u16 ledcfg;
  25. + u32 ledcfg;
  26. /* Values obtained by observing the USB traffic from the Windows driver. */
  27. rtl8xxxu_write32(priv, REG_SW_GPIO_SHARE_CTRL_0, 0x20080);
  28. rtl8xxxu_write32(priv, REG_SW_GPIO_SHARE_CTRL_1, 0x1b0000);
  29. - ledcfg = rtl8xxxu_read16(priv, REG_LEDCFG0);
  30. + ledcfg = rtl8xxxu_read32(priv, REG_LEDCFG0);
  31. +
  32. + /* Comfast CF-826F uses LED1. Asus USB-N13 C1 uses LED0. Set both. */
  33. +
  34. + u32p_replace_bits(&ledcfg, LED_GPIO_ENABLE, LEDCFG0_LED2EN);
  35. + u32p_replace_bits(&ledcfg, LED_IO_MODE_OUTPUT, LEDCFG0_LED0_IO_MODE);
  36. + u32p_replace_bits(&ledcfg, LED_IO_MODE_OUTPUT, LEDCFG0_LED1_IO_MODE);
  37. if (brightness == LED_OFF) {
  38. - /* Value obtained like above. */
  39. - ledcfg = BIT(1) | BIT(7);
  40. + u32p_replace_bits(&ledcfg, LED_MODE_SW_CTRL, LEDCFG0_LED0CM);
  41. + u32p_replace_bits(&ledcfg, LED_SW_OFF, LEDCFG0_LED0SV);
  42. + u32p_replace_bits(&ledcfg, LED_MODE_SW_CTRL, LEDCFG0_LED1CM);
  43. + u32p_replace_bits(&ledcfg, LED_SW_OFF, LEDCFG0_LED1SV);
  44. } else if (brightness == LED_ON) {
  45. - /* Value obtained like above. */
  46. - ledcfg = BIT(1) | BIT(7) | BIT(11);
  47. + u32p_replace_bits(&ledcfg, LED_MODE_SW_CTRL, LEDCFG0_LED0CM);
  48. + u32p_replace_bits(&ledcfg, LED_SW_ON, LEDCFG0_LED0SV);
  49. + u32p_replace_bits(&ledcfg, LED_MODE_SW_CTRL, LEDCFG0_LED1CM);
  50. + u32p_replace_bits(&ledcfg, LED_SW_ON, LEDCFG0_LED1SV);
  51. } else if (brightness == RTL8XXXU_HW_LED_CONTROL) {
  52. - /* Value obtained by brute force. */
  53. - ledcfg = BIT(8) | BIT(9);
  54. + u32p_replace_bits(&ledcfg, LED_MODE_TX_OR_RX_EVENTS,
  55. + LEDCFG0_LED0CM);
  56. + u32p_replace_bits(&ledcfg, LED_SW_OFF, LEDCFG0_LED0SV);
  57. + u32p_replace_bits(&ledcfg, LED_MODE_TX_OR_RX_EVENTS,
  58. + LEDCFG0_LED1CM);
  59. + u32p_replace_bits(&ledcfg, LED_SW_OFF, LEDCFG0_LED1SV);
  60. }
  61. - rtl8xxxu_write16(priv, REG_LEDCFG0, ledcfg);
  62. + rtl8xxxu_write32(priv, REG_LEDCFG0, ledcfg);
  63. return 0;
  64. }
  65. --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_regs.h
  66. +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_regs.h
  67. @@ -146,6 +146,21 @@
  68. #define GPIO_INTM_EDGE_TRIG_IRQ BIT(9)
  69. #define REG_LEDCFG0 0x004c
  70. +#define LEDCFG0_LED0CM GENMASK(2, 0)
  71. +#define LEDCFG0_LED1CM GENMASK(10, 8)
  72. +#define LED_MODE_SW_CTRL 0x0
  73. +#define LED_MODE_TX_OR_RX_EVENTS 0x3
  74. +#define LEDCFG0_LED0SV BIT(3)
  75. +#define LEDCFG0_LED1SV BIT(11)
  76. +#define LED_SW_OFF 0x0
  77. +#define LED_SW_ON 0x1
  78. +#define LEDCFG0_LED0_IO_MODE BIT(7)
  79. +#define LEDCFG0_LED1_IO_MODE BIT(15)
  80. +#define LED_IO_MODE_OUTPUT 0x0
  81. +#define LED_IO_MODE_INPUT 0x1
  82. +#define LEDCFG0_LED2EN BIT(21)
  83. +#define LED_GPIO_DISABLE 0x0
  84. +#define LED_GPIO_ENABLE 0x1
  85. #define LEDCFG0_DPDT_SELECT BIT(23)
  86. #define REG_LEDCFG1 0x004d
  87. #define LEDCFG1_HW_LED_CONTROL BIT(1)