On Tue, 16 Mar 2021 20:18:22 +0800 Voon Weifeng wrote:
> From: Ong Boon Leong <boon.leong....@intel.com>
> 
> Intel mgbe controller supports multi-vector interrupts:
> msi_rx_vec    0,2,4,6,8,10,12,14
> msi_tx_vec    1,3,5,7,9,11,13,15
> msi_sfty_ue_vec       26
> msi_sfty_ce_vec       27
> msi_lpi_vec   28
> msi_mac_vec   29
> 
> During probe(), the driver will starts with request allocation for
> multi-vector interrupts. If it fails, then it will automatically fallback
> to request allocation for single interrupts.
> 
> Signed-off-by: Ong Boon Leong <boon.leong....@intel.com>
> Co-developed-by: Voon Weifeng <weifeng.v...@intel.com>
> Signed-off-by: Voon Weifeng <weifeng.v...@intel.com>

> +
> +static int stmmac_config_multi_msi(struct pci_dev *pdev,
> +                                struct plat_stmmacenet_data *plat,
> +                                struct stmmac_resources *res)
> +{
> +     int ret;
> +     int i;
> +
> +     ret = pci_alloc_irq_vectors(pdev, 2, STMMAC_MSI_VEC_MAX,
> +                                 PCI_IRQ_MSI | PCI_IRQ_MSIX);
> +     if (ret < 0) {
> +             dev_info(&pdev->dev, "%s: multi MSI enablement failed\n",
> +                      __func__);
> +             return ret;
> +     }
> +
> +     if (plat->msi_rx_base_vec >= STMMAC_MSI_VEC_MAX ||
> +         plat->msi_tx_base_vec >= STMMAC_MSI_VEC_MAX) {
> +             dev_info(&pdev->dev, "%s: Invalid RX & TX vector defined\n",
> +                      __func__);
> +             return -1;

free_irq_vectors?  Or move the check before alloc if possible.

> +     }


> @@ -699,6 +786,19 @@ static int intel_eth_pci_probe(struct pci_dev *pdev,
>               writel(tx_lpi_usec, res.addr + GMAC_1US_TIC_COUNTER);
>       }
>  
> +     ret = stmmac_config_multi_msi(pdev, plat, &res);
> +     if (!ret)
> +             goto msi_done;

Please don't use gotos where an if statement would do perfectly well.

> +     ret = stmmac_config_single_msi(pdev, plat, &res);
> +     if (ret) {
> +             dev_err(&pdev->dev, "%s: ERROR: failed to enable IRQ\n",
> +                     __func__);
> +             return ret;

return? isn't there some cleanup that needs to happen before exiting?

> +     }
> +
> +msi_done:
> +
>       ret = stmmac_dvr_probe(&pdev->dev, plat, &res);
>       if (ret) {
>               pci_free_irq_vectors(pdev);

Reply via email to