diff options
Diffstat (limited to 'drivers/net/phy/lxt.c')
| -rw-r--r-- | drivers/net/phy/lxt.c | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/drivers/net/phy/lxt.c b/drivers/net/phy/lxt.c index 8ee929b796d8..dbd003453737 100644 --- a/drivers/net/phy/lxt.c +++ b/drivers/net/phy/lxt.c | |||
| @@ -53,6 +53,9 @@ | |||
| 53 | 53 | ||
| 54 | #define MII_LXT971_ISR 19 /* Interrupt Status Register */ | 54 | #define MII_LXT971_ISR 19 /* Interrupt Status Register */ |
| 55 | 55 | ||
| 56 | /* register definitions for the 973 */ | ||
| 57 | #define MII_LXT973_PCR 16 /* Port Configuration Register */ | ||
| 58 | #define PCR_FIBER_SELECT 1 | ||
| 56 | 59 | ||
| 57 | MODULE_DESCRIPTION("Intel LXT PHY driver"); | 60 | MODULE_DESCRIPTION("Intel LXT PHY driver"); |
| 58 | MODULE_AUTHOR("Andy Fleming"); | 61 | MODULE_AUTHOR("Andy Fleming"); |
| @@ -119,6 +122,33 @@ static int lxt971_config_intr(struct phy_device *phydev) | |||
| 119 | return err; | 122 | return err; |
| 120 | } | 123 | } |
| 121 | 124 | ||
| 125 | static int lxt973_probe(struct phy_device *phydev) | ||
| 126 | { | ||
| 127 | int val = phy_read(phydev, MII_LXT973_PCR); | ||
| 128 | |||
| 129 | if (val & PCR_FIBER_SELECT) { | ||
| 130 | /* | ||
| 131 | * If fiber is selected, then the only correct setting | ||
| 132 | * is 100Mbps, full duplex, and auto negotiation off. | ||
| 133 | */ | ||
| 134 | val = phy_read(phydev, MII_BMCR); | ||
| 135 | val |= (BMCR_SPEED100 | BMCR_FULLDPLX); | ||
| 136 | val &= ~BMCR_ANENABLE; | ||
| 137 | phy_write(phydev, MII_BMCR, val); | ||
| 138 | /* Remember that the port is in fiber mode. */ | ||
| 139 | phydev->priv = lxt973_probe; | ||
| 140 | } else { | ||
| 141 | phydev->priv = NULL; | ||
| 142 | } | ||
| 143 | return 0; | ||
| 144 | } | ||
| 145 | |||
| 146 | static int lxt973_config_aneg(struct phy_device *phydev) | ||
| 147 | { | ||
| 148 | /* Do nothing if port is in fiber mode. */ | ||
| 149 | return phydev->priv ? 0 : genphy_config_aneg(phydev); | ||
| 150 | } | ||
| 151 | |||
| 122 | static struct phy_driver lxt970_driver = { | 152 | static struct phy_driver lxt970_driver = { |
| 123 | .phy_id = 0x78100000, | 153 | .phy_id = 0x78100000, |
| 124 | .name = "LXT970", | 154 | .name = "LXT970", |
| @@ -146,6 +176,18 @@ static struct phy_driver lxt971_driver = { | |||
| 146 | .driver = { .owner = THIS_MODULE,}, | 176 | .driver = { .owner = THIS_MODULE,}, |
| 147 | }; | 177 | }; |
| 148 | 178 | ||
| 179 | static struct phy_driver lxt973_driver = { | ||
| 180 | .phy_id = 0x00137a10, | ||
| 181 | .name = "LXT973", | ||
| 182 | .phy_id_mask = 0xfffffff0, | ||
| 183 | .features = PHY_BASIC_FEATURES, | ||
| 184 | .flags = 0, | ||
| 185 | .probe = lxt973_probe, | ||
| 186 | .config_aneg = lxt973_config_aneg, | ||
| 187 | .read_status = genphy_read_status, | ||
| 188 | .driver = { .owner = THIS_MODULE,}, | ||
| 189 | }; | ||
| 190 | |||
| 149 | static int __init lxt_init(void) | 191 | static int __init lxt_init(void) |
| 150 | { | 192 | { |
| 151 | int ret; | 193 | int ret; |
| @@ -157,9 +199,15 @@ static int __init lxt_init(void) | |||
| 157 | ret = phy_driver_register(&lxt971_driver); | 199 | ret = phy_driver_register(&lxt971_driver); |
| 158 | if (ret) | 200 | if (ret) |
| 159 | goto err2; | 201 | goto err2; |
| 202 | |||
| 203 | ret = phy_driver_register(&lxt973_driver); | ||
| 204 | if (ret) | ||
| 205 | goto err3; | ||
| 160 | return 0; | 206 | return 0; |
| 161 | 207 | ||
| 162 | err2: | 208 | err3: |
| 209 | phy_driver_unregister(&lxt971_driver); | ||
| 210 | err2: | ||
| 163 | phy_driver_unregister(&lxt970_driver); | 211 | phy_driver_unregister(&lxt970_driver); |
| 164 | err1: | 212 | err1: |
| 165 | return ret; | 213 | return ret; |
| @@ -169,6 +217,7 @@ static void __exit lxt_exit(void) | |||
| 169 | { | 217 | { |
| 170 | phy_driver_unregister(&lxt970_driver); | 218 | phy_driver_unregister(&lxt970_driver); |
| 171 | phy_driver_unregister(&lxt971_driver); | 219 | phy_driver_unregister(&lxt971_driver); |
| 220 | phy_driver_unregister(&lxt973_driver); | ||
| 172 | } | 221 | } |
| 173 | 222 | ||
| 174 | module_init(lxt_init); | 223 | module_init(lxt_init); |
