annotate packages/io/usb/eth/slave/current/src/usbsethdrv.c @ 165:d63db767121d

Merge from eCos master repository on 2001-06-29-06:43:03-BST
author jlarmour
date Fri, 29 Jun 2001 07:16:25 +0000
parents 25e238959bae
children e0c0827131d1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
1 //==========================================================================
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
2 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
3 // usbethdrv.c
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
4 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
5 // Network device driver for USB-ethernet devices.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
6 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
7 //==========================================================================
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
8 //####COPYRIGHTBEGIN####
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
9 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
10 // -------------------------------------------
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
11 // The contents of this file are subject to the Red Hat eCos Public License
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
12 // Version 1.1 (the "License"); you may not use this file except in
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
14 // http://www.redhat.com/
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
15 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
18 // License for the specific language governing rights and limitations under
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
19 // the License.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
20 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
21 // The Original Code is eCos - Embedded Configurable Operating System,
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
22 // released September 30, 1998.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
23 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
24 // The Initial Developer of the Original Code is Red Hat.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
25 // Portions created by Red Hat are
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
26 // Copyright (C) 2000, 2001 Red Hat, Inc.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
27 // All Rights Reserved.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
28 // -------------------------------------------
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
29 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
30 //####COPYRIGHTEND####
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
31 //==========================================================================
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
32 //#####DESCRIPTIONBEGIN####
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
33 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
34 // Author(s): bartv
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
35 // Contributors: bartv
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
36 // Date: 2000-10-04
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
37 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
38 //####DESCRIPTIONEND####
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
39 //==========================================================================
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
40
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
41 #include <cyg/infra/cyg_type.h>
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
42 #include <cyg/hal/hal_arch.h>
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
43 #include <cyg/infra/diag.h>
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
44 #include <cyg/hal/drv_api.h>
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
45
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
46 #define __ECOS 1
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
47 #include <netdev.h>
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
48 #include <eth_drv.h>
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
49 #include <eth_drv_stats.h>
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
50
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
51 #include <pkgconf/io_usb_slave_eth.h>
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
52 #include <cyg/io/usb/usbs_eth.h>
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
53
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
54 // ----------------------------------------------------------------------------
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
55 // The network driver data structure.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
56 ETH_DRV_SC(usbs_eth_sc0,
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
57 (void*) &usbs_eth0,
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
58 CYGDAT_USBS_ETHDRV_NAME,
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
59 usbs_ethdrv_start,
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
60 usbs_ethdrv_stop,
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
61 usbs_ethdrv_ioctl,
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
62 usbs_ethdrv_can_send,
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
63 usbs_ethdrv_send,
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
64 usbs_ethdrv_recv,
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
65 usbs_ethdrv_deliver,
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
66 usbs_ethdrv_poll,
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
67 usbs_ethdrv_intvector);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
68
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
69 NETDEVTAB_ENTRY(usbs_eth_netdev0,
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
70 "usbs_eth0",
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
71 usbs_ethdrv_init,
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
72 &usbs_eth_sc0);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
73
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
74 // ----------------------------------------------------------------------------
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
75 // Statics gathering. The following macro can be used to increment a
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
76 // statistic without having to use a #ifdef for the statistics
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
77 // configuration option everywhere.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
78 #ifdef CYGFUN_USBS_ETHDRV_STATISTICS
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
79 # define INCR_STAT(a) \
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
80 CYG_MACRO_START \
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
81 (a) += 1; \
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
82 CYG_MACRO_END
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
83 #else
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
84 # define INCR_STAT(a) CYG_EMPTY_STATEMENT
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
85 #endif
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
86
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
87 // Various constants related to SNMP statistics. It is not clear
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
88 // what these are all for.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
89 #ifdef CYGFUN_USBS_ETHDRV_STATISTICS
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
90 # define CYGDAT_USBS_ETHDRV_DESCRIPTION "eCos USB ethernet device"
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
91 #endif
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
92 // ----------------------------------------------------------------------------
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
93 // Utility functions.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
94 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
95 // The TCP/IP stack works in terms of scatter/gather buffers. USB tends to
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
96 // involve DMA operations so it is more convenient to work in terms of
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
97 // 1514 byte flat buffers. Actually, the first two bytes of the buffer
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
98 // are used to hold the ethernet frame size to work around restrictions
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
99 // with certain hardware implementations of USB that may be unable to
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
100 // transfer certain packet sizes.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
101
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
102 static bool
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
103 scatter(unsigned char* buf, struct eth_drv_sg* sg, int sg_len)
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
104 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
105 unsigned int size;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
106
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
107 size = buf[0] | (buf[1] << 8);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
108 buf++; buf++;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
109
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
110 CYG_ASSERT((size >= CYGNUM_USBS_ETH_MIN_FRAME_SIZE) && (size <= CYGNUM_USBS_ETH_MAX_FRAME_SIZE),\
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
111 "ethernet frame size limits must be observed");
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
112
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
113 while ((size > 0) && (sg_len > 0)) {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
114 if (size > sg->len) {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
115 memcpy((void*) sg->buf, buf, sg->len);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
116 buf += sg->len;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
117 size -= sg->len;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
118 sg++;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
119 sg_len--;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
120 } else {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
121 memcpy((void*) sg->buf, buf, size);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
122 size = 0;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
123 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
124 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
125
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
126 return 0 == size;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
127 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
128
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
129 static bool
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
130 gather(unsigned char* buf, unsigned int size, struct eth_drv_sg* sg, int sg_len)
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
131 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
132 unsigned int left = size;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
133 unsigned char* base = buf;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
134
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
135 buf++; buf++;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
136 while ((left > 0) && (sg_len > 0)) {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
137 if (left > sg->len) {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
138 memcpy(buf, (void*) sg->buf, sg->len);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
139 buf += sg->len;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
140 left -= sg->len;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
141 sg++;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
142 sg_len--;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
143 } else {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
144 memcpy(buf, (void*) sg->buf, left);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
145 left = 0;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
146 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
147 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
148 size = size - left;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
149 base[0] = size & 0x00FF;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
150 base[1] = (size >> 8) & 0x00FF;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
152 return 0 == left;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
153 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
154
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
155
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
156 // ----------------------------------------------------------------------------
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
157 // usbs_ethdrv_init()
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
158 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
159 // This function is called during system initialization to decide
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
160 // whether or not this particular network device is usable. For
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
161 // USB-ethernet this is problematical, the device is only really
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
162 // usable once both sides have come up. The typical sequence
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
163 // of events is something like:
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
164 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
165 // 1) the eCos peripheral is powered up. Static constructors are
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
166 // run resulting in basic initialization.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
167 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
168 // 2) the eCos TCP/IP stack initialization happens. Roughly in
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
169 // parallel the eCos USB slave side is initialized as well,
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
170 // i.e. enumeration data is supplied to control endpoints,
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
171 // endpoints are associated with application classes, and so
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
172 // on. The relative order of TCP/IP and USB initialization is
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
173 // not particularly important.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
174 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
175 // It is the TCP/IP stack's initialization code that will
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
176 // invoke usbs_eth_init().
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
177 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
178 // 3) host-side USB detects that the eCos peripheral has been
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
179 // connected or powered up. It goes through the enumeration
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
180 // process and will end up loading a host-side network driver.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
181 // This connects to the eCos-side USB ethernet code to
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
182 // e.g. obtain the MAC address.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
183 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
184 // 4) when the host-side is ready, the eCos side can be brought up.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
185 // The required call is (sc->funs->eth_drv->init)(sc, enaddr)
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
186 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
187 // In practice it is easier for now to invoke the init() function
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
188 // immediately. There are not going to be any incoming packets
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
189 // until the host is ready, and can_send() can just return false
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
190 // for the time being.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
191 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
192 // Invoked in: thread context only
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
193 // ----------------------------------------------------------------------------
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
194
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
195 static bool
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
196 usbs_ethdrv_init(struct cyg_netdevtab_entry* ndp)
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
197 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
198 struct eth_drv_sc* sc = (struct eth_drv_sc*)(ndp->device_instance);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
199 usbs_eth* eth = (usbs_eth*)(sc->driver_private);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
200
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
201 (*sc->funs->eth_drv->init)(sc, eth->ecos_MAC);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
202 return true;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
203 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
204
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
205 // ----------------------------------------------------------------------------
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
206 // The receive process that is used to transfer a received ethernet
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
207 // packet into the stack. The calling sequence is somewhat convoluted.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
208 // It started off as:
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
209 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
210 // 1) Ethernet hw ISR invoked by hardware, schedules its own
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
211 // hw_dsr(), and blocks further interrupts in the ethernet chip
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
212 // 2) hw_dsr() calls generic eth_drv_dsr() from io/eth common package
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
213 // 3) eth_drv_dsr() interacts with the TCP/IP stack and allocates mbufs
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
214 // (typically, the TCP/IP stack might not be in use)
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
215 // 4) eth_drv_dsr() calls usbs_eth_recv() to transfer the data to mbufs
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
216 // 5) eth_drv_dsr() returns to hw_dsr() which reenables interrupts
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
217 // 6) hw_dsr() completes and everything can proceed.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
218 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
219 // The problem with this is that the whole ethernet packet gets copied
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
220 // inside a DSR, affecting dispatch latency (but not interrupt latency).
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
221 // This is bad. Hence there is an alternative route involving a separate
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
222 // thread in the TCP/IP stack.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
223 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
224 // 1) Ethernet hw ISR runs as before, scheduling hw_dsr()
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
225 // 2) hw_dsr() calls up into eth_drv_dsr()
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
226 // 3) eth_drv_dsr() wakes up a thread inside the TCP/IP stack
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
227 // 4) eth_drv_dsr() returns to hw_dsr(), which performs no further
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
228 // processing. Ethernet chip interrupts remain disabled.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
229 // 5) The TCP/IP thread ends up calling hw_deliver(). This should take
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
230 // care of any pending activity. For every buffered packet there should
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
231 // be a call to a generic recv() function which then goes back into
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
232 // the driver-specific recv() function.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
233 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
234 // The advantage is that ethernet packet copying now happens at thread
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
235 // level rather than DSR level so thread priorities can be used to
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
236 // schedule things.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
237 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
238 // USB-ethernet does not interact directly with any hardware, instead
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
239 // it just passes information to lower levels of USB code. The reception
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
240 // process is started by usbs_ethdrv_start() when the TCP/IP stack brings
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
241 // up the interface.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
242 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
243 // When the USB transfer has completed a callback will be invoked, at
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
244 // DSR level. Assuming the transfer went ok, the callback will invoke
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
245 // eth_drv_dsr() to inform the higher level code.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
246 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
247 // The deliver function can check the state of the buffer
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
248 // and go through the sc->funs->eth_drv->recv()/recv() sequence
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
249 // to transfer the data into the stack.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
250 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
251 // usbs_ethdrv_recv() does a scatter from the internal buffer into the
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
252 // mbuf, thus freeing up the buffer. This allows it to start another
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
253 // receive,
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
254 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
255 // Synchronisation involves the scheduler lock because the recv
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
256 // callback is invoked inside a DSR.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
257
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
258 static void usbs_ethdrv_halted_callback(void*, int);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
259
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
260 static void
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
261 usbs_ethdrv_recv_callback(usbs_eth* eth, void* callback_data, int size)
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
262 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
263 cyg_bool resubmit = true;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
264
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
265 struct eth_drv_sc* sc = (struct eth_drv_sc*) callback_data;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
266 CYG_ASSERT( eth == (usbs_eth*)(sc->driver_private), "USB and TCP/IP worlds need to be consistent");
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
267
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
268 INCR_STAT(eth->interrupts);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
269 if (!eth->ecos_up) {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
270 // This message should just be discarded since the eCos TCP/IP
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
271 // stack is not expecting anything from this interface.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
272 // Reception will resume when the interface comes back up.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
273 eth->rx_active = false;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
274 resubmit = false;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
275 } else if (size < 0) {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
276 // An error has occurred. The likely possibilities are:
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
277 // -EPIPE: connection to the host has been broken
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
278 // -EAGAIN: the endpoint is haltedn
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
279 // -EMSGSIZE: bogus message from host
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
280 // -EIO: other
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
281
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
282 if (-EAGAIN == size) {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
283 // EAGAIN should be handled by waiting for the endpoint to be reset.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
284 resubmit = false;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
285 usbs_start_rx_endpoint_wait(eth->rx_endpoint, &usbs_ethdrv_halted_callback, (void*) sc);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
286 } else if (-EMSGSIZE == size) {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
287 // Do nothing for now
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
288 } else {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
289 // EPIPE should be resubmitted, the usbseth.c will use the
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
290 // pending rx support. EIO could mean anything.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
291 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
292 } else if (0 == size) {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
293 // The endpoint is no longer halted. Just do the resubmit at
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
294 // the end.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
295 } else {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
296 // A packet has been received. Now do a size sanity check
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
297 // based on the first two bytes.
165
d63db767121d Merge from eCos master repository on 2001-06-29-06:43:03-BST
jlarmour
parents: 151
diff changeset
298 int real_size = eth->rx_bufptr[0] + (eth->rx_bufptr[1] << 8);
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
299 if (real_size < CYGNUM_USBS_ETH_MIN_FRAME_SIZE) {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
300 INCR_STAT(eth->rx_short_frames);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
301 } else if (real_size > CYGNUM_USBS_ETH_MAX_FRAME_SIZE) {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
302 INCR_STAT(eth->rx_too_long_frames);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
303 } else {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
304 // The packet appears to be valid. Inform higher level
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
305 // code and mark the buffer as in use.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
306 resubmit = false;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
307 eth->rx_buffer_full = true;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
308 eth->rx_active = false;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
309 eth_drv_dsr(0, 0, (cyg_addrword_t) sc);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
310 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
311 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
312
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
313 if (resubmit) {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
314 eth->rx_active = true;
165
d63db767121d Merge from eCos master repository on 2001-06-29-06:43:03-BST
jlarmour
parents: 151
diff changeset
315 usbs_eth_start_rx(eth, eth->rx_bufptr, &usbs_ethdrv_recv_callback, callback_data);
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
316 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
317 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
318
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
319 // Another callback, used to wait while an endpoint is halted.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
320 static void
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
321 usbs_ethdrv_halted_callback(void* callback_data, int size)
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
322 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
323 struct eth_drv_sc* sc = (struct eth_drv_sc*) callback_data;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
324 usbs_ethdrv_recv_callback((usbs_eth*) sc->driver_private, callback_data, 0);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
325 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
326
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
327 // Start a receive operation. It is not possible to abort an existing
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
328 // rx operation, so a valid sequence of events is: start, rx ongoing,
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
329 // stop, restart. The rx_active field is used to keep track of whether
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
330 // or not there is still a receive in progress. The receive callback
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
331 // will just discard incoming data if the eCos stack is not currently
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
332 // running.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
333 static void
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
334 usbs_ethdrv_start_recv(struct eth_drv_sc* sc, usbs_eth* eth)
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
335 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
336 cyg_drv_dsr_lock();
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
337 if (!eth->rx_active) {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
338 eth->rx_active = true;
165
d63db767121d Merge from eCos master repository on 2001-06-29-06:43:03-BST
jlarmour
parents: 151
diff changeset
339 usbs_eth_start_rx(eth, eth->rx_bufptr, &usbs_ethdrv_recv_callback, (void*) sc);
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
340 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
341 cyg_drv_dsr_unlock();
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
342 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
343
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
344 // This is invoked from the delivery thread when a valid buffer
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
345 // has been received. The buffer should be scattered into the
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
346 // supplied list, then another receive should be started.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
347
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
348 static void
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
349 usbs_ethdrv_recv(struct eth_drv_sc* sc,
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
350 struct eth_drv_sg* sg_list, int sg_len)
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
351 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
352 usbs_eth* eth = (usbs_eth*)(sc->driver_private);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
353
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
354 CYG_ASSERT( eth->rx_buffer_full, "This function should only be called when there is a buffer available");
165
d63db767121d Merge from eCos master repository on 2001-06-29-06:43:03-BST
jlarmour
parents: 151
diff changeset
355 (void) scatter(eth->rx_bufptr, sg_list, sg_len);
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
356 eth->rx_buffer_full = false;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
357 eth->rx_active = true;
165
d63db767121d Merge from eCos master repository on 2001-06-29-06:43:03-BST
jlarmour
parents: 151
diff changeset
358 usbs_eth_start_rx(eth, eth->rx_bufptr, &usbs_ethdrv_recv_callback, (void*) sc);
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
359 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
360
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
361 // ----------------------------------------------------------------------------
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
362 // Now for the transmit process.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
363 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
364 // When an application thread writes down a socket the data gets moved
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
365 // into mbufs, and then passed to the appropriate device driver - which
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
366 // may or may not be able to process it immediately. There is also a
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
367 // timeout thread within the TCP/IP to handle retransmits etc.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
368 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
369 // The stack will start by calling usbs_ethdrv_can_send() to determine
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
370 // whether or not the driver can accept the packet. For the purposes
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
371 // of the USB-ethernet driver this is true provided both host
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
372 // and target are up and there is a spare buffer available.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
373 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
374 // If the usbs_eth_can_send() returns true then there will be a call
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
375 // to usbs_ethdrv_send(). This gathers the data into a single
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
376 // buffer. If there is no transmit in progress yet then one is started.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
377 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
378 // At some point the packet will have been transmitted and a callback
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
379 // gets invoked. This needs to call eth_drv_dsr(), waking up the
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
380 // delivery thread. The deliver() function can then check which
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
381 // transmissions have completed and inform the higher level code
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
382 // via sc->funs->eth_drv->tx_done(). The buffer can be re-used at
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
383 // that point.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
384
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
385 static void
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
386 usbs_ethdrv_send_callback(usbs_eth* eth, void* callback_data, int size)
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
387 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
388 struct eth_drv_sc* sc = (struct eth_drv_sc*) callback_data;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
389 CYG_ASSERT( eth == (usbs_eth*)(sc->driver_private), "USB and TCP/IP worlds need to be consistent");
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
390
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
391 INCR_STAT(eth->interrupts);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
392
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
393 // There are a variety of possible error codes. -EAGAIN indicates
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
394 // that the endpoint is stalled. -EPIPE indicates that the
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
395 // connection to the host has been lost. These are not really
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
396 // particularly interesting. Whatever happens the buffer
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
397 // must be cleared and higher-level code informed so that
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
398 // the mbufs can be released.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
399 if (size > 0) {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
400 INCR_STAT(eth->tx_count);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
401 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
402 eth->tx_done = true;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
403 eth_drv_dsr(0, 0, (cyg_addrword_t) sc);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
404 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
405
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
406 // Is it possible to send an ethernet frame? This requires
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
407 // an empty buffer, i.e. there should be no existing
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
408 // transmit in progress. It also requires that the host
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
409 // is connected and that the endpoint is not currently halted.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
410 static int
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
411 usbs_ethdrv_can_send(struct eth_drv_sc* sc)
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
412 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
413 usbs_eth* eth = (usbs_eth*)(sc->driver_private);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
414 return eth->host_up && !eth->tx_buffer_full && !eth->tx_endpoint->halted;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
415 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
416
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
417 // Actually start a packet transmission. This means collecting
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
418 // all the data into a single buffer and then invoking the
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
419 // lower-level code. The latter may discard the packet immediately
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
420 // if the MAC is not appropriate: it would be more efficient to
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
421 // catch that here, especially for large packets, but the check
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
422 // has to happen inside the lower-level code anyway in case
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
423 // that is being invoked directly rather than via the driver.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
424 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
425 // There is a possible recursion problem,
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
426 // send->start_tx->tx_done->can_send->send, which is guarded
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
427 // against using the tx_in_send flag.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
428
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
429 static void
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
430 usbs_ethdrv_send(struct eth_drv_sc* sc,
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
431 struct eth_drv_sg* sgl_list, int sg_len, int total_len,
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
432 unsigned long key)
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
433 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
434 usbs_eth* eth = (usbs_eth*)(sc->driver_private);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
435
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
436 CYG_ASSERT( 0 == eth->tx_in_send, "send() should not be invoked recursively");
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
437 CYG_ASSERT( total_len <= CYGNUM_USBS_ETH_MAX_FRAME_SIZE, "ethernet maximum frame size should be observed");
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
438 CYG_ASSERT( CYGNUM_USBS_ETH_MIN_FRAME_SIZE <= total_len, "ethernet minimum frame size should be observed");
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
439
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
440 eth->tx_in_send = true;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
441 CYG_ASSERT( !eth->tx_buffer_full, "the transmit buffer should be empty");
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
442 gather(eth->tx_buffer, CYGNUM_USBS_ETH_MAX_FRAME_SIZE, sgl_list, sg_len);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
443 eth->tx_buffer_full = true;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
444 eth->tx_done = false;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
445 eth->tx_key = key;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
446 usbs_eth_start_tx(eth, eth->tx_buffer, &usbs_ethdrv_send_callback, (void*) sc);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
447 eth->tx_in_send = false;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
448 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
449
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
450 // ----------------------------------------------------------------------------
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
451 // Deliver needs to take into account both receive and transmit buffers.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
452
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
453 static void
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
454 usbs_ethdrv_deliver(struct eth_drv_sc* sc)
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
455 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
456 usbs_eth* eth = (usbs_eth*)(sc->driver_private);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
457
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
458 if (eth->rx_buffer_full) {
165
d63db767121d Merge from eCos master repository on 2001-06-29-06:43:03-BST
jlarmour
parents: 151
diff changeset
459 int size = eth->rx_bufptr[0] + (eth->rx_bufptr[1] << 8);
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
460 (*sc->funs->eth_drv->recv)(sc, size);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
461 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
462 if (eth->tx_done) {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
463 unsigned long key = eth->tx_key;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
464 eth->tx_buffer_full = false;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
465 eth->tx_done = false;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
466 (*sc->funs->eth_drv->tx_done)(sc, key, 1);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
467 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
468 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
469
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
470 // ----------------------------------------------------------------------------
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
471 // usbs_ethdrv_start()
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
472 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
473 // This gets called by the TCP/IP stack later on during
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
474 // initialization, when the stack is ready to send and receive
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
475 // packets. It may get called multiple times while the stack
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
476 // is running, with different flags values.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
477 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
478 // As far as transmits are concerned, nothing needs to be done. If no
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
479 // transmit is in progress then everything is fine anyway. If a
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
480 // transmit is already in progress then it must be allowed to complete
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
481 // via the usual route. Receives should however be restarted, the
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
482 // start function has appropriate safeguards.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
483 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
484 // Invoked in: thread context only
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
485 // ----------------------------------------------------------------------------
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
486
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
487 static void
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
488 usbs_ethdrv_start(struct eth_drv_sc* sc, unsigned char* enaddr, int flags)
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
489 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
490 usbs_eth* eth = (usbs_eth*)(sc->driver_private);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
491 if (!eth->ecos_up) {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
492 eth->ecos_up = true;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
493 usbs_ethdrv_start_recv(sc, eth);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
494 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
495 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
496
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
497 // ----------------------------------------------------------------------------
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
498 // usbs_ethdrv_stop()
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
499 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
500 // Similarly this gets called by the TCP/IP stack to bring the network
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
501 // interface down. Nothing should happen for any packets currently
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
502 // being transmitted or received, that would cause confusion everywhere.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
503 // The receive callback checks the ecos_up flag and does the right
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
504 // thing. The TCP/IP stack should not call can_send() after taking
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
505 // the interface down so no new transmits will be initiated.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
506 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
507 // Invoked in: thread context only
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
508 // ----------------------------------------------------------------------------
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
509
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
510 static void
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
511 usbs_ethdrv_stop(struct eth_drv_sc* sc)
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
512 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
513 usbs_eth* eth = (usbs_eth*)(sc->driver_private);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
514 eth->ecos_up = false;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
515 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
516
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
517 // ----------------------------------------------------------------------------
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
518 // usbs_eth_ioctl()
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
519 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
520 // The operations to worry about here are:
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
521 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
522 // SET_MAC_ADDRESS,via the SIOCSIFHWADDR ioctl
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
523 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
524 // GET_IF_STATS and GET_IF_STATS_UD, to report gathered statistics.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
525 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
526 // Invoked in: thread context only
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
527 // ----------------------------------------------------------------------------
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
528
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
529 static int
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
530 usbs_ethdrv_ioctl(struct eth_drv_sc* sc, unsigned long key, void* data, int data_length)
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
531 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
532 usbs_eth* eth = (usbs_eth*)(sc->driver_private);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
533 int result = EINVAL;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
534
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
535 switch(key) {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
536 case ETH_DRV_SET_MAC_ADDRESS:
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
537 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
538 if (6 == data_length) {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
539 memcpy(eth->ecos_MAC, data, 6);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
540 result = 0;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
541 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
542 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
543 break;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
544 #if defined(CYGFUN_USBS_ETHDRV_STATISTICS) && defined(ETH_DRV_GET_IF_STATS_UD)
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
545 case ETH_DRV_GET_IF_STATS_UD:
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
546 case ETH_DRV_GET_IF_STATS:
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
547 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
548 static unsigned char my_chipset[] = { 0, 0 };
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
549 struct ether_drv_stats *p = (struct ether_drv_stats*) data;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
550 int i;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
551 strcpy(p->description, CYGDAT_USBS_ETHDRV_DESCRIPTION);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
552 for ( i = 0; i < SNMP_CHIPSET_LEN; i++ ) {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
553 if ( 0 == (p->snmp_chipset[i] = my_chipset[i]) ) {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
554 break;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
555 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
556 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
557 p->duplex = 3; // 3 == duplex
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
558 p->operational = (eth->host_up && eth->ecos_up) ? 3 : 2; // 3 == up, 2 == down
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
559 p->speed = 10 * 1000000;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
560 p->supports_dot3 = 1;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
561 p->rx_too_long_frames = eth->rx_too_long_frames;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
562 p->rx_short_frames = eth->rx_short_frames;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
563 p->interrupts = eth->interrupts;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
564 p->rx_count = eth->rx_count;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
565 p->tx_count = eth->tx_count;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
566 p->tx_queue_len = 1;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
567 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
568 break;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
569 #endif
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
570
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
571 default:
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
572 break;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
573 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
574
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
575 return result;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
576 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
577
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
578
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
579 // ----------------------------------------------------------------------------
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
580 // usbs_ethdrv_poll()
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
581 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
582 // On real ethernet hardware this is used by RedBoot once the
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
583 // application has started running, so that the network device can be
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
584 // used for debugging purposes as well as for the application's own
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
585 // needs. The lower-level USB device may supply a poll function as well.
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
586 // ----------------------------------------------------------------------------
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
587 static void
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
588 usbs_ethdrv_poll(struct eth_drv_sc* sc)
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
589 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
590 usbs_eth* eth = (usbs_eth*)(sc->driver_private);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
591 (*eth->control_endpoint->poll_fn)(eth->control_endpoint);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
592 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
593
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
594 // ----------------------------------------------------------------------------
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
595 // usbs_ethdrv_intvector()
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
596 //
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
597 // See usbs_eth_poll().
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
598 // ----------------------------------------------------------------------------
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
599
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
600 static int
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
601 usbs_ethdrv_intvector(struct eth_drv_sc* sc)
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
602 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
603 usbs_eth* eth = (usbs_eth*)(sc->driver_private);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
604 return eth->control_endpoint->interrupt_vector;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
605 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
606
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
diff changeset
607