Blame view
include/linux/phy.h
16.7 KB
00db8189d This patch adds a... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/* * include/linux/phy.h * * 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> #include <linux/device.h> |
13df29f69 [PATCH] 2.6.18: s... |
23 24 25 26 |
#include <linux/ethtool.h> #include <linux/mii.h> #include <linux/timer.h> #include <linux/workqueue.h> |
8626d3b43 phylib: Support p... |
27 |
#include <linux/mod_devicetable.h> |
00db8189d This patch adds a... |
28 |
|
0ac495273 PHYLIB: IRQ event... |
29 |
#include <asm/atomic.h> |
00db8189d This patch adds a... |
30 31 32 33 34 35 36 37 38 39 40 |
#define PHY_BASIC_FEATURES (SUPPORTED_10baseT_Half | \ SUPPORTED_10baseT_Full | \ SUPPORTED_100baseT_Half | \ SUPPORTED_100baseT_Full | \ SUPPORTED_Autoneg | \ SUPPORTED_TP | \ SUPPORTED_MII) #define PHY_GBIT_FEATURES (PHY_BASIC_FEATURES | \ SUPPORTED_1000baseT_Half | \ SUPPORTED_1000baseT_Full) |
c5e38a949 phy: Clean up hea... |
41 42 |
/* * Set phydev->irq to PHY_POLL if interrupts are not supported, |
00db8189d This patch adds a... |
43 44 45 46 47 48 49 50 |
* 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 |
e8a2b6a42 [PATCH] PHY: Add ... |
51 52 53 54 55 56 57 58 |
/* Interface Mode definitions */ typedef enum { PHY_INTERFACE_MODE_MII, PHY_INTERFACE_MODE_GMII, PHY_INTERFACE_MODE_SGMII, PHY_INTERFACE_MODE_TBI, PHY_INTERFACE_MODE_RMII, PHY_INTERFACE_MODE_RGMII, |
a999589cc phylib: add RGMII... |
59 |
PHY_INTERFACE_MODE_RGMII_ID, |
7d400a4c5 phylib: add PHY i... |
60 61 |
PHY_INTERFACE_MODE_RGMII_RXID, PHY_INTERFACE_MODE_RGMII_TXID, |
e8a2b6a42 [PATCH] PHY: Add ... |
62 63 |
PHY_INTERFACE_MODE_RTBI } phy_interface_t; |
00db8189d This patch adds a... |
64 |
|
e8a2b6a42 [PATCH] PHY: Add ... |
65 |
#define PHY_INIT_TIMEOUT 100000 |
00db8189d This patch adds a... |
66 67 68 |
#define PHY_STATE_TIME 1 #define PHY_FORCE_TIMEOUT 10 #define PHY_AN_TIMEOUT 10 |
e8a2b6a42 [PATCH] PHY: Add ... |
69 |
#define PHY_MAX_ADDR 32 |
00db8189d This patch adds a... |
70 |
|
a4d00f179 [PATCH] phy: Adde... |
71 |
/* Used when trying to connect to a specific phy (mii bus id:phy device id) */ |
9d9326d3b phy: Change mii_b... |
72 73 74 75 76 77 |
#define PHY_ID_FMT "%s:%02x" /* * Need to be a little smaller than phydev->dev.bus_id to leave room * for the ":%02x" */ |
8e401eccd phy: Eliminate re... |
78 |
#define MII_BUS_ID_SIZE (20 - 3) |
a4d00f179 [PATCH] phy: Adde... |
79 |
|
abf35df21 NET: Support clau... |
80 81 82 |
/* 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) |
c5e38a949 phy: Clean up hea... |
83 84 85 86 |
/* * The Bus class for PHYs. Devices which provide access to * PHYs should register using this structure */ |
00db8189d This patch adds a... |
87 88 |
struct mii_bus { const char *name; |
9d9326d3b phy: Change mii_b... |
89 |
char id[MII_BUS_ID_SIZE]; |
00db8189d This patch adds a... |
90 91 92 93 |
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 phy: Clean up hea... |
94 95 96 97 |
/* * A lock to ensure that only one thing can read/write * the MDIO bus at a time */ |
35b5f6b1a PHYLIB: Locking f... |
98 |
struct mutex mdio_lock; |
00db8189d This patch adds a... |
99 |
|
18ee49ddb phylib: rename mi... |
100 |
struct device *parent; |
46abc0217 phylib: give mdio... |
101 102 103 104 105 106 107 |
enum { MDIOBUS_ALLOCATED = 1, MDIOBUS_REGISTERED, MDIOBUS_UNREGISTERED, MDIOBUS_RELEASED, } state; struct device dev; |
00db8189d This patch adds a... |
108 109 110 |
/* list of all PHYs on bus */ struct phy_device *phy_map[PHY_MAX_ADDR]; |
f896424cb [PATCH] phy addre... |
111 112 |
/* Phy addresses to be ignored when probing */ u32 phy_mask; |
c5e38a949 phy: Clean up hea... |
113 114 115 116 |
/* * Pointer to an array of interrupts, each PHY's * interrupt at the index matching its address */ |
00db8189d This patch adds a... |
117 118 |
int *irq; }; |
46abc0217 phylib: give mdio... |
119 |
#define to_mii_bus(d) container_of(d, struct mii_bus, dev) |
00db8189d This patch adds a... |
120 |
|
2e8881032 phylib: add mdiob... |
121 122 123 124 125 |
struct mii_bus *mdiobus_alloc(void); int mdiobus_register(struct mii_bus *bus); void mdiobus_unregister(struct mii_bus *bus); void mdiobus_free(struct mii_bus *bus); struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr); |
abf35df21 NET: Support clau... |
126 127 |
int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum); int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val); |
2e8881032 phylib: add mdiob... |
128 |
|
e8a2b6a42 [PATCH] PHY: Add ... |
129 130 |
#define PHY_INTERRUPT_DISABLED 0x0 #define PHY_INTERRUPT_ENABLED 0x80000000 |
00db8189d This patch adds a... |
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 |
/* 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 { PHY_DOWN=0, PHY_STARTING, PHY_READY, PHY_PENDING, PHY_UP, PHY_AN, PHY_RUNNING, PHY_NOLINK, PHY_FORCING, PHY_CHANGELINK, PHY_HALTED, PHY_RESUMING }; |
c1f19b51d net: support time... |
226 |
struct sk_buff; |
00db8189d This patch adds a... |
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 |
/* 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 * 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. * adjust_state: Callback for the enet driver to respond to * changes in the state machine. * * speed, duplex, pause, supported, advertising, and * autoneg are used like in mii_if_info * * 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; enum phy_state state; u32 dev_flags; |
e8a2b6a42 [PATCH] PHY: Add ... |
271 |
phy_interface_t interface; |
00db8189d This patch adds a... |
272 273 |
/* Bus address of the PHY (0-32) */ int addr; |
c5e38a949 phy: Clean up hea... |
274 275 |
/* * forced speed & duplex (no autoneg) |
00db8189d This patch adds a... |
276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 |
* 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; int autoneg; int link_timeout; |
c5e38a949 phy: Clean up hea... |
297 298 299 300 |
/* * Interrupt number for this PHY * -1 means no interrupt */ |
00db8189d This patch adds a... |
301 302 303 304 305 306 307 308 |
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 phylib: convert s... |
309 |
struct delayed_work state_queue; |
0ac495273 PHYLIB: IRQ event... |
310 |
atomic_t irq_disable; |
00db8189d This patch adds a... |
311 |
|
35b5f6b1a PHYLIB: Locking f... |
312 |
struct mutex lock; |
00db8189d This patch adds a... |
313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 |
struct net_device *attached_dev; void (*adjust_link)(struct net_device *dev); void (*adjust_state)(struct net_device *dev); }; #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) * * 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; |
c5e38a949 phy: Clean up hea... |
348 349 350 351 |
/* * Called to initialize the PHY, * including after a reset */ |
00db8189d This patch adds a... |
352 |
int (*config_init)(struct phy_device *phydev); |
c5e38a949 phy: Clean up hea... |
353 354 355 356 |
/* * Called during discovery. Used to set * up device-specific structures, if any */ |
00db8189d This patch adds a... |
357 358 359 360 361 |
int (*probe)(struct phy_device *phydev); /* PHY Power Management */ int (*suspend)(struct phy_device *phydev); int (*resume)(struct phy_device *phydev); |
c5e38a949 phy: Clean up hea... |
362 363 |
/* * Configures the advertisement and resets |
00db8189d This patch adds a... |
364 365 |
* autonegotiation if phydev->autoneg is on, * forces the speed to the current settings in phydev |
c5e38a949 phy: Clean up hea... |
366 367 |
* if phydev->autoneg is off */ |
00db8189d This patch adds a... |
368 369 370 371 372 373 374 375 376 377 |
int (*config_aneg)(struct phy_device *phydev); /* 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 phylib: Allow ear... |
378 379 380 381 382 |
/* * Checks if the PHY generated an interrupt. * For multi-PHY devices with shared PHY interrupt pin */ int (*did_interrupt)(struct phy_device *phydev); |
00db8189d This patch adds a... |
383 384 |
/* Clears up any memory if needed */ void (*remove)(struct phy_device *phydev); |
c1f19b51d net: support time... |
385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 |
/* 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 * to deliver it to the socket's error queue as soon as a * 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); |
00db8189d This patch adds a... |
404 405 406 |
struct device_driver driver; }; #define to_phy_driver(d) container_of(d, struct phy_driver, driver) |
f62220d3a phylib: Add suppo... |
407 408 409 410 411 412 |
#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 phy: Eliminate re... |
413 |
char bus_id[20]; |
f62220d3a phylib: Add suppo... |
414 415 416 417 |
u32 phy_uid; u32 phy_uid_mask; int (*run)(struct phy_device *phydev); }; |
2e8881032 phylib: add mdiob... |
418 419 420 421 422 423 424 425 426 |
/** * 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 NET: Support clau... |
427 |
static inline int phy_read(struct phy_device *phydev, u32 regnum) |
2e8881032 phylib: add mdiob... |
428 429 430 431 432 433 434 435 436 437 438 439 440 441 |
{ 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 NET: Support clau... |
442 |
static inline int phy_write(struct phy_device *phydev, u32 regnum, u16 val) |
2e8881032 phylib: add mdiob... |
443 444 445 |
{ return mdiobus_write(phydev->bus, phydev->addr, regnum, val); } |
cac1f3c8a phylib: factor ou... |
446 |
int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id); |
00db8189d This patch adds a... |
447 |
struct phy_device* get_phy_device(struct mii_bus *bus, int addr); |
4dea547fe phylib: rework to... |
448 |
int phy_device_register(struct phy_device *phy); |
00db8189d This patch adds a... |
449 450 |
int phy_clear_interrupt(struct phy_device *phydev); int phy_config_interrupt(struct phy_device *phydev, u32 interrupts); |
2f5cb4340 phylib: Properly ... |
451 |
int phy_init_hw(struct phy_device *phydev); |
fa94f6d93 phylib: add *_dir... |
452 453 |
int phy_attach_direct(struct net_device *dev, struct phy_device *phydev, u32 flags, phy_interface_t interface); |
e13934563 [PATCH] PHY Layer... |
454 |
struct phy_device * phy_attach(struct net_device *dev, |
f62220d3a phylib: Add suppo... |
455 |
const char *bus_id, u32 flags, phy_interface_t interface); |
f8f76db1d libphy: add phy_f... |
456 |
struct phy_device *phy_find_first(struct mii_bus *bus); |
fa94f6d93 phylib: add *_dir... |
457 458 459 |
int phy_connect_direct(struct net_device *dev, struct phy_device *phydev, void (*handler)(struct net_device *), u32 flags, phy_interface_t interface); |
f62220d3a phylib: Add suppo... |
460 |
struct phy_device * phy_connect(struct net_device *dev, const char *bus_id, |
e8a2b6a42 [PATCH] PHY: Add ... |
461 462 |
void (*handler)(struct net_device *), u32 flags, phy_interface_t interface); |
e13934563 [PATCH] PHY Layer... |
463 464 465 466 467 |
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 [PATCH] PHY Layer... |
468 469 |
void phy_sanitize_settings(struct phy_device *phydev); int phy_stop_interrupts(struct phy_device *phydev); |
9b9a8bfc8 phylib: Fix some ... |
470 471 |
int phy_enable_interrupts(struct phy_device *phydev); int phy_disable_interrupts(struct phy_device *phydev); |
00db8189d This patch adds a... |
472 473 474 475 |
static inline int phy_read_status(struct phy_device *phydev) { return phydev->drv->read_status(phydev); } |
e13934563 [PATCH] PHY Layer... |
476 |
int genphy_config_advert(struct phy_device *phydev); |
00db8189d This patch adds a... |
477 478 479 480 481 |
int genphy_setup_forced(struct phy_device *phydev); int genphy_restart_aneg(struct phy_device *phydev); int genphy_config_aneg(struct phy_device *phydev); int genphy_update_link(struct phy_device *phydev); int genphy_read_status(struct phy_device *phydev); |
0f0ca340e phy: power manage... |
482 483 |
int genphy_suspend(struct phy_device *phydev); int genphy_resume(struct phy_device *phydev); |
00db8189d This patch adds a... |
484 485 486 487 |
void phy_driver_unregister(struct phy_driver *drv); int phy_driver_register(struct phy_driver *new_driver); void phy_prepare_link(struct phy_device *phydev, void (*adjust_link)(struct net_device *)); |
4f9c85a1b phylib: Move work... |
488 |
void phy_state_machine(struct work_struct *work); |
00db8189d This patch adds a... |
489 490 491 492 493 494 |
void phy_start_machine(struct phy_device *phydev, void (*handler)(struct net_device *)); 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); int phy_mii_ioctl(struct phy_device *phydev, |
28b041139 net: preserve ifr... |
495 |
struct ifreq *ifr, int cmd); |
e13934563 [PATCH] PHY Layer... |
496 497 |
int phy_start_interrupts(struct phy_device *phydev); void phy_print_status(struct phy_device *phydev); |
11b0bacd7 [PATCH] PAL: Supp... |
498 |
struct phy_device* phy_device_create(struct mii_bus *bus, int addr, int phy_id); |
6f4a7f418 PHY: Add the phy_... |
499 |
void phy_device_free(struct phy_device *phydev); |
00db8189d This patch adds a... |
500 |
|
f62220d3a phylib: Add suppo... |
501 502 503 504 505 506 507 |
int phy_register_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask, int (*run)(struct phy_device *)); int phy_register_fixup_for_id(const char *bus_id, int (*run)(struct phy_device *)); int phy_register_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask, int (*run)(struct phy_device *)); int phy_scan_fixups(struct phy_device *phydev); |
9b9a8bfc8 phylib: Fix some ... |
508 509 |
int __init mdio_bus_init(void); void mdio_bus_exit(void); |
00db8189d This patch adds a... |
510 |
extern struct bus_type mdio_bus_type; |
00db8189d This patch adds a... |
511 |
#endif /* __PHY_H */ |