diff options
-rw-r--r-- | drivers/net/tg3.c | 40 | ||||
-rw-r--r-- | drivers/net/tg3.h | 3 |
2 files changed, 42 insertions, 1 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 72744353b1cb..b61b52f0a9fb 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -5259,6 +5259,40 @@ tx_recovery: | |||
5259 | return work_done; | 5259 | return work_done; |
5260 | } | 5260 | } |
5261 | 5261 | ||
5262 | static void tg3_process_error(struct tg3 *tp) | ||
5263 | { | ||
5264 | u32 val; | ||
5265 | bool real_error = false; | ||
5266 | |||
5267 | if (tp->tg3_flags & TG3_FLAG_ERROR_PROCESSED) | ||
5268 | return; | ||
5269 | |||
5270 | /* Check Flow Attention register */ | ||
5271 | val = tr32(HOSTCC_FLOW_ATTN); | ||
5272 | if (val & ~HOSTCC_FLOW_ATTN_MBUF_LWM) { | ||
5273 | netdev_err(tp->dev, "FLOW Attention error. Resetting chip.\n"); | ||
5274 | real_error = true; | ||
5275 | } | ||
5276 | |||
5277 | if (tr32(MSGINT_STATUS) & ~MSGINT_STATUS_MSI_REQ) { | ||
5278 | netdev_err(tp->dev, "MSI Status error. Resetting chip.\n"); | ||
5279 | real_error = true; | ||
5280 | } | ||
5281 | |||
5282 | if (tr32(RDMAC_STATUS) || tr32(WDMAC_STATUS)) { | ||
5283 | netdev_err(tp->dev, "DMA Status error. Resetting chip.\n"); | ||
5284 | real_error = true; | ||
5285 | } | ||
5286 | |||
5287 | if (!real_error) | ||
5288 | return; | ||
5289 | |||
5290 | tg3_dump_state(tp); | ||
5291 | |||
5292 | tp->tg3_flags |= TG3_FLAG_ERROR_PROCESSED; | ||
5293 | schedule_work(&tp->reset_task); | ||
5294 | } | ||
5295 | |||
5262 | static int tg3_poll(struct napi_struct *napi, int budget) | 5296 | static int tg3_poll(struct napi_struct *napi, int budget) |
5263 | { | 5297 | { |
5264 | struct tg3_napi *tnapi = container_of(napi, struct tg3_napi, napi); | 5298 | struct tg3_napi *tnapi = container_of(napi, struct tg3_napi, napi); |
@@ -5267,6 +5301,9 @@ static int tg3_poll(struct napi_struct *napi, int budget) | |||
5267 | struct tg3_hw_status *sblk = tnapi->hw_status; | 5301 | struct tg3_hw_status *sblk = tnapi->hw_status; |
5268 | 5302 | ||
5269 | while (1) { | 5303 | while (1) { |
5304 | if (sblk->status & SD_STATUS_ERROR) | ||
5305 | tg3_process_error(tp); | ||
5306 | |||
5270 | tg3_poll_link(tp); | 5307 | tg3_poll_link(tp); |
5271 | 5308 | ||
5272 | work_done = tg3_poll_work(tnapi, work_done, budget); | 5309 | work_done = tg3_poll_work(tnapi, work_done, budget); |
@@ -7316,7 +7353,8 @@ static int tg3_chip_reset(struct tg3 *tp) | |||
7316 | 7353 | ||
7317 | tg3_restore_pci_state(tp); | 7354 | tg3_restore_pci_state(tp); |
7318 | 7355 | ||
7319 | tp->tg3_flags &= ~TG3_FLAG_CHIP_RESETTING; | 7356 | tp->tg3_flags &= ~(TG3_FLAG_CHIP_RESETTING | |
7357 | TG3_FLAG_ERROR_PROCESSED); | ||
7320 | 7358 | ||
7321 | val = 0; | 7359 | val = 0; |
7322 | if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS) | 7360 | if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS) |
diff --git a/drivers/net/tg3.h b/drivers/net/tg3.h index 99120100bf6a..b3ccfcc9ffea 100644 --- a/drivers/net/tg3.h +++ b/drivers/net/tg3.h | |||
@@ -1201,6 +1201,7 @@ | |||
1201 | #define HOSTCC_STATS_BLK_NIC_ADDR 0x00003c40 | 1201 | #define HOSTCC_STATS_BLK_NIC_ADDR 0x00003c40 |
1202 | #define HOSTCC_STATUS_BLK_NIC_ADDR 0x00003c44 | 1202 | #define HOSTCC_STATUS_BLK_NIC_ADDR 0x00003c44 |
1203 | #define HOSTCC_FLOW_ATTN 0x00003c48 | 1203 | #define HOSTCC_FLOW_ATTN 0x00003c48 |
1204 | #define HOSTCC_FLOW_ATTN_MBUF_LWM 0x00000040 | ||
1204 | /* 0x3c4c --> 0x3c50 unused */ | 1205 | /* 0x3c4c --> 0x3c50 unused */ |
1205 | #define HOSTCC_JUMBO_CON_IDX 0x00003c50 | 1206 | #define HOSTCC_JUMBO_CON_IDX 0x00003c50 |
1206 | #define HOSTCC_STD_CON_IDX 0x00003c54 | 1207 | #define HOSTCC_STD_CON_IDX 0x00003c54 |
@@ -1611,6 +1612,7 @@ | |||
1611 | #define MSGINT_MODE_ONE_SHOT_DISABLE 0x00000020 | 1612 | #define MSGINT_MODE_ONE_SHOT_DISABLE 0x00000020 |
1612 | #define MSGINT_MODE_MULTIVEC_EN 0x00000080 | 1613 | #define MSGINT_MODE_MULTIVEC_EN 0x00000080 |
1613 | #define MSGINT_STATUS 0x00006004 | 1614 | #define MSGINT_STATUS 0x00006004 |
1615 | #define MSGINT_STATUS_MSI_REQ 0x00000001 | ||
1614 | #define MSGINT_FIFO 0x00006008 | 1616 | #define MSGINT_FIFO 0x00006008 |
1615 | /* 0x600c --> 0x6400 unused */ | 1617 | /* 0x600c --> 0x6400 unused */ |
1616 | 1618 | ||
@@ -2886,6 +2888,7 @@ struct tg3 { | |||
2886 | #define TG3_FLAG_TAGGED_STATUS 0x00000001 | 2888 | #define TG3_FLAG_TAGGED_STATUS 0x00000001 |
2887 | #define TG3_FLAG_TXD_MBOX_HWBUG 0x00000002 | 2889 | #define TG3_FLAG_TXD_MBOX_HWBUG 0x00000002 |
2888 | #define TG3_FLAG_USE_LINKCHG_REG 0x00000008 | 2890 | #define TG3_FLAG_USE_LINKCHG_REG 0x00000008 |
2891 | #define TG3_FLAG_ERROR_PROCESSED 0x00000010 | ||
2889 | #define TG3_FLAG_ENABLE_ASF 0x00000020 | 2892 | #define TG3_FLAG_ENABLE_ASF 0x00000020 |
2890 | #define TG3_FLAG_ASPM_WORKAROUND 0x00000040 | 2893 | #define TG3_FLAG_ASPM_WORKAROUND 0x00000040 |
2891 | #define TG3_FLAG_POLL_SERDES 0x00000080 | 2894 | #define TG3_FLAG_POLL_SERDES 0x00000080 |