Page MenuHomeFreeBSD

D38816.diff
No OneTemporary

D38816.diff

diff --git a/sys/dev/usb/controller/dwc3.c b/sys/dev/usb/controller/dwc3.c
--- a/sys/dev/usb/controller/dwc3.c
+++ b/sys/dev/usb/controller/dwc3.c
@@ -103,6 +103,17 @@
#define IS_DMA_32B 1
+static void
+xhci_interrupt_poll(void *_sc)
+{
+ struct xhci_softc *sc = _sc;
+
+ USB_BUS_UNLOCK(&sc->sc_bus);
+ xhci_interrupt(sc);
+ USB_BUS_LOCK(&sc->sc_bus);
+ usb_callout_reset(&sc->sc_callout, 1, (void *)&xhci_interrupt_poll, sc);
+}
+
static int
snps_dwc3_attach_xhci(device_t dev)
{
@@ -133,12 +144,14 @@
sprintf(sc->sc_vendor, "Synopsys");
device_set_desc(sc->sc_bus.bdev, "Synopsys");
- err = bus_setup_intr(dev, sc->sc_irq_res, INTR_TYPE_BIO | INTR_MPSAFE,
- NULL, (driver_intr_t *)xhci_interrupt, sc, &sc->sc_intr_hdl);
- if (err != 0) {
- device_printf(dev, "Failed to setup IRQ, %d\n", err);
- sc->sc_intr_hdl = NULL;
- return (err);
+ if (xhci_use_polling() == 0) {
+ err = bus_setup_intr(dev, sc->sc_irq_res, INTR_TYPE_BIO | INTR_MPSAFE,
+ NULL, (driver_intr_t *)xhci_interrupt, sc, &sc->sc_intr_hdl);
+ if (err != 0) {
+ device_printf(dev, "Failed to setup IRQ, %d\n", err);
+ sc->sc_intr_hdl = NULL;
+ return (err);
+ }
}
err = xhci_init(sc, dev, IS_DMA_32B);
@@ -147,6 +160,15 @@
return (ENXIO);
}
+ usb_callout_init_mtx(&sc->sc_callout, &sc->sc_bus.bus_mtx, 0);
+
+ if (xhci_use_polling() != 0) {
+ device_printf(dev, "Interrupt polling at %dHz\n", hz);
+ USB_BUS_LOCK(&sc->sc_bus);
+ xhci_interrupt_poll(sc);
+ USB_BUS_UNLOCK(&sc->sc_bus);
+ }
+
err = xhci_start_controller(sc);
if (err != 0) {
device_printf(dev, "Failed to start XHCI controller, with error %d\n", err);

File Metadata

Mime Type
text/plain
Expires
Mon, Sep 30, 4:26 PM (22 h, 13 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
13192240
Default Alt Text
D38816.diff (1 KB)

Event Timeline