Pull in the most recent version of usb_quirks.h and propagate the necessary

changes to the various files.

Also, pull in most of the current usb_subr.c file.
This commit is contained in:
Nick Hibma 2001-07-05 10:12:59 +00:00
parent b74562cf03
commit e1f5734cbe
8 changed files with 161 additions and 194 deletions

View File

@ -1314,7 +1314,7 @@ ugen_do_ioctl(struct ugen_softc *sc, int endpt, u_long cmd,
}
case USB_GET_DEVICEINFO:
usbd_fill_deviceinfo(sc->sc_udev,
(struct usb_device_info *)addr);
(struct usb_device_info *)addr, 1);
break;
default:
return (EINVAL);

View File

@ -530,7 +530,7 @@ usbioctl(devt, cmd, data, flag, p)
dev = sc->sc_bus->devices[addr];
if (dev == 0)
return (ENXIO);
usbd_fill_deviceinfo(dev, di);
usbd_fill_deviceinfo(dev, di, 1);
break;
}
@ -677,7 +677,7 @@ usbd_add_event(type, dev)
}
ueq->ue.ue_type = type;
ueq->ue.ue_cookie = dev->cookie;
usbd_fill_deviceinfo(dev, &ueq->ue.ue_device);
usbd_fill_deviceinfo(dev, &ueq->ue.ue_device, 0);
microtime(&thetime);
TIMEVAL_TO_TIMESPEC(&thetime, &ueq->ue.ue_time);
TAILQ_INSERT_TAIL(&usb_events, ueq, next);

View File

@ -1,4 +1,4 @@
/* $NetBSD: usb_quirks.c,v 1.30 2000/10/24 03:59:16 explorer Exp $ */
/* $NetBSD: usb_quirks.c,v 1.38 2001/04/15 10:26:36 augustss Exp $ */
/* $FreeBSD$ */
/*
@ -50,21 +50,23 @@
extern int usbdebug;
#endif
Static struct usbd_quirk_entry {
#define ANY 0xffff
Static const struct usbd_quirk_entry {
u_int16_t idVendor;
u_int16_t idProduct;
u_int16_t bcdDevice;
struct usbd_quirks quirks;
} usb_quirks[] = {
{ USB_VENDOR_KYE, USB_PRODUCT_KYE_NICHE, 0x100, { UQ_NO_SET_PROTO}},
{ USB_VENDOR_INSIDEOUT,USB_PRODUCT_INSIDEOUT_EDGEPORT4,
{ USB_VENDOR_INSIDEOUT, USB_PRODUCT_INSIDEOUT_EDGEPORT4,
0x094, { UQ_SWAP_UNICODE}},
{ USB_VENDOR_BTC, USB_PRODUCT_BTC_BTC7932, 0x100, { UQ_NO_STRINGS }},
{ USB_VENDOR_ADS, USB_PRODUCT_ADS_UBS10BT, 0x002, { UQ_NO_STRINGS }},
{ USB_VENDOR_PERACOM, USB_PRODUCT_PERACOM_SERIAL1, 0x101, { UQ_NO_STRINGS }},
{ USB_VENDOR_WACOM, USB_PRODUCT_WACOM_CT0405U, 0x101, { UQ_NO_STRINGS }},
{ USB_VENDOR_DALLAS, USB_PRODUCT_DALLAS_J6502, 0x0a2, { UQ_BAD_ADC }},
{ USB_VENDOR_DALLAS, USB_PRODUCT_DALLAS_J6502, 0x0a2, { UQ_NO_XU }},
{ USB_VENDOR_DALLAS, USB_PRODUCT_DALLAS_J6502, 0x0a2, { UQ_AU_NO_XU }},
{ USB_VENDOR_ALTEC, USB_PRODUCT_ALTEC_ADA70, 0x103, { UQ_BAD_ADC }},
{ USB_VENDOR_ALTEC, USB_PRODUCT_ALTEC_ASC495, 0x000, { UQ_BAD_AUDIO }},
{ USB_VENDOR_QTRONIX, USB_PRODUCT_QTRONIX_980N, 0x110, { UQ_SPUR_BUT_UP }},
@ -73,22 +75,36 @@ Static struct usbd_quirk_entry {
{ USB_VENDOR_MCT, USB_PRODUCT_MCT_USB232, 0x102, { UQ_BUS_POWERED }},
{ USB_VENDOR_METRICOM, USB_PRODUCT_METRICOM_RICOCHET_GS,
0x100, { UQ_ASSUME_CM_OVER_DATA | UQ_NO_STRINGS }},
{ USB_VENDOR_TI, USB_PRODUCT_TI_UTUSB41, 0x110, { UQ_POWER_CLAIM }},
{ USB_VENDOR_ACERP, USB_PRODUCT_ACERP_ACERSCAN_320U,
0x000, { UQ_NO_STRINGS }},
0x000, { UQ_NO_STRINGS }},
{ USB_VENDOR_TELEX, USB_PRODUCT_TELEX_MIC1, 0x009, { UQ_AU_NO_FRAC }},
{ USB_VENDOR_SILICONPORTALS, USB_PRODUCT_SILICONPORTALS_YAPPHONE,
0x100, { UQ_AU_INP_ASYNC }},
/* XXX These should have a revision number, but I don't know what they are. */
{ USB_VENDOR_HP, USB_PRODUCT_HP_895C, ANY, { UQ_BROKEN_BIDIR }},
{ USB_VENDOR_HP, USB_PRODUCT_HP_880C, ANY, { UQ_BROKEN_BIDIR }},
{ USB_VENDOR_HP, USB_PRODUCT_HP_815C, ANY, { UQ_BROKEN_BIDIR }},
{ USB_VENDOR_HP, USB_PRODUCT_HP_810C, ANY, { UQ_BROKEN_BIDIR }},
{ USB_VENDOR_HP, USB_PRODUCT_HP_830C, ANY, { UQ_BROKEN_BIDIR }},
{ 0, 0, 0, { 0 } }
};
struct usbd_quirks usbd_no_quirk = { 0 };
const struct usbd_quirks usbd_no_quirk = { 0 };
struct usbd_quirks *
const struct usbd_quirks *
usbd_find_quirk(usb_device_descriptor_t *d)
{
struct usbd_quirk_entry *t;
const struct usbd_quirk_entry *t;
u_int16_t vendor = UGETW(d->idVendor);
u_int16_t product = UGETW(d->idProduct);
u_int16_t revision = UGETW(d->bcdDevice);
for (t = usb_quirks; t->idVendor != 0; t++) {
if (t->idVendor == UGETW(d->idVendor) &&
t->idProduct == UGETW(d->idProduct) &&
t->bcdDevice == UGETW(d->bcdDevice))
if (t->idVendor == vendor &&
t->idProduct == product &&
(t->bcdDevice == ANY || t->bcdDevice == revision))
break;
}
#ifdef USB_DEBUG

View File

@ -1,4 +1,4 @@
/* $NetBSD: usb_quirks.h,v 1.11 2000/04/27 15:26:50 augustss Exp $ */
/* $NetBSD: usb_quirks.h,v 1.20 2001/04/15 09:38:01 augustss Exp $ */
/* $FreeBSD$ */
/*
@ -48,10 +48,14 @@ struct usbd_quirks {
#define UQ_BUS_POWERED 0x0020 /* device is bus powered, despite claim */
#define UQ_BAD_AUDIO 0x0040 /* device claims audio class, but isn't */
#define UQ_SPUR_BUT_UP 0x0080 /* spurious mouse button up events */
#define UQ_NO_XU 0x0100 /* audio device has broken extension unit */
#define UQ_ASSUME_CM_OVER_DATA 0x0200 /* modem device breaks on cm over data */
#define UQ_AU_NO_XU 0x0100 /* audio device has broken extension unit */
#define UQ_POWER_CLAIM 0x0200 /* hub lies about power status */
#define UQ_AU_NO_FRAC 0x0400 /* don't adjust for fractional samples */
#define UQ_AU_INP_ASYNC 0x0800 /* input is async despite claim of adaptive */
#define UQ_ASSUME_CM_OVER_DATA 0x1000 /* modem device breaks on cm over data */
#define UQ_BROKEN_BIDIR 0x2000 /* printer has broken bidir mode */
};
extern struct usbd_quirks usbd_no_quirk;
extern const struct usbd_quirks usbd_no_quirk;
struct usbd_quirks *usbd_find_quirk(usb_device_descriptor_t *);
const struct usbd_quirks *usbd_find_quirk(usb_device_descriptor_t *);

View File

@ -75,19 +75,21 @@ extern int usbdebug;
#define DPRINTFN(n,x)
#endif
Static usbd_status usbd_set_config(usbd_device_handle, int);
Static usbd_status usbd_set_config(usbd_device_handle, int);
Static void usbd_devinfo_vp(usbd_device_handle, char *, char *, int);
Static char *usbd_get_string(usbd_device_handle, int, char *);
Static int usbd_getnewaddr(usbd_bus_handle bus);
#if defined(__NetBSD__)
Static int usbd_print(void *aux, const char *pnp);
Static int usbd_submatch(device_ptr_t, struct cfdata *cf, void *);
#elif defined(__OpenBSD__)
Static int usbd_print(void *aux, const char *pnp);
Static int usbd_submatch(device_ptr_t, void *, void *);
#endif
Static void usbd_free_iface_data(usbd_device_handle dev, int ifcno);
Static void usbd_kill_pipe(usbd_pipe_handle);
Static usbd_status usbd_probe_and_attach
(device_ptr_t parent, usbd_device_handle dev, int port, int addr);
Static usbd_status usbd_probe_and_attach(device_ptr_t parent,
usbd_device_handle dev, int port, int addr);
Static u_int32_t usb_cookie_no = 0;
@ -109,7 +111,7 @@ struct usb_knowndev {
#include <dev/usb/usbdevs_data.h>
#endif /* USBVERBOSE */
Static const char *usbd_error_strs[] = {
Static const char * const usbd_error_strs[] = {
"NORMAL_COMPLETION",
"IN_PROGRESS",
"PENDING_REQUESTS",
@ -133,8 +135,7 @@ Static const char *usbd_error_strs[] = {
};
const char *
usbd_errstr(err)
usbd_status err;
usbd_errstr(usbd_status err)
{
static char buffer[5];
@ -147,11 +148,8 @@ usbd_errstr(err)
}
usbd_status
usbd_get_string_desc(dev, sindex, langid, sdesc)
usbd_device_handle dev;
int sindex;
int langid;
usb_string_descriptor_t *sdesc;
usbd_get_string_desc(usbd_device_handle dev, int sindex, int langid,
usb_string_descriptor_t *sdesc)
{
usb_device_request_t req;
usbd_status err;
@ -169,10 +167,7 @@ usbd_get_string_desc(dev, sindex, langid, sdesc)
}
char *
usbd_get_string(dev, si, buf)
usbd_device_handle dev;
int si;
char *buf;
usbd_get_string(usbd_device_handle dev, int si, char *buf)
{
int swap = dev->quirks->uq_flags & UQ_SWAP_UNICODE;
usb_string_descriptor_t us;
@ -214,15 +209,29 @@ usbd_get_string(dev, si, buf)
return (buf);
}
void
usbd_devinfo_vp(dev, v, p)
usbd_device_handle dev;
char *v, *p;
Static void
usbd_trim_spaces(char *p)
{
char *q, *e;
if (p == NULL)
return;
q = e = p;
while (*q == ' ') /* skip leading spaces */
q++;
while ((*p = *q++)) /* copy string */
if (*p++ != ' ') /* remember last non-space */
e = p;
*e = 0; /* kill trailing spaces */
}
Static void
usbd_devinfo_vp(usbd_device_handle dev, char *v, char *p, int usedev)
{
usb_device_descriptor_t *udd = &dev->ddesc;
char *vendor = 0, *product = 0;
#ifdef USBVERBOSE
struct usb_knowndev *kdp;
const struct usb_knowndev *kdp;
#endif
if (dev == NULL) {
@ -230,8 +239,15 @@ usbd_devinfo_vp(dev, v, p)
return;
}
vendor = usbd_get_string(dev, udd->iManufacturer, v);
product = usbd_get_string(dev, udd->iProduct, p);
if (usedev) {
vendor = usbd_get_string(dev, udd->iManufacturer, v);
usbd_trim_spaces(vendor);
product = usbd_get_string(dev, udd->iProduct, p);
usbd_trim_spaces(product);
} else {
vendor = NULL;
product = NULL;
}
#ifdef USBVERBOSE
if (vendor == NULL || product == NULL) {
for(kdp = usb_knowndevs;
@ -243,44 +259,39 @@ usbd_devinfo_vp(dev, v, p)
break;
}
if (kdp->vendorname != NULL) {
if (!vendor)
vendor = kdp->vendorname;
if (!product)
product = (kdp->flags & USB_KNOWNDEV_NOPROD) == 0 ?
if (vendor == NULL)
vendor = kdp->vendorname;
if (product == NULL)
product = (kdp->flags & USB_KNOWNDEV_NOPROD) == 0 ?
kdp->productname : NULL;
}
}
#endif
if (vendor != NULL)
if (vendor != NULL && *vendor)
strcpy(v, vendor);
else
sprintf(v, "vendor 0x%04x", UGETW(udd->idVendor));
if (product != NULL)
if (product != NULL && *product)
strcpy(p, product);
else
sprintf(p, "product 0x%04x", UGETW(udd->idProduct));
}
int
usbd_printBCD(cp, bcd)
char *cp;
int bcd;
usbd_printBCD(char *cp, int bcd)
{
return (sprintf(cp, "%x.%02x", bcd >> 8, bcd & 0xff));
}
void
usbd_devinfo(dev, showclass, cp)
usbd_device_handle dev;
int showclass;
char *cp;
usbd_devinfo(usbd_device_handle dev, int showclass, char *cp)
{
usb_device_descriptor_t *udd = &dev->ddesc;
char vendor[USB_MAX_STRING_LEN];
char product[USB_MAX_STRING_LEN];
int bcdDevice, bcdUSB;
usbd_devinfo_vp(dev, vendor, product);
usbd_devinfo_vp(dev, vendor, product, 1);
cp += sprintf(cp, "%s %s", vendor, product);
if (showclass)
cp += sprintf(cp, ", class %d/%d",
@ -297,9 +308,7 @@ usbd_devinfo(dev, showclass, cp)
/* Delay for a certain number of ms */
void
usb_delay_ms(bus, ms)
usbd_bus_handle bus;
u_int ms;
usb_delay_ms(usbd_bus_handle bus, u_int ms)
{
/* Wait at least two clock ticks so we know the time has passed. */
if (bus->use_polling || cold)
@ -310,18 +319,13 @@ usb_delay_ms(bus, ms)
/* Delay given a device handle. */
void
usbd_delay_ms(dev, ms)
usbd_device_handle dev;
u_int ms;
usbd_delay_ms(usbd_device_handle dev, u_int ms)
{
usb_delay_ms(dev->bus, ms);
}
usbd_status
usbd_reset_port(dev, port, ps)
usbd_device_handle dev;
int port;
usb_port_status_t *ps;
usbd_reset_port(usbd_device_handle dev, int port, usb_port_status_t *ps)
{
usb_device_request_t req;
usbd_status err;
@ -363,10 +367,7 @@ usbd_reset_port(dev, port, ps)
}
usb_interface_descriptor_t *
usbd_find_idesc(cd, ifaceidx, altidx)
usb_config_descriptor_t *cd;
int ifaceidx;
int altidx;
usbd_find_idesc(usb_config_descriptor_t *cd, int ifaceidx, int altidx)
{
char *p = (char *)cd;
char *end = p + UGETW(cd->wTotalLength);
@ -397,11 +398,8 @@ usbd_find_idesc(cd, ifaceidx, altidx)
}
usb_endpoint_descriptor_t *
usbd_find_edesc(cd, ifaceidx, altidx, endptidx)
usb_config_descriptor_t *cd;
int ifaceidx;
int altidx;
int endptidx;
usbd_find_edesc(usb_config_descriptor_t *cd, int ifaceidx, int altidx,
int endptidx)
{
char *p = (char *)cd;
char *end = p + UGETW(cd->wTotalLength);
@ -433,21 +431,20 @@ usbd_find_edesc(cd, ifaceidx, altidx, endptidx)
}
usbd_status
usbd_fill_iface_data(dev, ifaceidx, altidx)
usbd_device_handle dev;
int ifaceidx;
int altidx;
usbd_fill_iface_data(usbd_device_handle dev, int ifaceidx, int altidx)
{
usbd_interface_handle ifc = &dev->ifaces[ifaceidx];
usb_interface_descriptor_t *idesc;
char *p, *end;
int endpt, nendpt;
DPRINTFN(4,("usbd_fill_iface_data: ifaceidx=%d altidx=%d\n",
ifaceidx, altidx));
ifc->device = dev;
ifc->idesc = usbd_find_idesc(dev->cdesc, ifaceidx, altidx);
if (ifc->idesc == 0)
idesc = usbd_find_idesc(dev->cdesc, ifaceidx, altidx);
if (idesc == NULL)
return (USBD_INVAL);
ifc->device = dev;
ifc->idesc = idesc;
ifc->index = ifaceidx;
ifc->altindex = altidx;
nendpt = ifc->idesc->bNumEndpoints;
@ -493,15 +490,15 @@ usbd_fill_iface_data(dev, ifaceidx, altidx)
return (USBD_NORMAL_COMPLETION);
bad:
if (ifc->endpoints != NULL)
if (ifc->endpoints != NULL) {
free(ifc->endpoints, M_USB);
ifc->endpoints = NULL;
}
return (USBD_INVAL);
}
void
usbd_free_iface_data(dev, ifcno)
usbd_device_handle dev;
int ifcno;
usbd_free_iface_data(usbd_device_handle dev, int ifcno)
{
usbd_interface_handle ifc = &dev->ifaces[ifcno];
if (ifc->endpoints)
@ -509,9 +506,7 @@ usbd_free_iface_data(dev, ifcno)
}
Static usbd_status
usbd_set_config(dev, conf)
usbd_device_handle dev;
int conf;
usbd_set_config(usbd_device_handle dev, int conf)
{
usb_device_request_t req;
@ -524,10 +519,7 @@ usbd_set_config(dev, conf)
}
usbd_status
usbd_set_config_no(dev, no, msg)
usbd_device_handle dev;
int no;
int msg;
usbd_set_config_no(usbd_device_handle dev, int no, int msg)
{
int index;
usb_config_descriptor_t cd;
@ -549,10 +541,7 @@ usbd_set_config_no(dev, no, msg)
}
usbd_status
usbd_set_config_index(dev, index, msg)
usbd_device_handle dev;
int index;
int msg;
usbd_set_config_index(usbd_device_handle dev, int index, int msg)
{
usb_status_t ds;
usb_config_descriptor_t cd, *cdp;
@ -634,6 +623,7 @@ usbd_set_config_index(dev, index, msg)
#endif
power = cdp->bMaxPower * 2;
if (power > dev->powersrc->power) {
DPRINTF(("power exceeded %d %d\n", power,dev->powersrc->power));
/* XXX print nicer message. */
if (msg)
printf("%s: device addr %d (config %d) exceeds power "
@ -688,12 +678,8 @@ usbd_set_config_index(dev, index, msg)
/* XXX add function for alternate settings */
usbd_status
usbd_setup_pipe(dev, iface, ep, ival, pipe)
usbd_device_handle dev;
usbd_interface_handle iface;
struct usbd_endpoint *ep;
int ival;
usbd_pipe_handle *pipe;
usbd_setup_pipe(usbd_device_handle dev, usbd_interface_handle iface,
struct usbd_endpoint *ep, int ival, usbd_pipe_handle *pipe)
{
usbd_pipe_handle p;
usbd_status err;
@ -730,8 +716,7 @@ usbd_setup_pipe(dev, iface, ep, ival, pipe)
/* Abort the device control pipe. */
void
usbd_kill_pipe(pipe)
usbd_pipe_handle pipe;
usbd_kill_pipe(usbd_pipe_handle pipe)
{
pipe->methods->close(pipe);
pipe->endpoint->refcnt--;
@ -739,8 +724,7 @@ usbd_kill_pipe(pipe)
}
int
usbd_getnewaddr(bus)
usbd_bus_handle bus;
usbd_getnewaddr(usbd_bus_handle bus)
{
int addr;
@ -752,11 +736,8 @@ usbd_getnewaddr(bus)
usbd_status
usbd_probe_and_attach(parent, dev, port, addr)
device_ptr_t parent;
usbd_device_handle dev;
int port;
int addr;
usbd_probe_and_attach(device_ptr_t parent, usbd_device_handle dev,
int port, int addr)
{
struct usb_attach_arg uaa;
usb_device_descriptor_t *dd = &dev->ddesc;
@ -923,13 +904,8 @@ usbd_probe_and_attach(parent, dev, port, addr)
* and attach a driver.
*/
usbd_status
usbd_new_device(parent, bus, depth, lowspeed, port, up)
device_ptr_t parent;
usbd_bus_handle bus;
int depth;
int lowspeed;
int port;
struct usbd_port *up;
usbd_new_device(device_ptr_t parent, usbd_bus_handle bus, int depth,
int lowspeed, int port, struct usbd_port *up)
{
usbd_device_handle dev;
usb_device_descriptor_t *dd;
@ -1057,12 +1033,12 @@ usbd_new_device(parent, bus, depth, lowspeed, port, up)
}
usbd_add_event(USB_EVENT_ATTACH, dev);
return (USBD_NORMAL_COMPLETION);
}
usbd_status
usbd_reload_device_desc(dev)
usbd_device_handle dev;
usbd_reload_device_desc(usbd_device_handle dev)
{
usbd_status err;
@ -1078,9 +1054,7 @@ usbd_reload_device_desc(dev)
}
void
usbd_remove_device(dev, up)
usbd_device_handle dev;
struct usbd_port *up;
usbd_remove_device(usbd_device_handle dev, struct usbd_port *up)
{
DPRINTF(("usbd_remove_device: %p\n", dev));
@ -1094,9 +1068,7 @@ usbd_remove_device(dev, up)
#if defined(__NetBSD__) || defined(__OpenBSD__)
int
usbd_print(aux, pnp)
void *aux;
const char *pnp;
usbd_print(void *aux, const char *pnp)
{
struct usb_attach_arg *uaa = aux;
char devinfo[1024];
@ -1132,17 +1104,11 @@ usbd_print(aux, pnp)
#if defined(__NetBSD__)
int
usbd_submatch(parent, cf, aux)
struct device *parent;
struct cfdata *cf;
void *aux;
usbd_submatch(struct device *parent, struct cfdata *cf, void *aux)
{
#elif defined(__OpenBSD__)
int
usbd_submatch(parent, match, aux)
struct device *parent;
void *match;
void *aux;
usbd_submatch(struct device *parent, void *match, void *aux)
{
struct cfdata *cf = match;
#endif
@ -1158,24 +1124,24 @@ usbd_submatch(parent, match, aux)
uaa->release, cf->uhubcf_release));
if (uaa->port != 0 && /* root hub has port 0, it should match */
((uaa->port != 0 &&
cf->uhubcf_port != UHUB_UNK_PORT &&
cf->uhubcf_port != uaa->port) ||
(uaa->configno != UHUB_UNK_CONFIGURATION &&
cf->uhubcf_configuration != UHUB_UNK_CONFIGURATION &&
cf->uhubcf_configuration != uaa->configno) ||
(uaa->ifaceno != UHUB_UNK_INTERFACE &&
cf->uhubcf_interface != UHUB_UNK_INTERFACE &&
cf->uhubcf_interface != uaa->ifaceno) ||
(uaa->vendor != UHUB_UNK_VENDOR &&
cf->uhubcf_vendor != UHUB_UNK_VENDOR &&
cf->uhubcf_vendor != uaa->vendor) ||
(uaa->product != UHUB_UNK_PRODUCT &&
cf->uhubcf_product != UHUB_UNK_PRODUCT &&
cf->uhubcf_product != uaa->product) ||
(uaa->release != UHUB_UNK_RELEASE &&
cf->uhubcf_release != UHUB_UNK_RELEASE &&
cf->uhubcf_release != uaa->release)
)
cf->uhubcf_port != UHUB_UNK_PORT &&
cf->uhubcf_port != uaa->port) ||
(uaa->configno != UHUB_UNK_CONFIGURATION &&
cf->uhubcf_configuration != UHUB_UNK_CONFIGURATION &&
cf->uhubcf_configuration != uaa->configno) ||
(uaa->ifaceno != UHUB_UNK_INTERFACE &&
cf->uhubcf_interface != UHUB_UNK_INTERFACE &&
cf->uhubcf_interface != uaa->ifaceno) ||
(uaa->vendor != UHUB_UNK_VENDOR &&
cf->uhubcf_vendor != UHUB_UNK_VENDOR &&
cf->uhubcf_vendor != uaa->vendor) ||
(uaa->product != UHUB_UNK_PRODUCT &&
cf->uhubcf_product != UHUB_UNK_PRODUCT &&
cf->uhubcf_product != uaa->product) ||
(uaa->release != UHUB_UNK_RELEASE &&
cf->uhubcf_release != UHUB_UNK_RELEASE &&
cf->uhubcf_release != uaa->release)
)
)
return 0;
return ((*cf->cf_attach->ca_match)(parent, cf, aux));
@ -1184,30 +1150,15 @@ usbd_submatch(parent, match, aux)
#endif
void
usbd_fill_deviceinfo(dev, di)
usbd_device_handle dev;
struct usb_device_info *di;
usbd_fill_deviceinfo(usbd_device_handle dev, struct usb_device_info *di,
int usedev)
{
struct usbd_port *p;
int i, err, s;
di->bus = USBDEVUNIT(dev->bus->bdev);
di->addr = dev->address;
if (dev->subdevs) {
for (i = 0; dev->subdevs[i] &&
i < MAXDEVNAMES; i++) {
strncpy(di->devnames[i], USBDEVPTRNAME(dev->subdevs[i]),
MAXDEVNAMELEN);
di->devnames[i][MAXDEVNAMELEN-1] = '\0'; /* terminate */
}
} else {
i = 0;
}
for (/*i is set */; i < MAXDEVNAMES; i++)
di->devnames[i][0] = 0; /* empty */
usbd_devinfo_vp(dev, di->vendor, di->product);
usbd_devinfo_vp(dev, di->vendor, di->product, usedev);
usbd_printBCD(di->release, UGETW(dev->ddesc.bcdDevice));
di->vendorNo = UGETW(dev->ddesc.idVendor);
di->productNo = UGETW(dev->ddesc.idProduct);
@ -1219,6 +1170,19 @@ usbd_fill_deviceinfo(dev, di)
di->power = dev->self_powered ? 0 : dev->power;
di->lowspeed = dev->lowspeed;
if (dev->subdevs != NULL) {
for (i = 0; dev->subdevs[i] &&
i < MAXDEVNAMES; i++) {
strncpy(di->devnames[i], USBDEVPTRNAME(dev->subdevs[i]),
MAXDEVNAMELEN);
di->devnames[i][MAXDEVNAMELEN-1] = '\0';
}
} else {
i = 0;
}
for (/*i is set */; i < MAXDEVNAMES; i++)
di->devnames[i][0] = 0; /* empty */
if (dev->hub) {
for (i = 0;
i < sizeof(di->ports) / sizeof(di->ports[0]) &&
@ -1246,8 +1210,7 @@ usbd_fill_deviceinfo(dev, di)
}
void
usb_free_device(dev)
usbd_device_handle dev;
usb_free_device(usbd_device_handle dev)
{
int ifcidx, nifc;
@ -1284,9 +1247,7 @@ usb_free_device(dev)
* been disconnected.
*/
void
usb_disconnect_port(up, parent)
struct usbd_port *up;
device_ptr_t parent;
usb_disconnect_port(struct usbd_port *up, device_ptr_t parent)
{
usbd_device_handle dev = up->device;
const char *hubname = USBDEVPTRNAME(parent);
@ -1302,15 +1263,6 @@ usb_disconnect_port(up, parent)
}
#endif
if (dev->cdesc == NULL) {
/* Partially attached device, just drop it. */
dev->bus->devices[dev->address] = 0;
up->device = 0;
return;
}
usbd_add_event(USB_EVENT_DETACH, dev);
if (dev->subdevs != NULL) {
DPRINTFN(3,("usb_disconnect_port: disconnect subdevs\n"));
for (i = 0; dev->subdevs[i]; i++) {
@ -1336,11 +1288,7 @@ usb_disconnect_port(up, parent)
}
#ifdef __OpenBSD__
void *usb_realloc(p, size, pool, flags)
void *p;
u_int size;
int pool;
int flags;
void *usb_realloc(void *p, u_int size, int pool, int flags)
{
void *q;

View File

@ -1047,7 +1047,7 @@ usbd_do_request_async(dev, req, data)
return (USBD_NORMAL_COMPLETION);
}
struct usbd_quirks *
const struct usbd_quirks *
usbd_get_quirks(dev)
usbd_device_handle dev;
{

View File

@ -162,7 +162,7 @@ int usbd_get_no_alts(usb_config_descriptor_t *, int);
usbd_status usbd_get_interface
(usbd_interface_handle iface, u_int8_t *aiface);
void usbd_fill_deviceinfo
(usbd_device_handle dev, struct usb_device_info *di);
(usbd_device_handle dev, struct usb_device_info *di, int usedev);
int usbd_get_interface_altindex(usbd_interface_handle iface);
usb_interface_descriptor_t *usbd_find_idesc
@ -179,7 +179,7 @@ const char *usbd_errstr(usbd_status err);
void usbd_add_event(int, usbd_device_handle);
void usbd_devinfo(usbd_device_handle, int, char *);
struct usbd_quirks *usbd_get_quirks(usbd_device_handle);
const struct usbd_quirks *usbd_get_quirks(usbd_device_handle);
usb_endpoint_descriptor_t *usbd_get_endpoint_descriptor
(usbd_interface_handle iface, u_int8_t address);

View File

@ -134,7 +134,7 @@ struct usbd_device {
struct usbd_interface *ifaces; /* array of all interfaces */
usb_device_descriptor_t ddesc; /* device descriptor */
usb_config_descriptor_t *cdesc; /* full config descr */
struct usbd_quirks *quirks; /* device quirks, always set */
const struct usbd_quirks *quirks; /* device quirks, always set */
struct usbd_hub *hub; /* only if this is a hub */
device_ptr_t *subdevs; /* sub-devices, 0 terminated */
};
@ -210,7 +210,6 @@ void usbd_finish(void);
/* Routines from usb_subr.c */
int usbctlprint(void *, const char *);
void usb_delay_ms(usbd_bus_handle, u_int);
void usbd_devinfo_vp(usbd_device_handle, char *, char *);
usbd_status usbd_reset_port(usbd_device_handle dev,
int port, usb_port_status_t *ps);
usbd_status usbd_setup_pipe(usbd_device_handle dev,