aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Hemminger <shemminger@linux-foundation.org>2007-09-20 16:03:49 -0400
committerJeff Garzik <jeff@garzik.org>2007-09-25 00:04:17 -0400
commite0c281163d634e2982a81b55fc974a6663afde65 (patch)
tree42b40711682d313e53d4a36a0acf33583b865e45
parent6d3105d5388c359882068b161b431ab3db4b3721 (diff)
sky2: be more selective about FIFO watchdog
Be more selective about when to enable the ram buffer watchdog code. It is unnecessary on XL A3 or later revs, and with Yukon FE the buffer is so small (4K) that the watchdog detects false positives. Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org> Signed-off-by: Jeff Garzik <jeff@garzik.org>
-rw-r--r--drivers/net/sky2.c27
-rw-r--r--drivers/net/sky2.h2
2 files changed, 15 insertions, 14 deletions
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
index f3a8243219ae..0792031a5cf9 100644
--- a/drivers/net/sky2.c
+++ b/drivers/net/sky2.c
@@ -826,7 +826,8 @@ static void sky2_mac_init(struct sky2_hw *hw, unsigned port)
826 sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_RST_CLR); 826 sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_RST_CLR);
827 sky2_write16(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_OPER_ON); 827 sky2_write16(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_OPER_ON);
828 828
829 if (!(hw->flags & SKY2_HW_RAMBUFFER)) { 829 /* On chips without ram buffer, pause is controled by MAC level */
830 if (sky2_read8(hw, B2_E_0) == 0) {
830 sky2_write8(hw, SK_REG(port, RX_GMF_LP_THR), 768/8); 831 sky2_write8(hw, SK_REG(port, RX_GMF_LP_THR), 768/8);
831 sky2_write8(hw, SK_REG(port, RX_GMF_UP_THR), 1024/8); 832 sky2_write8(hw, SK_REG(port, RX_GMF_UP_THR), 1024/8);
832 833
@@ -1281,7 +1282,7 @@ static int sky2_up(struct net_device *dev)
1281 struct sky2_port *sky2 = netdev_priv(dev); 1282 struct sky2_port *sky2 = netdev_priv(dev);
1282 struct sky2_hw *hw = sky2->hw; 1283 struct sky2_hw *hw = sky2->hw;
1283 unsigned port = sky2->port; 1284 unsigned port = sky2->port;
1284 u32 imask; 1285 u32 imask, ramsize;
1285 int cap, err = -ENOMEM; 1286 int cap, err = -ENOMEM;
1286 struct net_device *otherdev = hw->dev[sky2->port^1]; 1287 struct net_device *otherdev = hw->dev[sky2->port^1];
1287 1288
@@ -1336,13 +1337,12 @@ static int sky2_up(struct net_device *dev)
1336 1337
1337 sky2_mac_init(hw, port); 1338 sky2_mac_init(hw, port);
1338 1339
1339 if (hw->flags & SKY2_HW_RAMBUFFER) { 1340 /* Register is number of 4K blocks on internal RAM buffer. */
1340 /* Register is number of 4K blocks on internal RAM buffer. */ 1341 ramsize = sky2_read8(hw, B2_E_0) * 4;
1341 u32 ramsize = sky2_read8(hw, B2_E_0) * 4; 1342 if (ramsize > 0) {
1342 u32 rxspace; 1343 u32 rxspace;
1343 1344
1344 printk(KERN_DEBUG PFX "%s: ram buffer %dK\n", dev->name, ramsize); 1345 pr_debug(PFX "%s: ram buffer %dK\n", dev->name, ramsize);
1345
1346 if (ramsize < 16) 1346 if (ramsize < 16)
1347 rxspace = ramsize / 2; 1347 rxspace = ramsize / 2;
1348 else 1348 else
@@ -2005,7 +2005,7 @@ static int sky2_change_mtu(struct net_device *dev, int new_mtu)
2005 2005
2006 synchronize_irq(hw->pdev->irq); 2006 synchronize_irq(hw->pdev->irq);
2007 2007
2008 if (!(hw->flags & SKY2_HW_RAMBUFFER)) 2008 if (sky2_read8(hw, B2_E_0) == 0)
2009 sky2_set_tx_stfwd(hw, port); 2009 sky2_set_tx_stfwd(hw, port);
2010 2010
2011 ctl = gma_read16(hw, port, GM_GP_CTRL); 2011 ctl = gma_read16(hw, port, GM_GP_CTRL);
@@ -2536,7 +2536,7 @@ static void sky2_watchdog(unsigned long arg)
2536 ++active; 2536 ++active;
2537 2537
2538 /* For chips with Rx FIFO, check if stuck */ 2538 /* For chips with Rx FIFO, check if stuck */
2539 if ((hw->flags & SKY2_HW_RAMBUFFER) && 2539 if ((hw->flags & SKY2_HW_FIFO_HANG_CHECK) &&
2540 sky2_rx_hung(dev)) { 2540 sky2_rx_hung(dev)) {
2541 pr_info(PFX "%s: receiver hang detected\n", 2541 pr_info(PFX "%s: receiver hang detected\n",
2542 dev->name); 2542 dev->name);
@@ -2694,8 +2694,10 @@ static int __devinit sky2_init(struct sky2_hw *hw)
2694 switch(hw->chip_id) { 2694 switch(hw->chip_id) {
2695 case CHIP_ID_YUKON_XL: 2695 case CHIP_ID_YUKON_XL:
2696 hw->flags = SKY2_HW_GIGABIT 2696 hw->flags = SKY2_HW_GIGABIT
2697 | SKY2_HW_NEWER_PHY 2697 | SKY2_HW_NEWER_PHY;
2698 | SKY2_HW_RAMBUFFER; 2698 if (hw->chip_rev < 3)
2699 hw->flags |= SKY2_HW_FIFO_HANG_CHECK;
2700
2699 break; 2701 break;
2700 2702
2701 case CHIP_ID_YUKON_EC_U: 2703 case CHIP_ID_YUKON_EC_U:
@@ -2721,11 +2723,10 @@ static int __devinit sky2_init(struct sky2_hw *hw)
2721 dev_err(&hw->pdev->dev, "unsupported revision Yukon-EC rev A1\n"); 2723 dev_err(&hw->pdev->dev, "unsupported revision Yukon-EC rev A1\n");
2722 return -EOPNOTSUPP; 2724 return -EOPNOTSUPP;
2723 } 2725 }
2724 hw->flags = SKY2_HW_GIGABIT | SKY2_HW_RAMBUFFER; 2726 hw->flags = SKY2_HW_GIGABIT | SKY2_HW_FIFO_HANG_CHECK;
2725 break; 2727 break;
2726 2728
2727 case CHIP_ID_YUKON_FE: 2729 case CHIP_ID_YUKON_FE:
2728 hw->flags = SKY2_HW_RAMBUFFER;
2729 break; 2730 break;
2730 2731
2731 case CHIP_ID_YUKON_FE_P: 2732 case CHIP_ID_YUKON_FE_P:
diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h
index 69cd98400fe6..8bc5c54e3efa 100644
--- a/drivers/net/sky2.h
+++ b/drivers/net/sky2.h
@@ -2063,7 +2063,7 @@ struct sky2_hw {
2063#define SKY2_HW_FIBRE_PHY 0x00000002 2063#define SKY2_HW_FIBRE_PHY 0x00000002
2064#define SKY2_HW_GIGABIT 0x00000004 2064#define SKY2_HW_GIGABIT 0x00000004
2065#define SKY2_HW_NEWER_PHY 0x00000008 2065#define SKY2_HW_NEWER_PHY 0x00000008
2066#define SKY2_HW_RAMBUFFER 0x00000010 /* chip has RAM FIFO */ 2066#define SKY2_HW_FIFO_HANG_CHECK 0x00000010
2067#define SKY2_HW_NEW_LE 0x00000020 /* new LSOv2 format */ 2067#define SKY2_HW_NEW_LE 0x00000020 /* new LSOv2 format */
2068#define SKY2_HW_AUTO_TX_SUM 0x00000040 /* new IP decode for Tx */ 2068#define SKY2_HW_AUTO_TX_SUM 0x00000040 /* new IP decode for Tx */
2069#define SKY2_HW_ADV_POWER_CTL 0x00000080 /* additional PHY power regs */ 2069#define SKY2_HW_ADV_POWER_CTL 0x00000080 /* additional PHY power regs */