| .. | .. | 
|---|
|  | 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 */ | 
|---|