svn commit: r185564 - head/sys/dev/cxgb/common
George V. Neville-Neil
gnn at FreeBSD.org
Tue Dec 2 07:42:48 PST 2008
Author: gnn
Date: Tue Dec 2 15:42:47 2008
New Revision: 185564
URL: http://svn.freebsd.org/changeset/base/185564
Log:
Bug fix from Chelsio which addresses the issue of the device resetting
when it sees only received packets. In some cases where a device only
recieves data it mistakenly thinks that its transmitting side is broken
and resets the device.
Obtained from: Chelsio Inc.
MFC after: 3 days
Modified:
head/sys/dev/cxgb/common/cxgb_xgmac.c
Modified: head/sys/dev/cxgb/common/cxgb_xgmac.c
==============================================================================
--- head/sys/dev/cxgb/common/cxgb_xgmac.c Tue Dec 2 15:08:33 2008 (r185563)
+++ head/sys/dev/cxgb/common/cxgb_xgmac.c Tue Dec 2 15:42:47 2008 (r185564)
@@ -633,20 +633,15 @@ int t3b2_mac_watchdog_task(struct cmac *
adapter_t *adap = mac->adapter;
struct mac_stats *s = &mac->stats;
unsigned int tx_mcnt = (unsigned int)s->tx_frames;
- unsigned int rx_mcnt = (unsigned int)s->rx_frames;
- unsigned int rx_xcnt;
if (mac->multiport) {
tx_mcnt = t3_read_reg(adap, A_XGM_STAT_TX_FRAME_LOW);
- rx_mcnt = t3_read_reg(adap, A_XGM_STAT_RX_FRAMES_LOW);
} else {
tx_mcnt = (unsigned int)s->tx_frames;
- rx_mcnt = (unsigned int)s->rx_frames;
}
status = 0;
tx_xcnt = 1; /* By default tx_xcnt is making progress*/
tx_tcnt = mac->tx_tcnt; /* If tx_mcnt is progressing ignore tx_tcnt*/
- rx_xcnt = 1; /* By default rx_xcnt is making progress*/
if (tx_mcnt == mac->tx_mcnt && mac->rx_pause == s->rx_pause) {
tx_xcnt = (G_TXSPI4SOPCNT(t3_read_reg(adap,
A_XGM_TX_SPI4_SOP_EOP_CNT +
@@ -657,11 +652,11 @@ int t3b2_mac_watchdog_task(struct cmac *
tx_tcnt = (G_TXDROPCNTCH0RCVD(t3_read_reg(adap,
A_TP_PIO_DATA)));
} else {
- goto rxcheck;
+ goto out;
}
} else {
mac->toggle_cnt = 0;
- goto rxcheck;
+ goto out;
}
if ((tx_tcnt != mac->tx_tcnt) && (mac->tx_xcnt == 0)) {
@@ -674,22 +669,6 @@ int t3b2_mac_watchdog_task(struct cmac *
}
} else {
mac->toggle_cnt = 0;
- goto rxcheck;
- }
-
-rxcheck:
- if (rx_mcnt != mac->rx_mcnt) {
- rx_xcnt = (G_TXSPI4SOPCNT(t3_read_reg(adap,
- A_XGM_RX_SPI4_SOP_EOP_CNT +
- mac->offset))) +
- (s->rx_fifo_ovfl - mac->rx_ocnt);
- mac->rx_ocnt = s->rx_fifo_ovfl;
- } else
- goto out;
-
- if (mac->rx_mcnt != s->rx_frames && rx_xcnt == 0 && mac->rx_xcnt == 0) {
- if (!mac->multiport)
- status = 2;
goto out;
}
@@ -697,8 +676,6 @@ out:
mac->tx_tcnt = tx_tcnt;
mac->tx_xcnt = tx_xcnt;
mac->tx_mcnt = s->tx_frames;
- mac->rx_xcnt = rx_xcnt;
- mac->rx_mcnt = s->rx_frames;
mac->rx_pause = s->rx_pause;
if (status == 1) {
t3_write_reg(adap, A_XGM_TX_CTRL + mac->offset, 0);
More information about the svn-src-all
mailing list