diff options
Diffstat (limited to 'kernel/4.13.0/e1000e/vfio-net.c')
-rw-r--r-- | kernel/4.13.0/e1000e/vfio-net.c | 30 |
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; } |