diff options
Diffstat (limited to 'drivers/net/mii.c')
| -rw-r--r-- | drivers/net/mii.c | 98 | 
1 files changed, 40 insertions, 58 deletions
diff --git a/drivers/net/mii.c b/drivers/net/mii.c index 210b2b164b3..4a99c391903 100644 --- a/drivers/net/mii.c +++ b/drivers/net/mii.c @@ -31,26 +31,15 @@  #include <linux/module.h>  #include <linux/netdevice.h>  #include <linux/ethtool.h> -#include <linux/mdio.h> +#include <linux/mii.h>  static u32 mii_get_an(struct mii_if_info *mii, u16 addr)  { -	u32 result = 0;  	int advert;  	advert = mii->mdio_read(mii->dev, mii->phy_id, addr); -	if (advert & LPA_LPACK) -		result |= ADVERTISED_Autoneg; -	if (advert & ADVERTISE_10HALF) -		result |= ADVERTISED_10baseT_Half; -	if (advert & ADVERTISE_10FULL) -		result |= ADVERTISED_10baseT_Full; -	if (advert & ADVERTISE_100HALF) -		result |= ADVERTISED_100baseT_Half; -	if (advert & ADVERTISE_100FULL) -		result |= ADVERTISED_100baseT_Full; - -	return result; + +	return mii_lpa_to_ethtool_lpa_t(advert);  }  /** @@ -58,6 +47,9 @@ static u32 mii_get_an(struct mii_if_info *mii, u16 addr)   * @mii: MII interface   * @ecmd: requested ethtool_cmd   * + * The @ecmd parameter is expected to have been cleared before calling + * mii_ethtool_gset(). + *   * Returns 0 for success, negative on error.   */  int mii_ethtool_gset(struct mii_if_info *mii, struct ethtool_cmd *ecmd) @@ -82,7 +74,7 @@ int mii_ethtool_gset(struct mii_if_info *mii, struct ethtool_cmd *ecmd)  	/* this isn't fully supported at higher layers */  	ecmd->phy_address = mii->phy_id; -	ecmd->mdio_support = MDIO_SUPPORTS_C22; +	ecmd->mdio_support = ETH_MDIO_SUPPORTS_C22;  	ecmd->advertising = ADVERTISED_TP | ADVERTISED_MII; @@ -97,19 +89,14 @@ int mii_ethtool_gset(struct mii_if_info *mii, struct ethtool_cmd *ecmd)  		ecmd->autoneg = AUTONEG_ENABLE;  		ecmd->advertising |= mii_get_an(mii, MII_ADVERTISE); -		if (ctrl1000 & ADVERTISE_1000HALF) -			ecmd->advertising |= ADVERTISED_1000baseT_Half; -		if (ctrl1000 & ADVERTISE_1000FULL) -			ecmd->advertising |= ADVERTISED_1000baseT_Full; +		if (mii->supports_gmii) +			ecmd->advertising |= +					mii_ctrl1000_to_ethtool_adv_t(ctrl1000);  		if (bmsr & BMSR_ANEGCOMPLETE) {  			ecmd->lp_advertising = mii_get_an(mii, MII_LPA); -			if (stat1000 & LPA_1000HALF) -				ecmd->lp_advertising |= -					ADVERTISED_1000baseT_Half; -			if (stat1000 & LPA_1000FULL) -				ecmd->lp_advertising |= -					ADVERTISED_1000baseT_Full; +			ecmd->lp_advertising |= +					mii_stat1000_to_ethtool_lpa_t(stat1000);  		} else {  			ecmd->lp_advertising = 0;  		} @@ -118,22 +105,25 @@ int mii_ethtool_gset(struct mii_if_info *mii, struct ethtool_cmd *ecmd)  		if (nego & (ADVERTISED_1000baseT_Full |  			    ADVERTISED_1000baseT_Half)) { -			ecmd->speed = SPEED_1000; +			ethtool_cmd_speed_set(ecmd, SPEED_1000);  			ecmd->duplex = !!(nego & ADVERTISED_1000baseT_Full);  		} else if (nego & (ADVERTISED_100baseT_Full |  				   ADVERTISED_100baseT_Half)) { -			ecmd->speed = SPEED_100; +			ethtool_cmd_speed_set(ecmd, SPEED_100);  			ecmd->duplex = !!(nego & ADVERTISED_100baseT_Full);  		} else { -			ecmd->speed = SPEED_10; +			ethtool_cmd_speed_set(ecmd, SPEED_10);  			ecmd->duplex = !!(nego & ADVERTISED_10baseT_Full);  		}  	} else {  		ecmd->autoneg = AUTONEG_DISABLE; -		ecmd->speed = ((bmcr & BMCR_SPEED1000 && -				(bmcr & BMCR_SPEED100) == 0) ? SPEED_1000 : -			       (bmcr & BMCR_SPEED100) ? SPEED_100 : SPEED_10); +		ethtool_cmd_speed_set(ecmd, +				      ((bmcr & BMCR_SPEED1000 && +					(bmcr & BMCR_SPEED100) == 0) ? +				       SPEED_1000 : +				       ((bmcr & BMCR_SPEED100) ? +					SPEED_100 : SPEED_10)));  		ecmd->duplex = (bmcr & BMCR_FULLDPLX) ? DUPLEX_FULL : DUPLEX_HALF;  	} @@ -154,10 +144,11 @@ int mii_ethtool_gset(struct mii_if_info *mii, struct ethtool_cmd *ecmd)  int mii_ethtool_sset(struct mii_if_info *mii, struct ethtool_cmd *ecmd)  {  	struct net_device *dev = mii->dev; +	u32 speed = ethtool_cmd_speed(ecmd); -	if (ecmd->speed != SPEED_10 && -	    ecmd->speed != SPEED_100 && -	    ecmd->speed != SPEED_1000) +	if (speed != SPEED_10 && +	    speed != SPEED_100 && +	    speed != SPEED_1000)  		return -EINVAL;  	if (ecmd->duplex != DUPLEX_HALF && ecmd->duplex != DUPLEX_FULL)  		return -EINVAL; @@ -169,7 +160,7 @@ int mii_ethtool_sset(struct mii_if_info *mii, struct ethtool_cmd *ecmd)  		return -EINVAL;  	if (ecmd->autoneg != AUTONEG_DISABLE && ecmd->autoneg != AUTONEG_ENABLE)  		return -EINVAL; -	if ((ecmd->speed == SPEED_1000) && (!mii->supports_gmii)) +	if ((speed == SPEED_1000) && (!mii->supports_gmii))  		return -EINVAL;  	/* ignore supported, maxtxpkt, maxrxpkt */ @@ -193,20 +184,11 @@ int mii_ethtool_sset(struct mii_if_info *mii, struct ethtool_cmd *ecmd)  			advert2 = mii->mdio_read(dev, mii->phy_id, MII_CTRL1000);  			tmp2 = advert2 & ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL);  		} -		if (ecmd->advertising & ADVERTISED_10baseT_Half) -			tmp |= ADVERTISE_10HALF; -		if (ecmd->advertising & ADVERTISED_10baseT_Full) -			tmp |= ADVERTISE_10FULL; -		if (ecmd->advertising & ADVERTISED_100baseT_Half) -			tmp |= ADVERTISE_100HALF; -		if (ecmd->advertising & ADVERTISED_100baseT_Full) -			tmp |= ADVERTISE_100FULL; -		if (mii->supports_gmii) { -			if (ecmd->advertising & ADVERTISED_1000baseT_Half) -				tmp2 |= ADVERTISE_1000HALF; -			if (ecmd->advertising & ADVERTISED_1000baseT_Full) -				tmp2 |= ADVERTISE_1000FULL; -		} +		tmp |= ethtool_adv_to_mii_adv_t(ecmd->advertising); + +		if (mii->supports_gmii) +			tmp2 |= +			      ethtool_adv_to_mii_ctrl1000_t(ecmd->advertising);  		if (advert != tmp) {  			mii->mdio_write(dev, mii->phy_id, MII_ADVERTISE, tmp);  			mii->advertising = tmp; @@ -227,9 +209,9 @@ int mii_ethtool_sset(struct mii_if_info *mii, struct ethtool_cmd *ecmd)  		bmcr = mii->mdio_read(dev, mii->phy_id, MII_BMCR);  		tmp = bmcr & ~(BMCR_ANENABLE | BMCR_SPEED100 |  			       BMCR_SPEED1000 | BMCR_FULLDPLX); -		if (ecmd->speed == SPEED_1000) +		if (speed == SPEED_1000)  			tmp |= BMCR_SPEED1000; -		else if (ecmd->speed == SPEED_100) +		else if (speed == SPEED_100)  			tmp |= BMCR_SPEED100;  		if (ecmd->duplex == DUPLEX_FULL) {  			tmp |= BMCR_FULLDPLX; @@ -354,7 +336,7 @@ unsigned int mii_check_media (struct mii_if_info *mii,  	if (!new_carrier) {  		netif_carrier_off(mii->dev);  		if (ok_to_print) -			printk(KERN_INFO "%s: link down\n", mii->dev->name); +			netdev_info(mii->dev, "link down\n");  		return 0; /* duplex did not change */  	} @@ -381,12 +363,12 @@ unsigned int mii_check_media (struct mii_if_info *mii,  		duplex = 1;  	if (ok_to_print) -		printk(KERN_INFO "%s: link up, %sMbps, %s-duplex, lpa 0x%04X\n", -		       mii->dev->name, -		       lpa2 & (LPA_1000FULL | LPA_1000HALF) ? "1000" : -		       media & (ADVERTISE_100FULL | ADVERTISE_100HALF) ? "100" : "10", -		       duplex ? "full" : "half", -		       lpa); +		netdev_info(mii->dev, "link up, %uMbps, %s-duplex, lpa 0x%04X\n", +			    lpa2 & (LPA_1000FULL | LPA_1000HALF) ? 1000 : +			    media & (ADVERTISE_100FULL | ADVERTISE_100HALF) ? +			    100 : 10, +			    duplex ? "full" : "half", +			    lpa);  	if ((init_media) || (mii->full_duplex != duplex)) {  		mii->full_duplex = duplex;  | 
