1 |
27 |
unneback |
2003-02-12 Mark Salter
|
2 |
|
|
|
3 |
|
|
* src/if_i82559.c: Remove restriction preventing combination of
|
4 |
|
|
*_GET_ESA and *_HAS_EEPROM.
|
5 |
|
|
|
6 |
|
|
2003-01-03 Gary Thomas
|
7 |
|
|
|
8 |
|
|
* src/if_i82559.c:
|
9 |
|
|
* cdl/intel_i82559_eth_drivers.cdl: Allow finer control over
|
10 |
|
|
debug (chatter) by making control booldata.
|
11 |
|
|
|
12 |
|
|
2002-12-17 Mark Salter
|
13 |
|
|
|
14 |
|
|
* src/if_i82559.c (CYGHWR_DEVS_ETH_INTEL_I82559_ENDIAN_NEUTRAL_IO): New
|
15 |
|
|
flag to support systems where PCI IO operations are not affected by
|
16 |
|
|
CPU endianess.
|
17 |
|
|
|
18 |
|
|
2002-10-06 Andrew Lunn
|
19 |
|
|
|
20 |
|
|
* src/if_i82559.c (pci_init_find_82559s): Changed scope of
|
21 |
|
|
max_interrupt_handle since its needed in other places.
|
22 |
|
|
* src/if_i82559.c (i82559_stop): Corrected wrong name of variable
|
23 |
|
|
in a diag_printf function.
|
24 |
|
|
|
25 |
|
|
2002-07-24 Gary Thomas
|
26 |
|
|
|
27 |
|
|
* src/if_i82559.c (pci_init_find_82559s):
|
28 |
|
|
Allow platform to define CYGHWR_DEVS_ETH_INTEL_I82559_USE_MEMORY
|
29 |
|
|
which forces use of memory instead of I/O space for device access.
|
30 |
|
|
|
31 |
|
|
2002-06-14 Gary Thomas
|
32 |
|
|
|
33 |
|
|
* src/if_i82559.c:
|
34 |
|
|
Need to include for proper configuration
|
35 |
|
|
of stand-alone (polled) vs. system (interrupt driven) mode.
|
36 |
|
|
|
37 |
|
|
2002-04-09 Hugo Tyson
|
38 |
|
|
|
39 |
|
|
* src/if_i82559.c (i82559_stop): Free up any pending transmissions
|
40 |
|
|
to prevent MBUF store leaks if the calling thread - the one that's
|
41 |
|
|
shutting down the interface - priority ends up higher than (or
|
42 |
|
|
same as) the network service threads.
|
43 |
|
|
|
44 |
|
|
2002-03-26 Jonathan Larmour
|
45 |
|
|
|
46 |
|
|
* src/if_i82559.c (wait_for_cmd_done): Don't assert if RUC_ADDR_LOAD
|
47 |
|
|
command doesn't clear - on some chips it never does.
|
48 |
|
|
|
49 |
|
|
2002-03-18 Hugo Tyson
|
50 |
|
|
|
51 |
|
|
* src/if_i82559.c (pci_init_find_82559s): Move allocation of
|
52 |
|
|
statistics pointer for each device to here, out of
|
53 |
|
|
i82559_start(). It used to leak PCI window store every time the
|
54 |
|
|
interface cycled down/up. [Case 107110]
|
55 |
|
|
|
56 |
|
|
2002-02-25 Mark Salter
|
57 |
|
|
|
58 |
|
|
* src/if_i82559.c: Don't call PacketRxReady in standalone configuration
|
59 |
|
|
unless ready to accept a packet. Limit packet delivery to one packet at
|
60 |
|
|
a time in standalone configuration.
|
61 |
|
|
|
62 |
|
|
2002-02-20 Hugo Tyson
|
63 |
|
|
|
64 |
|
|
* include/i82559_info.h: New fields to record/control multicast
|
65 |
|
|
all reception, oversized packet reception and promiscuous mode
|
66 |
|
|
neatly.
|
67 |
|
|
|
68 |
|
|
* src/if_i82559.c: Initial support for multicast address reception
|
69 |
|
|
filtering.
|
70 |
|
|
(i82559_restart): New routine to restart the device after fiddling
|
71 |
|
|
with its setup - a tail recursion from i82559_start().
|
72 |
|
|
(i82559_configure): More generic flags passed in and handled.
|
73 |
|
|
(i82559_set_multicast): Routine to pass a set of addresses into
|
74 |
|
|
the device; it works out the bitmap et al for us!
|
75 |
|
|
(i82559_ioctl): Handle new case arms ETH_DRV_SET_MC_LIST and
|
76 |
|
|
ETH_DRV_SET_MC_ALL if defined. Reset and restart the device,
|
77 |
|
|
diddling its status between.
|
78 |
|
|
|
79 |
|
|
2002-02-19 Mark Salter
|
80 |
|
|
|
81 |
|
|
* src/if_i82559.c (pci_init_find_82559s): Don't use IRQ support if
|
82 |
|
|
CYGPKG_IO_ETH_DRIVERS_STAND_ALONE.
|
83 |
|
|
|
84 |
|
|
2002-01-28 Mark Salter
|
85 |
|
|
|
86 |
|
|
* src/if_i82559.c (pci_init_find_82559s): Removed CYG_ASSERT which
|
87 |
|
|
assumed system PCI window exists.
|
88 |
|
|
|
89 |
|
|
2002-01-10 Jonathan Larmour
|
90 |
|
|
|
91 |
|
|
* src/if_i82559.c (find_82559s_match_func): Add some more compatible PCI
|
92 |
|
|
ids.
|
93 |
|
|
|
94 |
|
|
2002-01-03 Mark Salter
|
95 |
|
|
|
96 |
|
|
* src/if_i82559.c (pci_init_find_82559s): Remove check that
|
97 |
|
|
assumes driver owns entire PCI window.
|
98 |
|
|
|
99 |
|
|
* cdl/intel_i82559_eth_drivers.cdl: Add
|
100 |
|
|
CYGNUM_DEVS_ETH_INTEL_I82559_MAX_TX_DESCRIPTORS and
|
101 |
|
|
CYGNUM_DEVS_ETH_INTEL_I82559_MAX_RX_DESCRIPTORS.
|
102 |
|
|
|
103 |
|
|
2001-11-19 Hugo Tyson
|
104 |
|
|
2001-11-19 Anssi Pulkkinen
|
105 |
|
|
|
106 |
|
|
* src/if_i82559.c (TxMachine): The test to see if there is a new
|
107 |
|
|
tx to start must also say "go" if the tx queue is full. Normally,
|
108 |
|
|
if the txqueue is full, a tx will be occurring at all times - so
|
109 |
|
|
one will complete soon, so the tx queue full flag will soon be
|
110 |
|
|
cleared, and this condition will recover. I suspect a subtle race
|
111 |
|
|
which effectively means a new tx is queued and fills the queue in
|
112 |
|
|
between two tx's, so no TxDone() follows, causes the hang which we
|
113 |
|
|
get without this extra test under high load. [CASE 106686]
|
114 |
|
|
|
115 |
|
|
2001-09-20 Gary Thomas
|
116 |
|
|
|
117 |
|
|
* src/if_i82559.c: Add declaration of 'i82559_stop' to quiet warning.
|
118 |
|
|
|
119 |
|
|
2001-09-13 Hugo Tyson
|
120 |
|
|
|
121 |
|
|
* cdl/intel_i82559_eth_drivers.cdl:
|
122 |
|
|
* src/if_i82559.c:
|
123 |
|
|
Remove the tickle thread from this driver. The functionality is
|
124 |
|
|
now in the network timeout functionality which handles the
|
125 |
|
|
"deliver" calls. So it's only called if the net is quiet.
|
126 |
|
|
|
127 |
|
|
2001-09-12 Hugo Tyson
|
128 |
|
|
|
129 |
|
|
* src/if_i82559.c (TxDone): Defensive programming; zero the Tx key
|
130 |
|
|
in the global data before making the callback. This change
|
131 |
|
|
appeared useful in our forebear, the EBSA-specific driver.
|
132 |
|
|
|
133 |
|
|
2001-08-29 Hugo Tyson
|
134 |
|
|
|
135 |
|
|
* cdl/intel_i82559_eth_drivers.cdl: New CDL options called
|
136 |
|
|
CYGPKG_DEVS_ETH_INTEL_I82559_TICKLE_THREAD, .._PRIORITY and
|
137 |
|
|
.._DELAY to control the thread. By default this is all disabled
|
138 |
|
|
because it is not needed for a real network application which
|
139 |
|
|
itself proactively tries to use the net - it's only needed when
|
140 |
|
|
the app is totally passive, so the driver otherwise does not get
|
141 |
|
|
CPU time at all.
|
142 |
|
|
|
143 |
|
|
* src/if_i82559.c (starti82559ticklethread): New code to start a
|
144 |
|
|
thread (!) to catch lost interrupts and thus restart jammed
|
145 |
|
|
hardware. It's only possible if KERNEL and NET - RedBoot is
|
146 |
|
|
unaffected, and it's not needed for RedBoot 'cos RedBoot polls.
|
147 |
|
|
(TxMachine): An assert about the CU idle status sometimes fired;
|
148 |
|
|
made the code more conservative wrt timing here.
|
149 |
|
|
(comments): more documentation on the possible external configury
|
150 |
|
|
by .inl file, described the two TIMEOUT macros that can be set,
|
151 |
|
|
and indeed must be to use the tickling thread meaningfully.
|
152 |
|
|
|
153 |
|
|
2001-08-22 Gary Thomas
|
154 |
|
|
|
155 |
|
|
* src/if_i82559.c:
|
156 |
|
|
printf() is no longer a part of RedBoot. Thus all programs
|
157 |
|
|
must use diag_printf() and related functions instead.
|
158 |
|
|
|
159 |
|
|
2001-06-22 Jesper Skov
|
160 |
|
|
|
161 |
|
|
* src/if_i82559.c (i82559_init): Handle EEPROMS without CRC.
|
162 |
|
|
|
163 |
|
|
2001-05-16 Jonathan Larmour
|
164 |
|
|
|
165 |
|
|
* src/if_i82559.c (udelay): Use virtual vector rather than assuming
|
166 |
|
|
hal_delay_us() exists.
|
167 |
|
|
|
168 |
|
|
2001-04-09 Hugo Tyson
|
169 |
|
|
|
170 |
|
|
* src/if_i82559.c (pciwindow_mem_alloc): If asked, by
|
171 |
|
|
CYGHWR_DEVS_ETH_INTEL_I82559_PCIMEM_DISCONTIGUOUS, check for
|
172 |
|
|
breaks in the physical address of PCI window memory, and discard
|
173 |
|
|
any block with a break in it, then redo the alloc. This is for
|
174 |
|
|
targets where smaller SDRAM chips are fitted than the address
|
175 |
|
|
width, so they end up with gaps in (physical) memory.
|
176 |
|
|
|
177 |
|
|
2001-04-09 Hugo Tyson
|
178 |
|
|
|
179 |
|
|
* src/if_i82559.c (i82559_init): Support hardware with only one
|
180 |
|
|
serial EEPROM attached to one device, but multiple devices. This
|
181 |
|
|
generally involves moving some decisions for eg. programming
|
182 |
|
|
EEPROM or not, optionally from compiletime to runtime. Improved
|
183 |
|
|
the diagnostics a bit also, and fixed some bugs.
|
184 |
|
|
(eth_set_mac_address): now takes an arg to say whether we want to
|
185 |
|
|
program the EEPROM, or are just setting up the chip.
|
186 |
|
|
(i82559_ioctl): This is the only place we set that arg to write
|
187 |
|
|
the EEPROM, startup never tries to write EEPROM from any external
|
188 |
|
|
source such as configured ESA or RedBoot params.
|
189 |
|
|
|
190 |
|
|
2001-04-09 Hugo Tyson
|
191 |
|
|
|
192 |
|
|
* src/if_i82559.c (i82559_start): Warnings fixed; unused vars
|
193 |
|
|
following previous change.
|
194 |
|
|
|
195 |
|
|
2001-04-09 Hugo Tyson
|
196 |
|
|
|
197 |
|
|
* src/if_i82559.c (i82559_start): Do not wait for command
|
198 |
|
|
completion after the initial DUMPSTATS operation. The code to
|
199 |
|
|
wait was bogus; it was looking at the structure in the wrong way.
|
200 |
|
|
In any case, there is no need to wait, the wait_for_cmd_done() in
|
201 |
|
|
any following activity is good enough.
|
202 |
|
|
|
203 |
|
|
2001-03-28 Hugo Tyson
|
204 |
|
|
|
205 |
|
|
* src/if_i82559.c (update_statistics): Fix warning - only declare
|
206 |
|
|
op_i82559 if we use it - from previous change.
|
207 |
|
|
|
208 |
|
|
2001-03-23 Hugo Tyson
|
209 |
|
|
|
210 |
|
|
* src/if_i82559.c (i82559_can_send, i82559_send): Count up and
|
211 |
|
|
down entries into these routines, and always say "no" to
|
212 |
|
|
can_send() if we are recursing, ie. within_send != 0. This is a
|
213 |
|
|
good idea because it limits stack usage. The recursion happens
|
214 |
|
|
because of the very neccessary polling of rx state within the tx
|
215 |
|
|
routines - which can deliver packets up into the stack, which can
|
216 |
|
|
trigger a response tx and so on... Also fixed a harmless bug
|
217 |
|
|
where, after polling, the p_i82559 current device state pointer
|
218 |
|
|
pointer to the wrong device, if we polled both devs regardless; it
|
219 |
|
|
only caused problems with the within_send recursion count.
|
220 |
|
|
|
221 |
|
|
* include/i82559_info.h (I82559): Add within_send field.
|
222 |
|
|
|
223 |
|
|
2001-03-15 Hugo Tyson
|
224 |
|
|
|
225 |
|
|
* src/if_i82559.c (i82559_init): Support external macro
|
226 |
|
|
CYGHWR_DEVS_ETH_INTEL_I82559_GET_ESA(...), which if defined, is
|
227 |
|
|
used to acquire a MAC address, on the assumption that there is no
|
228 |
|
|
EEPROM present. CYGHWR_DEVS_ETH_INTEL_I82559_HAS_NO_EEPROM
|
229 |
|
|
confirms that there is no EEPROM attached to the 82559(s) so we
|
230 |
|
|
can omit all that code. It's in the negative sense because it's
|
231 |
|
|
the unusual case.
|
232 |
|
|
|
233 |
|
|
2001-03-13 Hugo Tyson
|
234 |
|
|
|
235 |
|
|
* src/if_i82559.c (CYGHWR_DEVS_ETH_INTEL_I82559_DEMUX_ALL): Fully
|
236 |
|
|
enable "DEMUX_ALL" option; all devices are scanned for
|
237 |
|
|
activity/wedging/interrupts at every opportunity. Multiple
|
238 |
|
|
devices on the same interrupts are now supported.
|
239 |
|
|
|
240 |
|
|
2001-03-12 Hugo Tyson
|
241 |
|
|
|
242 |
|
|
* src/if_i82559.c (i82559_configure): New routine combines actions
|
243 |
|
|
of eth_set_promiscuous_mode() and eth_set_config() both of which
|
244 |
|
|
disappear. Thus the device is always configured correctly from
|
245 |
|
|
the start. [from a patch from Martin Buck
|
246 |
|
|
via the EBSA285 driver]
|
247 |
|
|
(eth_dsr): Do not call upper layer unless we are in a networked
|
248 |
|
|
[non-RedBoot, non-polled] environment. This is necessary because
|
249 |
|
|
we call our own DSR from foreground to unstick after a lost
|
250 |
|
|
interrupt.
|
251 |
|
|
(find_82559s_match_func): New routine to discover disparate
|
252 |
|
|
devices on the PCI bus. Used in pci_init_find_82559s().
|
253 |
|
|
(dump_txcb): Various junk debug functions removed.
|
254 |
|
|
|
255 |
|
|
2001-03-12 Hugo Tyson
|
256 |
|
|
|
257 |
|
|
* src/if_i82559.c: Some tidying up, and two main additions to the
|
258 |
|
|
mechanisms used for managing this nasty entomological device.
|
259 |
|
|
(i82559_can_send): [amongst other places] if it is defined, use
|
260 |
|
|
CYGHWR_DEVS_ETH_INTEL_I82559_MISSED_INTERRUPT(p_i82559) to detect
|
261 |
|
|
that we missed an interrupt - and if so, call the ISR and DSR
|
262 |
|
|
directly. This is necessary for edge-triggered interrupt
|
263 |
|
|
controllers being fed by this level-sending device, where an
|
264 |
|
|
internal event in the device can keep the line low after the code
|
265 |
|
|
thinks that all events have been handled.
|
266 |
|
|
(Check82559TxLockupTimeout): This routine runs a timeout (if the
|
267 |
|
|
HAL provides a pair of watchdog-like macros) which performs a
|
268 |
|
|
selective reset of the device if it takes too long to transmit.
|
269 |
|
|
This happens rarely, but when it happens this is the only way out;
|
270 |
|
|
the tx machine is fixated on one tx and never comes out of it.
|
271 |
|
|
|
272 |
|
|
|
273 |
|
|
Sadly these two techniques to escape lockup only work if the
|
274 |
|
|
driver is called (ie. the stack tries to tx); incoming packets
|
275 |
|
|
cannot unwedge a device. We might need to add a poll from the
|
276 |
|
|
stack in future if this causes problems.
|
277 |
|
|
|
278 |
|
|
* include/i82559_info.h (I82559): Added two words for managing tx
|
279 |
|
|
lockup timeouts since this must be per-device.
|
280 |
|
|
|
281 |
|
|
2001-03-02 Hugo Tyson
|
282 |
|
|
|
283 |
|
|
* src/if_i82559.c: Remove "Platform specific - defaults provided"
|
284 |
|
|
definitions for CYGHWR_INTEL_I82559_PCI_MEM_MAP_BASE/SIZE; all
|
285 |
|
|
platforms now provide these.
|
286 |
|
|
Added a little further disclaimer to the comment about LE/BE/GE.
|
287 |
|
|
|
288 |
|
|
2001-03-01 Hugo Tyson
|
289 |
|
|
|
290 |
|
|
* src/if_i82559.c: Global change: what was HAL_READ_UINTxx or
|
291 |
|
|
HAL_WRITE_UINTxx are now READMEMxx or WRITEMEMxx - just
|
292 |
|
|
convenience macros that do all the volatile casts we want there.
|
293 |
|
|
Definitions of INL, INW, INB and OUTL, OUTW, OUTB recast in terms
|
294 |
|
|
of HAL_READ_UINTxx or HAL_WRITE_UINTxx so that they will use
|
295 |
|
|
proper IO operations on those CISCy mainframes that have a special
|
296 |
|
|
way of doing IO.
|
297 |
|
|
|
298 |
|
|
2001-03-01 Hugo Tyson
|
299 |
|
|
|
300 |
|
|
* src/if_i82559.c: Much more configury added, so that I can use it
|
301 |
|
|
with a new target board. Including, but not limited to:
|
302 |
|
|
|
303 |
|
|
o An essay about addressing, big endian, little endian and GIB
|
304 |
|
|
endian (sic) and how we treat the various types of access within
|
305 |
|
|
this module. In other words, a lot of comments.
|
306 |
|
|
|
307 |
|
|
o CYGNUM_DEVS_ETH_INTEL_I82559_SEPARATE_MUX_INTERRUPT to clarify
|
308 |
|
|
that such an interrupt is SEPARATE from any simplex intrs that are
|
309 |
|
|
also available.
|
310 |
|
|
|
311 |
|
|
o CYGHWR_DEVS_ETH_INTEL_I82559_DEMUX_ALL for hardware where the
|
312 |
|
|
the only interrupt is a multiplexed (wire or'd) one. Plus
|
313 |
|
|
associated macros for direct manipulation of interrupt masks and
|
314 |
|
|
acknowledgments.
|
315 |
|
|
|
316 |
|
|
o Support for external definition from the platform HAL or driver
|
317 |
|
|
config module of CYGHWR_INTEL_I82559_PCI_MEM_MAP_BASE and SIZE.
|
318 |
|
|
Also CYGHWR_INTEL_I82559_PCI_VIRT_TO_BUS.
|
319 |
|
|
|
320 |
|
|
o LE definitions of a few macros that were missing.
|
321 |
|
|
|
322 |
|
|
o Separated definitions of structure offsets from BE/LE
|
323 |
|
|
definitions of consts within the words. Offsets vary with GIB
|
324 |
|
|
endian, for those CPUs who just flip bits. No change for BE
|
325 |
|
|
machines, needed for LE machines to work. To enable address-flip
|
326 |
|
|
within structures, define CYG_ADDRESSING_IS_GIBENDIAN.
|
327 |
|
|
|
328 |
|
|
o Re-org of mux/simplex deliver and isr's for new configuration.
|
329 |
|
|
|
330 |
|
|
o Couple of extra debug printouts.
|
331 |
|
|
|
332 |
|
|
2001-01-26 Jesper Skov
|
333 |
|
|
|
334 |
|
|
* src/if_i82559.c: Added FIXME for promiscuous mode.
|
335 |
|
|
|
336 |
|
|
2001-01-25 Jesper Skov
|
337 |
|
|
|
338 |
|
|
* src/if_i82559.c: Replace CYGNUM_HAL_INTERRUPT_PCI_IRQ with
|
339 |
|
|
CYGNUM_DEVS_ETH_INTEL_I82559_MUX_INTERRUPT which platform .inl
|
340 |
|
|
must provide when appropriate. Changed _deliver functions to match
|
341 |
|
|
_isr functions.
|
342 |
|
|
* include/i82559_info.h: Remove debug hacks.
|
343 |
|
|
Fix declaration.
|
344 |
|
|
|
345 |
|
|
* src/if_i82559.c: Moved device descriptors into platform header.
|
346 |
|
|
Allow individual devices to hardwire ESA. Handle N devices instead
|
347 |
|
|
of just 1 or 2.
|
348 |
|
|
* include/i82559_info.h: ESA hardwired flag added.
|
349 |
|
|
* cdl/intel_i82559_eth_drivers.cdl: Device details moved to
|
350 |
|
|
platform CDL.
|
351 |
|
|
|
352 |
|
|
* src/if_i82559.c (i82559_start): Poll status after dump command.
|
353 |
|
|
|
354 |
|
|
2001-01-24 Jesper Skov
|
355 |
|
|
|
356 |
|
|
* src/if_i82559.c: [changes from yesterday] Some more endian
|
357 |
|
|
fiddle, and the device coughs out the initial ARP packets.
|
358 |
|
|
(wait_for_cmd_done): semantics changed to wait for pending CU
|
359 |
|
|
cmds.
|
360 |
|
|
(i82559_reset): Cleaned up to spec. Init register bases after
|
361 |
|
|
reset.
|
362 |
|
|
Fix initialization of hardwired ESA.
|
363 |
|
|
Correct configuration command.
|
364 |
|
|
Fix rcv len masking.
|
365 |
|
|
(eth_set_mac_address): Set driver's ESA as well. Proper check for
|
366 |
|
|
completion.
|
367 |
|
|
Fix LE structure offsets.
|
368 |
|
|
(i82559_start): Call new eth_set_config to enable device. Last
|
369 |
|
|
hacks cleaned up.
|
370 |
|
|
Remove a few printfs.
|
371 |
|
|
|
372 |
|
|
2001-01-23 Jesper Skov
|
373 |
|
|
|
374 |
|
|
* src/if_i82559.c: Debug hackery and some endian issues resolved.
|
375 |
|
|
|
376 |
|
|
2001-01-22 Jesper Skov
|
377 |
|
|
|
378 |
|
|
* src/if_i82559.c: Major changes, getting rid of device structures
|
379 |
|
|
in favor of HAL IO accessor macros. Also added endian conversion
|
380 |
|
|
macros where required.
|
381 |
|
|
* include/i82559_info.h: Change type of device structures to char.
|
382 |
|
|
|
383 |
|
|
2001-01-19 Jesper Skov
|
384 |
|
|
|
385 |
|
|
* cdl/intel_i82559_eth_drivers.cdl: Hack for just one interface
|
386 |
|
|
now.
|
387 |
|
|
* src/if_i82559.c: Fix IO functions. Handle EEPROM not being
|
388 |
|
|
attached to device.
|
389 |
|
|
|
390 |
|
|
* src/if_i82559.c: Use uncached/physical address translation
|
391 |
|
|
macros.
|
392 |
|
|
|
393 |
|
|
2001-01-15 Jesper Skov
|
394 |
|
|
|
395 |
|
|
* src/if_i82559.c: Handle endian differences between controller
|
396 |
|
|
and CPU. Leave usdelay to HAL. Hack around PCI-base-at-0
|
397 |
|
|
assumption.
|
398 |
|
|
Increase SK_DELAY (not that it changed anything, but now it's to
|
399 |
|
|
the spec), hardwire static ESA.
|
400 |
|
|
|
401 |
|
|
2001-01-12 Jesper Skov
|
402 |
|
|
|
403 |
|
|
* src/if_i82559.c (pci_init_find_82559s): Check that device has
|
404 |
|
|
been found before accessing it.
|
405 |
|
|
(pci_init_find_82559s): Only delay if devices were
|
406 |
|
|
found. Recognize 82559ER code as well.
|
407 |
|
|
|
408 |
|
|
2001-01-10 Jesper Skov
|
409 |
|
|
|
410 |
|
|
* src/if_i82559.c: Minor hacks to get it to build.
|
411 |
|
|
* include/i82559_info.h: Same.
|
412 |
|
|
* cdl/intel_i82559_eth_drivers.cdl: Same.
|
413 |
|
|
|
414 |
|
|
2000-12-07 Jesper Skov
|
415 |
|
|
|
416 |
|
|
* cdl/intel_i82559_eth_drivers.cdl: Cloned from the EBSA driver.
|
417 |
|
|
* include/i82559_info.h: Same.
|
418 |
|
|
* src/if_i82559.c: Same.
|
419 |
|
|
|
420 |
|
|
2000-11-19 Gary Thomas
|
421 |
|
|
|
422 |
|
|
* src/if_ebsa285.c (pci_init_find_82559s): Intel has at least
|
423 |
|
|
two devices equivalent to the 82559. Support both (0x1229, 0x01030).
|
424 |
|
|
|
425 |
|
|
2000-10-05 Hugo Tyson
|
426 |
|
|
|
427 |
|
|
* src/if_ebsa285.c: Deal with device interrupts in a nested
|
428 |
|
|
fashion - disable/restore is the semantics now, rather than
|
429 |
|
|
unconditionally unmasking. Also go directly to the 21285 PIC's
|
430 |
|
|
interrupt control registers to gain atomicity for these. Poll for
|
431 |
|
|
ready received packets when acknowledging an interrupt in the
|
432 |
|
|
tranmitting world; a race here could lose an Rx interrupt. Which
|
433 |
|
|
doesn't matter on a busy system, but in quieter times... there
|
434 |
|
|
will always be such a race because of the vague way the i82559's
|
435 |
|
|
status bits reflect how it's yanking the interrupt line; you have
|
436 |
|
|
to poll until the interrupt is gone before returning else spurious
|
437 |
|
|
interrupt failures occur. The issue is to close the window as
|
438 |
|
|
tightly as possible, which this change achieves at a minor cost in
|
439 |
|
|
performance - because of the time spent polling when not required.
|
440 |
|
|
|
441 |
|
|
2000-09-11 Hugo Tyson
|
442 |
|
|
|
443 |
|
|
* src/if_ebsa285.c (i82559_poll): Only diddle the interface we
|
444 |
|
|
were asked to. This is more correct in terms of the intent of the
|
445 |
|
|
API, though it shouldn't really be necessary.
|
446 |
|
|
|
447 |
|
|
2000-09-06 Hugo Tyson
|
448 |
|
|
|
449 |
|
|
* src/if_ebsa285.c (pci_init_find_82559s): Add asserts and an
|
450 |
|
|
unconditional check that the PCI window as configured matches the
|
451 |
|
|
address and size of the pci_window region from the MLT. This is
|
452 |
|
|
here because at present the MLT and CT cannot intercommunicate
|
453 |
|
|
enough. The separation of the PCI window is needed because
|
454 |
|
|
otherwise the malloc heap will eat all memory. [This is related
|
455 |
|
|
to CR 902624-CR, "MLT needs to be configuration aware"]
|
456 |
|
|
|
457 |
|
|
2000-09-01 Hugo Tyson
|
458 |
|
|
|
459 |
|
|
* OVERVIEW: This is part of the change to the network stack to
|
460 |
|
|
greatly reduce latencies both of (other) DSRs and of thread
|
461 |
|
|
scheduling. All the work that the network stack *and* individual
|
462 |
|
|
ether drivers used to do in DSRs (including alarm callbacks and
|
463 |
|
|
data copies to/from the device memory) is moved into a "fast
|
464 |
|
|
network thread" instead. It calls a device's "deliver" function
|
465 |
|
|
to do the work that was previously in the DSR. This is a separate
|
466 |
|
|
thread so that it can be set higher priority than application
|
467 |
|
|
threads in order to minimize packet loss (depending on the
|
468 |
|
|
driver), if required (the application threads presumed to be
|
469 |
|
|
higher priority in turn than the network thread). A crucial
|
470 |
|
|
consequence of this is that we are no longer locking against DSRs,
|
471 |
|
|
so a plain mutex can be used rather than the global scheduler
|
472 |
|
|
lock, thus simplifying all the splfoo/splx() style functions.
|
473 |
|
|
|
474 |
|
|
* src/if_ebsa285.c: Minor: fix the big assert in i82559_send()
|
475 |
|
|
which suffered a race condition when called from the fast thread
|
476 |
|
|
rather than from a DSR. Major: Add a "deliver" entry to the
|
477 |
|
|
interface record for the "fast thread" implementation of the
|
478 |
|
|
network internal comms system. Provide a pass-up DSR to the
|
479 |
|
|
logical ether driver's DSR and appropriate delivery routine(s).
|
480 |
|
|
i82559_poll() now calls i82559_deliver() rather than the DSR. Add
|
481 |
|
|
valid data for mux'd DSR to pass on up.
|
482 |
|
|
|
483 |
|
|
2000-09-01 Hugo Tyson
|
484 |
|
|
|
485 |
|
|
* tests/test_net_realtime.h: Tighten up the latency requirements
|
486 |
|
|
by a factor of 5; it all seems happy, so committed.
|
487 |
|
|
|
488 |
|
|
2000-08-25 Hugo Tyson
|
489 |
|
|
|
490 |
|
|
* src/if_ebsa285.c (i82559_ioctl): A little further diddling; have
|
491 |
|
|
a bool to say whether the dot3 info is filled in.
|
492 |
|
|
|
493 |
|
|
2000-08-24 Hugo Tyson
|
494 |
|
|
|
495 |
|
|
* cdl/ebsa285_eth_drivers.cdl: Do not export a symbol for the
|
496 |
|
|
device info file (include/ebsa285_info.h) since nobody needs
|
497 |
|
|
(portably) to include it now.
|
498 |
|
|
|
499 |
|
|
* src/if_ebsa285.c (i82559_ioctl): Handle new ioctl calls
|
500 |
|
|
ETH_DRV_GET_IF_STATS_UD and ETH_DRV_GET_IF_STATS to get loads of
|
501 |
|
|
statistical information out. _UD means update. The nonUD one can
|
502 |
|
|
be used instead mostly, if we find the performance hit too large.
|
503 |
|
|
This should allow SNMP (a) to not explode, (b) to get useful info
|
504 |
|
|
out of other device implementations than this one.
|
505 |
|
|
|
506 |
|
|
* include/ebsa285_info.h: Remove all the macro cruft for feature
|
507 |
|
|
detecting of lots of individual statistics; we now just have a
|
508 |
|
|
catch-all struct that SNMP uses, defined in the common ether
|
509 |
|
|
driver environment.
|
510 |
|
|
|
511 |
|
|
2000-08-15 Hugo Tyson
|
512 |
|
|
|
513 |
|
|
* src/if_ebsa285.c (PacketRxReady): Put back the check for very
|
514 |
|
|
small packets into the driver; the layer above checks for that
|
515 |
|
|
(defensive programming) but only *after* asserting that the size
|
516 |
|
|
is large enough, to help detect that scenario from other drivers.
|
517 |
|
|
I believe we only have struct ether_header available if CYGPKG_NET
|
518 |
|
|
but I could be wrong.
|
519 |
|
|
[CASE 104353]
|
520 |
|
|
|
521 |
|
|
2000-08-08 Hugo Tyson
|
522 |
|
|
|
523 |
|
|
* src/if_ebsa285.c (eth_set_promiscuous_mode):
|
524 |
|
|
- ccs->config_bytes[18]=0x70;
|
525 |
|
|
+ ccs->config_bytes[18]=0x72; // Keep the Padding Enable bit
|
526 |
|
|
...otherwise short frame sends don't work in promisc mode.
|
527 |
|
|
[CASE 104289]
|
528 |
|
|
|
529 |
|
|
2000-08-07 Gary Thomas
|
530 |
|
|
|
531 |
|
|
* src/if_ebsa285.c (pciwindow_mem_alloc): Take out very noisy debug.
|
532 |
|
|
|
533 |
|
|
2000-08-03 Gary Thomas
|
534 |
|
|
|
535 |
|
|
* src/if_ebsa285.c: Changes for stand-alone mode.
|
536 |
|
|
|
537 |
|
|
* cdl/ebsa285_eth_drivers.cdl: Ethernet driver package hierarchy changed.
|
538 |
|
|
Add option to control number of interfaces.
|
539 |
|
|
|
540 |
|
|
2000-07-28 Hugo Tyson
|
541 |
|
|
|
542 |
|
|
* src/if_ebsa285.c (PacketRxReady): Do not attempt to forward
|
543 |
|
|
short packets; eth_drv.c assumes there is at least a header there.
|
544 |
|
|
(i82559_recv): Also be more careful and ASSERTive about -ve buffer
|
545 |
|
|
sizes; be more defensive about sglists. [CASE 104206]
|
546 |
|
|
|
547 |
|
|
2000-07-26 Gary Thomas
|
548 |
|
|
|
549 |
|
|
* src/if_ebsa285.c: Update for new eth_drv interfaces.
|
550 |
|
|
|
551 |
|
|
2000-07-18 Hugo Tyson
|
552 |
|
|
|
553 |
|
|
* src/if_ebsa285.c (i82559_poll): Fill in the flesh of this, it
|
554 |
|
|
just calls ISR and DSR repeatedly.
|
555 |
|
|
(i82559_start): Look in the device record for promiscuous mode
|
556 |
|
|
flag; it should be passed though the common layer, but it's not
|
557 |
|
|
[yet] - this change from Andrew Lunn/ASCOM. Also a fix and delay
|
558 |
|
|
to the promisc mode code per se.
|
559 |
|
|
|
560 |
|
|
2000-07-17 Hugo Tyson
|
561 |
|
|
|
562 |
|
|
* src/if_ebsa285.c (i82559_poll): New function, just to fill in
|
563 |
|
|
the interface record; not used.
|
564 |
|
|
|
565 |
|
|
2000-06-27 Hugo Tyson
|
566 |
|
|
|
567 |
|
|
* cdl/ebsa285_eth_drivers.cdl: Add sesquipedalian option
|
568 |
|
|
CYGDBG_DEVS_ETH_ARM_EBSA285_KEEP_82559_STATISTICS in (now)
|
569 |
|
|
component CYGDBG_DEVS_ETH_ARM_EBSA285_KEEP_STATISTICS to control
|
570 |
|
|
keeping (well, harvesting really) the i82559's internal stats.
|
571 |
|
|
Reputedly, it doesn't service the net whilst this is happening, so
|
572 |
|
|
it could be viewed a bad thing. Hence the option.
|
573 |
|
|
|
574 |
|
|
* include/ebsa285_info.h: Only describe the I82559_COUNTERS
|
575 |
|
|
i82559_counters[2]; structs if full stats are to be kept.
|
576 |
|
|
|
577 |
|
|
* src/if_ebsa285.c (update_statistics): Only include this if full
|
578 |
|
|
stats are to be kept.
|
579 |
|
|
|
580 |
|
|
2000-06-27 Hugo Tyson
|
581 |
|
|
|
582 |
|
|
* src/if_ebsa285.c (ResetRxRing): Re-do the management of the
|
583 |
|
|
RxRing; have an end-of-list flag (EL) in the last entry, and as
|
584 |
|
|
you unload filled slots, drag it round after you.
|
585 |
|
|
|
586 |
|
|
2000-06-14 Hugo Tyson
|
587 |
|
|
|
588 |
|
|
* cdl/ebsa285_eth_drivers.cdl: Add option to control statistics
|
589 |
|
|
keeping.
|
590 |
|
|
|
591 |
|
|
* include/ebsa285_info.h: Act on it.
|
592 |
|
|
|
593 |
|
|
2000-06-13 Hugo Tyson
|
594 |
|
|
|
595 |
|
|
* cdl/ebsa285_eth_drivers.cdl: Properly include the new header
|
596 |
|
|
file and define symbols to allow client code to get at it without
|
597 |
|
|
knowing the particular device driver name.
|
598 |
|
|
|
599 |
|
|
* include/ebsa285_info.h: New file: export various statistics
|
600 |
|
|
information about the driver for use by monitoring and
|
601 |
|
|
network-management systems. This requires exposing the
|
602 |
|
|
(otherwise) internal structures of the driver.
|
603 |
|
|
|
604 |
|
|
* src/if_ebsa285.c: remove a lot of structure definitions &c that
|
605 |
|
|
are now necessarily in the new header; add a couple of new
|
606 |
|
|
routines which provide status and update statistics from the
|
607 |
|
|
device into memory; tidy up control of whether stats-keeping is
|
608 |
|
|
enabled.
|
609 |
|
|
|
610 |
|
|
2000-06-06 Hugo Tyson
|
611 |
|
|
|
612 |
|
|
* cdl/ebsa285_eth_drivers.cdl (define_proc): Add #define of
|
613 |
|
|
CYGDAT_DEVS_ETH_DESCRIPTION in the config file for information.
|
614 |
|
|
|
615 |
|
|
2000-05-12 Hugo Tyson
|
616 |
|
|
|
617 |
|
|
* tests/test_net_realtime.h (tnr_print_activity): New routine to
|
618 |
|
|
check the system is working, tidied up the API. It works!
|
619 |
|
|
|
620 |
|
|
2000-05-11 Hugo Tyson
|
621 |
|
|
|
622 |
|
|
* cdl/ebsa285_eth_drivers.cdl: Added export of the test header
|
623 |
|
|
below, and config opts for controlling EEPROM writing and all the
|
624 |
|
|
status chatter as the device starts up.
|
625 |
|
|
|
626 |
|
|
* src/if_ebsa285.c: Reworked the code for reading and setting the
|
627 |
|
|
EEPROM that holds the MAC address. This is very ugly, but now
|
628 |
|
|
more reliable. Also tidied up printing cruft with neater
|
629 |
|
|
configury, and made it an option (for safety) whether it's
|
630 |
|
|
possible to write the EEPROM at all.
|
631 |
|
|
|
632 |
|
|
* tests/test_net_realtime.h: New file - it is intended to be used
|
633 |
|
|
by networking tests to verify that latency is not compromised by
|
634 |
|
|
the stack and driver. It's very platform specific, hence the
|
635 |
|
|
location in here. This is a preliminary version only.
|
636 |
|
|
|
637 |
|
|
2000-04-27 Hugo Tyson
|
638 |
|
|
|
639 |
|
|
* src/if_ebsa285.c: A serious re-write. This cuts out a lot of
|
640 |
|
|
code from the old version and improves the performance greatly.
|
641 |
|
|
|
642 |
|
|
The cruft was mainly doing lots of explicit event communication
|
643 |
|
|
between the ISR and DSR, when in fact all the state needed is
|
644 |
|
|
present in the tx/rx rings. So both ISRs and DSRs regard their
|
645 |
|
|
call as an opportunity to progress everything they can, rather
|
646 |
|
|
than only dealing with one interrupt cause at a time; the
|
647 |
|
|
connection between them is now rather looser.
|
648 |
|
|
|
649 |
|
|
Interrups can now be re-enabled after the ISR (in other words they
|
650 |
|
|
are not masked in the ISR), no need to wait for the DSR, but in
|
651 |
|
|
consequence some DSR code must mask/unmask intrs as it works.
|
652 |
|
|
|
653 |
|
|
The 82559 appears to be a little slow in reacting to commands and
|
654 |
|
|
state changes, so some interrupts were being lost - or persisting
|
655 |
|
|
beyond their desired life - so there's some kinda polling code to
|
656 |
|
|
deal with that also. We also rely on the foreground to kind of
|
657 |
|
|
poll in the same way, in the send/can_send calls - we know the
|
658 |
|
|
stack will re-try if necessary, though this is rare.
|
659 |
|
|
|
660 |
|
|
The driver now works (albeit at much reduced performance) with as
|
661 |
|
|
few as 6 rx and tx buffers - in other words the "queue full/out of
|
662 |
|
|
rx buffers" states have been tested and all is well. It works
|
663 |
|
|
generally fine with 8 buffers of each kind.
|
664 |
|
|
|
665 |
|
|
The mux ISR and DSR are now rather more polled than the old
|
666 |
|
|
versions; we just try to do things with both devices (if active)
|
667 |
|
|
by simply calling each unitary ISR/DSR respectively.
|
668 |
|
|
|
669 |
|
|
I also re-ordered some of the code, moving utilities to the end of
|
670 |
|
|
the file and grouping together Tx and Rx machines a bit better.
|
671 |
|
|
|
672 |
|
|
2000-04-13 Hugo Tyson
|
673 |
|
|
|
674 |
|
|
* src/if_ebsa285.c: Attribution to Ron Spence, Pacific Softworks
|
675 |
|
|
added as a contributor.
|
676 |
|
|
|
677 |
|
|
2000-04-07 Hugo Tyson
|
678 |
|
|
|
679 |
|
|
* ecos.db: Re-organize device packages. This is a massive change
|
680 |
|
|
involving deleting all the sources for serial and ethernet drivers
|
681 |
|
|
from where they used to live in
|
682 |
|
|
packages/io/serial/current/src/ARCH/PLATFORM.[ch]
|
683 |
|
|
packages/net/drivers/eth/PLATFORM/current/src/...
|
684 |
|
|
and reinstating them in
|
685 |
|
|
packages/devs/serial/ARCH/PLATFORM/current/src/...
|
686 |
|
|
packages/devs/eth/ARCH/PLATFORM/current/src/...
|
687 |
|
|
|
688 |
|
|
All these new packages are properly defined in ecos.db, and are
|
689 |
|
|
all of type "hardware" so that a "target" can grab them.
|
690 |
|
|
|
691 |
|
|
This directory layout is descriptive of the devices we have right
|
692 |
|
|
now, arch and platform are separate levels just to make it easier
|
693 |
|
|
to navigate in the filesystem and similar to the HAL structure in
|
694 |
|
|
the filesystem.
|
695 |
|
|
|
696 |
|
|
It is *not* prescriptive of future work; for example, the mythical
|
697 |
|
|
common highly-portable 16550 serial driver which works on many
|
698 |
|
|
targets would be called "devs/serial/s16550/current", or a serial
|
699 |
|
|
device for a particular board (cogent springs to mind) that can
|
700 |
|
|
work with different CPUs fitted is "devs/serial/cogent/current".
|
701 |
|
|
|
702 |
|
|
Changelogs have been preserved and replicated over all the new
|
703 |
|
|
packages, so that no history is lost.
|
704 |
|
|
|
705 |
|
|
The contents of individual source files are unchanged; they build
|
706 |
|
|
in just the same emvironment except for a very few cases where the
|
707 |
|
|
config file name changed in this movement.
|
708 |
|
|
|
709 |
|
|
Targets in ecos.db have been redefined to bring in all relevant
|
710 |
|
|
hardware packages including net and serial drivers (but the newly
|
711 |
|
|
included packages are only active if their desired parent is
|
712 |
|
|
available.)
|
713 |
|
|
|
714 |
|
|
The names of CDL options (and their #defines of course) stay the
|
715 |
|
|
same for the serial drivers, for backward compatibility.
|
716 |
|
|
|
717 |
|
|
* templates/*/current.ect: these have had CYGPKG_IO_SERIAL added
|
718 |
|
|
rather than it being in (almost) all target definitions.
|
719 |
|
|
|
720 |
|
|
2000-03-29 Hugo Tyson
|
721 |
|
|
|
722 |
|
|
* src/if_ebsa285.c (i82559_recv): Be happy with NULLs in the
|
723 |
|
|
SGlist; it means the caller is out of memory so drop the packet on
|
724 |
|
|
the floor. Also remove a completely redundant test.
|
725 |
|
|
|
726 |
|
|
2000-03-06 Hugo Tyson
|
727 |
|
|
|
728 |
|
|
* src/if_ebsa285.c (i82559_can_send): Update net driver to new
|
729 |
|
|
interface style. This is incomplete wrt promiscuous mode, but
|
730 |
|
|
that's probably about all.
|
731 |
|
|
|
732 |
|
|
2000-02-14 Gary Thomas
|
733 |
|
|
|
734 |
|
|
* cdl/ebsa285_eth_drivers.cdl: Update CDL to indicate multiple
|
735 |
|
|
interface support.
|
736 |
|
|
|
737 |
|
|
2000-02-14 Hugo Tyson
|
738 |
|
|
|
739 |
|
|
* src/if_ebsa285.c (pci_init_find_82559s): Tidy comments somewhat
|
740 |
|
|
and set debug and stats collecting defines to most friendly
|
741 |
|
|
settings.
|
742 |
|
|
|
743 |
|
|
2000-02-10 Hugo Tyson
|
744 |
|
|
|
745 |
|
|
* src/if_ebsa285.c (PacketRxReady): Fix bug; current descriptor
|
746 |
|
|
was not being write back for the callback to use. Hence asserts
|
747 |
|
|
on state of rfd were firing in busy times - that leading rfd had
|
748 |
|
|
already been drained.
|
749 |
|
|
|
750 |
|
|
Also rationalized meaning of DEBUG printy symbols a bit - it's now
|
751 |
|
|
chatty during startup/foreground manipulations but not in any
|
752 |
|
|
performance related activities ie. rx or tx.
|
753 |
|
|
|
754 |
|
|
2000-02-09 John Dallaway
|
755 |
|
|
|
756 |
|
|
* cdl/ebsa285_eth_drivers.cdl:
|
757 |
|
|
|
758 |
|
|
Reparent under CYGPKG_NET_ETH_DRIVERS and tidy display strings.
|
759 |
|
|
|
760 |
|
|
2000-02-08 Hugo Tyson
|
761 |
|
|
|
762 |
|
|
* src/if_ebsa285.c: New File.
|
763 |
|
|
* cdl/ebsa285_eth_drivers.cdl: New File.
|
764 |
|
|
|
765 |
|
|
Initial Checkin of EBSA285 Ethernet driver.
|
766 |
|
|
|
767 |
|
|
It's one monolithic file at present, and should be split up into a
|
768 |
|
|
more generic Intel 82559 driver plus platform-specific parts (PCI
|
769 |
|
|
et al) plus eCos/Red-Hat-BSD-stack parts.
|
770 |
|
|
|
771 |
|
|
//===========================================================================
|
772 |
|
|
//####ECOSGPLCOPYRIGHTBEGIN####
|
773 |
|
|
// -------------------------------------------
|
774 |
|
|
// This file is part of eCos, the Embedded Configurable Operating System.
|
775 |
|
|
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
|
776 |
|
|
//
|
777 |
|
|
// eCos is free software; you can redistribute it and/or modify it under
|
778 |
|
|
// the terms of the GNU General Public License as published by the Free
|
779 |
|
|
// Software Foundation; either version 2 or (at your option) any later version.
|
780 |
|
|
//
|
781 |
|
|
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
|
782 |
|
|
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
783 |
|
|
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
784 |
|
|
// for more details.
|
785 |
|
|
//
|
786 |
|
|
// You should have received a copy of the GNU General Public License along
|
787 |
|
|
// with eCos; if not, write to the Free Software Foundation, Inc.,
|
788 |
|
|
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
789 |
|
|
//
|
790 |
|
|
// As a special exception, if other files instantiate templates or use macros
|
791 |
|
|
// or inline functions from this file, or you compile this file and link it
|
792 |
|
|
// with other works to produce a work based on this file, this file does not
|
793 |
|
|
// by itself cause the resulting work to be covered by the GNU General Public
|
794 |
|
|
// License. However the source code for this file must still be made available
|
795 |
|
|
// in accordance with section (3) of the GNU General Public License.
|
796 |
|
|
//
|
797 |
|
|
// This exception does not invalidate any other reasons why a work based on
|
798 |
|
|
// this file might be covered by the GNU General Public License.
|
799 |
|
|
//
|
800 |
|
|
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
|
801 |
|
|
// at http://sources.redhat.com/ecos/ecos-license/
|
802 |
|
|
// -------------------------------------------
|
803 |
|
|
//####ECOSGPLCOPYRIGHTEND####
|
804 |
|
|
//===========================================================================
|
805 |
|
|
|
806 |
|
|
|
807 |
|
|
|