diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2006-06-14 16:51:12 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-06-14 16:51:12 -0700 |
commit | cf45b5d4be20d0b0c235989c58ffd050051a3d48 (patch) | |
tree | 09e613963fddce5fdfa092a99a9b3a7eff7ec88a /usb | |
parent | e6b88ef30ffe1805ffd78a2b689e3f464577e63d (diff) | |
download | patches-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.patch | 68 | ||||
-rw-r--r-- | usb/usb-endpoint.patch | 464 |
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 00000000000000..679d06ef1a6ff7 --- /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 00000000000000..644021f6edf8ae --- /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, |