blob: d53242449c90d256a6f2663bd8672f899fbe3007 [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 Sieversfb28ad32008-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 Sieversfb28ad32008-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)
Florian Fainellie1093742013-12-17 21:38:12 -0800165 return (struct phy_device *)PTR_ERR((void *)-ENOMEM);
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700166
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 */
Florian Fainellie1093742013-12-17 21:38:12 -0800462struct 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);
Florian Fainellie1093742013-12-17 21:38:12 -0800497
Andy Fleminge1393452005-08-24 18:46:21 -0500498 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
Sebastian Hesselbarth1211ce52013-12-13 10:20:28 +0100627 phy_resume(phydev);
628
Marc Kleine-Budded005a092011-03-28 14:54:08 +0000629 return err;
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000630}
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000631
632/**
633 * phy_attach - attach a network device to a particular PHY device
634 * @dev: network device to attach
635 * @bus_id: Bus ID of PHY device to attach
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000636 * @interface: PHY device's interface
637 *
638 * Description: Same as phy_attach_direct() except that a PHY bus_id
639 * string is passed instead of a pointer to a struct phy_device.
640 */
641struct phy_device *phy_attach(struct net_device *dev,
Florian Fainellif9a8f832013-01-14 00:52:52 +0000642 const char *bus_id, phy_interface_t interface)
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000643{
644 struct bus_type *bus = &mdio_bus_type;
645 struct phy_device *phydev;
646 struct device *d;
647 int rc;
648
649 /* Search the list of PHY devices on the mdio bus for the
650 * PHY with the requested name */
651 d = bus_find_device_by_name(bus, NULL, bus_id);
652 if (!d) {
653 pr_err("PHY %s not found\n", bus_id);
654 return ERR_PTR(-ENODEV);
655 }
656 phydev = to_phy_device(d);
657
Florian Fainellif9a8f832013-01-14 00:52:52 +0000658 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface);
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000659 if (rc)
660 return ERR_PTR(rc);
661
Andy Fleminge1393452005-08-24 18:46:21 -0500662 return phydev;
663}
664EXPORT_SYMBOL(phy_attach);
665
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800666/**
667 * phy_detach - detach a PHY device from its network device
668 * @phydev: target phy_device struct
669 */
Andy Fleminge1393452005-08-24 18:46:21 -0500670void phy_detach(struct phy_device *phydev)
671{
Richard Cochranc1f19b52010-07-17 08:49:36 +0000672 phydev->attached_dev->phydev = NULL;
Andy Fleminge1393452005-08-24 18:46:21 -0500673 phydev->attached_dev = NULL;
Sebastian Hesselbarth1211ce52013-12-13 10:20:28 +0100674 phy_suspend(phydev);
Andy Fleminge1393452005-08-24 18:46:21 -0500675
676 /* If the device had no specific driver before (i.e. - it
677 * was using the generic driver), we unbind the device
678 * from the generic driver so that there's a chance a
679 * real driver could be loaded */
Greg Kroah-Hartman87aebe02007-04-09 11:52:31 -0400680 if (phydev->dev.driver == &genphy_driver.driver)
Andy Fleminge1393452005-08-24 18:46:21 -0500681 device_release_driver(&phydev->dev);
Andy Fleminge1393452005-08-24 18:46:21 -0500682}
683EXPORT_SYMBOL(phy_detach);
684
Sebastian Hesselbarth481b5d92013-12-13 10:20:27 +0100685int phy_suspend(struct phy_device *phydev)
686{
687 struct phy_driver *phydrv = to_phy_driver(phydev->dev.driver);
688 struct ethtool_wolinfo wol;
689
690 /* If the device has WOL enabled, we cannot suspend the PHY */
691 wol.cmd = ETHTOOL_GWOL;
692 phy_ethtool_get_wol(phydev, &wol);
693 if (wol.wolopts)
694 return -EBUSY;
695
696 if (phydrv->suspend)
697 return phydrv->suspend(phydev);
698 return 0;
699}
700
701int phy_resume(struct phy_device *phydev)
702{
703 struct phy_driver *phydrv = to_phy_driver(phydev->dev.driver);
704
705 if (phydrv->resume)
706 return phydrv->resume(phydev);
707 return 0;
708}
Andy Fleminge1393452005-08-24 18:46:21 -0500709
Andy Fleming00db8182005-07-30 19:31:23 -0400710/* Generic PHY support and helper functions */
711
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800712/**
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300713 * genphy_config_advert - sanitize and advertise auto-negotiation parameters
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800714 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400715 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800716 * Description: Writes MII_ADVERTISE with the appropriate values,
Andy Fleming00db8182005-07-30 19:31:23 -0400717 * after sanitizing the values to make sure we only advertise
Trent Piepho51e2a382008-09-24 10:55:46 +0000718 * what is supported. Returns < 0 on error, 0 if the PHY's advertisement
719 * hasn't changed, and > 0 if it has changed.
Andy Fleming00db8182005-07-30 19:31:23 -0400720 */
stephen hemminger89ff05e2010-10-21 08:37:41 +0000721static int genphy_config_advert(struct phy_device *phydev)
Andy Fleming00db8182005-07-30 19:31:23 -0400722{
723 u32 advertise;
Trent Piepho51e2a382008-09-24 10:55:46 +0000724 int oldadv, adv;
725 int err, changed = 0;
Andy Fleming00db8182005-07-30 19:31:23 -0400726
727 /* Only allow advertising what
728 * this PHY supports */
729 phydev->advertising &= phydev->supported;
730 advertise = phydev->advertising;
731
732 /* Setup standard advertisement */
Trent Piepho51e2a382008-09-24 10:55:46 +0000733 oldadv = adv = phy_read(phydev, MII_ADVERTISE);
Andy Fleming00db8182005-07-30 19:31:23 -0400734
735 if (adv < 0)
736 return adv;
737
Matt Carlson28011cf2011-11-16 18:36:59 -0500738 adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4 | ADVERTISE_PAUSE_CAP |
Andy Fleming00db8182005-07-30 19:31:23 -0400739 ADVERTISE_PAUSE_ASYM);
Matt Carlson37f07022011-11-17 14:30:55 +0000740 adv |= ethtool_adv_to_mii_adv_t(advertise);
Andy Fleming00db8182005-07-30 19:31:23 -0400741
Trent Piepho51e2a382008-09-24 10:55:46 +0000742 if (adv != oldadv) {
743 err = phy_write(phydev, MII_ADVERTISE, adv);
Andy Fleming00db8182005-07-30 19:31:23 -0400744
Trent Piepho51e2a382008-09-24 10:55:46 +0000745 if (err < 0)
746 return err;
747 changed = 1;
748 }
Andy Fleming00db8182005-07-30 19:31:23 -0400749
750 /* Configure gigabit if it's supported */
751 if (phydev->supported & (SUPPORTED_1000baseT_Half |
752 SUPPORTED_1000baseT_Full)) {
Trent Piepho51e2a382008-09-24 10:55:46 +0000753 oldadv = adv = phy_read(phydev, MII_CTRL1000);
Andy Fleming00db8182005-07-30 19:31:23 -0400754
755 if (adv < 0)
756 return adv;
757
758 adv &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
Matt Carlson37f07022011-11-17 14:30:55 +0000759 adv |= ethtool_adv_to_mii_ctrl1000_t(advertise);
Andy Fleming00db8182005-07-30 19:31:23 -0400760
Trent Piepho51e2a382008-09-24 10:55:46 +0000761 if (adv != oldadv) {
762 err = phy_write(phydev, MII_CTRL1000, adv);
763
764 if (err < 0)
765 return err;
766 changed = 1;
767 }
Andy Fleming00db8182005-07-30 19:31:23 -0400768 }
769
Trent Piepho51e2a382008-09-24 10:55:46 +0000770 return changed;
Andy Fleming00db8182005-07-30 19:31:23 -0400771}
Andy Fleming00db8182005-07-30 19:31:23 -0400772
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800773/**
774 * genphy_setup_forced - configures/forces speed/duplex from @phydev
775 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400776 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800777 * Description: Configures MII_BMCR to force speed/duplex
Andy Fleming00db8182005-07-30 19:31:23 -0400778 * to the values in phydev. Assumes that the values are valid.
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800779 * Please see phy_sanitize_settings().
780 */
Madalin Bucur3fb69bc2013-11-20 16:38:19 -0600781int genphy_setup_forced(struct phy_device *phydev)
Andy Fleming00db8182005-07-30 19:31:23 -0400782{
Andy Flemingf62220d2008-04-18 17:29:54 -0500783 int err;
Domen Puncerbc1e0a02007-08-17 08:54:45 +0200784 int ctl = 0;
Andy Fleming00db8182005-07-30 19:31:23 -0400785
786 phydev->pause = phydev->asym_pause = 0;
787
788 if (SPEED_1000 == phydev->speed)
789 ctl |= BMCR_SPEED1000;
790 else if (SPEED_100 == phydev->speed)
791 ctl |= BMCR_SPEED100;
792
793 if (DUPLEX_FULL == phydev->duplex)
794 ctl |= BMCR_FULLDPLX;
Florian Fainellie1093742013-12-17 21:38:12 -0800795
Andy Flemingf62220d2008-04-18 17:29:54 -0500796 err = phy_write(phydev, MII_BMCR, ctl);
Andy Fleming00db8182005-07-30 19:31:23 -0400797
Andy Flemingf62220d2008-04-18 17:29:54 -0500798 return err;
Andy Fleming00db8182005-07-30 19:31:23 -0400799}
Madalin Bucur3fb69bc2013-11-20 16:38:19 -0600800EXPORT_SYMBOL(genphy_setup_forced);
Andy Fleming00db8182005-07-30 19:31:23 -0400801
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800802/**
803 * genphy_restart_aneg - Enable and Restart Autonegotiation
804 * @phydev: target phy_device struct
805 */
Andy Fleming00db8182005-07-30 19:31:23 -0400806int genphy_restart_aneg(struct phy_device *phydev)
807{
808 int ctl;
809
810 ctl = phy_read(phydev, MII_BMCR);
811
812 if (ctl < 0)
813 return ctl;
814
815 ctl |= (BMCR_ANENABLE | BMCR_ANRESTART);
816
817 /* Don't isolate the PHY if we're negotiating */
818 ctl &= ~(BMCR_ISOLATE);
819
820 ctl = phy_write(phydev, MII_BMCR, ctl);
821
822 return ctl;
823}
Adrian Bunk892871d2008-10-13 18:48:09 -0700824EXPORT_SYMBOL(genphy_restart_aneg);
Andy Fleming00db8182005-07-30 19:31:23 -0400825
826
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800827/**
828 * genphy_config_aneg - restart auto-negotiation or write BMCR
829 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400830 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800831 * Description: If auto-negotiation is enabled, we configure the
Andy Fleming00db8182005-07-30 19:31:23 -0400832 * advertising, and then restart auto-negotiation. If it is not
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800833 * enabled, then we write the BMCR.
Andy Fleming00db8182005-07-30 19:31:23 -0400834 */
835int genphy_config_aneg(struct phy_device *phydev)
836{
Trent Piephode339c22008-11-19 15:52:41 -0800837 int result;
Andy Fleming00db8182005-07-30 19:31:23 -0400838
Trent Piephode339c22008-11-19 15:52:41 -0800839 if (AUTONEG_ENABLE != phydev->autoneg)
840 return genphy_setup_forced(phydev);
Andy Fleming00db8182005-07-30 19:31:23 -0400841
Trent Piephode339c22008-11-19 15:52:41 -0800842 result = genphy_config_advert(phydev);
Andy Fleming00db8182005-07-30 19:31:23 -0400843
Trent Piephode339c22008-11-19 15:52:41 -0800844 if (result < 0) /* error */
845 return result;
846
847 if (result == 0) {
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300848 /* Advertisement hasn't changed, but maybe aneg was never on to
Trent Piephode339c22008-11-19 15:52:41 -0800849 * begin with? Or maybe phy was isolated? */
850 int ctl = phy_read(phydev, MII_BMCR);
851
852 if (ctl < 0)
853 return ctl;
854
855 if (!(ctl & BMCR_ANENABLE) || (ctl & BMCR_ISOLATE))
856 result = 1; /* do restart aneg */
857 }
858
859 /* Only restart aneg if we are advertising something different
860 * than we were before. */
861 if (result > 0)
862 result = genphy_restart_aneg(phydev);
Andy Fleming00db8182005-07-30 19:31:23 -0400863
Trent Piepho51e2a382008-09-24 10:55:46 +0000864 return result;
Andy Fleming00db8182005-07-30 19:31:23 -0400865}
866EXPORT_SYMBOL(genphy_config_aneg);
867
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800868/**
869 * genphy_update_link - update link status in @phydev
870 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400871 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800872 * Description: Update the value in phydev->link to reflect the
Andy Fleming00db8182005-07-30 19:31:23 -0400873 * current link value. In order to do this, we need to read
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800874 * the status register twice, keeping the second value.
Andy Fleming00db8182005-07-30 19:31:23 -0400875 */
876int genphy_update_link(struct phy_device *phydev)
877{
878 int status;
879
880 /* Do a fake read */
881 status = phy_read(phydev, MII_BMSR);
882
883 if (status < 0)
884 return status;
885
886 /* Read link and autonegotiation status */
887 status = phy_read(phydev, MII_BMSR);
888
889 if (status < 0)
890 return status;
891
892 if ((status & BMSR_LSTATUS) == 0)
893 phydev->link = 0;
894 else
895 phydev->link = 1;
896
897 return 0;
898}
Andy Fleming6b655522006-10-16 16:19:17 -0500899EXPORT_SYMBOL(genphy_update_link);
Andy Fleming00db8182005-07-30 19:31:23 -0400900
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800901/**
902 * genphy_read_status - check the link status and update current link state
903 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400904 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800905 * Description: Check the link, then figure out the current state
Andy Fleming00db8182005-07-30 19:31:23 -0400906 * by comparing what we advertise with what the link partner
907 * advertises. Start by checking the gigabit possibilities,
908 * then move on to 10/100.
909 */
910int genphy_read_status(struct phy_device *phydev)
911{
912 int adv;
913 int err;
914 int lpa;
915 int lpagb = 0;
916
917 /* Update the link, but return if there
918 * was an error */
919 err = genphy_update_link(phydev);
920 if (err)
921 return err;
922
Florian Fainelli114002b2013-12-06 13:01:30 -0800923 phydev->lp_advertising = 0;
924
Andy Fleming00db8182005-07-30 19:31:23 -0400925 if (AUTONEG_ENABLE == phydev->autoneg) {
926 if (phydev->supported & (SUPPORTED_1000baseT_Half
927 | SUPPORTED_1000baseT_Full)) {
928 lpagb = phy_read(phydev, MII_STAT1000);
929
930 if (lpagb < 0)
931 return lpagb;
932
933 adv = phy_read(phydev, MII_CTRL1000);
934
935 if (adv < 0)
936 return adv;
937
Florian Fainelli114002b2013-12-06 13:01:30 -0800938 phydev->lp_advertising =
939 mii_stat1000_to_ethtool_lpa_t(lpagb);
Andy Fleming00db8182005-07-30 19:31:23 -0400940 lpagb &= adv << 2;
941 }
942
943 lpa = phy_read(phydev, MII_LPA);
944
945 if (lpa < 0)
946 return lpa;
947
Florian Fainelli114002b2013-12-06 13:01:30 -0800948 phydev->lp_advertising |= mii_lpa_to_ethtool_lpa_t(lpa);
949
Andy Fleming00db8182005-07-30 19:31:23 -0400950 adv = phy_read(phydev, MII_ADVERTISE);
951
952 if (adv < 0)
953 return adv;
954
955 lpa &= adv;
956
957 phydev->speed = SPEED_10;
958 phydev->duplex = DUPLEX_HALF;
959 phydev->pause = phydev->asym_pause = 0;
960
961 if (lpagb & (LPA_1000FULL | LPA_1000HALF)) {
962 phydev->speed = SPEED_1000;
963
964 if (lpagb & LPA_1000FULL)
965 phydev->duplex = DUPLEX_FULL;
966 } else if (lpa & (LPA_100FULL | LPA_100HALF)) {
967 phydev->speed = SPEED_100;
Florian Fainellie1093742013-12-17 21:38:12 -0800968
Andy Fleming00db8182005-07-30 19:31:23 -0400969 if (lpa & LPA_100FULL)
970 phydev->duplex = DUPLEX_FULL;
971 } else
972 if (lpa & LPA_10FULL)
973 phydev->duplex = DUPLEX_FULL;
974
Florian Fainellie1093742013-12-17 21:38:12 -0800975 if (phydev->duplex == DUPLEX_FULL) {
Andy Fleming00db8182005-07-30 19:31:23 -0400976 phydev->pause = lpa & LPA_PAUSE_CAP ? 1 : 0;
977 phydev->asym_pause = lpa & LPA_PAUSE_ASYM ? 1 : 0;
978 }
979 } else {
980 int bmcr = phy_read(phydev, MII_BMCR);
981 if (bmcr < 0)
982 return bmcr;
983
984 if (bmcr & BMCR_FULLDPLX)
985 phydev->duplex = DUPLEX_FULL;
986 else
987 phydev->duplex = DUPLEX_HALF;
988
989 if (bmcr & BMCR_SPEED1000)
990 phydev->speed = SPEED_1000;
991 else if (bmcr & BMCR_SPEED100)
992 phydev->speed = SPEED_100;
993 else
994 phydev->speed = SPEED_10;
995
996 phydev->pause = phydev->asym_pause = 0;
997 }
998
999 return 0;
1000}
1001EXPORT_SYMBOL(genphy_read_status);
1002
1003static int genphy_config_init(struct phy_device *phydev)
1004{
Eric Sesterhenn84c22d72006-09-25 16:39:22 -07001005 int val;
Andy Fleming00db8182005-07-30 19:31:23 -04001006 u32 features;
1007
1008 /* For now, I'll claim that the generic driver supports
1009 * all possible port types */
1010 features = (SUPPORTED_TP | SUPPORTED_MII
1011 | SUPPORTED_AUI | SUPPORTED_FIBRE |
1012 SUPPORTED_BNC);
1013
1014 /* Do we support autonegotiation? */
1015 val = phy_read(phydev, MII_BMSR);
1016
1017 if (val < 0)
1018 return val;
1019
1020 if (val & BMSR_ANEGCAPABLE)
1021 features |= SUPPORTED_Autoneg;
1022
1023 if (val & BMSR_100FULL)
1024 features |= SUPPORTED_100baseT_Full;
1025 if (val & BMSR_100HALF)
1026 features |= SUPPORTED_100baseT_Half;
1027 if (val & BMSR_10FULL)
1028 features |= SUPPORTED_10baseT_Full;
1029 if (val & BMSR_10HALF)
1030 features |= SUPPORTED_10baseT_Half;
1031
1032 if (val & BMSR_ESTATEN) {
1033 val = phy_read(phydev, MII_ESTATUS);
1034
1035 if (val < 0)
1036 return val;
1037
1038 if (val & ESTATUS_1000_TFULL)
1039 features |= SUPPORTED_1000baseT_Full;
1040 if (val & ESTATUS_1000_THALF)
1041 features |= SUPPORTED_1000baseT_Half;
1042 }
1043
1044 phydev->supported = features;
1045 phydev->advertising = features;
1046
1047 return 0;
1048}
Giuseppe Cavallaro0f0ca342008-11-28 16:24:56 -08001049int genphy_suspend(struct phy_device *phydev)
1050{
1051 int value;
Andy Fleming00db8182005-07-30 19:31:23 -04001052
Giuseppe Cavallaro0f0ca342008-11-28 16:24:56 -08001053 mutex_lock(&phydev->lock);
1054
1055 value = phy_read(phydev, MII_BMCR);
1056 phy_write(phydev, MII_BMCR, (value | BMCR_PDOWN));
1057
1058 mutex_unlock(&phydev->lock);
1059
1060 return 0;
1061}
1062EXPORT_SYMBOL(genphy_suspend);
1063
1064int genphy_resume(struct phy_device *phydev)
1065{
1066 int value;
1067
1068 mutex_lock(&phydev->lock);
1069
1070 value = phy_read(phydev, MII_BMCR);
1071 phy_write(phydev, MII_BMCR, (value & ~BMCR_PDOWN));
1072
1073 mutex_unlock(&phydev->lock);
1074
1075 return 0;
1076}
1077EXPORT_SYMBOL(genphy_resume);
Andy Fleming00db8182005-07-30 19:31:23 -04001078
Randy Dunlapb3df0da2007-03-06 02:41:48 -08001079/**
1080 * phy_probe - probe and init a PHY device
1081 * @dev: device to probe and init
Andy Fleming00db8182005-07-30 19:31:23 -04001082 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -08001083 * Description: Take care of setting up the phy_device structure,
Andy Fleming00db8182005-07-30 19:31:23 -04001084 * set the state to READY (the driver's init function should
1085 * set it to STARTING if needed).
1086 */
1087static int phy_probe(struct device *dev)
1088{
1089 struct phy_device *phydev;
1090 struct phy_driver *phydrv;
1091 struct device_driver *drv;
1092 int err = 0;
1093
1094 phydev = to_phy_device(dev);
1095
Alan Sternf3ff9242012-01-24 13:35:24 -05001096 drv = phydev->dev.driver;
Andy Fleming00db8182005-07-30 19:31:23 -04001097 phydrv = to_phy_driver(drv);
1098 phydev->drv = phydrv;
1099
Florian Fainelli2c7b4922013-05-19 22:53:42 +00001100 /* Disable the interrupt if the PHY doesn't support it
1101 * but the interrupt is still a valid one
1102 */
1103 if (!(phydrv->flags & PHY_HAS_INTERRUPT) &&
1104 phy_interrupt_is_valid(phydev))
Andy Fleming00db8182005-07-30 19:31:23 -04001105 phydev->irq = PHY_POLL;
1106
Florian Fainelli4284b6a2013-05-23 01:11:12 +00001107 if (phydrv->flags & PHY_IS_INTERNAL)
1108 phydev->is_internal = true;
1109
Nate Case35b5f6b2008-01-29 10:05:09 -06001110 mutex_lock(&phydev->lock);
Andy Fleming00db8182005-07-30 19:31:23 -04001111
1112 /* Start out supporting everything. Eventually,
1113 * a controller will attach, and may modify one
1114 * or both of these values */
1115 phydev->supported = phydrv->features;
1116 phydev->advertising = phydrv->features;
1117
1118 /* Set the state to READY by default */
1119 phydev->state = PHY_READY;
1120
1121 if (phydev->drv->probe)
1122 err = phydev->drv->probe(phydev);
1123
Nate Case35b5f6b2008-01-29 10:05:09 -06001124 mutex_unlock(&phydev->lock);
Andy Fleming00db8182005-07-30 19:31:23 -04001125
Andy Fleming00db8182005-07-30 19:31:23 -04001126 return err;
Andy Fleminge8a2b6a2006-12-01 12:01:06 -06001127
Andy Fleming00db8182005-07-30 19:31:23 -04001128}
1129
1130static int phy_remove(struct device *dev)
1131{
1132 struct phy_device *phydev;
1133
1134 phydev = to_phy_device(dev);
1135
Nate Case35b5f6b2008-01-29 10:05:09 -06001136 mutex_lock(&phydev->lock);
Andy Fleming00db8182005-07-30 19:31:23 -04001137 phydev->state = PHY_DOWN;
Nate Case35b5f6b2008-01-29 10:05:09 -06001138 mutex_unlock(&phydev->lock);
Andy Fleming00db8182005-07-30 19:31:23 -04001139
1140 if (phydev->drv->remove)
1141 phydev->drv->remove(phydev);
Andy Fleming00db8182005-07-30 19:31:23 -04001142 phydev->drv = NULL;
1143
1144 return 0;
1145}
1146
Randy Dunlapb3df0da2007-03-06 02:41:48 -08001147/**
1148 * phy_driver_register - register a phy_driver with the PHY layer
1149 * @new_driver: new phy_driver to register
1150 */
Andy Fleming00db8182005-07-30 19:31:23 -04001151int phy_driver_register(struct phy_driver *new_driver)
1152{
1153 int retval;
1154
Andy Fleming00db8182005-07-30 19:31:23 -04001155 new_driver->driver.name = new_driver->name;
1156 new_driver->driver.bus = &mdio_bus_type;
1157 new_driver->driver.probe = phy_probe;
1158 new_driver->driver.remove = phy_remove;
1159
1160 retval = driver_register(&new_driver->driver);
1161
1162 if (retval) {
Joe Perches8d242482012-06-09 07:49:07 +00001163 pr_err("%s: Error %d in registering driver\n",
1164 new_driver->name, retval);
Andy Fleming00db8182005-07-30 19:31:23 -04001165
1166 return retval;
1167 }
1168
Olof Johanssonf2511f12007-11-04 16:09:23 -06001169 pr_debug("%s: Registered new driver\n", new_driver->name);
Andy Fleming00db8182005-07-30 19:31:23 -04001170
1171 return 0;
1172}
1173EXPORT_SYMBOL(phy_driver_register);
1174
Christian Hohnstaedtd5bf9072012-07-04 05:44:34 +00001175int phy_drivers_register(struct phy_driver *new_driver, int n)
1176{
1177 int i, ret = 0;
1178
1179 for (i = 0; i < n; i++) {
1180 ret = phy_driver_register(new_driver + i);
1181 if (ret) {
1182 while (i-- > 0)
1183 phy_driver_unregister(new_driver + i);
1184 break;
1185 }
1186 }
1187 return ret;
1188}
1189EXPORT_SYMBOL(phy_drivers_register);
1190
Andy Fleming00db8182005-07-30 19:31:23 -04001191void phy_driver_unregister(struct phy_driver *drv)
1192{
1193 driver_unregister(&drv->driver);
1194}
1195EXPORT_SYMBOL(phy_driver_unregister);
1196
Christian Hohnstaedtd5bf9072012-07-04 05:44:34 +00001197void phy_drivers_unregister(struct phy_driver *drv, int n)
1198{
1199 int i;
1200 for (i = 0; i < n; i++) {
1201 phy_driver_unregister(drv + i);
1202 }
1203}
1204EXPORT_SYMBOL(phy_drivers_unregister);
1205
Andy Fleminge1393452005-08-24 18:46:21 -05001206static struct phy_driver genphy_driver = {
1207 .phy_id = 0xffffffff,
1208 .phy_id_mask = 0xffffffff,
1209 .name = "Generic PHY",
1210 .config_init = genphy_config_init,
1211 .features = 0,
1212 .config_aneg = genphy_config_aneg,
1213 .read_status = genphy_read_status,
Giuseppe Cavallaro0f0ca342008-11-28 16:24:56 -08001214 .suspend = genphy_suspend,
1215 .resume = genphy_resume,
Florian Fainellie1093742013-12-17 21:38:12 -08001216 .driver = { .owner = THIS_MODULE, },
Andy Fleminge1393452005-08-24 18:46:21 -05001217};
Andy Fleming00db8182005-07-30 19:31:23 -04001218
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001219static int __init phy_init(void)
Andy Fleming00db8182005-07-30 19:31:23 -04001220{
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001221 int rc;
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001222
1223 rc = mdio_bus_init();
1224 if (rc)
Andy Fleminge1393452005-08-24 18:46:21 -05001225 return rc;
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001226
Andy Fleminge1393452005-08-24 18:46:21 -05001227 rc = phy_driver_register(&genphy_driver);
1228 if (rc)
1229 mdio_bus_exit();
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001230
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001231 return rc;
Andy Fleming00db8182005-07-30 19:31:23 -04001232}
1233
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001234static void __exit phy_exit(void)
Andy Fleming00db8182005-07-30 19:31:23 -04001235{
1236 phy_driver_unregister(&genphy_driver);
Andy Fleminge1393452005-08-24 18:46:21 -05001237 mdio_bus_exit();
Andy Fleming00db8182005-07-30 19:31:23 -04001238}
1239
Andy Fleminge1393452005-08-24 18:46:21 -05001240subsys_initcall(phy_init);
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001241module_exit(phy_exit);