1/*- 2 * Copyright (c) 2008 Hans Petter Selasky. All rights reserved. 3 * Copyright (c) 2004 The NetBSD Foundation, Inc. All rights reserved. 4 * Copyright (c) 2004 Lennart Augustsson. All rights reserved. 5 * Copyright (c) 2004 Charles M. Hannum. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions --- 30 unchanged lines hidden (view full) --- 39 */ 40 41/* 42 * TODO: 43 * 1) command failures are not recovered correctly 44 */ 45 46#include <sys/cdefs.h> |
47__FBSDID("$FreeBSD: head/sys/dev/usb/controller/ehci.c 199058 2009-11-08 20:51:15Z thompsa $"); |
48 49#include <sys/stdint.h> 50#include <sys/stddef.h> 51#include <sys/param.h> 52#include <sys/queue.h> 53#include <sys/types.h> 54#include <sys/systm.h> 55#include <sys/kernel.h> --- 52 unchanged lines hidden (view full) --- 108 109extern struct usb_bus_methods ehci_bus_methods; 110extern struct usb_pipe_methods ehci_device_bulk_methods; 111extern struct usb_pipe_methods ehci_device_ctrl_methods; 112extern struct usb_pipe_methods ehci_device_intr_methods; 113extern struct usb_pipe_methods ehci_device_isoc_fs_methods; 114extern struct usb_pipe_methods ehci_device_isoc_hs_methods; 115 |
116static void ehci_do_poll(struct usb_bus *); 117static void ehci_device_done(struct usb_xfer *, usb_error_t); 118static uint8_t ehci_check_transfer(struct usb_xfer *); 119static void ehci_timeout(void *); 120static void ehci_poll_timeout(void *); 121 |
122static void ehci_root_intr(ehci_softc_t *sc); 123 124struct ehci_std_temp { 125 ehci_softc_t *sc; 126 struct usb_page_cache *pc; 127 ehci_qtd_t *td; 128 ehci_qtd_t *td_next; 129 uint32_t average; --- 110 unchanged lines hidden (view full) --- 240 uint16_t x; 241 uint16_t y; 242 uint16_t bit; 243 usb_error_t err = 0; 244 245 DPRINTF("start\n"); 246 247 usb_callout_init_mtx(&sc->sc_tmo_pcd, &sc->sc_bus.bus_mtx, 0); |
248 usb_callout_init_mtx(&sc->sc_tmo_poll, &sc->sc_bus.bus_mtx, 0); |
249 250#if USB_DEBUG 251 if (ehcidebug > 2) { 252 ehci_dump_regs(sc); 253 } 254#endif 255 256 sc->sc_offs = EREAD1(sc, EHCI_CAPLENGTH); --- 261 unchanged lines hidden (view full) --- 518 * shut down the controller when the system is going down 519 */ 520void 521ehci_detach(ehci_softc_t *sc) 522{ 523 USB_BUS_LOCK(&sc->sc_bus); 524 525 usb_callout_stop(&sc->sc_tmo_pcd); |
526 usb_callout_stop(&sc->sc_tmo_poll); |
527 528 EOWRITE4(sc, EHCI_USBINTR, sc->sc_eintrs); 529 USB_BUS_UNLOCK(&sc->sc_bus); 530 531 if (ehci_hcreset(sc)) { 532 DPRINTF("reset failed!\n"); 533 } 534 535 /* XXX let stray task complete */ 536 usb_pause_mtx(NULL, hz / 20); 537 538 usb_callout_drain(&sc->sc_tmo_pcd); |
539 usb_callout_drain(&sc->sc_tmo_poll); |
540} 541 542void 543ehci_suspend(ehci_softc_t *sc) 544{ 545 uint32_t cmd; 546 uint32_t hcr; 547 uint8_t i; --- 924 unchanged lines hidden (view full) --- 1472 */ 1473 if (ehci_check_transfer(xfer)) { 1474 /* queue has been modified */ 1475 goto repeat; 1476 } 1477 } 1478} 1479 |
1480/* 1481 * Some EHCI chips from VIA / ATI seem to trigger interrupts before 1482 * writing back the qTD status, or miss signalling occasionally under 1483 * heavy load. If the host machine is too fast, we can miss 1484 * transaction completion - when we scan the active list the 1485 * transaction still seems to be active. This generally exhibits 1486 * itself as a umass stall that never recovers. 1487 * 1488 * We work around this behaviour by setting up this callback after any 1489 * softintr that completes with transactions still pending, giving us 1490 * another chance to check for completion after the writeback has 1491 * taken place. 1492 */ 1493static void 1494ehci_poll_timeout(void *arg) 1495{ 1496 ehci_softc_t *sc = arg; 1497 1498 DPRINTFN(3, "\n"); 1499 ehci_interrupt_poll(sc); 1500} 1501 |
1502/*------------------------------------------------------------------------* 1503 * ehci_interrupt - EHCI interrupt handler 1504 * 1505 * NOTE: Do not access "sc->sc_bus.bdev" inside the interrupt handler, 1506 * hence the interrupt handler will be setup before "sc->sc_bus.bdev" 1507 * is present ! 1508 *------------------------------------------------------------------------*/ 1509void --- 51 unchanged lines hidden (view full) --- 1561 /* block unprocessed interrupts */ 1562 sc->sc_eintrs &= ~status; 1563 EOWRITE4(sc, EHCI_USBINTR, sc->sc_eintrs); 1564 printf("%s: blocking interrupts 0x%x\n", __FUNCTION__, status); 1565 } 1566 /* poll all the USB transfers */ 1567 ehci_interrupt_poll(sc); 1568 |
1569 if (sc->sc_flags & EHCI_SCFLG_LOSTINTRBUG) { 1570 usb_callout_reset(&sc->sc_tmo_poll, hz / 128, 1571 (void *)&ehci_poll_timeout, sc); 1572 } 1573 |
1574done: 1575 USB_BUS_UNLOCK(&sc->sc_bus); 1576} 1577 1578/* 1579 * called when a request does not complete 1580 */ 1581static void --- 2316 unchanged lines hidden --- |