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