diff options
Diffstat (limited to 'drivers/virtio/virtio_pci_legacy.c')
| -rw-r--r-- | drivers/virtio/virtio_pci_legacy.c | 16 | 
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/virtio/virtio_pci_legacy.c b/drivers/virtio/virtio_pci_legacy.c index 8c4e61783441..6d9e5173d5fa 100644 --- a/drivers/virtio/virtio_pci_legacy.c +++ b/drivers/virtio/virtio_pci_legacy.c @@ -212,10 +212,18 @@ int virtio_pci_legacy_probe(struct virtio_pci_device *vp_dev)  		return -ENODEV;  	} -	rc = dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(64)); -	if (rc) -		rc = dma_set_mask_and_coherent(&pci_dev->dev, -						DMA_BIT_MASK(32)); +	rc = dma_set_mask(&pci_dev->dev, DMA_BIT_MASK(64)); +	if (rc) { +		rc = dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(32)); +	} else { +		/* +		 * The virtio ring base address is expressed as a 32-bit PFN, +		 * with a page size of 1 << VIRTIO_PCI_QUEUE_ADDR_SHIFT. +		 */ +		dma_set_coherent_mask(&pci_dev->dev, +				DMA_BIT_MASK(32 + VIRTIO_PCI_QUEUE_ADDR_SHIFT)); +	} +  	if (rc)  		dev_warn(&pci_dev->dev, "Failed to enable 64-bit or 32-bit DMA.  Trying to continue, but this might not work.\n");  | 
