Skip to content

Commit

Permalink
mii: Handle link state changes for forced modes in mii_check_media()
Browse files Browse the repository at this point in the history
mii_check_media() does not update the link (carrier) state or log link
changes when the link mode is forced.  Drivers using the mii library
must do this themselves, but most of them do not.

Instead of changing them all, provide a sensible default behaviour
similar to mii_check_link() when the mode is forced.

via-rhine depends on it being a no-op in this case, so make its call
to mii_check_media() conditional.

Signed-off-by: Ben Hutchings <ben.hutchings@codethink.co.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Ben Hutchings authored and David S. Miller committed Jan 19, 2015
1 parent 8f1115b commit 5bdc738
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 7 deletions.
2 changes: 1 addition & 1 deletion drivers/net/ethernet/amd/pcnet32.c
Original file line number Diff line number Diff line change
Expand Up @@ -2806,7 +2806,7 @@ static void pcnet32_check_media(struct net_device *dev, int verbose)

/*
* Check for loss of link and link establishment.
* Can not use mii_check_media because it does nothing if mode is forced.
* Could possibly be changed to use mii_check_media instead.
*/

static void pcnet32_watchdog(struct net_device *dev)
Expand Down
3 changes: 2 additions & 1 deletion drivers/net/ethernet/via/via-rhine.c
Original file line number Diff line number Diff line change
Expand Up @@ -1326,7 +1326,8 @@ static void rhine_check_media(struct net_device *dev, unsigned int init_media)
struct rhine_private *rp = netdev_priv(dev);
void __iomem *ioaddr = rp->base;

mii_check_media(&rp->mii_if, netif_msg_link(rp), init_media);
if (!rp->mii_if.force_media)
mii_check_media(&rp->mii_if, netif_msg_link(rp), init_media);

if (rp->mii_if.full_duplex)
iowrite8(ioread8(ioaddr + ChipCmd1) | Cmd1FDuplex,
Expand Down
12 changes: 7 additions & 5 deletions drivers/net/mii.c
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,7 @@ void mii_check_link (struct mii_if_info *mii)
}

/**
* mii_check_media - check the MII interface for a duplex change
* mii_check_media - check the MII interface for a carrier/speed/duplex change
* @mii: the MII interface
* @ok_to_print: OK to print link up/down messages
* @init_media: OK to save duplex mode in @mii
Expand All @@ -318,10 +318,6 @@ unsigned int mii_check_media (struct mii_if_info *mii,
int advertise, lpa, media, duplex;
int lpa2 = 0;

/* if forced media, go no further */
if (mii->force_media)
return 0; /* duplex did not change */

/* check current and old link status */
old_carrier = netif_carrier_ok(mii->dev) ? 1 : 0;
new_carrier = (unsigned int) mii_link_ok(mii);
Expand All @@ -345,6 +341,12 @@ unsigned int mii_check_media (struct mii_if_info *mii,
*/
netif_carrier_on(mii->dev);

if (mii->force_media) {
if (ok_to_print)
netdev_info(mii->dev, "link up\n");
return 0; /* duplex did not change */
}

/* get MII advertise and LPA values */
if ((!init_media) && (mii->advertising))
advertise = mii->advertising;
Expand Down

0 comments on commit 5bdc738

Please sign in to comment.