| From stable-bounces@linux.kernel.org Thu Oct 12 15:38:46 2006 |
| Date: Thu, 12 Oct 2006 15:38:11 -0700 |
| From: Stephen Hemminger <shemminger@osdl.org> |
| To: stable@kernel.org |
| Message-ID: <20061012153811.09790730@freekitty> |
| Mime-Version: 1.0 |
| Subject: sky2: MSI test race and message |
| Content-Type: text/plain; charset="us-ascii" |
| |
| From: Stephen Hemminger <shemminger@osdl.org> |
| |
| Make sure and do PCI reads after writes in the MSI test setup code. |
| |
| Some motherboards don't implement MSI correctly. The driver handles this |
| but the warning is too verbose and overly cautious. |
| |
| Signed-off-by: Stephen Hemminger <shemminger@osdl.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| Signed-off-by: Chris Wright <chrisw@sous-sol.org> |
| |
| --- |
| drivers/net/sky2.c | 12 ++++++------ |
| 1 file changed, 6 insertions(+), 6 deletions(-) |
| |
| --- linux-2.6.18.1.orig/drivers/net/sky2.c |
| +++ linux-2.6.18.1/drivers/net/sky2.c |
| @@ -3208,6 +3208,8 @@ static int __devinit sky2_test_msi(struc |
| struct pci_dev *pdev = hw->pdev; |
| int err; |
| |
| + init_waitqueue_head (&hw->msi_wait); |
| + |
| sky2_write32(hw, B0_IMSK, Y2_IS_IRQ_SW); |
| |
| err = request_irq(pdev->irq, sky2_test_intr, IRQF_SHARED, DRV_NAME, hw); |
| @@ -3217,18 +3219,15 @@ static int __devinit sky2_test_msi(struc |
| return err; |
| } |
| |
| - init_waitqueue_head (&hw->msi_wait); |
| - |
| sky2_write8(hw, B0_CTST, CS_ST_SW_IRQ); |
| - wmb(); |
| + sky2_read8(hw, B0_CTST); |
| |
| wait_event_timeout(hw->msi_wait, hw->msi_detected, HZ/10); |
| |
| if (!hw->msi_detected) { |
| /* MSI test failed, go back to INTx mode */ |
| - printk(KERN_WARNING PFX "%s: No interrupt was generated using MSI, " |
| - "switching to INTx mode. Please report this failure to " |
| - "the PCI maintainer and include system chipset information.\n", |
| + printk(KERN_INFO PFX "%s: No interrupt generated using MSI, " |
| + "switching to INTx mode.\n", |
| pci_name(pdev)); |
| |
| err = -EOPNOTSUPP; |
| @@ -3236,6 +3235,7 @@ static int __devinit sky2_test_msi(struc |
| } |
| |
| sky2_write32(hw, B0_IMSK, 0); |
| + sky2_read32(hw, B0_IMSK); |
| |
| free_irq(pdev->irq, hw); |
| |