Hi Alan,

Could you take a look at this patchset since you asked Tianyu to
refactor the hub code into new files?

Thanks,
Sarah Sharp

On Sat, Nov 17, 2012 at 05:19:54PM +0800, Lan Tianyu wrote:
> This patch is to create driver/usb/core/(port.c,hub.h) files and move usb
> port related code into port.c.
> 
> Signed-off-by: Lan Tianyu <[email protected]>
> ---
>  drivers/usb/core/Makefile |    1 +
>  drivers/usb/core/hub.c    |  174 
> +--------------------------------------------
>  drivers/usb/core/hub.h    |  116 ++++++++++++++++++++++++++++++
>  drivers/usb/core/port.c   |  110 ++++++++++++++++++++++++++++
>  4 files changed, 228 insertions(+), 173 deletions(-)
>  create mode 100644 drivers/usb/core/hub.h
>  create mode 100644 drivers/usb/core/port.c
> 
> diff --git a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile
> index 26059b9..5e847ad 100644
> --- a/drivers/usb/core/Makefile
> +++ b/drivers/usb/core/Makefile
> @@ -7,6 +7,7 @@ ccflags-$(CONFIG_USB_DEBUG) := -DDEBUG
>  usbcore-y := usb.o hub.o hcd.o urb.o message.o driver.o
>  usbcore-y += config.o file.o buffer.o sysfs.o endpoint.o
>  usbcore-y += devio.o notify.o generic.o quirks.o devices.o
> +usbcore-y += port.o
>  
>  usbcore-$(CONFIG_PCI)                += hcd-pci.o
>  usbcore-$(CONFIG_ACPI)               += usb-acpi.o
> diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
> index 4be36ff..dd0694c 100644
> --- a/drivers/usb/core/hub.c
> +++ b/drivers/usb/core/hub.c
> @@ -8,29 +8,7 @@
>   *
>   */
>  
> -#include <linux/kernel.h>
> -#include <linux/errno.h>
> -#include <linux/module.h>
> -#include <linux/moduleparam.h>
> -#include <linux/completion.h>
> -#include <linux/sched.h>
> -#include <linux/list.h>
> -#include <linux/slab.h>
> -#include <linux/ioctl.h>
> -#include <linux/usb.h>
> -#include <linux/usbdevice_fs.h>
> -#include <linux/usb/hcd.h>
> -#include <linux/usb/otg.h>
> -#include <linux/usb/quirks.h>
> -#include <linux/kthread.h>
> -#include <linux/mutex.h>
> -#include <linux/freezer.h>
> -#include <linux/random.h>
> -
> -#include <asm/uaccess.h>
> -#include <asm/byteorder.h>
> -
> -#include "usb.h"
> +#include "hub.h"
>  
>  /* if we are in debug mode, always announce new devices */
>  #ifdef DEBUG
> @@ -42,62 +20,6 @@
>  #define USB_VENDOR_GENESYS_LOGIC             0x05e3
>  #define HUB_QUIRK_CHECK_PORT_AUTOSUSPEND     0x01
>  
> -struct usb_port {
> -     struct usb_device *child;
> -     struct device dev;
> -     struct dev_state *port_owner;
> -     enum usb_port_connect_type connect_type;
> -};
> -
> -struct usb_hub {
> -     struct device           *intfdev;       /* the "interface" device */
> -     struct usb_device       *hdev;
> -     struct kref             kref;
> -     struct urb              *urb;           /* for interrupt polling pipe */
> -
> -     /* buffer for urb ... with extra space in case of babble */
> -     char                    (*buffer)[8];
> -     union {
> -             struct usb_hub_status   hub;
> -             struct usb_port_status  port;
> -     }                       *status;        /* buffer for status reports */
> -     struct mutex            status_mutex;   /* for the status buffer */
> -
> -     int                     error;          /* last reported error */
> -     int                     nerrors;        /* track consecutive errors */
> -
> -     struct list_head        event_list;     /* hubs w/data or errs ready */
> -     unsigned long           event_bits[1];  /* status change bitmask */
> -     unsigned long           change_bits[1]; /* ports with logical connect
> -                                                     status change */
> -     unsigned long           busy_bits[1];   /* ports being reset or
> -                                                     resumed */
> -     unsigned long           removed_bits[1]; /* ports with a "removed"
> -                                                     device present */
> -     unsigned long           wakeup_bits[1]; /* ports that have signaled
> -                                                     remote wakeup */
> -#if USB_MAXCHILDREN > 31 /* 8*sizeof(unsigned long) - 1 */
> -#error event_bits[] is too short!
> -#endif
> -
> -     struct usb_hub_descriptor *descriptor;  /* class descriptor */
> -     struct usb_tt           tt;             /* Transaction Translator */
> -
> -     unsigned                mA_per_port;    /* current for each child */
> -
> -     unsigned                limited_power:1;
> -     unsigned                quiescing:1;
> -     unsigned                disconnected:1;
> -
> -     unsigned                quirk_check_port_auto_suspend:1;
> -
> -     unsigned                has_indicators:1;
> -     u8                      indicator[USB_MAXCHILDREN];
> -     struct delayed_work     leds;
> -     struct delayed_work     init_work;
> -     struct usb_port         **ports;
> -};
> -
>  static const struct attribute_group *port_dev_group[];
>  
>  static inline int hub_is_superspeed(struct usb_device *hdev)
> @@ -170,9 +92,6 @@ EXPORT_SYMBOL_GPL(ehci_cf_port_reset_rwsem);
>  #define HUB_DEBOUNCE_STEP      25
>  #define HUB_DEBOUNCE_STABLE   100
>  
> -#define to_usb_port(_dev) \
> -     container_of(_dev, struct usb_port, dev)
> -
>  static int usb_reset_and_verify_device(struct usb_device *udev);
>  
>  static inline char *portspeed(struct usb_hub *hub, int portstatus)
> @@ -1237,57 +1156,6 @@ static int hub_post_reset(struct usb_interface *intf)
>       return 0;
>  }
>  
> -static void usb_port_device_release(struct device *dev)
> -{
> -     struct usb_port *port_dev = to_usb_port(dev);
> -
> -     usb_acpi_unregister_power_resources(dev);
> -     kfree(port_dev);
> -}
> -
> -static void usb_hub_remove_port_device(struct usb_hub *hub,
> -                                    int port1)
> -{
> -     device_unregister(&hub->ports[port1 - 1]->dev);
> -}
> -
> -struct device_type usb_port_device_type = {
> -     .name =         "usb_port",
> -     .release =      usb_port_device_release,
> -};
> -
> -static int usb_hub_create_port_device(struct usb_hub *hub,
> -                                   int port1)
> -{
> -     struct usb_port *port_dev = NULL;
> -     int retval;
> -
> -     port_dev = kzalloc(sizeof(*port_dev), GFP_KERNEL);
> -     if (!port_dev) {
> -             retval = -ENOMEM;
> -             goto exit;
> -     }
> -
> -     hub->ports[port1 - 1] = port_dev;
> -     port_dev->dev.parent = hub->intfdev;
> -     port_dev->dev.groups = port_dev_group;
> -     port_dev->dev.type = &usb_port_device_type;
> -     dev_set_name(&port_dev->dev, "port%d", port1);
> -
> -     retval = device_register(&port_dev->dev);
> -     if (retval)
> -             goto error_register;
> -
> -     usb_acpi_register_power_resources(&port_dev->dev);
> -
> -     return 0;
> -
> -error_register:
> -     put_device(&port_dev->dev);
> -exit:
> -     return retval;
> -}
> -
>  static int hub_configure(struct usb_hub *hub,
>       struct usb_endpoint_descriptor *endpoint)
>  {
> @@ -4765,46 +4633,6 @@ static int hub_thread(void *__unused)
>       return 0;
>  }
>  
> -static ssize_t show_port_connect_type(struct device *dev,
> -     struct device_attribute *attr, char *buf)
> -{
> -     struct usb_port *port_dev = to_usb_port(dev);
> -     char *result;
> -
> -     switch (port_dev->connect_type) {
> -     case USB_PORT_CONNECT_TYPE_HOT_PLUG:
> -             result = "hotplug";
> -             break;
> -     case USB_PORT_CONNECT_TYPE_HARD_WIRED:
> -             result = "hardwired";
> -             break;
> -     case USB_PORT_NOT_USED:
> -             result = "not used";
> -             break;
> -     default:
> -             result = "unknown";
> -             break;
> -     }
> -
> -     return sprintf(buf, "%s\n", result);
> -}
> -static DEVICE_ATTR(connect_type, S_IRUGO, show_port_connect_type,
> -             NULL);
> -
> -static struct attribute *port_dev_attrs[] = {
> -     &dev_attr_connect_type.attr,
> -     NULL,
> -};
> -
> -static struct attribute_group port_dev_attr_grp = {
> -     .attrs = port_dev_attrs,
> -};
> -
> -static const struct attribute_group *port_dev_group[] = {
> -     &port_dev_attr_grp,
> -     NULL,
> -};
> -
>  static const struct usb_device_id hub_id_table[] = {
>      { .match_flags = USB_DEVICE_ID_MATCH_VENDOR
>                  | USB_DEVICE_ID_MATCH_INT_CLASS,
> diff --git a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h
> new file mode 100644
> index 0000000..b028b6b
> --- /dev/null
> +++ b/drivers/usb/core/hub.h
> @@ -0,0 +1,116 @@
> +/*
> + * usb hub driver head file
> + *
> + * Copyright (C) 1999 Linus Torvalds
> + * Copyright (C) 1999 Johannes Erdfelt
> + * Copyright (C) 1999 Gregory P. Smith
> + * Copyright (C) 2001 Brad Hards ([email protected])
> + * Copyright (C) 2012 Intel Corp ([email protected])
> + *
> + *  move struct usb_hub to this file.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
> + * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
> + * for more details.
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/errno.h>
> +#include <linux/module.h>
> +#include <linux/moduleparam.h>
> +#include <linux/completion.h>
> +#include <linux/sched.h>
> +#include <linux/list.h>
> +#include <linux/slab.h>
> +#include <linux/ioctl.h>
> +#include <linux/usb.h>
> +#include <linux/usbdevice_fs.h>
> +#include <linux/usb/hcd.h>
> +#include <linux/usb/otg.h>
> +#include <linux/usb/quirks.h>
> +#include <linux/kthread.h>
> +#include <linux/mutex.h>
> +#include <linux/freezer.h>
> +#include <linux/random.h>
> +#include <linux/uaccess.h>
> +
> +#include <asm/byteorder.h>
> +
> +#include "usb.h"
> +
> +struct usb_hub {
> +     struct device           *intfdev;       /* the "interface" device */
> +     struct usb_device       *hdev;
> +     struct kref             kref;
> +     struct urb              *urb;           /* for interrupt polling pipe */
> +
> +     /* buffer for urb ... with extra space in case of babble */
> +     char                    (*buffer)[8];
> +     union {
> +             struct usb_hub_status   hub;
> +             struct usb_port_status  port;
> +     }                       *status;        /* buffer for status reports */
> +     struct mutex            status_mutex;   /* for the status buffer */
> +
> +     int                     error;          /* last reported error */
> +     int                     nerrors;        /* track consecutive errors */
> +
> +     struct list_head        event_list;     /* hubs w/data or errs ready */
> +     unsigned long           event_bits[1];  /* status change bitmask */
> +     unsigned long           change_bits[1]; /* ports with logical connect
> +                                                     status change */
> +     unsigned long           busy_bits[1];   /* ports being reset or
> +                                                     resumed */
> +     unsigned long           removed_bits[1]; /* ports with a "removed"
> +                                                     device present */
> +     unsigned long           wakeup_bits[1]; /* ports that have signaled
> +                                                     remote wakeup */
> +#if USB_MAXCHILDREN > 31 /* 8*sizeof(unsigned long) - 1 */
> +#error event_bits[] is too short!
> +#endif
> +
> +     struct usb_hub_descriptor *descriptor;  /* class descriptor */
> +     struct usb_tt           tt;             /* Transaction Translator */
> +
> +     unsigned                mA_per_port;    /* current for each child */
> +
> +     unsigned                limited_power:1;
> +     unsigned                quiescing:1;
> +     unsigned                disconnected:1;
> +
> +     unsigned                quirk_check_port_auto_suspend:1;
> +
> +     unsigned                has_indicators:1;
> +     u8                      indicator[USB_MAXCHILDREN];
> +     struct delayed_work     leds;
> +     struct delayed_work     init_work;
> +     struct usb_port         **ports;
> +};
> +
> +/**
> + * struct usb port - kernel's representation of a usb port
> + * @child: usb device attatched to the port
> + * @dev: generic device interface
> + * @port_owner: port's owner
> + * @connect_type: port's connect type
> + */
> +struct usb_port {
> +     struct usb_device *child;
> +     struct device dev;
> +     struct dev_state *port_owner;
> +     enum usb_port_connect_type connect_type;
> +};
> +
> +#define to_usb_port(_dev) \
> +     container_of(_dev, struct usb_port, dev)
> +
> +extern int usb_hub_create_port_device(struct usb_hub *hub,
> +             int port1);
> +extern void usb_hub_remove_port_device(struct usb_hub *hub,
> +             int port1);
> +
> diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c
> new file mode 100644
> index 0000000..187046a
> --- /dev/null
> +++ b/drivers/usb/core/port.c
> @@ -0,0 +1,110 @@
> +/*
> + * usb port device code
> + *
> + * Copyright (C) 2012 Intel Corp
> + *
> + * Author: Lan Tianyu <[email protected]>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
> + * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
> + * for more details.
> + *
> + */
> +
> +#include "hub.h"
> +
> +static ssize_t show_port_connect_type(struct device *dev,
> +     struct device_attribute *attr, char *buf)
> +{
> +     struct usb_port *port_dev = to_usb_port(dev);
> +     char *result;
> +
> +     switch (port_dev->connect_type) {
> +     case USB_PORT_CONNECT_TYPE_HOT_PLUG:
> +             result = "hotplug";
> +             break;
> +     case USB_PORT_CONNECT_TYPE_HARD_WIRED:
> +             result = "hardwired";
> +             break;
> +     case USB_PORT_NOT_USED:
> +             result = "not used";
> +             break;
> +     default:
> +             result = "unknown";
> +             break;
> +     }
> +
> +     return sprintf(buf, "%s\n", result);
> +}
> +static DEVICE_ATTR(connect_type, S_IRUGO, show_port_connect_type,
> +             NULL);
> +
> +static struct attribute *port_dev_attrs[] = {
> +     &dev_attr_connect_type.attr,
> +     NULL,
> +};
> +
> +static struct attribute_group port_dev_attr_grp = {
> +     .attrs = port_dev_attrs,
> +};
> +
> +static const struct attribute_group *port_dev_group[] = {
> +     &port_dev_attr_grp,
> +     NULL,
> +};
> +
> +static void usb_port_device_release(struct device *dev)
> +{
> +     struct usb_port *port_dev = to_usb_port(dev);
> +
> +     usb_acpi_unregister_power_resources(dev);
> +     kfree(port_dev);
> +}
> +
> +struct device_type usb_port_device_type = {
> +     .name =         "usb_port",
> +     .release =      usb_port_device_release,
> +};
> +
> +int usb_hub_create_port_device(struct usb_hub *hub, int port1)
> +{
> +     struct usb_port *port_dev = NULL;
> +     int retval;
> +
> +     port_dev = kzalloc(sizeof(*port_dev), GFP_KERNEL);
> +     if (!port_dev) {
> +             retval = -ENOMEM;
> +             goto exit;
> +     }
> +
> +     hub->ports[port1 - 1] = port_dev;
> +     port_dev->dev.parent = hub->intfdev;
> +     port_dev->dev.groups = port_dev_group;
> +     port_dev->dev.type = &usb_port_device_type;
> +     dev_set_name(&port_dev->dev, "port%d", port1);
> +
> +     retval = device_register(&port_dev->dev);
> +     if (retval)
> +             goto error_register;
> +
> +     usb_acpi_register_power_resources(&port_dev->dev);
> +
> +     return 0;
> +
> +error_register:
> +     put_device(&port_dev->dev);
> +exit:
> +     return retval;
> +}
> +
> +void usb_hub_remove_port_device(struct usb_hub *hub,
> +                                    int port1)
> +{
> +     device_unregister(&hub->ports[port1 - 1]->dev);
> +}
> +
> -- 
> 1.7.9.5
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to