From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Dale Farnsworth" Subject: [PATCH] [NET] mii: Add test for GigE support Date: Mon, 22 Aug 2005 16:50:19 -0700 Message-ID: <20050822235019.GA29630@xyzzy.farnsworth.org> References: <20050322231746.GA27770@xyzzy> <4240A9F3.5040704@pobox.com> <212e5bf54766a68d2ab8716574225203@freescale.com> <4240CABB.5090701@pobox.com> <20050323061446.GA6943@xyzzy> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: To: Jeff Garzik , Netdev Content-Disposition: inline In-Reply-To: <20050323061446.GA6943@xyzzy> Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com List-Id: netdev.vger.kernel.org [This patch was submitted on 22Mar2005 and jgarzik said, "applied, thanks", but it may have been lost in the git transition. I've updated it to current offsets.] Signed-off-by: Dale Farnsworth Index: netdev-2.6-mv643xx-enet/drivers/net/mii.c =================================================================== --- netdev-2.6-mv643xx-enet.orig/drivers/net/mii.c +++ netdev-2.6-mv643xx-enet/drivers/net/mii.c @@ -207,6 +207,21 @@ return 0; } +int mii_check_gmii_support(struct mii_if_info *mii) +{ + int reg; + + reg = mii->mdio_read(mii->dev, mii->phy_id, MII_BMSR); + if (reg & BMSR_HAS_EXTSTAT1000) { + reg = mii->mdio_read(mii->dev, mii->phy_id, MII_EXTSTAT1000); + if (reg & (ESR_1000_BASE_X_FD | ESR_1000_BASE_T_FD | + ESR_1000_BASE_X_HD | ESR_1000_BASE_T_HD)) + return 1; + } + + return 0; +} + int mii_link_ok (struct mii_if_info *mii) { /* first, a dummy read, needed to latch some MII phys */ @@ -394,5 +409,6 @@ EXPORT_SYMBOL(mii_ethtool_sset); EXPORT_SYMBOL(mii_check_link); EXPORT_SYMBOL(mii_check_media); +EXPORT_SYMBOL(mii_check_gmii_support); EXPORT_SYMBOL(generic_mii_ioctl); Index: netdev-2.6-mv643xx-enet/include/linux/mii.h =================================================================== --- netdev-2.6-mv643xx-enet.orig/include/linux/mii.h +++ netdev-2.6-mv643xx-enet/include/linux/mii.h @@ -22,6 +22,7 @@ #define MII_EXPANSION 0x06 /* Expansion register */ #define MII_CTRL1000 0x09 /* 1000BASE-T control */ #define MII_STAT1000 0x0a /* 1000BASE-T status */ +#define MII_EXTSTAT1000 0x0f /* 1000BASE-XX extended status */ #define MII_DCOUNTER 0x12 /* Disconnect counter */ #define MII_FCSCOUNTER 0x13 /* False carrier counter */ #define MII_NWAYTEST 0x14 /* N-way auto-neg test reg */ @@ -54,7 +55,8 @@ #define BMSR_ANEGCAPABLE 0x0008 /* Able to do auto-negotiation */ #define BMSR_RFAULT 0x0010 /* Remote fault detected */ #define BMSR_ANEGCOMPLETE 0x0020 /* Auto-negotiation complete */ -#define BMSR_RESV 0x07c0 /* Unused... */ +#define BMSR_HAS_EXTSTAT1000 0x0100 /* Has 1000BASE extended status*/ +#define BMSR_RESV 0x06c0 /* Unused... */ #define BMSR_10HALF 0x0800 /* Can do 10mbps, half-duplex */ #define BMSR_10FULL 0x1000 /* Can do 10mbps, full-duplex */ #define BMSR_100HALF 0x2000 /* Can do 100mbps, half-duplex */ @@ -129,6 +131,12 @@ #define LPA_1000FULL 0x0800 /* Link partner 1000BASE-T full duplex */ #define LPA_1000HALF 0x0400 /* Link partner 1000BASE-T half duplex */ +/* 1000BASE Ext Status register */ +#define ESR_1000_BASE_X_FD 0x8000 +#define ESR_1000_BASE_X_HD 0x4000 +#define ESR_1000_BASE_T_FD 0x2000 +#define ESR_1000_BASE_T_HD 0x1000 + struct mii_if_info { int phy_id; int advertising; @@ -151,6 +159,7 @@ extern int mii_nway_restart (struct mii_if_info *mii); extern int mii_ethtool_gset(struct mii_if_info *mii, struct ethtool_cmd *ecmd); extern int mii_ethtool_sset(struct mii_if_info *mii, struct ethtool_cmd *ecmd); +extern int mii_check_gmii_support(struct mii_if_info *mii); extern void mii_check_link (struct mii_if_info *mii); extern unsigned int mii_check_media (struct mii_if_info *mii, unsigned int ok_to_print,