annotate packages/devs/eth/powerpc/fec/current/src/if_fec.c @ 327:46ef6d9976db

Making FEC ethernet driver more generic
author gthomas
date Tue, 03 Sep 2002 16:56:13 +0000
parents 38e03cb8babb
children 5b4cd8e2de16
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
1 //==========================================================================
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
2 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
3 // dev/if_fec.c
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
4 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
5 // Fast ethernet device driver for PowerPC MPC8xxT boards
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
6 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
7 //==========================================================================
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
9 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
327
46ef6d9976db Making FEC ethernet driver more generic
gthomas
parents: 297
diff changeset
12 // Copyright (C) 2002 Gary Thomas
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
13 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
14 // eCos is free software; you can redistribute it and/or modify it under
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
15 // the terms of the GNU General Public License as published by the Free
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
16 // Software Foundation; either version 2 or (at your option) any later version.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
17 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
19 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
21 // for more details.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
22 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
23 // You should have received a copy of the GNU General Public License along
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
24 // with eCos; if not, write to the Free Software Foundation, Inc.,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
25 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
26 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
27 // As a special exception, if other files instantiate templates or use macros
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
28 // or inline functions from this file, or you compile this file and link it
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
29 // with other works to produce a work based on this file, this file does not
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
30 // by itself cause the resulting work to be covered by the GNU General Public
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
31 // License. However the source code for this file must still be made available
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
32 // in accordance with section (3) of the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
33 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
34 // This exception does not invalidate any other reasons why a work based on
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
35 // this file might be covered by the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
36 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
37 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
38 // at http://sources.redhat.com/ecos/ecos-license/
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
39 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
40 //####ECOSGPLCOPYRIGHTEND####
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
41 //==========================================================================
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
42 //#####DESCRIPTIONBEGIN####
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
43 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
44 // Author(s): gthomas
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
45 // Contributors: gthomas
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
46 // Date: 2001-01-21
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
47 // Purpose:
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
48 // Description: hardware driver for MPC8xxT FEC
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
49 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
50 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
51 //####DESCRIPTIONEND####
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
52 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
53 //==========================================================================
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
54
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
55 // Ethernet device driver for MPC8xx FEC
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
56
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
57 #include <pkgconf/system.h>
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
58 #include <pkgconf/devs_eth_powerpc_fec.h>
219
ae8511176102 Fix CDL dependencies for stand-alone/system operation.
gthomas
parents: 212
diff changeset
59 #include <pkgconf/io_eth_drivers.h>
327
46ef6d9976db Making FEC ethernet driver more generic
gthomas
parents: 297
diff changeset
60 #include CYGDAT_DEVS_FEC_ETH_INL
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
61
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
62 #ifdef CYGPKG_NET
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
63 #include <pkgconf/net.h>
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
64 #endif
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
65
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
66 #include <cyg/infra/cyg_type.h>
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
67 #include <cyg/infra/diag.h>
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
68
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
69 #include <cyg/hal/hal_arch.h>
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
70 #include <cyg/hal/hal_cache.h>
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
71 #include <cyg/hal/hal_intr.h>
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
72 #include <cyg/hal/drv_api.h>
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
73 #include <cyg/hal/hal_if.h>
165
d63db767121d Merge from eCos master repository on 2001-06-29-06:43:03-BST
jlarmour
parents: 159
diff changeset
74 #include <cyg/hal/ppc_regs.h>
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
75
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
76 #include <cyg/io/eth/netdev.h>
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
77 #include <cyg/io/eth/eth_drv.h>
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
78
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
79 #include "fec.h"
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
80
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
81 // Define this to force the buffer descriptors into the EPPC memory
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
82 #define FEC_USE_EPPC_BD
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
83
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
84 #ifndef FEC_USE_EPPC_BD
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
85 static struct fec_bd fec_eth_rxring[CYGNUM_DEVS_ETH_POWERPC_FEC_RxNUM];
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
86 static struct fec_bd fec_eth_txring[CYGNUM_DEVS_ETH_POWERPC_FEC_TxNUM];
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
87 #endif
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
88 static unsigned char fec_eth_rxbufs[CYGNUM_DEVS_ETH_POWERPC_FEC_RxNUM+1]
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
89 [CYGNUM_DEVS_ETH_POWERPC_FEC_BUFSIZE];
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
90 static unsigned char fec_eth_txbufs[CYGNUM_DEVS_ETH_POWERPC_FEC_TxNUM+1]
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
91 [CYGNUM_DEVS_ETH_POWERPC_FEC_BUFSIZE];
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
92
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
93 static struct fec_eth_info fec_eth0_info;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
94 static unsigned char _default_enaddr[] = { 0x08, 0x00, 0x3E, 0x28, 0x7A, 0xBA};
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
95 static unsigned char enaddr[6];
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
96 #ifdef CYGPKG_REDBOOT
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
97 #include <pkgconf/redboot.h>
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
98 #ifdef CYGSEM_REDBOOT_FLASH_CONFIG
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
99 #include <redboot.h>
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
100 #include <flash_config.h>
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
101 RedBoot_config_option("Network hardware address [MAC]",
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
102 fec_esa,
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
103 ALWAYS_ENABLED, true,
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
104 CONFIG_ESA, 0
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
105 );
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
106 #endif
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
107 #endif
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
108
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
109 #define os_printf diag_printf
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
110
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
111 // For fetching the ESA from RedBoot
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
112 #include <cyg/hal/hal_if.h>
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
113 #ifndef CONFIG_ESA
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
114 #define CONFIG_ESA 6
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
115 #endif
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
116
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
117 ETH_DRV_SC(fec_eth0_sc,
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
118 &fec_eth0_info, // Driver specific data
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
119 "eth0", // Name for this interface
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
120 fec_eth_start,
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
121 fec_eth_stop,
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
122 fec_eth_control,
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
123 fec_eth_can_send,
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
124 fec_eth_send,
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
125 fec_eth_recv,
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
126 fec_eth_deliver,
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
127 fec_eth_int,
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
128 fec_eth_int_vector);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
129
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
130 NETDEVTAB_ENTRY(fec_netdev,
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
131 "fec_eth",
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
132 fec_eth_init,
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
133 &fec_eth0_sc);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
134
212
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
135 #ifdef CYGINT_IO_ETH_INT_SUPPORT_REQUIRED
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
136 #define _FEC_USE_INTS
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
137 #ifdef _FEC_USE_INTS
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
138 static cyg_interrupt fec_eth_interrupt;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
139 static cyg_handle_t fec_eth_interrupt_handle;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
140 #else
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
141 #define STACK_SIZE CYGNUM_HAL_STACK_SIZE_MINIMUM
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
142 static char fec_fake_int_stack[STACK_SIZE];
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
143 static cyg_thread fec_fake_int_thread_data;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
144 static cyg_handle_t fec_fake_int_thread_handle;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
145 static void fec_fake_int(cyg_addrword_t);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
146 #endif // _FEC_USE_INTS
212
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
147 #endif // CYGINT_IO_ETH_INT_SUPPORT_REQUIRED
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
148 static void fec_eth_int(struct eth_drv_sc *data);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
149
327
46ef6d9976db Making FEC ethernet driver more generic
gthomas
parents: 297
diff changeset
150 #ifndef FEC_ETH_INT
46ef6d9976db Making FEC ethernet driver more generic
gthomas
parents: 297
diff changeset
151 #error FEC_ETH_INT must be defined
46ef6d9976db Making FEC ethernet driver more generic
gthomas
parents: 297
diff changeset
152 #endif
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
153
327
46ef6d9976db Making FEC ethernet driver more generic
gthomas
parents: 297
diff changeset
154 #ifndef FEC_ETH_PHY
46ef6d9976db Making FEC ethernet driver more generic
gthomas
parents: 297
diff changeset
155 #error FEC_ETH_PHY must be defined
46ef6d9976db Making FEC ethernet driver more generic
gthomas
parents: 297
diff changeset
156 #endif
46ef6d9976db Making FEC ethernet driver more generic
gthomas
parents: 297
diff changeset
157
46ef6d9976db Making FEC ethernet driver more generic
gthomas
parents: 297
diff changeset
158 #ifndef FEC_ETH_RESET_PHY
46ef6d9976db Making FEC ethernet driver more generic
gthomas
parents: 297
diff changeset
159 #define FEC_ETH_RESET_PHY()
46ef6d9976db Making FEC ethernet driver more generic
gthomas
parents: 297
diff changeset
160 #endif
46ef6d9976db Making FEC ethernet driver more generic
gthomas
parents: 297
diff changeset
161
46ef6d9976db Making FEC ethernet driver more generic
gthomas
parents: 297
diff changeset
162 // LED activity [exclusive of hardware bits]
46ef6d9976db Making FEC ethernet driver more generic
gthomas
parents: 297
diff changeset
163 #ifndef _get_led
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
164 #define _get_led()
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
165 #define _set_led(v)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
166 #endif
327
46ef6d9976db Making FEC ethernet driver more generic
gthomas
parents: 297
diff changeset
167 #ifndef LED_TxACTIVE
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
168 #define LED_TxACTIVE 7
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
169 #define LED_RxACTIVE 6
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
170 #define LED_IntACTIVE 5
327
46ef6d9976db Making FEC ethernet driver more generic
gthomas
parents: 297
diff changeset
171 #endif
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
172
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
173 static void
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
174 set_led(int bit)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
175 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
176 _set_led(_get_led() | (1<<bit));
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
177 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
178
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
179 static void
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
180 clear_led(int bit)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
181 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
182 _set_led(_get_led() & ~(1<<bit));
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
183 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
184
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
185 #ifdef _FEC_USE_INTS
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
186 // This ISR is called when the ethernet interrupt occurs
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
187 static int
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
188 fec_eth_isr(cyg_vector_t vector, cyg_addrword_t data, HAL_SavedRegisters *regs)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
189 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
190 cyg_drv_interrupt_mask(FEC_ETH_INT);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
191 return (CYG_ISR_HANDLED|CYG_ISR_CALL_DSR); // Run the DSR
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
192 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
193 #endif
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
194
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
195 // Deliver function (ex-DSR) handles the ethernet [logical] processing
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
196 static void
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
197 fec_eth_deliver(struct eth_drv_sc * sc)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
198 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
199 fec_eth_int(sc);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
200 #ifdef _FEC_USE_INTS
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
201 // Allow interrupts to happen again
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
202 cyg_drv_interrupt_acknowledge(FEC_ETH_INT);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
203 cyg_drv_interrupt_unmask(FEC_ETH_INT);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
204 #endif
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
205 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
206
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
207 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
208 // PHY unit access (via MII channel)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
209 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
210 static void
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
211 phy_write(int reg, int addr, unsigned short data)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
212 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
213 volatile EPPC *eppc = (volatile EPPC *)eppc_base();
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
214 volatile struct fec *fec = (volatile struct fec *)((unsigned char *)eppc + FEC_OFFSET);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
215 int timeout = 0x100000;
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
216
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
217 fec->iEvent = iEvent_MII;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
218 fec->MiiData = MII_Start | MII_Write | MII_Phy(addr) | MII_Reg(reg) | MII_TA | data;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
219 while (!(fec->iEvent & iEvent_MII) && (--timeout > 0)) ;
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
220 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
221
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
222 static bool
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
223 phy_read(int reg, int addr, unsigned short *val)
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
224 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
225 volatile EPPC *eppc = (volatile EPPC *)eppc_base();
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
226 volatile struct fec *fec = (volatile struct fec *)((unsigned char *)eppc + FEC_OFFSET);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
227 int timeout = 0x100000;
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
228
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
229 fec->iEvent = iEvent_MII;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
230 fec->MiiData = MII_Start | MII_Read | MII_Phy(addr) | MII_Reg(reg) | MII_TA;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
231 while (!(fec->iEvent & iEvent_MII)) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
232 if (--timeout <= 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
233 return false;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
234 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
235 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
236 *val = fec->MiiData & 0x0000FFFF;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
237 return true;
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
238 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
239
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
240 //
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
241 // [re]Initialize the ethernet controller
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
242 // Done separately since shutting down the device requires a
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
243 // full reconfiguration when re-enabling.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
244 // when
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
245 static bool
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
246 fec_eth_reset(struct eth_drv_sc *sc, unsigned char *enaddr, int flags)
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
247 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
248 struct fec_eth_info *qi = (struct fec_eth_info *)sc->driver_private;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
249 volatile EPPC *eppc = (volatile EPPC *)eppc_base();
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
250 volatile struct fec *fec = (volatile struct fec *)((unsigned char *)eppc + FEC_OFFSET);
212
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
251 volatile struct fec_bd *rxbd, *txbd;
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
252 unsigned char *RxBUF, *TxBUF;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
253 int cache_state, int_state;
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
254 int i;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
255
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
256 // Ignore unless device is idle/stopped
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
257 if ((qi->fec->eControl & eControl_EN) != 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
258 return true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
259 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
260
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
261 // Make sure interrupts are off while we mess with the device
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
262 HAL_DISABLE_INTERRUPTS(int_state);
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
263
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
264 // Ensure consistent state between cache and what the FEC sees
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
265 HAL_DCACHE_IS_ENABLED(cache_state);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
266 HAL_DCACHE_SYNC();
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
267 HAL_DCACHE_DISABLE();
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
268
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
269 // Shut down ethernet controller, in case it is already running
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
270 fec->eControl = eControl_RESET;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
271 i = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
272 while ((fec->eControl & eControl_RESET) != 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
273 if (++i >= 500000) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
274 os_printf("FEC Ethernet does not reset\n");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
275 if (cache_state)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
276 HAL_DCACHE_ENABLE();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
277 HAL_RESTORE_INTERRUPTS(int_state);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
278 return false;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
279 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
280 }
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
281
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
282 fec->iMask = 0x0000000; // Disables all interrupts
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
283 fec->iEvent = 0xFFFFFFFF; // Clear all interrupts
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
284 fec->iVector = (1<<29); // Caution - must match FEC_ETH_INT above
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
285
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
286 #define ROUNDUP(b,s) (((unsigned long)(b) + (s-1)) & ~(s-1))
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
287 #ifdef FEC_USE_EPPC_BD
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
288 txbd = (struct fec_bd *)(0x2C00 + (cyg_uint32)eppc);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
289 rxbd = &txbd[CYGNUM_DEVS_ETH_POWERPC_FEC_TxNUM];
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
290 #else
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
291 txbd = fec_eth_txring;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
292 rxbd = fec_eth_rxring;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
293 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
294 qi->tbase = qi->txbd = qi->tnext = txbd;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
295 qi->rbase = qi->rxbd = qi->rnext = rxbd;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
296 qi->txactive = 0;
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
297
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
298 RxBUF = (unsigned char *)ROUNDUP(&fec_eth_rxbufs[0][0], 32);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
299 TxBUF = (unsigned char *)ROUNDUP(&fec_eth_txbufs[0][0], 32);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
300
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
301 // setup buffer descriptors
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
302 for (i = 0; i < CYGNUM_DEVS_ETH_POWERPC_FEC_RxNUM; i++) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
303 rxbd->length = 0;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
304 rxbd->buffer = RxBUF;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
305 rxbd->ctrl = FEC_BD_Rx_Empty;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
306 RxBUF += CYGNUM_DEVS_ETH_POWERPC_FEC_BUFSIZE;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
307 rxbd++;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
308 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
309 rxbd--;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
310 rxbd->ctrl |= FEC_BD_Rx_Wrap; // Last buffer
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
311 for (i = 0; i < CYGNUM_DEVS_ETH_POWERPC_FEC_TxNUM; i++) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
312 txbd->length = 0;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
313 txbd->buffer = TxBUF;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
314 txbd->ctrl = 0;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
315 TxBUF += CYGNUM_DEVS_ETH_POWERPC_FEC_BUFSIZE;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
316 txbd++;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
317 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
318 txbd--;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
319 txbd->ctrl |= FEC_BD_Tx_Wrap; // Last buffer
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
320
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
321 // Reset interrupts
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
322 fec->iMask = 0x00000000; // No interrupts enabled
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
323 fec->iEvent = 0xFFFFFFFF; // Clear all interrupts
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
324
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
325 // Initialize shared PRAM
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
326 fec->RxRing = qi->rbase;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
327 fec->TxRing = qi->tbase;
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
328
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
329 // Size of receive buffers
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
330 fec->RxBufSize = CYGNUM_DEVS_ETH_POWERPC_FEC_BUFSIZE;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
331
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
332 // Receiver control
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
333 fec->RxControl = RxControl_MII | RxControl_DRT;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
334 // fec->RxControl = RxControl_MII | RxControl_LOOP | RxControl_PROM;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
335 fec->RxHash = IEEE_8023_MAX_FRAME; // Largest possible ethernet frame
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
336
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
337 // Transmit control
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
338 fec->TxControl = 4+0;
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
339
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
340 // Use largest possible Tx FIFO
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
341 fec->TxWater = 3;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
342
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
343 // DMA control
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
344 fec->FunCode = ((2<<29) | (2<<27) | (0<<24));
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
345
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
346 // MII speed control (50MHz)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
347 fec->MiiSpeed = 0x14;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
348
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
349 // Group address hash
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
350 fec->hash[0] = 0;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
351 fec->hash[1] = 0;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
352
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
353 // Device physical address
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
354 fec->addr[0] = *(unsigned long *)&enaddr[0];
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
355 fec->addr[1] = *(unsigned long *)&enaddr[4];
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
356 // os_printf("FEC ESA = %08x/%08x\n", fec->addr[0], fec->addr[1]);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
357
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
358 // Enable device
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
359 fec->eControl = eControl_EN | eControl_MUX;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
360 fec->RxUpdate = 0x0F0F0F0F; // Any write tells machine to look for work
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
361
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
362 #ifdef _FEC_USE_INTS
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
363 // Set up for interrupts
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
364 fec->iMask = iEvent_TFINT | iEvent_TXB |
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
365 iEvent_RFINT | iEvent_RXB;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
366 fec->iEvent = 0xFFFFFFFF; // Clear all interrupts
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
367 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
368
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
369 if (cache_state)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
370 HAL_DCACHE_ENABLE();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
371
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
372 // Set LED state
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
373 clear_led(LED_TxACTIVE);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
374 clear_led(LED_RxACTIVE);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
375
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
376 HAL_RESTORE_INTERRUPTS(int_state);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
377 return true;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
378 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
379
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
380 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
381 // Initialize the interface - performed at system startup
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
382 // This function must set up the interface, including arranging to
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
383 // handle interrupts, etc, so that it may be "started" cheaply later.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
384 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
385 static bool
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
386 fec_eth_init(struct cyg_netdevtab_entry *tab)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
387 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
388 struct eth_drv_sc *sc = (struct eth_drv_sc *)tab->device_instance;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
389 struct fec_eth_info *qi = (struct fec_eth_info *)sc->driver_private;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
390 volatile EPPC *eppc = (volatile EPPC *)eppc_base();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
391 volatile struct fec *fec = (volatile struct fec *)((unsigned char *)eppc + FEC_OFFSET);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
392 unsigned short phy_state = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
393 int cache_state;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
394 int i;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
395 unsigned long proc_rev;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
396 bool esa_ok, phy_ok;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
397 int phy_timeout = 5*1000; // Wait 5 seconds max for link to clear
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
398
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
399 // Ensure consistent state between cache and what the FEC sees
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
400 HAL_DCACHE_IS_ENABLED(cache_state);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
401 HAL_DCACHE_SYNC();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
402 HAL_DCACHE_DISABLE();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
403
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
404 qi->fec = fec;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
405 fec_eth_stop(sc); // Make sure it's not running yet
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
406
212
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
407 #ifdef CYGINT_IO_ETH_INT_SUPPORT_REQUIRED
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
408 #ifdef _FEC_USE_INTS
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
409 // Set up to handle interrupts
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
410 cyg_drv_interrupt_create(FEC_ETH_INT,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
411 CYGARC_SIU_PRIORITY_HIGH,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
412 (cyg_addrword_t)sc, // Data item passed to interrupt handler
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
413 (cyg_ISR_t *)fec_eth_isr,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
414 (cyg_DSR_t *)eth_drv_dsr,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
415 &fec_eth_interrupt_handle,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
416 &fec_eth_interrupt);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
417 cyg_drv_interrupt_attach(fec_eth_interrupt_handle);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
418 cyg_drv_interrupt_acknowledge(FEC_ETH_INT);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
419 cyg_drv_interrupt_unmask(FEC_ETH_INT);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
420 #else // _FEC_USE_INTS
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
421 // Hack - use a thread to simulate interrupts
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
422 cyg_thread_create(1, // Priority
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
423 fec_fake_int, // entry
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
424 (cyg_addrword_t)sc, // entry parameter
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
425 "CS8900 int", // Name
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
426 &fec_fake_int_stack[0], // Stack
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
427 STACK_SIZE, // Size
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
428 &fec_fake_int_thread_handle, // Handle
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
429 &fec_fake_int_thread_data // Thread data structure
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
430 );
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
431 cyg_thread_resume(fec_fake_int_thread_handle); // Start it
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
432 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
433 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
434
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
435 // Set up parallel port for connection to ethernet tranceiver
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
436 eppc->pio_pdpar = 0x1FFF;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
437 CYGARC_MFSPR( CYGARC_REG_PVR, proc_rev );
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
438 #define PROC_REVB 0x0020
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
439 if ((proc_rev & 0x0000FFFF) == PROC_REVB) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
440 eppc->pio_pddir = 0x1C58;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
441 } else {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
442 eppc->pio_pddir = 0x1FFF;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
443 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
444
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
445 // Get physical device address
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
446 #ifdef CYGPKG_REDBOOT
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
447 esa_ok = flash_get_config("fec_esa", enaddr, CONFIG_ESA);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
448 #else
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
449 esa_ok = CYGACC_CALL_IF_FLASH_CFG_OP(CYGNUM_CALL_IF_FLASH_CFG_GET,
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
450 "fec_esa", enaddr, CONFIG_ESA);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
451 #endif
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
452 if (!esa_ok) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
453 // Can't figure out ESA
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 165
diff changeset
454 os_printf("FEC_ETH - Warning! ESA unknown\n");
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
455 memcpy(&enaddr, &_default_enaddr, sizeof(enaddr));
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
456 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
457
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
458 // Configure the device
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
459 if (!fec_eth_reset(sc, enaddr, 0)) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
460 return false;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
461 }
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
462
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
463 // Reset PHY (transceiver)
327
46ef6d9976db Making FEC ethernet driver more generic
gthomas
parents: 297
diff changeset
464 FEC_ETH_RESET_PHY();
46ef6d9976db Making FEC ethernet driver more generic
gthomas
parents: 297
diff changeset
465
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
466 // Enable transceiver (PHY)
212
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
467 phy_ok = 0;
327
46ef6d9976db Making FEC ethernet driver more generic
gthomas
parents: 297
diff changeset
468 phy_write(PHY_BMCR, FEC_ETH_PHY, PHY_BMCR_RESET);
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
469 for (i = 0; i < 10; i++) {
327
46ef6d9976db Making FEC ethernet driver more generic
gthomas
parents: 297
diff changeset
470 phy_ok = phy_read(PHY_BMCR, FEC_ETH_PHY, &phy_state);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
471 if (!phy_ok) break;
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
472 if (!(phy_state & PHY_BMCR_RESET)) break;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
473 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
474 if (!phy_ok || (phy_state & PHY_BMCR_RESET)) {
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
475 os_printf("FEC: Can't get PHY unit to reset: %x\n", phy_state);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
476 return false;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
477 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
478 fec->iEvent = 0xFFFFFFFF; // Clear all interrupts
327
46ef6d9976db Making FEC ethernet driver more generic
gthomas
parents: 297
diff changeset
479 phy_write(PHY_BMCR, FEC_ETH_PHY, PHY_BMCR_AUTO_NEG|PHY_BMCR_RESTART);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
480 while (phy_timeout-- >= 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
481 int ev = fec->iEvent;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
482 unsigned short state;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
483 fec->iEvent = ev;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
484 if (ev & iEvent_MII) {
327
46ef6d9976db Making FEC ethernet driver more generic
gthomas
parents: 297
diff changeset
485 phy_ok = phy_read(PHY_BMSR, FEC_ETH_PHY, &state);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
486 if (phy_ok && (state & PHY_BMSR_AUTO_NEG)) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
487 // os_printf("State: %x\n", state);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
488 break;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
489 } else {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
490 CYGACC_CALL_IF_DELAY_US(1000); // 1ms
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
491 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
492 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
493 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
494 if (phy_timeout <= 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
495 os_printf("** FEC Warning: PHY auto-negotiation failed\n");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
496 }
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
497
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
498 // Initialize upper level driver
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
499 (sc->funs->eth_drv->init)(sc, (unsigned char *)&enaddr);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
500
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
501 return true;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
502 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
503
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
504 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
505 // This function is called to shut down the interface.
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
506 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
507 static void
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
508 fec_eth_stop(struct eth_drv_sc *sc)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
509 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
510 struct fec_eth_info *qi = (struct fec_eth_info *)sc->driver_private;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
511
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
512 // Disable the device!
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
513 qi->fec->eControl &= ~eControl_EN;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
514 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
515
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
516 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
517 // This function is called to "start up" the interface. It may be called
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
518 // multiple times, even when the hardware is already running. It will be
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
519 // called whenever something "hardware oriented" changes and should leave
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
520 // the hardware ready to send/receive packets.
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
521 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
522 static void
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
523 fec_eth_start(struct eth_drv_sc *sc, unsigned char *enaddr, int flags)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
524 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
525 // Enable the device!
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
526 fec_eth_reset(sc, enaddr, flags);
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
527 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
528
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
529 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
530 // This function is called for low level "control" operations
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
531 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
532 static int
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
533 fec_eth_control(struct eth_drv_sc *sc, unsigned long key,
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
534 void *data, int length)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
535 {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
536 #ifdef ETH_DRV_SET_MC_ALL
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
537 struct fec_eth_info *qi = (struct fec_eth_info *)sc->driver_private;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
538 volatile struct fec *fec = qi->fec;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
539 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
540
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
541 switch (key) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
542 case ETH_DRV_SET_MAC_ADDRESS:
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
543 return 0;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
544 break;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
545 #ifdef ETH_DRV_SET_MC_ALL
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
546 case ETH_DRV_SET_MC_ALL:
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
547 case ETH_DRV_SET_MC_LIST:
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
548 fec->RxControl &= ~RxControl_PROM;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
549 fec->hash[0] = 0xFFFFFFFF;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
550 fec->hash[1] = 0xFFFFFFFF;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
551 return 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
552 break;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
553 #endif
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
554 default:
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
555 return 1;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
556 break;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
557 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
558 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
559
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
560 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
561 // This function is called to see if another packet can be sent.
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
562 // It should return the number of packets which can be handled.
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
563 // Zero should be returned if the interface is busy and can not send any more.
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
564 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
565 static int
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
566 fec_eth_can_send(struct eth_drv_sc *sc)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
567 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
568 struct fec_eth_info *qi = (struct fec_eth_info *)sc->driver_private;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
569
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
570 return (qi->txactive < CYGNUM_DEVS_ETH_POWERPC_FEC_TxNUM);
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
571 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
572
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
573 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
574 // This routine is called to send data to the hardware.
297
38e03cb8babb Clean up - remove unused [debug] variable.
gthomas
parents: 275
diff changeset
575
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
576 static void
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
577 fec_eth_send(struct eth_drv_sc *sc, struct eth_drv_sg *sg_list, int sg_len,
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
578 int total_len, unsigned long key)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
579 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
580 struct fec_eth_info *qi = (struct fec_eth_info *)sc->driver_private;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
581 volatile struct fec_bd *txbd, *txfirst;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
582 volatile char *bp;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
583 int i, txindex, cache_state;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
584
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
585 // Find a free buffer
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
586 txbd = txfirst = qi->txbd;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
587 while (txbd->ctrl & FEC_BD_Tx_Ready) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
588 // This buffer is busy, move to next one
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
589 if (txbd->ctrl & FEC_BD_Tx_Wrap) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
590 txbd = qi->tbase;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
591 } else {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
592 txbd++;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
593 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
594 if (txbd == txfirst) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
595 #ifdef CYGPKG_NET
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
596 panic ("No free xmit buffers");
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
597 #else
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
598 os_printf("FEC Ethernet: No free xmit buffers\n");
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
599 #endif
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
600 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
601 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
602 // Set up buffer
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
603 bp = txbd->buffer;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
604 for (i = 0; i < sg_len; i++) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
605 memcpy((void *)bp, (void *)sg_list[i].buf, sg_list[i].len);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
606 bp += sg_list[i].len;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
607 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
608 txbd->length = total_len;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
609 txindex = ((unsigned long)txbd - (unsigned long)qi->tbase) / sizeof(*txbd);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
610 qi->txkey[txindex] = key;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
611 // Note: the MPC860 does not seem to snoop/invalidate the data cache properly!
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
612 HAL_DCACHE_IS_ENABLED(cache_state);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
613 if (cache_state) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
614 HAL_DCACHE_FLUSH(txbd->buffer, txbd->length); // Make sure no stale data
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
615 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
616 // Send it on it's way
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
617 txbd->ctrl |= FEC_BD_Tx_Ready | FEC_BD_Tx_Last | FEC_BD_Tx_TC;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
618 #ifndef FEC_USE_EPPC_BD
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
619 if (cache_state) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
620 HAL_DCACHE_FLUSH(fec_eth_txring, sizeof(fec_eth_txring)); // Make sure no stale data
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
621 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
622 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
623 qi->txactive++;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
624 qi->fec->TxUpdate = 0x01000000; // Any write tells machine to look for work
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
625 set_led(LED_TxACTIVE);
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
626 // Remember the next buffer to try
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
627 if (txbd->ctrl & FEC_BD_Tx_Wrap) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
628 qi->txbd = qi->tbase;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
629 } else {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
630 qi->txbd = txbd+1;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
631 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
632 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
633
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
634 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
635 // This function is called when a packet has been received. It's job is
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
636 // to prepare to unload the packet from the hardware. Once the length of
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
637 // the packet is known, the upper layer of the driver can be told. When
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
638 // the upper layer is ready to unload the packet, the internal function
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
639 // 'fec_eth_recv' will be called to actually fetch it from the hardware.
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
640 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
641 static void
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
642 fec_eth_RxEvent(struct eth_drv_sc *sc)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
643 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
644 struct fec_eth_info *qi = (struct fec_eth_info *)sc->driver_private;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
645 volatile struct fec_bd *rxbd, *rxfirst;
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
646 int cache_state;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
647
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
648 // Note: the MPC860 does not seem to snoop/invalidate the data cache properly!
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
649 HAL_DCACHE_IS_ENABLED(cache_state);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
650 #ifndef FEC_USE_EPPC_BD
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
651 if (cache_state) {
275
c3ec301f39df Fix some cache flush/invalidate booboos.
gthomas
parents: 219
diff changeset
652 HAL_DCACHE_INVALIDATE(fec_eth_rxring, sizeof(fec_eth_rxring)); // Make sure no stale data
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
653 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
654 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
655 rxbd = rxfirst = qi->rnext;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
656 while (true) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
657 if ((rxbd->ctrl & FEC_BD_Rx_Empty) == 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
658 qi->rxbd = rxbd; // Save for callback
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
659 set_led(LED_RxACTIVE);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
660 (sc->funs->eth_drv->recv)(sc, rxbd->length);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
661 }
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
662 if (rxbd->ctrl & FEC_BD_Rx_Wrap) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
663 rxbd = qi->rbase;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
664 } else {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
665 rxbd++;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
666 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
667 if (rxbd == rxfirst) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
668 break;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
669 }
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
670 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
671 // Remember where we left off
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
672 qi->rnext = (struct fec_bd *)rxbd;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
673 #ifndef FEC_USE_EPPC_BD
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
674 if (cache_state) {
275
c3ec301f39df Fix some cache flush/invalidate booboos.
gthomas
parents: 219
diff changeset
675 HAL_DCACHE_INVALIDATE(fec_eth_rxring, sizeof(fec_eth_rxring)); // Make sure no stale data
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
676 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
677 #endif
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
678 qi->fec->RxUpdate = 0x0F0F0F0F; // Any write tells machine to look for work
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
679 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
680
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
681 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
682 // This function is called as a result of the "eth_drv_recv()" call above.
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
683 // It's job is to actually fetch data for a packet from the hardware once
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
684 // memory buffers have been allocated for the packet. Note that the buffers
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
685 // may come in pieces, using a scatter-gather list. This allows for more
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
686 // efficient processing in the upper layers of the stack.
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
687 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
688 static void
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
689 fec_eth_recv(struct eth_drv_sc *sc, struct eth_drv_sg *sg_list, int sg_len)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
690 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
691 struct fec_eth_info *qi = (struct fec_eth_info *)sc->driver_private;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
692 unsigned char *bp;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
693 int i, cache_state;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
694
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
695 bp = (unsigned char *)qi->rxbd->buffer;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
696 // Note: the MPC860 does not seem to snoop/invalidate the data cache properly!
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
697 HAL_DCACHE_IS_ENABLED(cache_state);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
698 if (cache_state) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
699 HAL_DCACHE_INVALIDATE(qi->rxbd->buffer, qi->rxbd->length); // Make sure no stale data
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
700 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
701 for (i = 0; i < sg_len; i++) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
702 if (sg_list[i].buf != 0) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
703 memcpy((void *)sg_list[i].buf, bp, sg_list[i].len);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
704 bp += sg_list[i].len;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
705 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
706 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
707 qi->rxbd->ctrl |= FEC_BD_Rx_Empty;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
708 clear_led(LED_RxACTIVE);
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
709 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
710
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
711 static void
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
712 fec_eth_TxEvent(struct eth_drv_sc *sc)
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
713 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
714 struct fec_eth_info *qi = (struct fec_eth_info *)sc->driver_private;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
715 volatile struct fec_bd *txbd;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
716 int key, txindex, cache_state;
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
717
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
718 HAL_DCACHE_IS_ENABLED(cache_state);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
719 #ifndef FEC_USE_EPPC_BD
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
720 if (cache_state) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
721 HAL_DCACHE_FLUSH(fec_eth_txring, sizeof(fec_eth_txring)); // Make sure no stale data
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
722 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
723 #endif
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
724 txbd = qi->tnext;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
725 // Note: TC field is used to indicate the buffer has/had data in it
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
726 while ((txbd->ctrl & (FEC_BD_Tx_Ready|FEC_BD_Tx_TC)) == FEC_BD_Tx_TC) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
727 txindex = ((unsigned long)txbd - (unsigned long)qi->tbase) / sizeof(*txbd);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
728 if ((key = qi->txkey[txindex]) != 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
729 qi->txkey[txindex] = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
730 (sc->funs->eth_drv->tx_done)(sc, key, 0);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
731 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
732 if (--qi->txactive == 0) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
733 clear_led(LED_TxACTIVE);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
734 }
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
735 txbd->ctrl &= ~FEC_BD_Tx_TC;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
736 if (txbd->ctrl & FEC_BD_Tx_Wrap) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
737 txbd = qi->tbase;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
738 } else {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
739 txbd++;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
740 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
741 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
742 // Remember where we left off
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
743 qi->tnext = (struct fec_bd *)txbd;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
744 #ifndef FEC_USE_EPPC_BD
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
745 if (cache_state) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
746 HAL_DCACHE_FLUSH(fec_eth_txring, sizeof(fec_eth_txring)); // Make sure no stale data
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
747 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
748 #endif
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
749 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
750
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
751 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
752 // Interrupt processing
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
753 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
754 static void
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
755 fec_eth_int(struct eth_drv_sc *sc)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
756 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
757 struct fec_eth_info *qi = (struct fec_eth_info *)sc->driver_private;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
758 unsigned long event;
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
759
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
760 while ((event = qi->fec->iEvent) != 0) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
761 if ((event & iEvent_TFINT) != 0) {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
762 fec_eth_TxEvent(sc);
159
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
763 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
764 if ((event & iEvent_RFINT) != 0) {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
765 fec_eth_RxEvent(sc);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
766 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
767 qi->fec->iEvent = event; // Reset the bits we handled
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
768 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
769 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
770
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
771 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
772 // Interrupt vector
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
773 //
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
774 static int
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
775 fec_eth_int_vector(struct eth_drv_sc *sc)
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
776 {
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
777 return (FEC_ETH_INT);
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
778 }
511f4dc167f6 Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff changeset
779
212
94b558c9fb67 Merge from eCos master repository on 2002-05-31-00:05:29-BST
jlarmour
parents: 210
diff changeset
780 #if defined(CYGINT_IO_ETH_INT_SUPPORT_REQUIRED) && ~defined(_FEC_USE_INTS)
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
781 void
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
782 fec_fake_int(cyg_addrword_t param)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
783 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
784 struct eth_drv_sc *sc = (struct eth_drv_sc *) param;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
785 int int_state;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
786
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
787 while (true) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
788 cyg_thread_delay(1); // 10ms
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
789 HAL_DISABLE_INTERRUPTS(int_state);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
790 fec_eth_int(sc);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
791 HAL_RESTORE_INTERRUPTS(int_state);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
792 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
793 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
794 #endif