blob: 3657b4a29124b57bc335417a1389f792aaf2ce79 [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)
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
Petr Malatb2a43192013-02-28 01:01:52 +0000204 device_initialize(&dev->dev);
205
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700206 return dev;
207}
David Daneyac28b9f2012-06-27 07:33:35 +0000208EXPORT_SYMBOL(phy_device_create);
209
210/**
211 * get_phy_c45_ids - reads the specified addr for its 802.3-c45 IDs.
212 * @bus: the target MII bus
213 * @addr: PHY address on the MII bus
214 * @phy_id: where to store the ID retrieved.
215 * @c45_ids: where to store the c45 ID information.
216 *
217 * If the PHY devices-in-package appears to be valid, it and the
218 * corresponding identifiers are stored in @c45_ids, zero is stored
219 * in @phy_id. Otherwise 0xffffffff is stored in @phy_id. Returns
220 * zero on success.
221 *
222 */
223static int get_phy_c45_ids(struct mii_bus *bus, int addr, u32 *phy_id,
224 struct phy_c45_device_ids *c45_ids) {
225 int phy_reg;
226 int i, reg_addr;
227 const int num_ids = ARRAY_SIZE(c45_ids->device_ids);
228
229 /* Find first non-zero Devices In package. Device
230 * zero is reserved, so don't probe it.
231 */
232 for (i = 1;
233 i < num_ids && c45_ids->devices_in_package == 0;
234 i++) {
235 reg_addr = MII_ADDR_C45 | i << 16 | 6;
236 phy_reg = mdiobus_read(bus, addr, reg_addr);
237 if (phy_reg < 0)
238 return -EIO;
239 c45_ids->devices_in_package = (phy_reg & 0xffff) << 16;
240
241 reg_addr = MII_ADDR_C45 | i << 16 | 5;
242 phy_reg = mdiobus_read(bus, addr, reg_addr);
243 if (phy_reg < 0)
244 return -EIO;
245 c45_ids->devices_in_package |= (phy_reg & 0xffff);
246
247 /* If mostly Fs, there is no device there,
248 * let's get out of here.
249 */
250 if ((c45_ids->devices_in_package & 0x1fffffff) == 0x1fffffff) {
251 *phy_id = 0xffffffff;
252 return 0;
253 }
254 }
255
256 /* Now probe Device Identifiers for each device present. */
257 for (i = 1; i < num_ids; i++) {
258 if (!(c45_ids->devices_in_package & (1 << i)))
259 continue;
260
261 reg_addr = MII_ADDR_C45 | i << 16 | MII_PHYSID1;
262 phy_reg = mdiobus_read(bus, addr, reg_addr);
263 if (phy_reg < 0)
264 return -EIO;
265 c45_ids->device_ids[i] = (phy_reg & 0xffff) << 16;
266
267 reg_addr = MII_ADDR_C45 | i << 16 | MII_PHYSID2;
268 phy_reg = mdiobus_read(bus, addr, reg_addr);
269 if (phy_reg < 0)
270 return -EIO;
271 c45_ids->device_ids[i] |= (phy_reg & 0xffff);
272 }
273 *phy_id = 0;
274 return 0;
275}
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700276
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800277/**
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400278 * get_phy_id - reads the specified addr for its ID.
279 * @bus: the target MII bus
280 * @addr: PHY address on the MII bus
281 * @phy_id: where to store the ID retrieved.
David Daneyac28b9f2012-06-27 07:33:35 +0000282 * @is_c45: If true the PHY uses the 802.3 clause 45 protocol
283 * @c45_ids: where to store the c45 ID information.
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400284 *
David Daneyac28b9f2012-06-27 07:33:35 +0000285 * Description: In the case of a 802.3-c22 PHY, reads the ID registers
286 * of the PHY at @addr on the @bus, stores it in @phy_id and returns
287 * zero on success.
288 *
289 * In the case of a 802.3-c45 PHY, get_phy_c45_ids() is invoked, and
290 * its return value is in turn returned.
291 *
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400292 */
David Daneyac28b9f2012-06-27 07:33:35 +0000293static int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id,
294 bool is_c45, struct phy_c45_device_ids *c45_ids)
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400295{
296 int phy_reg;
297
David Daneyac28b9f2012-06-27 07:33:35 +0000298 if (is_c45)
299 return get_phy_c45_ids(bus, addr, phy_id, c45_ids);
300
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400301 /* Grab the bits from PHYIR1, and put them
302 * in the upper half */
David Daney6fe32642011-09-30 11:51:22 +0000303 phy_reg = mdiobus_read(bus, addr, MII_PHYSID1);
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400304
305 if (phy_reg < 0)
306 return -EIO;
307
308 *phy_id = (phy_reg & 0xffff) << 16;
309
310 /* Grab the bits from PHYIR2, and put them in the lower half */
David Daney6fe32642011-09-30 11:51:22 +0000311 phy_reg = mdiobus_read(bus, addr, MII_PHYSID2);
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400312
313 if (phy_reg < 0)
314 return -EIO;
315
316 *phy_id |= (phy_reg & 0xffff);
317
318 return 0;
319}
320
321/**
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800322 * get_phy_device - reads the specified PHY device and returns its @phy_device struct
323 * @bus: the target MII bus
324 * @addr: PHY address on the MII bus
David Daneyac28b9f2012-06-27 07:33:35 +0000325 * @is_c45: If true the PHY uses the 802.3 clause 45 protocol
Andy Fleming00db8182005-07-30 19:31:23 -0400326 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800327 * Description: Reads the ID registers of the PHY at @addr on the
328 * @bus, then allocates and returns the phy_device to represent it.
Andy Fleming00db8182005-07-30 19:31:23 -0400329 */
David Daneyac28b9f2012-06-27 07:33:35 +0000330struct phy_device *get_phy_device(struct mii_bus *bus, int addr, bool is_c45)
Andy Fleming00db8182005-07-30 19:31:23 -0400331{
David Daneyac28b9f2012-06-27 07:33:35 +0000332 struct phy_c45_device_ids c45_ids = {0};
David S. Miller160c85f2012-06-27 21:28:14 -0700333 struct phy_device *dev = NULL;
334 u32 phy_id = 0;
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400335 int r;
Andy Fleming00db8182005-07-30 19:31:23 -0400336
David Daneyac28b9f2012-06-27 07:33:35 +0000337 r = get_phy_id(bus, addr, &phy_id, is_c45, &c45_ids);
Paul Gortmakercac1f3c2008-04-15 12:49:21 -0400338 if (r)
339 return ERR_PTR(r);
Andy Fleming00db8182005-07-30 19:31:23 -0400340
Giuseppe Cavallaro6436cbc2008-11-20 20:43:18 -0800341 /* If the phy_id is mostly Fs, there is no device there */
342 if ((phy_id & 0x1fffffff) == 0x1fffffff)
343 return NULL;
344
David Daneyac28b9f2012-06-27 07:33:35 +0000345 dev = phy_device_create(bus, addr, phy_id, is_c45, &c45_ids);
Andy Fleming00db8182005-07-30 19:31:23 -0400346
347 return dev;
348}
Grant Likely4dea5472009-04-25 12:52:46 +0000349EXPORT_SYMBOL(get_phy_device);
350
351/**
352 * phy_device_register - Register the phy device on the MDIO bus
Randy Dunlap1d4ac5d2009-06-16 16:56:33 +0000353 * @phydev: phy_device structure to be added to the MDIO bus
Grant Likely4dea5472009-04-25 12:52:46 +0000354 */
355int phy_device_register(struct phy_device *phydev)
356{
357 int err;
358
359 /* Don't register a phy if one is already registered at this
360 * address */
361 if (phydev->bus->phy_map[phydev->addr])
362 return -EINVAL;
363 phydev->bus->phy_map[phydev->addr] = phydev;
364
365 /* Run all of the fixups for this PHY */
366 phy_scan_fixups(phydev);
367
Petr Malatb2a43192013-02-28 01:01:52 +0000368 err = device_add(&phydev->dev);
Grant Likely4dea5472009-04-25 12:52:46 +0000369 if (err) {
Petr Malatb2a43192013-02-28 01:01:52 +0000370 pr_err("PHY %d failed to add\n", phydev->addr);
Grant Likely4dea5472009-04-25 12:52:46 +0000371 goto out;
372 }
373
374 return 0;
375
376 out:
377 phydev->bus->phy_map[phydev->addr] = NULL;
378 return err;
379}
380EXPORT_SYMBOL(phy_device_register);
Andy Fleming00db8182005-07-30 19:31:23 -0400381
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800382/**
Jiri Pirkof8f76db2010-02-04 10:23:02 -0800383 * phy_find_first - finds the first PHY device on the bus
384 * @bus: the target MII bus
385 */
386struct phy_device *phy_find_first(struct mii_bus *bus)
387{
388 int addr;
389
390 for (addr = 0; addr < PHY_MAX_ADDR; addr++) {
391 if (bus->phy_map[addr])
392 return bus->phy_map[addr];
393 }
394 return NULL;
395}
396EXPORT_SYMBOL(phy_find_first);
397
398/**
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800399 * phy_prepare_link - prepares the PHY layer to monitor link status
400 * @phydev: target phy_device struct
401 * @handler: callback function for link status change notifications
Andy Fleming00db8182005-07-30 19:31:23 -0400402 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800403 * Description: Tells the PHY infrastructure to handle the
Andy Fleming00db8182005-07-30 19:31:23 -0400404 * gory details on monitoring link status (whether through
405 * polling or an interrupt), and to call back to the
406 * connected device driver when the link status changes.
407 * If you want to monitor your own link state, don't call
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800408 * this function.
409 */
stephen hemminger89ff05e2010-10-21 08:37:41 +0000410static void phy_prepare_link(struct phy_device *phydev,
Andy Fleming00db8182005-07-30 19:31:23 -0400411 void (*handler)(struct net_device *))
412{
413 phydev->adjust_link = handler;
414}
415
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800416/**
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000417 * phy_connect_direct - connect an ethernet device to a specific phy_device
418 * @dev: the network device to connect
419 * @phydev: the pointer to the phy device
420 * @handler: callback function for state change notifications
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000421 * @interface: PHY device's interface
422 */
423int phy_connect_direct(struct net_device *dev, struct phy_device *phydev,
Florian Fainellif9a8f832013-01-14 00:52:52 +0000424 void (*handler)(struct net_device *),
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000425 phy_interface_t interface)
426{
427 int rc;
428
Florian Fainellif9a8f832013-01-14 00:52:52 +0000429 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface);
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000430 if (rc)
431 return rc;
432
433 phy_prepare_link(phydev, handler);
434 phy_start_machine(phydev, NULL);
435 if (phydev->irq > 0)
436 phy_start_interrupts(phydev);
437
438 return 0;
439}
440EXPORT_SYMBOL(phy_connect_direct);
441
442/**
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800443 * phy_connect - connect an ethernet device to a PHY device
444 * @dev: the network device to connect
Randy Dunlap5d12b132008-04-28 10:58:22 -0700445 * @bus_id: the id string of the PHY device to connect
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800446 * @handler: callback function for state change notifications
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800447 * @interface: PHY device's interface
Andy Fleminge1393452005-08-24 18:46:21 -0500448 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800449 * Description: Convenience function for connecting ethernet
Andy Fleminge1393452005-08-24 18:46:21 -0500450 * devices to PHY devices. The default behavior is for
451 * the PHY infrastructure to handle everything, and only notify
452 * the connected driver when the link status changes. If you
453 * don't want, or can't use the provided functionality, you may
454 * choose to call only the subset of functions which provide
455 * the desired functionality.
456 */
Andy Flemingf62220d2008-04-18 17:29:54 -0500457struct phy_device * phy_connect(struct net_device *dev, const char *bus_id,
Florian Fainellif9a8f832013-01-14 00:52:52 +0000458 void (*handler)(struct net_device *),
Randy Dunlap1a168932007-02-05 10:44:20 -0800459 phy_interface_t interface)
Andy Fleminge1393452005-08-24 18:46:21 -0500460{
461 struct phy_device *phydev;
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000462 struct device *d;
463 int rc;
Andy Fleminge1393452005-08-24 18:46:21 -0500464
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000465 /* Search the list of PHY devices on the mdio bus for the
466 * PHY with the requested name */
467 d = bus_find_device_by_name(&mdio_bus_type, NULL, bus_id);
468 if (!d) {
469 pr_err("PHY %s not found\n", bus_id);
470 return ERR_PTR(-ENODEV);
471 }
472 phydev = to_phy_device(d);
Andy Fleminge1393452005-08-24 18:46:21 -0500473
Florian Fainellif9a8f832013-01-14 00:52:52 +0000474 rc = phy_connect_direct(dev, phydev, handler, interface);
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000475 if (rc)
476 return ERR_PTR(rc);
Andy Fleminge1393452005-08-24 18:46:21 -0500477
478 return phydev;
479}
480EXPORT_SYMBOL(phy_connect);
481
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800482/**
483 * phy_disconnect - disable interrupts, stop state machine, and detach a PHY device
484 * @phydev: target phy_device struct
485 */
Andy Fleminge1393452005-08-24 18:46:21 -0500486void phy_disconnect(struct phy_device *phydev)
487{
488 if (phydev->irq > 0)
489 phy_stop_interrupts(phydev);
490
491 phy_stop_machine(phydev);
492
493 phydev->adjust_link = NULL;
494
495 phy_detach(phydev);
496}
497EXPORT_SYMBOL(phy_disconnect);
498
Anton Vorontsov2f5cb432009-12-30 08:23:30 +0000499int phy_init_hw(struct phy_device *phydev)
500{
501 int ret;
502
503 if (!phydev->drv || !phydev->drv->config_init)
504 return 0;
505
506 ret = phy_scan_fixups(phydev);
507 if (ret < 0)
508 return ret;
509
510 return phydev->drv->config_init(phydev);
511}
512
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800513/**
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000514 * phy_attach_direct - attach a network device to a given PHY device pointer
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800515 * @dev: network device to attach
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000516 * @phydev: Pointer to phy_device to attach
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800517 * @flags: PHY device's dev_flags
518 * @interface: PHY device's interface
519 *
520 * Description: Called by drivers to attach to a particular PHY
521 * device. The phy_device is found, and properly hooked up
522 * to the phy_driver. If no driver is attached, then the
523 * genphy_driver is used. The phy_device is given a ptr to
524 * the attaching device, and given a callback for link status
525 * change. The phy_device is returned to the attaching driver.
526 */
stephen hemminger89ff05e2010-10-21 08:37:41 +0000527static int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
528 u32 flags, phy_interface_t interface)
Andy Fleminge1393452005-08-24 18:46:21 -0500529{
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000530 struct device *d = &phydev->dev;
Marc Kleine-Budded005a092011-03-28 14:54:08 +0000531 int err;
Andy Fleminge1393452005-08-24 18:46:21 -0500532
533 /* Assume that if there is no driver, that it doesn't
534 * exist, and we should use the genphy driver. */
535 if (NULL == d->driver) {
David Daneyac28b9f2012-06-27 07:33:35 +0000536 if (phydev->is_c45) {
537 pr_err("No driver for phy %x\n", phydev->phy_id);
538 return -ENODEV;
539 }
540
Andy Fleminge1393452005-08-24 18:46:21 -0500541 d->driver = &genphy_driver.driver;
542
543 err = d->driver->probe(d);
Jeff Garzikb7a00ec2006-10-01 07:27:46 -0400544 if (err >= 0)
545 err = device_bind_driver(d);
Andy Fleminge1393452005-08-24 18:46:21 -0500546
Jeff Garzikb7a00ec2006-10-01 07:27:46 -0400547 if (err)
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000548 return err;
Andy Fleminge1393452005-08-24 18:46:21 -0500549 }
550
551 if (phydev->attached_dev) {
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000552 dev_err(&dev->dev, "PHY already attached\n");
553 return -EBUSY;
Andy Fleminge1393452005-08-24 18:46:21 -0500554 }
555
556 phydev->attached_dev = dev;
Richard Cochranc1f19b52010-07-17 08:49:36 +0000557 dev->phydev = phydev;
Andy Fleminge1393452005-08-24 18:46:21 -0500558
559 phydev->dev_flags = flags;
560
Andy Fleminge8a2b6a2006-12-01 12:01:06 -0600561 phydev->interface = interface;
562
Anton Vorontsovef24b162010-08-24 14:46:12 -0700563 phydev->state = PHY_READY;
564
Andy Fleminge8a2b6a2006-12-01 12:01:06 -0600565 /* Do initial configuration here, now that
566 * we have certain key parameters
567 * (dev_flags and interface) */
Marc Kleine-Budded005a092011-03-28 14:54:08 +0000568 err = phy_init_hw(phydev);
569 if (err)
570 phy_detach(phydev);
571
572 return err;
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000573}
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000574
575/**
576 * phy_attach - attach a network device to a particular PHY device
577 * @dev: network device to attach
578 * @bus_id: Bus ID of PHY device to attach
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000579 * @interface: PHY device's interface
580 *
581 * Description: Same as phy_attach_direct() except that a PHY bus_id
582 * string is passed instead of a pointer to a struct phy_device.
583 */
584struct phy_device *phy_attach(struct net_device *dev,
Florian Fainellif9a8f832013-01-14 00:52:52 +0000585 const char *bus_id, phy_interface_t interface)
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000586{
587 struct bus_type *bus = &mdio_bus_type;
588 struct phy_device *phydev;
589 struct device *d;
590 int rc;
591
592 /* Search the list of PHY devices on the mdio bus for the
593 * PHY with the requested name */
594 d = bus_find_device_by_name(bus, NULL, bus_id);
595 if (!d) {
596 pr_err("PHY %s not found\n", bus_id);
597 return ERR_PTR(-ENODEV);
598 }
599 phydev = to_phy_device(d);
600
Florian Fainellif9a8f832013-01-14 00:52:52 +0000601 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface);
Grant Likelyfa94f6d2009-04-25 12:52:51 +0000602 if (rc)
603 return ERR_PTR(rc);
604
Andy Fleminge1393452005-08-24 18:46:21 -0500605 return phydev;
606}
607EXPORT_SYMBOL(phy_attach);
608
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800609/**
610 * phy_detach - detach a PHY device from its network device
611 * @phydev: target phy_device struct
612 */
Andy Fleminge1393452005-08-24 18:46:21 -0500613void phy_detach(struct phy_device *phydev)
614{
Richard Cochranc1f19b52010-07-17 08:49:36 +0000615 phydev->attached_dev->phydev = NULL;
Andy Fleminge1393452005-08-24 18:46:21 -0500616 phydev->attached_dev = NULL;
617
618 /* If the device had no specific driver before (i.e. - it
619 * was using the generic driver), we unbind the device
620 * from the generic driver so that there's a chance a
621 * real driver could be loaded */
Greg Kroah-Hartman87aebe02007-04-09 11:52:31 -0400622 if (phydev->dev.driver == &genphy_driver.driver)
Andy Fleminge1393452005-08-24 18:46:21 -0500623 device_release_driver(&phydev->dev);
Andy Fleminge1393452005-08-24 18:46:21 -0500624}
625EXPORT_SYMBOL(phy_detach);
626
627
Andy Fleming00db8182005-07-30 19:31:23 -0400628/* Generic PHY support and helper functions */
629
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800630/**
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300631 * genphy_config_advert - sanitize and advertise auto-negotiation parameters
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800632 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400633 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800634 * Description: Writes MII_ADVERTISE with the appropriate values,
Andy Fleming00db8182005-07-30 19:31:23 -0400635 * after sanitizing the values to make sure we only advertise
Trent Piepho51e2a382008-09-24 10:55:46 +0000636 * what is supported. Returns < 0 on error, 0 if the PHY's advertisement
637 * hasn't changed, and > 0 if it has changed.
Andy Fleming00db8182005-07-30 19:31:23 -0400638 */
stephen hemminger89ff05e2010-10-21 08:37:41 +0000639static int genphy_config_advert(struct phy_device *phydev)
Andy Fleming00db8182005-07-30 19:31:23 -0400640{
641 u32 advertise;
Trent Piepho51e2a382008-09-24 10:55:46 +0000642 int oldadv, adv;
643 int err, changed = 0;
Andy Fleming00db8182005-07-30 19:31:23 -0400644
645 /* Only allow advertising what
646 * this PHY supports */
647 phydev->advertising &= phydev->supported;
648 advertise = phydev->advertising;
649
650 /* Setup standard advertisement */
Trent Piepho51e2a382008-09-24 10:55:46 +0000651 oldadv = adv = phy_read(phydev, MII_ADVERTISE);
Andy Fleming00db8182005-07-30 19:31:23 -0400652
653 if (adv < 0)
654 return adv;
655
Matt Carlson28011cf2011-11-16 18:36:59 -0500656 adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4 | ADVERTISE_PAUSE_CAP |
Andy Fleming00db8182005-07-30 19:31:23 -0400657 ADVERTISE_PAUSE_ASYM);
Matt Carlson37f07022011-11-17 14:30:55 +0000658 adv |= ethtool_adv_to_mii_adv_t(advertise);
Andy Fleming00db8182005-07-30 19:31:23 -0400659
Trent Piepho51e2a382008-09-24 10:55:46 +0000660 if (adv != oldadv) {
661 err = phy_write(phydev, MII_ADVERTISE, adv);
Andy Fleming00db8182005-07-30 19:31:23 -0400662
Trent Piepho51e2a382008-09-24 10:55:46 +0000663 if (err < 0)
664 return err;
665 changed = 1;
666 }
Andy Fleming00db8182005-07-30 19:31:23 -0400667
668 /* Configure gigabit if it's supported */
669 if (phydev->supported & (SUPPORTED_1000baseT_Half |
670 SUPPORTED_1000baseT_Full)) {
Trent Piepho51e2a382008-09-24 10:55:46 +0000671 oldadv = adv = phy_read(phydev, MII_CTRL1000);
Andy Fleming00db8182005-07-30 19:31:23 -0400672
673 if (adv < 0)
674 return adv;
675
676 adv &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
Matt Carlson37f07022011-11-17 14:30:55 +0000677 adv |= ethtool_adv_to_mii_ctrl1000_t(advertise);
Andy Fleming00db8182005-07-30 19:31:23 -0400678
Trent Piepho51e2a382008-09-24 10:55:46 +0000679 if (adv != oldadv) {
680 err = phy_write(phydev, MII_CTRL1000, adv);
681
682 if (err < 0)
683 return err;
684 changed = 1;
685 }
Andy Fleming00db8182005-07-30 19:31:23 -0400686 }
687
Trent Piepho51e2a382008-09-24 10:55:46 +0000688 return changed;
Andy Fleming00db8182005-07-30 19:31:23 -0400689}
Andy Fleming00db8182005-07-30 19:31:23 -0400690
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800691/**
692 * genphy_setup_forced - configures/forces speed/duplex from @phydev
693 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400694 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800695 * Description: Configures MII_BMCR to force speed/duplex
Andy Fleming00db8182005-07-30 19:31:23 -0400696 * to the values in phydev. Assumes that the values are valid.
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800697 * Please see phy_sanitize_settings().
698 */
stephen hemminger89ff05e2010-10-21 08:37:41 +0000699static int genphy_setup_forced(struct phy_device *phydev)
Andy Fleming00db8182005-07-30 19:31:23 -0400700{
Andy Flemingf62220d2008-04-18 17:29:54 -0500701 int err;
Domen Puncerbc1e0a02007-08-17 08:54:45 +0200702 int ctl = 0;
Andy Fleming00db8182005-07-30 19:31:23 -0400703
704 phydev->pause = phydev->asym_pause = 0;
705
706 if (SPEED_1000 == phydev->speed)
707 ctl |= BMCR_SPEED1000;
708 else if (SPEED_100 == phydev->speed)
709 ctl |= BMCR_SPEED100;
710
711 if (DUPLEX_FULL == phydev->duplex)
712 ctl |= BMCR_FULLDPLX;
713
Andy Flemingf62220d2008-04-18 17:29:54 -0500714 err = phy_write(phydev, MII_BMCR, ctl);
Andy Fleming00db8182005-07-30 19:31:23 -0400715
Andy Flemingf62220d2008-04-18 17:29:54 -0500716 return err;
Andy Fleming00db8182005-07-30 19:31:23 -0400717}
718
719
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800720/**
721 * genphy_restart_aneg - Enable and Restart Autonegotiation
722 * @phydev: target phy_device struct
723 */
Andy Fleming00db8182005-07-30 19:31:23 -0400724int genphy_restart_aneg(struct phy_device *phydev)
725{
726 int ctl;
727
728 ctl = phy_read(phydev, MII_BMCR);
729
730 if (ctl < 0)
731 return ctl;
732
733 ctl |= (BMCR_ANENABLE | BMCR_ANRESTART);
734
735 /* Don't isolate the PHY if we're negotiating */
736 ctl &= ~(BMCR_ISOLATE);
737
738 ctl = phy_write(phydev, MII_BMCR, ctl);
739
740 return ctl;
741}
Adrian Bunk892871d2008-10-13 18:48:09 -0700742EXPORT_SYMBOL(genphy_restart_aneg);
Andy Fleming00db8182005-07-30 19:31:23 -0400743
744
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800745/**
746 * genphy_config_aneg - restart auto-negotiation or write BMCR
747 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400748 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800749 * Description: If auto-negotiation is enabled, we configure the
Andy Fleming00db8182005-07-30 19:31:23 -0400750 * advertising, and then restart auto-negotiation. If it is not
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800751 * enabled, then we write the BMCR.
Andy Fleming00db8182005-07-30 19:31:23 -0400752 */
753int genphy_config_aneg(struct phy_device *phydev)
754{
Trent Piephode339c22008-11-19 15:52:41 -0800755 int result;
Andy Fleming00db8182005-07-30 19:31:23 -0400756
Trent Piephode339c22008-11-19 15:52:41 -0800757 if (AUTONEG_ENABLE != phydev->autoneg)
758 return genphy_setup_forced(phydev);
Andy Fleming00db8182005-07-30 19:31:23 -0400759
Trent Piephode339c22008-11-19 15:52:41 -0800760 result = genphy_config_advert(phydev);
Andy Fleming00db8182005-07-30 19:31:23 -0400761
Trent Piephode339c22008-11-19 15:52:41 -0800762 if (result < 0) /* error */
763 return result;
764
765 if (result == 0) {
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300766 /* Advertisement hasn't changed, but maybe aneg was never on to
Trent Piephode339c22008-11-19 15:52:41 -0800767 * begin with? Or maybe phy was isolated? */
768 int ctl = phy_read(phydev, MII_BMCR);
769
770 if (ctl < 0)
771 return ctl;
772
773 if (!(ctl & BMCR_ANENABLE) || (ctl & BMCR_ISOLATE))
774 result = 1; /* do restart aneg */
775 }
776
777 /* Only restart aneg if we are advertising something different
778 * than we were before. */
779 if (result > 0)
780 result = genphy_restart_aneg(phydev);
Andy Fleming00db8182005-07-30 19:31:23 -0400781
Trent Piepho51e2a382008-09-24 10:55:46 +0000782 return result;
Andy Fleming00db8182005-07-30 19:31:23 -0400783}
784EXPORT_SYMBOL(genphy_config_aneg);
785
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800786/**
787 * genphy_update_link - update link status in @phydev
788 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400789 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800790 * Description: Update the value in phydev->link to reflect the
Andy Fleming00db8182005-07-30 19:31:23 -0400791 * current link value. In order to do this, we need to read
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800792 * the status register twice, keeping the second value.
Andy Fleming00db8182005-07-30 19:31:23 -0400793 */
794int genphy_update_link(struct phy_device *phydev)
795{
796 int status;
797
798 /* Do a fake read */
799 status = phy_read(phydev, MII_BMSR);
800
801 if (status < 0)
802 return status;
803
804 /* Read link and autonegotiation status */
805 status = phy_read(phydev, MII_BMSR);
806
807 if (status < 0)
808 return status;
809
810 if ((status & BMSR_LSTATUS) == 0)
811 phydev->link = 0;
812 else
813 phydev->link = 1;
814
815 return 0;
816}
Andy Fleming6b655522006-10-16 16:19:17 -0500817EXPORT_SYMBOL(genphy_update_link);
Andy Fleming00db8182005-07-30 19:31:23 -0400818
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800819/**
820 * genphy_read_status - check the link status and update current link state
821 * @phydev: target phy_device struct
Andy Fleming00db8182005-07-30 19:31:23 -0400822 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800823 * Description: Check the link, then figure out the current state
Andy Fleming00db8182005-07-30 19:31:23 -0400824 * by comparing what we advertise with what the link partner
825 * advertises. Start by checking the gigabit possibilities,
826 * then move on to 10/100.
827 */
828int genphy_read_status(struct phy_device *phydev)
829{
830 int adv;
831 int err;
832 int lpa;
833 int lpagb = 0;
834
835 /* Update the link, but return if there
836 * was an error */
837 err = genphy_update_link(phydev);
838 if (err)
839 return err;
840
841 if (AUTONEG_ENABLE == phydev->autoneg) {
842 if (phydev->supported & (SUPPORTED_1000baseT_Half
843 | SUPPORTED_1000baseT_Full)) {
844 lpagb = phy_read(phydev, MII_STAT1000);
845
846 if (lpagb < 0)
847 return lpagb;
848
849 adv = phy_read(phydev, MII_CTRL1000);
850
851 if (adv < 0)
852 return adv;
853
854 lpagb &= adv << 2;
855 }
856
857 lpa = phy_read(phydev, MII_LPA);
858
859 if (lpa < 0)
860 return lpa;
861
862 adv = phy_read(phydev, MII_ADVERTISE);
863
864 if (adv < 0)
865 return adv;
866
867 lpa &= adv;
868
869 phydev->speed = SPEED_10;
870 phydev->duplex = DUPLEX_HALF;
871 phydev->pause = phydev->asym_pause = 0;
872
873 if (lpagb & (LPA_1000FULL | LPA_1000HALF)) {
874 phydev->speed = SPEED_1000;
875
876 if (lpagb & LPA_1000FULL)
877 phydev->duplex = DUPLEX_FULL;
878 } else if (lpa & (LPA_100FULL | LPA_100HALF)) {
879 phydev->speed = SPEED_100;
880
881 if (lpa & LPA_100FULL)
882 phydev->duplex = DUPLEX_FULL;
883 } else
884 if (lpa & LPA_10FULL)
885 phydev->duplex = DUPLEX_FULL;
886
887 if (phydev->duplex == DUPLEX_FULL){
888 phydev->pause = lpa & LPA_PAUSE_CAP ? 1 : 0;
889 phydev->asym_pause = lpa & LPA_PAUSE_ASYM ? 1 : 0;
890 }
891 } else {
892 int bmcr = phy_read(phydev, MII_BMCR);
893 if (bmcr < 0)
894 return bmcr;
895
896 if (bmcr & BMCR_FULLDPLX)
897 phydev->duplex = DUPLEX_FULL;
898 else
899 phydev->duplex = DUPLEX_HALF;
900
901 if (bmcr & BMCR_SPEED1000)
902 phydev->speed = SPEED_1000;
903 else if (bmcr & BMCR_SPEED100)
904 phydev->speed = SPEED_100;
905 else
906 phydev->speed = SPEED_10;
907
908 phydev->pause = phydev->asym_pause = 0;
909 }
910
911 return 0;
912}
913EXPORT_SYMBOL(genphy_read_status);
914
915static int genphy_config_init(struct phy_device *phydev)
916{
Eric Sesterhenn84c22d72006-09-25 16:39:22 -0700917 int val;
Andy Fleming00db8182005-07-30 19:31:23 -0400918 u32 features;
919
920 /* For now, I'll claim that the generic driver supports
921 * all possible port types */
922 features = (SUPPORTED_TP | SUPPORTED_MII
923 | SUPPORTED_AUI | SUPPORTED_FIBRE |
924 SUPPORTED_BNC);
925
926 /* Do we support autonegotiation? */
927 val = phy_read(phydev, MII_BMSR);
928
929 if (val < 0)
930 return val;
931
932 if (val & BMSR_ANEGCAPABLE)
933 features |= SUPPORTED_Autoneg;
934
935 if (val & BMSR_100FULL)
936 features |= SUPPORTED_100baseT_Full;
937 if (val & BMSR_100HALF)
938 features |= SUPPORTED_100baseT_Half;
939 if (val & BMSR_10FULL)
940 features |= SUPPORTED_10baseT_Full;
941 if (val & BMSR_10HALF)
942 features |= SUPPORTED_10baseT_Half;
943
944 if (val & BMSR_ESTATEN) {
945 val = phy_read(phydev, MII_ESTATUS);
946
947 if (val < 0)
948 return val;
949
950 if (val & ESTATUS_1000_TFULL)
951 features |= SUPPORTED_1000baseT_Full;
952 if (val & ESTATUS_1000_THALF)
953 features |= SUPPORTED_1000baseT_Half;
954 }
955
956 phydev->supported = features;
957 phydev->advertising = features;
958
959 return 0;
960}
Giuseppe Cavallaro0f0ca342008-11-28 16:24:56 -0800961int genphy_suspend(struct phy_device *phydev)
962{
963 int value;
Andy Fleming00db8182005-07-30 19:31:23 -0400964
Giuseppe Cavallaro0f0ca342008-11-28 16:24:56 -0800965 mutex_lock(&phydev->lock);
966
967 value = phy_read(phydev, MII_BMCR);
968 phy_write(phydev, MII_BMCR, (value | BMCR_PDOWN));
969
970 mutex_unlock(&phydev->lock);
971
972 return 0;
973}
974EXPORT_SYMBOL(genphy_suspend);
975
976int genphy_resume(struct phy_device *phydev)
977{
978 int value;
979
980 mutex_lock(&phydev->lock);
981
982 value = phy_read(phydev, MII_BMCR);
983 phy_write(phydev, MII_BMCR, (value & ~BMCR_PDOWN));
984
985 mutex_unlock(&phydev->lock);
986
987 return 0;
988}
989EXPORT_SYMBOL(genphy_resume);
Andy Fleming00db8182005-07-30 19:31:23 -0400990
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800991/**
992 * phy_probe - probe and init a PHY device
993 * @dev: device to probe and init
Andy Fleming00db8182005-07-30 19:31:23 -0400994 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800995 * Description: Take care of setting up the phy_device structure,
Andy Fleming00db8182005-07-30 19:31:23 -0400996 * set the state to READY (the driver's init function should
997 * set it to STARTING if needed).
998 */
999static int phy_probe(struct device *dev)
1000{
1001 struct phy_device *phydev;
1002 struct phy_driver *phydrv;
1003 struct device_driver *drv;
1004 int err = 0;
1005
1006 phydev = to_phy_device(dev);
1007
Alan Sternf3ff9242012-01-24 13:35:24 -05001008 drv = phydev->dev.driver;
Andy Fleming00db8182005-07-30 19:31:23 -04001009 phydrv = to_phy_driver(drv);
1010 phydev->drv = phydrv;
1011
1012 /* Disable the interrupt if the PHY doesn't support it */
1013 if (!(phydrv->flags & PHY_HAS_INTERRUPT))
1014 phydev->irq = PHY_POLL;
1015
Nate Case35b5f6b2008-01-29 10:05:09 -06001016 mutex_lock(&phydev->lock);
Andy Fleming00db8182005-07-30 19:31:23 -04001017
1018 /* Start out supporting everything. Eventually,
1019 * a controller will attach, and may modify one
1020 * or both of these values */
1021 phydev->supported = phydrv->features;
1022 phydev->advertising = phydrv->features;
1023
1024 /* Set the state to READY by default */
1025 phydev->state = PHY_READY;
1026
1027 if (phydev->drv->probe)
1028 err = phydev->drv->probe(phydev);
1029
Nate Case35b5f6b2008-01-29 10:05:09 -06001030 mutex_unlock(&phydev->lock);
Andy Fleming00db8182005-07-30 19:31:23 -04001031
Andy Fleming00db8182005-07-30 19:31:23 -04001032 return err;
Andy Fleminge8a2b6a2006-12-01 12:01:06 -06001033
Andy Fleming00db8182005-07-30 19:31:23 -04001034}
1035
1036static int phy_remove(struct device *dev)
1037{
1038 struct phy_device *phydev;
1039
1040 phydev = to_phy_device(dev);
1041
Nate Case35b5f6b2008-01-29 10:05:09 -06001042 mutex_lock(&phydev->lock);
Andy Fleming00db8182005-07-30 19:31:23 -04001043 phydev->state = PHY_DOWN;
Nate Case35b5f6b2008-01-29 10:05:09 -06001044 mutex_unlock(&phydev->lock);
Andy Fleming00db8182005-07-30 19:31:23 -04001045
1046 if (phydev->drv->remove)
1047 phydev->drv->remove(phydev);
Andy Fleming00db8182005-07-30 19:31:23 -04001048 phydev->drv = NULL;
1049
1050 return 0;
1051}
1052
Randy Dunlapb3df0da2007-03-06 02:41:48 -08001053/**
1054 * phy_driver_register - register a phy_driver with the PHY layer
1055 * @new_driver: new phy_driver to register
1056 */
Andy Fleming00db8182005-07-30 19:31:23 -04001057int phy_driver_register(struct phy_driver *new_driver)
1058{
1059 int retval;
1060
Andy Fleming00db8182005-07-30 19:31:23 -04001061 new_driver->driver.name = new_driver->name;
1062 new_driver->driver.bus = &mdio_bus_type;
1063 new_driver->driver.probe = phy_probe;
1064 new_driver->driver.remove = phy_remove;
1065
1066 retval = driver_register(&new_driver->driver);
1067
1068 if (retval) {
Joe Perches8d242482012-06-09 07:49:07 +00001069 pr_err("%s: Error %d in registering driver\n",
1070 new_driver->name, retval);
Andy Fleming00db8182005-07-30 19:31:23 -04001071
1072 return retval;
1073 }
1074
Olof Johanssonf2511f12007-11-04 16:09:23 -06001075 pr_debug("%s: Registered new driver\n", new_driver->name);
Andy Fleming00db8182005-07-30 19:31:23 -04001076
1077 return 0;
1078}
1079EXPORT_SYMBOL(phy_driver_register);
1080
Christian Hohnstaedtd5bf9072012-07-04 05:44:34 +00001081int phy_drivers_register(struct phy_driver *new_driver, int n)
1082{
1083 int i, ret = 0;
1084
1085 for (i = 0; i < n; i++) {
1086 ret = phy_driver_register(new_driver + i);
1087 if (ret) {
1088 while (i-- > 0)
1089 phy_driver_unregister(new_driver + i);
1090 break;
1091 }
1092 }
1093 return ret;
1094}
1095EXPORT_SYMBOL(phy_drivers_register);
1096
Andy Fleming00db8182005-07-30 19:31:23 -04001097void phy_driver_unregister(struct phy_driver *drv)
1098{
1099 driver_unregister(&drv->driver);
1100}
1101EXPORT_SYMBOL(phy_driver_unregister);
1102
Christian Hohnstaedtd5bf9072012-07-04 05:44:34 +00001103void phy_drivers_unregister(struct phy_driver *drv, int n)
1104{
1105 int i;
1106 for (i = 0; i < n; i++) {
1107 phy_driver_unregister(drv + i);
1108 }
1109}
1110EXPORT_SYMBOL(phy_drivers_unregister);
1111
Andy Fleminge1393452005-08-24 18:46:21 -05001112static struct phy_driver genphy_driver = {
1113 .phy_id = 0xffffffff,
1114 .phy_id_mask = 0xffffffff,
1115 .name = "Generic PHY",
1116 .config_init = genphy_config_init,
1117 .features = 0,
1118 .config_aneg = genphy_config_aneg,
1119 .read_status = genphy_read_status,
Giuseppe Cavallaro0f0ca342008-11-28 16:24:56 -08001120 .suspend = genphy_suspend,
1121 .resume = genphy_resume,
Andy Fleminge1393452005-08-24 18:46:21 -05001122 .driver = {.owner= THIS_MODULE, },
1123};
Andy Fleming00db8182005-07-30 19:31:23 -04001124
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001125static int __init phy_init(void)
Andy Fleming00db8182005-07-30 19:31:23 -04001126{
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001127 int rc;
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001128
1129 rc = mdio_bus_init();
1130 if (rc)
Andy Fleminge1393452005-08-24 18:46:21 -05001131 return rc;
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001132
Andy Fleminge1393452005-08-24 18:46:21 -05001133 rc = phy_driver_register(&genphy_driver);
1134 if (rc)
1135 mdio_bus_exit();
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001136
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001137 return rc;
Andy Fleming00db8182005-07-30 19:31:23 -04001138}
1139
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001140static void __exit phy_exit(void)
Andy Fleming00db8182005-07-30 19:31:23 -04001141{
1142 phy_driver_unregister(&genphy_driver);
Andy Fleminge1393452005-08-24 18:46:21 -05001143 mdio_bus_exit();
Andy Fleming00db8182005-07-30 19:31:23 -04001144}
1145
Andy Fleminge1393452005-08-24 18:46:21 -05001146subsys_initcall(phy_init);
Jeff Garzik67c4f3f2005-08-11 02:07:25 -04001147module_exit(phy_exit);