diff options
author | Ayaz Abdulla <aabdulla@nvidia.com> | 2009-02-07 03:25:00 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-02-07 03:25:00 -0500 |
commit | daa91a9d2402d33b70b8685dee6fd3e517bf34a9 (patch) | |
tree | 258c771d3d3f6d693d11b8e1d1ba0a575de08778 /drivers/net/forcedeth.c | |
parent | c1086cda7d46885d672d282af04d1273b001442f (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.c | 13 |
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 @@ | |||
102 | enum { | 102 | enum { |
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); |