annotate packages/devs/eth/arm/edb7xxx/current/src/if_edb7xxx.c @ 126:518f42066aba ecos-sw-2000-09-19

Merge from eCos master repository on 2000-09-19-06:25:26-BST
author jlarmour
date Tue, 19 Sep 2000 05:53:51 +0000
parents 6bd9d475ed4b
children d397fc472bcf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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>
126
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 121
diff changeset
62 #include <cyg/kernel/kapi.h>
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
63 #endif
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
64 #include <cyg/infra/cyg_type.h>
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
65 #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
66 #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
67 #include <cyg/infra/diag.h>
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
68 #include <cyg/hal/drv_api.h>
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
69 #include <netdev.h>
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
70 #include <eth_drv.h>
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
71
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
72 #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
73 #ifdef CYGPKG_REDBOOT
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
74 #include <pkgconf/redboot.h>
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
75 #ifdef CYGSEM_REDBOOT_FLASH_CONFIG
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
76 #include <redboot.h>
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
77 #include <flash_config.h>
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
78 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
79 edb7xxx_esa,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
80 ALWAYS_ENABLED, true,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
81 CONFIG_ESA
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
82 );
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 #endif
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
86
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
87 #define INTS_DONT_WORK
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
88 #undef INTS_DONT_WORK
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
89
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
90 #ifdef INTS_DONT_WORK
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
91 #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
92 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
93 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
94 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
95 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
96 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
97
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
98 #define CS8900_BASE 0x20000000
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
99 #include "cs8900.h"
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
100 #define ETHER_ADDR_LEN 6
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
101
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
102 extern int net_debug; // FIXME
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
103
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
104 struct cs8900_priv_data {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
105 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
106 unsigned long txkey; // Used to ack when packet sent
126
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 121
diff changeset
107 #ifdef CYGPKG_NET
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 121
diff changeset
108 cyg_tick_count_t txstart;
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 121
diff changeset
109 #endif
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
110 } _cs8900_priv_data;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
111
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
112 ETH_DRV_SC(edb7xxx_sc,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
113 &_cs8900_priv_data, // Driver specific data
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
114 "eth0", // Name for this interface
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
115 cs8900_start,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
116 cs8900_stop,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
117 cs8900_control,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
118 cs8900_can_send,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
119 cs8900_send,
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
120 cs8900_recv,
121
6bd9d475ed4b Merge from eCos master repository on 2000-09-04-20:50:20-BST
jlarmour
parents: 117
diff changeset
121 cs8900_deliver, // "pseudoDSR" called from fast net thread
6bd9d475ed4b Merge from eCos master repository on 2000-09-04-20:50:20-BST
jlarmour
parents: 117
diff changeset
122 cs8900_int, // poll function, encapsulates ISR and DSR
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
123 cs8900_int_vector);
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
124
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
125 NETDEVTAB_ENTRY(edb7xxx_netdev,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
126 "edb7xxx",
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
127 edb7xxx_cs8900_init,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
128 &edb7xxx_sc);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
129
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
130 #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
131 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
132 #else
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
133 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
134 #endif
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
135
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
136 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
137 static cyg_interrupt cs8900_interrupt;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
138 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
139
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
140 // 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
141 static int
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
142 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
143 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
144 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
145 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
146 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
147
121
6bd9d475ed4b Merge from eCos master repository on 2000-09-04-20:50:20-BST
jlarmour
parents: 117
diff changeset
148 // The deliver function (ex-DSR) handles the ethernet [logical] processing
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
149 static void
121
6bd9d475ed4b Merge from eCos master repository on 2000-09-04-20:50:20-BST
jlarmour
parents: 117
diff changeset
150 cs8900_deliver(struct eth_drv_sc *sc)
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
151 {
121
6bd9d475ed4b Merge from eCos master repository on 2000-09-04-20:50:20-BST
jlarmour
parents: 117
diff changeset
152 cs8900_int(sc);
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
153 // Allow interrupts to happen again
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
154 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
155 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
156 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
157
117
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
158 static int
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
159 cs8900_int_vector(struct eth_drv_sc *sc)
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
160 {
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
161 return (CYGNUM_HAL_INTERRUPT_EINT3);
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
162 }
bd1a71e3e476 Merge from eCos master repository on 2000-08-25-19:22:58-BST
jlarmour
parents: 115
diff changeset
163
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
164 static bool
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
165 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
166 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
167 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
168 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
169 int i;
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 // Initialize environment, setup interrupt handler
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
172 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
173 99, // Priority - what goes here?
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
174 (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
175 (cyg_ISR_t *)cs8900_isr,
121
6bd9d475ed4b Merge from eCos master repository on 2000-09-04-20:50:20-BST
jlarmour
parents: 117
diff changeset
176 (cyg_DSR_t *)eth_drv_dsr, // The logical driver DSR
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
177 &cs8900_interrupt_handle,
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
178 &cs8900_interrupt);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
179 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
180 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
181 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
182
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
183 #ifdef INTS_DONT_WORK
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
184 cyg_thread_create(1, // Priority
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
185 cs8900_fake_int, // entry
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
186 0, // entry parameter
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
187 "CS8900 int", // Name
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
188 &cs8900_fake_int_stack[0], // Stack
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
189 STACK_SIZE, // Size
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
190 &cs8900_fake_int_thread_handle, // Handle
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
191 &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
192 );
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
193 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
194 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
195
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
196 chip_type = get_reg(PP_ChipID);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
197 chip_rev = get_reg(PP_ChipRev);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
198
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
199 #if 0
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
200 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
201 #endif
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
202
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
203 // Fetch hardware address
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
204 #if defined(CYGPKG_REDBOOT) && \
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
205 defined(CYGSEM_REDBOOT_FLASH_CONFIG) && \
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
206 !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
207 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
208 #else
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
209 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
210 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
211 enaddr[i] = esa_reg & 0xFF;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
212 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
213 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
214 #endif
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
215
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
216 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
217 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
218
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
219 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
220 #if 0
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
221 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
222 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
223 #endif
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
224
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
225 // Set up hardware address
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
226 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
227 put_reg(PP_LAF+i, 0xFFFF);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
228 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
229 }
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 // Initialize upper level driver
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
232 (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
233
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
234 return true;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
235 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
236
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
237 static void
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
238 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
239 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
240 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
241 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
242 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
243
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
244 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
245 // 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
246 // 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
247 // 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
248 // 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
249 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
250 static void
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
251 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
252 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
253 unsigned short stat;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
254 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
255 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
256 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
257 PP_RxCFG_RUNT | PP_RxCFG_EXTRA);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
258 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
259 PP_RxCTL_IA);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
260 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
261 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
262 PP_TxCFG_Jabber | PP_TxCFG_16Collisions);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
263 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
264 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
265 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
266 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
267 // 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
268 while ((stat = CS8900_ISQ) != 0) ;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
269 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
270 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
271
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
272 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
273 // 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
274 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
275 static int
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
276 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
277 void *data, int data_length)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
278 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
279 switch (key) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
280 case ETH_DRV_SET_MAC_ADDRESS:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
281 return 0;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
282 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
283 default:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
284 return 1;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
285 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
286 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
287 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
288
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
289 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
290 // 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
291 // 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
292 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
293 static int
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
294 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
295 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
296 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
297 unsigned short stat;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
298 stat = get_reg(PP_LineStat);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
299 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
300 return false; // Link not connected
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
301 }
126
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 121
diff changeset
302 #ifdef CYGPKG_NET
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 121
diff changeset
303 // Horrible hack!
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 121
diff changeset
304 if (cpd->txbusy > 0) {
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 121
diff changeset
305 cyg_tick_count_t now = cyg_current_time();
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 121
diff changeset
306 if ((now - cpd->txstart) > 25) {
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 121
diff changeset
307 // 250ms is more than enough to transmit one frame
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 121
diff changeset
308 diag_printf("CS8900: Tx interrupt lost\n");
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 121
diff changeset
309 cpd->txbusy = 0;
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 121
diff changeset
310 // Free up the buffer (with error indication)
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 121
diff changeset
311 (sc->funs->eth_drv->tx_done)(sc, cpd->txkey, 1);
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 121
diff changeset
312 }
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 121
diff changeset
313 }
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 121
diff changeset
314 #endif
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
315 return (cpd->txbusy == 0);
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
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
318 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
319 // 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
320 static void
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
321 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
322 int total_len, unsigned long key)
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
323 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
324 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
325 int i;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
326 int len;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
327 unsigned char *data;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
328 unsigned short saved_data = 0, *sdata;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
329 unsigned short stat;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
330 bool odd_byte = false;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
331
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
332 // Mark xmitter busy
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
333 cpd->txbusy = 1;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
334 cpd->txkey = key;
126
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 121
diff changeset
335 #ifdef CYGPKG_NET
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 121
diff changeset
336 cpd->txstart = cyg_current_time();
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 121
diff changeset
337 #endif
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
338 // Start the xmit sequence
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
339 // Note: this can go back once the 'dump' is removed
126
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 121
diff changeset
340 CS8900_TxCMD = PP_TxCmd_TxStart_5; // Start more-or-less immediately
518f42066aba Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents: 121
diff changeset
341 // CS8900_TxCMD = PP_TxCmd_TxStart_Full; // Start only when all data sent to chip
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
342 CS8900_TxLEN = total_len;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
343 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
344
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
345 // Put data into buffer
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
346 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
347 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
348 len = sg_list[i].len;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
349 if (len > 0) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
350 /* Finish the last word. */
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
351 if (odd_byte) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
352 saved_data |= (*data++ << 8);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
353 CS8900_RTDATA = saved_data;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
354 len--;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
355 odd_byte = false;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
356 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
357 /* Output contiguous words. */
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
358 sdata = (unsigned short *)data;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
359 while (len > 1) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
360 CS8900_RTDATA = *sdata++;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
361 len -= sizeof(unsigned short);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
362 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
363 /* Save last byte, if necessary. */
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
364 if (len == 1) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
365 data = (unsigned char *)sdata;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
366 saved_data = *data;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
367 odd_byte = true;
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 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
370 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
371 if (odd_byte) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
372 CS8900_RTDATA = saved_data;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
373 }
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
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
376 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
377 // 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
378 // 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
379 // 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
380 // 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
381 // '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
382 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
383 static void
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
384 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
385 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
386 unsigned short stat, len;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
387
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
388 stat = CS8900_RTDATA;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
389 len = CS8900_RTDATA;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
390 if (net_debug) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
391 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
392 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
393 (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
394 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
395
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
396 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
397 // 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
398 // 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
399 // 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
400 // 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
401 // 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
402 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
403 static void
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
404 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
405 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
406 int i, mlen;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
407 unsigned short *data, val;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
408 unsigned char *cp, cval;
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 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
411 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
412 mlen = sg_list[i].len;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
413 while (mlen >= sizeof(*data)) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
414 val = CS8900_RTDATA;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
415 if (data) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
416 *data++ = val;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
417 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
418 mlen -= sizeof(*data);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
419 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
420 if (mlen) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
421 // Fetch last odd byte
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
422 cval = CS8900_RTDATA & 0xFF;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
423 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
424 *cp = cval;
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 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
427 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
428 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
429
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
430 static void
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
431 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
432 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
433 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
434 stat = get_reg(PP_TER);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
435 if (net_debug) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
436 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
437 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
438 cpd->txbusy = 0;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 82
diff changeset
439 (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
440 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
441
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
442 static void
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
443 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
444 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
445 if (stat & PP_BufCFG_RxMiss) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
446 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
447 if (stat & PP_BufCFG_TxUE) {
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 static void
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
452 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
453 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
454 unsigned short event;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
455 while ((event = CS8900_ISQ) != 0) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
456 switch (event & ISQ_EventMask) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
457 case ISQ_RxEvent:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
458 cs8900_RxEvent(sc);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
459 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
460 case ISQ_TxEvent:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
461 cs8900_TxEvent(sc, event);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
462 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
463 case ISQ_BufEvent:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
464 cs8900_BufEvent(sc, event);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
465 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
466 case ISQ_RxMissEvent:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
467 // Receive miss counter has overflowed
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
468 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
469 case ISQ_TxColEvent:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
470 // Transmit collision counter has overflowed
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
471 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
472 default:
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
473 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
474 break;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
475 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
476 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
477 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
478
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
479 #ifdef INTS_DONT_WORK
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
480 void
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
481 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
482 {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
483 int s;
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
484 while (true) {
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
485 cyg_thread_delay(5);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
486 s = splnet();
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
487 cs8900_int(&edb7xxx_sc);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
488 splx(s);
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
489 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
490 }
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
491 #endif
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
492