USB: cp210x: relocate private data from USB interface to port
authorKonstantin Shkolnyy <konstantin.shkolnyy@gmail.com>
Wed, 28 Oct 2015 21:02:34 +0000 (16:02 -0500)
committerJohan Hovold <johan@kernel.org>
Mon, 16 Nov 2015 11:22:04 +0000 (12:22 +0100)
This change is preparation for implementing a cp2108 bug workaround.
The workaround requires storing some private data. Right now the data is
attached to the USB interface and allocated in the attach() callback.
The bug detection requires USB I/O which is done easier from port_probe()
callback rather than attach(). Since the USB access functions take port
as a parameter, and since the private data is used exclusively by these
functions, it can be allocated in port_probe(). Also, all cp210x devices
have exactly 1 port per USB iterface, so moving private data from the USB
interface to port is trivial.

Signed-off-by: Konstantin Shkolnyy <konstantin.shkolnyy@gmail.com>
Signed-off-by: Johan Hovold <johan@kernel.org>
drivers/usb/serial/cp210x.c

index 8ba1005f6a53b4fb36172fe767cbb689a867ecd4..352fe63fb056daed26579061c624f1a8b40294bf 100644 (file)
@@ -43,8 +43,8 @@ static int cp210x_tiocmset(struct tty_struct *, unsigned int, unsigned int);
 static int cp210x_tiocmset_port(struct usb_serial_port *port,
                unsigned int, unsigned int);
 static void cp210x_break_ctl(struct tty_struct *, int);
-static int cp210x_startup(struct usb_serial *);
-static void cp210x_release(struct usb_serial *);
+static int cp210x_port_probe(struct usb_serial_port *);
+static int cp210x_port_remove(struct usb_serial_port *);
 static void cp210x_dtr_rts(struct usb_serial_port *p, int on);
 
 static const struct usb_device_id id_table[] = {
@@ -197,7 +197,7 @@ static const struct usb_device_id id_table[] = {
 
 MODULE_DEVICE_TABLE(usb, id_table);
 
-struct cp210x_serial_private {
+struct cp210x_port_private {
        __u8                    bInterfaceNumber;
 };
 
@@ -216,8 +216,8 @@ static struct usb_serial_driver cp210x_device = {
        .set_termios            = cp210x_set_termios,
        .tiocmget               = cp210x_tiocmget,
        .tiocmset               = cp210x_tiocmset,
-       .attach                 = cp210x_startup,
-       .release                = cp210x_release,
+       .port_probe             = cp210x_port_probe,
+       .port_remove            = cp210x_port_remove,
        .dtr_rts                = cp210x_dtr_rts
 };
 
@@ -319,7 +319,7 @@ static int cp210x_get_config(struct usb_serial_port *port, u8 request,
                unsigned int *data, int size)
 {
        struct usb_serial *serial = port->serial;
-       struct cp210x_serial_private *spriv = usb_get_serial_data(serial);
+       struct cp210x_port_private *port_priv = usb_get_serial_port_data(port);
        __le32 *buf;
        int result, i, length;
 
@@ -333,7 +333,7 @@ static int cp210x_get_config(struct usb_serial_port *port, u8 request,
        /* Issue the request, attempting to read 'size' bytes */
        result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
                                request, REQTYPE_INTERFACE_TO_HOST, 0x0000,
-                               spriv->bInterfaceNumber, buf, size,
+                               port_priv->bInterfaceNumber, buf, size,
                                USB_CTRL_GET_TIMEOUT);
 
        /* Convert data into an array of integers */
@@ -364,7 +364,7 @@ static int cp210x_set_config(struct usb_serial_port *port, u8 request,
                unsigned int *data, int size)
 {
        struct usb_serial *serial = port->serial;
-       struct cp210x_serial_private *spriv = usb_get_serial_data(serial);
+       struct cp210x_port_private *port_priv = usb_get_serial_port_data(port);
        __le32 *buf;
        int result, i, length;
 
@@ -383,13 +383,13 @@ static int cp210x_set_config(struct usb_serial_port *port, u8 request,
                result = usb_control_msg(serial->dev,
                                usb_sndctrlpipe(serial->dev, 0),
                                request, REQTYPE_HOST_TO_INTERFACE, 0x0000,
-                               spriv->bInterfaceNumber, buf, size,
+                               port_priv->bInterfaceNumber, buf, size,
                                USB_CTRL_SET_TIMEOUT);
        } else {
                result = usb_control_msg(serial->dev,
                                usb_sndctrlpipe(serial->dev, 0),
                                request, REQTYPE_HOST_TO_INTERFACE, data[0],
-                               spriv->bInterfaceNumber, NULL, 0,
+                               port_priv->bInterfaceNumber, NULL, 0,
                                USB_CTRL_SET_TIMEOUT);
        }
 
@@ -878,29 +878,32 @@ static void cp210x_break_ctl(struct tty_struct *tty, int break_state)
        cp210x_set_config(port, CP210X_SET_BREAK, &state, 2);
 }
 
-static int cp210x_startup(struct usb_serial *serial)
+static int cp210x_port_probe(struct usb_serial_port *port)
 {
+       struct usb_serial *serial = port->serial;
        struct usb_host_interface *cur_altsetting;
-       struct cp210x_serial_private *spriv;
+       struct cp210x_port_private *port_priv;
 
-       spriv = kzalloc(sizeof(*spriv), GFP_KERNEL);
-       if (!spriv)
+       port_priv = kzalloc(sizeof(*port_priv), GFP_KERNEL);
+       if (!port_priv)
                return -ENOMEM;
 
        cur_altsetting = serial->interface->cur_altsetting;
-       spriv->bInterfaceNumber = cur_altsetting->desc.bInterfaceNumber;
+       port_priv->bInterfaceNumber = cur_altsetting->desc.bInterfaceNumber;
 
-       usb_set_serial_data(serial, spriv);
+       usb_set_serial_port_data(port, port_priv);
 
        return 0;
 }
 
-static void cp210x_release(struct usb_serial *serial)
+static int cp210x_port_remove(struct usb_serial_port *port)
 {
-       struct cp210x_serial_private *spriv;
+       struct cp210x_port_private *port_priv;
+
+       port_priv = usb_get_serial_port_data(port);
+       kfree(port_priv);
 
-       spriv = usb_get_serial_data(serial);
-       kfree(spriv);
+       return 0;
 }
 
 module_usb_serial_driver(serial_drivers, id_table);