aboutsummaryrefslogtreecommitdiff
path: root/kernel/4.13.0/e1000e/vfio-net.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/4.13.0/e1000e/vfio-net.c')
-rw-r--r--kernel/4.13.0/e1000e/vfio-net.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/kernel/4.13.0/e1000e/vfio-net.c b/kernel/4.13.0/e1000e/vfio-net.c
index 6a16f25..dd829af 100644
--- a/kernel/4.13.0/e1000e/vfio-net.c
+++ b/kernel/4.13.0/e1000e/vfio-net.c
@@ -87,6 +87,12 @@ static int e1000e_vfio_net_open(struct mdev_device *mdev)
dev_hold(adapter->netdev);
set_bit(__E1000_VFIO_NET, &adapter->state);
+ adapter->irq_mask =
+ E1000_IMS_RXT0 |
+ E1000_IMS_TXDW |
+ E1000_IMS_RXDMT0 |
+ E1000_IMS_RXSEQ;
+
if (netif_running(adapter->netdev))
e1000e_reinit_locked(adapter);
else
@@ -108,6 +114,8 @@ static void e1000e_vfio_net_release(struct mdev_device *mdev)
struct e1000_adapter *adapter = netdev_priv(netdev);
clear_bit(__E1000_VFIO_NET, &adapter->state);
+ adapter->irq_mask = 0;
+
if (netif_running(adapter->netdev))
e1000e_reinit_locked(adapter);
else
@@ -319,6 +327,7 @@ static long e1000e_vfio_net_ioctl(struct mdev_device *mdev, unsigned int cmd,
/* return ret? */
return -ENOMEM;
+#if 0
printk(KERN_INFO"VFIO_IOMMU_MAP_DMA: about to dma_map_single(%p, %p, %lld, DMA_FROM_DEVICE)\n",
parent_dev, data, map.size);
mapping = dma_map_single(parent_dev, data, map.size,
@@ -329,11 +338,18 @@ static long e1000e_vfio_net_ioctl(struct mdev_device *mdev, unsigned int cmd,
kfree(data);
goto out;
}
+#else
+ data = dma_alloc_coherent(parent_dev, map.size, &mapping, GFP_KERNEL);
+ if (!data) {
+ if (net_ratelimit())
+ printk(KERN_ERR"Failed to dma_alloc_coherent buffer for userland!\n");
+ goto out;
+ }
+
+#endif
map.iova = mapping;
- ret = io_remap_pfn_range(vma, map.vaddr,
- virt_to_phys(data) >> PAGE_SHIFT,
- map.size, vma->vm_page_prot);
- printk(KERN_INFO"VFIO_IOMMU_MAP_DMA: io_remap_pfn_range %llx -> physmem <- @%llx, %lld:%d\n",
+ ret = dma_mmap_coherent(parent_dev, vma, data, mapping, map.size);
+ printk(KERN_INFO"VFIO_IOMMU_MAP_DMA: dma_map_coherent %llx -> physmem <- @%llx, %lld:%d\n",
map.vaddr, map.iova, map.size, ret);
if (ret != 0) {
dma_unmap_single(parent_dev, mapping, map.size,
@@ -347,7 +363,7 @@ static long e1000e_vfio_net_ioctl(struct mdev_device *mdev, unsigned int cmd,
netmdev->mappings_count);
netmdev->mappings[netmdev->mappings_count].dev = parent_dev;
netmdev->mappings[netmdev->mappings_count].vaddr = data;
- netmdev->mappings[netmdev->mappings_count].iova = mapping;
+ netmdev->mappings[netmdev->mappings_count].iova = map.iova;
netmdev->mappings[netmdev->mappings_count].size = map.size;
netmdev->mappings_count++;
@@ -370,6 +386,10 @@ out:
return 0;
+ case 500:
+ e1000e_trigger_lsc(adapter);
+ return 0;
+
default:
return -EOPNOTSUPP;
}