diff --git a/kernel/wr_nic/endpoint.c b/kernel/wr_nic/endpoint.c index c4e289fba9a8d8ed301f71815fb47ee25f0734da..76da248048f959a96ba04d03c4a799a849192bc5 100644 --- a/kernel/wr_nic/endpoint.c +++ b/kernel/wr_nic/endpoint.c @@ -101,7 +101,8 @@ static void wrn_update_link_status(struct net_device *dev) { struct wrn_ep *ep = netdev_priv(dev); u32 ecr, bmsr, bmcr, lpa; - + uint32_t value; + bmsr = wrn_phy_read(dev, 0, MII_BMSR); bmcr = wrn_phy_read(dev, 0, MII_BMCR); @@ -112,6 +113,9 @@ static void wrn_update_link_status(struct net_device *dev) if (!mii_link_ok(&ep->mii)) { if(netif_carrier_ok(dev)) { netif_carrier_off(dev); + /* Reset SFP */ + value = wrn_phy_read(dev, 0, MII_BMCR); + wrn_phy_write(dev, 0, MII_BMCR, value | BMCR_RESET); clear_bit(WRN_EP_UP, &ep->ep_flags); printk(KERN_INFO "%s: Link down.\n", dev->name); return;