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]>
---
On Mon, Nov 13, 2006 at 03:44:31PM -0800, Greg KH wrote:
> On Mon, Nov 13, 2006 at 03:22:35PM -0800, Sarah Bailey wrote:
> > Signed-off-by: Sarah Bailey <[EMAIL PROTECTED]>
>
> This address is different from your "From:" line, should they be the
> same?
Yes, they should be the same. I had git and mutt configured for two
different addresses, but my git configuration is updated now.
> > 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.
>
> Hm, how about just using the code in idr.h to just get an arbitrary
> number. That interface will handle giving the numbers back when needed,
> and that way you don't have to rely on the fact that we don't have more
> than 64 USB busses in the system at once.
>
> It should make the code a bit simpler too.
Here's a patch that addresses your other suggestions, but I didn't quite
understand this one. Are you suggesting that I use the code in idr.h to
dynamically allocate minor numbers? I thought we have to preallocate
minor numbers, because we can't call register_chrdev_region() more than
once.
I looked for other drivers that use idr.h to handle minor numbers, but I
didn't see any. Can you give me an example?
Sarah Bailey
drivers/usb/core/endpoint.c | 33 ++++++++++++++++++++++++++++++---
drivers/usb/core/endpoint.h | 4 ++++
drivers/usb/core/usb.c | 7 +++++++
3 files changed, 41 insertions(+), 3 deletions(-)
diff --git a/drivers/usb/core/endpoint.c b/drivers/usb/core/endpoint.c
index 3b2d137..9edf4fd 100644
--- a/drivers/usb/core/endpoint.c
+++ b/drivers/usb/core/endpoint.c
@@ -12,7 +12,10 @@
#include <linux/kernel.h>
#include <linux/usb.h>
#include "usb.h"
+#include "endpoint.h"
+#define MAX_ENDPOINT_MINORS (64*128*32)
+int usb_endpoints_major;
/* endpoint stuff */
struct ep_device {
@@ -226,12 +229,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;
@@ -283,3 +290,23 @@ void usb_remove_ep_files(struct usb_host
destroy_endpoint_class();
}
}
+
+int usb_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 usb_endpoints_major_cleanup(void)
+{
+ unregister_chrdev_region(MKDEV(usb_endpoints_major, 0),
MAX_ENDPOINT_MINORS);
+}
diff --git a/drivers/usb/core/endpoint.h b/drivers/usb/core/endpoint.h
new file mode 100644
index 0000000..93ec3c5
--- /dev/null
+++ b/drivers/usb/core/endpoint.h
@@ -0,0 +1,4 @@
+/* Endpoint major functions local to drivers/usb/core/ */
+
+extern int usb_endpoints_major_init(void);
+extern void usb_endpoints_major_cleanup(void);
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
index 467cb02..ca285e8 100644
--- a/drivers/usb/core/usb.c
+++ b/drivers/usb/core/usb.c
@@ -42,6 +42,7 @@
#include "hcd.h"
#include "usb.h"
+#include "endpoint.h"
const char *usbcore_name = "usbcore";
@@ -1018,6 +1019,9 @@ static int __init usb_init(void)
retval = usb_major_init();
if (retval)
goto major_init_failed;
+ retval = usb_endpoints_major_init();
+ if (retval)
+ goto endpoints_major_init_failed;
retval = usb_register(&usbfs_driver);
if (retval)
goto driver_register_failed;
@@ -1042,6 +1046,8 @@ fs_init_failed:
usbdevice_init_failed:
usb_deregister(&usbfs_driver);
driver_register_failed:
+ usb_endpoints_major_cleanup();
+endpoints_major_init_failed:
usb_major_cleanup();
major_init_failed:
usb_host_cleanup();
@@ -1063,6 +1069,7 @@ static void __exit usb_exit(void)
return;
usb_deregister_device_driver(&usb_generic_driver);
+ usb_endpoints_major_cleanup();
usb_major_cleanup();
usbfs_cleanup();
usb_deregister(&usbfs_driver);
--
1.4.3.3
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel