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

Reply via email to