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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
82
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
1 //==========================================================================
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
2 //
6736c52df507 Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff changeset
3 // 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