[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)));
}
/*