annotate packages/devs/eth/powerpc/adder/current/src/adder_eth.c @ 432:cc4df9225149

Add Adder platform from Analogue & Micro
author gthomas
date Mon, 25 Nov 2002 23:18:41 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
432
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
1 //==========================================================================
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
2 //
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
3 // adder_eth.c
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
4 //
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
5 // Ethernet device driver specifics for Analogue & Micro Adder (PPC850)
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
6 //
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
7 //==========================================================================
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
9 // -------------------------------------------
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
12 // Copyright (C) 2002 Gary Thomas
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
13 //
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
14 // eCos is free software; you can redistribute it and/or modify it under
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
15 // the terms of the GNU General Public License as published by the Free
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
16 // Software Foundation; either version 2 or (at your option) any later version.
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
17 //
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
19 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
21 // for more details.
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
22 //
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
23 // You should have received a copy of the GNU General Public License along
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
24 // with eCos; if not, write to the Free Software Foundation, Inc.,
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
25 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
26 //
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
27 // As a special exception, if other files instantiate templates or use macros
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
28 // or inline functions from this file, or you compile this file and link it
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
29 // with other works to produce a work based on this file, this file does not
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
30 // by itself cause the resulting work to be covered by the GNU General Public
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
31 // License. However the source code for this file must still be made available
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
32 // in accordance with section (3) of the GNU General Public License.
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
33 //
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
34 // This exception does not invalidate any other reasons why a work based on
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
35 // this file might be covered by the GNU General Public License.
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
36 //
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
37 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
38 // at http://sources.redhat.com/ecos/ecos-license/
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
39 // -------------------------------------------
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
40 //####ECOSGPLCOPYRIGHTEND####
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
41 //####BSDCOPYRIGHTBEGIN####
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
42 //
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
43 // -------------------------------------------
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
44 //
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
45 // Portions of this software may have been derived from OpenBSD or other sources,
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
46 // and are covered by the appropriate copyright disclaimers included herein.
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
47 //
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
48 // -------------------------------------------
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
49 //
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
50 //####BSDCOPYRIGHTEND####
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
51 //==========================================================================
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
52 //#####DESCRIPTIONBEGIN####
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
53 //
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
54 // Author(s): gthomas
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
55 // Contributors: gthomas
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
56 // Date: 2002-11-25
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
57 // Purpose:
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
58 // Description: platform driver specifics for A&M Adder
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
59 //
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
60 //
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
61 //####DESCRIPTIONEND####
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
62 //
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
63 //==========================================================================
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
64
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
65 // Ethernet device driver support for PHY on Adder/MPC850
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
66
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
67 #include <pkgconf/system.h>
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
68 #include <cyg/infra/cyg_type.h>
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
69 #include <cyg/infra/diag.h>
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
70
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
71 #include <cyg/hal/hal_arch.h>
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
72 #include <cyg/hal/hal_cache.h>
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
73 #include <cyg/hal/hal_if.h>
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
74 #include <cyg/hal/drv_api.h>
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
75
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
76 #include CYGDAT_DEVS_QUICC_ETH_INL // Platform specifics
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
77 #include <cyg/hal/quicc/ppc8xx.h> // QUICC structure definitions
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
78
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
79 // MII interface
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
80 #define MII_Start 0x40000000
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
81 #define MII_Read 0x20000000
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
82 #define MII_Write 0x10000000
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
83 #define MII_Cmd 0x30000000
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
84 #define MII_Phy(phy) (phy << 23)
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
85 #define MII_Reg(reg) (reg << 18)
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
86 #define MII_TA 0x00020000
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
87
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
88 // Transceiver mode
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
89 #define PHY_BMCR 0x00 // Register number
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
90 #define PHY_BMCR_RESET 0x8000
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
91 #define PHY_BMCR_LOOPBACK 0x4000
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
92 #define PHY_BMCR_100MB 0x2000
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
93 #define PHY_BMCR_AUTO_NEG 0x1000
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
94 #define PHY_BMCR_POWER_DOWN 0x0800
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
95 #define PHY_BMCR_ISOLATE 0x0400
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
96 #define PHY_BMCR_RESTART 0x0200
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
97 #define PHY_BMCR_FULL_DUPLEX 0x0100
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
98 #define PHY_BMCR_COLL_TEST 0x0080
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
99
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
100 #define PHY_BMSR 0x01 // Status register
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
101 #define PHY_BMSR_AUTO_NEG 0x0020
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
102 #define PHY_BMSR_LINK 0x0004
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
103
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
104 // Bits in port D - used for 2 wire MII interface
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
105 #define MII_DATA 0x1000
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
106 #define MII_CLOCK 0x0800
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
107
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
108 #define MII_SET_DATA(val) \
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
109 if (val) { \
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
110 eppc->pio_pddat |= MII_DATA; \
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
111 } else { \
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
112 eppc->pio_pddat &= ~MII_DATA; \
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
113 }
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
114
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
115 #define MII_GET_DATA() \
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
116 ((eppc->pio_pddat & MII_DATA) != 0)
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
117
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
118 #define MII_SET_CLOCK(val) \
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
119 if (val) { \
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
120 eppc->pio_pddat |= MII_CLOCK; \
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
121 } else { \
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
122 eppc->pio_pddat &= ~MII_CLOCK; \
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
123 }
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
124
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
125 static cyg_uint32
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
126 phy_cmd(cyg_uint32 cmd)
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
127 {
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
128 volatile EPPC *eppc = (volatile EPPC *)eppc_base();
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
129 cyg_uint32 retval;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
130 int i, off;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
131 bool is_read = ((cmd & MII_Cmd) == MII_Read);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
132
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
133 // Set both bits as output
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
134 eppc->pio_pddir |= MII_DATA | MII_CLOCK;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
135
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
136 // Preamble
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
137 for (i = 0; i < 32; i++) {
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
138 MII_SET_CLOCK(0);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
139 MII_SET_DATA(1);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
140 CYGACC_CALL_IF_DELAY_US(1);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
141 MII_SET_CLOCK(1);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
142 CYGACC_CALL_IF_DELAY_US(1);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
143 }
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
144
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
145 // Command/data
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
146 for (i = 0, off = 31; i < (is_read ? 14 : 32); i++, --off) {
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
147 MII_SET_CLOCK(0);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
148 MII_SET_DATA((cmd >> off) & 0x00000001);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
149 CYGACC_CALL_IF_DELAY_US(1);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
150 MII_SET_CLOCK(1);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
151 CYGACC_CALL_IF_DELAY_US(1);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
152 }
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
153
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
154 retval = cmd;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
155
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
156 // If read, fetch data register
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
157 if (is_read) {
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
158 retval >>= 16;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
159
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
160 MII_SET_CLOCK(0);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
161 eppc->pio_pddir &= ~MII_DATA; // Data bit is now input
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
162 CYGACC_CALL_IF_DELAY_US(1);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
163 MII_SET_CLOCK(1);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
164 CYGACC_CALL_IF_DELAY_US(1);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
165 MII_SET_CLOCK(0);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
166 CYGACC_CALL_IF_DELAY_US(1);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
167
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
168 for (i = 0, off = 15; i < 16; i++, off--) {
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
169 MII_SET_CLOCK(1);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
170 retval <<= 1;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
171 retval |= MII_GET_DATA();
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
172 CYGACC_CALL_IF_DELAY_US(1);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
173 MII_SET_CLOCK(0);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
174 CYGACC_CALL_IF_DELAY_US(1);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
175 }
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
176 }
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
177
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
178 // Set both bits as output
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
179 eppc->pio_pddir |= MII_DATA | MII_CLOCK;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
180
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
181 // Postamble
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
182 for (i = 0; i < 32; i++) {
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
183 MII_SET_CLOCK(0);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
184 MII_SET_DATA(1);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
185 CYGACC_CALL_IF_DELAY_US(1);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
186 MII_SET_CLOCK(1);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
187 CYGACC_CALL_IF_DELAY_US(1);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
188 }
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
189
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
190 return retval;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
191 }
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
192
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
193 //
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
194 // PHY unit access (via MII channel)
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
195 //
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
196 static void
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
197 phy_write(int reg, int addr, unsigned short data)
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
198 {
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
199 phy_cmd(MII_Start | MII_Write | MII_Phy(addr) | MII_Reg(reg) | MII_TA | data);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
200 }
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
201
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
202 static bool
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
203 phy_read(int reg, int addr, unsigned short *val)
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
204 {
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
205 cyg_uint32 ret;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
206
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
207 ret = phy_cmd(MII_Start | MII_Read | MII_Phy(addr) | MII_Reg(reg) | MII_TA);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
208 *val = ret;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
209 return true;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
210 }
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
211
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
212 bool
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
213 _adder_reset_phy(void)
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
214 {
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
215 volatile EPPC *eppc = (volatile EPPC *)eppc_base();
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
216 int phy_timeout = 5*1000; // Wait 5 seconds max for link to clear
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
217 bool phy_ok;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
218 unsigned short phy_state = 0;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
219 int phy_unit = -1;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
220 int i;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
221
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
222 // Reset PHY (transceiver)
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
223 eppc->pip_pbdat &= ~0x00004000; // Reset PHY chip
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
224 CYGACC_CALL_IF_DELAY_US(15000); // > 10ms
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
225 eppc->pip_pbdat |= 0x00004000; // Enable PHY chip
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
226
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
227 phy_ok = false;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
228
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
229 // Try and discover how this PHY is wired
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
230 for (i = 0; i < 0x20; i++) {
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
231 phy_read(PHY_BMCR, i, &phy_state);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
232 if ((phy_state & PHY_BMCR_RESET) == 0) {
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
233 phy_unit = i;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
234 break;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
235 }
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
236 }
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
237 if (phy_unit < 0) {
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
238 diag_printf("QUICC ETH - Can't locate PHY\n");
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
239 return false;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
240 } else {
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
241 #if 0
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
242 diag_printf("QUICC ETH - using PHY %d\n", phy_unit);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
243 #endif
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
244 }
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
245 if (phy_read(PHY_BMSR, phy_unit, &phy_state)) {
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
246 if ((phy_state & PHY_BMSR_LINK) != PHY_BMSR_LINK) {
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
247 unsigned short reset_mode;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
248 phy_write(PHY_BMCR, phy_unit, PHY_BMCR_RESET);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
249 for (i = 0; i < 10; i++) {
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
250 phy_ok = phy_read(PHY_BMCR, phy_unit, &phy_state);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
251 if (!phy_ok) break;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
252 if (!(phy_state & PHY_BMCR_RESET)) break;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
253 }
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
254 if (!phy_ok || (phy_state & PHY_BMCR_RESET)) {
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
255 diag_printf("QUICC/ETH: Can't get PHY unit to soft reset: %x\n", phy_state);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
256 return false;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
257 }
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
258 reset_mode = PHY_BMCR_RESTART | PHY_BMCR_AUTO_NEG | PHY_BMCR_FULL_DUPLEX;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
259 phy_write(PHY_BMCR, phy_unit, reset_mode);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
260 while (phy_timeout-- >= 0) {
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
261 phy_ok = phy_read(PHY_BMSR, phy_unit, &phy_state);
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
262 if (phy_ok && (phy_state & PHY_BMSR_LINK)) {
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
263 break;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
264 } else {
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
265 CYGACC_CALL_IF_DELAY_US(10000); // 10ms
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
266 }
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
267 }
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
268 if (phy_timeout <= 0) {
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
269 diag_printf("** QUICC/ETH Warning: PHY LINK UP failed\n");
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
270 }
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
271 }
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
272 else {
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
273 diag_printf("** QUICC/ETH Info: PHY LINK already UP \n");
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
274 }
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
275 }
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
276
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
277 return phy_ok;
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
278 }
cc4df9225149 Add Adder platform from Analogue & Micro
gthomas
parents:
diff changeset
279