Blame view

include/linux/phy.h 31 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
   * 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
2220943a2   Andrew Lunn   phy: Centralise p...
18
  #include <linux/compiler.h>
00db8189d   Andy Fleming   This patch adds a...
19
  #include <linux/spinlock.h>
13df29f69   Maciej W. Rozycki   [PATCH] 2.6.18: s...
20
  #include <linux/ethtool.h>
bac83c653   Andrew Lunn   mdio: Move mdiobu...
21
  #include <linux/mdio.h>
13df29f69   Maciej W. Rozycki   [PATCH] 2.6.18: s...
22
  #include <linux/mii.h>
3e3aaf649   Russell King   phy: fix mdiobus ...
23
  #include <linux/module.h>
13df29f69   Maciej W. Rozycki   [PATCH] 2.6.18: s...
24
25
  #include <linux/timer.h>
  #include <linux/workqueue.h>
8626d3b43   David Woodhouse   phylib: Support p...
26
  #include <linux/mod_devicetable.h>
00db8189d   Andy Fleming   This patch adds a...
27

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

e9fbdf176   Florian Fainelli   net: phy: breakdo...
30
  #define PHY_DEFAULT_FEATURES	(SUPPORTED_Autoneg | \
00db8189d   Andy Fleming   This patch adds a...
31
32
  				 SUPPORTED_TP | \
  				 SUPPORTED_MII)
e9fbdf176   Florian Fainelli   net: phy: breakdo...
33
34
35
36
37
38
39
  #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...
40
  				 SUPPORTED_1000baseT_Full)
e9fbdf176   Florian Fainelli   net: phy: breakdo...
41
42
43
44
45
46
  #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...
47
48
  /*
   * Set phydev->irq to PHY_POLL if interrupts are not supported,
00db8189d   Andy Fleming   This patch adds a...
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
1b86f702f   Andrew Lunn   net: phy: Remove ...
56
  #define PHY_IS_INTERNAL		0x00000002
a9049e0c5   Andrew Lunn   mdio: Add support...
57
  #define MDIO_DEVICE_IS_PHY	0x80000000
00db8189d   Andy Fleming   This patch adds a...
58

e8a2b6a42   Andy Fleming   [PATCH] PHY: Add ...
59
60
  /* Interface Mode definitions */
  typedef enum {
4157ef1b8   Shawn Guo   net: ibm_newemac:...
61
  	PHY_INTERFACE_MODE_NA,
735d8a184   Florian Fainelli   net: phy: Support...
62
  	PHY_INTERFACE_MODE_INTERNAL,
e8a2b6a42   Andy Fleming   [PATCH] PHY: Add ...
63
64
65
66
  	PHY_INTERFACE_MODE_MII,
  	PHY_INTERFACE_MODE_GMII,
  	PHY_INTERFACE_MODE_SGMII,
  	PHY_INTERFACE_MODE_TBI,
2cc70ba4c   Florian Fainelli   phy: add reverse ...
67
  	PHY_INTERFACE_MODE_REVMII,
e8a2b6a42   Andy Fleming   [PATCH] PHY: Add ...
68
69
  	PHY_INTERFACE_MODE_RMII,
  	PHY_INTERFACE_MODE_RGMII,
a999589cc   Kim Phillips   phylib: add RGMII...
70
  	PHY_INTERFACE_MODE_RGMII_ID,
7d400a4c5   Kim Phillips   phylib: add PHY i...
71
72
  	PHY_INTERFACE_MODE_RGMII_RXID,
  	PHY_INTERFACE_MODE_RGMII_TXID,
4157ef1b8   Shawn Guo   net: ibm_newemac:...
73
74
  	PHY_INTERFACE_MODE_RTBI,
  	PHY_INTERFACE_MODE_SMII,
898dd0bda   Andy Fleming   phylib: introduce...
75
  	PHY_INTERFACE_MODE_XGMII,
fd70f72c6   Florian Fainelli   net: phy: add MoC...
76
  	PHY_INTERFACE_MODE_MOCA,
b9d12085f   Thomas Petazzoni   net: phy: add min...
77
  	PHY_INTERFACE_MODE_QSGMII,
572de608e   Sean Wang   net: ethernet: me...
78
  	PHY_INTERFACE_MODE_TRGMII,
55601a880   Andrew Lunn   net: phy: Add 200...
79
80
81
  	PHY_INTERFACE_MODE_1000BASEX,
  	PHY_INTERFACE_MODE_2500BASEX,
  	PHY_INTERFACE_MODE_RXAUI,
c125ca091   Russell King   net: phy: add XAU...
82
83
84
  	PHY_INTERFACE_MODE_XAUI,
  	/* 10GBASE-KR, XFI, SFI - single lane 10G Serdes */
  	PHY_INTERFACE_MODE_10GKR,
8a2fe56e8   Florian Fainelli   net: phy: re-desi...
85
  	PHY_INTERFACE_MODE_MAX,
e8a2b6a42   Andy Fleming   [PATCH] PHY: Add ...
86
  } phy_interface_t;
8a2fe56e8   Florian Fainelli   net: phy: re-desi...
87
  /**
1f9127cae   Zach Brown   net: phy: Create ...
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
   * phy_supported_speeds - return all speeds currently supported by a phy device
   * @phy: The phy device to return supported speeds of.
   * @speeds: buffer to store supported speeds in.
   * @size: size of speeds buffer.
   *
   * Description: Returns the number of supported speeds, and
   * fills the speeds * buffer with the supported speeds. If speeds buffer is
   * too small to contain * all currently supported speeds, will return as
   * many speeds as can fit.
   */
  unsigned int phy_supported_speeds(struct phy_device *phy,
  				      unsigned int *speeds,
  				      unsigned int size);
  
  /**
8a2fe56e8   Florian Fainelli   net: phy: re-desi...
103
104
105
106
107
108
109
110
111
   * 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 "";
735d8a184   Florian Fainelli   net: phy: Support...
112
113
  	case PHY_INTERFACE_MODE_INTERNAL:
  		return "internal";
8a2fe56e8   Florian Fainelli   net: phy: re-desi...
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
  	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...
140
141
  	case PHY_INTERFACE_MODE_MOCA:
  		return "moca";
b9d12085f   Thomas Petazzoni   net: phy: add min...
142
143
  	case PHY_INTERFACE_MODE_QSGMII:
  		return "qsgmii";
572de608e   Sean Wang   net: ethernet: me...
144
145
  	case PHY_INTERFACE_MODE_TRGMII:
  		return "trgmii";
55601a880   Andrew Lunn   net: phy: Add 200...
146
147
148
149
150
151
  	case PHY_INTERFACE_MODE_1000BASEX:
  		return "1000base-x";
  	case PHY_INTERFACE_MODE_2500BASEX:
  		return "2500base-x";
  	case PHY_INTERFACE_MODE_RXAUI:
  		return "rxaui";
c125ca091   Russell King   net: phy: add XAU...
152
153
154
155
  	case PHY_INTERFACE_MODE_XAUI:
  		return "xaui";
  	case PHY_INTERFACE_MODE_10GKR:
  		return "10gbase-kr";
8a2fe56e8   Florian Fainelli   net: phy: re-desi...
156
157
158
159
  	default:
  		return "unknown";
  	}
  }
00db8189d   Andy Fleming   This patch adds a...
160

e8a2b6a42   Andy Fleming   [PATCH] PHY: Add ...
161
  #define PHY_INIT_TIMEOUT	100000
00db8189d   Andy Fleming   This patch adds a...
162
163
164
  #define PHY_STATE_TIME		1
  #define PHY_FORCE_TIMEOUT	10
  #define PHY_AN_TIMEOUT		10
e8a2b6a42   Andy Fleming   [PATCH] PHY: Add ...
165
  #define PHY_MAX_ADDR	32
00db8189d   Andy Fleming   This patch adds a...
166

a4d00f179   Kumar Gala   [PATCH] phy: Adde...
167
  /* Used when trying to connect to a specific phy (mii bus id:phy device id) */
9d9326d3b   Andy Fleming   phy: Change mii_b...
168
  #define PHY_ID_FMT "%s:%02x"
4567d686f   Volodymyr Bendiuga   phy: increase siz...
169
  #define MII_BUS_ID_SIZE	61
a4d00f179   Kumar Gala   [PATCH] phy: Adde...
170

abf35df21   Jason Gunthorpe   NET: Support clau...
171
172
173
  /* 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...
174
  struct device;
9525ae839   Russell King   phylink: add phyl...
175
  struct phylink;
313162d0b   Paul Gortmaker   device.h: audit a...
176
  struct sk_buff;
c5e38a949   Andy Fleming   phy: Clean up hea...
177
178
179
180
  /*
   * The Bus class for PHYs.  Devices which provide access to
   * PHYs should register using this structure
   */
00db8189d   Andy Fleming   This patch adds a...
181
  struct mii_bus {
3e3aaf649   Russell King   phy: fix mdiobus ...
182
  	struct module *owner;
00db8189d   Andy Fleming   This patch adds a...
183
  	const char *name;
9d9326d3b   Andy Fleming   phy: Change mii_b...
184
  	char id[MII_BUS_ID_SIZE];
00db8189d   Andy Fleming   This patch adds a...
185
  	void *priv;
ccaa953e9   Andrew Lunn   phy: Consistently...
186
187
  	int (*read)(struct mii_bus *bus, int addr, int regnum);
  	int (*write)(struct mii_bus *bus, int addr, int regnum, u16 val);
00db8189d   Andy Fleming   This patch adds a...
188
  	int (*reset)(struct mii_bus *bus);
c5e38a949   Andy Fleming   phy: Clean up hea...
189
190
191
192
  	/*
  	 * A lock to ensure that only one thing can read/write
  	 * the MDIO bus at a time
  	 */
35b5f6b1a   Nate Case   PHYLIB: Locking f...
193
  	struct mutex mdio_lock;
00db8189d   Andy Fleming   This patch adds a...
194

18ee49ddb   Lennert Buytenhek   phylib: rename mi...
195
  	struct device *parent;
46abc0217   Lennert Buytenhek   phylib: give mdio...
196
197
198
199
200
201
202
  	enum {
  		MDIOBUS_ALLOCATED = 1,
  		MDIOBUS_REGISTERED,
  		MDIOBUS_UNREGISTERED,
  		MDIOBUS_RELEASED,
  	} state;
  	struct device dev;
00db8189d   Andy Fleming   This patch adds a...
203
204
  
  	/* list of all PHYs on bus */
7f854420f   Andrew Lunn   phy: Add API for ...
205
  	struct mdio_device *mdio_map[PHY_MAX_ADDR];
00db8189d   Andy Fleming   This patch adds a...
206

c68839963   Peter Meerwald   net: Improve comm...
207
  	/* PHY addresses to be ignored when probing */
f896424cb   Matt Porter   [PATCH] phy addre...
208
  	u32 phy_mask;
922f2dd1b   Florian Fainelli   net: phy: Add phy...
209
210
  	/* PHY addresses to ignore the TA/read failure */
  	u32 phy_ignore_ta_mask;
c5e38a949   Andy Fleming   phy: Clean up hea...
211
  	/*
e7f4dc353   Andrew Lunn   mdio: Move alloca...
212
213
  	 * An array of interrupts, each PHY's interrupt at the index
  	 * matching its address
c5e38a949   Andy Fleming   phy: Clean up hea...
214
  	 */
e7f4dc353   Andrew Lunn   mdio: Move alloca...
215
  	int irq[PHY_MAX_ADDR];
69226896a   Roger Quadros   mdio_bus: Issue G...
216
217
218
  
  	/* GPIO reset pulse width in microseconds */
  	int reset_delay_us;
d396e84c5   Sergei Shtylyov   mdio_bus: handle ...
219
220
  	/* RESET GPIO descriptor pointer */
  	struct gpio_desc *reset_gpiod;
00db8189d   Andy Fleming   This patch adds a...
221
  };
46abc0217   Lennert Buytenhek   phylib: give mdio...
222
  #define to_mii_bus(d) container_of(d, struct mii_bus, dev)
00db8189d   Andy Fleming   This patch adds a...
223

eb8a54a78   Timur Tabi   phylib: introduce...
224
225
226
227
228
  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 ...
229
230
  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...
231
232
  void mdiobus_unregister(struct mii_bus *bus);
  void mdiobus_free(struct mii_bus *bus);
6d48f44b7   Grygorii Strashko   mdio_bus: impleme...
233
234
235
236
237
238
239
  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...
240
  struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr);
2e8881032   Lennert Buytenhek   phylib: add mdiob...
241

e8a2b6a42   Andy Fleming   [PATCH] PHY: Add ...
242
243
  #define PHY_INTERRUPT_DISABLED	0x0
  #define PHY_INTERRUPT_ENABLED	0x80000000
00db8189d   Andy Fleming   This patch adds a...
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
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
  
  /* 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...
326
  	PHY_DOWN = 0,
00db8189d   Andy Fleming   This patch adds a...
327
328
329
330
331
332
333
334
335
336
337
338
  	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...
339
340
341
342
343
344
345
346
347
  /**
   * 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...
348

00db8189d   Andy Fleming   This patch adds a...
349
350
351
  /* phy_device: An instance of a PHY
   *
   * drv: Pointer to the driver for this PHY instance
00db8189d   Andy Fleming   This patch adds a...
352
   * phy_id: UID for this device found during discovery
ac28b9f8c   David Daney   netdev/phy: Handl...
353
354
   * 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...
355
   * is_internal: Set to true if this phy is internal to a MAC.
5a11dd7d9   Florian Fainelli   net: phy: Allow P...
356
   * is_pseudo_fixed_link: Set to true if this phy is an Ethernet switch, etc.
aae88261a   Florian Fainelli   net: phy: documen...
357
   * has_fixups: Set to true if this phy has fixups/quirks.
8a477a6fb   Florian Fainelli   net: phy: keep tr...
358
   * suspended: Set to true if this phy has been suspended successfully.
a39954604   Florian Fainelli   net: phy: Relax e...
359
   * sysfs_links: Internal boolean tracking sysfs symbolic links setup/removal.
f0f9b4ed2   Lin Yun Sheng   net: phy: Add phy...
360
   * loopback_enabled: Set true if this phy has been loopbacked successfully.
00db8189d   Andy Fleming   This patch adds a...
361
362
   * state: state of the PHY for management purposes
   * dev_flags: Device-specific flags used by the PHY driver.
00db8189d   Andy Fleming   This patch adds a...
363
364
365
366
   * 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
664fcf123   Andrew Lunn   net: phy: Threade...
367
   * phy_queue: A work_queue for the phy_mac_interrupt
00db8189d   Andy Fleming   This patch adds a...
368
369
370
   * 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...
371
   *
114002bc1   Florian Fainelli   net: phy: report ...
372
373
   * speed, duplex, pause, supported, advertising, lp_advertising,
   * and autoneg are used like in mii_if_info
00db8189d   Andy Fleming   This patch adds a...
374
375
376
377
378
379
380
381
382
   *
   * 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 {
e5a03bfd8   Andrew Lunn   phy: Add an mdio_...
383
  	struct mdio_device mdio;
00db8189d   Andy Fleming   This patch adds a...
384
385
386
  	/* Information about the PHY type */
  	/* And management functions */
  	struct phy_driver *drv;
00db8189d   Andy Fleming   This patch adds a...
387
  	u32 phy_id;
ac28b9f8c   David Daney   netdev/phy: Handl...
388
389
  	struct phy_c45_device_ids c45_ids;
  	bool is_c45;
4284b6a53   Florian Fainelli   phy: allow driver...
390
  	bool is_internal;
5a11dd7d9   Florian Fainelli   net: phy: Allow P...
391
  	bool is_pseudo_fixed_link;
b0ae009f3   Florian Fainelli   net: phy: add "ha...
392
  	bool has_fixups;
8a477a6fb   Florian Fainelli   net: phy: keep tr...
393
  	bool suspended;
a39954604   Florian Fainelli   net: phy: Relax e...
394
  	bool sysfs_links;
f0f9b4ed2   Lin Yun Sheng   net: phy: Add phy...
395
  	bool loopback_enabled;
ac28b9f8c   David Daney   netdev/phy: Handl...
396

00db8189d   Andy Fleming   This patch adds a...
397
398
399
  	enum phy_state state;
  
  	u32 dev_flags;
e8a2b6a42   Andy Fleming   [PATCH] PHY: Add ...
400
  	phy_interface_t interface;
c5e38a949   Andy Fleming   phy: Clean up hea...
401
402
  	/*
  	 * forced speed & duplex (no autoneg)
00db8189d   Andy Fleming   This patch adds a...
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
  	 * 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 ...
420
  	u32 lp_advertising;
00db8189d   Andy Fleming   This patch adds a...
421

d853d145e   jbrunet   net: phy: add an ...
422
423
  	/* Energy efficient ethernet modes which should be prohibited */
  	u32 eee_broken_modes;
00db8189d   Andy Fleming   This patch adds a...
424
425
426
  	int autoneg;
  
  	int link_timeout;
2e0bc452f   Zach Brown   net: phy: leds: a...
427
428
429
430
431
  #ifdef CONFIG_LED_TRIGGER_PHY
  	struct phy_led_trigger *phy_led_triggers;
  	unsigned int phy_num_led_triggers;
  	struct phy_led_trigger *last_triggered;
  #endif
c5e38a949   Andy Fleming   phy: Clean up hea...
432
433
434
435
  	/*
  	 * Interrupt number for this PHY
  	 * -1 means no interrupt
  	 */
00db8189d   Andy Fleming   This patch adds a...
436
437
438
439
440
441
442
443
  	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...
444
  	struct delayed_work state_queue;
0ac495273   Maciej W. Rozycki   PHYLIB: IRQ event...
445
  	atomic_t irq_disable;
00db8189d   Andy Fleming   This patch adds a...
446

35b5f6b1a   Nate Case   PHYLIB: Locking f...
447
  	struct mutex lock;
00db8189d   Andy Fleming   This patch adds a...
448

9525ae839   Russell King   phylink: add phyl...
449
  	struct phylink *phylink;
00db8189d   Andy Fleming   This patch adds a...
450
  	struct net_device *attached_dev;
634ec36cc   David Thomson   net: phy: Pass md...
451
  	u8 mdix;
f4ed2fe34   Raju Lakkaraju   net: phy: add mdi...
452
  	u8 mdix_ctrl;
634ec36cc   David Thomson   net: phy: Pass md...
453

a81497bee   Russell King   net: phy: provide...
454
  	void (*phy_link_change)(struct phy_device *, bool up, bool do_carrier);
00db8189d   Andy Fleming   This patch adds a...
455
  	void (*adjust_link)(struct net_device *dev);
00db8189d   Andy Fleming   This patch adds a...
456
  };
e5a03bfd8   Andrew Lunn   phy: Add an mdio_...
457
458
  #define to_phy_device(d) container_of(to_mdio_device(d), \
  				      struct phy_device, mdio)
00db8189d   Andy Fleming   This patch adds a...
459
460
461
  
  /* struct phy_driver: Driver structure for a particular PHY type
   *
a9049e0c5   Andrew Lunn   mdio: Add support...
462
   * driver_data: static driver data
00db8189d   Andy Fleming   This patch adds a...
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
   * 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)
   *
   * 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 {
a9049e0c5   Andrew Lunn   mdio: Add support...
482
  	struct mdio_driver_common mdiodrv;
00db8189d   Andy Fleming   This patch adds a...
483
484
485
486
487
  	u32 phy_id;
  	char *name;
  	unsigned int phy_id_mask;
  	u32 features;
  	u32 flags;
860f6e9eb   Johan Hovold   net: phy: add sta...
488
  	const void *driver_data;
00db8189d   Andy Fleming   This patch adds a...
489

c5e38a949   Andy Fleming   phy: Clean up hea...
490
  	/*
9df81dd75   Florian Fainelli   net: phy: allow P...
491
492
493
494
495
  	 * Called to issue a PHY software reset
  	 */
  	int (*soft_reset)(struct phy_device *phydev);
  
  	/*
c5e38a949   Andy Fleming   phy: Clean up hea...
496
497
498
  	 * Called to initialize the PHY,
  	 * including after a reset
  	 */
00db8189d   Andy Fleming   This patch adds a...
499
  	int (*config_init)(struct phy_device *phydev);
c5e38a949   Andy Fleming   phy: Clean up hea...
500
501
502
503
  	/*
  	 * Called during discovery.  Used to set
  	 * up device-specific structures, if any
  	 */
00db8189d   Andy Fleming   This patch adds a...
504
505
506
507
508
  	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...
509
510
  	/*
  	 * Configures the advertisement and resets
00db8189d   Andy Fleming   This patch adds a...
511
512
  	 * autonegotiation if phydev->autoneg is on,
  	 * forces the speed to the current settings in phydev
c5e38a949   Andy Fleming   phy: Clean up hea...
513
514
  	 * if phydev->autoneg is off
  	 */
00db8189d   Andy Fleming   This patch adds a...
515
  	int (*config_aneg)(struct phy_device *phydev);
76a423a3f   Florian Fainelli   net: phy: allow d...
516
517
  	/* Determines the auto negotiation result */
  	int (*aneg_done)(struct phy_device *phydev);
00db8189d   Andy Fleming   This patch adds a...
518
519
520
521
522
523
524
525
  	/* 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...
526
527
528
529
530
  	/*
  	 * 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...
531
532
  	/* Clears up any memory if needed */
  	void (*remove)(struct phy_device *phydev);
a30e2c189   David Daney   netdev/phy/of: Ad...
533
534
535
536
537
  	/* 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...
538
539
  	/* 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...
540
541
542
543
544
545
546
547
548
549
550
551
552
553
  	/* 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...
554
  	 * to deliver it using skb_complete_tx_timestamp() as soon as a
c1f19b51d   Richard Cochran   net: support time...
555
556
557
558
  	 * 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/...
559
560
561
562
563
564
565
  	/* 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 ...
566
567
568
569
570
571
572
573
  	/*
  	 * 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);
1ee6b9bc6   Russell King   net: phy: make ph...
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
  	/*
  	 * Phy specific driver override for reading a MMD register.
  	 * This function is optional for PHY specific drivers.  When
  	 * not provided, the default MMD read function will be used
  	 * by phy_read_mmd(), which will use either a direct read for
  	 * Clause 45 PHYs or an indirect read for Clause 22 PHYs.
  	 *  devnum is the MMD device number within the PHY device,
  	 *  regnum is the register within the selected MMD device.
  	 */
  	int (*read_mmd)(struct phy_device *dev, int devnum, u16 regnum);
  
  	/*
  	 * Phy specific driver override for writing a MMD register.
  	 * This function is optional for PHY specific drivers.  When
  	 * not provided, the default MMD write function will be used
  	 * by phy_write_mmd(), which will use either a direct write for
  	 * Clause 45 PHYs, or an indirect write for Clause 22 PHYs.
  	 *  devnum is the MMD device number within the PHY device,
  	 *  regnum is the register within the selected MMD device.
  	 *  val is the value to be written.
  	 */
  	int (*write_mmd)(struct phy_device *dev, int devnum, u16 regnum,
  			 u16 val);
2f4383667   Ed Swierk   ethtool: Extend e...
597
598
599
600
601
602
603
604
  	/* 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);
f3a409455   Andrew Lunn   ethtool: Add phy ...
605
606
607
608
609
  	/* Get statistics from the phy using ethtool */
  	int (*get_sset_count)(struct phy_device *dev);
  	void (*get_strings)(struct phy_device *dev, u8 *data);
  	void (*get_stats)(struct phy_device *dev,
  			  struct ethtool_stats *stats, u64 *data);
968ad9da7   Raju Lakkaraju   ethtool: Implemen...
610
611
612
613
614
615
616
  
  	/* Get and Set PHY tunables */
  	int (*get_tunable)(struct phy_device *dev,
  			   struct ethtool_tunable *tuna, void *data);
  	int (*set_tunable)(struct phy_device *dev,
  			    struct ethtool_tunable *tuna,
  			    const void *data);
f0f9b4ed2   Lin Yun Sheng   net: phy: Add phy...
617
  	int (*set_loopback)(struct phy_device *dev, bool enable);
00db8189d   Andy Fleming   This patch adds a...
618
  };
a9049e0c5   Andrew Lunn   mdio: Add support...
619
620
  #define to_phy_driver(d) container_of(to_mdio_common_driver(d),		\
  				      struct phy_driver, mdiodrv)
00db8189d   Andy Fleming   This patch adds a...
621

f62220d3a   Andy Fleming   phylib: Add suppo...
622
623
624
625
626
627
  #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;
4567d686f   Volodymyr Bendiuga   phy: increase siz...
628
  	char bus_id[MII_BUS_ID_SIZE + 3];
f62220d3a   Andy Fleming   phylib: Add suppo...
629
630
631
632
  	u32 phy_uid;
  	u32 phy_uid_mask;
  	int (*run)(struct phy_device *phydev);
  };
da4625ac2   Russell King   net: phy: split o...
633
634
  const char *phy_speed_to_str(int speed);
  const char *phy_duplex_to_str(unsigned int duplex);
0ccb4fc65   Russell King   net: phy: move ph...
635
636
637
638
639
640
641
642
643
644
645
646
647
648
  /* A structure for mapping a particular speed and duplex
   * combination to a particular SUPPORTED and ADVERTISED value
   */
  struct phy_setting {
  	u32 speed;
  	u8 duplex;
  	u8 bit;
  };
  
  const struct phy_setting *
  phy_lookup_setting(int speed, int duplex, const unsigned long *mask,
  		   size_t maxbit, bool exact);
  size_t phy_speeds(unsigned int *speeds, size_t size,
  		  unsigned long *mask, size_t maxbit);
2e8881032   Lennert Buytenhek   phylib: add mdiob...
649
  /**
efabdfb95   Andy Fleming   phylib: Add Claus...
650
651
652
653
654
655
656
657
   * 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();
   */
9860118b5   Russell King   net: phy: move ph...
658
  int phy_read_mmd(struct phy_device *phydev, int devad, u32 regnum);
efabdfb95   Andy Fleming   phylib: Add Claus...
659
660
  
  /**
2e8881032   Lennert Buytenhek   phylib: add mdiob...
661
662
663
664
665
666
667
668
   * 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...
669
  static inline int phy_read(struct phy_device *phydev, u32 regnum)
2e8881032   Lennert Buytenhek   phylib: add mdiob...
670
  {
e5a03bfd8   Andrew Lunn   phy: Add an mdio_...
671
  	return mdiobus_read(phydev->mdio.bus, phydev->mdio.addr, regnum);
2e8881032   Lennert Buytenhek   phylib: add mdiob...
672
673
674
675
676
677
678
679
680
681
682
683
  }
  
  /**
   * 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...
684
  static inline int phy_write(struct phy_device *phydev, u32 regnum, u16 val)
2e8881032   Lennert Buytenhek   phylib: add mdiob...
685
  {
e5a03bfd8   Andrew Lunn   phy: Add an mdio_...
686
  	return mdiobus_write(phydev->mdio.bus, phydev->mdio.addr, regnum, val);
2e8881032   Lennert Buytenhek   phylib: add mdiob...
687
  }
2c7b49212   Florian Fainelli   phy: fix the use ...
688
689
690
691
692
693
694
695
696
697
698
  /**
   * 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...
699
700
701
702
703
704
705
706
  /**
   * 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...
707
  /**
32d0f7830   Iyappan Subramanian   phy: Add helper f...
708
709
710
711
712
713
714
715
716
717
718
   * phy_interface_mode_is_rgmii - Convenience function for testing if a
   * PHY interface mode is RGMII (all variants)
   * @mode: the phy_interface_t enum
   */
  static inline bool phy_interface_mode_is_rgmii(phy_interface_t mode)
  {
  	return mode >= PHY_INTERFACE_MODE_RGMII &&
  		mode <= PHY_INTERFACE_MODE_RGMII_TXID;
  };
  
  /**
e463d88c3   Florian Fainelli   net: phy: Add phy...
719
720
721
722
723
724
   * 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)
  {
32d0f7830   Iyappan Subramanian   phy: Add helper f...
725
  	return phy_interface_mode_is_rgmii(phydev->interface);
5a11dd7d9   Florian Fainelli   net: phy: Allow P...
726
727
728
729
730
731
732
733
734
735
  };
  
  /*
   * 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...
736
737
738
  }
  
  /**
efabdfb95   Andy Fleming   phylib: Add Claus...
739
740
741
742
743
744
745
746
747
   * 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();
   */
9860118b5   Russell King   net: phy: move ph...
748
  int phy_write_mmd(struct phy_device *phydev, int devad, u32 regnum, u16 val);
efabdfb95   Andy Fleming   phylib: Add Claus...
749

ac28b9f8c   David Daney   netdev/phy: Handl...
750
  struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id,
4017b4d32   Sergei Shtylyov   <linux/phy.h>: co...
751
752
  				     bool is_c45,
  				     struct phy_c45_device_ids *c45_ids);
90eff9096   Florian Fainelli   net: phy: Allow s...
753
  #if IS_ENABLED(CONFIG_PHYLIB)
ac28b9f8c   David Daney   netdev/phy: Handl...
754
  struct phy_device *get_phy_device(struct mii_bus *bus, int addr, bool is_c45);
4dea547fe   Grant Likely   phylib: rework to...
755
  int phy_device_register(struct phy_device *phy);
90eff9096   Florian Fainelli   net: phy: Allow s...
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
  void phy_device_free(struct phy_device *phydev);
  #else
  static inline
  struct phy_device *get_phy_device(struct mii_bus *bus, int addr, bool is_c45)
  {
  	return NULL;
  }
  
  static inline int phy_device_register(struct phy_device *phy)
  {
  	return 0;
  }
  
  static inline void phy_device_free(struct phy_device *phydev) { }
  #endif /* CONFIG_PHYLIB */
38737e490   Russell King   phy: add phy_devi...
771
  void phy_device_remove(struct phy_device *phydev);
2f5cb4340   Anton Vorontsov   phylib: Properly ...
772
  int phy_init_hw(struct phy_device *phydev);
481b5d938   Sebastian Hesselbarth   net: phy: provide...
773
774
  int phy_suspend(struct phy_device *phydev);
  int phy_resume(struct phy_device *phydev);
6bccf8962   Andrew Lunn   net: phy: Restore...
775
  int __phy_resume(struct phy_device *phydev);
f0f9b4ed2   Lin Yun Sheng   net: phy: Add phy...
776
  int phy_loopback(struct phy_device *phydev, bool enable);
4017b4d32   Sergei Shtylyov   <linux/phy.h>: co...
777
778
  struct phy_device *phy_attach(struct net_device *dev, const char *bus_id,
  			      phy_interface_t interface);
f8f76db1d   Jiri Pirko   libphy: add phy_f...
779
  struct phy_device *phy_find_first(struct mii_bus *bus);
257184d7c   Andy Fleming   phylib: Support a...
780
781
  int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
  		      u32 flags, phy_interface_t interface);
fa94f6d93   Grant Likely   phylib: add *_dir...
782
  int phy_connect_direct(struct net_device *dev, struct phy_device *phydev,
4017b4d32   Sergei Shtylyov   <linux/phy.h>: co...
783
784
785
786
787
  		       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...
788
789
790
791
792
  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);
372788f96   Lendacky, Thomas   net: phy: expose ...
793
  int phy_aneg_done(struct phy_device *phydev);
e13934563   Andy Fleming   [PATCH] PHY Layer...
794

e13934563   Andy Fleming   [PATCH] PHY Layer...
795
  int phy_stop_interrupts(struct phy_device *phydev);
002ba7058   Russell King   net: phy: hook up...
796
  int phy_restart_aneg(struct phy_device *phydev);
00db8189d   Andy Fleming   This patch adds a...
797

4017b4d32   Sergei Shtylyov   <linux/phy.h>: co...
798
799
  static inline int phy_read_status(struct phy_device *phydev)
  {
25149ef9d   Florian Fainelli   net: phy: Check p...
800
801
  	if (!phydev->drv)
  		return -EIO;
00db8189d   Andy Fleming   This patch adds a...
802
803
  	return phydev->drv->read_status(phydev);
  }
72ba48be3   Andrew Lunn   phy: Add phydev_e...
804
  #define phydev_err(_phydev, format, args...)	\
e5a03bfd8   Andrew Lunn   phy: Add an mdio_...
805
  	dev_err(&_phydev->mdio.dev, format, ##args)
72ba48be3   Andrew Lunn   phy: Add phydev_e...
806
807
  
  #define phydev_dbg(_phydev, format, args...)	\
2eaa38d9f   Marc Gonzalez   net: phy: Remove ...
808
  	dev_dbg(&_phydev->mdio.dev, format, ##args)
72ba48be3   Andrew Lunn   phy: Add phydev_e...
809

84eff6d19   Andrew Lunn   phy: add phydev_n...
810
811
  static inline const char *phydev_name(const struct phy_device *phydev)
  {
e5a03bfd8   Andrew Lunn   phy: Add an mdio_...
812
  	return dev_name(&phydev->mdio.dev);
84eff6d19   Andrew Lunn   phy: add phydev_n...
813
  }
2220943a2   Andrew Lunn   phy: Centralise p...
814
815
816
  void phy_attached_print(struct phy_device *phydev, const char *fmt, ...)
  	__printf(2, 3);
  void phy_attached_info(struct phy_device *phydev);
5acde34a5   Russell King   net: phy: add 802...
817
818
  
  /* Clause 22 PHY */
af6b6967d   Daniel Mack   net: phy: export ...
819
  int genphy_config_init(struct phy_device *phydev);
3fb69bcad   Madalin Bucur   net/phy: Add the ...
820
  int genphy_setup_forced(struct phy_device *phydev);
00db8189d   Andy Fleming   This patch adds a...
821
  int genphy_restart_aneg(struct phy_device *phydev);
81d76d675   Fugang Duan   MLK-15309-01 net:...
822
  int genphy_config_aneg_check(struct phy_device *phydev);
00db8189d   Andy Fleming   This patch adds a...
823
  int genphy_config_aneg(struct phy_device *phydev);
a9fa6e6ac   Florian Fainelli   net: phy: add gen...
824
  int genphy_aneg_done(struct phy_device *phydev);
00db8189d   Andy Fleming   This patch adds a...
825
826
  int genphy_update_link(struct phy_device *phydev);
  int genphy_read_status(struct phy_device *phydev);
0f0ca340e   Giuseppe Cavallaro   phy: power manage...
827
828
  int genphy_suspend(struct phy_device *phydev);
  int genphy_resume(struct phy_device *phydev);
f0f9b4ed2   Lin Yun Sheng   net: phy: Add phy...
829
  int genphy_loopback(struct phy_device *phydev, bool enable);
797ac0713   Florian Fainelli   net: phy: move PH...
830
  int genphy_soft_reset(struct phy_device *phydev);
0878fff1f   Florian Fainelli   net: phy: Do not ...
831
832
833
834
  static inline int genphy_no_soft_reset(struct phy_device *phydev)
  {
  	return 0;
  }
8b882dbba   Kevin Hao   net: phy: Add gen...
835
836
837
838
  int genphy_read_mmd_unsupported(struct phy_device *phdev, int devad,
  				u16 regnum);
  int genphy_write_mmd_unsupported(struct phy_device *phdev, int devnum,
  				 u16 regnum, u16 val);
5acde34a5   Russell King   net: phy: add 802...
839
840
841
842
843
844
845
846
847
  
  /* Clause 45 PHY */
  int genphy_c45_restart_aneg(struct phy_device *phydev);
  int genphy_c45_aneg_done(struct phy_device *phydev);
  int genphy_c45_read_link(struct phy_device *phydev, u32 mmd_mask);
  int genphy_c45_read_lpa(struct phy_device *phydev);
  int genphy_c45_read_pma(struct phy_device *phydev);
  int genphy_c45_pma_setup_forced(struct phy_device *phydev);
  int genphy_c45_an_disable_aneg(struct phy_device *phydev);
00db8189d   Andy Fleming   This patch adds a...
848
  void phy_driver_unregister(struct phy_driver *drv);
d5bf9071e   Christian Hohnstaedt   phylib: Support r...
849
  void phy_drivers_unregister(struct phy_driver *drv, int n);
be01da72b   Andrew Lunn   phy: Centralize s...
850
851
852
  int phy_driver_register(struct phy_driver *new_driver, struct module *owner);
  int phy_drivers_register(struct phy_driver *new_driver, int n,
  			 struct module *owner);
4f9c85a1b   Anton Vorontsov   phylib: Move work...
853
  void phy_state_machine(struct work_struct *work);
664fcf123   Andrew Lunn   net: phy: Threade...
854
  void phy_change_work(struct work_struct *work);
5ea94e768   Florian Fainelli   phy: add phy_mac_...
855
  void phy_mac_interrupt(struct phy_device *phydev, int new_link);
29935aebc   Sergei Shtylyov   phylib: remove un...
856
  void phy_start_machine(struct phy_device *phydev);
00db8189d   Andy Fleming   This patch adds a...
857
  void phy_stop_machine(struct phy_device *phydev);
f555f34fd   Alexander Kochetkov   net: phy: fix aut...
858
  void phy_trigger_machine(struct phy_device *phydev, bool sync);
00db8189d   Andy Fleming   This patch adds a...
859
  int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd);
5514174fe   yuval.shaia@oracle.com   net: phy: Make ph...
860
861
  void phy_ethtool_ksettings_get(struct phy_device *phydev,
  			       struct ethtool_link_ksettings *cmd);
2d55173e7   Philippe Reynes   phy: add generic ...
862
863
  int phy_ethtool_ksettings_set(struct phy_device *phydev,
  			      const struct ethtool_link_ksettings *cmd);
4017b4d32   Sergei Shtylyov   <linux/phy.h>: co...
864
  int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd);
e13934563   Andy Fleming   [PATCH] PHY Layer...
865
866
  int phy_start_interrupts(struct phy_device *phydev);
  void phy_print_status(struct phy_device *phydev);
f3a6bd393   Simon Horman   phylib: Add phy_s...
867
  int phy_set_max_speed(struct phy_device *phydev, u32 max_speed);
00db8189d   Andy Fleming   This patch adds a...
868

f62220d3a   Andy Fleming   phylib: Add suppo...
869
  int phy_register_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask,
4017b4d32   Sergei Shtylyov   <linux/phy.h>: co...
870
  		       int (*run)(struct phy_device *));
f62220d3a   Andy Fleming   phylib: Add suppo...
871
  int phy_register_fixup_for_id(const char *bus_id,
4017b4d32   Sergei Shtylyov   <linux/phy.h>: co...
872
  			      int (*run)(struct phy_device *));
f62220d3a   Andy Fleming   phylib: Add suppo...
873
  int phy_register_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask,
4017b4d32   Sergei Shtylyov   <linux/phy.h>: co...
874
  			       int (*run)(struct phy_device *));
f62220d3a   Andy Fleming   phylib: Add suppo...
875

f38e7a32e   Woojung.Huh@microchip.com   phy: add phy fixu...
876
877
878
  int phy_unregister_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask);
  int phy_unregister_fixup_for_id(const char *bus_id);
  int phy_unregister_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask);
a59a4d192   Giuseppe CAVALLARO   phy: add the EEE ...
879
880
881
882
  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/...
883
  int phy_ethtool_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol);
4017b4d32   Sergei Shtylyov   <linux/phy.h>: co...
884
885
  void phy_ethtool_get_wol(struct phy_device *phydev,
  			 struct ethtool_wolinfo *wol);
9d9a77cee   Philippe Reynes   net: phy: add phy...
886
887
888
889
  int phy_ethtool_get_link_ksettings(struct net_device *ndev,
  				   struct ethtool_link_ksettings *cmd);
  int phy_ethtool_set_link_ksettings(struct net_device *ndev,
  				   const struct ethtool_link_ksettings *cmd);
e86a8987e   Florian Fainelli   net: phy: Add phy...
890
  int phy_ethtool_nway_reset(struct net_device *ndev);
a59a4d192   Giuseppe CAVALLARO   phy: add the EEE ...
891

90eff9096   Florian Fainelli   net: phy: Allow s...
892
  #if IS_ENABLED(CONFIG_PHYLIB)
9b9a8bfc8   Andy Fleming   phylib: Fix some ...
893
894
  int __init mdio_bus_init(void);
  void mdio_bus_exit(void);
90eff9096   Florian Fainelli   net: phy: Allow s...
895
  #endif
9b9a8bfc8   Andy Fleming   phylib: Fix some ...
896

00db8189d   Andy Fleming   This patch adds a...
897
  extern struct bus_type mdio_bus_type;
c31accd15   Johan Hovold   net: phy: add mod...
898

648ea0134   Florian Fainelli   net: phy: Allow p...
899
900
901
902
903
904
  struct mdio_board_info {
  	const char	*bus_id;
  	char		modalias[MDIO_NAME_SIZE];
  	int		mdio_addr;
  	const void	*platform_data;
  };
90eff9096   Florian Fainelli   net: phy: Allow s...
905
  #if IS_ENABLED(CONFIG_MDIO_DEVICE)
648ea0134   Florian Fainelli   net: phy: Allow p...
906
907
908
909
910
911
912
913
914
  int mdiobus_register_board_info(const struct mdio_board_info *info,
  				unsigned int n);
  #else
  static inline int mdiobus_register_board_info(const struct mdio_board_info *i,
  					      unsigned int n)
  {
  	return 0;
  }
  #endif
c31accd15   Johan Hovold   net: phy: add mod...
915
916
917
918
919
920
921
922
923
924
925
  /**
   * 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)					\
  {									\
be01da72b   Andrew Lunn   phy: Centralize s...
926
  	return phy_drivers_register(__phy_drivers, __count, THIS_MODULE); \
c31accd15   Johan Hovold   net: phy: add mod...
927
928
929
930
931
932
933
934
935
936
  }									\
  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...
937
  #endif /* __PHY_H */