Mercurial > ecos
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 |
| 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 |
