Skip to content

Commit

Permalink
RDMA/erdma: Minor refactor of device init flow
Browse files Browse the repository at this point in the history
After necessary configuration, driver should wait hardware finishing
initialization. The wait sets at CMDQ related function though it has
nothing to do with CMDQ. Refactor this part to make code cleaner.

Signed-off-by: Cheng Xu <chengyou@linux.alibaba.com>
Link: https://lore.kernel.org/r/20230322093319.84045-4-chengyou@linux.alibaba.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
  • Loading branch information
hz-cheng authored and rleon committed Mar 22, 2023
1 parent 72769db commit 901d9d6
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 32 deletions.
27 changes: 1 addition & 26 deletions drivers/infiniband/hw/erdma/erdma_cmdq.c
Original file line number Diff line number Diff line change
Expand Up @@ -182,9 +182,8 @@ static int erdma_cmdq_eq_init(struct erdma_dev *dev)

int erdma_cmdq_init(struct erdma_dev *dev)
{
int err, i;
struct erdma_cmdq *cmdq = &dev->cmdq;
u32 sts, ctrl;
int err;

cmdq->max_outstandings = ERDMA_CMDQ_MAX_OUTSTANDING;
cmdq->use_event = false;
Expand All @@ -207,34 +206,10 @@ int erdma_cmdq_init(struct erdma_dev *dev)
if (err)
goto err_destroy_cq;

ctrl = FIELD_PREP(ERDMA_REG_DEV_CTRL_INIT_MASK, 1);
erdma_reg_write32(dev, ERDMA_REGS_DEV_CTRL_REG, ctrl);

for (i = 0; i < ERDMA_WAIT_DEV_DONE_CNT; i++) {
sts = erdma_reg_read32_filed(dev, ERDMA_REGS_DEV_ST_REG,
ERDMA_REG_DEV_ST_INIT_DONE_MASK);
if (sts)
break;

msleep(ERDMA_REG_ACCESS_WAIT_MS);
}

if (i == ERDMA_WAIT_DEV_DONE_CNT) {
dev_err(&dev->pdev->dev, "wait init done failed.\n");
err = -ETIMEDOUT;
goto err_destroy_eq;
}

set_bit(ERDMA_CMDQ_STATE_OK_BIT, &cmdq->state);

return 0;

err_destroy_eq:
dma_free_coherent(&dev->pdev->dev,
(cmdq->eq.depth << EQE_SHIFT) +
ERDMA_EXTRA_BUFFER_SIZE,
cmdq->eq.qbuf, cmdq->eq.qbuf_dma_addr);

err_destroy_cq:
dma_free_coherent(&dev->pdev->dev,
(cmdq->cq.depth << CQE_SHIFT) +
Expand Down
39 changes: 33 additions & 6 deletions drivers/infiniband/hw/erdma/erdma_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -211,13 +211,36 @@ static int erdma_device_init(struct erdma_dev *dev, struct pci_dev *pdev)
return 0;
}

static void erdma_device_uninit(struct erdma_dev *dev)
static void erdma_hw_reset(struct erdma_dev *dev)
{
u32 ctrl = FIELD_PREP(ERDMA_REG_DEV_CTRL_RESET_MASK, 1);

erdma_reg_write32(dev, ERDMA_REGS_DEV_CTRL_REG, ctrl);
}

static int erdma_wait_hw_init_done(struct erdma_dev *dev)
{
int i;

erdma_reg_write32(dev, ERDMA_REGS_DEV_CTRL_REG,
FIELD_PREP(ERDMA_REG_DEV_CTRL_INIT_MASK, 1));

for (i = 0; i < ERDMA_WAIT_DEV_DONE_CNT; i++) {
if (erdma_reg_read32_filed(dev, ERDMA_REGS_DEV_ST_REG,
ERDMA_REG_DEV_ST_INIT_DONE_MASK))
break;

msleep(ERDMA_REG_ACCESS_WAIT_MS);
}

if (i == ERDMA_WAIT_DEV_DONE_CNT) {
dev_err(&dev->pdev->dev, "wait init done failed.\n");
return -ETIMEDOUT;
}

return 0;
}

static const struct pci_device_id erdma_pci_tbl[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_ALIBABA, 0x107f) },
{}
Expand Down Expand Up @@ -293,16 +316,22 @@ static int erdma_probe_dev(struct pci_dev *pdev)
if (err)
goto err_uninit_aeq;

err = erdma_ceqs_init(dev);
err = erdma_wait_hw_init_done(dev);
if (err)
goto err_uninit_cmdq;

err = erdma_ceqs_init(dev);
if (err)
goto err_reset_hw;

erdma_finish_cmdq_init(dev);

return 0;

err_reset_hw:
erdma_hw_reset(dev);

err_uninit_cmdq:
erdma_device_uninit(dev);
erdma_cmdq_destroy(dev);

err_uninit_aeq:
Expand Down Expand Up @@ -334,9 +363,7 @@ static void erdma_remove_dev(struct pci_dev *pdev)
struct erdma_dev *dev = pci_get_drvdata(pdev);

erdma_ceqs_uninit(dev);

erdma_device_uninit(dev);

erdma_hw_reset(dev);
erdma_cmdq_destroy(dev);
erdma_aeq_destroy(dev);
erdma_comm_irq_uninit(dev);
Expand Down

0 comments on commit 901d9d6

Please sign in to comment.