Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 41764
b: refs/heads/master
c: f8dd064
h: refs/heads/master
v: v3
  • Loading branch information
Michael Chan authored and David S. Miller committed Dec 3, 2006
1 parent 45e074c commit fd3a5d2
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 22 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 48b01e2d7c83d37321722f1cdd46193d4ca73b41
refs/heads/master: f8dd064ee1bd62ef2cdb398cb9cdc8a8f112cb28
77 changes: 56 additions & 21 deletions trunk/drivers/net/bnx2.c
Original file line number Diff line number Diff line change
Expand Up @@ -1067,19 +1067,17 @@ bnx2_setup_serdes_phy(struct bnx2 *bp)
bnx2_write_phy(bp, MII_ADVERTISE, new_adv);
bnx2_write_phy(bp, MII_BMCR, bmcr | BMCR_ANRESTART |
BMCR_ANENABLE);
if (CHIP_NUM(bp) == CHIP_NUM_5706) {
/* Speed up link-up time when the link partner
* does not autonegotiate which is very common
* in blade servers. Some blade servers use
* IPMI for kerboard input and it's important
* to minimize link disruptions. Autoneg. involves
* exchanging base pages plus 3 next pages and
* normally completes in about 120 msec.
*/
bp->current_interval = SERDES_AN_TIMEOUT;
bp->serdes_an_pending = 1;
mod_timer(&bp->timer, jiffies + bp->current_interval);
}
/* Speed up link-up time when the link partner
* does not autonegotiate which is very common
* in blade servers. Some blade servers use
* IPMI for kerboard input and it's important
* to minimize link disruptions. Autoneg. involves
* exchanging base pages plus 3 next pages and
* normally completes in about 120 msec.
*/
bp->current_interval = SERDES_AN_TIMEOUT;
bp->serdes_an_pending = 1;
mod_timer(&bp->timer, jiffies + bp->current_interval);
}

return 0;
Expand Down Expand Up @@ -4227,6 +4225,41 @@ bnx2_5706_serdes_timer(struct bnx2 *bp)
spin_unlock(&bp->phy_lock);
}

static void
bnx2_5708_serdes_timer(struct bnx2 *bp)
{
if ((bp->phy_flags & PHY_2_5G_CAPABLE_FLAG) == 0) {
bp->serdes_an_pending = 0;
return;
}

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;

bnx2_read_phy(bp, MII_BMCR, &bmcr);

if (bmcr & BMCR_ANENABLE) {
bmcr &= ~BMCR_ANENABLE;
bmcr |= BMCR_FULLDPLX | BCM5708S_BMCR_FORCE_2500;
bnx2_write_phy(bp, MII_BMCR, bmcr);
bp->current_interval = SERDES_FORCED_TIMEOUT;
} else {
bmcr &= ~(BMCR_FULLDPLX | BCM5708S_BMCR_FORCE_2500);
bmcr |= BMCR_ANENABLE;
bnx2_write_phy(bp, MII_BMCR, bmcr);
bp->serdes_an_pending = 2;
bp->current_interval = bp->timer_interval;
}

} else
bp->current_interval = bp->timer_interval;

spin_unlock(&bp->phy_lock);
}

static void
bnx2_timer(unsigned long data)
{
Expand All @@ -4244,9 +4277,12 @@ 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))
bnx2_5706_serdes_timer(bp);
if (bp->phy_flags & PHY_SERDES_FLAG) {
if (CHIP_NUM(bp) == CHIP_NUM_5706)
bnx2_5706_serdes_timer(bp);
else if (CHIP_NUM(bp) == CHIP_NUM_5708)
bnx2_5708_serdes_timer(bp);
}

bnx2_restart_timer:
mod_timer(&bp->timer, jiffies + bp->current_interval);
Expand Down Expand Up @@ -4917,11 +4953,10 @@ bnx2_nway_reset(struct net_device *dev)
msleep(20);

spin_lock_bh(&bp->phy_lock);
if (CHIP_NUM(bp) == CHIP_NUM_5706) {
bp->current_interval = SERDES_AN_TIMEOUT;
bp->serdes_an_pending = 1;
mod_timer(&bp->timer, jiffies + bp->current_interval);
}

bp->current_interval = SERDES_AN_TIMEOUT;
bp->serdes_an_pending = 1;
mod_timer(&bp->timer, jiffies + bp->current_interval);
}

bnx2_read_phy(bp, MII_BMCR, &bmcr);
Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/net/bnx2.h
Original file line number Diff line number Diff line change
Expand Up @@ -4040,6 +4040,7 @@ struct bnx2 {

u8 serdes_an_pending;
#define SERDES_AN_TIMEOUT (HZ / 3)
#define SERDES_FORCED_TIMEOUT (HZ / 10)

u8 mac_addr[8];

Expand Down

0 comments on commit fd3a5d2

Please sign in to comment.