[PATCH 6/9] RDMA/hfi2: Pass PCI device to hfi2_pcie_init()

Dennis Dalessandro <[email protected]> Mon, 03 Aug 2026 12:11:22 -0400
Newsgroups org.kernel.vger.linux-rdma
Message-ID <178577348237.1793053.5744992854633842264.stgit@awdrv-04>
hfi2_pcie_init() only needs the struct pci_dev to do its work, but
currently requires the full struct hfi2_devdata, which does not yet
exist at the point in probe where PCIe initialization is desired to
happen. Change the signature to take a struct pci_dev pointer
directly, and switch its internal error messages from dd_dev_err()
to dev_err() accordingly.

The JKR-specific AER unsupported-request masking call, previously
made from within hfi2_pcie_init() using dd->params->chip_type, is
moved to the call site in init_one() where dd and params are still
available, and mask_aer_unsupported_request() is exported for that
purpose.

Matches hfi1 fix b9cb5e81f7d9 ("RDMA/hfi1: Pass PCI device to
hfi1_pcie_init()").

Assisted-by: Claude:claude-sonnet-4-5
Signed-off-by: Dennis Dalessandro <[email protected]>
---
 drivers/infiniband/hw/hfi2/hfi2.h |    3 ++-
 drivers/infiniband/hw/hfi2/init.c |    4 +++-
 drivers/infiniband/hw/hfi2/pcie.c |   22 +++++++++++-----------
 3 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/drivers/infiniband/hw/hfi2/hfi2.h b/drivers/infiniband/hw/hfi2/hfi2.h
index 32a755c0d3d0..0939c45e51f3 100644
--- a/drivers/infiniband/hw/hfi2/hfi2.h
+++ b/drivers/infiniband/hw/hfi2/hfi2.h
@@ -2610,7 +2610,8 @@ void hfi2_verbs_unregister_sysfs(struct hfi2_devdata *dd);
 /* Hook for sysfs read of QSFP */
 int hfi2_qsfp_dump(struct hfi2_pportdata *ppd, char *buf, int len);
 
-int hfi2_pcie_init(struct hfi2_devdata *dd);
+int hfi2_pcie_init(struct pci_dev *pdev);
+void mask_aer_unsupported_request(struct pci_dev *pdev);
 void hfi2_pcie_cleanup(struct pci_dev *pdev);
 int hfi2_pcie_ddinit(struct hfi2_devdata *dd, struct pci_dev *pdev);
 void hfi2_pcie_ddcleanup(struct hfi2_devdata *dd);
diff --git a/drivers/infiniband/hw/hfi2/init.c b/drivers/infiniband/hw/hfi2/init.c
index ac5004cabd09..71ae134b5e86 100644
--- a/drivers/infiniband/hw/hfi2/init.c
+++ b/drivers/infiniband/hw/hfi2/init.c
@@ -2472,9 +2472,11 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 	/* restrict value of hfi2_rcvarr_split */
 	hfi2_rcvarr_split = clamp_val(hfi2_rcvarr_split, 0, 100);
 
-	ret = hfi2_pcie_init(dd);
+	ret = hfi2_pcie_init(pdev);
 	if (ret)
 		goto free_dd;
+	if (params->chip_type == CHIP_JKR)
+		mask_aer_unsupported_request(pdev);
 
 	ret = create_workqueues(dd);
 	if (ret)
diff --git a/drivers/infiniband/hw/hfi2/pcie.c b/drivers/infiniband/hw/hfi2/pcie.c
index e085b8cae020..b5b637fb6011 100644
--- a/drivers/infiniband/hw/hfi2/pcie.c
+++ b/drivers/infiniband/hw/hfi2/pcie.c
@@ -34,7 +34,7 @@ static int pcie_compl_to = PCI_EXP_COMP_TIMEOUT_RANGE_C |
  * Prevent upstream errors from being reported if a software stray read
  * occurs in a write-only BAR range.
  */
-static void mask_aer_unsupported_request(struct pci_dev *pdev)
+void mask_aer_unsupported_request(struct pci_dev *pdev)
 {
 	u32 mask;
 	int aer;
@@ -52,10 +52,9 @@ static void mask_aer_unsupported_request(struct pci_dev *pdev)
 /*
  * Do all the common PCIe setup and initialization.
  */
-int hfi2_pcie_init(struct hfi2_devdata *dd)
+int hfi2_pcie_init(struct pci_dev *pdev)
 {
 	int ret;
-	struct pci_dev *pdev = dd->pcidev;
 
 	ret = pci_enable_device(pdev);
 	if (ret) {
@@ -71,19 +70,19 @@ int hfi2_pcie_init(struct hfi2_devdata *dd)
 		 * about that, it appears.  If the original BAR was retained
 		 * in the kernel data structures, this may be OK.
 		 */
-		dd_dev_err(dd, "pci enable failed: error %d\n", -ret);
+		dev_err(&pdev->dev, "pci enable failed: error %pe\n",
+			ERR_PTR(ret));
 		return ret;
 	}
 
 	ret = pci_request_regions(pdev, DRIVER_NAME);
 	if (ret) {
-		dd_dev_err(dd, "pci_request_regions fails: err %d\n", -ret);
+		dev_err(&pdev->dev, "pci_request_regions fails: err %pe\n",
+			ERR_PTR(ret));
 		goto bail;
 	}
 
 	pci_set_master(pdev);
-	if (dd->params->chip_type == CHIP_JKR)
-		mask_aer_unsupported_request(pdev);
 	return 0;
 
 bail:
@@ -843,7 +842,7 @@ static void pcie_post_steps(struct hfi2_devdata *dd)
 	 */
 	for (i = 0; i < NUM_PCIE_SERDES; i++) {
 		hfi2_sbus_request(dd, hfi2_pcie_pcs_addrs[dd->hfi2_id][i], 0x03,
-			     WRITE_SBUS_RECEIVER, 0x00022132);
+				  WRITE_SBUS_RECEIVER, 0x00022132);
 	}
 
 	hfi2_clear_sbus_fast_mode(dd);
@@ -889,9 +888,10 @@ static int trigger_sbr(struct hfi2_devdata *dd)
 static void write_gasket_interrupt(struct hfi2_devdata *dd, int index, u16 code,
 				   u16 data)
 {
-	hfi2_write_csr(dd, ASIC_PCIE_SD_INTRPT_LIST + (index * 8),
-		  (((u64)code << ASIC_PCIE_SD_INTRPT_LIST_INTRPT_CODE_SHIFT) |
-		   ((u64)data << ASIC_PCIE_SD_INTRPT_LIST_INTRPT_DATA_SHIFT)));
+	hfi2_write_csr(
+		dd, ASIC_PCIE_SD_INTRPT_LIST + (index * 8),
+		(((u64)code << ASIC_PCIE_SD_INTRPT_LIST_INTRPT_CODE_SHIFT) |
+		 ((u64)data << ASIC_PCIE_SD_INTRPT_LIST_INTRPT_DATA_SHIFT)));
 }
 
 /*