Mercurial > ecos
diff packages/devs/eth/phy/current/src/VSC8641.c @ 2960:31c9ab39babe
* doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
* cdl/phy_eth_drivers.cdl: Add new PHY support
* src/IP101A.c, src/IP101A.h: Contributed by Edgar Grimberg
* src/VSC8244.c, src/VSC8244.h: Contributed by Christophe Coutand
* src/VSC8641.c, src/VSC8641.h: Contributed by Sachin Sushil Chaddha
| author | jld |
|---|---|
| date | Tue, 15 Jun 2010 08:25:04 +0000 |
| parents | |
| children |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/devs/eth/phy/current/src/VSC8641.c @@ -0,0 +1,123 @@ +//========================================================================== +// +// phy/VSC8641.c +// +// Ethernet PHY driver +// +//========================================================================== +// ####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, +// 2008, 2009 Free Software Foundation, Inc. +// +// eCos is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 or (at your option) any later +// version. +// +// eCos is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License +// along with eCos; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +// As a special exception, if other files instantiate templates or use +// macros or inline functions from this file, or you compile this file +// and link it with other works to produce a work based on this file, +// this file does not by itself cause the resulting work to be covered by +// the GNU General Public License. However the source code for this file +// must still be made available in accordance with section (3) of the GNU +// General Public License v2. +// +// This exception does not invalidate any other reasons why a work based +// on this file might be covered by the GNU General Public License. +// ------------------------------------------- +// ####ECOSGPLCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): Sachin Sushil Chaddha +// Contributors: +// Date: 2009-11-01 +// Purpose: +// Description: Hardware driver for Ethernet PHY Vitesse VSC8641 +// +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include <pkgconf/system.h> +#include <pkgconf/devs_eth_phy.h> + +#include <cyg/infra/cyg_type.h> + +#include <cyg/hal/hal_arch.h> +#include <cyg/hal/drv_api.h> +#include <cyg/hal/hal_if.h> +#include <cyg/hal/hal_tables.h> + +#include <cyg/io/eth_phy.h> +#include <cyg/io/eth_phy_dev.h> + +#include "VSC8641.h" + +static bool VSC8641_stat(eth_phy_access_t *f, int *state) +{ + unsigned short phy_state; + int tries; + int auto_completed = 1; + int link_up = 0; + + // Read negotiated state from the Quick Poll Detailed Status Register + if (_eth_phy_read(f, VSC8641_MII_STAT_REG, f->phy_addr, &phy_state)) + { + + if ((phy_state & VSC8641_AUTO_COMPLETED) == 0) + { + auto_completed = 0; + eth_phy_printf("... waiting for auto-negotiation"); + for (tries = 0; tries < CYGINT_DEVS_ETH_PHY_AUTO_NEGOTIATION_TIME; tries++) + { + if (_eth_phy_read(f, VSC8641_MII_STAT_REG, f->phy_addr, &phy_state)) + { + if ((phy_state & VSC8641_AUTO_COMPLETED) != 0) + { + auto_completed = 1; + break; + } + } + CYGACC_CALL_IF_DELAY_US(1000000); // 1 second + eth_phy_printf("."); + } + eth_phy_printf("\n"); + } + + if(phy_state & VSC8641_MII_PHY_STAT_LINK_UP) + link_up = 1; + + if(auto_completed) + { + _eth_phy_read(f, VSC8641_MII_PHY_STAT_REG, f->phy_addr, &phy_state); + + if(link_up) + *state |= ETH_PHY_STAT_LINK; + if(phy_state & VSC8641_MII_PHY_STAT_1000MB ) + *state |= ETH_PHY_STAT_1000MB; + if(phy_state & VSC8641_MII_PHY_STAT_100MB) + *state |= ETH_PHY_STAT_100MB; + if(phy_state & VSC8641_MII_PHY_STAT_DUPLEX_FULL) + *state |= ETH_PHY_STAT_FDX; + return true; + } + + } + return false; +} + + +_eth_phy_dev("Vitesse VSC8641", 0x00070431, VSC8641_stat)
