xhci: Avoid DMA when ERSTBA is set to zero

The existing XHCI code reads the Event Ring Segment Table Base Address
Register (ERSTBA) every time when it is changed. However zero is its
default state so one would think that zero there means it is not in use.

This adds a check for ERSTBA in addition to the existing check for
the Event Ring Segment Table Size Register (ERSTSZ).

Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Message-id: 20170911065606.40600-1-aik@ozlabs.ru
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Alexey Kardashevskiy 2017-09-11 16:56:06 +10:00 committed by Gerd Hoffmann
parent 619c200f6c
commit 6100dda70d

View File

@ -811,8 +811,9 @@ static void xhci_er_reset(XHCIState *xhci, int v)
{ {
XHCIInterrupter *intr = &xhci->intr[v]; XHCIInterrupter *intr = &xhci->intr[v];
XHCIEvRingSeg seg; XHCIEvRingSeg seg;
dma_addr_t erstba = xhci_addr64(intr->erstba_low, intr->erstba_high);
if (intr->erstsz == 0) { if (intr->erstsz == 0 || erstba == 0) {
/* disabled */ /* disabled */
intr->er_start = 0; intr->er_start = 0;
intr->er_size = 0; intr->er_size = 0;
@ -824,7 +825,6 @@ static void xhci_er_reset(XHCIState *xhci, int v)
xhci_die(xhci); xhci_die(xhci);
return; return;
} }
dma_addr_t erstba = xhci_addr64(intr->erstba_low, intr->erstba_high);
pci_dma_read(PCI_DEVICE(xhci), erstba, &seg, sizeof(seg)); pci_dma_read(PCI_DEVICE(xhci), erstba, &seg, sizeof(seg));
le32_to_cpus(&seg.addr_low); le32_to_cpus(&seg.addr_low);
le32_to_cpus(&seg.addr_high); le32_to_cpus(&seg.addr_high);