Search Linux Wireless

RE: [PATCH 1/4] wifi: rtl8xxxu: Register the LED and make it blink

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> -----Original Message-----
> From: Bitterblue Smith <rtl8821cerfe2@xxxxxxxxx>
> Sent: Wednesday, January 18, 2023 9:53 PM
> To: Ping-Ke Shih <pkshih@xxxxxxxxxxx>; linux-wireless@xxxxxxxxxxxxxxx
> Cc: Jes Sorensen <Jes.Sorensen@xxxxxxxxx>
> Subject: Re: [PATCH 1/4] wifi: rtl8xxxu: Register the LED and make it blink
> 
> On 18/01/2023 02:52, Ping-Ke Shih wrote:
> >
> >
> >> -----Original Message-----
> >> From: Bitterblue Smith <rtl8821cerfe2@xxxxxxxxx>
> >> Sent: Wednesday, January 18, 2023 6:03 AM
> >> To: linux-wireless@xxxxxxxxxxxxxxx
> >> Cc: Jes Sorensen <Jes.Sorensen@xxxxxxxxx>; Ping-Ke Shih <pkshih@xxxxxxxxxxx>
> >> Subject: [PATCH 1/4] wifi: rtl8xxxu: Register the LED and make it blink
> >>
> >> If the chip can have an LED, register a struct led_classdev and enable
> >> hardware-controlled blinking. When the chip is not transmitting or
> >> receiving anything the LED is off. Otherwise the LED will blink
> >> faster or slower according to the throughput.
> >>
> >> The LED can be controlled from userspace by writing 0, 1, or 2 to
> >> /sys/class/leds/rtl8xxxu-usbX-Y/brightness:
> >> 0 - solid off.
> >> 1 - solid on.
> >> 2 - hardware-controlled blinking.
> >
> > So, do you like
> >
> > #define RTL8XXXU_HW_LED_BLINKING	2
> >
> I'm not sure what you mean. Can you elaborate?

Originally, I would like to replace RTL8XXXU_HW_LED_CONTROL by
RTL8XXXU_HW_LED_BLINKING, because commit messages say "blinking". 
After reviewing 2/4, 3/4 and 4/4, I aware that this blinking is
hardware behavior. Then, it becomes hard to me to decide which
name is clear. Anyway, original is fine to me.

> 
> >>
> >> In this patch none of the chips advertise having an LED. That will be
> >> added in the next patches.
> >>
> >> Signed-off-by: Bitterblue Smith <rtl8821cerfe2@xxxxxxxxx>
> >> ---
> >>  .../net/wireless/realtek/rtl8xxxu/rtl8xxxu.h  |  8 +++++
> >>  .../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 34 +++++++++++++++++++
> >>  2 files changed, 42 insertions(+)
> >>
> >> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> >> b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> >> index 90268479d3ad..c8cee4a24755 100644
> >> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> >> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> >> @@ -1443,6 +1443,8 @@ struct rtl8xxxu_cfo_tracking {
> >>  	u32 packet_count_pre;
> >>  };
> >>
> >> +#define RTL8XXXU_HW_LED_CONTROL	2
> >> +
> >>  struct rtl8xxxu_priv {
> >>  	struct ieee80211_hw *hw;
> >>  	struct usb_device *udev;
> >> @@ -1564,6 +1566,10 @@ struct rtl8xxxu_priv {
> >>  	struct rtl8xxxu_ra_report ra_report;
> >>  	struct rtl8xxxu_cfo_tracking cfo_tracking;
> >>  	struct rtl8xxxu_ra_info ra_info;
> >> +
> >> +	bool led_registered;
> >> +	char led_name[32];
> >> +	struct led_classdev led_cdev;
> >>  };
> >>
> >>  struct rtl8xxxu_rx_urb {
> >> @@ -1613,6 +1619,8 @@ struct rtl8xxxu_fileops {
> >>  			     u32 rts_rate);
> >>  	void (*set_crystal_cap) (struct rtl8xxxu_priv *priv, u8 crystal_cap);
> >>  	s8 (*cck_rssi) (struct rtl8xxxu_priv *priv, u8 cck_agc_rpt);
> >> +	int (*led_classdev_brightness_set) (struct led_classdev *led_cdev,
> >> +					    enum led_brightness brightness);
> >>  	int writeN_block_size;
> >>  	int rx_agg_buf_size;
> >>  	char tx_desc_size;
> >> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
> >> b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
> >> index 35dc777c1fba..b27edd503c23 100644
> >> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
> >> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
> >> @@ -6955,6 +6955,34 @@ static int rtl8xxxu_parse_usb(struct rtl8xxxu_priv *priv,
> >>  	return ret;
> >>  }
> >>
> >> +static void rtl8xxxu_init_led(struct rtl8xxxu_priv *priv)
> >> +{
> >> +	struct led_classdev *led = &priv->led_cdev;
> >> +
> >> +	led->brightness_set_blocking = priv->fops->led_classdev_brightness_set;
> >> +
> >> +	snprintf(priv->led_name, sizeof(priv->led_name),
> >> +		 "rtl8xxxu-usb%s", dev_name(&priv->udev->dev));
> >> +	led->name = priv->led_name;
> >> +	led->max_brightness = RTL8XXXU_HW_LED_CONTROL;
> >> +
> >> +	if (led_classdev_register(&priv->udev->dev, led))
> >> +		return;
> >> +
> >> +	priv->led_registered = true;
> >> +
> >> +	led->brightness = led->max_brightness;
> >> +	priv->fops->led_classdev_brightness_set(led, led->brightness);
> >> +}
> >> +
> >> +static void rtl8xxxu_deinit_led(struct rtl8xxxu_priv *priv)
> >> +{
> >> +	struct led_classdev *led = &priv->led_cdev;
> >> +
> >> +	priv->fops->led_classdev_brightness_set(led, LED_OFF);
> >> +	led_classdev_unregister(led);
> >> +}
> >> +
> >>  static int rtl8xxxu_probe(struct usb_interface *interface,
> >>  			  const struct usb_device_id *id)
> >>  {
> >> @@ -7135,6 +7163,9 @@ static int rtl8xxxu_probe(struct usb_interface *interface,
> >>  		goto err_set_intfdata;
> >>  	}
> >>
> >> +	if (priv->fops->led_classdev_brightness_set)
> >
> > I prefer to move this checking statement into rtl8xxxu_init_led(). Then,
> > the flow of rtl8xxxu_probe() looks clean. As well as rtl8xxxu_deinit_led().
> > Just soft suggestion.
> >
> Okay. That works too.
> 
> >> +		rtl8xxxu_init_led(priv);
> >> +
> >>  	return 0;
> >>
> >>  err_set_intfdata:
> >> @@ -7159,6 +7190,9 @@ static void rtl8xxxu_disconnect(struct usb_interface *interface)
> >>  	hw = usb_get_intfdata(interface);
> >>  	priv = hw->priv;
> >>
> >> +	if (priv->led_registered)
> >> +		rtl8xxxu_deinit_led(priv);
> >> +
> >>  	ieee80211_unregister_hw(hw);
> >>
> >>  	priv->fops->power_off(priv);
> >> --
> >> 2.38.0
> >>
> >> ------Please consider the environment before printing this e-mail.





[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux