From: Steve Best <sbest@redhat.com> Date: Wed, 5 May 2010 13:01:09 -0400 Subject: [net] tg3: fix INTx fallback when MSI fails Message-id: <20100505125200.5141.98958.sendpatchset@squad5-lp1.lab.bos.redhat.com> Patchwork-id: 24818 O-Subject: [PATCH RHEL5.6 BZ587666] tg3: Fix INTx fallback when MSI fails Bugzilla: 587666 RH-Acked-by: David Howells <dhowells@redhat.com> RH-Acked-by: Jiri Pirko <jpirko@redhat.com> RH-Acked-by: Andy Gospodarek <gospo@redhat.com> RH-Acked-by: Stefan Assmann <sassmann@redhat.com> RH-Acked-by: David S. Miller <davem@redhat.com> RH-Acked-by: John Feeney <jfeeney@redhat.com> RHBZ#: ====== https://bugzilla.redhat.com/show_bug.cgi?id=587666 Description: ============ MSI setup changes the value of irq_vec in struct tg3 *tp. This attribute must be taken into account and restored before we try to do a new request_irq for INTx fallback. In powerpc, the original code was leading to an EINVAL return within request_irq, because the driver was trying to use the disabled MSI virtual irq number instead of tp->pdev->irq. Signed-off-by: Andre Detsch <adetsch@br.ibm.com> Acked-by: Michael Chan <mchan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net> RHEL Version Found: =================== RHEL 5.5 kABI Status: ============ No symbols were harmed. Brew: ===== https://brewweb.devel.redhat.com/taskinfo?taskID=2418977 Upstream Status: ================ back port from Upstream (accepted) http://git.kernel.org/?p=linux/kernel/git/davem/net-2.6.git;a=commit;h=dc8bf1b1a6edfc92465526de19772061302f0929 Test Status: ============ Tested by the IBM test team. =============================================================== Steve Best IBM on-site partner Signed-off-by: Jarod Wilson <jarod@redhat.com> diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 939bdd7..f4768c7 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c @@ -8826,6 +8826,7 @@ static int tg3_test_msi(struct tg3 *tp) pci_disable_msi(tp->pdev); tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI; + tp->napi[0].irq_vec = tp->pdev->irq; err = tg3_request_irq(tp, 0); if (err)