ioatdma: channel reset scheme fixup on Intel Atom S1200 platforms
The Intel Atom S1200 family ioatdma changed the channel reset behavior. It does a reset similar to PCI FLR by resetting all the MSIX registers. We have to re-init msix interrupts because of this. This workaround is only specific to this platform and is not expected to carry over to the later generations. Signed-off-by: Dave Jiang <dave.jiang@intel.com> Acked-by: Dan Williams <djbw@fb.com> Signed-off-by: Vinod Koul <vinod.koul@intel.com>
This commit is contained in:

gecommit door
Vinod Koul

bovenliggende
d92a8d7cbb
commit
8a52b9ff11
@@ -892,7 +892,7 @@ MODULE_PARM_DESC(ioat_interrupt_style,
|
||||
* ioat_dma_setup_interrupts - setup interrupt handler
|
||||
* @device: ioat device
|
||||
*/
|
||||
static int ioat_dma_setup_interrupts(struct ioatdma_device *device)
|
||||
int ioat_dma_setup_interrupts(struct ioatdma_device *device)
|
||||
{
|
||||
struct ioat_chan_common *chan;
|
||||
struct pci_dev *pdev = device->pdev;
|
||||
@@ -941,6 +941,7 @@ msix:
|
||||
}
|
||||
}
|
||||
intrctrl |= IOAT_INTRCTRL_MSIX_VECTOR_CONTROL;
|
||||
device->irq_mode = IOAT_MSIX;
|
||||
goto done;
|
||||
|
||||
msix_single_vector:
|
||||
@@ -956,6 +957,7 @@ msix_single_vector:
|
||||
pci_disable_msix(pdev);
|
||||
goto msi;
|
||||
}
|
||||
device->irq_mode = IOAT_MSIX_SINGLE;
|
||||
goto done;
|
||||
|
||||
msi:
|
||||
@@ -969,6 +971,7 @@ msi:
|
||||
pci_disable_msi(pdev);
|
||||
goto intx;
|
||||
}
|
||||
device->irq_mode = IOAT_MSIX;
|
||||
goto done;
|
||||
|
||||
intx:
|
||||
@@ -977,6 +980,7 @@ intx:
|
||||
if (err)
|
||||
goto err_no_irq;
|
||||
|
||||
device->irq_mode = IOAT_INTX;
|
||||
done:
|
||||
if (device->intr_quirk)
|
||||
device->intr_quirk(device);
|
||||
@@ -987,9 +991,11 @@ done:
|
||||
err_no_irq:
|
||||
/* Disable all interrupt generation */
|
||||
writeb(0, device->reg_base + IOAT_INTRCTRL_OFFSET);
|
||||
device->irq_mode = IOAT_NOIRQ;
|
||||
dev_err(dev, "no usable interrupts\n");
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(ioat_dma_setup_interrupts);
|
||||
|
||||
static void ioat_disable_interrupts(struct ioatdma_device *device)
|
||||
{
|
||||
|
Verwijs in nieuw issue
Block a user