Mercurial > flash_v2
annotate packages/devs/eth/arm/ebsa285/current/src/if_ebsa285.c @ 105:5a0cc6c243a9 ecos-sw-2000-06-30
Merge from eCos master repository on 2000-06-30-08:18:49-BST
| author | jlarmour |
|---|---|
| date | Fri, 30 Jun 2000 16:27:35 +0000 |
| parents | c37d3a9e1b28 |
| children | 02ea4320376c |
| rev | line source |
|---|---|
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1 //========================================================================== |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
3 // if_ebsa285.c |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
4 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
5 // Ethernet drivers |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
6 // Intel EBSA285 and PRO/100+ platform specific support |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
7 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
8 //========================================================================== |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
9 //####COPYRIGHTBEGIN#### |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
10 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
11 // ------------------------------------------- |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
12 // The contents of this file are subject to the Red Hat eCos Public License |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
13 // Version 1.1 (the "License"); you may not use this file except in |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
14 // compliance with the License. You may obtain a copy of the License at |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
15 // http://www.redhat.com/ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
16 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
17 // Software distributed under the License is distributed on an "AS IS" |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
18 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
19 // License for the specific language governing rights and limitations under |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
20 // the License. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
21 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
22 // The Original Code is eCos - Embedded Configurable Operating System, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
23 // released September 30, 1998. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
24 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
25 // The Initial Developer of the Original Code is Red Hat. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
26 // Portions created by Red Hat are |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
27 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
28 // All Rights Reserved. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
29 // ------------------------------------------- |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
30 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
31 //####COPYRIGHTEND#### |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
32 //####BSDCOPYRIGHTBEGIN#### |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
33 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
34 // ------------------------------------------- |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
35 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
36 // Portions of this software may have been derived from OpenBSD or other sources, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
37 // and are covered by the appropriate copyright disclaimers included herein. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
38 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
39 // ------------------------------------------- |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
40 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
41 //####BSDCOPYRIGHTEND#### |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
42 //========================================================================== |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
43 //#####DESCRIPTIONBEGIN#### |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
44 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
45 // Author(s): hmt, gthomas |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
46 // Contributors: Ron Spence, Pacific Softworks |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
47 // Date: 2000-02-01 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
48 // Purpose: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
49 // Description: hardware driver for 82559 Intel PRO/100+ ethernet and |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
50 // Intel StrongARM EBSA-285 development boards |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
51 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
52 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
53 //####DESCRIPTIONEND#### |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
54 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
55 //========================================================================== |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
56 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
57 #include <pkgconf/system.h> |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
58 #include <pkgconf/devs_eth_arm_ebsa285.h> |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
59 #include <cyg/infra/cyg_type.h> |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
60 #include <cyg/infra/cyg_ass.h> |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
61 #include <cyg/hal/hal_arch.h> |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
62 #include <cyg/infra/diag.h> |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
63 #include <cyg/hal/drv_api.h> |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
64 #include <netdev.h> |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
65 #include <eth_drv.h> |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
66 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
67 #ifdef CYGPKG_IO_PCI |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
68 #include <cyg/io/pci.h> |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
69 #else |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
70 #error "Need PCI package here" |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
71 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
72 |
|
101
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
73 #include CYGBLD_DEVS_ETH_INFO_H // some state we must export |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
74 |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
75 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
76 |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
77 #ifdef CYGDBG_DEVS_ETH_ARM_EBSA285_CHATTER |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
78 #define notDEBUG_82559 // This one prints stuff as packets come and go |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
79 #define DEBUG // Startup printing mainly |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
80 #define DEBUG_EE // Some EEPROM specific retries &c |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
81 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
82 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
83 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
84 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
85 #define os_printf diag_printf |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
86 #define db_printf diag_printf |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
87 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
88 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
89 // I/O access macros as inlines for type safety |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
90 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
91 static inline void OUTB(cyg_uint8 value, cyg_uint32 io_address) |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
92 { *((volatile cyg_uint8 *)io_address) = value; } |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
93 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
94 static inline void OUTW(cyg_uint16 value, cyg_uint32 io_address) |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
95 { *((volatile cyg_uint16 *)io_address) = value; } |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
96 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
97 static inline void OUTL(cyg_uint32 value, cyg_uint32 io_address) |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
98 { *((volatile cyg_uint32 *)io_address) = value; } |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
99 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
100 static inline cyg_uint8 INB(cyg_uint32 io_address) |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
101 { return *((volatile cyg_uint8 *)io_address); } |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
102 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
103 static inline cyg_uint16 INW(cyg_uint32 io_address) |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
104 { return *((volatile cyg_uint16 *)io_address); } |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
105 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
106 static inline cyg_uint32 INL(cyg_uint32 io_address) |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
107 { return *((volatile cyg_uint32 *)io_address); } |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
108 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
109 #define VIRT_TO_BUS( _x_ ) virt_to_bus((cyg_uint32)(_x_)) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
110 static inline cyg_uint32 virt_to_bus(cyg_uint32 p_memory) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
111 { return (p_memory - CYGHWR_HAL_ARM_EBSA285_PCI_MEM_MAP_BASE); } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
112 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
113 #define BUS_TO_VIRT( _x_ ) bus_to_virt((cyg_uint32)(_x_)) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
114 static inline cyg_uint32 bus_to_virt(cyg_uint32 p_memory) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
115 { return (p_memory + CYGHWR_HAL_ARM_EBSA285_PCI_MEM_MAP_BASE); } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
116 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
117 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
118 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
119 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
120 // 82559 REGISTER OFFSETS (I/O SPACE) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
121 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
122 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
123 #define SCBStatus 0 // Rx/Command Unit command and status. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
124 #define SCBCmd 2 // Rx/Command Unit command and status. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
125 #define SCBPointer 4 // General purpose pointer. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
126 #define SCBPort 8 // Misc. commands and operands. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
127 #define SCBflash 12 // Flash memory control. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
128 #define SCBeeprom 14 // EEPROM memory control. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
129 #define SCBCtrlMDI 16 // MDI interface control. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
130 #define SCBEarlyRx 20 // Early receive byte count. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
131 #define SCBGenControl 28 // 82559 General Control Register |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
132 #define SCBGenStatus 29 // 82559 General Status register |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
133 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
134 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
135 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
136 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
137 // 82559 SCB STATUS WORD DEFNITIONS |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
138 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
139 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
140 #define SCB_STATUS_CX 0x8000 // CU finished command (transmit) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
141 #define SCB_STATUS_FR 0x4000 // frame received |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
142 #define SCB_STATUS_CNA 0x2000 // CU left active state |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
143 #define SCB_STATUS_RNR 0x1000 // receiver left ready state |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
144 #define SCB_STATUS_MDI 0x0800 // MDI read/write cycle done |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
145 #define SCB_STATUS_SWI 0x0400 // software generated interrupt |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
146 #define SCB_STATUS_FCP 0x0100 // flow control pause interrupt |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
147 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
148 #define SCB_INTACK_MASK 0xFD00 // all the above |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
149 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
150 #define SCB_INTACK_TX (SCB_STATUS_CX | SCB_STATUS_CNA) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
151 #define SCB_INTACK_RX (SCB_STATUS_FR | SCB_STATUS_RNR) |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
152 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
153 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
154 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
155 // 82559 PORT INTERFACE COMMANDS |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
156 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
157 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
158 #define I82559_RESET 0x00000000 // software reset |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
159 #define I82559_SELFTEST 0x00000001 // 82559 selftest command |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
160 #define I82559_SELECTIVE_RESET 0x00000002 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
161 #define I82559_DUMP 0x00000003 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
162 #define I82559_DUMP_WAKEUP 0x00000007 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
163 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
164 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
165 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
166 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
167 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
168 // 82559 EEPROM INTERFACE |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
169 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
170 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
171 // EEPROM_Ctrl bits. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
172 #define EE_SHIFT_CLK 0x01 // EEPROM shift clock. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
173 #define EE_CS 0x02 // EEPROM chip select. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
174 #define EE_DATA_WRITE 0x04 // EEPROM chip data in. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
175 #define EE_DATA_READ 0x08 // EEPROM chip data out. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
176 #define EE_ENB (0x4800 | EE_CS) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
177 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
178 // Delay between EEPROM clock transitions. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
179 #define eeprom_delay(usec) udelay(usec); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
180 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
181 // The EEPROM commands include the always-set leading bit. |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
182 #define EE_WRITE_CMD(a) (5 << (a)) |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
183 #define EE_READ_CMD(a) (6 << (a)) |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
184 #define EE_ERASE_CMD(a) (7 << (a)) |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
185 #define EE_WRITE_EN_CMD(a) (19 << ((a)-2)) |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
186 #define EE_WRITE_DIS_CMD(a) (16 << ((a)-2)) |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
187 #define EE_ERASE_ALL_CMD(a) (18 << ((a)-2)) |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
188 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
189 #define EE_TOP_CMD_BIT(a) ((a)+2) // Counts down to zero |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
190 #define EE_TOP_DATA_BIT (15) // Counts down to zero |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
191 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
192 #define EEPROM_ENABLE_DELAY (10) // Delay at chip select |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
193 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
194 #define EEPROM_SK_DELAY (2) // Delay between clock edges *and* data |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
195 // read or transition; 3 of these per bit. |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
196 #define EEPROM_DONE_DELAY (100) // Delay when all done |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
197 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
198 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
199 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
200 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
201 // SYSTEM CONTROL BLOCK COMMANDS |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
202 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
203 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
204 // CU COMMANDS |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
205 #define CU_NOP 0x0000 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
206 #define CU_START 0x0010 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
207 #define CU_RESUME 0x0020 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
208 #define CU_STATSADDR 0x0040 // Load Dump Statistics ctrs addr |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
209 #define CU_SHOWSTATS 0x0050 // Dump statistics counters. |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
210 #define CU_ADDR_LOAD 0x0060 // Base address to add to CU commands |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
211 #define CU_DUMPSTATS 0x0070 // Dump then reset stats counters. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
212 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
213 // RUC COMMANDS |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
214 #define RUC_NOP 0x0000 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
215 #define RUC_START 0x0001 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
216 #define RUC_RESUME 0x0002 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
217 #define RUC_ABORT 0x0004 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
218 #define RUC_ADDR_LOAD 0x0006 // (seems not to clear on acceptance) |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
219 #define RUC_RESUMENR 0x0007 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
220 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
221 #define SCB_M 0x0100 // 0 = enable interrupt, 1 = disable |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
222 #define SCB_SI 0x0200 // 1 - cause device to interrupt |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
223 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
224 #define CU_STATUS_MASK 0x00C0 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
225 #define RU_STATUS_MASK 0x003C |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
226 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
227 #define RU_STATUS_IDLE (0<<2) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
228 #define RU_STATUS_SUS (1<<2) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
229 #define RU_STATUS_NORES (2<<2) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
230 #define RU_STATUS_READY (4<<2) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
231 #define RU_STATUS_NO_RBDS_SUS ((1<<2)|(8<<2)) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
232 #define RU_STATUS_NO_RBDS_NORES ((2<<2)|(8<<2)) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
233 #define RU_STATUS_NO_RBDS_READY ((4<<2)|(8<<2)) |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
234 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
235 |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
236 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
237 #define MAX_MEM_RESERVED_IOCTL 1000 |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
238 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
239 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
240 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
241 // RECEIVE FRAME DESCRIPTORS |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
242 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
243 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
244 typedef struct rfd { |
|
105
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
245 volatile union { |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
246 cyg_uint32 u32_status; // result of receive operation |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
247 cyg_uint16 u16_status[2]; |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
248 } u_status; |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
249 volatile cyg_uint32 link; // offset from RU base to next RFD |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
250 volatile cyg_uint32 rdb_address; // pointer to Rx data buffer |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
251 volatile cyg_uint32 count:14, // number of bytes received + |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
252 f:1, // + EOF & F flags |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
253 eof:1, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
254 size:16; // size of the data buffer |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
255 volatile cyg_uint8 buffer[0]; // data buffer (simple mode) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
256 } RFD; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
257 |
|
105
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
258 // The status is split into two shorts to get atomic access to the EL bit; |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
259 // the upper word is not written by the device, so we can just hit it, |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
260 // leaving the lower word (which the device updates) alone. Otherwise |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
261 // there's a race condition between software moving the end-of-list (EL) |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
262 // bit round and the device writing into the previous slot. |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
263 |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
264 #define rxstatus u_status.u32_status |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
265 #define rxstatus_hi u_status.u16_status[1] |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
266 #define rxstatus_lo u_status.u16_status[0] |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
267 |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
268 #define RFD_STATUS_EL 0x80000000 // 1=last RFD in RFA |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
269 #define RFD_STATUS_S 0x40000000 // 1=suspend RU after receiving frame |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
270 #define RFD_STATUS_H 0x00100000 // 1=RFD is a header RFD |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
271 #define RFD_STATUS_SF 0x00080000 // 0=simplified, 1=flexible mode |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
272 #define RFD_STATUS_C 0x00008000 // completion of received frame |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
273 #define RFD_STATUS_OK 0x00002000 // frame received with no errors |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
274 |
|
105
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
275 #define RFD_STATUS_HI_EL 0x8000 // 1=last RFD in RFA |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
276 #define RFD_STATUS_HI_S 0x4000 // 1=suspend RU after receiving frame |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
277 #define RFD_STATUS_HI_H 0x0010 // 1=RFD is a header RFD |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
278 #define RFD_STATUS_HI_SF 0x0008 // 0=simplified, 1=flexible mode |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
279 |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
280 #define RFD_STATUS_LO_C 0x8000 // completion of received frame |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
281 #define RFD_STATUS_LO_OK 0x2000 // frame received with no errors |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
282 |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
283 #define RFD_RX_CRC 0x00000800 // crc error |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
284 #define RFD_RX_ALIGNMENT 0x00000400 // alignment error |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
285 #define RFD_RX_RESOURCE 0x00000200 // out of space, no resources |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
286 #define RFD_RX_DMA_OVER 0x00000100 // DMA overrun |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
287 #define RFD_RX_SHORT 0x00000080 // short frame error |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
288 #define RFD_RX_LENGTH 0x00000020 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
289 #define RFD_RX_ERROR 0x00000010 // receive error |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
290 #define RFD_RX_NO_ADR_MATCH 0x00000004 // no address match |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
291 #define RFD_RX_IA_MATCH 0x00000002 // individual address does not match |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
292 #define RFD_RX_TCO 0x00000001 // TCO indication |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
293 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
294 |
|
101
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
295 typedef struct rbd { |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
296 volatile cyg_uint32 count:14, // bytes used in buffer |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
297 f:1, // buffer has been used (filled) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
298 eof:1; // last receive buffer in frame |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
299 volatile cyg_uint32 next_rbd; // next RBD (RU base relative) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
300 volatile cyg_uint32 buffer_address; // address of receive data buffer |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
301 volatile cyg_uint32 size:15, // size of the associated buffer |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
302 el:1; // buffer of this RBD is last |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
303 } RBD; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
304 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
305 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
306 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
307 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
308 // TRANSMIT FRAME DESCRIPTORS |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
309 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
310 // ------------------------------------------------------------------------ |
|
101
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
311 typedef struct txcb { |
|
105
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
312 volatile cyg_uint32 txstatus:16, // result of transmit operation |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
313 command:16; // transmit command |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
314 volatile cyg_uint32 link; // offset from RU base to next RFD |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
315 volatile cyg_uint32 tbd_address; // pointer to Rx data buffer |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
316 volatile cyg_uint32 count:15, // number of bytes in transmit buffer |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
317 eof:1, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
318 tx_threshold:8, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
319 tbd_number:8; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
320 volatile cyg_uint8 buffer[0]; // data buffer (simple mode) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
321 } TxCB; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
322 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
323 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
324 #define TxCB_CMD_TRANSMIT 0x0004 // transmit command |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
325 #define TxCB_CMD_SF 0x0008 // 0=simplified, 1=flexible mode |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
326 #define TxCB_CMD_NC 0x0010 // 0=CRC insert by controller |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
327 #define TxCB_CMD_I 0x2000 // generate interrupt on completion |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
328 #define TxCB_CMD_S 0x4000 // suspend on completion |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
329 #define TxCB_CMD_EL 0x8000 // last command block in CBL |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
330 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
331 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
332 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
333 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
334 // STRUCTURES ADDED FOR PROMISCUOUS MODE |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
335 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
336 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
337 typedef struct { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
338 cyg_uint32 cb_status_word:13, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
339 cb_ok:1, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
340 cb_dc:1, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
341 cb_complete:1, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
342 cb_cmd:3, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
343 cb_cmd_word:10, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
344 cb_int:1, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
345 cb_suspend:1, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
346 cb_el:1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
347 cyg_uint32 cb_link_offset; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
348 } CB_STRUCT; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
349 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
350 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
351 typedef struct { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
352 CB_STRUCT cb_entry; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
353 cyg_uint8 config_bytes[24]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
354 } CONFIG_CMD_STRUCT; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
355 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
356 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
357 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
358 // STATISTICAL COUNTER STRUCTURE |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
359 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
360 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
361 #ifdef KEEP_STATISTICS |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
362 STATISTICS statistics[2]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
363 I82559_COUNTERS i82559_counters[2]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
364 #endif // KEEP_STATISTICS |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
365 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
366 // ------------------------------------------------------------------------ |
|
101
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
367 // |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
368 // DEVICES AND PACKET QUEUES |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
369 // |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
370 // ------------------------------------------------------------------------ |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
371 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
372 #define MAX_RX_PACKET_SIZE 1536 // maximum Rx packet size |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
373 #define MAX_TX_PACKET_SIZE 1536 // maximum Tx packet size |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
374 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
375 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
376 // This is encapsulated here so that a change to > 2 interfaces can |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
377 // easily be accommodated. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
378 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
379 #define IF_BAD_82559( _p_ ) \ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
380 CYG_ASSERT( (&i82559[0] == (_p_)) || (&i82559[1] == (_p_)), \ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
381 "Bad pointer-to-i82559" ); \ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
382 if ( (&i82559[0] != (_p_)) && (&i82559[1] != (_p_)) ) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
383 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
384 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
385 // Instantiate the interfaces that we have: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
386 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
387 #define MAX_82559 2 // number of interfaces |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
388 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
389 I82559 i82559[MAX_82559]; // i82559 device info. structure |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
390 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
391 // eth0 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
392 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
393 ETH_DRV_SC(ebsa285_sc0, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
394 &i82559[0], // Driver specific data |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
395 "eth0", // Name for this interface |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
396 i82559_start, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
397 i82559_stop, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
398 i82559_ioctl, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
399 i82559_can_send, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
400 i82559_send, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
401 i82559_recv); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
402 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
403 NETDEVTAB_ENTRY(ebsa285_netdev0, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
404 "ebsa285-0", |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
405 ebsa285_i82559_init, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
406 &ebsa285_sc0); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
407 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
408 #if 1 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
409 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
410 // eth1 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
411 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
412 ETH_DRV_SC(ebsa285_sc1, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
413 &i82559[1], // Driver specific data |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
414 "eth1", // Name for this interface |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
415 i82559_start, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
416 i82559_stop, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
417 i82559_ioctl, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
418 i82559_can_send, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
419 i82559_send, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
420 i82559_recv); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
421 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
422 NETDEVTAB_ENTRY(ebsa285_netdev1, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
423 "ebsa285-1", |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
424 ebsa285_i82559_init, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
425 &ebsa285_sc1); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
426 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
427 #else |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
428 int ebsa285_netdev1 = -1; // for asserts about valid addresses |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
429 int ebsa285_sc1 = -1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
430 #endif // eth1 is included |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
431 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
432 // This is in a macro so that if more devices arrive it can easily be changed |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
433 #define CHECK_NDP_SC_LINK() CYG_MACRO_START \ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
434 CYG_ASSERT( ((void *)ndp == (void *)&ebsa285_netdev0) || \ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
435 ((void *)ndp == (void *)&ebsa285_netdev1), "Bad ndp" ); \ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
436 CYG_ASSERT( ((void *)sc == (void *)&ebsa285_sc0) || \ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
437 ((void *)sc == (void *)&ebsa285_sc1), "Bad sc" ); \ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
438 CYG_ASSERT( (void *)p_i82559 == sc->driver_private, "sc pointer bad" );\ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
439 CYG_MACRO_END |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
440 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
441 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
442 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
443 // Managing the memory that is windowed onto the PCI bus |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
444 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
445 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
446 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
447 static cyg_uint32 i82559_heap_size; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
448 static cyg_uint8 *i82559_heap_base; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
449 static cyg_uint8 *i82559_heap_free; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
450 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
451 static void *mem_reserved_ioctl = (void*)0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
452 // uncacheable memory reserved for ioctl calls |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
453 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
454 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
455 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
456 // FUNCTION PROTOTYPES |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
457 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
458 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
459 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
460 static int pci_init_find_82559s(void); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
461 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
462 static void i82559_reset(struct i82559* p_i82559); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
463 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
464 static void InitRxRing(struct i82559* p_i82559); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
465 static void ResetRxRing(struct i82559* p_i82559); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
466 static void InitTxRing(struct i82559* p_i82559); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
467 static void ResetTxRing(struct i82559* p_i82559); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
468 |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
469 #ifdef CYGPKG_DEVS_ETH_ARM_EBSA285_WRITE_EEPROM |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
470 static void program_eeprom(cyg_uint32 , cyg_uint32 , cyg_uint8 * ); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
471 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
472 static int eth_set_promiscuous_mode(struct i82559* p_i82559); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
473 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
474 // debugging/logging only: |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
475 void dump_txcb(TxCB *p_txcb); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
476 void DisplayStatistics(void); |
|
101
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
477 void update_statistics(struct i82559* p_i82559); |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
478 void dump_rfd(RFD *p_rfd, int anyway ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
479 void dump_all_rfds( int intf ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
480 void dump_packet(cyg_uint8 *p_buffer, int length); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
481 |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
482 // ------------------------------------------------------------------------ |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
483 // utilities |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
484 // ------------------------------------------------------------------------ |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
485 |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
486 static // inline |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
487 void wait_for_cmd_done(long scb_ioaddr) |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
488 { |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
489 register int CSRstatus; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
490 register int wait = 0x100000; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
491 do CSRstatus = INB(scb_ioaddr + SCBCmd) ; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
492 while( CSRstatus && --wait >= 0); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
493 CYG_ASSERT( wait > 0, "wait_for_cmd_done" ); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
494 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
495 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
496 static inline void Mask82559Interrupt(struct i82559* p_i82559) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
497 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
498 cyg_drv_interrupt_mask(p_i82559->vector); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
499 cyg_drv_interrupt_mask(CYGNUM_HAL_INTERRUPT_PCI_IRQ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
500 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
501 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
502 static inline void UnMask82559Interrupt(struct i82559* p_i82559) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
503 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
504 cyg_drv_interrupt_unmask(p_i82559->vector); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
505 cyg_drv_interrupt_unmask(CYGNUM_HAL_INTERRUPT_PCI_IRQ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
506 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
507 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
508 #ifdef CYGDBG_USE_ASSERTS // an indication of a debug build |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
509 static int acknowledge82559interrupt_compensating = 0; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
510 #endif |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
511 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
512 static void Acknowledge82559Interrupt(struct i82559* p_i82559) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
513 { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
514 int sources, mask; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
515 cyg_uint32 ioaddr; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
516 cyg_uint16 status; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
517 int loops = 64; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
518 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
519 cyg_drv_interrupt_acknowledge(p_i82559->vector); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
520 cyg_drv_interrupt_acknowledge(CYGNUM_HAL_INTERRUPT_PCI_IRQ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
521 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
522 // It appears that some time can be taken before the interrupt source |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
523 // *really* quietens down... this is ugly, but effective. |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
524 // Without it, we get "Spurious Interrupt!" failures. |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
525 ioaddr = p_i82559->io_address; // get I/O address for 82559 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
526 mask = (1 << p_i82559->vector); // Do not include the MUX vector or we |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
527 sources = *SA110_IRQCONT_IRQSTATUS; //...get hung on the other 82559 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
528 status = INW(ioaddr + SCBStatus); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
529 while ( ((0 != (sources & mask)) || (0 != (status & SCB_INTACK_MASK))) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
530 && --loops >= 0) { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
531 OUTW( status & SCB_INTACK_MASK, ioaddr + SCBStatus); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
532 cyg_drv_interrupt_acknowledge(p_i82559->vector); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
533 cyg_drv_interrupt_acknowledge(CYGNUM_HAL_INTERRUPT_PCI_IRQ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
534 #ifdef CYGDBG_USE_ASSERTS |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
535 acknowledge82559interrupt_compensating++; // verify this is executed |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
536 #endif |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
537 sources = *SA110_IRQCONT_IRQSTATUS; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
538 status = INW(ioaddr + SCBStatus); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
539 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
540 CYG_ASSERT( loops >= 0, "Acknowledge82559Interrupt" ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
541 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
542 |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
543 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
544 static void udelay(int delay) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
545 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
546 int i; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
547 // the loop is going to take 3 ticks. At 228 MHz, to give uS, multiply |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
548 // by 228/3 = 76 near enough. No volatile is needed on i; gcc recognizes |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
549 // delay loops and does NOT elide them. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
550 for ( i = 76 * delay; i ; i--) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
551 ; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
552 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
553 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
554 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
555 // Memory management |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
556 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
557 // Simply carve off from the front of the PCI mapped window into real memory |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
558 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
559 static void *pciwindow_mem_alloc(int size) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
560 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
561 void *p_memory; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
562 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
563 CYG_ASSERT( |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
564 (CYGHWR_HAL_ARM_EBSA285_PCI_MEM_MAP_BASE <= (int)i82559_heap_free) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
565 && |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
566 ((CYGHWR_HAL_ARM_EBSA285_PCI_MEM_MAP_BASE + |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
567 CYGHWR_HAL_ARM_EBSA285_PCI_MEM_MAP_SIZE) > (int)i82559_heap_free) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
568 && |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
569 (0 < i82559_heap_size) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
570 && |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
571 (CYGHWR_HAL_ARM_EBSA285_PCI_MEM_MAP_SIZE >= i82559_heap_size) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
572 && |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
573 (CYGHWR_HAL_ARM_EBSA285_PCI_MEM_MAP_BASE == (int)i82559_heap_base), |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
574 "Heap variables corrupted" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
575 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
576 p_memory = (void *)0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
577 size = (size + 3) & ~3; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
578 if ( (i82559_heap_free+size) < (i82559_heap_base+i82559_heap_size) ) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
579 cyg_uint32 *p; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
580 p_memory = (void *)i82559_heap_free; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
581 i82559_heap_free += size; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
582 for ( p = (cyg_uint32 *)p_memory; size > 0; size -= 4 ) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
583 *p++ = 0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
584 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
585 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
586 return p_memory; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
587 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
588 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
589 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
590 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
591 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
592 // |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
593 // GET EEPROM SIZE |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
594 // |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
595 // ------------------------------------------------------------------------ |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
596 static int get_eeprom_size(long ioaddr) |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
597 { |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
598 unsigned short retval = 0; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
599 int ee_addr = ioaddr + SCBeeprom; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
600 int i, addrbits; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
601 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
602 // Should already be not-selected, but anyway: |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
603 OUTW(EE_ENB & ~EE_CS, ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
604 eeprom_delay(EEPROM_ENABLE_DELAY); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
605 OUTW(EE_ENB, ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
606 eeprom_delay(EEPROM_ENABLE_DELAY); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
607 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
608 // Shift the read command bits out. |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
609 for (i = 2; i >= 0; i--) { |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
610 short dataval = (6 & (1 << i)) ? EE_DATA_WRITE : 0; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
611 OUTW(EE_ENB | dataval , ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
612 eeprom_delay(EEPROM_SK_DELAY); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
613 OUTW(EE_ENB | dataval | EE_SHIFT_CLK, ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
614 eeprom_delay(EEPROM_SK_DELAY); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
615 OUTW(EE_ENB | dataval , ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
616 eeprom_delay(EEPROM_SK_DELAY); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
617 } |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
618 // Now clock out address zero, looking for the dummy 0 data bit |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
619 for ( i = 1; i <= 12; i++ ) { |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
620 OUTW(EE_ENB , ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
621 eeprom_delay(EEPROM_SK_DELAY); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
622 OUTW(EE_ENB | EE_SHIFT_CLK, ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
623 eeprom_delay(EEPROM_SK_DELAY); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
624 OUTW(EE_ENB , ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
625 eeprom_delay(EEPROM_SK_DELAY); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
626 retval = INW(ee_addr) & EE_DATA_READ; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
627 if ( 0 == retval ) |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
628 break; // The dummy zero est arrive' |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
629 } |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
630 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
631 #ifdef DEBUG_EE |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
632 os_printf( "eeprom data bits %d (ioaddr %x)\n", i, ee_addr ); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
633 #endif |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
634 if ( 6 != i && 8 != i ) { |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
635 #ifdef DEBUG_EE |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
636 os_printf( "*****EEPROM data bits not 6 or 8*****\n" ); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
637 #endif |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
638 i = 6; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
639 } |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
640 addrbits = i; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
641 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
642 // clear the dataval, leave the clock low to read in the data regardless |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
643 OUTW(EE_ENB, ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
644 eeprom_delay(1); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
645 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
646 retval = INW(ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
647 if ( (EE_DATA_READ & retval) != 0 ) { |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
648 #ifdef DEBUG_EE |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
649 os_printf( "Size EEPROM: Dummy data bit not 0, reg %x\n" , retval ); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
650 #endif |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
651 } |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
652 eeprom_delay(1); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
653 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
654 for (i = EE_TOP_DATA_BIT; i >= 0; i--) { |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
655 OUTW(EE_ENB | EE_SHIFT_CLK, ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
656 eeprom_delay(EEPROM_SK_DELAY); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
657 retval = INW(ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
658 eeprom_delay(EEPROM_SK_DELAY); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
659 OUTW(EE_ENB, ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
660 eeprom_delay(EEPROM_SK_DELAY); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
661 } |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
662 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
663 // Terminate the EEPROM access. |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
664 OUTW(EE_ENB & ~EE_CS, ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
665 eeprom_delay(EEPROM_DONE_DELAY); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
666 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
667 return addrbits; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
668 } |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
669 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
670 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
671 // ------------------------------------------------------------------------ |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
672 // |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
673 // READ EEPROM |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
674 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
675 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
676 static int read_eeprom(long ioaddr, int location, int addr_len) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
677 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
678 unsigned short retval = 0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
679 int ee_addr = ioaddr + SCBeeprom; |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
680 int read_cmd = location | EE_READ_CMD(addr_len); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
681 int i, tries = 10; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
682 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
683 try_again: |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
684 // Should already be not-selected, but anyway: |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
685 OUTW(EE_ENB & ~EE_CS, ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
686 eeprom_delay(EEPROM_ENABLE_DELAY); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
687 OUTW(EE_ENB, ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
688 eeprom_delay(EEPROM_ENABLE_DELAY); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
689 |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
690 // Shift the read command bits out, changing only one bit per time. |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
691 for (i = EE_TOP_CMD_BIT(addr_len); i >= 0; i--) { |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
692 short dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
693 OUTW(EE_ENB | dataval , ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
694 eeprom_delay(EEPROM_SK_DELAY); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
695 OUTW(EE_ENB | dataval | EE_SHIFT_CLK, ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
696 eeprom_delay(EEPROM_SK_DELAY); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
697 OUTW(EE_ENB | dataval , ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
698 eeprom_delay(EEPROM_SK_DELAY); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
699 } |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
700 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
701 // clear the dataval, leave the clock low |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
702 OUTW(EE_ENB, ee_addr); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
703 eeprom_delay(1); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
704 |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
705 retval = INW(ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
706 // This should show a zero in the data read bit to confirm that the |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
707 // address transfer is compelete. If not, go to the start and try |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
708 // again! |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
709 if ( (0 != (retval & EE_DATA_READ)) && (tries-- > 0) ) { |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
710 // Terminate the EEPROM access. |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
711 OUTW(EE_ENB & ~EE_CS, ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
712 eeprom_delay(EEPROM_DONE_DELAY); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
713 #ifdef DEBUG_EE |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
714 os_printf( "Warning: Retrying EEPROM read word %d, address %x, try %d\n", |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
715 location, ee_addr, tries+1 ); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
716 #endif |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
717 goto try_again; |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
718 } |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
719 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
720 // This fires with one device on one of the customer boards! |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
721 // (but is OK on all other h/w. Worrying huh.) |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
722 if ( (EE_DATA_READ & retval) != 0 ) { |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
723 #ifdef DEBUG_EE |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
724 os_printf( "Read EEPROM: Dummy data bit not 0, reg %x\n" , retval ); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
725 #endif |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
726 } |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
727 eeprom_delay(1); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
728 retval = 0; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
729 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
730 for (i = EE_TOP_DATA_BIT; i >= 0; i--) { |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
731 OUTW(EE_ENB | EE_SHIFT_CLK, ee_addr); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
732 eeprom_delay(EEPROM_SK_DELAY); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
733 retval = (retval << 1) | ((INW(ee_addr) & EE_DATA_READ) ? 1 : 0); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
734 eeprom_delay(EEPROM_SK_DELAY); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
735 OUTW(EE_ENB, ee_addr); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
736 eeprom_delay(EEPROM_SK_DELAY); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
737 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
738 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
739 // Terminate the EEPROM access. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
740 OUTW(EE_ENB & ~EE_CS, ee_addr); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
741 eeprom_delay(EEPROM_DONE_DELAY); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
742 |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
743 return retval; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
744 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
745 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
746 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
747 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
748 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
749 // NETWORK INTERFACE INITIALIZATION |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
750 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
751 // Function : Init82559 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
752 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
753 // Description : |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
754 // This routine resets, configures, and initializes the chip. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
755 // It also clears the ethernet statistics structure, and selects |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
756 // which statistics are supported by this driver. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
757 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
758 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
759 static bool |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
760 ebsa285_i82559_init(struct cyg_netdevtab_entry * ndp) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
761 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
762 static int initialized = 0; // only probe PCI et al *once* |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
763 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
764 struct eth_drv_sc *sc; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
765 cyg_uint32 selftest; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
766 volatile cyg_uint32 *p_selftest; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
767 cyg_uint32 ioaddr; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
768 cyg_uint16 checksum; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
769 int count; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
770 int i; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
771 int addr_length; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
772 cyg_uint8 mac_address[6]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
773 struct i82559 *p_i82559; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
774 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
775 #ifdef DEBUG |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
776 db_printf("ebsa285_i82559_init\n"); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
777 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
778 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
779 sc = (struct eth_drv_sc *)(ndp->device_instance); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
780 p_i82559 = (struct i82559 *)(sc->driver_private); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
781 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
782 IF_BAD_82559( p_i82559 ) { |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
783 #ifdef DEBUG |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
784 os_printf( "Bad device private pointer %x\n", sc->driver_private ); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
785 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
786 return 0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
787 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
788 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
789 CHECK_NDP_SC_LINK(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
790 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
791 if ( 0 == initialized++ ) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
792 // then this is the first time ever: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
793 if ( ! pci_init_find_82559s() ) { |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
794 #ifdef DEBUG |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
795 os_printf( "pci_init_find_82559s failed" ); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
796 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
797 return 0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
798 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
799 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
800 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
801 if ( ! p_i82559->found ) // no device on PCI bus |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
802 return (0); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
803 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
804 ioaddr = p_i82559->io_address; // get I/O address for 82559 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
805 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
806 #ifdef DEBUG |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
807 os_printf("Init82559 %d @ %x\n82559 Self Test\n", |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
808 p_i82559->index, (int)ndp); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
809 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
810 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
811 Mask82559Interrupt(p_i82559); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
812 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
813 wait_for_cmd_done(ioaddr); // make sure no command operating |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
814 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
815 i82559_reset(p_i82559); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
816 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
817 // Perform a system self-test. (get enough mem to round address) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
818 if ( (selftest = (cyg_uint32)pciwindow_mem_alloc(32) ) == 0) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
819 return (0); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
820 p_selftest = (cyg_uint32 *) ((selftest + 15) & ~0xf); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
821 p_selftest[0] = p_selftest[1] = -1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
822 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
823 OUTL( (VIRT_TO_BUS(p_selftest)) | I82559_SELFTEST, ioaddr + SCBPort); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
824 count = 0x7FFFF; // Timeout for self-test. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
825 do { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
826 udelay(10); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
827 } while ( (p_selftest[1] == -1) && (--count >= 0) ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
828 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
829 Acknowledge82559Interrupt(p_i82559); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
830 UnMask82559Interrupt(p_i82559); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
831 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
832 if (count < 0) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
833 // Test timed out. |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
834 #ifdef DEBUG |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
835 os_printf("Self test failed\n"); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
836 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
837 return (0); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
838 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
839 #ifdef DEBUG |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
840 os_printf(" General self-test: %s.\n" |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
841 " Serial sub-system self-test: %s.\n" |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
842 " Internal registers self-test: %s.\n" |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
843 " ROM checksum self-test: %s (%08X).\n", |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
844 p_selftest[1] & 0x1000 ? "failed" : "passed", |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
845 p_selftest[1] & 0x0020 ? "failed" : "passed", |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
846 p_selftest[1] & 0x0008 ? "failed" : "passed", |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
847 p_selftest[1] & 0x0004 ? "failed" : "passed", |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
848 p_selftest[0]); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
849 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
850 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
851 // read eeprom and get 82559's mac address |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
852 addr_length = get_eeprom_size(ioaddr); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
853 // (this is the length of the *EEPROM*s address, not MAC address) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
854 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
855 for (checksum = 0, i = 0, count = 0; count < 64; count++) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
856 cyg_uint16 value; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
857 // read word from eeprom |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
858 value = read_eeprom(ioaddr, count, addr_length); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
859 #ifdef DEBUG_EE |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
860 // os_printf( "%2d: %04x\n", count, value ); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
861 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
862 checksum += value; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
863 if (count < 3) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
864 mac_address[i++] = value & 0xFF; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
865 mac_address[i++] = (value >> 8) & 0xFF; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
866 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
867 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
868 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
869 // If the EEPROM checksum is wrong, the MAC address read from the |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
870 // EEPROM is probably wrong as well. In that case, we don't set |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
871 // mac_addr_ok, but continue the initialization. If then somebody calls |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
872 // i82559_start without calling eth_set_mac_address() first, we refuse |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
873 // to bring up the interface, because running with an invalid MAC |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
874 // address is not a very brilliant idea. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
875 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
876 if ((checksum & 0xFFFF) != 0xBABA) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
877 // selftest verified checksum, verify again |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
878 #ifdef DEBUG_EE |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
879 os_printf( "Warning: Invalid EEPROM checksum %04X for device %d\n", |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
880 checksum, p_i82559->index); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
881 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
882 } else { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
883 p_i82559->mac_addr_ok = 1; |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
884 #ifdef DEBUG_EE |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
885 os_printf("Valid EEPROM checksum\n"); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
886 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
887 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
888 #ifdef DEBUG |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
889 os_printf("MAC Address = %02X %02X %02X %02X %02X %02X\n", |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
890 mac_address[0], mac_address[1], mac_address[2], mac_address[3], |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
891 mac_address[4], mac_address[5]); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
892 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
893 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
894 // record the MAC address in the device structure |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
895 p_i82559->mac_address[0] = mac_address[0]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
896 p_i82559->mac_address[1] = mac_address[1]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
897 p_i82559->mac_address[2] = mac_address[2]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
898 p_i82559->mac_address[3] = mac_address[3]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
899 p_i82559->mac_address[4] = mac_address[4]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
900 p_i82559->mac_address[5] = mac_address[5]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
901 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
902 // and record the net dev pointer |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
903 p_i82559->ndp = (void *)ndp; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
904 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
905 InitRxRing(p_i82559); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
906 InitTxRing(p_i82559); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
907 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
908 // Initialize upper level driver |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
909 if ( p_i82559->mac_addr_ok ) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
910 eth_drv_init(sc, &(p_i82559->mac_address[0]) ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
911 else |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
912 eth_drv_init(sc, 0 ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
913 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
914 return (1); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
915 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
916 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
917 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
918 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
919 // Function : i82559_start |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
920 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
921 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
922 static void i82559_start( struct eth_drv_sc *sc, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
923 unsigned char *enaddr, int flags ) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
924 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
925 struct i82559 *p_i82559; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
926 cyg_uint32 ioaddr; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
927 #ifdef KEEP_STATISTICS |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
928 void *p_statistics; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
929 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
930 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
931 p_i82559 = (struct i82559 *)sc->driver_private; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
932 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
933 IF_BAD_82559( p_i82559 ) { |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
934 #ifdef DEBUG |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
935 os_printf( "i82559_start: Bad device pointer %x\n", p_i82559 ); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
936 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
937 return; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
938 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
939 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
940 if ( ! p_i82559->mac_addr_ok ) { |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
941 #ifdef DEBUG |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
942 os_printf("i82559_start %d: invalid MAC address, " |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
943 "can't bring up interface\n", |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
944 p_i82559->index ); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
945 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
946 return; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
947 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
948 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
949 if ( p_i82559->active ) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
950 i82559_stop( sc ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
951 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
952 ioaddr = p_i82559->io_address; // get 82559's I/O address |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
953 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
954 #ifdef KEEP_STATISTICS |
|
105
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
955 #ifdef CYGDBG_DEVS_ETH_ARM_EBSA285_KEEP_82559_STATISTICS |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
956 p_i82559->p_statistics = |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
957 p_statistics = pciwindow_mem_alloc(sizeof(I82559_COUNTERS)); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
958 memset(p_statistics, 0xFFFFFFFF, sizeof(I82559_COUNTERS)); |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
959 wait_for_cmd_done(ioaddr); // make sure no command operating |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
960 // set statistics dump address |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
961 OUTL(VIRT_TO_BUS(p_statistics), ioaddr + SCBPointer); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
962 OUTW(SCB_M | CU_STATSADDR, ioaddr + SCBCmd); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
963 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
964 wait_for_cmd_done(ioaddr); // make sure no command operating |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
965 OUTW(SCB_M | CU_DUMPSTATS, ioaddr + SCBCmd); // start register dump |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
966 #endif |
|
105
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
967 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
968 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
969 // Set the base address |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
970 wait_for_cmd_done(ioaddr); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
971 OUTL(0, ioaddr + SCBPointer); // load ru base address = 0 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
972 OUTW(SCB_M | RUC_ADDR_LOAD, ioaddr + SCBCmd); |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
973 udelay( 1000 ); // load pointer to Rx Ring |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
974 OUTL(VIRT_TO_BUS(p_i82559->rx_ring[0]), ioaddr + SCBPointer); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
975 OUTW(RUC_START, ioaddr + SCBCmd); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
976 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
977 p_i82559->active = 1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
978 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
979 if ( 0 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
980 #ifdef ETH_DRV_FLAGS_PROMISC_MODE |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
981 != (flags & ETH_DRV_FLAGS_PROMISC_MODE) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
982 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
983 ) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
984 eth_set_promiscuous_mode(p_i82559); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
985 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
986 #ifdef DEBUG |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
987 { |
|
101
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
988 int status = i82559_status( sc ); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
989 os_printf("i82559_start %d flg %x Link = %s, %s Mbps, %s Duplex\n", |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
990 p_i82559->index, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
991 *(int *)p_i82559, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
992 status & GEN_STATUS_LINK ? "Up" : "Down", |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
993 status & GEN_STATUS_100MBPS ? "100" : "10", |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
994 status & GEN_STATUS_FDX ? "Full" : "Half"); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
995 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
996 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
997 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
998 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
999 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1000 // |
|
101
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1001 // Function : i82559_status |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1002 // |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1003 // ------------------------------------------------------------------------ |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1004 int i82559_status( struct eth_drv_sc *sc ) |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1005 { |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1006 int status; |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1007 struct i82559 *p_i82559; |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1008 cyg_uint32 ioaddr; |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1009 p_i82559 = (struct i82559 *)sc->driver_private; |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1010 |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1011 IF_BAD_82559( p_i82559 ) { |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1012 #ifdef DEBUG |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1013 os_printf( "i82559_status: Bad device pointer %x\n", p_i82559 ); |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1014 #endif |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1015 return 0; |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1016 } |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1017 |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1018 ioaddr = p_i82559->io_address; // get 82559's I/O address |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1019 |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1020 status = INB(ioaddr + SCBGenStatus); |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1021 |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1022 return status; |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1023 } |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1024 |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1025 // ------------------------------------------------------------------------ |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1026 // |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1027 // Function : BringDown82559 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1028 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1029 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1030 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1031 static void i82559_stop( struct eth_drv_sc *sc ) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1032 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1033 struct i82559 *p_i82559; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1034 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1035 p_i82559 = (struct i82559 *)sc->driver_private; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1036 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1037 IF_BAD_82559( p_i82559 ) { |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1038 #ifdef DEBUG |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1039 os_printf( "i82559_stop: Bad device pointer %x\n", p_i82559 ); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1040 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1041 return; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1042 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1043 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1044 #ifdef DEBUG |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1045 os_printf("i82559_stop %d flg %x\n", p_i82559->index, *(int *)p_i82559 ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1046 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1047 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1048 p_i82559->active = 0; // stop people tormenting it |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1049 i82559_reset(p_i82559); // that should stop it |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1050 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1051 ResetRxRing( p_i82559 ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1052 ResetTxRing( p_i82559 ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1053 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1054 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1055 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1056 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1057 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1058 // Function : InitRxRing |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1059 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1060 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1061 static void InitRxRing(struct i82559* p_i82559) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1062 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1063 int i; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1064 RFD *rfd; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1065 RFD *p_rfd = 0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1066 #ifdef DEBUG_82559 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1067 os_printf("InitRxRing %d\n", p_i82559->index); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1068 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1069 for ( i = 0; i < MAX_RX_DESCRIPTORS; i++ ) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1070 rfd = (RFD *)pciwindow_mem_alloc(sizeof(RFD) + MAX_RX_PACKET_SIZE); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1071 p_i82559->rx_ring[i] = rfd; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1072 if ( i ) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1073 p_rfd->link = VIRT_TO_BUS(rfd); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1074 p_rfd = (RFD *)rfd; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1075 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1076 // link last RFD to first: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1077 p_rfd->link = VIRT_TO_BUS(p_i82559->rx_ring[0]); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1078 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1079 ResetRxRing( p_i82559 ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1080 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1081 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1082 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1083 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1084 // Function : ResetRxRing |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1085 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1086 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1087 static void ResetRxRing(struct i82559* p_i82559) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1088 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1089 RFD *p_rfd; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1090 int i; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1091 #ifdef DEBUG_82559 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1092 os_printf("ResetRxRing %d\n", p_i82559->index); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1093 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1094 for ( i = 0; i < MAX_RX_DESCRIPTORS; i++ ) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1095 p_rfd = p_i82559->rx_ring[i]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1096 CYG_ASSERT( (cyg_uint8 *)p_rfd >= i82559_heap_base, "rfd under" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1097 CYG_ASSERT( (cyg_uint8 *)p_rfd < i82559_heap_free, "rfd over" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1098 CYG_ASSERT( p_i82559->rx_ring[ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1099 ( i ? (i-1) : (MAX_RX_DESCRIPTORS-1) ) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1100 ]->link == VIRT_TO_BUS(p_rfd), "rfd linked list broken" ); |
|
105
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1101 p_rfd->rxstatus = 0; |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1102 p_rfd->count = 0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1103 p_rfd->f = 0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1104 p_rfd->eof = 0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1105 p_rfd->rdb_address = 0xFFFFFFFF; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1106 p_rfd->size = MAX_RX_PACKET_SIZE; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1107 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1108 p_i82559->next_rx_descriptor = 0; |
|
105
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1109 // And set an end-of-list marker in the previous one. |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1110 p_rfd->rxstatus = RFD_STATUS_EL; |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1111 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1112 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1113 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1114 // |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1115 // Function : PacketRxReady (Called from DSR) |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1116 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1117 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1118 static void PacketRxReady(struct i82559* p_i82559) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1119 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1120 RFD *p_rfd; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1121 int next_descriptor; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1122 int length; |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1123 struct cyg_netdevtab_entry *ndp; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1124 struct eth_drv_sc *sc; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1125 cyg_uint32 ioaddr; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1126 cyg_uint16 status; |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1127 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1128 ndp = (struct cyg_netdevtab_entry *)(p_i82559->ndp); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1129 sc = (struct eth_drv_sc *)(ndp->device_instance); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1130 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1131 CHECK_NDP_SC_LINK(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1132 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1133 ioaddr = p_i82559->io_address; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1134 |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1135 next_descriptor = p_i82559->next_rx_descriptor; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1136 p_rfd = p_i82559->rx_ring[next_descriptor]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1137 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1138 CYG_ASSERT( (cyg_uint8 *)p_rfd >= i82559_heap_base, "rfd under" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1139 CYG_ASSERT( (cyg_uint8 *)p_rfd < i82559_heap_free, "rfd over" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1140 |
|
105
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1141 while ( p_rfd->rxstatus & RFD_STATUS_C ) { |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1142 p_rfd->rxstatus_hi |= RFD_STATUS_HI_EL; |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1143 length = p_rfd->count; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1144 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1145 #ifdef DEBUG_82559 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1146 os_printf( "Device %d (eth%d), rx descriptor %d:\n", |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1147 p_i82559->index, p_i82559->index, next_descriptor ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1148 // dump_rfd( p_rfd, 1 ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1149 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1150 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1151 // Offer the data to the network stack |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1152 p_i82559->next_rx_descriptor = next_descriptor; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1153 eth_drv_recv( sc, length ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1154 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1155 p_rfd->count = 0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1156 p_rfd->f = 0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1157 p_rfd->eof = 0; |
|
105
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1158 p_rfd->rxstatus_lo = 0; |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1159 |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1160 // The just-emptied slot is now ready for re-use and already marked EL; |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1161 // we can now remove the EL marker from the previous one. |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1162 if ( 0 == next_descriptor ) |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1163 p_rfd = p_i82559->rx_ring[ MAX_RX_DESCRIPTORS-1 ]; |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1164 else |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1165 p_rfd = p_i82559->rx_ring[ next_descriptor-1 ]; |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1166 // The previous one: check it *was* marked before clearing. |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1167 CYG_ASSERT( p_rfd->rxstatus_hi & RFD_STATUS_HI_EL, "No prev EL" ); |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1168 p_rfd->rxstatus_hi = 0; // that word is not written by the device. |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1169 |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1170 #ifdef KEEP_STATISTICS |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1171 statistics[p_i82559->index].rx_deliver++; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1172 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1173 if (++next_descriptor >= MAX_RX_DESCRIPTORS) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1174 next_descriptor = 0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1175 p_rfd = p_i82559->rx_ring[next_descriptor]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1176 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1177 CYG_ASSERT( (cyg_uint8 *)p_rfd >= i82559_heap_base, "rfd under" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1178 CYG_ASSERT( (cyg_uint8 *)p_rfd < i82559_heap_free, "rfd over" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1179 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1180 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1181 // See if the RU has gone idle (usually because of out of resource |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1182 // condition) and restart it if needs be. |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1183 Mask82559Interrupt(p_i82559); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1184 status = INW(ioaddr + SCBStatus); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1185 if ( RU_STATUS_READY != (status & RU_STATUS_MASK) ) { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1186 // Acknowledge the RX INT sources |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1187 OUTW( SCB_INTACK_RX, ioaddr + SCBStatus); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1188 // (see pages 6-10 & 6-90) |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1189 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1190 #ifdef KEEP_STATISTICS |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1191 statistics[p_i82559->index].rx_restart++; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1192 #endif |
|
105
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1193 // There's an end-of-list marker out there somewhere... |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1194 // So mop it up; it takes a little time but this is infrequent. |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1195 ResetRxRing( p_i82559 ); |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1196 next_descriptor = 0; // re-initialize next desc. |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1197 // wait for SCB command complete |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1198 wait_for_cmd_done(ioaddr); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1199 // load pointer to Rx Ring |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1200 OUTL(VIRT_TO_BUS(p_i82559->rx_ring[0]), |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1201 ioaddr + SCBPointer); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1202 OUTW(RUC_START, ioaddr + SCBCmd); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1203 Acknowledge82559Interrupt(p_i82559); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1204 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1205 UnMask82559Interrupt(p_i82559); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1206 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1207 p_i82559->next_rx_descriptor = next_descriptor; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1208 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1209 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1210 // and the callback function |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1211 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1212 static void i82559_recv( struct eth_drv_sc *sc, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1213 struct eth_drv_sg *sg_list, int sg_len ) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1214 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1215 struct i82559 *p_i82559; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1216 RFD *p_rfd; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1217 int next_descriptor; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1218 int total_len; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1219 struct eth_drv_sg *last_sg; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1220 volatile cyg_uint8 *from_p; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1221 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1222 p_i82559 = (struct i82559 *)sc->driver_private; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1223 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1224 IF_BAD_82559( p_i82559 ) { |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1225 #ifdef DEBUG |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1226 os_printf( "i82559_recv: Bad device pointer %x\n", p_i82559 ); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1227 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1228 return; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1229 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1230 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1231 next_descriptor = p_i82559->next_rx_descriptor; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1232 p_rfd = p_i82559->rx_ring[next_descriptor]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1233 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1234 CYG_ASSERT( (cyg_uint8 *)p_rfd >= i82559_heap_base, "rfd under" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1235 CYG_ASSERT( (cyg_uint8 *)p_rfd < i82559_heap_free, "rfd over" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1236 |
|
105
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1237 CYG_ASSERT( p_rfd->rxstatus & RFD_STATUS_C, "No complete frame" ); |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1238 CYG_ASSERT( p_rfd->rxstatus & RFD_STATUS_EL, "No marked frame" ); |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1239 |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1240 CYG_ASSERT( p_rfd->rxstatus_lo & RFD_STATUS_LO_C, "No complete frame 2" ); |
|
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1241 CYG_ASSERT( p_rfd->rxstatus_hi & RFD_STATUS_HI_EL, "No marked frame 2" ); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1242 |
|
105
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1243 if ( 0 == (p_rfd->rxstatus & RFD_STATUS_C) ) |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1244 return; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1245 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1246 total_len = p_rfd->count; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1247 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1248 #ifdef DEBUG_82559 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1249 os_printf("Rx %d %x (status %x): %d sg's, %d bytes\n", |
|
105
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1250 p_i82559->index, (int)p_i82559, p_rfd->rxstatus, sg_len, total_len); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1251 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1252 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1253 // Copy the data to the network stack |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1254 from_p = &p_rfd->buffer[0]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1255 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1256 // check we have memory to copy into; we would be called even if |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1257 // caller was out of memory in order to maintain our state. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1258 if ( 0 == sg_len || 0 == sg_list ) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1259 return; // caller was out of mbufs |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1260 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1261 CYG_ASSERT( 0 < sg_len, "sg_len underflow" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1262 CYG_ASSERT( MAX_ETH_DRV_SG >= sg_len, "sg_len overflow" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1263 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1264 for ( last_sg = &sg_list[sg_len]; sg_list < last_sg; sg_list++ ) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1265 cyg_uint8 *to_p; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1266 int l; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1267 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1268 to_p = (cyg_uint8 *)(sg_list->buf); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1269 l = sg_list->len; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1270 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1271 if ( 0 == l || 0 == to_p ) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1272 return; // caller was out of mbufs |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1273 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1274 if ( l > total_len ) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1275 l = total_len; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1276 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1277 memcpy( to_p, (unsigned char *)from_p, l ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1278 from_p += l; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1279 total_len -= l; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1280 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1281 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1282 CYG_ASSERT( 0 == total_len, "total_len mismatch in rx" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1283 CYG_ASSERT( last_sg == sg_list, "sg count mismatch in rx" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1284 CYG_ASSERT( &p_rfd->buffer[0] < from_p, "from_p wild in rx" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1285 CYG_ASSERT( &p_rfd->buffer[0] + MAX_RX_PACKET_SIZE >= from_p, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1286 "from_p overflow in rx" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1287 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1288 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1289 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1290 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1291 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1292 // Function : InitTxRing |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1293 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1294 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1295 static void InitTxRing(struct i82559* p_i82559) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1296 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1297 int i; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1298 cyg_uint32 ioaddr; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1299 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1300 #ifdef DEBUG_82559 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1301 os_printf("InitTxRing %d\n", p_i82559->index); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1302 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1303 ioaddr = p_i82559->io_address; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1304 for ( i = 0; i < MAX_TX_DESCRIPTORS; i++) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1305 p_i82559->tx_ring[i] = (TxCB *)pciwindow_mem_alloc( |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1306 sizeof(TxCB) + MAX_TX_PACKET_SIZE); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1307 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1308 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1309 ResetTxRing(p_i82559); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1310 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1311 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1312 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1313 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1314 // Function : ResetTxRing |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1315 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1316 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1317 static void ResetTxRing(struct i82559* p_i82559) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1318 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1319 int i; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1320 cyg_uint32 ioaddr; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1321 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1322 #ifdef DEBUG_82559 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1323 os_printf("ResetTxRing %d\n", p_i82559->index); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1324 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1325 ioaddr = p_i82559->io_address; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1326 p_i82559->tx_descriptor_add = |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1327 p_i82559->tx_descriptor_active = |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1328 p_i82559->tx_descriptor_remove = 0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1329 p_i82559->tx_in_progress = |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1330 p_i82559->tx_queue_full = 0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1331 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1332 for ( i = 0; i < MAX_TX_DESCRIPTORS; i++) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1333 TxCB *p_txcb = p_i82559->tx_ring[i]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1334 CYG_ASSERT( (cyg_uint8 *)p_txcb >= i82559_heap_base, "txcb under" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1335 CYG_ASSERT( (cyg_uint8 *)p_txcb < i82559_heap_free, "txcb over" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1336 |
|
105
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1337 p_txcb->txstatus = 0; |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1338 p_txcb->command = 0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1339 p_txcb->link = VIRT_TO_BUS((cyg_uint32)p_txcb); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1340 p_txcb->tbd_address = 0xFFFFFFFF; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1341 p_txcb->tbd_number = 0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1342 p_txcb->tx_threshold = 16; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1343 p_txcb->eof = 1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1344 p_txcb->count = 0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1345 p_i82559->tx_keys[i] = 0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1346 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1347 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1348 wait_for_cmd_done(ioaddr); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1349 OUTL(0, ioaddr + SCBPointer); |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1350 OUTW(SCB_M | CU_ADDR_LOAD, ioaddr + SCBCmd); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1351 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1352 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1353 // ------------------------------------------------------------------------ |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1354 // |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1355 // Function : TxMachine (Called from FG & ISR) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1356 // |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1357 // This steps the Tx Machine onto the next record if necessary - allowing |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1358 // for missed interrupts, and so on. |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1359 // ------------------------------------------------------------------------ |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1360 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1361 static void TxMachine(struct i82559* p_i82559) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1362 { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1363 int tx_descriptor_active; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1364 cyg_uint32 ioaddr; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1365 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1366 tx_descriptor_active = p_i82559->tx_descriptor_active; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1367 ioaddr = p_i82559->io_address; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1368 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1369 // See if the CU is idle when we think it isn't: |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1370 // (Recovers from a dropped interrupt) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1371 if ( p_i82559->tx_in_progress ) { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1372 cyg_uint16 status; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1373 status = INW(ioaddr + SCBStatus); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1374 if ( 0 == (status & CU_STATUS_MASK) ) { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1375 // It is idle. So ack the TX interrupts |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1376 OUTW( SCB_INTACK_TX, ioaddr + SCBStatus); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1377 // (see pages 6-10 & 6-90) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1378 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1379 // and step on to the next queued tx. |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1380 p_i82559->tx_in_progress = 0; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1381 if ( ++tx_descriptor_active >= MAX_TX_DESCRIPTORS ) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1382 tx_descriptor_active = 0; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1383 p_i82559->tx_descriptor_active = tx_descriptor_active; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1384 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1385 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1386 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1387 // is the CU idle, and there a next tx to set going? |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1388 if ( ( ! p_i82559->tx_in_progress ) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1389 && p_i82559->tx_descriptor_add != tx_descriptor_active ) { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1390 TxCB *p_txcb; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1391 p_txcb = p_i82559->tx_ring[tx_descriptor_active]; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1392 CYG_ASSERT( (cyg_uint8 *)p_txcb >= i82559_heap_base, "txcb under" ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1393 CYG_ASSERT( (cyg_uint8 *)p_txcb < i82559_heap_free, "txcb over" ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1394 #ifdef DEBUG_82559 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1395 os_printf("Tx %d %x: Starting Engines, KEY %x\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1396 p_i82559->index, (int)p_i82559, key ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1397 #endif |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1398 // make sure no command operating |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1399 wait_for_cmd_done(ioaddr); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1400 // start Tx operation |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1401 OUTL(VIRT_TO_BUS(p_txcb), ioaddr + SCBPointer); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1402 OUTW(CU_START, ioaddr + SCBCmd); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1403 p_i82559->tx_in_progress = 1; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1404 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1405 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1406 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1407 // ------------------------------------------------------------------------ |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1408 // |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1409 // Function : TxDone (Called from DSR) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1410 // |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1411 // This returns Tx's from the Tx Machine to the stack (ie. reports |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1412 // completion) - allowing for missed interrupts, and so on. |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1413 // ------------------------------------------------------------------------ |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1414 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1415 static void TxDone(struct i82559* p_i82559) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1416 { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1417 struct cyg_netdevtab_entry *ndp; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1418 struct eth_drv_sc *sc; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1419 int tx_descriptor_remove = p_i82559->tx_descriptor_remove; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1420 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1421 ndp = (struct cyg_netdevtab_entry *)(p_i82559->ndp); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1422 sc = (struct eth_drv_sc *)(ndp->device_instance); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1423 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1424 CHECK_NDP_SC_LINK(); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1425 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1426 // "Done" txen are from here to active, OR |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1427 // the remove one if the queue is full AND its status is nonzero: |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1428 while ( (tx_descriptor_remove != p_i82559->tx_descriptor_active) || |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1429 ( p_i82559->tx_queue_full && |
|
105
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1430 (0 != p_i82559->tx_ring[ tx_descriptor_remove ]->txstatus) ) ) { |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1431 unsigned long key = p_i82559->tx_keys[ tx_descriptor_remove ]; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1432 #ifdef DEBUG_82559 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1433 os_printf("TxDone %d %x: KEY %x\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1434 p_i82559->index, (int)p_i82559, key ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1435 #endif |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1436 eth_drv_tx_done( sc, key, 1 /* status */ ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1437 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1438 if ( ++tx_descriptor_remove >= MAX_TX_DESCRIPTORS ) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1439 tx_descriptor_remove = 0; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1440 p_i82559->tx_descriptor_remove = tx_descriptor_remove; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1441 p_i82559->tx_queue_full = 0; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1442 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1443 } |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1444 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1445 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1446 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1447 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1448 // Function : i82559_can_send |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1449 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1450 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1451 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1452 static int |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1453 i82559_can_send(struct eth_drv_sc *sc) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1454 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1455 // return 1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1456 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1457 struct i82559 *p_i82559; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1458 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1459 p_i82559 = (struct i82559 *)sc->driver_private; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1460 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1461 IF_BAD_82559( p_i82559 ) { |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1462 #ifdef DEBUG |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1463 os_printf( "i82559_send: Bad device pointer %x\n", p_i82559 ); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1464 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1465 return 0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1466 } |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1467 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1468 // Advance TxMachine atomically |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1469 Mask82559Interrupt(p_i82559); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1470 TxMachine(p_i82559); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1471 Acknowledge82559Interrupt(p_i82559); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1472 UnMask82559Interrupt(p_i82559); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1473 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1474 return ! p_i82559->tx_queue_full; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1475 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1476 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1477 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1478 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1479 // Function : i82559_send |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1480 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1481 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1482 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1483 static void |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1484 i82559_send(struct eth_drv_sc *sc, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1485 struct eth_drv_sg *sg_list, int sg_len, int total_len, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1486 unsigned long key) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1487 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1488 struct i82559 *p_i82559; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1489 int tx_descriptor_add; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1490 TxCB *p_txcb; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1491 cyg_uint32 ioaddr; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1492 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1493 p_i82559 = (struct i82559 *)sc->driver_private; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1494 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1495 IF_BAD_82559( p_i82559 ) { |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1496 #ifdef DEBUG |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1497 os_printf( "i82559_send: Bad device pointer %x\n", p_i82559 ); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1498 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1499 return; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1500 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1501 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1502 #ifdef DEBUG_82559 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1503 os_printf("Tx %d %x: %d sg's, %d bytes, KEY %x\n", |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1504 p_i82559->index, (int)p_i82559, sg_len, total_len, key ); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1505 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1506 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1507 if ( ! p_i82559->active ) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1508 return; // device inactive, no return |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1509 #ifdef KEEP_STATISTICS |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1510 statistics[p_i82559->index].tx_count++; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1511 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1512 ioaddr = p_i82559->io_address; // get device I/O address |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1513 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1514 if ( p_i82559->tx_queue_full ) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1515 #ifdef KEEP_STATISTICS |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1516 statistics[p_i82559->index].tx_dropped++; |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1517 #endif |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1518 #ifdef DEBUG_82559 |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1519 os_printf( "i82559_send: Queue full, device %x, key %x\n", |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1520 p_i82559, key ); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1521 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1522 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1523 else { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1524 struct eth_drv_sg *last_sg; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1525 volatile cyg_uint8 *to_p; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1526 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1527 tx_descriptor_add = p_i82559->tx_descriptor_add; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1528 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1529 p_i82559->tx_keys[tx_descriptor_add] = key; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1530 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1531 p_txcb = p_i82559->tx_ring[tx_descriptor_add]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1532 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1533 CYG_ASSERT( (cyg_uint8 *)p_txcb >= i82559_heap_base, "txcb under" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1534 CYG_ASSERT( (cyg_uint8 *)p_txcb < i82559_heap_free, "txcb over" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1535 |
|
105
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
1536 p_txcb->txstatus = 0; |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1537 p_txcb->command = TxCB_CMD_TRANSMIT | TxCB_CMD_S |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1538 | TxCB_CMD_I | TxCB_CMD_EL; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1539 p_txcb->link = VIRT_TO_BUS((cyg_uint32)p_txcb); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1540 p_txcb->tbd_address = 0xFFFFFFFF; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1541 p_txcb->tbd_number = 0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1542 p_txcb->tx_threshold = 16; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1543 p_txcb->eof = 1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1544 p_txcb->count = total_len; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1545 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1546 // Copy from the sglist into the txcb |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1547 to_p = &p_txcb->buffer[0]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1548 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1549 CYG_ASSERT( 0 < sg_len, "sg_len underflow" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1550 CYG_ASSERT( MAX_ETH_DRV_SG >= sg_len, "sg_len overflow" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1551 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1552 for ( last_sg = &sg_list[sg_len]; sg_list < last_sg; sg_list++ ) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1553 cyg_uint8 *from_p; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1554 int l; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1555 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1556 from_p = (cyg_uint8 *)(sg_list->buf); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1557 l = sg_list->len; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1558 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1559 if ( l > total_len ) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1560 l = total_len; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1561 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1562 memcpy( (unsigned char *)to_p, from_p, l ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1563 to_p += l; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1564 total_len -= l; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1565 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1566 if ( 0 > total_len ) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1567 break; // Should exit via sg_last normally |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1568 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1569 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1570 CYG_ASSERT( 0 == total_len, "length mismatch in tx" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1571 CYG_ASSERT( last_sg == sg_list, "sg count mismatch in tx" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1572 CYG_ASSERT( &p_txcb->buffer[0] < to_p, "to_p wild in tx" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1573 CYG_ASSERT( &p_txcb->buffer[0] + MAX_TX_PACKET_SIZE >= to_p, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1574 "to_p overflow in tx" ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1575 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1576 // Next descriptor |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1577 if ( ++tx_descriptor_add >= MAX_TX_DESCRIPTORS) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1578 tx_descriptor_add = 0; |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1579 p_i82559->tx_descriptor_add = tx_descriptor_add; |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1580 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1581 if ( p_i82559->tx_descriptor_remove == tx_descriptor_add ) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1582 p_i82559->tx_queue_full = 1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1583 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1584 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1585 // Try advancing the Tx Machine regardless |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1586 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1587 // no more interrupts until started |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1588 Mask82559Interrupt(p_i82559); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1589 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1590 // Check that either: |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1591 // tx is already active, there is other stuff queued, |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1592 // OR this tx just added is the current active one. |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1593 CYG_ASSERT( (p_i82559->tx_in_progress == 1) || |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1594 ((p_i82559->tx_descriptor_add-1) == p_i82559->tx_descriptor_active) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1595 || ((0 == p_i82559->tx_descriptor_add) && |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1596 ((MAX_TX_DESCRIPTORS-1) == p_i82559->tx_descriptor_active)), |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1597 "Active/add mismatch" ); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1598 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1599 // Advance TxMachine atomically |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1600 TxMachine(p_i82559); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1601 Acknowledge82559Interrupt(p_i82559); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1602 UnMask82559Interrupt(p_i82559); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1603 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1604 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1605 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1606 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1607 // Function : i82559_reset |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1608 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1609 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1610 static void i82559_reset(struct i82559* p_i82559) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1611 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1612 cyg_uint32 ioaddr; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1613 int count; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1614 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1615 ioaddr = p_i82559->io_address; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1616 // make sure no command operating |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1617 wait_for_cmd_done(ioaddr); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1618 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1619 OUTL(I82559_SELECTIVE_RESET, ioaddr + SCBPort); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1620 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1621 for (count = 10 ; count-- ; ) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1622 udelay(1000); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1623 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1624 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1625 OUTL(I82559_RESET, ioaddr + SCBPort); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1626 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1627 for (count = 10 ; count-- ; ) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1628 udelay(1000); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1629 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1630 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1631 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1632 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1633 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1634 // |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1635 // INTERRUPT HANDLERS |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1636 // |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1637 // ------------------------------------------------------------------------ |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1638 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1639 static cyg_uint32 eth_isr(cyg_vector_t vector, cyg_addrword_t data) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1640 { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1641 struct i82559* p_i82559 = (struct i82559 *)data; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1642 cyg_uint16 status; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1643 cyg_uint32 ioaddr; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1644 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1645 IF_BAD_82559( p_i82559 ) { |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1646 #ifdef DEBUG |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1647 os_printf( "i82559_isr: Bad device pointer %x\n", p_i82559 ); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1648 #endif |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1649 return 0; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1650 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1651 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1652 ioaddr = p_i82559->io_address; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1653 status = INW(ioaddr + SCBStatus); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1654 // Acknowledge all INT sources that were active |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1655 OUTW( status & SCB_INTACK_MASK, ioaddr + SCBStatus); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1656 // (see pages 6-10 & 6-90) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1657 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1658 #ifdef KEEP_STATISTICS |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1659 statistics[p_i82559->index].interrupts++; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1660 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1661 // receiver left ready state ? |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1662 if ( status & SCB_STATUS_RNR ) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1663 statistics[p_i82559->index].rx_resource++; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1664 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1665 // frame receive interrupt ? |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1666 if ( status & SCB_STATUS_FR ) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1667 statistics[p_i82559->index].rx_count++; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1668 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1669 // transmit interrupt ? |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1670 if ( status & SCB_STATUS_CX ) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1671 statistics[p_i82559->index].tx_complete++; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1672 #endif |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1673 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1674 // Advance the Tx Machine regardless |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1675 TxMachine(p_i82559); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1676 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1677 // it should have settled down now... |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1678 Acknowledge82559Interrupt(p_i82559); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1679 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1680 return CYG_ISR_CALL_DSR; // schedule DSR |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1681 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1682 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1683 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1684 // ------------------------------------------------------------------------ |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1685 static int mux_device_index = 0; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1686 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1687 static cyg_uint32 eth_mux_isr(cyg_vector_t vector, cyg_addrword_t data) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1688 { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1689 int device_index = mux_device_index; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1690 struct i82559* p_i82559; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1691 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1692 mux_device_index ^= 1; // look at the other one first next time. |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1693 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1694 do { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1695 p_i82559 = &i82559[device_index]; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1696 if ( p_i82559->active ) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1697 (void)eth_isr( vector, (cyg_addrword_t)p_i82559 ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1698 device_index ^= 1; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1699 } while ( device_index == mux_device_index ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1700 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1701 return CYG_ISR_CALL_DSR; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1702 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1703 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1704 // ------------------------------------------------------------------------ |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1705 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1706 void eth_dsr(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1707 { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1708 struct i82559* p_i82559 = (struct i82559 *)data; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1709 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1710 // First pass any rx data up the stack |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1711 PacketRxReady(p_i82559); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1712 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1713 // Then scan for completed Txen and inform the stack |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1714 TxDone(p_i82559); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1715 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1716 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1717 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1718 // ------------------------------------------------------------------------ |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1719 void eth_mux_dsr(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1720 { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1721 int device_index = mux_device_index; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1722 struct i82559* p_i82559; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1723 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1724 mux_device_index ^= 1; // look at the other one first next time. |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1725 // (non-atomicity wrt IRQ does not matter) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1726 do { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1727 p_i82559 = &i82559[device_index]; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1728 if ( p_i82559->active ) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1729 eth_dsr( vector, count, (cyg_addrword_t)p_i82559 ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1730 device_index ^= 1; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1731 } while ( device_index == mux_device_index ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1732 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1733 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1734 // ------------------------------------------------------------------------ |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1735 // |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1736 // Function : pci_init_find_82559s |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1737 // |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1738 // This is called exactly once at the start of time to: |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1739 // o scan the PCI bus for objects |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1740 // o record them in the device table |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1741 // o acquire all the info needed for the driver to access them |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1742 // o instantiate interrupts for them |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1743 // o attach those interrupts appropriately |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1744 // ------------------------------------------------------------------------ |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1745 static int |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1746 pci_init_find_82559s( void ) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1747 { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1748 cyg_pci_device_id devid; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1749 cyg_pci_device dev_info; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1750 cyg_uint16 cmd; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1751 int device_index; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1752 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1753 // MUX interrupt - special case when 2 cards share one intr. |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1754 static cyg_handle_t mux_interrupt_handle = 0; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1755 static cyg_interrupt mux_interrupt_object; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1756 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1757 #ifdef DEBUG |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1758 db_printf("pci_init_find_82559s()\n"); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1759 #endif |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1760 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1761 // allocate memory to be used in ioctls later |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1762 if (mem_reserved_ioctl != (void*)0) { |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1763 #ifdef DEBUG |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1764 db_printf("pci_init_find_82559s() called > once\n"); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1765 #endif |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1766 return 0; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1767 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1768 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1769 // First initialize the heap in PCI window'd memory |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1770 i82559_heap_size = CYGHWR_HAL_ARM_EBSA285_PCI_MEM_MAP_SIZE; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1771 i82559_heap_base = (cyg_uint8 *)CYGHWR_HAL_ARM_EBSA285_PCI_MEM_MAP_BASE; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1772 i82559_heap_free = i82559_heap_base; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1773 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1774 mem_reserved_ioctl = pciwindow_mem_alloc(MAX_MEM_RESERVED_IOCTL); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1775 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1776 cyg_pci_init(); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1777 #ifdef DEBUG |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1778 db_printf("Finished cyg_pci_init();\n"); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1779 #endif |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1780 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1781 devid = CYG_PCI_NULL_DEVID; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1782 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1783 for (device_index = 0; device_index < MAX_82559; device_index++) { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1784 struct i82559 *p_i82559 = &i82559[device_index]; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1785 p_i82559->index = device_index; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1786 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1787 if (cyg_pci_find_device(0x8086, 0x1229, &devid) ) { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1788 #ifdef DEBUG |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1789 db_printf("eth%d = 82559\n", device_index); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1790 #endif |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1791 cyg_pci_get_device_info(devid, &dev_info); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1792 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1793 if (cyg_pci_translate_interrupt(&dev_info, &p_i82559->vector)) { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1794 #ifdef DEBUG |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1795 db_printf(" Wired to HAL vector %d\n", p_i82559->vector); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1796 #endif |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1797 cyg_drv_interrupt_create( |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1798 p_i82559->vector, |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1799 0, // Priority - unused |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1800 (CYG_ADDRWORD)p_i82559, // Data item passed to ISR & DSR |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1801 eth_isr, // ISR |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1802 eth_dsr, // DSR |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1803 &p_i82559->interrupt_handle, // handle to intr obj |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1804 &p_i82559->interrupt_object ); // space for int obj |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1805 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1806 cyg_drv_interrupt_attach(p_i82559->interrupt_handle); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1807 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1808 // Don't unmask the interrupt yet, that could get us into a |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1809 // race. |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1810 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1811 // ALSO attach it to interrupt #18 for multiplexed |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1812 // interrupts. This is for certain boards where the |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1813 // PCI backplane is wired "straight through" instead of |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1814 // with a rotation of interrupt lines in the different |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1815 // slots. |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1816 if ( ! mux_interrupt_handle ) { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1817 #ifdef DEBUG |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1818 db_printf(" Also attaching to HAL vector %d\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1819 CYGNUM_HAL_INTERRUPT_PCI_IRQ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1820 #endif |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1821 cyg_drv_interrupt_create( |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1822 CYGNUM_HAL_INTERRUPT_PCI_IRQ, |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1823 0, // Priority - unused |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1824 0, // Data item passed to ISR (not used) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1825 eth_mux_isr, // ISR |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1826 eth_mux_dsr, // DSR |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1827 &mux_interrupt_handle, |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1828 &mux_interrupt_object ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1829 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1830 cyg_drv_interrupt_attach(mux_interrupt_handle); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1831 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1832 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1833 else { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1834 p_i82559->vector=0; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1835 #ifdef DEBUG |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1836 db_printf(" Does not generate interrupts.\n"); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1837 #endif |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1838 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1839 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1840 if (cyg_pci_configure_device(&dev_info)) { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1841 #ifdef DEBUG |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1842 int i; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1843 db_printf("Found device on bus %d, devfn 0x%02x:\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1844 CYG_PCI_DEV_GET_BUS(devid), |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1845 CYG_PCI_DEV_GET_DEVFN(devid)); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1846 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1847 if (dev_info.command & CYG_PCI_CFG_COMMAND_ACTIVE) { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1848 db_printf(" Note that board is active. Probed" |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1849 " sizes and CPU addresses invalid!\n"); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1850 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1851 db_printf(" Vendor 0x%04x", dev_info.vendor); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1852 db_printf("\n Device 0x%04x", dev_info.device); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1853 db_printf("\n Command 0x%04x, Status 0x%04x\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1854 dev_info.command, dev_info.status); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1855 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1856 db_printf(" Class/Rev 0x%08x", dev_info.class_rev); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1857 db_printf("\n Header 0x%02x\n", dev_info.header_type); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1858 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1859 db_printf(" SubVendor 0x%04x, Sub ID 0x%04x\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1860 dev_info.header.normal.sub_vendor, |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1861 dev_info.header.normal.sub_id); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1862 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1863 for(i = 0; i < CYG_PCI_MAX_BAR; i++) { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1864 db_printf(" BAR[%d] 0x%08x /", i, dev_info.base_address[i]); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1865 db_printf(" probed size 0x%08x / CPU addr 0x%08x\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1866 dev_info.base_size[i], dev_info.base_map[i]); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1867 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1868 db_printf(" eth%d configured\n", device_index); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1869 #endif |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1870 p_i82559->found = 1; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1871 p_i82559->active = 0; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1872 p_i82559->devid = devid; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1873 p_i82559->memory_address = dev_info.base_map[0]; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1874 p_i82559->io_address = dev_info.base_map[1]; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1875 #ifdef DEBUG |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1876 db_printf(" memory address = 0x%08x\n", dev_info.base_map[0]); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1877 db_printf(" I/O address = 0x%08x\n", dev_info.base_map[1]); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1878 #endif |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1879 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1880 // Don't use cyg_pci_set_device_info since it clears |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1881 // some of the fields we want to print out below. |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1882 cyg_pci_read_config_uint16(dev_info.devid, CYG_PCI_CFG_COMMAND, &cmd); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1883 cmd |= CYG_PCI_CFG_COMMAND_IO // enable I/O space |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1884 | CYG_PCI_CFG_COMMAND_MEMORY // enable memory space |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1885 | CYG_PCI_CFG_COMMAND_MASTER; // enable bus master |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1886 cyg_pci_write_config_uint16(dev_info.devid, CYG_PCI_CFG_COMMAND, cmd); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1887 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1888 // Now the PCI part of the device is configured, reset it. This |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1889 // should make it safe to enable the interrupt |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1890 i82559_reset(p_i82559); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1891 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1892 if (p_i82559->vector != 0) { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1893 cyg_interrupt_acknowledge(p_i82559->vector); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1894 cyg_drv_interrupt_unmask(p_i82559->vector); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1895 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1896 #ifdef DEBUG |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1897 db_printf(" **** Device enabled for I/O and Memory and Bus Master\n"); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1898 #endif |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1899 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1900 else { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1901 p_i82559->found = 0; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1902 p_i82559->active = 0; |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1903 #ifdef DEBUG |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1904 db_printf("Failed to configure device %d\n",device_index); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1905 #endif |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1906 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1907 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1908 else { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1909 p_i82559->found = 0; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1910 p_i82559->active = 0; |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1911 #ifdef DEBUG |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1912 db_printf("eth%d not found\n", device_index); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1913 #endif |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1914 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1915 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1916 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1917 // Now enable the mux shared interrupt if it is in use |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1918 if (mux_interrupt_handle) { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1919 cyg_interrupt_acknowledge(CYGNUM_HAL_INTERRUPT_PCI_IRQ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1920 cyg_drv_interrupt_unmask(CYGNUM_HAL_INTERRUPT_PCI_IRQ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1921 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1922 |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1923 // Now a delay to ensure the hardware has "come up" before you try to |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1924 // use it. Yes, really, the full 2 seconds. It's only really |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1925 // necessary if DEBUG is off - otherwise all that printout wastes |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1926 // enough time. No kidding. |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1927 udelay( 2000000 ); |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1928 return 1; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1929 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1930 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1931 // ------------------------------------------------------------------------ |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1932 // |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1933 // Function : eth_set_promiscuous_mode |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1934 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1935 // Return : 0 = It worked. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1936 // non0 = It failed. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1937 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1938 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1939 static int eth_set_promiscuous_mode(struct i82559* p_i82559) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1940 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1941 cyg_uint32 ioaddr; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1942 volatile CONFIG_CMD_STRUCT *ccs; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1943 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1944 IF_BAD_82559( p_i82559 ) { |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1945 #ifdef DEBUG |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1946 os_printf( "eth_set_promiscuos_mode: Bad device pointer %x\n", |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1947 p_i82559 ); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
1948 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1949 return -1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1950 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1951 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1952 ioaddr = p_i82559->io_address; |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1953 wait_for_cmd_done(ioaddr); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1954 // load cu base address = 0 */ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1955 OUTL(0, ioaddr + SCBPointer); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1956 // 32 bit linear addressing used |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1957 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1958 OUTW(SCB_M | CU_ADDR_LOAD, ioaddr + SCBCmd); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1959 // wait for SCB command complete |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
1960 wait_for_cmd_done(ioaddr); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1961 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1962 ccs = (CONFIG_CMD_STRUCT *)mem_reserved_ioctl; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1963 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1964 // Check the malloc we did earlier worked |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1965 if (ccs == (void*)0) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1966 return 2; // Failed |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1967 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1968 ccs->cb_entry.cb_cmd=0x2; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1969 ccs->cb_entry.cb_cmd_word=0x0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1970 ccs->cb_entry.cb_status_word=0x0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1971 ccs->cb_entry.cb_int=0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1972 ccs->cb_entry.cb_suspend=1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1973 ccs->cb_entry.cb_el=1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1974 ccs->cb_entry.cb_complete=0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1975 ccs->cb_entry.cb_link_offset=VIRT_TO_BUS((cyg_uint32)&ccs); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1976 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1977 // Default values from the Intel Manual |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1978 ccs->config_bytes[0]=0x13; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1979 ccs->config_bytes[1]=0x8; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1980 ccs->config_bytes[2]=0x0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1981 ccs->config_bytes[3]=0x0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1982 ccs->config_bytes[4]=0x0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1983 ccs->config_bytes[5]=0x0; |
|
101
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1984 ccs->config_bytes[6]=0xb2; // (promisc ? 0x80 : 0) | 0x32 for small stats, |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1985 ccs->config_bytes[7]=0x0; // \ ditto | 0x12 for stats with PAUSE stats |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1986 ccs->config_bytes[8]=0x0; // \ ditto | 0x16 for PAUSE + TCO stats |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1987 ccs->config_bytes[9]=0x0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1988 ccs->config_bytes[10]=0x28; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1989 ccs->config_bytes[11]=0x0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1990 ccs->config_bytes[12]=0x60; |
|
101
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1991 ccs->config_bytes[13]=0x0; // arp |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1992 ccs->config_bytes[14]=0x0; // arp |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1993 |
|
101
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1994 ccs->config_bytes[15]=0x81; // promiscuous mode set |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
1995 // \ or 0x80 for normal mode. |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1996 ccs->config_bytes[16]=0x0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1997 ccs->config_bytes[17]=0x40; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1998 ccs->config_bytes[18]=0x70; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
1999 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2000 // wait for SCB command complete |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2001 wait_for_cmd_done(ioaddr); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2002 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2003 OUTL(VIRT_TO_BUS(ccs), ioaddr + SCBPointer); |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2004 OUTW(SCB_M | CU_START, ioaddr + SCBCmd); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2005 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2006 // now check for result ... |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2007 wait_for_cmd_done(ioaddr); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2008 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2009 if ( (!ccs->cb_entry.cb_ok) || (!ccs->cb_entry.cb_complete) ) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2010 return 1; // Failed |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2011 return 0; // OK |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2012 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2013 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2014 // ------------------------------------------------------------------------ |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2015 // We use this as a templete when writing a new MAC address into the |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2016 // eeproms. The MAC address in the first few bytes is over written |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2017 // with the correct MAC address and then the whole lot is programmed |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2018 // into the serial EEPROM. The checksum is calculated on the fly and |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2019 // sent instead of the last two bytes. |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2020 // The values are copied from the Intel EtherPro10/100+ &c devices |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2021 // in the EBSA boards. |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2022 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2023 #ifdef CYGPKG_DEVS_ETH_ARM_EBSA285_WRITE_EEPROM |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2024 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2025 #define ee00 0x00, 0x00 // shorthand |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2026 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2027 static char eeprom_burn[126] = { |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2028 /* halfword addresses! */ |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2029 /* 0: */ 0x00, 0x90, 0x27, 0x8c, 0x57, 0x82, 0x03, 0x02, |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2030 /* 4: */ ee00 , 0x01, 0x02, 0x01, 0x47, ee00 , |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2031 /* 8: */ 0x13, 0x72, 0x06, 0x83, 0xa2, 0x40, 0x0c, 0x00, |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2032 /* C: */ 0x86, 0x80, ee00 , ee00 , ee00 , |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2033 /* 10: */ ee00 , ee00 , ee00 , ee00 , |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2034 /* 14: */ ee00 , ee00 , ee00 , ee00 , |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2035 /* 18: */ ee00 , ee00 , ee00 , ee00 , |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2036 /* 1C: */ ee00 , ee00 , ee00 , ee00 , |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2037 /* 20: */ ee00 , ee00 , ee00 , ee00 , |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2038 /* 24: */ ee00 , ee00 , ee00 , ee00 , |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2039 /* 28: */ ee00 , ee00 , ee00 , ee00 , |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2040 /* 2C: */ ee00 , ee00 , ee00 , ee00 , |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2041 /* 30: */ 0x28, 0x01, ee00 , ee00 , ee00 , |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2042 /* 34: */ ee00 , ee00 , ee00 , ee00 , |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2043 /* 38: */ ee00 , ee00 , ee00 , ee00 , |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2044 /* 3C: */ ee00 , ee00 , ee00 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2045 }; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2046 #undef ee00 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2047 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2048 #endif |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2049 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2050 // ------------------------------------------------------------------------ |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2051 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2052 // Function : eth_set_mac_address |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2053 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2054 // Return : 0 = It worked. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2055 // non0 = It failed. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2056 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2057 static int eth_set_mac_address(struct i82559* p_i82559, char *addr) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2058 { |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2059 #ifdef CYGPKG_DEVS_ETH_ARM_EBSA285_WRITE_EEPROM |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2060 int checksum, i, count; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2061 // (this is the length of the *EEPROM*s address, not MAC address) |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2062 int addr_length; |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2063 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2064 cyg_uint32 ioaddr; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2065 volatile CONFIG_CMD_STRUCT *ccs; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2066 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2067 IF_BAD_82559( p_i82559 ) { |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2068 #ifdef DEBUG |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2069 os_printf( "eth_set_mac_address : Bad device pointer %x\n", |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2070 p_i82559 ); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2071 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2072 return -1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2073 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2074 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2075 ioaddr = p_i82559->io_address; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2076 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2077 wait_for_cmd_done(ioaddr); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2078 |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2079 ccs = (CONFIG_CMD_STRUCT *)mem_reserved_ioctl; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2080 if (ccs == (void*)0) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2081 return 2; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2082 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2083 ccs->cb_entry.cb_cmd=0x1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2084 ccs->cb_entry.cb_cmd_word=0x0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2085 ccs->cb_entry.cb_status_word=0x0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2086 ccs->cb_entry.cb_int=0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2087 ccs->cb_entry.cb_suspend=1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2088 ccs->cb_entry.cb_el=1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2089 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2090 memcpy((char *)(ccs->config_bytes),addr,6); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2091 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2092 ccs->config_bytes[6]=0x0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2093 ccs->config_bytes[7]=0x0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2094 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2095 ioaddr = p_i82559->io_address; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2096 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2097 OUTL(VIRT_TO_BUS(ccs), ioaddr + SCBPointer); |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2098 OUTW(SCB_M | CU_START, ioaddr + SCBCmd); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2099 // Next delay seems to be required, otherwise, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2100 // cb_ok/cb_complete won't be set later. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2101 |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2102 udelay(1000); |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2103 wait_for_cmd_done(ioaddr); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2104 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2105 // now check for result ... |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2106 if ( (!ccs->cb_entry.cb_ok) || (!ccs->cb_entry.cb_complete) ) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2107 return 3; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2108 |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2109 #ifdef CYGPKG_DEVS_ETH_ARM_EBSA285_WRITE_EEPROM |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2110 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2111 addr_length = get_eeprom_size( ioaddr ); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2112 |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2113 // now set this address in the device eeprom .... |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2114 (void)memcpy(eeprom_burn,addr,6); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2115 |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2116 // No idea what these were for... |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2117 // eeprom_burn[20] &= 0xfe; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2118 // eeprom_burn[20] |= p_i82559->index; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2119 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2120 program_eeprom( ioaddr, addr_length, eeprom_burn ); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2121 |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2122 // update 82559 driver data structure ... |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2123 udelay( 100000 ); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2124 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2125 // by reading EEPROM to get the mac address back |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2126 for (checksum = 0, i = 0, count = 0; count < 64; count++) { |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2127 cyg_uint16 value; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2128 // read word from eeprom |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2129 value = read_eeprom(ioaddr, count, addr_length); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2130 checksum += value; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2131 if (count < 3) { |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2132 p_i82559->mac_address[i++] = value & 0xFF; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2133 p_i82559->mac_address[i++] = (value >> 8) & 0xFF; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2134 } |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2135 } |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2136 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2137 #ifdef DEBUG |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2138 os_printf("MAC Address = %02X %02X %02X %02X %02X %02X\n", |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2139 p_i82559->mac_address[0], p_i82559->mac_address[1], |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2140 p_i82559->mac_address[2], p_i82559->mac_address[3], |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2141 p_i82559->mac_address[4], p_i82559->mac_address[5]); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2142 #endif |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2143 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2144 p_i82559->mac_addr_ok = 1; |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2145 |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2146 for ( i = 0, count = 0; i < 6; i++ ) |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2147 if ( p_i82559->mac_address[i] != addr[i] ) |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2148 count++; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2149 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2150 if ( count ) { |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2151 #ifdef DEBUG |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2152 os_printf( "Warning: MAC Address read back wrong! %d bytes differ.\n", |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2153 count ); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2154 #endif |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2155 p_i82559->mac_addr_ok = 0; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2156 } |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2157 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2158 // If the EEPROM checksum is wrong, the MAC address read from the |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2159 // EEPROM is probably wrong as well. In that case, we don't set |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2160 // mac_addr_ok. |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2161 if ((checksum & 0xFFFF) != 0xBABA) { |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2162 #ifdef DEBUG |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2163 os_printf( "Warning: Invalid EEPROM checksum %04X for device %d\n", |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2164 checksum, p_i82559->index); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2165 #endif |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2166 p_i82559->mac_addr_ok = 0; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2167 } |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2168 #else |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2169 p_i82559->mac_addr_ok = 1; |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2170 #endif // ! CYGPKG_DEVS_ETH_ARM_EBSA285_WRITE_EEPROM |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2171 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2172 return p_i82559->mac_addr_ok ? 0 : 1; |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2173 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2174 |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2175 #ifdef CYGPKG_DEVS_ETH_ARM_EBSA285_WRITE_EEPROM |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2176 // ------------------------------------------------------------------------ |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2177 static void |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2178 write_eeprom(long ioaddr, int location, int addr_len, unsigned short value) |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2179 { |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2180 int ee_addr = ioaddr + SCBeeprom; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2181 int write_cmd = location | EE_WRITE_CMD(addr_len); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2182 int i; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2183 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2184 OUTW(EE_ENB & ~EE_CS, ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2185 eeprom_delay( 100 ); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2186 OUTW(EE_ENB, ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2187 eeprom_delay( 100 ); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2188 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2189 // os_printf("\n write_eeprom : write_cmd : %x",write_cmd); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2190 // os_printf("\n addr_len : %x value : %x ",addr_len,value); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2191 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2192 /* Shift the write command bits out. */ |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2193 for (i = (addr_len+2); i >= 0; i--) { |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2194 short dataval = (write_cmd & (1 << i)) ? EE_DATA_WRITE : 0; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2195 OUTW(EE_ENB | dataval, ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2196 eeprom_delay(100); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2197 OUTW(EE_ENB | dataval | EE_SHIFT_CLK, ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2198 eeprom_delay(150); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2199 } |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2200 OUTW(EE_ENB, ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2201 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2202 for (i = 15; i >= 0; i--) { |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2203 short dataval = (value & (1 << i)) ? EE_DATA_WRITE : 0; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2204 OUTW(EE_ENB | dataval, ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2205 eeprom_delay(100); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2206 OUTW(EE_ENB | dataval | EE_SHIFT_CLK, ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2207 eeprom_delay(150); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2208 } |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2209 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2210 /* Terminate the EEPROM access. */ |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2211 OUTW(EE_ENB & ~EE_CS, ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2212 eeprom_delay(150000); // let the write take effect |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2213 } |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2214 |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2215 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2216 static int write_enable_eeprom(long ioaddr, int addr_len) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2217 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2218 int ee_addr = ioaddr + SCBeeprom; |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2219 int write_en_cmd = EE_WRITE_EN_CMD(addr_len); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2220 int i; |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2221 |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2222 OUTW(EE_ENB & ~EE_CS, ee_addr); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2223 OUTW(EE_ENB, ee_addr); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2224 |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2225 #ifdef DEBUG_82559 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2226 os_printf("write_en_cmd : %x",write_en_cmd); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2227 #endif |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2228 |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2229 // Shift the wr/er enable command bits out. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2230 for (i = (addr_len+2); i >= 0; i--) { |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2231 short dataval = (write_en_cmd & (1 << i)) ? EE_DATA_WRITE : 0; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2232 OUTW(EE_ENB | dataval, ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2233 eeprom_delay(100); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2234 OUTW(EE_ENB | dataval | EE_SHIFT_CLK, ee_addr); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2235 eeprom_delay(150); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2236 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2237 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2238 // Terminate the EEPROM access. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2239 OUTW(EE_ENB & ~EE_CS, ee_addr); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2240 eeprom_delay(EEPROM_DONE_DELAY); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2241 } |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2242 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2243 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2244 // ------------------------------------------------------------------------ |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2245 static void |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2246 program_eeprom(cyg_uint32 ioaddr, cyg_uint32 eeprom_size, cyg_uint8 *data) |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2247 { |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2248 cyg_uint32 i; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2249 cyg_uint16 checksum = 0; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2250 cyg_uint16 value; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2251 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2252 // First enable erase/write operations on the eeprom. |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2253 // This is done through the EWEN instruction. |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2254 write_enable_eeprom( ioaddr, eeprom_size ); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2255 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2256 for (i=0 ; i< 63 ; i++) { |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2257 value = ((unsigned short *)data)[i]; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2258 checksum += value; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2259 #ifdef DEBUG_82559 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2260 os_printf("\n i : %x ... value to be written : %x",i,value); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2261 #endif |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2262 write_eeprom( ioaddr, i, eeprom_size, value); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2263 #ifdef DEBUG_82559 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2264 os_printf("\n val read : %x ",read_eeprom(ioaddr,i,eeprom_size)); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2265 #endif |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2266 } |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2267 value = 0xBABA - checksum; |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2268 #ifdef DEBUG_82559 |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2269 os_printf("\n i : %x ... checksum adjustment val to be written : %x",i,value); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2270 #endif |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2271 write_eeprom( ioaddr, i, eeprom_size, value ); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2272 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2273 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2274 // ------------------------------------------------------------------------ |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2275 #endif // ! CYGPKG_DEVS_ETH_ARM_EBSA285_WRITE_EEPROM |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2276 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2277 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2278 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2279 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2280 // Function : eth_get_mac_address |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2281 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2282 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2283 #ifdef ETH_DRV_GET_MAC_ADDRESS |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2284 static int eth_get_mac_address(struct i82559* p_i82559, char *addr) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2285 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2286 IF_BAD_82559( p_i82559 ) { |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2287 #ifdef DEBUG |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2288 os_printf( "eth_get_mac_address : Bad device pointer %x\n", |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2289 p_i82559 ); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2290 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2291 return -1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2292 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2293 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2294 memcpy( addr, (char *)(&p_i82559->mac_address[0]), 6 ); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2295 return 0; |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2296 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2297 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2298 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2299 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2300 // Function : i82559_ioctl |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2301 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2302 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2303 static int i82559_ioctl(struct eth_drv_sc *sc, unsigned long key, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2304 void *data, int data_length) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2305 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2306 struct i82559 *p_i82559; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2307 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2308 p_i82559 = (struct i82559 *)sc->driver_private; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2309 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2310 IF_BAD_82559( p_i82559 ) { |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2311 #ifdef DEBUG |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2312 os_printf( "i82559_ioctl/control: Bad device pointer %x\n", p_i82559 ); |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2313 #endif |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2314 return -1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2315 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2316 |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2317 #ifdef DEBUG |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2318 db_printf( "i82559_ioctl: device eth%d at %x; key is 0x%x, data at %x[%d]\n", |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2319 p_i82559->index, p_i82559, key, data, data_length ); |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2320 #endif |
|
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2321 |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2322 switch ( key ) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2323 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2324 #ifdef ETH_DRV_SET_MAC_ADDRESS |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2325 case ETH_DRV_SET_MAC_ADDRESS: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2326 if ( 6 != data_length ) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2327 return -2; |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2328 return eth_set_mac_address( p_i82559, data ); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2329 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2330 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2331 #ifdef ETH_DRV_GET_MAC_ADDRESS |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2332 case ETH_DRV_GET_MAC_ADDRESS: |
|
88
afdeb44241de
Merge from eCos master repository on 2000-05-12-07:47:04-BST
jlarmour
parents:
84
diff
changeset
|
2333 return eth_get_mac_address( p_i82559, data ); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2334 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2335 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2336 default: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2337 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2338 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2339 return -1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2340 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2341 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2342 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2343 // |
|
101
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2344 // Statistics update... |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2345 // |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2346 // ------------------------------------------------------------------------ |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2347 |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2348 #ifdef KEEP_STATISTICS |
|
105
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
2349 #ifdef CYGDBG_DEVS_ETH_ARM_EBSA285_KEEP_82559_STATISTICS |
|
101
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2350 void update_statistics(struct i82559* p_i82559) |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2351 { |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2352 I82559_COUNTERS *p_statistics; |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2353 cyg_uint32 *p_counter; |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2354 cyg_uint32 *p_register; |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2355 int reg_count; |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2356 |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2357 Mask82559Interrupt(p_i82559); |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2358 |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2359 // This points to the sthared memory stats area/command block |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2360 p_statistics = (I82559_COUNTERS *)(p_i82559->p_statistics); |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2361 |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2362 if ( (p_statistics->done & 0xFFFF) == 0xA007 ) { |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2363 p_counter = (cyg_uint32 *)&i82559_counters[ p_i82559->index ]; |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2364 p_register = (cyg_uint32 *)p_statistics; |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2365 for ( reg_count = 0; |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2366 reg_count < sizeof( I82559_COUNTERS ) / sizeof( cyg_uint32 ) - 1; |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2367 reg_count++ ) { |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2368 *p_counter += *p_register; |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2369 p_counter++; |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2370 p_register++; |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2371 } |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2372 p_statistics->done = 0; |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2373 // make sure no command operating |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2374 wait_for_cmd_done(p_i82559->io_address); |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2375 // start register dump |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2376 OUTW(CU_DUMPSTATS, p_i82559->io_address + SCBCmd); |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2377 } |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2378 Acknowledge82559Interrupt(p_i82559); |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2379 UnMask82559Interrupt(p_i82559); |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2380 } |
|
105
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
2381 #endif |
|
101
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2382 #endif // KEEP_STATISTICS |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2383 |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2384 // ------------------------------------------------------------------------ |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
88
diff
changeset
|
2385 // |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2386 // |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2387 // CODE FOR DEBUGGING PURPOSES ONLY |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2388 // |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2389 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2390 // ------------------------------------------------------------------------ |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2391 void dump_txcb(TxCB *p_txcb) |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2392 { |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2393 os_printf("TxCB @ %x\n", (int)p_txcb); |
|
105
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
2394 os_printf("status = %04X ", p_txcb->txstatus); |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2395 os_printf("command = %04X ", p_txcb->command); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2396 os_printf("link = %08X ", p_txcb->link); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2397 os_printf("tbd = %08X ", p_txcb->tbd_address); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2398 os_printf("count = %d ", p_txcb->count); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2399 os_printf("eof = %x ", p_txcb->eof); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2400 os_printf("threshold = %d ", p_txcb->tx_threshold); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2401 os_printf("tbd number = %d\n", p_txcb->tbd_number); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2402 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2403 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2404 // This is intended to be the body of a THREAD that prints stuff every 10 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2405 // seconds or so: |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2406 #ifdef KEEP_STATISTICS |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2407 #ifdef DISPLAY_STATISTICS |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2408 void DisplayStatistics(void) |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2409 { |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2410 int i; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2411 I82559_COUNTERS *p_statistics; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2412 cyg_uint32 *p_counter; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2413 cyg_uint32 *p_register; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2414 int reg_count; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2415 int status; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2416 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2417 while ( 1 ) { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2418 #ifdef DISPLAY_82559_STATISTICS |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2419 for ( i = 0; i < 2; i ++ ) { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2420 p_statistics = (I82559_COUNTERS *)i82559[i].p_statistics; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2421 if ( (p_statistics->done & 0xFFFF) == 0xA007 ) { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2422 p_counter = (cyg_uint32 *)&i82559_counters[i]; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2423 p_register = (cyg_uint32 *)&p_statistics->tx_good; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2424 for ( reg_count = 20; reg_count != 0; reg_count--) { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2425 *p_counter += *p_register; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2426 p_counter++; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2427 p_register++; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2428 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2429 p_statistics->done = 0; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2430 // make sure no command operating |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2431 wait_for_cmd_done(i82559[i].io_address); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2432 // start register dump |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2433 OUTW(CU_DUMPSTATS, i82559[i].io_address + SCBCmd); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2434 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2435 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2436 #endif |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2437 os_printf("\nRx\nPackets = %d %d\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2438 statistics[0].rx_count, statistics[1].rx_count); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2439 os_printf("Deliver %d %d\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2440 statistics[0].rx_deliver, statistics[1].rx_deliver); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2441 os_printf("Resource %d %d\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2442 statistics[0].rx_resource, statistics[1].rx_resource); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2443 os_printf("Restart %d %d\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2444 statistics[0].rx_restart, statistics[1].rx_restart); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2445 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2446 #ifdef DISPLAY_82559_STATISTICS |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2447 os_printf("Count %d %d\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2448 i82559_counters[0].rx_good, i82559_counters[1].rx_good); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2449 os_printf("CRC %d %d\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2450 i82559_counters[0].rx_crc_errors, i82559_counters[1].rx_crc_errors); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2451 os_printf("Align %d %d\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2452 i82559_counters[0].rx_align_errors, i82559_counters[1].rx_align_errors); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2453 os_printf("Resource %d %d\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2454 i82559_counters[0].rx_resource_errors, i82559_counters[1].rx_resource_errors); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2455 os_printf("Overrun %d %d\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2456 i82559_counters[0].rx_overrun_errors, i82559_counters[1].rx_overrun_errors); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2457 os_printf("Collision %d %d\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2458 i82559_counters[0].rx_collisions, i82559_counters[1].rx_collisions); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2459 os_printf("Short %d %d\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2460 i82559_counters[0].rx_short_frames, i82559_counters[1].rx_short_frames); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2461 #endif |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2462 os_printf("\nTx\nPackets = %d %d\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2463 statistics[0].tx_count, statistics[1].tx_count); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2464 os_printf("Complete %d %d\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2465 statistics[0].tx_complete, statistics[1].tx_complete); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2466 os_printf("Dropped %d %d\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2467 statistics[0].tx_dropped, statistics[1].tx_dropped); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2468 os_printf("Count %d %d\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2469 i82559_counters[0].tx_good, i82559_counters[1].tx_good); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2470 #ifdef DISPLAY_82559_STATISTICS |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2471 os_printf("Collision %d %d\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2472 i82559_counters[0].tx_max_collisions,i82559_counters[1].tx_max_collisions); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2473 os_printf("Late Col. %d %d\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2474 i82559_counters[0].tx_late_collisions,i82559_counters[1].tx_late_collisions); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2475 os_printf("Underrun %d %d\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2476 i82559_counters[0].tx_underrun,i82559_counters[1].tx_underrun); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2477 os_printf("Carrier %d %d\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2478 i82559_counters[0].tx_carrier_loss,i82559_counters[1].tx_carrier_loss); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2479 os_printf("Deferred %d %d\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2480 i82559_counters[0].tx_deferred, i82559_counters[1].tx_deferred); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2481 os_printf("1 Col %d %d\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2482 i82559_counters[0].tx_single_collisions, i82559_counters[0].tx_single_collisions); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2483 os_printf("Mult. Col %d %d\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2484 i82559_counters[0].tx_mult_collisions, i82559_counters[0].tx_mult_collisions); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2485 os_printf("Total Col %d %d\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2486 i82559_counters[0].tx_total_collisions, i82559_counters[0].tx_total_collisions); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2487 #endif |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2488 status = INB(i82559[0].io_address + SCBGenStatus); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2489 os_printf("Interface 0 Link = %s, %s Mbps, %s Duplex\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2490 status & GEN_STATUS_LINK ? "Up" : "Down", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2491 status & GEN_STATUS_100MBPS ? "100" : "10", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2492 status & GEN_STATUS_FDX ? "Full" : "Half"); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2493 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2494 status = INB(i82559[1].io_address + SCBGenStatus); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2495 os_printf("Interface 1 Link = %s, %s Mbps, %s Duplex\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2496 status & GEN_STATUS_LINK ? "Up" : "Down", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2497 status & GEN_STATUS_100MBPS ? "100" : "10", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2498 status & GEN_STATUS_FDX ? "Full" : "Half"); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2499 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2500 cyg_thread_delay(1000); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2501 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2502 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2503 #endif // DISPLAY_STATISTICS |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2504 #endif // KEEP_STATISTICS |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2505 |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2506 void dump_rfd(RFD *p_rfd, int anyway ) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2507 { |
|
105
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
2508 if ( (0 != p_rfd->rxstatus) || anyway ) { |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2509 os_printf("RFD @ %x = ", (int)p_rfd); |
|
105
5a0cc6c243a9
Merge from eCos master repository on 2000-06-30-08:18:49-BST
jlarmour
parents:
101
diff
changeset
|
2510 os_printf("status = %x ", p_rfd->rxstatus); |
|
84
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2511 os_printf("link = %x ", p_rfd->link); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2512 // os_printf("rdb_address = %x ", p_rfd->rdb_address); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2513 os_printf("count = %x ", p_rfd->count); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2514 os_printf("f = %x ", p_rfd->f); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2515 os_printf("eof = %x ", p_rfd->eof); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2516 os_printf("size = %x\n", p_rfd->size); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2517 os_printf("[%04x %04x %04x] ", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2518 *((cyg_uint16 *)(&(p_rfd->buffer[0]))), |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2519 *((cyg_uint16 *)(&(p_rfd->buffer[2]))), |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2520 *((cyg_uint16 *)(&(p_rfd->buffer[4]))) ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2521 os_printf("[%04x %04x %04x] %04x : ", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2522 *((cyg_uint16 *)(&(p_rfd->buffer[6]))), |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2523 *((cyg_uint16 *)(&(p_rfd->buffer[8]))), |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2524 *((cyg_uint16 *)(&(p_rfd->buffer[10]))), |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2525 *((cyg_uint16 *)(&(p_rfd->buffer[12]))) ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2526 os_printf("(%04x %04x %04x %04x) ", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2527 *((cyg_uint16 *)(&(p_rfd->buffer[14]))), |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2528 *((cyg_uint16 *)(&(p_rfd->buffer[16]))), |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2529 *((cyg_uint16 *)(&(p_rfd->buffer[18]))), |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2530 *((cyg_uint16 *)(&(p_rfd->buffer[20]))) ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2531 os_printf("[%04x %04x %04x] ", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2532 *((cyg_uint16 *)(&(p_rfd->buffer[22]))), |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2533 *((cyg_uint16 *)(&(p_rfd->buffer[24]))), |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2534 *((cyg_uint16 *)(&(p_rfd->buffer[26]))) ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2535 os_printf("%d.%d.%d.%d ", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2536 *((cyg_uint8 *)(&(p_rfd->buffer[28]))), |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2537 *((cyg_uint8 *)(&(p_rfd->buffer[29]))), |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2538 *((cyg_uint8 *)(&(p_rfd->buffer[30]))), |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2539 *((cyg_uint8 *)(&(p_rfd->buffer[31]))) ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2540 os_printf("[%04x %04x %04x] ", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2541 *((cyg_uint16 *)(&(p_rfd->buffer[32]))), |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2542 *((cyg_uint16 *)(&(p_rfd->buffer[34]))), |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2543 *((cyg_uint16 *)(&(p_rfd->buffer[36]))) ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2544 os_printf("%d.%d.%d.%d ...\n", |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2545 *((cyg_uint8 *)(&(p_rfd->buffer[38]))), |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2546 *((cyg_uint8 *)(&(p_rfd->buffer[39]))), |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2547 *((cyg_uint8 *)(&(p_rfd->buffer[40]))), |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2548 *((cyg_uint8 *)(&(p_rfd->buffer[41]))) ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2549 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2550 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2551 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2552 void dump_all_rfds( int intf ) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2553 { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2554 struct i82559* p_i82559 = &i82559[intf]; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2555 int i, j; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2556 j = p_i82559->next_rx_descriptor; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2557 os_printf("rx descriptors for interface %d (eth%d):\n", intf, intf ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2558 for ( i = 0; i < MAX_RX_DESCRIPTORS; i++ ) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2559 dump_rfd( p_i82559->rx_ring[i], (i > (j-3) && (i <= j)) ); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2560 os_printf("next rx descriptor = %x\n\n", j); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2561 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2562 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2563 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2564 void dump_packet(cyg_uint8 *p_buffer, int length) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2565 { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2566 int count; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2567 |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2568 count = 0; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2569 while ( length > 0 ) { |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2570 if ( count == 0 ) |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2571 os_printf("\n"); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2572 count = (count + 1) & 0x0F; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2573 os_printf("%02X ", *p_buffer++); |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2574 length--; |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2575 } |
|
489eb5632bc3
Merge from eCos master repository on 2000-04-28-18:44:39-BST
jlarmour
parents:
82
diff
changeset
|
2576 os_printf("\n"); |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2577 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2578 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2579 // ------------------------------------------------------------------------ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2580 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
2581 // EOF if_ebsa285.c |
