aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/tg3.c
diff options
context:
space:
mode:
authorMatt Carlson <mcarlson@broadcom.com>2008-05-02 19:47:53 -0400
committerDavid S. Miller <davem@davemloft.net>2008-05-02 19:47:53 -0400
commit8ef214288622bf523a3b3096958292a1c63132ad (patch)
treea9c1139ca15d642ec14a423d1ea163be81fbbce9 /drivers/net/tg3.c
parent026672d0997c911c9bef9aabe862884fc0add106 (diff)
tg3: Use constant 500KHz MI clock on adapters with a CPMU
The MI clock is not configured correctly on adapters with the CPMU present. The tg3 driver has code which statically sets the MI clock to be a fraction of the speed at which the core clock is running. However, the CPMU can change the adapter's core clock frequency based on operating conditions. Consequently, the MI will run slow when the core's clock has been slowed down. There is a new 500KHz constant frequency clock available on adapters with a CPMU. This patch removes the static core clock scaling and configures the MI clock to use this new 500KHz clock instead. Running the MI clock at slower speeds will not directly result in data corruption, but it does challenge the PHY read and write routine timeouts. Signed-off-by: Matt Carlson <mcarlson@broadcom.com> Signed-off-by: Michael Chan <mchan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/tg3.c')
-rw-r--r--drivers/net/tg3.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c
index b66c75e3b8a1..e0dc31fdf844 100644
--- a/drivers/net/tg3.c
+++ b/drivers/net/tg3.c
@@ -2097,9 +2097,11 @@ static int tg3_setup_copper_phy(struct tg3 *tp, int force_reset)
2097 MAC_STATUS_LNKSTATE_CHANGED)); 2097 MAC_STATUS_LNKSTATE_CHANGED));
2098 udelay(40); 2098 udelay(40);
2099 2099
2100 tp->mi_mode = MAC_MI_MODE_BASE; 2100 if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
2101 tw32_f(MAC_MI_MODE, tp->mi_mode); 2101 tw32_f(MAC_MI_MODE,
2102 udelay(80); 2102 (tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL));
2103 udelay(80);
2104 }
2103 2105
2104 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x02); 2106 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x02);
2105 2107
@@ -7102,7 +7104,7 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
7102 tp->link_config.autoneg = tp->link_config.orig_autoneg; 7104 tp->link_config.autoneg = tp->link_config.orig_autoneg;
7103 } 7105 }
7104 7106
7105 tp->mi_mode = MAC_MI_MODE_BASE; 7107 tp->mi_mode &= ~MAC_MI_MODE_AUTO_POLL;
7106 tw32_f(MAC_MI_MODE, tp->mi_mode); 7108 tw32_f(MAC_MI_MODE, tp->mi_mode);
7107 udelay(80); 7109 udelay(80);
7108 7110
@@ -11764,6 +11766,12 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
11764 tp->phy_otp = TG3_OTP_DEFAULT; 11766 tp->phy_otp = TG3_OTP_DEFAULT;
11765 } 11767 }
11766 11768
11769 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
11770 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761)
11771 tp->mi_mode = MAC_MI_MODE_500KHZ_CONST;
11772 else
11773 tp->mi_mode = MAC_MI_MODE_BASE;
11774
11767 tp->coalesce_mode = 0; 11775 tp->coalesce_mode = 0;
11768 if (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_AX && 11776 if (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_AX &&
11769 GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_BX) 11777 GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_BX)
@@ -12692,7 +12700,7 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
12692 tp->mac_mode = TG3_DEF_MAC_MODE; 12700 tp->mac_mode = TG3_DEF_MAC_MODE;
12693 tp->rx_mode = TG3_DEF_RX_MODE; 12701 tp->rx_mode = TG3_DEF_RX_MODE;
12694 tp->tx_mode = TG3_DEF_TX_MODE; 12702 tp->tx_mode = TG3_DEF_TX_MODE;
12695 tp->mi_mode = MAC_MI_MODE_BASE; 12703
12696 if (tg3_debug > 0) 12704 if (tg3_debug > 0)
12697 tp->msg_enable = tg3_debug; 12705 tp->msg_enable = tg3_debug;
12698 else 12706 else