Try this, it limits the console output and attempts to handle more errors. Of course, I see no errors on my systems (that would make this problem too easy)...
Index: sky2-work/drivers/net/sky2.c =================================================================== --- sky2-work.orig/drivers/net/sky2.c 2006-01-11 13:54:23.000000000 -0800 +++ sky2-work/drivers/net/sky2.c 2006-01-11 15:19:56.000000000 -0800 @@ -1900,8 +1900,9 @@ { struct net_device *dev = hw->dev[port]; - printk(KERN_INFO PFX "%s: hw error interrupt status 0x%x\n", - dev->name, status); + if (printk_ratelimit()) + printk(KERN_INFO PFX "%s: hw error interrupt status 0x%x\n", + dev->name, status); if (status & Y2_IS_PAR_RD1) { printk(KERN_ERR PFX "%s: ram data read parity error\n", @@ -1918,12 +1919,14 @@ } if (status & Y2_IS_PAR_MAC1) { - printk(KERN_ERR PFX "%s: MAC parity error\n", dev->name); + if (printk_ratelimit()) + printk(KERN_ERR PFX "%s: MAC parity error\n", dev->name); sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_CLI_TX_PE); } if (status & Y2_IS_PAR_RX1) { - printk(KERN_ERR PFX "%s: RX parity error\n", dev->name); + if (printk_ratelimit()) + printk(KERN_ERR PFX "%s: RX parity error\n", dev->name); sky2_write32(hw, Q_ADDR(rxqaddr[port], Q_CSR), BMU_CLR_IRQ_PAR); } @@ -1935,43 +1938,64 @@ static void sky2_hw_intr(struct sky2_hw *hw) { + struct pci_dev *pdev = hw->pdev; u32 status = sky2_read32(hw, B0_HWE_ISRC); + sky2_write32(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON); + /* This driver doesn't use receive timestamps */ if (status & Y2_IS_TIST_OV) sky2_write8(hw, GMAC_TI_ST_CTRL, GMT_ST_CLR_IRQ); + if (status & Y2_IS_PCI_NEXP) { + if (printk_ratelimit()) + printk(KERN_INFO PFX "%s: pci express abort\n", + pci_name(pdev)); + } + if (status & (Y2_IS_MST_ERR | Y2_IS_IRQ_STAT)) { u16 pci_err; - pci_read_config_word(hw->pdev, PCI_STATUS, &pci_err); - printk(KERN_ERR PFX "%s: pci hw error (0x%x)\n", - pci_name(hw->pdev), pci_err); + pci_read_config_word(pdev, PCI_STATUS, &pci_err); + if (printk_ratelimit()) + printk(KERN_ERR PFX "%s: pci hw error (0x%x)\n", + pci_name(pdev), pci_err); - sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON); - pci_write_config_word(hw->pdev, PCI_STATUS, + pci_write_config_word(pdev, PCI_STATUS, pci_err | PCI_STATUS_ERROR_BITS); - sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF); } - if (status & Y2_IS_PCI_EXP) { - /* PCI-Express uncorrectable Error occurred */ - u32 pex_err; + if (status & Y2_IS_PCI_EXP) { /* PCI-Express error */ + u32 err; - pci_read_config_dword(hw->pdev, PEX_UNC_ERR_STAT, &pex_err); + pci_read_config_dword(pdev, PEX_UNC_ERR_STAT, &err); + if (err) { + if (net_ratelimit()) + printk(KERN_INFO PFX + "%s: pci express uncorrectable error (0x%x)\n", + pci_name(pdev), err); - printk(KERN_ERR PFX "%s: pci express error (0x%x)\n", - pci_name(hw->pdev), pex_err); + if (err & PEX_FATAL_ERRORS) { + u32 hwmsk = sky2_read32(hw, B0_HWE_IMSK); - /* clear the interrupt */ - sky2_write32(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON); - pci_write_config_dword(hw->pdev, PEX_UNC_ERR_STAT, - 0xffffffffUL); - sky2_write32(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF); + printk(KERN_ERR PFX "%s: adapter failed\n", pci_name(pdev)); - if (pex_err & PEX_FATAL_ERRORS) { - u32 hwmsk = sky2_read32(hw, B0_HWE_IMSK); - hwmsk &= ~Y2_IS_PCI_EXP; - sky2_write32(hw, B0_HWE_IMSK, hwmsk); + hwmsk &= ~Y2_IS_PCI_EXP; + sky2_write32(hw, B0_HWE_IMSK, hwmsk); + + /* Should we turn off all interrupts?? */ + } + + /* clear the interrupt */ + pci_write_config_dword(pdev, PEX_UNC_ERR_STAT, 0xffffffffUL); + } + + pci_read_config_dword(pdev, PEX_COR_ERR_STAT, &err); + if (err) { + if (printk_ratelimit()) + printk(KERN_INFO PFX + "%s: pci express correctable error (0x%x)\n", + pci_name(pdev), err); + pci_write_config_dword(pdev, PEX_COR_ERR_STAT, 0xffffffffUL); } } @@ -1980,6 +2004,8 @@ status >>= 8; if (status & Y2_HWE_L1_MASK) sky2_hw_error(hw, 1, status); + + sky2_write32(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF); } static void sky2_mac_intr(struct sky2_hw *hw, unsigned port) Index: sky2-work/drivers/net/sky2.h =================================================================== --- sky2-work.orig/drivers/net/sky2.h 2006-01-11 13:54:23.000000000 -0800 +++ sky2-work/drivers/net/sky2.h 2006-01-11 15:18:12.000000000 -0800 @@ -10,9 +10,25 @@ #define PCI_DEV_STATUS 0x7c #define PCI_OS_PCI_X (1<<26) -#define PEX_LNK_STAT 0xf2 -#define PEX_UNC_ERR_STAT 0x104 -#define PEX_DEV_CTRL 0xe8 +#define PEX_CAP_ID 0xe0 /* 8 bit PEX Capability ID */ +#define PEX_NITEM 0xe1 /* 8 bit PEX Next Item Pointer */ +#define PEX_CAP_REG 0xe2 /* 16 bit PEX Capability Register */ +#define PEX_DEV_CAP 0xe4 /* 32 bit PEX Device Capabilities */ +#define PEX_DEV_CTRL 0xe8 /* 16 bit PEX Device Control */ +#define PEX_DEV_STAT 0xea /* 16 bit PEX Device Status */ +#define PEX_LNK_CAP 0xec /* 32 bit PEX Link Capabilities */ +#define PEX_LNK_CTRL 0xf0 /* 16 bit PEX Link Control */ +#define PEX_LNK_STAT 0xf2 /* 16 bit PEX Link Status */ + +/* PCI Express Extended Capabilities */ +#define PEX_ADV_ERR_REP 0x100 /* 32 bit PEX Advanced Error Reporting */ +#define PEX_UNC_ERR_STAT 0x104 /* 32 bit PEX Uncorr. Errors Status */ +#define PEX_UNC_ERR_MASK 0x108 /* 32 bit PEX Uncorr. Errors Mask */ +#define PEX_UNC_ERR_SEV 0x10c /* 32 bit PEX Uncorr. Errors Severity */ +#define PEX_COR_ERR_STAT 0x110 /* 32 bit PEX Correc. Errors Status */ +#define PEX_COR_ERR_MASK 0x114 /* 32 bit PEX Correc. Errors Mask */ +#define PEX_ADV_ERR_CAP_C 0x118 /* 32 bit PEX Advanced Error Cap./Ctrl */ +#define PEX_HEADER_LOG 0x11c /* 4x32 bit PEX Header Log Register */ /* Yukon-2 */ enum pci_dev_reg_1 { - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html