Hi,

This patch makes endpoint detection more generic. Basically, only one bulk-in 
endpoint is required, everything else is optional.

The patch is on top of the PV8630 removal patch.

Bye,
  Henning
  
--- linux-2.5.54-pv/drivers/usb/image/scanner.c 2003-01-07 23:51:21.000000000 +0100
+++ linux-2.5.54-endpoint/drivers/usb/image/scanner.c   2003-01-08 00:17:16.000000000 
++0100
@@ -336,9 +336,10 @@
  *    - Print information about user-supplied ids only once at startup instead
  *      of everytime any USB device is plugged in.
  *    - Removed PV8630 ioctls. Use the standard ioctls instead.
+ *    - Made endpoint detection more generic. Basically, only one bulk-in 
+ *      endpoint is required, everything else is optional.
  *      
  * TODO
- *    - Remove the 2/3 endpoint limitation
  *    - Performance
  *    - Select/poll methods
  *    - More testing
@@ -879,39 +880,46 @@
        }
 
 /*
- * Start checking for one or two bulk endpoints and an optional
- * interrupt endpoint. If we have an interrupt endpoint go ahead and
+ * Start checking for bulk and interrupt endpoints. We are only using the first
+ * one of each type of endpoint. If we have an interrupt endpoint go ahead and
  * setup the handler. FIXME: This is a future enhancement...
  */
 
        dbg("probe_scanner: Number of Endpoints:%d", (int) 
interface->desc.bNumEndpoints);
 
-       if ((interface->desc.bNumEndpoints < 1) || (interface->desc.bNumEndpoints > 
3)) {
-               info("probe_scanner: Only 1, 2, or 3 endpoints supported.");
-               return -ENODEV;
-       }
-
        ep_cnt = have_bulk_in = have_bulk_out = have_intr = 0;
 
        while (ep_cnt < interface->desc.bNumEndpoints) {
                endpoint = &interface->endpoint[ep_cnt].desc;
 
-               if (!have_bulk_in && IS_EP_BULK_IN(endpoint)) {
+               if (IS_EP_BULK_IN(endpoint)) {
                        ep_cnt++;
+                       if (have_bulk_in) {
+                               info ("probe_scanner: ignoring additional 
+bulk_in_ep:%d", ep_cnt);
+                               continue;
+                       }
                        have_bulk_in = ep_cnt;
                        dbg("probe_scanner: bulk_in_ep:%d", have_bulk_in);
                        continue;
                }
 
-               if (!have_bulk_out && IS_EP_BULK_OUT(endpoint)) {
+               if (IS_EP_BULK_OUT(endpoint)) {
                        ep_cnt++;
+                       if (have_bulk_out) {
+                               info ("probe_scanner: ignoring additional 
+bulk_out_ep:%d", ep_cnt);
+                               continue;
+                       }
                        have_bulk_out = ep_cnt;
                        dbg("probe_scanner: bulk_out_ep:%d", have_bulk_out);
                        continue;
                }
 
-               if (!have_intr && IS_EP_INTR(endpoint)) {
+               if (IS_EP_INTR(endpoint)) {
                        ep_cnt++;
+                       if (have_intr) {
+                               info ("probe_scanner: ignoring additional intr_ep:%d", 
+ep_cnt);
+                               continue;
+                       }
                        have_intr = ep_cnt;
                        dbg("probe_scanner: intr_ep:%d", have_intr);
                        continue;
@@ -926,31 +934,11 @@
  * should have.
  */
 
-       switch(interface->desc.bNumEndpoints) {
-       case 1:
-               if (!have_bulk_in) {
-                       info("probe_scanner: One bulk-in endpoint required.");
-                       return -EIO;
-               }
-               break;
-       case 2:
-               if (!have_bulk_in || !have_bulk_out) {
-                       info("probe_scanner: Two bulk endpoints required.");
-                       return -EIO;
-               }
-               break;
-       case 3:
-               if (!have_bulk_in || !have_bulk_out || !have_intr) {
-                       info("probe_scanner: Two bulk endpoints and one interrupt 
endpoint required.");
-                       return -EIO;
-               }
-               break;
-       default:
-               info("probe_scanner: Endpoint determination failed --  consult 
Documentation/usb/scanner.txt");
+       if (!have_bulk_in) {
+               err("probe_scanner: One bulk-in endpoint required.");
                return -EIO;
        }
 
-
 /*
  * Determine a minor number and initialize the structure associated
  * with it.  The problem with this is that we are counting on the fact
@@ -1029,7 +1017,6 @@
                break;
        case 0x055f:            /* Mustek */
        case 0x0400:            /* Another Mustek */
-       case 0x0ff5:            /* And yet another Mustek */
                scn->rd_nak_timeout = HZ * 1;
        default:
                scn->rd_nak_timeout = RD_NAK_TIMEOUT;


-------------------------------------------------------
This SF.NET email is sponsored by:
SourceForge Enterprise Edition + IBM + LinuxWorld = Something 2 See!
http://www.vasoftware.com
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to