Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

typedef struct Mii Mii;
typedef struct MiiPhy MiiPhy;

enum {                                  /* registers */
        Bmcr            = 0,            /* Basic Mode Control */
        Bmsr            = 1,            /* Basic Mode Status */
        Phyidr1         = 2,            /* PHY Identifier #1 */
        Phyidr2         = 3,            /* PHY Identifier #2 */
        Anar            = 4,            /* Auto-Negotiation Advertisement */
        Anlpar          = 5,            /* AN Link Partner Ability */
        Aner            = 6,            /* AN Expansion */
        Annptr          = 7,            /* AN Next Page TX */
        Annprr          = 8,            /* AN Next Page RX */
        Mscr            = 9,            /* Gb Control */
        Mssr            = 10,           /* Gb Status */
        Esr             = 15,           /* Extended Status */

        /* 88e1116-specific paged registers */
        Scr             = 16,           /* special control register */
        Ssr             = 17,           /* special status register */
        Ier             = 18,           /* interrupt enable reg */
        Isr             = 19,           /* interrupt status reg */
        Escr            = 20,           /* extended special control reg */
        Recr            = 21,           /* RX error counter reg */
        Eadr            = 22,           /* extended address reg (page select) */
        Globsts         = 23,           /* global status */
        Impover         = 24,   /* RGMII output impedance override (page 2) */
        Imptarg         = 25,   /* RGMII output impedance target (page 2) */
        Scr2            = 26,           /* special control register 2 */

        NMiiPhyr        = 32,
        NMiiPhy         = 32,
};

enum {                                  /* Bmcr */
        BmcrSs1         = 0x0040,       /* Speed Select[1] */
        BmcrCte         = 0x0080,       /* Collision Test Enable */
        BmcrDm          = 0x0100,       /* Duplex Mode */
        BmcrRan         = 0x0200,       /* Restart Auto-Negotiation */
        BmcrI           = 0x0400,       /* Isolate */
        BmcrPd          = 0x0800,       /* Power Down */
        BmcrAne         = 0x1000,       /* Auto-Negotiation Enable */
        BmcrSs0         = 0x2000,       /* Speed Select[0] */
        BmcrLe          = 0x4000,       /* Loopback Enable */
        BmcrR           = 0x8000,       /* Reset */
};

enum {                                  /* Bmsr */
        BmsrEc          = 0x0001,       /* Extended Capability */
        BmsrJd          = 0x0002,       /* Jabber Detect */
        BmsrLs          = 0x0004,       /* Link Status */
        BmsrAna         = 0x0008,       /* Auto-Negotiation Ability */
        BmsrRf          = 0x0010,       /* Remote Fault */
        BmsrAnc         = 0x0020,       /* Auto-Negotiation Complete */
        BmsrPs          = 0x0040,       /* Preamble Suppression Capable */
        BmsrEs          = 0x0100,       /* Extended Status */
        Bmsr100T2HD     = 0x0200,       /* 100BASE-T2 HD Capable */
        Bmsr100T2FD     = 0x0400,       /* 100BASE-T2 FD Capable */
        Bmsr10THD       = 0x0800,       /* 10BASE-T HD Capable */
        Bmsr10TFD       = 0x1000,       /* 10BASE-T FD Capable */
        Bmsr100TXHD     = 0x2000,       /* 100BASE-TX HD Capable */
        Bmsr100TXFD     = 0x4000,       /* 100BASE-TX FD Capable */
        Bmsr100T4       = 0x8000,       /* 100BASE-T4 Capable */
};

enum {                                  /* Anar/Anlpar */
        Ana10HD         = 0x0020,       /* Advertise 10BASE-T */
        Ana10FD         = 0x0040,       /* Advertise 10BASE-T FD */
        AnaTXHD         = 0x0080,       /* Advertise 100BASE-TX */
        AnaTXFD         = 0x0100,       /* Advertise 100BASE-TX FD */
        AnaT4           = 0x0200,       /* Advertise 100BASE-T4 */
        AnaP            = 0x0400,       /* Pause */
        AnaAP           = 0x0800,       /* Asymmetrical Pause */
        AnaRf           = 0x2000,       /* Remote Fault */
        AnaAck          = 0x4000,       /* Acknowledge */
        AnaNp           = 0x8000,       /* Next Page Indication */
};

enum {                                  /* Mscr */
        Mscr1000THD     = 0x0100,       /* Advertise 1000BASE-T HD */
        Mscr1000TFD     = 0x0200,       /* Advertise 1000BASE-T FD */
};

enum {                                  /* Mssr */
        Mssr1000THD     = 0x0400,       /* Link Partner 1000BASE-T HD able */
        Mssr1000TFD     = 0x0800,       /* Link Partner 1000BASE-T FD able */
};

enum {                                  /* Esr */
        Esr1000THD      = 0x1000,       /* 1000BASE-T HD Capable */
        Esr1000TFD      = 0x2000,       /* 1000BASE-T FD Capable */
        Esr1000XHD      = 0x4000,       /* 1000BASE-X HD Capable */
        Esr1000XFD      = 0x8000,       /* 1000BASE-X FD Capable */
};

enum {                                  /* Scr page 0 */
        Pwrdown         = 0x0004,       /* power down */
        Mdix            = 0x0060,       /* MDI crossover mode */
        Endetect        = 0x0300,       /* energy detect */
};
enum {                                  /* Scr page 2 */
        Rgmiipwrup      = 0x0008,       /* RGMII power up: must sw reset after */
};

enum {                                  /* Recr page 2 */
        Txtiming        = 1<<4,
        Rxtiming        = 1<<5,
};

typedef struct Mii {
        Lock;
        int     nphy;
        int     mask;
        MiiPhy* phy[NMiiPhy];
        MiiPhy* curphy;

        void*   ctlr;
        int     (*mir)(Mii*, int, int);
        int     (*miw)(Mii*, int, int, int);
} Mii;

typedef struct MiiPhy {
        Mii*    mii;
        int     oui;
        int     phyno;

        int     anar;
        int     fc;
        int     mscr;

        int     link;
        int     speed;
        int     fd;
        int     rfc;
        int     tfc;
};

extern int mii(Mii*, int);
extern int miiane(Mii*, int, int, int);
extern int miimir(Mii*, int);
extern int miimiw(Mii*, int, int);
extern int miireset(Mii*);
extern int miistatus(Mii*);