From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932953AbcI3JkT (ORCPT ); Fri, 30 Sep 2016 05:40:19 -0400 Received: from mail-sn1nam01on0082.outbound.protection.outlook.com ([104.47.32.82]:46944 "EHLO NAM01-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932088AbcI3JkJ (ORCPT ); Fri, 30 Sep 2016 05:40:09 -0400 X-Greylist: delayed 972 seconds by postgrey-1.27 at vger.kernel.org; Fri, 30 Sep 2016 05:40:09 EDT Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com;nxp.com; dkim=none (message not signed) header.d=none; From: Po Liu To: , , , CC: Bjorn Helgaas , Shawn Guo , Marc Zyngier , Rob Herring , "Roy Zang" , Mingkai Hu , Stuart Yoder , Yang-Leo Li , Arnd Bergmann , Minghuan Lian , Murali Karicheri , Po Liu Subject: [PATCH v6 3/3] pci:add support aer/pme interrupts with none MSI/MSI-X/INTx mode Date: Fri, 30 Sep 2016 17:11:37 +0800 Message-ID: <1475226697-7709-3-git-send-email-po.liu@nxp.com> X-Mailer: git-send-email 2.1.0.27.g96db324 In-Reply-To: <1475226697-7709-1-git-send-email-po.liu@nxp.com> References: <1473741659-17618-3-git-send-email-po.liu@nxp.com> <1475226697-7709-1-git-send-email-po.liu@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131197010478343392;(91ab9b29-cfa4-454e-5278-08d120cd25b8);() X-Forefront-Antispam-Report: CIP:192.88.158.2;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(7916002)(2980300002)(1110001)(1109001)(339900001)(189002)(199003)(81156014)(86362001)(626004)(81166006)(68736007)(586003)(5001770100001)(2201001)(33646002)(229853001)(97736004)(305945005)(87936001)(85426001)(8676002)(69596002)(50986999)(19580405001)(19580395003)(8936002)(6666003)(7416002)(76176999)(2950100002)(5660300001)(356003)(50226002)(8666005)(47776003)(189998001)(92566002)(575784001)(77096005)(50466002)(105606002)(104016004)(48376002)(36756003)(4326007)(106466001)(5003940100001)(7846002)(2906002)(7059030)(2101003);DIR:OUT;SFP:1101;SCL:1;SRVR:BY2PR0301MB2008;H:az84smr01.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BN1AFFO11FD033;1:cDO5ZFxXaNKxRxlDR8BD1UXdEba5heu6ZLJP0pG/MncWm1tSPBrp4nASzP2Pn4hL5ZPj1+/DBsuioICeVWdtgaZ/nry4KKf3KkNiKnf1G4YcMsuGbuifTmopLWRXsd3GZjMIM9TeHrc37IQ4354zThAFTqbapiNkaCpHikGCSrvrUuEy4YqfZgwaaqNirrLWnk6LARlRblOoVw6GWgFegi0aEMbhaJcNLz14MP8cphW02QJsTcEES0cMX4b9XMshVmZ3fO0/Bob6UOqWLjbXE78nDInnR575D36m3r69f8aWWGLZ8TJE2BsFjid1UgTnfAiQiEmcXIkQIi1iP/bpo4SWuGGnBOYpxHWuNxV568Ec1Aa/PQMfo05YgdeuYFUssJWz+pk25t/LwrKSqHx3M6AIDgZblxBixrN6Efh5Va5pbK5LNN8yvmiDO9TNIShigbBqOilfHvhujl4bKLXfl19USyXKkVAWJpH0siipEuK9KC6jPOOFynTNub1u3mdA1CIb12TUsuG5KGkKBwaOmyn/0/GLv6X+Q5sXe9rdb9npiUTXmHW8vIGJ1yrmnH0atKhS8K+oqRbt7sgF5jdFkl7yFh1LTxSv9GS3T7mO22JK9SGgkmsJeX82xGA5ko9H1eiAQXWdVubeGLYJGnsvhmgQaS/vMPivpdDYXcmlo5ynoOjfbQcxCk5X+teY0TaucsTi3yXvC5yhaeHNlq1eqoGYzN634xtUvmULGhC8jS5DacgNPjeevbNtEXg79/FI MIME-Version: 1.0 Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: ec719598-e2c9-4fe9-e21c-08d3e9138799 X-Microsoft-Exchange-Diagnostics: 1;BY2PR0301MB2008;2:Kh80D0p96YAHnwKmL5BRQIo/9oaLCkasRpdWxefa+pTiyNyEdW3o0pigGz3wLrV0aFPOsRXp695CecGOkz/P5N0Eu9RrRBoeZFBFbApLLb3qH4eFdsfMFVEB6LWZMgD6AeYWyv5zEtL2C+fbxkDBu31Ve/dDsRvwT3wWEvOTa+93cVww7MMaX9faK/ZYfsau;3:ODNz/bJ4nM8S6kRs1sCMfoq+jvWXO6G2/A21ogpJh0hX2uNLtbp/HpfpVqJryhzB395IWpnwf0d6BUxrWODrC2ZKKxrKug/snD+XPa0mbo+ekrEDo32VZv09PR7Ua+LBRz8+EuA6BmFBeod12ZYdRLkzfdeQlSh9FZdp8K37+kPvnbIQ9HzOICy8oCBSk8yx+oIHIxHWaHTSOeBYZWf56jjmnRD3e9M/3VoDzdvuAyQ= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY2PR0301MB2008; X-Microsoft-Exchange-Diagnostics: 1;BY2PR0301MB2008;25:r69FMmlMlg2LWLlhMWK5Fv+gvi3rvC5SNlr5pOlePFKWizelbMmIR51nH2t3H54Kb5jMs8CUSgTReRtmS4viQuI8pd4Aq2uA7Gkqi8noIo3+GonIYDtnVsuSxp1Y//sKkuA+WJcCY6sh5X6vf5etDgkTjiu2whYnEGhBZZ79GO055nMMJJniBncQbpTt3T2sTrdGOyJR6Bd0jPjNSG2nEIMEN2By1SjMvTM5Tsd6L7FzNLSei9RlynfSwipwRTnCYsPnyM3wze05MShTj2FLLkAsiLIwqJC2crygFHCPwIiv9Mb7WAybRNY5Ef8yOUIOZR4/FidaaS7eF3hsr7Kqy2MCChhwmNpujSftle9tnFgxto3BYI6SVvQS2Krfo75B4xbrHe67eOIJIW6+J9CsOv0GM/EIwEQz1MWVSp+PT0Kd1NRJ6wKuFh6gjbjjPkJATTXa7kjoJ4Kpa9vrVzMUIjmNh7iOUnKV4zoV/g2mKGS3MPBdJjQpMoeoCGb1xqFVafk8SGThAoXedC4Q6ASTkWWbwyEnWzG65mrJ/0wr7u9wDguFA2Q46MlnVsmfL8UPAsm4PVxJZeo3RBvd5BamBCXzzs+48EFLcEpw6ltyqWM9s2HbUkPLPMPjN4flHLIFlsysNvSGFLP+qnlH4aETrjaF/mS5rZUF0U2E2iA1oQuOTJD0t3w99Sb2SriS9GHgDfdI3/GDbiVEE1pDQh/TtH7VrCMakJIkmzAUk1+egw3lGlsmculf7VRmhg4tF2n1 X-Microsoft-Exchange-Diagnostics: 1;BY2PR0301MB2008;31:W3A6j0LCmQJhIlb4O02uOlg3cx+dAfc1BogXHIWWkYvf/JfFnz9G3mf4xcDQSRcxeoTQG2bhrREG/yiPpxX5WwxrWgeyhkfJWAvPlg0ndW5pBcizBVkSrWyaxkJr0qAvWxLuFNM74pB7lNUWjeYVosY/kHGe7X7eEFGAG9PM1s8haxL7k5dBX0ki4P16IUy/IDmBUF2J9+tPbxvp6l4+qvq7WLYQrHCP3LoiRdEuC2I=;4:iElB7rPCtaMWmH0c0npEJqBvOhAJijblzcWgCMtjiZalBNXC2Biwb+/hmFTU+XmTST8zJchfYX7rUMoxf2vcQ5JpR1EI0YQmFYBFd0qwKJdxOJf0WuUmkGSeOVF4xIfbkcb/gtjEm4jxOIRyGtCiAVvbRVCTtKJkdXxgxgjd1TwlK3ab+Oc5+lhQfayFC+OfAbICQym7uixX3ns8ktxBlvgZDq2/UMyv5Vak1yTXp0BfRZgl6rkWcHRuyayQJ8NefGXMgcLSw31ZfhvhutsBOmTmE2g3ErXCNqpCt7dy7LrUPevQvrwbNIkvhiQe6dP9Wdz+PgC7Fp60NsJQwxeSmpb40RTRecl9DerLOV0qC3tRnYQPU1IP8nw8PDLwdriVNte9XmP2zEuIGrB3fr5Ub8quAr508DPRxdzoIwOSTqBObKAaSPxnU63oE08GFFP1lTDW7sFnqiSaQRQN3hTvP9t2rQ7lxs8jfCrtCf+aQPzxDr0zHOkYo84+g0k77/hnB5smP37km6WuIzKUF7sferl/RUNW5w6IPfMd6+oQQmk= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(13023025)(13017025)(13015025)(13018025)(13024025)(8121501046)(5005006)(3002001)(10201501046)(6055026);SRVR:BY2PR0301MB2008;BCL:0;PCL:0;RULEID:(400006);SRVR:BY2PR0301MB2008; X-Forefront-PRVS: 008184426E X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BY2PR0301MB2008;23:XehiPFqMBgL8f7wBfwZCMzqUA08yhqMkPs2hYHc?= =?us-ascii?Q?2gse4dRQ9/Y4a7UKUKWwdt2JZS+gI2fmy7CO5u+W6MV6UW9cqvlSrhKpbaL/?= =?us-ascii?Q?7CpRIRyl+65RmlcVPF6PS1VZhN6arh4D4YisSYOUoMWmWJ8q4TUGw73rBk8M?= =?us-ascii?Q?20bk14kBNIBbZOZxxVLo2wN0KOcf7OwK57Q/uHVbfJWd61c3iZyci78Cy9UY?= =?us-ascii?Q?bGT7ji6s8TDy/+zueohwPtwa7vgJ/x760wkcf1ibTfTrG3FfWGglRGcqUJX0?= =?us-ascii?Q?J3f4h8BWYaayKxcTLi3UacEp5HaGaSUxM/9japC9OZbdODBbOdWe1MvIqJXD?= =?us-ascii?Q?Yll078gVySM8h2IAWm+YNda/zC8B/3xVUuHaVZcpdRLPJ4501E+FZw3gccM2?= =?us-ascii?Q?gUQi0oSfyNP3mDDBwE7fja3inflpjHtTYvS8PJP/nc28f7lAugPTp0xsA+42?= =?us-ascii?Q?/SC5l/NvZKZcYtFM4S20KRPd13XYnpftZfZ8TDN0XFXCcOGlNN22NLhilq2X?= =?us-ascii?Q?Yx91BDPAzgNlhLgKUoW/LlryAeLkw7JTk/XQuzfq8vRdrhRRSMx00STCHNCQ?= =?us-ascii?Q?X+0BmBrJ9YGRlOxK3cz4n8KJJbrrS6Bu4dfD/TKJrgyqYsLtPs1vDSkskhL9?= =?us-ascii?Q?IerMiaNjTFjRS0Bqbc50kd80/ddvOeN39OX8A5WWxtLYERSm+zg6HjXPEzXZ?= =?us-ascii?Q?jcraq8dX+nouuGiPqCYC0X5/8FO0mhqG3rtI/l90tG4ysLa0vWxZ0gC0P01t?= =?us-ascii?Q?87U8ff5ATScDbI/UccMKmykeEOYI6D8rUXZSKWTuYnKzIv8hb3EPog2AUwuP?= =?us-ascii?Q?zCK30NYulRoOPVSEYMK5IpfKML/RfqP0N26Bnxv7dwKWia59VQ/DibbiM6eE?= =?us-ascii?Q?3ddugx9o7WJeciceYHJJYJ695GcJpQUpErQU8/yVwsWHKsNRDxnpkzh0IjIf?= =?us-ascii?Q?3BSFiR6iKalXRc64X7/yq4slhIXuVBC6tuqcq+QtXzbgi8NQnWbD0uNR95T9?= =?us-ascii?Q?B1WYGrbUXDXufd9EPIjaYVbfYmupwDnp4EjSX1nNJbpXTXB/edttqqGomHYe?= =?us-ascii?Q?/zrkZQxTdhbz8K8tBM2h7oMEBfNr1Vu4fSGcVfXN65cIF0U9tF6Q2U7MdR8r?= =?us-ascii?Q?2c8zqhVg5szW8kMSNjmvDBAJInijmAn2oaY+v709WnM4bxknVg++CYCYIS9R?= =?us-ascii?Q?qhBmj2wZGVJe9UgYwFty4F7EmGU7ErKRBb0Cd9mSAXvzzwWd0QuQJ2aAKPHM?= =?us-ascii?Q?MeBUxy97siUy/zRETlQzllSZYTNovc3nP/f9n+vcF?= X-Microsoft-Exchange-Diagnostics: 1;BY2PR0301MB2008;6:S0wQHOZ/KOgWh2DtD+x0FOofMPIQbQZXmOMUCq0SsAyROXZ2hC78o78l2exnhVG4jt+RxyxAajdFjiesJKfnTl2PwL/5+eOJD95De5i8G28rcr7tiqyNIRMowiwYGuNWRyEvz75J6edJiCKKyaQXhWiysWh41CaDhQB1lsnnJ7GC8eQW2p6G/RzXqiPUtcZyy+55s6NHajspomH6q61tdvpVhpA9+zSciZnG9XKHPr4NMr8i+unuLU+3SEaoooq9zEaabZFyTlzcOKtSDehsV975bj+pHsapJ2J9D3sF6OY=;5:8d4xM730L0EVaKaly4EmpqZ89rqyhcj06nxmSazCMHxjFq18/C5eU7fsbKBVXc3HlD3A9bBG6zItLBHnqQC9TQQbhFY2pPn6WZECXi677HB0aosjgfy98jLe2rezbI5RO/x5F+nbV83mX8g0KP4M4G4TgyLFuJOASd5/V27UPEc=;24:WZq0xeHySMSWfY9ZwJf3QwHhFjK70WJez5PaOVB+TxrWIJVD06YoqMo5t7QXl+ZKQC8/VqIqalQbu1i+qLpxnCykj4yPwiRrXV8Zl6TTphI=;7:2pgEjWV76ZtyeFCCgoa6BCNPm8jjcVXpp5s+YGbSSOY3lvNV524e51foLPrtGw9RuA3PMp1Fowwqnmt3SHE4NrensAb5CLt9fwQ6YG0895Tbs0bSVZcU5YYaHDW5WB4kMMYJlD12QZmsrn2gY5lRcRaYqewMbDqX8BsBMLSZ193mcWDKKpBQswvMKkJihSM25mytPlV6wKfd8jhscVj0ono/2kfo1xo0WwlYJ3Z9bJH7EIZEGJ75ZtfgirAFbzv3gIBDPQ24wR2eem3KkTrCj5wPFqR039WCVXeHjJAlclErUL8BzhOwWLCkHFbcgF1N SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Sep 2016 09:24:01.7346 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e;Ip=[192.88.158.2];Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR0301MB2008 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On some platforms, root port doesn't support MSI/MSI-X/INTx in RC mode. When chip support the aer/pme interrupts with none MSI/MSI-X/INTx mode, maybe there is interrupt line for aer pme etc. Search the interrupt number in the fdt file. Then fixup the dev->irq with it. Signed-off-by: Po Liu --- changes for v6: - modify bindings for "aer""pme"; - changing to the hood method to implement the aer pme interrupt; - add pme interrupt in the same way; .../devicetree/bindings/pci/layerscape-pci.txt | 13 +++++-- arch/arm/kernel/bios32.c | 43 ++++++++++++++++++++++ arch/arm64/kernel/pci.c | 43 ++++++++++++++++++++++ drivers/pci/pcie/portdrv_core.c | 31 +++++++++++++++- include/linux/pci.h | 1 + 5 files changed, 126 insertions(+), 5 deletions(-) diff --git a/Documentation/devicetree/bindings/pci/layerscape-pci.txt b/Documentation/devicetree/bindings/pci/layerscape-pci.txt index 41e9f55..51ed49e 100644 --- a/Documentation/devicetree/bindings/pci/layerscape-pci.txt +++ b/Documentation/devicetree/bindings/pci/layerscape-pci.txt @@ -18,8 +18,12 @@ Required properties: - reg: base addresses and lengths of the PCIe controller - interrupts: A list of interrupt outputs of the controller. Must contain an entry for each entry in the interrupt-names property. -- interrupt-names: Must include the following entries: - "intr": The interrupt that is asserted for controller interrupts +- interrupt-names: It could include the following entries: + "aer": Asserted for aer interrupt when chip support the aer interrupt with + none MSI/MSI-X/INTx mode,but there is interrupt line for aer. + "pme": Asserted for pme interrupt when chip support the pme interrupt with + none MSI/MSI-X/INTx mode,but there is interrupt line for pme. + ...... - fsl,pcie-scfg: Must include two entries. The first entry must be a link to the SCFG device node The second entry must be '0' or '1' based on physical PCIe controller index. @@ -35,8 +39,9 @@ Example: reg = <0x00 0x03400000 0x0 0x00010000 /* controller registers */ 0x40 0x00000000 0x0 0x00002000>; /* configuration space */ reg-names = "regs", "config"; - interrupts = ; /* controller interrupt */ - interrupt-names = "intr"; + interrupts = , /* aer interrupt */ + ; /* pme interrupt */ + interrupt-names = "aer", "pme"; fsl,pcie-scfg = <&scfg 0>; #address-cells = <3>; #size-cells = <2>; diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c index 2f0e077..d2f4869 100644 --- a/arch/arm/kernel/bios32.c +++ b/arch/arm/kernel/bios32.c @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include #include @@ -64,6 +66,47 @@ void pcibios_report_status(u_int status_mask, int warn) } /* + * Check device tree if the service interrupts are there + */ +int pcibios_check_service_irqs(struct pci_dev *dev, int *irqs, int mask) +{ + int ret, count = 0; + struct device_node *np = NULL; + + if (dev->bus->dev.of_node) + np = dev->bus->dev.of_node; + + if (np == NULL) + return 0; + + if (!IS_ENABLED(CONFIG_OF_IRQ)) + return 0; + + /* If root port doesn't support MSI/MSI-X/INTx in RC mode, + * request irq for aer + */ + if (mask & PCIE_PORT_SERVICE_AER) { + ret = of_irq_get_byname(np, "aer"); + if (ret > 0) { + irqs[PCIE_PORT_SERVICE_AER_SHIFT] = ret; + count++; + } + } + + if (mask & PCIE_PORT_SERVICE_PME) { + ret = of_irq_get_byname(np, "pme"); + if (ret > 0) { + irqs[PCIE_PORT_SERVICE_PME_SHIFT] = ret; + count++; + } + } + + /* TODO: add more service interrupts if there it is in the device tree*/ + + return count; +} + +/* * We don't use this to fix the device, but initialisation of it. * It's not the correct use for this, but it works. * Note that the arbiter/ISA bridge appears to be buggy, specifically in diff --git a/arch/arm64/kernel/pci.c b/arch/arm64/kernel/pci.c index acf3872..4a3c61a 100644 --- a/arch/arm64/kernel/pci.c +++ b/arch/arm64/kernel/pci.c @@ -17,6 +17,8 @@ #include #include #include +#include +#include #include #include #include @@ -55,6 +57,47 @@ int pcibios_alloc_irq(struct pci_dev *dev) } /* + * Check device tree if the service interrupts are there + */ +int pcibios_check_service_irqs(struct pci_dev *dev, int *irqs, int mask) +{ + int ret, count = 0; + struct device_node *np = NULL; + + if (dev->bus->dev.of_node) + np = dev->bus->dev.of_node; + + if (np == NULL) + return 0; + + if (!IS_ENABLED(CONFIG_OF_IRQ)) + return 0; + + /* If root port doesn't support MSI/MSI-X/INTx in RC mode, + * request irq for aer + */ + if (mask & PCIE_PORT_SERVICE_AER) { + ret = of_irq_get_byname(np, "aer"); + if (ret > 0) { + irqs[PCIE_PORT_SERVICE_AER_SHIFT] = ret; + count++; + } + } + + if (mask & PCIE_PORT_SERVICE_PME) { + ret = of_irq_get_byname(np, "pme"); + if (ret > 0) { + irqs[PCIE_PORT_SERVICE_PME_SHIFT] = ret; + count++; + } + } + + /* TODO: add more service interrupts if there it is in the device tree*/ + + return count; +} + +/* * raw_pci_read/write - Platform-specific PCI config space access. */ int raw_pci_read(unsigned int domain, unsigned int bus, diff --git a/drivers/pci/pcie/portdrv_core.c b/drivers/pci/pcie/portdrv_core.c index e9270b4..34b6dae 100644 --- a/drivers/pci/pcie/portdrv_core.c +++ b/drivers/pci/pcie/portdrv_core.c @@ -44,6 +44,19 @@ static void release_pcie_device(struct device *dev) } /** + * pcibios_check_service_irqs - check irqs in the device tree + * @dev: PCI Express port to handle + * @irqs: Array of irqs to populate + * @mask: Bitmask of port capabilities returned by get_port_device_capability() + * + * Return value: 0 means no service irqs in the device tree + * + */ +int __weak pcibios_check_service_irqs(struct pci_dev *dev, int *irqs, int mask) +{ + return 0; +} +/** * pcie_port_msix_add_entry - add entry to given array of MSI-X entries * @entries: Array of MSI-X entries * @new_entry: Index of the entry to add to the array @@ -200,6 +213,21 @@ static int pcie_port_enable_msix(struct pci_dev *dev, int *vectors, int mask) static int init_service_irqs(struct pci_dev *dev, int *irqs, int mask) { int i, irq = -1; + int ret; + + /* Check if some platforms owns independent irq pins for AER/PME etc. + * Some platforms may own independent AER/PME interrupts and set + * them in the device tree file. + */ + for (i = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++) + irqs[i] = -1; + + ret = pcibios_check_service_irqs(dev, irqs, mask); + if (ret) { + if (dev->irq) + irq = dev->irq; + goto no_msi; + } /* * If MSI cannot be used for PCIe PME or hotplug, we have to use @@ -226,7 +254,8 @@ static int init_service_irqs(struct pci_dev *dev, int *irqs, int mask) no_msi: for (i = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++) - irqs[i] = irq; + if (irqs[i] == -1) + irqs[i] = irq; irqs[PCIE_PORT_SERVICE_VC_SHIFT] = -1; if (irq < 0) diff --git a/include/linux/pci.h b/include/linux/pci.h index 2599a98..c80f2d0 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -1793,6 +1793,7 @@ void pcibios_release_device(struct pci_dev *dev); void pcibios_penalize_isa_irq(int irq, int active); int pcibios_alloc_irq(struct pci_dev *dev); void pcibios_free_irq(struct pci_dev *dev); +int pcibios_check_service_irqs(struct pci_dev *dev, int *irqs, int mask); #ifdef CONFIG_HIBERNATE_CALLBACKS extern struct dev_pm_ops pcibios_pm_ops; -- 2.1.0.27.g96db324