//========================================================================== // // dev/LAN8270A.c // // Ethernet transciever (PHY) support // //========================================================================== //####ECOSGPLCOPYRIGHTBEGIN#### // ------------------------------------------- // This file is part of eCos, the Embedded Configurable Operating System. // Copyright (C) 2003 Gary Thomas // // 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., // 59 Temple Place, Suite 330, Boston, MA 02111-1307 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. // // This exception does not invalidate any other reasons why a work based on // this file might be covered by the GNU General Public License. // // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. // at http://sources.redhat.com/ecos/ecos-license/ // ------------------------------------------- //####ECOSGPLCOPYRIGHTEND#### //========================================================================== //#####DESCRIPTIONBEGIN#### // // Author(s): jerzdy // Contributors: // Date: 2013-11-18 // Purpose: // Description: Support for ethernet SMSC LAN8720A // // //####DESCRIPTIONEND#### // //========================================================================== #include #include #include #include #include #include #include #include #include static bool lan8720a_stat(eth_phy_access_t *f, int *state) { unsigned short phy_state=0; int tries=0; // Read negotiated state if (_eth_phy_read(f, 0x1, f->phy_addr, &phy_state)) { if ((phy_state & PHY_BMSR_AUTO_NEG) == 0) { eth_phy_printf("... waiting for auto-negotiation (30 x 0,2sec):"); for (tries = 0; tries < 30; tries++) { if (_eth_phy_read(f, 0x1, f->phy_addr, &phy_state)) { if ((phy_state & PHY_BMSR_AUTO_NEG) != 0) { break; } } CYGACC_CALL_IF_DELAY_US(200000); // 0.2 second diag_printf("."); } eth_phy_printf("\n"); } if ((phy_state & PHY_BMSR_AUTO_NEG) != 0) { *state = 0; if (_eth_phy_read(f, 0x1, f->phy_addr, &phy_state)) { if ((phy_state & PHY_BMSR_LINK) != 0) *state |= ETH_PHY_STAT_LINK; } if (_eth_phy_read(f, 0x5, f->phy_addr, &phy_state)) { // Partner negotiated parameters if ((phy_state & 0x0100) != 0) *state |= ETH_PHY_STAT_100MB | ETH_PHY_STAT_FDX; if ((phy_state & 0x0080) != 0) *state |= ETH_PHY_STAT_100MB; #ifdef ETH_PHY_STAT_10MB if ((phy_state & 0x0040) != 0) *state |= ETH_PHY_STAT_10MB | ETH_PHY_STAT_FDX; if ((phy_state & 0x0020) != 0) *state |= ETH_PHY_STAT_10MB; #endif // _eth_phy_read(f, 17, f->phy_addr, &phy_state); // CYGACC_CALL_IF_DELAY_US(1000000); // 0.1 second return true; } } } return false; } _eth_phy_dev("SMCS LAN8720A", 0x0007C0F1, lan8720a_stat)