annotate packages/devs/eth/phy/current/src/VSC8641.c @ 3292:7f8e529b4d82 default tip

Fix FREESCALE_EDMA_NBYTES_MLOFFYES_MLOFF() so it works with negative offsets.
author vae
date Wed, 29 Apr 2015 23:31:48 +0000
parents 31c9ab39babe
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2960
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
1 //==========================================================================
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
2 //
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
3 // phy/VSC8641.c
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
4 //
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
5 // Ethernet PHY driver
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
6 //
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
7 //==========================================================================
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
8 // ####ECOSGPLCOPYRIGHTBEGIN####
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
9 // -------------------------------------------
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
12 // 2008, 2009 Free Software Foundation, Inc.
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
13 //
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
14 // eCos is free software; you can redistribute it and/or modify it under
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
15 // the terms of the GNU General Public License as published by the Free
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
16 // Software Foundation; either version 2 or (at your option) any later
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
17 // version.
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
18 //
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
19 // eCos is distributed in the hope that it will be useful, but WITHOUT
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
20 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
21 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
22 // for more details.
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
23 //
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
24 // You should have received a copy of the GNU General Public License
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
25 // along with eCos; if not, write to the Free Software Foundation, Inc.,
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
26 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
27 //
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
28 // As a special exception, if other files instantiate templates or use
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
29 // macros or inline functions from this file, or you compile this file
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
30 // and link it with other works to produce a work based on this file,
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
31 // this file does not by itself cause the resulting work to be covered by
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
32 // the GNU General Public License. However the source code for this file
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
33 // must still be made available in accordance with section (3) of the GNU
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
34 // General Public License v2.
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
35 //
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
36 // This exception does not invalidate any other reasons why a work based
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
37 // on this file might be covered by the GNU General Public License.
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
38 // -------------------------------------------
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
39 // ####ECOSGPLCOPYRIGHTEND####
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
40 //==========================================================================
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
41 //#####DESCRIPTIONBEGIN####
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
42 //
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
43 // Author(s): Sachin Sushil Chaddha
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
44 // Contributors:
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
45 // Date: 2009-11-01
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
46 // Purpose:
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
47 // Description: Hardware driver for Ethernet PHY Vitesse VSC8641
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
48 //
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
49 //
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
50 //####DESCRIPTIONEND####
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
51 //
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
52 //==========================================================================
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
53
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
54 #include <pkgconf/system.h>
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
55 #include <pkgconf/devs_eth_phy.h>
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
56
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
57 #include <cyg/infra/cyg_type.h>
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
58
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
59 #include <cyg/hal/hal_arch.h>
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
60 #include <cyg/hal/drv_api.h>
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
61 #include <cyg/hal/hal_if.h>
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
62 #include <cyg/hal/hal_tables.h>
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
63
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
64 #include <cyg/io/eth_phy.h>
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
65 #include <cyg/io/eth_phy_dev.h>
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
66
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
67 #include "VSC8641.h"
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
68
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
69 static bool VSC8641_stat(eth_phy_access_t *f, int *state)
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
70 {
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
71 unsigned short phy_state;
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
72 int tries;
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
73 int auto_completed = 1;
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
74 int link_up = 0;
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
75
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
76 // Read negotiated state from the Quick Poll Detailed Status Register
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
77 if (_eth_phy_read(f, VSC8641_MII_STAT_REG, f->phy_addr, &phy_state))
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
78 {
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
79
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
80 if ((phy_state & VSC8641_AUTO_COMPLETED) == 0)
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
81 {
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
82 auto_completed = 0;
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
83 eth_phy_printf("... waiting for auto-negotiation");
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
84 for (tries = 0; tries < CYGINT_DEVS_ETH_PHY_AUTO_NEGOTIATION_TIME; tries++)
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
85 {
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
86 if (_eth_phy_read(f, VSC8641_MII_STAT_REG, f->phy_addr, &phy_state))
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
87 {
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
88 if ((phy_state & VSC8641_AUTO_COMPLETED) != 0)
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
89 {
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
90 auto_completed = 1;
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
91 break;
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
92 }
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
93 }
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
94 CYGACC_CALL_IF_DELAY_US(1000000); // 1 second
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
95 eth_phy_printf(".");
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
96 }
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
97 eth_phy_printf("\n");
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
98 }
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
99
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
100 if(phy_state & VSC8641_MII_PHY_STAT_LINK_UP)
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
101 link_up = 1;
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
102
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
103 if(auto_completed)
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
104 {
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
105 _eth_phy_read(f, VSC8641_MII_PHY_STAT_REG, f->phy_addr, &phy_state);
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
106
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
107 if(link_up)
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
108 *state |= ETH_PHY_STAT_LINK;
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
109 if(phy_state & VSC8641_MII_PHY_STAT_1000MB )
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
110 *state |= ETH_PHY_STAT_1000MB;
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
111 if(phy_state & VSC8641_MII_PHY_STAT_100MB)
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
112 *state |= ETH_PHY_STAT_100MB;
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
113 if(phy_state & VSC8641_MII_PHY_STAT_DUPLEX_FULL)
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
114 *state |= ETH_PHY_STAT_FDX;
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
115 return true;
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
116 }
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
117
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
118 }
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
119 return false;
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
120 }
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
121
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
122
31c9ab39babe * doc/eth_phy.sgml, include/eth_phy.h: Add Ethernet Gigabit Mode
jld
parents:
diff changeset
123 _eth_phy_dev("Vitesse VSC8641", 0x00070431, VSC8641_stat)