aboutsummaryrefslogtreecommitdiffstats
path: root/usb
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2006-06-14 16:51:12 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2006-06-14 16:51:12 -0700
commitcf45b5d4be20d0b0c235989c58ffd050051a3d48 (patch)
tree09e613963fddce5fdfa092a99a9b3a7eff7ec88a /usb
parente6b88ef30ffe1805ffd78a2b689e3f464577e63d (diff)
downloadpatches-cf45b5d4be20d0b0c235989c58ffd050051a3d48.tar.gz
move device-class patch to driver/ to get it to be picked up.
Also add endpoint patches as they are starting to work...
Diffstat (limited to 'usb')
-rw-r--r--usb/usb-endpoint-pass-struct-device.patch68
-rw-r--r--usb/usb-endpoint.patch464
2 files changed, 532 insertions, 0 deletions
diff --git a/usb/usb-endpoint-pass-struct-device.patch b/usb/usb-endpoint-pass-struct-device.patch
new file mode 100644
index 0000000000000..679d06ef1a6ff
--- /dev/null
+++ b/usb/usb-endpoint-pass-struct-device.patch
@@ -0,0 +1,68 @@
+From foo@baz Tue Apr 9 12:12:43 2002
+Date: Wed, 14 Jun 2006 12:14:34 -0700
+To: Greg KH <greg@kroah.com>
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: USB: make usb_create_ep_files take a struct device
+
+Instead of a kobject, will make things easier in the future (don't know
+what I was thinking when I did this originally...)
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/core/endpoint.c | 4 ++--
+ drivers/usb/core/sysfs.c | 4 ++--
+ drivers/usb/core/usb.h | 2 +-
+ 3 files changed, 5 insertions(+), 5 deletions(-)
+
+--- gregkh-2.6.orig/drivers/usb/core/endpoint.c
++++ gregkh-2.6/drivers/usb/core/endpoint.c
+@@ -173,7 +173,7 @@ static struct kobj_type ep_object_ktype
+ .default_attrs = ep_attrs,
+ };
+
+-void usb_create_ep_files(struct kobject *parent,
++void usb_create_ep_files(struct device *parent,
+ struct usb_host_endpoint *endpoint,
+ struct usb_device *udev)
+ {
+@@ -189,7 +189,7 @@ void usb_create_ep_files(struct kobject
+
+ kobj = &ep_obj->kobj;
+ kobject_set_name(kobj, "ep_%02x", endpoint->desc.bEndpointAddress);
+- kobj->parent = parent;
++ kobj->parent = &parent->kobj;
+ kobj->ktype = &ep_object_ktype;
+
+ /* Don't use kobject_register, because it generates a hotplug event */
+--- gregkh-2.6.orig/drivers/usb/core/sysfs.c
++++ gregkh-2.6/drivers/usb/core/sysfs.c
+@@ -223,7 +223,7 @@ void usb_create_sysfs_dev_files (struct
+ if (udev->serial)
+ device_create_file (dev, &dev_attr_serial);
+ device_create_file (dev, &dev_attr_configuration);
+- usb_create_ep_files(&dev->kobj, &udev->ep0, udev);
++ usb_create_ep_files(dev, &udev->ep0, udev);
+ }
+
+ void usb_remove_sysfs_dev_files (struct usb_device *udev)
+@@ -327,7 +327,7 @@ static inline void usb_create_intf_ep_fi
+
+ iface_desc = intf->cur_altsetting;
+ for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i)
+- usb_create_ep_files(&intf->dev.kobj, &iface_desc->endpoint[i],
++ usb_create_ep_files(&intf->dev, &iface_desc->endpoint[i],
+ udev);
+ }
+
+--- gregkh-2.6.orig/drivers/usb/core/usb.h
++++ gregkh-2.6/drivers/usb/core/usb.h
+@@ -4,7 +4,7 @@ extern void usb_create_sysfs_dev_files (
+ extern void usb_remove_sysfs_dev_files (struct usb_device *dev);
+ extern void usb_create_sysfs_intf_files (struct usb_interface *intf);
+ extern void usb_remove_sysfs_intf_files (struct usb_interface *intf);
+-extern void usb_create_ep_files(struct kobject *parent, struct usb_host_endpoint *endpoint,
++extern void usb_create_ep_files(struct device *parent, struct usb_host_endpoint *endpoint,
+ struct usb_device *udev);
+ extern void usb_remove_ep_files(struct usb_host_endpoint *endpoint);
+
diff --git a/usb/usb-endpoint.patch b/usb/usb-endpoint.patch
new file mode 100644
index 0000000000000..644021f6edf8a
--- /dev/null
+++ b/usb/usb-endpoint.patch
@@ -0,0 +1,464 @@
+From foo@baz Tue Apr 9 12:12:43 2002
+Date: Wed, 14 Jun 2006 12:14:34 -0700
+To: Greg KH <greg@kroah.com>
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: USB: move the endpoint specific sysfs code to it's own file
+
+This makes it easier to modify in the future without touching anything else.
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+---
+ drivers/usb/core/Makefile | 3
+ drivers/usb/core/endpoint.c | 213 ++++++++++++++++++++++++++++++++++++++++++++
+ drivers/usb/core/sysfs.c | 197 ----------------------------------------
+ drivers/usb/core/usb.h | 3
+ 4 files changed, 218 insertions(+), 198 deletions(-)
+
+--- gregkh-2.6.orig/drivers/usb/core/Makefile
++++ gregkh-2.6/drivers/usb/core/Makefile
+@@ -3,7 +3,8 @@
+ #
+
+ usbcore-objs := usb.o hub.o hcd.o urb.o message.o driver.o \
+- config.o file.o buffer.o sysfs.o devio.o notify.o
++ config.o file.o buffer.o sysfs.o endpoint.o \
++ devio.o notify.o
+
+ ifeq ($(CONFIG_PCI),y)
+ usbcore-objs += hcd-pci.o
+--- /dev/null
++++ gregkh-2.6/drivers/usb/core/endpoint.c
+@@ -0,0 +1,213 @@
++/*
++ * drivers/usb/core/endpoint.c
++ *
++ * (C) Copyright 2002,2004,2006 Greg Kroah-Hartman
++ * (C) Copyright 2002,2004 IBM Corp.
++ * (C) Copyright 2006 Novell Inc.
++ *
++ * Endpoint sysfs stuff
++ *
++ */
++
++#include <linux/kernel.h>
++#include <linux/usb.h>
++#include "usb.h"
++
++/* endpoint stuff */
++struct ep_object {
++ struct usb_endpoint_descriptor *desc;
++ struct usb_device *udev;
++ struct kobject kobj;
++};
++#define to_ep_object(_kobj) \
++ container_of(_kobj, struct ep_object, kobj)
++
++struct ep_attribute {
++ struct attribute attr;
++ ssize_t (*show)(struct usb_device *,
++ struct usb_endpoint_descriptor *, char *);
++};
++#define to_ep_attribute(_attr) \
++ container_of(_attr, struct ep_attribute, attr)
++
++#define EP_ATTR(_name) \
++struct ep_attribute ep_##_name = { \
++ .attr = {.name = #_name, .owner = THIS_MODULE, \
++ .mode = S_IRUGO}, \
++ .show = show_ep_##_name}
++
++#define usb_ep_attr(field, format_string) \
++static ssize_t show_ep_##field(struct usb_device *udev, \
++ struct usb_endpoint_descriptor *desc, \
++ char *buf) \
++{ \
++ return sprintf(buf, format_string, desc->field); \
++} \
++static EP_ATTR(field);
++
++usb_ep_attr(bLength, "%02x\n")
++usb_ep_attr(bEndpointAddress, "%02x\n")
++usb_ep_attr(bmAttributes, "%02x\n")
++usb_ep_attr(bInterval, "%02x\n")
++
++static ssize_t show_ep_wMaxPacketSize(struct usb_device *udev,
++ struct usb_endpoint_descriptor *desc, char *buf)
++{
++ return sprintf(buf, "%04x\n",
++ le16_to_cpu(desc->wMaxPacketSize) & 0x07ff);
++}
++static EP_ATTR(wMaxPacketSize);
++
++static ssize_t show_ep_type(struct usb_device *udev,
++ struct usb_endpoint_descriptor *desc, char *buf)
++{
++ char *type = "unknown";
++
++ switch (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) {
++ case USB_ENDPOINT_XFER_CONTROL:
++ type = "Control";
++ break;
++ case USB_ENDPOINT_XFER_ISOC:
++ type = "Isoc";
++ break;
++ case USB_ENDPOINT_XFER_BULK:
++ type = "Bulk";
++ break;
++ case USB_ENDPOINT_XFER_INT:
++ type = "Interrupt";
++ break;
++ }
++ return sprintf(buf, "%s\n", type);
++}
++static EP_ATTR(type);
++
++static ssize_t show_ep_interval(struct usb_device *udev,
++ struct usb_endpoint_descriptor *desc, char *buf)
++{
++ char unit;
++ unsigned interval = 0;
++ unsigned in;
++
++ in = (desc->bEndpointAddress & USB_DIR_IN);
++
++ switch (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) {
++ case USB_ENDPOINT_XFER_CONTROL:
++ if (udev->speed == USB_SPEED_HIGH) /* uframes per NAK */
++ interval = desc->bInterval;
++ break;
++ case USB_ENDPOINT_XFER_ISOC:
++ interval = 1 << (desc->bInterval - 1);
++ break;
++ case USB_ENDPOINT_XFER_BULK:
++ if (udev->speed == USB_SPEED_HIGH && !in) /* uframes per NAK */
++ interval = desc->bInterval;
++ break;
++ case USB_ENDPOINT_XFER_INT:
++ if (udev->speed == USB_SPEED_HIGH)
++ interval = 1 << (desc->bInterval - 1);
++ else
++ interval = desc->bInterval;
++ break;
++ }
++ interval *= (udev->speed == USB_SPEED_HIGH) ? 125 : 1000;
++ if (interval % 1000)
++ unit = 'u';
++ else {
++ unit = 'm';
++ interval /= 1000;
++ }
++
++ return sprintf(buf, "%d%cs\n", interval, unit);
++}
++static EP_ATTR(interval);
++
++static ssize_t show_ep_direction(struct usb_device *udev,
++ struct usb_endpoint_descriptor *desc, char *buf)
++{
++ char *direction;
++
++ if ((desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
++ USB_ENDPOINT_XFER_CONTROL)
++ direction = "both";
++ else if (desc->bEndpointAddress & USB_DIR_IN)
++ direction = "in";
++ else
++ direction = "out";
++ return sprintf(buf, "%s\n", direction);
++}
++static EP_ATTR(direction);
++
++static struct attribute *ep_attrs[] = {
++ &ep_bLength.attr,
++ &ep_bEndpointAddress.attr,
++ &ep_bmAttributes.attr,
++ &ep_bInterval.attr,
++ &ep_wMaxPacketSize.attr,
++ &ep_type.attr,
++ &ep_interval.attr,
++ &ep_direction.attr,
++ NULL,
++};
++
++static void ep_object_release(struct kobject *kobj)
++{
++ kfree(to_ep_object(kobj));
++}
++
++static ssize_t ep_object_show(struct kobject *kobj, struct attribute *attr,
++ char *buf)
++{
++ struct ep_object *ep_obj = to_ep_object(kobj);
++ struct ep_attribute *ep_attr = to_ep_attribute(attr);
++
++ return (ep_attr->show)(ep_obj->udev, ep_obj->desc, buf);
++}
++
++static struct sysfs_ops ep_object_sysfs_ops = {
++ .show = ep_object_show,
++};
++
++static struct kobj_type ep_object_ktype = {
++ .release = ep_object_release,
++ .sysfs_ops = &ep_object_sysfs_ops,
++ .default_attrs = ep_attrs,
++};
++
++void usb_create_ep_files(struct kobject *parent,
++ struct usb_host_endpoint *endpoint,
++ struct usb_device *udev)
++{
++ struct ep_object *ep_obj;
++ struct kobject *kobj;
++
++ ep_obj = kzalloc(sizeof(struct ep_object), GFP_KERNEL);
++ if (!ep_obj)
++ return;
++
++ ep_obj->desc = &endpoint->desc;
++ ep_obj->udev = udev;
++
++ kobj = &ep_obj->kobj;
++ kobject_set_name(kobj, "ep_%02x", endpoint->desc.bEndpointAddress);
++ kobj->parent = parent;
++ kobj->ktype = &ep_object_ktype;
++
++ /* Don't use kobject_register, because it generates a hotplug event */
++ kobject_init(kobj);
++ if (kobject_add(kobj) == 0)
++ endpoint->kobj = kobj;
++ else
++ kobject_put(kobj);
++}
++
++void usb_remove_ep_files(struct usb_host_endpoint *endpoint)
++{
++
++ if (endpoint->kobj) {
++ kobject_del(endpoint->kobj);
++ kobject_put(endpoint->kobj);
++ endpoint->kobj = NULL;
++ }
++}
++
++
+--- gregkh-2.6.orig/drivers/usb/core/sysfs.c
++++ gregkh-2.6/drivers/usb/core/sysfs.c
+@@ -15,203 +15,6 @@
+ #include <linux/usb.h>
+ #include "usb.h"
+
+-/* endpoint stuff */
+-struct ep_object {
+- struct usb_endpoint_descriptor *desc;
+- struct usb_device *udev;
+- struct kobject kobj;
+-};
+-#define to_ep_object(_kobj) \
+- container_of(_kobj, struct ep_object, kobj)
+-
+-struct ep_attribute {
+- struct attribute attr;
+- ssize_t (*show)(struct usb_device *,
+- struct usb_endpoint_descriptor *, char *);
+-};
+-#define to_ep_attribute(_attr) \
+- container_of(_attr, struct ep_attribute, attr)
+-
+-#define EP_ATTR(_name) \
+-struct ep_attribute ep_##_name = { \
+- .attr = {.name = #_name, .owner = THIS_MODULE, \
+- .mode = S_IRUGO}, \
+- .show = show_ep_##_name}
+-
+-#define usb_ep_attr(field, format_string) \
+-static ssize_t show_ep_##field(struct usb_device *udev, \
+- struct usb_endpoint_descriptor *desc, \
+- char *buf) \
+-{ \
+- return sprintf(buf, format_string, desc->field); \
+-} \
+-static EP_ATTR(field);
+-
+-usb_ep_attr(bLength, "%02x\n")
+-usb_ep_attr(bEndpointAddress, "%02x\n")
+-usb_ep_attr(bmAttributes, "%02x\n")
+-usb_ep_attr(bInterval, "%02x\n")
+-
+-static ssize_t show_ep_wMaxPacketSize(struct usb_device *udev,
+- struct usb_endpoint_descriptor *desc, char *buf)
+-{
+- return sprintf(buf, "%04x\n",
+- le16_to_cpu(desc->wMaxPacketSize) & 0x07ff);
+-}
+-static EP_ATTR(wMaxPacketSize);
+-
+-static ssize_t show_ep_type(struct usb_device *udev,
+- struct usb_endpoint_descriptor *desc, char *buf)
+-{
+- char *type = "unknown";
+-
+- switch (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) {
+- case USB_ENDPOINT_XFER_CONTROL:
+- type = "Control";
+- break;
+- case USB_ENDPOINT_XFER_ISOC:
+- type = "Isoc";
+- break;
+- case USB_ENDPOINT_XFER_BULK:
+- type = "Bulk";
+- break;
+- case USB_ENDPOINT_XFER_INT:
+- type = "Interrupt";
+- break;
+- }
+- return sprintf(buf, "%s\n", type);
+-}
+-static EP_ATTR(type);
+-
+-static ssize_t show_ep_interval(struct usb_device *udev,
+- struct usb_endpoint_descriptor *desc, char *buf)
+-{
+- char unit;
+- unsigned interval = 0;
+- unsigned in;
+-
+- in = (desc->bEndpointAddress & USB_DIR_IN);
+-
+- switch (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) {
+- case USB_ENDPOINT_XFER_CONTROL:
+- if (udev->speed == USB_SPEED_HIGH) /* uframes per NAK */
+- interval = desc->bInterval;
+- break;
+- case USB_ENDPOINT_XFER_ISOC:
+- interval = 1 << (desc->bInterval - 1);
+- break;
+- case USB_ENDPOINT_XFER_BULK:
+- if (udev->speed == USB_SPEED_HIGH && !in) /* uframes per NAK */
+- interval = desc->bInterval;
+- break;
+- case USB_ENDPOINT_XFER_INT:
+- if (udev->speed == USB_SPEED_HIGH)
+- interval = 1 << (desc->bInterval - 1);
+- else
+- interval = desc->bInterval;
+- break;
+- }
+- interval *= (udev->speed == USB_SPEED_HIGH) ? 125 : 1000;
+- if (interval % 1000)
+- unit = 'u';
+- else {
+- unit = 'm';
+- interval /= 1000;
+- }
+-
+- return sprintf(buf, "%d%cs\n", interval, unit);
+-}
+-static EP_ATTR(interval);
+-
+-static ssize_t show_ep_direction(struct usb_device *udev,
+- struct usb_endpoint_descriptor *desc, char *buf)
+-{
+- char *direction;
+-
+- if ((desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
+- USB_ENDPOINT_XFER_CONTROL)
+- direction = "both";
+- else if (desc->bEndpointAddress & USB_DIR_IN)
+- direction = "in";
+- else
+- direction = "out";
+- return sprintf(buf, "%s\n", direction);
+-}
+-static EP_ATTR(direction);
+-
+-static struct attribute *ep_attrs[] = {
+- &ep_bLength.attr,
+- &ep_bEndpointAddress.attr,
+- &ep_bmAttributes.attr,
+- &ep_bInterval.attr,
+- &ep_wMaxPacketSize.attr,
+- &ep_type.attr,
+- &ep_interval.attr,
+- &ep_direction.attr,
+- NULL,
+-};
+-
+-static void ep_object_release(struct kobject *kobj)
+-{
+- kfree(to_ep_object(kobj));
+-}
+-
+-static ssize_t ep_object_show(struct kobject *kobj, struct attribute *attr,
+- char *buf)
+-{
+- struct ep_object *ep_obj = to_ep_object(kobj);
+- struct ep_attribute *ep_attr = to_ep_attribute(attr);
+-
+- return (ep_attr->show)(ep_obj->udev, ep_obj->desc, buf);
+-}
+-
+-static struct sysfs_ops ep_object_sysfs_ops = {
+- .show = ep_object_show,
+-};
+-
+-static struct kobj_type ep_object_ktype = {
+- .release = ep_object_release,
+- .sysfs_ops = &ep_object_sysfs_ops,
+- .default_attrs = ep_attrs,
+-};
+-
+-static void usb_create_ep_files(struct kobject *parent,
+- struct usb_host_endpoint *endpoint,
+- struct usb_device *udev)
+-{
+- struct ep_object *ep_obj;
+- struct kobject *kobj;
+-
+- ep_obj = kzalloc(sizeof(struct ep_object), GFP_KERNEL);
+- if (!ep_obj)
+- return;
+-
+- ep_obj->desc = &endpoint->desc;
+- ep_obj->udev = udev;
+-
+- kobj = &ep_obj->kobj;
+- kobject_set_name(kobj, "ep_%02x", endpoint->desc.bEndpointAddress);
+- kobj->parent = parent;
+- kobj->ktype = &ep_object_ktype;
+-
+- /* Don't use kobject_register, because it generates a hotplug event */
+- kobject_init(kobj);
+- if (kobject_add(kobj) == 0)
+- endpoint->kobj = kobj;
+- else
+- kobject_put(kobj);
+-}
+-
+-static void usb_remove_ep_files(struct usb_host_endpoint *endpoint)
+-{
+-
+- if (endpoint->kobj) {
+- kobject_del(endpoint->kobj);
+- kobject_put(endpoint->kobj);
+- endpoint->kobj = NULL;
+- }
+-}
+-
+ /* Active configuration fields */
+ #define usb_actconfig_show(field, multiplier, format_string) \
+ static ssize_t show_##field (struct device *dev, \
+--- gregkh-2.6.orig/drivers/usb/core/usb.h
++++ gregkh-2.6/drivers/usb/core/usb.h
+@@ -4,6 +4,9 @@ extern void usb_create_sysfs_dev_files (
+ extern void usb_remove_sysfs_dev_files (struct usb_device *dev);
+ extern void usb_create_sysfs_intf_files (struct usb_interface *intf);
+ extern void usb_remove_sysfs_intf_files (struct usb_interface *intf);
++extern void usb_create_ep_files(struct kobject *parent, struct usb_host_endpoint *endpoint,
++ struct usb_device *udev);
++extern void usb_remove_ep_files(struct usb_host_endpoint *endpoint);
+
+ extern void usb_disable_endpoint (struct usb_device *dev, unsigned int epaddr);
+ extern void usb_disable_interface (struct usb_device *dev,