diff options
Diffstat (limited to 'drivers/net/mii.c')
-rw-r--r-- | drivers/net/mii.c | 53 |
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 | ||
36 | static u32 mii_get_an(struct mii_if_info *mii, u16 addr) | 36 | static 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; |