Blame view
include/linux/phy.h
26.3 KB
00db8189d
|
1 |
/* |
00db8189d
|
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
* Framework and drivers for configuring and reading different PHYs * Based on code in sungem_phy.c and gianfar_phy.c * * Author: Andy Fleming * * Copyright (c) 2004 Freescale Semiconductor, Inc. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * */ #ifndef __PHY_H #define __PHY_H #include <linux/spinlock.h> |
13df29f69
|
20 21 |
#include <linux/ethtool.h> #include <linux/mii.h> |
3e3aaf649
|
22 |
#include <linux/module.h> |
13df29f69
|
23 24 |
#include <linux/timer.h> #include <linux/workqueue.h> |
8626d3b43
|
25 |
#include <linux/mod_devicetable.h> |
00db8189d
|
26 |
|
60063497a
|
27 |
#include <linux/atomic.h> |
0ac495273
|
28 |
|
e9fbdf176
|
29 |
#define PHY_DEFAULT_FEATURES (SUPPORTED_Autoneg | \ |
00db8189d
|
30 31 |
SUPPORTED_TP | \ SUPPORTED_MII) |
e9fbdf176
|
32 33 34 35 36 37 38 |
#define PHY_10BT_FEATURES (SUPPORTED_10baseT_Half | \ SUPPORTED_10baseT_Full) #define PHY_100BT_FEATURES (SUPPORTED_100baseT_Half | \ SUPPORTED_100baseT_Full) #define PHY_1000BT_FEATURES (SUPPORTED_1000baseT_Half | \ |
00db8189d
|
39 |
SUPPORTED_1000baseT_Full) |
e9fbdf176
|
40 41 42 43 44 45 |
#define PHY_BASIC_FEATURES (PHY_10BT_FEATURES | \ PHY_100BT_FEATURES | \ PHY_DEFAULT_FEATURES) #define PHY_GBIT_FEATURES (PHY_BASIC_FEATURES | \ PHY_1000BT_FEATURES) |
c5e38a949
|
46 47 |
/* * Set phydev->irq to PHY_POLL if interrupts are not supported, |
00db8189d
|
48 49 50 51 52 53 54 55 |
* or not desired for this PHY. Set to PHY_IGNORE_INTERRUPT if * the attached driver handles the interrupt */ #define PHY_POLL -1 #define PHY_IGNORE_INTERRUPT -2 #define PHY_HAS_INTERRUPT 0x00000001 #define PHY_HAS_MAGICANEG 0x00000002 |
4284b6a53
|
56 |
#define PHY_IS_INTERNAL 0x00000004 |
00db8189d
|
57 |
|
e8a2b6a42
|
58 59 |
/* Interface Mode definitions */ typedef enum { |
4157ef1b8
|
60 |
PHY_INTERFACE_MODE_NA, |
e8a2b6a42
|
61 62 63 64 |
PHY_INTERFACE_MODE_MII, PHY_INTERFACE_MODE_GMII, PHY_INTERFACE_MODE_SGMII, PHY_INTERFACE_MODE_TBI, |
2cc70ba4c
|
65 |
PHY_INTERFACE_MODE_REVMII, |
e8a2b6a42
|
66 67 |
PHY_INTERFACE_MODE_RMII, PHY_INTERFACE_MODE_RGMII, |
a999589cc
|
68 |
PHY_INTERFACE_MODE_RGMII_ID, |
7d400a4c5
|
69 70 |
PHY_INTERFACE_MODE_RGMII_RXID, PHY_INTERFACE_MODE_RGMII_TXID, |
4157ef1b8
|
71 72 |
PHY_INTERFACE_MODE_RTBI, PHY_INTERFACE_MODE_SMII, |
898dd0bda
|
73 |
PHY_INTERFACE_MODE_XGMII, |
fd70f72c6
|
74 |
PHY_INTERFACE_MODE_MOCA, |
b9d12085f
|
75 |
PHY_INTERFACE_MODE_QSGMII, |
8a2fe56e8
|
76 |
PHY_INTERFACE_MODE_MAX, |
e8a2b6a42
|
77 |
} phy_interface_t; |
8a2fe56e8
|
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
/** * It maps 'enum phy_interface_t' found in include/linux/phy.h * into the device tree binding of 'phy-mode', so that Ethernet * device driver can get phy interface from device tree. */ static inline const char *phy_modes(phy_interface_t interface) { switch (interface) { case PHY_INTERFACE_MODE_NA: return ""; case PHY_INTERFACE_MODE_MII: return "mii"; case PHY_INTERFACE_MODE_GMII: return "gmii"; case PHY_INTERFACE_MODE_SGMII: return "sgmii"; case PHY_INTERFACE_MODE_TBI: return "tbi"; case PHY_INTERFACE_MODE_REVMII: return "rev-mii"; case PHY_INTERFACE_MODE_RMII: return "rmii"; case PHY_INTERFACE_MODE_RGMII: return "rgmii"; case PHY_INTERFACE_MODE_RGMII_ID: return "rgmii-id"; case PHY_INTERFACE_MODE_RGMII_RXID: return "rgmii-rxid"; case PHY_INTERFACE_MODE_RGMII_TXID: return "rgmii-txid"; case PHY_INTERFACE_MODE_RTBI: return "rtbi"; case PHY_INTERFACE_MODE_SMII: return "smii"; case PHY_INTERFACE_MODE_XGMII: return "xgmii"; |
fd70f72c6
|
114 115 |
case PHY_INTERFACE_MODE_MOCA: return "moca"; |
b9d12085f
|
116 117 |
case PHY_INTERFACE_MODE_QSGMII: return "qsgmii"; |
8a2fe56e8
|
118 119 120 121 |
default: return "unknown"; } } |
00db8189d
|
122 |
|
e8a2b6a42
|
123 |
#define PHY_INIT_TIMEOUT 100000 |
00db8189d
|
124 125 126 |
#define PHY_STATE_TIME 1 #define PHY_FORCE_TIMEOUT 10 #define PHY_AN_TIMEOUT 10 |
e8a2b6a42
|
127 |
#define PHY_MAX_ADDR 32 |
00db8189d
|
128 |
|
a4d00f179
|
129 |
/* Used when trying to connect to a specific phy (mii bus id:phy device id) */ |
9d9326d3b
|
130 131 132 133 134 135 |
#define PHY_ID_FMT "%s:%02x" /* * Need to be a little smaller than phydev->dev.bus_id to leave room * for the ":%02x" */ |
8e401eccd
|
136 |
#define MII_BUS_ID_SIZE (20 - 3) |
a4d00f179
|
137 |
|
abf35df21
|
138 139 140 |
/* Or MII_ADDR_C45 into regnum for read/write on mii_bus to enable the 21 bit IEEE 802.3ae clause 45 addressing mode used by 10GIGE phy chips. */ #define MII_ADDR_C45 (1<<30) |
313162d0b
|
141 142 |
struct device; struct sk_buff; |
c5e38a949
|
143 144 145 146 |
/* * The Bus class for PHYs. Devices which provide access to * PHYs should register using this structure */ |
00db8189d
|
147 |
struct mii_bus { |
3e3aaf649
|
148 |
struct module *owner; |
00db8189d
|
149 |
const char *name; |
9d9326d3b
|
150 |
char id[MII_BUS_ID_SIZE]; |
00db8189d
|
151 152 153 154 |
void *priv; int (*read)(struct mii_bus *bus, int phy_id, int regnum); int (*write)(struct mii_bus *bus, int phy_id, int regnum, u16 val); int (*reset)(struct mii_bus *bus); |
c5e38a949
|
155 156 157 158 |
/* * A lock to ensure that only one thing can read/write * the MDIO bus at a time */ |
35b5f6b1a
|
159 |
struct mutex mdio_lock; |
00db8189d
|
160 |
|
18ee49ddb
|
161 |
struct device *parent; |
46abc0217
|
162 163 164 165 166 167 168 |
enum { MDIOBUS_ALLOCATED = 1, MDIOBUS_REGISTERED, MDIOBUS_UNREGISTERED, MDIOBUS_RELEASED, } state; struct device dev; |
00db8189d
|
169 170 171 |
/* list of all PHYs on bus */ struct phy_device *phy_map[PHY_MAX_ADDR]; |
c68839963
|
172 |
/* PHY addresses to be ignored when probing */ |
f896424cb
|
173 |
u32 phy_mask; |
922f2dd1b
|
174 175 |
/* PHY addresses to ignore the TA/read failure */ u32 phy_ignore_ta_mask; |
c5e38a949
|
176 177 178 179 |
/* * Pointer to an array of interrupts, each PHY's * interrupt at the index matching its address */ |
00db8189d
|
180 181 |
int *irq; }; |
46abc0217
|
182 |
#define to_mii_bus(d) container_of(d, struct mii_bus, dev) |
00db8189d
|
183 |
|
eb8a54a78
|
184 185 186 187 188 |
struct mii_bus *mdiobus_alloc_size(size_t); static inline struct mii_bus *mdiobus_alloc(void) { return mdiobus_alloc_size(0); } |
3e3aaf649
|
189 190 |
int __mdiobus_register(struct mii_bus *bus, struct module *owner); #define mdiobus_register(bus) __mdiobus_register(bus, THIS_MODULE) |
2e8881032
|
191 192 |
void mdiobus_unregister(struct mii_bus *bus); void mdiobus_free(struct mii_bus *bus); |
6d48f44b7
|
193 194 195 196 197 198 199 |
struct mii_bus *devm_mdiobus_alloc_size(struct device *dev, int sizeof_priv); static inline struct mii_bus *devm_mdiobus_alloc(struct device *dev) { return devm_mdiobus_alloc_size(dev, 0); } void devm_mdiobus_free(struct device *dev, struct mii_bus *bus); |
2e8881032
|
200 |
struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr); |
abf35df21
|
201 |
int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum); |
21dd19fed
|
202 |
int mdiobus_read_nested(struct mii_bus *bus, int addr, u32 regnum); |
abf35df21
|
203 |
int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val); |
21dd19fed
|
204 |
int mdiobus_write_nested(struct mii_bus *bus, int addr, u32 regnum, u16 val); |
2e8881032
|
205 |
|
e8a2b6a42
|
206 207 |
#define PHY_INTERRUPT_DISABLED 0x0 #define PHY_INTERRUPT_ENABLED 0x80000000 |
00db8189d
|
208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 |
/* PHY state machine states: * * DOWN: PHY device and driver are not ready for anything. probe * should be called if and only if the PHY is in this state, * given that the PHY device exists. * - PHY driver probe function will, depending on the PHY, set * the state to STARTING or READY * * STARTING: PHY device is coming up, and the ethernet driver is * not ready. PHY drivers may set this in the probe function. * If they do, they are responsible for making sure the state is * eventually set to indicate whether the PHY is UP or READY, * depending on the state when the PHY is done starting up. * - PHY driver will set the state to READY * - start will set the state to PENDING * * READY: PHY is ready to send and receive packets, but the * controller is not. By default, PHYs which do not implement * probe will be set to this state by phy_probe(). If the PHY * driver knows the PHY is ready, and the PHY state is STARTING, * then it sets this STATE. * - start will set the state to UP * * PENDING: PHY device is coming up, but the ethernet driver is * ready. phy_start will set this state if the PHY state is * STARTING. * - PHY driver will set the state to UP when the PHY is ready * * UP: The PHY and attached device are ready to do work. * Interrupts should be started here. * - timer moves to AN * * AN: The PHY is currently negotiating the link state. Link is * therefore down for now. phy_timer will set this state when it * detects the state is UP. config_aneg will set this state * whenever called with phydev->autoneg set to AUTONEG_ENABLE. * - If autonegotiation finishes, but there's no link, it sets * the state to NOLINK. * - If aneg finishes with link, it sets the state to RUNNING, * and calls adjust_link * - If autonegotiation did not finish after an arbitrary amount * of time, autonegotiation should be tried again if the PHY * supports "magic" autonegotiation (back to AN) * - If it didn't finish, and no magic_aneg, move to FORCING. * * NOLINK: PHY is up, but not currently plugged in. * - If the timer notes that the link comes back, we move to RUNNING * - config_aneg moves to AN * - phy_stop moves to HALTED * * FORCING: PHY is being configured with forced settings * - if link is up, move to RUNNING * - If link is down, we drop to the next highest setting, and * retry (FORCING) after a timeout * - phy_stop moves to HALTED * * RUNNING: PHY is currently up, running, and possibly sending * and/or receiving packets * - timer will set CHANGELINK if we're polling (this ensures the * link state is polled every other cycle of this state machine, * which makes it every other second) * - irq will set CHANGELINK * - config_aneg will set AN * - phy_stop moves to HALTED * * CHANGELINK: PHY experienced a change in link state * - timer moves to RUNNING if link * - timer moves to NOLINK if the link is down * - phy_stop moves to HALTED * * HALTED: PHY is up, but no polling or interrupts are done. Or * PHY is in an error state. * * - phy_start moves to RESUMING * * RESUMING: PHY was halted, but now wants to run again. * - If we are forcing, or aneg is done, timer moves to RUNNING * - If aneg is not done, timer moves to AN * - phy_stop moves to HALTED */ enum phy_state { |
4017b4d32
|
290 |
PHY_DOWN = 0, |
00db8189d
|
291 292 293 294 295 296 297 298 299 300 301 302 |
PHY_STARTING, PHY_READY, PHY_PENDING, PHY_UP, PHY_AN, PHY_RUNNING, PHY_NOLINK, PHY_FORCING, PHY_CHANGELINK, PHY_HALTED, PHY_RESUMING }; |
ac28b9f8c
|
303 304 305 306 307 308 309 310 311 |
/** * struct phy_c45_device_ids - 802.3-c45 Device Identifiers * @devices_in_package: Bit vector of devices present. * @device_ids: The device identifer for each present device. */ struct phy_c45_device_ids { u32 devices_in_package; u32 device_ids[8]; }; |
c1f19b51d
|
312 |
|
00db8189d
|
313 314 315 316 317 318 |
/* phy_device: An instance of a PHY * * drv: Pointer to the driver for this PHY instance * bus: Pointer to the bus this PHY is on * dev: driver model device structure for this PHY * phy_id: UID for this device found during discovery |
ac28b9f8c
|
319 320 |
* c45_ids: 802.3-c45 Device Identifers if is_c45. * is_c45: Set to true if this phy uses clause 45 addressing. |
4284b6a53
|
321 |
* is_internal: Set to true if this phy is internal to a MAC. |
5a11dd7d9
|
322 |
* is_pseudo_fixed_link: Set to true if this phy is an Ethernet switch, etc. |
aae88261a
|
323 |
* has_fixups: Set to true if this phy has fixups/quirks. |
8a477a6fb
|
324 |
* suspended: Set to true if this phy has been suspended successfully. |
00db8189d
|
325 326 327 328 329 330 331 332 333 334 335 |
* state: state of the PHY for management purposes * dev_flags: Device-specific flags used by the PHY driver. * addr: Bus address of PHY * link_timeout: The number of timer firings to wait before the * giving up on the current attempt at acquiring a link * irq: IRQ number of the PHY's interrupt (-1 if none) * phy_timer: The timer for handling the state machine * phy_queue: A work_queue for the interrupt * attached_dev: The attached enet driver's device instance ptr * adjust_link: Callback for the enet controller to respond to * changes in the link state. |
00db8189d
|
336 |
* |
114002bc1
|
337 338 |
* speed, duplex, pause, supported, advertising, lp_advertising, * and autoneg are used like in mii_if_info |
00db8189d
|
339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 |
* * interrupts currently only supports enabled or disabled, * but could be changed in the future to support enabling * and disabling specific interrupts * * Contains some infrastructure for polling and interrupt * handling, as well as handling shifts in PHY hardware state */ struct phy_device { /* Information about the PHY type */ /* And management functions */ struct phy_driver *drv; struct mii_bus *bus; struct device dev; u32 phy_id; |
ac28b9f8c
|
357 358 |
struct phy_c45_device_ids c45_ids; bool is_c45; |
4284b6a53
|
359 |
bool is_internal; |
5a11dd7d9
|
360 |
bool is_pseudo_fixed_link; |
b0ae009f3
|
361 |
bool has_fixups; |
8a477a6fb
|
362 |
bool suspended; |
ac28b9f8c
|
363 |
|
00db8189d
|
364 365 366 |
enum phy_state state; u32 dev_flags; |
e8a2b6a42
|
367 |
phy_interface_t interface; |
c68839963
|
368 |
/* Bus address of the PHY (0-31) */ |
00db8189d
|
369 |
int addr; |
c5e38a949
|
370 371 |
/* * forced speed & duplex (no autoneg) |
00db8189d
|
372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 |
* partner speed & duplex & pause (autoneg) */ int speed; int duplex; int pause; int asym_pause; /* The most recently read link state */ int link; /* Enabled Interrupts */ u32 interrupts; /* Union of PHY and Attached devices' supported modes */ /* See mii.h for more info */ u32 supported; u32 advertising; |
114002bc1
|
389 |
u32 lp_advertising; |
00db8189d
|
390 391 392 393 |
int autoneg; int link_timeout; |
c5e38a949
|
394 395 396 397 |
/* * Interrupt number for this PHY * -1 means no interrupt */ |
00db8189d
|
398 399 400 401 402 403 404 405 |
int irq; /* private data pointer */ /* For use by PHYs to maintain extra state */ void *priv; /* Interrupt and Polling infrastructure */ struct work_struct phy_queue; |
a390d1f37
|
406 |
struct delayed_work state_queue; |
0ac495273
|
407 |
atomic_t irq_disable; |
00db8189d
|
408 |
|
35b5f6b1a
|
409 |
struct mutex lock; |
00db8189d
|
410 411 |
struct net_device *attached_dev; |
634ec36cc
|
412 |
u8 mdix; |
00db8189d
|
413 |
void (*adjust_link)(struct net_device *dev); |
00db8189d
|
414 415 416 417 418 419 420 421 422 423 424 425 426 427 |
}; #define to_phy_device(d) container_of(d, struct phy_device, dev) /* struct phy_driver: Driver structure for a particular PHY type * * phy_id: The result of reading the UID registers of this PHY * type, and ANDing them with the phy_id_mask. This driver * only works for PHYs with IDs which match this field * name: The friendly name of this PHY type * phy_id_mask: Defines the important bits of the phy_id * features: A list of features (speed, duplex, etc) supported * by this PHY * flags: A bitfield defining certain other features this PHY * supports (like interrupts) |
860f6e9eb
|
428 |
* driver_data: static driver data |
00db8189d
|
429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 |
* * The drivers must implement config_aneg and read_status. All * other functions are optional. Note that none of these * functions should be called from interrupt time. The goal is * for the bus read/write functions to be able to block when the * bus transaction is happening, and be freed up by an interrupt * (The MPC85xx has this ability, though it is not currently * supported in the driver). */ struct phy_driver { u32 phy_id; char *name; unsigned int phy_id_mask; u32 features; u32 flags; |
860f6e9eb
|
444 |
const void *driver_data; |
00db8189d
|
445 |
|
c5e38a949
|
446 |
/* |
9df81dd75
|
447 448 449 450 451 |
* Called to issue a PHY software reset */ int (*soft_reset)(struct phy_device *phydev); /* |
c5e38a949
|
452 453 454 |
* Called to initialize the PHY, * including after a reset */ |
00db8189d
|
455 |
int (*config_init)(struct phy_device *phydev); |
c5e38a949
|
456 457 458 459 |
/* * Called during discovery. Used to set * up device-specific structures, if any */ |
00db8189d
|
460 461 462 463 464 |
int (*probe)(struct phy_device *phydev); /* PHY Power Management */ int (*suspend)(struct phy_device *phydev); int (*resume)(struct phy_device *phydev); |
c5e38a949
|
465 466 |
/* * Configures the advertisement and resets |
00db8189d
|
467 468 |
* autonegotiation if phydev->autoneg is on, * forces the speed to the current settings in phydev |
c5e38a949
|
469 470 |
* if phydev->autoneg is off */ |
00db8189d
|
471 |
int (*config_aneg)(struct phy_device *phydev); |
76a423a3f
|
472 473 |
/* Determines the auto negotiation result */ int (*aneg_done)(struct phy_device *phydev); |
00db8189d
|
474 475 476 477 478 479 480 481 |
/* Determines the negotiated speed and duplex */ int (*read_status)(struct phy_device *phydev); /* Clears any pending interrupts */ int (*ack_interrupt)(struct phy_device *phydev); /* Enables or disables interrupts */ int (*config_intr)(struct phy_device *phydev); |
a8729eb30
|
482 483 484 485 486 |
/* * Checks if the PHY generated an interrupt. * For multi-PHY devices with shared PHY interrupt pin */ int (*did_interrupt)(struct phy_device *phydev); |
00db8189d
|
487 488 |
/* Clears up any memory if needed */ void (*remove)(struct phy_device *phydev); |
a30e2c189
|
489 490 491 492 493 |
/* Returns true if this is a suitable driver for the given * phydev. If NULL, matching is based on phy_id and * phy_id_mask. */ int (*match_phy_device)(struct phy_device *phydev); |
c8f3a8c31
|
494 495 |
/* Handles ethtool queries for hardware time stamping. */ int (*ts_info)(struct phy_device *phydev, struct ethtool_ts_info *ti); |
c1f19b51d
|
496 497 498 499 500 501 502 503 504 505 506 507 508 509 |
/* Handles SIOCSHWTSTAMP ioctl for hardware time stamping. */ int (*hwtstamp)(struct phy_device *phydev, struct ifreq *ifr); /* * Requests a Rx timestamp for 'skb'. If the skb is accepted, * the phy driver promises to deliver it using netif_rx() as * soon as a timestamp becomes available. One of the * PTP_CLASS_ values is passed in 'type'. The function must * return true if the skb is accepted for delivery. */ bool (*rxtstamp)(struct phy_device *dev, struct sk_buff *skb, int type); /* * Requests a Tx timestamp for 'skb'. The phy driver promises |
da92b194c
|
510 |
* to deliver it using skb_complete_tx_timestamp() as soon as a |
c1f19b51d
|
511 512 513 514 |
* timestamp becomes available. One of the PTP_CLASS_ values * is passed in 'type'. */ void (*txtstamp)(struct phy_device *dev, struct sk_buff *skb, int type); |
42e836eb4
|
515 516 517 518 519 520 521 |
/* Some devices (e.g. qnap TS-119P II) require PHY register changes to * enable Wake on LAN, so set_wol is provided to be called in the * ethernet driver's set_wol function. */ int (*set_wol)(struct phy_device *dev, struct ethtool_wolinfo *wol); /* See set_wol, but for checking whether Wake on LAN is enabled. */ void (*get_wol)(struct phy_device *dev, struct ethtool_wolinfo *wol); |
2b8f2a28e
|
522 523 524 525 526 527 528 529 |
/* * Called to inform a PHY device driver when the core is about to * change the link state. This callback is supposed to be used as * fixup hook for drivers that need to take action when the link * state changes. Drivers are by no means allowed to mess with the * PHY device structure in their implementations. */ void (*link_change_notify)(struct phy_device *dev); |
0c1d77dfb
|
530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 |
/* A function provided by a phy specific driver to override the * the PHY driver framework support for reading a MMD register * from the PHY. If not supported, return -1. This function is * optional for PHY specific drivers, if not provided then the * default MMD read function is used by the PHY framework. */ int (*read_mmd_indirect)(struct phy_device *dev, int ptrad, int devnum, int regnum); /* A function provided by a phy specific driver to override the * the PHY driver framework support for writing a MMD register * from the PHY. This function is optional for PHY specific drivers, * if not provided then the default MMD read function is used by * the PHY framework. */ void (*write_mmd_indirect)(struct phy_device *dev, int ptrad, int devnum, int regnum, u32 val); |
2f4383667
|
547 548 549 550 551 552 553 554 |
/* Get the size and type of the eeprom contained within a plug-in * module */ int (*module_info)(struct phy_device *dev, struct ethtool_modinfo *modinfo); /* Get the eeprom information from the plug-in module */ int (*module_eeprom)(struct phy_device *dev, struct ethtool_eeprom *ee, u8 *data); |
00db8189d
|
555 556 557 |
struct device_driver driver; }; #define to_phy_driver(d) container_of(d, struct phy_driver, driver) |
f62220d3a
|
558 559 560 561 562 563 |
#define PHY_ANY_ID "MATCH ANY PHY" #define PHY_ANY_UID 0xffffffff /* A Structure for boards to register fixups with the PHY Lib */ struct phy_fixup { struct list_head list; |
8e401eccd
|
564 |
char bus_id[20]; |
f62220d3a
|
565 566 567 568 |
u32 phy_uid; u32 phy_uid_mask; int (*run)(struct phy_device *phydev); }; |
2e8881032
|
569 |
/** |
efabdfb95
|
570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 |
* phy_read_mmd - Convenience function for reading a register * from an MMD on a given PHY. * @phydev: The phy_device struct * @devad: The MMD to read from * @regnum: The register on the MMD to read * * Same rules as for phy_read(); */ static inline int phy_read_mmd(struct phy_device *phydev, int devad, u32 regnum) { if (!phydev->is_c45) return -EOPNOTSUPP; return mdiobus_read(phydev->bus, phydev->addr, MII_ADDR_C45 | (devad << 16) | (regnum & 0xffff)); } /** |
66ce7fb98
|
588 589 590 591 592 593 594 595 596 597 598 599 600 |
* phy_read_mmd_indirect - reads data from the MMD registers * @phydev: The PHY device bus * @prtad: MMD Address * @devad: MMD DEVAD * @addr: PHY address on the MII bus * * Description: it reads data from the MMD registers (clause 22 to access to * clause 45) of the specified phy address. */ int phy_read_mmd_indirect(struct phy_device *phydev, int prtad, int devad, int addr); /** |
2e8881032
|
601 602 603 604 605 606 607 608 |
* phy_read - Convenience function for reading a given PHY register * @phydev: the phy_device struct * @regnum: register number to read * * NOTE: MUST NOT be called from interrupt context, * because the bus read/write functions may wait for an interrupt * to conclude the operation. */ |
abf35df21
|
609 |
static inline int phy_read(struct phy_device *phydev, u32 regnum) |
2e8881032
|
610 611 612 613 614 615 616 617 618 619 620 621 622 623 |
{ return mdiobus_read(phydev->bus, phydev->addr, regnum); } /** * phy_write - Convenience function for writing a given PHY register * @phydev: the phy_device struct * @regnum: register number to write * @val: value to write to @regnum * * NOTE: MUST NOT be called from interrupt context, * because the bus read/write functions may wait for an interrupt * to conclude the operation. */ |
abf35df21
|
624 |
static inline int phy_write(struct phy_device *phydev, u32 regnum, u16 val) |
2e8881032
|
625 626 627 |
{ return mdiobus_write(phydev->bus, phydev->addr, regnum, val); } |
2c7b49212
|
628 629 630 631 632 633 634 635 636 637 638 |
/** * phy_interrupt_is_valid - Convenience function for testing a given PHY irq * @phydev: the phy_device struct * * NOTE: must be kept in sync with addition/removal of PHY_POLL and * PHY_IGNORE_INTERRUPT */ static inline bool phy_interrupt_is_valid(struct phy_device *phydev) { return phydev->irq != PHY_POLL && phydev->irq != PHY_IGNORE_INTERRUPT; } |
4284b6a53
|
639 640 641 642 643 644 645 646 |
/** * phy_is_internal - Convenience function for testing if a PHY is internal * @phydev: the phy_device struct */ static inline bool phy_is_internal(struct phy_device *phydev) { return phydev->is_internal; } |
efabdfb95
|
647 |
/** |
e463d88c3
|
648 649 650 651 652 653 654 655 |
* phy_interface_is_rgmii - Convenience function for testing if a PHY interface * is RGMII (all variants) * @phydev: the phy_device struct */ static inline bool phy_interface_is_rgmii(struct phy_device *phydev) { return phydev->interface >= PHY_INTERFACE_MODE_RGMII && phydev->interface <= PHY_INTERFACE_MODE_RGMII_TXID; |
5a11dd7d9
|
656 657 658 659 660 661 662 663 664 665 |
}; /* * phy_is_pseudo_fixed_link - Convenience function for testing if this * PHY is the CPU port facing side of an Ethernet switch, or similar. * @phydev: the phy_device struct */ static inline bool phy_is_pseudo_fixed_link(struct phy_device *phydev) { return phydev->is_pseudo_fixed_link; |
e463d88c3
|
666 667 668 |
} /** |
efabdfb95
|
669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 |
* phy_write_mmd - Convenience function for writing a register * on an MMD on a given PHY. * @phydev: The phy_device struct * @devad: The MMD to read from * @regnum: The register on the MMD to read * @val: value to write to @regnum * * Same rules as for phy_write(); */ static inline int phy_write_mmd(struct phy_device *phydev, int devad, u32 regnum, u16 val) { if (!phydev->is_c45) return -EOPNOTSUPP; regnum = MII_ADDR_C45 | ((devad & 0x1f) << 16) | (regnum & 0xffff); return mdiobus_write(phydev->bus, phydev->addr, regnum, val); } |
66ce7fb98
|
688 689 690 691 692 693 694 695 696 697 698 699 700 |
/** * phy_write_mmd_indirect - writes data to the MMD registers * @phydev: The PHY device * @prtad: MMD Address * @devad: MMD DEVAD * @addr: PHY address on the MII bus * @data: data to write in the MMD register * * Description: Write data from the MMD registers of the specified * phy address. */ void phy_write_mmd_indirect(struct phy_device *phydev, int prtad, int devad, int addr, u32 data); |
ac28b9f8c
|
701 |
struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id, |
4017b4d32
|
702 703 |
bool is_c45, struct phy_c45_device_ids *c45_ids); |
ac28b9f8c
|
704 |
struct phy_device *get_phy_device(struct mii_bus *bus, int addr, bool is_c45); |
4dea547fe
|
705 |
int phy_device_register(struct phy_device *phy); |
38737e490
|
706 |
void phy_device_remove(struct phy_device *phydev); |
2f5cb4340
|
707 |
int phy_init_hw(struct phy_device *phydev); |
481b5d938
|
708 709 |
int phy_suspend(struct phy_device *phydev); int phy_resume(struct phy_device *phydev); |
4017b4d32
|
710 711 |
struct phy_device *phy_attach(struct net_device *dev, const char *bus_id, phy_interface_t interface); |
f8f76db1d
|
712 |
struct phy_device *phy_find_first(struct mii_bus *bus); |
257184d7c
|
713 714 |
int phy_attach_direct(struct net_device *dev, struct phy_device *phydev, u32 flags, phy_interface_t interface); |
fa94f6d93
|
715 |
int phy_connect_direct(struct net_device *dev, struct phy_device *phydev, |
4017b4d32
|
716 717 718 719 720 |
void (*handler)(struct net_device *), phy_interface_t interface); struct phy_device *phy_connect(struct net_device *dev, const char *bus_id, void (*handler)(struct net_device *), phy_interface_t interface); |
e13934563
|
721 722 723 724 725 |
void phy_disconnect(struct phy_device *phydev); void phy_detach(struct phy_device *phydev); void phy_start(struct phy_device *phydev); void phy_stop(struct phy_device *phydev); int phy_start_aneg(struct phy_device *phydev); |
e13934563
|
726 |
int phy_stop_interrupts(struct phy_device *phydev); |
00db8189d
|
727 |
|
4017b4d32
|
728 729 |
static inline int phy_read_status(struct phy_device *phydev) { |
00db8189d
|
730 731 |
return phydev->drv->read_status(phydev); } |
af6b6967d
|
732 |
int genphy_config_init(struct phy_device *phydev); |
3fb69bcad
|
733 |
int genphy_setup_forced(struct phy_device *phydev); |
00db8189d
|
734 735 |
int genphy_restart_aneg(struct phy_device *phydev); int genphy_config_aneg(struct phy_device *phydev); |
a9fa6e6ac
|
736 |
int genphy_aneg_done(struct phy_device *phydev); |
00db8189d
|
737 738 |
int genphy_update_link(struct phy_device *phydev); int genphy_read_status(struct phy_device *phydev); |
0f0ca340e
|
739 740 |
int genphy_suspend(struct phy_device *phydev); int genphy_resume(struct phy_device *phydev); |
797ac0713
|
741 |
int genphy_soft_reset(struct phy_device *phydev); |
00db8189d
|
742 |
void phy_driver_unregister(struct phy_driver *drv); |
d5bf9071e
|
743 |
void phy_drivers_unregister(struct phy_driver *drv, int n); |
00db8189d
|
744 |
int phy_driver_register(struct phy_driver *new_driver); |
d5bf9071e
|
745 |
int phy_drivers_register(struct phy_driver *new_driver, int n); |
4f9c85a1b
|
746 |
void phy_state_machine(struct work_struct *work); |
5ea94e768
|
747 748 |
void phy_change(struct work_struct *work); void phy_mac_interrupt(struct phy_device *phydev, int new_link); |
29935aebc
|
749 |
void phy_start_machine(struct phy_device *phydev); |
00db8189d
|
750 751 752 |
void phy_stop_machine(struct phy_device *phydev); int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd); int phy_ethtool_gset(struct phy_device *phydev, struct ethtool_cmd *cmd); |
4017b4d32
|
753 |
int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd); |
e13934563
|
754 755 |
int phy_start_interrupts(struct phy_device *phydev); void phy_print_status(struct phy_device *phydev); |
6f4a7f418
|
756 |
void phy_device_free(struct phy_device *phydev); |
f3a6bd393
|
757 |
int phy_set_max_speed(struct phy_device *phydev, u32 max_speed); |
00db8189d
|
758 |
|
f62220d3a
|
759 |
int phy_register_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask, |
4017b4d32
|
760 |
int (*run)(struct phy_device *)); |
f62220d3a
|
761 |
int phy_register_fixup_for_id(const char *bus_id, |
4017b4d32
|
762 |
int (*run)(struct phy_device *)); |
f62220d3a
|
763 |
int phy_register_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask, |
4017b4d32
|
764 |
int (*run)(struct phy_device *)); |
f62220d3a
|
765 |
|
a59a4d192
|
766 767 768 769 |
int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable); int phy_get_eee_err(struct phy_device *phydev); int phy_ethtool_set_eee(struct phy_device *phydev, struct ethtool_eee *data); int phy_ethtool_get_eee(struct phy_device *phydev, struct ethtool_eee *data); |
42e836eb4
|
770 |
int phy_ethtool_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol); |
4017b4d32
|
771 772 |
void phy_ethtool_get_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol); |
a59a4d192
|
773 |
|
9b9a8bfc8
|
774 775 |
int __init mdio_bus_init(void); void mdio_bus_exit(void); |
00db8189d
|
776 |
extern struct bus_type mdio_bus_type; |
c31accd15
|
777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 |
/** * module_phy_driver() - Helper macro for registering PHY drivers * @__phy_drivers: array of PHY drivers to register * * Helper macro for PHY drivers which do not do anything special in module * init/exit. Each module may only use this macro once, and calling it * replaces module_init() and module_exit(). */ #define phy_module_driver(__phy_drivers, __count) \ static int __init phy_module_init(void) \ { \ return phy_drivers_register(__phy_drivers, __count); \ } \ module_init(phy_module_init); \ static void __exit phy_module_exit(void) \ { \ phy_drivers_unregister(__phy_drivers, __count); \ } \ module_exit(phy_module_exit) #define module_phy_driver(__phy_drivers) \ phy_module_driver(__phy_drivers, ARRAY_SIZE(__phy_drivers)) |
00db8189d
|
800 |
#endif /* __PHY_H */ |