annotate packages/devs/eth/amd/pcnet/current/src/if_pcnet.c @ 199:920b9b754b53

Merge from eCos master repository on 2001-12-15-12:00:33-GMT
author jlarmour
date Sat, 15 Dec 2001 13:42:19 +0000
parents ea3f0bd33a73
children 8147f1c99f15
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1 //==========================================================================
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
2 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
3 // dev/if_pcnet.c
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
4 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
5 // Ethernet device driver for AMD PCNET compatible controllers
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
6 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
7 //==========================================================================
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
8 //####COPYRIGHTBEGIN####
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
9 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
10 // -------------------------------------------
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
11 // The contents of this file are subject to the Red Hat eCos Public License
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
12 // Version 1.1 (the "License"); you may not use this file except in
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
14 // http://www.redhat.com/
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
15 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
18 // License for the specific language governing rights and limitations under
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
19 // the License.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
20 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
21 // The Original Code is eCos - Embedded Configurable Operating System,
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
22 // released September 30, 1998.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
23 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
24 // The Initial Developer of the Original Code is Red Hat.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
25 // Portions created by Red Hat are
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
26 // Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
27 // All Rights Reserved.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
28 // -------------------------------------------
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
29 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
30 //####COPYRIGHTEND####
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
31 //####BSDCOPYRIGHTBEGIN####
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
32 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
33 // -------------------------------------------
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
34 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
35 // Portions of this software may have been derived from OpenBSD or other sources,
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
36 // and are covered by the appropriate copyright disclaimers included herein.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
37 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
38 // -------------------------------------------
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
39 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
40 //####BSDCOPYRIGHTEND####
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
41 //==========================================================================
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
42 //#####DESCRIPTIONBEGIN####
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
43 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
44 // Author(s): jskov, based on lan91cxx driver by hmt & jskov
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
45 // Contributors: gthomas, jskov, hmt
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
46 // Date: 2001-04-02
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
47 // Purpose:
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
48 // Description: hardware driver for AMD PCNet (and possibly Lance) ethernet
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
49 // Notes: The controller is used in its 16bit mode. That means that
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
50 // all addresses are 24bit only - and that all controller
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
51 // accessed memory must be within the same 16MB region
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
52 // (starting at 0 on older controllers).
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
53 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
54 // The KEEP_STATISTICS code is not implemented yet. Look
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
55 // for FIXME macro.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
56 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
57 //####DESCRIPTIONEND####
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
58 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
59 //==========================================================================
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
60
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
61 #include <pkgconf/system.h>
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
62 #include <pkgconf/devs_eth_amd_pcnet.h>
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
63 #include <cyg/infra/cyg_type.h>
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
64 #include <cyg/hal/hal_arch.h>
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
65 #include <cyg/hal/hal_intr.h>
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
66 #include <cyg/infra/cyg_ass.h>
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
67 #include <cyg/infra/diag.h>
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
68 #include <cyg/hal/drv_api.h>
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
69 #include <cyg/hal/hal_if.h> // delays
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
70 #include <string.h>
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
71 #include <netdev.h>
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
72 #include <eth_drv.h>
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
73 #ifdef CYGPKG_NET
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
74 #include <pkgconf/net.h>
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
75 #include <cyg/kernel/kapi.h>
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
76 #include <net/if.h> /* Needed for struct ifnet */
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
77 #include <pkgconf/io_eth_drivers.h>
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
78 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
79 #include CYGHWR_MEMORY_LAYOUT_H
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
80
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
81 #ifdef CYGPKG_IO_PCI
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
82 #include <cyg/io/pci.h>
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
83 #else
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
84 #error "Need PCI package here"
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
85 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
86
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
87 #define FIXME 0
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
88
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
89 #define _BUF_SIZE 1544
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
90
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
91 #ifdef CYGPKG_INFRA_DEBUG
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
92 // Then we log, OOI, the number of times we get a bad packet number
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
93 // from the tx done fifo.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
94 int pcnet_txfifo_good = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
95 int pcnet_txfifo_bad = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
96 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
97
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
98 #include "amd_pcnet.h"
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
99 #define __WANT_DEVS
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
100 #include CYGDAT_DEVS_ETH_AMD_PCNET_INL
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
101 #undef __WANT_DEVS
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
102
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
103 #ifdef CYGPKG_REDBOOT
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
104
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
105 static void db_printf( char *fmt, ... )
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
106 {
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
107 extern int start_console(void);
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
108 extern void end_console(int);
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
109 va_list a;
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
110 int old_console;
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
111 va_start( a, fmt );
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
112 old_console = start_console();
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
113 diag_vprintf( fmt, a );
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
114 end_console(old_console);
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
115 va_end( a );
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
116 }
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
117
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
118 #else
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
119
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
120 #define db_printf diag_printf
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
121
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
122 #endif
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
123
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
124 static void pcnet_poll(struct eth_drv_sc *sc);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
125
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
126 // This ISR is called when the ethernet interrupt occurs
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
127 static cyg_uint32
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
128 pcnet_isr(cyg_vector_t vector, cyg_addrword_t data)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
129 {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
130 struct pcnet_priv_data *cpd = (struct pcnet_priv_data *)data;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
131
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
132 DEBUG_FUNCTION();
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
133
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
134 INCR_STAT( interrupts );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
135
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
136 cyg_drv_interrupt_mask(cpd->interrupt);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
137 cyg_drv_interrupt_acknowledge(cpd->interrupt);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
138 return (CYG_ISR_HANDLED|CYG_ISR_CALL_DSR); // Run the DSR
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
139 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
140
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
141 static void
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
142 pcnet_dsr(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
143 {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
144 // This conditioning out is necessary because of explicit calls to this
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
145 // DSR - which would not ever be called in the case of a polled mode
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
146 // usage ie. in RedBoot.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
147 #ifdef CYGPKG_IO_ETH_DRIVERS_NET
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
148 struct pcnet_priv_data* cpd = (struct pcnet_priv_data *)data;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
149 struct cyg_netdevtab_entry *ndp = (struct cyg_netdevtab_entry *)(cpd->ndp);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
150 struct eth_drv_sc *sc = (struct eth_drv_sc *)(ndp->device_instance);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
151
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
152 // but here, it must be a *sc:
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
153 eth_drv_dsr( vector, count, (cyg_addrword_t)sc );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
154 #else
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
155 # ifndef CYGPKG_REDBOOT
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
156 # error Empty PCnet ethernet DSR is compiled. Is this what you want?
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
157 # endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
158 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
159 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
160
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
161
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
162 // The deliver function (ex-DSR) handles the ethernet [logical] processing
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
163 static void
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
164 pcnet_deliver(struct eth_drv_sc *sc)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
165 {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
166 struct pcnet_priv_data *cpd =
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
167 (struct pcnet_priv_data *)sc->driver_private;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
168
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
169 DEBUG_FUNCTION();
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
170
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
171 // Service the interrupt:
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
172 pcnet_poll(sc);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
173 // Allow interrupts to happen again
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
174 cyg_drv_interrupt_unmask(cpd->interrupt);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
175 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
176
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
177 static int
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
178 pcnet_int_vector(struct eth_drv_sc *sc)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
179 {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
180 struct pcnet_priv_data *cpd =
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
181 (struct pcnet_priv_data *)sc->driver_private;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
183 return (cpd->interrupt);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
184 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
185
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
186 // ------------------------------------------------------------------------
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
187 // Memory management
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
188 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
189 // Simply carve off from the front of the PCI mapped window into real memory
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
190 static cyg_uint32 pcnet_heap_size;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
191 static cyg_uint8 *pcnet_heap_base;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
192 static cyg_uint8 *pcnet_heap_free;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
193
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
194 static void*
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
195 pciwindow_mem_alloc(int size)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
196 {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
197 void *p_memory;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
198 int _size = size;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
199
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
200 CYG_ASSERT(
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
201 (CYGHWR_AMD_PCNET_PCI_MEM_MAP_BASE <= (int)pcnet_heap_free)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
202 &&
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
203 ((CYGHWR_AMD_PCNET_PCI_MEM_MAP_BASE +
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
204 CYGHWR_AMD_PCNET_PCI_MEM_MAP_SIZE) > (int)pcnet_heap_free)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
205 &&
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
206 (0 < pcnet_heap_size)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
207 &&
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
208 (CYGHWR_AMD_PCNET_PCI_MEM_MAP_SIZE >= pcnet_heap_size)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
209 &&
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
210 (CYGHWR_AMD_PCNET_PCI_MEM_MAP_BASE == (int)pcnet_heap_base),
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
211 "Heap variables corrupted" );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
212
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
213 p_memory = (void *)0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
214 size = (size + 3) & ~3;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
215 if ( (pcnet_heap_free+size) < (pcnet_heap_base+pcnet_heap_size) ) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
216 cyg_uint32 *p;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
217 p_memory = (void *)pcnet_heap_free;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
218 pcnet_heap_free += size;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
219 for ( p = (cyg_uint32 *)p_memory; _size > 0; _size -= 4 )
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
220 *p++ = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
221 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
222
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
223 #if DEBUG & 9
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
224 db_printf("Allocated %d bytes at 0x%08x\n", size, p_memory);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
225 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
226
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
227 return p_memory;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
228 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
229
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
230 static cyg_pci_match_func find_pcnet_match_func;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
231
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
232 static cyg_bool
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
233 find_pcnet_match_func( cyg_uint16 v, cyg_uint16 d, cyg_uint32 c, void *p )
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
234 {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
235 #if DEBUG & 9
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
236 db_printf("PCI match vendor 0x%04x device 0x%04x\n", v, d);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
237 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
238 return (0x1022 == v) && (0x2000 == d);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
239 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
240
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
241 static int
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
242 pci_init_find_pcnet( void )
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
243 {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
244 cyg_pci_device_id devid;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
245 cyg_pci_device dev_info;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
246 cyg_uint16 cmd;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
247 int device_index;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
248 int found_devices = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
249
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
250 DEBUG_FUNCTION();
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
251
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
252 #ifdef CYGARC_UNCACHED_ADDRESS
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
253 CYG_ASSERT( CYGARC_UNCACHED_ADDRESS((CYG_ADDRWORD)CYGMEM_SECTION_pci_window) ==
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
254 CYGHWR_AMD_PCNET_PCI_MEM_MAP_BASE,
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
255 "PCI window configured does not match PCI memory section base" );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
256 #else
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
257 CYG_ASSERT( (CYG_ADDRWORD)CYGMEM_SECTION_pci_window ==
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
258 CYGHWR_AMD_PCNET_PCI_MEM_MAP_BASE,
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
259 "PCI window configured does not match PCI memory section base" );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
260 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
261 CYG_ASSERT( CYGMEM_SECTION_pci_window_SIZE ==
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
262 CYGHWR_AMD_PCNET_PCI_MEM_MAP_SIZE,
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
263 "PCI window configured does not match PCI memory section size" );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
264
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
265 if (
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
266 #ifdef CYGARC_UNCACHED_ADDRESS
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
267 CYGARC_UNCACHED_ADDRESS((CYG_ADDRWORD)CYGMEM_SECTION_pci_window) !=
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
268 #else
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
269 (CYG_ADDRWORD)CYGMEM_SECTION_pci_window !=
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
270 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
271 CYGHWR_AMD_PCNET_PCI_MEM_MAP_BASE
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
272 ||
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
273 CYGMEM_SECTION_pci_window_SIZE !=
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
274 CYGHWR_AMD_PCNET_PCI_MEM_MAP_SIZE ) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
275 #if DEBUG & 8
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
276 db_printf("pci_init_find_pcnets(): PCI window misconfigured\n");
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
277 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
278 return 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
279 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
280
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
281 // First initialize the heap in PCI window'd memory
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
282 pcnet_heap_size = CYGHWR_AMD_PCNET_PCI_MEM_MAP_SIZE;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
283 pcnet_heap_base = (cyg_uint8 *)CYGHWR_AMD_PCNET_PCI_MEM_MAP_BASE;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
284 pcnet_heap_free = pcnet_heap_base;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
285 #if DEBUG & 9
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
286 db_printf("pcimem : 0x%08x size: 0x%08x\n", pcnet_heap_base, pcnet_heap_size);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
287 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
288
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
289 cyg_pci_init();
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
290 #if DEBUG & 8
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
291 db_printf("Finished cyg_pci_init();\n");
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
292 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
293
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
294 devid = CYG_PCI_NULL_DEVID;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
295
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
296 for (device_index = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
297 device_index < CYGNUM_DEVS_ETH_AMD_PCNET_DEV_COUNT;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
298 device_index++) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
299 struct pcnet_priv_data* cpd = pcnet_priv_array[device_index];
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
300
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
301 cpd->index = device_index;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
302
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
303 // See above for find_pcnet_match_func - it selects any of several
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
304 // variants. This is necessary in case we have multiple mixed-type
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
305 // devices on one board in arbitrary orders.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
306 if (cyg_pci_find_matching( &find_pcnet_match_func, NULL, &devid )) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
307 #if DEBUG & 8
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
308 db_printf("eth%d = pcnet\n", device_index);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
309 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
310 cyg_pci_get_device_info(devid, &dev_info);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
311
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
312 cpd->interrupt_handle = 0; // Flag not attached.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
313 if (cyg_pci_translate_interrupt(&dev_info, &cpd->interrupt)) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
314 #if DEBUG & 8
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
315 db_printf(" Wired to HAL vector %d\n", cpd->interrupt);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
316 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
317 cyg_drv_interrupt_create(
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
318 cpd->interrupt,
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
319 1, // Priority - unused
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
320 (cyg_addrword_t)cpd,// Data item passed to ISR & DSR
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
321 pcnet_isr, // ISR
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
322 pcnet_dsr, // DSR
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
323 &cpd->interrupt_handle, // handle to intr obj
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
324 &cpd->interrupt_object ); // space for int obj
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
325
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
326 cyg_drv_interrupt_attach(cpd->interrupt_handle);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
327
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
328 // Don't unmask the interrupt yet, that could get us into a
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
329 // race.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
330 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
331 else {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
332 cpd->interrupt = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
333 #if DEBUG & 8
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
334 db_printf(" Does not generate interrupts.\n");
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
335 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
336 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
337
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
338 if (cyg_pci_configure_device(&dev_info)) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
339 #if DEBUG & 8
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
340 int i;
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
341 db_printf("Found device on bus %d, devfn 0x%02x:\n",
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
342 CYG_PCI_DEV_GET_BUS(devid),
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
343 CYG_PCI_DEV_GET_DEVFN(devid));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
344
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
345 if (dev_info.command & CYG_PCI_CFG_COMMAND_ACTIVE) {
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
346 db_printf(" Note that board is active. Probed"
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
347 " sizes and CPU addresses invalid!\n");
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
348 }
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
349 db_printf(" Vendor 0x%04x", dev_info.vendor);
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
350 db_printf("\n Device 0x%04x", dev_info.device);
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
351 db_printf("\n Command 0x%04x, Status 0x%04x\n",
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
352 dev_info.command, dev_info.status);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
353
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
354 db_printf(" Class/Rev 0x%08x", dev_info.class_rev);
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
355 db_printf("\n Header 0x%02x\n", dev_info.header_type);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
356
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
357 db_printf(" SubVendor 0x%04x, Sub ID 0x%04x\n",
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
358 dev_info.header.normal.sub_vendor,
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
359 dev_info.header.normal.sub_id);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
360
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
361 for(i = 0; i < CYG_PCI_MAX_BAR; i++) {
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
362 db_printf(" BAR[%d] 0x%08x /", i, dev_info.base_address[i]);
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
363 db_printf(" probed size 0x%08x / CPU addr 0x%08x\n",
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
364 dev_info.base_size[i], dev_info.base_map[i]);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
365 }
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
366 db_printf(" eth%d configured\n", device_index);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
367 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
368 found_devices++;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
369 cpd->found = 1;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
370 cpd->active = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
371 cpd->devid = devid;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
372 cpd->base = (unsigned char*) dev_info.base_map[0];
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
373 #if DEBUG & 8
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
374 db_printf(" I/O address = 0x%08x\n", cpd->base);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
375 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
376
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
377 // Don't use cyg_pci_set_device_info since it clears
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
378 // some of the fields we want to print out below.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
379 cyg_pci_read_config_uint16(dev_info.devid,
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
380 CYG_PCI_CFG_COMMAND, &cmd);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
381 cmd |= (CYG_PCI_CFG_COMMAND_IO // enable I/O space
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
382 | CYG_PCI_CFG_COMMAND_MEMORY // enable memory space
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
383 | CYG_PCI_CFG_COMMAND_MASTER); // enable bus master
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
384 cyg_pci_write_config_uint16(dev_info.devid,
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
385 CYG_PCI_CFG_COMMAND, cmd);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
386
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
387 // This is the indicator for "uses an interrupt"
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
388 if (cpd->interrupt_handle != 0) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
389 cyg_drv_interrupt_acknowledge(cpd->interrupt);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
390 cyg_drv_interrupt_unmask(cpd->interrupt);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
391 #if DEBUG & 8
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
392 db_printf(" Enabled interrupt %d\n", cpd->interrupt);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
393 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
394 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
395 #if DEBUG & 8
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
396 db_printf(" **** Device enabled for I/O and Memory "
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
397 "and Bus Master\n");
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
398 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
399 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
400 else {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
401 cpd->found = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
402 cpd->active = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
403 #if DEBUG & 8
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
404 db_printf("Failed to configure device %d\n", device_index);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
405 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
406 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
407 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
408 else {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
409 cpd->found = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
410 cpd->active = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
411 #if DEBUG & 8
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
412 db_printf("eth%d not found\n", device_index);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
413 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
414 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
415 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
416
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
417 if (0 == found_devices)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
418 return 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
419
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
420 return 1;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
421 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
422
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
423
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
424 static bool
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
425 amd_pcnet_init(struct cyg_netdevtab_entry *tab)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
426 {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
427 static int initialized = 0; // only probe PCI et al *once*
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
428 struct eth_drv_sc *sc = (struct eth_drv_sc *)tab->device_instance;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
429 struct pcnet_priv_data *cpd =
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
430 (struct pcnet_priv_data *)sc->driver_private;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
431 cyg_uint16 val;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
432 cyg_uint32 b;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
433 cyg_uint8* p;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
434 cyg_uint8* d;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
435 cyg_uint8* init_table;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
436 int i;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
437
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
438 DEBUG_FUNCTION();
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
439
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
440
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
441 if ( 0 == initialized++ ) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
442 // then this is the first time ever:
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
443 if ( ! pci_init_find_pcnet() ) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
444 #if DEBUG & 8
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
445 db_printf( "pci_init_find_pcnet failed" );
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
446 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
447 return false;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
448 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
449 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
450
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
451 // If this device is not present, exit
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
452 if (0 == cpd->found)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
453 return 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
454
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
455 cpd->txbusy = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
456
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
457 #if DEBUG & 8
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
458 db_printf("PCNet at base 0x%08x, EEPROM key 0x%04x\n",
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
459 cpd->base, _SU16(cpd->base, PCNET_IO_ID));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
460 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
461
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
462 #if 0
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
463 // FIXME: Doesn't work with non-conforming EEPROMS
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
464 if (PCNET_IO_ID_KEY != _SU16(cpd->base, PCNET_IO_ID) ) {
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
465 db_printf("PCNet EPROM key not found\n");
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
466 return false;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
467 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
468 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
469
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
470 #if DEBUG & 9
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
471 db_printf("pcimem : %08x size: %08x\n", pcnet_heap_base, pcnet_heap_size);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
472 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
473
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
474 // Prepare ESA
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
475 if (!cpd->hardwired_esa) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
476 // Use the address from the serial EEPROM
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
477 p = cpd->base + PCNET_IO_EEPROM;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
478 for (i = 0; i < 6; i++)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
479 cpd->esa[i] = *p++;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
480 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
481 #if DEBUG & 9
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
482 db_printf("PCNET - %s ESA: %02x:%02x:%02x:%02x:%02x:%02x\n",
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
483 (cpd->hardwired_esa) ? "static" : "eeprom",
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
484 cpd->esa[0], cpd->esa[1], cpd->esa[2],
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
485 cpd->esa[3], cpd->esa[4], cpd->esa[5] );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
486 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
487
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
488 #if CYGSEM_DEVS_ETH_AMD_PCNET_FORCE_10MBPS
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
489 if (get_reg(sc,PCNET_ANR_AAR) & PCNET_ANR_AAR_100) {
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
490 cyg_uint16 anr;
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
491 int loop;
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
492
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
493 #if DEBUG & 9
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
494 db_printf("%s: Forcing 10Mbps negotiation\n", __FUNCTION__);
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
495 #endif
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
496 // adjust speed/duplex auto-negotiation mask to clear 100Mbps bits
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
497 anr = get_reg(sc,PCNET_ANR_AAR);
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
498 anr &= ~PCNET_ANR_AAR_100;
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
499 put_reg(sc,PCNET_ANR_AAR,anr);
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
500 // renegotiate
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
501 anr = get_reg(sc,PCNET_ANR_PHYCTRL);
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
502 anr |= PCNET_ANR_PHYCTRL_RENEGOTIATE;
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
503 put_reg(sc,PCNET_ANR_PHYCTRL,anr);
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
504 loop = 100000;
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
505 while (loop>0 && !(get_reg(sc,PCNET_ANR_PHYSTAT) & PCNET_ANR_PHYSTAT_AUTONEG_COMP))
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
506 loop--;
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
507 #if DEBUG & 9
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
508 db_printf("ANR0: %04x\n",get_reg(sc,PCNET_ANR_PHYCTRL));
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
509 db_printf("ANR1: %04x\n",get_reg(sc,PCNET_ANR_PHYSTAT));
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
510 db_printf("ANR4: %04x\n",get_reg(sc,PCNET_ANR_AAR));
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
511 #endif
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
512 }
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
513 #endif
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
514
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
515 // Prepare RX and TX rings
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
516 p = cpd->rx_ring = (cyg_uint8*) CYGARC_UNCACHED_ADDRESS((cyg_uint32)pciwindow_mem_alloc((1<<cpd->rx_ring_log_cnt)*PCNET_RD_SIZE));
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
517 memset(cpd->rx_ring,0,(1<<cpd->rx_ring_log_cnt)*PCNET_RD_SIZE);
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
518
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
519 d = cpd->rx_buffers = (cyg_uint8*) CYGARC_UNCACHED_ADDRESS((cyg_uint32)pciwindow_mem_alloc(_BUF_SIZE*cpd->rx_ring_cnt));
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
520 memset(cpd->rx_buffers,0,_BUF_SIZE*cpd->rx_ring_cnt);
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
521
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
522 for (i = 0; i < cpd->rx_ring_cnt; i++) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
523 HAL_PCI_CPU_TO_BUS(d, b);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
524 _SU32(p, PCNET_RD_PTR) = (b & PCNET_RD_PTR_MASK) | PCNET_RD_PTR_OWN;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
525 _SU16(p, PCNET_RD_BLEN) = (-_BUF_SIZE);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
526 p += PCNET_RD_SIZE;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
527 d += _BUF_SIZE;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
528 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
529 cpd->rx_ring_next = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
530
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
531 p = cpd->tx_ring = (cyg_uint8*) CYGARC_UNCACHED_ADDRESS((cyg_uint32)pciwindow_mem_alloc((1<<cpd->tx_ring_log_cnt)*PCNET_TD_SIZE));
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
532 memset(cpd->tx_ring,0,(1<<cpd->tx_ring_log_cnt)*PCNET_TD_SIZE);
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 182
diff changeset
533
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
534 d = cpd->tx_buffers = (cyg_uint8*) CYGARC_UNCACHED_ADDRESS((cyg_uint32)pciwindow_mem_alloc(_BUF_SIZE*cpd->tx_ring_cnt));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
535 for (i = 0; i < cpd->tx_ring_cnt; i++) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
536 HAL_PCI_CPU_TO_BUS(d, b);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
537 _SU32(p, PCNET_RD_PTR) = b & PCNET_TD_PTR_MASK;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
538 p += PCNET_TD_SIZE;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
539 d += _BUF_SIZE;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
540 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
541 cpd->tx_ring_free = cpd->tx_ring_alloc = cpd->tx_ring_owned = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
542
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
543 // Initialization table
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
544 init_table = (cyg_uint8*)CYGARC_UNCACHED_ADDRESS((cyg_uint32)pciwindow_mem_alloc(PCNET_IB_SIZE));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
545 _SU16(init_table, PCNET_IB_MODE) = 0x0000;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
546 for (i = 0; i < 6; i++)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
547 _SU8(init_table, PCNET_IB_PADR0+i) = cpd->esa[i];
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
548 for (i = 0; i < 8; i++)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
549 _SU8(init_table, PCNET_IB_LADRF0+i) = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
550
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
551 HAL_PCI_CPU_TO_BUS(cpd->rx_ring, b);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
552 _SU32(init_table, PCNET_IB_RDRA) = ((b & PCNET_IB_RDRA_PTR_mask)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
553 | (cpd->rx_ring_log_cnt << PCNET_IB_RDRA_CNT_shift));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
554 HAL_PCI_CPU_TO_BUS(cpd->tx_ring, b);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
555 _SU32(init_table, PCNET_IB_TDRA) = ((b & PCNET_IB_TDRA_PTR_mask)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
556 | (cpd->tx_ring_log_cnt << PCNET_IB_TDRA_CNT_shift));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
557
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
558 #if DEBUG & 9
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
559 db_printf("Loading up PCNet controller from table at 0x%08x\n", init_table);
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
560 db_printf(" Mode 0x%04x\n", _SU16(init_table, PCNET_IB_MODE));
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
561 db_printf(" PADR %02x:%02x:%02x:%02x:%02x:%02x ",
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
562 _SU8(init_table, PCNET_IB_PADR0+0), _SU8(init_table, PCNET_IB_PADR0+1),
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
563 _SU8(init_table, PCNET_IB_PADR0+2), _SU8(init_table, PCNET_IB_PADR0+3),
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
564 _SU8(init_table, PCNET_IB_PADR0+4), _SU8(init_table, PCNET_IB_PADR0+5));
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
565 db_printf("LADR %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
566 _SU8(init_table, PCNET_IB_LADRF0+0), _SU8(init_table, PCNET_IB_LADRF0+1),
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
567 _SU8(init_table, PCNET_IB_LADRF0+2), _SU8(init_table, PCNET_IB_LADRF0+3),
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
568 _SU8(init_table, PCNET_IB_LADRF0+4), _SU8(init_table, PCNET_IB_LADRF0+5),
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
569 _SU8(init_table, PCNET_IB_LADRF0+5), _SU8(init_table, PCNET_IB_LADRF0+7));
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
570 db_printf(" RX 0x%08x (len %d) TX 0x%08x (len %d)\n",
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
571 _SU32(init_table, PCNET_IB_RDRA) & 0x1fffffff,
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
572 (_SU32(init_table, PCNET_IB_RDRA) >> PCNET_IB_RDRA_CNT_shift) & 7,
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
573 _SU32(init_table, PCNET_IB_TDRA) & 0x1fffffff,
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
574 (_SU32(init_table, PCNET_IB_TDRA) >> PCNET_IB_TDRA_CNT_shift) & 7);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
575 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
576
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
577 // Reset chip
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
578 HAL_PCI_IO_READ_UINT16(cpd->base+PCNET_IO_RESET, val);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
579
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
580 // Load up chip with buffers.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
581 // Note: There is a 16M limit on the addresses used by the driver
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
582 // since the top 8 bits of the init_table address is appended to
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
583 // all other addresses used by the controller.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
584 HAL_PCI_CPU_TO_BUS(init_table, b);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
585 put_reg(sc, PCNET_CSR_IBA0, (b >> 0) & 0xffff);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
586 put_reg(sc, PCNET_CSR_IBA1, (b >> 16) & 0xffff);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
587 // Disable automatic TX polling (_send will force a poll), pad
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
588 // XT frames to legal length, mask status interrupts.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
589 put_reg(sc, PCNET_CSR_TFC, (PCNET_CSR_TFC_TXDPOLL | PCNET_CSR_TFC_APAD_XMT
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
590 | PCNET_CSR_TFC_MFCOM | PCNET_CSR_TFC_RCVCCOM
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
591 | PCNET_CSR_TFC_TXSTRTM));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
592 // Recover after TX FIFO underflow
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
593 put_reg(sc, PCNET_CSR_IM, PCNET_CSR_IM_DXSUFLO);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
594 // Initialize controller - load up init_table
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
595 put_reg(sc, PCNET_CSR_CSCR, PCNET_CSR_CSCR_INIT);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
596 while (0 == (get_reg(sc, PCNET_CSR_CSCR) & PCNET_CSR_CSCR_IDON));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
597
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
598 // Stop controller
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
599 put_reg(sc, PCNET_CSR_CSCR, PCNET_CSR_CSCR_STOP);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
600
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
601 #if DEBUG & 9
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
602 db_printf("PCNet controller state is now:\n");
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
603 db_printf(" Mode 0x%04x TFC 0x%04x\n", _SU16(init_table, PCNET_IB_MODE), get_reg(sc, PCNET_CSR_TFC));
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
604 db_printf(" PADR %04x:%04x:%04x ",
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
605 get_reg(sc, PCNET_CSR_PAR0),
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
606 get_reg(sc, PCNET_CSR_PAR1),
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
607 get_reg(sc, PCNET_CSR_PAR2));
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
608 db_printf("LADR %04x:%04x:%04x:%04x\n",
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
609 get_reg(sc, PCNET_CSR_LAR0),
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
610 get_reg(sc, PCNET_CSR_LAR1),
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
611 get_reg(sc, PCNET_CSR_LAR2),
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
612 get_reg(sc, PCNET_CSR_LAR3));
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
613 db_printf(" RX 0x%04x%04x (len 0x%04x) TX 0x%04x%04x (len 0x%04x)\n",
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
614 get_reg(sc, PCNET_CSR_BARRU), get_reg(sc, PCNET_CSR_BARRL),
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
615 get_reg(sc, PCNET_CSR_RRLEN),
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
616 get_reg(sc, PCNET_CSR_BATRU), get_reg(sc, PCNET_CSR_BATRL),
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
617 get_reg(sc, PCNET_CSR_TRLEN));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
618
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
619 val = get_reg(sc, PCNET_CSR_ID_LO);
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
620 db_printf("PCnet ID 0x%04x (%s) ",
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
621 val,
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
622 (0x5003 == val) ? "Am79C973" : (0x7003 == val) ? "Am79C975" : "Unknown");
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
623 val = get_reg(sc, PCNET_CSR_ID_HI);
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
624 db_printf("Part IDU 0x%03x Silicon rev %d\n",
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
625 val & 0x0fff, (val >> 12) & 0xf);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
626 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
627
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
628 // and record the net dev pointer
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
629 cpd->ndp = (void *)tab;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
630
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
631 // Start controller, but put it in suspended mode
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
632 put_reg(sc, PCNET_CSR_CSCR, PCNET_CSR_CSCR_STOP);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
633 put_reg(sc, PCNET_CSR_CSCR, (PCNET_CSR_CSCR_IENA | PCNET_CSR_CSCR_STRT));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
634 i = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
635 while (0 == (PCNET_CSR_CSCR_STRT & get_reg(sc, PCNET_CSR_CSCR))) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
636 CYGACC_CALL_IF_DELAY_US(1000);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
637 put_reg(sc, PCNET_CSR_CSCR, (PCNET_CSR_CSCR_IENA | PCNET_CSR_CSCR_STRT));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
638 if (i++ == 1000) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
639 #if DEBUG & 9
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
640 db_printf("Failed to start the controller\n");
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
641 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
642 return false;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
643 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
644 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
645
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
646 val = get_reg(sc, PCNET_CSR_ECI);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
647 val |= PCNET_CSR_ECI_SPND;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
648 put_reg(sc, PCNET_CSR_ECI, val);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
649 // Wait for device to suspend
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
650 do {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
651 val = get_reg(sc, PCNET_CSR_ECI);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
652 } while (0 == (val & PCNET_CSR_ECI_SPND));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
653 cpd->active = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
654
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
655 // Initialize upper level driver
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
656 (sc->funs->eth_drv->init)(sc, cpd->esa);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
657
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
658 #if DEBUG & 9
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
659 db_printf("Done\n");
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
660 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
661 return true;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
662 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
663
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
664 static void
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
665 pcnet_stop(struct eth_drv_sc *sc)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
666 {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
667 cyg_uint16 reg;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
668 struct pcnet_priv_data *cpd =
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
669 (struct pcnet_priv_data *)sc->driver_private;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
670
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
671 DEBUG_FUNCTION();
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
672
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
673 reg = get_reg(sc, PCNET_CSR_ECI);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
674 reg |= PCNET_CSR_ECI_SPND;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
675 put_reg(sc, PCNET_CSR_ECI, reg);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
676 // Wait for device to suspend
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
677 do {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
678 reg = get_reg(sc, PCNET_CSR_ECI);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
679 } while (0 == (reg & PCNET_CSR_ECI_SPND));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
680 cpd->active = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
681 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
682
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
683 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
684 // This function is called to "start up" the interface. It may be called
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
685 // multiple times, even when the hardware is already running. It will be
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
686 // called whenever something "hardware oriented" changes and should leave
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
687 // the hardware ready to send/receive packets.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
688 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
689 static void
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
690 pcnet_start(struct eth_drv_sc *sc, unsigned char *enaddr, int flags)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
691 {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
692 cyg_uint16 reg;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
693 struct pcnet_priv_data *cpd =
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
694 (struct pcnet_priv_data *)sc->driver_private;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
695 #ifdef CYGPKG_NET
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
696 struct ifnet *ifp = &sc->sc_arpcom.ac_if;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
697 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
698 DEBUG_FUNCTION();
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
699
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
700 // If device is already active, suspend it
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
701 if (cpd->active) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
702 reg = get_reg(sc, PCNET_CSR_ECI);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
703 reg |= PCNET_CSR_ECI_SPND;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
704 put_reg(sc, PCNET_CSR_ECI, reg);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
705 // Wait for device to suspend
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
706 do {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
707 reg = get_reg(sc, PCNET_CSR_ECI);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
708 } while (0 == (reg & PCNET_CSR_ECI_SPND));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
709 cpd->active = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
710 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
711
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
712 #ifdef CYGPKG_NET
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
713 if (( 0
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
714 #ifdef ETH_DRV_FLAGS_PROMISC_MODE
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
715 != (flags & ETH_DRV_FLAGS_PROMISC_MODE)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
716 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
717 ) || (ifp->if_flags & IFF_PROMISC)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
718 ) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
719 // Then we select promiscuous mode.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
720 cyg_uint16 rcr;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
721 rcr = get_reg(sc, PCNET_CSR_MODE );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
722 rcr |= PCNET_CSR_MODE_PROM;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
723 put_reg(sc, PCNET_CSR_MODE, rcr );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
724 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
725 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
726
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
727 // Unsuspend the device
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
728 reg = get_reg(sc, PCNET_CSR_ECI);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
729 reg &= ~PCNET_CSR_ECI_SPND;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
730 put_reg(sc, PCNET_CSR_ECI, reg);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
731 cpd->active = 1;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
732 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
733
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
734 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
735 // This routine is called to perform special "control" opertions
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
736 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
737 static int
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
738 pcnet_control(struct eth_drv_sc *sc, unsigned long key,
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
739 void *data, int data_length)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
740 {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
741 cyg_uint8 *esa = (cyg_uint8 *)data;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
742 int i, res;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
743 cyg_uint16 reg;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
744 struct pcnet_priv_data *cpd =
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
745 (struct pcnet_priv_data *)sc->driver_private;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
746 cyg_bool was_active = cpd->active;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
747
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
748 DEBUG_FUNCTION();
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
749
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
750 // If device is already active, suspend it
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
751 if (cpd->active) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
752 reg = get_reg(sc, PCNET_CSR_ECI);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
753 reg |= PCNET_CSR_ECI_SPND;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
754 put_reg(sc, PCNET_CSR_ECI, reg);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
755 // Wait for device to suspend
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
756 do {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
757 reg = get_reg(sc, PCNET_CSR_ECI);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
758 } while (0 == (reg & PCNET_CSR_ECI_SPND));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
759 cpd->active = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
760 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
761
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
762 res = 0; // expect success
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
763 switch (key) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
764 case ETH_DRV_SET_MAC_ADDRESS:
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
765 #if 9 & DEBUG
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
766 db_printf("PCNET - set ESA: %02x:%02x:%02x:%02x:%02x:%02x\n",
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
767 esa[0], esa[1], esa[2], esa[3], esa[4], esa[5] );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
768 #endif // DEBUG
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
769
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
770 for ( i = 0; i < sizeof(cpd->esa); i++ )
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
771 cpd->esa[i] = esa[i];
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
772 for (i = 0; i < sizeof(cpd->esa); i += 2) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
773 reg = cpd->esa[i] | (cpd->esa[i+1] << 8);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
774 put_reg(sc, PCNET_CSR_PAR0+i/2, reg );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
775 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
776 break;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
777
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
778 #ifdef ETH_DRV_GET_MAC_ADDRESS
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
779 case ETH_DRV_GET_MAC_ADDRESS:
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
780 // Extract the MAC address that is in the chip, and tell the
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
781 // system about it.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
782 for (i = 0; i < sizeof(cpd->esa); i += 2) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
783 cyg_uint16 z = get_reg(sc, PCNET_CSR_PAR0+i/2 );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
784 esa[i] = (cyg_uint8)(0xff & z);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
785 esa[i+1] = (cyg_uint8)(0xff & (z >> 8));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
786 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
787 break;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
788 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
789
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
790 #ifdef ETH_DRV_GET_IF_STATS_UD
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
791 case ETH_DRV_GET_IF_STATS_UD: // UD == UPDATE
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
792 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
793 // drop through
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
794 #ifdef ETH_DRV_GET_IF_STATS
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
795 case ETH_DRV_GET_IF_STATS:
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
796 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
797
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
798 #if defined(ETH_DRV_GET_IF_STATS) || defined (ETH_DRV_GET_IF_STATS_UD)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
799 {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
800 cyg_uint16 anr;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
801 struct ether_drv_stats *p = (struct ether_drv_stats *)data;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
802 // Chipset entry is no longer supported; RFC1573.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
803 for ( i = 0; i < SNMP_CHIPSET_LEN; i++ )
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
804 p->snmp_chipset[i] = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
805
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
806 // This perhaps should be a config opt, so you can make up your own
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
807 // description, or supply it from the instantiation.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
808 strcpy( p->description, "AMD PCNet" );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
809 // CYG_ASSERT( 48 > strlen(p->description), "Description too long" );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
810
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
811 anr = get_reg(sc, PCNET_ANR_PHYSTAT);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
812 if ((anr & PCNET_ANR_PHYSTAT_LINK) == 0) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
813 p->operational = 2; // LINK DOWN
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
814 p->duplex = 1; // UNKNOWN
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
815 p->speed = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
816 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
817 else {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
818 p->operational = 3; // LINK UP
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
819 anr = get_reg(sc, PCNET_ANR_PHYCTRL);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
820
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
821 if (anr & PCNET_ANR_PHYCTRL_DUPLEX)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
822 p->duplex = 3; // 3 = DUPLEX
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
823 else
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
824 p->duplex = 2; // 2 = SIMPLEX
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
825 p->speed = (anr & PCNET_ANR_PHYCTRL_100MBPS) ? 100 * 1000000 : 10 * 1000000;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
826 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
827
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
828 #if FIXME
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
829 #ifdef KEEP_STATISTICS
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
830 {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
831 struct amd_pcnet_stats *ps = &(cpd->stats);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
832
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
833 // Admit to it...
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
834 p->supports_dot3 = true;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
835
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
836 p->tx_good = ps->tx_good ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
837 p->tx_max_collisions = ps->tx_max_collisions ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
838 p->tx_late_collisions = ps->tx_late_collisions ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
839 p->tx_underrun = ps->tx_underrun ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
840 p->tx_carrier_loss = ps->tx_carrier_loss ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
841 p->tx_deferred = ps->tx_deferred ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
842 p->tx_sqetesterrors = ps->tx_sqetesterrors ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
843 p->tx_single_collisions = ps->tx_single_collisions;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
844 p->tx_mult_collisions = ps->tx_mult_collisions ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
845 p->tx_total_collisions = ps->tx_total_collisions ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
846 p->rx_good = ps->rx_good ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
847 p->rx_crc_errors = ps->rx_crc_errors ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
848 p->rx_align_errors = ps->rx_align_errors ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
849 p->rx_resource_errors = ps->rx_resource_errors ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
850 p->rx_overrun_errors = ps->rx_overrun_errors ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
851 p->rx_collisions = ps->rx_collisions ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
852 p->rx_short_frames = ps->rx_short_frames ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
853 p->rx_too_long_frames = ps->rx_too_long_frames ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
854 p->rx_symbol_errors = ps->rx_symbol_errors ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
855
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
856 p->interrupts = ps->interrupts ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
857 p->rx_count = ps->rx_count ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
858 p->rx_deliver = ps->rx_deliver ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
859 p->rx_resource = ps->rx_resource ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
860 p->rx_restart = ps->rx_restart ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
861 p->tx_count = ps->tx_count ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
862 p->tx_complete = ps->tx_complete ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
863 p->tx_dropped = ps->tx_dropped ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
864 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
865 #endif // KEEP_STATISTICS
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
866 #endif // FIXME
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
867
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
868 p->tx_queue_len = 1;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
869 break;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
870 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
871 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
872 default:
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
873 res = 1;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
874 break;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
875 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
876
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
877 // Restore controller state
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
878 if (was_active) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
879 // Unsuspend the device
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
880 reg = get_reg(sc, PCNET_CSR_ECI);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
881 reg &= ~PCNET_CSR_ECI_SPND;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
882 put_reg(sc, PCNET_CSR_ECI, reg);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
883 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
884
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
885 return res;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
886 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
887
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
888 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
889 // This routine is called to see if it is possible to send another packet.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
890 // It will return non-zero if a transmit is possible, zero otherwise.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
891 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
892 static int
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
893 pcnet_can_send(struct eth_drv_sc *sc)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
894 {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
895 struct pcnet_priv_data *cpd =
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
896 (struct pcnet_priv_data *)sc->driver_private;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
897 cyg_uint16 stat;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
898
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
899 DEBUG_FUNCTION();
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
900
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
901 stat = get_reg(sc, PCNET_ANR_PHYSTAT);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
902 if ((stat & PCNET_ANR_PHYSTAT_LINK) == 0) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
903 return 0; // Link not connected
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
904 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
905
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
906 return (0 == cpd->txbusy);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
907 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
908
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
909 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
910 // This routine is called to send data to the hardware.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
911 static void
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
912 pcnet_send(struct eth_drv_sc *sc, struct eth_drv_sg *sg_list, int sg_len,
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
913 int total_len, unsigned long key)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
914 {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
915 struct pcnet_priv_data *cpd =
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
916 (struct pcnet_priv_data *)sc->driver_private;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
917 int i, len, plen, ring_entry;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
918
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
919 cyg_uint8* sdata = NULL;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
920 cyg_uint8 *d, *buf, *txd;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
921 cyg_uint16 ints;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
922 cyg_uint32 b;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
923
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
924 DEBUG_FUNCTION();
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
925
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
926 INCR_STAT( tx_count );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
927
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
928 cpd->txbusy = 1;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
929 cpd->txkey = key;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
930
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
931 // Find packet length
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
932 plen = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
933 for (i = 0; i < sg_len; i++)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
934 plen += sg_list[i].len;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
935
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
936 CYG_ASSERT( plen == total_len, "sg data length mismatch" );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
937
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
938 // Get next TX descriptor
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
939 ring_entry = cpd->tx_ring_free;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
940 do {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
941 if (cpd->tx_ring_owned == cpd->tx_ring_cnt) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
942 // Is this a dead end? Probably is.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
943 #if DEBUG & 1
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
944 db_printf("%s: Allocation failed! Retrying...\n", __FUNCTION__ );
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
945 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
946 continue;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
947 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
948
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
949 cpd->tx_ring_free++;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
950 cpd->tx_ring_owned++;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
951 if (cpd->tx_ring_free == cpd->tx_ring_cnt)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
952 cpd->tx_ring_free = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
953 } while (0);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
954
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
955 txd = cpd->tx_ring + ring_entry*PCNET_TD_SIZE;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
956 buf = cpd->tx_buffers + ring_entry*_BUF_SIZE;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
957 CYG_ASSERT(0 == (_SU32(txd, PCNET_TD_PTR) & PCNET_TD_PTR_OWN),
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
958 "TX descriptor not free");
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
959
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
960 #if DEBUG & 4
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
961 db_printf("#####Tx descriptor 0x%08x buffer 0x%08x\n",
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
962 txd, buf);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
963 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
964
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
965 // Put data into buffer
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
966 d = buf;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
967 for (i = 0; i < sg_len; i++) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
968 sdata = (cyg_uint8 *)sg_list[i].buf;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
969 len = sg_list[i].len;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
970
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
971 CYG_ASSERT( sdata, "No sg data pointer here" );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
972 while(len--)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
973 *d++ = *sdata++;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
974 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
975 CYG_ASSERT( sdata, "No sg data pointer outside" );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
976
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
977 #if DEBUG & 1
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
978 db_printf("CSCR %04x\n", get_reg(sc, PCNET_CSR_CSCR));
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
979 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
980 _SU16(txd, PCNET_TD_LEN) = (-plen);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
981 _SU16(txd, PCNET_TD_MISC) = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
982 HAL_PCI_CPU_TO_BUS(buf, b);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
983 _SU32(txd, PCNET_TD_PTR) = ((b & PCNET_TD_PTR_MASK)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
984 | PCNET_TD_PTR_OWN | PCNET_TD_PTR_STP | PCNET_TD_PTR_ENP);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
985
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
986 #if DEBUG & 1
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
987 cpd->txd = txd;
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
988 db_printf("Last TX: LEN %04x MISC %04x PTR %08x\n",
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
989 _SU16(cpd->txd, PCNET_TD_LEN),
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
990 _SU16(cpd->txd, PCNET_TD_MISC),
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
991 _SU32(cpd->txd, PCNET_TD_PTR));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
992 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
993
199
920b9b754b53 Merge from eCos master repository on 2001-12-15-12:00:33-GMT
jlarmour
parents: 198
diff changeset
994 // This delay seems to be necessary on some platforms
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
995 // Why it is needed is not clear, but removing it or
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
996 // reducing it cause transmission failures in RedBoot (at least).
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
997 CYGACC_CALL_IF_DELAY_US(100);
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
998
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
999
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1000 // Set transmit demand
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1001 ints = get_reg(sc, PCNET_CSR_CSCR);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1002 ints &= PCNET_CSR_CSCR_EV_MASK;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1003 ints |= PCNET_CSR_CSCR_TDMD;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1004 put_reg(sc, PCNET_CSR_CSCR, ints);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1005
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1006 #if DEBUG & 1
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1007 ints = get_reg(sc, PCNET_CSR_CSCR);
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
1008 db_printf("%s:END: ints at TX: 0x%04x\n", __FUNCTION__, ints);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1009 #endif
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
1010
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
1011 // This is another mystery delay like the one above. This one is
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
1012 // even stranger, since waiting here at the _end_ of the function
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
1013 // should have no effect.
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
1014 CYGACC_CALL_IF_DELAY_US(200);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1015 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1016
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1017 static void
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1018 pcnet_TxEvent(struct eth_drv_sc *sc, int stat)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1019 {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1020 struct pcnet_priv_data *cpd =
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1021 (struct pcnet_priv_data *)sc->driver_private;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1022 int success = 1;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1023 cyg_uint8 *txd;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1024 cyg_uint16 ints;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1025 cyg_uint32 pkt_stat;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1026
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1027 DEBUG_FUNCTION();
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1028
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1029 INCR_STAT( tx_complete );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1030
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1031 txd = cpd->tx_ring + cpd->tx_ring_alloc*PCNET_TD_SIZE;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1032 pkt_stat = _SU32(txd, PCNET_TD_PTR);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1033 if (pkt_stat & PCNET_TD_PTR_OWN) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1034 #if DEBUG & 1
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
1035 db_printf("%s: got TX completion when buffer is still owned\n", __FUNCTION__);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1036 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1037 // first dirty ring entry not freed - wtf?
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1038 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1039
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1040 if (pkt_stat & PCNET_TD_PTR_ERR) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1041 // We had an error. Tell the stack.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1042 success = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1043 #if DEBUG & 1
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
1044 db_printf("%s: TX failure, retrying...\n", __FUNCTION__);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1045 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1046 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1047
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1048 cpd->tx_ring_alloc++;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1049 if (cpd->tx_ring_alloc == cpd->tx_ring_cnt)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1050 cpd->tx_ring_alloc = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1051 cpd->tx_ring_owned--;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1052
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1053 #if FIXME
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1054 #ifdef KEEP_STATISTICS
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1055 {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1056 cyg_uint16 reg;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1057
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1058 reg = get_reg( sc, PCNET_CSR_CSCR );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1059
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1060 // Covering each bit in turn...
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1061 if ( reg & PCNET_STATUS_TX_UNRN ) INCR_STAT( tx_underrun );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1062 //if ( reg & PCNET_STATUS_LINK_OK ) INCR_STAT( );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1063 //if ( reg & PCNET_STATUS_CTR_ROL ) INCR_STAT( );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1064 //if ( reg & PCNET_STATUS_EXC_DEF ) INCR_STAT( );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1065 if ( reg & PCNET_STATUS_LOST_CARR ) INCR_STAT( tx_carrier_loss );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1066 if ( reg & PCNET_STATUS_LATCOL ) INCR_STAT( tx_late_collisions );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1067 //if ( reg & PCNET_STATUS_WAKEUP ) INCR_STAT( );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1068 if ( reg & PCNET_STATUS_TX_DEFR ) INCR_STAT( tx_deferred );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1069 //if ( reg & PCNET_STATUS_LTX_BRD ) INCR_STAT( );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1070 if ( reg & PCNET_STATUS_SQET ) INCR_STAT( tx_sqetesterrors );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1071 if ( reg & PCNET_STATUS_16COL ) INCR_STAT( tx_max_collisions );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1072 //if ( reg & PCNET_STATUS_LTX_MULT) INCR_STAT( );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1073 if ( reg & PCNET_STATUS_MUL_COL ) INCR_STAT( tx_mult_collisions );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1074 if ( reg & PCNET_STATUS_SNGL_COL ) INCR_STAT( tx_single_collisions );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1075 if ( reg & PCNET_STATUS_TX_SUC ) INCR_STAT( tx_good );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1076
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1077 cpd->stats.tx_total_collisions =
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1078 cpd->stats.tx_late_collisions +
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1079 cpd->stats.tx_max_collisions +
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1080 cpd->stats.tx_mult_collisions +
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1081 cpd->stats.tx_single_collisions;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1082
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1083 // We do not need to look in the Counter Register (PCNET_COUNTER)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1084 // because it just mimics the info we already have above.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1085 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1086 #endif // KEEP_STATISTICS
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1087 #endif // FIXME
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1088
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1089 // Ack the TX int which clears the packet from the TX completion
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1090 // queue.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1091 ints = get_reg(sc, PCNET_CSR_CSCR);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1092 ints |= PCNET_CSR_CSCR_TINT;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1093 put_reg(sc, PCNET_CSR_CSCR, ints);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1094
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1095 #if DEBUG & 4
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
1096 db_printf("#####Tx packet freed 0x%08x\n", txd );
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1097 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1098
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1099 if ( cpd->txbusy ) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1100 cpd->txbusy = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1101 (sc->funs->eth_drv->tx_done)(sc, cpd->txkey, success);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1102 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1103 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1104
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1105
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1106 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1107 // This function is called when a packet has been received. Its job is
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1108 // to prepare to unload the packet from the hardware. Once the length of
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1109 // the packet is known, the upper layer of the driver can be told. When
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1110 // the upper layer is ready to unload the packet, the internal function
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1111 // 'pcnet_recv' will be called to actually fetch it from the hardware.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1112 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1113 static void
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1114 pcnet_RxEvent(struct eth_drv_sc *sc)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1115 {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1116 struct pcnet_priv_data *cpd =
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1117 (struct pcnet_priv_data *)sc->driver_private;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1118 cyg_uint8 *rxd;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1119 cyg_uint32 rstat;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1120 cyg_uint16 ints, len;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1121
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1122 DEBUG_FUNCTION();
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1123
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1124 ints = get_reg(sc, PCNET_CSR_CSCR);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1125 #if DEBUG & 1
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
1126 db_printf("RxEvent - CSR: 0x%04x\n", ints);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1127 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1128
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1129 while (1) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1130 // Get state of next (supposedly) full ring entry
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1131 cpd->rxpacket = cpd->rx_ring_next;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1132 rxd = cpd->rx_ring + cpd->rxpacket*PCNET_RD_SIZE;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1133 rstat = _SU32(rxd, PCNET_RD_PTR);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1134
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1135 // Keep going until we hit an entry that is owned by the
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1136 // controller.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1137 if (rstat & PCNET_RD_PTR_OWN) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1138 #if DEBUG & 1
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1139 int i;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1140 for (i = 0; i < cpd->rx_ring_cnt; i++) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1141 rxd = cpd->rx_ring + i*PCNET_RD_SIZE;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1142 rstat = _SU32(rxd, PCNET_RD_PTR);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1143
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1144 if (!(rstat & PCNET_RD_PTR_OWN)) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1145 int i;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1146 cyg_uint32 rstat;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1147 cyg_uint16 mlen, blen;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1148 cyg_uint8* rxd;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1149
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
1150 db_printf("%s: Inconsistent RX state\n", __FUNCTION__);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1151 for (i = 0; i < cpd->rx_ring_cnt; i++) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1152 rxd = cpd->rx_ring + i*PCNET_RD_SIZE;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1153
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1154 rstat = _SU32(rxd, PCNET_RD_PTR);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1155 blen = _SU16(rxd, PCNET_RD_BLEN);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1156 mlen = _SU16(rxd, PCNET_RD_MLEN);
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
1157 db_printf(" %02d: 0x%08x:0x%04x:0x%04x\n", i, rstat, blen, mlen);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1158 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1159 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1160 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1161 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1162 break;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1163 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1164
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1165 #if DEBUG & 4
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
1166 db_printf("#####Rx packet at index %d\n", cpd->rxpacket);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1167 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1168
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1169 // Increment counts
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1170 INCR_STAT( rx_count );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1171 cpd->rx_ring_next++;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1172 if (cpd->rx_ring_next == cpd->rx_ring_cnt) cpd->rx_ring_next = 0;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1173
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1174 len = _SU16(rxd, PCNET_RD_MLEN);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1175
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1176 #ifdef KEEP_STATISTICS
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1177 //if ( rstat & PCNET_RD_PTR_FRAM ) INCR_STAT( rx_frame_errors );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1178 //if ( rstat & PCNET_RD_PTR_OFLO ) INCR_STAT( );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1179 if ( rstat & PCNET_RD_PTR_CRC ) INCR_STAT( rx_crc_errors );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1180 //if ( rstat & PCNET_RD_PTR_BUFF ) INCR_STAT( );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1181 #endif // KEEP_STATISTICS
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1183 if (0 == (rstat & PCNET_RD_PTR_ERR)) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1184 // It's OK
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1185 INCR_STAT( rx_good );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1186
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1187 #if DEBUG & 1
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
1188 db_printf("RxEvent good rx - stat: 0x%08x, len: 0x%04x\n", rstat, len);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1189 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1190 // Check for bogusly short packets; can happen in promisc
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1191 // mode: Asserted against and checked by upper layer
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1192 // driver.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1193 #ifdef CYGPKG_NET
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1194 if ( len > sizeof( struct ether_header ) )
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1195 // then it is acceptable; offer the data to the network stack
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1196 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1197 (sc->funs->eth_drv->recv)(sc, len);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1198 } else {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1199 // Not OK for one reason or another...
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1200 #if DEBUG & 1
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
1201 db_printf("RxEvent - No RX bit: stat: 0x%08x, len: 0x%04x\n",
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1202 rstat, len);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1203 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1204 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1205
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1206 // Free packet (clear all status flags, and set OWN)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1207 _SU32(rxd, PCNET_RD_PTR) &= PCNET_RD_PTR_MASK;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1208 _SU32(rxd, PCNET_RD_PTR) |= PCNET_RD_PTR_OWN;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1209 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1210
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1211 // Ack RX interrupt set
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1212 ints = get_reg(sc, PCNET_CSR_CSCR);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1213 ints &= PCNET_CSR_CSCR_EV_MASK;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1214 ints |= PCNET_CSR_CSCR_RINT;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1215 put_reg(sc, PCNET_CSR_CSCR, ints);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1216 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1217
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1218 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1219 // This function is called as a result of the "eth_drv_recv()" call above.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1220 // Its job is to actually fetch data for a packet from the hardware once
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1221 // memory buffers have been allocated for the packet. Note that the buffers
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1222 // may come in pieces, using a scatter-gather list. This allows for more
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1223 // efficient processing in the upper layers of the stack.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1224 //
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1225 static void
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1226 pcnet_recv(struct eth_drv_sc *sc, struct eth_drv_sg *sg_list, int sg_len)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1227 {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1228 struct pcnet_priv_data *cpd =
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1229 (struct pcnet_priv_data *)sc->driver_private;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1230 int i, mlen=0, plen;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1231 cyg_uint8 *data, *rxd, *buf;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1232
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1233 DEBUG_FUNCTION();
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1234
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1235 rxd = cpd->rx_ring + cpd->rxpacket*PCNET_TD_SIZE;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1236 buf = cpd->rx_buffers + cpd->rxpacket*_BUF_SIZE;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1237
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1238 INCR_STAT( rx_deliver );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1239
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1240 plen = _SU16(rxd, PCNET_RD_MLEN);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1241
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1242 for (i = 0; i < sg_len; i++) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1243 data = (cyg_uint8*)sg_list[i].buf;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1244 mlen = sg_list[i].len;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1245
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1246 #if DEBUG & 1
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
1247 db_printf("%s : mlen %x, plen %x\n", __FUNCTION__, mlen, plen);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1248 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1249 if (data) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1250 while (mlen > 0) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1251 *data++ = *buf++;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1252 mlen--;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1253 plen--;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1254 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1255 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1256 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1257 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1258
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1259 static void
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1260 pcnet_poll(struct eth_drv_sc *sc)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1261 {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1262 cyg_uint16 event;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1263
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1264 // DEBUG_FUNCTION();
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1265
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1266 while (1) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1267 // Get the (unmasked) requests
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1268 event = get_reg(sc, PCNET_CSR_CSCR);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1269 if (!((PCNET_CSR_CSCR_ERR|PCNET_CSR_CSCR_INTR) & event))
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1270 break;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1271
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1272 if (event & PCNET_CSR_CSCR_RINT) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1273 pcnet_RxEvent(sc);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1274 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1275 else if (event & PCNET_CSR_CSCR_TINT) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1276 pcnet_TxEvent(sc, event);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1277 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1278 else if (event & PCNET_CSR_CSCR_MISS) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1279 #if DEBUG & 1
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1280 int i;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1281 cyg_uint32 rstat;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1282 cyg_uint16 mlen, blen;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1283 cyg_uint8* rxd;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1284 struct pcnet_priv_data *cpd =
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1285 (struct pcnet_priv_data *)sc->driver_private;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1286
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
1287 db_printf("%s: Ran out of RX buffers (%04x)\n", __FUNCTION__, event);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1288 for (i = 0; i < cpd->rx_ring_cnt; i++) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1289 rxd = cpd->rx_ring + i*PCNET_TD_SIZE;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1290
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1291 rstat = _SU32(rxd, PCNET_RD_PTR);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1292 blen = _SU16(rxd, PCNET_RD_BLEN);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1293 mlen = _SU16(rxd, PCNET_RD_MLEN);
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
1294 db_printf(" %02d: 0x%08x:0x%04x:0x%04x\n", i, rstat, blen, mlen);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1295 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1296 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1297 event &= PCNET_CSR_CSCR_EV_MASK;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1298 event |= PCNET_CSR_CSCR_MISS;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1299 put_reg(sc, PCNET_CSR_CSCR, event);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1300 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1301 else {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1302 #if DEBUG & 1
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 191
diff changeset
1303 db_printf("%s: Unknown interrupt: 0x%04x\n", __FUNCTION__, event);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1304 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1305 put_reg(sc, PCNET_CSR_CSCR, event);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1306 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1307 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1308 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1309
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
diff changeset
1310 // EOF if_pcnet.c