hrev51534 adds 1 changeset to branch 'master'
old head: 5ed6ef8e18df700101160a4fd5da7edb73408411
new head: e3441678243c79b7816142eeae3e4456c29c278b
overview:
http://cgit.haiku-os.org/haiku/log/?qt=range&q=e3441678243c+%5E5ed6ef8e18df
----------------------------------------------------------------------------
e3441678243c: xhci: the command ring must be stopped when setting its address.
* send stop and cancel commands.
Signed-off-by: Jérôme Duval <jerome.duval@xxxxxxxxx>
[ Greg Crain <gcrain70@xxxxxxxxx> ]
----------------------------------------------------------------------------
Revision: hrev51534
Commit: e3441678243c79b7816142eeae3e4456c29c278b
URL: http://cgit.haiku-os.org/haiku/commit/?id=e3441678243c
Author: Greg Crain <gcrain70@xxxxxxxxx>
Date: Wed Nov 8 17:58:44 2017 UTC
Committer: Jérôme Duval <jerome.duval@xxxxxxxxx>
Commit-Date: Wed Nov 8 18:02:33 2017 UTC
----------------------------------------------------------------------------
2 files changed, 16 insertions(+)
src/add-ons/kernel/busses/usb/xhci.cpp | 13 +++++++++++++
src/add-ons/kernel/busses/usb/xhci_hardware.h | 3 +++
----------------------------------------------------------------------------
diff --git a/src/add-ons/kernel/busses/usb/xhci.cpp
b/src/add-ons/kernel/busses/usb/xhci.cpp
index 44f0e10..5babbd1 100644
--- a/src/add-ons/kernel/busses/usb/xhci.cpp
+++ b/src/add-ons/kernel/busses/usb/xhci.cpp
@@ -516,6 +516,19 @@ XHCI::Start()
dmaAddress += sizeof(xhci_erst_element) + XHCI_MAX_EVENTS
* sizeof(xhci_trb);
+
+ // Make sure the Command Ring is stopped
+ if ((ReadOpReg(XHCI_CRCR_LO) & CRCR_CRR) != 0) {
+ TRACE_ALWAYS("Command Ring is running, send stop/cancel\n");
+ WriteOpReg(XHCI_CRCR_LO, CRCR_CS);
+ WriteOpReg(XHCI_CRCR_HI, 0);
+ WriteOpReg(XHCI_CRCR_LO, CRCR_CA);
+ WriteOpReg(XHCI_CRCR_HI, 0);
+ snooze(1000);
+ if ((ReadOpReg(XHCI_CRCR_LO) & CRCR_CRR) != 0) {
+ TRACE_ERROR("Command Ring still running after
stop/cancel\n");
+ }
+ }
TRACE("setting CRCR addr = 0x%" B_PRIxPHYSADDR "\n", dmaAddress);
WriteOpReg(XHCI_CRCR_LO, (uint32)dmaAddress | CRCR_RCS);
WriteOpReg(XHCI_CRCR_HI, /*(uint32)(dmaAddress >> 32)*/0);
diff --git a/src/add-ons/kernel/busses/usb/xhci_hardware.h
b/src/add-ons/kernel/busses/usb/xhci_hardware.h
index a9619d9..b10240f 100644
--- a/src/add-ons/kernel/busses/usb/xhci_hardware.h
+++ b/src/add-ons/kernel/busses/usb/xhci_hardware.h
@@ -91,6 +91,9 @@
#define XHCI_CRCR_LO 0x18
#define XHCI_CRCR_HI 0x1C
#define CRCR_RCS (1<<0)
+#define CRCR_CS (1<<1)
+#define CRCR_CA (1<<2)
+#define CRCR_CRR (1<<3)
// Section 5.4.6
#define XHCI_DCBAAP_LO 0x30
#define XHCI_DCBAAP_HI 0x34