aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Johnston <markj@FreeBSD.org>2021-04-12 13:32:08 +0000
committerMark Johnston <markj@FreeBSD.org>2021-04-19 13:02:06 +0000
commit1d553a9e3a36760a5d366aad07c248570538435f (patch)
tree92d6fa3e82ff41f83faae5101286e77c705cb655
parent07f3c3b500479d4641cd30d450801470c4031551 (diff)
downloadsrc-1d553a9e3a36760a5d366aad07c248570538435f.tar.gz
src-1d553a9e3a36760a5d366aad07c248570538435f.zip
qlnxr: Properly initialize the Linux device structure
The driver needs to provide a LinuxKPI device structure to register itself with the IB subsystem. It was erroneously using a copy of its FreeBSD device structure for this purpose. Use linux_pci_attach_device() instead, following the example of the Chelsio iwarp driver. Also ensure that we don't leak the faked device during detach. Reviewed by: hselasky Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D29595 (cherry picked from commit 56cbd386fbaefc009541870ee013b2ff8d096bfc)
-rw-r--r--sys/dev/qlnx/qlnxr/qlnxr_def.h2
-rw-r--r--sys/dev/qlnx/qlnxr/qlnxr_os.c10
2 files changed, 5 insertions, 7 deletions
diff --git a/sys/dev/qlnx/qlnxr/qlnxr_def.h b/sys/dev/qlnx/qlnxr/qlnxr_def.h
index b08eab8a6c46..0d8d33dd2686 100644
--- a/sys/dev/qlnx/qlnxr/qlnxr_def.h
+++ b/sys/dev/qlnx/qlnxr/qlnxr_def.h
@@ -365,7 +365,7 @@ struct qlnxr_dev {
struct ecore_dev *cdev;
/* Added to extend Applications Support */
- struct pci_dev *pdev;
+ struct pci_dev pdev;
uint32_t dp_module;
uint8_t dp_level;
diff --git a/sys/dev/qlnx/qlnxr/qlnxr_os.c b/sys/dev/qlnx/qlnxr/qlnxr_os.c
index b6b56f58f166..62c0f2091d2f 100644
--- a/sys/dev/qlnx/qlnxr/qlnxr_os.c
+++ b/sys/dev/qlnx/qlnxr/qlnxr_os.c
@@ -257,7 +257,7 @@ qlnxr_register_device(qlnxr_dev_t *dev)
ibdev->post_recv = qlnxr_post_recv;
ibdev->process_mad = qlnxr_process_mad;
- ibdev->dma_device = &dev->pdev->dev;
+ ibdev->dma_device = &dev->pdev.dev;
ibdev->get_link_layer = qlnxr_link_layer;
@@ -1097,11 +1097,7 @@ qlnxr_add(void *eth_dev)
dev->ha = eth_dev;
dev->cdev = &ha->cdev;
/* Added to extend Application support */
- dev->pdev = kzalloc(sizeof(struct pci_dev), GFP_KERNEL);
-
- dev->pdev->dev = *(dev->ha->pci_dev);
- dev->pdev->device = pci_get_device(dev->ha->pci_dev);
- dev->pdev->vendor = pci_get_vendor(dev->ha->pci_dev);
+ linux_pci_attach_device(dev->ha->pci_dev, NULL, NULL, &dev->pdev);
dev->rdma_ctx = &ha->cdev.hwfns[0];
dev->wq_multiplier = wq_multiplier;
@@ -1210,6 +1206,8 @@ qlnxr_remove(void *eth_dev, void *qlnx_rdma_dev)
qlnxr_remove_sysfiles(dev);
ib_dealloc_device(&dev->ibdev);
+ linux_pci_detach_device(&dev->pdev);
+
QL_DPRINT12(ha, "exit ha = %p qlnx_rdma_dev = %p\n", ha, qlnx_rdma_dev);
return (0);
}