[BNX2]: Add bnx2_5706_serdes_timer().
Separate the 5706S SerDes handling code in bnx2_timer() and put it in a new function. Signed-off-by: Michael Chan <mchan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
80be44348e
commit
48b01e2d7c
1 changed files with 57 additions and 58 deletions
|
@ -4172,6 +4172,61 @@ bnx2_test_intr(struct bnx2 *bp)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
static void
|
||||
bnx2_5706_serdes_timer(struct bnx2 *bp)
|
||||
{
|
||||
spin_lock(&bp->phy_lock);
|
||||
if (bp->serdes_an_pending)
|
||||
bp->serdes_an_pending--;
|
||||
else if ((bp->link_up == 0) && (bp->autoneg & AUTONEG_SPEED)) {
|
||||
u32 bmcr;
|
||||
|
||||
bp->current_interval = bp->timer_interval;
|
||||
|
||||
bnx2_read_phy(bp, MII_BMCR, &bmcr);
|
||||
|
||||
if (bmcr & BMCR_ANENABLE) {
|
||||
u32 phy1, phy2;
|
||||
|
||||
bnx2_write_phy(bp, 0x1c, 0x7c00);
|
||||
bnx2_read_phy(bp, 0x1c, &phy1);
|
||||
|
||||
bnx2_write_phy(bp, 0x17, 0x0f01);
|
||||
bnx2_read_phy(bp, 0x15, &phy2);
|
||||
bnx2_write_phy(bp, 0x17, 0x0f01);
|
||||
bnx2_read_phy(bp, 0x15, &phy2);
|
||||
|
||||
if ((phy1 & 0x10) && /* SIGNAL DETECT */
|
||||
!(phy2 & 0x20)) { /* no CONFIG */
|
||||
|
||||
bmcr &= ~BMCR_ANENABLE;
|
||||
bmcr |= BMCR_SPEED1000 | BMCR_FULLDPLX;
|
||||
bnx2_write_phy(bp, MII_BMCR, bmcr);
|
||||
bp->phy_flags |= PHY_PARALLEL_DETECT_FLAG;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ((bp->link_up) && (bp->autoneg & AUTONEG_SPEED) &&
|
||||
(bp->phy_flags & PHY_PARALLEL_DETECT_FLAG)) {
|
||||
u32 phy2;
|
||||
|
||||
bnx2_write_phy(bp, 0x17, 0x0f01);
|
||||
bnx2_read_phy(bp, 0x15, &phy2);
|
||||
if (phy2 & 0x20) {
|
||||
u32 bmcr;
|
||||
|
||||
bnx2_read_phy(bp, MII_BMCR, &bmcr);
|
||||
bmcr |= BMCR_ANENABLE;
|
||||
bnx2_write_phy(bp, MII_BMCR, bmcr);
|
||||
|
||||
bp->phy_flags &= ~PHY_PARALLEL_DETECT_FLAG;
|
||||
}
|
||||
} else
|
||||
bp->current_interval = bp->timer_interval;
|
||||
|
||||
spin_unlock(&bp->phy_lock);
|
||||
}
|
||||
|
||||
static void
|
||||
bnx2_timer(unsigned long data)
|
||||
{
|
||||
|
@ -4190,64 +4245,8 @@ bnx2_timer(unsigned long data)
|
|||
bp->stats_blk->stat_FwRxDrop = REG_RD_IND(bp, BNX2_FW_RX_DROP_COUNT);
|
||||
|
||||
if ((bp->phy_flags & PHY_SERDES_FLAG) &&
|
||||
(CHIP_NUM(bp) == CHIP_NUM_5706)) {
|
||||
|
||||
spin_lock(&bp->phy_lock);
|
||||
if (bp->serdes_an_pending) {
|
||||
bp->serdes_an_pending--;
|
||||
}
|
||||
else if ((bp->link_up == 0) && (bp->autoneg & AUTONEG_SPEED)) {
|
||||
u32 bmcr;
|
||||
|
||||
bp->current_interval = bp->timer_interval;
|
||||
|
||||
bnx2_read_phy(bp, MII_BMCR, &bmcr);
|
||||
|
||||
if (bmcr & BMCR_ANENABLE) {
|
||||
u32 phy1, phy2;
|
||||
|
||||
bnx2_write_phy(bp, 0x1c, 0x7c00);
|
||||
bnx2_read_phy(bp, 0x1c, &phy1);
|
||||
|
||||
bnx2_write_phy(bp, 0x17, 0x0f01);
|
||||
bnx2_read_phy(bp, 0x15, &phy2);
|
||||
bnx2_write_phy(bp, 0x17, 0x0f01);
|
||||
bnx2_read_phy(bp, 0x15, &phy2);
|
||||
|
||||
if ((phy1 & 0x10) && /* SIGNAL DETECT */
|
||||
!(phy2 & 0x20)) { /* no CONFIG */
|
||||
|
||||
bmcr &= ~BMCR_ANENABLE;
|
||||
bmcr |= BMCR_SPEED1000 |
|
||||
BMCR_FULLDPLX;
|
||||
bnx2_write_phy(bp, MII_BMCR, bmcr);
|
||||
bp->phy_flags |=
|
||||
PHY_PARALLEL_DETECT_FLAG;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ((bp->link_up) && (bp->autoneg & AUTONEG_SPEED) &&
|
||||
(bp->phy_flags & PHY_PARALLEL_DETECT_FLAG)) {
|
||||
u32 phy2;
|
||||
|
||||
bnx2_write_phy(bp, 0x17, 0x0f01);
|
||||
bnx2_read_phy(bp, 0x15, &phy2);
|
||||
if (phy2 & 0x20) {
|
||||
u32 bmcr;
|
||||
|
||||
bnx2_read_phy(bp, MII_BMCR, &bmcr);
|
||||
bmcr |= BMCR_ANENABLE;
|
||||
bnx2_write_phy(bp, MII_BMCR, bmcr);
|
||||
|
||||
bp->phy_flags &= ~PHY_PARALLEL_DETECT_FLAG;
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
bp->current_interval = bp->timer_interval;
|
||||
|
||||
spin_unlock(&bp->phy_lock);
|
||||
}
|
||||
(CHIP_NUM(bp) == CHIP_NUM_5706))
|
||||
bnx2_5706_serdes_timer(bp);
|
||||
|
||||
bnx2_restart_timer:
|
||||
mod_timer(&bp->timer, jiffies + bp->current_interval);
|
||||
|
|
Loading…
Reference in a new issue