|
@@ -1486,6 +1486,20 @@ bnx2_set_default_link(struct bnx2 *bp)
|
|
|
bp->advertising = ETHTOOL_ALL_COPPER_SPEED | ADVERTISED_Autoneg;
|
|
|
}
|
|
|
|
|
|
+static void
|
|
|
+bnx2_send_heart_beat(struct bnx2 *bp)
|
|
|
+{
|
|
|
+ u32 msg;
|
|
|
+ u32 addr;
|
|
|
+
|
|
|
+ spin_lock(&bp->indirect_lock);
|
|
|
+ msg = (u32) (++bp->fw_drv_pulse_wr_seq & BNX2_DRV_PULSE_SEQ_MASK);
|
|
|
+ addr = bp->shmem_base + BNX2_DRV_PULSE_MB;
|
|
|
+ REG_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, addr);
|
|
|
+ REG_WR(bp, BNX2_PCICFG_REG_WINDOW, msg);
|
|
|
+ spin_unlock(&bp->indirect_lock);
|
|
|
+}
|
|
|
+
|
|
|
static void
|
|
|
bnx2_remote_phy_event(struct bnx2 *bp)
|
|
|
{
|
|
@@ -1495,6 +1509,11 @@ bnx2_remote_phy_event(struct bnx2 *bp)
|
|
|
|
|
|
msg = REG_RD_IND(bp, bp->shmem_base + BNX2_LINK_STATUS);
|
|
|
|
|
|
+ if (msg & BNX2_LINK_STATUS_HEART_BEAT_EXPIRED)
|
|
|
+ bnx2_send_heart_beat(bp);
|
|
|
+
|
|
|
+ msg &= ~BNX2_LINK_STATUS_HEART_BEAT_EXPIRED;
|
|
|
+
|
|
|
if ((msg & BNX2_LINK_STATUS_LINK_UP) == BNX2_LINK_STATUS_LINK_DOWN)
|
|
|
bp->link_up = 0;
|
|
|
else {
|
|
@@ -1572,6 +1591,7 @@ bnx2_set_remote_link(struct bnx2 *bp)
|
|
|
break;
|
|
|
case BNX2_FW_EVT_CODE_SW_TIMER_EXPIRATION_EVENT:
|
|
|
default:
|
|
|
+ bnx2_send_heart_beat(bp);
|
|
|
break;
|
|
|
}
|
|
|
return 0;
|
|
@@ -4122,7 +4142,7 @@ bnx2_init_chip(struct bnx2 *bp)
|
|
|
rc = bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT2 | BNX2_DRV_MSG_CODE_RESET,
|
|
|
0);
|
|
|
|
|
|
- REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS, 0x5ffffff);
|
|
|
+ REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS, BNX2_MISC_ENABLE_DEFAULT);
|
|
|
REG_RD(bp, BNX2_MISC_ENABLE_SET_BITS);
|
|
|
|
|
|
udelay(20);
|
|
@@ -4930,7 +4950,6 @@ static void
|
|
|
bnx2_timer(unsigned long data)
|
|
|
{
|
|
|
struct bnx2 *bp = (struct bnx2 *) data;
|
|
|
- u32 msg;
|
|
|
|
|
|
if (!netif_running(bp->dev))
|
|
|
return;
|
|
@@ -4938,8 +4957,7 @@ bnx2_timer(unsigned long data)
|
|
|
if (atomic_read(&bp->intr_sem) != 0)
|
|
|
goto bnx2_restart_timer;
|
|
|
|
|
|
- msg = (u32) ++bp->fw_drv_pulse_wr_seq;
|
|
|
- REG_WR_IND(bp, bp->shmem_base + BNX2_DRV_PULSE_MB, msg);
|
|
|
+ bnx2_send_heart_beat(bp);
|
|
|
|
|
|
bp->stats_blk->stat_FwRxDrop = REG_RD_IND(bp, BNX2_FW_RX_DROP_COUNT);
|
|
|
|