Blame view

include/linux/phy.h 26.3 KB
00db8189d   Andy Fleming   This patch adds a...
1
  /*
00db8189d   Andy Fleming   This patch adds a...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   * Framework and drivers for configuring and reading different PHYs
   * Based on code in sungem_phy.c and gianfar_phy.c
   *
   * Author: Andy Fleming
   *
   * Copyright (c) 2004 Freescale Semiconductor, Inc.
   *
   * This program is free software; you can redistribute  it and/or modify it
   * under  the terms of  the GNU General  Public License as published by the
   * Free Software Foundation;  either version 2 of the  License, or (at your
   * option) any later version.
   *
   */
  
  #ifndef __PHY_H
  #define __PHY_H
  
  #include <linux/spinlock.h>
13df29f69   Maciej W. Rozycki   [PATCH] 2.6.18: s...
20
21
  #include <linux/ethtool.h>
  #include <linux/mii.h>
3e3aaf649   Russell King   phy: fix mdiobus ...
22
  #include <linux/module.h>
13df29f69   Maciej W. Rozycki   [PATCH] 2.6.18: s...
23
24
  #include <linux/timer.h>
  #include <linux/workqueue.h>
8626d3b43   David Woodhouse   phylib: Support p...
25
  #include <linux/mod_devicetable.h>
00db8189d   Andy Fleming   This patch adds a...
26

60063497a   Arun Sharma   atomic: use <linu...
27
  #include <linux/atomic.h>
0ac495273   Maciej W. Rozycki   PHYLIB: IRQ event...
28

e9fbdf176   Florian Fainelli   net: phy: breakdo...
29
  #define PHY_DEFAULT_FEATURES	(SUPPORTED_Autoneg | \
00db8189d   Andy Fleming   This patch adds a...
30
31
  				 SUPPORTED_TP | \
  				 SUPPORTED_MII)
e9fbdf176   Florian Fainelli   net: phy: breakdo...
32
33
34
35
36
37
38
  #define PHY_10BT_FEATURES	(SUPPORTED_10baseT_Half | \
  				 SUPPORTED_10baseT_Full)
  
  #define PHY_100BT_FEATURES	(SUPPORTED_100baseT_Half | \
  				 SUPPORTED_100baseT_Full)
  
  #define PHY_1000BT_FEATURES	(SUPPORTED_1000baseT_Half | \
00db8189d   Andy Fleming   This patch adds a...
39
  				 SUPPORTED_1000baseT_Full)
e9fbdf176   Florian Fainelli   net: phy: breakdo...
40
41
42
43
44
45
  #define PHY_BASIC_FEATURES	(PHY_10BT_FEATURES | \
  				 PHY_100BT_FEATURES | \
  				 PHY_DEFAULT_FEATURES)
  
  #define PHY_GBIT_FEATURES	(PHY_BASIC_FEATURES | \
  				 PHY_1000BT_FEATURES)
c5e38a949   Andy Fleming   phy: Clean up hea...
46
47
  /*
   * Set phydev->irq to PHY_POLL if interrupts are not supported,
00db8189d   Andy Fleming   This patch adds a...
48
49
50
51
52
53
54
55
   * or not desired for this PHY.  Set to PHY_IGNORE_INTERRUPT if
   * the attached driver handles the interrupt
   */
  #define PHY_POLL		-1
  #define PHY_IGNORE_INTERRUPT	-2
  
  #define PHY_HAS_INTERRUPT	0x00000001
  #define PHY_HAS_MAGICANEG	0x00000002
4284b6a53   Florian Fainelli   phy: allow driver...
56
  #define PHY_IS_INTERNAL		0x00000004
00db8189d   Andy Fleming   This patch adds a...
57

e8a2b6a42   Andy Fleming   [PATCH] PHY: Add ...
58
59
  /* Interface Mode definitions */
  typedef enum {
4157ef1b8   Shawn Guo   net: ibm_newemac:...
60
  	PHY_INTERFACE_MODE_NA,
e8a2b6a42   Andy Fleming   [PATCH] PHY: Add ...
61
62
63
64
  	PHY_INTERFACE_MODE_MII,
  	PHY_INTERFACE_MODE_GMII,
  	PHY_INTERFACE_MODE_SGMII,
  	PHY_INTERFACE_MODE_TBI,
2cc70ba4c   Florian Fainelli   phy: add reverse ...
65
  	PHY_INTERFACE_MODE_REVMII,
e8a2b6a42   Andy Fleming   [PATCH] PHY: Add ...
66
67
  	PHY_INTERFACE_MODE_RMII,
  	PHY_INTERFACE_MODE_RGMII,
a999589cc   Kim Phillips   phylib: add RGMII...
68
  	PHY_INTERFACE_MODE_RGMII_ID,
7d400a4c5   Kim Phillips   phylib: add PHY i...
69
70
  	PHY_INTERFACE_MODE_RGMII_RXID,
  	PHY_INTERFACE_MODE_RGMII_TXID,
4157ef1b8   Shawn Guo   net: ibm_newemac:...
71
72
  	PHY_INTERFACE_MODE_RTBI,
  	PHY_INTERFACE_MODE_SMII,
898dd0bda   Andy Fleming   phylib: introduce...
73
  	PHY_INTERFACE_MODE_XGMII,
fd70f72c6   Florian Fainelli   net: phy: add MoC...
74
  	PHY_INTERFACE_MODE_MOCA,
b9d12085f   Thomas Petazzoni   net: phy: add min...
75
  	PHY_INTERFACE_MODE_QSGMII,
8a2fe56e8   Florian Fainelli   net: phy: re-desi...
76
  	PHY_INTERFACE_MODE_MAX,
e8a2b6a42   Andy Fleming   [PATCH] PHY: Add ...
77
  } phy_interface_t;
8a2fe56e8   Florian Fainelli   net: phy: re-desi...
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
  /**
   * It maps 'enum phy_interface_t' found in include/linux/phy.h
   * into the device tree binding of 'phy-mode', so that Ethernet
   * device driver can get phy interface from device tree.
   */
  static inline const char *phy_modes(phy_interface_t interface)
  {
  	switch (interface) {
  	case PHY_INTERFACE_MODE_NA:
  		return "";
  	case PHY_INTERFACE_MODE_MII:
  		return "mii";
  	case PHY_INTERFACE_MODE_GMII:
  		return "gmii";
  	case PHY_INTERFACE_MODE_SGMII:
  		return "sgmii";
  	case PHY_INTERFACE_MODE_TBI:
  		return "tbi";
  	case PHY_INTERFACE_MODE_REVMII:
  		return "rev-mii";
  	case PHY_INTERFACE_MODE_RMII:
  		return "rmii";
  	case PHY_INTERFACE_MODE_RGMII:
  		return "rgmii";
  	case PHY_INTERFACE_MODE_RGMII_ID:
  		return "rgmii-id";
  	case PHY_INTERFACE_MODE_RGMII_RXID:
  		return "rgmii-rxid";
  	case PHY_INTERFACE_MODE_RGMII_TXID:
  		return "rgmii-txid";
  	case PHY_INTERFACE_MODE_RTBI:
  		return "rtbi";
  	case PHY_INTERFACE_MODE_SMII:
  		return "smii";
  	case PHY_INTERFACE_MODE_XGMII:
  		return "xgmii";
fd70f72c6   Florian Fainelli   net: phy: add MoC...
114
115
  	case PHY_INTERFACE_MODE_MOCA:
  		return "moca";
b9d12085f   Thomas Petazzoni   net: phy: add min...
116
117
  	case PHY_INTERFACE_MODE_QSGMII:
  		return "qsgmii";
8a2fe56e8   Florian Fainelli   net: phy: re-desi...
118
119
120
121
  	default:
  		return "unknown";
  	}
  }
00db8189d   Andy Fleming   This patch adds a...
122

e8a2b6a42   Andy Fleming   [PATCH] PHY: Add ...
123
  #define PHY_INIT_TIMEOUT	100000
00db8189d   Andy Fleming   This patch adds a...
124
125
126
  #define PHY_STATE_TIME		1
  #define PHY_FORCE_TIMEOUT	10
  #define PHY_AN_TIMEOUT		10
e8a2b6a42   Andy Fleming   [PATCH] PHY: Add ...
127
  #define PHY_MAX_ADDR	32
00db8189d   Andy Fleming   This patch adds a...
128

a4d00f179   Kumar Gala   [PATCH] phy: Adde...
129
  /* Used when trying to connect to a specific phy (mii bus id:phy device id) */
9d9326d3b   Andy Fleming   phy: Change mii_b...
130
131
132
133
134
135
  #define PHY_ID_FMT "%s:%02x"
  
  /*
   * Need to be a little smaller than phydev->dev.bus_id to leave room
   * for the ":%02x"
   */
8e401eccd   David S. Miller   phy: Eliminate re...
136
  #define MII_BUS_ID_SIZE	(20 - 3)
a4d00f179   Kumar Gala   [PATCH] phy: Adde...
137

abf35df21   Jason Gunthorpe   NET: Support clau...
138
139
140
  /* Or MII_ADDR_C45 into regnum for read/write on mii_bus to enable the 21 bit
     IEEE 802.3ae clause 45 addressing mode used by 10GIGE phy chips. */
  #define MII_ADDR_C45 (1<<30)
313162d0b   Paul Gortmaker   device.h: audit a...
141
142
  struct device;
  struct sk_buff;
c5e38a949   Andy Fleming   phy: Clean up hea...
143
144
145
146
  /*
   * The Bus class for PHYs.  Devices which provide access to
   * PHYs should register using this structure
   */
00db8189d   Andy Fleming   This patch adds a...
147
  struct mii_bus {
3e3aaf649   Russell King   phy: fix mdiobus ...
148
  	struct module *owner;
00db8189d   Andy Fleming   This patch adds a...
149
  	const char *name;
9d9326d3b   Andy Fleming   phy: Change mii_b...
150
  	char id[MII_BUS_ID_SIZE];
00db8189d   Andy Fleming   This patch adds a...
151
152
153
154
  	void *priv;
  	int (*read)(struct mii_bus *bus, int phy_id, int regnum);
  	int (*write)(struct mii_bus *bus, int phy_id, int regnum, u16 val);
  	int (*reset)(struct mii_bus *bus);
c5e38a949   Andy Fleming   phy: Clean up hea...
155
156
157
158
  	/*
  	 * A lock to ensure that only one thing can read/write
  	 * the MDIO bus at a time
  	 */
35b5f6b1a   Nate Case   PHYLIB: Locking f...
159
  	struct mutex mdio_lock;
00db8189d   Andy Fleming   This patch adds a...
160

18ee49ddb   Lennert Buytenhek   phylib: rename mi...
161
  	struct device *parent;
46abc0217   Lennert Buytenhek   phylib: give mdio...
162
163
164
165
166
167
168
  	enum {
  		MDIOBUS_ALLOCATED = 1,
  		MDIOBUS_REGISTERED,
  		MDIOBUS_UNREGISTERED,
  		MDIOBUS_RELEASED,
  	} state;
  	struct device dev;
00db8189d   Andy Fleming   This patch adds a...
169
170
171
  
  	/* list of all PHYs on bus */
  	struct phy_device *phy_map[PHY_MAX_ADDR];
c68839963   Peter Meerwald   net: Improve comm...
172
  	/* PHY addresses to be ignored when probing */
f896424cb   Matt Porter   [PATCH] phy addre...
173
  	u32 phy_mask;
922f2dd1b   Florian Fainelli   net: phy: Add phy...
174
175
  	/* PHY addresses to ignore the TA/read failure */
  	u32 phy_ignore_ta_mask;
c5e38a949   Andy Fleming   phy: Clean up hea...
176
177
178
179
  	/*
  	 * Pointer to an array of interrupts, each PHY's
  	 * interrupt at the index matching its address
  	 */
00db8189d   Andy Fleming   This patch adds a...
180
181
  	int *irq;
  };
46abc0217   Lennert Buytenhek   phylib: give mdio...
182
  #define to_mii_bus(d) container_of(d, struct mii_bus, dev)
00db8189d   Andy Fleming   This patch adds a...
183

eb8a54a78   Timur Tabi   phylib: introduce...
184
185
186
187
188
  struct mii_bus *mdiobus_alloc_size(size_t);
  static inline struct mii_bus *mdiobus_alloc(void)
  {
  	return mdiobus_alloc_size(0);
  }
3e3aaf649   Russell King   phy: fix mdiobus ...
189
190
  int __mdiobus_register(struct mii_bus *bus, struct module *owner);
  #define mdiobus_register(bus) __mdiobus_register(bus, THIS_MODULE)
2e8881032   Lennert Buytenhek   phylib: add mdiob...
191
192
  void mdiobus_unregister(struct mii_bus *bus);
  void mdiobus_free(struct mii_bus *bus);
6d48f44b7   Grygorii Strashko   mdio_bus: impleme...
193
194
195
196
197
198
199
  struct mii_bus *devm_mdiobus_alloc_size(struct device *dev, int sizeof_priv);
  static inline struct mii_bus *devm_mdiobus_alloc(struct device *dev)
  {
  	return devm_mdiobus_alloc_size(dev, 0);
  }
  
  void devm_mdiobus_free(struct device *dev, struct mii_bus *bus);
2e8881032   Lennert Buytenhek   phylib: add mdiob...
200
  struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr);
abf35df21   Jason Gunthorpe   NET: Support clau...
201
  int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum);
21dd19fed   Neil Armstrong   net: phy: Add nes...
202
  int mdiobus_read_nested(struct mii_bus *bus, int addr, u32 regnum);
abf35df21   Jason Gunthorpe   NET: Support clau...
203
  int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val);
21dd19fed   Neil Armstrong   net: phy: Add nes...
204
  int mdiobus_write_nested(struct mii_bus *bus, int addr, u32 regnum, u16 val);
2e8881032   Lennert Buytenhek   phylib: add mdiob...
205

e8a2b6a42   Andy Fleming   [PATCH] PHY: Add ...
206
207
  #define PHY_INTERRUPT_DISABLED	0x0
  #define PHY_INTERRUPT_ENABLED	0x80000000
00db8189d   Andy Fleming   This patch adds a...
208
209
210
211
212
213
214
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
  
  /* PHY state machine states:
   *
   * DOWN: PHY device and driver are not ready for anything.  probe
   * should be called if and only if the PHY is in this state,
   * given that the PHY device exists.
   * - PHY driver probe function will, depending on the PHY, set
   * the state to STARTING or READY
   *
   * STARTING:  PHY device is coming up, and the ethernet driver is
   * not ready.  PHY drivers may set this in the probe function.
   * If they do, they are responsible for making sure the state is
   * eventually set to indicate whether the PHY is UP or READY,
   * depending on the state when the PHY is done starting up.
   * - PHY driver will set the state to READY
   * - start will set the state to PENDING
   *
   * READY: PHY is ready to send and receive packets, but the
   * controller is not.  By default, PHYs which do not implement
   * probe will be set to this state by phy_probe().  If the PHY
   * driver knows the PHY is ready, and the PHY state is STARTING,
   * then it sets this STATE.
   * - start will set the state to UP
   *
   * PENDING: PHY device is coming up, but the ethernet driver is
   * ready.  phy_start will set this state if the PHY state is
   * STARTING.
   * - PHY driver will set the state to UP when the PHY is ready
   *
   * UP: The PHY and attached device are ready to do work.
   * Interrupts should be started here.
   * - timer moves to AN
   *
   * AN: The PHY is currently negotiating the link state.  Link is
   * therefore down for now.  phy_timer will set this state when it
   * detects the state is UP.  config_aneg will set this state
   * whenever called with phydev->autoneg set to AUTONEG_ENABLE.
   * - If autonegotiation finishes, but there's no link, it sets
   *   the state to NOLINK.
   * - If aneg finishes with link, it sets the state to RUNNING,
   *   and calls adjust_link
   * - If autonegotiation did not finish after an arbitrary amount
   *   of time, autonegotiation should be tried again if the PHY
   *   supports "magic" autonegotiation (back to AN)
   * - If it didn't finish, and no magic_aneg, move to FORCING.
   *
   * NOLINK: PHY is up, but not currently plugged in.
   * - If the timer notes that the link comes back, we move to RUNNING
   * - config_aneg moves to AN
   * - phy_stop moves to HALTED
   *
   * FORCING: PHY is being configured with forced settings
   * - if link is up, move to RUNNING
   * - If link is down, we drop to the next highest setting, and
   *   retry (FORCING) after a timeout
   * - phy_stop moves to HALTED
   *
   * RUNNING: PHY is currently up, running, and possibly sending
   * and/or receiving packets
   * - timer will set CHANGELINK if we're polling (this ensures the
   *   link state is polled every other cycle of this state machine,
   *   which makes it every other second)
   * - irq will set CHANGELINK
   * - config_aneg will set AN
   * - phy_stop moves to HALTED
   *
   * CHANGELINK: PHY experienced a change in link state
   * - timer moves to RUNNING if link
   * - timer moves to NOLINK if the link is down
   * - phy_stop moves to HALTED
   *
   * HALTED: PHY is up, but no polling or interrupts are done. Or
   * PHY is in an error state.
   *
   * - phy_start moves to RESUMING
   *
   * RESUMING: PHY was halted, but now wants to run again.
   * - If we are forcing, or aneg is done, timer moves to RUNNING
   * - If aneg is not done, timer moves to AN
   * - phy_stop moves to HALTED
   */
  enum phy_state {
4017b4d32   Sergei Shtylyov   <linux/phy.h>: co...
290
  	PHY_DOWN = 0,
00db8189d   Andy Fleming   This patch adds a...
291
292
293
294
295
296
297
298
299
300
301
302
  	PHY_STARTING,
  	PHY_READY,
  	PHY_PENDING,
  	PHY_UP,
  	PHY_AN,
  	PHY_RUNNING,
  	PHY_NOLINK,
  	PHY_FORCING,
  	PHY_CHANGELINK,
  	PHY_HALTED,
  	PHY_RESUMING
  };
ac28b9f8c   David Daney   netdev/phy: Handl...
303
304
305
306
307
308
309
310
311
  /**
   * struct phy_c45_device_ids - 802.3-c45 Device Identifiers
   * @devices_in_package: Bit vector of devices present.
   * @device_ids: The device identifer for each present device.
   */
  struct phy_c45_device_ids {
  	u32 devices_in_package;
  	u32 device_ids[8];
  };
c1f19b51d   Richard Cochran   net: support time...
312

00db8189d   Andy Fleming   This patch adds a...
313
314
315
316
317
318
  /* phy_device: An instance of a PHY
   *
   * drv: Pointer to the driver for this PHY instance
   * bus: Pointer to the bus this PHY is on
   * dev: driver model device structure for this PHY
   * phy_id: UID for this device found during discovery
ac28b9f8c   David Daney   netdev/phy: Handl...
319
320
   * c45_ids: 802.3-c45 Device Identifers if is_c45.
   * is_c45:  Set to true if this phy uses clause 45 addressing.
4284b6a53   Florian Fainelli   phy: allow driver...
321
   * is_internal: Set to true if this phy is internal to a MAC.
5a11dd7d9   Florian Fainelli   net: phy: Allow P...
322
   * is_pseudo_fixed_link: Set to true if this phy is an Ethernet switch, etc.
aae88261a   Florian Fainelli   net: phy: documen...
323
   * has_fixups: Set to true if this phy has fixups/quirks.
8a477a6fb   Florian Fainelli   net: phy: keep tr...
324
   * suspended: Set to true if this phy has been suspended successfully.
00db8189d   Andy Fleming   This patch adds a...
325
326
327
328
329
330
331
332
333
334
335
   * state: state of the PHY for management purposes
   * dev_flags: Device-specific flags used by the PHY driver.
   * addr: Bus address of PHY
   * link_timeout: The number of timer firings to wait before the
   * giving up on the current attempt at acquiring a link
   * irq: IRQ number of the PHY's interrupt (-1 if none)
   * phy_timer: The timer for handling the state machine
   * phy_queue: A work_queue for the interrupt
   * attached_dev: The attached enet driver's device instance ptr
   * adjust_link: Callback for the enet controller to respond to
   * changes in the link state.
00db8189d   Andy Fleming   This patch adds a...
336
   *
114002bc1   Florian Fainelli   net: phy: report ...
337
338
   * speed, duplex, pause, supported, advertising, lp_advertising,
   * and autoneg are used like in mii_if_info
00db8189d   Andy Fleming   This patch adds a...
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
   *
   * interrupts currently only supports enabled or disabled,
   * but could be changed in the future to support enabling
   * and disabling specific interrupts
   *
   * Contains some infrastructure for polling and interrupt
   * handling, as well as handling shifts in PHY hardware state
   */
  struct phy_device {
  	/* Information about the PHY type */
  	/* And management functions */
  	struct phy_driver *drv;
  
  	struct mii_bus *bus;
  
  	struct device dev;
  
  	u32 phy_id;
ac28b9f8c   David Daney   netdev/phy: Handl...
357
358
  	struct phy_c45_device_ids c45_ids;
  	bool is_c45;
4284b6a53   Florian Fainelli   phy: allow driver...
359
  	bool is_internal;
5a11dd7d9   Florian Fainelli   net: phy: Allow P...
360
  	bool is_pseudo_fixed_link;
b0ae009f3   Florian Fainelli   net: phy: add "ha...
361
  	bool has_fixups;
8a477a6fb   Florian Fainelli   net: phy: keep tr...
362
  	bool suspended;
ac28b9f8c   David Daney   netdev/phy: Handl...
363

00db8189d   Andy Fleming   This patch adds a...
364
365
366
  	enum phy_state state;
  
  	u32 dev_flags;
e8a2b6a42   Andy Fleming   [PATCH] PHY: Add ...
367
  	phy_interface_t interface;
c68839963   Peter Meerwald   net: Improve comm...
368
  	/* Bus address of the PHY (0-31) */
00db8189d   Andy Fleming   This patch adds a...
369
  	int addr;
c5e38a949   Andy Fleming   phy: Clean up hea...
370
371
  	/*
  	 * forced speed & duplex (no autoneg)
00db8189d   Andy Fleming   This patch adds a...
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
  	 * partner speed & duplex & pause (autoneg)
  	 */
  	int speed;
  	int duplex;
  	int pause;
  	int asym_pause;
  
  	/* The most recently read link state */
  	int link;
  
  	/* Enabled Interrupts */
  	u32 interrupts;
  
  	/* Union of PHY and Attached devices' supported modes */
  	/* See mii.h for more info */
  	u32 supported;
  	u32 advertising;
114002bc1   Florian Fainelli   net: phy: report ...
389
  	u32 lp_advertising;
00db8189d   Andy Fleming   This patch adds a...
390
391
392
393
  
  	int autoneg;
  
  	int link_timeout;
c5e38a949   Andy Fleming   phy: Clean up hea...
394
395
396
397
  	/*
  	 * Interrupt number for this PHY
  	 * -1 means no interrupt
  	 */
00db8189d   Andy Fleming   This patch adds a...
398
399
400
401
402
403
404
405
  	int irq;
  
  	/* private data pointer */
  	/* For use by PHYs to maintain extra state */
  	void *priv;
  
  	/* Interrupt and Polling infrastructure */
  	struct work_struct phy_queue;
a390d1f37   Marcin Slusarz   phylib: convert s...
406
  	struct delayed_work state_queue;
0ac495273   Maciej W. Rozycki   PHYLIB: IRQ event...
407
  	atomic_t irq_disable;
00db8189d   Andy Fleming   This patch adds a...
408

35b5f6b1a   Nate Case   PHYLIB: Locking f...
409
  	struct mutex lock;
00db8189d   Andy Fleming   This patch adds a...
410
411
  
  	struct net_device *attached_dev;
634ec36cc   David Thomson   net: phy: Pass md...
412
  	u8 mdix;
00db8189d   Andy Fleming   This patch adds a...
413
  	void (*adjust_link)(struct net_device *dev);
00db8189d   Andy Fleming   This patch adds a...
414
415
416
417
418
419
420
421
422
423
424
425
426
427
  };
  #define to_phy_device(d) container_of(d, struct phy_device, dev)
  
  /* struct phy_driver: Driver structure for a particular PHY type
   *
   * phy_id: The result of reading the UID registers of this PHY
   *   type, and ANDing them with the phy_id_mask.  This driver
   *   only works for PHYs with IDs which match this field
   * name: The friendly name of this PHY type
   * phy_id_mask: Defines the important bits of the phy_id
   * features: A list of features (speed, duplex, etc) supported
   *   by this PHY
   * flags: A bitfield defining certain other features this PHY
   *   supports (like interrupts)
860f6e9eb   Johan Hovold   net: phy: add sta...
428
   * driver_data: static driver data
00db8189d   Andy Fleming   This patch adds a...
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
   *
   * The drivers must implement config_aneg and read_status.  All
   * other functions are optional. Note that none of these
   * functions should be called from interrupt time.  The goal is
   * for the bus read/write functions to be able to block when the
   * bus transaction is happening, and be freed up by an interrupt
   * (The MPC85xx has this ability, though it is not currently
   * supported in the driver).
   */
  struct phy_driver {
  	u32 phy_id;
  	char *name;
  	unsigned int phy_id_mask;
  	u32 features;
  	u32 flags;
860f6e9eb   Johan Hovold   net: phy: add sta...
444
  	const void *driver_data;
00db8189d   Andy Fleming   This patch adds a...
445

c5e38a949   Andy Fleming   phy: Clean up hea...
446
  	/*
9df81dd75   Florian Fainelli   net: phy: allow P...
447
448
449
450
451
  	 * Called to issue a PHY software reset
  	 */
  	int (*soft_reset)(struct phy_device *phydev);
  
  	/*
c5e38a949   Andy Fleming   phy: Clean up hea...
452
453
454
  	 * Called to initialize the PHY,
  	 * including after a reset
  	 */
00db8189d   Andy Fleming   This patch adds a...
455
  	int (*config_init)(struct phy_device *phydev);
c5e38a949   Andy Fleming   phy: Clean up hea...
456
457
458
459
  	/*
  	 * Called during discovery.  Used to set
  	 * up device-specific structures, if any
  	 */
00db8189d   Andy Fleming   This patch adds a...
460
461
462
463
464
  	int (*probe)(struct phy_device *phydev);
  
  	/* PHY Power Management */
  	int (*suspend)(struct phy_device *phydev);
  	int (*resume)(struct phy_device *phydev);
c5e38a949   Andy Fleming   phy: Clean up hea...
465
466
  	/*
  	 * Configures the advertisement and resets
00db8189d   Andy Fleming   This patch adds a...
467
468
  	 * autonegotiation if phydev->autoneg is on,
  	 * forces the speed to the current settings in phydev
c5e38a949   Andy Fleming   phy: Clean up hea...
469
470
  	 * if phydev->autoneg is off
  	 */
00db8189d   Andy Fleming   This patch adds a...
471
  	int (*config_aneg)(struct phy_device *phydev);
76a423a3f   Florian Fainelli   net: phy: allow d...
472
473
  	/* Determines the auto negotiation result */
  	int (*aneg_done)(struct phy_device *phydev);
00db8189d   Andy Fleming   This patch adds a...
474
475
476
477
478
479
480
481
  	/* Determines the negotiated speed and duplex */
  	int (*read_status)(struct phy_device *phydev);
  
  	/* Clears any pending interrupts */
  	int (*ack_interrupt)(struct phy_device *phydev);
  
  	/* Enables or disables interrupts */
  	int (*config_intr)(struct phy_device *phydev);
a8729eb30   Anatolij Gustschin   phylib: Allow ear...
482
483
484
485
486
  	/*
  	 * Checks if the PHY generated an interrupt.
  	 * For multi-PHY devices with shared PHY interrupt pin
  	 */
  	int (*did_interrupt)(struct phy_device *phydev);
00db8189d   Andy Fleming   This patch adds a...
487
488
  	/* Clears up any memory if needed */
  	void (*remove)(struct phy_device *phydev);
a30e2c189   David Daney   netdev/phy/of: Ad...
489
490
491
492
493
  	/* Returns true if this is a suitable driver for the given
  	 * phydev.  If NULL, matching is based on phy_id and
  	 * phy_id_mask.
  	 */
  	int (*match_phy_device)(struct phy_device *phydev);
c8f3a8c31   Richard Cochran   ethtool: Introduc...
494
495
  	/* Handles ethtool queries for hardware time stamping. */
  	int (*ts_info)(struct phy_device *phydev, struct ethtool_ts_info *ti);
c1f19b51d   Richard Cochran   net: support time...
496
497
498
499
500
501
502
503
504
505
506
507
508
509
  	/* Handles SIOCSHWTSTAMP ioctl for hardware time stamping. */
  	int  (*hwtstamp)(struct phy_device *phydev, struct ifreq *ifr);
  
  	/*
  	 * Requests a Rx timestamp for 'skb'. If the skb is accepted,
  	 * the phy driver promises to deliver it using netif_rx() as
  	 * soon as a timestamp becomes available. One of the
  	 * PTP_CLASS_ values is passed in 'type'. The function must
  	 * return true if the skb is accepted for delivery.
  	 */
  	bool (*rxtstamp)(struct phy_device *dev, struct sk_buff *skb, int type);
  
  	/*
  	 * Requests a Tx timestamp for 'skb'. The phy driver promises
da92b194c   Richard Cochran   net: hold sock re...
510
  	 * to deliver it using skb_complete_tx_timestamp() as soon as a
c1f19b51d   Richard Cochran   net: support time...
511
512
513
514
  	 * timestamp becomes available. One of the PTP_CLASS_ values
  	 * is passed in 'type'.
  	 */
  	void (*txtstamp)(struct phy_device *dev, struct sk_buff *skb, int type);
42e836eb4   Michael Stapelberg   phy: add set_wol/...
515
516
517
518
519
520
521
  	/* Some devices (e.g. qnap TS-119P II) require PHY register changes to
  	 * enable Wake on LAN, so set_wol is provided to be called in the
  	 * ethernet driver's set_wol function. */
  	int (*set_wol)(struct phy_device *dev, struct ethtool_wolinfo *wol);
  
  	/* See set_wol, but for checking whether Wake on LAN is enabled. */
  	void (*get_wol)(struct phy_device *dev, struct ethtool_wolinfo *wol);
2b8f2a28e   Daniel Mack   net: phylib: add ...
522
523
524
525
526
527
528
529
  	/*
  	 * Called to inform a PHY device driver when the core is about to
  	 * change the link state. This callback is supposed to be used as
  	 * fixup hook for drivers that need to take action when the link
  	 * state changes. Drivers are by no means allowed to mess with the
  	 * PHY device structure in their implementations.
  	 */
  	void (*link_change_notify)(struct phy_device *dev);
0c1d77dfb   Vince Bridgers   net: libphy: Add ...
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
  	/* A function provided by a phy specific driver to override the
  	 * the PHY driver framework support for reading a MMD register
  	 * from the PHY. If not supported, return -1. This function is
  	 * optional for PHY specific drivers, if not provided then the
  	 * default MMD read function is used by the PHY framework.
  	 */
  	int (*read_mmd_indirect)(struct phy_device *dev, int ptrad,
  				 int devnum, int regnum);
  
  	/* A function provided by a phy specific driver to override the
  	 * the PHY driver framework support for writing a MMD register
  	 * from the PHY. This function is optional for PHY specific drivers,
  	 * if not provided then the default MMD read function is used by
  	 * the PHY framework.
  	 */
  	void (*write_mmd_indirect)(struct phy_device *dev, int ptrad,
  				   int devnum, int regnum, u32 val);
2f4383667   Ed Swierk   ethtool: Extend e...
547
548
549
550
551
552
553
554
  	/* Get the size and type of the eeprom contained within a plug-in
  	 * module */
  	int (*module_info)(struct phy_device *dev,
  			   struct ethtool_modinfo *modinfo);
  
  	/* Get the eeprom information from the plug-in module */
  	int (*module_eeprom)(struct phy_device *dev,
  			     struct ethtool_eeprom *ee, u8 *data);
00db8189d   Andy Fleming   This patch adds a...
555
556
557
  	struct device_driver driver;
  };
  #define to_phy_driver(d) container_of(d, struct phy_driver, driver)
f62220d3a   Andy Fleming   phylib: Add suppo...
558
559
560
561
562
563
  #define PHY_ANY_ID "MATCH ANY PHY"
  #define PHY_ANY_UID 0xffffffff
  
  /* A Structure for boards to register fixups with the PHY Lib */
  struct phy_fixup {
  	struct list_head list;
8e401eccd   David S. Miller   phy: Eliminate re...
564
  	char bus_id[20];
f62220d3a   Andy Fleming   phylib: Add suppo...
565
566
567
568
  	u32 phy_uid;
  	u32 phy_uid_mask;
  	int (*run)(struct phy_device *phydev);
  };
2e8881032   Lennert Buytenhek   phylib: add mdiob...
569
  /**
efabdfb95   Andy Fleming   phylib: Add Claus...
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
   * phy_read_mmd - Convenience function for reading a register
   * from an MMD on a given PHY.
   * @phydev: The phy_device struct
   * @devad: The MMD to read from
   * @regnum: The register on the MMD to read
   *
   * Same rules as for phy_read();
   */
  static inline int phy_read_mmd(struct phy_device *phydev, int devad, u32 regnum)
  {
  	if (!phydev->is_c45)
  		return -EOPNOTSUPP;
  
  	return mdiobus_read(phydev->bus, phydev->addr,
  			    MII_ADDR_C45 | (devad << 16) | (regnum & 0xffff));
  }
  
  /**
66ce7fb98   Florian Fainelli   net: phy: export ...
588
589
590
591
592
593
594
595
596
597
598
599
600
   * phy_read_mmd_indirect - reads data from the MMD registers
   * @phydev: The PHY device bus
   * @prtad: MMD Address
   * @devad: MMD DEVAD
   * @addr: PHY address on the MII bus
   *
   * Description: it reads data from the MMD registers (clause 22 to access to
   * clause 45) of the specified phy address.
   */
  int phy_read_mmd_indirect(struct phy_device *phydev, int prtad,
  			  int devad, int addr);
  
  /**
2e8881032   Lennert Buytenhek   phylib: add mdiob...
601
602
603
604
605
606
607
608
   * phy_read - Convenience function for reading a given PHY register
   * @phydev: the phy_device struct
   * @regnum: register number to read
   *
   * NOTE: MUST NOT be called from interrupt context,
   * because the bus read/write functions may wait for an interrupt
   * to conclude the operation.
   */
abf35df21   Jason Gunthorpe   NET: Support clau...
609
  static inline int phy_read(struct phy_device *phydev, u32 regnum)
2e8881032   Lennert Buytenhek   phylib: add mdiob...
610
611
612
613
614
615
616
617
618
619
620
621
622
623
  {
  	return mdiobus_read(phydev->bus, phydev->addr, regnum);
  }
  
  /**
   * phy_write - Convenience function for writing a given PHY register
   * @phydev: the phy_device struct
   * @regnum: register number to write
   * @val: value to write to @regnum
   *
   * NOTE: MUST NOT be called from interrupt context,
   * because the bus read/write functions may wait for an interrupt
   * to conclude the operation.
   */
abf35df21   Jason Gunthorpe   NET: Support clau...
624
  static inline int phy_write(struct phy_device *phydev, u32 regnum, u16 val)
2e8881032   Lennert Buytenhek   phylib: add mdiob...
625
626
627
  {
  	return mdiobus_write(phydev->bus, phydev->addr, regnum, val);
  }
2c7b49212   Florian Fainelli   phy: fix the use ...
628
629
630
631
632
633
634
635
636
637
638
  /**
   * phy_interrupt_is_valid - Convenience function for testing a given PHY irq
   * @phydev: the phy_device struct
   *
   * NOTE: must be kept in sync with addition/removal of PHY_POLL and
   * PHY_IGNORE_INTERRUPT
   */
  static inline bool phy_interrupt_is_valid(struct phy_device *phydev)
  {
  	return phydev->irq != PHY_POLL && phydev->irq != PHY_IGNORE_INTERRUPT;
  }
4284b6a53   Florian Fainelli   phy: allow driver...
639
640
641
642
643
644
645
646
  /**
   * phy_is_internal - Convenience function for testing if a PHY is internal
   * @phydev: the phy_device struct
   */
  static inline bool phy_is_internal(struct phy_device *phydev)
  {
  	return phydev->is_internal;
  }
efabdfb95   Andy Fleming   phylib: Add Claus...
647
  /**
e463d88c3   Florian Fainelli   net: phy: Add phy...
648
649
650
651
652
653
654
655
   * phy_interface_is_rgmii - Convenience function for testing if a PHY interface
   * is RGMII (all variants)
   * @phydev: the phy_device struct
   */
  static inline bool phy_interface_is_rgmii(struct phy_device *phydev)
  {
  	return phydev->interface >= PHY_INTERFACE_MODE_RGMII &&
  		phydev->interface <= PHY_INTERFACE_MODE_RGMII_TXID;
5a11dd7d9   Florian Fainelli   net: phy: Allow P...
656
657
658
659
660
661
662
663
664
665
  };
  
  /*
   * phy_is_pseudo_fixed_link - Convenience function for testing if this
   * PHY is the CPU port facing side of an Ethernet switch, or similar.
   * @phydev: the phy_device struct
   */
  static inline bool phy_is_pseudo_fixed_link(struct phy_device *phydev)
  {
  	return phydev->is_pseudo_fixed_link;
e463d88c3   Florian Fainelli   net: phy: Add phy...
666
667
668
  }
  
  /**
efabdfb95   Andy Fleming   phylib: Add Claus...
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
   * phy_write_mmd - Convenience function for writing a register
   * on an MMD on a given PHY.
   * @phydev: The phy_device struct
   * @devad: The MMD to read from
   * @regnum: The register on the MMD to read
   * @val: value to write to @regnum
   *
   * Same rules as for phy_write();
   */
  static inline int phy_write_mmd(struct phy_device *phydev, int devad,
  				u32 regnum, u16 val)
  {
  	if (!phydev->is_c45)
  		return -EOPNOTSUPP;
  
  	regnum = MII_ADDR_C45 | ((devad & 0x1f) << 16) | (regnum & 0xffff);
  
  	return mdiobus_write(phydev->bus, phydev->addr, regnum, val);
  }
66ce7fb98   Florian Fainelli   net: phy: export ...
688
689
690
691
692
693
694
695
696
697
698
699
700
  /**
   * phy_write_mmd_indirect - writes data to the MMD registers
   * @phydev: The PHY device
   * @prtad: MMD Address
   * @devad: MMD DEVAD
   * @addr: PHY address on the MII bus
   * @data: data to write in the MMD register
   *
   * Description: Write data from the MMD registers of the specified
   * phy address.
   */
  void phy_write_mmd_indirect(struct phy_device *phydev, int prtad,
  			    int devad, int addr, u32 data);
ac28b9f8c   David Daney   netdev/phy: Handl...
701
  struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id,
4017b4d32   Sergei Shtylyov   <linux/phy.h>: co...
702
703
  				     bool is_c45,
  				     struct phy_c45_device_ids *c45_ids);
ac28b9f8c   David Daney   netdev/phy: Handl...
704
  struct phy_device *get_phy_device(struct mii_bus *bus, int addr, bool is_c45);
4dea547fe   Grant Likely   phylib: rework to...
705
  int phy_device_register(struct phy_device *phy);
38737e490   Russell King   phy: add phy_devi...
706
  void phy_device_remove(struct phy_device *phydev);
2f5cb4340   Anton Vorontsov   phylib: Properly ...
707
  int phy_init_hw(struct phy_device *phydev);
481b5d938   Sebastian Hesselbarth   net: phy: provide...
708
709
  int phy_suspend(struct phy_device *phydev);
  int phy_resume(struct phy_device *phydev);
4017b4d32   Sergei Shtylyov   <linux/phy.h>: co...
710
711
  struct phy_device *phy_attach(struct net_device *dev, const char *bus_id,
  			      phy_interface_t interface);
f8f76db1d   Jiri Pirko   libphy: add phy_f...
712
  struct phy_device *phy_find_first(struct mii_bus *bus);
257184d7c   Andy Fleming   phylib: Support a...
713
714
  int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
  		      u32 flags, phy_interface_t interface);
fa94f6d93   Grant Likely   phylib: add *_dir...
715
  int phy_connect_direct(struct net_device *dev, struct phy_device *phydev,
4017b4d32   Sergei Shtylyov   <linux/phy.h>: co...
716
717
718
719
720
  		       void (*handler)(struct net_device *),
  		       phy_interface_t interface);
  struct phy_device *phy_connect(struct net_device *dev, const char *bus_id,
  			       void (*handler)(struct net_device *),
  			       phy_interface_t interface);
e13934563   Andy Fleming   [PATCH] PHY Layer...
721
722
723
724
725
  void phy_disconnect(struct phy_device *phydev);
  void phy_detach(struct phy_device *phydev);
  void phy_start(struct phy_device *phydev);
  void phy_stop(struct phy_device *phydev);
  int phy_start_aneg(struct phy_device *phydev);
e13934563   Andy Fleming   [PATCH] PHY Layer...
726
  int phy_stop_interrupts(struct phy_device *phydev);
00db8189d   Andy Fleming   This patch adds a...
727

4017b4d32   Sergei Shtylyov   <linux/phy.h>: co...
728
729
  static inline int phy_read_status(struct phy_device *phydev)
  {
00db8189d   Andy Fleming   This patch adds a...
730
731
  	return phydev->drv->read_status(phydev);
  }
af6b6967d   Daniel Mack   net: phy: export ...
732
  int genphy_config_init(struct phy_device *phydev);
3fb69bcad   Madalin Bucur   net/phy: Add the ...
733
  int genphy_setup_forced(struct phy_device *phydev);
00db8189d   Andy Fleming   This patch adds a...
734
735
  int genphy_restart_aneg(struct phy_device *phydev);
  int genphy_config_aneg(struct phy_device *phydev);
a9fa6e6ac   Florian Fainelli   net: phy: add gen...
736
  int genphy_aneg_done(struct phy_device *phydev);
00db8189d   Andy Fleming   This patch adds a...
737
738
  int genphy_update_link(struct phy_device *phydev);
  int genphy_read_status(struct phy_device *phydev);
0f0ca340e   Giuseppe Cavallaro   phy: power manage...
739
740
  int genphy_suspend(struct phy_device *phydev);
  int genphy_resume(struct phy_device *phydev);
797ac0713   Florian Fainelli   net: phy: move PH...
741
  int genphy_soft_reset(struct phy_device *phydev);
00db8189d   Andy Fleming   This patch adds a...
742
  void phy_driver_unregister(struct phy_driver *drv);
d5bf9071e   Christian Hohnstaedt   phylib: Support r...
743
  void phy_drivers_unregister(struct phy_driver *drv, int n);
00db8189d   Andy Fleming   This patch adds a...
744
  int phy_driver_register(struct phy_driver *new_driver);
d5bf9071e   Christian Hohnstaedt   phylib: Support r...
745
  int phy_drivers_register(struct phy_driver *new_driver, int n);
4f9c85a1b   Anton Vorontsov   phylib: Move work...
746
  void phy_state_machine(struct work_struct *work);
5ea94e768   Florian Fainelli   phy: add phy_mac_...
747
748
  void phy_change(struct work_struct *work);
  void phy_mac_interrupt(struct phy_device *phydev, int new_link);
29935aebc   Sergei Shtylyov   phylib: remove un...
749
  void phy_start_machine(struct phy_device *phydev);
00db8189d   Andy Fleming   This patch adds a...
750
751
752
  void phy_stop_machine(struct phy_device *phydev);
  int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd);
  int phy_ethtool_gset(struct phy_device *phydev, struct ethtool_cmd *cmd);
4017b4d32   Sergei Shtylyov   <linux/phy.h>: co...
753
  int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd);
e13934563   Andy Fleming   [PATCH] PHY Layer...
754
755
  int phy_start_interrupts(struct phy_device *phydev);
  void phy_print_status(struct phy_device *phydev);
6f4a7f418   Anton Vorontsov   PHY: Add the phy_...
756
  void phy_device_free(struct phy_device *phydev);
f3a6bd393   Simon Horman   phylib: Add phy_s...
757
  int phy_set_max_speed(struct phy_device *phydev, u32 max_speed);
00db8189d   Andy Fleming   This patch adds a...
758

f62220d3a   Andy Fleming   phylib: Add suppo...
759
  int phy_register_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask,
4017b4d32   Sergei Shtylyov   <linux/phy.h>: co...
760
  		       int (*run)(struct phy_device *));
f62220d3a   Andy Fleming   phylib: Add suppo...
761
  int phy_register_fixup_for_id(const char *bus_id,
4017b4d32   Sergei Shtylyov   <linux/phy.h>: co...
762
  			      int (*run)(struct phy_device *));
f62220d3a   Andy Fleming   phylib: Add suppo...
763
  int phy_register_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask,
4017b4d32   Sergei Shtylyov   <linux/phy.h>: co...
764
  			       int (*run)(struct phy_device *));
f62220d3a   Andy Fleming   phylib: Add suppo...
765

a59a4d192   Giuseppe CAVALLARO   phy: add the EEE ...
766
767
768
769
  int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable);
  int phy_get_eee_err(struct phy_device *phydev);
  int phy_ethtool_set_eee(struct phy_device *phydev, struct ethtool_eee *data);
  int phy_ethtool_get_eee(struct phy_device *phydev, struct ethtool_eee *data);
42e836eb4   Michael Stapelberg   phy: add set_wol/...
770
  int phy_ethtool_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol);
4017b4d32   Sergei Shtylyov   <linux/phy.h>: co...
771
772
  void phy_ethtool_get_wol(struct phy_device *phydev,
  			 struct ethtool_wolinfo *wol);
a59a4d192   Giuseppe CAVALLARO   phy: add the EEE ...
773

9b9a8bfc8   Andy Fleming   phylib: Fix some ...
774
775
  int __init mdio_bus_init(void);
  void mdio_bus_exit(void);
00db8189d   Andy Fleming   This patch adds a...
776
  extern struct bus_type mdio_bus_type;
c31accd15   Johan Hovold   net: phy: add mod...
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
  
  /**
   * module_phy_driver() - Helper macro for registering PHY drivers
   * @__phy_drivers: array of PHY drivers to register
   *
   * Helper macro for PHY drivers which do not do anything special in module
   * init/exit. Each module may only use this macro once, and calling it
   * replaces module_init() and module_exit().
   */
  #define phy_module_driver(__phy_drivers, __count)			\
  static int __init phy_module_init(void)					\
  {									\
  	return phy_drivers_register(__phy_drivers, __count);		\
  }									\
  module_init(phy_module_init);						\
  static void __exit phy_module_exit(void)				\
  {									\
  	phy_drivers_unregister(__phy_drivers, __count);			\
  }									\
  module_exit(phy_module_exit)
  
  #define module_phy_driver(__phy_drivers)				\
  	phy_module_driver(__phy_drivers, ARRAY_SIZE(__phy_drivers))
00db8189d   Andy Fleming   This patch adds a...
800
  #endif /* __PHY_H */