summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-08-23 15:51:45 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-08-23 16:07:16 +0200
commit8e65e1bf45102e481fda77f5b742de6c7d0840cd (patch)
treed490f7135ce7d7b11c6a2300ecaa7c3edd3008f7
parentdoc: Update rules to modify FreeBSD code (diff)
downloadrtems-libbsd-8e65e1bf45102e481fda77f5b742de6c7d0840cd.tar.bz2
usb: Update to FreeBSD trunk 2016-08-23
FreeBSD trunk, 2016-08-23, 9fe7c416e6abb28b1398fd3e5687099846800cfd.
-rw-r--r--freebsd/sys/dev/usb/controller/dwc_otg.c41
-rw-r--r--freebsd/sys/dev/usb/controller/ehci.c69
-rw-r--r--freebsd/sys/dev/usb/controller/ehci.h9
-rw-r--r--freebsd/sys/dev/usb/controller/ehcireg.h26
-rw-r--r--freebsd/sys/dev/usb/controller/ohci.c4
-rw-r--r--freebsd/sys/dev/usb/controller/xhcireg.h10
-rw-r--r--freebsd/sys/dev/usb/quirk/usb_quirk.c8
-rw-r--r--freebsd/sys/dev/usb/storage/umass.c15
-rw-r--r--freebsd/sys/dev/usb/usb_busdma.c31
-rw-r--r--freebsd/sys/dev/usb/usb_cdc.h2
-rw-r--r--freebsd/sys/dev/usb/usb_dev.c10
-rw-r--r--freebsd/sys/dev/usb/usb_device.c50
-rw-r--r--freebsd/sys/dev/usb/usb_device.h3
-rw-r--r--freebsd/sys/dev/usb/usb_handle_request.c2
-rw-r--r--freebsd/sys/dev/usb/usb_hid.c5
-rw-r--r--freebsd/sys/dev/usb/usb_hub.c8
-rw-r--r--freebsd/sys/dev/usb/usb_lookup.c97
-rw-r--r--freebsd/sys/dev/usb/usb_transfer.c8
-rw-r--r--freebsd/sys/dev/usb/usbdi.h69
-rw-r--r--libbsd.txt2
-rw-r--r--rtemsbsd/include/rtems/bsd/local/usbdevs.h16
-rw-r--r--rtemsbsd/include/rtems/bsd/local/usbdevs_data.h68
22 files changed, 362 insertions, 191 deletions
diff --git a/freebsd/sys/dev/usb/controller/dwc_otg.c b/freebsd/sys/dev/usb/controller/dwc_otg.c
index 028047a3..d070f145 100644
--- a/freebsd/sys/dev/usb/controller/dwc_otg.c
+++ b/freebsd/sys/dev/usb/controller/dwc_otg.c
@@ -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)
diff --git a/freebsd/sys/dev/usb/controller/ehci.c b/freebsd/sys/dev/usb/controller/ehci.c
index 7da7e27d..827399cb 100644
--- a/freebsd/sys/dev/usb/controller/ehci.c
+++ b/freebsd/sys/dev/usb/controller/ehci.c
@@ -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;
}
diff --git a/freebsd/sys/dev/usb/controller/ehci.h b/freebsd/sys/dev/usb/controller/ehci.h
index aaa1cedc..dd20c0a5 100644
--- a/freebsd/sys/dev/usb/controller/ehci.h
+++ b/freebsd/sys/dev/usb/controller/ehci.h
@@ -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_ */
diff --git a/freebsd/sys/dev/usb/controller/ehcireg.h b/freebsd/sys/dev/usb/controller/ehcireg.h
index 1f5fc5c0..2394b2c1 100644
--- a/freebsd/sys/dev/usb/controller/ehcireg.h
+++ b/freebsd/sys/dev/usb/controller/ehcireg.h
@@ -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_ */
diff --git a/freebsd/sys/dev/usb/controller/ohci.c b/freebsd/sys/dev/usb/controller/ohci.c
index 91f535d5..4c77fdea 100644
--- a/freebsd/sys/dev/usb/controller/ohci.c
+++ b/freebsd/sys/dev/usb/controller/ohci.c
@@ -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;
diff --git a/freebsd/sys/dev/usb/controller/xhcireg.h b/freebsd/sys/dev/usb/controller/xhcireg.h
index a0b73971..0e588ecb 100644
--- a/freebsd/sys/dev/usb/controller/xhcireg.h
+++ b/freebsd/sys/dev/usb/controller/xhcireg.h
@@ -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 */
diff --git a/freebsd/sys/dev/usb/quirk/usb_quirk.c b/freebsd/sys/dev/usb/quirk/usb_quirk.c
index c6baeffc..1ff0afba 100644
--- a/freebsd/sys/dev/usb/quirk/usb_quirk.c
+++ b/freebsd/sys/dev/usb/quirk/usb_quirk.c
@@ -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:
diff --git a/freebsd/sys/dev/usb/storage/umass.c b/freebsd/sys/dev/usb/storage/umass.c
index 9c6c8532..0fb810c1 100644
--- a/freebsd/sys/dev/usb/storage/umass.c
+++ b/freebsd/sys/dev/usb/storage/umass.c
@@ -710,20 +710,23 @@ static driver_t umass_driver = {
.size = sizeof(struct umass_softc),
};
+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 const STRUCT_USB_HOST_ID __used umass_devs[] = {
- /* generic mass storage class */
- {USB_IFACE_CLASS(UICLASS_MASS),},
-};
-
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:
diff --git a/freebsd/sys/dev/usb/usb_busdma.c b/freebsd/sys/dev/usb/usb_busdma.c
index 52af6088..88566199 100644
--- a/freebsd/sys/dev/usb/usb_busdma.c
+++ b/freebsd/sys/dev/usb/usb_busdma.c
@@ -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:
diff --git a/freebsd/sys/dev/usb/usb_cdc.h b/freebsd/sys/dev/usb/usb_cdc.h
index b8f59fae..86f35170 100644
--- a/freebsd/sys/dev/usb/usb_cdc.h
+++ b/freebsd/sys/dev/usb/usb_cdc.h
@@ -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
diff --git a/freebsd/sys/dev/usb/usb_dev.c b/freebsd/sys/dev/usb/usb_dev.c
index e5f98a9e..b31ba617 100644
--- a/freebsd/sys/dev/usb/usb_dev.c
+++ b/freebsd/sys/dev/usb/usb_dev.c
@@ -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 */
diff --git a/freebsd/sys/dev/usb/usb_device.c b/freebsd/sys/dev/usb/usb_device.c
index 614e1e92..26c694e8 100644
--- a/freebsd/sys/dev/usb/usb_device.c
+++ b/freebsd/sys/dev/usb/usb_device.c
@@ -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
diff --git a/freebsd/sys/dev/usb/usb_device.h b/freebsd/sys/dev/usb/usb_device.h
index 4e9dbc4a..24a5a4a6 100644
--- a/freebsd/sys/dev/usb/usb_device.h
+++ b/freebsd/sys/dev/usb/usb_device.h
@@ -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 *);
diff --git a/freebsd/sys/dev/usb/usb_handle_request.c b/freebsd/sys/dev/usb/usb_handle_request.c
index 1720fa02..308df345 100644
--- a/freebsd/sys/dev/usb/usb_handle_request.c
+++ b/freebsd/sys/dev/usb/usb_handle_request.c
@@ -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.
diff --git a/freebsd/sys/dev/usb/usb_hid.c b/freebsd/sys/dev/usb/usb_hid.c
index 879aaeae..9d9c9988 100644
--- a/freebsd/sys/dev/usb/usb_hid.c
+++ b/freebsd/sys/dev/usb/usb_hid.c
@@ -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;
diff --git a/freebsd/sys/dev/usb/usb_hub.c b/freebsd/sys/dev/usb/usb_hub.c
index 0e2dde8c..a744a82e 100644
--- a/freebsd/sys/dev/usb/usb_hub.c
+++ b/freebsd/sys/dev/usb/usb_hub.c
@@ -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) {
diff --git a/freebsd/sys/dev/usb/usb_lookup.c b/freebsd/sys/dev/usb/usb_lookup.c
index 9ffdcd2e..5dea5188 100644
--- a/freebsd/sys/dev/usb/usb_lookup.c
+++ b/freebsd/sys/dev/usb/usb_lookup.c
@@ -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}"
-
- "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}"
-
- "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 "}"
+#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}"
+
+ "mfl_dev_class{" U16_XOR ",1}"
+ "mfl_dev_subclass{" U16_XOR ",1}"
+ "mfl_dev_protocol{" U16_XOR ",1}"
+ "mfl_int_class{" U16_XOR ",1}"
+
+ "mfl_int_subclass{" U16_XOR ",1}"
+ "mfl_int_protocol{" U16_XOR ",1}"
+ "unused{" U16_XOR ",6}"
+#endif
};
#endif
diff --git a/freebsd/sys/dev/usb/usb_transfer.c b/freebsd/sys/dev/usb/usb_transfer.c
index 7b39601d..9bb68fd3 100644
--- a/freebsd/sys/dev/usb/usb_transfer.c
+++ b/freebsd/sys/dev/usb/usb_transfer.c
@@ -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
diff --git a/freebsd/sys/dev/usb/usbdi.h b/freebsd/sys/dev/usb/usbdi.h
index ecd5a812..202ad89f 100644
--- a/freebsd/sys/dev/usb/usbdi.h
+++ b/freebsd/sys/dev/usb/usbdi.h
@@ -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];
diff --git a/libbsd.txt b/libbsd.txt
index ac72532d..d876cb43 100644
--- a/libbsd.txt
+++ b/libbsd.txt
@@ -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
diff --git a/rtemsbsd/include/rtems/bsd/local/usbdevs.h b/rtemsbsd/include/rtems/bsd/local/usbdevs.h
index cee4d28f..ccee2efd 100644
--- a/rtemsbsd/include/rtems/bsd/local/usbdevs.h
+++ b/rtemsbsd/include/rtems/bsd/local/usbdevs.h
@@ -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 */
diff --git a/rtemsbsd/include/rtems/bsd/local/usbdevs_data.h b/rtemsbsd/include/rtems/bsd/local/usbdevs_data.h
index 945b06c5..d4712da6 100644
--- a/rtemsbsd/include/rtems/bsd/local/usbdevs_data.h
+++ b/rtemsbsd/include/rtems/bsd/local/usbdevs_data.h
@@ -304,6 +304,12 @@ const struct usb_knowndev usb_knowndevs[] = {
"RTL8192CU",
},
{
+ USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_RTL8188EU,
+ 0,
+ "AboCom Systems",
+ "RTL8188EU",
+ },
+ {
USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_WUG2700,
0,
"AboCom Systems",
@@ -1396,6 +1402,24 @@ const struct usb_knowndev usb_knowndevs[] = {
"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,
"Apple Computer",
@@ -3118,6 +3142,12 @@ const struct usb_knowndev usb_knowndevs[] = {
"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,
"Creative Labs",
@@ -4006,6 +4036,12 @@ const struct usb_knowndev usb_knowndevs[] = {
"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,
"DMI",
@@ -6202,6 +6238,12 @@ const struct usb_knowndev usb_knowndevs[] = {
"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,
"Garmin International",
@@ -6628,6 +6670,12 @@ const struct usb_knowndev usb_knowndevs[] = {
"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,
"Hewlett Packard",
@@ -8746,6 +8794,12 @@ const struct usb_knowndev usb_knowndevs[] = {
"Cordless optical mouse",
},
{
+ USB_VENDOR_LOGITECH, USB_PRODUCT_LOGITECH_UNIFYING,
+ 0,
+ "Logitech",
+ "Logitech Unifying Receiver",
+ },
+ {
USB_VENDOR_LOGITECH, USB_PRODUCT_LOGITECH_QUICKCAMPRO2,
0,
"Logitech",
@@ -13942,6 +13996,12 @@ const struct usb_knowndev usb_knowndevs[] = {
"USBKR100 USB Ethernet",
},
{
+ USB_VENDOR_REALTEK, USB_PRODUCT_REALTEK_RTL8152,
+ 0,
+ "Realtek",
+ "RTL8152 USB Ethernet",
+ },
+ {
USB_VENDOR_REALTEK, USB_PRODUCT_REALTEK_RTL8153,
0,
"Realtek",
@@ -16060,6 +16120,12 @@ const struct usb_knowndev usb_knowndevs[] = {
"LN-032",
},
{
+ USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_LN031,
+ 0,
+ "Sitecom Europe",
+ "LN-031",
+ },
+ {
USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_LN028,
0,
"Sitecom Europe",
@@ -18402,7 +18468,7 @@ const struct usb_knowndev usb_knowndevs[] = {
{
USB_VENDOR_SUN2, 0,
USB_KNOWNDEV_NOPROD,
- "Sun Microsystems (offical)",
+ "Sun Microsystems (official)",
NULL,
},
{