aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/ethernet/broadcom/tg3.c55
-rw-r--r--drivers/net/ethernet/broadcom/tg3.h3
2 files changed, 54 insertions, 4 deletions
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
index c3b12de0b918..7bc8449af262 100644
--- a/drivers/net/ethernet/broadcom/tg3.c
+++ b/drivers/net/ethernet/broadcom/tg3.c
@@ -8941,6 +8941,49 @@ static void tg3_restore_pci_state(struct tg3 *tp)
8941 } 8941 }
8942} 8942}
8943 8943
8944static void tg3_override_clk(struct tg3 *tp)
8945{
8946 u32 val;
8947
8948 switch (tg3_asic_rev(tp)) {
8949 case ASIC_REV_5717:
8950 val = tr32(TG3_CPMU_CLCK_ORIDE_ENABLE);
8951 tw32(TG3_CPMU_CLCK_ORIDE_ENABLE, val |
8952 TG3_CPMU_MAC_ORIDE_ENABLE);
8953 break;
8954
8955 case ASIC_REV_5719:
8956 case ASIC_REV_5720:
8957 tw32(TG3_CPMU_CLCK_ORIDE, CPMU_CLCK_ORIDE_MAC_ORIDE_EN);
8958 break;
8959
8960 default:
8961 return;
8962 }
8963}
8964
8965static void tg3_restore_clk(struct tg3 *tp)
8966{
8967 u32 val;
8968
8969 switch (tg3_asic_rev(tp)) {
8970 case ASIC_REV_5717:
8971 val = tr32(TG3_CPMU_CLCK_ORIDE_ENABLE);
8972 tw32(TG3_CPMU_CLCK_ORIDE_ENABLE,
8973 val & ~TG3_CPMU_MAC_ORIDE_ENABLE);
8974 break;
8975
8976 case ASIC_REV_5719:
8977 case ASIC_REV_5720:
8978 val = tr32(TG3_CPMU_CLCK_ORIDE);
8979 tw32(TG3_CPMU_CLCK_ORIDE, val & ~CPMU_CLCK_ORIDE_MAC_ORIDE_EN);
8980 break;
8981
8982 default:
8983 return;
8984 }
8985}
8986
8944/* tp->lock is held. */ 8987/* tp->lock is held. */
8945static int tg3_chip_reset(struct tg3 *tp) 8988static int tg3_chip_reset(struct tg3 *tp)
8946{ 8989{
@@ -9029,6 +9072,13 @@ static int tg3_chip_reset(struct tg3 *tp)
9029 tr32(GRC_VCPU_EXT_CTRL) & ~GRC_VCPU_EXT_CTRL_HALT_CPU); 9072 tr32(GRC_VCPU_EXT_CTRL) & ~GRC_VCPU_EXT_CTRL_HALT_CPU);
9030 } 9073 }
9031 9074
9075 /* Set the clock to the highest frequency to avoid timeouts. With link
9076 * aware mode, the clock speed could be slow and bootcode does not
9077 * complete within the expected time. Override the clock to allow the
9078 * bootcode to finish sooner and then restore it.
9079 */
9080 tg3_override_clk(tp);
9081
9032 /* Manage gphy power for all CPMU absent PCIe devices. */ 9082 /* Manage gphy power for all CPMU absent PCIe devices. */
9033 if (tg3_flag(tp, 5705_PLUS) && !tg3_flag(tp, CPMU_PRESENT)) 9083 if (tg3_flag(tp, 5705_PLUS) && !tg3_flag(tp, CPMU_PRESENT))
9034 val |= GRC_MISC_CFG_KEEP_GPHY_POWER; 9084 val |= GRC_MISC_CFG_KEEP_GPHY_POWER;
@@ -9167,10 +9217,7 @@ static int tg3_chip_reset(struct tg3 *tp)
9167 tw32(0x7c00, val | (1 << 25)); 9217 tw32(0x7c00, val | (1 << 25));
9168 } 9218 }
9169 9219
9170 if (tg3_asic_rev(tp) == ASIC_REV_5720) { 9220 tg3_restore_clk(tp);
9171 val = tr32(TG3_CPMU_CLCK_ORIDE);
9172 tw32(TG3_CPMU_CLCK_ORIDE, val & ~CPMU_CLCK_ORIDE_MAC_ORIDE_EN);
9173 }
9174 9221
9175 /* Reprobe ASF enable state. */ 9222 /* Reprobe ASF enable state. */
9176 tg3_flag_clear(tp, ENABLE_ASF); 9223 tg3_flag_clear(tp, ENABLE_ASF);
diff --git a/drivers/net/ethernet/broadcom/tg3.h b/drivers/net/ethernet/broadcom/tg3.h
index e4da9d7834ce..9e31eccc250b 100644
--- a/drivers/net/ethernet/broadcom/tg3.h
+++ b/drivers/net/ethernet/broadcom/tg3.h
@@ -1146,6 +1146,9 @@
1146#define TG3_CPMU_CLCK_ORIDE 0x00003624 1146#define TG3_CPMU_CLCK_ORIDE 0x00003624
1147#define CPMU_CLCK_ORIDE_MAC_ORIDE_EN 0x80000000 1147#define CPMU_CLCK_ORIDE_MAC_ORIDE_EN 0x80000000
1148 1148
1149#define TG3_CPMU_CLCK_ORIDE_ENABLE 0x00003628
1150#define TG3_CPMU_MAC_ORIDE_ENABLE (1 << 13)
1151
1149#define TG3_CPMU_STATUS 0x0000362c 1152#define TG3_CPMU_STATUS 0x0000362c
1150#define TG3_CPMU_STATUS_FMSK_5717 0x20000000 1153#define TG3_CPMU_STATUS_FMSK_5717 0x20000000
1151#define TG3_CPMU_STATUS_FMSK_5719 0xc0000000 1154#define TG3_CPMU_STATUS_FMSK_5719 0xc0000000