Mercurial > ecos-v2_0-branch
annotate packages/devs/eth/arm/edb7xxx/current/src/if_edb7xxx.c @ 115:6ed91473a1cd ecos-sw-2000-08-21
Merge from eCos master repository on 2000-08-21-22:40:54-BST
| author | jlarmour |
|---|---|
| date | Fri, 25 Aug 2000 17:32:38 +0000 |
| parents | 6736c52df507 |
| children | bd1a71e3e476 |
| rev | line source |
|---|---|
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1 //========================================================================== |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
3 // dev/if_edb7xxx.c |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
4 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
5 // Ethernet device driver for Cirrus Logic EDB7xxx using CS8900 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
6 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
7 //========================================================================== |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
8 //####COPYRIGHTBEGIN#### |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
9 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
10 // ------------------------------------------- |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
11 // The contents of this file are subject to the Red Hat eCos Public License |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
12 // Version 1.1 (the "License"); you may not use this file except in |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
13 // compliance with the License. You may obtain a copy of the License at |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
14 // http://www.redhat.com/ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
15 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
16 // Software distributed under the License is distributed on an "AS IS" |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
18 // License for the specific language governing rights and limitations under |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
19 // the License. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
20 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
21 // The Original Code is eCos - Embedded Configurable Operating System, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
22 // released September 30, 1998. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
23 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
24 // The Initial Developer of the Original Code is Red Hat. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
25 // Portions created by Red Hat are |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
26 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
27 // All Rights Reserved. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
28 // ------------------------------------------- |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
29 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
30 //####COPYRIGHTEND#### |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
31 //####BSDCOPYRIGHTBEGIN#### |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
32 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
33 // ------------------------------------------- |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
34 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
35 // Portions of this software may have been derived from OpenBSD or other sources, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
36 // and are covered by the appropriate copyright disclaimers included herein. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
37 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
38 // ------------------------------------------- |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
39 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
40 //####BSDCOPYRIGHTEND#### |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
41 //========================================================================== |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
42 //#####DESCRIPTIONBEGIN#### |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
43 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
44 // Author(s): gthomas |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
45 // Contributors: gthomas |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
46 // Date: 2000-01-10 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
47 // Purpose: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
48 // Description: hardware driver for CS8900 ethernet |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
49 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
50 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
51 //####DESCRIPTIONEND#### |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
52 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
53 //========================================================================== |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
54 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
55 // Ethernet device driver for Cirrus Logic EDB7xxx |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
56 // Based on CS8900A |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
57 |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
58 #include <pkgconf/system.h> |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
59 #include <pkgconf/devs_eth_arm_edb7xxx.h> |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
60 #ifdef CYGPKG_NET |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
61 #include <pkgconf/net.h> |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
62 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
63 #include <cyg/infra/cyg_type.h> |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
64 #include <cyg/hal/hal_arch.h> |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
65 #include <cyg/hal/hal_intr.h> |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
66 #include <cyg/infra/diag.h> |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
67 #include <cyg/hal/drv_api.h> |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
68 #include <netdev.h> |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
69 #include <eth_drv.h> |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
70 |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
71 #ifndef CYGSEM_ARM_EDB7XXX_SET_ESA |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
72 #ifdef CYGPKG_REDBOOT |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
73 #include <pkgconf/redboot.h> |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
74 #ifdef CYGSEM_REDBOOT_FLASH_CONFIG |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
75 #include <redboot.h> |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
76 #include <flash_config.h> |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
77 RedBoot_config_option("Network hardware address [MAC]", |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
78 edb7xxx_esa, |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
79 ALWAYS_ENABLED, true, |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
80 CONFIG_ESA |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
81 ); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
82 #endif |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
83 #endif |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
84 #endif |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
85 |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
86 #define INTS_DONT_WORK |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
87 #undef INTS_DONT_WORK |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
88 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
89 #ifdef INTS_DONT_WORK |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
90 #define STACK_SIZE CYGNUM_HAL_STACK_SIZE_MINIMUM |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
91 static char cs8900_fake_int_stack[STACK_SIZE]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
92 static cyg_thread cs8900_fake_int_thread_data; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
93 static cyg_handle_t cs8900_fake_int_thread_handle; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
94 static void cs8900_fake_int(cyg_addrword_t); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
95 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
96 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
97 #define CS8900_BASE 0x20000000 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
98 #include "cs8900.h" |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
99 #define ETHER_ADDR_LEN 6 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
100 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
101 extern int net_debug; // FIXME |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
102 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
103 struct cs8900_priv_data { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
104 int txbusy; // A packet has been sent |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
105 unsigned long txkey; // Used to ack when packet sent |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
106 } _cs8900_priv_data; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
107 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
108 ETH_DRV_SC(edb7xxx_sc, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
109 &_cs8900_priv_data, // Driver specific data |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
110 "eth0", // Name for this interface |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
111 cs8900_start, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
112 cs8900_stop, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
113 cs8900_control, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
114 cs8900_can_send, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
115 cs8900_send, |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
116 cs8900_recv, |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
117 cs8900_int); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
118 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
119 NETDEVTAB_ENTRY(edb7xxx_netdev, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
120 "edb7xxx", |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
121 edb7xxx_cs8900_init, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
122 &edb7xxx_sc); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
123 |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
124 #ifdef CYGSEM_ARM_EDB7XXX_SET_ESA |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
125 static unsigned char enaddr[] = CYGDAT_ARM_EDB7XXX_ESA; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
126 #else |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
127 static unsigned char enaddr[ETHER_ADDR_LEN]; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
128 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
129 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
130 static void cs8900_int(struct eth_drv_sc *sc); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
131 static cyg_interrupt cs8900_interrupt; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
132 static cyg_handle_t cs8900_interrupt_handle; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
133 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
134 // This ISR is called when the ethernet interrupt occurs |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
135 static int |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
136 cs8900_isr(cyg_vector_t vector, cyg_addrword_t data, HAL_SavedRegisters *regs) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
137 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
138 cyg_drv_interrupt_mask(CYGNUM_HAL_INTERRUPT_EINT3); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
139 return (CYG_ISR_HANDLED|CYG_ISR_CALL_DSR); // Run the DSR |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
140 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
141 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
142 // This DSR handles the ethernet [logical] processing |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
143 static void |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
144 cs8900_dsr(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
145 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
146 cs8900_int((struct eth_drv_sc *)data); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
147 // Allow interrupts to happen again |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
148 cyg_drv_interrupt_acknowledge(CYGNUM_HAL_INTERRUPT_EINT3); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
149 cyg_drv_interrupt_unmask(CYGNUM_HAL_INTERRUPT_EINT3); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
150 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
151 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
152 static bool |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
153 edb7xxx_cs8900_init(struct cyg_netdevtab_entry *tab) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
154 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
155 struct eth_drv_sc *sc = (struct eth_drv_sc *)tab->device_instance; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
156 unsigned short chip_type, chip_rev, chip_status; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
157 int i; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
158 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
159 // Initialize environment, setup interrupt handler |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
160 cyg_drv_interrupt_create(CYGNUM_HAL_INTERRUPT_EINT3, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
161 99, // Priority - what goes here? |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
162 (cyg_addrword_t)sc, // Data item passed to interrupt handler |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
163 (cyg_ISR_t *)cs8900_isr, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
164 (cyg_DSR_t *)cs8900_dsr, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
165 &cs8900_interrupt_handle, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
166 &cs8900_interrupt); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
167 cyg_drv_interrupt_attach(cs8900_interrupt_handle); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
168 cyg_drv_interrupt_acknowledge(CYGNUM_HAL_INTERRUPT_EINT3); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
169 cyg_drv_interrupt_unmask(CYGNUM_HAL_INTERRUPT_EINT3); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
170 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
171 #ifdef INTS_DONT_WORK |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
172 cyg_thread_create(1, // Priority |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
173 cs8900_fake_int, // entry |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
174 0, // entry parameter |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
175 "CS8900 int", // Name |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
176 &cs8900_fake_int_stack[0], // Stack |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
177 STACK_SIZE, // Size |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
178 &cs8900_fake_int_thread_handle, // Handle |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
179 &cs8900_fake_int_thread_data // Thread data structure |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
180 ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
181 cyg_thread_resume(cs8900_fake_int_thread_handle); // Start it |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
182 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
183 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
184 chip_type = get_reg(PP_ChipID); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
185 chip_rev = get_reg(PP_ChipRev); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
186 |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
187 #if 0 |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
188 diag_printf("CS8900 - type: %x, rev: %x\n", chip_type, chip_rev); |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
189 #endif |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
190 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
191 // Fetch hardware address |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
192 #if defined(CYGPKG_REDBOOT) && \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
193 defined(CYGSEM_REDBOOT_FLASH_CONFIG) && \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
194 !defined(CYGSEM_ARM_EDB7XXX_SET_ESA) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
195 flash_get_config("edb7xxx_esa", enaddr, CONFIG_ESA); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
196 #else |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
197 for (i = 0; i < ETHER_ADDR_LEN; i += 2) { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
198 unsigned short esa_reg = get_reg(PP_IA+i); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
199 enaddr[i] = esa_reg & 0xFF; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
200 enaddr[i+1] = esa_reg >> 8; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
201 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
202 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
203 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
204 put_reg(PP_SelfCtl, PP_SelfCtl_Reset); // Reset chip |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
205 while ((get_reg(PP_SelfStat) & PP_SelfStat_InitD) == 0) ; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
206 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
207 chip_status = get_reg(PP_SelfStat); |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
208 #if 0 |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
209 diag_printf("CS8900 - status: %x (%sEEPROM present)\n", chip_status, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
210 chip_status&PP_SelfStat_EEPROM ? "" : "no "); |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
211 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
212 |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
213 // Set up hardware address |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
214 for (i = 0; i < ETHER_ADDR_LEN; i += 2) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
215 put_reg(PP_LAF+i, 0xFFFF); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
216 put_reg(PP_IA+i, enaddr[i] | (enaddr[i+1] << 8)); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
217 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
218 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
219 // Initialize upper level driver |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
220 (sc->funs->eth_drv->init)(sc, enaddr); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
221 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
222 return true; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
223 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
224 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
225 static void |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
226 cs8900_stop(struct eth_drv_sc *sc) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
227 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
228 put_reg(PP_SelfCtl, PP_SelfCtl_Reset); // Reset chip |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
229 while ((get_reg(PP_SelfStat) & PP_SelfStat_InitD) == 0) ; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
230 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
231 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
232 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
233 // This function is called to "start up" the interface. It may be called |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
234 // multiple times, even when the hardware is already running. It will be |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
235 // called whenever something "hardware oriented" changes and should leave |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
236 // the hardware ready to send/receive packets. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
237 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
238 static void |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
239 cs8900_start(struct eth_drv_sc *sc, unsigned char *enaddr, int flags) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
240 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
241 unsigned short stat; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
242 put_reg(PP_BusCtl, PP_BusCtl_MemoryE); // Disable interrupts, memory mode |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
243 put_reg(PP_IntReg, PP_IntReg_IRQ0); // Only possibility |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
244 put_reg(PP_RxCFG, PP_RxCFG_RxOK | PP_RxCFG_CRC | |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
245 PP_RxCFG_RUNT | PP_RxCFG_EXTRA); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
246 put_reg(PP_RxCTL, PP_RxCTL_RxOK | PP_RxCTL_Broadcast | |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
247 PP_RxCTL_IA); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
248 put_reg(PP_TxCFG, PP_TxCFG_TxOK | PP_TxCFG_Collision | |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
249 PP_TxCFG_CRS | PP_TxCFG_SQE | PP_TxCFG_Late | |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
250 PP_TxCFG_Jabber | PP_TxCFG_16Collisions); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
251 put_reg(PP_BufCFG, PP_BufCFG_TxRDY | PP_BufCFG_TxUE | PP_BufCFG_RxMiss | |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
252 PP_BufCFG_TxCol | PP_BufCFG_Miss | PP_BufCFG_SWI); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
253 put_reg(PP_IntReg, PP_IntReg_IRQ0); // Only possibility |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
254 put_reg(PP_LineCTL, PP_LineCTL_Rx | PP_LineCTL_Tx); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
255 // Clear Interrupt Status Queue before enabling interrupts |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
256 while ((stat = CS8900_ISQ) != 0) ; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
257 put_reg(PP_BusCtl, PP_BusCtl_EnableIRQ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
258 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
259 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
260 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
261 // This routine is called to perform special "control" opertions |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
262 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
263 static int |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
264 cs8900_control(struct eth_drv_sc *sc, unsigned long key, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
265 void *data, int data_length) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
266 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
267 switch (key) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
268 case ETH_DRV_SET_MAC_ADDRESS: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
269 return 0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
270 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
271 default: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
272 return 1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
273 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
274 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
275 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
276 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
277 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
278 // This routine is called to see if it is possible to send another packet. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
279 // It will return non-zero if a transmit is possible, zero otherwise. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
280 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
281 static int |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
282 cs8900_can_send(struct eth_drv_sc *sc) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
283 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
284 struct cs8900_priv_data *cpd = (struct cs8900_priv_data *)sc->driver_private; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
285 unsigned short stat; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
286 stat = get_reg(PP_LineStat); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
287 if ((stat & PP_LineStat_LinkOK) == 0) { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
288 return false; // Link not connected |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
289 } |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
290 return (cpd->txbusy == 0); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
291 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
292 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
293 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
294 // This routine is called to send data to the hardware. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
295 static void |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
296 cs8900_send(struct eth_drv_sc *sc, struct eth_drv_sg *sg_list, int sg_len, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
297 int total_len, unsigned long key) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
298 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
299 struct cs8900_priv_data *cpd = (struct cs8900_priv_data *)sc->driver_private; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
300 int i; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
301 int len; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
302 unsigned char *data; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
303 unsigned short saved_data = 0, *sdata; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
304 unsigned short stat; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
305 bool odd_byte = false; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
306 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
307 // Mark xmitter busy |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
308 cpd->txbusy = 1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
309 cpd->txkey = key; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
310 // Start the xmit sequence |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
311 // Note: this can go back once the 'dump' is removed |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
312 // CS8900_TxCMD = PP_TxCmd_TxStart_5; // Start more-or-less immediately |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
313 CS8900_TxCMD = PP_TxCmd_TxStart_Full; // Start only when all data sent to chip |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
314 CS8900_TxLEN = total_len; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
315 stat = get_reg(PP_BusStat); // This actually starts the xmit |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
316 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
317 // Put data into buffer |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
318 for (i = 0; i < sg_len; i++) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
319 data = (unsigned char *)sg_list[i].buf; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
320 len = sg_list[i].len; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
321 if (len > 0) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
322 /* Finish the last word. */ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
323 if (odd_byte) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
324 saved_data |= (*data++ << 8); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
325 CS8900_RTDATA = saved_data; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
326 len--; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
327 odd_byte = false; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
328 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
329 /* Output contiguous words. */ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
330 sdata = (unsigned short *)data; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
331 while (len > 1) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
332 CS8900_RTDATA = *sdata++; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
333 len -= sizeof(unsigned short); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
334 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
335 /* Save last byte, if necessary. */ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
336 if (len == 1) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
337 data = (unsigned char *)sdata; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
338 saved_data = *data; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
339 odd_byte = true; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
340 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
341 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
342 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
343 if (odd_byte) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
344 CS8900_RTDATA = saved_data; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
345 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
346 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
347 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
348 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
349 // This function is called when a packet has been received. It's job is |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
350 // to prepare to unload the packet from the hardware. Once the length of |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
351 // the packet is known, the upper layer of the driver can be told. When |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
352 // the upper layer is ready to unload the packet, the internal function |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
353 // 'cs8900_recv' will be called to actually fetch it from the hardware. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
354 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
355 static void |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
356 cs8900_RxEvent(struct eth_drv_sc *sc) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
357 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
358 unsigned short stat, len; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
359 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
360 stat = CS8900_RTDATA; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
361 len = CS8900_RTDATA; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
362 if (net_debug) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
363 diag_printf("RxEvent - stat: %x, len: %d\n", stat, len); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
364 } |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
365 (sc->funs->eth_drv->recv)(sc, len); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
366 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
367 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
368 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
369 // This function is called as a result of the "eth_drv_recv()" call above. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
370 // It's job is to actually fetch data for a packet from the hardware once |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
371 // memory buffers have been allocated for the packet. Note that the buffers |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
372 // may come in pieces, using a scatter-gather list. This allows for more |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
373 // efficient processing in the upper layers of the stack. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
374 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
375 static void |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
376 cs8900_recv(struct eth_drv_sc *sc, struct eth_drv_sg *sg_list, int sg_len) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
377 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
378 int i, mlen; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
379 unsigned short *data, val; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
380 unsigned char *cp, cval; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
381 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
382 for (i = 0; i < sg_len; i++) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
383 data = (unsigned short *)sg_list[i].buf; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
384 mlen = sg_list[i].len; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
385 while (mlen >= sizeof(*data)) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
386 val = CS8900_RTDATA; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
387 if (data) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
388 *data++ = val; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
389 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
390 mlen -= sizeof(*data); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
391 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
392 if (mlen) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
393 // Fetch last odd byte |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
394 cval = CS8900_RTDATA & 0xFF; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
395 if ((cp = (unsigned char *)data) != 0) { |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
396 *cp = cval; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
397 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
398 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
399 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
400 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
401 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
402 static void |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
403 cs8900_TxEvent(struct eth_drv_sc *sc, int stat) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
404 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
405 struct cs8900_priv_data *cpd = (struct cs8900_priv_data *)sc->driver_private; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
406 stat = get_reg(PP_TER); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
407 if (net_debug) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
408 diag_printf("Tx event: %x\n", stat); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
409 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
410 cpd->txbusy = 0; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
82
diff
changeset
|
411 (sc->funs->eth_drv->tx_done)(sc, cpd->txkey, 0); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
412 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
413 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
414 static void |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
415 cs8900_BufEvent(struct eth_drv_sc *sc, int stat) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
416 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
417 if (stat & PP_BufCFG_RxMiss) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
418 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
419 if (stat & PP_BufCFG_TxUE) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
420 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
421 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
422 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
423 static void |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
424 cs8900_int(struct eth_drv_sc *sc) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
425 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
426 unsigned short event; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
427 while ((event = CS8900_ISQ) != 0) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
428 switch (event & ISQ_EventMask) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
429 case ISQ_RxEvent: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
430 cs8900_RxEvent(sc); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
431 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
432 case ISQ_TxEvent: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
433 cs8900_TxEvent(sc, event); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
434 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
435 case ISQ_BufEvent: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
436 cs8900_BufEvent(sc, event); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
437 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
438 case ISQ_RxMissEvent: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
439 // Receive miss counter has overflowed |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
440 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
441 case ISQ_TxColEvent: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
442 // Transmit collision counter has overflowed |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
443 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
444 default: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
445 diag_printf("%s: Unknown event: %x\n", __FUNCTION__, event); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
446 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
447 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
448 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
449 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
450 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
451 #ifdef INTS_DONT_WORK |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
452 void |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
453 cs8900_fake_int(cyg_addrword_t param) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
454 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
455 int s; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
456 while (true) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
457 cyg_thread_delay(5); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
458 s = splnet(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
459 cs8900_int(&edb7xxx_sc); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
460 splx(s); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
461 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
462 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
463 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
464 |
