blob: 9930f999956172fa20ad5e5a34d3db5297fe9c12 [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{
47 kfree(phydev);
48}
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{
53 phy_device_free(to_phy_device(dev));
54}
55
Grant Likely4dea5472009-04-25 12:52:46 +000056static struct phy_driver genphy_driver;
57extern int mdio_bus_init(void);
58extern void mdio_bus_exit(void);
59
Andy Flemingf62220d2008-04-18 17:29:54 -050060static LIST_HEAD(phy_fixup_list);
61static DEFINE_MUTEX(phy_fixup_lock);
62
stephen hemminger89ff05e2010-10-21 08:37:41 +000063static int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
64 u32 flags, phy_interface_t interface);
65
Andy Flemingf62220d2008-04-18 17:29:54 -050066/*
67 * Creates a new phy_fixup and adds it to the list
68 * @bus_id: A string which matches phydev->dev.bus_id (or PHY_ANY_ID)
69 * @phy_uid: Used to match against phydev->phy_id (the UID of the PHY)
70 * It can also be PHY_ANY_UID
71 * @phy_uid_mask: Applied to phydev->phy_id and fixup->phy_uid before
72 * comparison
73 * @run: The actual code to be run when a matching PHY is found
74 */
75int phy_register_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask,
76 int (*run)(struct phy_device *))
77{
78 struct phy_fixup *fixup;
79
80 fixup = kzalloc(sizeof(struct phy_fixup), GFP_KERNEL);
81 if (!fixup)
82 return -ENOMEM;
83
Kay Sieversfb28ad352008-11-10 13:55:14 -080084 strlcpy(fixup->bus_id, bus_id, sizeof(fixup->bus_id));
Andy Flemingf62220d2008-04-18 17:29:54 -050085 fixup->phy_uid = phy_uid;
86 fixup->phy_uid_mask = phy_uid_mask;
87 fixup->run = run;
88
89 mutex_lock(&phy_fixup_lock);
90 list_add_tail(&fixup->list, &phy_fixup_list);
91 mutex_unlock(&phy_fixup_lock);
92
93 return 0;
94}
95EXPORT_SYMBOL(phy_register_fixup);
96
97/* Registers a fixup to be run on any PHY with the UID in phy_uid */
98int phy_register_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask,
99 int (*run)(struct phy_device *))
100{
101 return phy_register_fixup(PHY_ANY_ID, phy_uid, phy_uid_mask, run);
102}
103EXPORT_SYMBOL(phy_register_fixup_for_uid);
104
105/* Registers a fixup to be run on the PHY with id string bus_id */
106int phy_register_fixup_for_id(const char *bus_id,
107 int (*run)(struct phy_device *))
108{
109 return phy_register_fixup(bus_id, PHY_ANY_UID, 0xffffffff, run);
110}
111EXPORT_SYMBOL(phy_register_fixup_for_id);
112
113/*
114 * Returns 1 if fixup matches phydev in bus_id and phy_uid.
115 * Fixups can be set to match any in one or more fields.
116 */
117static int phy_needs_fixup(struct phy_device *phydev, struct phy_fixup *fixup)
118{
Kay Sieversfb28ad352008-11-10 13:55:14 -0800119 if (strcmp(fixup->bus_id, dev_name(&phydev->dev)) != 0)
Andy Flemingf62220d2008-04-18 17:29:54 -0500120 if (strcmp(fixup->bus_id, PHY_ANY_ID) != 0)
121 return 0;
122
123 if ((fixup->phy_uid & fixup->phy_uid_mask) !=
124 (phydev->phy_id & fixup->phy_uid_mask))
125 if (fixup->phy_uid != PHY_ANY_UID)
126 return 0;
127
128 return 1;
129}
130
131/* Runs any matching fixups for this phydev */
132int phy_scan_fixups(struct phy_device *phydev)
133{
134 struct phy_fixup *fixup;
135
136 mutex_lock(&phy_fixup_lock);
137 list_for_each_entry(fixup, &phy_fixup_list, list) {
138 if (phy_needs_fixup(phydev, fixup)) {
139 int err;
140
141 err = fixup->run(phydev);
142
Jiri Slabybc232832009-07-13 11:23:39 +0000143 if (err < 0) {
144 mutex_unlock(&phy_fixup_lock);
Andy Flemingf62220d2008-04-18 17:29:54 -0500145 return err;
Jiri Slabybc232832009-07-13 11:23:39 +0000146 }
Andy Flemingf62220d2008-04-18 17:29:54 -0500147 }
148 }
149 mutex_unlock(&phy_fixup_lock);
150
151 return 0;
152}
153EXPORT_SYMBOL(phy_scan_fixups);
154
David Daneyac28b9f2012-06-27 07:33:35 +0000155struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id,
156 bool is_c45, struct phy_c45_device_ids *c45_ids)
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700157{
158 struct phy_device *dev;
David Woodhouse8626d3b2010-04-02 01:05:27 +0000159
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700160 /* We allocate the device, and initialize the
161 * default values */
Robert P. J. Daycd861282006-12-13 00:34:52 -0800162 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700163
164 if (NULL == dev)
165 return (struct phy_device*) PTR_ERR((void*)-ENOMEM);
166
Anton Vorontsov6f4a7f42007-12-04 16:17:33 +0300167 dev->dev.release = phy_device_release;
168
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700169 dev->speed = 0;
170 dev->duplex = -1;
171 dev->pause = dev->asym_pause = 0;
172 dev->link = 1;
Andy Fleminge8a2b6a2006-12-01 12:01:06 -0600173 dev->interface = PHY_INTERFACE_MODE_GMII;
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700174
175 dev->autoneg = AUTONEG_ENABLE;
176
David Daneyac28b9f2012-06-27 07:33:35 +0000177 dev->is_c45 = is_c45;
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700178 dev->addr = addr;
179 dev->phy_id = phy_id;
David Daneyac28b9f2012-06-27 07:33:35 +0000180 if (c45_ids)
181 dev->c45_ids = *c45_ids;
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700182 dev->bus = bus;
Grant Likely4dea5472009-04-25 12:52:46 +0000183 dev->dev.parent = bus->parent;
184 dev->dev.bus = &mdio_bus_type;
185 dev->irq = bus->irq != NULL ? bus->irq[addr] : PHY_POLL;
186 dev_set_name(&dev->dev, PHY_ID_FMT, bus->id, addr);
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700187
188 dev->state = PHY_DOWN;
189
Nate Case35b5f6b2008-01-29 10:05:09 -0600190 mutex_init(&dev->lock);
Anton Vorontsov4f9c85a2010-01-18 05:37:16 +0000191 INIT_DELAYED_WORK(&dev->state_queue, phy_state_machine);
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700192
David Woodhouse8626d3b2010-04-02 01:05:27 +0000193 /* Request the appropriate module unconditionally; don't
194 bother trying to do so only if it isn't already loaded,
195 because that gets complicated. A hotplug event would have
196 done an unconditional modprobe anyway.
197 We don't do normal hotplug because it won't work for MDIO
198 -- because it relies on the device staying around for long
199 enough for the driver to get loaded. With MDIO, the NIC
200 driver will get bored and give up as soon as it finds that
201 there's no driver _already_ loaded. */
202 request_module(MDIO_MODULE_PREFIX MDIO_ID_FMT, MDIO_ID_ARGS(phy_id));
203
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700204 return dev;
205}
David Daneyac28b9f2012-06-27 07:33:35 +0000206EXPORT_SYMBOL(phy_device_create);
207
208/**
209 * get_phy_c45_ids - reads the specified addr for its 802.3-c45 IDs.
210 * @bus: the target MII bus
211 * @addr: PHY address on the MII bus
212 * @phy_id: where to store the ID retrieved.
213 * @c45_ids: where to store the c45 ID information.
214 *
215 * If the PHY devices-in-package appears to be valid, it and the
216 * corresponding identifiers are stored in @c45_ids, zero is stored
217 * in @phy_id. Otherwise 0xffffffff is stored in @phy_id. Returns
218 * zero on success.
219 *
220 */
221static int get_phy_c45_ids(struct mii_bus *bus, int addr, u32 *phy_id,
222 struct phy_c45_device_ids *c45_ids) {
223 int phy_reg;
224 int i, reg_addr;
225 const int num_ids = ARRAY_SIZE(c45_ids->device_ids);
226
227 /* Find first non-zero Devices In package. Device
228 * zero is reserved, so don't probe it.
229 */
230 for (i = 1;
231 i < num_ids && c45_ids->devices_in_package == 0;
232 i++) {
233 reg_addr = MII_ADDR_C45 | i << 16 | 6;
234 phy_reg = mdiobus_read(bus, addr, reg_addr);
235 if (phy_reg < 0)
236 return -EIO;
237 c45_ids->devices_in_package = (phy_reg & 0xffff) << 16;
238
239 reg_addr = MII_ADDR_C45 | i << 16 | 5;
240 phy_reg = mdiobus_read(bus, addr, reg_addr);
241 if (phy_reg < 0)
242 return -EIO;
243 c45_ids->devices_in_package |= (phy_reg & 0xffff);
244
245 /* If mostly Fs, there is no device there,
246 * let's get out of here.
247 */
248 if ((c45_ids->devices_in_package & 0x1fffffff) == 0x1fffffff) {
249 *phy_id = 0xffffffff;
250 return 0;
251 }
252 }
253
254 /* Now probe Device Identifiers for each device present. */
255 for (i = 1; i < num_ids; i++) {
256 if (!(c45_ids->devices_in_package & (1 << i)))
257 continue;
258
259 reg_addr = MII_ADDR_C45 | i << 16 | MII_PHYSID1;
260 phy_reg = mdiobus_read(bus, addr, reg_addr);
261 if (phy_reg < 0)
262 return -EIO;
263 c45_ids->device_ids[i] = (phy_reg & 0xffff) << 16;
264
265 reg_addr = MII_ADDR_C45 | i << 16 | MII_PHYSID2;
266 phy_reg = mdiobus_read(bus, addr, reg_addr);
267 if (phy_reg < 0)
268 return -EIO;
269 c45_ids->device_ids[i] |= (phy_reg & 0xffff);
270 }
271 *phy_id = 0;
272 return 0;
273}
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700274
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800275/**
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400276 * get_phy_id - reads the specified addr for its ID.
277 * @bus: the target MII bus
278 * @addr: PHY address on the MII bus
279 * @phy_id: where to store the ID retrieved.
David Daneyac28b9f2012-06-27 07:33:35 +0000280 * @is_c45: If true the PHY uses the 802.3 clause 45 protocol
281 * @c45_ids: where to store the c45 ID information.
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400282 *
David Daneyac28b9f2012-06-27 07:33:35 +0000283 * Description: In the case of a 802.3-c22 PHY, reads the ID registers
284 * of the PHY at @addr on the @bus, stores it in @phy_id and returns
285 * zero on success.
286 *
287 * In the case of a 802.3-c45 PHY, get_phy_c45_ids() is invoked, and
288 * its return value is in turn returned.
289 *
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400290 */
David Daneyac28b9f2012-06-27 07:33:35 +0000291static int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id,
292 bool is_c45, struct phy_c45_device_ids *c45_ids)
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400293{
294 int phy_reg;
295
David Daneyac28b9f2012-06-27 07:33:35 +0000296 if (is_c45)
297 return get_phy_c45_ids(bus, addr, phy_id, c45_ids);
298
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400299 /* Grab the bits from PHYIR1, and put them
300 * in the upper half */
David Daney6fe32642011-09-30 11:51:22 +0000301 phy_reg = mdiobus_read(bus, addr, MII_PHYSID1);
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400302
303 if (phy_reg < 0)
304 return -EIO;
305
306 *phy_id = (phy_reg & 0xffff) << 16;
307
308 /* Grab the bits from PHYIR2, and put them in the lower half */
David Daney6fe32642011-09-30 11:51:22 +0000309 phy_reg = mdiobus_read(bus, addr, MII_PHYSID2);
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400310
311 if (phy_reg < 0)
312 return -EIO;
313
314 *phy_id |= (phy_reg & 0xffff);
315
316 return 0;
317}
318
319/**
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800320 * get_phy_device - reads the specified PHY device and returns its @phy_device struct
321 * @bus: the target MII bus
322 * @addr: PHY address on the MII bus
David Daneyac28b9f2012-06-27 07:33:35 +0000323 * @is_c45: If true the PHY uses the 802.3 clause 45 protocol
Andy Fleming00db8182005-07-30 19:31:23 -0400324 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800325 * Description: Reads the ID registers of the PHY at @addr on the
326 * @bus, then allocates and returns the phy_device to represent it.
Andy Fleming00db8182005-07-30 19:31:23 -0400327 */
David Daneyac28b9f2012-06-27 07:33:35 +0000328struct phy_device *get_phy_device(struct mii_bus *bus, int addr, bool is_c45)
Andy Fleming00db8182005-07-30 19:31:23 -0400329{
David Daneyac28b9f2012-06-27 07:33:35 +0000330 struct phy_c45_device_ids c45_ids = {0};
David S. Miller160c85f2012-06-27 21:28:14 -0700331 struct phy_device *dev = NULL;
332 u32 phy_id = 0;
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400333 int r;
Andy Fleming00db8182005-07-30 19:31:23 -0400334
David Daneyac28b9f2012-06-27 07:33:35 +0000335 r = get_phy_id(bus, addr, &phy_id, is_c45, &c45_ids);
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400336 if (r)
337 return ERR_PTR(r);
Andy Fleming00db8182005-07-30 19:31:23 -0400338
Giuseppe Cavallaro6436cbc2008-11-20 20:43:18 -0800339 /* If the phy_id is mostly Fs, there is no device there */
340 if ((phy_id & 0x1fffffff) == 0x1fffffff)
341 return NULL;
342
David Daneyac28b9f2012-06-27 07:33:35 +0000343 dev = phy_device_create(bus, addr, phy_id, is_c45, &c45_ids);
Andy Fleming00db8182005-07-30 19:31:23 -0400344
345 return dev;
346}
Grant Likely4dea5472009-04-25 12:52:46 +0000347EXPORT_SYMBOL(get_phy_device);
348
349/**
350 * phy_device_register - Register the phy device on the MDIO bus
Randy Dunlap1d4ac5d2009-06-16 16:56:33 +0000351 * @phydev: phy_device structure to be added to the MDIO bus
Grant Likely4dea5472009-04-25 12:52:46 +0000352 */
353int phy_device_register(struct phy_device *phydev)
354{
355 int err;
356
357 /* Don't register a phy if one is already registered at this
358 * address */
359 if (phydev->bus->phy_map[phydev->addr])
360 return -EINVAL;
361 phydev->bus->phy_map[phydev->addr] = phydev;
362
363 /* Run all of the fixups for this PHY */
364 phy_scan_fixups(phydev);
365
366 err = device_register(&phydev->dev);
367 if (err) {
368 pr_err("phy %d failed to register\n", phydev->addr);
369 goto out;
370 }
371
372 return 0;
373
374 out:
375 phydev->bus->phy_map[phydev->addr] = NULL;
376 return err;
377}
378EXPORT_SYMBOL(phy_device_register);
Andy Fleming00db8182005-07-30 19:31:23 -0400379
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800380/**
Jiri Pirkof8f76db2010-02-04 10:23:02 -0800381 * phy_find_first - finds the first PHY device on the bus
382 * @bus: the target MII bus
383 */
384struct phy_device *phy_find_first(struct mii_bus *bus)
385{
386 int addr;
387
388 for (addr = 0; addr < PHY_MAX_ADDR; addr++) {
389 if (bus->phy_map[addr])
390 return bus->phy_map[addr];
391 }
392 return NULL;
393}
394EXPORT_SYMBOL(phy_find_first);
395
396/**
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800397 * phy_prepare_link - prepares the PHY layer to monitor link status
398 * @phydev: target phy_device struct
399 * @handler: callback function for link status change notifications
Andy Fleming00db8182005-07-30 19:31:23 -0400400 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800401 * Description: Tells the PHY infrastructure to handle the
Andy Fleming00db8182005-07-30 19:31:23 -0400402 * gory details on monitoring link status (whether through
403 * polling or an interrupt), and to call back to the
404 * connected device driver when the link status changes.
405 * If you want to monitor your own link state, don't call
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800406 * this function.
407 */
stephen hemminger89ff05e2010-10-21 08:37:41 +0000408static void phy_prepare_link(struct phy_device *phydev,
Andy Fleming00db8182005-07-30 19:31:23 -0400409 void (*handler)(struct net_device *))
410{
411 phydev->adjust_link = handler;
412}
413
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800414/**
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000415 * phy_connect_direct - connect an ethernet device to a specific phy_device
416 * @dev: the network device to connect
417 * @phydev: the pointer to the phy device
418 * @handler: callback function for state change notifications
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000419 * @interface: PHY device's interface
420 */
421int phy_connect_direct(struct net_device *dev, struct phy_device *phydev,
Florian Fainellif9a8f832013-01-14 00:52:52 +0000422 void (*handler)(struct net_device *),
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000423 phy_interface_t interface)
424{
425 int rc;
426
Florian Fainellif9a8f832013-01-14 00:52:52 +0000427 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface);
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000428 if (rc)
429 return rc;
430
431 phy_prepare_link(phydev, handler);
432 phy_start_machine(phydev, NULL);
433 if (phydev->irq > 0)
434 phy_start_interrupts(phydev);
435
436 return 0;
437}
438EXPORT_SYMBOL(phy_connect_direct);
439
440/**
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800441 * phy_connect - connect an ethernet device to a PHY device
442 * @dev: the network device to connect
Randy Dunlap5d12b132008-04-28 10:58:22 -0700443 * @bus_id: the id string of the PHY device to connect
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800444 * @handler: callback function for state change notifications
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800445 * @interface: PHY device's interface
Andy Fleminge1393452005-08-24 18:46:21 -0500446 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800447 * Description: Convenience function for connecting ethernet
Andy Fleminge1393452005-08-24 18:46:21 -0500448 * devices to PHY devices. The default behavior is for
449 * the PHY infrastructure to handle everything, and only notify
450 * the connected driver when the link status changes. If you
451 * don't want, or can't use the provided functionality, you may
452 * choose to call only the subset of functions which provide
453 * the desired functionality.
454 */
Andy Flemingf62220d2008-04-18 17:29:54 -0500455struct phy_device * phy_connect(struct net_device *dev, const char *bus_id,
Florian Fainellif9a8f832013-01-14 00:52:52 +0000456 void (*handler)(struct net_device *),
Randy Dunlap1a168932007-02-05 10:44:20 -0800457 phy_interface_t interface)
Andy Fleminge1393452005-08-24 18:46:21 -0500458{
459 struct phy_device *phydev;
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000460 struct device *d;
461 int rc;
Andy Fleminge1393452005-08-24 18:46:21 -0500462
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000463 /* Search the list of PHY devices on the mdio bus for the
464 * PHY with the requested name */
465 d = bus_find_device_by_name(&mdio_bus_type, NULL, bus_id);
466 if (!d) {
467 pr_err("PHY %s not found\n", bus_id);
468 return ERR_PTR(-ENODEV);
469 }
470 phydev = to_phy_device(d);
Andy Fleminge1393452005-08-24 18:46:21 -0500471
Florian Fainellif9a8f832013-01-14 00:52:52 +0000472 rc = phy_connect_direct(dev, phydev, handler, interface);
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000473 if (rc)
474 return ERR_PTR(rc);
Andy Fleminge1393452005-08-24 18:46:21 -0500475
476 return phydev;
477}
478EXPORT_SYMBOL(phy_connect);
479
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800480/**
481 * phy_disconnect - disable interrupts, stop state machine, and detach a PHY device
482 * @phydev: target phy_device struct
483 */
Andy Fleminge1393452005-08-24 18:46:21 -0500484void phy_disconnect(struct phy_device *phydev)
485{
486 if (phydev->irq > 0)
487 phy_stop_interrupts(phydev);
488
489 phy_stop_machine(phydev);
490
491 phydev->adjust_link = NULL;
492
493 phy_detach(phydev);
494}
495EXPORT_SYMBOL(phy_disconnect);
496
Anton Vorontsov2f5cb432009-12-30 08:23:30 +0000497int phy_init_hw(struct phy_device *phydev)
498{
499 int ret;
500
501 if (!phydev->drv || !phydev->drv->config_init)
502 return 0;
503
504 ret = phy_scan_fixups(phydev);
505 if (ret < 0)
506 return ret;
507
508 return phydev->drv->config_init(phydev);
509}
510
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800511/**
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000512 * phy_attach_direct - attach a network device to a given PHY device pointer
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800513 * @dev: network device to attach
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000514 * @phydev: Pointer to phy_device to attach
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800515 * @flags: PHY device's dev_flags
516 * @interface: PHY device's interface
517 *
518 * Description: Called by drivers to attach to a particular PHY
519 * device. The phy_device is found, and properly hooked up
520 * to the phy_driver. If no driver is attached, then the
521 * genphy_driver is used. The phy_device is given a ptr to
522 * the attaching device, and given a callback for link status
523 * change. The phy_device is returned to the attaching driver.
524 */
stephen hemminger89ff05e2010-10-21 08:37:41 +0000525static int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
526 u32 flags, phy_interface_t interface)
Andy Fleminge1393452005-08-24 18:46:21 -0500527{
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000528 struct device *d = &phydev->dev;
Marc Kleine-Budded005a092011-03-28 14:54:08 +0000529 int err;
Andy Fleminge1393452005-08-24 18:46:21 -0500530
531 /* Assume that if there is no driver, that it doesn't
532 * exist, and we should use the genphy driver. */
533 if (NULL == d->driver) {
David Daneyac28b9f2012-06-27 07:33:35 +0000534 if (phydev->is_c45) {
535 pr_err("No driver for phy %x\n", phydev->phy_id);
536 return -ENODEV;
537 }
538
Andy Fleminge1393452005-08-24 18:46:21 -0500539 d->driver = &genphy_driver.driver;
540
541 err = d->driver->probe(d);
Jeff Garzikb7a00ec2006-10-01 07:27:46 -0400542 if (err >= 0)
543 err = device_bind_driver(d);
Andy Fleminge1393452005-08-24 18:46:21 -0500544
Jeff Garzikb7a00ec2006-10-01 07:27:46 -0400545 if (err)
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000546 return err;
Andy Fleminge1393452005-08-24 18:46:21 -0500547 }
548
549 if (phydev->attached_dev) {
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000550 dev_err(&dev->dev, "PHY already attached\n");
551 return -EBUSY;
Andy Fleminge1393452005-08-24 18:46:21 -0500552 }
553
554 phydev->attached_dev = dev;
Richard Cochranc1f19b52010-07-17 08:49:36 +0000555 dev->phydev = phydev;
Andy Fleminge1393452005-08-24 18:46:21 -0500556
557 phydev->dev_flags = flags;
558
Andy Fleminge8a2b6a2006-12-01 12:01:06 -0600559 phydev->interface = interface;
560
Anton Vorontsovef24b162010-08-24 14:46:12 -0700561 phydev->state = PHY_READY;
562
Andy Fleminge8a2b6a2006-12-01 12:01:06 -0600563 /* Do initial configuration here, now that
564 * we have certain key parameters
565 * (dev_flags and interface) */
Marc Kleine-Budded005a092011-03-28 14:54:08 +0000566 err = phy_init_hw(phydev);
567 if (err)
568 phy_detach(phydev);
569
570 return err;
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000571}
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000572
573/**
574 * phy_attach - attach a network device to a particular PHY device
575 * @dev: network device to attach
576 * @bus_id: Bus ID of PHY device to attach
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000577 * @interface: PHY device's interface
578 *
579 * Description: Same as phy_attach_direct() except that a PHY bus_id
580 * string is passed instead of a pointer to a struct phy_device.
581 */
582struct phy_device *phy_attach(struct net_device *dev,
Florian Fainellif9a8f832013-01-14 00:52:52 +0000583 const char *bus_id, phy_interface_t interface)
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000584{
585 struct bus_type *bus = &mdio_bus_type;
586 struct phy_device *phydev;
587 struct device *d;
588 int rc;
589
590 /* Search the list of PHY devices on the mdio bus for the
591 * PHY with the requested name */
592 d = bus_find_device_by_name(bus, NULL, bus_id);
593 if (!d) {
594 pr_err("PHY %s not found\n", bus_id);
595 return ERR_PTR(-ENODEV);
596 }
597 phydev = to_phy_device(d);
598
Florian Fainellif9a8f832013-01-14 00:52:52 +0000599 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface);
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000600 if (rc)
601 return ERR_PTR(rc);
602
Andy Fleminge1393452005-08-24 18:46:21 -0500603 return phydev;
604}
605EXPORT_SYMBOL(phy_attach);
606
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800607/**
608 * phy_detach - detach a PHY device from its network device
609 * @phydev: target phy_device struct
610 */
Andy Fleminge1393452005-08-24 18:46:21 -0500611void phy_detach(struct phy_device *phydev)
612{
Richard Cochranc1f19b52010-07-17 08:49:36 +0000613 phydev->attached_dev->phydev = NULL;
Andy Fleminge1393452005-08-24 18:46:21 -0500614 phydev->attached_dev = NULL;
615
616 /* If the device had no specific driver before (i.e. - it
617 * was using the generic driver), we unbind the device
618 * from the generic driver so that there's a chance a
619 * real driver could be loaded */
Greg Kroah-Hartman87aebe02007-04-09 11:52:31 -0400620 if (phydev->dev.driver == &genphy_driver.driver)
Andy Fleminge1393452005-08-24 18:46:21 -0500621 device_release_driver(&phydev->dev);
Andy Fleminge1393452005-08-24 18:46:21 -0500622}
623EXPORT_SYMBOL(phy_detach);
624
625
Andy Fleming00db8182005-07-30 19:31:23 -0400626/* Generic PHY support and helper functions */
627
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800628/**
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300629 * genphy_config_advert - sanitize and advertise auto-negotiation parameters
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800630 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400631 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800632 * Description: Writes MII_ADVERTISE with the appropriate values,
Andy Fleming00db8182005-07-30 19:31:23 -0400633 * after sanitizing the values to make sure we only advertise
Trent Piepho51e2a382008-09-24 10:55:46 +0000634 * what is supported. Returns < 0 on error, 0 if the PHY's advertisement
635 * hasn't changed, and > 0 if it has changed.
Andy Fleming00db8182005-07-30 19:31:23 -0400636 */
stephen hemminger89ff05e2010-10-21 08:37:41 +0000637static int genphy_config_advert(struct phy_device *phydev)
Andy Fleming00db8182005-07-30 19:31:23 -0400638{
639 u32 advertise;
Trent Piepho51e2a382008-09-24 10:55:46 +0000640 int oldadv, adv;
641 int err, changed = 0;
Andy Fleming00db8182005-07-30 19:31:23 -0400642
643 /* Only allow advertising what
644 * this PHY supports */
645 phydev->advertising &= phydev->supported;
646 advertise = phydev->advertising;
647
648 /* Setup standard advertisement */
Trent Piepho51e2a382008-09-24 10:55:46 +0000649 oldadv = adv = phy_read(phydev, MII_ADVERTISE);
Andy Fleming00db8182005-07-30 19:31:23 -0400650
651 if (adv < 0)
652 return adv;
653
Matt Carlson28011cf2011-11-16 18:36:59 -0500654 adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4 | ADVERTISE_PAUSE_CAP |
Andy Fleming00db8182005-07-30 19:31:23 -0400655 ADVERTISE_PAUSE_ASYM);
Matt Carlson37f07022011-11-17 14:30:55 +0000656 adv |= ethtool_adv_to_mii_adv_t(advertise);
Andy Fleming00db8182005-07-30 19:31:23 -0400657
Trent Piepho51e2a382008-09-24 10:55:46 +0000658 if (adv != oldadv) {
659 err = phy_write(phydev, MII_ADVERTISE, adv);
Andy Fleming00db8182005-07-30 19:31:23 -0400660
Trent Piepho51e2a382008-09-24 10:55:46 +0000661 if (err < 0)
662 return err;
663 changed = 1;
664 }
Andy Fleming00db8182005-07-30 19:31:23 -0400665
666 /* Configure gigabit if it's supported */
667 if (phydev->supported & (SUPPORTED_1000baseT_Half |
668 SUPPORTED_1000baseT_Full)) {
Trent Piepho51e2a382008-09-24 10:55:46 +0000669 oldadv = adv = phy_read(phydev, MII_CTRL1000);
Andy Fleming00db8182005-07-30 19:31:23 -0400670
671 if (adv < 0)
672 return adv;
673
674 adv &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
Matt Carlson37f07022011-11-17 14:30:55 +0000675 adv |= ethtool_adv_to_mii_ctrl1000_t(advertise);
Andy Fleming00db8182005-07-30 19:31:23 -0400676
Trent Piepho51e2a382008-09-24 10:55:46 +0000677 if (adv != oldadv) {
678 err = phy_write(phydev, MII_CTRL1000, adv);
679
680 if (err < 0)
681 return err;
682 changed = 1;
683 }
Andy Fleming00db8182005-07-30 19:31:23 -0400684 }
685
Trent Piepho51e2a382008-09-24 10:55:46 +0000686 return changed;
Andy Fleming00db8182005-07-30 19:31:23 -0400687}
Andy Fleming00db8182005-07-30 19:31:23 -0400688
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800689/**
690 * genphy_setup_forced - configures/forces speed/duplex from @phydev
691 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400692 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800693 * Description: Configures MII_BMCR to force speed/duplex
Andy Fleming00db8182005-07-30 19:31:23 -0400694 * to the values in phydev. Assumes that the values are valid.
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800695 * Please see phy_sanitize_settings().
696 */
stephen hemminger89ff05e2010-10-21 08:37:41 +0000697static int genphy_setup_forced(struct phy_device *phydev)
Andy Fleming00db8182005-07-30 19:31:23 -0400698{
Andy Flemingf62220d2008-04-18 17:29:54 -0500699 int err;
Domen Puncerbc1e0a02007-08-17 08:54:45 +0200700 int ctl = 0;
Andy Fleming00db8182005-07-30 19:31:23 -0400701
702 phydev->pause = phydev->asym_pause = 0;
703
704 if (SPEED_1000 == phydev->speed)
705 ctl |= BMCR_SPEED1000;
706 else if (SPEED_100 == phydev->speed)
707 ctl |= BMCR_SPEED100;
708
709 if (DUPLEX_FULL == phydev->duplex)
710 ctl |= BMCR_FULLDPLX;
711
Andy Flemingf62220d2008-04-18 17:29:54 -0500712 err = phy_write(phydev, MII_BMCR, ctl);
Andy Fleming00db8182005-07-30 19:31:23 -0400713
Andy Flemingf62220d2008-04-18 17:29:54 -0500714 return err;
Andy Fleming00db8182005-07-30 19:31:23 -0400715}
716
717
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800718/**
719 * genphy_restart_aneg - Enable and Restart Autonegotiation
720 * @phydev: target phy_device struct
721 */
Andy Fleming00db8182005-07-30 19:31:23 -0400722int genphy_restart_aneg(struct phy_device *phydev)
723{
724 int ctl;
725
726 ctl = phy_read(phydev, MII_BMCR);
727
728 if (ctl < 0)
729 return ctl;
730
731 ctl |= (BMCR_ANENABLE | BMCR_ANRESTART);
732
733 /* Don't isolate the PHY if we're negotiating */
734 ctl &= ~(BMCR_ISOLATE);
735
736 ctl = phy_write(phydev, MII_BMCR, ctl);
737
738 return ctl;
739}
Adrian Bunk892871d2008-10-13 18:48:09 -0700740EXPORT_SYMBOL(genphy_restart_aneg);
Andy Fleming00db8182005-07-30 19:31:23 -0400741
742
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800743/**
744 * genphy_config_aneg - restart auto-negotiation or write BMCR
745 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400746 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800747 * Description: If auto-negotiation is enabled, we configure the
Andy Fleming00db8182005-07-30 19:31:23 -0400748 * advertising, and then restart auto-negotiation. If it is not
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800749 * enabled, then we write the BMCR.
Andy Fleming00db8182005-07-30 19:31:23 -0400750 */
751int genphy_config_aneg(struct phy_device *phydev)
752{
Trent Piephode339c22008-11-19 15:52:41 -0800753 int result;
Andy Fleming00db8182005-07-30 19:31:23 -0400754
Trent Piephode339c22008-11-19 15:52:41 -0800755 if (AUTONEG_ENABLE != phydev->autoneg)
756 return genphy_setup_forced(phydev);
Andy Fleming00db8182005-07-30 19:31:23 -0400757
Trent Piephode339c22008-11-19 15:52:41 -0800758 result = genphy_config_advert(phydev);
Andy Fleming00db8182005-07-30 19:31:23 -0400759
Trent Piephode339c22008-11-19 15:52:41 -0800760 if (result < 0) /* error */
761 return result;
762
763 if (result == 0) {
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300764 /* Advertisement hasn't changed, but maybe aneg was never on to
Trent Piephode339c22008-11-19 15:52:41 -0800765 * begin with? Or maybe phy was isolated? */
766 int ctl = phy_read(phydev, MII_BMCR);
767
768 if (ctl < 0)
769 return ctl;
770
771 if (!(ctl & BMCR_ANENABLE) || (ctl & BMCR_ISOLATE))
772 result = 1; /* do restart aneg */
773 }
774
775 /* Only restart aneg if we are advertising something different
776 * than we were before. */
777 if (result > 0)
778 result = genphy_restart_aneg(phydev);
Andy Fleming00db8182005-07-30 19:31:23 -0400779
Trent Piepho51e2a382008-09-24 10:55:46 +0000780 return result;
Andy Fleming00db8182005-07-30 19:31:23 -0400781}
782EXPORT_SYMBOL(genphy_config_aneg);
783
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800784/**
785 * genphy_update_link - update link status in @phydev
786 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400787 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800788 * Description: Update the value in phydev->link to reflect the
Andy Fleming00db8182005-07-30 19:31:23 -0400789 * current link value. In order to do this, we need to read
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800790 * the status register twice, keeping the second value.
Andy Fleming00db8182005-07-30 19:31:23 -0400791 */
792int genphy_update_link(struct phy_device *phydev)
793{
794 int status;
795
796 /* Do a fake read */
797 status = phy_read(phydev, MII_BMSR);
798
799 if (status < 0)
800 return status;
801
802 /* Read link and autonegotiation status */
803 status = phy_read(phydev, MII_BMSR);
804
805 if (status < 0)
806 return status;
807
808 if ((status & BMSR_LSTATUS) == 0)
809 phydev->link = 0;
810 else
811 phydev->link = 1;
812
813 return 0;
814}
Andy Fleming6b655522006-10-16 16:19:17 -0500815EXPORT_SYMBOL(genphy_update_link);
Andy Fleming00db8182005-07-30 19:31:23 -0400816
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800817/**
818 * genphy_read_status - check the link status and update current link state
819 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400820 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800821 * Description: Check the link, then figure out the current state
Andy Fleming00db8182005-07-30 19:31:23 -0400822 * by comparing what we advertise with what the link partner
823 * advertises. Start by checking the gigabit possibilities,
824 * then move on to 10/100.
825 */
826int genphy_read_status(struct phy_device *phydev)
827{
828 int adv;
829 int err;
830 int lpa;
831 int lpagb = 0;
832
833 /* Update the link, but return if there
834 * was an error */
835 err = genphy_update_link(phydev);
836 if (err)
837 return err;
838
839 if (AUTONEG_ENABLE == phydev->autoneg) {
840 if (phydev->supported & (SUPPORTED_1000baseT_Half
841 | SUPPORTED_1000baseT_Full)) {
842 lpagb = phy_read(phydev, MII_STAT1000);
843
844 if (lpagb < 0)
845 return lpagb;
846
847 adv = phy_read(phydev, MII_CTRL1000);
848
849 if (adv < 0)
850 return adv;
851
852 lpagb &= adv << 2;
853 }
854
855 lpa = phy_read(phydev, MII_LPA);
856
857 if (lpa < 0)
858 return lpa;
859
860 adv = phy_read(phydev, MII_ADVERTISE);
861
862 if (adv < 0)
863 return adv;
864
865 lpa &= adv;
866
867 phydev->speed = SPEED_10;
868 phydev->duplex = DUPLEX_HALF;
869 phydev->pause = phydev->asym_pause = 0;
870
871 if (lpagb & (LPA_1000FULL | LPA_1000HALF)) {
872 phydev->speed = SPEED_1000;
873
874 if (lpagb & LPA_1000FULL)
875 phydev->duplex = DUPLEX_FULL;
876 } else if (lpa & (LPA_100FULL | LPA_100HALF)) {
877 phydev->speed = SPEED_100;
878
879 if (lpa & LPA_100FULL)
880 phydev->duplex = DUPLEX_FULL;
881 } else
882 if (lpa & LPA_10FULL)
883 phydev->duplex = DUPLEX_FULL;
884
885 if (phydev->duplex == DUPLEX_FULL){
886 phydev->pause = lpa & LPA_PAUSE_CAP ? 1 : 0;
887 phydev->asym_pause = lpa & LPA_PAUSE_ASYM ? 1 : 0;
888 }
889 } else {
890 int bmcr = phy_read(phydev, MII_BMCR);
891 if (bmcr < 0)
892 return bmcr;
893
894 if (bmcr & BMCR_FULLDPLX)
895 phydev->duplex = DUPLEX_FULL;
896 else
897 phydev->duplex = DUPLEX_HALF;
898
899 if (bmcr & BMCR_SPEED1000)
900 phydev->speed = SPEED_1000;
901 else if (bmcr & BMCR_SPEED100)
902 phydev->speed = SPEED_100;
903 else
904 phydev->speed = SPEED_10;
905
906 phydev->pause = phydev->asym_pause = 0;
907 }
908
909 return 0;
910}
911EXPORT_SYMBOL(genphy_read_status);
912
913static int genphy_config_init(struct phy_device *phydev)
914{
Eric Sesterhenn84c22d72006-09-25 16:39:22 -0700915 int val;
Andy Fleming00db8182005-07-30 19:31:23 -0400916 u32 features;
917
918 /* For now, I'll claim that the generic driver supports
919 * all possible port types */
920 features = (SUPPORTED_TP | SUPPORTED_MII
921 | SUPPORTED_AUI | SUPPORTED_FIBRE |
922 SUPPORTED_BNC);
923
924 /* Do we support autonegotiation? */
925 val = phy_read(phydev, MII_BMSR);
926
927 if (val < 0)
928 return val;
929
930 if (val & BMSR_ANEGCAPABLE)
931 features |= SUPPORTED_Autoneg;
932
933 if (val & BMSR_100FULL)
934 features |= SUPPORTED_100baseT_Full;
935 if (val & BMSR_100HALF)
936 features |= SUPPORTED_100baseT_Half;
937 if (val & BMSR_10FULL)
938 features |= SUPPORTED_10baseT_Full;
939 if (val & BMSR_10HALF)
940 features |= SUPPORTED_10baseT_Half;
941
942 if (val & BMSR_ESTATEN) {
943 val = phy_read(phydev, MII_ESTATUS);
944
945 if (val < 0)
946 return val;
947
948 if (val & ESTATUS_1000_TFULL)
949 features |= SUPPORTED_1000baseT_Full;
950 if (val & ESTATUS_1000_THALF)
951 features |= SUPPORTED_1000baseT_Half;
952 }
953
954 phydev->supported = features;
955 phydev->advertising = features;
956
957 return 0;
958}
Giuseppe Cavallaro0f0ca342008-11-28 16:24:56 -0800959int genphy_suspend(struct phy_device *phydev)
960{
961 int value;
Andy Fleming00db8182005-07-30 19:31:23 -0400962
Giuseppe Cavallaro0f0ca342008-11-28 16:24:56 -0800963 mutex_lock(&phydev->lock);
964
965 value = phy_read(phydev, MII_BMCR);
966 phy_write(phydev, MII_BMCR, (value | BMCR_PDOWN));
967
968 mutex_unlock(&phydev->lock);
969
970 return 0;
971}
972EXPORT_SYMBOL(genphy_suspend);
973
974int genphy_resume(struct phy_device *phydev)
975{
976 int value;
977
978 mutex_lock(&phydev->lock);
979
980 value = phy_read(phydev, MII_BMCR);
981 phy_write(phydev, MII_BMCR, (value & ~BMCR_PDOWN));
982
983 mutex_unlock(&phydev->lock);
984
985 return 0;
986}
987EXPORT_SYMBOL(genphy_resume);
Andy Fleming00db8182005-07-30 19:31:23 -0400988
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800989/**
990 * phy_probe - probe and init a PHY device
991 * @dev: device to probe and init
Andy Fleming00db8182005-07-30 19:31:23 -0400992 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800993 * Description: Take care of setting up the phy_device structure,
Andy Fleming00db8182005-07-30 19:31:23 -0400994 * set the state to READY (the driver's init function should
995 * set it to STARTING if needed).
996 */
997static int phy_probe(struct device *dev)
998{
999 struct phy_device *phydev;
1000 struct phy_driver *phydrv;
1001 struct device_driver *drv;
1002 int err = 0;
1003
1004 phydev = to_phy_device(dev);
1005
Alan Sternf3ff9242012-01-24 13:35:24 -05001006 drv = phydev->dev.driver;
Andy Fleming00db8182005-07-30 19:31:23 -04001007 phydrv = to_phy_driver(drv);
1008 phydev->drv = phydrv;
1009
1010 /* Disable the interrupt if the PHY doesn't support it */
1011 if (!(phydrv->flags & PHY_HAS_INTERRUPT))
1012 phydev->irq = PHY_POLL;
1013
Nate Case35b5f6b2008-01-29 10:05:09 -06001014 mutex_lock(&phydev->lock);
Andy Fleming00db8182005-07-30 19:31:23 -04001015
1016 /* Start out supporting everything. Eventually,
1017 * a controller will attach, and may modify one
1018 * or both of these values */
1019 phydev->supported = phydrv->features;
1020 phydev->advertising = phydrv->features;
1021
1022 /* Set the state to READY by default */
1023 phydev->state = PHY_READY;
1024
1025 if (phydev->drv->probe)
1026 err = phydev->drv->probe(phydev);
1027
Nate Case35b5f6b2008-01-29 10:05:09 -06001028 mutex_unlock(&phydev->lock);
Andy Fleming00db8182005-07-30 19:31:23 -04001029
Andy Fleming00db8182005-07-30 19:31:23 -04001030 return err;
Andy Fleminge8a2b6a2006-12-01 12:01:06 -06001031
Andy Fleming00db8182005-07-30 19:31:23 -04001032}
1033
1034static int phy_remove(struct device *dev)
1035{
1036 struct phy_device *phydev;
1037
1038 phydev = to_phy_device(dev);
1039
Nate Case35b5f6b2008-01-29 10:05:09 -06001040 mutex_lock(&phydev->lock);
Andy Fleming00db8182005-07-30 19:31:23 -04001041 phydev->state = PHY_DOWN;
Nate Case35b5f6b2008-01-29 10:05:09 -06001042 mutex_unlock(&phydev->lock);
Andy Fleming00db8182005-07-30 19:31:23 -04001043
1044 if (phydev->drv->remove)
1045 phydev->drv->remove(phydev);
Andy Fleming00db8182005-07-30 19:31:23 -04001046 phydev->drv = NULL;
1047
1048 return 0;
1049}
1050
Randy Dunlapb3df0da2007-03-06 02:41:48 -08001051/**
1052 * phy_driver_register - register a phy_driver with the PHY layer
1053 * @new_driver: new phy_driver to register
1054 */
Andy Fleming00db8182005-07-30 19:31:23 -04001055int phy_driver_register(struct phy_driver *new_driver)
1056{
1057 int retval;
1058
Andy Fleming00db8182005-07-30 19:31:23 -04001059 new_driver->driver.name = new_driver->name;
1060 new_driver->driver.bus = &mdio_bus_type;
1061 new_driver->driver.probe = phy_probe;
1062 new_driver->driver.remove = phy_remove;
1063
1064 retval = driver_register(&new_driver->driver);
1065
1066 if (retval) {
Joe Perches8d242482012-06-09 07:49:07 +00001067 pr_err("%s: Error %d in registering driver\n",
1068 new_driver->name, retval);
Andy Fleming00db8182005-07-30 19:31:23 -04001069
1070 return retval;
1071 }
1072
Olof Johanssonf2511f12007-11-04 16:09:23 -06001073 pr_debug("%s: Registered new driver\n", new_driver->name);
Andy Fleming00db8182005-07-30 19:31:23 -04001074
1075 return 0;
1076}
1077EXPORT_SYMBOL(phy_driver_register);
1078
Christian Hohnstaedtd5bf9072012-07-04 05:44:34 +00001079int phy_drivers_register(struct phy_driver *new_driver, int n)
1080{
1081 int i, ret = 0;
1082
1083 for (i = 0; i < n; i++) {
1084 ret = phy_driver_register(new_driver + i);
1085 if (ret) {
1086 while (i-- > 0)
1087 phy_driver_unregister(new_driver + i);
1088 break;
1089 }
1090 }
1091 return ret;
1092}
1093EXPORT_SYMBOL(phy_drivers_register);
1094
Andy Fleming00db8182005-07-30 19:31:23 -04001095void phy_driver_unregister(struct phy_driver *drv)
1096{
1097 driver_unregister(&drv->driver);
1098}
1099EXPORT_SYMBOL(phy_driver_unregister);
1100
Christian Hohnstaedtd5bf9072012-07-04 05:44:34 +00001101void phy_drivers_unregister(struct phy_driver *drv, int n)
1102{
1103 int i;
1104 for (i = 0; i < n; i++) {
1105 phy_driver_unregister(drv + i);
1106 }
1107}
1108EXPORT_SYMBOL(phy_drivers_unregister);
1109
Andy Fleminge1393452005-08-24 18:46:21 -05001110static struct phy_driver genphy_driver = {
1111 .phy_id = 0xffffffff,
1112 .phy_id_mask = 0xffffffff,
1113 .name = "Generic PHY",
1114 .config_init = genphy_config_init,
1115 .features = 0,
1116 .config_aneg = genphy_config_aneg,
1117 .read_status = genphy_read_status,
Giuseppe Cavallaro0f0ca342008-11-28 16:24:56 -08001118 .suspend = genphy_suspend,
1119 .resume = genphy_resume,
Andy Fleminge1393452005-08-24 18:46:21 -05001120 .driver = {.owner= THIS_MODULE, },
1121};
Andy Fleming00db8182005-07-30 19:31:23 -04001122
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001123static int __init phy_init(void)
Andy Fleming00db8182005-07-30 19:31:23 -04001124{
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001125 int rc;
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001126
1127 rc = mdio_bus_init();
1128 if (rc)
Andy Fleminge1393452005-08-24 18:46:21 -05001129 return rc;
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001130
Andy Fleminge1393452005-08-24 18:46:21 -05001131 rc = phy_driver_register(&genphy_driver);
1132 if (rc)
1133 mdio_bus_exit();
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001134
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001135 return rc;
Andy Fleming00db8182005-07-30 19:31:23 -04001136}
1137
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001138static void __exit phy_exit(void)
Andy Fleming00db8182005-07-30 19:31:23 -04001139{
1140 phy_driver_unregister(&genphy_driver);
Andy Fleminge1393452005-08-24 18:46:21 -05001141 mdio_bus_exit();
Andy Fleming00db8182005-07-30 19:31:23 -04001142}
1143
Andy Fleminge1393452005-08-24 18:46:21 -05001144subsys_initcall(phy_init);
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001145module_exit(phy_exit);