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 <tianyu.lan@xxxxxxxxx> > --- > 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 (bhards@xxxxxxxxxxxxxx) > + * Copyright (C) 2012 Intel Corp (tianyu.lan@xxxxxxxxx) > + * > + * 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 <tianyu.lan@xxxxxxxxx> > + * > + * 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html