Re: [PATCH 06/10] usb: Add driver/usb/core/(port.c,hub.h) files

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

 



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


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux