iPXE
mii.h
Go to the documentation of this file.
1#ifndef _IPXE_MII_H
2#define _IPXE_MII_H
3
4/** @file
5 *
6 * Media Independent Interface
7 *
8 */
9
10FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11FILE_SECBOOT ( PERMITTED );
12
13#include <mii.h>
14#include <ipxe/netdevice.h>
15
16struct mii_interface;
17
18/** MII interface operations */
20 /**
21 * Read from MII register
22 *
23 * @v mdio MII interface
24 * @v phy PHY address
25 * @v reg Register address
26 * @ret data Data read, or negative error
27 */
28 int ( * read ) ( struct mii_interface *mdio, unsigned int phy,
29 unsigned int reg );
30 /**
31 * Write to MII register
32 *
33 * @v mdio MII interface
34 * @v phy PHY address
35 * @v reg Register address
36 * @v data Data to write
37 * @ret rc Return status code
38 */
39 int ( * write ) ( struct mii_interface *mdio, unsigned int phy,
40 unsigned int reg, unsigned int data );
41};
42
43/** An MII interface */
45 /** Interface operations */
47};
48
49/** An MII device */
50struct mii_device {
51 /** MII interface */
53 /** PHY address */
54 unsigned int address;
55};
56
57/**
58 * Initialise MII interface
59 *
60 * @v mdio MII interface
61 * @v op MII interface operations
62 */
63static inline __attribute__ (( always_inline )) void
64mdio_init ( struct mii_interface *mdio, struct mii_operations *op ) {
65 mdio->op = op;
66}
67
68/**
69 * Initialise MII device
70 *
71 * @v mii MII device
72 * @v mdio MII interface
73 * @v address PHY address
74 */
75static inline __attribute__ (( always_inline )) void
76mii_init ( struct mii_device *mii, struct mii_interface *mdio,
77 unsigned int address ) {
78 mii->mdio = mdio;
79 mii->address = address;
80}
81
82/**
83 * Read from MII register
84 *
85 * @v mii MII device
86 * @v reg Register address
87 * @ret data Data read, or negative error
88 */
89static inline __attribute__ (( always_inline )) int
90mii_read ( struct mii_device *mii, unsigned int reg ) {
91 struct mii_interface *mdio = mii->mdio;
92
93 return mdio->op->read ( mdio, mii->address, reg );
94}
95
96/**
97 * Write to MII register
98 *
99 * @v mii MII device
100 * @v reg Register address
101 * @v data Data to write
102 * @ret rc Return status code
103 */
104static inline __attribute__ (( always_inline )) int
105mii_write ( struct mii_device *mii, unsigned int reg, unsigned int data ) {
106 struct mii_interface *mdio = mii->mdio;
107
108 return mdio->op->write ( mdio, mii->address, reg, data );
109}
110
111/**
112 * Dump MII registers (for debugging)
113 *
114 * @v mii MII device
115 */
116static inline void
118 unsigned int i;
119 int data;
120
121 /* Do nothing unless debug output is enabled */
122 if ( ! DBG_LOG )
123 return;
124
125 /* Dump basic MII register set */
126 for ( i = 0 ; i < 16 ; i++ ) {
127 if ( ( i % 8 ) == 0 ) {
128 DBGC ( mii, "MII %p registers %02x-%02x:",
129 mii, i, ( i + 7 ) );
130 }
131 data = mii_read ( mii, i );
132 if ( data >= 0 ) {
133 DBGC ( mii, " %04x", data );
134 } else {
135 DBGC ( mii, " XXXX" );
136 }
137 if ( ( i % 8 ) == 7 )
138 DBGC ( mii, "\n" );
139 }
140}
141
142/** Maximum time to wait for a reset, in milliseconds */
143#define MII_RESET_MAX_WAIT_MS 500
144
145/** Maximum PHY address */
146#define MII_MAX_PHY_ADDRESS 31
147
148extern int mii_restart ( struct mii_device *mii );
149extern int mii_reset ( struct mii_device *mii );
150extern int mii_check_link ( struct mii_device *mii,
151 struct net_device *netdev );
152extern int mii_find ( struct mii_device *mii );
153
154#endif /* _IPXE_MII_H */
uint8_t data[48]
Additional event data.
Definition ena.h:11
uint64_t address
Base address.
Definition ena.h:13
static struct net_device * netdev
Definition gdbudp.c:53
#define DBGC(...)
Definition compiler.h:505
#define DBG_LOG
Definition compiler.h:317
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:896
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
Definition compiler.h:926
#define __attribute__(x)
Definition compiler.h:10
Media Independent Interface.
int mii_reset(struct mii_device *mii)
Reset MII device.
Definition mii.c:75
static int mii_write(struct mii_device *mii, unsigned int reg, unsigned int data)
Write to MII register.
Definition mii.h:105
int mii_restart(struct mii_device *mii)
Restart autonegotiation.
Definition mii.c:44
int mii_check_link(struct mii_device *mii, struct net_device *netdev)
Update link status via MII.
Definition mii.c:127
static int mii_read(struct mii_device *mii, unsigned int reg)
Read from MII register.
Definition mii.h:90
static void mdio_init(struct mii_interface *mdio, struct mii_operations *op)
Initialise MII interface.
Definition mii.h:64
int mii_find(struct mii_device *mii)
Find PHY address.
Definition mii.c:158
static void mii_init(struct mii_device *mii, struct mii_interface *mdio, unsigned int address)
Initialise MII device.
Definition mii.h:76
static void mii_dump(struct mii_device *mii)
Dump MII registers (for debugging)
Definition mii.h:117
static unsigned int unsigned int reg
Definition myson.h:162
Network device management.
static uint16_t struct vmbus_xfer_pages_operations * op
Definition netvsc.h:327
static struct mii_phy mii
An MII device.
Definition mii.h:50
struct mii_interface * mdio
MII interface.
Definition mii.h:52
unsigned int address
PHY address.
Definition mii.h:54
An MII interface.
Definition mii.h:44
struct mii_operations * op
Interface operations.
Definition mii.h:46
MII interface operations.
Definition mii.h:19
int(* write)(struct mii_interface *mdio, unsigned int phy, unsigned int reg, unsigned int data)
Write to MII register.
Definition mii.h:39
int(* read)(struct mii_interface *mdio, unsigned int phy, unsigned int reg)
Read from MII register.
Definition mii.h:28
A network device.
Definition netdevice.h:353