summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSylvie Barlow2018-04-20 14:37:20 +0200
committerMichael Brown2018-04-20 16:21:32 +0200
commit7ed1dc98c325f5d5934fb9806307e0638735304a (patch)
treebbb6928a54860c98a28c982e1cc71045794af938
parent[mii] Fix typo in parameter name (diff)
downloadipxe-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.c25
-rw-r--r--src/include/ipxe/mii.h4
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 */