diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-06-11 17:20:03 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-06-11 17:20:03 -0400 |
| commit | 4cea8706c39023f5f721c88dd0ae17a097a39c98 (patch) | |
| tree | 7eb589399dc10944cde2802d68adb5511405446f /drivers/net/phy/lxt.c | |
| parent | 7ae1277a5202109a31d8f81ac99d4a53278dab84 (diff) | |
| parent | e79aa8671033535c2e9ffc0a68010ae49ed5734c (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6:
wimax/i2400m: fix missing endian correction read in fw loader
net8139: fix a race at the end of NAPI
pktgen: Fix accuracy of inter-packet delay.
pkt_sched: gen_estimator: add a new lock
net: deliver skbs on inactive slaves to exact matches
ipv6: fix ICMP6_MIB_OUTERRORS
r8169: fix mdio_read and update mdio_write according to hw specs
gianfar: Revive the driver for eTSEC devices (disable timestamping)
caif: fix a couple range checks
phylib: Add support for the LXT973 phy.
net: Print num_rx_queues imbalance warning only when there are allocated queues
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); |
