RDMA/irdma: Fix Passthrough mode in VM
authorMustafa Ismail <mustafa.ismail@intel.com>
Fri, 25 Feb 2022 16:32:10 +0000 (10:32 -0600)
committerJason Gunthorpe <jgg@nvidia.com>
Mon, 28 Feb 2022 16:07:40 +0000 (12:07 -0400)
Using PCI_FUNC macro in a VM, when the device is in passthrough mode does
not provide the real function instance. This means that currently, devices
will not probe unless the instance in the VM matches the instance in the
host.

Fix this by getting the pf_id from the LAN during the probe.

Fixes: 8498a30e1b94 ("RDMA/irdma: Register auxiliary driver and implement private channel OPs")
Link: https://lore.kernel.org/r/20220225163211.127-3-shiraz.saleem@intel.com
Signed-off-by: Mustafa Ismail <mustafa.ismail@intel.com>
Signed-off-by: Shiraz Saleem <shiraz.saleem@intel.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/hw/irdma/hw.c
drivers/infiniband/hw/irdma/i40iw_if.c
drivers/infiniband/hw/irdma/main.c
drivers/infiniband/hw/irdma/main.h

index 58cee86b4e35844dfdee57fcaf75a581647539a6..3dc9b5801da153659cedaca864e3926e70e49065 100644 (file)
@@ -1600,7 +1600,7 @@ static int irdma_initialize_dev(struct irdma_pci_f *rf)
        info.fpm_commit_buf = mem.va;
 
        info.bar0 = rf->hw.hw_addr;
-       info.hmc_fn_id = PCI_FUNC(rf->pcidev->devfn);
+       info.hmc_fn_id = rf->pf_id;
        info.hw = &rf->hw;
        status = irdma_sc_dev_init(rf->rdma_ver, &rf->sc_dev, &info);
        if (status)
index 8b5bd773da5a982326a1377020c85d59b73d7f0c..4053ead3241696ff6ef2f5d0029d068dfcedbf88 100644 (file)
@@ -77,6 +77,7 @@ static void i40iw_fill_device_info(struct irdma_device *iwdev, struct i40e_info
        rf->rdma_ver = IRDMA_GEN_1;
        rf->gen_ops.request_reset = i40iw_request_reset;
        rf->pcidev = cdev_info->pcidev;
+       rf->pf_id = cdev_info->fid;
        rf->hw.hw_addr = cdev_info->hw_addr;
        rf->cdev = cdev_info;
        rf->msix_count = cdev_info->msix_count;
index babbe8ad5afa00478fb0d25641e1ffa7ed34ea06..4f4c3454bc4320df52370a86ed5f8c84e14d47ec 100644 (file)
@@ -231,6 +231,7 @@ static void irdma_fill_device_info(struct irdma_device *iwdev, struct ice_pf *pf
        rf->hw.hw_addr = pf->hw.hw_addr;
        rf->pcidev = pf->pdev;
        rf->msix_count =  pf->num_rdma_msix;
+       rf->pf_id = pf->hw.pf_id;
        rf->msix_entries = &pf->msix_entries[pf->rdma_base_vector];
        rf->default_vsi.vsi_idx = vsi->vsi_num;
        rf->protocol_used = pf->rdma_mode & IIDC_RDMA_PROTOCOL_ROCEV2 ?
index 94c41f834c2569af108904c0e9b49e367ebf1539..44365d1dc7b2d894c88e33d1b44a682feace15bc 100644 (file)
@@ -256,6 +256,7 @@ struct irdma_pci_f {
        u8 *mem_rsrc;
        u8 rdma_ver;
        u8 rst_to;
+       u8 pf_id;
        enum irdma_protocol_used protocol_used;
        u32 sd_type;
        u32 msix_count;