diff mbox series

[v2] USB: serial: ftdi_sio: Convert to use dev_groups

Message ID 20220902075853.3931834-1-jiasheng@iscas.ac.cn (mailing list archive)
State Superseded
Headers show
Series [v2] USB: serial: ftdi_sio: Convert to use dev_groups | expand

Commit Message

Jiasheng Jiang Sept. 2, 2022, 7:58 a.m. UTC
The driver core supports the ability to handle the creation and removal
of device-specific sysfs files in a race-free manner. Moreover, it can
guarantee the success of creation. Therefore, it should be better to
move the definition of ftdi_sio_device to the end, remove
create_sysfs_attrs and remove_sysfs_attrs, and convert to use dev_groups.

Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Signed-off-by: Jiasheng Jiang <jiasheng@iscas.ac.cn>
---
Changelog:

v1 -> v2:

1. Change the title.
2. Switch to use an attribute group.
---
 drivers/usb/serial/ftdi_sio.c | 124 ++++++++++++----------------------
 1 file changed, 42 insertions(+), 82 deletions(-)

Comments

Greg KH Sept. 2, 2022, 8:06 a.m. UTC | #1
On Fri, Sep 02, 2022 at 03:58:53PM +0800, Jiasheng Jiang wrote:
> The driver core supports the ability to handle the creation and removal
> of device-specific sysfs files in a race-free manner. Moreover, it can
> guarantee the success of creation. Therefore, it should be better to
> move the definition of ftdi_sio_device to the end, remove
> create_sysfs_attrs and remove_sysfs_attrs, and convert to use dev_groups.
> 
> Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")

This is not a "Fix:", sorry.

And did you test this change?

It does not work like the original submission did at all:

> Signed-off-by: Jiasheng Jiang <jiasheng@iscas.ac.cn>
> ---
> Changelog:
> 
> v1 -> v2:
> 
> 1. Change the title.
> 2. Switch to use an attribute group.
> ---
>  drivers/usb/serial/ftdi_sio.c | 124 ++++++++++++----------------------
>  1 file changed, 42 insertions(+), 82 deletions(-)
> 
> diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
> index d5a3986dfee7..41d8bfb02322 100644
> --- a/drivers/usb/serial/ftdi_sio.c
> +++ b/drivers/usb/serial/ftdi_sio.c
> @@ -1108,41 +1108,6 @@ static u32 ftdi_232bm_baud_to_divisor(int baud);
>  static u32 ftdi_2232h_baud_base_to_divisor(int baud, int base);
>  static u32 ftdi_2232h_baud_to_divisor(int baud);
>  
> -static struct usb_serial_driver ftdi_sio_device = {
> -	.driver = {
> -		.owner =	THIS_MODULE,
> -		.name =		"ftdi_sio",
> -	},
> -	.description =		"FTDI USB Serial Device",
> -	.id_table =		id_table_combined,
> -	.num_ports =		1,
> -	.bulk_in_size =		512,
> -	.bulk_out_size =	256,
> -	.probe =		ftdi_sio_probe,
> -	.port_probe =		ftdi_sio_port_probe,
> -	.port_remove =		ftdi_sio_port_remove,
> -	.open =			ftdi_open,
> -	.dtr_rts =		ftdi_dtr_rts,
> -	.throttle =		usb_serial_generic_throttle,
> -	.unthrottle =		usb_serial_generic_unthrottle,
> -	.process_read_urb =	ftdi_process_read_urb,
> -	.prepare_write_buffer =	ftdi_prepare_write_buffer,
> -	.tiocmget =		ftdi_tiocmget,
> -	.tiocmset =		ftdi_tiocmset,
> -	.tiocmiwait =		usb_serial_generic_tiocmiwait,
> -	.get_icount =           usb_serial_generic_get_icount,
> -	.ioctl =		ftdi_ioctl,
> -	.get_serial =		get_serial_info,
> -	.set_serial =		set_serial_info,
> -	.set_termios =		ftdi_set_termios,
> -	.break_ctl =		ftdi_break_ctl,
> -	.tx_empty =		ftdi_tx_empty,
> -};
> -
> -static struct usb_serial_driver * const serial_drivers[] = {
> -	&ftdi_sio_device, NULL
> -};

No need to move this structure if you don't have to.

>  
>  #define WDR_TIMEOUT 5000 /* default urb timeout */
>  #define WDR_SHORT_TIMEOUT 1000	/* shorter urb timeout */
> @@ -1729,50 +1694,12 @@ static ssize_t event_char_store(struct device *dev,
>  }
>  static DEVICE_ATTR_WO(event_char);
>  
> -static int create_sysfs_attrs(struct usb_serial_port *port)
> -{
> -	struct ftdi_private *priv = usb_get_serial_port_data(port);
> -	int retval = 0;
> -
> -	/* XXX I've no idea if the original SIO supports the event_char
> -	 * sysfs parameter, so I'm playing it safe.  */
> -	if (priv->chip_type != SIO) {
> -		dev_dbg(&port->dev, "sysfs attributes for %s\n", ftdi_chip_name[priv->chip_type]);
> -		retval = device_create_file(&port->dev, &dev_attr_event_char);
> -		if ((!retval) &&
> -		    (priv->chip_type == FT232BM ||
> -		     priv->chip_type == FT2232C ||
> -		     priv->chip_type == FT232RL ||
> -		     priv->chip_type == FT2232H ||
> -		     priv->chip_type == FT4232H ||
> -		     priv->chip_type == FT232H ||
> -		     priv->chip_type == FTX)) {
> -			retval = device_create_file(&port->dev,
> -						    &dev_attr_latency_timer);

See how a specific file only gets added for a specific chip type?  Your
change adds that file for all chip types.

That's not going to work.  To solve this properly you need to set the
is_visible attribute in the attribute group and only create the needed
files based on the chip type.

thanks,

greg k-h
diff mbox series

Patch

diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
index d5a3986dfee7..41d8bfb02322 100644
--- a/drivers/usb/serial/ftdi_sio.c
+++ b/drivers/usb/serial/ftdi_sio.c
@@ -1108,41 +1108,6 @@  static u32 ftdi_232bm_baud_to_divisor(int baud);
 static u32 ftdi_2232h_baud_base_to_divisor(int baud, int base);
 static u32 ftdi_2232h_baud_to_divisor(int baud);
 
-static struct usb_serial_driver ftdi_sio_device = {
-	.driver = {
-		.owner =	THIS_MODULE,
-		.name =		"ftdi_sio",
-	},
-	.description =		"FTDI USB Serial Device",
-	.id_table =		id_table_combined,
-	.num_ports =		1,
-	.bulk_in_size =		512,
-	.bulk_out_size =	256,
-	.probe =		ftdi_sio_probe,
-	.port_probe =		ftdi_sio_port_probe,
-	.port_remove =		ftdi_sio_port_remove,
-	.open =			ftdi_open,
-	.dtr_rts =		ftdi_dtr_rts,
-	.throttle =		usb_serial_generic_throttle,
-	.unthrottle =		usb_serial_generic_unthrottle,
-	.process_read_urb =	ftdi_process_read_urb,
-	.prepare_write_buffer =	ftdi_prepare_write_buffer,
-	.tiocmget =		ftdi_tiocmget,
-	.tiocmset =		ftdi_tiocmset,
-	.tiocmiwait =		usb_serial_generic_tiocmiwait,
-	.get_icount =           usb_serial_generic_get_icount,
-	.ioctl =		ftdi_ioctl,
-	.get_serial =		get_serial_info,
-	.set_serial =		set_serial_info,
-	.set_termios =		ftdi_set_termios,
-	.break_ctl =		ftdi_break_ctl,
-	.tx_empty =		ftdi_tx_empty,
-};
-
-static struct usb_serial_driver * const serial_drivers[] = {
-	&ftdi_sio_device, NULL
-};
-
 
 #define WDR_TIMEOUT 5000 /* default urb timeout */
 #define WDR_SHORT_TIMEOUT 1000	/* shorter urb timeout */
@@ -1729,50 +1694,12 @@  static ssize_t event_char_store(struct device *dev,
 }
 static DEVICE_ATTR_WO(event_char);
 
-static int create_sysfs_attrs(struct usb_serial_port *port)
-{
-	struct ftdi_private *priv = usb_get_serial_port_data(port);
-	int retval = 0;
-
-	/* XXX I've no idea if the original SIO supports the event_char
-	 * sysfs parameter, so I'm playing it safe.  */
-	if (priv->chip_type != SIO) {
-		dev_dbg(&port->dev, "sysfs attributes for %s\n", ftdi_chip_name[priv->chip_type]);
-		retval = device_create_file(&port->dev, &dev_attr_event_char);
-		if ((!retval) &&
-		    (priv->chip_type == FT232BM ||
-		     priv->chip_type == FT2232C ||
-		     priv->chip_type == FT232RL ||
-		     priv->chip_type == FT2232H ||
-		     priv->chip_type == FT4232H ||
-		     priv->chip_type == FT232H ||
-		     priv->chip_type == FTX)) {
-			retval = device_create_file(&port->dev,
-						    &dev_attr_latency_timer);
-		}
-	}
-	return retval;
-}
-
-static void remove_sysfs_attrs(struct usb_serial_port *port)
-{
-	struct ftdi_private *priv = usb_get_serial_port_data(port);
-
-	/* XXX see create_sysfs_attrs */
-	if (priv->chip_type != SIO) {
-		device_remove_file(&port->dev, &dev_attr_event_char);
-		if (priv->chip_type == FT232BM ||
-		    priv->chip_type == FT2232C ||
-		    priv->chip_type == FT232RL ||
-		    priv->chip_type == FT2232H ||
-		    priv->chip_type == FT4232H ||
-		    priv->chip_type == FT232H ||
-		    priv->chip_type == FTX) {
-			device_remove_file(&port->dev, &dev_attr_latency_timer);
-		}
-	}
-
-}
+static struct attribute *ftdi_sio_attrs[] = {
+	&dev_attr_event_char.attr,
+	&dev_attr_latency_timer.attr,
+	NULL,
+};
+ATTRIBUTE_GROUPS(ftdi_sio);
 
 #ifdef CONFIG_GPIOLIB
 
@@ -2251,7 +2178,6 @@  static int ftdi_sio_port_probe(struct usb_serial_port *port)
 	if (read_latency_timer(port) < 0)
 		priv->latency = 16;
 	write_latency_timer(port);
-	create_sysfs_attrs(port);
 
 	result = ftdi_gpio_init(port);
 	if (result < 0) {
@@ -2377,8 +2303,6 @@  static void ftdi_sio_port_remove(struct usb_serial_port *port)
 
 	ftdi_gpio_remove(port);
 
-	remove_sysfs_attrs(port);
-
 	kfree(priv);
 }
 
@@ -2915,6 +2839,42 @@  static int ftdi_ioctl(struct tty_struct *tty,
 	return -ENOIOCTLCMD;
 }
 
+static struct usb_serial_driver ftdi_sio_device = {
+	.driver = {
+		.owner =	THIS_MODULE,
+		.name =		"ftdi_sio",
+		.dev_groups =	ftdi_sio_groups,
+	},
+	.description =		"FTDI USB Serial Device",
+	.id_table =		id_table_combined,
+	.num_ports =		1,
+	.bulk_in_size =		512,
+	.bulk_out_size =	256,
+	.probe =		ftdi_sio_probe,
+	.port_probe =		ftdi_sio_port_probe,
+	.port_remove =		ftdi_sio_port_remove,
+	.open =			ftdi_open,
+	.dtr_rts =		ftdi_dtr_rts,
+	.throttle =		usb_serial_generic_throttle,
+	.unthrottle =		usb_serial_generic_unthrottle,
+	.process_read_urb =	ftdi_process_read_urb,
+	.prepare_write_buffer =	ftdi_prepare_write_buffer,
+	.tiocmget =		ftdi_tiocmget,
+	.tiocmset =		ftdi_tiocmset,
+	.tiocmiwait =		usb_serial_generic_tiocmiwait,
+	.get_icount =           usb_serial_generic_get_icount,
+	.ioctl =		ftdi_ioctl,
+	.get_serial =		get_serial_info,
+	.set_serial =		set_serial_info,
+	.set_termios =		ftdi_set_termios,
+	.break_ctl =		ftdi_break_ctl,
+	.tx_empty =		ftdi_tx_empty,
+};
+
+static struct usb_serial_driver * const serial_drivers[] = {
+	&ftdi_sio_device, NULL
+};
+
 module_usb_serial_driver(serial_drivers, id_table_combined);
 
 MODULE_AUTHOR(DRIVER_AUTHOR);