usb: Update to FreeBSD trunk 2016-08-23

FreeBSD trunk, 2016-08-23, 9fe7c416e6abb28b1398fd3e5687099846800cfd.
This commit is contained in:
Sebastian Huber 2016-08-23 15:51:45 +02:00
parent 7c77211d0f
commit 8e65e1bf45
22 changed files with 364 additions and 193 deletions

View File

@ -95,17 +95,6 @@
#define DWC_OTG_PC2UDEV(pc) \
(USB_DMATAG_TO_XROOT((pc)->tag_parent)->udev)
#define DWC_OTG_MSK_GINT_ENABLED \
(GINTMSK_ENUMDONEMSK | \
GINTMSK_USBRSTMSK | \
GINTMSK_USBSUSPMSK | \
GINTMSK_IEPINTMSK | \
GINTMSK_SESSREQINTMSK | \
GINTMSK_RXFLVLMSK | \
GINTMSK_HCHINTMSK | \
GINTMSK_OTGINTMSK | \
GINTMSK_PRTINTMSK)
#define DWC_OTG_MSK_GINT_THREAD_IRQ \
(GINTSTS_USBRST | GINTSTS_ENUMDONE | GINTSTS_PRTINT | \
GINTSTS_WKUPINT | GINTSTS_USBSUSP | GINTMSK_OTGINTMSK | \
@ -378,6 +367,11 @@ dwc_otg_init_fifo(struct dwc_otg_softc *sc, uint8_t mode)
/* enable all host channel interrupts */
DWC_OTG_WRITE_4(sc, DOTG_HAINTMSK,
(1U << sc->sc_host_ch_max) - 1U);
/* enable proper host channel interrupts */
sc->sc_irq_mask |= GINTMSK_HCHINTMSK;
sc->sc_irq_mask &= ~GINTMSK_IEPINTMSK;
DWC_OTG_WRITE_4(sc, DOTG_GINTMSK, sc->sc_irq_mask);
}
if (mode == DWC_MODE_DEVICE) {
@ -438,6 +432,11 @@ dwc_otg_init_fifo(struct dwc_otg_softc *sc, uint8_t mode)
pf->usb.max_in_frame_size,
pf->usb.max_out_frame_size);
}
/* enable proper device channel interrupts */
sc->sc_irq_mask &= ~GINTMSK_HCHINTMSK;
sc->sc_irq_mask |= GINTMSK_IEPINTMSK;
DWC_OTG_WRITE_4(sc, DOTG_GINTMSK, sc->sc_irq_mask);
}
/* reset RX FIFO */
@ -2872,10 +2871,13 @@ dwc_otg_filter_interrupt(void *arg)
for (x = 0; x != sc->sc_dev_in_ep_max; x++) {
temp = DWC_OTG_READ_4(sc, DOTG_DIEPINT(x));
if (temp & DIEPMSK_XFERCOMPLMSK) {
DWC_OTG_WRITE_4(sc, DOTG_DIEPINT(x),
DIEPMSK_XFERCOMPLMSK);
}
/*
* NOTE: Need to clear all interrupt bits,
* because some appears to be unmaskable and
* can cause an interrupt loop:
*/
if (temp != 0)
DWC_OTG_WRITE_4(sc, DOTG_DIEPINT(x), temp);
}
}
@ -2987,7 +2989,8 @@ dwc_otg_interrupt(void *arg)
else
sc->sc_flags.status_bus_reset = 0;
if (hprt & HPRT_PRTENCHNG)
if ((hprt & HPRT_PRTENCHNG) &&
(hprt & HPRT_PRTENA) == 0)
sc->sc_flags.change_enabled = 1;
if (hprt & HPRT_PRTENA)
@ -3334,7 +3337,7 @@ dwc_otg_setup_standard_chain(struct usb_xfer *xfer)
* type in general, as a means to workaround
* that. This trick should work for both FULL and LOW
* speed USB traffic going through a TT. For non-TT
* traffic it works aswell. The reason for using
* traffic it works as well. The reason for using
* CONTROL type instead of BULK is that some TTs might
* reject LOW speed BULK traffic.
*/
@ -3981,7 +3984,7 @@ dwc_otg_init(struct dwc_otg_softc *sc)
}
/* enable interrupts */
sc->sc_irq_mask = DWC_OTG_MSK_GINT_ENABLED;
sc->sc_irq_mask |= DWC_OTG_MSK_GINT_THREAD_IRQ;
DWC_OTG_WRITE_4(sc, DOTG_GINTMSK, sc->sc_irq_mask);
if (sc->sc_mode == DWC_MODE_OTG || sc->sc_mode == DWC_MODE_DEVICE) {
@ -4747,6 +4750,8 @@ tr_handle_get_port_status:
value = 0;
if (sc->sc_flags.change_enabled)
value |= UPS_C_PORT_ENABLED;
if (sc->sc_flags.change_connect)
value |= UPS_C_CONNECT_STATUS;
if (sc->sc_flags.change_suspend)

View File

@ -191,24 +191,8 @@ ehci_reset(ehci_softc_t *sc)
usb_pause_mtx(NULL, hz / 128);
hcr = EOREAD4(sc, EHCI_USBCMD) & EHCI_CMD_HCRESET;
if (!hcr) {
if (sc->sc_flags & (EHCI_SCFLG_SETMODE | EHCI_SCFLG_BIGEMMIO)) {
/*
* Force USBMODE as requested. Controllers
* may have multiple operating modes.
*/
uint32_t usbmode = EOREAD4(sc, EHCI_USBMODE);
if (sc->sc_flags & EHCI_SCFLG_SETMODE) {
usbmode = (usbmode &~ EHCI_UM_CM) | EHCI_UM_CM_HOST;
device_printf(sc->sc_bus.bdev,
"set host controller mode\n");
}
if (sc->sc_flags & EHCI_SCFLG_BIGEMMIO) {
usbmode = (usbmode &~ EHCI_UM_ES) | EHCI_UM_ES_BE;
device_printf(sc->sc_bus.bdev,
"set big-endian mode\n");
}
EOWRITE4(sc, EHCI_USBMODE, usbmode);
}
if (sc->sc_vendor_post_reset != NULL)
sc->sc_vendor_post_reset(sc);
return (0);
}
}
@ -1685,8 +1669,7 @@ restart:
/* update data toggle */
if (((average + temp->max_frame_size - 1) /
temp->max_frame_size) & 1) {
if (howmany(average, temp->max_frame_size) & 1) {
temp->qtd_status ^=
htohc32(temp->sc, EHCI_QTD_TOGGLE_MASK);
}
@ -3022,7 +3005,7 @@ struct usb_device_descriptor ehci_devd =
UDPROTO_HSHUBSTT, /* protocol */
64, /* max packet */
{0}, {0}, {0x00, 0x01}, /* device id */
1, 2, 0, /* string indicies */
1, 2, 0, /* string indexes */
1 /* # of configurations */
};
@ -3076,6 +3059,36 @@ struct usb_hub_descriptor ehci_hubd =
.bDescriptorType = UDESC_HUB,
};
uint16_t
ehci_get_port_speed_portsc(struct ehci_softc *sc, uint16_t index)
{
uint32_t v;
v = EOREAD4(sc, EHCI_PORTSC(index));
v = (v >> EHCI_PORTSC_PSPD_SHIFT) & EHCI_PORTSC_PSPD_MASK;
if (v == EHCI_PORT_SPEED_HIGH)
return (UPS_HIGH_SPEED);
if (v == EHCI_PORT_SPEED_LOW)
return (UPS_LOW_SPEED);
return (0);
}
uint16_t
ehci_get_port_speed_hostc(struct ehci_softc *sc, uint16_t index)
{
uint32_t v;
v = EOREAD4(sc, EHCI_HOSTC(index));
v = (v >> EHCI_HOSTC_PSPD_SHIFT) & EHCI_HOSTC_PSPD_MASK;
if (v == EHCI_PORT_SPEED_HIGH)
return (UPS_HIGH_SPEED);
if (v == EHCI_PORT_SPEED_LOW)
return (UPS_LOW_SPEED);
return (0);
}
static void
ehci_disown(ehci_softc_t *sc, uint16_t index, uint8_t lowspeed)
{
@ -3340,13 +3353,15 @@ ehci_roothub_exec(struct usb_device *udev,
}
v = EOREAD4(sc, EHCI_PORTSC(index));
DPRINTFN(9, "port status=0x%04x\n", v);
if (sc->sc_flags & (EHCI_SCFLG_FORCESPEED | EHCI_SCFLG_TT)) {
if ((v & 0xc000000) == 0x8000000)
if (sc->sc_flags & EHCI_SCFLG_TT) {
if (sc->sc_vendor_get_port_speed != NULL) {
i = sc->sc_vendor_get_port_speed(sc, index);
} else {
device_printf(sc->sc_bus.bdev,
"EHCI_SCFLG_TT quirk is set but "
"sc_vendor_get_hub_speed() is NULL\n");
i = UPS_HIGH_SPEED;
else if ((v & 0xc000000) == 0x4000000)
i = UPS_LOW_SPEED;
else
i = 0;
}
} else {
i = UPS_HIGH_SPEED;
}

View File

@ -337,11 +337,8 @@ typedef struct ehci_softc {
uint16_t sc_intr_stat[EHCI_VIRTUAL_FRAMELIST_COUNT];
uint16_t sc_id_vendor; /* vendor ID for root hub */
uint16_t sc_flags; /* chip specific flags */
#define EHCI_SCFLG_SETMODE 0x0001 /* set bridge mode again after init */
#define EHCI_SCFLG_FORCESPEED 0x0002 /* force speed */
#define EHCI_SCFLG_NORESTERM 0x0004 /* don't terminate reset sequence */
#define EHCI_SCFLG_BIGEDESC 0x0008 /* big-endian byte order descriptors */
#define EHCI_SCFLG_BIGEMMIO 0x0010 /* big-endian byte order MMIO */
#define EHCI_SCFLG_TT 0x0020 /* transaction translator present */
#define EHCI_SCFLG_LOSTINTRBUG 0x0040 /* workaround for VIA / ATI chipsets */
#define EHCI_SCFLG_IAADBUG 0x0080 /* workaround for nVidia chipsets */
@ -358,6 +355,10 @@ typedef struct ehci_softc {
char sc_vendor[16]; /* vendor string for root hub */
void (*sc_vendor_post_reset)(struct ehci_softc *sc);
uint16_t (*sc_vendor_get_port_speed)(struct ehci_softc *sc,
uint16_t index);
} ehci_softc_t;
#define EREAD1(sc, a) bus_space_read_1((sc)->sc_io_tag, (sc)->sc_io_hdl, (a))
@ -476,5 +477,7 @@ void ehci_interrupt(ehci_softc_t *sc);
void ehci_suspend(ehci_softc_t *sc);
void ehci_resume(ehci_softc_t *sc);
#endif /* __rtems__ */
uint16_t ehci_get_port_speed_portsc(struct ehci_softc *sc, uint16_t index);
uint16_t ehci_get_port_speed_hostc(struct ehci_softc *sc, uint16_t index);
#endif /* _EHCI_H_ */

View File

@ -157,7 +157,17 @@
#define EHCI_PS_CS 0x00000001 /* RO connect status */
#define EHCI_PS_CLEAR (EHCI_PS_OCC | EHCI_PS_PEC | EHCI_PS_CSC)
#define EHCI_USBMODE 0x68 /* RW USB Device mode register */
#define EHCI_PORT_RESET_COMPLETE 2 /* ms */
/*
* Registers not covered by EHCI specification
*
*
* EHCI_USBMODE register offset is different for cores with LPM support,
* bits are equal
*/
#define EHCI_USBMODE_NOLPM 0x68 /* RW USB Device mode reg (no LPM) */
#define EHCI_USBMODE_LPM 0xC8 /* RW USB Device mode reg (LPM) */
#define EHCI_UM_CM 0x00000003 /* R/WO Controller Mode */
#define EHCI_UM_CM_IDLE 0x0 /* Idle */
#define EHCI_UM_CM_HOST 0x3 /* Host Controller */
@ -166,6 +176,18 @@
#define EHCI_UM_ES_BE 0x4 /* Big-endian byte alignment */
#define EHCI_UM_SDIS 0x00000010 /* R/WO Stream Disable Mode */
#define EHCI_PORT_RESET_COMPLETE 2 /* ms */
/*
* Actual port speed bits depends on EHCI_HOSTC(n) registers presence,
* speed encoding is equal
*/
#define EHCI_HOSTC(n) (0x80+(4*(n))) /* RO, RW Host mode control reg */
#define EHCI_HOSTC_PSPD_SHIFT 25
#define EHCI_HOSTC_PSPD_MASK 0x3
#define EHCI_PORTSC_PSPD_SHIFT 26
#define EHCI_PORTSC_PSPD_MASK 0x3
#define EHCI_PORT_SPEED_FULL 0
#define EHCI_PORT_SPEED_LOW 1
#define EHCI_PORT_SPEED_HIGH 2
#endif /* _EHCIREG_H_ */

View File

@ -2045,7 +2045,7 @@ struct usb_device_descriptor ohci_devd =
UDPROTO_FSHUB, /* protocol */
64, /* max packet */
{0}, {0}, {0x00, 0x01}, /* device id */
1, 2, 0, /* string indicies */
1, 2, 0, /* string indexes */
1 /* # of configurations */
};
@ -2439,7 +2439,7 @@ ohci_xfer_setup(struct usb_setup_params *parm)
usbd_transfer_setup_sub(parm);
nitd = ((xfer->max_data_length / OHCI_PAGE_SIZE) +
((xfer->nframes + OHCI_ITD_NOFFSET - 1) / OHCI_ITD_NOFFSET) +
howmany(xfer->nframes, OHCI_ITD_NOFFSET) +
1 /* EXTRA */ );
ntd = 0;
nqh = 1;

View File

@ -45,16 +45,16 @@
#define XHCI_HCIVERSION 0x02 /* RO Interface version number */
#define XHCI_HCIVERSION_0_9 0x0090 /* xHCI version 0.9 */
#define XHCI_HCIVERSION_1_0 0x0100 /* xHCI version 1.0 */
#define XHCI_HCSPARAMS1 0x04 /* RO structual parameters 1 */
#define XHCI_HCSPARAMS1 0x04 /* RO structural parameters 1 */
#define XHCI_HCS1_DEVSLOT_MAX(x)((x) & 0xFF)
#define XHCI_HCS1_IRQ_MAX(x) (((x) >> 8) & 0x3FF)
#define XHCI_HCS1_N_PORTS(x) (((x) >> 24) & 0xFF)
#define XHCI_HCSPARAMS2 0x08 /* RO structual parameters 2 */
#define XHCI_HCSPARAMS2 0x08 /* RO structural parameters 2 */
#define XHCI_HCS2_IST(x) ((x) & 0xF)
#define XHCI_HCS2_ERST_MAX(x) (((x) >> 4) & 0xF)
#define XHCI_HCS2_SPR(x) (((x) >> 24) & 0x1)
#define XHCI_HCS2_SPB_MAX(x) (((x) >> 27) & 0x7F)
#define XHCI_HCSPARAMS3 0x0C /* RO structual parameters 3 */
#define XHCI_HCS2_SPR(x) (((x) >> 26) & 0x1)
#define XHCI_HCS2_SPB_MAX(x) ((((x) >> 16) & 0x3E0) | (((x) >> 27) & 0x1F))
#define XHCI_HCSPARAMS3 0x0C /* RO structural parameters 3 */
#define XHCI_HCS3_U1_DEL(x) ((x) & 0xFF)
#define XHCI_HCS3_U2_DEL(x) (((x) >> 16) & 0xFFFF)
#define XHCI_HCSPARAMS0 0x10 /* RO capability parameters */

View File

@ -138,6 +138,8 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = {
USB_QUIRK(CORSAIR, K60, 0x0000, 0xffff, UQ_KBD_BOOTPROTO),
/* Quirk for Corsair Vengeance K70 keyboard */
USB_QUIRK(CORSAIR, K70, 0x0000, 0xffff, UQ_KBD_BOOTPROTO),
/* Quirk for Corsair STRAFE Gaming keyboard */
USB_QUIRK(CORSAIR, STRAFE, 0x0000, 0xffff, UQ_KBD_BOOTPROTO),
/* umodem(4) device quirks */
USB_QUIRK(METRICOM, RICOCHET_GS, 0x100, 0x100, UQ_ASSUME_CM_OVER_DATA),
USB_QUIRK(SANYO, SCP4900, 0x000, 0x000, UQ_ASSUME_CM_OVER_DATA),
@ -200,6 +202,7 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = {
USB_QUIRK(FREECOM, DVD, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI),
USB_QUIRK(FUJIPHOTO, MASS0100, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI_I,
UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_NO_RS_CLEAR_UA, UQ_MSC_NO_SYNC_CACHE),
USB_QUIRK(GARMIN, FORERUNNER230, 0x0000, 0xffff, UQ_MSC_NO_INQUIRY),
USB_QUIRK(GENESYS, GL641USB2IDE, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_FORCE_SHORT_INQ,
UQ_MSC_NO_START_STOP, UQ_MSC_IGNORE_RESIDUE, UQ_MSC_NO_SYNC_CACHE),
@ -531,6 +534,9 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = {
/* DYMO LabelManager Pnp */
USB_QUIRK(DYMO, LABELMANAGERPNP, 0x0000, 0xffff, UQ_MSC_DYMO_EJECT),
/* Holtek USB gaming keyboard */
USB_QUIRK(HOLTEK, F85, 0x0000, 0xffff, UQ_KBD_BOOTPROTO),
};
#undef USB_QUIRK_VP
#undef USB_QUIRK
@ -684,8 +690,6 @@ usb_test_quirk_by_info(const struct usbd_lookup_info *info, uint16_t quirk)
return (1);
}
}
/* no quirk found */
break;
}
mtx_unlock(&usb_quirk_mtx);
done:

View File

@ -710,20 +710,23 @@ static driver_t umass_driver = {
.size = sizeof(struct umass_softc),
};
DRIVER_MODULE(umass, uhub, umass_driver, umass_devclass, NULL, 0);
MODULE_DEPEND(umass, usb, 1, 1, 1);
MODULE_DEPEND(umass, cam, 1, 1, 1);
MODULE_VERSION(umass, 1);
/*
* USB device probe/attach/detach
*/
static const STRUCT_USB_HOST_ID __used umass_devs[] = {
/* generic mass storage class */
{USB_IFACE_CLASS(UICLASS_MASS),},
};
DRIVER_MODULE(umass, uhub, umass_driver, umass_devclass, NULL, 0);
MODULE_DEPEND(umass, usb, 1, 1, 1);
MODULE_DEPEND(umass, cam, 1, 1, 1);
MODULE_VERSION(umass, 1);
#ifndef __rtems__
USB_PNP_HOST_INFO(umass_devs);
#endif /* __rtems__ */
/*
* USB device probe/attach/detach
*/
static uint16_t
umass_get_proto(struct usb_interface *iface)
{
@ -2730,7 +2733,7 @@ umass_rbc_transform(struct umass_softc *sc, uint8_t *cmd_ptr, uint8_t cmd_len)
cmd_len = 12;
}
sc->sc_transfer.cmd_len = cmd_len;
return (1); /* sucess */
return (1); /* success */
/* All other commands are not legal in RBC */
default:

View File

@ -469,22 +469,27 @@ usb_pc_common_mem_cb(void *arg, bus_dma_segment_t *segs,
off = 0;
pg = pc->page_start;
pg->physaddr = segs->ds_addr & ~(USB_PAGE_SIZE - 1);
pg->physaddr = rounddown2(segs->ds_addr, USB_PAGE_SIZE);
rem = segs->ds_addr & (USB_PAGE_SIZE - 1);
pc->page_offset_buf = rem;
pc->page_offset_end += rem;
#ifdef USB_DEBUG
if (nseg > 1 &&
((segs->ds_addr + segs->ds_len) & (USB_PAGE_SIZE - 1)) !=
((segs + 1)->ds_addr & (USB_PAGE_SIZE - 1))) {
/*
* This check verifies there is no page offset hole
* between the first and second segment. See the
* BUS_DMA_KEEP_PG_OFFSET flag.
*/
DPRINTFN(0, "Page offset was not preserved\n");
error = 1;
goto done;
if (nseg > 1) {
int x;
for (x = 0; x != nseg - 1; x++) {
if (((segs[x].ds_addr + segs[x].ds_len) & (USB_PAGE_SIZE - 1)) ==
((segs[x + 1].ds_addr & (USB_PAGE_SIZE - 1))))
continue;
/*
* This check verifies there is no page offset
* hole between any of the segments. See the
* BUS_DMA_KEEP_PG_OFFSET flag.
*/
DPRINTFN(0, "Page offset was not preserved\n");
error = 1;
goto done;
}
}
#endif
while (pc->ismultiseg) {
@ -499,7 +504,7 @@ usb_pc_common_mem_cb(void *arg, bus_dma_segment_t *segs,
break;
}
pg++;
pg->physaddr = (segs->ds_addr + off) & ~(USB_PAGE_SIZE - 1);
pg->physaddr = rounddown2(segs->ds_addr + off, USB_PAGE_SIZE);
}
done:

View File

@ -161,7 +161,7 @@ struct usb_cdc_notification {
#define UCDC_NOTIFICATION_LENGTH 8
/*
* Bits set in the SERIAL STATE notifcation (first byte of data)
* Bits set in the SERIAL STATE notification (first byte of data)
*/
#define UCDC_N_SERIAL_OVERRUN 0x40

View File

@ -181,7 +181,7 @@ usb_loc_fill(struct usb_fs_privdata* pd, struct usb_cdev_privdata *cpd)
*
* This function is used to atomically refer an USB device by its
* device location. If this function returns success the USB device
* will not dissappear until the USB device is unreferenced.
* will not disappear until the USB device is unreferenced.
*
* Return values:
* 0: Success, refcount incremented on the given USB device.
@ -230,7 +230,7 @@ usb_ref_device(struct usb_cdev_privdata *cpd,
* We need to grab the enumeration SX-lock before
* grabbing the FIFO refs to avoid deadlock at detach!
*/
crd->do_unlock = usbd_enum_lock(cpd->udev);
crd->do_unlock = usbd_enum_lock_sig(cpd->udev);
mtx_lock(&usb_ref_lock);
@ -238,6 +238,12 @@ usb_ref_device(struct usb_cdev_privdata *cpd,
* Set "is_uref" after grabbing the default SX lock
*/
crd->is_uref = 1;
/* check for signal */
if (crd->do_unlock > 1) {
crd->do_unlock = 0;
goto error;
}
}
/* check if we are doing an open */

View File

@ -196,7 +196,7 @@ usbd_get_ep_by_addr(struct usb_device *udev, uint8_t ea_val)
ea_val &= EA_MASK;
/*
* Iterate accross all the USB endpoints searching for a match
* Iterate across all the USB endpoints searching for a match
* based on the endpoint address:
*/
for (; ep != ep_end; ep++) {
@ -306,7 +306,7 @@ usbd_get_endpoint(struct usb_device *udev, uint8_t iface_index,
}
/*
* Iterate accross all the USB endpoints searching for a match
* Iterate across all the USB endpoints searching for a match
* based on the endpoint address. Note that we are searching
* the endpoints from the beginning of the "udev->endpoints" array.
*/
@ -1730,8 +1730,8 @@ usb_alloc_device(device_t parent_dev, struct usb_bus *bus,
/* Setup USB descriptors */
err = (usb_temp_setup_by_index_p) (udev, usb_template);
if (err) {
DPRINTFN(0, "setting up USB template failed maybe the USB "
"template module has not been loaded\n");
DPRINTFN(0, "setting up USB template failed - "
"usb_template(4) not loaded?\n");
goto done;
}
}
@ -1780,7 +1780,9 @@ usb_alloc_device(device_t parent_dev, struct usb_bus *bus,
scratch_ptr = udev->scratch.data;
if (udev->ddesc.iManufacturer ||
if (udev->flags.no_strings) {
err = USB_ERR_INVAL;
} else if (udev->ddesc.iManufacturer ||
udev->ddesc.iProduct ||
udev->ddesc.iSerialNumber) {
/* read out the language ID string */
@ -1968,6 +1970,7 @@ usb_make_dev(struct usb_device *udev, const char *devname, int ep,
int fi, int rwmode, uid_t uid, gid_t gid, int mode)
{
struct usb_fs_privdata* pd;
struct make_dev_args args;
char buffer[32];
/* Store information to locate ourselves again later */
@ -1986,17 +1989,19 @@ usb_make_dev(struct usb_device *udev, const char *devname, int ep,
pd->bus_index, pd->dev_index, pd->ep_addr);
}
pd->cdev = make_dev(&usb_devsw, 0, uid, gid, mode, "%s", devname);
/* Setup arguments for make_dev_s() */
make_dev_args_init(&args);
args.mda_devsw = &usb_devsw;
args.mda_uid = uid;
args.mda_gid = gid;
args.mda_mode = mode;
args.mda_si_drv1 = pd;
if (pd->cdev == NULL) {
if (make_dev_s(&args, &pd->cdev, "%s", devname) != 0) {
DPRINTFN(0, "Failed to create device %s\n", devname);
free(pd, M_USBDEV);
return (NULL);
}
/* XXX setting si_drv1 and creating the device is not atomic! */
pd->cdev->si_drv1 = pd;
return (pd);
}
@ -2741,7 +2746,7 @@ usbd_device_attached(struct usb_device *udev)
/*
* The following function locks enumerating the given USB device. If
* the lock is already grabbed this function returns zero. Else a
* non-zero value is returned.
* a value of one is returned.
*/
uint8_t
usbd_enum_lock(struct usb_device *udev)
@ -2760,6 +2765,27 @@ usbd_enum_lock(struct usb_device *udev)
return (1);
}
#if USB_HAVE_UGEN
/*
* This function is the same like usbd_enum_lock() except a value of
* 255 is returned when a signal is pending:
*/
uint8_t
usbd_enum_lock_sig(struct usb_device *udev)
{
if (sx_xlocked(&udev->enum_sx))
return (0);
if (sx_xlock_sig(&udev->enum_sx))
return (255);
if (sx_xlock_sig(&udev->sr_sx)) {
sx_xunlock(&udev->enum_sx);
return (255);
}
mtx_lock(&Giant);
return (1);
}
#endif
/* The following function unlocks enumerating the given USB device. */
void

View File

@ -314,6 +314,9 @@ void usb_set_device_state(struct usb_device *, enum usb_dev_state);
enum usb_dev_state usb_get_device_state(struct usb_device *);
uint8_t usbd_enum_lock(struct usb_device *);
#if USB_HAVE_UGEN
uint8_t usbd_enum_lock_sig(struct usb_device *);
#endif
void usbd_enum_unlock(struct usb_device *);
void usbd_sr_lock(struct usb_device *);
void usbd_sr_unlock(struct usb_device *);

View File

@ -315,7 +315,7 @@ tr_repeat:
case UR_SET_INTERFACE:
/*
* We assume that the endpoints are the same
* accross the alternate settings.
* across the alternate settings.
*
* Reset the endpoints, because re-attaching
* only a part of the device is not possible.

View File

@ -356,7 +356,8 @@ hid_get_item(struct hid_data *s, struct hid_item *h)
/* range check usage count */
if (c->loc.count > 255) {
DPRINTFN(0, "Number of "
"items truncated to 255\n");
"items(%u) truncated to 255\n",
(unsigned)(c->loc.count));
s->ncount = 255;
} else
s->ncount = c->loc.count;
@ -577,7 +578,7 @@ hid_report_size(const void *buf, usb_size_t len, enum hid_kind k, uint8_t *id)
for (d = hid_start_parse(buf, len, 1 << k); hid_get_item(d, &h);) {
if (h.kind == k) {
/* check for ID-byte presense */
/* check for ID-byte presence */
if ((h.report_ID != 0) && !any_id) {
if (id != NULL)
*id = h.report_ID;

View File

@ -1734,6 +1734,7 @@ uhub_child_pnpinfo_string(device_t parent, device_t child,
if (iface && iface->idesc) {
snprintf(buf, buflen, "vendor=0x%04x product=0x%04x "
"devclass=0x%02x devsubclass=0x%02x "
"devproto=0x%02x "
"sernum=\"%s\" "
"release=0x%04x "
"mode=%s "
@ -1743,6 +1744,7 @@ uhub_child_pnpinfo_string(device_t parent, device_t child,
UGETW(res.udev->ddesc.idProduct),
res.udev->ddesc.bDeviceClass,
res.udev->ddesc.bDeviceSubClass,
res.udev->ddesc.bDeviceProtocol,
usb_get_serial(res.udev),
UGETW(res.udev->ddesc.bcdDevice),
(res.udev->flags.usb_mode == USB_MODE_HOST) ? "host" : "device",
@ -1767,7 +1769,7 @@ done:
* The USB Transaction Translator:
* ===============================
*
* When doing LOW- and FULL-speed USB transfers accross a HIGH-speed
* When doing LOW- and FULL-speed USB transfers across a HIGH-speed
* USB HUB, bandwidth must be allocated for ISOCHRONOUS and INTERRUPT
* USB transfers. To utilize bandwidth dynamically the "scatter and
* gather" principle must be applied. This means that bandwidth must
@ -1839,7 +1841,7 @@ usb_intr_find_best_slot(usb_size_t *ptr, uint8_t start,
/*------------------------------------------------------------------------*
* usb_hs_bandwidth_adjust
*
* This function will update the bandwith usage for the microframe
* This function will update the bandwidth usage for the microframe
* having index "slot" by "len" bytes. "len" can be negative. If the
* "slot" argument is greater or equal to "USB_HS_MICRO_FRAMES_MAX"
* the "slot" argument will be replaced by the slot having least used
@ -2311,7 +2313,7 @@ usb_needs_explore_all(void)
return;
}
/*
* Explore all USB busses in parallell.
* Explore all USB busses in parallel.
*/
max = devclass_get_maxunit(dc);
while (max >= 0) {

View File

@ -156,28 +156,10 @@ usbd_lookup_id_by_uaa(const struct usb_device_id *id, usb_size_t sizeof_id,
/*------------------------------------------------------------------------*
* Export the USB device ID format we use to userspace tools.
*------------------------------------------------------------------------*/
#if BYTE_ORDER == BIG_ENDIAN
#define U16_XOR "8"
#define U32_XOR "12"
#define U64_XOR "56"
#define U8_BITFIELD_XOR "7"
#define U16_BITFIELD_XOR "15"
#define U32_BITFIELD_XOR "31"
#define U64_BITFIELD_XOR "63"
#else
#if BYTE_ORDER == LITTLE_ENDIAN
#define U16_XOR "0"
#define U32_XOR "0"
#define U64_XOR "0"
#define U8_BITFIELD_XOR "0"
#define U16_BITFIELD_XOR "0"
#define U32_BITFIELD_XOR "0"
#define U64_BITFIELD_XOR "0"
#endif
#if USB_HAVE_COMPAT_LINUX
#define MFL_SIZE "1"
#else
#define MFL_SIZE "0"
#define U16_XOR "8"
#endif
#if defined(KLD_MODULE) && (USB_HAVE_ID_SECTION != 0)
@ -191,20 +173,19 @@ static const char __section("bus_autoconf_format") __used usb_id_format[] = {
/* List size of fields in the usb_device_id structure */
#if ULONG_MAX >= 0xFFFFFFFFUL
"unused{0,8}"
"unused{0,8}"
"unused{0,8}"
"unused{0,8}"
#if ULONG_MAX >= 0xFFFFFFFFFFFFFFFFULL
"unused{0,8}"
"unused{0,8}"
"unused{0,8}"
"unused{0,8}"
#endif
#else
#error "Please update code."
#endif
"mf_vendor{" U16_XOR ",1}"
"mf_product{" U16_XOR ",1}"
"mf_dev_lo{" U16_XOR ",1}"
"mf_dev_hi{" U16_XOR ",1}"
"mf_dev_class{" U16_XOR ",1}"
"mf_dev_subclass{" U16_XOR ",1}"
"mf_dev_protocol{" U16_XOR ",1}"
"mf_int_class{" U16_XOR ",1}"
"mf_int_subclass{" U16_XOR ",1}"
"mf_int_protocol{" U16_XOR ",1}"
"unused{" U16_XOR ",6}"
"idVendor[0]{" U16_XOR ",8}"
"idVendor[1]{" U16_XOR ",8}"
@ -222,38 +203,20 @@ static const char __section("bus_autoconf_format") __used usb_id_format[] = {
"bInterfaceSubClass{0,8}"
"bInterfaceProtocol{0,8}"
"mf_vendor{" U8_BITFIELD_XOR ",1}"
"mf_product{" U8_BITFIELD_XOR ",1}"
"mf_dev_lo{" U8_BITFIELD_XOR ",1}"
"mf_dev_hi{" U8_BITFIELD_XOR ",1}"
#if USB_HAVE_COMPAT_LINUX
"mfl_vendor{" U16_XOR ",1}"
"mfl_product{" U16_XOR ",1}"
"mfl_dev_lo{" U16_XOR ",1}"
"mfl_dev_hi{" U16_XOR ",1}"
"mf_dev_class{" U8_BITFIELD_XOR ",1}"
"mf_dev_subclass{" U8_BITFIELD_XOR ",1}"
"mf_dev_protocol{" U8_BITFIELD_XOR ",1}"
"mf_int_class{" U8_BITFIELD_XOR ",1}"
"mfl_dev_class{" U16_XOR ",1}"
"mfl_dev_subclass{" U16_XOR ",1}"
"mfl_dev_protocol{" U16_XOR ",1}"
"mfl_int_class{" U16_XOR ",1}"
"mf_int_subclass{" U8_BITFIELD_XOR ",1}"
"mf_int_protocol{" U8_BITFIELD_XOR ",1}"
"unused{" U8_BITFIELD_XOR ",6}"
"mfl_vendor{" U16_XOR "," MFL_SIZE "}"
"mfl_product{" U16_XOR "," MFL_SIZE "}"
"mfl_dev_lo{" U16_XOR "," MFL_SIZE "}"
"mfl_dev_hi{" U16_XOR "," MFL_SIZE "}"
"mfl_dev_class{" U16_XOR "," MFL_SIZE "}"
"mfl_dev_subclass{" U16_XOR "," MFL_SIZE "}"
"mfl_dev_protocol{" U16_XOR "," MFL_SIZE "}"
"mfl_int_class{" U16_XOR "," MFL_SIZE "}"
"mfl_int_subclass{" U16_XOR "," MFL_SIZE "}"
"mfl_int_protocol{" U16_XOR "," MFL_SIZE "}"
"unused{" U16_XOR "," MFL_SIZE "}"
"unused{" U16_XOR "," MFL_SIZE "}"
"unused{" U16_XOR "," MFL_SIZE "}"
"unused{" U16_XOR "," MFL_SIZE "}"
"unused{" U16_XOR "," MFL_SIZE "}"
"unused{" U16_XOR "," MFL_SIZE "}"
"mfl_int_subclass{" U16_XOR ",1}"
"mfl_int_protocol{" U16_XOR ",1}"
"unused{" U16_XOR ",6}"
#endif
};
#endif

View File

@ -258,7 +258,7 @@ usbd_transfer_setup_sub_malloc(struct usb_setup_params *parm,
* Compute number of DMA chunks, rounded up
* to nearest one:
*/
n_dma_pc = ((count + n_obj - 1) / n_obj);
n_dma_pc = howmany(count, n_obj);
n_dma_pg = 1;
}
@ -627,7 +627,7 @@ usbd_transfer_setup_sub(struct usb_setup_params *parm)
/*
* NOTE: we do not allow "max_packet_size" or "max_frame_size"
* to be equal to zero when setting up USB transfers, hence
* this leads to alot of extra code in the USB kernel.
* this leads to a lot of extra code in the USB kernel.
*/
if ((xfer->max_frame_size == 0) ||
@ -955,7 +955,7 @@ usbd_transfer_setup(struct usb_device *udev,
DPRINTFN(6, "setup array has zero length!\n");
return (USB_ERR_INVAL);
}
if (ifaces == 0) {
if (ifaces == NULL) {
DPRINTFN(6, "ifaces array is NULL!\n");
return (USB_ERR_INVAL);
}
@ -2478,7 +2478,7 @@ done:
*
* This function is called when the DMA delay has been exectuded, and
* will make sure that the callback is called to complete the USB
* transfer. This code path is ususally only used when there is an USB
* transfer. This code path is usually only used when there is an USB
* error like USB_ERR_CANCELLED.
*------------------------------------------------------------------------*/
void

View File

@ -241,7 +241,7 @@ struct usb_config {
/*
* Use these macro when defining USB device ID arrays if you want to
* have your driver module automatically loaded in host, device or
* both modes respectivly:
* both modes respectively:
*/
#if USB_HAVE_ID_SECTION
#define STRUCT_USB_HOST_ID \
@ -266,8 +266,38 @@ struct usb_config {
*/
struct usb_device_id {
/* Hook for driver specific information */
unsigned long driver_info;
/* Select which fields to match against */
#if BYTE_ORDER == LITTLE_ENDIAN
uint16_t
match_flag_vendor:1,
match_flag_product:1,
match_flag_dev_lo:1,
match_flag_dev_hi:1,
match_flag_dev_class:1,
match_flag_dev_subclass:1,
match_flag_dev_protocol:1,
match_flag_int_class:1,
match_flag_int_subclass:1,
match_flag_int_protocol:1,
match_flag_unused:6;
#else
uint16_t
match_flag_unused:6,
match_flag_int_protocol:1,
match_flag_int_subclass:1,
match_flag_int_class:1,
match_flag_dev_protocol:1,
match_flag_dev_subclass:1,
match_flag_dev_class:1,
match_flag_dev_hi:1,
match_flag_dev_lo:1,
match_flag_product:1,
match_flag_vendor:1;
#endif
/* Used for product specific matches; the BCD range is inclusive */
uint16_t idVendor;
@ -285,21 +315,6 @@ struct usb_device_id {
uint8_t bInterfaceSubClass;
uint8_t bInterfaceProtocol;
/* Select which fields to match against */
uint8_t match_flag_vendor:1;
uint8_t match_flag_product:1;
uint8_t match_flag_dev_lo:1;
uint8_t match_flag_dev_hi:1;
uint8_t match_flag_dev_class:1;
uint8_t match_flag_dev_subclass:1;
uint8_t match_flag_dev_protocol:1;
uint8_t match_flag_int_class:1;
uint8_t match_flag_int_subclass:1;
uint8_t match_flag_int_protocol:1;
uint8_t match_flag_unused:6;
#if USB_HAVE_COMPAT_LINUX
/* which fields to match against */
uint16_t match_flags;
@ -314,8 +329,26 @@ struct usb_device_id {
#define USB_DEVICE_ID_MATCH_INT_SUBCLASS 0x0100
#define USB_DEVICE_ID_MATCH_INT_PROTOCOL 0x0200
#endif
/* Hook for driver specific information */
unsigned long driver_info;
} __aligned(32);
#define USB_STD_PNP_INFO "M16:mask;U16:vendor;U16:product;L16:product;G16:product;" \
"U8:devclass;U8:devsubclass;U8:devprotocol;" \
"U8:intclass;U8:intsubclass;U8:intprotocol;"
#define USB_STD_PNP_HOST_INFO USB_STD_PNP_INFO "T:mode=host;"
#define USB_STD_PNP_DEVICE_INFO USB_STD_PNP_INFO "T:mode=device;"
#define USB_PNP_HOST_INFO(table) \
MODULE_PNP_INFO(USB_STD_PNP_HOST_INFO, usb, table, table, sizeof(table[0]), \
sizeof(table) / sizeof(table[0]))
#define USB_PNP_DEVICE_INFO(table) \
MODULE_PNP_INFO(USB_STD_PNP_DEVICE_INFO, usb, table, table, sizeof(table[0]), \
sizeof(table) / sizeof(table[0]))
#define USB_PNP_DUAL_INFO(table) \
MODULE_PNP_INFO(USB_STD_PNP_INFO, usb, table, table, sizeof(table[0]), \
sizeof(table) / sizeof(table[0]))
/* check that the size of the structure above is correct */
extern char usb_device_id_assert[(sizeof(struct usb_device_id) == 32) ? 1 : -1];

View File

@ -778,7 +778,7 @@ detail and debug level information from the command.
. sys/dev/dwc/*, trunk, 2015-03-26, cfc3df2b8f708ce8494d9d556e3472a5c8c21b8a
. sys/dev/mmc/*, trunk, 2016-08-23, 9fe7c416e6abb28b1398fd3e5687099846800cfd
. sys/dev/usb/*, trunk, 2015-10-30, 968dafb4fcf133cb8beb6fa3c558fecd7dc00ef0
. sys/dev/usb/*, trunk, 2016-08-23, 9fe7c416e6abb28b1398fd3e5687099846800cfd
. *, stable/9, 2015-04-08, 99a648a912e81e29d9c4c159cbbe263462f2d719
== How to import code from FreeBSD

View File

@ -141,7 +141,7 @@
#define USB_VENDOR_LOGITECH 0x046d /* Logitech */
#define USB_VENDOR_BTC 0x046e /* Behavior Tech. Computer */
#define USB_VENDOR_PHILIPS 0x0471 /* Philips */
#define USB_VENDOR_SUN2 0x0472 /* Sun Microsystems (offical) */
#define USB_VENDOR_SUN2 0x0472 /* Sun Microsystems (official) */
#define USB_VENDOR_SANYO 0x0474 /* Sanyo Electric */
#define USB_VENDOR_SEAGATE 0x0477 /* Seagate */
#define USB_VENDOR_CONNECTIX 0x0478 /* Connectix */
@ -842,6 +842,7 @@
#define USB_PRODUCT_ABOCOM_RTL8188CU_1 0x8188 /* RTL8188CU */
#define USB_PRODUCT_ABOCOM_RTL8188CU_2 0x8189 /* RTL8188CU */
#define USB_PRODUCT_ABOCOM_RTL8192CU 0x8178 /* RTL8192CU */
#define USB_PRODUCT_ABOCOM_RTL8188EU 0x8179 /* RTL8188EU */
#define USB_PRODUCT_ABOCOM_WUG2700 0xb21f /* WUG2700 */
/* Acton Research Corp. */
@ -1138,6 +1139,10 @@
#define USB_PRODUCT_APPLE_WELLSPRING8_ANSI 0x0290 /* Apple Internal Keyboard/Trackpad */
#define USB_PRODUCT_APPLE_WELLSPRING8_ISO 0x0291 /* Apple Internal Keyboard/Trackpad */
#define USB_PRODUCT_APPLE_WELLSPRING8_JIS 0x0292 /* Apple Internal Keyboard/Trackpad */
/* MacbookPro12,1 */
#define USB_PRODUCT_APPLE_WELLSPRING9_ANSI 0x0272 /* Apple Internal Keyboard/Trackpad */
#define USB_PRODUCT_APPLE_WELLSPRING9_ISO 0x0273 /* Apple Internal Keyboard/Trackpad */
#define USB_PRODUCT_APPLE_WELLSPRING9_JIS 0x0274 /* Apple Internal Keyboard/Trackpad */
#define USB_PRODUCT_APPLE_MOUSE 0x0301 /* Mouse M4848 */
#define USB_PRODUCT_APPLE_OPTMOUSE 0x0302 /* Optical mouse */
#define USB_PRODUCT_APPLE_MIGHTYMOUSE 0x0304 /* Mighty Mouse */
@ -1512,6 +1517,7 @@
/* Corsair products */
#define USB_PRODUCT_CORSAIR_K60 0x0a60 /* Corsair Vengeance K60 keyboard */
#define USB_PRODUCT_CORSAIR_K70 0x1b09 /* Corsair Vengeance K70 keyboard */
#define USB_PRODUCT_CORSAIR_STRAFE 0x1b15 /* Cossair STRAFE Gaming keyboard */
/* Creative products */
#define USB_PRODUCT_CREATIVE_NOMAD_II 0x1002 /* Nomad II MP3 player */
@ -1702,6 +1708,7 @@
#define USB_PRODUCT_DISPLAYLINK_LT1421 0x03e0 /* Lenovo ThinkVision LT1421 */
#define USB_PRODUCT_DISPLAYLINK_POLARIS2 0x0117 /* Polaris2 USB dock */
#define USB_PRODUCT_DISPLAYLINK_PLUGABLE 0x0377 /* Plugable docking station */
#define USB_PRODUCT_DISPLAYLINK_ITEC 0x02e9 /* i-tec USB 2.0 Docking Station */
/* DMI products */
#define USB_PRODUCT_DMI_CFSM_RW 0xa109 /* CF/SM Reader/Writer */
@ -2151,6 +2158,7 @@
#define USB_PRODUCT_FUJITSUSIEMENS_SCR 0x0009 /* Fujitsu-Siemens SCR USB Reader */
/* Garmin products */
#define USB_PRODUCT_GARMIN_FORERUNNER230 0x086d /* ForeRunner 230 */
#define USB_PRODUCT_GARMIN_IQUE_3600 0x0004 /* iQue 3600 */
/* Gemalto products */
@ -2269,6 +2277,9 @@
#define USB_PRODUCT_HITACHI_DVDCAM_DZ_MV100A 0x0004 /* DVD-CAM DZ-MV100A Camcorder */
#define USB_PRODUCT_HITACHI_DVDCAM_USB 0x001e /* DVDCAM USB HS Interface */
/* Holtek products */
#define USB_PRODUCT_HOLTEK_F85 0xa030 /* Holtek USB gaming keyboard */
/* HP products */
#define USB_PRODUCT_HP_895C 0x0004 /* DeskJet 895C */
#define USB_PRODUCT_HP_4100C 0x0101 /* Scanjet 4100C */
@ -2725,6 +2736,7 @@
#define USB_PRODUCT_LOGITECH_RK53 0xc501 /* Cordless mouse */
#define USB_PRODUCT_LOGITECH_RB6 0xc503 /* Cordless keyboard */
#define USB_PRODUCT_LOGITECH_MX700 0xc506 /* Cordless optical mouse */
#define USB_PRODUCT_LOGITECH_UNIFYING 0xc52b /* Logitech Unifying Receiver */
#define USB_PRODUCT_LOGITECH_QUICKCAMPRO2 0xd001 /* QuickCam Pro */
/* Logitec Corp. products */
@ -3787,6 +3799,7 @@
#define USB_PRODUCT_REALTEK_RTL8188ETV 0x0179 /* RTL8188ETV */
#define USB_PRODUCT_REALTEK_RTL8188CTV 0x018a /* RTL8188CTV */
#define USB_PRODUCT_REALTEK_USBKR100 0x8150 /* USBKR100 USB Ethernet */
#define USB_PRODUCT_REALTEK_RTL8152 0x8152 /* RTL8152 USB Ethernet */
#define USB_PRODUCT_REALTEK_RTL8153 0x8153 /* RTL8153 USB Ethernet */
#define USB_PRODUCT_REALTEK_RTL8188CE_0 0x8170 /* RTL8188CE */
#define USB_PRODUCT_REALTEK_RTL8171 0x8171 /* RTL8171 */
@ -4205,6 +4218,7 @@
#define USB_PRODUCT_SITECOMEU_RTL8188CU_2 0x005c /* RTL8188CU */
#define USB_PRODUCT_SITECOMEU_RTL8192CU 0x0061 /* RTL8192CU */
#define USB_PRODUCT_SITECOMEU_LN032 0x0072 /* LN-032 */
#define USB_PRODUCT_SITECOMEU_LN031 0x0056 /* LN-031 */
#define USB_PRODUCT_SITECOMEU_LN028 0x061c /* LN-028 */
#define USB_PRODUCT_SITECOMEU_WL113 0x9071 /* WL-113 */
#define USB_PRODUCT_SITECOMEU_ZD1211B 0x9075 /* ZD1211B */

View File

@ -303,6 +303,12 @@ const struct usb_knowndev usb_knowndevs[] = {
"AboCom Systems",
"RTL8192CU",
},
{
USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_RTL8188EU,
0,
"AboCom Systems",
"RTL8188EU",
},
{
USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_WUG2700,
0,
@ -1395,6 +1401,24 @@ const struct usb_knowndev usb_knowndevs[] = {
"Apple Computer",
"Apple Internal Keyboard/Trackpad",
},
{
USB_VENDOR_APPLE, USB_PRODUCT_APPLE_WELLSPRING9_ANSI,
0,
"Apple Computer",
"Apple Internal Keyboard/Trackpad",
},
{
USB_VENDOR_APPLE, USB_PRODUCT_APPLE_WELLSPRING9_ISO,
0,
"Apple Computer",
"Apple Internal Keyboard/Trackpad",
},
{
USB_VENDOR_APPLE, USB_PRODUCT_APPLE_WELLSPRING9_JIS,
0,
"Apple Computer",
"Apple Internal Keyboard/Trackpad",
},
{
USB_VENDOR_APPLE, USB_PRODUCT_APPLE_MOUSE,
0,
@ -3117,6 +3141,12 @@ const struct usb_knowndev usb_knowndevs[] = {
"Corsair",
"Corsair Vengeance K70 keyboard",
},
{
USB_VENDOR_CORSAIR, USB_PRODUCT_CORSAIR_STRAFE,
0,
"Corsair",
"Cossair STRAFE Gaming keyboard",
},
{
USB_VENDOR_CREATIVE, USB_PRODUCT_CREATIVE_NOMAD_II,
0,
@ -4005,6 +4035,12 @@ const struct usb_knowndev usb_knowndevs[] = {
"DisplayLink",
"Plugable docking station",
},
{
USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_ITEC,
0,
"DisplayLink",
"i-tec USB 2.0 Docking Station",
},
{
USB_VENDOR_DMI, USB_PRODUCT_DMI_CFSM_RW,
0,
@ -6201,6 +6237,12 @@ const struct usb_knowndev usb_knowndevs[] = {
"Fujitsu-Siemens",
"Fujitsu-Siemens SCR USB Reader",
},
{
USB_VENDOR_GARMIN, USB_PRODUCT_GARMIN_FORERUNNER230,
0,
"Garmin International",
"ForeRunner 230",
},
{
USB_VENDOR_GARMIN, USB_PRODUCT_GARMIN_IQUE_3600,
0,
@ -6627,6 +6669,12 @@ const struct usb_knowndev usb_knowndevs[] = {
"Hitachi",
"DVDCAM USB HS Interface",
},
{
USB_VENDOR_HOLTEK, USB_PRODUCT_HOLTEK_F85,
0,
"Holtek Semiconductor, Inc.",
"Holtek USB gaming keyboard",
},
{
USB_VENDOR_HP, USB_PRODUCT_HP_895C,
0,
@ -8745,6 +8793,12 @@ const struct usb_knowndev usb_knowndevs[] = {
"Logitech",
"Cordless optical mouse",
},
{
USB_VENDOR_LOGITECH, USB_PRODUCT_LOGITECH_UNIFYING,
0,
"Logitech",
"Logitech Unifying Receiver",
},
{
USB_VENDOR_LOGITECH, USB_PRODUCT_LOGITECH_QUICKCAMPRO2,
0,
@ -13941,6 +13995,12 @@ const struct usb_knowndev usb_knowndevs[] = {
"Realtek",
"USBKR100 USB Ethernet",
},
{
USB_VENDOR_REALTEK, USB_PRODUCT_REALTEK_RTL8152,
0,
"Realtek",
"RTL8152 USB Ethernet",
},
{
USB_VENDOR_REALTEK, USB_PRODUCT_REALTEK_RTL8153,
0,
@ -16059,6 +16119,12 @@ const struct usb_knowndev usb_knowndevs[] = {
"Sitecom Europe",
"LN-032",
},
{
USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_LN031,
0,
"Sitecom Europe",
"LN-031",
},
{
USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_LN028,
0,
@ -18402,7 +18468,7 @@ const struct usb_knowndev usb_knowndevs[] = {
{
USB_VENDOR_SUN2, 0,
USB_KNOWNDEV_NOPROD,
"Sun Microsystems (offical)",
"Sun Microsystems (official)",
NULL,
},
{