--- a/drivers/net/ethernet/broadcom/b44.c +++ b/drivers/net/ethernet/broadcom/b44.c @@ -576,7 +576,6 @@ static void b44_check_phy(struct b44 *bp else val &= ~TX_CTRL_DUPLEX; bw32(bp, B44_TX_CTRL, val); - netif_carrier_on(bp->dev); b44_link_report(bp); } return; @@ -1511,6 +1510,10 @@ static int b44_open(struct net_device *d add_timer(&bp->timer); b44_enable_ints(bp); + + if (bp->flags & B44_FLAG_EXTERNAL_PHY) + phy_start(bp->phydev); + netif_start_queue(dev); out: return err; @@ -1673,6 +1676,9 @@ static int b44_close(struct net_device * netif_stop_queue(dev); + if (bp->flags & B44_FLAG_EXTERNAL_PHY) + phy_stop(bp->phydev); + napi_disable(&bp->napi); del_timer_sync(&bp->timer); @@ -2251,8 +2257,13 @@ static void b44_adjust_link(struct net_d } if (status_changed) { - b44_check_phy(bp); - phy_print_status(phydev); + u32 val = br32(bp, B44_TX_CTRL); + if (bp->flags & B44_FLAG_FULL_DUPLEX) + val |= TX_CTRL_DUPLEX; + else + val &= ~TX_CTRL_DUPLEX; + bw32(bp, B44_TX_CTRL, val); + b44_link_report(bp); } }