From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
To: Ping-Ke Shih <pkshih@realtek.com>,
"linux-wireless@vger.kernel.org" <linux-wireless@vger.kernel.org>
Cc: Sascha Hauer <sha@pengutronix.de>
Subject: Re: [PATCH] wifi: rtw88: Add support for LED blinking
Date: Sun, 5 Jan 2025 19:03:04 +0200 [thread overview]
Message-ID: <7fa4233a-89e4-4ea1-bd0a-ddcce2053686@gmail.com> (raw)
In-Reply-To: <487122e41b4c43bd83e2df54ef16f399@realtek.com>
On 02/01/2025 03:48, Ping-Ke Shih wrote:
> Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
>> Register a struct led_classdev with the kernel's LED subsystem and
>> create a throughput-based trigger for it. Then mac80211 makes the LED
>> blink.
>>
>> Tested with Tenda U12 (RTL8812AU), Tenda U9 (RTL8811CU), TP-Link Archer
>> T2U Nano (RTL8811AU), TP-Link Archer T3U Plus (RTL8812BU), Edimax
>> EW-7611UCB (RTL8821AU), LM842 (RTL8822CU).
>>
>> Also tested with devices which don't have LEDs: the laptop's internal
>> RTL8822CE and a no-name RTL8723DU.
>>
>> Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
>> ---
>> drivers/net/wireless/realtek/rtw88/main.c | 91 ++++++++++++++++++-
>> drivers/net/wireless/realtek/rtw88/main.h | 9 ++
>> drivers/net/wireless/realtek/rtw88/reg.h | 12 +++
>> drivers/net/wireless/realtek/rtw88/rtw8812a.c | 23 +++++
>> drivers/net/wireless/realtek/rtw88/rtw8821a.c | 32 +++++++
>> drivers/net/wireless/realtek/rtw88/rtw8821c.c | 25 +++++
>> drivers/net/wireless/realtek/rtw88/rtw8822b.c | 25 +++++
>> drivers/net/wireless/realtek/rtw88/rtw8822c.c | 25 +++++
>> 8 files changed, 240 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
>> index 6993f93c8f06..387940839f8b 100644
>> --- a/drivers/net/wireless/realtek/rtw88/main.c
>> +++ b/drivers/net/wireless/realtek/rtw88/main.c
>> @@ -2221,6 +2221,86 @@ void rtw_core_deinit(struct rtw_dev *rtwdev)
>> }
>> EXPORT_SYMBOL(rtw_core_deinit);
>>
>> +#ifdef CONFIG_LEDS_CLASS
>
> Not prefer to have #ifdef in code. Please add a led.c and add an entry
> obj-$(CONFIG_LEDS_CLASS) += led.c
> to Makefile.
>
> Since you enclose whole functions, it looks not a big problem for this case.
> But I still want to avoid using of #ifdef to prevent people imitate this wrongly.
>
>> +
>> +static int rtw_led_set_blocking(struct led_classdev *led,
>> + enum led_brightness brightness)
>> +{
>> + struct rtw_dev *rtwdev = container_of(led, struct rtw_dev, led_cdev);
>> +
>> + rtwdev->chip->ops->led_set(led, brightness);
>> +
>> + return 0;
>> +}
>> +
>> +static void rtw_led_init(struct rtw_dev *rtwdev)
>> +{
>> + static const struct ieee80211_tpt_blink rtw_tpt_blink[] = {
>> + { .throughput = 0 * 1024, .blink_time = 334 },
>> + { .throughput = 1 * 1024, .blink_time = 260 },
>> + { .throughput = 5 * 1024, .blink_time = 220 },
>> + { .throughput = 10 * 1024, .blink_time = 190 },
>> + { .throughput = 20 * 1024, .blink_time = 170 },
>> + { .throughput = 50 * 1024, .blink_time = 150 },
>> + { .throughput = 70 * 1024, .blink_time = 130 },
>> + { .throughput = 100 * 1024, .blink_time = 110 },
>> + { .throughput = 200 * 1024, .blink_time = 80 },
>> + { .throughput = 300 * 1024, .blink_time = 50 },
>> + };
>> + struct led_classdev *led = &rtwdev->led_cdev;
>> + int err;
>> +
>> + if (!rtwdev->chip->ops->led_set)
>> + return;
>> +
>> + if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB)
>> + led->brightness_set_blocking = rtw_led_set_blocking;
>> + else
>> + led->brightness_set = rtwdev->chip->ops->led_set;
>> +
>> + snprintf(rtwdev->led_name, sizeof(rtwdev->led_name),
>> + "rtw88-%s", dev_name(rtwdev->dev));
>> +
>> + led->name = rtwdev->led_name;
>> + led->max_brightness = LED_ON;
>> + led->default_trigger =
>> + ieee80211_create_tpt_led_trigger(rtwdev->hw,
>> + IEEE80211_TPT_LEDTRIG_FL_RADIO,
>> + rtw_tpt_blink,
>> + ARRAY_SIZE(rtw_tpt_blink));
>> +
>> + err = led_classdev_register(rtwdev->dev, led);
>> + if (err) {
>> + rtw_warn(rtwdev, "Failed to register the LED, error %d\n", err);
>> + return;
>> + }
>> +
>> + rtwdev->led_registered = true;
>> +}
>> +
>> +static void rtw_led_deinit(struct rtw_dev *rtwdev)
>> +{
>> + struct led_classdev *led = &rtwdev->led_cdev;
>> +
>> + if (!rtwdev->led_registered)
>> + return;
>> +
>> + rtwdev->chip->ops->led_set(led, LED_OFF);
>> + led_classdev_unregister(led);
>> +}
>> +
>> +#else
>> +
>> +static void rtw_led_init(struct rtw_dev *rtwdev)
>> +{
>> +}
>> +
>> +static void rtw_led_deinit(struct rtw_dev *rtwdev)
>> +{
>> +}
>> +
>> +#endif
>> +
>
> [...]
>
>> diff --git a/drivers/net/wireless/realtek/rtw88/rtw8812a.c
>> b/drivers/net/wireless/realtek/rtw88/rtw8812a.c
>> index 21795286a1a0..e16ba8d8a792 100644
>> --- a/drivers/net/wireless/realtek/rtw88/rtw8812a.c
>> +++ b/drivers/net/wireless/realtek/rtw88/rtw8812a.c
>> @@ -868,6 +868,26 @@ static void rtw8812a_pwr_track(struct rtw_dev *rtwdev)
>> dm_info->pwr_trk_triggered = false;
>> }
>>
>> +#ifdef CONFIG_LEDS_CLASS
>> +
>> +static void rtw8812a_led_set(struct led_classdev *led,
>> + enum led_brightness brightness)
>> +{
>> + struct rtw_dev *rtwdev = container_of(led, struct rtw_dev, led_cdev);
>> + u8 ledcfg;
>> +
>> + ledcfg = rtw_read8(rtwdev, REG_LED_CFG);
>> + ledcfg &= BIT(6) | BIT(4);
>> + ledcfg |= BIT(5);
>> +
>> + if (brightness == LED_OFF)
>> + ledcfg |= BIT(3);
>> +
>> + rtw_write8(rtwdev, REG_LED_CFG, ledcfg);
>> +}
>> +
>> +#endif
>> +
>> static void rtw8812a_fill_txdesc_checksum(struct rtw_dev *rtwdev,
>> struct rtw_tx_pkt_info *pkt_info,
>> u8 *txdesc)
>> @@ -916,6 +936,9 @@ static const struct rtw_chip_ops rtw8812a_ops = {
>> .config_bfee = NULL,
>> .set_gid_table = NULL,
>> .cfg_csi_rate = NULL,
>> +#ifdef CONFIG_LEDS_CLASS
>> + .led_set = rtw8812a_led_set,
>> +#endif
>
> Just build the code without checking CONFIG_LEDS_CLASS.
> It will waste some space, but acceptable.
>
> before after delta
> rtw8812a.o 15619 15771 152
> rtw8821a.o 12922 13186 264
> rtw8821c.o 18890 19034 144
> rtw8822b.o 24860 25004 144
> rtw8822c.o 65963 66155 192
>
> Also I'm thinking if we can move rtw8812a_led_set to led.c as well. However,
> it looks very different from chip to chip.
>
>
Yes, and RTL8814A will add one more unique led_set function.
prev parent reply other threads:[~2025-01-05 17:03 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-01 16:38 [PATCH] wifi: rtw88: Add support for LED blinking Bitterblue Smith
2025-01-02 1:48 ` Ping-Ke Shih
2025-01-05 17:03 ` Bitterblue Smith [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7fa4233a-89e4-4ea1-bd0a-ddcce2053686@gmail.com \
--to=rtl8821cerfe2@gmail.com \
--cc=linux-wireless@vger.kernel.org \
--cc=pkshih@realtek.com \
--cc=sha@pengutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).