Hi Neil, I love your patch! Perhaps something to improve:
url: https://github.com/0day-ci/linux/commits/Neil-Horman/vmw_pvrdma-Release-netdev-when-vmxnet3-module-is-removed/20180628-232414 smatch warnings: drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c:987 pvrdma_pci_probe() warn: variable dereferenced before check 'dev->netdev' (see line 985) # https://github.com/0day-ci/linux/commit/d5bb424e18e2ecab4ac590a66b0cca9dfb96d3da git remote add linux-review https://github.com/0day-ci/linux git remote update linux-review git checkout d5bb424e18e2ecab4ac590a66b0cca9dfb96d3da vim +987 drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c 29c8d9eb Adit Ranadive 2016-10-02 784 29c8d9eb Adit Ranadive 2016-10-02 785 static int pvrdma_pci_probe(struct pci_dev *pdev, 29c8d9eb Adit Ranadive 2016-10-02 786 const struct pci_device_id *id) 29c8d9eb Adit Ranadive 2016-10-02 787 { 29c8d9eb Adit Ranadive 2016-10-02 788 struct pci_dev *pdev_net; 29c8d9eb Adit Ranadive 2016-10-02 789 struct pvrdma_dev *dev; 29c8d9eb Adit Ranadive 2016-10-02 790 int ret; 29c8d9eb Adit Ranadive 2016-10-02 791 unsigned long start; 29c8d9eb Adit Ranadive 2016-10-02 792 unsigned long len; 29c8d9eb Adit Ranadive 2016-10-02 793 dma_addr_t slot_dma = 0; 29c8d9eb Adit Ranadive 2016-10-02 794 29c8d9eb Adit Ranadive 2016-10-02 795 dev_dbg(&pdev->dev, "initializing driver %s\n", pci_name(pdev)); 29c8d9eb Adit Ranadive 2016-10-02 796 29c8d9eb Adit Ranadive 2016-10-02 797 /* Allocate zero-out device */ 29c8d9eb Adit Ranadive 2016-10-02 798 dev = (struct pvrdma_dev *)ib_alloc_device(sizeof(*dev)); 29c8d9eb Adit Ranadive 2016-10-02 799 if (!dev) { 29c8d9eb Adit Ranadive 2016-10-02 800 dev_err(&pdev->dev, "failed to allocate IB device\n"); 29c8d9eb Adit Ranadive 2016-10-02 801 return -ENOMEM; 29c8d9eb Adit Ranadive 2016-10-02 802 } 29c8d9eb Adit Ranadive 2016-10-02 803 29c8d9eb Adit Ranadive 2016-10-02 804 mutex_lock(&pvrdma_device_list_lock); 29c8d9eb Adit Ranadive 2016-10-02 805 list_add(&dev->device_link, &pvrdma_device_list); 29c8d9eb Adit Ranadive 2016-10-02 806 mutex_unlock(&pvrdma_device_list_lock); 29c8d9eb Adit Ranadive 2016-10-02 807 29c8d9eb Adit Ranadive 2016-10-02 808 ret = pvrdma_init_device(dev); 29c8d9eb Adit Ranadive 2016-10-02 809 if (ret) 29c8d9eb Adit Ranadive 2016-10-02 810 goto err_free_device; 29c8d9eb Adit Ranadive 2016-10-02 811 29c8d9eb Adit Ranadive 2016-10-02 812 dev->pdev = pdev; 29c8d9eb Adit Ranadive 2016-10-02 813 pci_set_drvdata(pdev, dev); 29c8d9eb Adit Ranadive 2016-10-02 814 29c8d9eb Adit Ranadive 2016-10-02 815 ret = pci_enable_device(pdev); 29c8d9eb Adit Ranadive 2016-10-02 816 if (ret) { 29c8d9eb Adit Ranadive 2016-10-02 817 dev_err(&pdev->dev, "cannot enable PCI device\n"); 29c8d9eb Adit Ranadive 2016-10-02 818 goto err_free_device; 29c8d9eb Adit Ranadive 2016-10-02 819 } 29c8d9eb Adit Ranadive 2016-10-02 820 29c8d9eb Adit Ranadive 2016-10-02 821 dev_dbg(&pdev->dev, "PCI resource flags BAR0 %#lx\n", 29c8d9eb Adit Ranadive 2016-10-02 822 pci_resource_flags(pdev, 0)); 29c8d9eb Adit Ranadive 2016-10-02 823 dev_dbg(&pdev->dev, "PCI resource len %#llx\n", 29c8d9eb Adit Ranadive 2016-10-02 824 (unsigned long long)pci_resource_len(pdev, 0)); 29c8d9eb Adit Ranadive 2016-10-02 825 dev_dbg(&pdev->dev, "PCI resource start %#llx\n", 29c8d9eb Adit Ranadive 2016-10-02 826 (unsigned long long)pci_resource_start(pdev, 0)); 29c8d9eb Adit Ranadive 2016-10-02 827 dev_dbg(&pdev->dev, "PCI resource flags BAR1 %#lx\n", 29c8d9eb Adit Ranadive 2016-10-02 828 pci_resource_flags(pdev, 1)); 29c8d9eb Adit Ranadive 2016-10-02 829 dev_dbg(&pdev->dev, "PCI resource len %#llx\n", 29c8d9eb Adit Ranadive 2016-10-02 830 (unsigned long long)pci_resource_len(pdev, 1)); 29c8d9eb Adit Ranadive 2016-10-02 831 dev_dbg(&pdev->dev, "PCI resource start %#llx\n", 29c8d9eb Adit Ranadive 2016-10-02 832 (unsigned long long)pci_resource_start(pdev, 1)); 29c8d9eb Adit Ranadive 2016-10-02 833 29c8d9eb Adit Ranadive 2016-10-02 834 if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM) || 29c8d9eb Adit Ranadive 2016-10-02 835 !(pci_resource_flags(pdev, 1) & IORESOURCE_MEM)) { 29c8d9eb Adit Ranadive 2016-10-02 836 dev_err(&pdev->dev, "PCI BAR region not MMIO\n"); 29c8d9eb Adit Ranadive 2016-10-02 837 ret = -ENOMEM; 29c8d9eb Adit Ranadive 2016-10-02 838 goto err_free_device; 29c8d9eb Adit Ranadive 2016-10-02 839 } 29c8d9eb Adit Ranadive 2016-10-02 840 29c8d9eb Adit Ranadive 2016-10-02 841 ret = pci_request_regions(pdev, DRV_NAME); 29c8d9eb Adit Ranadive 2016-10-02 842 if (ret) { 29c8d9eb Adit Ranadive 2016-10-02 843 dev_err(&pdev->dev, "cannot request PCI resources\n"); 29c8d9eb Adit Ranadive 2016-10-02 844 goto err_disable_pdev; 29c8d9eb Adit Ranadive 2016-10-02 845 } 29c8d9eb Adit Ranadive 2016-10-02 846 29c8d9eb Adit Ranadive 2016-10-02 847 /* Enable 64-Bit DMA */ 29c8d9eb Adit Ranadive 2016-10-02 848 if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) == 0) { 29c8d9eb Adit Ranadive 2016-10-02 849 ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)); 29c8d9eb Adit Ranadive 2016-10-02 850 if (ret != 0) { 29c8d9eb Adit Ranadive 2016-10-02 851 dev_err(&pdev->dev, 29c8d9eb Adit Ranadive 2016-10-02 852 "pci_set_consistent_dma_mask failed\n"); 29c8d9eb Adit Ranadive 2016-10-02 853 goto err_free_resource; 29c8d9eb Adit Ranadive 2016-10-02 854 } 29c8d9eb Adit Ranadive 2016-10-02 855 } else { 29c8d9eb Adit Ranadive 2016-10-02 856 ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); 29c8d9eb Adit Ranadive 2016-10-02 857 if (ret != 0) { 29c8d9eb Adit Ranadive 2016-10-02 858 dev_err(&pdev->dev, 29c8d9eb Adit Ranadive 2016-10-02 859 "pci_set_dma_mask failed\n"); 29c8d9eb Adit Ranadive 2016-10-02 860 goto err_free_resource; 29c8d9eb Adit Ranadive 2016-10-02 861 } 29c8d9eb Adit Ranadive 2016-10-02 862 } 29c8d9eb Adit Ranadive 2016-10-02 863 29c8d9eb Adit Ranadive 2016-10-02 864 pci_set_master(pdev); 29c8d9eb Adit Ranadive 2016-10-02 865 29c8d9eb Adit Ranadive 2016-10-02 866 /* Map register space */ 29c8d9eb Adit Ranadive 2016-10-02 867 start = pci_resource_start(dev->pdev, PVRDMA_PCI_RESOURCE_REG); 29c8d9eb Adit Ranadive 2016-10-02 868 len = pci_resource_len(dev->pdev, PVRDMA_PCI_RESOURCE_REG); 29c8d9eb Adit Ranadive 2016-10-02 869 dev->regs = ioremap(start, len); 29c8d9eb Adit Ranadive 2016-10-02 870 if (!dev->regs) { 29c8d9eb Adit Ranadive 2016-10-02 871 dev_err(&pdev->dev, "register mapping failed\n"); 29c8d9eb Adit Ranadive 2016-10-02 872 ret = -ENOMEM; 29c8d9eb Adit Ranadive 2016-10-02 873 goto err_free_resource; 29c8d9eb Adit Ranadive 2016-10-02 874 } 29c8d9eb Adit Ranadive 2016-10-02 875 29c8d9eb Adit Ranadive 2016-10-02 876 /* Setup per-device UAR. */ 29c8d9eb Adit Ranadive 2016-10-02 877 dev->driver_uar.index = 0; 29c8d9eb Adit Ranadive 2016-10-02 878 dev->driver_uar.pfn = 29c8d9eb Adit Ranadive 2016-10-02 879 pci_resource_start(dev->pdev, PVRDMA_PCI_RESOURCE_UAR) >> 29c8d9eb Adit Ranadive 2016-10-02 880 PAGE_SHIFT; 29c8d9eb Adit Ranadive 2016-10-02 881 dev->driver_uar.map = 29c8d9eb Adit Ranadive 2016-10-02 882 ioremap(dev->driver_uar.pfn << PAGE_SHIFT, PAGE_SIZE); 29c8d9eb Adit Ranadive 2016-10-02 883 if (!dev->driver_uar.map) { 29c8d9eb Adit Ranadive 2016-10-02 884 dev_err(&pdev->dev, "failed to remap UAR pages\n"); 29c8d9eb Adit Ranadive 2016-10-02 885 ret = -ENOMEM; 29c8d9eb Adit Ranadive 2016-10-02 886 goto err_unmap_regs; 29c8d9eb Adit Ranadive 2016-10-02 887 } 29c8d9eb Adit Ranadive 2016-10-02 888 05297b66 Bryan Tan 2017-08-22 889 dev->dsr_version = pvrdma_read_reg(dev, PVRDMA_REG_VERSION); 29c8d9eb Adit Ranadive 2016-10-02 890 dev_info(&pdev->dev, "device version %d, driver version %d\n", 05297b66 Bryan Tan 2017-08-22 891 dev->dsr_version, PVRDMA_VERSION); 29c8d9eb Adit Ranadive 2016-10-02 892 58355656 Himanshu Jha 2017-12-31 893 dev->dsr = dma_zalloc_coherent(&pdev->dev, sizeof(*dev->dsr), 29c8d9eb Adit Ranadive 2016-10-02 894 &dev->dsrbase, GFP_KERNEL); 29c8d9eb Adit Ranadive 2016-10-02 895 if (!dev->dsr) { 29c8d9eb Adit Ranadive 2016-10-02 896 dev_err(&pdev->dev, "failed to allocate shared region\n"); 29c8d9eb Adit Ranadive 2016-10-02 897 ret = -ENOMEM; 29c8d9eb Adit Ranadive 2016-10-02 898 goto err_uar_unmap; 29c8d9eb Adit Ranadive 2016-10-02 899 } 29c8d9eb Adit Ranadive 2016-10-02 900 29c8d9eb Adit Ranadive 2016-10-02 901 /* Setup the shared region */ 29c8d9eb Adit Ranadive 2016-10-02 902 dev->dsr->driver_version = PVRDMA_VERSION; 29c8d9eb Adit Ranadive 2016-10-02 903 dev->dsr->gos_info.gos_bits = sizeof(void *) == 4 ? 29c8d9eb Adit Ranadive 2016-10-02 904 PVRDMA_GOS_BITS_32 : 29c8d9eb Adit Ranadive 2016-10-02 905 PVRDMA_GOS_BITS_64; 29c8d9eb Adit Ranadive 2016-10-02 906 dev->dsr->gos_info.gos_type = PVRDMA_GOS_TYPE_LINUX; 29c8d9eb Adit Ranadive 2016-10-02 907 dev->dsr->gos_info.gos_ver = 1; 29c8d9eb Adit Ranadive 2016-10-02 908 dev->dsr->uar_pfn = dev->driver_uar.pfn; 29c8d9eb Adit Ranadive 2016-10-02 909 29c8d9eb Adit Ranadive 2016-10-02 910 /* Command slot. */ 29c8d9eb Adit Ranadive 2016-10-02 911 dev->cmd_slot = dma_alloc_coherent(&pdev->dev, PAGE_SIZE, 29c8d9eb Adit Ranadive 2016-10-02 912 &slot_dma, GFP_KERNEL); 29c8d9eb Adit Ranadive 2016-10-02 913 if (!dev->cmd_slot) { 29c8d9eb Adit Ranadive 2016-10-02 914 ret = -ENOMEM; 29c8d9eb Adit Ranadive 2016-10-02 915 goto err_free_dsr; 29c8d9eb Adit Ranadive 2016-10-02 916 } 29c8d9eb Adit Ranadive 2016-10-02 917 29c8d9eb Adit Ranadive 2016-10-02 918 dev->dsr->cmd_slot_dma = (u64)slot_dma; 29c8d9eb Adit Ranadive 2016-10-02 919 29c8d9eb Adit Ranadive 2016-10-02 920 /* Response slot. */ 29c8d9eb Adit Ranadive 2016-10-02 921 dev->resp_slot = dma_alloc_coherent(&pdev->dev, PAGE_SIZE, 29c8d9eb Adit Ranadive 2016-10-02 922 &slot_dma, GFP_KERNEL); 29c8d9eb Adit Ranadive 2016-10-02 923 if (!dev->resp_slot) { 29c8d9eb Adit Ranadive 2016-10-02 924 ret = -ENOMEM; 29c8d9eb Adit Ranadive 2016-10-02 925 goto err_free_slots; 29c8d9eb Adit Ranadive 2016-10-02 926 } 29c8d9eb Adit Ranadive 2016-10-02 927 29c8d9eb Adit Ranadive 2016-10-02 928 dev->dsr->resp_slot_dma = (u64)slot_dma; 29c8d9eb Adit Ranadive 2016-10-02 929 29c8d9eb Adit Ranadive 2016-10-02 930 /* Async event ring */ 6332dee8 Adit Ranadive 2017-02-22 931 dev->dsr->async_ring_pages.num_pages = PVRDMA_NUM_RING_PAGES; 29c8d9eb Adit Ranadive 2016-10-02 932 ret = pvrdma_page_dir_init(dev, &dev->async_pdir, 29c8d9eb Adit Ranadive 2016-10-02 933 dev->dsr->async_ring_pages.num_pages, true); 29c8d9eb Adit Ranadive 2016-10-02 934 if (ret) 29c8d9eb Adit Ranadive 2016-10-02 935 goto err_free_slots; 29c8d9eb Adit Ranadive 2016-10-02 936 dev->async_ring_state = dev->async_pdir.pages[0]; 29c8d9eb Adit Ranadive 2016-10-02 937 dev->dsr->async_ring_pages.pdir_dma = dev->async_pdir.dir_dma; 29c8d9eb Adit Ranadive 2016-10-02 938 29c8d9eb Adit Ranadive 2016-10-02 939 /* CQ notification ring */ 6332dee8 Adit Ranadive 2017-02-22 940 dev->dsr->cq_ring_pages.num_pages = PVRDMA_NUM_RING_PAGES; 29c8d9eb Adit Ranadive 2016-10-02 941 ret = pvrdma_page_dir_init(dev, &dev->cq_pdir, 29c8d9eb Adit Ranadive 2016-10-02 942 dev->dsr->cq_ring_pages.num_pages, true); 29c8d9eb Adit Ranadive 2016-10-02 943 if (ret) 29c8d9eb Adit Ranadive 2016-10-02 944 goto err_free_async_ring; 29c8d9eb Adit Ranadive 2016-10-02 945 dev->cq_ring_state = dev->cq_pdir.pages[0]; 29c8d9eb Adit Ranadive 2016-10-02 946 dev->dsr->cq_ring_pages.pdir_dma = dev->cq_pdir.dir_dma; 29c8d9eb Adit Ranadive 2016-10-02 947 29c8d9eb Adit Ranadive 2016-10-02 948 /* 29c8d9eb Adit Ranadive 2016-10-02 949 * Write the PA of the shared region to the device. The writes must be 29c8d9eb Adit Ranadive 2016-10-02 950 * ordered such that the high bits are written last. When the writes 29c8d9eb Adit Ranadive 2016-10-02 951 * complete, the device will have filled out the capabilities. 29c8d9eb Adit Ranadive 2016-10-02 952 */ 29c8d9eb Adit Ranadive 2016-10-02 953 29c8d9eb Adit Ranadive 2016-10-02 954 pvrdma_write_reg(dev, PVRDMA_REG_DSRLOW, (u32)dev->dsrbase); 29c8d9eb Adit Ranadive 2016-10-02 955 pvrdma_write_reg(dev, PVRDMA_REG_DSRHIGH, 29c8d9eb Adit Ranadive 2016-10-02 956 (u32)((u64)(dev->dsrbase) >> 32)); 29c8d9eb Adit Ranadive 2016-10-02 957 29c8d9eb Adit Ranadive 2016-10-02 958 /* Make sure the write is complete before reading status. */ 29c8d9eb Adit Ranadive 2016-10-02 959 mb(); 29c8d9eb Adit Ranadive 2016-10-02 960 05297b66 Bryan Tan 2017-08-22 961 /* The driver supports RoCE V1 and V2. */ 05297b66 Bryan Tan 2017-08-22 962 if (!PVRDMA_SUPPORTED(dev)) { 05297b66 Bryan Tan 2017-08-22 963 dev_err(&pdev->dev, "driver needs RoCE v1 or v2 support\n"); 29c8d9eb Adit Ranadive 2016-10-02 964 ret = -EFAULT; 29c8d9eb Adit Ranadive 2016-10-02 965 goto err_free_cq_ring; 29c8d9eb Adit Ranadive 2016-10-02 966 } 29c8d9eb Adit Ranadive 2016-10-02 967 29c8d9eb Adit Ranadive 2016-10-02 968 /* Paired vmxnet3 will have same bus, slot. But func will be 0 */ 29c8d9eb Adit Ranadive 2016-10-02 969 pdev_net = pci_get_slot(pdev->bus, PCI_DEVFN(PCI_SLOT(pdev->devfn), 0)); 29c8d9eb Adit Ranadive 2016-10-02 970 if (!pdev_net) { 29c8d9eb Adit Ranadive 2016-10-02 971 dev_err(&pdev->dev, "failed to find paired net device\n"); 29c8d9eb Adit Ranadive 2016-10-02 972 ret = -ENODEV; 29c8d9eb Adit Ranadive 2016-10-02 973 goto err_free_cq_ring; 29c8d9eb Adit Ranadive 2016-10-02 974 } 29c8d9eb Adit Ranadive 2016-10-02 975 29c8d9eb Adit Ranadive 2016-10-02 976 if (pdev_net->vendor != PCI_VENDOR_ID_VMWARE || 29c8d9eb Adit Ranadive 2016-10-02 977 pdev_net->device != PCI_DEVICE_ID_VMWARE_VMXNET3) { 29c8d9eb Adit Ranadive 2016-10-02 978 dev_err(&pdev->dev, "failed to find paired vmxnet3 device\n"); 29c8d9eb Adit Ranadive 2016-10-02 979 pci_dev_put(pdev_net); 29c8d9eb Adit Ranadive 2016-10-02 980 ret = -ENODEV; 29c8d9eb Adit Ranadive 2016-10-02 981 goto err_free_cq_ring; 29c8d9eb Adit Ranadive 2016-10-02 982 } 29c8d9eb Adit Ranadive 2016-10-02 983 29c8d9eb Adit Ranadive 2016-10-02 984 dev->netdev = pci_get_drvdata(pdev_net); d5bb424e Neil Horman 2018-06-28 @985 dev_hold(dev->netdev); ^^^^^^^^^^^^^^^^^^^^^ Dereferenced inside the function 29c8d9eb Adit Ranadive 2016-10-02 986 pci_dev_put(pdev_net); 29c8d9eb Adit Ranadive 2016-10-02 @987 if (!dev->netdev) { ^^^^^^^^^^^ Checked too late. 29c8d9eb Adit Ranadive 2016-10-02 988 dev_err(&pdev->dev, "failed to get vmxnet3 device\n"); 29c8d9eb Adit Ranadive 2016-10-02 989 ret = -ENODEV; 29c8d9eb Adit Ranadive 2016-10-02 990 goto err_free_cq_ring; 29c8d9eb Adit Ranadive 2016-10-02 991 } 29c8d9eb Adit Ranadive 2016-10-02 992 29c8d9eb Adit Ranadive 2016-10-02 993 dev_info(&pdev->dev, "paired device to %s\n", dev->netdev->name); 29c8d9eb Adit Ranadive 2016-10-02 994 29c8d9eb Adit Ranadive 2016-10-02 995 /* Interrupt setup */ 29c8d9eb Adit Ranadive 2016-10-02 996 ret = pvrdma_alloc_intrs(dev); 29c8d9eb Adit Ranadive 2016-10-02 997 if (ret) { 29c8d9eb Adit Ranadive 2016-10-02 998 dev_err(&pdev->dev, "failed to allocate interrupts\n"); 29c8d9eb Adit Ranadive 2016-10-02 999 ret = -ENOMEM; ff89b070 Adit Ranadive 2017-01-19 1000 goto err_free_cq_ring; 29c8d9eb Adit Ranadive 2016-10-02 1001 } 29c8d9eb Adit Ranadive 2016-10-02 1002 29c8d9eb Adit Ranadive 2016-10-02 1003 /* Allocate UAR table. */ 29c8d9eb Adit Ranadive 2016-10-02 1004 ret = pvrdma_uar_table_init(dev); 29c8d9eb Adit Ranadive 2016-10-02 1005 if (ret) { 29c8d9eb Adit Ranadive 2016-10-02 1006 dev_err(&pdev->dev, "failed to allocate UAR table\n"); 29c8d9eb Adit Ranadive 2016-10-02 1007 ret = -ENOMEM; 29c8d9eb Adit Ranadive 2016-10-02 1008 goto err_free_intrs; 29c8d9eb Adit Ranadive 2016-10-02 1009 } 29c8d9eb Adit Ranadive 2016-10-02 1010 29c8d9eb Adit Ranadive 2016-10-02 1011 /* Allocate GID table */ 29c8d9eb Adit Ranadive 2016-10-02 1012 dev->sgid_tbl = kcalloc(dev->dsr->caps.gid_tbl_len, 29c8d9eb Adit Ranadive 2016-10-02 1013 sizeof(union ib_gid), GFP_KERNEL); 29c8d9eb Adit Ranadive 2016-10-02 1014 if (!dev->sgid_tbl) { 29c8d9eb Adit Ranadive 2016-10-02 1015 ret = -ENOMEM; 29c8d9eb Adit Ranadive 2016-10-02 1016 goto err_free_uar_table; 29c8d9eb Adit Ranadive 2016-10-02 1017 } 29c8d9eb Adit Ranadive 2016-10-02 1018 dev_dbg(&pdev->dev, "gid table len %d\n", dev->dsr->caps.gid_tbl_len); 29c8d9eb Adit Ranadive 2016-10-02 1019 29c8d9eb Adit Ranadive 2016-10-02 1020 pvrdma_enable_intrs(dev); 29c8d9eb Adit Ranadive 2016-10-02 1021 29c8d9eb Adit Ranadive 2016-10-02 1022 /* Activate pvrdma device */ 29c8d9eb Adit Ranadive 2016-10-02 1023 pvrdma_write_reg(dev, PVRDMA_REG_CTL, PVRDMA_DEVICE_CTL_ACTIVATE); 29c8d9eb Adit Ranadive 2016-10-02 1024 29c8d9eb Adit Ranadive 2016-10-02 1025 /* Make sure the write is complete before reading status. */ 29c8d9eb Adit Ranadive 2016-10-02 1026 mb(); 29c8d9eb Adit Ranadive 2016-10-02 1027 29c8d9eb Adit Ranadive 2016-10-02 1028 /* Check if device was successfully activated */ 29c8d9eb Adit Ranadive 2016-10-02 1029 ret = pvrdma_read_reg(dev, PVRDMA_REG_ERR); 29c8d9eb Adit Ranadive 2016-10-02 1030 if (ret != 0) { 29c8d9eb Adit Ranadive 2016-10-02 1031 dev_err(&pdev->dev, "failed to activate device\n"); 29c8d9eb Adit Ranadive 2016-10-02 1032 ret = -EFAULT; 29c8d9eb Adit Ranadive 2016-10-02 1033 goto err_disable_intr; 29c8d9eb Adit Ranadive 2016-10-02 1034 } 29c8d9eb Adit Ranadive 2016-10-02 1035 29c8d9eb Adit Ranadive 2016-10-02 1036 /* Register IB device */ 29c8d9eb Adit Ranadive 2016-10-02 1037 ret = pvrdma_register_device(dev); 29c8d9eb Adit Ranadive 2016-10-02 1038 if (ret) { 29c8d9eb Adit Ranadive 2016-10-02 1039 dev_err(&pdev->dev, "failed to register IB device\n"); 29c8d9eb Adit Ranadive 2016-10-02 1040 goto err_disable_intr; 29c8d9eb Adit Ranadive 2016-10-02 1041 } 29c8d9eb Adit Ranadive 2016-10-02 1042 29c8d9eb Adit Ranadive 2016-10-02 1043 dev->nb_netdev.notifier_call = pvrdma_netdevice_event; 29c8d9eb Adit Ranadive 2016-10-02 1044 ret = register_netdevice_notifier(&dev->nb_netdev); 29c8d9eb Adit Ranadive 2016-10-02 1045 if (ret) { 29c8d9eb Adit Ranadive 2016-10-02 1046 dev_err(&pdev->dev, "failed to register netdevice events\n"); 29c8d9eb Adit Ranadive 2016-10-02 1047 goto err_unreg_ibdev; 29c8d9eb Adit Ranadive 2016-10-02 1048 } 29c8d9eb Adit Ranadive 2016-10-02 1049 29c8d9eb Adit Ranadive 2016-10-02 1050 dev_info(&pdev->dev, "attached to device\n"); 29c8d9eb Adit Ranadive 2016-10-02 1051 return 0; 29c8d9eb Adit Ranadive 2016-10-02 1052 29c8d9eb Adit Ranadive 2016-10-02 1053 err_unreg_ibdev: 29c8d9eb Adit Ranadive 2016-10-02 1054 ib_unregister_device(&dev->ib_dev); 29c8d9eb Adit Ranadive 2016-10-02 1055 err_disable_intr: 29c8d9eb Adit Ranadive 2016-10-02 1056 pvrdma_disable_intrs(dev); 29c8d9eb Adit Ranadive 2016-10-02 1057 kfree(dev->sgid_tbl); 29c8d9eb Adit Ranadive 2016-10-02 1058 err_free_uar_table: 29c8d9eb Adit Ranadive 2016-10-02 1059 pvrdma_uar_table_cleanup(dev); 29c8d9eb Adit Ranadive 2016-10-02 1060 err_free_intrs: 29c8d9eb Adit Ranadive 2016-10-02 1061 pvrdma_free_irq(dev); 7bf3976d Christoph Hellwig 2017-02-15 1062 pci_free_irq_vectors(pdev); 29c8d9eb Adit Ranadive 2016-10-02 1063 err_free_cq_ring: 29c8d9eb Adit Ranadive 2016-10-02 1064 pvrdma_page_dir_cleanup(dev, &dev->cq_pdir); 29c8d9eb Adit Ranadive 2016-10-02 1065 err_free_async_ring: 29c8d9eb Adit Ranadive 2016-10-02 1066 pvrdma_page_dir_cleanup(dev, &dev->async_pdir); 29c8d9eb Adit Ranadive 2016-10-02 1067 err_free_slots: 29c8d9eb Adit Ranadive 2016-10-02 1068 pvrdma_free_slots(dev); 29c8d9eb Adit Ranadive 2016-10-02 1069 err_free_dsr: 29c8d9eb Adit Ranadive 2016-10-02 1070 dma_free_coherent(&pdev->dev, sizeof(*dev->dsr), dev->dsr, 29c8d9eb Adit Ranadive 2016-10-02 1071 dev->dsrbase); 29c8d9eb Adit Ranadive 2016-10-02 1072 err_uar_unmap: 29c8d9eb Adit Ranadive 2016-10-02 1073 iounmap(dev->driver_uar.map); 29c8d9eb Adit Ranadive 2016-10-02 1074 err_unmap_regs: 29c8d9eb Adit Ranadive 2016-10-02 1075 iounmap(dev->regs); 29c8d9eb Adit Ranadive 2016-10-02 1076 err_free_resource: 29c8d9eb Adit Ranadive 2016-10-02 1077 pci_release_regions(pdev); 29c8d9eb Adit Ranadive 2016-10-02 1078 err_disable_pdev: 29c8d9eb Adit Ranadive 2016-10-02 1079 pci_disable_device(pdev); 29c8d9eb Adit Ranadive 2016-10-02 1080 pci_set_drvdata(pdev, NULL); 29c8d9eb Adit Ranadive 2016-10-02 1081 err_free_device: 29c8d9eb Adit Ranadive 2016-10-02 1082 mutex_lock(&pvrdma_device_list_lock); 29c8d9eb Adit Ranadive 2016-10-02 1083 list_del(&dev->device_link); 29c8d9eb Adit Ranadive 2016-10-02 1084 mutex_unlock(&pvrdma_device_list_lock); 29c8d9eb Adit Ranadive 2016-10-02 1085 ib_dealloc_device(&dev->ib_dev); 29c8d9eb Adit Ranadive 2016-10-02 1086 return ret; 29c8d9eb Adit Ranadive 2016-10-02 1087 } 29c8d9eb Adit Ranadive 2016-10-02 1088 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation