summaryrefslogtreecommitdiffstats
path: root/drivers/net/vmxnet3
diff options
context:
space:
mode:
authorhpreg@vmware.com <hpreg@vmware.com>2018-05-14 08:14:34 -0400
committerDavid S. Miller <davem@davemloft.net>2018-05-14 22:43:57 -0400
commit61aeecea40afb2b89933e27cd4adb10fc2e75cfd (patch)
tree360bd1bbdbdb7dac6f38f9cc3a954431898da5ba /drivers/net/vmxnet3
parent849a742c59a3d597473c0232f9c2506c69eeef14 (diff)
vmxnet3: set the DMA mask before the first DMA map operation
The DMA mask must be set before, not after, the first DMA map operation, or the first DMA map operation could in theory fail on some systems. Fixes: b0eb57cb97e78 ("VMXNET3: Add support for virtual IOMMU") Signed-off-by: Regis Duchesne <hpreg@vmware.com> Acked-by: Ronak Doshi <doshir@vmware.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/vmxnet3')
-rw-r--r--drivers/net/vmxnet3/vmxnet3_drv.c50
-rw-r--r--drivers/net/vmxnet3/vmxnet3_int.h8
2 files changed, 30 insertions, 28 deletions
diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c
index 9ebe2a689966..ed58685c353f 100644
--- a/drivers/net/vmxnet3/vmxnet3_drv.c
+++ b/drivers/net/vmxnet3/vmxnet3_drv.c
@@ -2688,7 +2688,7 @@ vmxnet3_set_mac_addr(struct net_device *netdev, void *p)
2688/* ==================== initialization and cleanup routines ============ */ 2688/* ==================== initialization and cleanup routines ============ */
2689 2689
2690static int 2690static int
2691vmxnet3_alloc_pci_resources(struct vmxnet3_adapter *adapter, bool *dma64) 2691vmxnet3_alloc_pci_resources(struct vmxnet3_adapter *adapter)
2692{ 2692{
2693 int err; 2693 int err;
2694 unsigned long mmio_start, mmio_len; 2694 unsigned long mmio_start, mmio_len;
@@ -2700,30 +2700,12 @@ vmxnet3_alloc_pci_resources(struct vmxnet3_adapter *adapter, bool *dma64)
2700 return err; 2700 return err;
2701 } 2701 }
2702 2702
2703 if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) == 0) {
2704 if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)) != 0) {
2705 dev_err(&pdev->dev,
2706 "pci_set_consistent_dma_mask failed\n");
2707 err = -EIO;
2708 goto err_set_mask;
2709 }
2710 *dma64 = true;
2711 } else {
2712 if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) != 0) {
2713 dev_err(&pdev->dev,
2714 "pci_set_dma_mask failed\n");
2715 err = -EIO;
2716 goto err_set_mask;
2717 }
2718 *dma64 = false;
2719 }
2720
2721 err = pci_request_selected_regions(pdev, (1 << 2) - 1, 2703 err = pci_request_selected_regions(pdev, (1 << 2) - 1,
2722 vmxnet3_driver_name); 2704 vmxnet3_driver_name);
2723 if (err) { 2705 if (err) {
2724 dev_err(&pdev->dev, 2706 dev_err(&pdev->dev,
2725 "Failed to request region for adapter: error %d\n", err); 2707 "Failed to request region for adapter: error %d\n", err);
2726 goto err_set_mask; 2708 goto err_enable_device;
2727 } 2709 }
2728 2710
2729 pci_set_master(pdev); 2711 pci_set_master(pdev);
@@ -2751,7 +2733,7 @@ err_bar1:
2751 iounmap(adapter->hw_addr0); 2733 iounmap(adapter->hw_addr0);
2752err_ioremap: 2734err_ioremap:
2753 pci_release_selected_regions(pdev, (1 << 2) - 1); 2735 pci_release_selected_regions(pdev, (1 << 2) - 1);
2754err_set_mask: 2736err_enable_device:
2755 pci_disable_device(pdev); 2737 pci_disable_device(pdev);
2756 return err; 2738 return err;
2757} 2739}
@@ -3254,7 +3236,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
3254#endif 3236#endif
3255 }; 3237 };
3256 int err; 3238 int err;
3257 bool dma64 = false; /* stupid gcc */ 3239 bool dma64;
3258 u32 ver; 3240 u32 ver;
3259 struct net_device *netdev; 3241 struct net_device *netdev;
3260 struct vmxnet3_adapter *adapter; 3242 struct vmxnet3_adapter *adapter;
@@ -3300,6 +3282,24 @@ vmxnet3_probe_device(struct pci_dev *pdev,
3300 adapter->rx_ring_size = VMXNET3_DEF_RX_RING_SIZE; 3282 adapter->rx_ring_size = VMXNET3_DEF_RX_RING_SIZE;
3301 adapter->rx_ring2_size = VMXNET3_DEF_RX_RING2_SIZE; 3283 adapter->rx_ring2_size = VMXNET3_DEF_RX_RING2_SIZE;
3302 3284
3285 if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) == 0) {
3286 if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)) != 0) {
3287 dev_err(&pdev->dev,
3288 "pci_set_consistent_dma_mask failed\n");
3289 err = -EIO;
3290 goto err_set_mask;
3291 }
3292 dma64 = true;
3293 } else {
3294 if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) != 0) {
3295 dev_err(&pdev->dev,
3296 "pci_set_dma_mask failed\n");
3297 err = -EIO;
3298 goto err_set_mask;
3299 }
3300 dma64 = false;
3301 }
3302
3303 spin_lock_init(&adapter->cmd_lock); 3303 spin_lock_init(&adapter->cmd_lock);
3304 adapter->adapter_pa = dma_map_single(&adapter->pdev->dev, adapter, 3304 adapter->adapter_pa = dma_map_single(&adapter->pdev->dev, adapter,
3305 sizeof(struct vmxnet3_adapter), 3305 sizeof(struct vmxnet3_adapter),
@@ -3307,7 +3307,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
3307 if (dma_mapping_error(&adapter->pdev->dev, adapter->adapter_pa)) { 3307 if (dma_mapping_error(&adapter->pdev->dev, adapter->adapter_pa)) {
3308 dev_err(&pdev->dev, "Failed to map dma\n"); 3308 dev_err(&pdev->dev, "Failed to map dma\n");
3309 err = -EFAULT; 3309 err = -EFAULT;
3310 goto err_dma_map; 3310 goto err_set_mask;
3311 } 3311 }
3312 adapter->shared = dma_alloc_coherent( 3312 adapter->shared = dma_alloc_coherent(
3313 &adapter->pdev->dev, 3313 &adapter->pdev->dev,
@@ -3358,7 +3358,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
3358 } 3358 }
3359#endif /* VMXNET3_RSS */ 3359#endif /* VMXNET3_RSS */
3360 3360
3361 err = vmxnet3_alloc_pci_resources(adapter, &dma64); 3361 err = vmxnet3_alloc_pci_resources(adapter);
3362 if (err < 0) 3362 if (err < 0)
3363 goto err_alloc_pci; 3363 goto err_alloc_pci;
3364 3364
@@ -3504,7 +3504,7 @@ err_alloc_queue_desc:
3504err_alloc_shared: 3504err_alloc_shared:
3505 dma_unmap_single(&adapter->pdev->dev, adapter->adapter_pa, 3505 dma_unmap_single(&adapter->pdev->dev, adapter->adapter_pa,
3506 sizeof(struct vmxnet3_adapter), PCI_DMA_TODEVICE); 3506 sizeof(struct vmxnet3_adapter), PCI_DMA_TODEVICE);
3507err_dma_map: 3507err_set_mask:
3508 free_netdev(netdev); 3508 free_netdev(netdev);
3509 return err; 3509 return err;
3510} 3510}
diff --git a/drivers/net/vmxnet3/vmxnet3_int.h b/drivers/net/vmxnet3/vmxnet3_int.h
index a3326463b71f..b379bed5f51d 100644
--- a/drivers/net/vmxnet3/vmxnet3_int.h
+++ b/drivers/net/vmxnet3/vmxnet3_int.h
@@ -69,10 +69,12 @@
69/* 69/*
70 * Version numbers 70 * Version numbers
71 */ 71 */
72#define VMXNET3_DRIVER_VERSION_STRING "1.4.14.0-k" 72#define VMXNET3_DRIVER_VERSION_STRING "1.4.15.0-k"
73 73
74/* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ 74/* Each byte of this 32-bit integer encodes a version number in
75#define VMXNET3_DRIVER_VERSION_NUM 0x01040e00 75 * VMXNET3_DRIVER_VERSION_STRING.
76 */
77#define VMXNET3_DRIVER_VERSION_NUM 0x01040f00
76 78
77#if defined(CONFIG_PCI_MSI) 79#if defined(CONFIG_PCI_MSI)
78 /* RSS only makes sense if MSI-X is supported. */ 80 /* RSS only makes sense if MSI-X is supported. */