blob: 6db36595eac9b52732b5acdc244e36af0877ae53 [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 Slabybc23283c2009-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 Slabybc23283c2009-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 */
367 phy_scan_fixups(phydev);
368
Petr Malatb2a43192013-02-28 01:01:52 +0000369 err = device_add(&phydev->dev);
Grant Likely4dea5472009-04-25 12:52:46 +0000370 if (err) {
Petr Malatb2a43192013-02-28 01:01:52 +0000371 pr_err("PHY %d failed to add\n", phydev->addr);
Grant Likely4dea5472009-04-25 12:52:46 +0000372 goto out;
373 }
374
375 return 0;
376
377 out:
378 phydev->bus->phy_map[phydev->addr] = NULL;
379 return err;
380}
381EXPORT_SYMBOL(phy_device_register);
Andy Fleming00db8182005-07-30 19:31:23 -0400382
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800383/**
Jiri Pirkof8f76db2010-02-04 10:23:02 -0800384 * phy_find_first - finds the first PHY device on the bus
385 * @bus: the target MII bus
386 */
387struct phy_device *phy_find_first(struct mii_bus *bus)
388{
389 int addr;
390
391 for (addr = 0; addr < PHY_MAX_ADDR; addr++) {
392 if (bus->phy_map[addr])
393 return bus->phy_map[addr];
394 }
395 return NULL;
396}
397EXPORT_SYMBOL(phy_find_first);
398
399/**
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800400 * phy_prepare_link - prepares the PHY layer to monitor link status
401 * @phydev: target phy_device struct
402 * @handler: callback function for link status change notifications
Andy Fleming00db8182005-07-30 19:31:23 -0400403 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800404 * Description: Tells the PHY infrastructure to handle the
Andy Fleming00db8182005-07-30 19:31:23 -0400405 * gory details on monitoring link status (whether through
406 * polling or an interrupt), and to call back to the
407 * connected device driver when the link status changes.
408 * If you want to monitor your own link state, don't call
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800409 * this function.
410 */
stephen hemminger89ff05e2010-10-21 08:37:41 +0000411static void phy_prepare_link(struct phy_device *phydev,
Andy Fleming00db8182005-07-30 19:31:23 -0400412 void (*handler)(struct net_device *))
413{
414 phydev->adjust_link = handler;
415}
416
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800417/**
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000418 * phy_connect_direct - connect an ethernet device to a specific phy_device
419 * @dev: the network device to connect
420 * @phydev: the pointer to the phy device
421 * @handler: callback function for state change notifications
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000422 * @interface: PHY device's interface
423 */
424int phy_connect_direct(struct net_device *dev, struct phy_device *phydev,
Florian Fainellif9a8f832013-01-14 00:52:52 +0000425 void (*handler)(struct net_device *),
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000426 phy_interface_t interface)
427{
428 int rc;
429
Florian Fainellif9a8f832013-01-14 00:52:52 +0000430 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface);
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000431 if (rc)
432 return rc;
433
434 phy_prepare_link(phydev, handler);
435 phy_start_machine(phydev, NULL);
436 if (phydev->irq > 0)
437 phy_start_interrupts(phydev);
438
439 return 0;
440}
441EXPORT_SYMBOL(phy_connect_direct);
442
443/**
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800444 * phy_connect - connect an ethernet device to a PHY device
445 * @dev: the network device to connect
Randy Dunlap5d12b132008-04-28 10:58:22 -0700446 * @bus_id: the id string of the PHY device to connect
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800447 * @handler: callback function for state change notifications
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800448 * @interface: PHY device's interface
Andy Fleminge1393452005-08-24 18:46:21 -0500449 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800450 * Description: Convenience function for connecting ethernet
Andy Fleminge1393452005-08-24 18:46:21 -0500451 * devices to PHY devices. The default behavior is for
452 * the PHY infrastructure to handle everything, and only notify
453 * the connected driver when the link status changes. If you
454 * don't want, or can't use the provided functionality, you may
455 * choose to call only the subset of functions which provide
456 * the desired functionality.
457 */
Andy Flemingf62220d2008-04-18 17:29:54 -0500458struct phy_device * phy_connect(struct net_device *dev, const char *bus_id,
Florian Fainellif9a8f832013-01-14 00:52:52 +0000459 void (*handler)(struct net_device *),
Randy Dunlap1a168932007-02-05 10:44:20 -0800460 phy_interface_t interface)
Andy Fleminge1393452005-08-24 18:46:21 -0500461{
462 struct phy_device *phydev;
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000463 struct device *d;
464 int rc;
Andy Fleminge1393452005-08-24 18:46:21 -0500465
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000466 /* Search the list of PHY devices on the mdio bus for the
467 * PHY with the requested name */
468 d = bus_find_device_by_name(&mdio_bus_type, NULL, bus_id);
469 if (!d) {
470 pr_err("PHY %s not found\n", bus_id);
471 return ERR_PTR(-ENODEV);
472 }
473 phydev = to_phy_device(d);
Andy Fleminge1393452005-08-24 18:46:21 -0500474
Florian Fainellif9a8f832013-01-14 00:52:52 +0000475 rc = phy_connect_direct(dev, phydev, handler, interface);
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000476 if (rc)
477 return ERR_PTR(rc);
Andy Fleminge1393452005-08-24 18:46:21 -0500478
479 return phydev;
480}
481EXPORT_SYMBOL(phy_connect);
482
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800483/**
484 * phy_disconnect - disable interrupts, stop state machine, and detach a PHY device
485 * @phydev: target phy_device struct
486 */
Andy Fleminge1393452005-08-24 18:46:21 -0500487void phy_disconnect(struct phy_device *phydev)
488{
489 if (phydev->irq > 0)
490 phy_stop_interrupts(phydev);
491
492 phy_stop_machine(phydev);
493
494 phydev->adjust_link = NULL;
495
496 phy_detach(phydev);
497}
498EXPORT_SYMBOL(phy_disconnect);
499
Anton Vorontsov2f5cb432009-12-30 08:23:30 +0000500int phy_init_hw(struct phy_device *phydev)
501{
502 int ret;
503
504 if (!phydev->drv || !phydev->drv->config_init)
505 return 0;
506
507 ret = phy_scan_fixups(phydev);
508 if (ret < 0)
509 return ret;
510
511 return phydev->drv->config_init(phydev);
512}
513
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800514/**
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000515 * phy_attach_direct - attach a network device to a given PHY device pointer
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800516 * @dev: network device to attach
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000517 * @phydev: Pointer to phy_device to attach
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800518 * @flags: PHY device's dev_flags
519 * @interface: PHY device's interface
520 *
521 * Description: Called by drivers to attach to a particular PHY
522 * device. The phy_device is found, and properly hooked up
523 * to the phy_driver. If no driver is attached, then the
524 * genphy_driver is used. The phy_device is given a ptr to
525 * the attaching device, and given a callback for link status
526 * change. The phy_device is returned to the attaching driver.
527 */
stephen hemminger89ff05e2010-10-21 08:37:41 +0000528static int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
529 u32 flags, phy_interface_t interface)
Andy Fleminge1393452005-08-24 18:46:21 -0500530{
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000531 struct device *d = &phydev->dev;
Marc Kleine-Budded005a092011-03-28 14:54:08 +0000532 int err;
Andy Fleminge1393452005-08-24 18:46:21 -0500533
534 /* Assume that if there is no driver, that it doesn't
535 * exist, and we should use the genphy driver. */
536 if (NULL == d->driver) {
David Daneyac28b9f2012-06-27 07:33:35 +0000537 if (phydev->is_c45) {
538 pr_err("No driver for phy %x\n", phydev->phy_id);
539 return -ENODEV;
540 }
541
Andy Fleminge1393452005-08-24 18:46:21 -0500542 d->driver = &genphy_driver.driver;
543
544 err = d->driver->probe(d);
Jeff Garzikb7a00ec2006-10-01 07:27:46 -0400545 if (err >= 0)
546 err = device_bind_driver(d);
Andy Fleminge1393452005-08-24 18:46:21 -0500547
Jeff Garzikb7a00ec2006-10-01 07:27:46 -0400548 if (err)
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000549 return err;
Andy Fleminge1393452005-08-24 18:46:21 -0500550 }
551
552 if (phydev->attached_dev) {
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000553 dev_err(&dev->dev, "PHY already attached\n");
554 return -EBUSY;
Andy Fleminge1393452005-08-24 18:46:21 -0500555 }
556
557 phydev->attached_dev = dev;
Richard Cochranc1f19b52010-07-17 08:49:36 +0000558 dev->phydev = phydev;
Andy Fleminge1393452005-08-24 18:46:21 -0500559
560 phydev->dev_flags = flags;
561
Andy Fleminge8a2b6a2006-12-01 12:01:06 -0600562 phydev->interface = interface;
563
Anton Vorontsovef24b162010-08-24 14:46:12 -0700564 phydev->state = PHY_READY;
565
Andy Fleminge8a2b6a2006-12-01 12:01:06 -0600566 /* Do initial configuration here, now that
567 * we have certain key parameters
568 * (dev_flags and interface) */
Marc Kleine-Budded005a092011-03-28 14:54:08 +0000569 err = phy_init_hw(phydev);
570 if (err)
571 phy_detach(phydev);
572
573 return err;
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000574}
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000575
576/**
577 * phy_attach - attach a network device to a particular PHY device
578 * @dev: network device to attach
579 * @bus_id: Bus ID of PHY device to attach
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000580 * @interface: PHY device's interface
581 *
582 * Description: Same as phy_attach_direct() except that a PHY bus_id
583 * string is passed instead of a pointer to a struct phy_device.
584 */
585struct phy_device *phy_attach(struct net_device *dev,
Florian Fainellif9a8f832013-01-14 00:52:52 +0000586 const char *bus_id, phy_interface_t interface)
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000587{
588 struct bus_type *bus = &mdio_bus_type;
589 struct phy_device *phydev;
590 struct device *d;
591 int rc;
592
593 /* Search the list of PHY devices on the mdio bus for the
594 * PHY with the requested name */
595 d = bus_find_device_by_name(bus, NULL, bus_id);
596 if (!d) {
597 pr_err("PHY %s not found\n", bus_id);
598 return ERR_PTR(-ENODEV);
599 }
600 phydev = to_phy_device(d);
601
Florian Fainellif9a8f832013-01-14 00:52:52 +0000602 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface);
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000603 if (rc)
604 return ERR_PTR(rc);
605
Andy Fleminge1393452005-08-24 18:46:21 -0500606 return phydev;
607}
608EXPORT_SYMBOL(phy_attach);
609
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800610/**
611 * phy_detach - detach a PHY device from its network device
612 * @phydev: target phy_device struct
613 */
Andy Fleminge1393452005-08-24 18:46:21 -0500614void phy_detach(struct phy_device *phydev)
615{
Richard Cochranc1f19b52010-07-17 08:49:36 +0000616 phydev->attached_dev->phydev = NULL;
Andy Fleminge1393452005-08-24 18:46:21 -0500617 phydev->attached_dev = NULL;
618
619 /* If the device had no specific driver before (i.e. - it
620 * was using the generic driver), we unbind the device
621 * from the generic driver so that there's a chance a
622 * real driver could be loaded */
Greg Kroah-Hartman87aebe02007-04-09 11:52:31 -0400623 if (phydev->dev.driver == &genphy_driver.driver)
Andy Fleminge1393452005-08-24 18:46:21 -0500624 device_release_driver(&phydev->dev);
Andy Fleminge1393452005-08-24 18:46:21 -0500625}
626EXPORT_SYMBOL(phy_detach);
627
628
Andy Fleming00db8182005-07-30 19:31:23 -0400629/* Generic PHY support and helper functions */
630
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800631/**
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300632 * genphy_config_advert - sanitize and advertise auto-negotiation parameters
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800633 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400634 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800635 * Description: Writes MII_ADVERTISE with the appropriate values,
Andy Fleming00db8182005-07-30 19:31:23 -0400636 * after sanitizing the values to make sure we only advertise
Trent Piepho51e2a382008-09-24 10:55:46 +0000637 * what is supported. Returns < 0 on error, 0 if the PHY's advertisement
638 * hasn't changed, and > 0 if it has changed.
Andy Fleming00db8182005-07-30 19:31:23 -0400639 */
stephen hemminger89ff05e2010-10-21 08:37:41 +0000640static int genphy_config_advert(struct phy_device *phydev)
Andy Fleming00db8182005-07-30 19:31:23 -0400641{
642 u32 advertise;
Trent Piepho51e2a382008-09-24 10:55:46 +0000643 int oldadv, adv;
644 int err, changed = 0;
Andy Fleming00db8182005-07-30 19:31:23 -0400645
646 /* Only allow advertising what
647 * this PHY supports */
648 phydev->advertising &= phydev->supported;
649 advertise = phydev->advertising;
650
651 /* Setup standard advertisement */
Trent Piepho51e2a382008-09-24 10:55:46 +0000652 oldadv = adv = phy_read(phydev, MII_ADVERTISE);
Andy Fleming00db8182005-07-30 19:31:23 -0400653
654 if (adv < 0)
655 return adv;
656
Matt Carlson28011cf2011-11-16 18:36:59 -0500657 adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4 | ADVERTISE_PAUSE_CAP |
Andy Fleming00db8182005-07-30 19:31:23 -0400658 ADVERTISE_PAUSE_ASYM);
Matt Carlson37f07022011-11-17 14:30:55 +0000659 adv |= ethtool_adv_to_mii_adv_t(advertise);
Andy Fleming00db8182005-07-30 19:31:23 -0400660
Trent Piepho51e2a382008-09-24 10:55:46 +0000661 if (adv != oldadv) {
662 err = phy_write(phydev, MII_ADVERTISE, adv);
Andy Fleming00db8182005-07-30 19:31:23 -0400663
Trent Piepho51e2a382008-09-24 10:55:46 +0000664 if (err < 0)
665 return err;
666 changed = 1;
667 }
Andy Fleming00db8182005-07-30 19:31:23 -0400668
669 /* Configure gigabit if it's supported */
670 if (phydev->supported & (SUPPORTED_1000baseT_Half |
671 SUPPORTED_1000baseT_Full)) {
Trent Piepho51e2a382008-09-24 10:55:46 +0000672 oldadv = adv = phy_read(phydev, MII_CTRL1000);
Andy Fleming00db8182005-07-30 19:31:23 -0400673
674 if (adv < 0)
675 return adv;
676
677 adv &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
Matt Carlson37f07022011-11-17 14:30:55 +0000678 adv |= ethtool_adv_to_mii_ctrl1000_t(advertise);
Andy Fleming00db8182005-07-30 19:31:23 -0400679
Trent Piepho51e2a382008-09-24 10:55:46 +0000680 if (adv != oldadv) {
681 err = phy_write(phydev, MII_CTRL1000, adv);
682
683 if (err < 0)
684 return err;
685 changed = 1;
686 }
Andy Fleming00db8182005-07-30 19:31:23 -0400687 }
688
Trent Piepho51e2a382008-09-24 10:55:46 +0000689 return changed;
Andy Fleming00db8182005-07-30 19:31:23 -0400690}
Andy Fleming00db8182005-07-30 19:31:23 -0400691
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800692/**
693 * genphy_setup_forced - configures/forces speed/duplex from @phydev
694 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400695 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800696 * Description: Configures MII_BMCR to force speed/duplex
Andy Fleming00db8182005-07-30 19:31:23 -0400697 * to the values in phydev. Assumes that the values are valid.
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800698 * Please see phy_sanitize_settings().
699 */
Madalin Bucur3fb69bc2013-11-20 16:38:19 -0600700int genphy_setup_forced(struct phy_device *phydev)
Andy Fleming00db8182005-07-30 19:31:23 -0400701{
Andy Flemingf62220d2008-04-18 17:29:54 -0500702 int err;
Domen Puncerbc1e0a02007-08-17 08:54:45 +0200703 int ctl = 0;
Andy Fleming00db8182005-07-30 19:31:23 -0400704
705 phydev->pause = phydev->asym_pause = 0;
706
707 if (SPEED_1000 == phydev->speed)
708 ctl |= BMCR_SPEED1000;
709 else if (SPEED_100 == phydev->speed)
710 ctl |= BMCR_SPEED100;
711
712 if (DUPLEX_FULL == phydev->duplex)
713 ctl |= BMCR_FULLDPLX;
714
Andy Flemingf62220d2008-04-18 17:29:54 -0500715 err = phy_write(phydev, MII_BMCR, ctl);
Andy Fleming00db8182005-07-30 19:31:23 -0400716
Andy Flemingf62220d2008-04-18 17:29:54 -0500717 return err;
Andy Fleming00db8182005-07-30 19:31:23 -0400718}
Madalin Bucur3fb69bc2013-11-20 16:38:19 -0600719EXPORT_SYMBOL(genphy_setup_forced);
Andy Fleming00db8182005-07-30 19:31:23 -0400720
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800721/**
722 * genphy_restart_aneg - Enable and Restart Autonegotiation
723 * @phydev: target phy_device struct
724 */
Andy Fleming00db8182005-07-30 19:31:23 -0400725int genphy_restart_aneg(struct phy_device *phydev)
726{
727 int ctl;
728
729 ctl = phy_read(phydev, MII_BMCR);
730
731 if (ctl < 0)
732 return ctl;
733
734 ctl |= (BMCR_ANENABLE | BMCR_ANRESTART);
735
736 /* Don't isolate the PHY if we're negotiating */
737 ctl &= ~(BMCR_ISOLATE);
738
739 ctl = phy_write(phydev, MII_BMCR, ctl);
740
741 return ctl;
742}
Adrian Bunk892871d2008-10-13 18:48:09 -0700743EXPORT_SYMBOL(genphy_restart_aneg);
Andy Fleming00db8182005-07-30 19:31:23 -0400744
745
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800746/**
747 * genphy_config_aneg - restart auto-negotiation or write BMCR
748 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400749 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800750 * Description: If auto-negotiation is enabled, we configure the
Andy Fleming00db8182005-07-30 19:31:23 -0400751 * advertising, and then restart auto-negotiation. If it is not
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800752 * enabled, then we write the BMCR.
Andy Fleming00db8182005-07-30 19:31:23 -0400753 */
754int genphy_config_aneg(struct phy_device *phydev)
755{
Trent Piephode339c22008-11-19 15:52:41 -0800756 int result;
Andy Fleming00db8182005-07-30 19:31:23 -0400757
Trent Piephode339c22008-11-19 15:52:41 -0800758 if (AUTONEG_ENABLE != phydev->autoneg)
759 return genphy_setup_forced(phydev);
Andy Fleming00db8182005-07-30 19:31:23 -0400760
Trent Piephode339c22008-11-19 15:52:41 -0800761 result = genphy_config_advert(phydev);
Andy Fleming00db8182005-07-30 19:31:23 -0400762
Trent Piephode339c22008-11-19 15:52:41 -0800763 if (result < 0) /* error */
764 return result;
765
766 if (result == 0) {
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300767 /* Advertisement hasn't changed, but maybe aneg was never on to
Trent Piephode339c22008-11-19 15:52:41 -0800768 * begin with? Or maybe phy was isolated? */
769 int ctl = phy_read(phydev, MII_BMCR);
770
771 if (ctl < 0)
772 return ctl;
773
774 if (!(ctl & BMCR_ANENABLE) || (ctl & BMCR_ISOLATE))
775 result = 1; /* do restart aneg */
776 }
777
778 /* Only restart aneg if we are advertising something different
779 * than we were before. */
780 if (result > 0)
781 result = genphy_restart_aneg(phydev);
Andy Fleming00db8182005-07-30 19:31:23 -0400782
Trent Piepho51e2a382008-09-24 10:55:46 +0000783 return result;
Andy Fleming00db8182005-07-30 19:31:23 -0400784}
785EXPORT_SYMBOL(genphy_config_aneg);
786
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800787/**
788 * genphy_update_link - update link status in @phydev
789 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400790 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800791 * Description: Update the value in phydev->link to reflect the
Andy Fleming00db8182005-07-30 19:31:23 -0400792 * current link value. In order to do this, we need to read
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800793 * the status register twice, keeping the second value.
Andy Fleming00db8182005-07-30 19:31:23 -0400794 */
795int genphy_update_link(struct phy_device *phydev)
796{
797 int status;
798
799 /* Do a fake read */
800 status = phy_read(phydev, MII_BMSR);
801
802 if (status < 0)
803 return status;
804
805 /* Read link and autonegotiation status */
806 status = phy_read(phydev, MII_BMSR);
807
808 if (status < 0)
809 return status;
810
811 if ((status & BMSR_LSTATUS) == 0)
812 phydev->link = 0;
813 else
814 phydev->link = 1;
815
816 return 0;
817}
Andy Fleming6b655522006-10-16 16:19:17 -0500818EXPORT_SYMBOL(genphy_update_link);
Andy Fleming00db8182005-07-30 19:31:23 -0400819
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800820/**
821 * genphy_read_status - check the link status and update current link state
822 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400823 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800824 * Description: Check the link, then figure out the current state
Andy Fleming00db8182005-07-30 19:31:23 -0400825 * by comparing what we advertise with what the link partner
826 * advertises. Start by checking the gigabit possibilities,
827 * then move on to 10/100.
828 */
829int genphy_read_status(struct phy_device *phydev)
830{
831 int adv;
832 int err;
833 int lpa;
834 int lpagb = 0;
835
836 /* Update the link, but return if there
837 * was an error */
838 err = genphy_update_link(phydev);
839 if (err)
840 return err;
841
Florian Fainelli114002b2013-12-06 13:01:30 -0800842 phydev->lp_advertising = 0;
843
Andy Fleming00db8182005-07-30 19:31:23 -0400844 if (AUTONEG_ENABLE == phydev->autoneg) {
845 if (phydev->supported & (SUPPORTED_1000baseT_Half
846 | SUPPORTED_1000baseT_Full)) {
847 lpagb = phy_read(phydev, MII_STAT1000);
848
849 if (lpagb < 0)
850 return lpagb;
851
852 adv = phy_read(phydev, MII_CTRL1000);
853
854 if (adv < 0)
855 return adv;
856
Florian Fainelli114002b2013-12-06 13:01:30 -0800857 phydev->lp_advertising =
858 mii_stat1000_to_ethtool_lpa_t(lpagb);
Andy Fleming00db8182005-07-30 19:31:23 -0400859 lpagb &= adv << 2;
860 }
861
862 lpa = phy_read(phydev, MII_LPA);
863
864 if (lpa < 0)
865 return lpa;
866
Florian Fainelli114002b2013-12-06 13:01:30 -0800867 phydev->lp_advertising |= mii_lpa_to_ethtool_lpa_t(lpa);
868
Andy Fleming00db8182005-07-30 19:31:23 -0400869 adv = phy_read(phydev, MII_ADVERTISE);
870
871 if (adv < 0)
872 return adv;
873
874 lpa &= adv;
875
876 phydev->speed = SPEED_10;
877 phydev->duplex = DUPLEX_HALF;
878 phydev->pause = phydev->asym_pause = 0;
879
880 if (lpagb & (LPA_1000FULL | LPA_1000HALF)) {
881 phydev->speed = SPEED_1000;
882
883 if (lpagb & LPA_1000FULL)
884 phydev->duplex = DUPLEX_FULL;
885 } else if (lpa & (LPA_100FULL | LPA_100HALF)) {
886 phydev->speed = SPEED_100;
887
888 if (lpa & LPA_100FULL)
889 phydev->duplex = DUPLEX_FULL;
890 } else
891 if (lpa & LPA_10FULL)
892 phydev->duplex = DUPLEX_FULL;
893
894 if (phydev->duplex == DUPLEX_FULL){
895 phydev->pause = lpa & LPA_PAUSE_CAP ? 1 : 0;
896 phydev->asym_pause = lpa & LPA_PAUSE_ASYM ? 1 : 0;
897 }
898 } else {
899 int bmcr = phy_read(phydev, MII_BMCR);
900 if (bmcr < 0)
901 return bmcr;
902
903 if (bmcr & BMCR_FULLDPLX)
904 phydev->duplex = DUPLEX_FULL;
905 else
906 phydev->duplex = DUPLEX_HALF;
907
908 if (bmcr & BMCR_SPEED1000)
909 phydev->speed = SPEED_1000;
910 else if (bmcr & BMCR_SPEED100)
911 phydev->speed = SPEED_100;
912 else
913 phydev->speed = SPEED_10;
914
915 phydev->pause = phydev->asym_pause = 0;
916 }
917
918 return 0;
919}
920EXPORT_SYMBOL(genphy_read_status);
921
922static int genphy_config_init(struct phy_device *phydev)
923{
Eric Sesterhenn84c22d72006-09-25 16:39:22 -0700924 int val;
Andy Fleming00db8182005-07-30 19:31:23 -0400925 u32 features;
926
927 /* For now, I'll claim that the generic driver supports
928 * all possible port types */
929 features = (SUPPORTED_TP | SUPPORTED_MII
930 | SUPPORTED_AUI | SUPPORTED_FIBRE |
931 SUPPORTED_BNC);
932
933 /* Do we support autonegotiation? */
934 val = phy_read(phydev, MII_BMSR);
935
936 if (val < 0)
937 return val;
938
939 if (val & BMSR_ANEGCAPABLE)
940 features |= SUPPORTED_Autoneg;
941
942 if (val & BMSR_100FULL)
943 features |= SUPPORTED_100baseT_Full;
944 if (val & BMSR_100HALF)
945 features |= SUPPORTED_100baseT_Half;
946 if (val & BMSR_10FULL)
947 features |= SUPPORTED_10baseT_Full;
948 if (val & BMSR_10HALF)
949 features |= SUPPORTED_10baseT_Half;
950
951 if (val & BMSR_ESTATEN) {
952 val = phy_read(phydev, MII_ESTATUS);
953
954 if (val < 0)
955 return val;
956
957 if (val & ESTATUS_1000_TFULL)
958 features |= SUPPORTED_1000baseT_Full;
959 if (val & ESTATUS_1000_THALF)
960 features |= SUPPORTED_1000baseT_Half;
961 }
962
963 phydev->supported = features;
964 phydev->advertising = features;
965
966 return 0;
967}
Giuseppe Cavallaro0f0ca342008-11-28 16:24:56 -0800968int genphy_suspend(struct phy_device *phydev)
969{
970 int value;
Andy Fleming00db8182005-07-30 19:31:23 -0400971
Giuseppe Cavallaro0f0ca342008-11-28 16:24:56 -0800972 mutex_lock(&phydev->lock);
973
974 value = phy_read(phydev, MII_BMCR);
975 phy_write(phydev, MII_BMCR, (value | BMCR_PDOWN));
976
977 mutex_unlock(&phydev->lock);
978
979 return 0;
980}
981EXPORT_SYMBOL(genphy_suspend);
982
983int genphy_resume(struct phy_device *phydev)
984{
985 int value;
986
987 mutex_lock(&phydev->lock);
988
989 value = phy_read(phydev, MII_BMCR);
990 phy_write(phydev, MII_BMCR, (value & ~BMCR_PDOWN));
991
992 mutex_unlock(&phydev->lock);
993
994 return 0;
995}
996EXPORT_SYMBOL(genphy_resume);
Andy Fleming00db8182005-07-30 19:31:23 -0400997
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800998/**
999 * phy_probe - probe and init a PHY device
1000 * @dev: device to probe and init
Andy Fleming00db8182005-07-30 19:31:23 -04001001 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -08001002 * Description: Take care of setting up the phy_device structure,
Andy Fleming00db8182005-07-30 19:31:23 -04001003 * set the state to READY (the driver's init function should
1004 * set it to STARTING if needed).
1005 */
1006static int phy_probe(struct device *dev)
1007{
1008 struct phy_device *phydev;
1009 struct phy_driver *phydrv;
1010 struct device_driver *drv;
1011 int err = 0;
1012
1013 phydev = to_phy_device(dev);
1014
Alan Sternf3ff9242012-01-24 13:35:24 -05001015 drv = phydev->dev.driver;
Andy Fleming00db8182005-07-30 19:31:23 -04001016 phydrv = to_phy_driver(drv);
1017 phydev->drv = phydrv;
1018
Florian Fainelli2c7b4922013-05-19 22:53:42 +00001019 /* Disable the interrupt if the PHY doesn't support it
1020 * but the interrupt is still a valid one
1021 */
1022 if (!(phydrv->flags & PHY_HAS_INTERRUPT) &&
1023 phy_interrupt_is_valid(phydev))
Andy Fleming00db8182005-07-30 19:31:23 -04001024 phydev->irq = PHY_POLL;
1025
Florian Fainelli4284b6a2013-05-23 01:11:12 +00001026 if (phydrv->flags & PHY_IS_INTERNAL)
1027 phydev->is_internal = true;
1028
Nate Case35b5f6b2008-01-29 10:05:09 -06001029 mutex_lock(&phydev->lock);
Andy Fleming00db8182005-07-30 19:31:23 -04001030
1031 /* Start out supporting everything. Eventually,
1032 * a controller will attach, and may modify one
1033 * or both of these values */
1034 phydev->supported = phydrv->features;
1035 phydev->advertising = phydrv->features;
1036
1037 /* Set the state to READY by default */
1038 phydev->state = PHY_READY;
1039
1040 if (phydev->drv->probe)
1041 err = phydev->drv->probe(phydev);
1042
Nate Case35b5f6b2008-01-29 10:05:09 -06001043 mutex_unlock(&phydev->lock);
Andy Fleming00db8182005-07-30 19:31:23 -04001044
Andy Fleming00db8182005-07-30 19:31:23 -04001045 return err;
Andy Fleminge8a2b6a2006-12-01 12:01:06 -06001046
Andy Fleming00db8182005-07-30 19:31:23 -04001047}
1048
1049static int phy_remove(struct device *dev)
1050{
1051 struct phy_device *phydev;
1052
1053 phydev = to_phy_device(dev);
1054
Nate Case35b5f6b2008-01-29 10:05:09 -06001055 mutex_lock(&phydev->lock);
Andy Fleming00db8182005-07-30 19:31:23 -04001056 phydev->state = PHY_DOWN;
Nate Case35b5f6b2008-01-29 10:05:09 -06001057 mutex_unlock(&phydev->lock);
Andy Fleming00db8182005-07-30 19:31:23 -04001058
1059 if (phydev->drv->remove)
1060 phydev->drv->remove(phydev);
Andy Fleming00db8182005-07-30 19:31:23 -04001061 phydev->drv = NULL;
1062
1063 return 0;
1064}
1065
Randy Dunlapb3df0da2007-03-06 02:41:48 -08001066/**
1067 * phy_driver_register - register a phy_driver with the PHY layer
1068 * @new_driver: new phy_driver to register
1069 */
Andy Fleming00db8182005-07-30 19:31:23 -04001070int phy_driver_register(struct phy_driver *new_driver)
1071{
1072 int retval;
1073
Andy Fleming00db8182005-07-30 19:31:23 -04001074 new_driver->driver.name = new_driver->name;
1075 new_driver->driver.bus = &mdio_bus_type;
1076 new_driver->driver.probe = phy_probe;
1077 new_driver->driver.remove = phy_remove;
1078
1079 retval = driver_register(&new_driver->driver);
1080
1081 if (retval) {
Joe Perches8d242482012-06-09 07:49:07 +00001082 pr_err("%s: Error %d in registering driver\n",
1083 new_driver->name, retval);
Andy Fleming00db8182005-07-30 19:31:23 -04001084
1085 return retval;
1086 }
1087
Olof Johanssonf2511f12007-11-04 16:09:23 -06001088 pr_debug("%s: Registered new driver\n", new_driver->name);
Andy Fleming00db8182005-07-30 19:31:23 -04001089
1090 return 0;
1091}
1092EXPORT_SYMBOL(phy_driver_register);
1093
Christian Hohnstaedtd5bf9072012-07-04 05:44:34 +00001094int phy_drivers_register(struct phy_driver *new_driver, int n)
1095{
1096 int i, ret = 0;
1097
1098 for (i = 0; i < n; i++) {
1099 ret = phy_driver_register(new_driver + i);
1100 if (ret) {
1101 while (i-- > 0)
1102 phy_driver_unregister(new_driver + i);
1103 break;
1104 }
1105 }
1106 return ret;
1107}
1108EXPORT_SYMBOL(phy_drivers_register);
1109
Andy Fleming00db8182005-07-30 19:31:23 -04001110void phy_driver_unregister(struct phy_driver *drv)
1111{
1112 driver_unregister(&drv->driver);
1113}
1114EXPORT_SYMBOL(phy_driver_unregister);
1115
Christian Hohnstaedtd5bf9072012-07-04 05:44:34 +00001116void phy_drivers_unregister(struct phy_driver *drv, int n)
1117{
1118 int i;
1119 for (i = 0; i < n; i++) {
1120 phy_driver_unregister(drv + i);
1121 }
1122}
1123EXPORT_SYMBOL(phy_drivers_unregister);
1124
Andy Fleminge1393452005-08-24 18:46:21 -05001125static struct phy_driver genphy_driver = {
1126 .phy_id = 0xffffffff,
1127 .phy_id_mask = 0xffffffff,
1128 .name = "Generic PHY",
1129 .config_init = genphy_config_init,
1130 .features = 0,
1131 .config_aneg = genphy_config_aneg,
1132 .read_status = genphy_read_status,
Giuseppe Cavallaro0f0ca342008-11-28 16:24:56 -08001133 .suspend = genphy_suspend,
1134 .resume = genphy_resume,
Andy Fleminge1393452005-08-24 18:46:21 -05001135 .driver = {.owner= THIS_MODULE, },
1136};
Andy Fleming00db8182005-07-30 19:31:23 -04001137
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001138static int __init phy_init(void)
Andy Fleming00db8182005-07-30 19:31:23 -04001139{
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001140 int rc;
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001141
1142 rc = mdio_bus_init();
1143 if (rc)
Andy Fleminge1393452005-08-24 18:46:21 -05001144 return rc;
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001145
Andy Fleminge1393452005-08-24 18:46:21 -05001146 rc = phy_driver_register(&genphy_driver);
1147 if (rc)
1148 mdio_bus_exit();
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001149
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001150 return rc;
Andy Fleming00db8182005-07-30 19:31:23 -04001151}
1152
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001153static void __exit phy_exit(void)
Andy Fleming00db8182005-07-30 19:31:23 -04001154{
1155 phy_driver_unregister(&genphy_driver);
Andy Fleminge1393452005-08-24 18:46:21 -05001156 mdio_bus_exit();
Andy Fleming00db8182005-07-30 19:31:23 -04001157}
1158
Andy Fleminge1393452005-08-24 18:46:21 -05001159subsys_initcall(phy_init);
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001160module_exit(phy_exit);