mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-21 11:13:30 +00:00
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
This commit is contained in:
parent
c9c00408c5
commit
3f37fb622c
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=225469
@ -588,7 +588,7 @@ usb_test_quirk_by_info(const struct usbd_lookup_info *info, uint16_t quirk)
|
||||
}
|
||||
mtx_unlock(&usb_quirk_mtx);
|
||||
done:
|
||||
return (usb_test_quirk_w(info, quirk));
|
||||
return (0); /* no quirk match */
|
||||
}
|
||||
|
||||
static struct usb_quirk_entry *
|
||||
|
@ -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 *udev,
|
||||
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 *udev, uint16_t quirk)
|
||||
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 */
|
||||
}
|
||||
|
@ -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_device *udev, uint16_t index)
|
||||
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 */
|
||||
}
|
||||
|
||||
|
@ -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_ */
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user