From c0b58c071f690fd5f5bbcb20a4b54853a624b575 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sun, 22 May 2011 19:44:09 +0000 Subject: [PATCH] * added some EHCI definitions (specification 1.1) * enable per-port change events when available git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@41661 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/busses/usb/ehci.cpp | 6 +++++- src/add-ons/kernel/busses/usb/ehci_hardware.h | 10 +++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/add-ons/kernel/busses/usb/ehci.cpp b/src/add-ons/kernel/busses/usb/ehci.cpp index b1ec9e57c8..cebc5d27de 100644 --- a/src/add-ons/kernel/busses/usb/ehci.cpp +++ b/src/add-ons/kernel/busses/usb/ehci.cpp @@ -522,11 +522,15 @@ status_t EHCI::Start() { TRACE("starting EHCI host controller\n"); - TRACE("usbcmd: 0x%08lx; usbsts: 0x%08lx\n", ReadOpReg(EHCI_USBCMD), ReadOpReg(EHCI_USBSTS)); + TRACE("usbcmd: 0x%08lx; usbsts: 0x%08lx\n", ReadOpReg(EHCI_USBCMD), + ReadOpReg(EHCI_USBSTS)); + bool hasPerPortChangeEvent = (ReadCapReg32(EHCI_HCCPARAMS) + & EHCI_HCCPARAMS_PPCEC) != 0; uint32 frameListSize = (ReadOpReg(EHCI_USBCMD) >> EHCI_USBCMD_FLS_SHIFT) & EHCI_USBCMD_FLS_MASK; WriteOpReg(EHCI_USBCMD, ReadOpReg(EHCI_USBCMD) | EHCI_USBCMD_RUNSTOP + | (hasPerPortChangeEvent ? EHCI_USBCMD_PPCEE : 0) | EHCI_USBCMD_ASENABLE | EHCI_USBCMD_PSENABLE | (frameListSize << EHCI_USBCMD_FLS_SHIFT) | (1 << EHCI_USBCMD_ITC_SHIFT)); diff --git a/src/add-ons/kernel/busses/usb/ehci_hardware.h b/src/add-ons/kernel/busses/usb/ehci_hardware.h index 4350e9567e..d01b513f94 100644 --- a/src/add-ons/kernel/busses/usb/ehci_hardware.h +++ b/src/add-ons/kernel/busses/usb/ehci_hardware.h @@ -31,11 +31,15 @@ // USB Command Register (EHCI Spec 2.3.1) #define EHCI_USBCMD_ITC_SHIFT 16 // Interrupt Threshold Control #define EHCI_USBCMD_ITC_MASK 0xff +#define EHCI_USBCMD_PPCEE (1 << 15) // Per-Port Change Events Enable +#define EHCI_USBCMD_FSP (1 << 14) // Fully Synchronized Prefetch +#define EHCI_USBCMD_ASPE (1 << 13) // Async Schedule Prefetch Enable +#define EHCI_USBCMD_PSPE (1 << 12) // Periodic Schedule Prefetch Enable #define EHCI_USBCMD_ASPME (1 << 11) // Async Schedule Park Mode Enable #define EHCI_USBCMD_ASPMC_SHIFT 8 // Async Schedule Park Mode Count #define EHCI_USBCMD_ASPMC_MASK 0x03 #define EHCI_USBCMD_LHCRESET (1 << 7) // Light Host Controller Reset -#define EHCI_USBCMD_INTONAAD (1 << 6) // Interrupt on Async Advance Dorbell +#define EHCI_USBCMD_INTONAAD (1 << 6) // Interrupt on Async Advance Doorbell #define EHCI_USBCMD_ASENABLE (1 << 5) // Asynchronous Schedule Enable #define EHCI_USBCMD_PSENABLE (1 << 4) // Periodic Schedule Enable #define EHCI_USBCMD_FLS_SHIFT 2 // Frame List Size @@ -104,6 +108,10 @@ #define EHCI_LEGSUP_OSOWNED (1 << 24) // OS Owned Semaphore #define EHCI_LEGSUP_BIOSOWNED (1 << 16) // BIOS Owned Semaphore +#define EHCI_HCCPARAMS_FPLC (1 << 19) // 32 Frames Period List +#define EHCI_HCCPARAMS_PPCEC (1 << 18) // Per-Port Change Event +#define EHCI_HCCPARAMS_LPM (1 << 17) // Link Power Management +#define EHCI_HCCPARAMS_HP (1 << 16) // Hardware Prefetch #define EHCI_HCCPARAMS_IPT_SHIFT 4 // Isochronous Periodic Threshold #define EHCI_HCCPARAMS_IPT_MASK 0xf