Commit b5af7126 authored by Matt Carlson's avatar Matt Carlson Committed by David S. Miller

[TG3]: Add A1 revs

This patch adds the A1 revision of 5784, 5764, and 5761, and applies all
previous bugfixes.  In places where the list of devices gets too long,
the patch uses a new TG3_FLG3_5761_5784_AX_FIXES flag instead.
Signed-off-by: default avatarMatt Carlson <mcarlson@broadcom.com>
Signed-off-by: default avatarMichael Chan <mchan@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5f5c51e3
...@@ -1106,8 +1106,7 @@ static int tg3_phy_reset(struct tg3 *tp) ...@@ -1106,8 +1106,7 @@ static int tg3_phy_reset(struct tg3 *tp)
if (err) if (err)
return err; return err;
if (tp->pci_chip_rev_id == CHIPREV_ID_5784_A0 || if (tp->tg3_flags3 & TG3_FLG3_5761_5784_AX_FIXES) {
tp->pci_chip_rev_id == CHIPREV_ID_5761_A0) {
u32 val; u32 val;
val = tr32(TG3_CPMU_LSPD_1000MB_CLK); val = tr32(TG3_CPMU_LSPD_1000MB_CLK);
...@@ -1352,8 +1351,7 @@ static void tg3_power_down_phy(struct tg3 *tp) ...@@ -1352,8 +1351,7 @@ static void tg3_power_down_phy(struct tg3 *tp)
(tp->tg3_flags2 & TG3_FLG2_MII_SERDES))) (tp->tg3_flags2 & TG3_FLG2_MII_SERDES)))
return; return;
if (tp->pci_chip_rev_id == CHIPREV_ID_5784_A0 || if (tp->tg3_flags3 & TG3_FLG3_5761_5784_AX_FIXES) {
tp->pci_chip_rev_id == CHIPREV_ID_5761_A0) {
val = tr32(TG3_CPMU_LSPD_1000MB_CLK); val = tr32(TG3_CPMU_LSPD_1000MB_CLK);
val &= ~CPMU_LSPD_1000MB_MACCLK_MASK; val &= ~CPMU_LSPD_1000MB_MACCLK_MASK;
val |= CPMU_LSPD_1000MB_MACCLK_12_5; val |= CPMU_LSPD_1000MB_MACCLK_12_5;
...@@ -3154,7 +3152,8 @@ static int tg3_setup_phy(struct tg3 *tp, int force_reset) ...@@ -3154,7 +3152,8 @@ static int tg3_setup_phy(struct tg3 *tp, int force_reset)
err = tg3_setup_copper_phy(tp, force_reset); err = tg3_setup_copper_phy(tp, force_reset);
} }
if (tp->pci_chip_rev_id == CHIPREV_ID_5784_A0) { if (tp->pci_chip_rev_id == CHIPREV_ID_5784_A0 ||
tp->pci_chip_rev_id == CHIPREV_ID_5784_A1) {
u32 val, scale; u32 val, scale;
val = tr32(TG3_CPMU_CLCK_STAT) & CPMU_CLCK_STAT_MAC_CLCK_MASK; val = tr32(TG3_CPMU_CLCK_STAT) & CPMU_CLCK_STAT_MAC_CLCK_MASK;
...@@ -6390,7 +6389,8 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) ...@@ -6390,7 +6389,8 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
tg3_write_sig_legacy(tp, RESET_KIND_INIT); tg3_write_sig_legacy(tp, RESET_KIND_INIT);
if (tp->pci_chip_rev_id == CHIPREV_ID_5784_A0) { if (tp->pci_chip_rev_id == CHIPREV_ID_5784_A0 ||
tp->pci_chip_rev_id == CHIPREV_ID_5784_A1) {
val = tr32(TG3_CPMU_CTRL); val = tr32(TG3_CPMU_CTRL);
val &= ~(CPMU_CTRL_LINK_AWARE_MODE | CPMU_CTRL_LINK_IDLE_MODE); val &= ~(CPMU_CTRL_LINK_AWARE_MODE | CPMU_CTRL_LINK_IDLE_MODE);
tw32(TG3_CPMU_CTRL, val); tw32(TG3_CPMU_CTRL, val);
...@@ -9379,8 +9379,7 @@ static int tg3_test_loopback(struct tg3 *tp) ...@@ -9379,8 +9379,7 @@ static int tg3_test_loopback(struct tg3 *tp)
if (err) if (err)
return TG3_LOOPBACK_FAILED; return TG3_LOOPBACK_FAILED;
if (tp->pci_chip_rev_id == CHIPREV_ID_5784_A0 || if (tp->tg3_flags3 & TG3_FLG3_5761_5784_AX_FIXES) {
tp->pci_chip_rev_id == CHIPREV_ID_5761_A0) {
int i; int i;
u32 status; u32 status;
...@@ -9407,8 +9406,7 @@ static int tg3_test_loopback(struct tg3 *tp) ...@@ -9407,8 +9406,7 @@ static int tg3_test_loopback(struct tg3 *tp)
if (tg3_run_loopback(tp, TG3_MAC_LOOPBACK)) if (tg3_run_loopback(tp, TG3_MAC_LOOPBACK))
err |= TG3_MAC_LOOPBACK_FAILED; err |= TG3_MAC_LOOPBACK_FAILED;
if (tp->pci_chip_rev_id == CHIPREV_ID_5784_A0 || if (tp->tg3_flags3 & TG3_FLG3_5761_5784_AX_FIXES) {
tp->pci_chip_rev_id == CHIPREV_ID_5761_A0) {
tw32(TG3_CPMU_CTRL, cpmuctrl); tw32(TG3_CPMU_CTRL, cpmuctrl);
/* Release the mutex */ /* Release the mutex */
...@@ -10629,7 +10627,8 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp) ...@@ -10629,7 +10627,8 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp)
tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL) tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL)
tp->led_ctrl = LED_CTRL_MODE_PHY_2; tp->led_ctrl = LED_CTRL_MODE_PHY_2;
if (tp->pci_chip_rev_id == CHIPREV_ID_5784_A0) if (tp->pci_chip_rev_id == CHIPREV_ID_5784_A0 ||
tp->pci_chip_rev_id == CHIPREV_ID_5784_A1)
tp->led_ctrl = LED_CTRL_MODE_MAC; tp->led_ctrl = LED_CTRL_MODE_MAC;
if (nic_cfg & NIC_SRAM_DATA_CFG_EEPROM_WP) { if (nic_cfg & NIC_SRAM_DATA_CFG_EEPROM_WP) {
...@@ -11401,9 +11400,16 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) ...@@ -11401,9 +11400,16 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
} }
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 || if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761) GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761) {
tp->tg3_flags |= TG3_FLAG_CPMU_PRESENT; tp->tg3_flags |= TG3_FLAG_CPMU_PRESENT;
if (tp->pci_chip_rev_id == CHIPREV_ID_5784_A0 ||
tp->pci_chip_rev_id == CHIPREV_ID_5784_A1 ||
tp->pci_chip_rev_id == CHIPREV_ID_5761_A0 ||
tp->pci_chip_rev_id == CHIPREV_ID_5761_A1)
tp->tg3_flags3 |= TG3_FLG3_5761_5784_AX_FIXES;
}
/* Set up tp->grc_local_ctrl before calling tg3_set_power_state(). /* Set up tp->grc_local_ctrl before calling tg3_set_power_state().
* GPIO1 driven high will bring 5700's external PHY out of reset. * GPIO1 driven high will bring 5700's external PHY out of reset.
* It is also used as eeprom write protect on LOMs. * It is also used as eeprom write protect on LOMs.
......
...@@ -109,7 +109,9 @@ ...@@ -109,7 +109,9 @@
#define CHIPREV_ID_5714_A2 0x9002 #define CHIPREV_ID_5714_A2 0x9002
#define CHIPREV_ID_5906_A1 0xc001 #define CHIPREV_ID_5906_A1 0xc001
#define CHIPREV_ID_5784_A0 0x5784000 #define CHIPREV_ID_5784_A0 0x5784000
#define CHIPREV_ID_5784_A1 0x5784001
#define CHIPREV_ID_5761_A0 0x5761000 #define CHIPREV_ID_5761_A0 0x5761000
#define CHIPREV_ID_5761_A1 0x5761001
#define GET_ASIC_REV(CHIP_REV_ID) ((CHIP_REV_ID) >> 12) #define GET_ASIC_REV(CHIP_REV_ID) ((CHIP_REV_ID) >> 12)
#define ASIC_REV_5700 0x07 #define ASIC_REV_5700 0x07
#define ASIC_REV_5701 0x00 #define ASIC_REV_5701 0x00
...@@ -2391,6 +2393,7 @@ struct tg3 { ...@@ -2391,6 +2393,7 @@ struct tg3 {
u32 tg3_flags3; u32 tg3_flags3;
#define TG3_FLG3_NO_NVRAM_ADDR_TRANS 0x00000001 #define TG3_FLG3_NO_NVRAM_ADDR_TRANS 0x00000001
#define TG3_FLG3_ENABLE_APE 0x00000002 #define TG3_FLG3_ENABLE_APE 0x00000002
#define TG3_FLG3_5761_5784_AX_FIXES 0x00000004
struct timer_list timer; struct timer_list timer;
u16 timer_counter; u16 timer_counter;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment