|
@@ -69,8 +69,8 @@
|
|
|
|
|
|
#define DRV_MODULE_NAME "tg3"
|
|
|
#define PFX DRV_MODULE_NAME ": "
|
|
|
-#define DRV_MODULE_VERSION "3.56"
|
|
|
-#define DRV_MODULE_RELDATE "Apr 1, 2006"
|
|
|
+#define DRV_MODULE_VERSION "3.57"
|
|
|
+#define DRV_MODULE_RELDATE "Apr 28, 2006"
|
|
|
|
|
|
#define TG3_DEF_MAC_MODE 0
|
|
|
#define TG3_DEF_RX_MODE 0
|
|
@@ -974,6 +974,8 @@ static int tg3_phy_reset_5703_4_5(struct tg3 *tp)
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+static void tg3_link_report(struct tg3 *);
|
|
|
+
|
|
|
/* This will reset the tigon3 PHY if there is no valid
|
|
|
* link unless the FORCE argument is non-zero.
|
|
|
*/
|
|
@@ -987,6 +989,11 @@ static int tg3_phy_reset(struct tg3 *tp)
|
|
|
if (err != 0)
|
|
|
return -EBUSY;
|
|
|
|
|
|
+ if (netif_running(tp->dev) && netif_carrier_ok(tp->dev)) {
|
|
|
+ netif_carrier_off(tp->dev);
|
|
|
+ tg3_link_report(tp);
|
|
|
+ }
|
|
|
+
|
|
|
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
|
|
|
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||
|
|
|
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
|
|
@@ -1023,6 +1030,12 @@ out:
|
|
|
tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x14e2);
|
|
|
tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400);
|
|
|
}
|
|
|
+ else if (tp->tg3_flags2 & TG3_FLG2_PHY_JITTER_BUG) {
|
|
|
+ tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0c00);
|
|
|
+ tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000a);
|
|
|
+ tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x010b);
|
|
|
+ tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400);
|
|
|
+ }
|
|
|
/* Set Extended packet length bit (bit 14) on all chips that */
|
|
|
/* support jumbo frames */
|
|
|
if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) {
|
|
@@ -3531,7 +3544,7 @@ static irqreturn_t tg3_test_isr(int irq, void *dev_id,
|
|
|
return IRQ_RETVAL(0);
|
|
|
}
|
|
|
|
|
|
-static int tg3_init_hw(struct tg3 *);
|
|
|
+static int tg3_init_hw(struct tg3 *, int);
|
|
|
static int tg3_halt(struct tg3 *, int, int);
|
|
|
|
|
|
#ifdef CONFIG_NET_POLL_CONTROLLER
|
|
@@ -3567,7 +3580,7 @@ static void tg3_reset_task(void *_data)
|
|
|
tp->tg3_flags2 &= ~TG3_FLG2_RESTART_TIMER;
|
|
|
|
|
|
tg3_halt(tp, RESET_KIND_SHUTDOWN, 0);
|
|
|
- tg3_init_hw(tp);
|
|
|
+ tg3_init_hw(tp, 1);
|
|
|
|
|
|
tg3_netif_start(tp);
|
|
|
|
|
@@ -4042,7 +4055,7 @@ static int tg3_change_mtu(struct net_device *dev, int new_mtu)
|
|
|
|
|
|
tg3_set_mtu(dev, tp, new_mtu);
|
|
|
|
|
|
- tg3_init_hw(tp);
|
|
|
+ tg3_init_hw(tp, 0);
|
|
|
|
|
|
tg3_netif_start(tp);
|
|
|
|
|
@@ -5719,9 +5732,23 @@ static int tg3_set_mac_addr(struct net_device *dev, void *p)
|
|
|
if (!netif_running(dev))
|
|
|
return 0;
|
|
|
|
|
|
- spin_lock_bh(&tp->lock);
|
|
|
- __tg3_set_mac_addr(tp);
|
|
|
- spin_unlock_bh(&tp->lock);
|
|
|
+ if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) {
|
|
|
+ /* Reset chip so that ASF can re-init any MAC addresses it
|
|
|
+ * needs.
|
|
|
+ */
|
|
|
+ tg3_netif_stop(tp);
|
|
|
+ tg3_full_lock(tp, 1);
|
|
|
+
|
|
|
+ tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
|
|
|
+ tg3_init_hw(tp, 0);
|
|
|
+
|
|
|
+ tg3_netif_start(tp);
|
|
|
+ tg3_full_unlock(tp);
|
|
|
+ } else {
|
|
|
+ spin_lock_bh(&tp->lock);
|
|
|
+ __tg3_set_mac_addr(tp);
|
|
|
+ spin_unlock_bh(&tp->lock);
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -5771,7 +5798,7 @@ static void __tg3_set_coalesce(struct tg3 *tp, struct ethtool_coalesce *ec)
|
|
|
}
|
|
|
|
|
|
/* tp->lock is held. */
|
|
|
-static int tg3_reset_hw(struct tg3 *tp)
|
|
|
+static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
|
|
|
{
|
|
|
u32 val, rdmac_mode;
|
|
|
int i, err, limit;
|
|
@@ -5786,7 +5813,7 @@ static int tg3_reset_hw(struct tg3 *tp)
|
|
|
tg3_abort_hw(tp, 1);
|
|
|
}
|
|
|
|
|
|
- if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES)
|
|
|
+ if ((tp->tg3_flags2 & TG3_FLG2_MII_SERDES) && reset_phy)
|
|
|
tg3_phy_reset(tp);
|
|
|
|
|
|
err = tg3_chip_reset(tp);
|
|
@@ -6327,7 +6354,7 @@ static int tg3_reset_hw(struct tg3 *tp)
|
|
|
tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl);
|
|
|
}
|
|
|
|
|
|
- err = tg3_setup_phy(tp, 1);
|
|
|
+ err = tg3_setup_phy(tp, reset_phy);
|
|
|
if (err)
|
|
|
return err;
|
|
|
|
|
@@ -6400,7 +6427,7 @@ static int tg3_reset_hw(struct tg3 *tp)
|
|
|
/* Called at device open time to get the chip ready for
|
|
|
* packet processing. Invoked with tp->lock held.
|
|
|
*/
|
|
|
-static int tg3_init_hw(struct tg3 *tp)
|
|
|
+static int tg3_init_hw(struct tg3 *tp, int reset_phy)
|
|
|
{
|
|
|
int err;
|
|
|
|
|
@@ -6413,7 +6440,7 @@ static int tg3_init_hw(struct tg3 *tp)
|
|
|
|
|
|
tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0);
|
|
|
|
|
|
- err = tg3_reset_hw(tp);
|
|
|
+ err = tg3_reset_hw(tp, reset_phy);
|
|
|
|
|
|
out:
|
|
|
return err;
|
|
@@ -6683,7 +6710,7 @@ static int tg3_test_msi(struct tg3 *tp)
|
|
|
tg3_full_lock(tp, 1);
|
|
|
|
|
|
tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
|
|
|
- err = tg3_init_hw(tp);
|
|
|
+ err = tg3_init_hw(tp, 1);
|
|
|
|
|
|
tg3_full_unlock(tp);
|
|
|
|
|
@@ -6748,7 +6775,7 @@ static int tg3_open(struct net_device *dev)
|
|
|
|
|
|
tg3_full_lock(tp, 0);
|
|
|
|
|
|
- err = tg3_init_hw(tp);
|
|
|
+ err = tg3_init_hw(tp, 1);
|
|
|
if (err) {
|
|
|
tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
|
|
|
tg3_free_rings(tp);
|
|
@@ -7839,7 +7866,7 @@ static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *e
|
|
|
|
|
|
if (netif_running(dev)) {
|
|
|
tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
|
|
|
- tg3_init_hw(tp);
|
|
|
+ tg3_init_hw(tp, 1);
|
|
|
tg3_netif_start(tp);
|
|
|
}
|
|
|
|
|
@@ -7884,7 +7911,7 @@ static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam
|
|
|
|
|
|
if (netif_running(dev)) {
|
|
|
tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
|
|
|
- tg3_init_hw(tp);
|
|
|
+ tg3_init_hw(tp, 1);
|
|
|
tg3_netif_start(tp);
|
|
|
}
|
|
|
|
|
@@ -8522,7 +8549,7 @@ static int tg3_test_loopback(struct tg3 *tp)
|
|
|
if (!netif_running(tp->dev))
|
|
|
return TG3_LOOPBACK_FAILED;
|
|
|
|
|
|
- tg3_reset_hw(tp);
|
|
|
+ tg3_reset_hw(tp, 1);
|
|
|
|
|
|
if (tg3_run_loopback(tp, TG3_MAC_LOOPBACK))
|
|
|
err |= TG3_MAC_LOOPBACK_FAILED;
|
|
@@ -8596,7 +8623,7 @@ static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest,
|
|
|
tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
|
|
|
if (netif_running(dev)) {
|
|
|
tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
|
|
|
- tg3_init_hw(tp);
|
|
|
+ tg3_init_hw(tp, 1);
|
|
|
tg3_netif_start(tp);
|
|
|
}
|
|
|
|
|
@@ -9377,7 +9404,7 @@ static int tg3_nvram_write_block_buffered(struct tg3 *tp, u32 offset, u32 len,
|
|
|
|
|
|
if ((page_off == 0) || (i == 0))
|
|
|
nvram_cmd |= NVRAM_CMD_FIRST;
|
|
|
- else if (page_off == (tp->nvram_pagesize - 4))
|
|
|
+ if (page_off == (tp->nvram_pagesize - 4))
|
|
|
nvram_cmd |= NVRAM_CMD_LAST;
|
|
|
|
|
|
if (i == (len - 4))
|
|
@@ -10353,10 +10380,13 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
|
|
|
if (tp->pci_chip_rev_id == CHIPREV_ID_5704_A0)
|
|
|
tp->tg3_flags2 |= TG3_FLG2_PHY_5704_A0_BUG;
|
|
|
|
|
|
- if ((tp->tg3_flags2 & TG3_FLG2_5705_PLUS) &&
|
|
|
- (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5755) &&
|
|
|
- (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787))
|
|
|
- tp->tg3_flags2 |= TG3_FLG2_PHY_BER_BUG;
|
|
|
+ if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
|
|
|
+ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
|
|
|
+ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
|
|
|
+ tp->tg3_flags2 |= TG3_FLG2_PHY_JITTER_BUG;
|
|
|
+ else
|
|
|
+ tp->tg3_flags2 |= TG3_FLG2_PHY_BER_BUG;
|
|
|
+ }
|
|
|
|
|
|
tp->coalesce_mode = 0;
|
|
|
if (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_AX &&
|
|
@@ -11569,7 +11599,7 @@ static int tg3_suspend(struct pci_dev *pdev, pm_message_t state)
|
|
|
tg3_full_lock(tp, 0);
|
|
|
|
|
|
tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
|
|
|
- tg3_init_hw(tp);
|
|
|
+ tg3_init_hw(tp, 1);
|
|
|
|
|
|
tp->timer.expires = jiffies + tp->timer_offset;
|
|
|
add_timer(&tp->timer);
|
|
@@ -11603,7 +11633,7 @@ static int tg3_resume(struct pci_dev *pdev)
|
|
|
tg3_full_lock(tp, 0);
|
|
|
|
|
|
tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
|
|
|
- tg3_init_hw(tp);
|
|
|
+ tg3_init_hw(tp, 1);
|
|
|
|
|
|
tp->timer.expires = jiffies + tp->timer_offset;
|
|
|
add_timer(&tp->timer);
|