Author: hselasky
Date: Sat Sep 10 15:55:36 2011
New Revision: 225469
URL: http://svn.freebsd.org/changeset/base/225469

Log:
  Refactor auto-quirk solution so that we break as few external
  drivers as possible.
  
  PR:           usb/160299
  Approved by:  re (kib)
  Suggested by: rwatson
  MFC after:    0 days

Modified:
  head/sys/dev/usb/quirk/usb_quirk.c
  head/sys/dev/usb/usb_device.c
  head/sys/dev/usb/usb_dynamic.c
  head/sys/dev/usb/usb_dynamic.h
  head/sys/dev/usb/usbdi.h
  head/sys/sys/param.h

Modified: head/sys/dev/usb/quirk/usb_quirk.c
==============================================================================
--- head/sys/dev/usb/quirk/usb_quirk.c  Sat Sep 10 12:36:11 2011        
(r225468)
+++ head/sys/dev/usb/quirk/usb_quirk.c  Sat Sep 10 15:55:36 2011        
(r225469)
@@ -588,7 +588,7 @@ usb_test_quirk_by_info(const struct usbd
        }
        mtx_unlock(&usb_quirk_mtx);
 done:
-       return (usb_test_quirk_w(info, quirk));
+       return (0);                     /* no quirk match */
 }
 
 static struct usb_quirk_entry *

Modified: head/sys/dev/usb/usb_device.c
==============================================================================
--- head/sys/dev/usb/usb_device.c       Sat Sep 10 12:36:11 2011        
(r225468)
+++ head/sys/dev/usb/usb_device.c       Sat Sep 10 15:55:36 2011        
(r225469)
@@ -1239,8 +1239,6 @@ static void
 usb_init_attach_arg(struct usb_device *udev,
     struct usb_attach_arg *uaa)
 {
-       uint8_t x;
-
        memset(uaa, 0, sizeof(*uaa));
 
        uaa->device = udev;
@@ -1256,9 +1254,6 @@ usb_init_attach_arg(struct usb_device *u
        uaa->info.bDeviceProtocol = udev->ddesc.bDeviceProtocol;
        uaa->info.bConfigIndex = udev->curr_config_index;
        uaa->info.bConfigNum = udev->curr_config_no;
-
-       for (x = 0; x != USB_MAX_AUTO_QUIRK; x++)
-               uaa->info.autoQuirk[x] = udev->autoQuirk[x];
 }
 
 /*------------------------------------------------------------------------*
@@ -2389,8 +2384,22 @@ uint8_t
 usb_test_quirk(const struct usb_attach_arg *uaa, uint16_t quirk)
 {
        uint8_t found;
+       uint8_t x;
+
+       if (quirk == UQ_NONE)
+               return (0);
+
+       /* search the automatic per device quirks first */
+
+       for (x = 0; x != USB_MAX_AUTO_QUIRK; x++) {
+               if (uaa->device->autoQuirk[x] == quirk)
+                       return (1);
+       }
+
+       /* search global quirk table, if any */
 
        found = (usb_test_quirk_p) (&uaa->info, quirk);
+
        return (found);
 }
 
@@ -2723,7 +2732,8 @@ usbd_add_dynamic_quirk(struct usb_device
        uint8_t x;
 
        for (x = 0; x != USB_MAX_AUTO_QUIRK; x++) {
-               if (udev->autoQuirk[x] == 0) {
+               if (udev->autoQuirk[x] == 0 ||
+                   udev->autoQuirk[x] == quirk) {
                        udev->autoQuirk[x] = quirk;
                        return (0);     /* success */
                }

Modified: head/sys/dev/usb/usb_dynamic.c
==============================================================================
--- head/sys/dev/usb/usb_dynamic.c      Sat Sep 10 12:36:11 2011        
(r225468)
+++ head/sys/dev/usb/usb_dynamic.c      Sat Sep 10 15:55:36 2011        
(r225469)
@@ -50,12 +50,12 @@
 #include <dev/usb/usb_process.h>
 #include <dev/usb/usb_device.h>
 #include <dev/usb/usb_dynamic.h>
-#include <dev/usb/quirk/usb_quirk.h>
 
 /* function prototypes */
 static usb_handle_req_t usb_temp_get_desc_w;
 static usb_temp_setup_by_index_t usb_temp_setup_by_index_w;
 static usb_temp_unsetup_t usb_temp_unsetup_w;
+static usb_test_quirk_t usb_test_quirk_w;
 static usb_quirk_ioctl_t usb_quirk_ioctl_w;
 
 /* global variables */
@@ -72,19 +72,9 @@ usb_temp_setup_by_index_w(struct usb_dev
        return (USB_ERR_INVAL);
 }
 
-uint8_t
+static uint8_t
 usb_test_quirk_w(const struct usbd_lookup_info *info, uint16_t quirk)
 {
-       uint8_t x;
-
-       if (quirk == UQ_NONE)
-               return (0);     /* no match */
-
-       for (x = 0; x != USB_MAX_AUTO_QUIRK; x++) {
-               if (info->autoQuirk[x] == quirk)
-                       return (1);     /* match */
-       }
-
        return (0);                     /* no match */
 }
 

Modified: head/sys/dev/usb/usb_dynamic.h
==============================================================================
--- head/sys/dev/usb/usb_dynamic.h      Sat Sep 10 12:36:11 2011        
(r225468)
+++ head/sys/dev/usb/usb_dynamic.h      Sat Sep 10 15:55:36 2011        
(r225469)
@@ -57,6 +57,5 @@ extern devclass_t usb_devclass_ptr;
 void   usb_temp_unload(void *);
 void   usb_quirk_unload(void *);
 void   usb_bus_unload(void *);
-usb_test_quirk_t usb_test_quirk_w;
 
 #endif                                 /* _USB_DYNAMIC_H_ */

Modified: head/sys/dev/usb/usbdi.h
==============================================================================
--- head/sys/dev/usb/usbdi.h    Sat Sep 10 12:36:11 2011        (r225468)
+++ head/sys/dev/usb/usbdi.h    Sat Sep 10 15:55:36 2011        (r225469)
@@ -353,7 +353,6 @@ struct usbd_lookup_info {
        uint16_t idVendor;
        uint16_t idProduct;
        uint16_t bcdDevice;
-       uint16_t autoQuirk[USB_MAX_AUTO_QUIRK];
        uint8_t bDeviceClass;
        uint8_t bDeviceSubClass;
        uint8_t bDeviceProtocol;

Modified: head/sys/sys/param.h
==============================================================================
--- head/sys/sys/param.h        Sat Sep 10 12:36:11 2011        (r225468)
+++ head/sys/sys/param.h        Sat Sep 10 15:55:36 2011        (r225469)
@@ -58,7 +58,7 @@
  *             in the range 5 to 9.
  */
 #undef __FreeBSD_version
-#define __FreeBSD_version 900043       /* Master, propagated to newvers */
+#define __FreeBSD_version 900044       /* Master, propagated to newvers */
 
 #ifdef _KERNEL
 #define        P_OSREL_SIGSEGV         700004
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to