Hi Damien, the V3 patch applies to the for-6.15 branch with just an offset. Can you take it as it is or do you want me to resend? Regards, Tomas On 1/15/25 4:08 PM, Tomas Henzl wrote: > On 1/15/25 3:30 AM, Damien Le Moal wrote: >> On 1/15/25 03:29, Tomas Henzl wrote: >>> by removing few lines. No functional change. >>> >>> The main part of this change is done by adding a PCI_IRQ_INTX flag into >>> an already existing pci_alloc_irq_vectors invocation. >>> In the current implementation of the pci_alloc_irq_vectors is the sequence of calls >>> msi-x -> msi -> legacy irq and whatever there succeeds stops the >>> call chain. That makes it impossible to merge all instances into as a single call >>> to pci_alloc_irq_vectors since the order of calls there is: >>> multiple msi-x >>> a single msi >>> a single msi-x >>> a legacy irq. >>> but the two last steps can be merged into one which are the msi-x and legacy >>> irq option. With this change we remove a pci(m)_intx call. >>> When PCI_IRQ_INTX flag is set the pci_alloc_irq_vectors succeeds in almost >>> all cases - that makes it possible to convert ahci_init_irq(msi) into a void function. >>> The exception is when dev->irq is zero then the pci_alloc_irq_vectors >>> may return with an error code also pci_intx isn't called from pci_alloc_irq_vectors >>> and thus certain pci calls aren't performed. >>> That's just a negligible issue as later in ahci_init_one the (zero) >>> value of dev->irq is via pci_irq_vector assigned to hpriv->irq. >>> That value is then later tested in ahci_host_activate->ata_host_activate where >>> it is welcomed with a WARN_ON message and fails with setting up irq and >>> then the probe function (ahci_init_one) fails. The special zero value's >>> meaning is that polling mode is being be set up which isn't the case. >>> >> >> Extra blank line not need here. >> >> Beside that, looks OK now. But as Niklas pointed out, this conflicts with a >> patch in the PCI tree. And given that it is too late to queue that for 6.14, can >> you resend a rebased version once 6.14-rc1 is out in a couple of weeks ? > > I can do that, thanks. > >> >> Thanks ! >> >>> >>> Signed-off-by: Tomas Henzl <thenzl@xxxxxxxxxx> >>> --- >>> V2: ahci_init_irq is now a void function >>> V3: a) added an explanation of why we may convert ahci_init_irq into >>> a void function >>> b) fixed the subject line >>> c) added an explanation of why calling pci_alloc_irq_vectors instead >>> of pci_intx is safe >>> d) rebased to latest code state (pci_intx->pcim_intx) >>> >>> drivers/ata/ahci.c | 23 ++++++++++++----------- >>> 1 file changed, 12 insertions(+), 11 deletions(-) >>> >>> diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c >>> index 8d27c567be1c..3ea2f3adf354 100644 >>> --- a/drivers/ata/ahci.c >>> +++ b/drivers/ata/ahci.c >>> @@ -1665,13 +1665,15 @@ static int ahci_get_irq_vector(struct ata_host *host, int port) >>> return pci_irq_vector(to_pci_dev(host->dev), port); >>> } >>> >>> -static int ahci_init_msi(struct pci_dev *pdev, unsigned int n_ports, >>> +static void ahci_init_irq(struct pci_dev *pdev, unsigned int n_ports, >>> struct ahci_host_priv *hpriv) >>> { >>> int nvec; >>> >>> - if (hpriv->flags & AHCI_HFLAG_NO_MSI) >>> - return -ENODEV; >>> + if (hpriv->flags & AHCI_HFLAG_NO_MSI) { >>> + pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_INTX); >>> + return; >>> + } >>> >>> /* >>> * If number of MSIs is less than number of ports then Sharing Last >>> @@ -1685,7 +1687,7 @@ static int ahci_init_msi(struct pci_dev *pdev, unsigned int n_ports, >>> if (!(readl(hpriv->mmio + HOST_CTL) & HOST_MRSM)) { >>> hpriv->get_irq_vector = ahci_get_irq_vector; >>> hpriv->flags |= AHCI_HFLAG_MULTI_MSI; >>> - return nvec; >>> + return; >>> } >>> >>> /* >>> @@ -1700,12 +1702,13 @@ static int ahci_init_msi(struct pci_dev *pdev, unsigned int n_ports, >>> >>> /* >>> * If the host is not capable of supporting per-port vectors, fall >>> - * back to single MSI before finally attempting single MSI-X. >>> + * back to single MSI before finally attempting single MSI-X or >>> + * a legacy INTx. >>> */ >>> nvec = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI); >>> if (nvec == 1) >>> - return nvec; >>> - return pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSIX); >>> + return; >>> + pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSIX | PCI_IRQ_INTX); >>> } >>> >>> static void ahci_mark_external_port(struct ata_port *ap) >>> @@ -1985,10 +1988,8 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) >>> } >>> host->private_data = hpriv; >>> >>> - if (ahci_init_msi(pdev, n_ports, hpriv) < 0) { >>> - /* legacy intx interrupts */ >>> - pcim_intx(pdev, 1); >>> - } >>> + ahci_init_irq(pdev, n_ports, hpriv); >>> + >>> hpriv->irq = pci_irq_vector(pdev, 0); >>> >>> if (!(hpriv->cap & HOST_CAP_SSS) || ahci_ignore_sss) >> >> >