Mercurial > ecos
annotate packages/devs/eth/powerpc/fec/current/src/if_fec.c @ 159:511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
| author | jlarmour |
|---|---|
| date | Fri, 18 May 2001 06:32:28 +0000 |
| parents | |
| children | d63db767121d |
| 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 //========================================================================== |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
8 //####COPYRIGHTBEGIN#### |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
9 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
10 // ------------------------------------------- |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
11 // The contents of this file are subject to the Red Hat eCos Public License |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
12 // Version 1.1 (the "License"); you may not use this file except in |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
13 // compliance with the License. You may obtain a copy of the License at |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
14 // http://www.redhat.com/ |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
15 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
16 // Software distributed under the License is distributed on an "AS IS" |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
18 // License for the specific language governing rights and limitations under |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
19 // the License. |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
20 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
21 // The Original Code is eCos - Embedded Configurable Operating System, |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
22 // released September 30, 1998. |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
23 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
24 // The Initial Developer of the Original Code is Red Hat. |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
25 // Portions created by Red Hat are |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
26 // Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
27 // All Rights Reserved. |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
28 // ------------------------------------------- |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
29 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
30 //####COPYRIGHTEND#### |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
31 //========================================================================== |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
32 //#####DESCRIPTIONBEGIN#### |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
33 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
34 // Author(s): gthomas |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
35 // Contributors: gthomas |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
36 // Date: 2001-01-21 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
37 // Purpose: |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
38 // Description: hardware driver for MPC8xxT FEC |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
39 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
40 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
41 //####DESCRIPTIONEND#### |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
42 // |
|
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 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
45 // Ethernet device driver for MPC8xx FEC |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
46 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
47 #include <pkgconf/system.h> |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
48 #include <pkgconf/devs_eth_powerpc_fec.h> |
|
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 #ifdef CYGPKG_NET |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
51 #include <pkgconf/net.h> |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
52 #endif |
|
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 #include <cyg/infra/cyg_type.h> |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
55 #include <cyg/infra/diag.h> |
|
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 <cyg/hal/hal_arch.h> |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
58 #include <cyg/hal/hal_cache.h> |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
59 #include <cyg/hal/hal_intr.h> |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
60 #include <cyg/hal/drv_api.h> |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
61 #include <cyg/hal/hal_if.h> |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
62 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
63 #include <netdev.h> |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
64 #include <eth_drv.h> |
|
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 "fec.h" |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
67 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
68 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
|
69 [CYGNUM_DEVS_ETH_POWERPC_FEC_BUFSIZE]; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
70 static struct fec_bd fec_eth_rxring[CYGNUM_DEVS_ETH_POWERPC_FEC_RxNUM]; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
71 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
|
72 [CYGNUM_DEVS_ETH_POWERPC_FEC_BUFSIZE]; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
73 static struct fec_bd fec_eth_txring[CYGNUM_DEVS_ETH_POWERPC_FEC_TxNUM]; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
74 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
75 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
|
76 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
|
77 static unsigned char enaddr[6]; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
78 #ifdef CYGPKG_REDBOOT |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
79 #include <pkgconf/redboot.h> |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
80 #ifdef CYGSEM_REDBOOT_FLASH_CONFIG |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
81 #include <redboot.h> |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
82 #include <flash_config.h> |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
83 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
|
84 fec_esa, |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
85 ALWAYS_ENABLED, true, |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
86 CONFIG_ESA, 0 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
87 ); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
88 #endif |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
89 #endif |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
90 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
91 #ifdef CYGPKG_REDBOOT |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
92 #define os_printf printf |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
93 #else |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
94 #define os_printf diag_printf |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
95 #endif |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
96 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
97 // For fetching the ESA from RedBoot |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
98 #include <cyg/hal/hal_if.h> |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
99 #ifndef CONFIG_ESA |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
100 #define CONFIG_ESA 6 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
101 #endif |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
102 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
103 ETH_DRV_SC(fec_eth0_sc, |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
104 &fec_eth0_info, // Driver specific data |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
105 "eth0", // Name for this interface |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
106 fec_eth_start, |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
107 fec_eth_stop, |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
108 fec_eth_control, |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
109 fec_eth_can_send, |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
110 fec_eth_send, |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
111 fec_eth_recv, |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
112 fec_eth_deliver, |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
113 fec_eth_int, |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
114 fec_eth_int_vector); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
115 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
116 NETDEVTAB_ENTRY(fec_netdev, |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
117 "fec_eth", |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
118 fec_eth_init, |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
119 &fec_eth0_sc); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
120 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
121 #ifdef CYGPKG_NET |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
122 static cyg_interrupt fec_eth_interrupt; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
123 static cyg_handle_t fec_eth_interrupt_handle; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
124 #endif |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
125 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
|
126 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
127 #define FEC_ETH_INT CYGNUM_HAL_INTERRUPT_SIU_LVL1 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
128 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
129 #ifdef CYGPKG_NET |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
130 // 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
|
131 static int |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
132 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
|
133 { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
134 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
|
135 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
|
136 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
137 #endif |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
138 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
139 // 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
|
140 static void |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
141 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
|
142 { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
143 fec_eth_int(sc); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
144 #ifdef CYGPKG_NET |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
145 // Allow interrupts to happen again |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
146 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
|
147 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
|
148 #endif |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
149 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
150 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
151 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
152 // PHY unit access (via MII channel) |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
153 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
154 static void |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
155 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
|
156 { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
157 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
|
158 volatile struct fec *fec = (volatile struct fec *)((unsigned char *)eppc + FEC_OFFSET); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
159 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
160 fec->iEvent = iEvent_MII; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
161 fec->MiiData = MII_Start | MII_Write | MII_Phy(addr) | MII_Reg(reg) | MII_TA | data; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
162 while (!(fec->iEvent & iEvent_MII)) ; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
163 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
164 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
165 static unsigned short |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
166 phy_read(int reg, int addr) |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
167 { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
168 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
|
169 volatile struct fec *fec = (volatile struct fec *)((unsigned char *)eppc + FEC_OFFSET); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
170 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
171 fec->iEvent = iEvent_MII; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
172 fec->MiiData = MII_Start | MII_Read | MII_Phy(addr) | MII_Reg(reg) | MII_TA; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
173 while (!(fec->iEvent & iEvent_MII)) ; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
174 return fec->MiiData & 0x0000FFFF; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
175 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
176 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
177 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
178 // Initialize the interface - performed at system startup |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
179 // This function must set up the interface, including arranging to |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
180 // handle interrupts, etc, so that it may be "started" cheaply later. |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
181 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
182 static bool |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
183 fec_eth_init(struct cyg_netdevtab_entry *tab) |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
184 { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
185 struct eth_drv_sc *sc = (struct eth_drv_sc *)tab->device_instance; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
186 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
|
187 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
|
188 volatile struct fec *fec = (volatile struct fec *)((unsigned char *)eppc + FEC_OFFSET); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
189 struct fec_bd *rxbd, *txbd; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
190 unsigned char *RxBUF, *TxBUF; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
191 unsigned short phy_state = 0; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
192 int cache_state; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
193 int i; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
194 unsigned long proc_rev; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
195 bool esa_ok; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
196 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
197 // 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
|
198 HAL_DCACHE_IS_ENABLED(cache_state); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
199 HAL_DCACHE_SYNC(); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
200 HAL_DCACHE_DISABLE(); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
201 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
202 qi->fec = fec; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
203 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
204 #ifdef CYGPKG_NET |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
205 // Set up to handle interrupts |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
206 cyg_drv_interrupt_create(FEC_ETH_INT, |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
207 CYGARC_SIU_PRIORITY_HIGH, |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
208 (cyg_addrword_t)sc, // Data item passed to interrupt handler |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
209 (cyg_ISR_t *)fec_eth_isr, |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
210 (cyg_DSR_t *)eth_drv_dsr, |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
211 &fec_eth_interrupt_handle, |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
212 &fec_eth_interrupt); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
213 cyg_drv_interrupt_attach(fec_eth_interrupt_handle); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
214 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
|
215 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
|
216 #endif |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
217 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
218 // Shut down ethernet, in case it is already running |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
219 fec->eControl = eControl_RESET; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
220 eppc->pip_pbdat &= ~0x00004000; // Reset PHY chip |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
221 CYGACC_CALL_IF_DELAY_US(1000); // 1ms |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
222 eppc->pip_pbdat |= 0x00004000; // Enable PHY chip |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
223 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
224 fec->iMask = 0x0000000; // Disables all interrupts |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
225 fec->iEvent = 0xFFFFFFFF; // Clear all interrupts |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
226 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
|
227 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
228 txbd = fec_eth_txring; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
229 rxbd = fec_eth_rxring; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
230 qi->tbase = txbd; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
231 qi->txbd = txbd; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
232 qi->tnext = txbd; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
233 qi->rbase = rxbd; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
234 qi->rxbd = rxbd; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
235 qi->rnext = rxbd; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
236 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
237 #define ROUNDUP(b,s) (((unsigned long)(b) + (s-1)) & ~(s-1)) |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
238 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
|
239 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
|
240 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
241 // setup buffer descriptors |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
242 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
|
243 rxbd->length = 0; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
244 rxbd->buffer = RxBUF; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
245 rxbd->ctrl = FEC_BD_Rx_Empty; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
246 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
|
247 rxbd++; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
248 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
249 rxbd--; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
250 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
|
251 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
|
252 txbd->length = 0; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
253 txbd->buffer = TxBUF; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
254 txbd->ctrl = 0; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
255 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
|
256 txbd++; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
257 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
258 txbd--; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
259 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
|
260 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
261 // Set up parallel port for connection to ethernet tranceiver |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
262 eppc->pio_pdpar = 0x1FFF; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
263 asm volatile ("mfspr %0,638 \n\t" : "=r" (proc_rev) : ); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
264 #define PROC_REVB 0x0020 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
265 if ((proc_rev & 0x0000FFFF) == PROC_REVB) { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
266 eppc->pio_pddir = 0x1C58; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
267 } else { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
268 eppc->pio_pddir = 0x1FFF; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
269 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
270 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
271 // Reset interrupts |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
272 fec->iMask = 0x00000000; // No interrupts enabled |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
273 fec->iEvent = 0xFFFFFFFF; // Clear all interrupts |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
274 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
275 // Initialize shared PRAM |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
276 fec->RxRing = fec_eth_rxring; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
277 fec->TxRing = fec_eth_txring; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
278 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
279 // Size of receive buffers |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
280 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
|
281 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
282 // Receiver control |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
283 fec->RxControl = RxControl_MII | RxControl_DRT; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
284 // 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
|
285 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
|
286 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
287 // Transmit control |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
288 fec->TxControl = 0; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
289 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
290 // Use largest possible Tx FIFO |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
291 fec->TxWater = 3; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
292 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
293 // DMA control |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
294 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
|
295 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
296 // MII speed control (50MHz) |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
297 fec->MiiSpeed = 0x14; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
298 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
299 // Group address hash |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
300 fec->hash[0] = 0; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
301 fec->hash[1] = 0; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
302 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
303 // Device physical address |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
304 #ifdef CYGPKG_REDBOOT |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
305 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
|
306 #else |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
307 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
|
308 "fec_esa", enaddr, CONFIG_ESA); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
309 #endif |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
310 if (!esa_ok) { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
311 // Can't figure out ESA |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
312 diag_printf("FEC_ETH - Warning! ESA unknown\n"); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
313 memcpy(&enaddr, &_default_enaddr, sizeof(enaddr)); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
314 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
315 memcpy((void *)&fec->addr[0], &enaddr[0], sizeof(enaddr)); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
316 // os_printf("FEC ESA = %08x/%08x\n", fec->addr[0], fec->addr[1]); |
|
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 // Enable device |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
319 fec->eControl = eControl_EN | eControl_MUX; |
|
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 // Enable transceiver (PHY) |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
322 phy_write(PHY_BMCR, 0, PHY_BMCR_RESET); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
323 for (i = 0; i < 10; i++) { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
324 phy_state = phy_read(PHY_BMCR, 0); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
325 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
|
326 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
327 if (phy_state & PHY_BMCR_RESET) { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
328 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
|
329 return false; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
330 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
331 phy_write(PHY_BMCR, 0, PHY_BMCR_AUTO_NEG); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
332 // os_printf("MII: %x/%x\n", phy_state, phy_read(PHY_BMCR, 0)); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
333 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
334 #ifdef CYGPKG_NET |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
335 // Set up for interrupts |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
336 fec->iMask = iEvent_all & ~iEvent_MII; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
337 #endif |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
338 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
339 if (cache_state) |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
340 HAL_DCACHE_ENABLE(); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
341 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
342 // Initialize upper level driver |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
343 (sc->funs->eth_drv->init)(sc, (unsigned char *)&enaddr); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
344 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
345 return true; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
346 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
347 |
|
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 // 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
|
350 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
351 static void |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
352 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
|
353 { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
354 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
|
355 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
356 // Disable the device! |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
357 qi->fec->eControl &= ~eControl_EN; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
358 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
359 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
360 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
361 // 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
|
362 // 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
|
363 // 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
|
364 // 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
|
365 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
366 static void |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
367 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
|
368 { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
369 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
|
370 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
371 // Enable the device! |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
372 qi->fec->eControl |= eControl_EN; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
373 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
|
374 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
375 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
376 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
377 // 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
|
378 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
379 static int |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
380 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
|
381 void *data, int length) |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
382 { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
383 switch (key) { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
384 case ETH_DRV_SET_MAC_ADDRESS: |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
385 return 0; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
386 break; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
387 default: |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
388 return 1; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
389 break; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
390 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
391 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
392 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
393 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
394 // 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
|
395 // 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
|
396 // 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
|
397 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
398 static int |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
399 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
|
400 { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
401 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
|
402 volatile struct fec_bd *txbd = qi->txbd; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
403 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
404 return ((txbd->ctrl & FEC_BD_Tx_Ready) == 0); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
405 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
406 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
407 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
408 // This routine is called to send data to the hardware. |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
409 static void |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
410 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
|
411 int total_len, unsigned long key) |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
412 { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
413 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
|
414 volatile struct fec_bd *txbd, *txfirst; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
415 volatile char *bp; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
416 int i, txindex, cache_state; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
417 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
418 // Find a free buffer |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
419 txbd = txfirst = qi->txbd; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
420 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
|
421 // 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
|
422 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
|
423 txbd = qi->tbase; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
424 } else { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
425 txbd++; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
426 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
427 if (txbd == txfirst) { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
428 #ifdef CYGPKG_NET |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
429 panic ("No free xmit buffers"); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
430 #else |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
431 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
|
432 #endif |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
433 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
434 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
435 // Remember the next buffer to try |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
436 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
|
437 qi->txbd = qi->tbase; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
438 } else { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
439 qi->txbd = txbd+1; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
440 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
441 txindex = ((unsigned long)txbd - (unsigned long)qi->tbase) / sizeof(*txbd); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
442 qi->txkey[txindex] = key; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
443 // Set up buffer |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
444 txbd->length = total_len; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
445 bp = txbd->buffer; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
446 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
|
447 memcpy((void *)bp, (void *)sg_list[i].buf, sg_list[i].len); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
448 bp += sg_list[i].len; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
449 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
450 // Note: the MBX860 does not seem to snoop/invalidate the data cache properly! |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
451 HAL_DCACHE_IS_ENABLED(cache_state); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
452 if (cache_state) { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
453 HAL_DCACHE_FLUSH(txbd->buffer, txbd->length); // Make sure no stale data |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
454 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
455 // Send it on it's way |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
456 txbd->ctrl |= FEC_BD_Tx_Ready | FEC_BD_Tx_Last | FEC_BD_Tx_TC; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
457 if (cache_state) { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
458 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
|
459 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
460 qi->fec->TxUpdate = 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
|
461 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
462 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
463 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
464 // 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
|
465 // 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
|
466 // 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
|
467 // 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
|
468 // '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
|
469 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
470 static void |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
471 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
|
472 { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
473 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
|
474 volatile struct fec_bd *rxbd; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
475 int cache_state; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
476 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
477 // Note: the MBX860 does not seem to snoop/invalidate the data cache properly! |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
478 HAL_DCACHE_IS_ENABLED(cache_state); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
479 if (cache_state) { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
480 HAL_DCACHE_FLUSH(fec_eth_rxring, sizeof(fec_eth_rxring)); // Make sure no stale data |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
481 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
482 rxbd = qi->rnext; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
483 while ((rxbd->ctrl & FEC_BD_Rx_Empty) == 0) { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
484 qi->rxbd = rxbd; // Save for callback |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
485 (sc->funs->eth_drv->recv)(sc, rxbd->length); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
486 rxbd->ctrl |= FEC_BD_Rx_Empty; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
487 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
|
488 rxbd = qi->rbase; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
489 } else { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
490 rxbd++; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
491 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
492 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
493 // Remember where we left off |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
494 qi->rnext = (struct fec_bd *)rxbd; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
495 if (cache_state) { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
496 HAL_DCACHE_FLUSH(fec_eth_rxring, sizeof(fec_eth_rxring)); // Make sure no stale data |
|
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 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
|
499 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
500 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
501 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
502 // 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
|
503 // 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
|
504 // 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
|
505 // 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
|
506 // 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
|
507 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
508 static void |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
509 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
|
510 { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
511 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
|
512 unsigned char *bp; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
513 int i, cache_state; |
|
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 bp = (unsigned char *)qi->rxbd->buffer; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
516 // Note: the MBX860 does not seem to snoop/invalidate the data cache properly! |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
517 HAL_DCACHE_IS_ENABLED(cache_state); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
518 if (cache_state) { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
519 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
|
520 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
521 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
|
522 if (sg_list[i].buf != 0) { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
523 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
|
524 bp += sg_list[i].len; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
525 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
526 } |
|
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 static void |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
530 fec_eth_TxEvent(struct eth_drv_sc *sc, int stat) |
|
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 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
|
533 volatile struct fec_bd *txbd; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
534 int txindex, cache_state; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
535 |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
536 HAL_DCACHE_IS_ENABLED(cache_state); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
537 if (cache_state) { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
538 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
|
539 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
540 txbd = qi->tnext; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
541 // 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
|
542 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
|
543 txindex = ((unsigned long)txbd - (unsigned long)qi->tbase) / sizeof(*txbd); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
544 (sc->funs->eth_drv->tx_done)(sc, qi->txkey[txindex], 0); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
545 txbd->ctrl &= ~FEC_BD_Tx_TC; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
546 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
|
547 txbd = qi->tbase; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
548 } else { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
549 txbd++; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
550 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
551 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
552 // Remember where we left off |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
553 qi->tnext = (struct fec_bd *)txbd; |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
554 if (cache_state) { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
555 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
|
556 } |
|
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 // Interrupt processing |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
561 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
562 static void |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
563 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
|
564 { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
565 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
|
566 unsigned long event; |
|
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 while ((event = qi->fec->iEvent) != 0) { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
569 if ((event & iEvent_TFINT) != 0) { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
570 fec_eth_TxEvent(sc, event); |
|
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 if ((event & iEvent_RFINT) != 0) { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
573 fec_eth_RxEvent(sc); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
574 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
575 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
|
576 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
577 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
578 |
|
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 // Interrupt vector |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
581 // |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
582 static int |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
583 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
|
584 { |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
585 return (FEC_ETH_INT); |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
586 } |
|
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
diff
changeset
|
587 |
