aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/mii.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/mii.c')
-rw-r--r--drivers/net/mii.c53
1 files changed, 12 insertions, 41 deletions
diff --git a/drivers/net/mii.c b/drivers/net/mii.c
index c62e7816d548..c70c2332d15e 100644
--- a/drivers/net/mii.c
+++ b/drivers/net/mii.c
@@ -35,26 +35,11 @@
35 35
36static u32 mii_get_an(struct mii_if_info *mii, u16 addr) 36static u32 mii_get_an(struct mii_if_info *mii, u16 addr)
37{ 37{
38 u32 result = 0;
39 int advert; 38 int advert;
40 39
41 advert = mii->mdio_read(mii->dev, mii->phy_id, addr); 40 advert = mii->mdio_read(mii->dev, mii->phy_id, addr);
42 if (advert & LPA_LPACK) 41
43 result |= ADVERTISED_Autoneg; 42 return mii_lpa_to_ethtool_lpa_t(advert);
44 if (advert & ADVERTISE_10HALF)
45 result |= ADVERTISED_10baseT_Half;
46 if (advert & ADVERTISE_10FULL)
47 result |= ADVERTISED_10baseT_Full;
48 if (advert & ADVERTISE_100HALF)
49 result |= ADVERTISED_100baseT_Half;
50 if (advert & ADVERTISE_100FULL)
51 result |= ADVERTISED_100baseT_Full;
52 if (advert & ADVERTISE_PAUSE_CAP)
53 result |= ADVERTISED_Pause;
54 if (advert & ADVERTISE_PAUSE_ASYM)
55 result |= ADVERTISED_Asym_Pause;
56
57 return result;
58} 43}
59 44
60/** 45/**
@@ -104,19 +89,14 @@ int mii_ethtool_gset(struct mii_if_info *mii, struct ethtool_cmd *ecmd)
104 ecmd->autoneg = AUTONEG_ENABLE; 89 ecmd->autoneg = AUTONEG_ENABLE;
105 90
106 ecmd->advertising |= mii_get_an(mii, MII_ADVERTISE); 91 ecmd->advertising |= mii_get_an(mii, MII_ADVERTISE);
107 if (ctrl1000 & ADVERTISE_1000HALF) 92 if (mii->supports_gmii)
108 ecmd->advertising |= ADVERTISED_1000baseT_Half; 93 ecmd->advertising |=
109 if (ctrl1000 & ADVERTISE_1000FULL) 94 mii_ctrl1000_to_ethtool_adv_t(ctrl1000);
110 ecmd->advertising |= ADVERTISED_1000baseT_Full;
111 95
112 if (bmsr & BMSR_ANEGCOMPLETE) { 96 if (bmsr & BMSR_ANEGCOMPLETE) {
113 ecmd->lp_advertising = mii_get_an(mii, MII_LPA); 97 ecmd->lp_advertising = mii_get_an(mii, MII_LPA);
114 if (stat1000 & LPA_1000HALF) 98 ecmd->lp_advertising |=
115 ecmd->lp_advertising |= 99 mii_stat1000_to_ethtool_lpa_t(stat1000);
116 ADVERTISED_1000baseT_Half;
117 if (stat1000 & LPA_1000FULL)
118 ecmd->lp_advertising |=
119 ADVERTISED_1000baseT_Full;
120 } else { 100 } else {
121 ecmd->lp_advertising = 0; 101 ecmd->lp_advertising = 0;
122 } 102 }
@@ -204,20 +184,11 @@ int mii_ethtool_sset(struct mii_if_info *mii, struct ethtool_cmd *ecmd)
204 advert2 = mii->mdio_read(dev, mii->phy_id, MII_CTRL1000); 184 advert2 = mii->mdio_read(dev, mii->phy_id, MII_CTRL1000);
205 tmp2 = advert2 & ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL); 185 tmp2 = advert2 & ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL);
206 } 186 }
207 if (ecmd->advertising & ADVERTISED_10baseT_Half) 187 tmp |= ethtool_adv_to_mii_adv_t(ecmd->advertising);
208 tmp |= ADVERTISE_10HALF; 188
209 if (ecmd->advertising & ADVERTISED_10baseT_Full) 189 if (mii->supports_gmii)
210 tmp |= ADVERTISE_10FULL; 190 tmp2 |=
211 if (ecmd->advertising & ADVERTISED_100baseT_Half) 191 ethtool_adv_to_mii_ctrl1000_t(ecmd->advertising);
212 tmp |= ADVERTISE_100HALF;
213 if (ecmd->advertising & ADVERTISED_100baseT_Full)
214 tmp |= ADVERTISE_100FULL;
215 if (mii->supports_gmii) {
216 if (ecmd->advertising & ADVERTISED_1000baseT_Half)
217 tmp2 |= ADVERTISE_1000HALF;
218 if (ecmd->advertising & ADVERTISED_1000baseT_Full)
219 tmp2 |= ADVERTISE_1000FULL;
220 }
221 if (advert != tmp) { 192 if (advert != tmp) {
222 mii->mdio_write(dev, mii->phy_id, MII_ADVERTISE, tmp); 193 mii->mdio_write(dev, mii->phy_id, MII_ADVERTISE, tmp);
223 mii->advertising = tmp; 194 mii->advertising = tmp;