1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#ifndef __PHY_H
17#define __PHY_H
18
19#include <linux/compiler.h>
20#include <linux/spinlock.h>
21#include <linux/ethtool.h>
22#include <linux/mdio.h>
23#include <linux/mii.h>
24#include <linux/module.h>
25#include <linux/timer.h>
26#include <linux/workqueue.h>
27#include <linux/mod_devicetable.h>
28
29#include <linux/atomic.h>
30
31#define PHY_DEFAULT_FEATURES (SUPPORTED_Autoneg | \
32 SUPPORTED_TP | \
33 SUPPORTED_MII)
34
35#define PHY_10BT_FEATURES (SUPPORTED_10baseT_Half | \
36 SUPPORTED_10baseT_Full)
37
38#define PHY_100BT_FEATURES (SUPPORTED_100baseT_Half | \
39 SUPPORTED_100baseT_Full)
40
41#define PHY_1000BT_FEATURES (SUPPORTED_1000baseT_Half | \
42 SUPPORTED_1000baseT_Full)
43
44#define PHY_BASIC_FEATURES (PHY_10BT_FEATURES | \
45 PHY_100BT_FEATURES | \
46 PHY_DEFAULT_FEATURES)
47
48#define PHY_GBIT_FEATURES (PHY_BASIC_FEATURES | \
49 PHY_1000BT_FEATURES)
50
51
52
53
54
55
56
57#define PHY_POLL -1
58#define PHY_IGNORE_INTERRUPT -2
59
60#define PHY_HAS_INTERRUPT 0x00000001
61#define PHY_HAS_MAGICANEG 0x00000002
62#define PHY_IS_INTERNAL 0x00000004
63#define MDIO_DEVICE_IS_PHY 0x80000000
64
65
66typedef enum {
67 PHY_INTERFACE_MODE_NA,
68 PHY_INTERFACE_MODE_MII,
69 PHY_INTERFACE_MODE_GMII,
70 PHY_INTERFACE_MODE_SGMII,
71 PHY_INTERFACE_MODE_TBI,
72 PHY_INTERFACE_MODE_REVMII,
73 PHY_INTERFACE_MODE_RMII,
74 PHY_INTERFACE_MODE_RGMII,
75 PHY_INTERFACE_MODE_RGMII_ID,
76 PHY_INTERFACE_MODE_RGMII_RXID,
77 PHY_INTERFACE_MODE_RGMII_TXID,
78 PHY_INTERFACE_MODE_RTBI,
79 PHY_INTERFACE_MODE_SMII,
80 PHY_INTERFACE_MODE_XGMII,
81 PHY_INTERFACE_MODE_MOCA,
82 PHY_INTERFACE_MODE_QSGMII,
83 PHY_INTERFACE_MODE_TRGMII,
84 PHY_INTERFACE_MODE_MAX,
85} phy_interface_t;
86
87
88
89
90
91
92static inline const char *phy_modes(phy_interface_t interface)
93{
94 switch (interface) {
95 case PHY_INTERFACE_MODE_NA:
96 return "";
97 case PHY_INTERFACE_MODE_MII:
98 return "mii";
99 case PHY_INTERFACE_MODE_GMII:
100 return "gmii";
101 case PHY_INTERFACE_MODE_SGMII:
102 return "sgmii";
103 case PHY_INTERFACE_MODE_TBI:
104 return "tbi";
105 case PHY_INTERFACE_MODE_REVMII:
106 return "rev-mii";
107 case PHY_INTERFACE_MODE_RMII:
108 return "rmii";
109 case PHY_INTERFACE_MODE_RGMII:
110 return "rgmii";
111 case PHY_INTERFACE_MODE_RGMII_ID:
112 return "rgmii-id";
113 case PHY_INTERFACE_MODE_RGMII_RXID:
114 return "rgmii-rxid";
115 case PHY_INTERFACE_MODE_RGMII_TXID:
116 return "rgmii-txid";
117 case PHY_INTERFACE_MODE_RTBI:
118 return "rtbi";
119 case PHY_INTERFACE_MODE_SMII:
120 return "smii";
121 case PHY_INTERFACE_MODE_XGMII:
122 return "xgmii";
123 case PHY_INTERFACE_MODE_MOCA:
124 return "moca";
125 case PHY_INTERFACE_MODE_QSGMII:
126 return "qsgmii";
127 case PHY_INTERFACE_MODE_TRGMII:
128 return "trgmii";
129 default:
130 return "unknown";
131 }
132}
133
134
135#define PHY_INIT_TIMEOUT 100000
136#define PHY_STATE_TIME 1
137#define PHY_FORCE_TIMEOUT 10
138#define PHY_AN_TIMEOUT 10
139
140#define PHY_MAX_ADDR 32
141
142
143#define PHY_ID_FMT "%s:%02x"
144
145
146
147
148
149#define MII_BUS_ID_SIZE (20 - 3)
150
151
152
153#define MII_ADDR_C45 (1<<30)
154
155struct device;
156struct sk_buff;
157
158
159
160
161
162struct mii_bus {
163 struct module *owner;
164 const char *name;
165 char id[MII_BUS_ID_SIZE];
166 void *priv;
167 int (*read)(struct mii_bus *bus, int addr, int regnum);
168 int (*write)(struct mii_bus *bus, int addr, int regnum, u16 val);
169 int (*reset)(struct mii_bus *bus);
170
171
172
173
174
175 struct mutex mdio_lock;
176
177 struct device *parent;
178 enum {
179 MDIOBUS_ALLOCATED = 1,
180 MDIOBUS_REGISTERED,
181 MDIOBUS_UNREGISTERED,
182 MDIOBUS_RELEASED,
183 } state;
184 struct device dev;
185
186
187 struct mdio_device *mdio_map[PHY_MAX_ADDR];
188
189
190 u32 phy_mask;
191
192
193 u32 phy_ignore_ta_mask;
194
195
196
197
198
199 int irq[PHY_MAX_ADDR];
200};
201#define to_mii_bus(d) container_of(d, struct mii_bus, dev)
202
203struct mii_bus *mdiobus_alloc_size(size_t);
204static inline struct mii_bus *mdiobus_alloc(void)
205{
206 return mdiobus_alloc_size(0);
207}
208
209int __mdiobus_register(struct mii_bus *bus, struct module *owner);
210#define mdiobus_register(bus) __mdiobus_register(bus, THIS_MODULE)
211void mdiobus_unregister(struct mii_bus *bus);
212void mdiobus_free(struct mii_bus *bus);
213struct mii_bus *devm_mdiobus_alloc_size(struct device *dev, int sizeof_priv);
214static inline struct mii_bus *devm_mdiobus_alloc(struct device *dev)
215{
216 return devm_mdiobus_alloc_size(dev, 0);
217}
218
219void devm_mdiobus_free(struct device *dev, struct mii_bus *bus);
220struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr);
221
222#define PHY_INTERRUPT_DISABLED 0x0
223#define PHY_INTERRUPT_ENABLED 0x80000000
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305enum phy_state {
306 PHY_DOWN = 0,
307 PHY_STARTING,
308 PHY_READY,
309 PHY_PENDING,
310 PHY_UP,
311 PHY_AN,
312 PHY_RUNNING,
313 PHY_NOLINK,
314 PHY_FORCING,
315 PHY_CHANGELINK,
316 PHY_HALTED,
317 PHY_RESUMING
318};
319
320
321
322
323
324
325struct phy_c45_device_ids {
326 u32 devices_in_package;
327 u32 device_ids[8];
328};
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361struct phy_device {
362 struct mdio_device mdio;
363
364
365
366 struct phy_driver *drv;
367
368 u32 phy_id;
369
370 struct phy_c45_device_ids c45_ids;
371 bool is_c45;
372 bool is_internal;
373 bool is_pseudo_fixed_link;
374 bool has_fixups;
375 bool suspended;
376
377 enum phy_state state;
378
379 u32 dev_flags;
380
381 phy_interface_t interface;
382
383
384
385
386
387 int speed;
388 int duplex;
389 int pause;
390 int asym_pause;
391
392
393 int link;
394
395
396 u32 interrupts;
397
398
399
400 u32 supported;
401 u32 advertising;
402 u32 lp_advertising;
403
404 int autoneg;
405
406 int link_timeout;
407
408
409
410
411
412 int irq;
413
414
415
416 void *priv;
417
418
419 struct work_struct phy_queue;
420 struct delayed_work state_queue;
421 atomic_t irq_disable;
422
423 struct mutex lock;
424
425 struct net_device *attached_dev;
426
427 u8 mdix;
428
429 void (*adjust_link)(struct net_device *dev);
430};
431#define to_phy_device(d) container_of(to_mdio_device(d), \
432 struct phy_device, mdio)
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455struct phy_driver {
456 struct mdio_driver_common mdiodrv;
457 u32 phy_id;
458 char *name;
459 unsigned int phy_id_mask;
460 u32 features;
461 u32 flags;
462 const void *driver_data;
463
464
465
466
467 int (*soft_reset)(struct phy_device *phydev);
468
469
470
471
472
473 int (*config_init)(struct phy_device *phydev);
474
475
476
477
478
479 int (*probe)(struct phy_device *phydev);
480
481
482 int (*suspend)(struct phy_device *phydev);
483 int (*resume)(struct phy_device *phydev);
484
485
486
487
488
489
490
491 int (*config_aneg)(struct phy_device *phydev);
492
493
494 int (*aneg_done)(struct phy_device *phydev);
495
496
497 int (*read_status)(struct phy_device *phydev);
498
499
500 int (*ack_interrupt)(struct phy_device *phydev);
501
502
503 int (*config_intr)(struct phy_device *phydev);
504
505
506
507
508
509 int (*did_interrupt)(struct phy_device *phydev);
510
511
512 void (*remove)(struct phy_device *phydev);
513
514
515
516
517
518 int (*match_phy_device)(struct phy_device *phydev);
519
520
521 int (*ts_info)(struct phy_device *phydev, struct ethtool_ts_info *ti);
522
523
524 int (*hwtstamp)(struct phy_device *phydev, struct ifreq *ifr);
525
526
527
528
529
530
531
532
533 bool (*rxtstamp)(struct phy_device *dev, struct sk_buff *skb, int type);
534
535
536
537
538
539
540
541 void (*txtstamp)(struct phy_device *dev, struct sk_buff *skb, int type);
542
543
544
545
546 int (*set_wol)(struct phy_device *dev, struct ethtool_wolinfo *wol);
547
548
549 void (*get_wol)(struct phy_device *dev, struct ethtool_wolinfo *wol);
550
551
552
553
554
555
556
557
558 void (*link_change_notify)(struct phy_device *dev);
559
560
561
562
563
564
565
566 int (*read_mmd_indirect)(struct phy_device *dev, int ptrad,
567 int devnum, int regnum);
568
569
570
571
572
573
574
575 void (*write_mmd_indirect)(struct phy_device *dev, int ptrad,
576 int devnum, int regnum, u32 val);
577
578
579
580 int (*module_info)(struct phy_device *dev,
581 struct ethtool_modinfo *modinfo);
582
583
584 int (*module_eeprom)(struct phy_device *dev,
585 struct ethtool_eeprom *ee, u8 *data);
586
587
588 int (*get_sset_count)(struct phy_device *dev);
589 void (*get_strings)(struct phy_device *dev, u8 *data);
590 void (*get_stats)(struct phy_device *dev,
591 struct ethtool_stats *stats, u64 *data);
592};
593#define to_phy_driver(d) container_of(to_mdio_common_driver(d), \
594 struct phy_driver, mdiodrv)
595
596#define PHY_ANY_ID "MATCH ANY PHY"
597#define PHY_ANY_UID 0xffffffff
598
599
600struct phy_fixup {
601 struct list_head list;
602 char bus_id[20];
603 u32 phy_uid;
604 u32 phy_uid_mask;
605 int (*run)(struct phy_device *phydev);
606};
607
608
609
610
611
612
613
614
615
616
617static inline int phy_read_mmd(struct phy_device *phydev, int devad, u32 regnum)
618{
619 if (!phydev->is_c45)
620 return -EOPNOTSUPP;
621
622 return mdiobus_read(phydev->mdio.bus, phydev->mdio.addr,
623 MII_ADDR_C45 | (devad << 16) | (regnum & 0xffff));
624}
625
626
627
628
629
630
631
632
633
634
635int phy_read_mmd_indirect(struct phy_device *phydev, int prtad, int devad);
636
637
638
639
640
641
642
643
644
645
646static inline int phy_read(struct phy_device *phydev, u32 regnum)
647{
648 return mdiobus_read(phydev->mdio.bus, phydev->mdio.addr, regnum);
649}
650
651
652
653
654
655
656
657
658
659
660
661static inline int phy_write(struct phy_device *phydev, u32 regnum, u16 val)
662{
663 return mdiobus_write(phydev->mdio.bus, phydev->mdio.addr, regnum, val);
664}
665
666
667
668
669
670
671
672
673static inline bool phy_interrupt_is_valid(struct phy_device *phydev)
674{
675 return phydev->irq != PHY_POLL && phydev->irq != PHY_IGNORE_INTERRUPT;
676}
677
678
679
680
681
682static inline bool phy_is_internal(struct phy_device *phydev)
683{
684 return phydev->is_internal;
685}
686
687
688
689
690
691
692static inline bool phy_interface_is_rgmii(struct phy_device *phydev)
693{
694 return phydev->interface >= PHY_INTERFACE_MODE_RGMII &&
695 phydev->interface <= PHY_INTERFACE_MODE_RGMII_TXID;
696};
697
698
699
700
701
702
703static inline bool phy_is_pseudo_fixed_link(struct phy_device *phydev)
704{
705 return phydev->is_pseudo_fixed_link;
706}
707
708
709
710
711
712
713
714
715
716
717
718static inline int phy_write_mmd(struct phy_device *phydev, int devad,
719 u32 regnum, u16 val)
720{
721 if (!phydev->is_c45)
722 return -EOPNOTSUPP;
723
724 regnum = MII_ADDR_C45 | ((devad & 0x1f) << 16) | (regnum & 0xffff);
725
726 return mdiobus_write(phydev->mdio.bus, phydev->mdio.addr, regnum, val);
727}
728
729
730
731
732
733
734
735
736
737
738
739void phy_write_mmd_indirect(struct phy_device *phydev, int prtad,
740 int devad, u32 data);
741
742struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id,
743 bool is_c45,
744 struct phy_c45_device_ids *c45_ids);
745struct phy_device *get_phy_device(struct mii_bus *bus, int addr, bool is_c45);
746int phy_device_register(struct phy_device *phy);
747void phy_device_remove(struct phy_device *phydev);
748int phy_init_hw(struct phy_device *phydev);
749int phy_suspend(struct phy_device *phydev);
750int phy_resume(struct phy_device *phydev);
751struct phy_device *phy_attach(struct net_device *dev, const char *bus_id,
752 phy_interface_t interface);
753struct phy_device *phy_find_first(struct mii_bus *bus);
754int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
755 u32 flags, phy_interface_t interface);
756int phy_connect_direct(struct net_device *dev, struct phy_device *phydev,
757 void (*handler)(struct net_device *),
758 phy_interface_t interface);
759struct phy_device *phy_connect(struct net_device *dev, const char *bus_id,
760 void (*handler)(struct net_device *),
761 phy_interface_t interface);
762void phy_disconnect(struct phy_device *phydev);
763void phy_detach(struct phy_device *phydev);
764void phy_start(struct phy_device *phydev);
765void phy_stop(struct phy_device *phydev);
766int phy_start_aneg(struct phy_device *phydev);
767
768int phy_stop_interrupts(struct phy_device *phydev);
769
770static inline int phy_read_status(struct phy_device *phydev)
771{
772 return phydev->drv->read_status(phydev);
773}
774
775#define phydev_err(_phydev, format, args...) \
776 dev_err(&_phydev->mdio.dev, format, ##args)
777
778#define phydev_dbg(_phydev, format, args...) \
779 dev_dbg(&_phydev->mdio.dev, format, ##args);
780
781static inline const char *phydev_name(const struct phy_device *phydev)
782{
783 return dev_name(&phydev->mdio.dev);
784}
785
786void phy_attached_print(struct phy_device *phydev, const char *fmt, ...)
787 __printf(2, 3);
788void phy_attached_info(struct phy_device *phydev);
789int genphy_config_init(struct phy_device *phydev);
790int genphy_setup_forced(struct phy_device *phydev);
791int genphy_restart_aneg(struct phy_device *phydev);
792int genphy_config_aneg(struct phy_device *phydev);
793int genphy_aneg_done(struct phy_device *phydev);
794int genphy_update_link(struct phy_device *phydev);
795int genphy_read_status(struct phy_device *phydev);
796int genphy_suspend(struct phy_device *phydev);
797int genphy_resume(struct phy_device *phydev);
798int genphy_soft_reset(struct phy_device *phydev);
799void phy_driver_unregister(struct phy_driver *drv);
800void phy_drivers_unregister(struct phy_driver *drv, int n);
801int phy_driver_register(struct phy_driver *new_driver, struct module *owner);
802int phy_drivers_register(struct phy_driver *new_driver, int n,
803 struct module *owner);
804void phy_state_machine(struct work_struct *work);
805void phy_change(struct work_struct *work);
806void phy_mac_interrupt(struct phy_device *phydev, int new_link);
807void phy_start_machine(struct phy_device *phydev);
808void phy_stop_machine(struct phy_device *phydev);
809int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd);
810int phy_ethtool_gset(struct phy_device *phydev, struct ethtool_cmd *cmd);
811int phy_ethtool_ksettings_get(struct phy_device *phydev,
812 struct ethtool_link_ksettings *cmd);
813int phy_ethtool_ksettings_set(struct phy_device *phydev,
814 const struct ethtool_link_ksettings *cmd);
815int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd);
816int phy_start_interrupts(struct phy_device *phydev);
817void phy_print_status(struct phy_device *phydev);
818void phy_device_free(struct phy_device *phydev);
819int phy_set_max_speed(struct phy_device *phydev, u32 max_speed);
820
821int phy_register_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask,
822 int (*run)(struct phy_device *));
823int phy_register_fixup_for_id(const char *bus_id,
824 int (*run)(struct phy_device *));
825int phy_register_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask,
826 int (*run)(struct phy_device *));
827
828int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable);
829int phy_get_eee_err(struct phy_device *phydev);
830int phy_ethtool_set_eee(struct phy_device *phydev, struct ethtool_eee *data);
831int phy_ethtool_get_eee(struct phy_device *phydev, struct ethtool_eee *data);
832int phy_ethtool_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol);
833void phy_ethtool_get_wol(struct phy_device *phydev,
834 struct ethtool_wolinfo *wol);
835int phy_ethtool_get_link_ksettings(struct net_device *ndev,
836 struct ethtool_link_ksettings *cmd);
837int phy_ethtool_set_link_ksettings(struct net_device *ndev,
838 const struct ethtool_link_ksettings *cmd);
839
840int __init mdio_bus_init(void);
841void mdio_bus_exit(void);
842
843extern struct bus_type mdio_bus_type;
844
845
846
847
848
849
850
851
852
853#define phy_module_driver(__phy_drivers, __count) \
854static int __init phy_module_init(void) \
855{ \
856 return phy_drivers_register(__phy_drivers, __count, THIS_MODULE); \
857} \
858module_init(phy_module_init); \
859static void __exit phy_module_exit(void) \
860{ \
861 phy_drivers_unregister(__phy_drivers, __count); \
862} \
863module_exit(phy_module_exit)
864
865#define module_phy_driver(__phy_drivers) \
866 phy_module_driver(__phy_drivers, ARRAY_SIZE(__phy_drivers))
867
868#endif
869