191975b0fSHaavard Skinnemoen /* 291975b0fSHaavard Skinnemoen * linux/mii.h: definitions for MII-compatible transceivers 391975b0fSHaavard Skinnemoen * Originally drivers/net/sunhme.h. 491975b0fSHaavard Skinnemoen * 591975b0fSHaavard Skinnemoen * Copyright (C) 1996, 1999, 2001 David S. Miller (davem@redhat.com) 691975b0fSHaavard Skinnemoen */ 791975b0fSHaavard Skinnemoen 891975b0fSHaavard Skinnemoen #ifndef __LINUX_MII_H__ 991975b0fSHaavard Skinnemoen #define __LINUX_MII_H__ 1091975b0fSHaavard Skinnemoen 1191975b0fSHaavard Skinnemoen /* Generic MII registers. */ 1291975b0fSHaavard Skinnemoen 1391975b0fSHaavard Skinnemoen #define MII_BMCR 0x00 /* Basic mode control register */ 1491975b0fSHaavard Skinnemoen #define MII_BMSR 0x01 /* Basic mode status register */ 1591975b0fSHaavard Skinnemoen #define MII_PHYSID1 0x02 /* PHYS ID 1 */ 1691975b0fSHaavard Skinnemoen #define MII_PHYSID2 0x03 /* PHYS ID 2 */ 1791975b0fSHaavard Skinnemoen #define MII_ADVERTISE 0x04 /* Advertisement control reg */ 1891975b0fSHaavard Skinnemoen #define MII_LPA 0x05 /* Link partner ability reg */ 1991975b0fSHaavard Skinnemoen #define MII_EXPANSION 0x06 /* Expansion register */ 207ea23555SMacpaul Lin #define MII_CTRL1000 0x09 /* 1000BASE-T control */ 217ea23555SMacpaul Lin #define MII_STAT1000 0x0a /* 1000BASE-T status */ 227ea23555SMacpaul Lin #define MII_ESTATUS 0x0f /* Extended Status */ 2391975b0fSHaavard Skinnemoen #define MII_DCOUNTER 0x12 /* Disconnect counter */ 2491975b0fSHaavard Skinnemoen #define MII_FCSCOUNTER 0x13 /* False carrier counter */ 2591975b0fSHaavard Skinnemoen #define MII_NWAYTEST 0x14 /* N-way auto-neg test reg */ 2691975b0fSHaavard Skinnemoen #define MII_RERRCOUNTER 0x15 /* Receive error counter */ 2791975b0fSHaavard Skinnemoen #define MII_SREVISION 0x16 /* Silicon revision */ 2891975b0fSHaavard Skinnemoen #define MII_RESV1 0x17 /* Reserved... */ 2991975b0fSHaavard Skinnemoen #define MII_LBRERROR 0x18 /* Lpback, rx, bypass error */ 3091975b0fSHaavard Skinnemoen #define MII_PHYADDR 0x19 /* PHY address */ 3191975b0fSHaavard Skinnemoen #define MII_RESV2 0x1a /* Reserved... */ 3291975b0fSHaavard Skinnemoen #define MII_TPISTATUS 0x1b /* TPI status for 10mbps */ 3391975b0fSHaavard Skinnemoen #define MII_NCONFIG 0x1c /* Network interface config */ 3491975b0fSHaavard Skinnemoen 3591975b0fSHaavard Skinnemoen /* Basic mode control register. */ 3691975b0fSHaavard Skinnemoen #define BMCR_RESV 0x003f /* Unused... */ 3791975b0fSHaavard Skinnemoen #define BMCR_SPEED1000 0x0040 /* MSB of Speed (1000) */ 3891975b0fSHaavard Skinnemoen #define BMCR_CTST 0x0080 /* Collision test */ 3991975b0fSHaavard Skinnemoen #define BMCR_FULLDPLX 0x0100 /* Full duplex */ 4091975b0fSHaavard Skinnemoen #define BMCR_ANRESTART 0x0200 /* Auto negotiation restart */ 4191975b0fSHaavard Skinnemoen #define BMCR_ISOLATE 0x0400 /* Disconnect DP83840 from MII */ 4291975b0fSHaavard Skinnemoen #define BMCR_PDOWN 0x0800 /* Powerdown the DP83840 */ 4391975b0fSHaavard Skinnemoen #define BMCR_ANENABLE 0x1000 /* Enable auto negotiation */ 4491975b0fSHaavard Skinnemoen #define BMCR_SPEED100 0x2000 /* Select 100Mbps */ 4591975b0fSHaavard Skinnemoen #define BMCR_LOOPBACK 0x4000 /* TXD loopback bits */ 4691975b0fSHaavard Skinnemoen #define BMCR_RESET 0x8000 /* Reset the DP83840 */ 4791975b0fSHaavard Skinnemoen 4891975b0fSHaavard Skinnemoen /* Basic mode status register. */ 4991975b0fSHaavard Skinnemoen #define BMSR_ERCAP 0x0001 /* Ext-reg capability */ 5091975b0fSHaavard Skinnemoen #define BMSR_JCD 0x0002 /* Jabber detected */ 5191975b0fSHaavard Skinnemoen #define BMSR_LSTATUS 0x0004 /* Link status */ 5291975b0fSHaavard Skinnemoen #define BMSR_ANEGCAPABLE 0x0008 /* Able to do auto-negotiation */ 5391975b0fSHaavard Skinnemoen #define BMSR_RFAULT 0x0010 /* Remote fault detected */ 5491975b0fSHaavard Skinnemoen #define BMSR_ANEGCOMPLETE 0x0020 /* Auto-negotiation complete */ 557ea23555SMacpaul Lin #define BMSR_RESV 0x00c0 /* Unused... */ 567ea23555SMacpaul Lin #define BMSR_ESTATEN 0x0100 /* Extended Status in R15 */ 577ea23555SMacpaul Lin #define BMSR_100HALF2 0x0200 /* Can do 100BASE-T2 HDX */ 587ea23555SMacpaul Lin #define BMSR_100FULL2 0x0400 /* Can do 100BASE-T2 FDX */ 5991975b0fSHaavard Skinnemoen #define BMSR_10HALF 0x0800 /* Can do 10mbps, half-duplex */ 6091975b0fSHaavard Skinnemoen #define BMSR_10FULL 0x1000 /* Can do 10mbps, full-duplex */ 6191975b0fSHaavard Skinnemoen #define BMSR_100HALF 0x2000 /* Can do 100mbps, half-duplex */ 6291975b0fSHaavard Skinnemoen #define BMSR_100FULL 0x4000 /* Can do 100mbps, full-duplex */ 6391975b0fSHaavard Skinnemoen #define BMSR_100BASE4 0x8000 /* Can do 100mbps, 4k packets */ 6491975b0fSHaavard Skinnemoen 6591975b0fSHaavard Skinnemoen /* Advertisement control register. */ 6691975b0fSHaavard Skinnemoen #define ADVERTISE_SLCT 0x001f /* Selector bits */ 6791975b0fSHaavard Skinnemoen #define ADVERTISE_CSMA 0x0001 /* Only selector supported */ 6891975b0fSHaavard Skinnemoen #define ADVERTISE_10HALF 0x0020 /* Try for 10mbps half-duplex */ 697ea23555SMacpaul Lin #define ADVERTISE_1000XFULL 0x0020 /* Try for 1000BASE-X full-duplex */ 7091975b0fSHaavard Skinnemoen #define ADVERTISE_10FULL 0x0040 /* Try for 10mbps full-duplex */ 717ea23555SMacpaul Lin #define ADVERTISE_1000XHALF 0x0040 /* Try for 1000BASE-X half-duplex */ 7291975b0fSHaavard Skinnemoen #define ADVERTISE_100HALF 0x0080 /* Try for 100mbps half-duplex */ 737ea23555SMacpaul Lin #define ADVERTISE_1000XPAUSE 0x0080 /* Try for 1000BASE-X pause */ 7491975b0fSHaavard Skinnemoen #define ADVERTISE_100FULL 0x0100 /* Try for 100mbps full-duplex */ 757ea23555SMacpaul Lin #define ADVERTISE_1000XPSE_ASYM 0x0100 /* Try for 1000BASE-X asym pause */ 7691975b0fSHaavard Skinnemoen #define ADVERTISE_100BASE4 0x0200 /* Try for 100mbps 4k packets */ 777ea23555SMacpaul Lin #define ADVERTISE_PAUSE_CAP 0x0400 /* Try for pause */ 787ea23555SMacpaul Lin #define ADVERTISE_PAUSE_ASYM 0x0800 /* Try for asymetric pause */ 797ea23555SMacpaul Lin #define ADVERTISE_RESV 0x1000 /* Unused... */ 8091975b0fSHaavard Skinnemoen #define ADVERTISE_RFAULT 0x2000 /* Say we can detect faults */ 8191975b0fSHaavard Skinnemoen #define ADVERTISE_LPACK 0x4000 /* Ack link partners response */ 8291975b0fSHaavard Skinnemoen #define ADVERTISE_NPAGE 0x8000 /* Next page bit */ 8391975b0fSHaavard Skinnemoen 8491975b0fSHaavard Skinnemoen #define ADVERTISE_FULL (ADVERTISE_100FULL | ADVERTISE_10FULL | \ 8591975b0fSHaavard Skinnemoen ADVERTISE_CSMA) 8691975b0fSHaavard Skinnemoen #define ADVERTISE_ALL (ADVERTISE_10HALF | ADVERTISE_10FULL | \ 8791975b0fSHaavard Skinnemoen ADVERTISE_100HALF | ADVERTISE_100FULL) 8891975b0fSHaavard Skinnemoen 8991975b0fSHaavard Skinnemoen /* Link partner ability register. */ 9091975b0fSHaavard Skinnemoen #define LPA_SLCT 0x001f /* Same as advertise selector */ 9191975b0fSHaavard Skinnemoen #define LPA_10HALF 0x0020 /* Can do 10mbps half-duplex */ 927ea23555SMacpaul Lin #define LPA_1000XFULL 0x0020 /* Can do 1000BASE-X full-duplex */ 9391975b0fSHaavard Skinnemoen #define LPA_10FULL 0x0040 /* Can do 10mbps full-duplex */ 947ea23555SMacpaul Lin #define LPA_1000XHALF 0x0040 /* Can do 1000BASE-X half-duplex */ 9591975b0fSHaavard Skinnemoen #define LPA_100HALF 0x0080 /* Can do 100mbps half-duplex */ 967ea23555SMacpaul Lin #define LPA_1000XPAUSE 0x0080 /* Can do 1000BASE-X pause */ 9791975b0fSHaavard Skinnemoen #define LPA_100FULL 0x0100 /* Can do 100mbps full-duplex */ 987ea23555SMacpaul Lin #define LPA_1000XPAUSE_ASYM 0x0100 /* Can do 1000BASE-X pause asym*/ 9991975b0fSHaavard Skinnemoen #define LPA_100BASE4 0x0200 /* Can do 100mbps 4k packets */ 1007ea23555SMacpaul Lin #define LPA_PAUSE_CAP 0x0400 /* Can pause */ 1017ea23555SMacpaul Lin #define LPA_PAUSE_ASYM 0x0800 /* Can pause asymetrically */ 1027ea23555SMacpaul Lin #define LPA_RESV 0x1000 /* Unused... */ 10391975b0fSHaavard Skinnemoen #define LPA_RFAULT 0x2000 /* Link partner faulted */ 10491975b0fSHaavard Skinnemoen #define LPA_LPACK 0x4000 /* Link partner acked us */ 10591975b0fSHaavard Skinnemoen #define LPA_NPAGE 0x8000 /* Next page bit */ 10691975b0fSHaavard Skinnemoen 10791975b0fSHaavard Skinnemoen #define LPA_DUPLEX (LPA_10FULL | LPA_100FULL) 10891975b0fSHaavard Skinnemoen #define LPA_100 (LPA_100FULL | LPA_100HALF | LPA_100BASE4) 10991975b0fSHaavard Skinnemoen 11091975b0fSHaavard Skinnemoen /* Expansion register for auto-negotiation. */ 11191975b0fSHaavard Skinnemoen #define EXPANSION_NWAY 0x0001 /* Can do N-way auto-nego */ 11291975b0fSHaavard Skinnemoen #define EXPANSION_LCWP 0x0002 /* Got new RX page code word */ 11391975b0fSHaavard Skinnemoen #define EXPANSION_ENABLENPAGE 0x0004 /* This enables npage words */ 11491975b0fSHaavard Skinnemoen #define EXPANSION_NPCAPABLE 0x0008 /* Link partner supports npage */ 11591975b0fSHaavard Skinnemoen #define EXPANSION_MFAULTS 0x0010 /* Multiple faults detected */ 11691975b0fSHaavard Skinnemoen #define EXPANSION_RESV 0xffe0 /* Unused... */ 11791975b0fSHaavard Skinnemoen 118*de1d786eSCharles Coldwell #define ESTATUS_1000_XFULL 0x8000 /* Can do 1000BX Full */ 119*de1d786eSCharles Coldwell #define ESTATUS_1000_XHALF 0x4000 /* Can do 1000BX Half */ 1207ea23555SMacpaul Lin #define ESTATUS_1000_TFULL 0x2000 /* Can do 1000BT Full */ 1217ea23555SMacpaul Lin #define ESTATUS_1000_THALF 0x1000 /* Can do 1000BT Half */ 1227ea23555SMacpaul Lin 12391975b0fSHaavard Skinnemoen /* N-way test register. */ 12491975b0fSHaavard Skinnemoen #define NWAYTEST_RESV1 0x00ff /* Unused... */ 12591975b0fSHaavard Skinnemoen #define NWAYTEST_LOOPBACK 0x0100 /* Enable loopback for N-way */ 12691975b0fSHaavard Skinnemoen #define NWAYTEST_RESV2 0xfe00 /* Unused... */ 12791975b0fSHaavard Skinnemoen 1287ea23555SMacpaul Lin /* 1000BASE-T Control register */ 1297ea23555SMacpaul Lin #define ADVERTISE_1000FULL 0x0200 /* Advertise 1000BASE-T full duplex */ 1307ea23555SMacpaul Lin #define ADVERTISE_1000HALF 0x0100 /* Advertise 1000BASE-T half duplex */ 1317ea23555SMacpaul Lin 1327ea23555SMacpaul Lin /* 1000BASE-T Status register */ 1337ea23555SMacpaul Lin #define LPA_1000LOCALRXOK 0x2000 /* Link partner local receiver status */ 1347ea23555SMacpaul Lin #define LPA_1000REMRXOK 0x1000 /* Link partner remote receiver status */ 1357ea23555SMacpaul Lin #define LPA_1000FULL 0x0800 /* Link partner 1000BASE-T full duplex */ 1367ea23555SMacpaul Lin #define LPA_1000HALF 0x0400 /* Link partner 1000BASE-T half duplex */ 1377ea23555SMacpaul Lin 1387ea23555SMacpaul Lin /* Flow control flags */ 1397ea23555SMacpaul Lin #define FLOW_CTRL_TX 0x01 1407ea23555SMacpaul Lin #define FLOW_CTRL_RX 0x02 14191975b0fSHaavard Skinnemoen 14291975b0fSHaavard Skinnemoen /** 14391975b0fSHaavard Skinnemoen * mii_nway_result 14491975b0fSHaavard Skinnemoen * @negotiated: value of MII ANAR and'd with ANLPAR 14591975b0fSHaavard Skinnemoen * 14691975b0fSHaavard Skinnemoen * Given a set of MII abilities, check each bit and returns the 14791975b0fSHaavard Skinnemoen * currently supported media, in the priority order defined by 14891975b0fSHaavard Skinnemoen * IEEE 802.3u. We use LPA_xxx constants but note this is not the 14991975b0fSHaavard Skinnemoen * value of LPA solely, as described above. 15091975b0fSHaavard Skinnemoen * 15191975b0fSHaavard Skinnemoen * The one exception to IEEE 802.3u is that 100baseT4 is placed 15291975b0fSHaavard Skinnemoen * between 100T-full and 100T-half. If your phy does not support 15391975b0fSHaavard Skinnemoen * 100T4 this is fine. If your phy places 100T4 elsewhere in the 15491975b0fSHaavard Skinnemoen * priority order, you will need to roll your own function. 15591975b0fSHaavard Skinnemoen */ 15691975b0fSHaavard Skinnemoen static inline unsigned int mii_nway_result (unsigned int negotiated) 15791975b0fSHaavard Skinnemoen { 15891975b0fSHaavard Skinnemoen unsigned int ret; 15991975b0fSHaavard Skinnemoen 16091975b0fSHaavard Skinnemoen if (negotiated & LPA_100FULL) 16191975b0fSHaavard Skinnemoen ret = LPA_100FULL; 16291975b0fSHaavard Skinnemoen else if (negotiated & LPA_100BASE4) 16391975b0fSHaavard Skinnemoen ret = LPA_100BASE4; 16491975b0fSHaavard Skinnemoen else if (negotiated & LPA_100HALF) 16591975b0fSHaavard Skinnemoen ret = LPA_100HALF; 16691975b0fSHaavard Skinnemoen else if (negotiated & LPA_10FULL) 16791975b0fSHaavard Skinnemoen ret = LPA_10FULL; 16891975b0fSHaavard Skinnemoen else 16991975b0fSHaavard Skinnemoen ret = LPA_10HALF; 17091975b0fSHaavard Skinnemoen 17191975b0fSHaavard Skinnemoen return ret; 17291975b0fSHaavard Skinnemoen } 17391975b0fSHaavard Skinnemoen 17491975b0fSHaavard Skinnemoen /** 17591975b0fSHaavard Skinnemoen * mii_duplex 17691975b0fSHaavard Skinnemoen * @duplex_lock: Non-zero if duplex is locked at full 17791975b0fSHaavard Skinnemoen * @negotiated: value of MII ANAR and'd with ANLPAR 17891975b0fSHaavard Skinnemoen * 17991975b0fSHaavard Skinnemoen * A small helper function for a common case. Returns one 18091975b0fSHaavard Skinnemoen * if the media is operating or locked at full duplex, and 18191975b0fSHaavard Skinnemoen * returns zero otherwise. 18291975b0fSHaavard Skinnemoen */ 18391975b0fSHaavard Skinnemoen static inline unsigned int mii_duplex (unsigned int duplex_lock, 18491975b0fSHaavard Skinnemoen unsigned int negotiated) 18591975b0fSHaavard Skinnemoen { 18691975b0fSHaavard Skinnemoen if (duplex_lock) 18791975b0fSHaavard Skinnemoen return 1; 18891975b0fSHaavard Skinnemoen if (mii_nway_result(negotiated) & LPA_DUPLEX) 18991975b0fSHaavard Skinnemoen return 1; 19091975b0fSHaavard Skinnemoen return 0; 19191975b0fSHaavard Skinnemoen } 19291975b0fSHaavard Skinnemoen 19391975b0fSHaavard Skinnemoen #endif /* __LINUX_MII_H__ */ 194