Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757195AbYC2VAy (ORCPT ); Sat, 29 Mar 2008 17:00:54 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752066AbYC2VAm (ORCPT ); Sat, 29 Mar 2008 17:00:42 -0400 Received: from wa-out-1112.google.com ([209.85.146.178]:31946 "EHLO wa-out-1112.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753041AbYC2VAk (ORCPT ); Sat, 29 Mar 2008 17:00:40 -0400 DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=reply-to:to:subject:date:user-agent:cc:mime-version:content-type:content-transfer-encoding:content-disposition:message-id:from; b=bSFPHcZWM1Dwm92+86DkTKZJLAyGKS3nU4oeVKcm78bTWnQz/mqd66ooGBul6eh0Wk2OKcj4S2dGBlFTCd1LBkaNzwpZa3sV57mjNqiVrBY3qVuwrCnMJi/eDej/Ukxol1v/V284hmlE0vPZSDdGTEH7+ag3NFLXrV3y8CEUask= Reply-To: yhlu.kernel@gmail.com To: Andrew Morton , David Miller , Jeff Garzik , Greg KH , Ingo Molnar Subject: [PATCH] e1000: fix IRQx nobody cared for shared irq with INTx Date: Sat, 29 Mar 2008 14:03:23 -0700 User-Agent: KMail/1.9.6 (enterprise 20070904.708012) Cc: kernel list , netdev@vger.kernel.org, linux-pci@atrey.karlin.mff.cuni.cz MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200803291403.23479.yhlu.kernel@gmail.com> From: Yinghai Lu Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4809 Lines: 123 when try to kexec one latest kernel from kernel.org from RHEL 5.1 got ACPI: PCI Interrupt 0000:02:00.0[A] -> Link [LNKA] -> GSI 19 (level, low) -> IRQ 19 acpi->mptable 2 : Int: type 0, pol 1, trig 1, bus 02, IRQ 00, APIC ID 0, APIC INT 13 PCI: Setting latency timer of device 0000:02:00.0 to 64 PCI: Enabling Mem-Wr-Inval for device 0000:02:00.0 scsi0 : on PCI bus 02 device 00 irq 19 irq 19: nobody cared (try booting with the "irqpoll" option) Pid: 1, comm: swapper Not tainted 2.6.24-smp-07682-g551e4fb-dirty #19 Call Trace: [] __report_bad_irq+0x30/0x72 [] note_interrupt+0x224/0x26f [] handle_fasteoi_irq+0xa5/0xc8 [] call_softirq+0x1c/0x28 [] do_IRQ+0xf1/0x15f [] ret_from_intr+0x0/0xa [] pci_mmcfg_write+0x0/0xb0 [] native_read_tsc+0xd/0x1d [] __delay+0x17/0x22 [] lpfc_sli_brdrestart+0x14c/0x16b [] lpfc_do_config_port+0x9c/0x3e4 [] sysfs_link_sibling+0x17/0x31 [] lpfc_sli_hba_setup+0xc8/0x4a2 [] lpfc_pci_probe_one+0x750/0x914 [] pci_device_probe+0xb3/0xfb [] driver_probe_device+0xb5/0x132 [] __driver_attach+0x0/0x93 [] __driver_attach+0x5a/0x93 [] bus_for_each_dev+0x44/0x6f [] bus_add_driver+0xae/0x1f5 [] driver_register+0x59/0xce [] __pci_register_driver+0x4a/0x7c [] lpfc_init+0x98/0xba [] kernel_init+0x175/0x2e1 [] child_rip+0xa/0x12 [] kernel_init+0x0/0x2e1 [] child_rip+0x0/0x12 handlers: [] (lpfc_intr_handler+0x0/0x4c6) Disabling IRQ #19 root caused that there is one Intel card that shared io apic pin and irq with lpfc e1000_probe path only use pci_enable_device to setup irq entry but masked, and will use e1000_open to use request_irq/setup_irq to install action and enable/unmask that io apic entry. but lpfc driver will call it's probe and request_irq/setup_irq. so it enable/umask that io apic entry. and only lpfc's action the lpfc_intr_handler is installed. and some case, the e1000 sent out irq (hw bug or first kernel doesn't call e1000_irq_disable?) that irq will confuse the hanlder ... it is not for lpfc_intr_handler... So try to call pci_intx(dev, 0) in e1000_probe, and later call pci_intx(dev, 1) after request_irq in e1000_open patch, if the irq is using INTx even e1000 is using MSI, still need this patch. Because even pci_enable_msi in e1000_open path will call pci_intx(dev, 0), that is too late. when we have lpfc driver loaded before use ifconfig to set network connection. othe drivers may need to be updated in the same way, if they have same problem like nobody cared irq with shared INTx irq. Signed-off-by: Yinghai Lu Index: linux-2.6/drivers/net/e1000/e1000_main.c =================================================================== --- linux-2.6.orig/drivers/net/e1000/e1000_main.c +++ linux-2.6/drivers/net/e1000/e1000_main.c @@ -324,6 +324,9 @@ static int e1000_request_irq(struct e100 pci_disable_msi(adapter->pdev); DPRINTK(PROBE, ERR, "Unable to allocate interrupt Error: %d\n", err); + } else if (!adapter->have_msi) { + /* enable INTx before if not using MSI */ + pci_intx(adapter->pdev, 1); } return err; @@ -934,6 +937,8 @@ e1000_probe(struct pci_dev *pdev, uint16_t eeprom_apme_mask = E1000_EEPROM_APME; DECLARE_MAC_BUF(mac); + /* disable INTx at first */ + pci_intx(pdev, 0); if ((err = pci_enable_device(pdev))) return err; Index: linux-2.6/drivers/net/e1000e/netdev.c =================================================================== --- linux-2.6.orig/drivers/net/e1000e/netdev.c +++ linux-2.6/drivers/net/e1000e/netdev.c @@ -960,6 +960,9 @@ static int e1000_request_irq(struct e100 err); if (adapter->flags & FLAG_MSI_ENABLED) pci_disable_msi(adapter->pdev); + } else if (!(adapter->flags & FLAG_MSI_ENABLED)) { + /* enable INTx before if not using MSI */ + pci_intx(adapter->pdev, 1); } return err; @@ -3726,6 +3729,8 @@ static int __devinit e1000_probe(struct u16 eeprom_apme_mask = E1000_EEPROM_APME; e1000e_disable_l1aspm(pdev); + /* disable INTx at first */ + pci_intx(pdev, 0); err = pci_enable_device(pdev); if (err) return err; -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/