blob: 91f17178f1b32ff8a5fdad0eea972caabe9f89f5 [file] [log] [blame]
Andy Fleming00db8182005-07-30 19:31:23 -04001/*
2 * drivers/net/phy/phy_device.c
3 *
4 * Framework for finding and configuring PHYs.
5 * Also contains generic PHY driver
6 *
7 * Author: Andy Fleming
8 *
9 * Copyright (c) 2004 Freescale Semiconductor, Inc.
10 *
11 * This program is free software; you can redistribute it and/or modify it
12 * under the terms of the GNU General Public License as published by the
13 * Free Software Foundation; either version 2 of the License, or (at your
14 * option) any later version.
15 *
16 */
Joe Perches8d242482012-06-09 07:49:07 +000017
18#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
19
Andy Fleming00db8182005-07-30 19:31:23 -040020#include <linux/kernel.h>
Andy Fleming00db8182005-07-30 19:31:23 -040021#include <linux/string.h>
22#include <linux/errno.h>
23#include <linux/unistd.h>
24#include <linux/slab.h>
25#include <linux/interrupt.h>
26#include <linux/init.h>
27#include <linux/delay.h>
28#include <linux/netdevice.h>
29#include <linux/etherdevice.h>
30#include <linux/skbuff.h>
Andy Fleming00db8182005-07-30 19:31:23 -040031#include <linux/mm.h>
32#include <linux/module.h>
Andy Fleming00db8182005-07-30 19:31:23 -040033#include <linux/mii.h>
34#include <linux/ethtool.h>
35#include <linux/phy.h>
36
37#include <asm/io.h>
38#include <asm/irq.h>
39#include <asm/uaccess.h>
40
Olaf Heringafcceaa2005-12-14 00:33:49 +010041MODULE_DESCRIPTION("PHY library");
42MODULE_AUTHOR("Andy Fleming");
43MODULE_LICENSE("GPL");
44
Anton Vorontsov6f4a7f42007-12-04 16:17:33 +030045void phy_device_free(struct phy_device *phydev)
46{
Petr Malatb2a43192013-02-28 01:01:52 +000047 put_device(&phydev->dev);
Anton Vorontsov6f4a7f42007-12-04 16:17:33 +030048}
Grant Likely4dea5472009-04-25 12:52:46 +000049EXPORT_SYMBOL(phy_device_free);
Anton Vorontsov6f4a7f42007-12-04 16:17:33 +030050
51static void phy_device_release(struct device *dev)
52{
Petr Malatb2a43192013-02-28 01:01:52 +000053 kfree(to_phy_device(dev));
Anton Vorontsov6f4a7f42007-12-04 16:17:33 +030054}
55
Grant Likely4dea5472009-04-25 12:52:46 +000056static struct phy_driver genphy_driver;
57extern int mdio_bus_init(void);
58extern void mdio_bus_exit(void);
59
Andy Flemingf62220d2008-04-18 17:29:54 -050060static LIST_HEAD(phy_fixup_list);
61static DEFINE_MUTEX(phy_fixup_lock);
62
stephen hemminger89ff05e2010-10-21 08:37:41 +000063static int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
64 u32 flags, phy_interface_t interface);
65
Andy Flemingf62220d2008-04-18 17:29:54 -050066/*
67 * Creates a new phy_fixup and adds it to the list
68 * @bus_id: A string which matches phydev->dev.bus_id (or PHY_ANY_ID)
69 * @phy_uid: Used to match against phydev->phy_id (the UID of the PHY)
70 * It can also be PHY_ANY_UID
71 * @phy_uid_mask: Applied to phydev->phy_id and fixup->phy_uid before
72 * comparison
73 * @run: The actual code to be run when a matching PHY is found
74 */
75int phy_register_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask,
76 int (*run)(struct phy_device *))
77{
78 struct phy_fixup *fixup;
79
80 fixup = kzalloc(sizeof(struct phy_fixup), GFP_KERNEL);
81 if (!fixup)
82 return -ENOMEM;
83
Kay Sieversfb28ad352008-11-10 13:55:14 -080084 strlcpy(fixup->bus_id, bus_id, sizeof(fixup->bus_id));
Andy Flemingf62220d2008-04-18 17:29:54 -050085 fixup->phy_uid = phy_uid;
86 fixup->phy_uid_mask = phy_uid_mask;
87 fixup->run = run;
88
89 mutex_lock(&phy_fixup_lock);
90 list_add_tail(&fixup->list, &phy_fixup_list);
91 mutex_unlock(&phy_fixup_lock);
92
93 return 0;
94}
95EXPORT_SYMBOL(phy_register_fixup);
96
97/* Registers a fixup to be run on any PHY with the UID in phy_uid */
98int phy_register_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask,
99 int (*run)(struct phy_device *))
100{
101 return phy_register_fixup(PHY_ANY_ID, phy_uid, phy_uid_mask, run);
102}
103EXPORT_SYMBOL(phy_register_fixup_for_uid);
104
105/* Registers a fixup to be run on the PHY with id string bus_id */
106int phy_register_fixup_for_id(const char *bus_id,
107 int (*run)(struct phy_device *))
108{
109 return phy_register_fixup(bus_id, PHY_ANY_UID, 0xffffffff, run);
110}
111EXPORT_SYMBOL(phy_register_fixup_for_id);
112
113/*
114 * Returns 1 if fixup matches phydev in bus_id and phy_uid.
115 * Fixups can be set to match any in one or more fields.
116 */
117static int phy_needs_fixup(struct phy_device *phydev, struct phy_fixup *fixup)
118{
Kay Sieversfb28ad352008-11-10 13:55:14 -0800119 if (strcmp(fixup->bus_id, dev_name(&phydev->dev)) != 0)
Andy Flemingf62220d2008-04-18 17:29:54 -0500120 if (strcmp(fixup->bus_id, PHY_ANY_ID) != 0)
121 return 0;
122
123 if ((fixup->phy_uid & fixup->phy_uid_mask) !=
124 (phydev->phy_id & fixup->phy_uid_mask))
125 if (fixup->phy_uid != PHY_ANY_UID)
126 return 0;
127
128 return 1;
129}
130
131/* Runs any matching fixups for this phydev */
132int phy_scan_fixups(struct phy_device *phydev)
133{
134 struct phy_fixup *fixup;
135
136 mutex_lock(&phy_fixup_lock);
137 list_for_each_entry(fixup, &phy_fixup_list, list) {
138 if (phy_needs_fixup(phydev, fixup)) {
139 int err;
140
141 err = fixup->run(phydev);
142
Jiri Slabybc232832009-07-13 11:23:39 +0000143 if (err < 0) {
144 mutex_unlock(&phy_fixup_lock);
Andy Flemingf62220d2008-04-18 17:29:54 -0500145 return err;
Jiri Slabybc232832009-07-13 11:23:39 +0000146 }
Andy Flemingf62220d2008-04-18 17:29:54 -0500147 }
148 }
149 mutex_unlock(&phy_fixup_lock);
150
151 return 0;
152}
153EXPORT_SYMBOL(phy_scan_fixups);
154
David Daneyac28b9f2012-06-27 07:33:35 +0000155struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id,
156 bool is_c45, struct phy_c45_device_ids *c45_ids)
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700157{
158 struct phy_device *dev;
David Woodhouse8626d3b2010-04-02 01:05:27 +0000159
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700160 /* We allocate the device, and initialize the
161 * default values */
Robert P. J. Daycd861282006-12-13 00:34:52 -0800162 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700163
164 if (NULL == dev)
165 return (struct phy_device*) PTR_ERR((void*)-ENOMEM);
166
Anton Vorontsov6f4a7f42007-12-04 16:17:33 +0300167 dev->dev.release = phy_device_release;
168
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700169 dev->speed = 0;
170 dev->duplex = -1;
171 dev->pause = dev->asym_pause = 0;
172 dev->link = 1;
Andy Fleminge8a2b6a2006-12-01 12:01:06 -0600173 dev->interface = PHY_INTERFACE_MODE_GMII;
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700174
175 dev->autoneg = AUTONEG_ENABLE;
176
David Daneyac28b9f2012-06-27 07:33:35 +0000177 dev->is_c45 = is_c45;
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700178 dev->addr = addr;
179 dev->phy_id = phy_id;
David Daneyac28b9f2012-06-27 07:33:35 +0000180 if (c45_ids)
181 dev->c45_ids = *c45_ids;
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700182 dev->bus = bus;
Grant Likely4dea5472009-04-25 12:52:46 +0000183 dev->dev.parent = bus->parent;
184 dev->dev.bus = &mdio_bus_type;
185 dev->irq = bus->irq != NULL ? bus->irq[addr] : PHY_POLL;
186 dev_set_name(&dev->dev, PHY_ID_FMT, bus->id, addr);
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700187
188 dev->state = PHY_DOWN;
189
Nate Case35b5f6b2008-01-29 10:05:09 -0600190 mutex_init(&dev->lock);
Anton Vorontsov4f9c85a2010-01-18 05:37:16 +0000191 INIT_DELAYED_WORK(&dev->state_queue, phy_state_machine);
Florian Fainelli5ea94e72013-05-19 22:53:43 +0000192 INIT_WORK(&dev->phy_queue, phy_change);
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700193
David Woodhouse8626d3b2010-04-02 01:05:27 +0000194 /* Request the appropriate module unconditionally; don't
195 bother trying to do so only if it isn't already loaded,
196 because that gets complicated. A hotplug event would have
197 done an unconditional modprobe anyway.
198 We don't do normal hotplug because it won't work for MDIO
199 -- because it relies on the device staying around for long
200 enough for the driver to get loaded. With MDIO, the NIC
201 driver will get bored and give up as soon as it finds that
202 there's no driver _already_ loaded. */
203 request_module(MDIO_MODULE_PREFIX MDIO_ID_FMT, MDIO_ID_ARGS(phy_id));
204
Petr Malatb2a43192013-02-28 01:01:52 +0000205 device_initialize(&dev->dev);
206
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700207 return dev;
208}
David Daneyac28b9f2012-06-27 07:33:35 +0000209EXPORT_SYMBOL(phy_device_create);
210
211/**
212 * get_phy_c45_ids - reads the specified addr for its 802.3-c45 IDs.
213 * @bus: the target MII bus
214 * @addr: PHY address on the MII bus
215 * @phy_id: where to store the ID retrieved.
216 * @c45_ids: where to store the c45 ID information.
217 *
218 * If the PHY devices-in-package appears to be valid, it and the
219 * corresponding identifiers are stored in @c45_ids, zero is stored
220 * in @phy_id. Otherwise 0xffffffff is stored in @phy_id. Returns
221 * zero on success.
222 *
223 */
224static int get_phy_c45_ids(struct mii_bus *bus, int addr, u32 *phy_id,
225 struct phy_c45_device_ids *c45_ids) {
226 int phy_reg;
227 int i, reg_addr;
228 const int num_ids = ARRAY_SIZE(c45_ids->device_ids);
229
230 /* Find first non-zero Devices In package. Device
231 * zero is reserved, so don't probe it.
232 */
233 for (i = 1;
234 i < num_ids && c45_ids->devices_in_package == 0;
235 i++) {
236 reg_addr = MII_ADDR_C45 | i << 16 | 6;
237 phy_reg = mdiobus_read(bus, addr, reg_addr);
238 if (phy_reg < 0)
239 return -EIO;
240 c45_ids->devices_in_package = (phy_reg & 0xffff) << 16;
241
242 reg_addr = MII_ADDR_C45 | i << 16 | 5;
243 phy_reg = mdiobus_read(bus, addr, reg_addr);
244 if (phy_reg < 0)
245 return -EIO;
246 c45_ids->devices_in_package |= (phy_reg & 0xffff);
247
248 /* If mostly Fs, there is no device there,
249 * let's get out of here.
250 */
251 if ((c45_ids->devices_in_package & 0x1fffffff) == 0x1fffffff) {
252 *phy_id = 0xffffffff;
253 return 0;
254 }
255 }
256
257 /* Now probe Device Identifiers for each device present. */
258 for (i = 1; i < num_ids; i++) {
259 if (!(c45_ids->devices_in_package & (1 << i)))
260 continue;
261
262 reg_addr = MII_ADDR_C45 | i << 16 | MII_PHYSID1;
263 phy_reg = mdiobus_read(bus, addr, reg_addr);
264 if (phy_reg < 0)
265 return -EIO;
266 c45_ids->device_ids[i] = (phy_reg & 0xffff) << 16;
267
268 reg_addr = MII_ADDR_C45 | i << 16 | MII_PHYSID2;
269 phy_reg = mdiobus_read(bus, addr, reg_addr);
270 if (phy_reg < 0)
271 return -EIO;
272 c45_ids->device_ids[i] |= (phy_reg & 0xffff);
273 }
274 *phy_id = 0;
275 return 0;
276}
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700277
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800278/**
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400279 * get_phy_id - reads the specified addr for its ID.
280 * @bus: the target MII bus
281 * @addr: PHY address on the MII bus
282 * @phy_id: where to store the ID retrieved.
David Daneyac28b9f2012-06-27 07:33:35 +0000283 * @is_c45: If true the PHY uses the 802.3 clause 45 protocol
284 * @c45_ids: where to store the c45 ID information.
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400285 *
David Daneyac28b9f2012-06-27 07:33:35 +0000286 * Description: In the case of a 802.3-c22 PHY, reads the ID registers
287 * of the PHY at @addr on the @bus, stores it in @phy_id and returns
288 * zero on success.
289 *
290 * In the case of a 802.3-c45 PHY, get_phy_c45_ids() is invoked, and
291 * its return value is in turn returned.
292 *
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400293 */
David Daneyac28b9f2012-06-27 07:33:35 +0000294static int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id,
295 bool is_c45, struct phy_c45_device_ids *c45_ids)
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400296{
297 int phy_reg;
298
David Daneyac28b9f2012-06-27 07:33:35 +0000299 if (is_c45)
300 return get_phy_c45_ids(bus, addr, phy_id, c45_ids);
301
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400302 /* Grab the bits from PHYIR1, and put them
303 * in the upper half */
David Daney6fe32642011-09-30 11:51:22 +0000304 phy_reg = mdiobus_read(bus, addr, MII_PHYSID1);
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400305
306 if (phy_reg < 0)
307 return -EIO;
308
309 *phy_id = (phy_reg & 0xffff) << 16;
310
311 /* Grab the bits from PHYIR2, and put them in the lower half */
David Daney6fe32642011-09-30 11:51:22 +0000312 phy_reg = mdiobus_read(bus, addr, MII_PHYSID2);
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400313
314 if (phy_reg < 0)
315 return -EIO;
316
317 *phy_id |= (phy_reg & 0xffff);
318
319 return 0;
320}
321
322/**
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800323 * get_phy_device - reads the specified PHY device and returns its @phy_device struct
324 * @bus: the target MII bus
325 * @addr: PHY address on the MII bus
David Daneyac28b9f2012-06-27 07:33:35 +0000326 * @is_c45: If true the PHY uses the 802.3 clause 45 protocol
Andy Fleming00db8182005-07-30 19:31:23 -0400327 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800328 * Description: Reads the ID registers of the PHY at @addr on the
329 * @bus, then allocates and returns the phy_device to represent it.
Andy Fleming00db8182005-07-30 19:31:23 -0400330 */
David Daneyac28b9f2012-06-27 07:33:35 +0000331struct phy_device *get_phy_device(struct mii_bus *bus, int addr, bool is_c45)
Andy Fleming00db8182005-07-30 19:31:23 -0400332{
David Daneyac28b9f2012-06-27 07:33:35 +0000333 struct phy_c45_device_ids c45_ids = {0};
David S. Miller160c85f2012-06-27 21:28:14 -0700334 struct phy_device *dev = NULL;
335 u32 phy_id = 0;
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400336 int r;
Andy Fleming00db8182005-07-30 19:31:23 -0400337
David Daneyac28b9f2012-06-27 07:33:35 +0000338 r = get_phy_id(bus, addr, &phy_id, is_c45, &c45_ids);
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400339 if (r)
340 return ERR_PTR(r);
Andy Fleming00db8182005-07-30 19:31:23 -0400341
Giuseppe Cavallaro6436cbc2008-11-20 20:43:18 -0800342 /* If the phy_id is mostly Fs, there is no device there */
343 if ((phy_id & 0x1fffffff) == 0x1fffffff)
344 return NULL;
345
David Daneyac28b9f2012-06-27 07:33:35 +0000346 dev = phy_device_create(bus, addr, phy_id, is_c45, &c45_ids);
Andy Fleming00db8182005-07-30 19:31:23 -0400347
348 return dev;
349}
Grant Likely4dea5472009-04-25 12:52:46 +0000350EXPORT_SYMBOL(get_phy_device);
351
352/**
353 * phy_device_register - Register the phy device on the MDIO bus
Randy Dunlap1d4ac5d2009-06-16 16:56:33 +0000354 * @phydev: phy_device structure to be added to the MDIO bus
Grant Likely4dea5472009-04-25 12:52:46 +0000355 */
356int phy_device_register(struct phy_device *phydev)
357{
358 int err;
359
360 /* Don't register a phy if one is already registered at this
361 * address */
362 if (phydev->bus->phy_map[phydev->addr])
363 return -EINVAL;
364 phydev->bus->phy_map[phydev->addr] = phydev;
365
366 /* Run all of the fixups for this PHY */
Florian Fainelli87aa9f92013-12-06 13:01:34 -0800367 err = phy_init_hw(phydev);
368 if (err) {
369 pr_err("PHY %d failed to initialize\n", phydev->addr);
370 goto out;
371 }
Grant Likely4dea5472009-04-25 12:52:46 +0000372
Petr Malatb2a43192013-02-28 01:01:52 +0000373 err = device_add(&phydev->dev);
Grant Likely4dea5472009-04-25 12:52:46 +0000374 if (err) {
Petr Malatb2a43192013-02-28 01:01:52 +0000375 pr_err("PHY %d failed to add\n", phydev->addr);
Grant Likely4dea5472009-04-25 12:52:46 +0000376 goto out;
377 }
378
379 return 0;
380
381 out:
382 phydev->bus->phy_map[phydev->addr] = NULL;
383 return err;
384}
385EXPORT_SYMBOL(phy_device_register);
Andy Fleming00db8182005-07-30 19:31:23 -0400386
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800387/**
Jiri Pirkof8f76db2010-02-04 10:23:02 -0800388 * phy_find_first - finds the first PHY device on the bus
389 * @bus: the target MII bus
390 */
391struct phy_device *phy_find_first(struct mii_bus *bus)
392{
393 int addr;
394
395 for (addr = 0; addr < PHY_MAX_ADDR; addr++) {
396 if (bus->phy_map[addr])
397 return bus->phy_map[addr];
398 }
399 return NULL;
400}
401EXPORT_SYMBOL(phy_find_first);
402
403/**
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800404 * phy_prepare_link - prepares the PHY layer to monitor link status
405 * @phydev: target phy_device struct
406 * @handler: callback function for link status change notifications
Andy Fleming00db8182005-07-30 19:31:23 -0400407 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800408 * Description: Tells the PHY infrastructure to handle the
Andy Fleming00db8182005-07-30 19:31:23 -0400409 * gory details on monitoring link status (whether through
410 * polling or an interrupt), and to call back to the
411 * connected device driver when the link status changes.
412 * If you want to monitor your own link state, don't call
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800413 * this function.
414 */
stephen hemminger89ff05e2010-10-21 08:37:41 +0000415static void phy_prepare_link(struct phy_device *phydev,
Andy Fleming00db8182005-07-30 19:31:23 -0400416 void (*handler)(struct net_device *))
417{
418 phydev->adjust_link = handler;
419}
420
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800421/**
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000422 * phy_connect_direct - connect an ethernet device to a specific phy_device
423 * @dev: the network device to connect
424 * @phydev: the pointer to the phy device
425 * @handler: callback function for state change notifications
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000426 * @interface: PHY device's interface
427 */
428int phy_connect_direct(struct net_device *dev, struct phy_device *phydev,
Florian Fainellif9a8f832013-01-14 00:52:52 +0000429 void (*handler)(struct net_device *),
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000430 phy_interface_t interface)
431{
432 int rc;
433
Florian Fainellif9a8f832013-01-14 00:52:52 +0000434 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface);
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000435 if (rc)
436 return rc;
437
438 phy_prepare_link(phydev, handler);
439 phy_start_machine(phydev, NULL);
440 if (phydev->irq > 0)
441 phy_start_interrupts(phydev);
442
443 return 0;
444}
445EXPORT_SYMBOL(phy_connect_direct);
446
447/**
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800448 * phy_connect - connect an ethernet device to a PHY device
449 * @dev: the network device to connect
Randy Dunlap5d12b132008-04-28 10:58:22 -0700450 * @bus_id: the id string of the PHY device to connect
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800451 * @handler: callback function for state change notifications
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800452 * @interface: PHY device's interface
Andy Fleminge1393452005-08-24 18:46:21 -0500453 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800454 * Description: Convenience function for connecting ethernet
Andy Fleminge1393452005-08-24 18:46:21 -0500455 * devices to PHY devices. The default behavior is for
456 * the PHY infrastructure to handle everything, and only notify
457 * the connected driver when the link status changes. If you
458 * don't want, or can't use the provided functionality, you may
459 * choose to call only the subset of functions which provide
460 * the desired functionality.
461 */
Andy Flemingf62220d2008-04-18 17:29:54 -0500462struct phy_device * phy_connect(struct net_device *dev, const char *bus_id,
Florian Fainellif9a8f832013-01-14 00:52:52 +0000463 void (*handler)(struct net_device *),
Randy Dunlap1a168932007-02-05 10:44:20 -0800464 phy_interface_t interface)
Andy Fleminge1393452005-08-24 18:46:21 -0500465{
466 struct phy_device *phydev;
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000467 struct device *d;
468 int rc;
Andy Fleminge1393452005-08-24 18:46:21 -0500469
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000470 /* Search the list of PHY devices on the mdio bus for the
471 * PHY with the requested name */
472 d = bus_find_device_by_name(&mdio_bus_type, NULL, bus_id);
473 if (!d) {
474 pr_err("PHY %s not found\n", bus_id);
475 return ERR_PTR(-ENODEV);
476 }
477 phydev = to_phy_device(d);
Andy Fleminge1393452005-08-24 18:46:21 -0500478
Florian Fainellif9a8f832013-01-14 00:52:52 +0000479 rc = phy_connect_direct(dev, phydev, handler, interface);
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000480 if (rc)
481 return ERR_PTR(rc);
Andy Fleminge1393452005-08-24 18:46:21 -0500482
483 return phydev;
484}
485EXPORT_SYMBOL(phy_connect);
486
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800487/**
488 * phy_disconnect - disable interrupts, stop state machine, and detach a PHY device
489 * @phydev: target phy_device struct
490 */
Andy Fleminge1393452005-08-24 18:46:21 -0500491void phy_disconnect(struct phy_device *phydev)
492{
493 if (phydev->irq > 0)
494 phy_stop_interrupts(phydev);
495
496 phy_stop_machine(phydev);
497
498 phydev->adjust_link = NULL;
499
500 phy_detach(phydev);
501}
502EXPORT_SYMBOL(phy_disconnect);
503
Florian Fainelli87aa9f92013-12-06 13:01:34 -0800504/**
505 * phy_poll_reset - Safely wait until a PHY reset has properly completed
506 * @phydev: The PHY device to poll
507 *
508 * Description: According to IEEE 802.3, Section 2, Subsection 22.2.4.1.1, as
509 * published in 2008, a PHY reset may take up to 0.5 seconds. The MII BMCR
510 * register must be polled until the BMCR_RESET bit clears.
511 *
512 * Furthermore, any attempts to write to PHY registers may have no effect
513 * or even generate MDIO bus errors until this is complete.
514 *
515 * Some PHYs (such as the Marvell 88E1111) don't entirely conform to the
516 * standard and do not fully reset after the BMCR_RESET bit is set, and may
517 * even *REQUIRE* a soft-reset to properly restart autonegotiation. In an
518 * effort to support such broken PHYs, this function is separate from the
519 * standard phy_init_hw() which will zero all the other bits in the BMCR
520 * and reapply all driver-specific and board-specific fixups.
521 */
522static int phy_poll_reset(struct phy_device *phydev)
523{
524 /* Poll until the reset bit clears (50ms per retry == 0.6 sec) */
525 unsigned int retries = 12;
526 int ret;
527
528 do {
529 msleep(50);
530 ret = phy_read(phydev, MII_BMCR);
531 if (ret < 0)
532 return ret;
533 } while (ret & BMCR_RESET && --retries);
534 if (ret & BMCR_RESET)
535 return -ETIMEDOUT;
536
537 /*
538 * Some chips (smsc911x) may still need up to another 1ms after the
539 * BMCR_RESET bit is cleared before they are usable.
540 */
541 msleep(1);
542 return 0;
543}
544
Anton Vorontsov2f5cb432009-12-30 08:23:30 +0000545int phy_init_hw(struct phy_device *phydev)
546{
547 int ret;
548
549 if (!phydev->drv || !phydev->drv->config_init)
550 return 0;
551
Florian Fainelli87aa9f92013-12-06 13:01:34 -0800552 ret = phy_write(phydev, MII_BMCR, BMCR_RESET);
553 if (ret < 0)
554 return ret;
555
556 ret = phy_poll_reset(phydev);
557 if (ret < 0)
558 return ret;
559
Anton Vorontsov2f5cb432009-12-30 08:23:30 +0000560 ret = phy_scan_fixups(phydev);
561 if (ret < 0)
562 return ret;
563
564 return phydev->drv->config_init(phydev);
565}
Florian Fainelli87aa9f92013-12-06 13:01:34 -0800566EXPORT_SYMBOL(phy_init_hw);
Anton Vorontsov2f5cb432009-12-30 08:23:30 +0000567
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800568/**
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000569 * phy_attach_direct - attach a network device to a given PHY device pointer
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800570 * @dev: network device to attach
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000571 * @phydev: Pointer to phy_device to attach
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800572 * @flags: PHY device's dev_flags
573 * @interface: PHY device's interface
574 *
575 * Description: Called by drivers to attach to a particular PHY
576 * device. The phy_device is found, and properly hooked up
577 * to the phy_driver. If no driver is attached, then the
578 * genphy_driver is used. The phy_device is given a ptr to
579 * the attaching device, and given a callback for link status
580 * change. The phy_device is returned to the attaching driver.
581 */
stephen hemminger89ff05e2010-10-21 08:37:41 +0000582static int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
583 u32 flags, phy_interface_t interface)
Andy Fleminge1393452005-08-24 18:46:21 -0500584{
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000585 struct device *d = &phydev->dev;
Marc Kleine-Budded005a092011-03-28 14:54:08 +0000586 int err;
Andy Fleminge1393452005-08-24 18:46:21 -0500587
588 /* Assume that if there is no driver, that it doesn't
589 * exist, and we should use the genphy driver. */
590 if (NULL == d->driver) {
David Daneyac28b9f2012-06-27 07:33:35 +0000591 if (phydev->is_c45) {
592 pr_err("No driver for phy %x\n", phydev->phy_id);
593 return -ENODEV;
594 }
595
Andy Fleminge1393452005-08-24 18:46:21 -0500596 d->driver = &genphy_driver.driver;
597
598 err = d->driver->probe(d);
Jeff Garzikb7a00ec2006-10-01 07:27:46 -0400599 if (err >= 0)
600 err = device_bind_driver(d);
Andy Fleminge1393452005-08-24 18:46:21 -0500601
Jeff Garzikb7a00ec2006-10-01 07:27:46 -0400602 if (err)
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000603 return err;
Andy Fleminge1393452005-08-24 18:46:21 -0500604 }
605
606 if (phydev->attached_dev) {
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000607 dev_err(&dev->dev, "PHY already attached\n");
608 return -EBUSY;
Andy Fleminge1393452005-08-24 18:46:21 -0500609 }
610
611 phydev->attached_dev = dev;
Richard Cochranc1f19b52010-07-17 08:49:36 +0000612 dev->phydev = phydev;
Andy Fleminge1393452005-08-24 18:46:21 -0500613
614 phydev->dev_flags = flags;
615
Andy Fleminge8a2b6a2006-12-01 12:01:06 -0600616 phydev->interface = interface;
617
Anton Vorontsovef24b162010-08-24 14:46:12 -0700618 phydev->state = PHY_READY;
619
Andy Fleminge8a2b6a2006-12-01 12:01:06 -0600620 /* Do initial configuration here, now that
621 * we have certain key parameters
622 * (dev_flags and interface) */
Marc Kleine-Budded005a092011-03-28 14:54:08 +0000623 err = phy_init_hw(phydev);
624 if (err)
625 phy_detach(phydev);
626
627 return err;
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000628}
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000629
630/**
631 * phy_attach - attach a network device to a particular PHY device
632 * @dev: network device to attach
633 * @bus_id: Bus ID of PHY device to attach
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000634 * @interface: PHY device's interface
635 *
636 * Description: Same as phy_attach_direct() except that a PHY bus_id
637 * string is passed instead of a pointer to a struct phy_device.
638 */
639struct phy_device *phy_attach(struct net_device *dev,
Florian Fainellif9a8f832013-01-14 00:52:52 +0000640 const char *bus_id, phy_interface_t interface)
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000641{
642 struct bus_type *bus = &mdio_bus_type;
643 struct phy_device *phydev;
644 struct device *d;
645 int rc;
646
647 /* Search the list of PHY devices on the mdio bus for the
648 * PHY with the requested name */
649 d = bus_find_device_by_name(bus, NULL, bus_id);
650 if (!d) {
651 pr_err("PHY %s not found\n", bus_id);
652 return ERR_PTR(-ENODEV);
653 }
654 phydev = to_phy_device(d);
655
Florian Fainellif9a8f832013-01-14 00:52:52 +0000656 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface);
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000657 if (rc)
658 return ERR_PTR(rc);
659
Andy Fleminge1393452005-08-24 18:46:21 -0500660 return phydev;
661}
662EXPORT_SYMBOL(phy_attach);
663
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800664/**
665 * phy_detach - detach a PHY device from its network device
666 * @phydev: target phy_device struct
667 */
Andy Fleminge1393452005-08-24 18:46:21 -0500668void phy_detach(struct phy_device *phydev)
669{
Richard Cochranc1f19b52010-07-17 08:49:36 +0000670 phydev->attached_dev->phydev = NULL;
Andy Fleminge1393452005-08-24 18:46:21 -0500671 phydev->attached_dev = NULL;
672
673 /* If the device had no specific driver before (i.e. - it
674 * was using the generic driver), we unbind the device
675 * from the generic driver so that there's a chance a
676 * real driver could be loaded */
Greg Kroah-Hartman87aebe02007-04-09 11:52:31 -0400677 if (phydev->dev.driver == &genphy_driver.driver)
Andy Fleminge1393452005-08-24 18:46:21 -0500678 device_release_driver(&phydev->dev);
Andy Fleminge1393452005-08-24 18:46:21 -0500679}
680EXPORT_SYMBOL(phy_detach);
681
Sebastian Hesselbarth481b5d92013-12-13 10:20:27 +0100682int phy_suspend(struct phy_device *phydev)
683{
684 struct phy_driver *phydrv = to_phy_driver(phydev->dev.driver);
685 struct ethtool_wolinfo wol;
686
687 /* If the device has WOL enabled, we cannot suspend the PHY */
688 wol.cmd = ETHTOOL_GWOL;
689 phy_ethtool_get_wol(phydev, &wol);
690 if (wol.wolopts)
691 return -EBUSY;
692
693 if (phydrv->suspend)
694 return phydrv->suspend(phydev);
695 return 0;
696}
697
698int phy_resume(struct phy_device *phydev)
699{
700 struct phy_driver *phydrv = to_phy_driver(phydev->dev.driver);
701
702 if (phydrv->resume)
703 return phydrv->resume(phydev);
704 return 0;
705}
Andy Fleminge1393452005-08-24 18:46:21 -0500706
Andy Fleming00db8182005-07-30 19:31:23 -0400707/* Generic PHY support and helper functions */
708
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800709/**
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300710 * genphy_config_advert - sanitize and advertise auto-negotiation parameters
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800711 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400712 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800713 * Description: Writes MII_ADVERTISE with the appropriate values,
Andy Fleming00db8182005-07-30 19:31:23 -0400714 * after sanitizing the values to make sure we only advertise
Trent Piepho51e2a382008-09-24 10:55:46 +0000715 * what is supported. Returns < 0 on error, 0 if the PHY's advertisement
716 * hasn't changed, and > 0 if it has changed.
Andy Fleming00db8182005-07-30 19:31:23 -0400717 */
stephen hemminger89ff05e2010-10-21 08:37:41 +0000718static int genphy_config_advert(struct phy_device *phydev)
Andy Fleming00db8182005-07-30 19:31:23 -0400719{
720 u32 advertise;
Trent Piepho51e2a382008-09-24 10:55:46 +0000721 int oldadv, adv;
722 int err, changed = 0;
Andy Fleming00db8182005-07-30 19:31:23 -0400723
724 /* Only allow advertising what
725 * this PHY supports */
726 phydev->advertising &= phydev->supported;
727 advertise = phydev->advertising;
728
729 /* Setup standard advertisement */
Trent Piepho51e2a382008-09-24 10:55:46 +0000730 oldadv = adv = phy_read(phydev, MII_ADVERTISE);
Andy Fleming00db8182005-07-30 19:31:23 -0400731
732 if (adv < 0)
733 return adv;
734
Matt Carlson28011cf2011-11-16 18:36:59 -0500735 adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4 | ADVERTISE_PAUSE_CAP |
Andy Fleming00db8182005-07-30 19:31:23 -0400736 ADVERTISE_PAUSE_ASYM);
Matt Carlson37f07022011-11-17 14:30:55 +0000737 adv |= ethtool_adv_to_mii_adv_t(advertise);
Andy Fleming00db8182005-07-30 19:31:23 -0400738
Trent Piepho51e2a382008-09-24 10:55:46 +0000739 if (adv != oldadv) {
740 err = phy_write(phydev, MII_ADVERTISE, adv);
Andy Fleming00db8182005-07-30 19:31:23 -0400741
Trent Piepho51e2a382008-09-24 10:55:46 +0000742 if (err < 0)
743 return err;
744 changed = 1;
745 }
Andy Fleming00db8182005-07-30 19:31:23 -0400746
747 /* Configure gigabit if it's supported */
748 if (phydev->supported & (SUPPORTED_1000baseT_Half |
749 SUPPORTED_1000baseT_Full)) {
Trent Piepho51e2a382008-09-24 10:55:46 +0000750 oldadv = adv = phy_read(phydev, MII_CTRL1000);
Andy Fleming00db8182005-07-30 19:31:23 -0400751
752 if (adv < 0)
753 return adv;
754
755 adv &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
Matt Carlson37f07022011-11-17 14:30:55 +0000756 adv |= ethtool_adv_to_mii_ctrl1000_t(advertise);
Andy Fleming00db8182005-07-30 19:31:23 -0400757
Trent Piepho51e2a382008-09-24 10:55:46 +0000758 if (adv != oldadv) {
759 err = phy_write(phydev, MII_CTRL1000, adv);
760
761 if (err < 0)
762 return err;
763 changed = 1;
764 }
Andy Fleming00db8182005-07-30 19:31:23 -0400765 }
766
Trent Piepho51e2a382008-09-24 10:55:46 +0000767 return changed;
Andy Fleming00db8182005-07-30 19:31:23 -0400768}
Andy Fleming00db8182005-07-30 19:31:23 -0400769
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800770/**
771 * genphy_setup_forced - configures/forces speed/duplex from @phydev
772 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400773 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800774 * Description: Configures MII_BMCR to force speed/duplex
Andy Fleming00db8182005-07-30 19:31:23 -0400775 * to the values in phydev. Assumes that the values are valid.
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800776 * Please see phy_sanitize_settings().
777 */
Madalin Bucur3fb69bc2013-11-20 16:38:19 -0600778int genphy_setup_forced(struct phy_device *phydev)
Andy Fleming00db8182005-07-30 19:31:23 -0400779{
Andy Flemingf62220d2008-04-18 17:29:54 -0500780 int err;
Domen Puncerbc1e0a02007-08-17 08:54:45 +0200781 int ctl = 0;
Andy Fleming00db8182005-07-30 19:31:23 -0400782
783 phydev->pause = phydev->asym_pause = 0;
784
785 if (SPEED_1000 == phydev->speed)
786 ctl |= BMCR_SPEED1000;
787 else if (SPEED_100 == phydev->speed)
788 ctl |= BMCR_SPEED100;
789
790 if (DUPLEX_FULL == phydev->duplex)
791 ctl |= BMCR_FULLDPLX;
792
Andy Flemingf62220d2008-04-18 17:29:54 -0500793 err = phy_write(phydev, MII_BMCR, ctl);
Andy Fleming00db8182005-07-30 19:31:23 -0400794
Andy Flemingf62220d2008-04-18 17:29:54 -0500795 return err;
Andy Fleming00db8182005-07-30 19:31:23 -0400796}
Madalin Bucur3fb69bc2013-11-20 16:38:19 -0600797EXPORT_SYMBOL(genphy_setup_forced);
Andy Fleming00db8182005-07-30 19:31:23 -0400798
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800799/**
800 * genphy_restart_aneg - Enable and Restart Autonegotiation
801 * @phydev: target phy_device struct
802 */
Andy Fleming00db8182005-07-30 19:31:23 -0400803int genphy_restart_aneg(struct phy_device *phydev)
804{
805 int ctl;
806
807 ctl = phy_read(phydev, MII_BMCR);
808
809 if (ctl < 0)
810 return ctl;
811
812 ctl |= (BMCR_ANENABLE | BMCR_ANRESTART);
813
814 /* Don't isolate the PHY if we're negotiating */
815 ctl &= ~(BMCR_ISOLATE);
816
817 ctl = phy_write(phydev, MII_BMCR, ctl);
818
819 return ctl;
820}
Adrian Bunk892871d2008-10-13 18:48:09 -0700821EXPORT_SYMBOL(genphy_restart_aneg);
Andy Fleming00db8182005-07-30 19:31:23 -0400822
823
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800824/**
825 * genphy_config_aneg - restart auto-negotiation or write BMCR
826 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400827 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800828 * Description: If auto-negotiation is enabled, we configure the
Andy Fleming00db8182005-07-30 19:31:23 -0400829 * advertising, and then restart auto-negotiation. If it is not
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800830 * enabled, then we write the BMCR.
Andy Fleming00db8182005-07-30 19:31:23 -0400831 */
832int genphy_config_aneg(struct phy_device *phydev)
833{
Trent Piephode339c22008-11-19 15:52:41 -0800834 int result;
Andy Fleming00db8182005-07-30 19:31:23 -0400835
Trent Piephode339c22008-11-19 15:52:41 -0800836 if (AUTONEG_ENABLE != phydev->autoneg)
837 return genphy_setup_forced(phydev);
Andy Fleming00db8182005-07-30 19:31:23 -0400838
Trent Piephode339c22008-11-19 15:52:41 -0800839 result = genphy_config_advert(phydev);
Andy Fleming00db8182005-07-30 19:31:23 -0400840
Trent Piephode339c22008-11-19 15:52:41 -0800841 if (result < 0) /* error */
842 return result;
843
844 if (result == 0) {
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300845 /* Advertisement hasn't changed, but maybe aneg was never on to
Trent Piephode339c22008-11-19 15:52:41 -0800846 * begin with? Or maybe phy was isolated? */
847 int ctl = phy_read(phydev, MII_BMCR);
848
849 if (ctl < 0)
850 return ctl;
851
852 if (!(ctl & BMCR_ANENABLE) || (ctl & BMCR_ISOLATE))
853 result = 1; /* do restart aneg */
854 }
855
856 /* Only restart aneg if we are advertising something different
857 * than we were before. */
858 if (result > 0)
859 result = genphy_restart_aneg(phydev);
Andy Fleming00db8182005-07-30 19:31:23 -0400860
Trent Piepho51e2a382008-09-24 10:55:46 +0000861 return result;
Andy Fleming00db8182005-07-30 19:31:23 -0400862}
863EXPORT_SYMBOL(genphy_config_aneg);
864
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800865/**
866 * genphy_update_link - update link status in @phydev
867 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400868 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800869 * Description: Update the value in phydev->link to reflect the
Andy Fleming00db8182005-07-30 19:31:23 -0400870 * current link value. In order to do this, we need to read
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800871 * the status register twice, keeping the second value.
Andy Fleming00db8182005-07-30 19:31:23 -0400872 */
873int genphy_update_link(struct phy_device *phydev)
874{
875 int status;
876
877 /* Do a fake read */
878 status = phy_read(phydev, MII_BMSR);
879
880 if (status < 0)
881 return status;
882
883 /* Read link and autonegotiation status */
884 status = phy_read(phydev, MII_BMSR);
885
886 if (status < 0)
887 return status;
888
889 if ((status & BMSR_LSTATUS) == 0)
890 phydev->link = 0;
891 else
892 phydev->link = 1;
893
894 return 0;
895}
Andy Fleming6b655522006-10-16 16:19:17 -0500896EXPORT_SYMBOL(genphy_update_link);
Andy Fleming00db8182005-07-30 19:31:23 -0400897
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800898/**
899 * genphy_read_status - check the link status and update current link state
900 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400901 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800902 * Description: Check the link, then figure out the current state
Andy Fleming00db8182005-07-30 19:31:23 -0400903 * by comparing what we advertise with what the link partner
904 * advertises. Start by checking the gigabit possibilities,
905 * then move on to 10/100.
906 */
907int genphy_read_status(struct phy_device *phydev)
908{
909 int adv;
910 int err;
911 int lpa;
912 int lpagb = 0;
913
914 /* Update the link, but return if there
915 * was an error */
916 err = genphy_update_link(phydev);
917 if (err)
918 return err;
919
Florian Fainelli114002b2013-12-06 13:01:30 -0800920 phydev->lp_advertising = 0;
921
Andy Fleming00db8182005-07-30 19:31:23 -0400922 if (AUTONEG_ENABLE == phydev->autoneg) {
923 if (phydev->supported & (SUPPORTED_1000baseT_Half
924 | SUPPORTED_1000baseT_Full)) {
925 lpagb = phy_read(phydev, MII_STAT1000);
926
927 if (lpagb < 0)
928 return lpagb;
929
930 adv = phy_read(phydev, MII_CTRL1000);
931
932 if (adv < 0)
933 return adv;
934
Florian Fainelli114002b2013-12-06 13:01:30 -0800935 phydev->lp_advertising =
936 mii_stat1000_to_ethtool_lpa_t(lpagb);
Andy Fleming00db8182005-07-30 19:31:23 -0400937 lpagb &= adv << 2;
938 }
939
940 lpa = phy_read(phydev, MII_LPA);
941
942 if (lpa < 0)
943 return lpa;
944
Florian Fainelli114002b2013-12-06 13:01:30 -0800945 phydev->lp_advertising |= mii_lpa_to_ethtool_lpa_t(lpa);
946
Andy Fleming00db8182005-07-30 19:31:23 -0400947 adv = phy_read(phydev, MII_ADVERTISE);
948
949 if (adv < 0)
950 return adv;
951
952 lpa &= adv;
953
954 phydev->speed = SPEED_10;
955 phydev->duplex = DUPLEX_HALF;
956 phydev->pause = phydev->asym_pause = 0;
957
958 if (lpagb & (LPA_1000FULL | LPA_1000HALF)) {
959 phydev->speed = SPEED_1000;
960
961 if (lpagb & LPA_1000FULL)
962 phydev->duplex = DUPLEX_FULL;
963 } else if (lpa & (LPA_100FULL | LPA_100HALF)) {
964 phydev->speed = SPEED_100;
965
966 if (lpa & LPA_100FULL)
967 phydev->duplex = DUPLEX_FULL;
968 } else
969 if (lpa & LPA_10FULL)
970 phydev->duplex = DUPLEX_FULL;
971
972 if (phydev->duplex == DUPLEX_FULL){
973 phydev->pause = lpa & LPA_PAUSE_CAP ? 1 : 0;
974 phydev->asym_pause = lpa & LPA_PAUSE_ASYM ? 1 : 0;
975 }
976 } else {
977 int bmcr = phy_read(phydev, MII_BMCR);
978 if (bmcr < 0)
979 return bmcr;
980
981 if (bmcr & BMCR_FULLDPLX)
982 phydev->duplex = DUPLEX_FULL;
983 else
984 phydev->duplex = DUPLEX_HALF;
985
986 if (bmcr & BMCR_SPEED1000)
987 phydev->speed = SPEED_1000;
988 else if (bmcr & BMCR_SPEED100)
989 phydev->speed = SPEED_100;
990 else
991 phydev->speed = SPEED_10;
992
993 phydev->pause = phydev->asym_pause = 0;
994 }
995
996 return 0;
997}
998EXPORT_SYMBOL(genphy_read_status);
999
1000static int genphy_config_init(struct phy_device *phydev)
1001{
Eric Sesterhenn84c22d72006-09-25 16:39:22 -07001002 int val;
Andy Fleming00db8182005-07-30 19:31:23 -04001003 u32 features;
1004
1005 /* For now, I'll claim that the generic driver supports
1006 * all possible port types */
1007 features = (SUPPORTED_TP | SUPPORTED_MII
1008 | SUPPORTED_AUI | SUPPORTED_FIBRE |
1009 SUPPORTED_BNC);
1010
1011 /* Do we support autonegotiation? */
1012 val = phy_read(phydev, MII_BMSR);
1013
1014 if (val < 0)
1015 return val;
1016
1017 if (val & BMSR_ANEGCAPABLE)
1018 features |= SUPPORTED_Autoneg;
1019
1020 if (val & BMSR_100FULL)
1021 features |= SUPPORTED_100baseT_Full;
1022 if (val & BMSR_100HALF)
1023 features |= SUPPORTED_100baseT_Half;
1024 if (val & BMSR_10FULL)
1025 features |= SUPPORTED_10baseT_Full;
1026 if (val & BMSR_10HALF)
1027 features |= SUPPORTED_10baseT_Half;
1028
1029 if (val & BMSR_ESTATEN) {
1030 val = phy_read(phydev, MII_ESTATUS);
1031
1032 if (val < 0)
1033 return val;
1034
1035 if (val & ESTATUS_1000_TFULL)
1036 features |= SUPPORTED_1000baseT_Full;
1037 if (val & ESTATUS_1000_THALF)
1038 features |= SUPPORTED_1000baseT_Half;
1039 }
1040
1041 phydev->supported = features;
1042 phydev->advertising = features;
1043
1044 return 0;
1045}
Giuseppe Cavallaro0f0ca342008-11-28 16:24:56 -08001046int genphy_suspend(struct phy_device *phydev)
1047{
1048 int value;
Andy Fleming00db8182005-07-30 19:31:23 -04001049
Giuseppe Cavallaro0f0ca342008-11-28 16:24:56 -08001050 mutex_lock(&phydev->lock);
1051
1052 value = phy_read(phydev, MII_BMCR);
1053 phy_write(phydev, MII_BMCR, (value | BMCR_PDOWN));
1054
1055 mutex_unlock(&phydev->lock);
1056
1057 return 0;
1058}
1059EXPORT_SYMBOL(genphy_suspend);
1060
1061int genphy_resume(struct phy_device *phydev)
1062{
1063 int value;
1064
1065 mutex_lock(&phydev->lock);
1066
1067 value = phy_read(phydev, MII_BMCR);
1068 phy_write(phydev, MII_BMCR, (value & ~BMCR_PDOWN));
1069
1070 mutex_unlock(&phydev->lock);
1071
1072 return 0;
1073}
1074EXPORT_SYMBOL(genphy_resume);
Andy Fleming00db8182005-07-30 19:31:23 -04001075
Randy Dunlapb3df0da2007-03-06 02:41:48 -08001076/**
1077 * phy_probe - probe and init a PHY device
1078 * @dev: device to probe and init
Andy Fleming00db8182005-07-30 19:31:23 -04001079 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -08001080 * Description: Take care of setting up the phy_device structure,
Andy Fleming00db8182005-07-30 19:31:23 -04001081 * set the state to READY (the driver's init function should
1082 * set it to STARTING if needed).
1083 */
1084static int phy_probe(struct device *dev)
1085{
1086 struct phy_device *phydev;
1087 struct phy_driver *phydrv;
1088 struct device_driver *drv;
1089 int err = 0;
1090
1091 phydev = to_phy_device(dev);
1092
Alan Sternf3ff9242012-01-24 13:35:24 -05001093 drv = phydev->dev.driver;
Andy Fleming00db8182005-07-30 19:31:23 -04001094 phydrv = to_phy_driver(drv);
1095 phydev->drv = phydrv;
1096
Florian Fainelli2c7b4922013-05-19 22:53:42 +00001097 /* Disable the interrupt if the PHY doesn't support it
1098 * but the interrupt is still a valid one
1099 */
1100 if (!(phydrv->flags & PHY_HAS_INTERRUPT) &&
1101 phy_interrupt_is_valid(phydev))
Andy Fleming00db8182005-07-30 19:31:23 -04001102 phydev->irq = PHY_POLL;
1103
Florian Fainelli4284b6a2013-05-23 01:11:12 +00001104 if (phydrv->flags & PHY_IS_INTERNAL)
1105 phydev->is_internal = true;
1106
Nate Case35b5f6b2008-01-29 10:05:09 -06001107 mutex_lock(&phydev->lock);
Andy Fleming00db8182005-07-30 19:31:23 -04001108
1109 /* Start out supporting everything. Eventually,
1110 * a controller will attach, and may modify one
1111 * or both of these values */
1112 phydev->supported = phydrv->features;
1113 phydev->advertising = phydrv->features;
1114
1115 /* Set the state to READY by default */
1116 phydev->state = PHY_READY;
1117
1118 if (phydev->drv->probe)
1119 err = phydev->drv->probe(phydev);
1120
Nate Case35b5f6b2008-01-29 10:05:09 -06001121 mutex_unlock(&phydev->lock);
Andy Fleming00db8182005-07-30 19:31:23 -04001122
Andy Fleming00db8182005-07-30 19:31:23 -04001123 return err;
Andy Fleminge8a2b6a2006-12-01 12:01:06 -06001124
Andy Fleming00db8182005-07-30 19:31:23 -04001125}
1126
1127static int phy_remove(struct device *dev)
1128{
1129 struct phy_device *phydev;
1130
1131 phydev = to_phy_device(dev);
1132
Nate Case35b5f6b2008-01-29 10:05:09 -06001133 mutex_lock(&phydev->lock);
Andy Fleming00db8182005-07-30 19:31:23 -04001134 phydev->state = PHY_DOWN;
Nate Case35b5f6b2008-01-29 10:05:09 -06001135 mutex_unlock(&phydev->lock);
Andy Fleming00db8182005-07-30 19:31:23 -04001136
1137 if (phydev->drv->remove)
1138 phydev->drv->remove(phydev);
Andy Fleming00db8182005-07-30 19:31:23 -04001139 phydev->drv = NULL;
1140
1141 return 0;
1142}
1143
Randy Dunlapb3df0da2007-03-06 02:41:48 -08001144/**
1145 * phy_driver_register - register a phy_driver with the PHY layer
1146 * @new_driver: new phy_driver to register
1147 */
Andy Fleming00db8182005-07-30 19:31:23 -04001148int phy_driver_register(struct phy_driver *new_driver)
1149{
1150 int retval;
1151
Andy Fleming00db8182005-07-30 19:31:23 -04001152 new_driver->driver.name = new_driver->name;
1153 new_driver->driver.bus = &mdio_bus_type;
1154 new_driver->driver.probe = phy_probe;
1155 new_driver->driver.remove = phy_remove;
1156
1157 retval = driver_register(&new_driver->driver);
1158
1159 if (retval) {
Joe Perches8d242482012-06-09 07:49:07 +00001160 pr_err("%s: Error %d in registering driver\n",
1161 new_driver->name, retval);
Andy Fleming00db8182005-07-30 19:31:23 -04001162
1163 return retval;
1164 }
1165
Olof Johanssonf2511f12007-11-04 16:09:23 -06001166 pr_debug("%s: Registered new driver\n", new_driver->name);
Andy Fleming00db8182005-07-30 19:31:23 -04001167
1168 return 0;
1169}
1170EXPORT_SYMBOL(phy_driver_register);
1171
Christian Hohnstaedtd5bf9072012-07-04 05:44:34 +00001172int phy_drivers_register(struct phy_driver *new_driver, int n)
1173{
1174 int i, ret = 0;
1175
1176 for (i = 0; i < n; i++) {
1177 ret = phy_driver_register(new_driver + i);
1178 if (ret) {
1179 while (i-- > 0)
1180 phy_driver_unregister(new_driver + i);
1181 break;
1182 }
1183 }
1184 return ret;
1185}
1186EXPORT_SYMBOL(phy_drivers_register);
1187
Andy Fleming00db8182005-07-30 19:31:23 -04001188void phy_driver_unregister(struct phy_driver *drv)
1189{
1190 driver_unregister(&drv->driver);
1191}
1192EXPORT_SYMBOL(phy_driver_unregister);
1193
Christian Hohnstaedtd5bf9072012-07-04 05:44:34 +00001194void phy_drivers_unregister(struct phy_driver *drv, int n)
1195{
1196 int i;
1197 for (i = 0; i < n; i++) {
1198 phy_driver_unregister(drv + i);
1199 }
1200}
1201EXPORT_SYMBOL(phy_drivers_unregister);
1202
Andy Fleminge1393452005-08-24 18:46:21 -05001203static struct phy_driver genphy_driver = {
1204 .phy_id = 0xffffffff,
1205 .phy_id_mask = 0xffffffff,
1206 .name = "Generic PHY",
1207 .config_init = genphy_config_init,
1208 .features = 0,
1209 .config_aneg = genphy_config_aneg,
1210 .read_status = genphy_read_status,
Giuseppe Cavallaro0f0ca342008-11-28 16:24:56 -08001211 .suspend = genphy_suspend,
1212 .resume = genphy_resume,
Andy Fleminge1393452005-08-24 18:46:21 -05001213 .driver = {.owner= THIS_MODULE, },
1214};
Andy Fleming00db8182005-07-30 19:31:23 -04001215
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001216static int __init phy_init(void)
Andy Fleming00db8182005-07-30 19:31:23 -04001217{
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001218 int rc;
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001219
1220 rc = mdio_bus_init();
1221 if (rc)
Andy Fleminge1393452005-08-24 18:46:21 -05001222 return rc;
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001223
Andy Fleminge1393452005-08-24 18:46:21 -05001224 rc = phy_driver_register(&genphy_driver);
1225 if (rc)
1226 mdio_bus_exit();
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001227
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001228 return rc;
Andy Fleming00db8182005-07-30 19:31:23 -04001229}
1230
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001231static void __exit phy_exit(void)
Andy Fleming00db8182005-07-30 19:31:23 -04001232{
1233 phy_driver_unregister(&genphy_driver);
Andy Fleminge1393452005-08-24 18:46:21 -05001234 mdio_bus_exit();
Andy Fleming00db8182005-07-30 19:31:23 -04001235}
1236
Andy Fleminge1393452005-08-24 18:46:21 -05001237subsys_initcall(phy_init);
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001238module_exit(phy_exit);