.. | .. |
---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-or-later */ |
---|
1 | 2 | /* |
---|
2 | 3 | * Framework and drivers for configuring and reading different PHYs |
---|
3 | | - * Based on code in sungem_phy.c and gianfar_phy.c |
---|
| 4 | + * Based on code in sungem_phy.c and (long-removed) gianfar_phy.c |
---|
4 | 5 | * |
---|
5 | 6 | * Author: Andy Fleming |
---|
6 | 7 | * |
---|
7 | 8 | * Copyright (c) 2004 Freescale Semiconductor, Inc. |
---|
8 | | - * |
---|
9 | | - * This program is free software; you can redistribute it and/or modify it |
---|
10 | | - * under the terms of the GNU General Public License as published by the |
---|
11 | | - * Free Software Foundation; either version 2 of the License, or (at your |
---|
12 | | - * option) any later version. |
---|
13 | | - * |
---|
14 | 9 | */ |
---|
15 | 10 | |
---|
16 | 11 | #ifndef __PHY_H |
---|
.. | .. |
---|
19 | 14 | #include <linux/compiler.h> |
---|
20 | 15 | #include <linux/spinlock.h> |
---|
21 | 16 | #include <linux/ethtool.h> |
---|
| 17 | +#include <linux/linkmode.h> |
---|
| 18 | +#include <linux/netlink.h> |
---|
22 | 19 | #include <linux/mdio.h> |
---|
23 | 20 | #include <linux/mii.h> |
---|
| 21 | +#include <linux/mii_timestamper.h> |
---|
24 | 22 | #include <linux/module.h> |
---|
25 | 23 | #include <linux/timer.h> |
---|
26 | 24 | #include <linux/workqueue.h> |
---|
27 | 25 | #include <linux/mod_devicetable.h> |
---|
| 26 | +#include <linux/u64_stats_sync.h> |
---|
| 27 | +#include <linux/irqreturn.h> |
---|
| 28 | +#include <linux/iopoll.h> |
---|
| 29 | +#include <linux/refcount.h> |
---|
28 | 30 | #include <linux/android_kabi.h> |
---|
29 | 31 | |
---|
30 | 32 | #include <linux/atomic.h> |
---|
.. | .. |
---|
42 | 44 | #define PHY_1000BT_FEATURES (SUPPORTED_1000baseT_Half | \ |
---|
43 | 45 | SUPPORTED_1000baseT_Full) |
---|
44 | 46 | |
---|
45 | | -#define PHY_BASIC_FEATURES (PHY_10BT_FEATURES | \ |
---|
46 | | - PHY_100BT_FEATURES | \ |
---|
47 | | - PHY_DEFAULT_FEATURES) |
---|
| 47 | +extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_basic_features) __ro_after_init; |
---|
| 48 | +extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_basic_t1_features) __ro_after_init; |
---|
| 49 | +extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_gbit_features) __ro_after_init; |
---|
| 50 | +extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_gbit_fibre_features) __ro_after_init; |
---|
| 51 | +extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_gbit_all_ports_features) __ro_after_init; |
---|
| 52 | +extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_features) __ro_after_init; |
---|
| 53 | +extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_fec_features) __ro_after_init; |
---|
| 54 | +extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_full_features) __ro_after_init; |
---|
48 | 55 | |
---|
49 | | -#define PHY_GBIT_FEATURES (PHY_BASIC_FEATURES | \ |
---|
50 | | - PHY_1000BT_FEATURES) |
---|
| 56 | +#define PHY_BASIC_FEATURES ((unsigned long *)&phy_basic_features) |
---|
| 57 | +#define PHY_BASIC_T1_FEATURES ((unsigned long *)&phy_basic_t1_features) |
---|
| 58 | +#define PHY_GBIT_FEATURES ((unsigned long *)&phy_gbit_features) |
---|
| 59 | +#define PHY_GBIT_FIBRE_FEATURES ((unsigned long *)&phy_gbit_fibre_features) |
---|
| 60 | +#define PHY_GBIT_ALL_PORTS_FEATURES ((unsigned long *)&phy_gbit_all_ports_features) |
---|
| 61 | +#define PHY_10GBIT_FEATURES ((unsigned long *)&phy_10gbit_features) |
---|
| 62 | +#define PHY_10GBIT_FEC_FEATURES ((unsigned long *)&phy_10gbit_fec_features) |
---|
| 63 | +#define PHY_10GBIT_FULL_FEATURES ((unsigned long *)&phy_10gbit_full_features) |
---|
51 | 64 | |
---|
| 65 | +extern const int phy_basic_ports_array[3]; |
---|
| 66 | +extern const int phy_fibre_port_array[1]; |
---|
| 67 | +extern const int phy_all_ports_features_array[7]; |
---|
| 68 | +extern const int phy_10_100_features_array[4]; |
---|
| 69 | +extern const int phy_basic_t1_features_array[2]; |
---|
| 70 | +extern const int phy_gbit_features_array[2]; |
---|
| 71 | +extern const int phy_10gbit_features_array[1]; |
---|
52 | 72 | |
---|
53 | 73 | /* |
---|
54 | 74 | * Set phydev->irq to PHY_POLL if interrupts are not supported, |
---|
.. | .. |
---|
58 | 78 | #define PHY_POLL -1 |
---|
59 | 79 | #define PHY_IGNORE_INTERRUPT -2 |
---|
60 | 80 | |
---|
61 | | -#define PHY_HAS_INTERRUPT 0x00000001 |
---|
62 | | -#define PHY_IS_INTERNAL 0x00000002 |
---|
63 | | -#define PHY_RST_AFTER_CLK_EN 0x00000004 |
---|
| 81 | +#define PHY_IS_INTERNAL 0x00000001 |
---|
| 82 | +#define PHY_RST_AFTER_CLK_EN 0x00000002 |
---|
| 83 | +#define PHY_POLL_CABLE_TEST 0x00000004 |
---|
64 | 84 | #define MDIO_DEVICE_IS_PHY 0x80000000 |
---|
65 | 85 | |
---|
66 | | -/* Interface Mode definitions */ |
---|
| 86 | +/** |
---|
| 87 | + * enum phy_interface_t - Interface Mode definitions |
---|
| 88 | + * |
---|
| 89 | + * @PHY_INTERFACE_MODE_NA: Not Applicable - don't touch |
---|
| 90 | + * @PHY_INTERFACE_MODE_INTERNAL: No interface, MAC and PHY combined |
---|
| 91 | + * @PHY_INTERFACE_MODE_MII: Median-independent interface |
---|
| 92 | + * @PHY_INTERFACE_MODE_GMII: Gigabit median-independent interface |
---|
| 93 | + * @PHY_INTERFACE_MODE_SGMII: Serial gigabit media-independent interface |
---|
| 94 | + * @PHY_INTERFACE_MODE_TBI: Ten Bit Interface |
---|
| 95 | + * @PHY_INTERFACE_MODE_REVMII: Reverse Media Independent Interface |
---|
| 96 | + * @PHY_INTERFACE_MODE_RMII: Reduced Media Independent Interface |
---|
| 97 | + * @PHY_INTERFACE_MODE_RGMII: Reduced gigabit media-independent interface |
---|
| 98 | + * @PHY_INTERFACE_MODE_RGMII_ID: RGMII with Internal RX+TX delay |
---|
| 99 | + * @PHY_INTERFACE_MODE_RGMII_RXID: RGMII with Internal RX delay |
---|
| 100 | + * @PHY_INTERFACE_MODE_RGMII_TXID: RGMII with Internal RX delay |
---|
| 101 | + * @PHY_INTERFACE_MODE_RTBI: Reduced TBI |
---|
| 102 | + * @PHY_INTERFACE_MODE_SMII: ??? MII |
---|
| 103 | + * @PHY_INTERFACE_MODE_XGMII: 10 gigabit media-independent interface |
---|
| 104 | + * @PHY_INTERFACE_MODE_XLGMII:40 gigabit media-independent interface |
---|
| 105 | + * @PHY_INTERFACE_MODE_MOCA: Multimedia over Coax |
---|
| 106 | + * @PHY_INTERFACE_MODE_QSGMII: Quad SGMII |
---|
| 107 | + * @PHY_INTERFACE_MODE_TRGMII: Turbo RGMII |
---|
| 108 | + * @PHY_INTERFACE_MODE_1000BASEX: 1000 BaseX |
---|
| 109 | + * @PHY_INTERFACE_MODE_2500BASEX: 2500 BaseX |
---|
| 110 | + * @PHY_INTERFACE_MODE_RXAUI: Reduced XAUI |
---|
| 111 | + * @PHY_INTERFACE_MODE_XAUI: 10 Gigabit Attachment Unit Interface |
---|
| 112 | + * @PHY_INTERFACE_MODE_10GBASER: 10G BaseR |
---|
| 113 | + * @PHY_INTERFACE_MODE_USXGMII: Universal Serial 10GE MII |
---|
| 114 | + * @PHY_INTERFACE_MODE_10GKR: 10GBASE-KR - with Clause 73 AN |
---|
| 115 | + * @PHY_INTERFACE_MODE_MAX: Book keeping |
---|
| 116 | + * |
---|
| 117 | + * Describes the interface between the MAC and PHY. |
---|
| 118 | + */ |
---|
67 | 119 | typedef enum { |
---|
68 | 120 | PHY_INTERFACE_MODE_NA, |
---|
69 | 121 | PHY_INTERFACE_MODE_INTERNAL, |
---|
.. | .. |
---|
80 | 132 | PHY_INTERFACE_MODE_RTBI, |
---|
81 | 133 | PHY_INTERFACE_MODE_SMII, |
---|
82 | 134 | PHY_INTERFACE_MODE_XGMII, |
---|
| 135 | + PHY_INTERFACE_MODE_XLGMII, |
---|
83 | 136 | PHY_INTERFACE_MODE_MOCA, |
---|
84 | 137 | PHY_INTERFACE_MODE_QSGMII, |
---|
85 | 138 | PHY_INTERFACE_MODE_TRGMII, |
---|
.. | .. |
---|
87 | 140 | PHY_INTERFACE_MODE_2500BASEX, |
---|
88 | 141 | PHY_INTERFACE_MODE_RXAUI, |
---|
89 | 142 | PHY_INTERFACE_MODE_XAUI, |
---|
90 | | - /* 10GBASE-KR, XFI, SFI - single lane 10G Serdes */ |
---|
| 143 | + /* 10GBASE-R, XFI, SFI - single lane 10G Serdes */ |
---|
| 144 | + PHY_INTERFACE_MODE_10GBASER, |
---|
| 145 | + PHY_INTERFACE_MODE_USXGMII, |
---|
| 146 | + /* 10GBASE-KR - with Clause 73 AN */ |
---|
91 | 147 | PHY_INTERFACE_MODE_10GKR, |
---|
92 | 148 | PHY_INTERFACE_MODE_MAX, |
---|
93 | 149 | } phy_interface_t; |
---|
94 | 150 | |
---|
95 | | -/** |
---|
96 | | - * phy_supported_speeds - return all speeds currently supported by a phy device |
---|
97 | | - * @phy: The phy device to return supported speeds of. |
---|
98 | | - * @speeds: buffer to store supported speeds in. |
---|
99 | | - * @size: size of speeds buffer. |
---|
100 | | - * |
---|
101 | | - * Description: Returns the number of supported speeds, and |
---|
102 | | - * fills the speeds * buffer with the supported speeds. If speeds buffer is |
---|
103 | | - * too small to contain * all currently supported speeds, will return as |
---|
104 | | - * many speeds as can fit. |
---|
| 151 | +/* |
---|
| 152 | + * phy_supported_speeds - return all speeds currently supported by a PHY device |
---|
105 | 153 | */ |
---|
106 | 154 | unsigned int phy_supported_speeds(struct phy_device *phy, |
---|
107 | 155 | unsigned int *speeds, |
---|
108 | 156 | unsigned int size); |
---|
109 | 157 | |
---|
110 | 158 | /** |
---|
111 | | - * It maps 'enum phy_interface_t' found in include/linux/phy.h |
---|
| 159 | + * phy_modes - map phy_interface_t enum to device tree binding of phy-mode |
---|
| 160 | + * @interface: enum phy_interface_t value |
---|
| 161 | + * |
---|
| 162 | + * Description: maps enum &phy_interface_t defined in this file |
---|
112 | 163 | * into the device tree binding of 'phy-mode', so that Ethernet |
---|
113 | | - * device driver can get phy interface from device tree. |
---|
| 164 | + * device driver can get PHY interface from device tree. |
---|
114 | 165 | */ |
---|
115 | 166 | static inline const char *phy_modes(phy_interface_t interface) |
---|
116 | 167 | { |
---|
.. | .. |
---|
145 | 196 | return "smii"; |
---|
146 | 197 | case PHY_INTERFACE_MODE_XGMII: |
---|
147 | 198 | return "xgmii"; |
---|
| 199 | + case PHY_INTERFACE_MODE_XLGMII: |
---|
| 200 | + return "xlgmii"; |
---|
148 | 201 | case PHY_INTERFACE_MODE_MOCA: |
---|
149 | 202 | return "moca"; |
---|
150 | 203 | case PHY_INTERFACE_MODE_QSGMII: |
---|
.. | .. |
---|
159 | 212 | return "rxaui"; |
---|
160 | 213 | case PHY_INTERFACE_MODE_XAUI: |
---|
161 | 214 | return "xaui"; |
---|
| 215 | + case PHY_INTERFACE_MODE_10GBASER: |
---|
| 216 | + return "10gbase-r"; |
---|
| 217 | + case PHY_INTERFACE_MODE_USXGMII: |
---|
| 218 | + return "usxgmii"; |
---|
162 | 219 | case PHY_INTERFACE_MODE_10GKR: |
---|
163 | 220 | return "10gbase-kr"; |
---|
164 | 221 | default: |
---|
.. | .. |
---|
168 | 225 | |
---|
169 | 226 | |
---|
170 | 227 | #define PHY_INIT_TIMEOUT 100000 |
---|
171 | | -#define PHY_STATE_TIME 1 |
---|
172 | 228 | #define PHY_FORCE_TIMEOUT 10 |
---|
173 | | -#define PHY_AN_TIMEOUT 10 |
---|
174 | 229 | |
---|
175 | 230 | #define PHY_MAX_ADDR 32 |
---|
176 | 231 | |
---|
.. | .. |
---|
179 | 234 | |
---|
180 | 235 | #define MII_BUS_ID_SIZE 61 |
---|
181 | 236 | |
---|
182 | | -/* Or MII_ADDR_C45 into regnum for read/write on mii_bus to enable the 21 bit |
---|
183 | | - IEEE 802.3ae clause 45 addressing mode used by 10GIGE phy chips. */ |
---|
184 | | -#define MII_ADDR_C45 (1<<30) |
---|
185 | | - |
---|
186 | 237 | struct device; |
---|
187 | 238 | struct phylink; |
---|
| 239 | +struct sfp_bus; |
---|
| 240 | +struct sfp_upstream_ops; |
---|
188 | 241 | struct sk_buff; |
---|
189 | 242 | |
---|
190 | | -/* |
---|
| 243 | +/** |
---|
| 244 | + * struct mdio_bus_stats - Statistics counters for MDIO busses |
---|
| 245 | + * @transfers: Total number of transfers, i.e. @writes + @reads |
---|
| 246 | + * @errors: Number of MDIO transfers that returned an error |
---|
| 247 | + * @writes: Number of write transfers |
---|
| 248 | + * @reads: Number of read transfers |
---|
| 249 | + * @syncp: Synchronisation for incrementing statistics |
---|
| 250 | + */ |
---|
| 251 | +struct mdio_bus_stats { |
---|
| 252 | + u64_stats_t transfers; |
---|
| 253 | + u64_stats_t errors; |
---|
| 254 | + u64_stats_t writes; |
---|
| 255 | + u64_stats_t reads; |
---|
| 256 | + /* Must be last, add new statistics above */ |
---|
| 257 | + struct u64_stats_sync syncp; |
---|
| 258 | +}; |
---|
| 259 | + |
---|
| 260 | +/** |
---|
| 261 | + * struct phy_package_shared - Shared information in PHY packages |
---|
| 262 | + * @addr: Common PHY address used to combine PHYs in one package |
---|
| 263 | + * @refcnt: Number of PHYs connected to this shared data |
---|
| 264 | + * @flags: Initialization of PHY package |
---|
| 265 | + * @priv_size: Size of the shared private data @priv |
---|
| 266 | + * @priv: Driver private data shared across a PHY package |
---|
| 267 | + * |
---|
| 268 | + * Represents a shared structure between different phydev's in the same |
---|
| 269 | + * package, for example a quad PHY. See phy_package_join() and |
---|
| 270 | + * phy_package_leave(). |
---|
| 271 | + */ |
---|
| 272 | +struct phy_package_shared { |
---|
| 273 | + int addr; |
---|
| 274 | + refcount_t refcnt; |
---|
| 275 | + unsigned long flags; |
---|
| 276 | + size_t priv_size; |
---|
| 277 | + |
---|
| 278 | + /* private data pointer */ |
---|
| 279 | + /* note that this pointer is shared between different phydevs and |
---|
| 280 | + * the user has to take care of appropriate locking. It is allocated |
---|
| 281 | + * and freed automatically by phy_package_join() and |
---|
| 282 | + * phy_package_leave(). |
---|
| 283 | + */ |
---|
| 284 | + void *priv; |
---|
| 285 | +}; |
---|
| 286 | + |
---|
| 287 | +/* used as bit number in atomic bitops */ |
---|
| 288 | +#define PHY_SHARED_F_INIT_DONE 0 |
---|
| 289 | +#define PHY_SHARED_F_PROBE_DONE 1 |
---|
| 290 | + |
---|
| 291 | +/** |
---|
| 292 | + * struct mii_bus - Represents an MDIO bus |
---|
| 293 | + * |
---|
| 294 | + * @owner: Who owns this device |
---|
| 295 | + * @name: User friendly name for this MDIO device, or driver name |
---|
| 296 | + * @id: Unique identifier for this bus, typical from bus hierarchy |
---|
| 297 | + * @priv: Driver private data |
---|
| 298 | + * |
---|
191 | 299 | * The Bus class for PHYs. Devices which provide access to |
---|
192 | 300 | * PHYs should register using this structure |
---|
193 | 301 | */ |
---|
.. | .. |
---|
196 | 304 | const char *name; |
---|
197 | 305 | char id[MII_BUS_ID_SIZE]; |
---|
198 | 306 | void *priv; |
---|
| 307 | + /** @read: Perform a read transfer on the bus */ |
---|
199 | 308 | int (*read)(struct mii_bus *bus, int addr, int regnum); |
---|
| 309 | + /** @write: Perform a write transfer on the bus */ |
---|
200 | 310 | int (*write)(struct mii_bus *bus, int addr, int regnum, u16 val); |
---|
| 311 | + /** @reset: Perform a reset of the bus */ |
---|
201 | 312 | int (*reset)(struct mii_bus *bus); |
---|
202 | 313 | |
---|
203 | | - /* |
---|
204 | | - * A lock to ensure that only one thing can read/write |
---|
| 314 | + /** @stats: Statistic counters per device on the bus */ |
---|
| 315 | + struct mdio_bus_stats stats[PHY_MAX_ADDR]; |
---|
| 316 | + |
---|
| 317 | + /** |
---|
| 318 | + * @mdio_lock: A lock to ensure that only one thing can read/write |
---|
205 | 319 | * the MDIO bus at a time |
---|
206 | 320 | */ |
---|
207 | 321 | struct mutex mdio_lock; |
---|
208 | 322 | |
---|
| 323 | + /** @parent: Parent device of this bus */ |
---|
209 | 324 | struct device *parent; |
---|
| 325 | + /** @state: State of bus structure */ |
---|
210 | 326 | enum { |
---|
211 | 327 | MDIOBUS_ALLOCATED = 1, |
---|
212 | 328 | MDIOBUS_REGISTERED, |
---|
213 | 329 | MDIOBUS_UNREGISTERED, |
---|
214 | 330 | MDIOBUS_RELEASED, |
---|
215 | 331 | } state; |
---|
| 332 | + |
---|
| 333 | + /** @dev: Kernel device representation */ |
---|
216 | 334 | struct device dev; |
---|
217 | 335 | |
---|
218 | | - /* list of all PHYs on bus */ |
---|
| 336 | + /** @mdio_map: list of all MDIO devices on bus */ |
---|
219 | 337 | struct mdio_device *mdio_map[PHY_MAX_ADDR]; |
---|
220 | 338 | |
---|
221 | | - /* PHY addresses to be ignored when probing */ |
---|
| 339 | + /** @phy_mask: PHY addresses to be ignored when probing */ |
---|
222 | 340 | u32 phy_mask; |
---|
223 | 341 | |
---|
224 | | - /* PHY addresses to ignore the TA/read failure */ |
---|
| 342 | + /** @phy_ignore_ta_mask: PHY addresses to ignore the TA/read failure */ |
---|
225 | 343 | u32 phy_ignore_ta_mask; |
---|
226 | 344 | |
---|
227 | | - /* |
---|
228 | | - * An array of interrupts, each PHY's interrupt at the index |
---|
| 345 | + /** |
---|
| 346 | + * @irq: An array of interrupts, each PHY's interrupt at the index |
---|
229 | 347 | * matching its address |
---|
230 | 348 | */ |
---|
231 | 349 | int irq[PHY_MAX_ADDR]; |
---|
232 | 350 | |
---|
233 | | - /* GPIO reset pulse width in microseconds */ |
---|
| 351 | + /** @reset_delay_us: GPIO reset pulse width in microseconds */ |
---|
234 | 352 | int reset_delay_us; |
---|
235 | | - /* RESET GPIO descriptor pointer */ |
---|
| 353 | + /** @reset_post_delay_us: GPIO reset deassert delay in microseconds */ |
---|
| 354 | + int reset_post_delay_us; |
---|
| 355 | + /** @reset_gpiod: Reset GPIO descriptor pointer */ |
---|
236 | 356 | struct gpio_desc *reset_gpiod; |
---|
| 357 | + |
---|
| 358 | + /** @probe_capabilities: bus capabilities, used for probing */ |
---|
| 359 | + enum { |
---|
| 360 | + MDIOBUS_NO_CAP = 0, |
---|
| 361 | + MDIOBUS_C22, |
---|
| 362 | + MDIOBUS_C45, |
---|
| 363 | + MDIOBUS_C22_C45, |
---|
| 364 | + } probe_capabilities; |
---|
| 365 | + |
---|
| 366 | + /** @shared_lock: protect access to the shared element */ |
---|
| 367 | + struct mutex shared_lock; |
---|
| 368 | + |
---|
| 369 | + /** @shared: shared state across different PHYs */ |
---|
| 370 | + struct phy_package_shared *shared[PHY_MAX_ADDR]; |
---|
237 | 371 | }; |
---|
238 | 372 | #define to_mii_bus(d) container_of(d, struct mii_bus, dev) |
---|
239 | 373 | |
---|
240 | | -struct mii_bus *mdiobus_alloc_size(size_t); |
---|
| 374 | +struct mii_bus *mdiobus_alloc_size(size_t size); |
---|
| 375 | + |
---|
| 376 | +/** |
---|
| 377 | + * mdiobus_alloc - Allocate an MDIO bus structure |
---|
| 378 | + * |
---|
| 379 | + * The internal state of the MDIO bus will be set of MDIOBUS_ALLOCATED ready |
---|
| 380 | + * for the driver to register the bus. |
---|
| 381 | + */ |
---|
241 | 382 | static inline struct mii_bus *mdiobus_alloc(void) |
---|
242 | 383 | { |
---|
243 | 384 | return mdiobus_alloc_size(0); |
---|
244 | 385 | } |
---|
245 | 386 | |
---|
246 | 387 | int __mdiobus_register(struct mii_bus *bus, struct module *owner); |
---|
| 388 | +int __devm_mdiobus_register(struct device *dev, struct mii_bus *bus, |
---|
| 389 | + struct module *owner); |
---|
247 | 390 | #define mdiobus_register(bus) __mdiobus_register(bus, THIS_MODULE) |
---|
| 391 | +#define devm_mdiobus_register(dev, bus) \ |
---|
| 392 | + __devm_mdiobus_register(dev, bus, THIS_MODULE) |
---|
| 393 | + |
---|
248 | 394 | void mdiobus_unregister(struct mii_bus *bus); |
---|
249 | 395 | void mdiobus_free(struct mii_bus *bus); |
---|
250 | 396 | struct mii_bus *devm_mdiobus_alloc_size(struct device *dev, int sizeof_priv); |
---|
.. | .. |
---|
253 | 399 | return devm_mdiobus_alloc_size(dev, 0); |
---|
254 | 400 | } |
---|
255 | 401 | |
---|
256 | | -void devm_mdiobus_free(struct device *dev, struct mii_bus *bus); |
---|
| 402 | +struct mii_bus *mdio_find_bus(const char *mdio_name); |
---|
257 | 403 | struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr); |
---|
258 | 404 | |
---|
259 | | -#define PHY_INTERRUPT_DISABLED 0x0 |
---|
260 | | -#define PHY_INTERRUPT_ENABLED 0x80000000 |
---|
| 405 | +#define PHY_INTERRUPT_DISABLED false |
---|
| 406 | +#define PHY_INTERRUPT_ENABLED true |
---|
261 | 407 | |
---|
262 | | -/* PHY state machine states: |
---|
| 408 | +/** |
---|
| 409 | + * enum phy_state - PHY state machine states: |
---|
263 | 410 | * |
---|
264 | | - * DOWN: PHY device and driver are not ready for anything. probe |
---|
| 411 | + * @PHY_DOWN: PHY device and driver are not ready for anything. probe |
---|
265 | 412 | * should be called if and only if the PHY is in this state, |
---|
266 | 413 | * given that the PHY device exists. |
---|
267 | | - * - PHY driver probe function will, depending on the PHY, set |
---|
268 | | - * the state to STARTING or READY |
---|
| 414 | + * - PHY driver probe function will set the state to @PHY_READY |
---|
269 | 415 | * |
---|
270 | | - * STARTING: PHY device is coming up, and the ethernet driver is |
---|
271 | | - * not ready. PHY drivers may set this in the probe function. |
---|
272 | | - * If they do, they are responsible for making sure the state is |
---|
273 | | - * eventually set to indicate whether the PHY is UP or READY, |
---|
274 | | - * depending on the state when the PHY is done starting up. |
---|
275 | | - * - PHY driver will set the state to READY |
---|
276 | | - * - start will set the state to PENDING |
---|
277 | | - * |
---|
278 | | - * READY: PHY is ready to send and receive packets, but the |
---|
| 416 | + * @PHY_READY: PHY is ready to send and receive packets, but the |
---|
279 | 417 | * controller is not. By default, PHYs which do not implement |
---|
280 | | - * probe will be set to this state by phy_probe(). If the PHY |
---|
281 | | - * driver knows the PHY is ready, and the PHY state is STARTING, |
---|
282 | | - * then it sets this STATE. |
---|
| 418 | + * probe will be set to this state by phy_probe(). |
---|
283 | 419 | * - start will set the state to UP |
---|
284 | 420 | * |
---|
285 | | - * PENDING: PHY device is coming up, but the ethernet driver is |
---|
286 | | - * ready. phy_start will set this state if the PHY state is |
---|
287 | | - * STARTING. |
---|
288 | | - * - PHY driver will set the state to UP when the PHY is ready |
---|
289 | | - * |
---|
290 | | - * UP: The PHY and attached device are ready to do work. |
---|
| 421 | + * @PHY_UP: The PHY and attached device are ready to do work. |
---|
291 | 422 | * Interrupts should be started here. |
---|
292 | | - * - timer moves to AN |
---|
| 423 | + * - timer moves to @PHY_NOLINK or @PHY_RUNNING |
---|
293 | 424 | * |
---|
294 | | - * AN: The PHY is currently negotiating the link state. Link is |
---|
295 | | - * therefore down for now. phy_timer will set this state when it |
---|
296 | | - * detects the state is UP. config_aneg will set this state |
---|
297 | | - * whenever called with phydev->autoneg set to AUTONEG_ENABLE. |
---|
298 | | - * - If autonegotiation finishes, but there's no link, it sets |
---|
299 | | - * the state to NOLINK. |
---|
300 | | - * - If aneg finishes with link, it sets the state to RUNNING, |
---|
301 | | - * and calls adjust_link |
---|
302 | | - * - If autonegotiation did not finish after an arbitrary amount |
---|
303 | | - * of time, autonegotiation should be tried again if the PHY |
---|
304 | | - * supports "magic" autonegotiation (back to AN) |
---|
305 | | - * - If it didn't finish, and no magic_aneg, move to FORCING. |
---|
| 425 | + * @PHY_NOLINK: PHY is up, but not currently plugged in. |
---|
| 426 | + * - irq or timer will set @PHY_RUNNING if link comes back |
---|
| 427 | + * - phy_stop moves to @PHY_HALTED |
---|
306 | 428 | * |
---|
307 | | - * NOLINK: PHY is up, but not currently plugged in. |
---|
308 | | - * - If the timer notes that the link comes back, we move to RUNNING |
---|
309 | | - * - config_aneg moves to AN |
---|
310 | | - * - phy_stop moves to HALTED |
---|
311 | | - * |
---|
312 | | - * FORCING: PHY is being configured with forced settings |
---|
313 | | - * - if link is up, move to RUNNING |
---|
314 | | - * - If link is down, we drop to the next highest setting, and |
---|
315 | | - * retry (FORCING) after a timeout |
---|
316 | | - * - phy_stop moves to HALTED |
---|
317 | | - * |
---|
318 | | - * RUNNING: PHY is currently up, running, and possibly sending |
---|
| 429 | + * @PHY_RUNNING: PHY is currently up, running, and possibly sending |
---|
319 | 430 | * and/or receiving packets |
---|
320 | | - * - timer will set CHANGELINK if we're polling (this ensures the |
---|
321 | | - * link state is polled every other cycle of this state machine, |
---|
322 | | - * which makes it every other second) |
---|
323 | | - * - irq will set CHANGELINK |
---|
324 | | - * - config_aneg will set AN |
---|
325 | | - * - phy_stop moves to HALTED |
---|
| 431 | + * - irq or timer will set @PHY_NOLINK if link goes down |
---|
| 432 | + * - phy_stop moves to @PHY_HALTED |
---|
326 | 433 | * |
---|
327 | | - * CHANGELINK: PHY experienced a change in link state |
---|
328 | | - * - timer moves to RUNNING if link |
---|
329 | | - * - timer moves to NOLINK if the link is down |
---|
330 | | - * - phy_stop moves to HALTED |
---|
| 434 | + * @PHY_CABLETEST: PHY is performing a cable test. Packet reception/sending |
---|
| 435 | + * is not expected to work, carrier will be indicated as down. PHY will be |
---|
| 436 | + * poll once per second, or on interrupt for it current state. |
---|
| 437 | + * Once complete, move to UP to restart the PHY. |
---|
| 438 | + * - phy_stop aborts the running test and moves to @PHY_HALTED |
---|
331 | 439 | * |
---|
332 | | - * HALTED: PHY is up, but no polling or interrupts are done. Or |
---|
| 440 | + * @PHY_HALTED: PHY is up, but no polling or interrupts are done. Or |
---|
333 | 441 | * PHY is in an error state. |
---|
334 | | - * |
---|
335 | | - * - phy_start moves to RESUMING |
---|
336 | | - * |
---|
337 | | - * RESUMING: PHY was halted, but now wants to run again. |
---|
338 | | - * - If we are forcing, or aneg is done, timer moves to RUNNING |
---|
339 | | - * - If aneg is not done, timer moves to AN |
---|
340 | | - * - phy_stop moves to HALTED |
---|
| 442 | + * - phy_start moves to @PHY_UP |
---|
341 | 443 | */ |
---|
342 | 444 | enum phy_state { |
---|
343 | 445 | PHY_DOWN = 0, |
---|
344 | | - PHY_STARTING, |
---|
345 | 446 | PHY_READY, |
---|
346 | | - PHY_PENDING, |
---|
| 447 | + PHY_HALTED, |
---|
347 | 448 | PHY_UP, |
---|
348 | | - PHY_AN, |
---|
349 | 449 | PHY_RUNNING, |
---|
350 | 450 | PHY_NOLINK, |
---|
351 | | - PHY_FORCING, |
---|
352 | | - PHY_CHANGELINK, |
---|
353 | | - PHY_HALTED, |
---|
354 | | - PHY_RESUMING |
---|
| 451 | + PHY_CABLETEST, |
---|
355 | 452 | }; |
---|
| 453 | + |
---|
| 454 | +#define MDIO_MMD_NUM 32 |
---|
356 | 455 | |
---|
357 | 456 | /** |
---|
358 | 457 | * struct phy_c45_device_ids - 802.3-c45 Device Identifiers |
---|
359 | | - * @devices_in_package: Bit vector of devices present. |
---|
| 458 | + * @devices_in_package: IEEE 802.3 devices in package register value. |
---|
| 459 | + * @mmds_present: bit vector of MMDs present. |
---|
360 | 460 | * @device_ids: The device identifer for each present device. |
---|
361 | 461 | */ |
---|
362 | 462 | struct phy_c45_device_ids { |
---|
363 | 463 | u32 devices_in_package; |
---|
364 | | - u32 device_ids[8]; |
---|
| 464 | + u32 mmds_present; |
---|
| 465 | + u32 device_ids[MDIO_MMD_NUM]; |
---|
365 | 466 | }; |
---|
366 | 467 | |
---|
367 | | -/* phy_device: An instance of a PHY |
---|
| 468 | +struct macsec_context; |
---|
| 469 | +struct macsec_ops; |
---|
| 470 | + |
---|
| 471 | +/** |
---|
| 472 | + * struct phy_device - An instance of a PHY |
---|
368 | 473 | * |
---|
369 | | - * drv: Pointer to the driver for this PHY instance |
---|
370 | | - * phy_id: UID for this device found during discovery |
---|
371 | | - * c45_ids: 802.3-c45 Device Identifers if is_c45. |
---|
372 | | - * is_c45: Set to true if this phy uses clause 45 addressing. |
---|
373 | | - * is_internal: Set to true if this phy is internal to a MAC. |
---|
374 | | - * is_pseudo_fixed_link: Set to true if this phy is an Ethernet switch, etc. |
---|
375 | | - * has_fixups: Set to true if this phy has fixups/quirks. |
---|
376 | | - * suspended: Set to true if this phy has been suspended successfully. |
---|
377 | | - * suspended_by_mdio_bus: Set to true if this phy was suspended by MDIO bus. |
---|
378 | | - * sysfs_links: Internal boolean tracking sysfs symbolic links setup/removal. |
---|
379 | | - * loopback_enabled: Set true if this phy has been loopbacked successfully. |
---|
380 | | - * state: state of the PHY for management purposes |
---|
381 | | - * dev_flags: Device-specific flags used by the PHY driver. |
---|
382 | | - * link_timeout: The number of timer firings to wait before the |
---|
383 | | - * giving up on the current attempt at acquiring a link |
---|
384 | | - * irq: IRQ number of the PHY's interrupt (-1 if none) |
---|
385 | | - * phy_timer: The timer for handling the state machine |
---|
386 | | - * phy_queue: A work_queue for the phy_mac_interrupt |
---|
387 | | - * attached_dev: The attached enet driver's device instance ptr |
---|
388 | | - * adjust_link: Callback for the enet controller to respond to |
---|
389 | | - * changes in the link state. |
---|
| 474 | + * @mdio: MDIO bus this PHY is on |
---|
| 475 | + * @drv: Pointer to the driver for this PHY instance |
---|
| 476 | + * @phy_id: UID for this device found during discovery |
---|
| 477 | + * @c45_ids: 802.3-c45 Device Identifiers if is_c45. |
---|
| 478 | + * @is_c45: Set to true if this PHY uses clause 45 addressing. |
---|
| 479 | + * @is_internal: Set to true if this PHY is internal to a MAC. |
---|
| 480 | + * @is_pseudo_fixed_link: Set to true if this PHY is an Ethernet switch, etc. |
---|
| 481 | + * @is_gigabit_capable: Set to true if PHY supports 1000Mbps |
---|
| 482 | + * @has_fixups: Set to true if this PHY has fixups/quirks. |
---|
| 483 | + * @suspended: Set to true if this PHY has been suspended successfully. |
---|
| 484 | + * @suspended_by_mdio_bus: Set to true if this PHY was suspended by MDIO bus. |
---|
| 485 | + * @sysfs_links: Internal boolean tracking sysfs symbolic links setup/removal. |
---|
| 486 | + * @loopback_enabled: Set true if this PHY has been loopbacked successfully. |
---|
| 487 | + * @downshifted_rate: Set true if link speed has been downshifted. |
---|
| 488 | + * @state: State of the PHY for management purposes |
---|
| 489 | + * @dev_flags: Device-specific flags used by the PHY driver. |
---|
| 490 | + * @irq: IRQ number of the PHY's interrupt (-1 if none) |
---|
| 491 | + * @phy_timer: The timer for handling the state machine |
---|
| 492 | + * @phylink: Pointer to phylink instance for this PHY |
---|
| 493 | + * @sfp_bus_attached: Flag indicating whether the SFP bus has been attached |
---|
| 494 | + * @sfp_bus: SFP bus attached to this PHY's fiber port |
---|
| 495 | + * @attached_dev: The attached enet driver's device instance ptr |
---|
| 496 | + * @adjust_link: Callback for the enet controller to respond to changes: in the |
---|
| 497 | + * link state. |
---|
| 498 | + * @phy_link_change: Callback for phylink for notification of link change |
---|
| 499 | + * @macsec_ops: MACsec offloading ops. |
---|
390 | 500 | * |
---|
391 | | - * speed, duplex, pause, supported, advertising, lp_advertising, |
---|
392 | | - * and autoneg are used like in mii_if_info |
---|
| 501 | + * @speed: Current link speed |
---|
| 502 | + * @duplex: Current duplex |
---|
| 503 | + * @port: Current port |
---|
| 504 | + * @pause: Current pause |
---|
| 505 | + * @asym_pause: Current asymmetric pause |
---|
| 506 | + * @supported: Combined MAC/PHY supported linkmodes |
---|
| 507 | + * @advertising: Currently advertised linkmodes |
---|
| 508 | + * @adv_old: Saved advertised while power saving for WoL |
---|
| 509 | + * @lp_advertising: Current link partner advertised linkmodes |
---|
| 510 | + * @eee_broken_modes: Energy efficient ethernet modes which should be prohibited |
---|
| 511 | + * @autoneg: Flag autoneg being used |
---|
| 512 | + * @link: Current link state |
---|
| 513 | + * @autoneg_complete: Flag auto negotiation of the link has completed |
---|
| 514 | + * @mdix: Current crossover |
---|
| 515 | + * @mdix_ctrl: User setting of crossover |
---|
| 516 | + * @interrupts: Flag interrupts have been enabled |
---|
| 517 | + * @interface: enum phy_interface_t value |
---|
| 518 | + * @skb: Netlink message for cable diagnostics |
---|
| 519 | + * @nest: Netlink nest used for cable diagnostics |
---|
| 520 | + * @ehdr: nNtlink header for cable diagnostics |
---|
| 521 | + * @phy_led_triggers: Array of LED triggers |
---|
| 522 | + * @phy_num_led_triggers: Number of triggers in @phy_led_triggers |
---|
| 523 | + * @led_link_trigger: LED trigger for link up/down |
---|
| 524 | + * @last_triggered: last LED trigger for link speed |
---|
| 525 | + * @master_slave_set: User requested master/slave configuration |
---|
| 526 | + * @master_slave_get: Current master/slave advertisement |
---|
| 527 | + * @master_slave_state: Current master/slave configuration |
---|
| 528 | + * @mii_ts: Pointer to time stamper callbacks |
---|
| 529 | + * @lock: Mutex for serialization access to PHY |
---|
| 530 | + * @state_queue: Work queue for state machine |
---|
| 531 | + * @shared: Pointer to private data shared by phys in one package |
---|
| 532 | + * @priv: Pointer to driver private data |
---|
393 | 533 | * |
---|
394 | 534 | * interrupts currently only supports enabled or disabled, |
---|
395 | 535 | * but could be changed in the future to support enabling |
---|
.. | .. |
---|
411 | 551 | unsigned is_c45:1; |
---|
412 | 552 | unsigned is_internal:1; |
---|
413 | 553 | unsigned is_pseudo_fixed_link:1; |
---|
| 554 | + unsigned is_gigabit_capable:1; |
---|
414 | 555 | unsigned has_fixups:1; |
---|
415 | 556 | unsigned suspended:1; |
---|
416 | 557 | unsigned suspended_by_mdio_bus:1; |
---|
417 | 558 | unsigned sysfs_links:1; |
---|
418 | 559 | unsigned loopback_enabled:1; |
---|
| 560 | + unsigned downshifted_rate:1; |
---|
419 | 561 | |
---|
420 | 562 | unsigned autoneg:1; |
---|
421 | 563 | /* The most recently read link state */ |
---|
422 | 564 | unsigned link:1; |
---|
| 565 | + unsigned autoneg_complete:1; |
---|
| 566 | + |
---|
| 567 | + /* Interrupts are enabled */ |
---|
| 568 | + unsigned interrupts:1; |
---|
423 | 569 | |
---|
424 | 570 | enum phy_state state; |
---|
425 | 571 | |
---|
.. | .. |
---|
433 | 579 | */ |
---|
434 | 580 | int speed; |
---|
435 | 581 | int duplex; |
---|
| 582 | + int port; |
---|
436 | 583 | int pause; |
---|
437 | 584 | int asym_pause; |
---|
| 585 | + u8 master_slave_get; |
---|
| 586 | + u8 master_slave_set; |
---|
| 587 | + u8 master_slave_state; |
---|
438 | 588 | |
---|
439 | | - /* Enabled Interrupts */ |
---|
440 | | - u32 interrupts; |
---|
441 | | - |
---|
442 | | - /* Union of PHY and Attached devices' supported modes */ |
---|
443 | | - /* See mii.h for more info */ |
---|
444 | | - u32 supported; |
---|
445 | | - u32 advertising; |
---|
446 | | - u32 lp_advertising; |
---|
| 589 | + /* Union of PHY and Attached devices' supported link modes */ |
---|
| 590 | + /* See ethtool.h for more info */ |
---|
| 591 | + __ETHTOOL_DECLARE_LINK_MODE_MASK(supported); |
---|
| 592 | + __ETHTOOL_DECLARE_LINK_MODE_MASK(advertising); |
---|
| 593 | + __ETHTOOL_DECLARE_LINK_MODE_MASK(lp_advertising); |
---|
| 594 | + /* used with phy_speed_down */ |
---|
| 595 | + __ETHTOOL_DECLARE_LINK_MODE_MASK(adv_old); |
---|
447 | 596 | |
---|
448 | 597 | /* Energy efficient ethernet modes which should be prohibited */ |
---|
449 | 598 | u32 eee_broken_modes; |
---|
450 | | - |
---|
451 | | - int link_timeout; |
---|
452 | 599 | |
---|
453 | 600 | #ifdef CONFIG_LED_TRIGGER_PHY |
---|
454 | 601 | struct phy_led_trigger *phy_led_triggers; |
---|
.. | .. |
---|
468 | 615 | /* For use by PHYs to maintain extra state */ |
---|
469 | 616 | void *priv; |
---|
470 | 617 | |
---|
| 618 | + /* shared data pointer */ |
---|
| 619 | + /* For use by PHYs inside the same package that need a shared state. */ |
---|
| 620 | + struct phy_package_shared *shared; |
---|
| 621 | + |
---|
| 622 | + /* Reporting cable test results */ |
---|
| 623 | + struct sk_buff *skb; |
---|
| 624 | + void *ehdr; |
---|
| 625 | + struct nlattr *nest; |
---|
| 626 | + |
---|
471 | 627 | /* Interrupt and Polling infrastructure */ |
---|
472 | | - struct work_struct phy_queue; |
---|
473 | 628 | struct delayed_work state_queue; |
---|
474 | 629 | |
---|
475 | 630 | struct mutex lock; |
---|
476 | 631 | |
---|
| 632 | + /* This may be modified under the rtnl lock */ |
---|
| 633 | + bool sfp_bus_attached; |
---|
| 634 | + struct sfp_bus *sfp_bus; |
---|
477 | 635 | struct phylink *phylink; |
---|
478 | 636 | struct net_device *attached_dev; |
---|
| 637 | + struct mii_timestamper *mii_ts; |
---|
479 | 638 | |
---|
480 | 639 | u8 mdix; |
---|
481 | 640 | u8 mdix_ctrl; |
---|
482 | 641 | |
---|
483 | | - void (*phy_link_change)(struct phy_device *, bool up, bool do_carrier); |
---|
| 642 | + void (*phy_link_change)(struct phy_device *phydev, bool up); |
---|
484 | 643 | void (*adjust_link)(struct net_device *dev); |
---|
| 644 | + |
---|
| 645 | +#if IS_ENABLED(CONFIG_MACSEC) |
---|
| 646 | + /* MACsec management functions */ |
---|
| 647 | + const struct macsec_ops *macsec_ops; |
---|
| 648 | +#endif |
---|
485 | 649 | |
---|
486 | 650 | ANDROID_KABI_RESERVE(1); |
---|
487 | 651 | ANDROID_KABI_RESERVE(2); |
---|
.. | .. |
---|
491 | 655 | #define to_phy_device(d) container_of(to_mdio_device(d), \ |
---|
492 | 656 | struct phy_device, mdio) |
---|
493 | 657 | |
---|
494 | | -/* struct phy_driver: Driver structure for a particular PHY type |
---|
| 658 | +/** |
---|
| 659 | + * struct phy_tdr_config - Configuration of a TDR raw test |
---|
495 | 660 | * |
---|
496 | | - * driver_data: static driver data |
---|
497 | | - * phy_id: The result of reading the UID registers of this PHY |
---|
| 661 | + * @first: Distance for first data collection point |
---|
| 662 | + * @last: Distance for last data collection point |
---|
| 663 | + * @step: Step between data collection points |
---|
| 664 | + * @pair: Bitmap of cable pairs to collect data for |
---|
| 665 | + * |
---|
| 666 | + * A structure containing possible configuration parameters |
---|
| 667 | + * for a TDR cable test. The driver does not need to implement |
---|
| 668 | + * all the parameters, but should report what is actually used. |
---|
| 669 | + * All distances are in centimeters. |
---|
| 670 | + */ |
---|
| 671 | +struct phy_tdr_config { |
---|
| 672 | + u32 first; |
---|
| 673 | + u32 last; |
---|
| 674 | + u32 step; |
---|
| 675 | + s8 pair; |
---|
| 676 | +}; |
---|
| 677 | +#define PHY_PAIR_ALL -1 |
---|
| 678 | + |
---|
| 679 | +/** |
---|
| 680 | + * struct phy_driver - Driver structure for a particular PHY type |
---|
| 681 | + * |
---|
| 682 | + * @mdiodrv: Data common to all MDIO devices |
---|
| 683 | + * @phy_id: The result of reading the UID registers of this PHY |
---|
498 | 684 | * type, and ANDing them with the phy_id_mask. This driver |
---|
499 | 685 | * only works for PHYs with IDs which match this field |
---|
500 | | - * name: The friendly name of this PHY type |
---|
501 | | - * phy_id_mask: Defines the important bits of the phy_id |
---|
502 | | - * features: A list of features (speed, duplex, etc) supported |
---|
503 | | - * by this PHY |
---|
504 | | - * flags: A bitfield defining certain other features this PHY |
---|
| 686 | + * @name: The friendly name of this PHY type |
---|
| 687 | + * @phy_id_mask: Defines the important bits of the phy_id |
---|
| 688 | + * @features: A mandatory list of features (speed, duplex, etc) |
---|
| 689 | + * supported by this PHY |
---|
| 690 | + * @flags: A bitfield defining certain other features this PHY |
---|
505 | 691 | * supports (like interrupts) |
---|
| 692 | + * @driver_data: Static driver data |
---|
506 | 693 | * |
---|
507 | 694 | * All functions are optional. If config_aneg or read_status |
---|
508 | 695 | * are not implemented, the phy core uses the genphy versions. |
---|
.. | .. |
---|
517 | 704 | u32 phy_id; |
---|
518 | 705 | char *name; |
---|
519 | 706 | u32 phy_id_mask; |
---|
520 | | - u32 features; |
---|
| 707 | + const unsigned long * const features; |
---|
521 | 708 | u32 flags; |
---|
522 | 709 | const void *driver_data; |
---|
523 | 710 | |
---|
524 | | - /* |
---|
525 | | - * Called to issue a PHY software reset |
---|
| 711 | + /** |
---|
| 712 | + * @soft_reset: Called to issue a PHY software reset |
---|
526 | 713 | */ |
---|
527 | 714 | int (*soft_reset)(struct phy_device *phydev); |
---|
528 | 715 | |
---|
529 | | - /* |
---|
530 | | - * Called to initialize the PHY, |
---|
| 716 | + /** |
---|
| 717 | + * @config_init: Called to initialize the PHY, |
---|
531 | 718 | * including after a reset |
---|
532 | 719 | */ |
---|
533 | 720 | int (*config_init)(struct phy_device *phydev); |
---|
534 | 721 | |
---|
535 | | - /* |
---|
536 | | - * Called during discovery. Used to set |
---|
| 722 | + /** |
---|
| 723 | + * @probe: Called during discovery. Used to set |
---|
537 | 724 | * up device-specific structures, if any |
---|
538 | 725 | */ |
---|
539 | 726 | int (*probe)(struct phy_device *phydev); |
---|
540 | 727 | |
---|
| 728 | + /** |
---|
| 729 | + * @get_features: Probe the hardware to determine what |
---|
| 730 | + * abilities it has. Should only set phydev->supported. |
---|
| 731 | + */ |
---|
| 732 | + int (*get_features)(struct phy_device *phydev); |
---|
| 733 | + |
---|
541 | 734 | /* PHY Power Management */ |
---|
| 735 | + /** @suspend: Suspend the hardware, saving state if needed */ |
---|
542 | 736 | int (*suspend)(struct phy_device *phydev); |
---|
| 737 | + /** @resume: Resume the hardware, restoring state if needed */ |
---|
543 | 738 | int (*resume)(struct phy_device *phydev); |
---|
544 | 739 | |
---|
545 | | - /* |
---|
546 | | - * Configures the advertisement and resets |
---|
| 740 | + /** |
---|
| 741 | + * @config_aneg: Configures the advertisement and resets |
---|
547 | 742 | * autonegotiation if phydev->autoneg is on, |
---|
548 | 743 | * forces the speed to the current settings in phydev |
---|
549 | 744 | * if phydev->autoneg is off |
---|
550 | 745 | */ |
---|
551 | 746 | int (*config_aneg)(struct phy_device *phydev); |
---|
552 | 747 | |
---|
553 | | - /* Determines the auto negotiation result */ |
---|
| 748 | + /** @aneg_done: Determines the auto negotiation result */ |
---|
554 | 749 | int (*aneg_done)(struct phy_device *phydev); |
---|
555 | 750 | |
---|
556 | | - /* Determines the negotiated speed and duplex */ |
---|
| 751 | + /** @read_status: Determines the negotiated speed and duplex */ |
---|
557 | 752 | int (*read_status)(struct phy_device *phydev); |
---|
558 | 753 | |
---|
559 | | - /* Clears any pending interrupts */ |
---|
| 754 | + /** @ack_interrupt: Clears any pending interrupts */ |
---|
560 | 755 | int (*ack_interrupt)(struct phy_device *phydev); |
---|
561 | 756 | |
---|
562 | | - /* Enables or disables interrupts */ |
---|
| 757 | + /** @config_intr: Enables or disables interrupts */ |
---|
563 | 758 | int (*config_intr)(struct phy_device *phydev); |
---|
564 | 759 | |
---|
565 | | - /* |
---|
566 | | - * Checks if the PHY generated an interrupt. |
---|
| 760 | + /** |
---|
| 761 | + * @did_interrupt: Checks if the PHY generated an interrupt. |
---|
567 | 762 | * For multi-PHY devices with shared PHY interrupt pin |
---|
| 763 | + * Set interrupt bits have to be cleared. |
---|
568 | 764 | */ |
---|
569 | 765 | int (*did_interrupt)(struct phy_device *phydev); |
---|
570 | 766 | |
---|
571 | | - /* Clears up any memory if needed */ |
---|
| 767 | + /** @handle_interrupt: Override default interrupt handling */ |
---|
| 768 | + irqreturn_t (*handle_interrupt)(struct phy_device *phydev); |
---|
| 769 | + |
---|
| 770 | + /** @remove: Clears up any memory if needed */ |
---|
572 | 771 | void (*remove)(struct phy_device *phydev); |
---|
573 | 772 | |
---|
574 | | - /* Returns true if this is a suitable driver for the given |
---|
575 | | - * phydev. If NULL, matching is based on phy_id and |
---|
576 | | - * phy_id_mask. |
---|
| 773 | + /** |
---|
| 774 | + * @match_phy_device: Returns true if this is a suitable |
---|
| 775 | + * driver for the given phydev. If NULL, matching is based on |
---|
| 776 | + * phy_id and phy_id_mask. |
---|
577 | 777 | */ |
---|
578 | 778 | int (*match_phy_device)(struct phy_device *phydev); |
---|
579 | 779 | |
---|
580 | | - /* Handles ethtool queries for hardware time stamping. */ |
---|
581 | | - int (*ts_info)(struct phy_device *phydev, struct ethtool_ts_info *ti); |
---|
582 | | - |
---|
583 | | - /* Handles SIOCSHWTSTAMP ioctl for hardware time stamping. */ |
---|
584 | | - int (*hwtstamp)(struct phy_device *phydev, struct ifreq *ifr); |
---|
585 | | - |
---|
586 | | - /* |
---|
587 | | - * Requests a Rx timestamp for 'skb'. If the skb is accepted, |
---|
588 | | - * the phy driver promises to deliver it using netif_rx() as |
---|
589 | | - * soon as a timestamp becomes available. One of the |
---|
590 | | - * PTP_CLASS_ values is passed in 'type'. The function must |
---|
591 | | - * return true if the skb is accepted for delivery. |
---|
| 780 | + /** |
---|
| 781 | + * @set_wol: Some devices (e.g. qnap TS-119P II) require PHY |
---|
| 782 | + * register changes to enable Wake on LAN, so set_wol is |
---|
| 783 | + * provided to be called in the ethernet driver's set_wol |
---|
| 784 | + * function. |
---|
592 | 785 | */ |
---|
593 | | - bool (*rxtstamp)(struct phy_device *dev, struct sk_buff *skb, int type); |
---|
594 | | - |
---|
595 | | - /* |
---|
596 | | - * Requests a Tx timestamp for 'skb'. The phy driver promises |
---|
597 | | - * to deliver it using skb_complete_tx_timestamp() as soon as a |
---|
598 | | - * timestamp becomes available. One of the PTP_CLASS_ values |
---|
599 | | - * is passed in 'type'. |
---|
600 | | - */ |
---|
601 | | - void (*txtstamp)(struct phy_device *dev, struct sk_buff *skb, int type); |
---|
602 | | - |
---|
603 | | - /* Some devices (e.g. qnap TS-119P II) require PHY register changes to |
---|
604 | | - * enable Wake on LAN, so set_wol is provided to be called in the |
---|
605 | | - * ethernet driver's set_wol function. */ |
---|
606 | 786 | int (*set_wol)(struct phy_device *dev, struct ethtool_wolinfo *wol); |
---|
607 | 787 | |
---|
608 | | - /* See set_wol, but for checking whether Wake on LAN is enabled. */ |
---|
| 788 | + /** |
---|
| 789 | + * @get_wol: See set_wol, but for checking whether Wake on LAN |
---|
| 790 | + * is enabled. |
---|
| 791 | + */ |
---|
609 | 792 | void (*get_wol)(struct phy_device *dev, struct ethtool_wolinfo *wol); |
---|
610 | 793 | |
---|
611 | | - /* |
---|
612 | | - * Called to inform a PHY device driver when the core is about to |
---|
613 | | - * change the link state. This callback is supposed to be used as |
---|
614 | | - * fixup hook for drivers that need to take action when the link |
---|
615 | | - * state changes. Drivers are by no means allowed to mess with the |
---|
| 794 | + /** |
---|
| 795 | + * @link_change_notify: Called to inform a PHY device driver |
---|
| 796 | + * when the core is about to change the link state. This |
---|
| 797 | + * callback is supposed to be used as fixup hook for drivers |
---|
| 798 | + * that need to take action when the link state |
---|
| 799 | + * changes. Drivers are by no means allowed to mess with the |
---|
616 | 800 | * PHY device structure in their implementations. |
---|
617 | 801 | */ |
---|
618 | 802 | void (*link_change_notify)(struct phy_device *dev); |
---|
619 | 803 | |
---|
620 | | - /* |
---|
621 | | - * Phy specific driver override for reading a MMD register. |
---|
622 | | - * This function is optional for PHY specific drivers. When |
---|
623 | | - * not provided, the default MMD read function will be used |
---|
624 | | - * by phy_read_mmd(), which will use either a direct read for |
---|
625 | | - * Clause 45 PHYs or an indirect read for Clause 22 PHYs. |
---|
626 | | - * devnum is the MMD device number within the PHY device, |
---|
627 | | - * regnum is the register within the selected MMD device. |
---|
| 804 | + /** |
---|
| 805 | + * @read_mmd: PHY specific driver override for reading a MMD |
---|
| 806 | + * register. This function is optional for PHY specific |
---|
| 807 | + * drivers. When not provided, the default MMD read function |
---|
| 808 | + * will be used by phy_read_mmd(), which will use either a |
---|
| 809 | + * direct read for Clause 45 PHYs or an indirect read for |
---|
| 810 | + * Clause 22 PHYs. devnum is the MMD device number within the |
---|
| 811 | + * PHY device, regnum is the register within the selected MMD |
---|
| 812 | + * device. |
---|
628 | 813 | */ |
---|
629 | 814 | int (*read_mmd)(struct phy_device *dev, int devnum, u16 regnum); |
---|
630 | 815 | |
---|
631 | | - /* |
---|
632 | | - * Phy specific driver override for writing a MMD register. |
---|
633 | | - * This function is optional for PHY specific drivers. When |
---|
634 | | - * not provided, the default MMD write function will be used |
---|
635 | | - * by phy_write_mmd(), which will use either a direct write for |
---|
636 | | - * Clause 45 PHYs, or an indirect write for Clause 22 PHYs. |
---|
637 | | - * devnum is the MMD device number within the PHY device, |
---|
638 | | - * regnum is the register within the selected MMD device. |
---|
639 | | - * val is the value to be written. |
---|
| 816 | + /** |
---|
| 817 | + * @write_mmd: PHY specific driver override for writing a MMD |
---|
| 818 | + * register. This function is optional for PHY specific |
---|
| 819 | + * drivers. When not provided, the default MMD write function |
---|
| 820 | + * will be used by phy_write_mmd(), which will use either a |
---|
| 821 | + * direct write for Clause 45 PHYs, or an indirect write for |
---|
| 822 | + * Clause 22 PHYs. devnum is the MMD device number within the |
---|
| 823 | + * PHY device, regnum is the register within the selected MMD |
---|
| 824 | + * device. val is the value to be written. |
---|
640 | 825 | */ |
---|
641 | 826 | int (*write_mmd)(struct phy_device *dev, int devnum, u16 regnum, |
---|
642 | 827 | u16 val); |
---|
643 | 828 | |
---|
| 829 | + /** @read_page: Return the current PHY register page number */ |
---|
644 | 830 | int (*read_page)(struct phy_device *dev); |
---|
| 831 | + /** @write_page: Set the current PHY register page number */ |
---|
645 | 832 | int (*write_page)(struct phy_device *dev, int page); |
---|
646 | 833 | |
---|
647 | | - /* Get the size and type of the eeprom contained within a plug-in |
---|
648 | | - * module */ |
---|
| 834 | + /** |
---|
| 835 | + * @module_info: Get the size and type of the eeprom contained |
---|
| 836 | + * within a plug-in module |
---|
| 837 | + */ |
---|
649 | 838 | int (*module_info)(struct phy_device *dev, |
---|
650 | 839 | struct ethtool_modinfo *modinfo); |
---|
651 | 840 | |
---|
652 | | - /* Get the eeprom information from the plug-in module */ |
---|
| 841 | + /** |
---|
| 842 | + * @module_eeprom: Get the eeprom information from the plug-in |
---|
| 843 | + * module |
---|
| 844 | + */ |
---|
653 | 845 | int (*module_eeprom)(struct phy_device *dev, |
---|
654 | 846 | struct ethtool_eeprom *ee, u8 *data); |
---|
655 | 847 | |
---|
656 | | - /* Get statistics from the phy using ethtool */ |
---|
| 848 | + /** @cable_test_start: Start a cable test */ |
---|
| 849 | + int (*cable_test_start)(struct phy_device *dev); |
---|
| 850 | + |
---|
| 851 | + /** @cable_test_tdr_start: Start a raw TDR cable test */ |
---|
| 852 | + int (*cable_test_tdr_start)(struct phy_device *dev, |
---|
| 853 | + const struct phy_tdr_config *config); |
---|
| 854 | + |
---|
| 855 | + /** |
---|
| 856 | + * @cable_test_get_status: Once per second, or on interrupt, |
---|
| 857 | + * request the status of the test. |
---|
| 858 | + */ |
---|
| 859 | + int (*cable_test_get_status)(struct phy_device *dev, bool *finished); |
---|
| 860 | + |
---|
| 861 | + /* Get statistics from the PHY using ethtool */ |
---|
| 862 | + /** @get_sset_count: Number of statistic counters */ |
---|
657 | 863 | int (*get_sset_count)(struct phy_device *dev); |
---|
| 864 | + /** @get_strings: Names of the statistic counters */ |
---|
658 | 865 | void (*get_strings)(struct phy_device *dev, u8 *data); |
---|
| 866 | + /** @get_stats: Return the statistic counter values */ |
---|
659 | 867 | void (*get_stats)(struct phy_device *dev, |
---|
660 | 868 | struct ethtool_stats *stats, u64 *data); |
---|
661 | 869 | |
---|
662 | 870 | /* Get and Set PHY tunables */ |
---|
| 871 | + /** @get_tunable: Return the value of a tunable */ |
---|
663 | 872 | int (*get_tunable)(struct phy_device *dev, |
---|
664 | 873 | struct ethtool_tunable *tuna, void *data); |
---|
| 874 | + /** @set_tunable: Set the value of a tunable */ |
---|
665 | 875 | int (*set_tunable)(struct phy_device *dev, |
---|
666 | 876 | struct ethtool_tunable *tuna, |
---|
667 | 877 | const void *data); |
---|
| 878 | + /** @set_loopback: Set the loopback mood of the PHY */ |
---|
668 | 879 | int (*set_loopback)(struct phy_device *dev, bool enable); |
---|
| 880 | + /** @get_sqi: Get the signal quality indication */ |
---|
| 881 | + int (*get_sqi)(struct phy_device *dev); |
---|
| 882 | + /** @get_sqi_max: Get the maximum signal quality indication */ |
---|
| 883 | + int (*get_sqi_max)(struct phy_device *dev); |
---|
669 | 884 | |
---|
670 | 885 | ANDROID_KABI_RESERVE(1); |
---|
671 | 886 | ANDROID_KABI_RESERVE(2); |
---|
672 | | - |
---|
673 | 887 | }; |
---|
674 | 888 | #define to_phy_driver(d) container_of(to_mdio_common_driver(d), \ |
---|
675 | 889 | struct phy_driver, mdiodrv) |
---|
.. | .. |
---|
704 | 918 | |
---|
705 | 919 | const struct phy_setting * |
---|
706 | 920 | phy_lookup_setting(int speed, int duplex, const unsigned long *mask, |
---|
707 | | - size_t maxbit, bool exact); |
---|
| 921 | + bool exact); |
---|
708 | 922 | size_t phy_speeds(unsigned int *speeds, size_t size, |
---|
709 | | - unsigned long *mask, size_t maxbit); |
---|
710 | | - |
---|
711 | | -void phy_resolve_aneg_linkmode(struct phy_device *phydev); |
---|
| 923 | + unsigned long *mask); |
---|
| 924 | +void of_set_phy_supported(struct phy_device *phydev); |
---|
| 925 | +void of_set_phy_eee_broken(struct phy_device *phydev); |
---|
| 926 | +int phy_speed_down_core(struct phy_device *phydev); |
---|
712 | 927 | |
---|
713 | 928 | /** |
---|
714 | | - * phy_read_mmd - Convenience function for reading a register |
---|
715 | | - * from an MMD on a given PHY. |
---|
| 929 | + * phy_is_started - Convenience function to check whether PHY is started |
---|
716 | 930 | * @phydev: The phy_device struct |
---|
717 | | - * @devad: The MMD to read from |
---|
718 | | - * @regnum: The register on the MMD to read |
---|
719 | | - * |
---|
720 | | - * Same rules as for phy_read(); |
---|
721 | 931 | */ |
---|
722 | | -int phy_read_mmd(struct phy_device *phydev, int devad, u32 regnum); |
---|
| 932 | +static inline bool phy_is_started(struct phy_device *phydev) |
---|
| 933 | +{ |
---|
| 934 | + return phydev->state >= PHY_UP; |
---|
| 935 | +} |
---|
| 936 | + |
---|
| 937 | +void phy_resolve_aneg_pause(struct phy_device *phydev); |
---|
| 938 | +void phy_resolve_aneg_linkmode(struct phy_device *phydev); |
---|
| 939 | +void phy_check_downshift(struct phy_device *phydev); |
---|
723 | 940 | |
---|
724 | 941 | /** |
---|
725 | 942 | * phy_read - Convenience function for reading a given PHY register |
---|
.. | .. |
---|
734 | 951 | { |
---|
735 | 952 | return mdiobus_read(phydev->mdio.bus, phydev->mdio.addr, regnum); |
---|
736 | 953 | } |
---|
| 954 | + |
---|
| 955 | +#define phy_read_poll_timeout(phydev, regnum, val, cond, sleep_us, \ |
---|
| 956 | + timeout_us, sleep_before_read) \ |
---|
| 957 | +({ \ |
---|
| 958 | + int __ret = read_poll_timeout(phy_read, val, (cond) || val < 0, \ |
---|
| 959 | + sleep_us, timeout_us, sleep_before_read, phydev, regnum); \ |
---|
| 960 | + if (val < 0) \ |
---|
| 961 | + __ret = val; \ |
---|
| 962 | + if (__ret) \ |
---|
| 963 | + phydev_err(phydev, "%s failed: %d\n", __func__, __ret); \ |
---|
| 964 | + __ret; \ |
---|
| 965 | +}) |
---|
| 966 | + |
---|
737 | 967 | |
---|
738 | 968 | /** |
---|
739 | 969 | * __phy_read - convenience function for reading a given PHY register |
---|
.. | .. |
---|
776 | 1006 | val); |
---|
777 | 1007 | } |
---|
778 | 1008 | |
---|
| 1009 | +/** |
---|
| 1010 | + * __phy_modify_changed() - Convenience function for modifying a PHY register |
---|
| 1011 | + * @phydev: a pointer to a &struct phy_device |
---|
| 1012 | + * @regnum: register number |
---|
| 1013 | + * @mask: bit mask of bits to clear |
---|
| 1014 | + * @set: bit mask of bits to set |
---|
| 1015 | + * |
---|
| 1016 | + * Unlocked helper function which allows a PHY register to be modified as |
---|
| 1017 | + * new register value = (old register value & ~mask) | set |
---|
| 1018 | + * |
---|
| 1019 | + * Returns negative errno, 0 if there was no change, and 1 in case of change |
---|
| 1020 | + */ |
---|
| 1021 | +static inline int __phy_modify_changed(struct phy_device *phydev, u32 regnum, |
---|
| 1022 | + u16 mask, u16 set) |
---|
| 1023 | +{ |
---|
| 1024 | + return __mdiobus_modify_changed(phydev->mdio.bus, phydev->mdio.addr, |
---|
| 1025 | + regnum, mask, set); |
---|
| 1026 | +} |
---|
| 1027 | + |
---|
| 1028 | +/* |
---|
| 1029 | + * phy_read_mmd - Convenience function for reading a register |
---|
| 1030 | + * from an MMD on a given PHY. |
---|
| 1031 | + */ |
---|
| 1032 | +int phy_read_mmd(struct phy_device *phydev, int devad, u32 regnum); |
---|
| 1033 | + |
---|
| 1034 | +/** |
---|
| 1035 | + * phy_read_mmd_poll_timeout - Periodically poll a PHY register until a |
---|
| 1036 | + * condition is met or a timeout occurs |
---|
| 1037 | + * |
---|
| 1038 | + * @phydev: The phy_device struct |
---|
| 1039 | + * @devaddr: The MMD to read from |
---|
| 1040 | + * @regnum: The register on the MMD to read |
---|
| 1041 | + * @val: Variable to read the register into |
---|
| 1042 | + * @cond: Break condition (usually involving @val) |
---|
| 1043 | + * @sleep_us: Maximum time to sleep between reads in us (0 |
---|
| 1044 | + * tight-loops). Should be less than ~20ms since usleep_range |
---|
| 1045 | + * is used (see Documentation/timers/timers-howto.rst). |
---|
| 1046 | + * @timeout_us: Timeout in us, 0 means never timeout |
---|
| 1047 | + * @sleep_before_read: if it is true, sleep @sleep_us before read. |
---|
| 1048 | + * Returns 0 on success and -ETIMEDOUT upon a timeout. In either |
---|
| 1049 | + * case, the last read value at @args is stored in @val. Must not |
---|
| 1050 | + * be called from atomic context if sleep_us or timeout_us are used. |
---|
| 1051 | + */ |
---|
| 1052 | +#define phy_read_mmd_poll_timeout(phydev, devaddr, regnum, val, cond, \ |
---|
| 1053 | + sleep_us, timeout_us, sleep_before_read) \ |
---|
| 1054 | +({ \ |
---|
| 1055 | + int __ret = read_poll_timeout(phy_read_mmd, val, (cond) || val < 0, \ |
---|
| 1056 | + sleep_us, timeout_us, sleep_before_read, \ |
---|
| 1057 | + phydev, devaddr, regnum); \ |
---|
| 1058 | + if (val < 0) \ |
---|
| 1059 | + __ret = val; \ |
---|
| 1060 | + if (__ret) \ |
---|
| 1061 | + phydev_err(phydev, "%s failed: %d\n", __func__, __ret); \ |
---|
| 1062 | + __ret; \ |
---|
| 1063 | +}) |
---|
| 1064 | + |
---|
| 1065 | +/* |
---|
| 1066 | + * __phy_read_mmd - Convenience function for reading a register |
---|
| 1067 | + * from an MMD on a given PHY. |
---|
| 1068 | + */ |
---|
| 1069 | +int __phy_read_mmd(struct phy_device *phydev, int devad, u32 regnum); |
---|
| 1070 | + |
---|
| 1071 | +/* |
---|
| 1072 | + * phy_write_mmd - Convenience function for writing a register |
---|
| 1073 | + * on an MMD on a given PHY. |
---|
| 1074 | + */ |
---|
| 1075 | +int phy_write_mmd(struct phy_device *phydev, int devad, u32 regnum, u16 val); |
---|
| 1076 | + |
---|
| 1077 | +/* |
---|
| 1078 | + * __phy_write_mmd - Convenience function for writing a register |
---|
| 1079 | + * on an MMD on a given PHY. |
---|
| 1080 | + */ |
---|
| 1081 | +int __phy_write_mmd(struct phy_device *phydev, int devad, u32 regnum, u16 val); |
---|
| 1082 | + |
---|
| 1083 | +int __phy_modify_changed(struct phy_device *phydev, u32 regnum, u16 mask, |
---|
| 1084 | + u16 set); |
---|
| 1085 | +int phy_modify_changed(struct phy_device *phydev, u32 regnum, u16 mask, |
---|
| 1086 | + u16 set); |
---|
779 | 1087 | int __phy_modify(struct phy_device *phydev, u32 regnum, u16 mask, u16 set); |
---|
780 | 1088 | int phy_modify(struct phy_device *phydev, u32 regnum, u16 mask, u16 set); |
---|
| 1089 | + |
---|
| 1090 | +int __phy_modify_mmd_changed(struct phy_device *phydev, int devad, u32 regnum, |
---|
| 1091 | + u16 mask, u16 set); |
---|
| 1092 | +int phy_modify_mmd_changed(struct phy_device *phydev, int devad, u32 regnum, |
---|
| 1093 | + u16 mask, u16 set); |
---|
| 1094 | +int __phy_modify_mmd(struct phy_device *phydev, int devad, u32 regnum, |
---|
| 1095 | + u16 mask, u16 set); |
---|
| 1096 | +int phy_modify_mmd(struct phy_device *phydev, int devad, u32 regnum, |
---|
| 1097 | + u16 mask, u16 set); |
---|
781 | 1098 | |
---|
782 | 1099 | /** |
---|
783 | 1100 | * __phy_set_bits - Convenience function for setting bits in a PHY register |
---|
.. | .. |
---|
829 | 1146 | } |
---|
830 | 1147 | |
---|
831 | 1148 | /** |
---|
| 1149 | + * __phy_set_bits_mmd - Convenience function for setting bits in a register |
---|
| 1150 | + * on MMD |
---|
| 1151 | + * @phydev: the phy_device struct |
---|
| 1152 | + * @devad: the MMD containing register to modify |
---|
| 1153 | + * @regnum: register number to modify |
---|
| 1154 | + * @val: bits to set |
---|
| 1155 | + * |
---|
| 1156 | + * The caller must have taken the MDIO bus lock. |
---|
| 1157 | + */ |
---|
| 1158 | +static inline int __phy_set_bits_mmd(struct phy_device *phydev, int devad, |
---|
| 1159 | + u32 regnum, u16 val) |
---|
| 1160 | +{ |
---|
| 1161 | + return __phy_modify_mmd(phydev, devad, regnum, 0, val); |
---|
| 1162 | +} |
---|
| 1163 | + |
---|
| 1164 | +/** |
---|
| 1165 | + * __phy_clear_bits_mmd - Convenience function for clearing bits in a register |
---|
| 1166 | + * on MMD |
---|
| 1167 | + * @phydev: the phy_device struct |
---|
| 1168 | + * @devad: the MMD containing register to modify |
---|
| 1169 | + * @regnum: register number to modify |
---|
| 1170 | + * @val: bits to clear |
---|
| 1171 | + * |
---|
| 1172 | + * The caller must have taken the MDIO bus lock. |
---|
| 1173 | + */ |
---|
| 1174 | +static inline int __phy_clear_bits_mmd(struct phy_device *phydev, int devad, |
---|
| 1175 | + u32 regnum, u16 val) |
---|
| 1176 | +{ |
---|
| 1177 | + return __phy_modify_mmd(phydev, devad, regnum, val, 0); |
---|
| 1178 | +} |
---|
| 1179 | + |
---|
| 1180 | +/** |
---|
| 1181 | + * phy_set_bits_mmd - Convenience function for setting bits in a register |
---|
| 1182 | + * on MMD |
---|
| 1183 | + * @phydev: the phy_device struct |
---|
| 1184 | + * @devad: the MMD containing register to modify |
---|
| 1185 | + * @regnum: register number to modify |
---|
| 1186 | + * @val: bits to set |
---|
| 1187 | + */ |
---|
| 1188 | +static inline int phy_set_bits_mmd(struct phy_device *phydev, int devad, |
---|
| 1189 | + u32 regnum, u16 val) |
---|
| 1190 | +{ |
---|
| 1191 | + return phy_modify_mmd(phydev, devad, regnum, 0, val); |
---|
| 1192 | +} |
---|
| 1193 | + |
---|
| 1194 | +/** |
---|
| 1195 | + * phy_clear_bits_mmd - Convenience function for clearing bits in a register |
---|
| 1196 | + * on MMD |
---|
| 1197 | + * @phydev: the phy_device struct |
---|
| 1198 | + * @devad: the MMD containing register to modify |
---|
| 1199 | + * @regnum: register number to modify |
---|
| 1200 | + * @val: bits to clear |
---|
| 1201 | + */ |
---|
| 1202 | +static inline int phy_clear_bits_mmd(struct phy_device *phydev, int devad, |
---|
| 1203 | + u32 regnum, u16 val) |
---|
| 1204 | +{ |
---|
| 1205 | + return phy_modify_mmd(phydev, devad, regnum, val, 0); |
---|
| 1206 | +} |
---|
| 1207 | + |
---|
| 1208 | +/** |
---|
832 | 1209 | * phy_interrupt_is_valid - Convenience function for testing a given PHY irq |
---|
833 | 1210 | * @phydev: the phy_device struct |
---|
834 | 1211 | * |
---|
.. | .. |
---|
847 | 1224 | */ |
---|
848 | 1225 | static inline bool phy_polling_mode(struct phy_device *phydev) |
---|
849 | 1226 | { |
---|
| 1227 | + if (phydev->state == PHY_CABLETEST) |
---|
| 1228 | + if (phydev->drv->flags & PHY_POLL_CABLE_TEST) |
---|
| 1229 | + return true; |
---|
| 1230 | + |
---|
850 | 1231 | return phydev->irq == PHY_POLL; |
---|
| 1232 | +} |
---|
| 1233 | + |
---|
| 1234 | +/** |
---|
| 1235 | + * phy_has_hwtstamp - Tests whether a PHY time stamp configuration. |
---|
| 1236 | + * @phydev: the phy_device struct |
---|
| 1237 | + */ |
---|
| 1238 | +static inline bool phy_has_hwtstamp(struct phy_device *phydev) |
---|
| 1239 | +{ |
---|
| 1240 | + return phydev && phydev->mii_ts && phydev->mii_ts->hwtstamp; |
---|
| 1241 | +} |
---|
| 1242 | + |
---|
| 1243 | +/** |
---|
| 1244 | + * phy_has_rxtstamp - Tests whether a PHY supports receive time stamping. |
---|
| 1245 | + * @phydev: the phy_device struct |
---|
| 1246 | + */ |
---|
| 1247 | +static inline bool phy_has_rxtstamp(struct phy_device *phydev) |
---|
| 1248 | +{ |
---|
| 1249 | + return phydev && phydev->mii_ts && phydev->mii_ts->rxtstamp; |
---|
| 1250 | +} |
---|
| 1251 | + |
---|
| 1252 | +/** |
---|
| 1253 | + * phy_has_tsinfo - Tests whether a PHY reports time stamping and/or |
---|
| 1254 | + * PTP hardware clock capabilities. |
---|
| 1255 | + * @phydev: the phy_device struct |
---|
| 1256 | + */ |
---|
| 1257 | +static inline bool phy_has_tsinfo(struct phy_device *phydev) |
---|
| 1258 | +{ |
---|
| 1259 | + return phydev && phydev->mii_ts && phydev->mii_ts->ts_info; |
---|
| 1260 | +} |
---|
| 1261 | + |
---|
| 1262 | +/** |
---|
| 1263 | + * phy_has_txtstamp - Tests whether a PHY supports transmit time stamping. |
---|
| 1264 | + * @phydev: the phy_device struct |
---|
| 1265 | + */ |
---|
| 1266 | +static inline bool phy_has_txtstamp(struct phy_device *phydev) |
---|
| 1267 | +{ |
---|
| 1268 | + return phydev && phydev->mii_ts && phydev->mii_ts->txtstamp; |
---|
| 1269 | +} |
---|
| 1270 | + |
---|
| 1271 | +static inline int phy_hwtstamp(struct phy_device *phydev, struct ifreq *ifr) |
---|
| 1272 | +{ |
---|
| 1273 | + return phydev->mii_ts->hwtstamp(phydev->mii_ts, ifr); |
---|
| 1274 | +} |
---|
| 1275 | + |
---|
| 1276 | +static inline bool phy_rxtstamp(struct phy_device *phydev, struct sk_buff *skb, |
---|
| 1277 | + int type) |
---|
| 1278 | +{ |
---|
| 1279 | + return phydev->mii_ts->rxtstamp(phydev->mii_ts, skb, type); |
---|
| 1280 | +} |
---|
| 1281 | + |
---|
| 1282 | +static inline int phy_ts_info(struct phy_device *phydev, |
---|
| 1283 | + struct ethtool_ts_info *tsinfo) |
---|
| 1284 | +{ |
---|
| 1285 | + return phydev->mii_ts->ts_info(phydev->mii_ts, tsinfo); |
---|
| 1286 | +} |
---|
| 1287 | + |
---|
| 1288 | +static inline void phy_txtstamp(struct phy_device *phydev, struct sk_buff *skb, |
---|
| 1289 | + int type) |
---|
| 1290 | +{ |
---|
| 1291 | + phydev->mii_ts->txtstamp(phydev->mii_ts, skb, type); |
---|
851 | 1292 | } |
---|
852 | 1293 | |
---|
853 | 1294 | /** |
---|
.. | .. |
---|
862 | 1303 | /** |
---|
863 | 1304 | * phy_interface_mode_is_rgmii - Convenience function for testing if a |
---|
864 | 1305 | * PHY interface mode is RGMII (all variants) |
---|
865 | | - * @mode: the phy_interface_t enum |
---|
| 1306 | + * @mode: the &phy_interface_t enum |
---|
866 | 1307 | */ |
---|
867 | 1308 | static inline bool phy_interface_mode_is_rgmii(phy_interface_t mode) |
---|
868 | 1309 | { |
---|
.. | .. |
---|
871 | 1312 | }; |
---|
872 | 1313 | |
---|
873 | 1314 | /** |
---|
874 | | - * phy_interface_mode_is_8023z() - does the phy interface mode use 802.3z |
---|
| 1315 | + * phy_interface_mode_is_8023z() - does the PHY interface mode use 802.3z |
---|
875 | 1316 | * negotiation |
---|
876 | 1317 | * @mode: one of &enum phy_interface_t |
---|
877 | 1318 | * |
---|
878 | | - * Returns true if the phy interface mode uses the 16-bit negotiation |
---|
| 1319 | + * Returns true if the PHY interface mode uses the 16-bit negotiation |
---|
879 | 1320 | * word as defined in 802.3z. (See 802.3-2015 37.2.1 Config_Reg encoding) |
---|
880 | 1321 | */ |
---|
881 | 1322 | static inline bool phy_interface_mode_is_8023z(phy_interface_t mode) |
---|
.. | .. |
---|
894 | 1335 | return phy_interface_mode_is_rgmii(phydev->interface); |
---|
895 | 1336 | }; |
---|
896 | 1337 | |
---|
897 | | -/* |
---|
| 1338 | +/** |
---|
898 | 1339 | * phy_is_pseudo_fixed_link - Convenience function for testing if this |
---|
899 | 1340 | * PHY is the CPU port facing side of an Ethernet switch, or similar. |
---|
900 | 1341 | * @phydev: the phy_device struct |
---|
.. | .. |
---|
904 | 1345 | return phydev->is_pseudo_fixed_link; |
---|
905 | 1346 | } |
---|
906 | 1347 | |
---|
907 | | -/** |
---|
908 | | - * phy_write_mmd - Convenience function for writing a register |
---|
909 | | - * on an MMD on a given PHY. |
---|
910 | | - * @phydev: The phy_device struct |
---|
911 | | - * @devad: The MMD to read from |
---|
912 | | - * @regnum: The register on the MMD to read |
---|
913 | | - * @val: value to write to @regnum |
---|
914 | | - * |
---|
915 | | - * Same rules as for phy_write(); |
---|
916 | | - */ |
---|
917 | | -int phy_write_mmd(struct phy_device *phydev, int devad, u32 regnum, u16 val); |
---|
918 | | - |
---|
919 | 1348 | int phy_save_page(struct phy_device *phydev); |
---|
920 | 1349 | int phy_select_page(struct phy_device *phydev, int page); |
---|
921 | 1350 | int phy_restore_page(struct phy_device *phydev, int oldpage, int ret); |
---|
922 | 1351 | int phy_read_paged(struct phy_device *phydev, int page, u32 regnum); |
---|
923 | 1352 | int phy_write_paged(struct phy_device *phydev, int page, u32 regnum, u16 val); |
---|
| 1353 | +int phy_modify_paged_changed(struct phy_device *phydev, int page, u32 regnum, |
---|
| 1354 | + u16 mask, u16 set); |
---|
924 | 1355 | int phy_modify_paged(struct phy_device *phydev, int page, u32 regnum, |
---|
925 | 1356 | u16 mask, u16 set); |
---|
926 | 1357 | |
---|
927 | | -struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id, |
---|
| 1358 | +struct phy_device *phy_device_create(struct mii_bus *bus, int addr, u32 phy_id, |
---|
928 | 1359 | bool is_c45, |
---|
929 | 1360 | struct phy_c45_device_ids *c45_ids); |
---|
930 | 1361 | #if IS_ENABLED(CONFIG_PHYLIB) |
---|
.. | .. |
---|
951 | 1382 | int phy_resume(struct phy_device *phydev); |
---|
952 | 1383 | int __phy_resume(struct phy_device *phydev); |
---|
953 | 1384 | int phy_loopback(struct phy_device *phydev, bool enable); |
---|
| 1385 | +void phy_sfp_attach(void *upstream, struct sfp_bus *bus); |
---|
| 1386 | +void phy_sfp_detach(void *upstream, struct sfp_bus *bus); |
---|
| 1387 | +int phy_sfp_probe(struct phy_device *phydev, |
---|
| 1388 | + const struct sfp_upstream_ops *ops); |
---|
954 | 1389 | struct phy_device *phy_attach(struct net_device *dev, const char *bus_id, |
---|
955 | 1390 | phy_interface_t interface); |
---|
956 | 1391 | struct phy_device *phy_find_first(struct mii_bus *bus); |
---|
.. | .. |
---|
971 | 1406 | int phy_speed_down(struct phy_device *phydev, bool sync); |
---|
972 | 1407 | int phy_speed_up(struct phy_device *phydev); |
---|
973 | 1408 | |
---|
974 | | -int phy_stop_interrupts(struct phy_device *phydev); |
---|
975 | 1409 | int phy_restart_aneg(struct phy_device *phydev); |
---|
976 | 1410 | int phy_reset_after_clk_enable(struct phy_device *phydev); |
---|
| 1411 | + |
---|
| 1412 | +#if IS_ENABLED(CONFIG_PHYLIB) |
---|
| 1413 | +int phy_start_cable_test(struct phy_device *phydev, |
---|
| 1414 | + struct netlink_ext_ack *extack); |
---|
| 1415 | +int phy_start_cable_test_tdr(struct phy_device *phydev, |
---|
| 1416 | + struct netlink_ext_ack *extack, |
---|
| 1417 | + const struct phy_tdr_config *config); |
---|
| 1418 | +#else |
---|
| 1419 | +static inline |
---|
| 1420 | +int phy_start_cable_test(struct phy_device *phydev, |
---|
| 1421 | + struct netlink_ext_ack *extack) |
---|
| 1422 | +{ |
---|
| 1423 | + NL_SET_ERR_MSG(extack, "Kernel not compiled with PHYLIB support"); |
---|
| 1424 | + return -EOPNOTSUPP; |
---|
| 1425 | +} |
---|
| 1426 | +static inline |
---|
| 1427 | +int phy_start_cable_test_tdr(struct phy_device *phydev, |
---|
| 1428 | + struct netlink_ext_ack *extack, |
---|
| 1429 | + const struct phy_tdr_config *config) |
---|
| 1430 | +{ |
---|
| 1431 | + NL_SET_ERR_MSG(extack, "Kernel not compiled with PHYLIB support"); |
---|
| 1432 | + return -EOPNOTSUPP; |
---|
| 1433 | +} |
---|
| 1434 | +#endif |
---|
| 1435 | + |
---|
| 1436 | +int phy_cable_test_result(struct phy_device *phydev, u8 pair, u16 result); |
---|
| 1437 | +int phy_cable_test_fault_length(struct phy_device *phydev, u8 pair, |
---|
| 1438 | + u16 cm); |
---|
977 | 1439 | |
---|
978 | 1440 | static inline void phy_device_reset(struct phy_device *phydev, int value) |
---|
979 | 1441 | { |
---|
.. | .. |
---|
983 | 1445 | #define phydev_err(_phydev, format, args...) \ |
---|
984 | 1446 | dev_err(&_phydev->mdio.dev, format, ##args) |
---|
985 | 1447 | |
---|
| 1448 | +#define phydev_info(_phydev, format, args...) \ |
---|
| 1449 | + dev_info(&_phydev->mdio.dev, format, ##args) |
---|
| 1450 | + |
---|
| 1451 | +#define phydev_warn(_phydev, format, args...) \ |
---|
| 1452 | + dev_warn(&_phydev->mdio.dev, format, ##args) |
---|
| 1453 | + |
---|
986 | 1454 | #define phydev_dbg(_phydev, format, args...) \ |
---|
987 | 1455 | dev_dbg(&_phydev->mdio.dev, format, ##args) |
---|
988 | 1456 | |
---|
.. | .. |
---|
991 | 1459 | return dev_name(&phydev->mdio.dev); |
---|
992 | 1460 | } |
---|
993 | 1461 | |
---|
| 1462 | +static inline void phy_lock_mdio_bus(struct phy_device *phydev) |
---|
| 1463 | +{ |
---|
| 1464 | + mutex_lock(&phydev->mdio.bus->mdio_lock); |
---|
| 1465 | +} |
---|
| 1466 | + |
---|
| 1467 | +static inline void phy_unlock_mdio_bus(struct phy_device *phydev) |
---|
| 1468 | +{ |
---|
| 1469 | + mutex_unlock(&phydev->mdio.bus->mdio_lock); |
---|
| 1470 | +} |
---|
| 1471 | + |
---|
994 | 1472 | void phy_attached_print(struct phy_device *phydev, const char *fmt, ...) |
---|
995 | 1473 | __printf(2, 3); |
---|
| 1474 | +char *phy_attached_info_irq(struct phy_device *phydev) |
---|
| 1475 | + __malloc; |
---|
996 | 1476 | void phy_attached_info(struct phy_device *phydev); |
---|
997 | 1477 | |
---|
998 | 1478 | /* Clause 22 PHY */ |
---|
999 | | -int genphy_config_init(struct phy_device *phydev); |
---|
| 1479 | +int genphy_read_abilities(struct phy_device *phydev); |
---|
1000 | 1480 | int genphy_setup_forced(struct phy_device *phydev); |
---|
1001 | 1481 | int genphy_restart_aneg(struct phy_device *phydev); |
---|
1002 | | -int genphy_config_aneg(struct phy_device *phydev); |
---|
| 1482 | +int genphy_check_and_restart_aneg(struct phy_device *phydev, bool restart); |
---|
| 1483 | +int genphy_config_eee_advert(struct phy_device *phydev); |
---|
| 1484 | +int __genphy_config_aneg(struct phy_device *phydev, bool changed); |
---|
1003 | 1485 | int genphy_aneg_done(struct phy_device *phydev); |
---|
1004 | 1486 | int genphy_update_link(struct phy_device *phydev); |
---|
| 1487 | +int genphy_read_lpa(struct phy_device *phydev); |
---|
| 1488 | +int genphy_read_status_fixed(struct phy_device *phydev); |
---|
1005 | 1489 | int genphy_read_status(struct phy_device *phydev); |
---|
1006 | 1490 | int genphy_suspend(struct phy_device *phydev); |
---|
1007 | 1491 | int genphy_resume(struct phy_device *phydev); |
---|
1008 | 1492 | int genphy_loopback(struct phy_device *phydev, bool enable); |
---|
1009 | 1493 | int genphy_soft_reset(struct phy_device *phydev); |
---|
1010 | | -static inline int genphy_no_soft_reset(struct phy_device *phydev) |
---|
| 1494 | + |
---|
| 1495 | +static inline int genphy_config_aneg(struct phy_device *phydev) |
---|
| 1496 | +{ |
---|
| 1497 | + return __genphy_config_aneg(phydev, false); |
---|
| 1498 | +} |
---|
| 1499 | + |
---|
| 1500 | +static inline int genphy_no_ack_interrupt(struct phy_device *phydev) |
---|
| 1501 | +{ |
---|
| 1502 | + return 0; |
---|
| 1503 | +} |
---|
| 1504 | +static inline int genphy_no_config_intr(struct phy_device *phydev) |
---|
1011 | 1505 | { |
---|
1012 | 1506 | return 0; |
---|
1013 | 1507 | } |
---|
.. | .. |
---|
1016 | 1510 | int genphy_write_mmd_unsupported(struct phy_device *phdev, int devnum, |
---|
1017 | 1511 | u16 regnum, u16 val); |
---|
1018 | 1512 | |
---|
| 1513 | +/* Clause 37 */ |
---|
| 1514 | +int genphy_c37_config_aneg(struct phy_device *phydev); |
---|
| 1515 | +int genphy_c37_read_status(struct phy_device *phydev); |
---|
| 1516 | + |
---|
1019 | 1517 | /* Clause 45 PHY */ |
---|
1020 | 1518 | int genphy_c45_restart_aneg(struct phy_device *phydev); |
---|
| 1519 | +int genphy_c45_check_and_restart_aneg(struct phy_device *phydev, bool restart); |
---|
1021 | 1520 | int genphy_c45_aneg_done(struct phy_device *phydev); |
---|
1022 | | -int genphy_c45_read_link(struct phy_device *phydev, u32 mmd_mask); |
---|
| 1521 | +int genphy_c45_read_link(struct phy_device *phydev); |
---|
1023 | 1522 | int genphy_c45_read_lpa(struct phy_device *phydev); |
---|
1024 | 1523 | int genphy_c45_read_pma(struct phy_device *phydev); |
---|
1025 | 1524 | int genphy_c45_pma_setup_forced(struct phy_device *phydev); |
---|
| 1525 | +int genphy_c45_an_config_aneg(struct phy_device *phydev); |
---|
1026 | 1526 | int genphy_c45_an_disable_aneg(struct phy_device *phydev); |
---|
1027 | 1527 | int genphy_c45_read_mdix(struct phy_device *phydev); |
---|
| 1528 | +int genphy_c45_pma_read_abilities(struct phy_device *phydev); |
---|
| 1529 | +int genphy_c45_read_status(struct phy_device *phydev); |
---|
| 1530 | +int genphy_c45_config_aneg(struct phy_device *phydev); |
---|
| 1531 | + |
---|
| 1532 | +/* Generic C45 PHY driver */ |
---|
| 1533 | +extern struct phy_driver genphy_c45_driver; |
---|
1028 | 1534 | |
---|
1029 | 1535 | /* The gen10g_* functions are the old Clause 45 stub */ |
---|
1030 | 1536 | int gen10g_config_aneg(struct phy_device *phydev); |
---|
1031 | | -int gen10g_read_status(struct phy_device *phydev); |
---|
1032 | | -int gen10g_no_soft_reset(struct phy_device *phydev); |
---|
1033 | | -int gen10g_config_init(struct phy_device *phydev); |
---|
1034 | | -int gen10g_suspend(struct phy_device *phydev); |
---|
1035 | | -int gen10g_resume(struct phy_device *phydev); |
---|
1036 | 1537 | |
---|
1037 | 1538 | static inline int phy_read_status(struct phy_device *phydev) |
---|
1038 | 1539 | { |
---|
.. | .. |
---|
1051 | 1552 | int phy_drivers_register(struct phy_driver *new_driver, int n, |
---|
1052 | 1553 | struct module *owner); |
---|
1053 | 1554 | void phy_state_machine(struct work_struct *work); |
---|
1054 | | -void phy_change_work(struct work_struct *work); |
---|
| 1555 | +void phy_queue_state_machine(struct phy_device *phydev, unsigned long jiffies); |
---|
1055 | 1556 | void phy_mac_interrupt(struct phy_device *phydev); |
---|
1056 | 1557 | void phy_start_machine(struct phy_device *phydev); |
---|
1057 | 1558 | void phy_stop_machine(struct phy_device *phydev); |
---|
1058 | | -void phy_trigger_machine(struct phy_device *phydev, bool sync); |
---|
1059 | | -int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd); |
---|
1060 | 1559 | void phy_ethtool_ksettings_get(struct phy_device *phydev, |
---|
1061 | 1560 | struct ethtool_link_ksettings *cmd); |
---|
1062 | 1561 | int phy_ethtool_ksettings_set(struct phy_device *phydev, |
---|
1063 | 1562 | const struct ethtool_link_ksettings *cmd); |
---|
1064 | 1563 | int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd); |
---|
1065 | | -int phy_start_interrupts(struct phy_device *phydev); |
---|
| 1564 | +int phy_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); |
---|
| 1565 | +int phy_do_ioctl_running(struct net_device *dev, struct ifreq *ifr, int cmd); |
---|
| 1566 | +int phy_disable_interrupts(struct phy_device *phydev); |
---|
| 1567 | +void phy_request_interrupt(struct phy_device *phydev); |
---|
| 1568 | +void phy_free_interrupt(struct phy_device *phydev); |
---|
1066 | 1569 | void phy_print_status(struct phy_device *phydev); |
---|
1067 | 1570 | int phy_set_max_speed(struct phy_device *phydev, u32 max_speed); |
---|
| 1571 | +void phy_remove_link_mode(struct phy_device *phydev, u32 link_mode); |
---|
| 1572 | +void phy_advertise_supported(struct phy_device *phydev); |
---|
| 1573 | +void phy_support_sym_pause(struct phy_device *phydev); |
---|
| 1574 | +void phy_support_asym_pause(struct phy_device *phydev); |
---|
| 1575 | +void phy_set_sym_pause(struct phy_device *phydev, bool rx, bool tx, |
---|
| 1576 | + bool autoneg); |
---|
| 1577 | +void phy_set_asym_pause(struct phy_device *phydev, bool rx, bool tx); |
---|
| 1578 | +bool phy_validate_pause(struct phy_device *phydev, |
---|
| 1579 | + struct ethtool_pauseparam *pp); |
---|
| 1580 | +void phy_get_pause(struct phy_device *phydev, bool *tx_pause, bool *rx_pause); |
---|
| 1581 | + |
---|
| 1582 | +s32 phy_get_internal_delay(struct phy_device *phydev, struct device *dev, |
---|
| 1583 | + const int *delay_values, int size, bool is_rx); |
---|
| 1584 | + |
---|
| 1585 | +void phy_resolve_pause(unsigned long *local_adv, unsigned long *partner_adv, |
---|
| 1586 | + bool *tx_pause, bool *rx_pause); |
---|
1068 | 1587 | |
---|
1069 | 1588 | int phy_register_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask, |
---|
1070 | 1589 | int (*run)(struct phy_device *)); |
---|
.. | .. |
---|
1089 | 1608 | int phy_ethtool_set_link_ksettings(struct net_device *ndev, |
---|
1090 | 1609 | const struct ethtool_link_ksettings *cmd); |
---|
1091 | 1610 | int phy_ethtool_nway_reset(struct net_device *ndev); |
---|
| 1611 | +int phy_package_join(struct phy_device *phydev, int addr, size_t priv_size); |
---|
| 1612 | +void phy_package_leave(struct phy_device *phydev); |
---|
| 1613 | +int devm_phy_package_join(struct device *dev, struct phy_device *phydev, |
---|
| 1614 | + int addr, size_t priv_size); |
---|
1092 | 1615 | |
---|
1093 | 1616 | #if IS_ENABLED(CONFIG_PHYLIB) |
---|
1094 | 1617 | int __init mdio_bus_init(void); |
---|
1095 | 1618 | void mdio_bus_exit(void); |
---|
1096 | 1619 | #endif |
---|
1097 | 1620 | |
---|
1098 | | -/* Inline function for use within net/core/ethtool.c (built-in) */ |
---|
1099 | | -static inline int phy_ethtool_get_strings(struct phy_device *phydev, u8 *data) |
---|
| 1621 | +int phy_ethtool_get_strings(struct phy_device *phydev, u8 *data); |
---|
| 1622 | +int phy_ethtool_get_sset_count(struct phy_device *phydev); |
---|
| 1623 | +int phy_ethtool_get_stats(struct phy_device *phydev, |
---|
| 1624 | + struct ethtool_stats *stats, u64 *data); |
---|
| 1625 | + |
---|
| 1626 | +static inline int phy_package_read(struct phy_device *phydev, u32 regnum) |
---|
1100 | 1627 | { |
---|
1101 | | - if (!phydev->drv) |
---|
| 1628 | + struct phy_package_shared *shared = phydev->shared; |
---|
| 1629 | + |
---|
| 1630 | + if (!shared) |
---|
1102 | 1631 | return -EIO; |
---|
1103 | 1632 | |
---|
1104 | | - mutex_lock(&phydev->lock); |
---|
1105 | | - phydev->drv->get_strings(phydev, data); |
---|
1106 | | - mutex_unlock(&phydev->lock); |
---|
1107 | | - |
---|
1108 | | - return 0; |
---|
| 1633 | + return mdiobus_read(phydev->mdio.bus, shared->addr, regnum); |
---|
1109 | 1634 | } |
---|
1110 | 1635 | |
---|
1111 | | -static inline int phy_ethtool_get_sset_count(struct phy_device *phydev) |
---|
| 1636 | +static inline int __phy_package_read(struct phy_device *phydev, u32 regnum) |
---|
1112 | 1637 | { |
---|
1113 | | - int ret; |
---|
| 1638 | + struct phy_package_shared *shared = phydev->shared; |
---|
1114 | 1639 | |
---|
1115 | | - if (!phydev->drv) |
---|
| 1640 | + if (!shared) |
---|
1116 | 1641 | return -EIO; |
---|
1117 | 1642 | |
---|
1118 | | - if (phydev->drv->get_sset_count && |
---|
1119 | | - phydev->drv->get_strings && |
---|
1120 | | - phydev->drv->get_stats) { |
---|
1121 | | - mutex_lock(&phydev->lock); |
---|
1122 | | - ret = phydev->drv->get_sset_count(phydev); |
---|
1123 | | - mutex_unlock(&phydev->lock); |
---|
1124 | | - |
---|
1125 | | - return ret; |
---|
1126 | | - } |
---|
1127 | | - |
---|
1128 | | - return -EOPNOTSUPP; |
---|
| 1643 | + return __mdiobus_read(phydev->mdio.bus, shared->addr, regnum); |
---|
1129 | 1644 | } |
---|
1130 | 1645 | |
---|
1131 | | -static inline int phy_ethtool_get_stats(struct phy_device *phydev, |
---|
1132 | | - struct ethtool_stats *stats, u64 *data) |
---|
| 1646 | +static inline int phy_package_write(struct phy_device *phydev, |
---|
| 1647 | + u32 regnum, u16 val) |
---|
1133 | 1648 | { |
---|
1134 | | - if (!phydev->drv) |
---|
| 1649 | + struct phy_package_shared *shared = phydev->shared; |
---|
| 1650 | + |
---|
| 1651 | + if (!shared) |
---|
1135 | 1652 | return -EIO; |
---|
1136 | 1653 | |
---|
1137 | | - mutex_lock(&phydev->lock); |
---|
1138 | | - phydev->drv->get_stats(phydev, stats, data); |
---|
1139 | | - mutex_unlock(&phydev->lock); |
---|
| 1654 | + return mdiobus_write(phydev->mdio.bus, shared->addr, regnum, val); |
---|
| 1655 | +} |
---|
1140 | 1656 | |
---|
1141 | | - return 0; |
---|
| 1657 | +static inline int __phy_package_write(struct phy_device *phydev, |
---|
| 1658 | + u32 regnum, u16 val) |
---|
| 1659 | +{ |
---|
| 1660 | + struct phy_package_shared *shared = phydev->shared; |
---|
| 1661 | + |
---|
| 1662 | + if (!shared) |
---|
| 1663 | + return -EIO; |
---|
| 1664 | + |
---|
| 1665 | + return __mdiobus_write(phydev->mdio.bus, shared->addr, regnum, val); |
---|
| 1666 | +} |
---|
| 1667 | + |
---|
| 1668 | +static inline bool __phy_package_set_once(struct phy_device *phydev, |
---|
| 1669 | + unsigned int b) |
---|
| 1670 | +{ |
---|
| 1671 | + struct phy_package_shared *shared = phydev->shared; |
---|
| 1672 | + |
---|
| 1673 | + if (!shared) |
---|
| 1674 | + return false; |
---|
| 1675 | + |
---|
| 1676 | + return !test_and_set_bit(b, &shared->flags); |
---|
| 1677 | +} |
---|
| 1678 | + |
---|
| 1679 | +static inline bool phy_package_init_once(struct phy_device *phydev) |
---|
| 1680 | +{ |
---|
| 1681 | + return __phy_package_set_once(phydev, PHY_SHARED_F_INIT_DONE); |
---|
| 1682 | +} |
---|
| 1683 | + |
---|
| 1684 | +static inline bool phy_package_probe_once(struct phy_device *phydev) |
---|
| 1685 | +{ |
---|
| 1686 | + return __phy_package_set_once(phydev, PHY_SHARED_F_PROBE_DONE); |
---|
1142 | 1687 | } |
---|
1143 | 1688 | |
---|
1144 | 1689 | extern struct bus_type mdio_bus_type; |
---|
.. | .. |
---|
1163 | 1708 | |
---|
1164 | 1709 | |
---|
1165 | 1710 | /** |
---|
1166 | | - * module_phy_driver() - Helper macro for registering PHY drivers |
---|
| 1711 | + * phy_module_driver() - Helper macro for registering PHY drivers |
---|
1167 | 1712 | * @__phy_drivers: array of PHY drivers to register |
---|
| 1713 | + * @__count: Numbers of members in array |
---|
1168 | 1714 | * |
---|
1169 | 1715 | * Helper macro for PHY drivers which do not do anything special in module |
---|
1170 | 1716 | * init/exit. Each module may only use this macro once, and calling it |
---|
.. | .. |
---|
1185 | 1731 | #define module_phy_driver(__phy_drivers) \ |
---|
1186 | 1732 | phy_module_driver(__phy_drivers, ARRAY_SIZE(__phy_drivers)) |
---|
1187 | 1733 | |
---|
| 1734 | +bool phy_driver_is_genphy(struct phy_device *phydev); |
---|
| 1735 | +bool phy_driver_is_genphy_10g(struct phy_device *phydev); |
---|
| 1736 | + |
---|
1188 | 1737 | #endif /* __PHY_H */ |
---|