diff options
author | Sylvie Barlow | 2018-04-20 14:37:20 +0200 |
---|---|---|
committer | Michael Brown | 2018-04-20 16:21:32 +0200 |
commit | 7ed1dc98c325f5d5934fb9806307e0638735304a (patch) | |
tree | bbb6928a54860c98a28c982e1cc71045794af938 | |
parent | [mii] Fix typo in parameter name (diff) | |
download | ipxe-7ed1dc98c325f5d5934fb9806307e0638735304a.tar.gz ipxe-7ed1dc98c325f5d5934fb9806307e0638735304a.tar.xz ipxe-7ed1dc98c325f5d5934fb9806307e0638735304a.zip |
[mii] Add mii_find()
Add the function mii_find() in order to locate the PHY address.
Signed-off-by: Sylvie Barlow <sylvie.c.barlow@gmail.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r-- | src/drivers/net/mii.c | 25 | ||||
-rw-r--r-- | src/include/ipxe/mii.h | 4 |
2 files changed, 29 insertions, 0 deletions
diff --git a/src/drivers/net/mii.c b/src/drivers/net/mii.c index f6db3074..87605f0c 100644 --- a/src/drivers/net/mii.c +++ b/src/drivers/net/mii.c @@ -147,3 +147,28 @@ int mii_check_link ( struct mii_device *mii, struct net_device *netdev ) { return 0; } + +/** + * Find PHY address + * + * @v mii MII device + * @ret rc Return status code + */ +int mii_find ( struct mii_device *mii ) { + unsigned int address; + int id; + + /* Try all possible PHY addresses */ + for ( address = 0 ; address <= MII_MAX_PHY_ADDRESS ; address++ ) { + mii->address = address; + id = mii_read ( mii, MII_PHYSID1 ); + if ( ( id > 0x0000 ) && ( id < 0xffff ) ) { + DBGC ( mii, "MII %p found PHY at address %d\n", + mii, address ); + return 0; + } + } + + DBGC ( mii, "MII %p failed to find an address\n", mii ); + return -ENOENT; +} diff --git a/src/include/ipxe/mii.h b/src/include/ipxe/mii.h index aaeae3db..89fc92a4 100644 --- a/src/include/ipxe/mii.h +++ b/src/include/ipxe/mii.h @@ -141,9 +141,13 @@ mii_dump ( struct mii_device *mii ) { /** Maximum time to wait for a reset, in milliseconds */ #define MII_RESET_MAX_WAIT_MS 500 +/** Maximum PHY address */ +#define MII_MAX_PHY_ADDRESS 31 + extern int mii_restart ( struct mii_device *mii ); extern int mii_reset ( struct mii_device *mii ); extern int mii_check_link ( struct mii_device *mii, struct net_device *netdev ); +extern int mii_find ( struct mii_device *mii ); #endif /* _IPXE_MII_H */ |