xhci: the command ring must be stopped when setting its address.
* send stop and cancel commands. Signed-off-by: Jérôme Duval <[email protected]>
This commit is contained in:
@@ -516,6 +516,19 @@ XHCI::Start()
|
|||||||
|
|
||||||
dmaAddress += sizeof(xhci_erst_element) + XHCI_MAX_EVENTS
|
dmaAddress += sizeof(xhci_erst_element) + XHCI_MAX_EVENTS
|
||||||
* sizeof(xhci_trb);
|
* 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);
|
TRACE("setting CRCR addr = 0x%" B_PRIxPHYSADDR "\n", dmaAddress);
|
||||||
WriteOpReg(XHCI_CRCR_LO, (uint32)dmaAddress | CRCR_RCS);
|
WriteOpReg(XHCI_CRCR_LO, (uint32)dmaAddress | CRCR_RCS);
|
||||||
WriteOpReg(XHCI_CRCR_HI, /*(uint32)(dmaAddress >> 32)*/0);
|
WriteOpReg(XHCI_CRCR_HI, /*(uint32)(dmaAddress >> 32)*/0);
|
||||||
|
|||||||
@@ -91,6 +91,9 @@
|
|||||||
#define XHCI_CRCR_LO 0x18
|
#define XHCI_CRCR_LO 0x18
|
||||||
#define XHCI_CRCR_HI 0x1C
|
#define XHCI_CRCR_HI 0x1C
|
||||||
#define CRCR_RCS (1<<0)
|
#define CRCR_RCS (1<<0)
|
||||||
|
#define CRCR_CS (1<<1)
|
||||||
|
#define CRCR_CA (1<<2)
|
||||||
|
#define CRCR_CRR (1<<3)
|
||||||
// Section 5.4.6
|
// Section 5.4.6
|
||||||
#define XHCI_DCBAAP_LO 0x30
|
#define XHCI_DCBAAP_LO 0x30
|
||||||
#define XHCI_DCBAAP_HI 0x34
|
#define XHCI_DCBAAP_HI 0x34
|
||||||
|
|||||||
Reference in New Issue
Block a user