aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/tg3.c40
-rw-r--r--drivers/net/tg3.h3
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
5262static 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
5262static int tg3_poll(struct napi_struct *napi, int budget) 5296static 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