This patch is an update for Greg K-H's proposed usbfs2:
http://sourceforge.net/mailarchive/message.php?msg_id=19295229

It creates a dynamic major for USB endpoints and fixes
the endpoint minor calculation.

Signed-off-by: Sarah Bailey <[EMAIL PROTECTED]>
---

The patch currently creates a minor for each physical endpoint (rather
than logical endpoint).  I'm not sure which way is easier/better, I just
picked one.

The patch uses the newer way of allocating major numbers to allocate as
many minor numbers as the system would need.  The host controller file
specifies a maximum of 64 USB busses; each one can have 128 devices with
32 physical endpoints.  That results in 262,144 minors.  I thought about
adding minors as each new bus was added (perhaps in usb_register_bus in
hcd.c or by registering a new function using usb_register_notify in
hcd.c).  In the end, I went with the simpler patch.

I diffed against Linus' current git tree.  Let me know if I should diff
against another tree.


 drivers/usb/core/endpoint.c |   10 +++++++---
 drivers/usb/core/file.c     |   24 ++++++++++++++++++++++++
 drivers/usb/core/hcd.c      |    2 --
 drivers/usb/core/hcd.h      |    2 ++
 drivers/usb/core/usb.c      |    6 ++++++
 drivers/usb/core/usb.h      |    4 ++++
 6 files changed, 43 insertions(+), 5 deletions(-)

diff --git a/drivers/usb/core/endpoint.c b/drivers/usb/core/endpoint.c
index 3b2d137..eb5649e 100644
--- a/drivers/usb/core/endpoint.c
+++ b/drivers/usb/core/endpoint.c
@@ -226,12 +226,16 @@ int usb_create_ep_files(struct device *p
                goto error_alloc;
        }
 
-       /* fun calculation to determine the minor of this endpoint */
-       minor = (((udev->bus->busnum - 1) * 128) * 16) + (udev->devnum - 1);
+       /* fun calculation to determine the minor of this endpoint 
+        * using the endpoint physical address
+        */
+       minor = (((udev->bus->busnum - 1) * 128 + (udev->devnum - 1))*32) +
+               ((endpoint->desc.bEndpointAddress*0xF) << 1) + 
+               ((endpoint->desc.bEndpointAddress*0x80) >> 7);
 
        ep_dev->desc = &endpoint->desc;
        ep_dev->udev = udev;
-       ep_dev->dev.devt = MKDEV(442, minor);   // FIXME fake number...
+       ep_dev->dev.devt = MKDEV(usb_endpoints_major, minor);
        ep_dev->dev.class = ep_class->class;
        ep_dev->dev.parent = parent;
        ep_dev->dev.release = ep_device_release;
diff --git a/drivers/usb/core/file.c b/drivers/usb/core/file.c
index f794f07..b1562e1 100644
--- a/drivers/usb/core/file.c
+++ b/drivers/usb/core/file.c
@@ -21,10 +21,13 @@ #include <linux/errno.h>
 #include <linux/usb.h>
 
 #include "usb.h"
+#include "hcd.h"
 
 #define MAX_USB_MINORS 256
+#define MAX_ENDPOINT_MINORS (USB_MAXBUS*128*32)
 static const struct file_operations *usb_minors[MAX_USB_MINORS];
 static DEFINE_SPINLOCK(minor_lock);
+int usb_endpoints_major;
 
 static int usb_open(struct inode * inode, struct file * file)
 {
@@ -123,6 +126,27 @@ void usb_major_cleanup(void)
        unregister_chrdev(USB_MAJOR, "usb");
 }
 
+int endpoints_major_init(void)
+{
+       dev_t dev;
+       int error;
+
+       error = alloc_chrdev_region(&dev, 0, MAX_ENDPOINT_MINORS, 
"usb_endpoint");
+       if (error)
+       {
+               err("unable to get a dynamic major for usb endpoints");
+               return error;
+       }
+       usb_endpoints_major = MAJOR(dev);
+
+       return error;
+}
+
+void endpoints_major_cleanup(void)
+{
+       unregister_chrdev_region(MKDEV(usb_endpoints_major, 0), 
MAX_ENDPOINT_MINORS);
+}
+
 /**
  * usb_register_dev - register a USB device, and ask for a minor number
  * @intf: pointer to the usb_interface that is being registered
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index afa2dd2..cb44d99 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -86,8 +86,6 @@ #include "hub.h"
 LIST_HEAD (usb_bus_list);
 EXPORT_SYMBOL_GPL (usb_bus_list);
 
-/* used when allocating bus numbers */
-#define USB_MAXBUS             64
 struct usb_busmap {
        unsigned long busmap [USB_MAXBUS / (8*sizeof (unsigned long))];
 };
diff --git a/drivers/usb/core/hcd.h b/drivers/usb/core/hcd.h
index 8f8df0d..87548c9 100644
--- a/drivers/usb/core/hcd.h
+++ b/drivers/usb/core/hcd.h
@@ -466,6 +466,8 @@ #define bitmap      DeviceRemovable
 #define        RUN_CONTEXT (in_irq () ? "in_irq" \
                : (in_interrupt () ? "in_interrupt" : "can sleep"))
 
+/* used when allocating bus numbers */
+#define USB_MAXBUS             64
 
 #endif /* __KERNEL__ */
 
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
index 467cb02..f6218cf 100644
--- a/drivers/usb/core/usb.c
+++ b/drivers/usb/core/usb.c
@@ -1018,6 +1018,9 @@ static int __init usb_init(void)
        retval = usb_major_init();
        if (retval)
                goto major_init_failed;
+       retval = endpoints_major_init();
+       if (retval)
+               goto endpoints_major_init_failed;
        retval = usb_register(&usbfs_driver);
        if (retval)
                goto driver_register_failed;
@@ -1042,6 +1045,8 @@ fs_init_failed:
 usbdevice_init_failed:
        usb_deregister(&usbfs_driver);
 driver_register_failed:
+       endpoints_major_cleanup();
+endpoints_major_init_failed:
        usb_major_cleanup();
 major_init_failed:
        usb_host_cleanup();
@@ -1063,6 +1068,7 @@ static void __exit usb_exit(void)
                return;
 
        usb_deregister_device_driver(&usb_generic_driver);
+       endpoints_major_cleanup();
        usb_major_cleanup();
        usbfs_cleanup();
        usb_deregister(&usbfs_driver);
diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h
index 13322e3..23f95b1 100644
--- a/drivers/usb/core/usb.h
+++ b/drivers/usb/core/usb.h
@@ -26,6 +26,8 @@ extern int  usb_hub_init(void);
 extern void usb_hub_cleanup(void);
 extern int usb_major_init(void);
 extern void usb_major_cleanup(void);
+extern int endpoints_major_init(void);
+extern void endpoints_major_cleanup(void);
 extern int usb_host_init(void);
 extern void usb_host_cleanup(void);
 
@@ -152,3 +154,5 @@ extern void usb_notify_remove_device(str
 extern void usb_notify_add_bus(struct usb_bus *ubus);
 extern void usb_notify_remove_bus(struct usb_bus *ubus);
 
+/* usbfs2 stuff */
+extern int usb_endpoints_major;
-- 
1.4.3.2


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to