From: Stephen Hemminger Date: Mon, 27 Jun 2005 18:33:14 +0000 (-0700) Subject: [PATCH] skge: handle Tx/Rx arbiter timeout X-Git-Tag: v2.6.13-rc1~54 X-Git-Url: http://pilppa.com/gitweb/?a=commitdiff_plain;h=d25f5a6774c3c567b11f8637a787603a62d102b1;p=linux-2.6-omap-h63xx.git [PATCH] skge: handle Tx/Rx arbiter timeout Need to handle receive and transmit packet arbiter timeouts. Transmit arbiter timeouts happens when Gigabit sends to 100Mbit port on same switch and pause occurs. Signed-off-by: Stephen Hemminger --- diff --git a/drivers/net/skge.c b/drivers/net/skge.c index 290d6aa9238..9f24714260b 100644 --- a/drivers/net/skge.c +++ b/drivers/net/skge.c @@ -2731,6 +2731,24 @@ static irqreturn_t skge_intr(int irq, void *dev_id, struct pt_regs *regs) if (status & IS_XA2_F) skge_tx_intr(hw->dev[1]); + if (status & IS_PA_TO_RX1) { + struct skge_port *skge = netdev_priv(hw->dev[0]); + ++skge->net_stats.rx_over_errors; + skge_write16(hw, B3_PA_CTRL, PA_CLR_TO_RX1); + } + + if (status & IS_PA_TO_RX2) { + struct skge_port *skge = netdev_priv(hw->dev[1]); + ++skge->net_stats.rx_over_errors; + skge_write16(hw, B3_PA_CTRL, PA_CLR_TO_RX2); + } + + if (status & IS_PA_TO_TX1) + skge_write16(hw, B3_PA_CTRL, PA_CLR_TO_TX1); + + if (status & IS_PA_TO_TX2) + skge_write16(hw, B3_PA_CTRL, PA_CLR_TO_TX2); + if (status & IS_MAC1) skge_mac_intr(hw, 0); diff --git a/drivers/net/skge.h b/drivers/net/skge.h index ba6dfd2f01d..37323cd29e7 100644 --- a/drivers/net/skge.h +++ b/drivers/net/skge.h @@ -203,8 +203,11 @@ enum { IS_XA2_F = 1<<1, /* Q_XA2 End of Frame */ IS_XA2_C = 1<<0, /* Q_XA2 Encoding Error */ - IS_PORT_1 = IS_XA1_F| IS_R1_F| IS_MAC1, - IS_PORT_2 = IS_XA2_F| IS_R2_F| IS_MAC2, + IS_TO_PORT1 = IS_PA_TO_RX1 | IS_PA_TO_TX1, + IS_TO_PORT2 = IS_PA_TO_RX2 | IS_PA_TO_TX2, + + IS_PORT_1 = IS_XA1_F| IS_R1_F | IS_TO_PORT1 | IS_MAC1, + IS_PORT_2 = IS_XA2_F| IS_R2_F | IS_TO_PORT2 | IS_MAC2, };