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