View | Details | Raw Unified | Return to bug 210736 | Differences between
and this patch

Collapse All | Expand All

(-)sys/dev/usb/controller/dwc_otg.c (-16 / +18 lines)
Lines 93-109 Link Here
93
#define	DWC_OTG_PC2UDEV(pc) \
93
#define	DWC_OTG_PC2UDEV(pc) \
94
   (USB_DMATAG_TO_XROOT((pc)->tag_parent)->udev)
94
   (USB_DMATAG_TO_XROOT((pc)->tag_parent)->udev)
95
95
96
#define	DWC_OTG_MSK_GINT_ENABLED	\
97
   (GINTMSK_ENUMDONEMSK |		\
98
   GINTMSK_USBRSTMSK |			\
99
   GINTMSK_USBSUSPMSK |			\
100
   GINTMSK_IEPINTMSK |			\
101
   GINTMSK_SESSREQINTMSK |		\
102
   GINTMSK_RXFLVLMSK |			\
103
   GINTMSK_HCHINTMSK |			\
104
   GINTMSK_OTGINTMSK |			\
105
   GINTMSK_PRTINTMSK)
106
107
#define	DWC_OTG_MSK_GINT_THREAD_IRQ				\
96
#define	DWC_OTG_MSK_GINT_THREAD_IRQ				\
108
   (GINTSTS_USBRST | GINTSTS_ENUMDONE | GINTSTS_PRTINT |	\
97
   (GINTSTS_USBRST | GINTSTS_ENUMDONE | GINTSTS_PRTINT |	\
109
   GINTSTS_WKUPINT | GINTSTS_USBSUSP | GINTMSK_OTGINTMSK |	\
98
   GINTSTS_WKUPINT | GINTSTS_USBSUSP | GINTMSK_OTGINTMSK |	\
Lines 376-381 Link Here
376
		/* enable all host channel interrupts */
365
		/* enable all host channel interrupts */
377
		DWC_OTG_WRITE_4(sc, DOTG_HAINTMSK,
366
		DWC_OTG_WRITE_4(sc, DOTG_HAINTMSK,
378
		    (1U << sc->sc_host_ch_max) - 1U);
367
		    (1U << sc->sc_host_ch_max) - 1U);
368
369
		/* enable proper host channel interrupts */
370
		sc->sc_irq_mask |= GINTMSK_HCHINTMSK;
371
		sc->sc_irq_mask &= ~GINTMSK_IEPINTMSK;
372
		DWC_OTG_WRITE_4(sc, DOTG_GINTMSK, sc->sc_irq_mask);
379
	}
373
	}
380
374
381
	if (mode == DWC_MODE_DEVICE) {
375
	if (mode == DWC_MODE_DEVICE) {
Lines 436-441 Link Here
436
		    pf->usb.max_in_frame_size,
430
		    pf->usb.max_in_frame_size,
437
		    pf->usb.max_out_frame_size);
431
		    pf->usb.max_out_frame_size);
438
	    }
432
	    }
433
434
	    /* enable proper device channel interrupts */
435
	    sc->sc_irq_mask &= ~GINTMSK_HCHINTMSK;
436
	    sc->sc_irq_mask |= GINTMSK_IEPINTMSK;
437
	    DWC_OTG_WRITE_4(sc, DOTG_GINTMSK, sc->sc_irq_mask);
439
	}
438
	}
440
439
441
	/* reset RX FIFO */
440
	/* reset RX FIFO */
Lines 2870-2879 Link Here
2870
2869
2871
		for (x = 0; x != sc->sc_dev_in_ep_max; x++) {
2870
		for (x = 0; x != sc->sc_dev_in_ep_max; x++) {
2872
			temp = DWC_OTG_READ_4(sc, DOTG_DIEPINT(x));
2871
			temp = DWC_OTG_READ_4(sc, DOTG_DIEPINT(x));
2873
			if (temp & DIEPMSK_XFERCOMPLMSK) {
2872
			/*
2874
				DWC_OTG_WRITE_4(sc, DOTG_DIEPINT(x),
2873
			 * NOTE: Need to clear all interrupt bits,
2875
				    DIEPMSK_XFERCOMPLMSK);
2874
			 * because some appears to be unmaskable and
2876
			}
2875
			 * can cause an interrupt loop:
2876
			 */
2877
			if (temp != 0)
2878
				DWC_OTG_WRITE_4(sc, DOTG_DIEPINT(x), temp);
2877
		}
2879
		}
2878
	}
2880
	}
2879
2881
Lines 3980-3986 Link Here
3980
	}
3982
	}
3981
3983
3982
	/* enable interrupts */
3984
	/* enable interrupts */
3983
	sc->sc_irq_mask = DWC_OTG_MSK_GINT_ENABLED;
3985
	sc->sc_irq_mask |= DWC_OTG_MSK_GINT_THREAD_IRQ;
3984
	DWC_OTG_WRITE_4(sc, DOTG_GINTMSK, sc->sc_irq_mask);
3986
	DWC_OTG_WRITE_4(sc, DOTG_GINTMSK, sc->sc_irq_mask);
3985
3987
3986
	if (sc->sc_mode == DWC_MODE_OTG || sc->sc_mode == DWC_MODE_DEVICE) {
3988
	if (sc->sc_mode == DWC_MODE_OTG || sc->sc_mode == DWC_MODE_DEVICE) {

Return to bug 210736