aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/forcedeth.c
diff options
context:
space:
mode:
authorAyaz Abdulla <aabdulla@nvidia.com>2009-02-07 03:25:00 -0500
committerDavid S. Miller <davem@davemloft.net>2009-02-07 03:25:00 -0500
commitdaa91a9d2402d33b70b8685dee6fd3e517bf34a9 (patch)
tree258c771d3d3f6d693d11b8e1d1ba0a575de08778 /drivers/net/forcedeth.c
parentc1086cda7d46885d672d282af04d1273b001442f (diff)
forcedeth: recover error support
This patch adds another type of recoverable error to the driver. It also modifies the sequence for recovery to include a mac reset and clearing of interrupts. Signed-off-by: Ayaz Abdulla <aabdulla@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/forcedeth.c')
-rw-r--r--drivers/net/forcedeth.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c
index cb41897f286e..e32b8e481b31 100644
--- a/drivers/net/forcedeth.c
+++ b/drivers/net/forcedeth.c
@@ -102,7 +102,7 @@
102enum { 102enum {
103 NvRegIrqStatus = 0x000, 103 NvRegIrqStatus = 0x000,
104#define NVREG_IRQSTAT_MIIEVENT 0x040 104#define NVREG_IRQSTAT_MIIEVENT 0x040
105#define NVREG_IRQSTAT_MASK 0x81ff 105#define NVREG_IRQSTAT_MASK 0x83ff
106 NvRegIrqMask = 0x004, 106 NvRegIrqMask = 0x004,
107#define NVREG_IRQ_RX_ERROR 0x0001 107#define NVREG_IRQ_RX_ERROR 0x0001
108#define NVREG_IRQ_RX 0x0002 108#define NVREG_IRQ_RX 0x0002
@@ -113,7 +113,7 @@ enum {
113#define NVREG_IRQ_LINK 0x0040 113#define NVREG_IRQ_LINK 0x0040
114#define NVREG_IRQ_RX_FORCED 0x0080 114#define NVREG_IRQ_RX_FORCED 0x0080
115#define NVREG_IRQ_TX_FORCED 0x0100 115#define NVREG_IRQ_TX_FORCED 0x0100
116#define NVREG_IRQ_RECOVER_ERROR 0x8000 116#define NVREG_IRQ_RECOVER_ERROR 0x8200
117#define NVREG_IRQMASK_THROUGHPUT 0x00df 117#define NVREG_IRQMASK_THROUGHPUT 0x00df
118#define NVREG_IRQMASK_CPU 0x0060 118#define NVREG_IRQMASK_CPU 0x0060
119#define NVREG_IRQ_TX_ALL (NVREG_IRQ_TX_ERR|NVREG_IRQ_TX_OK|NVREG_IRQ_TX_FORCED) 119#define NVREG_IRQ_TX_ALL (NVREG_IRQ_TX_ERR|NVREG_IRQ_TX_OK|NVREG_IRQ_TX_FORCED)
@@ -4073,13 +4073,15 @@ static void nv_do_nic_poll(unsigned long data)
4073 4073
4074 if (np->recover_error) { 4074 if (np->recover_error) {
4075 np->recover_error = 0; 4075 np->recover_error = 0;
4076 printk(KERN_INFO "forcedeth: MAC in recoverable error state\n"); 4076 printk(KERN_INFO "%s: MAC in recoverable error state\n", dev->name);
4077 if (netif_running(dev)) { 4077 if (netif_running(dev)) {
4078 netif_tx_lock_bh(dev); 4078 netif_tx_lock_bh(dev);
4079 netif_addr_lock(dev); 4079 netif_addr_lock(dev);
4080 spin_lock(&np->lock); 4080 spin_lock(&np->lock);
4081 /* stop engines */ 4081 /* stop engines */
4082 nv_stop_rxtx(dev); 4082 nv_stop_rxtx(dev);
4083 if (np->driver_data & DEV_HAS_POWER_CNTRL)
4084 nv_mac_reset(dev);
4083 nv_txrx_reset(dev); 4085 nv_txrx_reset(dev);
4084 /* drain rx queue */ 4086 /* drain rx queue */
4085 nv_drain_rxtx(dev); 4087 nv_drain_rxtx(dev);
@@ -4097,6 +4099,11 @@ static void nv_do_nic_poll(unsigned long data)
4097 pci_push(base); 4099 pci_push(base);
4098 writel(NVREG_TXRXCTL_KICK|np->txrxctl_bits, get_hwbase(dev) + NvRegTxRxControl); 4100 writel(NVREG_TXRXCTL_KICK|np->txrxctl_bits, get_hwbase(dev) + NvRegTxRxControl);
4099 pci_push(base); 4101 pci_push(base);
4102 /* clear interrupts */
4103 if (!(np->msi_flags & NV_MSI_X_ENABLED))
4104 writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus);
4105 else
4106 writel(NVREG_IRQSTAT_MASK, base + NvRegMSIXIrqStatus);
4100 4107
4101 /* restart rx engine */ 4108 /* restart rx engine */
4102 nv_start_rxtx(dev); 4109 nv_start_rxtx(dev);