Re: [PATCH V11 net-next 04/10] net: hibmcge: Add interrupt supported in this module

From: Simon Horman
Date: Thu Oct 10 2024 - 06:22:15 EST


On Tue, Oct 08, 2024 at 10:23:52AM +0800, Jijie Shao wrote:
> The driver supports four interrupts: TX interrupt, RX interrupt,
> mdio interrupt, and error interrupt.
>
> Actually, the driver does not use the mdio interrupt.
> Therefore, the driver does not request the mdio interrupt.
>
> The error interrupt distinguishes different error information
> by using different masks. To distinguish different errors,
> the statistics count is added for each error.
>
> To ensure the consistency of the code process, masks are added for the
> TX interrupt and RX interrupt.
>
> This patch implements interrupt request, and provides a
> unified entry for the interrupt handler function. However,
> the specific interrupt handler function of each interrupt
> is not implemented currently.
>
> Because of pcim_enable_device(), the interrupt vector
> is already device managed and does not need to be free actively.
>
> Signed-off-by: Jijie Shao <shaojijie@xxxxxxxxxx>

...

> diff --git a/drivers/net/ethernet/hisilicon/hibmcge/hbg_irq.c b/drivers/net/ethernet/hisilicon/hibmcge/hbg_irq.c

...

> +static const char *irq_names_map[HBG_VECTOR_NUM] = { "tx", "rx", "err", "mdio" };
> +
> +int hbg_irq_init(struct hbg_priv *priv)
> +{
> + struct hbg_vector *vectors = &priv->vectors;
> + struct device *dev = &priv->pdev->dev;
> + int ret, id;
> + u32 i;
> +
> + /* used pcim_enable_device(), so the vectors become device managed */
> + ret = pci_alloc_irq_vectors(priv->pdev, HBG_VECTOR_NUM, HBG_VECTOR_NUM,
> + PCI_IRQ_MSI | PCI_IRQ_MSIX);
> + if (ret < 0)
> + return dev_err_probe(dev, ret, "failed to allocate MSI vectors\n");
> +
> + if (ret != HBG_VECTOR_NUM)
> + return dev_err_probe(dev, -EINVAL,
> + "requested %u MSI, but allocated %d MSI\n",
> + HBG_VECTOR_NUM, ret);
> +
> + /* mdio irq not requested, so the number of requested interrupts
> + * is HBG_VECTOR_NUM - 1.
> + */
> + for (i = 0; i < HBG_VECTOR_NUM - 1; i++) {
> + id = pci_irq_vector(priv->pdev, i);
> + if (id < 0)
> + return dev_err_probe(dev, id, "failed to get irq number\n");
> +
> + snprintf(vectors->name[i], sizeof(vectors->name[i]), "%s-%s-%s",
> + dev_driver_string(dev), pci_name(priv->pdev),
> + irq_names_map[i]);
> +
> + ret = devm_request_irq(dev, id, hbg_irq_handle, 0,
> + vectors->name[i], priv);
> + if (ret)
> + return dev_err_probe(dev, ret,
> + "failed to requset irq: %s\n",

nit: request

> + irq_names_map[i]);
> + }
> +
> + vectors->info_array = hbg_irqs;
> + vectors->info_array_len = ARRAY_SIZE(hbg_irqs);
> + return 0;
> +}

...