mirror of
https://github.com/ipxe/ipxe
synced 2025-12-26 01:22:37 +03:00
[mii] Add generic MII reset function
iPXE provides no support for manually configuring the link speed. Provide a generic routine which should be able to reset any MII/GMII PHY and enable autonegotiation. Prototyped-by: Thomas Miletich <thomas.miletich@gmail.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -141,6 +141,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
||||
#define ERRFILE_ath9k ( ERRFILE_DRIVER | 0x005f0000 )
|
||||
#define ERRFILE_ath ( ERRFILE_DRIVER | 0x00600000 )
|
||||
#define ERRFILE_vmxnet3 ( ERRFILE_DRIVER | 0x00610000 )
|
||||
#define ERRFILE_mii ( ERRFILE_DRIVER | 0x00620000 )
|
||||
|
||||
#define ERRFILE_scsi ( ERRFILE_DRIVER | 0x00700000 )
|
||||
#define ERRFILE_arbel ( ERRFILE_DRIVER | 0x00710000 )
|
||||
|
||||
86
src/include/ipxe/mii.h
Normal file
86
src/include/ipxe/mii.h
Normal file
@@ -0,0 +1,86 @@
|
||||
#ifndef _IPXE_MII_H
|
||||
#define _IPXE_MII_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* Media Independent Interface
|
||||
*
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER );
|
||||
|
||||
#include <mii.h>
|
||||
#include <ipxe/netdevice.h>
|
||||
|
||||
struct mii_interface;
|
||||
|
||||
/** MII interface operations */
|
||||
struct mii_operations {
|
||||
/**
|
||||
* Read from MII register
|
||||
*
|
||||
* @v mii MII interface
|
||||
* @v reg Register address
|
||||
* @ret data Data read, or negative error
|
||||
*/
|
||||
int ( * read ) ( struct mii_interface *mii, unsigned int reg );
|
||||
/**
|
||||
* Write to MII register
|
||||
*
|
||||
* @v mii MII interface
|
||||
* @v reg Register address
|
||||
* @v data Data to write
|
||||
* @ret rc Return status code
|
||||
*/
|
||||
int ( * write ) ( struct mii_interface *mii, unsigned int reg,
|
||||
unsigned int data );
|
||||
};
|
||||
|
||||
/** An MII interface */
|
||||
struct mii_interface {
|
||||
/** Interface operations */
|
||||
struct mii_operations *op;
|
||||
};
|
||||
|
||||
/**
|
||||
* Initialise MII interface
|
||||
*
|
||||
* @v mii MII interface
|
||||
* @v op MII interface operations
|
||||
*/
|
||||
static inline __attribute__ (( always_inline )) void
|
||||
mii_init ( struct mii_interface *mii, struct mii_operations *op ) {
|
||||
mii->op = op;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read from MII register
|
||||
*
|
||||
* @v mii MII interface
|
||||
* @v reg Register address
|
||||
* @ret data Data read, or negative error
|
||||
*/
|
||||
static inline __attribute__ (( always_inline )) int
|
||||
mii_read ( struct mii_interface *mii, unsigned int reg ) {
|
||||
return mii->op->read ( mii, reg );
|
||||
}
|
||||
|
||||
/**
|
||||
* Write to MII register
|
||||
*
|
||||
* @v mii MII interface
|
||||
* @v reg Register address
|
||||
* @v data Data to write
|
||||
* @ret rc Return status code
|
||||
*/
|
||||
static inline __attribute__ (( always_inline )) int
|
||||
mii_write ( struct mii_interface *mii, unsigned int reg, unsigned int data ) {
|
||||
return mii->op->write ( mii, reg, data );
|
||||
}
|
||||
|
||||
/** Maximum time to wait for a reset, in milliseconds */
|
||||
#define MII_RESET_MAX_WAIT_MS 500
|
||||
|
||||
extern int mii_reset ( struct mii_interface *mii );
|
||||
|
||||
#endif /* _IPXE_MII_H */
|
||||
Reference in New Issue
Block a user