#ifndef _DNET_MII_H
#define _DNET_MII_H
enum mii_phy_state {phy_state_unknown, phy_state_linkup, phy_state_linkdown};
enum mii_wait_type {mii_wait_none, mii_wait_user, mii_wait_interrupt};
typedef ushort_t (*mii_readfunc_t)(dev_info_t *, int phy, int reg);
typedef void (*mii_writefunc_t)(dev_info_t *, int phy, int reg, int value);
typedef void (*mii_linkfunc_t)(dev_info_t *, int phy, enum mii_phy_state state);
struct mii_info;
typedef struct mii_info *mii_handle_t;
int mii_create(dev_info_t *, mii_writefunc_t, mii_readfunc_t, mii_handle_t *);
int mii_init_phy(mii_handle_t, int phy);
int mii_getspeed(mii_handle_t, int phy, int *speed, int *full_duplex);
int mii_probe_phy(mii_handle_t, int phy);
int mii_rsan(mii_handle_t mac, int phy, enum mii_wait_type wait_type);
int mii_fixspeed(mii_handle_t, int phy, int speed, int fullduplex);
int mii_autoneg_enab(mii_handle_t mac, int phy);
int mii_reset_phy(mii_handle_t, int phy, enum mii_wait_type wait_type);
int mii_disable_fullduplex(mii_handle_t, int phy);
int mii_linkup(mii_handle_t, int phy);
int mii_sync(mii_handle_t, int phy);
int mii_isolate(mii_handle_t, int phy);
int mii_unisolate(mii_handle_t, int phy);
int mii_dump_phy(mii_handle_t, int phy);
int mii_start_portmon(mii_handle_t mac, mii_linkfunc_t func, kmutex_t *lock);
int mii_stop_portmon(mii_handle_t mac);
void mii_destroy(mii_handle_t mac);
#define MII_SUCCESS 0
#define MII_PHYPRESENT 1
#define MII_NOMEM 2
#define MII_PARAM 3
#define MII_NOTSUPPORTED 4
#define MII_STATE 5
#define MII_HARDFAIL 6
#define MII_TIMEOUT 7
#define MII_PHYNOTPRESENT 8
typedef void (*phy_genfunc)(mii_handle_t, int phy);
typedef int (*phy_getspeedfunc)(mii_handle_t, int phy, int *speed, int *fd);
struct phydata
{
ulong_t id;
char *description;
phy_genfunc phy_dump;
phy_genfunc phy_postreset;
phy_getspeedfunc phy_getspeed;
unsigned short control;
enum mii_phy_state state;
int fix_speed;
int fix_duplex;
};
typedef struct mii_info
{
mii_readfunc_t mii_read;
mii_writefunc_t mii_write;
mii_linkfunc_t mii_linknotify;
dev_info_t *mii_dip;
timeout_id_t portmon_timer;
kmutex_t *lock;
struct phydata *phys[32];
} mii_info_t;
#define OUI_NATIONAL_SEMICONDUCTOR 0x80017
#define NS_DP83840 0x00
#define MII_83840_ADDR 25
#define NS83840_ADDR_SPEED10 (1<<6)
#define NS83840_ADDR_CONSTAT (1<<5)
#define NS83840_ADDR_ADDR (0x1f<<0)
#define OUI_INTEL 0x0aa00
#define INTEL_82553_CSTEP 0x35
#define MII_82553_EX0 16
#define I82553_EX0_FDUPLEX (1<<0)
#define I82553_EX0_100MB (1<<1)
#define I82553_EX0_WAKE (1<<2)
#define I82553_EX0_SQUELCH (3<<3)
#define I82553_EX0_REVCNTR (7<<5)
#define I82553_EX0_FRCFAIL (1<<8)
#define I82553_EX0_TEST (0x1f<<9)
#define I82553_EX0_LINKDIS (1<<14)
#define I82553_EX0_JABDIS (1<<15)
#define MII_82553_EX1
#define I82553_EX1_RESERVE (0x1ff<<0)
#define I82553_EX1_CH2EOF (1<<9)
#define I82553_EX1_MNCHSTR (1<<10)
#define I82553_EX1_EOP (1<<11)
#define I82553_EX1_BADCODE (1<<12)
#define I82553_EX1_INVALCODE (1<<13)
#define I82553_EX1_DCBALANCE (1<<14)
#define I82553_EX1_PAIRSKEW (1<<15)
#define INTEL_82555 0x15
#define INTEL_82562_EH 0x33
#define INTEL_82562_ET 0x32
#define INTEL_82562_EM 0x31
#define OUI_ICS 0x57d
#define ICS_1890 2
#define ICS_1889 1
#define ICS_EXCTRL 16
#define ICS_EXCTRL_CMDOVRD (1<<15)
#define ICS_EXCTRL_PHYADDR (0x1f<<6)
#define ICS_EXCTRL_SCSTEST (1<<5)
#define ICS_EXCTRL_INVECTEST (1<<2)
#define ICS_EXCTRL_SCDISABLE (1<<0)
#define ICS_QUICKPOLL 17
#define ICS_QUICKPOLL_100MB (1<<15)
#define ICS_QUICKPOLL_FDUPLEX (1<<14)
#define ICS_QUICKPOLL_ANPROG (7<<11)
#define ICS_QUICKPOLL_RSE (1<<10)
#define ICS_QUICKPOLL_PLLLOCK (1<<9)
#define ICS_QUICKPOLL_FALSECD (1<<8)
#define ICS_QUICKPOLL_SYMINVAL (1<<7)
#define ICS_QUICKPOLL_SYMHALT (1<<6)
#define ICS_QUICKPOLL_PREMEND (1<<5)
#define ICS_QUICKPOLL_ANDONE (1<<4)
#define ICS_QUICKPOLL_RESERVED (1<<3)
#define ICS_QUICKPOLL_JABBER (1<<2)
#define ICS_QUICKPOLL_REMFAULT (1<<1)
#define ICS_QUICKPOLL_LINKSTAT (1<<0)
#define ICS_10BASET 18
#define ICS_10BASET_REMJABBER (1<<15)
#define ICS_10BASET_REVPOLARITY (1<<14)
#define ICS_10BASET_RESERVED (0xff<<6)
#define ICS_10BASET_NOJABBER (1<<5)
#define ICS_10BASET_NORMLOOP (1<<4)
#define ICS_10BASET_NOAUTOPOLL (1<<3)
#define ICS_10BASET_NOSQE (1<<2)
#define ICS_10BASET_NOLINKLOSS (1<<1)
#define ICS_10BASET_NOSQUELCH (1<<0)
#define ICS_EXCTRL2 19
#define ICS_EXCTRL2_ISREPEATER (1<<15)
#define ICS_EXCTRL2_SOFTPRI (1<<14)
#define ICS_EXCTRL2_LPCANREMF (1<<13)
#define ICS_EXCTRL2_RMFSXMITED (1<<10)
#define ICS_EXCTRL2_ANPWRREMF (1<<4)
#define ICS_EXCTRL2_10BASETQUAL (1<<2)
#define ICS_EXCTRL2_AUTOPWRDN (1<<0)
#endif