1
2
3
4
5
6
7
8
9
10#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
11
12#include <linux/bitmap.h>
13#include <linux/delay.h>
14#include <linux/errno.h>
15#include <linux/etherdevice.h>
16#include <linux/ethtool.h>
17#include <linux/init.h>
18#include <linux/interrupt.h>
19#include <linux/io.h>
20#include <linux/kernel.h>
21#include <linux/mdio.h>
22#include <linux/mii.h>
23#include <linux/mm.h>
24#include <linux/module.h>
25#include <linux/netdevice.h>
26#include <linux/phy.h>
27#include <linux/phy_led_triggers.h>
28#include <linux/property.h>
29#include <linux/sfp.h>
30#include <linux/skbuff.h>
31#include <linux/slab.h>
32#include <linux/string.h>
33#include <linux/uaccess.h>
34#include <linux/unistd.h>
35
36MODULE_DESCRIPTION("PHY library");
37MODULE_AUTHOR("Andy Fleming");
38MODULE_LICENSE("GPL");
39
40__ETHTOOL_DECLARE_LINK_MODE_MASK(phy_basic_features) __ro_after_init;
41EXPORT_SYMBOL_GPL(phy_basic_features);
42
43__ETHTOOL_DECLARE_LINK_MODE_MASK(phy_basic_t1_features) __ro_after_init;
44EXPORT_SYMBOL_GPL(phy_basic_t1_features);
45
46__ETHTOOL_DECLARE_LINK_MODE_MASK(phy_gbit_features) __ro_after_init;
47EXPORT_SYMBOL_GPL(phy_gbit_features);
48
49__ETHTOOL_DECLARE_LINK_MODE_MASK(phy_gbit_fibre_features) __ro_after_init;
50EXPORT_SYMBOL_GPL(phy_gbit_fibre_features);
51
52__ETHTOOL_DECLARE_LINK_MODE_MASK(phy_gbit_all_ports_features) __ro_after_init;
53EXPORT_SYMBOL_GPL(phy_gbit_all_ports_features);
54
55__ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_features) __ro_after_init;
56EXPORT_SYMBOL_GPL(phy_10gbit_features);
57
58__ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_fec_features) __ro_after_init;
59EXPORT_SYMBOL_GPL(phy_10gbit_fec_features);
60
61const int phy_basic_ports_array[3] = {
62 ETHTOOL_LINK_MODE_Autoneg_BIT,
63 ETHTOOL_LINK_MODE_TP_BIT,
64 ETHTOOL_LINK_MODE_MII_BIT,
65};
66EXPORT_SYMBOL_GPL(phy_basic_ports_array);
67
68const int phy_fibre_port_array[1] = {
69 ETHTOOL_LINK_MODE_FIBRE_BIT,
70};
71EXPORT_SYMBOL_GPL(phy_fibre_port_array);
72
73const int phy_all_ports_features_array[7] = {
74 ETHTOOL_LINK_MODE_Autoneg_BIT,
75 ETHTOOL_LINK_MODE_TP_BIT,
76 ETHTOOL_LINK_MODE_MII_BIT,
77 ETHTOOL_LINK_MODE_FIBRE_BIT,
78 ETHTOOL_LINK_MODE_AUI_BIT,
79 ETHTOOL_LINK_MODE_BNC_BIT,
80 ETHTOOL_LINK_MODE_Backplane_BIT,
81};
82EXPORT_SYMBOL_GPL(phy_all_ports_features_array);
83
84const int phy_10_100_features_array[4] = {
85 ETHTOOL_LINK_MODE_10baseT_Half_BIT,
86 ETHTOOL_LINK_MODE_10baseT_Full_BIT,
87 ETHTOOL_LINK_MODE_100baseT_Half_BIT,
88 ETHTOOL_LINK_MODE_100baseT_Full_BIT,
89};
90EXPORT_SYMBOL_GPL(phy_10_100_features_array);
91
92const int phy_basic_t1_features_array[2] = {
93 ETHTOOL_LINK_MODE_TP_BIT,
94 ETHTOOL_LINK_MODE_100baseT1_Full_BIT,
95};
96EXPORT_SYMBOL_GPL(phy_basic_t1_features_array);
97
98const int phy_gbit_features_array[2] = {
99 ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
100 ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
101};
102EXPORT_SYMBOL_GPL(phy_gbit_features_array);
103
104const int phy_10gbit_features_array[1] = {
105 ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
106};
107EXPORT_SYMBOL_GPL(phy_10gbit_features_array);
108
109static const int phy_10gbit_fec_features_array[1] = {
110 ETHTOOL_LINK_MODE_10000baseR_FEC_BIT,
111};
112
113__ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_full_features) __ro_after_init;
114EXPORT_SYMBOL_GPL(phy_10gbit_full_features);
115
116static const int phy_10gbit_full_features_array[] = {
117 ETHTOOL_LINK_MODE_10baseT_Full_BIT,
118 ETHTOOL_LINK_MODE_100baseT_Full_BIT,
119 ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
120 ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
121};
122
123static void features_init(void)
124{
125
126 linkmode_set_bit_array(phy_basic_ports_array,
127 ARRAY_SIZE(phy_basic_ports_array),
128 phy_basic_features);
129 linkmode_set_bit_array(phy_10_100_features_array,
130 ARRAY_SIZE(phy_10_100_features_array),
131 phy_basic_features);
132
133
134 linkmode_set_bit_array(phy_basic_t1_features_array,
135 ARRAY_SIZE(phy_basic_t1_features_array),
136 phy_basic_t1_features);
137
138
139 linkmode_set_bit_array(phy_basic_ports_array,
140 ARRAY_SIZE(phy_basic_ports_array),
141 phy_gbit_features);
142 linkmode_set_bit_array(phy_10_100_features_array,
143 ARRAY_SIZE(phy_10_100_features_array),
144 phy_gbit_features);
145 linkmode_set_bit_array(phy_gbit_features_array,
146 ARRAY_SIZE(phy_gbit_features_array),
147 phy_gbit_features);
148
149
150 linkmode_set_bit_array(phy_basic_ports_array,
151 ARRAY_SIZE(phy_basic_ports_array),
152 phy_gbit_fibre_features);
153 linkmode_set_bit_array(phy_10_100_features_array,
154 ARRAY_SIZE(phy_10_100_features_array),
155 phy_gbit_fibre_features);
156 linkmode_set_bit_array(phy_gbit_features_array,
157 ARRAY_SIZE(phy_gbit_features_array),
158 phy_gbit_fibre_features);
159 linkmode_set_bit_array(phy_fibre_port_array,
160 ARRAY_SIZE(phy_fibre_port_array),
161 phy_gbit_fibre_features);
162
163
164 linkmode_set_bit_array(phy_all_ports_features_array,
165 ARRAY_SIZE(phy_all_ports_features_array),
166 phy_gbit_all_ports_features);
167 linkmode_set_bit_array(phy_10_100_features_array,
168 ARRAY_SIZE(phy_10_100_features_array),
169 phy_gbit_all_ports_features);
170 linkmode_set_bit_array(phy_gbit_features_array,
171 ARRAY_SIZE(phy_gbit_features_array),
172 phy_gbit_all_ports_features);
173
174
175 linkmode_set_bit_array(phy_all_ports_features_array,
176 ARRAY_SIZE(phy_all_ports_features_array),
177 phy_10gbit_features);
178 linkmode_set_bit_array(phy_10_100_features_array,
179 ARRAY_SIZE(phy_10_100_features_array),
180 phy_10gbit_features);
181 linkmode_set_bit_array(phy_gbit_features_array,
182 ARRAY_SIZE(phy_gbit_features_array),
183 phy_10gbit_features);
184 linkmode_set_bit_array(phy_10gbit_features_array,
185 ARRAY_SIZE(phy_10gbit_features_array),
186 phy_10gbit_features);
187
188
189 linkmode_set_bit_array(phy_all_ports_features_array,
190 ARRAY_SIZE(phy_all_ports_features_array),
191 phy_10gbit_full_features);
192 linkmode_set_bit_array(phy_10gbit_full_features_array,
193 ARRAY_SIZE(phy_10gbit_full_features_array),
194 phy_10gbit_full_features);
195
196 linkmode_set_bit_array(phy_10gbit_fec_features_array,
197 ARRAY_SIZE(phy_10gbit_fec_features_array),
198 phy_10gbit_fec_features);
199}
200
201void phy_device_free(struct phy_device *phydev)
202{
203 put_device(&phydev->mdio.dev);
204}
205EXPORT_SYMBOL(phy_device_free);
206
207static void phy_mdio_device_free(struct mdio_device *mdiodev)
208{
209 struct phy_device *phydev;
210
211 phydev = container_of(mdiodev, struct phy_device, mdio);
212 phy_device_free(phydev);
213}
214
215static void phy_device_release(struct device *dev)
216{
217 kfree(to_phy_device(dev));
218}
219
220static void phy_mdio_device_remove(struct mdio_device *mdiodev)
221{
222 struct phy_device *phydev;
223
224 phydev = container_of(mdiodev, struct phy_device, mdio);
225 phy_device_remove(phydev);
226}
227
228static struct phy_driver genphy_driver;
229
230static LIST_HEAD(phy_fixup_list);
231static DEFINE_MUTEX(phy_fixup_lock);
232
233static bool mdio_bus_phy_may_suspend(struct phy_device *phydev)
234{
235 struct device_driver *drv = phydev->mdio.dev.driver;
236 struct phy_driver *phydrv = to_phy_driver(drv);
237 struct net_device *netdev = phydev->attached_dev;
238
239 if (!drv || !phydrv->suspend)
240 return false;
241
242
243
244
245
246
247 if (!netdev)
248 goto out;
249
250 if (netdev->wol_enabled)
251 return false;
252
253
254
255
256
257
258 if (netdev->dev.parent && device_may_wakeup(netdev->dev.parent))
259 return false;
260
261
262
263
264
265 if (device_may_wakeup(&netdev->dev))
266 return false;
267
268out:
269 return !phydev->suspended;
270}
271
272static __maybe_unused int mdio_bus_phy_suspend(struct device *dev)
273{
274 struct phy_device *phydev = to_phy_device(dev);
275
276 if (phydev->mac_managed_pm)
277 return 0;
278
279
280
281
282
283
284 if (phydev->attached_dev && phydev->adjust_link)
285 phy_stop_machine(phydev);
286
287 if (!mdio_bus_phy_may_suspend(phydev))
288 return 0;
289
290 phydev->suspended_by_mdio_bus = 1;
291
292 return phy_suspend(phydev);
293}
294
295static __maybe_unused int mdio_bus_phy_resume(struct device *dev)
296{
297 struct phy_device *phydev = to_phy_device(dev);
298 int ret;
299
300 if (phydev->mac_managed_pm)
301 return 0;
302
303 if (!phydev->suspended_by_mdio_bus)
304 goto no_resume;
305
306 phydev->suspended_by_mdio_bus = 0;
307
308 ret = phy_init_hw(phydev);
309 if (ret < 0)
310 return ret;
311
312 ret = phy_resume(phydev);
313 if (ret < 0)
314 return ret;
315no_resume:
316 if (phydev->attached_dev && phydev->adjust_link)
317 phy_start_machine(phydev);
318
319 return 0;
320}
321
322static SIMPLE_DEV_PM_OPS(mdio_bus_phy_pm_ops, mdio_bus_phy_suspend,
323 mdio_bus_phy_resume);
324
325
326
327
328
329
330
331
332
333
334int phy_register_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask,
335 int (*run)(struct phy_device *))
336{
337 struct phy_fixup *fixup = kzalloc(sizeof(*fixup), GFP_KERNEL);
338
339 if (!fixup)
340 return -ENOMEM;
341
342 strlcpy(fixup->bus_id, bus_id, sizeof(fixup->bus_id));
343 fixup->phy_uid = phy_uid;
344 fixup->phy_uid_mask = phy_uid_mask;
345 fixup->run = run;
346
347 mutex_lock(&phy_fixup_lock);
348 list_add_tail(&fixup->list, &phy_fixup_list);
349 mutex_unlock(&phy_fixup_lock);
350
351 return 0;
352}
353EXPORT_SYMBOL(phy_register_fixup);
354
355
356int phy_register_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask,
357 int (*run)(struct phy_device *))
358{
359 return phy_register_fixup(PHY_ANY_ID, phy_uid, phy_uid_mask, run);
360}
361EXPORT_SYMBOL(phy_register_fixup_for_uid);
362
363
364int phy_register_fixup_for_id(const char *bus_id,
365 int (*run)(struct phy_device *))
366{
367 return phy_register_fixup(bus_id, PHY_ANY_UID, 0xffffffff, run);
368}
369EXPORT_SYMBOL(phy_register_fixup_for_id);
370
371
372
373
374
375
376
377int phy_unregister_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask)
378{
379 struct list_head *pos, *n;
380 struct phy_fixup *fixup;
381 int ret;
382
383 ret = -ENODEV;
384
385 mutex_lock(&phy_fixup_lock);
386 list_for_each_safe(pos, n, &phy_fixup_list) {
387 fixup = list_entry(pos, struct phy_fixup, list);
388
389 if ((!strcmp(fixup->bus_id, bus_id)) &&
390 ((fixup->phy_uid & phy_uid_mask) ==
391 (phy_uid & phy_uid_mask))) {
392 list_del(&fixup->list);
393 kfree(fixup);
394 ret = 0;
395 break;
396 }
397 }
398 mutex_unlock(&phy_fixup_lock);
399
400 return ret;
401}
402EXPORT_SYMBOL(phy_unregister_fixup);
403
404
405int phy_unregister_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask)
406{
407 return phy_unregister_fixup(PHY_ANY_ID, phy_uid, phy_uid_mask);
408}
409EXPORT_SYMBOL(phy_unregister_fixup_for_uid);
410
411
412int phy_unregister_fixup_for_id(const char *bus_id)
413{
414 return phy_unregister_fixup(bus_id, PHY_ANY_UID, 0xffffffff);
415}
416EXPORT_SYMBOL(phy_unregister_fixup_for_id);
417
418
419
420
421static int phy_needs_fixup(struct phy_device *phydev, struct phy_fixup *fixup)
422{
423 if (strcmp(fixup->bus_id, phydev_name(phydev)) != 0)
424 if (strcmp(fixup->bus_id, PHY_ANY_ID) != 0)
425 return 0;
426
427 if ((fixup->phy_uid & fixup->phy_uid_mask) !=
428 (phydev->phy_id & fixup->phy_uid_mask))
429 if (fixup->phy_uid != PHY_ANY_UID)
430 return 0;
431
432 return 1;
433}
434
435
436static int phy_scan_fixups(struct phy_device *phydev)
437{
438 struct phy_fixup *fixup;
439
440 mutex_lock(&phy_fixup_lock);
441 list_for_each_entry(fixup, &phy_fixup_list, list) {
442 if (phy_needs_fixup(phydev, fixup)) {
443 int err = fixup->run(phydev);
444
445 if (err < 0) {
446 mutex_unlock(&phy_fixup_lock);
447 return err;
448 }
449 phydev->has_fixups = true;
450 }
451 }
452 mutex_unlock(&phy_fixup_lock);
453
454 return 0;
455}
456
457static int phy_bus_match(struct device *dev, struct device_driver *drv)
458{
459 struct phy_device *phydev = to_phy_device(dev);
460 struct phy_driver *phydrv = to_phy_driver(drv);
461 const int num_ids = ARRAY_SIZE(phydev->c45_ids.device_ids);
462 int i;
463
464 if (!(phydrv->mdiodrv.flags & MDIO_DEVICE_IS_PHY))
465 return 0;
466
467 if (phydrv->match_phy_device)
468 return phydrv->match_phy_device(phydev);
469
470 if (phydev->is_c45) {
471 for (i = 1; i < num_ids; i++) {
472 if (phydev->c45_ids.device_ids[i] == 0xffffffff)
473 continue;
474
475 if ((phydrv->phy_id & phydrv->phy_id_mask) ==
476 (phydev->c45_ids.device_ids[i] &
477 phydrv->phy_id_mask))
478 return 1;
479 }
480 return 0;
481 } else {
482 return (phydrv->phy_id & phydrv->phy_id_mask) ==
483 (phydev->phy_id & phydrv->phy_id_mask);
484 }
485}
486
487static ssize_t
488phy_id_show(struct device *dev, struct device_attribute *attr, char *buf)
489{
490 struct phy_device *phydev = to_phy_device(dev);
491
492 return sprintf(buf, "0x%.8lx\n", (unsigned long)phydev->phy_id);
493}
494static DEVICE_ATTR_RO(phy_id);
495
496static ssize_t
497phy_interface_show(struct device *dev, struct device_attribute *attr, char *buf)
498{
499 struct phy_device *phydev = to_phy_device(dev);
500 const char *mode = NULL;
501
502 if (phy_is_internal(phydev))
503 mode = "internal";
504 else
505 mode = phy_modes(phydev->interface);
506
507 return sprintf(buf, "%s\n", mode);
508}
509static DEVICE_ATTR_RO(phy_interface);
510
511static ssize_t
512phy_has_fixups_show(struct device *dev, struct device_attribute *attr,
513 char *buf)
514{
515 struct phy_device *phydev = to_phy_device(dev);
516
517 return sprintf(buf, "%d\n", phydev->has_fixups);
518}
519static DEVICE_ATTR_RO(phy_has_fixups);
520
521static ssize_t phy_dev_flags_show(struct device *dev,
522 struct device_attribute *attr,
523 char *buf)
524{
525 struct phy_device *phydev = to_phy_device(dev);
526
527 return sprintf(buf, "0x%08x\n", phydev->dev_flags);
528}
529static DEVICE_ATTR_RO(phy_dev_flags);
530
531static struct attribute *phy_dev_attrs[] = {
532 &dev_attr_phy_id.attr,
533 &dev_attr_phy_interface.attr,
534 &dev_attr_phy_has_fixups.attr,
535 &dev_attr_phy_dev_flags.attr,
536 NULL,
537};
538ATTRIBUTE_GROUPS(phy_dev);
539
540static const struct device_type mdio_bus_phy_type = {
541 .name = "PHY",
542 .groups = phy_dev_groups,
543 .release = phy_device_release,
544 .pm = pm_ptr(&mdio_bus_phy_pm_ops),
545};
546
547static int phy_request_driver_module(struct phy_device *dev, u32 phy_id)
548{
549 int ret;
550
551 ret = request_module(MDIO_MODULE_PREFIX MDIO_ID_FMT,
552 MDIO_ID_ARGS(phy_id));
553
554
555
556
557
558 if (IS_ENABLED(CONFIG_MODULES) && ret < 0 && ret != -ENOENT) {
559 phydev_err(dev, "error %d loading PHY driver module for ID 0x%08lx\n",
560 ret, (unsigned long)phy_id);
561 return ret;
562 }
563
564 return 0;
565}
566
567struct phy_device *phy_device_create(struct mii_bus *bus, int addr, u32 phy_id,
568 bool is_c45,
569 struct phy_c45_device_ids *c45_ids)
570{
571 struct phy_device *dev;
572 struct mdio_device *mdiodev;
573 int ret = 0;
574
575
576 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
577 if (!dev)
578 return ERR_PTR(-ENOMEM);
579
580 mdiodev = &dev->mdio;
581 mdiodev->dev.parent = &bus->dev;
582 mdiodev->dev.bus = &mdio_bus_type;
583 mdiodev->dev.type = &mdio_bus_phy_type;
584 mdiodev->bus = bus;
585 mdiodev->bus_match = phy_bus_match;
586 mdiodev->addr = addr;
587 mdiodev->flags = MDIO_DEVICE_FLAG_PHY;
588 mdiodev->device_free = phy_mdio_device_free;
589 mdiodev->device_remove = phy_mdio_device_remove;
590
591 dev->speed = SPEED_UNKNOWN;
592 dev->duplex = DUPLEX_UNKNOWN;
593 dev->pause = 0;
594 dev->asym_pause = 0;
595 dev->link = 0;
596 dev->port = PORT_TP;
597 dev->interface = PHY_INTERFACE_MODE_GMII;
598
599 dev->autoneg = AUTONEG_ENABLE;
600
601 dev->is_c45 = is_c45;
602 dev->phy_id = phy_id;
603 if (c45_ids)
604 dev->c45_ids = *c45_ids;
605 dev->irq = bus->irq[addr];
606
607 dev_set_name(&mdiodev->dev, PHY_ID_FMT, bus->id, addr);
608 device_initialize(&mdiodev->dev);
609
610 dev->state = PHY_DOWN;
611
612 mutex_init(&dev->lock);
613 INIT_DELAYED_WORK(&dev->state_queue, phy_state_machine);
614
615
616
617
618
619
620
621
622
623
624
625 if (is_c45 && c45_ids) {
626 const int num_ids = ARRAY_SIZE(c45_ids->device_ids);
627 int i;
628
629 for (i = 1; i < num_ids; i++) {
630 if (c45_ids->device_ids[i] == 0xffffffff)
631 continue;
632
633 ret = phy_request_driver_module(dev,
634 c45_ids->device_ids[i]);
635 if (ret)
636 break;
637 }
638 } else {
639 ret = phy_request_driver_module(dev, phy_id);
640 }
641
642 if (ret) {
643 put_device(&mdiodev->dev);
644 dev = ERR_PTR(ret);
645 }
646
647 return dev;
648}
649EXPORT_SYMBOL(phy_device_create);
650
651
652
653
654
655
656
657
658
659
660
661
662static int phy_c45_probe_present(struct mii_bus *bus, int prtad, int devad)
663{
664 int stat2;
665
666 stat2 = mdiobus_c45_read(bus, prtad, devad, MDIO_STAT2);
667 if (stat2 < 0)
668 return stat2;
669
670 return (stat2 & MDIO_STAT2_DEVPRST) == MDIO_STAT2_DEVPRST_VAL;
671}
672
673
674
675
676
677
678
679
680
681
682
683
684static int get_phy_c45_devs_in_pkg(struct mii_bus *bus, int addr, int dev_addr,
685 u32 *devices_in_package)
686{
687 int phy_reg;
688
689 phy_reg = mdiobus_c45_read(bus, addr, dev_addr, MDIO_DEVS2);
690 if (phy_reg < 0)
691 return -EIO;
692 *devices_in_package = phy_reg << 16;
693
694 phy_reg = mdiobus_c45_read(bus, addr, dev_addr, MDIO_DEVS1);
695 if (phy_reg < 0)
696 return -EIO;
697 *devices_in_package |= phy_reg;
698
699 return 0;
700}
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715static int get_phy_c45_ids(struct mii_bus *bus, int addr,
716 struct phy_c45_device_ids *c45_ids)
717{
718 const int num_ids = ARRAY_SIZE(c45_ids->device_ids);
719 u32 devs_in_pkg = 0;
720 int i, ret, phy_reg;
721
722
723
724
725 for (i = 1; i < MDIO_MMD_NUM && (devs_in_pkg == 0 ||
726 (devs_in_pkg & 0x1fffffff) == 0x1fffffff); i++) {
727 if (i == MDIO_MMD_VEND1 || i == MDIO_MMD_VEND2) {
728
729
730
731
732
733
734 ret = phy_c45_probe_present(bus, addr, i);
735 if (ret < 0)
736 return -EIO;
737
738 if (!ret)
739 continue;
740 }
741 phy_reg = get_phy_c45_devs_in_pkg(bus, addr, i, &devs_in_pkg);
742 if (phy_reg < 0)
743 return -EIO;
744 }
745
746 if ((devs_in_pkg & 0x1fffffff) == 0x1fffffff) {
747
748
749
750
751 phy_reg = get_phy_c45_devs_in_pkg(bus, addr, 0, &devs_in_pkg);
752 if (phy_reg < 0)
753 return -EIO;
754
755
756 if ((devs_in_pkg & 0x1fffffff) == 0x1fffffff)
757 return -ENODEV;
758 }
759
760
761 for (i = 1; i < num_ids; i++) {
762 if (!(devs_in_pkg & (1 << i)))
763 continue;
764
765 if (i == MDIO_MMD_VEND1 || i == MDIO_MMD_VEND2) {
766
767
768
769
770 ret = phy_c45_probe_present(bus, addr, i);
771 if (ret < 0)
772 return ret;
773
774 if (!ret)
775 continue;
776 }
777
778 phy_reg = mdiobus_c45_read(bus, addr, i, MII_PHYSID1);
779 if (phy_reg < 0)
780 return -EIO;
781 c45_ids->device_ids[i] = phy_reg << 16;
782
783 phy_reg = mdiobus_c45_read(bus, addr, i, MII_PHYSID2);
784 if (phy_reg < 0)
785 return -EIO;
786 c45_ids->device_ids[i] |= phy_reg;
787 }
788
789 c45_ids->devices_in_package = devs_in_pkg;
790
791 c45_ids->mmds_present = devs_in_pkg & ~BIT(0);
792
793 return 0;
794}
795
796
797
798
799
800
801
802
803
804
805
806
807static int get_phy_c22_id(struct mii_bus *bus, int addr, u32 *phy_id)
808{
809 int phy_reg;
810
811
812 phy_reg = mdiobus_read(bus, addr, MII_PHYSID1);
813 if (phy_reg < 0) {
814
815 return (phy_reg == -EIO || phy_reg == -ENODEV) ? -ENODEV : -EIO;
816 }
817
818 *phy_id = phy_reg << 16;
819
820
821 phy_reg = mdiobus_read(bus, addr, MII_PHYSID2);
822 if (phy_reg < 0) {
823
824 return (phy_reg == -EIO || phy_reg == -ENODEV) ? -ENODEV : -EIO;
825 }
826
827 *phy_id |= phy_reg;
828
829
830 if ((*phy_id & 0x1fffffff) == 0x1fffffff)
831 return -ENODEV;
832
833 return 0;
834}
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855struct phy_device *get_phy_device(struct mii_bus *bus, int addr, bool is_c45)
856{
857 struct phy_c45_device_ids c45_ids;
858 u32 phy_id = 0;
859 int r;
860
861 c45_ids.devices_in_package = 0;
862 c45_ids.mmds_present = 0;
863 memset(c45_ids.device_ids, 0xff, sizeof(c45_ids.device_ids));
864
865 if (is_c45)
866 r = get_phy_c45_ids(bus, addr, &c45_ids);
867 else
868 r = get_phy_c22_id(bus, addr, &phy_id);
869
870 if (r)
871 return ERR_PTR(r);
872
873 return phy_device_create(bus, addr, phy_id, is_c45, &c45_ids);
874}
875EXPORT_SYMBOL(get_phy_device);
876
877
878
879
880
881int phy_device_register(struct phy_device *phydev)
882{
883 int err;
884
885 err = mdiobus_register_device(&phydev->mdio);
886 if (err)
887 return err;
888
889
890 phy_device_reset(phydev, 0);
891
892
893 err = phy_scan_fixups(phydev);
894 if (err) {
895 phydev_err(phydev, "failed to initialize\n");
896 goto out;
897 }
898
899 err = device_add(&phydev->mdio.dev);
900 if (err) {
901 phydev_err(phydev, "failed to add\n");
902 goto out;
903 }
904
905 return 0;
906
907 out:
908
909 phy_device_reset(phydev, 1);
910
911 mdiobus_unregister_device(&phydev->mdio);
912 return err;
913}
914EXPORT_SYMBOL(phy_device_register);
915
916
917
918
919
920
921
922
923
924void phy_device_remove(struct phy_device *phydev)
925{
926 if (phydev->mii_ts)
927 unregister_mii_timestamper(phydev->mii_ts);
928
929 device_del(&phydev->mdio.dev);
930
931
932 phy_device_reset(phydev, 1);
933
934 mdiobus_unregister_device(&phydev->mdio);
935}
936EXPORT_SYMBOL(phy_device_remove);
937
938
939
940
941
942struct phy_device *phy_find_first(struct mii_bus *bus)
943{
944 struct phy_device *phydev;
945 int addr;
946
947 for (addr = 0; addr < PHY_MAX_ADDR; addr++) {
948 phydev = mdiobus_get_phy(bus, addr);
949 if (phydev)
950 return phydev;
951 }
952 return NULL;
953}
954EXPORT_SYMBOL(phy_find_first);
955
956static void phy_link_change(struct phy_device *phydev, bool up)
957{
958 struct net_device *netdev = phydev->attached_dev;
959
960 if (up)
961 netif_carrier_on(netdev);
962 else
963 netif_carrier_off(netdev);
964 phydev->adjust_link(netdev);
965 if (phydev->mii_ts && phydev->mii_ts->link_state)
966 phydev->mii_ts->link_state(phydev->mii_ts, phydev);
967}
968
969
970
971
972
973
974
975
976
977
978
979
980
981static void phy_prepare_link(struct phy_device *phydev,
982 void (*handler)(struct net_device *))
983{
984 phydev->adjust_link = handler;
985}
986
987
988
989
990
991
992
993
994int phy_connect_direct(struct net_device *dev, struct phy_device *phydev,
995 void (*handler)(struct net_device *),
996 phy_interface_t interface)
997{
998 int rc;
999
1000 if (!dev)
1001 return -EINVAL;
1002
1003 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface);
1004 if (rc)
1005 return rc;
1006
1007 phy_prepare_link(phydev, handler);
1008 if (phy_interrupt_is_valid(phydev))
1009 phy_request_interrupt(phydev);
1010
1011 return 0;
1012}
1013EXPORT_SYMBOL(phy_connect_direct);
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030struct phy_device *phy_connect(struct net_device *dev, const char *bus_id,
1031 void (*handler)(struct net_device *),
1032 phy_interface_t interface)
1033{
1034 struct phy_device *phydev;
1035 struct device *d;
1036 int rc;
1037
1038
1039
1040
1041 d = bus_find_device_by_name(&mdio_bus_type, NULL, bus_id);
1042 if (!d) {
1043 pr_err("PHY %s not found\n", bus_id);
1044 return ERR_PTR(-ENODEV);
1045 }
1046 phydev = to_phy_device(d);
1047
1048 rc = phy_connect_direct(dev, phydev, handler, interface);
1049 put_device(d);
1050 if (rc)
1051 return ERR_PTR(rc);
1052
1053 return phydev;
1054}
1055EXPORT_SYMBOL(phy_connect);
1056
1057
1058
1059
1060
1061
1062void phy_disconnect(struct phy_device *phydev)
1063{
1064 if (phy_is_started(phydev))
1065 phy_stop(phydev);
1066
1067 if (phy_interrupt_is_valid(phydev))
1068 phy_free_interrupt(phydev);
1069
1070 phydev->adjust_link = NULL;
1071
1072 phy_detach(phydev);
1073}
1074EXPORT_SYMBOL(phy_disconnect);
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094static int phy_poll_reset(struct phy_device *phydev)
1095{
1096
1097 int ret, val;
1098
1099 ret = phy_read_poll_timeout(phydev, MII_BMCR, val, !(val & BMCR_RESET),
1100 50000, 600000, true);
1101 if (ret)
1102 return ret;
1103
1104
1105
1106 msleep(1);
1107 return 0;
1108}
1109
1110int phy_init_hw(struct phy_device *phydev)
1111{
1112 int ret = 0;
1113
1114
1115 phy_device_reset(phydev, 0);
1116
1117 if (!phydev->drv)
1118 return 0;
1119
1120 if (phydev->drv->soft_reset) {
1121 ret = phydev->drv->soft_reset(phydev);
1122
1123 if (!ret)
1124 phydev->suspended = 0;
1125 }
1126
1127 if (ret < 0)
1128 return ret;
1129
1130 ret = phy_scan_fixups(phydev);
1131 if (ret < 0)
1132 return ret;
1133
1134 if (phydev->drv->config_init) {
1135 ret = phydev->drv->config_init(phydev);
1136 if (ret < 0)
1137 return ret;
1138 }
1139
1140 if (phydev->drv->config_intr) {
1141 ret = phydev->drv->config_intr(phydev);
1142 if (ret < 0)
1143 return ret;
1144 }
1145
1146 return 0;
1147}
1148EXPORT_SYMBOL(phy_init_hw);
1149
1150void phy_attached_info(struct phy_device *phydev)
1151{
1152 phy_attached_print(phydev, NULL);
1153}
1154EXPORT_SYMBOL(phy_attached_info);
1155
1156#define ATTACHED_FMT "attached PHY driver %s(mii_bus:phy_addr=%s, irq=%s)"
1157char *phy_attached_info_irq(struct phy_device *phydev)
1158{
1159 char *irq_str;
1160 char irq_num[8];
1161
1162 switch(phydev->irq) {
1163 case PHY_POLL:
1164 irq_str = "POLL";
1165 break;
1166 case PHY_MAC_INTERRUPT:
1167 irq_str = "MAC";
1168 break;
1169 default:
1170 snprintf(irq_num, sizeof(irq_num), "%d", phydev->irq);
1171 irq_str = irq_num;
1172 break;
1173 }
1174
1175 return kasprintf(GFP_KERNEL, "%s", irq_str);
1176}
1177EXPORT_SYMBOL(phy_attached_info_irq);
1178
1179void phy_attached_print(struct phy_device *phydev, const char *fmt, ...)
1180{
1181 const char *unbound = phydev->drv ? "" : "[unbound] ";
1182 char *irq_str = phy_attached_info_irq(phydev);
1183
1184 if (!fmt) {
1185 phydev_info(phydev, ATTACHED_FMT "\n", unbound,
1186 phydev_name(phydev), irq_str);
1187 } else {
1188 va_list ap;
1189
1190 phydev_info(phydev, ATTACHED_FMT, unbound,
1191 phydev_name(phydev), irq_str);
1192
1193 va_start(ap, fmt);
1194 vprintk(fmt, ap);
1195 va_end(ap);
1196 }
1197 kfree(irq_str);
1198}
1199EXPORT_SYMBOL(phy_attached_print);
1200
1201static void phy_sysfs_create_links(struct phy_device *phydev)
1202{
1203 struct net_device *dev = phydev->attached_dev;
1204 int err;
1205
1206 if (!dev)
1207 return;
1208
1209 err = sysfs_create_link(&phydev->mdio.dev.kobj, &dev->dev.kobj,
1210 "attached_dev");
1211 if (err)
1212 return;
1213
1214 err = sysfs_create_link_nowarn(&dev->dev.kobj,
1215 &phydev->mdio.dev.kobj,
1216 "phydev");
1217 if (err) {
1218 dev_err(&dev->dev, "could not add device link to %s err %d\n",
1219 kobject_name(&phydev->mdio.dev.kobj),
1220 err);
1221
1222
1223
1224 }
1225
1226 phydev->sysfs_links = true;
1227}
1228
1229static ssize_t
1230phy_standalone_show(struct device *dev, struct device_attribute *attr,
1231 char *buf)
1232{
1233 struct phy_device *phydev = to_phy_device(dev);
1234
1235 return sprintf(buf, "%d\n", !phydev->attached_dev);
1236}
1237static DEVICE_ATTR_RO(phy_standalone);
1238
1239
1240
1241
1242
1243
1244
1245
1246void phy_sfp_attach(void *upstream, struct sfp_bus *bus)
1247{
1248 struct phy_device *phydev = upstream;
1249
1250 if (phydev->attached_dev)
1251 phydev->attached_dev->sfp_bus = bus;
1252 phydev->sfp_bus_attached = true;
1253}
1254EXPORT_SYMBOL(phy_sfp_attach);
1255
1256
1257
1258
1259
1260
1261
1262
1263void phy_sfp_detach(void *upstream, struct sfp_bus *bus)
1264{
1265 struct phy_device *phydev = upstream;
1266
1267 if (phydev->attached_dev)
1268 phydev->attached_dev->sfp_bus = NULL;
1269 phydev->sfp_bus_attached = false;
1270}
1271EXPORT_SYMBOL(phy_sfp_detach);
1272
1273
1274
1275
1276
1277
1278int phy_sfp_probe(struct phy_device *phydev,
1279 const struct sfp_upstream_ops *ops)
1280{
1281 struct sfp_bus *bus;
1282 int ret = 0;
1283
1284 if (phydev->mdio.dev.fwnode) {
1285 bus = sfp_bus_find_fwnode(phydev->mdio.dev.fwnode);
1286 if (IS_ERR(bus))
1287 return PTR_ERR(bus);
1288
1289 phydev->sfp_bus = bus;
1290
1291 ret = sfp_bus_add_upstream(bus, phydev, ops);
1292 sfp_bus_put(bus);
1293 }
1294 return ret;
1295}
1296EXPORT_SYMBOL(phy_sfp_probe);
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
1314 u32 flags, phy_interface_t interface)
1315{
1316 struct mii_bus *bus = phydev->mdio.bus;
1317 struct device *d = &phydev->mdio.dev;
1318 struct module *ndev_owner = NULL;
1319 bool using_genphy = false;
1320 int err;
1321
1322
1323
1324
1325
1326
1327 if (dev)
1328 ndev_owner = dev->dev.parent->driver->owner;
1329 if (ndev_owner != bus->owner && !try_module_get(bus->owner)) {
1330 phydev_err(phydev, "failed to get the bus module\n");
1331 return -EIO;
1332 }
1333
1334 get_device(d);
1335
1336
1337
1338
1339 if (!d->driver) {
1340 if (phydev->is_c45)
1341 d->driver = &genphy_c45_driver.mdiodrv.driver;
1342 else
1343 d->driver = &genphy_driver.mdiodrv.driver;
1344
1345 using_genphy = true;
1346 }
1347
1348 if (!try_module_get(d->driver->owner)) {
1349 phydev_err(phydev, "failed to get the device driver module\n");
1350 err = -EIO;
1351 goto error_put_device;
1352 }
1353
1354 if (using_genphy) {
1355 err = d->driver->probe(d);
1356 if (err >= 0)
1357 err = device_bind_driver(d);
1358
1359 if (err)
1360 goto error_module_put;
1361 }
1362
1363 if (phydev->attached_dev) {
1364 dev_err(&dev->dev, "PHY already attached\n");
1365 err = -EBUSY;
1366 goto error;
1367 }
1368
1369 phydev->phy_link_change = phy_link_change;
1370 if (dev) {
1371 phydev->attached_dev = dev;
1372 dev->phydev = phydev;
1373
1374 if (phydev->sfp_bus_attached)
1375 dev->sfp_bus = phydev->sfp_bus;
1376 else if (dev->sfp_bus)
1377 phydev->is_on_sfp_module = true;
1378 }
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388 phydev->sysfs_links = false;
1389
1390 phy_sysfs_create_links(phydev);
1391
1392 if (!phydev->attached_dev) {
1393 err = sysfs_create_file(&phydev->mdio.dev.kobj,
1394 &dev_attr_phy_standalone.attr);
1395 if (err)
1396 phydev_err(phydev, "error creating 'phy_standalone' sysfs entry\n");
1397 }
1398
1399 phydev->dev_flags |= flags;
1400
1401 phydev->interface = interface;
1402
1403 phydev->state = PHY_READY;
1404
1405
1406
1407
1408
1409
1410 if (using_genphy)
1411 phydev->port = PORT_MII;
1412
1413
1414
1415
1416 if (dev)
1417 netif_carrier_off(phydev->attached_dev);
1418
1419
1420
1421
1422
1423 err = phy_init_hw(phydev);
1424 if (err)
1425 goto error;
1426
1427 err = phy_disable_interrupts(phydev);
1428 if (err)
1429 return err;
1430
1431 phy_resume(phydev);
1432 phy_led_triggers_register(phydev);
1433
1434 return err;
1435
1436error:
1437
1438 phy_detach(phydev);
1439 return err;
1440
1441error_module_put:
1442 module_put(d->driver->owner);
1443error_put_device:
1444 put_device(d);
1445 if (ndev_owner != bus->owner)
1446 module_put(bus->owner);
1447 return err;
1448}
1449EXPORT_SYMBOL(phy_attach_direct);
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460struct phy_device *phy_attach(struct net_device *dev, const char *bus_id,
1461 phy_interface_t interface)
1462{
1463 struct bus_type *bus = &mdio_bus_type;
1464 struct phy_device *phydev;
1465 struct device *d;
1466 int rc;
1467
1468 if (!dev)
1469 return ERR_PTR(-EINVAL);
1470
1471
1472
1473
1474 d = bus_find_device_by_name(bus, NULL, bus_id);
1475 if (!d) {
1476 pr_err("PHY %s not found\n", bus_id);
1477 return ERR_PTR(-ENODEV);
1478 }
1479 phydev = to_phy_device(d);
1480
1481 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface);
1482 put_device(d);
1483 if (rc)
1484 return ERR_PTR(rc);
1485
1486 return phydev;
1487}
1488EXPORT_SYMBOL(phy_attach);
1489
1490static bool phy_driver_is_genphy_kind(struct phy_device *phydev,
1491 struct device_driver *driver)
1492{
1493 struct device *d = &phydev->mdio.dev;
1494 bool ret = false;
1495
1496 if (!phydev->drv)
1497 return ret;
1498
1499 get_device(d);
1500 ret = d->driver == driver;
1501 put_device(d);
1502
1503 return ret;
1504}
1505
1506bool phy_driver_is_genphy(struct phy_device *phydev)
1507{
1508 return phy_driver_is_genphy_kind(phydev,
1509 &genphy_driver.mdiodrv.driver);
1510}
1511EXPORT_SYMBOL_GPL(phy_driver_is_genphy);
1512
1513bool phy_driver_is_genphy_10g(struct phy_device *phydev)
1514{
1515 return phy_driver_is_genphy_kind(phydev,
1516 &genphy_c45_driver.mdiodrv.driver);
1517}
1518EXPORT_SYMBOL_GPL(phy_driver_is_genphy_10g);
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546int phy_package_join(struct phy_device *phydev, int addr, size_t priv_size)
1547{
1548 struct mii_bus *bus = phydev->mdio.bus;
1549 struct phy_package_shared *shared;
1550 int ret;
1551
1552 if (addr < 0 || addr >= PHY_MAX_ADDR)
1553 return -EINVAL;
1554
1555 mutex_lock(&bus->shared_lock);
1556 shared = bus->shared[addr];
1557 if (!shared) {
1558 ret = -ENOMEM;
1559 shared = kzalloc(sizeof(*shared), GFP_KERNEL);
1560 if (!shared)
1561 goto err_unlock;
1562 if (priv_size) {
1563 shared->priv = kzalloc(priv_size, GFP_KERNEL);
1564 if (!shared->priv)
1565 goto err_free;
1566 shared->priv_size = priv_size;
1567 }
1568 shared->addr = addr;
1569 refcount_set(&shared->refcnt, 1);
1570 bus->shared[addr] = shared;
1571 } else {
1572 ret = -EINVAL;
1573 if (priv_size && priv_size != shared->priv_size)
1574 goto err_unlock;
1575 refcount_inc(&shared->refcnt);
1576 }
1577 mutex_unlock(&bus->shared_lock);
1578
1579 phydev->shared = shared;
1580
1581 return 0;
1582
1583err_free:
1584 kfree(shared);
1585err_unlock:
1586 mutex_unlock(&bus->shared_lock);
1587 return ret;
1588}
1589EXPORT_SYMBOL_GPL(phy_package_join);
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599void phy_package_leave(struct phy_device *phydev)
1600{
1601 struct phy_package_shared *shared = phydev->shared;
1602 struct mii_bus *bus = phydev->mdio.bus;
1603
1604 if (!shared)
1605 return;
1606
1607 if (refcount_dec_and_mutex_lock(&shared->refcnt, &bus->shared_lock)) {
1608 bus->shared[shared->addr] = NULL;
1609 mutex_unlock(&bus->shared_lock);
1610 kfree(shared->priv);
1611 kfree(shared);
1612 }
1613
1614 phydev->shared = NULL;
1615}
1616EXPORT_SYMBOL_GPL(phy_package_leave);
1617
1618static void devm_phy_package_leave(struct device *dev, void *res)
1619{
1620 phy_package_leave(*(struct phy_device **)res);
1621}
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634int devm_phy_package_join(struct device *dev, struct phy_device *phydev,
1635 int addr, size_t priv_size)
1636{
1637 struct phy_device **ptr;
1638 int ret;
1639
1640 ptr = devres_alloc(devm_phy_package_leave, sizeof(*ptr),
1641 GFP_KERNEL);
1642 if (!ptr)
1643 return -ENOMEM;
1644
1645 ret = phy_package_join(phydev, addr, priv_size);
1646
1647 if (!ret) {
1648 *ptr = phydev;
1649 devres_add(dev, ptr);
1650 } else {
1651 devres_free(ptr);
1652 }
1653
1654 return ret;
1655}
1656EXPORT_SYMBOL_GPL(devm_phy_package_join);
1657
1658
1659
1660
1661
1662
1663
1664
1665void phy_detach(struct phy_device *phydev)
1666{
1667 struct net_device *dev = phydev->attached_dev;
1668 struct module *ndev_owner = NULL;
1669 struct mii_bus *bus;
1670
1671 if (phydev->sysfs_links) {
1672 if (dev)
1673 sysfs_remove_link(&dev->dev.kobj, "phydev");
1674 sysfs_remove_link(&phydev->mdio.dev.kobj, "attached_dev");
1675 }
1676
1677 if (!phydev->attached_dev)
1678 sysfs_remove_file(&phydev->mdio.dev.kobj,
1679 &dev_attr_phy_standalone.attr);
1680
1681 phy_suspend(phydev);
1682 if (dev) {
1683 phydev->attached_dev->phydev = NULL;
1684 phydev->attached_dev = NULL;
1685 }
1686 phydev->phylink = NULL;
1687
1688 phy_led_triggers_unregister(phydev);
1689
1690 if (phydev->mdio.dev.driver)
1691 module_put(phydev->mdio.dev.driver->owner);
1692
1693
1694
1695
1696
1697
1698 if (phy_driver_is_genphy(phydev) ||
1699 phy_driver_is_genphy_10g(phydev))
1700 device_release_driver(&phydev->mdio.dev);
1701
1702
1703
1704
1705
1706 bus = phydev->mdio.bus;
1707
1708 put_device(&phydev->mdio.dev);
1709 if (dev)
1710 ndev_owner = dev->dev.parent->driver->owner;
1711 if (ndev_owner != bus->owner)
1712 module_put(bus->owner);
1713
1714
1715 phy_device_reset(phydev, 1);
1716}
1717EXPORT_SYMBOL(phy_detach);
1718
1719int phy_suspend(struct phy_device *phydev)
1720{
1721 struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL };
1722 struct net_device *netdev = phydev->attached_dev;
1723 struct phy_driver *phydrv = phydev->drv;
1724 int ret;
1725
1726 if (phydev->suspended)
1727 return 0;
1728
1729
1730 phy_ethtool_get_wol(phydev, &wol);
1731 if (wol.wolopts || (netdev && netdev->wol_enabled))
1732 return -EBUSY;
1733
1734 if (!phydrv || !phydrv->suspend)
1735 return 0;
1736
1737 ret = phydrv->suspend(phydev);
1738 if (!ret)
1739 phydev->suspended = true;
1740
1741 return ret;
1742}
1743EXPORT_SYMBOL(phy_suspend);
1744
1745int __phy_resume(struct phy_device *phydev)
1746{
1747 struct phy_driver *phydrv = phydev->drv;
1748 int ret;
1749
1750 lockdep_assert_held(&phydev->lock);
1751
1752 if (!phydrv || !phydrv->resume)
1753 return 0;
1754
1755 ret = phydrv->resume(phydev);
1756 if (!ret)
1757 phydev->suspended = false;
1758
1759 return ret;
1760}
1761EXPORT_SYMBOL(__phy_resume);
1762
1763int phy_resume(struct phy_device *phydev)
1764{
1765 int ret;
1766
1767 mutex_lock(&phydev->lock);
1768 ret = __phy_resume(phydev);
1769 mutex_unlock(&phydev->lock);
1770
1771 return ret;
1772}
1773EXPORT_SYMBOL(phy_resume);
1774
1775int phy_loopback(struct phy_device *phydev, bool enable)
1776{
1777 struct phy_driver *phydrv = to_phy_driver(phydev->mdio.dev.driver);
1778 int ret = 0;
1779
1780 if (!phydrv)
1781 return -ENODEV;
1782
1783 mutex_lock(&phydev->lock);
1784
1785 if (enable && phydev->loopback_enabled) {
1786 ret = -EBUSY;
1787 goto out;
1788 }
1789
1790 if (!enable && !phydev->loopback_enabled) {
1791 ret = -EINVAL;
1792 goto out;
1793 }
1794
1795 if (phydrv->set_loopback)
1796 ret = phydrv->set_loopback(phydev, enable);
1797 else
1798 ret = genphy_loopback(phydev, enable);
1799
1800 if (ret)
1801 goto out;
1802
1803 phydev->loopback_enabled = enable;
1804
1805out:
1806 mutex_unlock(&phydev->lock);
1807 return ret;
1808}
1809EXPORT_SYMBOL(phy_loopback);
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820int phy_reset_after_clk_enable(struct phy_device *phydev)
1821{
1822 if (!phydev || !phydev->drv)
1823 return -ENODEV;
1824
1825 if (phydev->drv->flags & PHY_RST_AFTER_CLK_EN) {
1826 phy_device_reset(phydev, 1);
1827 phy_device_reset(phydev, 0);
1828 return 1;
1829 }
1830
1831 return 0;
1832}
1833EXPORT_SYMBOL(phy_reset_after_clk_enable);
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846static int genphy_config_advert(struct phy_device *phydev)
1847{
1848 int err, bmsr, changed = 0;
1849 u32 adv;
1850
1851
1852 linkmode_and(phydev->advertising, phydev->advertising,
1853 phydev->supported);
1854
1855 adv = linkmode_adv_to_mii_adv_t(phydev->advertising);
1856
1857
1858 err = phy_modify_changed(phydev, MII_ADVERTISE,
1859 ADVERTISE_ALL | ADVERTISE_100BASE4 |
1860 ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM,
1861 adv);
1862 if (err < 0)
1863 return err;
1864 if (err > 0)
1865 changed = 1;
1866
1867 bmsr = phy_read(phydev, MII_BMSR);
1868 if (bmsr < 0)
1869 return bmsr;
1870
1871
1872
1873
1874
1875 if (!(bmsr & BMSR_ESTATEN))
1876 return changed;
1877
1878 adv = linkmode_adv_to_mii_ctrl1000_t(phydev->advertising);
1879
1880 err = phy_modify_changed(phydev, MII_CTRL1000,
1881 ADVERTISE_1000FULL | ADVERTISE_1000HALF,
1882 adv);
1883 if (err < 0)
1884 return err;
1885 if (err > 0)
1886 changed = 1;
1887
1888 return changed;
1889}
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901static int genphy_c37_config_advert(struct phy_device *phydev)
1902{
1903 u16 adv = 0;
1904
1905
1906 linkmode_and(phydev->advertising, phydev->advertising,
1907 phydev->supported);
1908
1909 if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
1910 phydev->advertising))
1911 adv |= ADVERTISE_1000XFULL;
1912 if (linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT,
1913 phydev->advertising))
1914 adv |= ADVERTISE_1000XPAUSE;
1915 if (linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT,
1916 phydev->advertising))
1917 adv |= ADVERTISE_1000XPSE_ASYM;
1918
1919 return phy_modify_changed(phydev, MII_ADVERTISE,
1920 ADVERTISE_1000XFULL | ADVERTISE_1000XPAUSE |
1921 ADVERTISE_1000XHALF | ADVERTISE_1000XPSE_ASYM,
1922 adv);
1923}
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933int genphy_config_eee_advert(struct phy_device *phydev)
1934{
1935 int err;
1936
1937
1938 if (!phydev->eee_broken_modes)
1939 return 0;
1940
1941 err = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV,
1942 phydev->eee_broken_modes, 0);
1943
1944 return err < 0 ? 0 : err;
1945}
1946EXPORT_SYMBOL(genphy_config_eee_advert);
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956int genphy_setup_forced(struct phy_device *phydev)
1957{
1958 u16 ctl = 0;
1959
1960 phydev->pause = 0;
1961 phydev->asym_pause = 0;
1962
1963 if (SPEED_1000 == phydev->speed)
1964 ctl |= BMCR_SPEED1000;
1965 else if (SPEED_100 == phydev->speed)
1966 ctl |= BMCR_SPEED100;
1967
1968 if (DUPLEX_FULL == phydev->duplex)
1969 ctl |= BMCR_FULLDPLX;
1970
1971 return phy_modify(phydev, MII_BMCR,
1972 ~(BMCR_LOOPBACK | BMCR_ISOLATE | BMCR_PDOWN), ctl);
1973}
1974EXPORT_SYMBOL(genphy_setup_forced);
1975
1976static int genphy_setup_master_slave(struct phy_device *phydev)
1977{
1978 u16 ctl = 0;
1979
1980 if (!phydev->is_gigabit_capable)
1981 return 0;
1982
1983 switch (phydev->master_slave_set) {
1984 case MASTER_SLAVE_CFG_MASTER_PREFERRED:
1985 ctl |= CTL1000_PREFER_MASTER;
1986 break;
1987 case MASTER_SLAVE_CFG_SLAVE_PREFERRED:
1988 break;
1989 case MASTER_SLAVE_CFG_MASTER_FORCE:
1990 ctl |= CTL1000_AS_MASTER;
1991 fallthrough;
1992 case MASTER_SLAVE_CFG_SLAVE_FORCE:
1993 ctl |= CTL1000_ENABLE_MASTER;
1994 break;
1995 case MASTER_SLAVE_CFG_UNKNOWN:
1996 case MASTER_SLAVE_CFG_UNSUPPORTED:
1997 return 0;
1998 default:
1999 phydev_warn(phydev, "Unsupported Master/Slave mode\n");
2000 return -EOPNOTSUPP;
2001 }
2002
2003 return phy_modify_changed(phydev, MII_CTRL1000,
2004 (CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER |
2005 CTL1000_PREFER_MASTER), ctl);
2006}
2007
2008static int genphy_read_master_slave(struct phy_device *phydev)
2009{
2010 int cfg, state;
2011 int val;
2012
2013 if (!phydev->is_gigabit_capable) {
2014 phydev->master_slave_get = MASTER_SLAVE_CFG_UNSUPPORTED;
2015 phydev->master_slave_state = MASTER_SLAVE_STATE_UNSUPPORTED;
2016 return 0;
2017 }
2018
2019 phydev->master_slave_get = MASTER_SLAVE_CFG_UNKNOWN;
2020 phydev->master_slave_state = MASTER_SLAVE_STATE_UNKNOWN;
2021
2022 val = phy_read(phydev, MII_CTRL1000);
2023 if (val < 0)
2024 return val;
2025
2026 if (val & CTL1000_ENABLE_MASTER) {
2027 if (val & CTL1000_AS_MASTER)
2028 cfg = MASTER_SLAVE_CFG_MASTER_FORCE;
2029 else
2030 cfg = MASTER_SLAVE_CFG_SLAVE_FORCE;
2031 } else {
2032 if (val & CTL1000_PREFER_MASTER)
2033 cfg = MASTER_SLAVE_CFG_MASTER_PREFERRED;
2034 else
2035 cfg = MASTER_SLAVE_CFG_SLAVE_PREFERRED;
2036 }
2037
2038 val = phy_read(phydev, MII_STAT1000);
2039 if (val < 0)
2040 return val;
2041
2042 if (val & LPA_1000MSFAIL) {
2043 state = MASTER_SLAVE_STATE_ERR;
2044 } else if (phydev->link) {
2045
2046 if (val & LPA_1000MSRES)
2047 state = MASTER_SLAVE_STATE_MASTER;
2048 else
2049 state = MASTER_SLAVE_STATE_SLAVE;
2050 } else {
2051 state = MASTER_SLAVE_STATE_UNKNOWN;
2052 }
2053
2054 phydev->master_slave_get = cfg;
2055 phydev->master_slave_state = state;
2056
2057 return 0;
2058}
2059
2060
2061
2062
2063
2064int genphy_restart_aneg(struct phy_device *phydev)
2065{
2066
2067 return phy_modify(phydev, MII_BMCR, BMCR_ISOLATE,
2068 BMCR_ANENABLE | BMCR_ANRESTART);
2069}
2070EXPORT_SYMBOL(genphy_restart_aneg);
2071
2072
2073
2074
2075
2076
2077
2078
2079int genphy_check_and_restart_aneg(struct phy_device *phydev, bool restart)
2080{
2081 int ret;
2082
2083 if (!restart) {
2084
2085
2086
2087 ret = phy_read(phydev, MII_BMCR);
2088 if (ret < 0)
2089 return ret;
2090
2091 if (!(ret & BMCR_ANENABLE) || (ret & BMCR_ISOLATE))
2092 restart = true;
2093 }
2094
2095 if (restart)
2096 return genphy_restart_aneg(phydev);
2097
2098 return 0;
2099}
2100EXPORT_SYMBOL(genphy_check_and_restart_aneg);
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111int __genphy_config_aneg(struct phy_device *phydev, bool changed)
2112{
2113 int err;
2114
2115 if (genphy_config_eee_advert(phydev))
2116 changed = true;
2117
2118 err = genphy_setup_master_slave(phydev);
2119 if (err < 0)
2120 return err;
2121 else if (err)
2122 changed = true;
2123
2124 if (AUTONEG_ENABLE != phydev->autoneg)
2125 return genphy_setup_forced(phydev);
2126
2127 err = genphy_config_advert(phydev);
2128 if (err < 0)
2129 return err;
2130 else if (err)
2131 changed = true;
2132
2133 return genphy_check_and_restart_aneg(phydev, changed);
2134}
2135EXPORT_SYMBOL(__genphy_config_aneg);
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146int genphy_c37_config_aneg(struct phy_device *phydev)
2147{
2148 int err, changed;
2149
2150 if (phydev->autoneg != AUTONEG_ENABLE)
2151 return genphy_setup_forced(phydev);
2152
2153 err = phy_modify(phydev, MII_BMCR, BMCR_SPEED1000 | BMCR_SPEED100,
2154 BMCR_SPEED1000);
2155 if (err)
2156 return err;
2157
2158 changed = genphy_c37_config_advert(phydev);
2159 if (changed < 0)
2160 return changed;
2161
2162 if (!changed) {
2163
2164
2165
2166 int ctl = phy_read(phydev, MII_BMCR);
2167
2168 if (ctl < 0)
2169 return ctl;
2170
2171 if (!(ctl & BMCR_ANENABLE) || (ctl & BMCR_ISOLATE))
2172 changed = 1;
2173 }
2174
2175
2176
2177
2178 if (changed > 0)
2179 return genphy_restart_aneg(phydev);
2180
2181 return 0;
2182}
2183EXPORT_SYMBOL(genphy_c37_config_aneg);
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193int genphy_aneg_done(struct phy_device *phydev)
2194{
2195 int retval = phy_read(phydev, MII_BMSR);
2196
2197 return (retval < 0) ? retval : (retval & BMSR_ANEGCOMPLETE);
2198}
2199EXPORT_SYMBOL(genphy_aneg_done);
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209int genphy_update_link(struct phy_device *phydev)
2210{
2211 int status = 0, bmcr;
2212
2213 bmcr = phy_read(phydev, MII_BMCR);
2214 if (bmcr < 0)
2215 return bmcr;
2216
2217
2218
2219
2220 if (bmcr & BMCR_ANRESTART)
2221 goto done;
2222
2223
2224
2225
2226
2227
2228 if (!phy_polling_mode(phydev) || !phydev->link) {
2229 status = phy_read(phydev, MII_BMSR);
2230 if (status < 0)
2231 return status;
2232 else if (status & BMSR_LSTATUS)
2233 goto done;
2234 }
2235
2236
2237 status = phy_read(phydev, MII_BMSR);
2238 if (status < 0)
2239 return status;
2240done:
2241 phydev->link = status & BMSR_LSTATUS ? 1 : 0;
2242 phydev->autoneg_complete = status & BMSR_ANEGCOMPLETE ? 1 : 0;
2243
2244
2245
2246
2247 if (phydev->autoneg == AUTONEG_ENABLE && !phydev->autoneg_complete)
2248 phydev->link = 0;
2249
2250 return 0;
2251}
2252EXPORT_SYMBOL(genphy_update_link);
2253
2254int genphy_read_lpa(struct phy_device *phydev)
2255{
2256 int lpa, lpagb;
2257
2258 if (phydev->autoneg == AUTONEG_ENABLE) {
2259 if (!phydev->autoneg_complete) {
2260 mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising,
2261 0);
2262 mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, 0);
2263 return 0;
2264 }
2265
2266 if (phydev->is_gigabit_capable) {
2267 lpagb = phy_read(phydev, MII_STAT1000);
2268 if (lpagb < 0)
2269 return lpagb;
2270
2271 if (lpagb & LPA_1000MSFAIL) {
2272 int adv = phy_read(phydev, MII_CTRL1000);
2273
2274 if (adv < 0)
2275 return adv;
2276
2277 if (adv & CTL1000_ENABLE_MASTER)
2278 phydev_err(phydev, "Master/Slave resolution failed, maybe conflicting manual settings?\n");
2279 else
2280 phydev_err(phydev, "Master/Slave resolution failed\n");
2281 return -ENOLINK;
2282 }
2283
2284 mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising,
2285 lpagb);
2286 }
2287
2288 lpa = phy_read(phydev, MII_LPA);
2289 if (lpa < 0)
2290 return lpa;
2291
2292 mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, lpa);
2293 } else {
2294 linkmode_zero(phydev->lp_advertising);
2295 }
2296
2297 return 0;
2298}
2299EXPORT_SYMBOL(genphy_read_lpa);
2300
2301
2302
2303
2304
2305
2306
2307
2308int genphy_read_status_fixed(struct phy_device *phydev)
2309{
2310 int bmcr = phy_read(phydev, MII_BMCR);
2311
2312 if (bmcr < 0)
2313 return bmcr;
2314
2315 if (bmcr & BMCR_FULLDPLX)
2316 phydev->duplex = DUPLEX_FULL;
2317 else
2318 phydev->duplex = DUPLEX_HALF;
2319
2320 if (bmcr & BMCR_SPEED1000)
2321 phydev->speed = SPEED_1000;
2322 else if (bmcr & BMCR_SPEED100)
2323 phydev->speed = SPEED_100;
2324 else
2325 phydev->speed = SPEED_10;
2326
2327 return 0;
2328}
2329EXPORT_SYMBOL(genphy_read_status_fixed);
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340int genphy_read_status(struct phy_device *phydev)
2341{
2342 int err, old_link = phydev->link;
2343
2344
2345 err = genphy_update_link(phydev);
2346 if (err)
2347 return err;
2348
2349
2350 if (phydev->autoneg == AUTONEG_ENABLE && old_link && phydev->link)
2351 return 0;
2352
2353 phydev->speed = SPEED_UNKNOWN;
2354 phydev->duplex = DUPLEX_UNKNOWN;
2355 phydev->pause = 0;
2356 phydev->asym_pause = 0;
2357
2358 err = genphy_read_master_slave(phydev);
2359 if (err < 0)
2360 return err;
2361
2362 err = genphy_read_lpa(phydev);
2363 if (err < 0)
2364 return err;
2365
2366 if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) {
2367 phy_resolve_aneg_linkmode(phydev);
2368 } else if (phydev->autoneg == AUTONEG_DISABLE) {
2369 err = genphy_read_status_fixed(phydev);
2370 if (err < 0)
2371 return err;
2372 }
2373
2374 return 0;
2375}
2376EXPORT_SYMBOL(genphy_read_status);
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386int genphy_c37_read_status(struct phy_device *phydev)
2387{
2388 int lpa, err, old_link = phydev->link;
2389
2390
2391 err = genphy_update_link(phydev);
2392 if (err)
2393 return err;
2394
2395
2396 if (phydev->autoneg == AUTONEG_ENABLE && old_link && phydev->link)
2397 return 0;
2398
2399 phydev->duplex = DUPLEX_UNKNOWN;
2400 phydev->pause = 0;
2401 phydev->asym_pause = 0;
2402
2403 if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) {
2404 lpa = phy_read(phydev, MII_LPA);
2405 if (lpa < 0)
2406 return lpa;
2407
2408 linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
2409 phydev->lp_advertising, lpa & LPA_LPACK);
2410 linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
2411 phydev->lp_advertising, lpa & LPA_1000XFULL);
2412 linkmode_mod_bit(ETHTOOL_LINK_MODE_Pause_BIT,
2413 phydev->lp_advertising, lpa & LPA_1000XPAUSE);
2414 linkmode_mod_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT,
2415 phydev->lp_advertising,
2416 lpa & LPA_1000XPAUSE_ASYM);
2417
2418 phy_resolve_aneg_linkmode(phydev);
2419 } else if (phydev->autoneg == AUTONEG_DISABLE) {
2420 int bmcr = phy_read(phydev, MII_BMCR);
2421
2422 if (bmcr < 0)
2423 return bmcr;
2424
2425 if (bmcr & BMCR_FULLDPLX)
2426 phydev->duplex = DUPLEX_FULL;
2427 else
2428 phydev->duplex = DUPLEX_HALF;
2429 }
2430
2431 return 0;
2432}
2433EXPORT_SYMBOL(genphy_c37_read_status);
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444int genphy_soft_reset(struct phy_device *phydev)
2445{
2446 u16 res = BMCR_RESET;
2447 int ret;
2448
2449 if (phydev->autoneg == AUTONEG_ENABLE)
2450 res |= BMCR_ANRESTART;
2451
2452 ret = phy_modify(phydev, MII_BMCR, BMCR_ISOLATE, res);
2453 if (ret < 0)
2454 return ret;
2455
2456
2457
2458
2459
2460 phydev->suspended = 0;
2461
2462 ret = phy_poll_reset(phydev);
2463 if (ret)
2464 return ret;
2465
2466
2467 if (phydev->autoneg == AUTONEG_DISABLE)
2468 ret = genphy_setup_forced(phydev);
2469
2470 return ret;
2471}
2472EXPORT_SYMBOL(genphy_soft_reset);
2473
2474irqreturn_t genphy_handle_interrupt_no_ack(struct phy_device *phydev)
2475{
2476
2477
2478
2479
2480
2481 phy_trigger_machine(phydev);
2482
2483 return 0;
2484}
2485EXPORT_SYMBOL(genphy_handle_interrupt_no_ack);
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496int genphy_read_abilities(struct phy_device *phydev)
2497{
2498 int val;
2499
2500 linkmode_set_bit_array(phy_basic_ports_array,
2501 ARRAY_SIZE(phy_basic_ports_array),
2502 phydev->supported);
2503
2504 val = phy_read(phydev, MII_BMSR);
2505 if (val < 0)
2506 return val;
2507
2508 linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported,
2509 val & BMSR_ANEGCAPABLE);
2510
2511 linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, phydev->supported,
2512 val & BMSR_100FULL);
2513 linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, phydev->supported,
2514 val & BMSR_100HALF);
2515 linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, phydev->supported,
2516 val & BMSR_10FULL);
2517 linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, phydev->supported,
2518 val & BMSR_10HALF);
2519
2520 if (val & BMSR_ESTATEN) {
2521 val = phy_read(phydev, MII_ESTATUS);
2522 if (val < 0)
2523 return val;
2524
2525 linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
2526 phydev->supported, val & ESTATUS_1000_TFULL);
2527 linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
2528 phydev->supported, val & ESTATUS_1000_THALF);
2529 linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
2530 phydev->supported, val & ESTATUS_1000_XFULL);
2531 }
2532
2533 return 0;
2534}
2535EXPORT_SYMBOL(genphy_read_abilities);
2536
2537
2538
2539
2540
2541int genphy_read_mmd_unsupported(struct phy_device *phdev, int devad, u16 regnum)
2542{
2543 return -EOPNOTSUPP;
2544}
2545EXPORT_SYMBOL(genphy_read_mmd_unsupported);
2546
2547int genphy_write_mmd_unsupported(struct phy_device *phdev, int devnum,
2548 u16 regnum, u16 val)
2549{
2550 return -EOPNOTSUPP;
2551}
2552EXPORT_SYMBOL(genphy_write_mmd_unsupported);
2553
2554int genphy_suspend(struct phy_device *phydev)
2555{
2556 return phy_set_bits(phydev, MII_BMCR, BMCR_PDOWN);
2557}
2558EXPORT_SYMBOL(genphy_suspend);
2559
2560int genphy_resume(struct phy_device *phydev)
2561{
2562 return phy_clear_bits(phydev, MII_BMCR, BMCR_PDOWN);
2563}
2564EXPORT_SYMBOL(genphy_resume);
2565
2566int genphy_loopback(struct phy_device *phydev, bool enable)
2567{
2568 if (enable) {
2569 u16 val, ctl = BMCR_LOOPBACK;
2570 int ret;
2571
2572 if (phydev->speed == SPEED_1000)
2573 ctl |= BMCR_SPEED1000;
2574 else if (phydev->speed == SPEED_100)
2575 ctl |= BMCR_SPEED100;
2576
2577 if (phydev->duplex == DUPLEX_FULL)
2578 ctl |= BMCR_FULLDPLX;
2579
2580 phy_modify(phydev, MII_BMCR, ~0, ctl);
2581
2582 ret = phy_read_poll_timeout(phydev, MII_BMSR, val,
2583 val & BMSR_LSTATUS,
2584 5000, 500000, true);
2585 if (ret)
2586 return ret;
2587 } else {
2588 phy_modify(phydev, MII_BMCR, BMCR_LOOPBACK, 0);
2589
2590 phy_config_aneg(phydev);
2591 }
2592
2593 return 0;
2594}
2595EXPORT_SYMBOL(genphy_loopback);
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606void phy_remove_link_mode(struct phy_device *phydev, u32 link_mode)
2607{
2608 linkmode_clear_bit(link_mode, phydev->supported);
2609 phy_advertise_supported(phydev);
2610}
2611EXPORT_SYMBOL(phy_remove_link_mode);
2612
2613static void phy_copy_pause_bits(unsigned long *dst, unsigned long *src)
2614{
2615 linkmode_mod_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, dst,
2616 linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, src));
2617 linkmode_mod_bit(ETHTOOL_LINK_MODE_Pause_BIT, dst,
2618 linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT, src));
2619}
2620
2621
2622
2623
2624
2625
2626
2627
2628void phy_advertise_supported(struct phy_device *phydev)
2629{
2630 __ETHTOOL_DECLARE_LINK_MODE_MASK(new);
2631
2632 linkmode_copy(new, phydev->supported);
2633 phy_copy_pause_bits(new, phydev->advertising);
2634 linkmode_copy(phydev->advertising, new);
2635}
2636EXPORT_SYMBOL(phy_advertise_supported);
2637
2638
2639
2640
2641
2642
2643
2644
2645void phy_support_sym_pause(struct phy_device *phydev)
2646{
2647 linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported);
2648 phy_copy_pause_bits(phydev->advertising, phydev->supported);
2649}
2650EXPORT_SYMBOL(phy_support_sym_pause);
2651
2652
2653
2654
2655
2656
2657
2658void phy_support_asym_pause(struct phy_device *phydev)
2659{
2660 phy_copy_pause_bits(phydev->advertising, phydev->supported);
2661}
2662EXPORT_SYMBOL(phy_support_asym_pause);
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675void phy_set_sym_pause(struct phy_device *phydev, bool rx, bool tx,
2676 bool autoneg)
2677{
2678 linkmode_clear_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported);
2679
2680 if (rx && tx && autoneg)
2681 linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT,
2682 phydev->supported);
2683
2684 linkmode_copy(phydev->advertising, phydev->supported);
2685}
2686EXPORT_SYMBOL(phy_set_sym_pause);
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699void phy_set_asym_pause(struct phy_device *phydev, bool rx, bool tx)
2700{
2701 __ETHTOOL_DECLARE_LINK_MODE_MASK(oldadv);
2702
2703 linkmode_copy(oldadv, phydev->advertising);
2704 linkmode_set_pause(phydev->advertising, tx, rx);
2705
2706 if (!linkmode_equal(oldadv, phydev->advertising) &&
2707 phydev->autoneg)
2708 phy_start_aneg(phydev);
2709}
2710EXPORT_SYMBOL(phy_set_asym_pause);
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721bool phy_validate_pause(struct phy_device *phydev,
2722 struct ethtool_pauseparam *pp)
2723{
2724 if (!linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT,
2725 phydev->supported) && pp->rx_pause)
2726 return false;
2727
2728 if (!linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT,
2729 phydev->supported) &&
2730 pp->rx_pause != pp->tx_pause)
2731 return false;
2732
2733 return true;
2734}
2735EXPORT_SYMBOL(phy_validate_pause);
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749void phy_get_pause(struct phy_device *phydev, bool *tx_pause, bool *rx_pause)
2750{
2751 if (phydev->duplex != DUPLEX_FULL) {
2752 *tx_pause = false;
2753 *rx_pause = false;
2754 return;
2755 }
2756
2757 return linkmode_resolve_pause(phydev->advertising,
2758 phydev->lp_advertising,
2759 tx_pause, rx_pause);
2760}
2761EXPORT_SYMBOL(phy_get_pause);
2762
2763#if IS_ENABLED(CONFIG_OF_MDIO)
2764static int phy_get_int_delay_property(struct device *dev, const char *name)
2765{
2766 s32 int_delay;
2767 int ret;
2768
2769 ret = device_property_read_u32(dev, name, &int_delay);
2770 if (ret)
2771 return ret;
2772
2773 return int_delay;
2774}
2775#else
2776static int phy_get_int_delay_property(struct device *dev, const char *name)
2777{
2778 return -EINVAL;
2779}
2780#endif
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798s32 phy_get_internal_delay(struct phy_device *phydev, struct device *dev,
2799 const int *delay_values, int size, bool is_rx)
2800{
2801 s32 delay;
2802 int i;
2803
2804 if (is_rx) {
2805 delay = phy_get_int_delay_property(dev, "rx-internal-delay-ps");
2806 if (delay < 0 && size == 0) {
2807 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
2808 phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID)
2809 return 1;
2810 else
2811 return 0;
2812 }
2813
2814 } else {
2815 delay = phy_get_int_delay_property(dev, "tx-internal-delay-ps");
2816 if (delay < 0 && size == 0) {
2817 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
2818 phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)
2819 return 1;
2820 else
2821 return 0;
2822 }
2823 }
2824
2825 if (delay < 0)
2826 return delay;
2827
2828 if (delay && size == 0)
2829 return delay;
2830
2831 if (delay < delay_values[0] || delay > delay_values[size - 1]) {
2832 phydev_err(phydev, "Delay %d is out of range\n", delay);
2833 return -EINVAL;
2834 }
2835
2836 if (delay == delay_values[0])
2837 return 0;
2838
2839 for (i = 1; i < size; i++) {
2840 if (delay == delay_values[i])
2841 return i;
2842
2843
2844 if (delay > delay_values[i - 1] &&
2845 delay < delay_values[i]) {
2846 if (delay - delay_values[i - 1] <
2847 delay_values[i] - delay)
2848 return i - 1;
2849 else
2850 return i;
2851 }
2852 }
2853
2854 phydev_err(phydev, "error finding internal delay index for %d\n",
2855 delay);
2856
2857 return -EINVAL;
2858}
2859EXPORT_SYMBOL(phy_get_internal_delay);
2860
2861static bool phy_drv_supports_irq(struct phy_driver *phydrv)
2862{
2863 return phydrv->config_intr && phydrv->handle_interrupt;
2864}
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874static int phy_probe(struct device *dev)
2875{
2876 struct phy_device *phydev = to_phy_device(dev);
2877 struct device_driver *drv = phydev->mdio.dev.driver;
2878 struct phy_driver *phydrv = to_phy_driver(drv);
2879 int err = 0;
2880
2881 phydev->drv = phydrv;
2882
2883
2884
2885
2886 if (!phy_drv_supports_irq(phydrv) && phy_interrupt_is_valid(phydev))
2887 phydev->irq = PHY_POLL;
2888
2889 if (phydrv->flags & PHY_IS_INTERNAL)
2890 phydev->is_internal = true;
2891
2892 mutex_lock(&phydev->lock);
2893
2894
2895 phy_device_reset(phydev, 0);
2896
2897 if (phydev->drv->probe) {
2898 err = phydev->drv->probe(phydev);
2899 if (err)
2900 goto out;
2901 }
2902
2903
2904
2905
2906
2907 if (phydrv->features) {
2908 linkmode_copy(phydev->supported, phydrv->features);
2909 } else if (phydrv->get_features) {
2910 err = phydrv->get_features(phydev);
2911 } else if (phydev->is_c45) {
2912 err = genphy_c45_pma_read_abilities(phydev);
2913 } else {
2914 err = genphy_read_abilities(phydev);
2915 }
2916
2917 if (err)
2918 goto out;
2919
2920 if (!linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
2921 phydev->supported))
2922 phydev->autoneg = 0;
2923
2924 if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
2925 phydev->supported))
2926 phydev->is_gigabit_capable = 1;
2927 if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
2928 phydev->supported))
2929 phydev->is_gigabit_capable = 1;
2930
2931 of_set_phy_supported(phydev);
2932 phy_advertise_supported(phydev);
2933
2934
2935
2936
2937 of_set_phy_eee_broken(phydev);
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950 if (!test_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported) &&
2951 !test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported)) {
2952 linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT,
2953 phydev->supported);
2954 linkmode_set_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT,
2955 phydev->supported);
2956 }
2957
2958
2959 phydev->state = PHY_READY;
2960
2961out:
2962
2963 if (err)
2964 phy_device_reset(phydev, 1);
2965
2966 mutex_unlock(&phydev->lock);
2967
2968 return err;
2969}
2970
2971static int phy_remove(struct device *dev)
2972{
2973 struct phy_device *phydev = to_phy_device(dev);
2974
2975 cancel_delayed_work_sync(&phydev->state_queue);
2976
2977 mutex_lock(&phydev->lock);
2978 phydev->state = PHY_DOWN;
2979 mutex_unlock(&phydev->lock);
2980
2981 sfp_bus_del_upstream(phydev->sfp_bus);
2982 phydev->sfp_bus = NULL;
2983
2984 if (phydev->drv && phydev->drv->remove)
2985 phydev->drv->remove(phydev);
2986
2987
2988 phy_device_reset(phydev, 1);
2989
2990 phydev->drv = NULL;
2991
2992 return 0;
2993}
2994
2995static void phy_shutdown(struct device *dev)
2996{
2997 struct phy_device *phydev = to_phy_device(dev);
2998
2999 phy_disable_interrupts(phydev);
3000}
3001
3002
3003
3004
3005
3006
3007int phy_driver_register(struct phy_driver *new_driver, struct module *owner)
3008{
3009 int retval;
3010
3011
3012
3013
3014 if (WARN_ON(new_driver->features && new_driver->get_features)) {
3015 pr_err("%s: features and get_features must not both be set\n",
3016 new_driver->name);
3017 return -EINVAL;
3018 }
3019
3020 new_driver->mdiodrv.flags |= MDIO_DEVICE_IS_PHY;
3021 new_driver->mdiodrv.driver.name = new_driver->name;
3022 new_driver->mdiodrv.driver.bus = &mdio_bus_type;
3023 new_driver->mdiodrv.driver.probe = phy_probe;
3024 new_driver->mdiodrv.driver.remove = phy_remove;
3025 new_driver->mdiodrv.driver.shutdown = phy_shutdown;
3026 new_driver->mdiodrv.driver.owner = owner;
3027 new_driver->mdiodrv.driver.probe_type = PROBE_FORCE_SYNCHRONOUS;
3028
3029 retval = driver_register(&new_driver->mdiodrv.driver);
3030 if (retval) {
3031 pr_err("%s: Error %d in registering driver\n",
3032 new_driver->name, retval);
3033
3034 return retval;
3035 }
3036
3037 pr_debug("%s: Registered new driver\n", new_driver->name);
3038
3039 return 0;
3040}
3041EXPORT_SYMBOL(phy_driver_register);
3042
3043int phy_drivers_register(struct phy_driver *new_driver, int n,
3044 struct module *owner)
3045{
3046 int i, ret = 0;
3047
3048 for (i = 0; i < n; i++) {
3049 ret = phy_driver_register(new_driver + i, owner);
3050 if (ret) {
3051 while (i-- > 0)
3052 phy_driver_unregister(new_driver + i);
3053 break;
3054 }
3055 }
3056 return ret;
3057}
3058EXPORT_SYMBOL(phy_drivers_register);
3059
3060void phy_driver_unregister(struct phy_driver *drv)
3061{
3062 driver_unregister(&drv->mdiodrv.driver);
3063}
3064EXPORT_SYMBOL(phy_driver_unregister);
3065
3066void phy_drivers_unregister(struct phy_driver *drv, int n)
3067{
3068 int i;
3069
3070 for (i = 0; i < n; i++)
3071 phy_driver_unregister(drv + i);
3072}
3073EXPORT_SYMBOL(phy_drivers_unregister);
3074
3075static struct phy_driver genphy_driver = {
3076 .phy_id = 0xffffffff,
3077 .phy_id_mask = 0xffffffff,
3078 .name = "Generic PHY",
3079 .get_features = genphy_read_abilities,
3080 .suspend = genphy_suspend,
3081 .resume = genphy_resume,
3082 .set_loopback = genphy_loopback,
3083};
3084
3085static const struct ethtool_phy_ops phy_ethtool_phy_ops = {
3086 .get_sset_count = phy_ethtool_get_sset_count,
3087 .get_strings = phy_ethtool_get_strings,
3088 .get_stats = phy_ethtool_get_stats,
3089 .start_cable_test = phy_start_cable_test,
3090 .start_cable_test_tdr = phy_start_cable_test_tdr,
3091};
3092
3093static int __init phy_init(void)
3094{
3095 int rc;
3096
3097 rc = mdio_bus_init();
3098 if (rc)
3099 return rc;
3100
3101 ethtool_set_ethtool_phy_ops(&phy_ethtool_phy_ops);
3102 features_init();
3103
3104 rc = phy_driver_register(&genphy_c45_driver, THIS_MODULE);
3105 if (rc)
3106 goto err_c45;
3107
3108 rc = phy_driver_register(&genphy_driver, THIS_MODULE);
3109 if (rc) {
3110 phy_driver_unregister(&genphy_c45_driver);
3111err_c45:
3112 mdio_bus_exit();
3113 }
3114
3115 return rc;
3116}
3117
3118static void __exit phy_exit(void)
3119{
3120 phy_driver_unregister(&genphy_c45_driver);
3121 phy_driver_unregister(&genphy_driver);
3122 mdio_bus_exit();
3123 ethtool_set_ethtool_phy_ops(NULL);
3124}
3125
3126subsys_initcall(phy_init);
3127module_exit(phy_exit);
3128