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
#include
#include
-#include
/* 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.hSat Sep 10 12:36:11 2011(r225468)
+++ head/sys/dev/usb/usbdi.hSat Sep 10 15:55:36 2011(r225469)
@@ -353,7 +353,6 @@ struct usbd_lookup_info {
uint16_t idVendor;