large target/linux cleanup
[openwrt.git] / target / linux / ar7-2.4 / patches / 004-atm_driver.patch
1 diff -urN linux.old/drivers/atm/Config.in linux.dev/drivers/atm/Config.in
2 --- linux.old/drivers/atm/Config.in     2005-08-22 23:18:37.773532032 +0200
3 +++ linux.dev/drivers/atm/Config.in     2005-08-23 04:46:50.076846888 +0200
4 @@ -99,4 +99,10 @@
5      bool 'Use S/UNI PHY driver' CONFIG_ATM_HE_USE_SUNI
6    fi
7  fi
8 +#
9 +# Texas Instruments SANGAM ADSL/ATM support
10 +#
11 +if [ "$CONFIG_AR7" = "y" ]; then
12 +     tristate 'Texas Instruments SANGAM ATM/ADSL support' CONFIG_MIPS_SANGAM_ATM
13 +fi
14  endmenu
15 diff -urN linux.old/drivers/atm/Makefile linux.dev/drivers/atm/Makefile
16 --- linux.old/drivers/atm/Makefile      2005-08-22 23:18:37.773532032 +0200
17 +++ linux.dev/drivers/atm/Makefile      2005-08-23 04:46:50.077846736 +0200
18 @@ -14,6 +14,32 @@
19  obj-$(CONFIG_ATM_NICSTAR) += nicstar.o
20  obj-$(CONFIG_ATM_IDT77252) += idt77252.o
21  
22 +ifeq ($(CONFIG_AR7),y)
23 +
24 +subdir-$(CONFIG_MIPS_SANGAM_ATM) += sangam_atm
25 +
26 +EXTRA_CFLAGS += -DEL -I$(TOPDIR)/drivers/atm/sangam_atm -DPOST_SILICON -DCOMMON_NSP -DCONFIG_LED_MODULE -DDEREGISTER_LED -DNO_ACT
27 +#EXTRA_CFLAGS += -DEL -I$(TOPDIR)/drivers/atm/sangam_atm -DPOST_SILICON -DCOMMON_NSP
28 +
29 +ifeq ($(ANNEX),B)
30 +EXTRA_CFLAGS += -DANNEX_B -DB
31 +else
32 +ifeq ($(ANNEX),C)
33 +EXTRA_CFLAGS += -DANNEX_C -DC
34 +else
35 +EXTRA_CFLAGS += -DANNEX_A -DP
36 +endif
37 +endif
38 +
39 +list-multi     := tiatm.o
40 +tiatm-objs     := sangam_atm/tn7atm.o sangam_atm/tn7dsl.o sangam_atm/tn7sar.o \
41 +       sangam_atm/dsl_hal_api.o sangam_atm/dsl_hal_support.o sangam_atm/cpsar.o \
42 +       sangam_atm/aal5sar.o
43 +
44 +obj-$(CONFIG_MIPS_SANGAM_ATM) += sangam_atm/tiatm.o
45 +
46 +endif
47 +
48  ifeq ($(CONFIG_ATM_NICSTAR_USE_SUNI),y)
49    obj-$(CONFIG_ATM_NICSTAR) += suni.o
50  endif
51 diff -urN linux.old/drivers/atm/sangam_atm/aal5sar.c linux.dev/drivers/atm/sangam_atm/aal5sar.c
52 --- linux.old/drivers/atm/sangam_atm/aal5sar.c  1970-01-01 01:00:00.000000000 +0100
53 +++ linux.dev/drivers/atm/sangam_atm/aal5sar.c  2005-08-23 04:46:50.080846280 +0200
54 @@ -0,0 +1,2962 @@
55 +
56 +/**
57 + *  
58 + *  aal5sar.c
59 + *
60 + *  TNETDxxxx Software Support\n
61 + *  Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
62 + *
63 + *  version
64 + *      28Feb02 Greg       1.00  Original Version created.\n 
65 + *      06Mar02 Greg       1.01  Documentation (Doxygen-style) enhanced
66 + *      06May02 Greg       1.02  AAL2 added
67 + *      06Jun02 Greg       1.03  Multiple API and bug fixes from emulation
68 + *      12Jul02 Greg       1.04  API Update
69 + */
70 +
71 +/**
72 +@defgroup CPHAL_Functions CPHAL Functions
73 +
74 +These are the CPHAL Functions.
75 +*/
76 +
77 +/**
78 +@page CPHAL_Implementation_Details
79 +
80 +@section cphal_intro Introduction
81 +
82 +The CPHAL API described above is generally applicable to all modules.  Any
83 +implementation differences will be described in the following module-specific
84 +appendix sections.  
85 +
86 +Included for your reference is a diagram showing the internal architecture
87 +of the CPHAL:
88 +
89 +@image html SangamSoftware.jpg "HAL Architecture"
90 +@image latex SangamSoftware.jpg "HAL Architecture" height=2.8in
91 +
92 +*/
93 +
94 +/**
95 +@defgroup AAL5_Functions Additional Functions for AAL5 Implementation
96 +
97 +These functions are used only by the AAL5 module.
98 +*/
99 +
100 +/*
101 +@defgroup CPMAC_Functions Additional Functions for CPMAC Implementation
102 +
103 +No additional functions currently defined.
104 +*/
105 +
106 +/**
107 +@page VDMA_Implementation_Details
108 +
109 +@section vdma_intro Introduction
110 +
111 +The VDMA-VT module facilitates efficient transfer of data (especially voice)
112 +between two devices, as shown in the figure below.
113 +
114 +@image html vdma.jpg "VDMA System Block Diagram"
115 +@image latex vdma.jpg "VDMA System Block Diagram" height=1in
116 +
117 +The VDMA-VT module supports two modes of operation: mirror mode and credit mode.
118 +Mirror mode is intended for systems in which the remote device does not have a
119 +VDMA-based module.  Credit mode is intended for highest performance when VDMA-based
120 +modules exist on both ends of an interface.
121 +
122 +For more detailed information on the operation of the VDMA module, please
123 +reference the VDMA Module Guide.
124 +
125 +@section vdma_channels VDMA Channels
126 +
127 +The VDMA-VT module is a single channel, single transmit queue device.  Therefore,
128 +when using the CHANNEL_INFO structure, the correct value for @c Ch is always 0.
129 +Correspondingly, the correct value for the @c Ch parameter in @c ChannelTeardown() is
130 +always 0.  Further, when calling @c Send(), the driver should always supply the value
131 +of 0 for both the @c Ch and @c Queue parameters.
132 +
133 +For the VDMA-VT, configuring the channel requires the configuration of either 2 FIFO 
134 +elements (in credit mode) or 4 FIFO elements (in mirror mode).  For credit mode, the
135 +driver must configure just the local Tx and Rx FIFOs.  For mirror mode, the driver must
136 +configure the Tx and Rx FIFOs for both the remote and local ends of the interface.
137 +
138 +This channel configuration is accomplished through multiple calls to @c ChannelSetup().
139 +Each call configures a single FIFO, according to the parameters in the CHANNEL_INFO
140 +structure.  The members of VDMA-VT's CHANNEL_INFO structure are defined below.
141 +
142 +
143 +- int RemFifoAddr; Address of remote FIFO (mirror mode only).  Set to 0 for credit mode.
144 +- int FifoAddr;    Address of the local FIFO.  If 0, the CPHAL will allocate the FIFO.
145 +- int FifoSize;    Size of the FIFO.
146 +- int PollInt;     Polling interval for the FIFO.
147 +- int Endianness;  Endianness of the FIFO.  If 1, big endian.  If 0, little endian.
148 +- int RemAddr;     Used only in credit mode.  This is the base address of the remote
149 +                   remote VDMA-based device (VDMA-VT or AAL2)
150 +- int RemDevID;    Used only in credit mode.  Identifies the type of remote VDMA-based device.
151 +                   0=VDMAVT, 1=AAL2 Ch0, 2=AAL2 Ch1, 3=AAL2 Ch2, 4= AAL2 Ch3.       
152 +
153 +For the VDMA-VT module, the driver must make all calls to @c ChannelSetup() prior to calling
154 +@c Open().  This is because several of the channel specific parameters may not be changed
155 +while the VDMA-VT module is operational.
156 +
157 +@section vdma_params VDMA Parameters
158 +
159 +Defined here are the set of parameters for the VDMA-VT module.  Default settings for
160 +each parameter should be represented in the device configuration file (options.conf).
161 +During @c Init(), the CPHAL will reference the device configuration file and load all
162 +default settings.  The @c Control() interface gives the driver an opportunity to
163 +modify any default settings before the module becomes operational during the @c Open()
164 +call.
165 +
166 +@param NoTxIndication  If 1, the CPHAL will not call @c SendComplete(). 0 is default.
167 +@param NoRxIndication  If 1, the CPHAL will not call @c Receive(). 0 is default.
168 +@param RemoteCPU       If 1, the CPHAL will not directly manipulate data in FIFO's, leaving
169 +                       that task for a remote CPU. 0 is default.
170 +@param RxIntEn         If 1, enables Rx interrupts.  0 is default.
171 +@param TxIntEn         If 1, enables Tx interrupts.  0 is default.
172 +@param Mirror          If 1, enables mirror mode.  0 selects credit mode (default).
173 +@param RxIntCtl        Valid only in mirror mode.  If 1, interrupts will occur when the Rx FIFO
174 +                       RdIndex is updated.  If 0, interrupts occur when the Rx FIFO WrIndex
175 +                       is updated.
176 +@param TxIntCtl        Valid only in mirror mode.  If 1, interrupts will occur when the Rx FIFO
177 +                       RdIndex is updated.  If 0, interrupts occur when the Rx FIFO WrIndex
178 +                       is updated.
179 +@param RBigEn          Remote big endian mode.  If 1, remote is big endian.
180 +@param LBigEn          Local big endian mode.  If 1, local is big endian.
181 +
182 +@section vdma_polling Using VDMA-VT without interrupts
183 +
184 +If your system configuration does not utilize VDMA interrupts, the ability to process the
185 +Tx and Rx FIFOs is supported.  To process the Tx FIFO, call @c CheckTx().  If the CPHAL is
186 +able to process any complete data transmissions, it will call @c SendComplete() as usual.  
187 +To process the Rx FIFO, call @c CheckRx().  If the CPHAL has received any data, it will
188 +call @c Receive() to pass the driver the data.  Please reference @ref VDMA_Functions for more
189 +information on these interfaces.
190 +
191 +@section vdma_details VDMA Implementation Details
192 +
193 +The following functions are not defined for use with VDMA:  @c Status(), @c Tick(), @c StatsGet(),
194 +and @c StatsClear().
195 +
196 +*/
197 +
198 +/**
199 +@page AAL5_Implementation_Details
200 +
201 +@section aal5_ver Version
202 +
203 +@copydoc AAL5_Version
204 +
205 +@section aal5_intro Introduction
206 +
207 +The AAL5 implementation will support 16 channels for transmit and 16 channels for
208 +receive.  Each of the transmit channels may have up to two transmit queues
209 +associated with it.  If two queues are used, Queue 0 is the high priority queue,
210 +and Queue 1 is the low priority queue.
211 +
212 +@section aal5_params AAL5 Configuration Parameters
213 +
214 +AAL5 requires two device entries to be available in the configuration repository, named
215 +@p "aal5" and @p "sar".  The @p aal5 device entry must contain @p base (base address)
216 +and @p int_line (interrupt number). The @p sar device entry must have both @p base 
217 +(base address) and @p reset_bit (reset bit).
218 +
219 +@par Device Level Configuration Parameters
220 +
221 +The following parameters are device-level parameters, which apply across all
222 +channels.  The value for these parameters may be modified by changing the value in the
223 +configuration repository.  
224 +
225 +- "UniNni":  
226 +AAL5 network setting. 0 = UNI (default), 1 = NNI.
227 +
228 +@par Channel Configuration Parameters
229 +
230 +All AAL5 channel parameters may also be configured through the @c ChannelSetup() interface.
231 +Following is the list of @p CHANNEL_INFO members that may be modified by the driver when 
232 +calling @c ChannelSetup().  The driver may provide a value of 0xFFFFFFFF for any channel 
233 +parameter to select a default value for the parameter.  The driver should at a minimum 
234 +configure @p Vci and @p Vpi.  The usage of all parameters beginning with TxVc_,
235 +TxVp_, RxVc_, RxVp_ is described in greater detail in the SAR Firmware Spec.
236 +These parameters are mainly associated with QoS and OAM functionality.
237 +
238 +- "RxNumBuffers":    
239 +The number of Rx buffer descriptors to allocate for Ch.  
240 +- "RxBufSize":         
241 +Size (in bytes) for each Rx buffer.
242 +- "RxBufferOffset":   
243 +Number of bytes to offset rx data from start of buffer (must be less than buffer size).
244 +- "RxServiceMax":    
245 +Maximum number of packets to service at one time.
246 +- "TxNumBuffers":      
247 +The number of Tx buffer descriptors to allocate for Ch.
248 +- "TxNumQueues":        
249 +Number of Tx queues for this channel (1-2). Choosing 2 enables a low priority SAR queue. 
250 +- "TxServiceMax":       
251 +Maximum number of packets to service at one time. 
252 +- "CpcsUU":         
253 +The 2-byte CPCS UU and CPI information.
254 +- "Gfc":    
255 +Generic Flow Control.  Used in ATM header of Tx packets.
256 +- "Clp":   
257 +Cell Loss Priority.  Used in ATM header of Tx packets.
258 +- "Pti":   
259 +Payload Type Indication.  Used in ATM header of Tx packets.
260 +- "DaMask":           
261 +Specifies whether credit issuance is paused when Tx data not available.
262 +- "Priority":   
263 +Priority bin this channel will be scheduled within.
264 +- "PktType":   
265 +0=AAL5,1=Null AAL,2=OAM,3=Transparent,4=AAL2.
266 +- "Vci":                
267 +Virtual Channel Identifier.
268 +- "Vpi":                 
269 +Virtual Path Identifier.
270 +- "TxVc_AtmHeader":
271 +In firmware OAM mode, this
272 +is the ATM header to be appended to front of firmware generated VC OAM cells for
273 +this channel.  Note: To generate host OAM cells, call @c Send() with 
274 +the appropriate mode.
275 +- "TxVc_CellRate":       
276 +Tx rate, set as clock ticks between transmissions (SCR for VBR, CBR for CBR).
277 +- "TxVc_QosType":        
278 +0=CBR,1=VBR,2=UBR,3=UBRmcr.
279 +- "TxVc_Mbs":            
280 +Min Burst Size in cells.
281 +- "TxVc_Pcr":            
282 +Peak Cell Rate for VBR in clock ticks between transmissions.
283 +- "TxVc_OamTc":   
284 +TC Path to transmit OAM cells for TX connections (0,1).
285 +- "TxVc_VpOffset":   
286 +Offset to the OAM VP state table for TX connections.  Channels with the same
287 +VPI must have the same VpOffset value.  Channels with different VPIs
288 +must have unique VpOffset values.
289 +- "RxVc_OamCh":   
290 +Channel to which to terminate received OAM cells to be forwarded to the Host
291 +for either Host OAM mode, or when RxVc_OamToHost is enabled during Firmware
292 +OAM mode.
293 +- "RxVc_OamToHost":   
294 +Indicates whether to pass received unmatched OAM loopback cells to the host;
295 +0=do not pass, 1=pass.
296 +- "RxVc_AtmHeader":   
297 +ATM Header placed on firmware gen'd OAM cells for this channel on a Rx 
298 +connection (must be big endian with 0 PTI).
299 +- "RxVc_OamTc":   
300 +TC Path to transmit OAM cells for RX connections (0,1).
301 +- "RxVc_VpOffset":   
302 +Offset to the OAM VP state table for RX connections.  Channels with the same
303 +VPI must have the same VpOffset value.  Channels with different VPIs
304 +must have unique VpOffset values.
305 +- "TxVp_OamTc":   
306 +TC Path to transmit OAM cells for TX VP connections (0,1).
307 +- "TxVp_AtmHeader":   
308 +ATM Header placed on firmware gen'd VP OAM cells for this channel on a Tx VP
309 +connection (must be big endian with 0 VCI).
310 +- "RxVp_OamCh":   
311 +Channel to which to terminate received OAM cells to be forwarded to the Host
312 +for either Host OAM mode, or when RxVc_OamToHost is enabled during Firmware
313 +OAM mode.
314 +- "RxVp_OamToHost":   
315 +Indicates whether to pass received unmatched OAM loopback cells to the host;
316 +0=do not pass, 1=pass.
317 +- "RxVp_AtmHeader":
318 +In firmware OAM mode, this
319 +is the ATM header to be appended to front of firmware generated VP OAM cells for
320 +this channel.  Note: To generate host OAM cells, call @c Send() with 
321 +the appropriate mode.
322 +- "RxVp_OamTc":   
323 +TC Path to transmit OAM cells for RX VP connections (0,1).
324 +- "RxVp_OamVcList":   
325 +This 32-bit field is one-hot encoded to indicate all the VC channels that are
326 +associated with this VP channel.  A value of 21 will indicate that VC
327 +channels 0, 2, and 4 are associated with this VP channel.
328 +- "FwdUnkVc":
329 +Indicates whether or not to forward unknown VCI/VPI cells to the host.  This 
330 +parameter only takes effect if the channel's PktType is Transparent(3).
331 +1=forwarding enabled, 0=forwarding disabled.
332 +
333 +@section aal5_details API Implementation Details
334 +
335 +ATTENTION: Documentation given here supplements the documentation given in the general
336 +CPHAL API section.  The following details are crucial to correct usage of the
337 +AAL5 CPHAL.
338 +
339 +@par Receive()
340 +The least significant byte of @p Mode contains the channel number.  Bit 31
341 +indicates whether or not the ATM header is present in the first fragment of
342 +the packet.  If bit 31 is set, the 4 byte ATM header (minus HEC) will be provided 
343 +in the first fragment, with the payload beginning in the second fragment.  Currently,
344 +this is the default behavior for host OAM and transparent mode packets.
345 +Bits 17-16 indicate the packet type that is being received.  
346 +Mode Parameter Breakdown: <BR>
347 +- 31     ATM Header In First Fragment (1=true, 0=false) <BR>
348 +- 30-18  Unused. <BR>
349 +- 17-16  Pkt Type. <BR>
350 +  -   0=AAL5 <BR>
351 +  -   1=PTI Based Null AAL <BR>
352 +  -   2=OAM <BR>
353 +  -   3=Transparent <BR>
354 +- 15-08  Unused. <BR>
355 +- 07-00  Channel Number.
356 +
357 +@par Send()
358 +The most significant 16 bits of the first fragment 'len' is used as the Offset 
359 +to be added to the packet.  @c Send() will reserve this many bytes at the 
360 +beginning of the transmit buffer prior to the first byte of valid data.
361 +For the @p Mode parameter, Bit 31 must be set if the user has sent a packet with
362 +the ATM Header (minus HEC) embedded in the first 4 bytes of the first fragment data buffer.
363 +The OS has the option of using a 4 byte first fragment containing only ATM header,
364 +or concatenating the ATM Header in front of the data payload.
365 +If Bit 31 is set, the ATM Header in the buffer is preserved and sent with
366 +each cell of the packet.  Otherwise, Send() will build the ATM header based on the
367 +values of the Pti, Gfc, Clp, Vpi, and Vci parameters for the given channel.
368 +Bits 17-16 are defined as the packet type.  Bits 15-08 may be used to specify the 
369 +transmit queue to send the packet on.  Only values 0 (high priority) and 1 (low 
370 +priority) are accepted.  Bits 07-00 should be used to indicate the channel number 
371 +for the @c Send() operation.  Valid channel numbers are 0-15.
372 +Mode Parameter Breakdown: <BR>
373 +- 31     ATM Header In Packet (1=true, 0=false) <BR>
374 +- 30-18  Unused. <BR>
375 +- 17-16  Pkt Type. <BR>
376 +  -   0=AAL5 <BR>
377 +  -   1=PTI Based Null AAL <BR>
378 +  -   2=OAM <BR>
379 +  -   3=Transparent <BR>
380 +- 15-08  Transmit Queue. <BR>
381 +- 07-00  Channel Number.
382 +  
383 +@par ChannelSetup()
384 +The AAL5 @c ChannelSetup() always configures both the Tx and Rx side of the channel
385 +connection in the same call.
386 +
387 +@par ChannelTeardown()
388 +Regardless of the channel teardown direction selected, the AAL5 CPHAL will always
389 +teardown both the Tx and Rx side of the channel connection.
390 +
391 +@par TeardownComplete()
392 +The value for the @p Direction parameter should be ignored for the AAL5 implementation,
393 +since both directions (Tx and Rx) are always torndown in response to a @c ChannelTeardown()
394 +command.
395 +
396 +@par Control() (HAL version)
397 +Defined keys and actions.  Unless otherwise stated, the data type
398 +for Value is pointer to unsigned integer.  The list is broken into
399 +three groups, one group which can be used anytime, one group that should
400 +be used before halOpen(), and one group which can only be used after 
401 +halOpen() (but before halClose()).  For channelized parameters, replace
402 +'Ch' with the integer number of a channel (ex. "Gfc.4" can be used to set
403 +Gfc for channel 4).
404 +
405 +MAY USE ANYTIME AFTER INIT (after halInit() is called):
406 +
407 +- "Gfc.Ch".  The OS may "Set" this value.  Changing this value causes
408 +the Gfc in each Tx ATM header for this channel to take on the new Gfc value.
409 +
410 +- "Clp.Ch".  The OS may "Set" this value.  Changing this value causes
411 +the Clp in each Tx ATM header for this channel to take on the new Clp value.
412 +
413 +- "Pti.Ch".  The OS may "Set" this value.  Changing this value causes
414 +the Pti in each Tx ATM header for this channel to take on the new Pti value.
415 +
416 +- "CpcsUU.Ch".  The OS may "Set" this value.  Changing this value causes
417 +the CpcsUU in each Tx ATM header for this channel to take on the new CpcsUU value.
418 +
419 +- "OamMode".  Specifies if host or firmware is performing OAM functions; 0 = Host OAM, 
420 +1 = Firmware OAM.  When set, all SAR channels will be configured for
421 +the selection, including AAL2 channels.
422 +
423 +- "OamLbTimeout".  Specifies the firmware OAM loopback timeout, in milliseconds.
424 +
425 +- "DeviceCPID".  The OS may "Set" this value.  This is the OAM connection 
426 +point identifier.  The OS should provide a pointer to an array of 4 32-bit
427 +integers.  Each word must be configured in big endian format.
428 +
429 +- "FwdUnkVc.Ch".  Indicates whether or not to forward unknown VCI/VPI cells to the host.
430 +This parameter only takes effect if the channel's PktType is Transparent(3).
431 +1=forwarding enabled, 0=forwarding disabled.
432 +
433 +MAY USE ONLY BEFORE HAL IS OPEN (before halOpen() call):
434 +- "StrictPriority". The OS may "Set" this value.  Setting to 1 causes
435 +a different interrupt processing routine to be used, which gives strict
436 +priority to channels with lower numbers (channel 0 has highest priority).
437 +The default handler gives equal priority to all channels.
438 +
439 +- "MaxFrags".  The OS may "Set" or "Get" this value.  This defines the maximum
440 +number of fragments that can be received by the AAL5 Rx port.  The default
441 +value for AAL5 is 46.  This provides enough space to receive a maximum
442 +length AAL5 packet (65,568 bytes) with the default buffer size of 1518 bytes, and
443 +any amount of RxBufferOffset.  If the buffer size is configured to be smaller,
444 +the OS *MUST* modify this parameter according to the following formula: 
445 +((System Max AAL5 packet length)/(RxBufSize)) + 2.  (The extra two fragments in
446 +the formula allow for RxBufferOffset and one fragment for the ATM Header, used
447 +when receiving host OAM or transparent mode packets)
448 +
449 +MAY USE ONLY AFTER HAL IS 'OPEN' (after halOpen() call):
450 +- "Stats;Level;Ch;Queue".  The OS may "Get" Stats groups with this key, where 
451 +'Level' is an integer from 0-4, Ch is an integer from 0-15, and Queue is
452 +an integer from 0-1.  Note that Ch is not required for Level 4 stats, and Queue
453 +is not required for Level 0, 3, and 4.  The statistics functionality and return 
454 +value is described in the appendix entitled "Configuration and Control".
455 +
456 +- "TxVc_CellRate.Ch".  The OS may "Set" this value.  Can be used to modify
457 +CellRate for a channel on the fly.
458 +
459 +- "TxVc_Mbs.Ch".  The OS may "Set" this value.  Can be used to modify
460 +Mbs for a channel on the fly.
461 +
462 +- "TxVc_Pcr.Ch".  The OS may "Set" this value.  Can be used to modify
463 +Pcr for a channel on the fly.
464 +
465 +- "PdspEnable".  The OS may "Set" this value.  Value 0 disables the PDSP.
466 +Value 1 enables to PDSP.
467 +
468 +- "DeviceCPID".  The OS may "Set" this value.  The Value should be an array
469 +of 4 32-bit integers that comprise the CPID.  
470 +
471 +- "RxVc_RDICount.Ch".  The OS may "Get" or "Set" this value.  Get returns
472 +the current RDI count for the VC channel.  Set clears the counter, and the Value
473 +is ignored.
474 +
475 +- "RxVp_RDICount.Ch".  The OS may "Get" or "Set" this value.  Get returns
476 +the current RDI count for the VP channel.  Set clears the counter, and the Value
477 +is ignored.
478 +
479 +- "RxVc_AISseg.Ch". The OS may "Get" this value.  This is an indication of
480 +AIS segment error for the VC channel.
481 +
482 +- "RxVp_AISseg.Ch". The OS may "Get" this value.  This is an indication of
483 +AIS segment error for the VP channel.
484 +
485 +- "RxVc_AISetoe.Ch". The OS may "Get" this value.  This is an indication of
486 +AIS end-to-end error for the VC channel.
487 +
488 +- "RxVp_AISetoe.Ch". The OS may "Get" this value.  This is an indication of
489 +AIS end-to-end error for the VP channel.
490 +
491 +- "RxVc_OamCh.Ch". The OS may "Set" this value.  Channel to which to terminate 
492 +received OAM cells to be forwarded to the Host for either Host OAM mode, or when 
493 +RxVc_OamToHost is enabled during Firmware OAM mode.
494 +
495 +- "RxVp_OamCh.Ch". The OS may "Set" this value.  Channel to which to terminate 
496 +received OAM cells to be forwarded to the Host for either Host OAM mode, or when 
497 +RxVp_OamToHost is enabled during Firmware OAM mode.
498 +
499 +- "F4_LB_Counter". The OS may "Get" this value.  This is a count of the number
500 +  of near-end F4 loopbacks performed by the PDSP in firmware OAM mode.
501 +
502 +- "F5_LB_Counter". The OS may "Get" this value.  This is a count of the number
503 +  of near-end F5 loopbacks performed by the PDSP in firmware OAM mode.
504 +
505 +- "TxVc_AtmHeader.Ch". The OS may "Set" this value.  In firmware OAM mode, this
506 +is the ATM header to be appended to front of firmware generated VC OAM cells for
507 +this channel.  In host OAM mode, this is used as the ATM header to be appended
508 +to front of host generated VC OAM cells for this channel.  It must be configured
509 +as big endian with PTI=0.  Note: To generate host OAM cells, call @c Send() with 
510 +the appropriate mode.
511 +
512 +- "TxVp_AtmHeader.Ch". The OS may "Set" this value.  In firmware OAM mode, this
513 +is the ATM header to be appended to front of firmware generated VP OAM cells for
514 +this channel.  In host OAM mode, this is used as the ATM header to be appended
515 +to front of host generated VP OAM cells for this channel.  It must be configured
516 +as big endian with VCI=0.  Note: To generate host OAM cells, call @c Send() with 
517 +the appropriate mode.
518 +
519 +- "PdspEnable".  The OS may "Set" this value. Controls whether or not the PDSP is 
520 +allowed to fetch new instructions.  The PDSP is enabled by the CPHAL during Open(), 
521 +and disabled during Close().  0 = disabled, 1 = enabled.
522 +
523 +@par Control() (OS version)
524 +Defined keys and actions:
525 +
526 +- "Firmware".  The CPHAL will perform a "Get" action for the key "Firmware".  A pointer
527 +to a pointer is passed in @p Value.  The OS must modify the referenced pointer to point
528 +to the firmware.
529 +
530 +- "FirmwareSize".  The CPHAL will perform a "Get" action for the key "FirmwareSize".
531 +The OS must place the firmware size in the memory pointed at by @p Value.
532 +
533 +- "OamLbResult".  When a channel that is in firmware OAM mode is commanded to perform
534 +a loopback function, the result of the loopback generates an interrupt that is handled
535 +by the OS like any other interrupt.  The CPHAL, upon servicing the interrupt, will call
536 +osControl with this key, and an action of "Set".  The @p Value parameter will be a 
537 +pointer to the integer result.  1 = pass, 0 = fail.
538 +
539 +- "SarFreq". The CPHAL will perform a "Get" action for this key.  The OS should place
540 +the SAR frequency (in Hz) in the memory pointed at by @p Value.
541 +
542 +@section aal5_stats AAL5 Specific Statistics
543 +
544 +Statistics level '0' contains all AAL5 specific statistics.  The following values will
545 +be obtained when requesting stats level 0:
546 +
547 +- "Crc Errors".  Number of CRC errors reported by SAR hardware.  Incremented for received
548 +packets that contain CRC errors.  
549 +
550 +- "Len Errors".  Number of length errors reported by SAR hardware.  Incremented for received
551 +packets that are in excess of 1366 cells.
552 +
553 +- "Abort Errors".  Number of abort errors reported by SAR hardware.
554 +
555 +- "Starv Errors".  Number of buffer starvation errors reported by SAR hardware.  Incremented
556 +when a part or all of a buffer cannot be received due to lack of RX buffer resources.  The SAR
557 +drops all cells associated with the packet for each buffer starvation error that occurs.
558 +
559 +*/ 
560 +
561 +/* register files */
562 +#include "cp_sar_reg.h"  
563 +
564 +#define _CPHAL_AAL5
565 +#define _CPHAL
566 +#define _CPPI_TEST /** @todo remove for release */
567 +#define __CPHAL_CPPI_OFFSET /* support use of offset */
568 +
569 +/*  OS Data Structure definitions  */
570 +
571 +typedef void OS_PRIVATE;
572 +typedef void OS_DEVICE;
573 +typedef void OS_SENDINFO;
574 +typedef void OS_RECEIVEINFO;
575 +typedef void OS_SETUP;
576 +
577 +/*  CPHAL Data Structure definitions  */
578 +
579 +typedef struct hal_device  HAL_DEVICE;
580 +typedef struct hal_private HAL_PRIVATE;
581 +typedef struct hal_private HAL_RECEIVEINFO;
582 +
583 +/* include CPHAL header files here */
584 +#include "cpcommon_cpaal5.h"
585 +#include "cpswhal_cpaal5.h"
586 +#include "aal5sar.h"
587 +#include "cpcommon_cpaal5.c"
588 +    
589 +#define CR_SERVICE            (170-1)
590 +#define UTOPIA_PAUSE_REG      (*(volatile bit32u *)0xa4000000)
591 +
592 +/* 
593 +these masks are for the mode parameter used in halSend/OsReceive
594 +(may move these elsewhere)
595 +*/
596 +#define CH_MASK            0xff
597 +#define PRI_MASK           0x10000 
598 +  
599 +/* Rcb/Tcb Constants */
600 +#define CB_SOF_BIT         (1<<31)
601 +#define CB_EOF_BIT         (1<<30)
602 +#define CB_SOF_AND_EOF_BIT (CB_SOF_BIT|CB_EOF_BIT)
603 +#define CB_OWNERSHIP_BIT   (1<<29)
604 +#define CB_EOQ_BIT         (1<<28)
605 +#define CB_SIZE_MASK       0x0000ffff
606 +#define CB_OFFSET_MASK     0xffff0000
607 +#define RCB_ERRORS_MASK    0x03fe0000
608 +#define RX_ERROR_MASK      0x000f0000
609 +#define CRC_ERROR_MASK     0x00010000
610 +#define LENGTH_ERROR_MASK  0x00020000
611 +#define ABORT_ERROR_MASK   0x00040000
612 +#define STARV_ERROR_MASK   0x00080000
613 +#define TEARDOWN_VAL       0xfffffffc
614 +
615 +/* interrupt vector masks */
616 +#define TXH_PEND        0x01000000
617 +#define TXL_PEND        0x02000000
618 +#define RX_PEND         0x04000000
619 +#define STS_PEND        0x08000000
620 +#define AAL2_PEND       0x10000000
621 +#define INT_PENDING     (TXH_PEND | TXL_PEND | RX_PEND | STS_PEND | AAL2_PEND)
622 +#define STS_PEND_INVEC  0x0001F000
623 +#define RX_PEND_INVEC   0x00000F00
624 +#define TXL_PEND_INVEC  0x000000F0
625 +#define TXH_PEND_INVEC  0x0000000F
626 +#define AIS_SEG_MASK    0x1        /* +01.02.00 */
627 +#define AIS_SEG_SHIFT   0          /* +01.02.00 */
628 +#define AIS_ETOE_MASK   0x20000    /* +01.02.00 */
629 +#define AIS_ETOE_SHIFT  17         /* +01.02.00 */
630 +#define RDI_CNT_MASK    0xffff0000 /* +01.02.00 */
631 +#define RDI_CNT_SHIFT   16         /* +01.02.00 */
632 +
633 +/*
634 + *  This function takes a vpi/vci pair and computes the 4 byte atm header
635 + *  (minus the HEC).
636 + *
637 + *  @param  vpi  Virtual Path Identifier.
638 + *  @param  vci  Virtual Channel Identifier.
639 + *
640 + *  @return  A properly formatted ATM header, without the HEC.
641 + */ 
642 +static int atmheader(int gfc, int vpi, int vci, int pti, int clp)
643 +  {
644 +   int itmp;
645 +
646 +   itmp=0;
647 +  
648 +   /* UNI Mode uses the GFC field */
649 +   itmp |= ((gfc & 0xF) << 28);
650 +   itmp |= ((vpi & 0xFF) << 20);
651 +    
652 +   /* if NNI Mode, no gfc and larger VPI */
653 +   /*itmp |= ((vpi & 0xFFF) << 20);*/
654 +
655 +   itmp|=((vci & 0xFFFF) << 4);
656 +   itmp|=((pti & 0x7) << 1);
657 +   itmp|=(clp & 0x1);
658 +   return(itmp);
659 +  }
660 +
661 +#include "cppi_cpaal5.c"
662 +
663 +/*
664 + *   Re-entrancy Issues
665 + *   In order to ensure successful re-entrancy certain sections of the
666 + *   CPHAL code will be bracketed as Critical.
667 + *   The OS will provide the function Os.CriticalSection(BOOL), which
668 + *   will be passed a TRUE to enter the Critical Section and FALSE to exit.
669 + */
670 +
671 +/*
672 + *  @ingroup CPHAL_Functions
673 + *  Clears the statistics information.
674 + *
675 + *  @param  HalDev   CPHAL module instance. (set by xxxInitModule())
676 + *
677 + *  @return 0 OK, Non-zero not OK
678 + */
679 +static int StatsClear(HAL_DEVICE *HalDev)
680 +  {
681 +   int i;
682 +
683 +#ifdef __CPHAL_DEBUG
684 +   if (DBG(0))
685 +     {
686 +      dbgPrintf("[aal5]StatsClear(HalDev:%08x)\n", (bit32u)HalDev);
687 +      osfuncSioFlush();
688 +     }
689 +#endif
690 +
691 +   /* clear stats */
692 +   for (i=0; i<NUM_AAL5_CHAN; i++)
693 +     {
694 +      HalDev->Stats.CrcErrors[i]=0;
695 +      HalDev->Stats.LenErrors[i]=0;
696 +      HalDev->Stats.DmaLenErrors[i]=0;
697 +      HalDev->Stats.AbortErrors[i]=0;
698 +      HalDev->Stats.StarvErrors[i]=0;
699 +      HalDev->Stats.TxMisQCnt[i][0]=0;
700 +      HalDev->Stats.TxMisQCnt[i][1]=0;
701 +      HalDev->Stats.RxMisQCnt[i]=0;
702 +      HalDev->Stats.RxEOQCnt[i]=0;
703 +      HalDev->Stats.TxEOQCnt[i][0]=0;
704 +      HalDev->Stats.TxEOQCnt[i][1]=0;
705 +      HalDev->Stats.RxPacketsServiced[i]=0;
706 +      HalDev->Stats.TxPacketsServiced[i][0]=0;
707 +      HalDev->Stats.TxPacketsServiced[i][1]=0;
708 +      HalDev->Stats.TxMaxServiced[i][0]=0;
709 +      HalDev->Stats.TxMaxServiced[i][1]=0;
710 +     }
711 +   HalDev->Stats.RxTotal=0;
712 +   HalDev->Stats.TxTotal=0;
713 +   HalDev->Stats.RxMaxServiced=0;
714 +   return (EC_NO_ERRORS);
715 +  }
716 +
717 +/*
718 + *  Returns statistics information.
719 + *
720 + *  @param  HalDev   CPHAL module instance. (set by xxxInitModule())  
721 + *
722 + *  @return 0
723 + */
724 +/*
725 +static STAT_INFO* StatsGet(HAL_DEVICE *HalDev)
726 +  {
727 +   STAT_INFO* MyStats = &HalDev->Stats;
728 +#ifdef __CPHAL_DEBUG
729 +   if (DBG(0))
730 +     {
731 +      dbgPrintf("[aal5]StatsGet(HalDev:%08x)\n", (bit32u)HalDev);
732 +      osfuncSioFlush();
733 +     }
734 +#endif
735 +
736 +   dbgPrintf("HAL Stats:\n");
737 +   DispStat(HalDev, "Rx Total",MyStats->RxTotal);
738 +   DispStat(HalDev, "Tx Total",MyStats->TxTotal);
739 +   DispStat(HalDev, "Rx Peak",MyStats->RxMaxServiced);
740 +   DispStat(HalDev, "TxH Peak",MyStats->TxMaxServiced[0][0]);
741 +   DispStat(HalDev, "TxL Peak",MyStats->TxMaxServiced[0][1]);
742 +   DispChStat(HalDev, "CrcErr",&MyStats->CrcErrors[0],1);
743 +   DispChStat(HalDev, "LenErr",&MyStats->LenErrors[0],1);
744 +   DispChStat(HalDev, "DmaLenErr",&MyStats->DmaLenErrors[0],1);
745 +   DispChStat(HalDev, "AbortErr",&MyStats->AbortErrors[0],1);
746 +   DispChStat(HalDev, "StarvErr",&MyStats->StarvErrors[0],1);
747 +   DispChStat(HalDev, "TxH MisQ Cnt",&MyStats->TxMisQCnt[0][0],2);
748 +   DispChStat(HalDev, "TxL MisQ Cnt",&MyStats->TxMisQCnt[0][1],2);
749 +   DispChStat(HalDev, "Rx MisQ Cnt",&MyStats->RxMisQCnt[0],1);
750 +   DispChStat(HalDev, "Rx EOQ Cnt",&MyStats->RxEOQCnt[0],1); 
751 +   DispChStat(HalDev, "TxH EOQ Cnt",&MyStats->TxEOQCnt[0][0],2);
752 +   DispChStat(HalDev, "TxL EOQ Cnt",&MyStats->TxEOQCnt[0][1],2);
753 +   DispChStat(HalDev, "Rx Pkts",&MyStats->RxPacketsServiced[0],1);
754 +   DispChStat(HalDev, "TxH Pkts",&MyStats->TxPacketsServiced[0][0],2);
755 +   DispChStat(HalDev, "TxL Pkts",&MyStats->TxPacketsServiced[0][1],2); 
756 +
757 +   return (&HalDev->Stats);
758 +  }
759 +*/
760 +
761 +#ifdef __CPHAL_DEBUG
762 +void dbgChannelConfigDump(HAL_DEVICE *HalDev, int Ch)
763 +  {
764 +   CHANNEL_INFO *HalCh = &HalDev->ChData[Ch];
765 +   dbgPrintf("  [aal5 Inst %d, Ch %d] Config Dump:\n", HalDev->Inst, Ch);
766 +   dbgPrintf("    TxNumBuffers  :%08d, TxNumQueues :%08d\n", 
767 +             HalCh->TxNumBuffers, HalCh->TxNumQueues);
768 +   dbgPrintf("    RxNumBuffers  :%08d, RxBufSize   :%08d\n", 
769 +             HalCh->RxNumBuffers, HalCh->RxBufSize);
770 +   dbgPrintf("    TxServiceMax  :%08d, RxServiceMax:%08d\n", 
771 +             HalCh->TxServiceMax, HalCh->RxServiceMax);
772 +   dbgPrintf("    RxBufferOffset:%08d, DaMask      :%08d\n", 
773 +             HalCh->RxBufferOffset, HalCh->DaMask);
774 +   dbgPrintf("    CpcsUU        :%08d, Gfc         :%08d\n", 
775 +             HalCh->CpcsUU, HalCh->Gfc);
776 +   dbgPrintf("    Clp           :%08d, Pti         :%08d\n", 
777 +             HalCh->Clp, HalCh->Pti);
778 +   dbgPrintf("    Priority      :%08d, PktType     :%08d\n", 
779 +             HalCh->Priority, HalCh->PktType);
780 +   dbgPrintf("    Vci           :%08d, Vpi         :%08d\n", 
781 +             HalCh->Vci, HalCh->Vpi);
782 +   dbgPrintf("    TxVc_CellRate :%08d, TxVc_QosType:%08d\n", 
783 +             HalCh->TxVc_CellRate, HalCh->TxVc_QosType);
784 +   dbgPrintf("    TxVc_Mbs      :%08d, TxVc_Pcr    :%08d\n", 
785 +             HalCh->TxVc_Mbs, HalCh->TxVc_Pcr);
786 +   dbgPrintf("    TxVc_AtmHeader:%08d\n", 
787 +             HalCh->TxVc_AtmHeader);
788 +   osfuncSioFlush();
789 +  }
790 +#endif
791 +
792 +/*
793 + * Retrieves channel parameters from configuration file.  Any parameters
794 + * which are not found are ignored, and the HAL default value will apply,
795 + * unless a new value is given through the channel structure in the call
796 + * to ChannelSetup.
797 + */
798 +static int ChannelConfigGet(HAL_DEVICE *HalDev, CHANNEL_INFO *HalChn)
799 +  {
800 +   unsigned int Ret, Value, Ch = HalChn->Channel;
801 +   OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
802 +   void *ChInfo;
803 +
804 +#ifdef __CPHAL_DEBUG
805 +   if (DBG(0))
806 +     {
807 +      dbgPrintf("[aal5]ChannelConfigGet(HalDev:%08x, HalChn:%08x)\n", (bit32u)HalDev,
808 +                (bit32u)HalChn);
809 +      osfuncSioFlush();
810 +     }
811 +#endif
812 +
813 +   Ret=OsFunc->DeviceFindParmValue(HalDev->DeviceInfo, channel_names[Ch], &ChInfo);
814 +   if (Ret) return (EC_AAL5|EC_FUNC_CHSETUP|EC_VAL_CH_INFO_NOT_FOUND);
815 +
816 +   /* i don't care if a value is not found because they are optional */
817 +   Ret=OsFunc->DeviceFindParmUint(ChInfo, "TxNumBuffers", &Value);
818 +   if (!Ret) HalDev->ChData[Ch].TxNumBuffers = Value;
819 +
820 +   Ret=OsFunc->DeviceFindParmUint(ChInfo, "TxNumQueues", &Value);
821 +   if (!Ret) HalDev->ChData[Ch].TxNumQueues = Value;
822 +
823 +   Ret=OsFunc->DeviceFindParmUint(ChInfo, "TxServiceMax", &Value);
824 +   if (!Ret) HalDev->ChData[Ch].TxServiceMax = Value;
825 +   
826 +   Ret=OsFunc->DeviceFindParmUint(ChInfo, "RxNumBuffers", &Value);
827 +   if (!Ret) HalDev->ChData[Ch].RxNumBuffers = Value;
828 +
829 +   Ret=OsFunc->DeviceFindParmUint(ChInfo, "RxBufferOffset", &Value);
830 +   if (!Ret) HalDev->ChData[Ch].RxBufferOffset = Value;
831 +
832 +   Ret=OsFunc->DeviceFindParmUint(ChInfo, "RxBufSize", &Value);
833 +   if (!Ret) HalDev->ChData[Ch].RxBufSize = Value;
834 +
835 +   Ret=OsFunc->DeviceFindParmUint(ChInfo, "RxServiceMax", &Value);
836 +   if (!Ret) HalDev->ChData[Ch].RxServiceMax = Value;
837 +
838 +   Ret=OsFunc->DeviceFindParmUint(ChInfo, "CpcsUU", &Value);
839 +   if (!Ret) HalDev->ChData[Ch].CpcsUU = Value;
840 +
841 +   Ret=OsFunc->DeviceFindParmUint(ChInfo, "Gfc", &Value);
842 +   if (!Ret) HalDev->ChData[Ch].Gfc = Value;
843 +
844 +   Ret=OsFunc->DeviceFindParmUint(ChInfo, "Clp", &Value);
845 +   if (!Ret) HalDev->ChData[Ch].Clp = Value;
846 +
847 +   Ret=OsFunc->DeviceFindParmUint(ChInfo, "Pti", &Value);
848 +   if (!Ret) HalDev->ChData[Ch].Pti = Value;
849 +
850 +   Ret=OsFunc->DeviceFindParmUint(ChInfo, "DaMask", &Value);
851 +   if (!Ret) HalDev->ChData[Ch].DaMask = Value;
852 +
853 +   Ret=OsFunc->DeviceFindParmUint(ChInfo, "Priority", &Value);
854 +   if (!Ret) HalDev->ChData[Ch].Priority = Value;
855 +
856 +   Ret=OsFunc->DeviceFindParmUint(ChInfo, "PktType", &Value);
857 +   if (!Ret) HalDev->ChData[Ch].PktType = Value;
858 +
859 +   Ret=OsFunc->DeviceFindParmUint(ChInfo, "Vci", &Value);
860 +   if (!Ret) HalDev->ChData[Ch].Vci = Value;
861 +
862 +   Ret=OsFunc->DeviceFindParmUint(ChInfo, "Vpi", &Value);
863 +   if (!Ret) HalDev->ChData[Ch].Vpi = Value;
864 +
865 +   Ret=OsFunc->DeviceFindParmUint(ChInfo, "TxVc_CellRate", &Value);
866 +   if (!Ret) HalDev->ChData[Ch].TxVc_CellRate = Value;
867 +
868 +   Ret=OsFunc->DeviceFindParmUint(ChInfo, "TxVc_QosType", &Value);
869 +   if (!Ret) HalDev->ChData[Ch].TxVc_QosType = Value;
870 +
871 +   Ret=OsFunc->DeviceFindParmUint(ChInfo, "TxVc_Mbs", &Value);
872 +   if (!Ret) HalDev->ChData[Ch].TxVc_Mbs = Value;
873 +
874 +   Ret=OsFunc->DeviceFindParmUint(ChInfo, "TxVc_Pcr", &Value);
875 +   if (!Ret) HalDev->ChData[Ch].TxVc_Pcr = Value;
876 +
877 +   Ret=OsFunc->DeviceFindParmUint(ChInfo, "TxVc_AtmHeader", &Value);
878 +   if (!Ret) HalDev->ChData[Ch].TxVc_AtmHeader = Value;
879 +
880 +   return (EC_NO_ERRORS);
881 +  }
882 +
883 +/*
884 + * Sets up channel parameters in the hardware, and initializes the CPPI
885 + * TX and RX buffer descriptors and buffers.
886 + */
887 +static int ChannelConfigApply(HAL_DEVICE *HalDev, CHANNEL_INFO *HalChn)
888 +  {
889 +   int j, Ch = HalChn->Channel;
890 +   volatile bit32u *pTmp;
891 +   int Ret; /* +GSG 030410 */
892 +
893 +#ifdef __CPHAL_DEBUG
894 +   if (DBG(0))
895 +     {
896 +      dbgPrintf("[aal5]ChannelConfigApply(HalDev:%08x, HalChn:%08x)\n", (bit32u)HalDev,
897 +                (bit32u)HalChn);
898 +      osfuncSioFlush();
899 +     }
900 +#endif
901 +
902 +   if ((HalDev->ChIsOpen[Ch][DIRECTION_TX] == TRUE) || (HalDev->ChIsOpen[Ch][DIRECTION_RX] == TRUE))
903 +     {
904 +      return(EC_AAL5|EC_FUNC_CHSETUP|EC_VAL_CH_ALREADY_OPEN);
905 +     }
906 +
907 +   HalDev->InRxInt[Ch]=FALSE;
908 +  
909 +   /* Initialize Queue Data */
910 +   HalDev->RxActQueueHead[Ch]=0;
911 +   HalDev->RxActQueueCount[Ch]=0;
912 +   HalDev->TxActQueueHead[Ch][0]=0;
913 +   HalDev->TxActQueueHead[Ch][1]=0;
914 +   HalDev->TxActQueueCount[Ch][0]=0;
915 +   HalDev->TxActQueueCount[Ch][1]=0;
916 +   HalDev->RxActive[Ch] = FALSE;
917 +   HalDev->TxActive[Ch][0] = FALSE;
918 +   HalDev->TxActive[Ch][1] = FALSE;
919 +
920 +   /* Clear Rx State RAM */
921 +   pTmp = pRX_DMA_STATE_WORD_0(HalDev->dev_base) + (Ch*64);
922 +   for (j=0; j<NUM_RX_STATE_WORDS; j++)
923 +     *pTmp++ = 0; 
924 +     
925 +   /* Check that Rx DMA State RAM was cleared */
926 +   pTmp -= NUM_RX_STATE_WORDS;
927 +   for (j=0; j<NUM_RX_STATE_WORDS; j++)
928 +     {
929 +      if (*pTmp++ != 0)
930 +        {
931 +         return(EC_AAL5|EC_FUNC_CHSETUP|EC_VAL_RX_STATE_RAM_NOT_CLEARED);
932 +        }    
933 +     } 
934
935 +   /* Clear Tx State RAM */
936 +   pTmp = pTX_DMA_STATE_WORD_0(HalDev->dev_base) + (Ch*64);
937 +   for (j=0; j<NUM_TX_STATE_WORDS; j++)
938 +     *pTmp++ = 0; 
939 +     
940 +   /* Check that Tx DMA State RAM was cleared */
941 +   pTmp -= NUM_TX_STATE_WORDS;
942 +   for (j=0; j<NUM_TX_STATE_WORDS; j++)
943 +     {
944 +      if (*pTmp++ != 0)
945 +        {
946 +         return(EC_AAL5|EC_FUNC_CHSETUP|EC_VAL_TX_STATE_RAM_NOT_CLEARED);
947 +        }
948 +     }
949 +  
950 +   /* Initialize Tx State RAM (Nothing to do) */
951 +   
952 +   /* Initialize Rx State RAM */
953 +   /* Configure the Rx buffer offset */
954 +   pTmp=(pRX_DMA_STATE_WORD_0(HalDev->dev_base) + (Ch*64));
955 +   *pTmp |= (HalDev->ChData[Ch].RxBufferOffset & 0xFF);
956 +
957 +   /* Initialize buffer memory for the channel */
958 +   Ret = InitTcb(HalDev, Ch);
959 +   if (Ret) return (Ret);
960 +
961 +   Ret = InitRcb(HalDev, Ch);
962 +   if (Ret) return (Ret);
963 +
964 +   /* setup interrupt mask/enable for the channel */
965 +   SAR_TX_MASK_SET(HalDev->dev_base) = (1<<Ch);
966 +
967 +   /* if using the low priority queue, set up mask for it */
968 +   if (HalDev->ChData[Ch].TxNumQueues == 2)            /* +GSG 030421 */
969 +     SAR_TX_MASK_SET(HalDev->dev_base) = (1<<Ch)<<16;  /* +GSG 030421 */
970 +
971 +   SAR_RX_MASK_SET(HalDev->dev_base) = (1<<Ch);
972 +
973 +   /* call SAR layer to complete the channel setup - hardware configuration of ch */
974 +   Ret = HalDev->SarFunc->ChannelSetup(HalDev->SarDev, &HalDev->ChData[Ch]); /* ~GSG 030410 */
975 +   if (Ret)                                                                  /* +GSG 030410 */
976 +     return (Ret);                                                           /* +GSG 030410 */
977 +
978 +   /* channel officially open for business */
979 +   HalDev->ChIsOpen[Ch][DIRECTION_TX] = TRUE;
980 +   HalDev->ChIsOpen[Ch][DIRECTION_RX] = TRUE;
981 +
982 +   return (EC_NO_ERRORS);
983 +  }
984 +
985 +/*
986 + * Sets up HAL default channel configuration parameter values.
987 + */
988 +static void ChannelConfigInit(HAL_DEVICE *HalDev, CHANNEL_INFO *HalChn)
989 +  {
990 +   int Ch = HalChn->Channel;
991 +   
992 +#ifdef __CPHAL_DEBUG
993 +   if (DBG(0))
994 +     {
995 +      dbgPrintf("[aal5]ChannelConfigInit(HalDev:%08x, HalChn:%08x)\n", (bit32u)HalDev,
996 +                (bit32u)HalChn);
997 +      osfuncSioFlush();
998 +     }
999 +#endif
1000 +
1001 +   HalDev->ChData[Ch].Channel        = Ch;
1002 +   HalDev->ChData[Ch].TxNumBuffers   = cfg_tx_num_bufs[Ch];
1003 +   HalDev->ChData[Ch].RxNumBuffers   = cfg_rx_num_bufs[Ch];
1004 +   HalDev->ChData[Ch].RxBufSize      = cfg_rx_buf_size[Ch];
1005 +   HalDev->ChData[Ch].RxBufferOffset = cfg_rx_buf_offset[Ch];
1006 +   HalDev->ChData[Ch].TxNumQueues    = cfg_tx_num_queues[Ch]; 
1007 +   HalDev->ChData[Ch].CpcsUU         = cfg_cpcs_uu[Ch];
1008 +   HalDev->ChData[Ch].DaMask         = cfg_da_mask[Ch];
1009 +   HalDev->ChData[Ch].Priority       = cfg_priority[Ch];
1010 +   HalDev->ChData[Ch].PktType        = cfg_pkt_type[Ch];
1011 +   HalDev->ChData[Ch].Vci            = cfg_vci[Ch];
1012 +   HalDev->ChData[Ch].Vpi            = cfg_vpi[Ch];
1013 +   HalDev->ChData[Ch].TxVc_CellRate  = cfg_cell_rate[Ch];
1014 +   HalDev->ChData[Ch].TxVc_QosType   = cfg_qos_type[Ch];
1015 +   HalDev->ChData[Ch].TxVc_Mbs       = cfg_mbs[Ch];
1016 +   HalDev->ChData[Ch].TxVc_Pcr       = cfg_pcr[Ch];
1017 +   HalDev->ChData[Ch].Gfc            = cfg_gfc[Ch];
1018 +   HalDev->ChData[Ch].Clp            = cfg_clp[Ch];
1019 +   HalDev->ChData[Ch].Pti            = cfg_pti[Ch];
1020 +   HalDev->ChData[Ch].RxServiceMax   = cfg_rx_max_service[Ch];
1021 +   HalDev->ChData[Ch].TxServiceMax   = cfg_tx_max_service[Ch];
1022 +  }
1023 +
1024 +/* 
1025 + * Update per channel data in the HalDev based channel structure.
1026 + * If a certain channel parameter has been passed with the HAL_DEFAULT
1027 + * value (0xFFFFFFFF), then do not copy it. 
1028 + */
1029 +static void ChannelConfigUpdate(HAL_DEVICE *HalDev, CHANNEL_INFO *HalChn)
1030 +  {
1031 +   int Ch = HalChn->Channel;
1032 +
1033 +#ifdef __CPHAL_DEBUG
1034 +   if (DBG(0))
1035 +     {
1036 +      dbgPrintf("[aal5]ChannelConfigUpdate(HalDev:%08x, HalChn:%08x)\n", (bit32u)HalDev,
1037 +                (bit32u)HalChn);
1038 +      osfuncSioFlush();
1039 +     }
1040 +#endif
1041 +
1042 +   HalDev->ChData[Ch].Channel = Ch;
1043 +
1044 +   /* ChannelUpdate is a macro defined in cpcommon.h.  It requires
1045 +      the presence of the variables named 'Ch' and 'HalChn'.*/
1046 +   ChannelUpdate(DaMask);
1047 +   ChannelUpdate(Priority);
1048 +   ChannelUpdate(PktType);
1049 +   ChannelUpdate(Vci);
1050 +   ChannelUpdate(Vpi);
1051 +   ChannelUpdate(CpcsUU);
1052 +   ChannelUpdate(Gfc);
1053 +   ChannelUpdate(Clp);
1054 +   ChannelUpdate(Pti);
1055 +   /* AAL5 Stuff */
1056 +   ChannelUpdate(TxNumBuffers);
1057 +   ChannelUpdate(RxNumBuffers);
1058 +   ChannelUpdate(RxBufSize);
1059 +   ChannelUpdate(RxBufferOffset);
1060 +   ChannelUpdate(TxNumQueues);
1061 +   ChannelUpdate(TxServiceMax);
1062 +   ChannelUpdate(RxServiceMax);
1063 +   /* PDSP STATE RAM */
1064 +   ChannelUpdate(TxVc_CellRate);
1065 +   ChannelUpdate(TxVc_QosType);
1066 +   ChannelUpdate(TxVc_Mbs);
1067 +   ChannelUpdate(TxVc_Pcr);
1068 +   /* OAM */
1069 +   ChannelUpdate(TxVc_AtmHeader);
1070 +   ChannelUpdate(TxVc_OamTc);
1071 +   ChannelUpdate(TxVc_VpOffset);
1072 +   ChannelUpdate(RxVc_OamCh);
1073 +   ChannelUpdate(RxVc_OamToHost);
1074 +   ChannelUpdate(RxVc_AtmHeader);
1075 +   ChannelUpdate(RxVc_VpOffset);
1076 +   ChannelUpdate(RxVc_OamTc);
1077 +   ChannelUpdate(TxVp_AtmHeader);
1078 +   ChannelUpdate(TxVp_OamTc);
1079 +   ChannelUpdate(RxVp_AtmHeader);
1080 +   ChannelUpdate(RxVp_OamCh);
1081 +   ChannelUpdate(RxVp_OamTc);
1082 +   ChannelUpdate(RxVp_OamToHost);
1083 +   ChannelUpdate(RxVp_OamVcList);
1084 +   ChannelUpdate(FwdUnkVc);
1085 +  }
1086 +
1087 +/**
1088 + * @ingroup CPHAL_Functions
1089 + * This function opens the specified channel.  The caller must populate
1090 + * the @p HalCh structure.  CPHAL default values may be requested for any or all
1091 + * members of the @p HalCh structure by supplying a value of 0xFFFFFFFF for the
1092 + * given member.  The @p OsSetup parameter is a pointer to an OS defined
1093 + * data structure.  If the CPHAL later calls @c MallocRxBuffer(), this pointer
1094 + * is returned in that call.
1095 + *  
1096 + * @param   HalDev  CPHAL module instance. (set by xxxInitModule())   
1097 + * @param   HalCh   Per channel information structure.  Implementation specific.
1098 + * @param   OsSetup Pointer to an OS-defined data structure.
1099 + *
1100 + * @return  EC_NO_ERRORS (ok). <BR>
1101 + *          Possible Error Codes:<BR>
1102 + *          @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
1103 + *          @ref EC_VAL_NULL_CH_STRUCT "EC_VAL_NULL_CH_STRUCT"<BR>
1104 + *          @ref EC_VAL_INVALID_CH "EC_VAL_INVALID_CH"<BR>
1105 + *          @ref EC_VAL_CH_ALREADY_OPEN "EC_VAL_CH_ALREADY_OPEN"<BR>
1106 + *          @ref EC_VAL_RX_STATE_RAM_NOT_CLEARED "EC_VAL_RX_STATE_RAM_NOT_CLEARED"<BR>
1107 + *          @ref EC_VAL_TX_STATE_RAM_NOT_CLEARED "EC_VAL_TX_STATE_RAM_NOT_CLEARED"<BR>
1108 + *          @ref EC_VAL_TCB_MALLOC_FAILED "EC_VAL_TCB_MALLOC_FAILED"<BR>
1109 + *          @ref EC_VAL_RCB_MALLOC_FAILED "EC_VAL_RCB_MALLOC_FAILED"<BR>
1110 + *          @ref EC_VAL_RX_BUFFER_MALLOC_FAILED "EC_VAL_RX_BUFFER_MALLOC_FAILED"<BR>
1111 + *          @ref EC_VAL_LUT_NOT_READY "EC_VAL_LUT_NOT_READY"<BR>
1112 + */
1113 +static int halChannelSetup(HAL_DEVICE *HalDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup)
1114 +  {
1115 +  int Ch, Ret;
1116 +   
1117 +#ifdef __CPHAL_DEBUG
1118 +   if (DBG(0))
1119 +     {
1120 +      dbgPrintf("[aal5]halChannelSetup(HalDev:%08x, HalCh:%08x, OsSetup:%08x)\n", (bit32u)HalDev,
1121 +                (bit32u)HalCh, (bit32u)OsSetup);
1122 +      osfuncSioFlush();
1123 +     }
1124 +#endif
1125 +
1126 +  /* Verify proper device state */
1127 +  if (HalDev->State < enInitialized)
1128 +    return (EC_AAL5|EC_FUNC_CHSETUP|EC_VAL_INVALID_STATE);
1129 +
1130 +  /* We require the channel structure to be passed, even if it only contains
1131 +     the channel number */
1132 +  if (HalCh == NULL)
1133 +    {
1134 +     return(EC_AAL5|EC_FUNC_CHSETUP|EC_VAL_NULL_CH_STRUCT);
1135 +    }
1136 +
1137 +  Ch = HalCh->Channel;
1138 +
1139 +  if ((Ch < 0) || (Ch > MAX_AAL5_CHAN))
1140 +    {
1141 +     return(EC_AAL5|EC_FUNC_CHSETUP|EC_VAL_INVALID_CH);
1142 +    }
1143 +
1144 +  /* if channel is already open, this call is invalid */
1145 +  if ((HalDev->ChIsOpen[Ch][DIRECTION_TX] == TRUE) || (HalDev->ChIsOpen[Ch][DIRECTION_RX] == TRUE))
1146 +    {
1147 +     return(EC_AAL5|EC_FUNC_CHSETUP|EC_VAL_CH_ALREADY_OPEN);
1148 +    }
1149 +
1150 +  /* channel is closed, but might be setup.  If so, reopen the hardware channel. */
1151 +  if ((HalDev->ChIsSetup[Ch][DIRECTION_TX] == FALSE) && (HalDev->ChIsSetup[Ch][DIRECTION_RX] == FALSE))
1152 +    {
1153 +      /* Setup channel configuration */
1154 +      /* Store OS_SETUP */
1155 +      HalDev->ChData[Ch].OsSetup = OsSetup;                                         /* ~GSG 030508 */
1156 +
1157 +      /* setup HAL default values for this channel first */
1158 +      ChannelConfigInit(HalDev, HalCh);
1159
1160 +      /* retrieve options.conf channel parameters */
1161 +      /* currently ignoring return value, making the choice that it's okay if
1162 +         the user does not supply channel configuration in the data store */
1163 +      ChannelConfigGet(HalDev, HalCh);
1164 +      
1165 +      /* update HalDev with data given in HalCh */  
1166 +      ChannelConfigUpdate(HalDev, HalCh);
1167 +      
1168 +#ifdef __CPHAL_DEBUG
1169 +      if (DBG(8))
1170 +        {
1171 +         dbgChannelConfigDump(HalDev, Ch);
1172 +        }
1173 +#endif
1174 +
1175 +      /* HalDev->ChIsSetup[Ch][0] = TRUE; */
1176 +      HalDev->ChIsSetup[Ch][DIRECTION_TX] = TRUE;
1177 +      HalDev->ChIsSetup[Ch][DIRECTION_RX] = TRUE;
1178 +
1179 +      /* I don't initialize RcbStart or TcbStart here because their values may be
1180 +         reused across several Setup/Teardown calls */
1181 +    }
1182 +
1183 +  /* If the hardware has been opened (is out of reset), then configure the channel
1184 +     in the hardware. NOTE: ChannelConfigApply calls the CPSAR ChannelSetup()! */
1185 +  if (HalDev->State == enOpened)
1186 +    {
1187 +     Ret = ChannelConfigApply(HalDev, HalCh);
1188 +     if (Ret) return (Ret);
1189 +    }
1190 +
1191 +  return (EC_NO_ERRORS);
1192 +  }
1193 +   
1194 +/*
1195 + *  This function configures the rate at which the OAM timer scheduler
1196 + *  channels will be scheduled.  The value of OamRate is the number of
1197 + *  clock ticks between cell transmissions (if OAM function is sourcing
1198 + *  cells), or the number of clock ticks between events or absence of events
1199 + *  (if OAM function is sinking cells).  The value of i indicates
1200 + *  which OAM function to apply the rate to.  A list is given below.
1201 + *
1202 + *  @par Oam Function Values
1203 + *  - 0  : Loopback source
1204 + *  - 1  : F4 CC source
1205 + *  - 2  : F5 CC source
1206 + *  - 3  : F4 CC sink
1207 + *  - 4  : F5 CC sink
1208 + *  - 5  : F4 TX AIS source
1209 + *  - 6  : F5 TX AIS source
1210 + *  - 7  : F4 RX RDI source
1211 + *  - 8  : F5 RX RDI source
1212 + *  - 9  : F4 AIS monitor
1213 + *  - 10 : F5 AIS monitor
1214 + *
1215 + *  The following is information on how to calculate the OAM rate.  There
1216 + *  is only one OAM timer that is shared among all channels.  Therefore, if
1217 + *  you wanted an OAM source function (ex. F4 CC source) to generate 1 cell/sec 
1218 + *  across 8 channels, you would need to configure the OAM timer to schedule 8 
1219 + *  cells/sec.  In addition, the credits are shared between segment and end-to-end
1220 + *  type OAM cells, so if you were sending both types of cells, you would
1221 + *  need to configure the OAM timer for 16 cells/sec.  However, the clock
1222 + *  rate must be specified in clock ticks between events.  Using an example
1223 + *  clock rate of 125 MHz, the rate in clock ticks can be calculated by 
1224 + *  dividing 125 Mhz by 16 cells/sec.  The results is 7812500 ticks.  Thus,
1225 + *  every 7812500 clock cycles, an OAM cell will be generated for the F4 CC
1226 + *  Source function.
1227 + */
1228 +static void OamRateConfig(HAL_DEVICE *HalDev)
1229 +  {
1230 +   int i;
1231 +   bit32u OamRate, Freq = HalDev->SarFrequency;
1232 +
1233 +   /* Configure OAM Timer State Block */
1234 +   for (i=0; i<NUM_OAM_RATES; i++)
1235 +     {
1236 +      switch(i)
1237 +        {
1238 +         case 0:  OamRate = ((Freq/1000)*HalDev->OamLbTimeout); 
1239 +                  break;
1240 +         case 1: 
1241 +         case 2:
1242 +         case 5:
1243 +         case 6: 
1244 +         case 7:
1245 +         case 8:  OamRate = (Freq/38);
1246 +                  break;
1247 +         case 3:
1248 +         case 4:  OamRate = ((Freq*3) + (Freq/2))/38;
1249 +                  break;
1250 +         case 9:
1251 +         case 10: OamRate = ((Freq*2) + (Freq/2))/38;
1252 +                  break;
1253 +         default: OamRate = (Freq*5);
1254 +                  break;
1255 +        }
1256 +  
1257 +      *(pOAM_TIMER_STATE_WORD_0(HalDev->dev_base) + (i*64) + 1) = OamRate;
1258 +     }
1259 +  }
1260 +
1261 +/**
1262 + *  @ingroup AAL5_Functions
1263 + *  This function is used to enable OAM functions (other than loopback) for a 
1264 + *  particular channel.  The channel (embedded within OamConfig - see below) must 
1265 + *  have been configured for firmware OAM (not host OAM) for these configurations
1266 + *  to take effect.  More than one function may be enabled at one time. 
1267 + *  If more than one function is enabled, they must all be of the same level, all
1268 + *  F4(VP) or all F5(VC).   
1269 + * 
1270 + *  The usage of the OamConfig parameter is described through the table below.  To
1271 + *  initiate firmware OAM, set one or more bits in OamConfig corresponding to the
1272 + *  various OAM functions.  To disable firmware OAM functions, set bit 30 along 
1273 + *  with any other combination of bits to shutdown various OAM functions at once.
1274 + *
1275 + *  Acronyms:
1276 + *  e2e - end to end, seg - segment, CC - continuity check, 
1277 + *  AIS - Alarm Indication Signal
1278 + *
1279 + *  @par Bit:   Function:               Description
1280 + *  - 31:       Reserved:
1281 + *  - 30:       Setup/Teardown:         0 - enable, 1 - disable (Note 1)
1282 + *  - 29:       F4  CC  Source seg:     0 - no action, 1 - configure 
1283 + *  - 28:       F4  CC  Source e2e:     0 - no action, 1 - configure
1284 + *  - 27:       F4  AIS Source seg:     0 - no action, 1 - configure
1285 + *  - 26:       F4  AIS Source e2e:     0 - no action, 1 - configure
1286 + *  - 25:       F5  CC  Source seg:     0 - no action, 1 - configure
1287 + *  - 24:       F5  CC  Source e2e:     0 - no action, 1 - configure
1288 + *  - 23:       F5  AIS Source seg:     0 - no action, 1 - configure
1289 + *  - 22:       F5  AIS Source e2e:     0 - no action, 1 - configure
1290 + *  - 21:       F4  CC  Sink seg:       0 - no action, 1 - configure
1291 + *  - 20:       F4  CC  Sink e2e:       0 - no action, 1 - configure
1292 + *  - 19:       F5  CC  Sink seg:       0 - no action, 1 - configure
1293 + *  - 18:       F5  CC  Sink e2e:       0 - no action, 1 - configure
1294 + *  - 17:8:     Reserved:
1295 + *  - 7:0:      Channel:                AAL5/AAL2 VC/VP channel (Note 2)
1296 + * 
1297 + *
1298 + *  Note 1:  This bit must be clear to enable the specified OAM function.
1299 + *  Note 2:  This must specify the VC channel for F5 functions, and the VP
1300 + *           channel for F4 functions.
1301 + *
1302 + *  @param HalDev      CPHAL module instance. (set by xxxInitModule())
1303 + *  @param OamConfig   A 32-bit integer field defined as follows: 
1304 + */
1305 +static void halOamFuncConfig(HAL_DEVICE *HalDev, unsigned int OamConfig)
1306 +  {
1307 +   /* GPR 0 */
1308 +   SAR_PDSP_HOST_OAM_CONFIG_REG(HalDev->dev_base) = OamConfig;
1309 +  }
1310 +
1311 +/**
1312 + *  @ingroup AAL5_Functions
1313 + *  This function is used to enable OAM loopback functions for a particular 
1314 + *  channel.  The channel (embedded within OamConfig - see below) must have been 
1315 + *  configured for firmware OAM (not host OAM) for these configurations to take 
1316 + *  effect.  Only one loopback function can be enabled at a time.  
1317 + *
1318 + *  The LLID is inserted into to the OAM cell's LLID field, and it specifies the 
1319 + *  LLID of the connection point in the network where the generated loopback cell
1320 + *  should be turned around.  The LLID is composed of 4 32-bit words, and this 
1321 + *  function expects the caller to pass an array of 4 words in the LLID field.  
1322 + *  The CorrelationTag is a 32-bit word that the PDSP uses to correlate loopback 
1323 + *  commands with loopback responses.  It should simply be changed for each 
1324 + *  call, and there is no restriction on the value used for CorrelationTag.
1325 + * 
1326 + *  The usage of the OamConfig parameter is described through the table below.  To
1327 + *  initiate firmware OAM, set one of the bits corresponding to the
1328 + *  various loopback OAM functions.  Note that only one loopback source may be 
1329 + *  commanded at a time.
1330 + *
1331 + *  Acronyms:
1332 + *  e2e - end to end, seg - segment, LB - loopback
1333 + * 
1334 + *  @par Bit:   Function:               Description
1335 + *  - 31:16:    Reserved:
1336 + *  - 15:       F4  LB Source seg:      0 - no action, 1 - configure (Note 1)
1337 + *  - 14:       F4  LB Source seg:      0 - no action, 1 - configure (Note 1)
1338 + *  - 13:       F4  LB Source e2e:      0 - no action, 1 - configure (Note 1)
1339 + *  - 12:       F4  LB Source e2e:      0 - no action, 1 - configure (Note 1) 
1340 + *  - 11:8:     Reserved:
1341 + *  - 7:0:      Channel:                AAL5/AAL2 VC/VP channel (Note 2)
1342 + * 
1343 + *
1344 + *  Note 1:  Only one LB function may be enabled at one time.  Once enabled, 
1345 + *           the PDSP will time out after 5 seconds.  The host must wait until it 
1346 + *           has received the result of the current LB request before initiating 
1347 + *           a new request. <BR>
1348 + *  Note 2:  This must specify the VC channel for F5 functions, and the VP
1349 + *           channel for F4 functions.
1350 + *
1351 + *  @param HalDev      CPHAL module instance. (set by xxxInitModule())
1352 + *  @param OamConfig   A 32-bit integer field defined as follows: 
1353 + *  @param LLID        Loopback Location Identifier (passed as 4 word array).
1354 + *                     Must be configured in big endian format.
1355 + *  @param CorrelationTag 32-bit tag correlates loopback commands with loopback 
1356 + *                        responses.  Must be configured in big endian format.
1357 + *
1358 + */
1359 +static void halOamLoopbackConfig(HAL_DEVICE *HalDev, unsigned int OamConfig, unsigned int *LLID, unsigned int CorrelationTag)
1360 +  {
1361 +   volatile bit32u *tmp;
1362 +
1363 +   /* test to see if this is a loopback command */
1364 +   if (OamConfig & 0xf000)
1365 +     {
1366 +      /* write the OAM correlation tag (GPR 1) */
1367 +      SAR_PDSP_OAM_CORR_REG(HalDev->dev_base) = CorrelationTag;
1368 +
1369 +      /* write the LLID */
1370 +      tmp = pOAM_CONFIG_BLOCK_WORD_0(HalDev->dev_base);
1371 +
1372 +      /* advance past the CPID */
1373 +      tmp += 4;
1374 +
1375 +      *tmp++ = LLID[0];
1376 +      *tmp++ = LLID[1];
1377 +      *tmp++ = LLID[2];
1378 +      *tmp   = LLID[3];
1379 +
1380 +      /* GPR 0 */
1381 +      SAR_PDSP_HOST_OAM_CONFIG_REG(HalDev->dev_base) = OamConfig;
1382 +     }
1383 +  }
1384 +
1385 +/*
1386 + *  This function allows the host software to access any register directly.
1387 + *  Primarily used for debug.
1388 + *  
1389 + *  @param   HalDev      CPHAL module instance. (set by xxxInitModule())  
1390 + *  @param   RegOffset   Hexadecimal offset to desired register (from device base addr)
1391 + *
1392 + *  @return  Volatile pointer to desired register.
1393 + */
1394 +static volatile bit32u* halRegAccess(HAL_DEVICE *HalDev, bit32u RegOffset)
1395 +  {
1396 +   /* compute the register address */
1397 +   return ((volatile bit32u *)(HalDev->dev_base + RegOffset)); 
1398 +  }
1399 +
1400 +#ifdef __CPHAL_DEBUG
1401 +static void dbgConfigDump(HAL_DEVICE *HalDev)
1402 +  {
1403 +   dbgPrintf("  AAL5 Inst %d Config Dump:\n", HalDev->Inst);
1404 +   dbgPrintf("    Base     :%08x, offset:%08d\n", 
1405 +             HalDev->dev_base, HalDev->offset);
1406 +   dbgPrintf("    Interrupt:%08d, debug :%08d\n", 
1407 +             HalDev->interrupt, HalDev->debug);
1408 +   osfuncSioFlush();
1409 +  }
1410 +#endif
1411 +
1412 +/**
1413 + *  @ingroup CPHAL_Functions
1414 + *  Performs a variety of control functions on the CPHAL module.  It is used to
1415 + *  modify/read configuration parameters and to initiate internal functions.
1416 + *  The @p Key indicates the function to perform or the parameter to access (note 
1417 + *  that these Keys are identical to those used in accessing the configuration data
1418 + *  store).  @p Action is applicable to parameters only, and indicates what the
1419 + *  CPHAL should do with the parameter (i.e. "Set", "Get", etc..).  The actions
1420 + *  for each parameter are defined in the module specific documentation.
1421 + *  
1422 + *  @param   HalDev      CPHAL module instance. (set by xxxInitModule())
1423 + *  @param   Key         Key specifying the parameter to change or internal function to initiate.  See module specific documentation for available keys.
1424 + *  @param   Action      Specifies the action to take.  See module specific documentation for available actions.
1425 + *  @param   Value       Pointer to new value for given @p Key parameter ("Set"), or returned value of Key ("Get").
1426 + *  
1427 + *  @return  EC_NO_ERRORS (ok).<BR>
1428 + *           Possible Error Codes:<BR>
1429 + *           @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
1430 + *           @ref EC_VAL_KEY_NOT_FOUND "EC_VAL_KEY_NOT_FOUND"<BR>
1431 + *           @ref EC_VAL_ACTION_NOT_FOUND "EC_VAL_ACTION_NOT_FOUND"<BR>     
1432 + */
1433 +static int halControl(HAL_DEVICE *HalDev, const char *Key, const char *Action, void *Value)
1434 +  {
1435 +   int Level, Ch, KeyFound=0, ActionFound=0, rc=EC_NO_ERRORS, Queue;
1436 +   char *TmpKey = (char *)Key;
1437 +
1438 +#ifdef __CPHAL_DEBUG
1439 +   if (DBG(0))
1440 +     {
1441 +      dbgPrintf("[aal5]halControl(HalDev:%08x, Key:%s, Action:%s, Value:%08x)\n", (bit32u)HalDev,
1442 +                Key, Action, (bit32u)Value);
1443 +      osfuncSioFlush();
1444 +     }
1445 +#endif
1446 +
1447 +   /* Verify proper device state */
1448 +   if (HalDev->State < enInitialized)
1449 +     return (EC_AAL5|EC_FUNC_CONTROL|EC_VAL_INVALID_STATE);   
1450 +
1451 +   if (HalDev->OsFunc->Strcmpi(Key, "Debug") == 0)
1452 +     {
1453 +      KeyFound=1;
1454 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
1455 +        {
1456 +         ActionFound=1;
1457 +         HalDev->debug = *(int *)Value;
1458 +         /* also setup debug variable in CPSAR module */
1459 +         rc = HalDev->SarFunc->Control(HalDev->SarDev, "Debug", "Set", Value);
1460 +        }
1461 +     }
1462 +
1463 +   if (HalDev->OsFunc->Strstr(Key, "FwdUnkVc.") != 0)
1464 +     {
1465 +      KeyFound=1;
1466 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
1467 +        {
1468 +         ActionFound=1;
1469 +  
1470 +         /* extract channel number */
1471 +         TmpKey += HalDev->OsFunc->Strlen("FwdUnkVc.");
1472 +         Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
1473 +
1474 +         HalDev->ChData[Ch].FwdUnkVc = *(int *)Value;
1475 +
1476 +         if ((HalDev->State == enOpened) && (HalDev->ChData[Ch].PktType == 3))
1477 +           rc = HalDev->SarFunc->Control(HalDev->SarDev, Key, Action, Value);         
1478 +        }
1479 +     }
1480 +
1481 +   /* +GSG 030407 */
1482 +   if (HalDev->OsFunc->Strcmpi(Key, "OamMode") == 0)
1483 +     {
1484 +      KeyFound=1;
1485 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
1486 +        {
1487 +         ActionFound=1;
1488 +         rc = HalDev->SarFunc->Control(HalDev->SarDev, Key, Action, Value);         
1489 +        }
1490 +
1491 +      if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
1492 +        {
1493 +         ActionFound=1;
1494 +         rc = HalDev->SarFunc->Control(HalDev->SarDev, Key, Action, Value);
1495 +        }
1496 +     }
1497 +
1498 +   /* +GSG 030307 */
1499 +   if (HalDev->OsFunc->Strcmpi(Key, "Version") == 0)
1500 +     {
1501 +      KeyFound=1;
1502 +      if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
1503 +        {
1504 +         ActionFound=1;
1505 +         *(const char **)Value = pszVersion_CPAAL5;
1506 +        }
1507 +     }
1508 +
1509 +   /* +GSG 030529 */
1510 +   if (HalDev->OsFunc->Strcmpi(Key, "TurboDslErrors") == 0)
1511 +     {
1512 +      KeyFound=1;
1513 +      if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
1514 +        {
1515 +         ActionFound=1;
1516 +         *(int *)Value = HalDev->TurboDslErrors;
1517 +        }
1518 +     }
1519 +   
1520 +   /* +GSG 030416 */
1521 +   if (HalDev->OsFunc->Strcmpi(Key, "F4_LB_Counter") == 0)
1522 +     {
1523 +      KeyFound=1;
1524 +      if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
1525 +        {
1526 +         ActionFound=1;
1527 +         *(int *)Value = SAR_PDSP_OAM_F4_LB_COUNT_REG(HalDev->dev_base);
1528 +        }
1529 +     }
1530 +
1531 +   /* +GSG 030416 */
1532 +   if (HalDev->OsFunc->Strcmpi(Key, "F5_LB_Counter") == 0)
1533 +     {
1534 +      KeyFound=1;
1535 +      if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
1536 +        {
1537 +         ActionFound=1;
1538 +         *(int *)Value = SAR_PDSP_OAM_F5_LB_COUNT_REG(HalDev->dev_base);
1539 +        }
1540 +     }
1541 +   
1542 +   if (HalDev->OsFunc->Strstr(Key, "Stats;") != 0)
1543 +     {
1544 +      KeyFound=1;
1545 +      if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
1546 +        {
1547 +         ActionFound=1;
1548 +         TmpKey += HalDev->OsFunc->Strlen("Stats;");
1549 +         Level = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
1550 +         TmpKey++;
1551 +         Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
1552 +         TmpKey++;
1553 +         Queue = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
1554 +         TmpKey++;
1555 +         StatsGet(HalDev, (void **)Value, Level, Ch, Queue);
1556 +        }
1557 +     }
1558 +
1559 +   /* +GSG 030306 */
1560 +   /* Fixes PITS #100 */
1561 +   if (HalDev->OsFunc->Strstr(Key, "Gfc.") != 0)
1562 +     {
1563 +      KeyFound=1;
1564 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
1565 +        {
1566 +         ActionFound=1;
1567 +         /* extract channel number */
1568 +         TmpKey += HalDev->OsFunc->Strlen("Gfc.");
1569 +         Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
1570 +
1571 +         /* first, store new value in our channel structure */
1572 +         HalDev->ChData[Ch].Gfc = *(int *)Value;
1573 +        }
1574 +     }
1575 +
1576 +   /* +GSG 030306 */
1577 +   /* Fixes PITS #100 */
1578 +   if (HalDev->OsFunc->Strstr(Key, "Clp.") != 0)
1579 +     {
1580 +      KeyFound=1;
1581 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
1582 +        {
1583 +         ActionFound=1;
1584 +         /* extract channel number */
1585 +         TmpKey += HalDev->OsFunc->Strlen("Clp.");
1586 +         Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
1587 +
1588 +         /* first, store new value in our channel structure */
1589 +         HalDev->ChData[Ch].Clp = *(int *)Value;
1590 +        }
1591 +     }
1592 +
1593 +   /* +GSG 030306 */
1594 +   /* Fixes PITS #100 */
1595 +   if (HalDev->OsFunc->Strstr(Key, "Pti.") != 0)
1596 +     {
1597 +      KeyFound=1;
1598 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
1599 +        {
1600 +         ActionFound=1;
1601 +         /* extract channel number */
1602 +         TmpKey += HalDev->OsFunc->Strlen("Pti.");
1603 +         Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
1604 +
1605 +         /* first, store new value in our channel structure */
1606 +         HalDev->ChData[Ch].Pti = *(int *)Value;
1607 +        }
1608 +     }
1609 +
1610 +   /* +GSG 030306 */
1611 +   /* Fixes PITS #100 */
1612 +   if (HalDev->OsFunc->Strstr(Key, "CpcsUU.") != 0)
1613 +     {
1614 +      KeyFound=1;
1615 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
1616 +        {
1617 +         ActionFound=1;
1618 +         /* extract channel number */
1619 +         TmpKey += HalDev->OsFunc->Strlen("CpcsUU.");
1620 +         Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
1621 +
1622 +         /* first, store new value in our channel structure */
1623 +         HalDev->ChData[Ch].CpcsUU = *(int *)Value;
1624 +        }
1625 +     }
1626 +
1627 +   /* +GSG 030306 */
1628 +   /* Fixes PITS #100 */
1629 +   if (HalDev->OsFunc->Strstr(Key, "TxVc_CellRate.") != 0)
1630 +     {
1631 +      KeyFound=1;
1632 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
1633 +        {
1634 +         ActionFound=1;
1635 +         /* extract channel number */
1636 +         TmpKey += HalDev->OsFunc->Strlen("TxVc_CellRate.");
1637 +         Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
1638 +
1639 +         /* first, store new value in our channel structure */
1640 +         HalDev->ChData[Ch].TxVc_CellRate = *(int *)Value;
1641 +
1642 +         /* now, apply to PDSP state RAM */
1643 +         if (HalDev->State == enOpened)
1644 +           *(pPDSP_AAL5_TX_STATE_WORD_0(HalDev->dev_base)+(Ch*64))= HalDev->ChData[Ch].TxVc_CellRate;
1645 +        }
1646 +     }
1647 +
1648 +   /* +GSG 030306 */
1649 +   /* Fixes PITS #100 */
1650 +   if (HalDev->OsFunc->Strstr(Key, "TxVc_Mbs.") != 0)
1651 +     {
1652 +      KeyFound=1;
1653 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
1654 +        {
1655 +         ActionFound=1;
1656 +         /* extract channel number */
1657 +         TmpKey += HalDev->OsFunc->Strlen("TxVc_Mbs.");
1658 +         Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
1659 +
1660 +         /* first, store new value in our channel structure */
1661 +         HalDev->ChData[Ch].TxVc_Mbs = *(int *)Value;
1662 +
1663 +         /* now, apply to PDSP state RAM */
1664 +         if (HalDev->State == enOpened)
1665 +           *(pPDSP_AAL5_TX_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+2)= HalDev->ChData[Ch].TxVc_Mbs;
1666 +        }
1667 +     }
1668 +
1669 +   if (HalDev->OsFunc->Strstr(Key, "TxVc_AtmHeader.") != 0)
1670 +     {
1671 +      KeyFound=1;
1672 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
1673 +        {
1674 +         ActionFound=1;
1675 +         /* extract channel number */
1676 +         TmpKey += HalDev->OsFunc->Strlen("TxVc_AtmHeader.");
1677 +         Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
1678 +
1679 +         /* first, store new value in our channel structure */
1680 +         HalDev->ChData[Ch].TxVc_AtmHeader = *(int *)Value;
1681 +
1682 +         /* now, apply to PDSP state RAM */
1683 +         if (HalDev->State == enOpened)
1684 +           *(pPDSP_AAL5_TX_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+6)= HalDev->ChData[Ch].TxVc_AtmHeader;
1685 +        }
1686 +     }
1687 +
1688 +   if (HalDev->OsFunc->Strstr(Key, "TxVp_AtmHeader.") != 0)
1689 +     {
1690 +      KeyFound=1;
1691 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
1692 +        {
1693 +         ActionFound=1;
1694 +         /* extract channel number */
1695 +         TmpKey += HalDev->OsFunc->Strlen("TxVp_AtmHeader.");
1696 +         Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
1697 +
1698 +         /* first, store new value in our channel structure */
1699 +         HalDev->ChData[Ch].TxVp_AtmHeader = *(int *)Value;
1700 +
1701 +         /* now, apply to PDSP state RAM */
1702 +         if (HalDev->State == enOpened)
1703 +           *(pPDSP_AAL5_TX_VP_STATE_WORD_0(HalDev->dev_base)+(Ch*64))= HalDev->ChData[Ch].TxVp_AtmHeader;
1704 +        }
1705 +     }
1706 +
1707 +   /* +GSG 030306 */
1708 +   /* Fixes PITS #100 */
1709 +   if (HalDev->OsFunc->Strstr(Key, "TxVc_Pcr.") != 0)
1710 +     {
1711 +      KeyFound=1;
1712 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
1713 +        {
1714 +         ActionFound=1;
1715 +         /* extract channel number */
1716 +         TmpKey += HalDev->OsFunc->Strlen("TxVc_Pcr.");
1717 +         Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
1718 +
1719 +         /* first, store new value in our channel structure */
1720 +         HalDev->ChData[Ch].TxVc_Pcr = *(int *)Value;
1721 +
1722 +         /* now, apply to PDSP state RAM */
1723 +         if (HalDev->State == enOpened)
1724 +           *(pPDSP_AAL5_TX_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+4)= HalDev->ChData[Ch].TxVc_Pcr;
1725 +        }
1726 +     }
1727 +
1728 +   /* +GSG 030428 */
1729 +   if (HalDev->OsFunc->Strstr(Key, "RxVc_OamCh.") != 0)
1730 +     {
1731 +      KeyFound=1;
1732 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
1733 +        {
1734 +         ActionFound=1;
1735 +         /* extract channel number */
1736 +         TmpKey += HalDev->OsFunc->Strlen("RxVc_OamCh.");
1737 +         Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
1738 +
1739 +         /* first, store new value in our channel structure */
1740 +         HalDev->ChData[Ch].RxVc_OamCh = (*(int *)Value) & 0xff;
1741 +
1742 +         /* now, apply to PDSP state RAM */
1743 +         if (HalDev->State == enOpened)
1744 +           *(pPDSP_AAL5_RX_STATE_WORD_0(HalDev->dev_base)+(Ch*64)) |= HalDev->ChData[Ch].RxVc_OamCh;
1745 +        }
1746 +     }
1747 +
1748 +   /* +GSG 030428 */
1749 +   if (HalDev->OsFunc->Strstr(Key, "RxVp_OamCh.") != 0)
1750 +     {
1751 +      KeyFound=1;
1752 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
1753 +        {
1754 +         ActionFound=1;
1755 +         /* extract channel number */
1756 +         TmpKey += HalDev->OsFunc->Strlen("RxVp_OamCh.");
1757 +         Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
1758 +
1759 +         /* first, store new value in our channel structure */
1760 +         HalDev->ChData[Ch].RxVp_OamCh = (*(int *)Value) & 0xff;
1761 +
1762 +         /* now, apply to PDSP state RAM */
1763 +         if (HalDev->State == enOpened)
1764 +           *(pPDSP_AAL5_RX_VP_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+1) |= HalDev->ChData[Ch].RxVp_OamCh;
1765 +        }
1766 +     }
1767 +
1768 +   /* +GSG 030304 */
1769 +   /* Fixes PITS #98 */
1770 +   if (HalDev->OsFunc->Strstr(Key, "PdspEnable") != 0)
1771 +     {
1772 +      KeyFound=1;
1773 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
1774 +        {
1775 +         ActionFound=1;
1776 +         
1777 +         /* this variable is controlled by the CPSAR module */
1778 +         if (HalDev->State == enOpened)
1779 +           {
1780 +            rc=HalDev->SarFunc->Control(HalDev->SarDev, "PdspEnable", "Set", Value);
1781 +           }
1782 +        }
1783 +     }
1784 +
1785 +   if (HalDev->OsFunc->Strstr(Key, "OamLbTimeout") != 0)
1786 +     {
1787 +      KeyFound=1;
1788 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
1789 +        {
1790 +         ActionFound=1;
1791 +         
1792 +         HalDev->OamLbTimeout = *(int *)Value;
1793 +         /* this variable is controlled by the CPSAR module */
1794 +         if (HalDev->State == enOpened)
1795 +           {
1796 +            *(pOAM_TIMER_STATE_WORD_0(HalDev->dev_base) + 1) = 
1797 +              ((HalDev->SarFrequency/1000) * HalDev->OamLbTimeout);
1798 +           }
1799 +        }
1800 +     }
1801 +
1802 +   /* +GSG 030306 (PITS #114) */
1803 +   if (HalDev->OsFunc->Strstr(Key, "DeviceCPID") != 0)
1804 +     {
1805 +      KeyFound=1;
1806 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
1807 +        {
1808 +         unsigned int* local = (unsigned int *)Value;
1809 +         ActionFound=1;
1810 +         /* first, store new value in our hal structure */
1811 +         HalDev->DeviceCPID[0] = local[0];
1812 +         HalDev->DeviceCPID[1] = local[1];
1813 +         HalDev->DeviceCPID[2] = local[2];
1814 +         HalDev->DeviceCPID[3] = local[3];
1815 +
1816 +         /* now, apply to PDSP state RAM */
1817 +         if (HalDev->State == enOpened)
1818 +           {
1819 +            *(bit32u *)(pOAM_CONFIG_BLOCK_WORD_0(HalDev->dev_base) + 0) = HalDev->DeviceCPID[0];
1820 +            *(bit32u *)(pOAM_CONFIG_BLOCK_WORD_0(HalDev->dev_base) + 1) = HalDev->DeviceCPID[1];
1821 +            *(bit32u *)(pOAM_CONFIG_BLOCK_WORD_0(HalDev->dev_base) + 2) = HalDev->DeviceCPID[2];
1822 +            *(bit32u *)(pOAM_CONFIG_BLOCK_WORD_0(HalDev->dev_base) + 3) = HalDev->DeviceCPID[3];
1823 +           }
1824 +        }
1825 +     }
1826 +
1827 +   /* +GSG 030304 */
1828 +   /* Fixes PITS #99 */
1829 +   if (HalDev->OsFunc->Strstr(Key, "StrictPriority") != 0)
1830 +     {
1831 +      KeyFound=1;
1832 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
1833 +        {
1834 +         ActionFound=1;
1835 +        
1836 +         /* used in halOpen to decide which interrupt handler to use */
1837 +         HalDev->StrictPriority = *(int *)Value;
1838 +        }
1839 +     }
1840 +
1841 +   if (HalDev->OsFunc->Strstr(Key, hcMaxFrags) != 0)
1842 +     {
1843 +      KeyFound=1;
1844 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
1845 +        {
1846 +         ActionFound=1;
1847 +        
1848 +         if ((*(int *)Value) > 0)
1849 +           HalDev->MaxFrags = *(int *)Value;
1850 +          else
1851 +           rc = (EC_AAL5|EC_FUNC_CONTROL|EC_VAL_INVALID_VALUE);
1852 +        }
1853 +
1854 +      if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
1855 +        {
1856 +         ActionFound=1;
1857 +
1858 +         *(int *)Value = HalDev->MaxFrags;
1859 +        }
1860 +     }
1861 +
1862 +   /* +GSG 030306 */
1863 +   /* Fixes PITS #103 */
1864 +   if (HalDev->OsFunc->Strstr(Key, "RxVc_RDICount.") != 0)
1865 +     {
1866 +      KeyFound=1;
1867 +      if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
1868 +        {
1869 +         ActionFound=1;
1870 +        
1871 +         /* extract channel number */
1872 +         TmpKey += HalDev->OsFunc->Strlen("RxVc_RDICount.");
1873 +         Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
1874 +
1875 +         /* PDSP's Rx VC State word 3 contains the value */
1876 +         if (HalDev->State == enOpened)
1877 +           {
1878 +            *(int *)Value = (((*(pPDSP_AAL5_RX_STATE_WORD_0(HalDev->dev_base)+(Ch*64))) & RDI_CNT_MASK)>>RDI_CNT_SHIFT);
1879 +           }
1880 +        }
1881 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
1882 +        {
1883 +         ActionFound=1;
1884 +        
1885 +         /* extract channel number */
1886 +         TmpKey += HalDev->OsFunc->Strlen("RxVc_RDICount.");
1887 +         Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
1888 +
1889 +         /* All sets write 0, this action is a clear only */
1890 +         if (HalDev->State == enOpened)
1891 +           {
1892 +            (*(pPDSP_AAL5_RX_STATE_WORD_0(HalDev->dev_base)+(Ch*64))) &=~ RDI_CNT_MASK;
1893 +           }
1894 +        }
1895 +     }
1896 +
1897 +   /* +GSG 030306 */
1898 +   /* Fixes PITS #103 */
1899 +   if (HalDev->OsFunc->Strstr(Key, "RxVc_AISseg.") != 0)
1900 +     {
1901 +      KeyFound=1;
1902 +      if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
1903 +        {
1904 +         ActionFound=1;
1905 +        
1906 +         /* extract channel number */
1907 +         TmpKey += HalDev->OsFunc->Strlen("RxVc_AISseg.");
1908 +         Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
1909 +
1910 +         /* PDSP's Rx VC State word 3 contains the value */
1911 +         if (HalDev->State == enOpened)
1912 +           {
1913 +            *(int *)Value = (((*(pPDSP_AAL5_RX_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+3)) & AIS_SEG_MASK)>>AIS_SEG_SHIFT);
1914 +           }
1915 +        }
1916 +     }
1917 +
1918 +   /* +GSG 030306 */
1919 +   /* Fixes PITS #103 */
1920 +   if (HalDev->OsFunc->Strstr(Key, "RxVc_AISetoe.") != 0)
1921 +     {
1922 +      KeyFound=1;
1923 +      if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
1924 +        {
1925 +         ActionFound=1;
1926 +        
1927 +         /* extract channel number */
1928 +         TmpKey += HalDev->OsFunc->Strlen("RxVc_AISetoe.");
1929 +         Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
1930 +
1931 +         /* PDSP's Rx VC State word 3 contains the value */
1932 +         if (HalDev->State == enOpened)
1933 +           {
1934 +            *(int *)Value = (((*(pPDSP_AAL5_RX_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+3)) & AIS_ETOE_MASK)>>AIS_ETOE_SHIFT);
1935 +           }
1936 +        }
1937 +     }
1938 +
1939 +   /* +GSG 030306 */
1940 +   /* Fixes PITS #103 */
1941 +   if (HalDev->OsFunc->Strstr(Key, "RxVp_RDICount.") != 0)
1942 +     {
1943 +      KeyFound=1;
1944 +      if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
1945 +        {
1946 +         ActionFound=1;
1947 +        
1948 +         /* extract channel number */
1949 +         TmpKey += HalDev->OsFunc->Strlen("RxVp_RDICount.");
1950 +         Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
1951 +
1952 +         /* PDSP's Rx VC State word 3 contains the value */
1953 +         if (HalDev->State == enOpened)
1954 +           {
1955 +            *(int *)Value = (((*(pPDSP_AAL5_RX_VP_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+1)) & RDI_CNT_MASK)>>RDI_CNT_SHIFT);
1956 +           }
1957 +        }
1958 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
1959 +        {
1960 +         ActionFound=1;
1961 +        
1962 +         /* extract channel number */
1963 +         TmpKey += HalDev->OsFunc->Strlen("RxVp_RDICount.");
1964 +         Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
1965 +
1966 +         /* All sets write 0, this action is a clear only */
1967 +         if (HalDev->State == enOpened)
1968 +           {
1969 +            (*(pPDSP_AAL5_RX_VP_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+1)) &=~ RDI_CNT_MASK;
1970 +           }
1971 +        }
1972 +     }
1973 +
1974 +   /* +GSG 030306 */
1975 +   /* Fixes PITS #103 */
1976 +   if (HalDev->OsFunc->Strstr(Key, "RxVp_AISseg.") != 0)
1977 +     {
1978 +      KeyFound=1;
1979 +      if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
1980 +        {
1981 +         ActionFound=1;
1982 +        
1983 +         /* extract channel number */
1984 +         TmpKey += HalDev->OsFunc->Strlen("RxVp_AISseg.");
1985 +         Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
1986 +
1987 +         /* PDSP's Rx VC State word 3 contains the value */
1988 +         if (HalDev->State == enOpened)
1989 +           {
1990 +            *(int *)Value = (((*(pPDSP_AAL5_RX_VP_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+2)) & AIS_SEG_MASK)>>AIS_SEG_SHIFT);
1991 +           }
1992 +        }
1993 +     }
1994 +
1995 +   /* +GSG 030306 */
1996 +   /* Fixes PITS #103 */
1997 +   if (HalDev->OsFunc->Strstr(Key, "RxVp_AISetoe.") != 0)
1998 +     {
1999 +      KeyFound=1;
2000 +      if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
2001 +        {
2002 +         ActionFound=1;
2003 +        
2004 +         /* extract channel number */
2005 +         TmpKey += HalDev->OsFunc->Strlen("RxVp_AISetoe.");
2006 +         Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
2007 +
2008 +         /* PDSP's Rx VC State word 3 contains the value */
2009 +         if (HalDev->State == enOpened)
2010 +           {
2011 +            *(int *)Value = (((*(pPDSP_AAL5_RX_VP_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+2)) & AIS_ETOE_MASK)>>AIS_ETOE_SHIFT);
2012 +           }
2013 +        }
2014 +     }
2015 +
2016 +   if (KeyFound == 0)
2017 +     rc = (EC_AAL5|EC_FUNC_CONTROL|EC_VAL_KEY_NOT_FOUND);
2018 +
2019 +   if (ActionFound == 0)
2020 +     rc = (EC_AAL5|EC_FUNC_CONTROL|EC_VAL_ACTION_NOT_FOUND);
2021 +
2022 +   return(rc);    
2023 +  }
2024 +
2025 +/*
2026 + * Sets up HAL default configuration parameter values.
2027 + */
2028 +static void ConfigInit(HAL_DEVICE *HalDev)
2029 +  {
2030 +#ifdef __CPHAL_DEBUG
2031 +   if (DBG(0))
2032 +     {
2033 +      dbgPrintf("[aal5]ConfigInit(HalDev:%08x)\n", (bit32u)HalDev);
2034 +      osfuncSioFlush();
2035 +     }
2036 +#endif
2037 +
2038 +   /* configure some defaults with tnetx7300 values */
2039 +   HalDev->dev_base = 0xa3000000;
2040 +   HalDev->offset = 0;
2041 +   HalDev->interrupt = 15;
2042 +   HalDev->debug = 0;
2043 +   HalDev->MaxFrags = 46;
2044 +   HalDev->OamLbTimeout = 5000;
2045 +  }
2046 +
2047 +/*
2048 + * Retrieve HAL configuration parameter values.
2049 + */
2050 +static bit32u ConfigGet(HAL_DEVICE *HalDev)
2051 +  {
2052 +   bit32u Ret;
2053 +
2054 +#ifdef __CPHAL_DEBUG
2055 +   if (DBG(0))
2056 +     {
2057 +      dbgPrintf("[aal5]ConfigGet(HalDev:%08x)\n", (bit32u)HalDev);
2058 +      osfuncSioFlush();
2059 +     }
2060 +#endif
2061 +
2062 +   /* get the configuration parameters common to all modules */
2063 +   Ret = ConfigGetCommon(HalDev);
2064 +   if (Ret) return (EC_AAL5|Ret);
2065 +
2066 +   /* get AAL5 specific configuration parameters here */
2067 +   Ret = HalDev->OsFunc->Control(HalDev->OsDev, hcSarFrequency, pszGET, &HalDev->SarFrequency); /* GSG +030416*/
2068 +   if (Ret)                                                                                /* GSG +030416*/
2069 +     HalDev->SarFrequency = 200000000;  /* 200 Mhz default */                              /* GSG +030416*/
2070 +
2071 +   return (EC_NO_ERRORS);
2072 +  }
2073 +
2074 +/** 
2075 + *  @ingroup CPHAL_Functions
2076 + *  This function initializes the CPHAL module. It gathers all
2077 + *  necessary global configuration info from the configuration file, and
2078 + *  performs initialization and configuration of the device.  Note that
2079 + *  the device operation is not started until the OS calls @c Open().
2080 + *
2081 + *  @param   HalDev   CPHAL module instance. (set by xxxInitModule())
2082 + *
2083 + *  @return  EC_NO_ERRORS (ok). <BR>
2084 + *           Possible Error Codes:<BR>
2085 + *           @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
2086 + *           @ref EC_VAL_BASE_ADDR_NOT_FOUND "EC_VAL_BASE_ADDR_NOT_FOUND"<BR>
2087 + *           @ref EC_VAL_RESET_BIT_NOT_FOUND "EC_VAL_RESET_BIT_NOT_FOUND"<BR>
2088 + *           @ref EC_VAL_INTERRUPT_NOT_FOUND "EC_VAL_INTERRUPT_NOT_FOUND"<BR>
2089 + *           @ref EC_VAL_OFFSET_NOT_FOUND "EC_VAL_OFFSET_NOT_FOUND"<BR>
2090 + */
2091 +static int halInit(HAL_DEVICE *HalDev)
2092 +  {
2093 +  int i;
2094 +  bit32u error_code;
2095 +
2096 +#ifdef __CPHAL_DEBUG
2097 +  if (DBG(0))
2098 +    {
2099 +     dbgPrintf("[aal5]halInit(HalDev:%08x)\n", (bit32u)HalDev);
2100 +     osfuncSioFlush();
2101 +    }
2102 +#endif
2103 +
2104 +  /* Verify proper device state */
2105 +  if (HalDev->State != enDevFound)
2106 +    return(EC_AAL5|EC_FUNC_HAL_INIT|EC_VAL_INVALID_STATE);
2107 +
2108 +  /* Configure HAL defaults */
2109 +  ConfigInit(HalDev);
2110 +
2111 +  /* Retrieve HAL configuration parameters from data store */
2112 +  error_code = ConfigGet(HalDev);
2113 +  if (error_code) return (error_code);
2114
2115 +  /* Other items (OAM related) that need to be passed in somehow */
2116 +  HalDev->DeviceCPID[0] = 0xffffffff;
2117 +  HalDev->DeviceCPID[1] = 0xffffffff;
2118 +  HalDev->DeviceCPID[2] = 0xffffffff;
2119 +  HalDev->DeviceCPID[3] = 0xffffffff;
2120 +  HalDev->LBSourceLLID[0] = 0xffffffff;
2121 +  HalDev->LBSourceLLID[1] = 0xffffffff;
2122 +  HalDev->LBSourceLLID[2] = 0xffffffff;
2123 +  HalDev->LBSourceLLID[3] = 0xffffffff;
2124 +
2125 +  /* Initialize SAR layer*/
2126 +  error_code = HalDev->SarFunc->Init(HalDev->SarDev);
2127 +  if (error_code) return (error_code);
2128 +
2129 +  /* Initialize various HalDev members.  This is probably overkill, since these
2130 +     are initialized in ChannelSetup() and HalDev is cleared in InitModule(). */
2131 +  for (i=0; i<NUM_AAL5_CHAN; i++)
2132 +    { 
2133 +     HalDev->InRxInt[i]=FALSE;
2134 +     HalDev->ChIsOpen[i][DIRECTION_TX] = FALSE;
2135 +     HalDev->ChIsOpen[i][DIRECTION_RX] = FALSE;
2136 +     HalDev->TcbStart[i][0] = 0;
2137 +     HalDev->TcbStart[i][1] = 0;
2138 +     HalDev->RcbStart[i]  = 0;
2139 +    }
2140 +
2141 +  /* initialize SAR stats */
2142 +  StatsClear(HalDev);
2143 +
2144 +  /* init Stat pointers */
2145
2146 +  /* even though these statistics may be for multiple channels/queues, i need 
2147 +     only configure the pointer to the beginning of the array, and I can index 
2148 +     from there if necessary */
2149 +  StatsTable0[0].StatPtr  = &HalDev->Stats.CrcErrors[0];
2150 +  StatsTable0[1].StatPtr  = &HalDev->Stats.LenErrors[0];
2151 +  StatsTable0[2].StatPtr  = &HalDev->Stats.AbortErrors[0];
2152 +  StatsTable0[3].StatPtr  = &HalDev->Stats.StarvErrors[0];
2153 +
2154 +  StatsTable1[0].StatPtr  = &HalDev->Stats.DmaLenErrors[0];
2155 +  StatsTable1[1].StatPtr  = &HalDev->Stats.TxMisQCnt[0][0];
2156 +  StatsTable1[2].StatPtr  = &HalDev->Stats.RxMisQCnt[0];
2157 +  StatsTable1[3].StatPtr  = &HalDev->Stats.TxEOQCnt[0][0];
2158 +  StatsTable1[4].StatPtr  = &HalDev->Stats.RxEOQCnt[0];
2159 +  StatsTable1[5].StatPtr  = &HalDev->Stats.RxPacketsServiced[0];
2160 +  StatsTable1[6].StatPtr  = &HalDev->Stats.TxPacketsServiced[0][0];
2161 +  StatsTable1[7].StatPtr  = &HalDev->Stats.RxMaxServiced;
2162 +  StatsTable1[8].StatPtr  = &HalDev->Stats.TxMaxServiced[0][0];
2163 +  StatsTable1[9].StatPtr  = &HalDev->Stats.RxTotal;
2164 +  StatsTable1[10].StatPtr = &HalDev->Stats.TxTotal;
2165 +
2166 +  StatsTable2[0].StatPtr  = (bit32u *)&HalDev->RcbPool[0];
2167 +  StatsTable2[1].StatPtr  = &HalDev->RxActQueueCount[0];
2168 +  StatsTable2[2].StatPtr  = (bit32u *)&HalDev->RxActQueueHead[0];
2169 +  StatsTable2[3].StatPtr  = (bit32u *)&HalDev->RxActQueueTail[0];
2170 +  StatsTable2[4].StatPtr  = &HalDev->RxActive[0];
2171 +  StatsTable2[5].StatPtr  = (bit32u *)&HalDev->RcbStart[0];
2172 +  StatsTable2[6].StatPtr  = &HalDev->RxTeardownPending[0];
2173 +  StatsTable2[7].StatPtr  = (bit32u *)&HalDev->TcbPool[0][0];
2174 +  StatsTable2[8].StatPtr  = &HalDev->TxActQueueCount[0][0];
2175 +  StatsTable2[9].StatPtr  = (bit32u *)&HalDev->TxActQueueHead[0][0];
2176 +  StatsTable2[10].StatPtr = (bit32u *)&HalDev->TxActQueueTail[0][0];
2177 +  StatsTable2[11].StatPtr = &HalDev->TxActive[0][0];
2178 +  StatsTable2[12].StatPtr = (bit32u *)&HalDev->TcbStart[0][0];
2179 +  StatsTable2[13].StatPtr = &HalDev->TxTeardownPending[0];
2180 +
2181 +  StatsTable4[0].StatPtr  = &HalDev->dev_base;
2182 +  StatsTable4[1].StatPtr  = &HalDev->offset;
2183 +  StatsTable4[2].StatPtr  = &HalDev->interrupt;
2184 +  StatsTable4[3].StatPtr  = &HalDev->debug;
2185 +  StatsTable4[4].StatPtr  = &HalDev->Inst;
2186
2187 +  StatsTable3[0].StatPtr  = &HalDev->ChData[0].RxBufSize;
2188 +  StatsTable3[1].StatPtr  = &HalDev->ChData[0].RxBufferOffset;
2189 +  StatsTable3[2].StatPtr  = &HalDev->ChData[0].RxNumBuffers;
2190 +  StatsTable3[3].StatPtr  = &HalDev->ChData[0].RxServiceMax;
2191 +  StatsTable3[4].StatPtr  = &HalDev->ChData[0].TxNumBuffers;
2192 +  StatsTable3[5].StatPtr  = &HalDev->ChData[0].TxNumQueues;
2193 +  StatsTable3[6].StatPtr  = &HalDev->ChData[0].TxServiceMax;
2194 +  StatsTable3[7].StatPtr  = &HalDev->ChData[0].CpcsUU;
2195 +  StatsTable3[8].StatPtr  = &HalDev->ChData[0].Gfc;
2196 +  StatsTable3[9].StatPtr  = &HalDev->ChData[0].Clp;
2197 +  StatsTable3[10].StatPtr = &HalDev->ChData[0].Pti;
2198 +  StatsTable3[11].StatPtr = &HalDev->ChData[0].DaMask;
2199 +  StatsTable3[12].StatPtr = &HalDev->ChData[0].Priority;
2200 +  StatsTable3[13].StatPtr = &HalDev->ChData[0].PktType;
2201 +  StatsTable3[14].StatPtr = &HalDev->ChData[0].Vci;
2202 +  StatsTable3[15].StatPtr = &HalDev->ChData[0].Vpi;
2203 +  StatsTable3[16].StatPtr = &HalDev->ChData[0].TxVc_CellRate;
2204 +  StatsTable3[17].StatPtr = &HalDev->ChData[0].TxVc_QosType;
2205 +  StatsTable3[18].StatPtr = &HalDev->ChData[0].TxVc_Mbs;
2206 +  StatsTable3[19].StatPtr = &HalDev->ChData[0].TxVc_Pcr;
2207 +
2208 +  /* update device state */
2209 +  HalDev->State = enInitialized;
2210 +
2211 +#ifdef __CPHAL_DEBUG
2212 +  if (DBG(9))
2213 +    dbgConfigDump(HalDev);
2214 +#endif
2215 +
2216 +  return(EC_NO_ERRORS);
2217 +  }
2218 +
2219 +/*
2220 + *  Use this function to actually send after queuing multiple packets using 
2221 + *  Send().  This is a debug only function that should be removed - it was 
2222 + *  necessary to properly implement my loopback tests. 
2223 + *
2224 + *  @param   HalDev      CPHAL module instance. (set by xxxInitModule()) 
2225 + *  @param   Queue       Queue number to kick. 
2226 + *
2227 + *  @return  0 OK, Non-Zero Not OK
2228 + */
2229 +static int halKick(HAL_DEVICE *HalDev, int Queue)
2230 +  {
2231 +   int Ch;
2232 +
2233 +#ifdef __CPHAL_DEBUG
2234 +   if (DBG(0))
2235 +     {
2236 +      dbgPrintf("[aal5]halKick(HalDev:%08x. Queue:%d)\n", (bit32u)HalDev, Queue);
2237 +      osfuncSioFlush();
2238 +     }
2239 +#endif
2240 +
2241 +   for (Ch = 0; Ch < 16; Ch ++)
2242 +     {
2243 +      if ((!HalDev->TxActive[Ch][Queue]) && (HalDev->TxActQueueHead[Ch][Queue] != 0))
2244 +        {
2245 +         *(pTX_DMA_STATE_WORD_0(HalDev->dev_base)+(Ch*64)+Queue)=
2246 +           VirtToPhys(HalDev->TxActQueueHead[Ch][Queue]);
2247 +         HalDev->TxActive[Ch][Queue]=TRUE;
2248 +        }
2249 +     } 
2250
2251 +   return (EC_NO_ERRORS);   
2252 +  }
2253 +
2254 +/*  +GSG 030305  For PITS #99
2255 + *  Alternate interrupt handler that uses the INT_VECTOR in order to 
2256 + *  provide strict priority handling among channels, beginning with Ch 0.
2257 + *
2258 + *  @param   HalDev   CPHAL module instance. (set by xxxInitModule())
2259 + *  @param   MoreWork (Output) When set to 1, indicates that there is more work to do.
2260 + *                    Caller should ensure that the value pointed at is set to 0
2261 + *                    prior to the call.
2262 + *  @return  0 OK, non-zero error.
2263 + */
2264 +static int DeviceIntAlt(HAL_DEVICE *HalDev, int *MoreWork)
2265 +  {
2266 +   int tmp, Ch, WorkFlag;
2267 +   bit32u rc;
2268 +
2269 +#ifdef __CPHAL_DEBUG
2270 +   if (DBG(0))
2271 +     {
2272 +      dbgPrintf("[aal5]DeviceIntAlt(HalDev:%08x, MoreWork:%08x)\n", (bit32u)HalDev, (bit32u)MoreWork);
2273 +      osfuncSioFlush();
2274 +     }
2275 +#endif
2276 +
2277 +   /* Verify proper device state - important because a call prior to Open would
2278 +      result in a lockup */
2279 +   if (HalDev->State != enOpened)
2280 +     return(EC_AAL5|EC_FUNC_DEVICE_INT_ALT|EC_VAL_INVALID_STATE);
2281 +
2282 +   if ((tmp=SAR_INTR_VECTOR(HalDev->dev_base))&INT_PENDING)
2283 +     {
2284 +       /*printf("\015 %d RxQ",HalDev->RxActQueueCount[0]);
2285 +         HalDev->OsFunc->Control(HalDev->OsDev, enSIO_FLUSH, enNULL, 0); */
2286 +
2287 +      if (tmp&TXH_PEND) 
2288 +        {
2289 +         /* decide which channel to service */
2290 +         Ch = (SAR_INTR_VECTOR(HalDev->dev_base) & TXH_PEND_INVEC);
2291 +
2292 +         rc = TxInt(HalDev,Ch,0,&WorkFlag);
2293 +         if (rc) return (rc);
2294 +
2295 +         if (WorkFlag == 1)
2296 +           *MoreWork = 1;
2297 +        }
2298 +
2299 +      if (tmp&TXL_PEND) 
2300 +        {
2301 +         /* decide which channel to service */
2302 +         Ch = ((SAR_INTR_VECTOR(HalDev->dev_base) & TXL_PEND_INVEC) >> 4);
2303 +
2304 +         rc = TxInt(HalDev,Ch,1,&WorkFlag);
2305 +         if (rc) return (rc);
2306 +
2307 +         if (WorkFlag == 1)
2308 +           *MoreWork = 1;
2309 +        }
2310 +
2311 +      if (tmp&RX_PEND)
2312 +        {
2313 +         /* decide which channel to service */
2314 +         Ch = ((SAR_INTR_VECTOR(HalDev->dev_base) & RX_PEND_INVEC) >> 8);
2315 +
2316 +         rc = RxInt(HalDev,Ch,&WorkFlag);
2317 +         if (rc) return (rc);
2318 +
2319 +         if (WorkFlag == 1)
2320 +           *MoreWork = 1;
2321 +        }
2322 +       
2323 +      if (tmp&STS_PEND)
2324 +        {
2325 +         /* GPR 2 code added for PITS 103 */
2326 +         /* determine interrupt source */
2327 +         Ch = ((SAR_INTR_VECTOR(HalDev->dev_base) & STS_PEND_INVEC) >> 12);
2328 +
2329 +         /* only if this is GPR 2 interrupt do we take action */
2330 +         if (Ch == 26)
2331 +           {
2332 +            /* pass loopback result back to OS */
2333 +            HalDev->OsFunc->Control(HalDev->OsDev, "OamLbResult", "Set",
2334 +              (bit32u *)pSAR_PDSP_OAM_LB_RESULT_REG(HalDev->dev_base)); 
2335 +           }
2336 +
2337 +         /* clear the interrupt */
2338 +         SAR_STATUS_CLR_REG(HalDev->dev_base) |= 0x04000000;
2339 +        }
2340 +
2341 +      if (tmp&AAL2_PEND)
2342 +        { 
2343 +          /* no action defined */
2344 +        }
2345 +    
2346 +      SAR_INTR_VECTOR(HalDev->dev_base) = 0;
2347 +     }
2348 +
2349 +   return (EC_NO_ERRORS);
2350 +  }
2351 +
2352 +/*
2353 + *  Called to service a module interrupt.  This function determines
2354 + *  what type of interrupt occurred and dispatches the correct handler.
2355 + *
2356 + *  @param   HalDev   CPHAL module instance. (set by xxxInitModule())
2357 + *  @param   MoreWork (Output) When set to 1, indicates that there is more work to do.
2358 + *                    Caller should ensure that the value pointed at is set to 0
2359 + *                    prior to the call.
2360 + *  @return  0 OK, non-zero error.
2361 + */
2362 +static int DeviceInt(HAL_DEVICE *HalDev, int *MoreWork)
2363 +  {
2364 +    /*static int NextRxCh=0;
2365 +      static int NextTxCh[2]={0,0};*/
2366 +
2367 +   int tmp, Ch, FirstCh, WorkFlag;
2368 +   int NextTxLCh, NextTxHCh, NextRxCh;
2369 +   bit32u rc;
2370 +
2371 +#ifdef __CPHAL_DEBUG
2372 +   if (DBG(0))
2373 +     {
2374 +      dbgPrintf("[aal5]DeviceInt(HalDev:%08x, MoreWork:%08x)\n", (bit32u)HalDev, (bit32u)MoreWork);
2375 +      osfuncSioFlush();
2376 +     }
2377 +#endif
2378 +
2379 +   /* Verify proper device state - important because a call prior to Open would
2380 +      result in a lockup */
2381 +   if (HalDev->State != enOpened)
2382 +     return(EC_AAL5|EC_FUNC_DEVICE_INT|EC_VAL_INVALID_STATE);
2383 +
2384 +   NextTxHCh = HalDev->NextTxCh[0];
2385 +   NextTxLCh = HalDev->NextTxCh[1];
2386 +   NextRxCh =  HalDev->NextRxCh;
2387 +
2388 +   /* service interrupts while there is more work to do */
2389 +   /*while (((tmp=SAR_INTR_VECTOR(HalDev->dev_base))&INT_PENDING) && (TotalPkts < 500))*/
2390 +   if ((tmp=SAR_INTR_VECTOR(HalDev->dev_base))&INT_PENDING)
2391 +     {
2392 +       /*printf("\015 %d RxQ",HalDev->RxActQueueCount[0]);
2393 +         HalDev->OsFunc->Control(HalDev->OsDev, enSIO_FLUSH, enNULL, 0); */
2394 +
2395 +      if (tmp&TXH_PEND) 
2396 +        {
2397 +         /* decide which channel to service */
2398 +         FirstCh = NextTxHCh;
2399 +         while (1)
2400 +           {
2401 +            Ch = NextTxHCh++;
2402 +            if (NextTxHCh == 16)
2403 +              NextTxHCh = 0;
2404 +            if (SAR_TX_MASKED_STATUS(HalDev->dev_base) & (1<<Ch))
2405 +              break;
2406 +            if (FirstCh == NextTxHCh)
2407 +              {
2408 +               /* we checked every channel and still haven't found anything to do */
2409 +               return (EC_AAL5|EC_FUNC_DEVICE_INT|EC_VAL_NO_TXH_WORK_TO_DO);
2410 +              }
2411 +           }
2412
2413 +         rc = TxInt(HalDev,Ch,0,&WorkFlag);
2414 +         if (rc) return (rc);
2415 +
2416 +         if (WorkFlag == 1)
2417 +           *MoreWork = 1;
2418 +        }
2419 +
2420 +      if (tmp&TXL_PEND)
2421 +        {
2422 +         /* decide which channel to service */
2423 +         FirstCh = NextTxLCh;
2424 +         while (1)
2425 +           {
2426 +            Ch = NextTxLCh++;
2427 +            if (NextTxLCh == 16)
2428 +              NextTxLCh = 0;
2429 +            if (SAR_TX_MASKED_STATUS(HalDev->dev_base) & (1<<(Ch+16)))
2430 +              break;
2431 +            if (FirstCh == NextTxLCh)
2432 +              {
2433 +               /* we checked every channel and still haven't found anything to do */
2434 +               return (EC_AAL5|EC_FUNC_DEVICE_INT|EC_VAL_NO_TXL_WORK_TO_DO);
2435 +              }
2436 +           }
2437 +
2438 +         rc = TxInt(HalDev,Ch,1,&WorkFlag);
2439 +         if (rc) return (rc);
2440 +
2441 +         if (WorkFlag == 1)
2442 +           *MoreWork = 1;       
2443 +        }
2444 +         
2445 +      if (tmp&RX_PEND)
2446 +        {
2447 +         FirstCh = NextRxCh;
2448 +         while (1)
2449 +           {
2450 +            Ch = NextRxCh++;   
2451 +            if (NextRxCh == 16)
2452 +              NextRxCh = 0;
2453 +            if (SAR_RX_MASKED_STATUS(HalDev->dev_base) & (1 << Ch))
2454 +              break;  /* found a channel to service */
2455 +            if (FirstCh == NextRxCh)
2456 +              {
2457 +               /* we checked every channel and still haven't found anything to do */
2458 +               return (EC_AAL5|EC_FUNC_DEVICE_INT|EC_VAL_NO_RX_WORK_TO_DO);
2459 +              }
2460 +           }
2461 +
2462 +         rc = RxInt(HalDev,Ch, &WorkFlag);
2463 +         if (rc) return (rc);
2464 +
2465 +         if (WorkFlag == 1)
2466 +           *MoreWork = 1;
2467 +        }
2468 +       
2469 +      if (tmp&STS_PEND)
2470 +        {
2471 +         /* +GSG 030305 */
2472 +         /* GPR 2 code added for PITS 103 */
2473 +         /* determine interrupt source */
2474 +         Ch = ((SAR_INTR_VECTOR(HalDev->dev_base) & STS_PEND_INVEC) >> 12);
2475 +
2476 +         /* only if this is GPR 2 interrupt do we take action */
2477 +         if (Ch == 26)
2478 +           {
2479 +            /* pass loopback result back to OS */
2480 +            HalDev->OsFunc->Control(HalDev->OsDev, "OamLbResult", "Set",
2481 +              (bit32u *)pSAR_PDSP_OAM_LB_RESULT_REG(HalDev->dev_base)); 
2482 +           }
2483 +
2484 +         /* clear the interrupt */
2485 +         SAR_STATUS_CLR_REG(HalDev->dev_base) |= 0x04000000;
2486 +        }
2487 +
2488 +      if (tmp&AAL2_PEND)
2489 +        { 
2490 +          /* no action defined */
2491 +        }
2492 +    
2493 +      SAR_INTR_VECTOR(HalDev->dev_base) = 0;
2494 +     }
2495 +
2496 +   HalDev->NextTxCh[0] = NextTxHCh;
2497 +   HalDev->NextTxCh[1] = NextTxLCh;
2498 +   HalDev->NextRxCh = NextRxCh;
2499 +
2500 +   /* This must be done by the upper layer */
2501 +   /* SAR_EOI(HalDev->dev_base) = 0; */
2502 +
2503 +   return (EC_NO_ERRORS);
2504 +  }
2505 +
2506 +/** 
2507 + *  @ingroup CPHAL_Functions
2508 + *  This function starts the operation of the CPHAL device.  It takes the device
2509 + *  out of reset, and calls @c IsrRegister().  This function should be called after 
2510 + *  calling the @c Init() function.
2511 + *
2512 + *  @param  HalDev   CPHAL module instance. (set by xxxInitModule())
2513 + *
2514 + *  @return EC_NO_ERRORS (ok).<BR>
2515 + *           Possible Error Codes:<BR>
2516 + *           @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
2517 + *           @ref EC_VAL_KEY_NOT_FOUND "EC_VAL_KEY_NOT_FOUND"<BR>
2518 + *           @ref EC_VAL_FIRMWARE_TOO_LARGE "EC_VAL_FIRMWARE_TOO_LARGE"<BR>
2519 + *           @ref EC_VAL_PDSP_LOAD_FAIL "EC_VAL_PDSP_LOAD_FAIL"<BR>
2520 + *           @ref EC_VAL_RX_STATE_RAM_NOT_CLEARED "EC_VAL_RX_STATE_RAM_NOT_CLEARED"<BR>
2521 + *           @ref EC_VAL_TX_STATE_RAM_NOT_CLEARED "EC_VAL_TX_STATE_RAM_NOT_CLEARED"<BR>
2522 + *           @ref EC_VAL_TCB_MALLOC_FAILED "EC_VAL_TCB_MALLOC_FAILED"<BR>
2523 + *           @ref EC_VAL_RCB_MALLOC_FAILED "EC_VAL_RCB_MALLOC_FAILED"<BR>
2524 + *           @ref EC_VAL_RX_BUFFER_MALLOC_FAILED "EC_VAL_RX_BUFFER_MALLOC_FAILED"<BR>
2525 + *           @ref EC_VAL_LUT_NOT_READY "EC_VAL_LUT_NOT_READY"<BR>
2526 + */
2527 +static int halOpen(HAL_DEVICE *HalDev)
2528 +  {
2529 +   int i,Ret;
2530 +   bit32 SarBase = HalDev->dev_base;
2531 +
2532 +#ifdef __CPHAL_DEBUG
2533 +   if (DBG(0))
2534 +     {
2535 +      dbgPrintf("[aal5]halOpen(HalDev:%08x)\n", (bit32u)HalDev);
2536 +      osfuncSioFlush();
2537 +     }
2538 +#endif
2539 +
2540 +   /* Verify proper device state */
2541 +   if (HalDev->State < enInitialized)
2542 +     return (EC_AAL5|EC_FUNC_OPEN|EC_VAL_INVALID_STATE);
2543 +
2544 +   /* Open the SAR (this brings the whole device out of reset */
2545 +   Ret = HalDev->SarFunc->Open(HalDev->SarDev); /* ~GSG 030410 */
2546 +   if (Ret)                                     /* +GSG 030410 */
2547 +     return (Ret);                              /* +GSG 030410 */
2548 +
2549 +   /* Change device state */
2550 +   HalDev->State = enOpened;
2551 +
2552 +
2553 +#ifdef __CPHAL_DEBUG
2554 +   /* print out the version information */
2555 +   if (DBG(7))
2556 +     {
2557 +      dbgPrintf("[aal5 halOpen()]Module ID(AAL5-CPSAR):%d, Version:%2d.%02d\n",
2558 +                (SAR_ID_REG(SarBase)&0xffff0000)>>16,
2559 +                (SAR_ID_REG(SarBase)&0xff00)>>8,
2560 +                SAR_ID_REG(SarBase)&0xff);
2561 +      osfuncSioFlush();
2562 +     }
2563 +#endif
2564 +
2565 +   /* GREG 11/1/02:  The State RAM clearing code was previously in cpsar.c,
2566 +      directly after device reset.  I moved it here because I believe it is
2567 +      AAL5 specific code.  Also the MAX_CHAN was set to 19 in cpsar.c, which
2568 +      would have caused this code to clear too much memory! */
2569 +
2570 +   /* NOTE:  State RAM must be cleared prior to initializing the PDSP!! */
2571 +
2572 +   /* GSG 030416:  Removed all of this.  All PDSP State RAM is cleared
2573 +      in CPSAR Open().  On Close(), all channels are torndown, thus all
2574 +      AAL5 channel state RAM is cleared.  */
2575 +
2576 +   /* Clear Rx State RAM  */
2577 +   /*for (i=0; i<NUM_AAL5_CHAN; i++)
2578 +     for (j=0; j<NUM_RX_STATE_WORDS; j++)
2579 +     *(pRX_DMA_STATE_WORD_0(SarBase) + (i*64) + j) = 0; */
2580 +
2581 +   /* Check that Rx DMA State RAM was cleared */
2582 +   /*for (i=0; i<NUM_AAL5_CHAN; i++)
2583 +     for (j=0; j<NUM_RX_STATE_WORDS; j++)
2584 +       {
2585 +        if (*(pRX_DMA_STATE_WORD_0(SarBase) + (i*64) + j) != 0)
2586 +         {
2587 +          return(EC_AAL5|EC_FUNC_HAL_INIT|EC_VAL_RX_STATE_RAM_NOT_CLEARED);
2588 +         }
2589 +         }*/
2590 +
2591 +   /* Clear Tx State RAM  */
2592 +   /*for (i=0; i<NUM_AAL5_CHAN; i++)
2593 +     for (j=0; j<NUM_TX_STATE_WORDS; j++)
2594 +       {
2595 +        *(pTX_DMA_STATE_WORD_0(SarBase) + (i*64) + j) = 0; 
2596 +        }*/
2597 +
2598 +   /* Check that Tx DMA State RAM was cleared */
2599 +   /*for (i=0; i<NUM_AAL5_CHAN; i++)
2600 +     for (j=0; j<NUM_TX_STATE_WORDS; j++)
2601 +       {
2602 +        if (*(pTX_DMA_STATE_WORD_0(SarBase) + (i*64) + j) != 0)
2603 +          {
2604 +           return(EC_AAL5|EC_FUNC_HAL_INIT|EC_VAL_TX_STATE_RAM_NOT_CLEARED);
2605 +          }
2606 +          }*/
2607 +
2608 +   /* GSG +030523 Malloc space for the Rx fraglist */
2609 +   HalDev->fraglist = HalDev->OsFunc->Malloc(HalDev->MaxFrags * sizeof(FRAGLIST));
2610 +
2611 +   /* For any channels that have been pre-initialized, set them up now */
2612 +   for (i=0; i<NUM_AAL5_CHAN; i++)
2613 +     {
2614 +      if ((HalDev->ChIsSetup[i][0]==TRUE) && (HalDev->ChIsOpen[i][0]==FALSE))
2615 +        {
2616 +         CHANNEL_INFO HalChn;
2617 +         HalChn.Channel = i;
2618 +         Ret = ChannelConfigApply(HalDev, &HalChn);
2619 +         if (Ret) return (Ret);
2620 +        }
2621 +     }
2622 +
2623 +   /* OAM code would be a candidate to go into ConfigApply */
2624 +
2625 +   /* Configure OAM Timer State Block */
2626 +   OamRateConfig(HalDev); /* +GSG 030416 */
2627 +
2628 +   /* Setup OAM Configuration Block */
2629 +   for (i=0; i<8; i++) /* ~GSG 030603 4->8 */
2630 +     {
2631 +      if (i < 4)
2632 +        *(pOAM_CONFIG_BLOCK_WORD_0(SarBase) + i) = HalDev->DeviceCPID[i];
2633 +      else
2634 +        *(pOAM_CONFIG_BLOCK_WORD_0(SarBase) + i) = HalDev->LBSourceLLID[i-4];
2635 +     }
2636 +
2637 +   /* Setup OAM Padding Block */
2638 +   for (i=0; i<12; i++)
2639 +     {
2640 +      *(pOAM_PADDING_BLOCK_WORD_0(SarBase) + i) = ((i==11)?0x6a6a0000:0x6a6a6a6a);    
2641 +     }
2642 +
2643 +   /* Enable Tx CPPI DMA */
2644 +   TX_CPPI_CTL_REG(HalDev->dev_base) = 1;
2645 +   
2646 +   /* Enable Rx CPPI DMA */
2647 +   RX_CPPI_CTL_REG(HalDev->dev_base) = 1;
2648 +
2649 +   /* +GSG 030306 */
2650 +   /* Fix for PITS 103 */
2651 +   /* Enable Host Interrupt for GPR 2 (OAM LB result register) */
2652 +   SAR_HOST_INT_EN_SET_REG(HalDev->dev_base) |= 0x04000000;
2653 +   
2654 +   /* +GSG 030304 to fix PITS 99 (if block is new)*/
2655 +   if (HalDev->StrictPriority == 1)
2656 +     {
2657 +#ifdef __CPHAL_DEBUG
2658 +      if (DBG(1))
2659 +        {
2660 +         dbgPrintf("[aal5->os]IsrRegister(OsDev:%08x, halIsr:%08x, Interrupt:%d)\n",
2661 +                   (bit32u)HalDev->OsDev, (bit32u)DeviceIntAlt, HalDev->interrupt);
2662 +         osfuncSioFlush();
2663 +        }
2664 +#endif
2665 +
2666 +      /* "register" the interrupt handler */
2667 +      HalDev->OsFunc->IsrRegister(HalDev->OsDev, DeviceIntAlt, HalDev->interrupt);
2668 +     }
2669 +    else /* +GSG 030306 */
2670 +     { /* +GSG 030306 */
2671 +#ifdef __CPHAL_DEBUG
2672 +      if (DBG(1))
2673 +        {
2674 +         dbgPrintf("[aal5->os]IsrRegister(OsDev:%08x, halIsr:%08x, Interrupt:%d)\n",
2675 +                   (bit32u)HalDev->OsDev, (bit32u)DeviceInt, HalDev->interrupt);
2676 +         osfuncSioFlush();
2677 +        }
2678 +#endif
2679 +
2680 +      /* "register" the interrupt handler */
2681 +      HalDev->OsFunc->IsrRegister(HalDev->OsDev, DeviceInt, HalDev->interrupt);
2682 +     } /* +GSG 030306 */
2683 +
2684 +   return(EC_NO_ERRORS);
2685 +  }
2686 +
2687 +/**
2688 + *  @ingroup CPHAL_Functions
2689 + *  Called to retrigger the interrupt mechanism after packets have been
2690 + *  processed.  Call this function when the HalISR function indicates that
2691 + *  there is no more work to do.  Proper use of this function will guarantee 
2692 + *  that interrupts are never missed.  
2693 + *
2694 + *  @param  HalDev   CPHAL module instance. (set by xxxInitModule())  
2695 + *
2696 + *  @return EC_NO_ERRORS (ok). <BR>
2697 + */
2698 +static int halPacketProcessEnd(HAL_DEVICE *HalDev)
2699 +  {
2700 +#ifdef __CPHAL_DEBUG
2701 +   if (DBG(0))
2702 +     {
2703 +      dbgPrintf("[aal5]halPacketProcessEnd(HalDev:%08x)\n", (bit32u)HalDev);
2704 +      osfuncSioFlush();
2705 +     }
2706 +#endif
2707 +
2708 +   SAR_EOI(HalDev->dev_base) = 0;
2709 +   return (EC_NO_ERRORS);
2710 +  }
2711 +
2712 +/**
2713 + *  @ingroup CPHAL_Functions
2714 + *  This function probes for the instance of the CPHAL module.  It will call
2715 + *  the OS function @c DeviceFindInfo() to get the information required.
2716 + *  
2717 + *  @param   HalDev      CPHAL module instance. (set by xxxInitModule())
2718 + *
2719 + *  @return  EC_NO_ERRORS (ok). <BR>
2720 + *           Possible Error Codes:<BR>
2721 + *           @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
2722 + *           @ref EC_VAL_DEVICE_NOT_FOUND "EC_VAL_DEVICE_NOT_FOUND"<BR>
2723 + */
2724 +static int halProbe(HAL_DEVICE *HalDev)
2725 +  {
2726 +   int Ret;
2727 +
2728 +#ifdef __CPHAL_DEBUG
2729 +   if (DBG(0))
2730 +     {
2731 +      dbgPrintf("[aal5]halProbe(HalDev:%08x)\n", (bit32u)HalDev);
2732 +      osfuncSioFlush();
2733 +     }
2734 +#endif
2735 +
2736 +   /* Verify hardware state is "enConnected */
2737 +   if (HalDev->State != enConnected)
2738 +     return (EC_AAL5|EC_FUNC_PROBE|EC_VAL_INVALID_STATE);
2739 +
2740 +#ifdef __CPHAL_DEBUG
2741 +   if (DBG(1))
2742 +     {
2743 +      dbgPrintf("[aal5->os]DeviceFindInfo(Inst:%d, DeviceName:%s, DeviceInfo:%08x)\n",
2744 +                HalDev->Inst, "aal5", (bit32u)&HalDev->DeviceInfo);
2745 +      osfuncSioFlush();
2746 +     }
2747 +#endif
2748 +
2749 +   /* Attempt to find the device information */
2750 +   Ret = HalDev->OsFunc->DeviceFindInfo(HalDev->Inst, "aal5", &HalDev->DeviceInfo);
2751 +   if (Ret)
2752 +     return(EC_AAL5|EC_FUNC_PROBE|EC_VAL_DEVICE_NOT_FOUND);
2753 +
2754 +   /* Call Probe for supporting CPSAR layer */
2755 +   Ret = HalDev->SarFunc->Probe(HalDev->SarDev);
2756 +   if (Ret)
2757 +     return(Ret);
2758 +
2759 +   /* Set device state to DevFound */
2760 +   HalDev->State = enDevFound;
2761 +
2762 +   return(EC_NO_ERRORS);    
2763 +  }
2764 +
2765 +/** 
2766 + *  @ingroup CPHAL_Functions
2767 + *  This function shuts down the CPHAL module completely.  The caller must call
2768 + *  Close() to put the device in reset prior shutting down.  This call will free
2769 + *  the HalDev and the HAL function pointer structure, effectively ending
2770 + *  communications between the driver and the CPHAL.  Further use of the module
2771 + *  must be initiated by a call to xxxInitModule(), which starts the entire process
2772 + *  over again.
2773 + *
2774 + *  @param   HalDev   CPHAL module instance. (set by xxxInitModule())  
2775 + *
2776 + *  @return  EC_NO_ERRORS (ok). <BR>
2777 + *           Possible Error Codes:<BR>
2778 + *           Any error code from halClose().<BR>
2779 + */
2780 +static int halShutdown(HAL_DEVICE *HalDev)
2781 +  {
2782 +   int Ch, Queue;                                                  /*GSG+030514*/
2783 +
2784 +#ifdef __CPHAL_DEBUG
2785 +   if (DBG(0))
2786 +     {
2787 +      dbgPrintf("[aal5]halShutdown(HalDev:%08x)\n", (bit32u)HalDev);
2788 +      osfuncSioFlush();
2789 +     }
2790 +#endif
2791 +
2792 +   /* Verify proper device state */
2793 +   if (HalDev->State == enOpened)
2794 +     halClose(HalDev, 3);                                          /*GSG+030429*/
2795 +
2796 +   /* Buffer/descriptor resources may still need to be freed if a Close
2797 +      Mode 1 was performed prior to Shutdown - clean up here */    /*GSG+030514*/
2798 +   for (Ch=0; Ch<NUM_AAL5_CHAN; Ch++)                                
2799 +     {                                                             
2800 +      if (HalDev->RcbStart[Ch] != 0)                           
2801 +        FreeRx(HalDev,Ch);
2802 +
2803 +      for(Queue=0; Queue<MAX_QUEUE; Queue++)
2804 +        {
2805 +         if (HalDev->TcbStart[Ch][Queue] != 0)
2806 +           FreeTx(HalDev,Ch,Queue);
2807 +        }
2808 +     }
2809 +
2810 +   /* shutdown the CPSAR layer */
2811 +   HalDev->SarFunc->Shutdown(HalDev->SarDev);
2812 +
2813 +#ifdef __CPHAL_DEBUG
2814 +   if (DBG(6))
2815 +     {
2816 +      dbgPrintf("  [aal5 halShutdown()]Free AAL5 function pointers\n");
2817 +      osfuncSioFlush();
2818 +     }
2819 +   if (DBG(1)||DBG(3))
2820 +     {
2821 +      dbgPrintf("[aal5->os]Free(MemPtr:%08x)\n", (bit32u)HalDev->HalFuncPtr);
2822 +      osfuncSioFlush();
2823 +     }
2824 +#endif
2825 +   /* free the HalFunc */
2826 +   HalDev->OsFunc->Free(HalDev->HalFuncPtr);
2827 +
2828 +#ifdef __CPHAL_DEBUG
2829 +   if (DBG(6))
2830 +     {
2831 +      dbgPrintf("  [aal5 halShutdown]Free HalDev\n");
2832 +      osfuncSioFlush();
2833 +     }
2834 +   if (DBG(1)||DBG(3))
2835 +     {
2836 +      dbgPrintf("[aal5->os]Free(MemPtr:%08x)\n", (bit32u)HalDev);
2837 +      osfuncSioFlush();
2838 +     }
2839 +#endif
2840 +   /* free the HAL device */
2841 +   HalDev->OsFunc->FreeDev(HalDev);
2842 +
2843 +   return(EC_NO_ERRORS);
2844 +  }
2845 +
2846 +/**
2847 + *  @ingroup CPHAL_Functions
2848 + *  Used to perform regular checks on the device.  This function should be 
2849 + *  called at a regular interval specified by the @c Tick parameter. 
2850 + *  
2851 + *  @param   HalDev      CPHAL module instance. (set by xxxInitModule())
2852 + *
2853 + *  @return  EC_NO_ERRORS (ok).<BR>
2854 + *           Possible Error Codes:<BR>
2855 + *           @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
2856 + */
2857 +static int halTick(HAL_DEVICE *HalDev)
2858 +  {
2859 +#ifdef __CPHAL_DEBUG
2860 +   if (DBG(0))
2861 +     {
2862 +      dbgPrintf("[aal5]halTick(HalDev:%08x)\n", (bit32u)HalDev);
2863 +      osfuncSioFlush();
2864 +     }
2865 +#endif
2866 +
2867 +   if (HalDev->State != enOpened)
2868 +     return(EC_AAL5|EC_FUNC_TICK|EC_VAL_INVALID_STATE);
2869 +
2870 +   return(EC_NO_ERRORS);
2871 +  }
2872 +
2873 +/** 
2874 + *  @ingroup CPHAL_Functions
2875 + *
2876 + *  This function will:
2877 + *  -# allocate a HalDev that will be used by the OS for future communications with the device
2878 + *  -# save OsDev for use when calling OS functions
2879 + *  -# allocate and populate HalFunc with the addresses of CPHAL functions.
2880 + *  -# check OsFuncSize to see if it meets the minimum requirement.
2881 + *  -# return the size of the HAL_FUNCTIONS structure through the HalFuncSize pointer.  The OS
2882 + *     should check this value to ensure that the HAL meets its minimum requirement.
2883 + *
2884 + *  Version checking between the OS and the CPHAL is done using the OsFuncSize and 
2885 + *  HalFuncSize.  Future versions of the CPHAL may add new functions to either
2886 + *  HAL_FUNCTIONS or OS_FUNCTIONS, but will never remove functionality.  This enables
2887 + *  both the HAL and OS to check the size of the function structure to ensure that
2888 + *  the current OS and CPHAL are compatible.
2889 + *
2890 + *  Note:  This is the only function exported by a CPHAL module. 
2891 + *
2892 + *  Please refer to the section "@ref hal_init" for example code.
2893 + *
2894 + *  @param   HalDev  Pointer to pointer to CPHAL module information.  This will 
2895 + *                   be used by the OS when communicating to this module via 
2896 + *                   CPHAL. Allocated during the call.
2897 + *  @param   OsDev   Pointer to OS device information.  This will be saved by
2898 + *                   the CPHAL and returned to the OS when required.
2899 + *  @param   HalFunc Pointer to pointer to structure containing function pointers for all CPHAL 
2900 + *                   interfaces.  Allocated during the call.
2901 + *  @param   OsFunc  Pointer to structure containing function pointers for all OS
2902 + *                   provided interfaces.  Must be allocated by OS prior to call.
2903 + *  @param   OsFuncSize  Size of OS_FUNCTIONS structure.
2904 + *  @param   HalFuncSize    Pointer to the size of the HAL_FUNCTIONS structure.
2905 + *  @param   Inst    The instance number of the module to initialize. (start at
2906 + *                   0).
2907 + * 
2908 + *  @return  EC_NO_ERRORS (ok). <BR>
2909 + *           Possible Error Codes:<BR>
2910 + *           @ref EC_VAL_OS_VERSION_NOT_SUPPORTED "EC_VAL_OS_VERSION_NOT_SUPPORTED"<BR>
2911 + *           @ref EC_VAL_MALLOC_DEV_FAILED "EC_VAL_MALLOC_DEV_FAILED"<BR>
2912 + *           @ref EC_VAL_MALLOC_FAILED "EC_VAL_MALLOC_FAILED"<BR>
2913 + */
2914 +int xxxInitModule(HAL_DEVICE **HalDev, 
2915 +                 OS_DEVICE *OsDev, 
2916 +                 HAL_FUNCTIONS **HalFunc, 
2917 +                 OS_FUNCTIONS *OsFunc, 
2918 +                 int OsFuncSize,
2919 +                 int *HalFuncSize,
2920 +                 int Inst);
2921 +
2922 +int cpaal5InitModule(HAL_DEVICE **HalDev, 
2923 +                 OS_DEVICE *OsDev, 
2924 +                 HAL_FUNCTIONS **HalFunc, 
2925 +                 OS_FUNCTIONS *OsFunc, 
2926 +                 int OsFuncSize,
2927 +                 int *HalFuncSize,
2928 +                 int Inst)
2929 +  {
2930 +   int rc, SarFuncSize;
2931 +   HAL_DEVICE *HalPtr;
2932 +   HAL_FUNCTIONS *HalFuncPtr;
2933 +
2934 +   /* NEW CODE */
2935 +   if (OsFuncSize < sizeof(OS_FUNCTIONS))
2936 +     return (EC_AAL5|EC_FUNC_HAL_INIT|EC_VAL_OS_VERSION_NOT_SUPPORTED);
2937 +
2938 +   HalPtr = (HAL_DEVICE *) OsFunc->MallocDev(sizeof(HAL_DEVICE));
2939 +   if (!HalPtr)
2940 +     return (EC_AAL5|EC_FUNC_HAL_INIT|EC_VAL_MALLOC_DEV_FAILED);
2941 +
2942 +   HalFuncPtr = (HAL_FUNCTIONS *) OsFunc->Malloc(sizeof(HAL_FUNCTIONS));
2943 +   if (!HalFuncPtr)
2944 +     return (EC_AAL5|EC_FUNC_HAL_INIT|EC_VAL_MALLOC_FAILED);
2945 +
2946 +   /* Initialize the size of hal functions */
2947 +   *HalFuncSize = sizeof (HAL_FUNCTIONS);
2948 +
2949 +   /* clear the device structure */
2950 +   OsFunc->Memset(HalPtr, 0, sizeof(HAL_DEVICE));
2951 +
2952 +   /* clear the function pointers */
2953 +   OsFunc->Memset(HalFuncPtr, 0, sizeof(HAL_FUNCTIONS));
2954 +
2955 +   /* initialize the HAL_DEVICE structure */
2956 +   HalPtr->OsDev  = OsDev;
2957 +   /*HalPtr->OsOpen = OsDev;*/
2958 +   HalPtr->Inst   = Inst; 
2959 +   HalPtr->OsFunc = OsFunc;
2960 +  
2961 +   /* Supply pointers for the CPHAL API functions */
2962 +   HalFuncPtr->RxReturn        = halRxReturn;
2963 +   HalFuncPtr->Init            = halInit;
2964 +   HalFuncPtr->Close           = halClose;
2965 +   HalFuncPtr->Send            = halSend;
2966 +   HalFuncPtr->ChannelSetup    = halChannelSetup;
2967 +   HalFuncPtr->ChannelTeardown = halChannelTeardown;
2968 +   HalFuncPtr->Open            = halOpen;
2969 +   HalFuncPtr->Kick            = halKick;
2970 +   HalFuncPtr->RegAccess       = halRegAccess; 
2971 +   HalFuncPtr->Probe           = halProbe;
2972 +   HalFuncPtr->Control         = halControl;
2973 +   HalFuncPtr->Tick            = halTick;
2974 +   HalFuncPtr->Shutdown        = halShutdown;
2975 +   HalFuncPtr->OamFuncConfig   = halOamFuncConfig; /* +GSG 030306 */
2976 +   HalFuncPtr->OamLoopbackConfig   = halOamLoopbackConfig; /* ~GSG 030416 */
2977 +
2978 +   /* Temporary */
2979 +   /*HalFuncPtr->StatsGetOld = StatsGet;*/
2980 +   HalFuncPtr->PacketProcessEnd = halPacketProcessEnd;
2981 +
2982 +   /* Now, AAL5 must connect to the CPSAR layer */
2983 +
2984 +   /* Attach to SAR HAL Functions */
2985 +   /*
2986 +   cpsarInitModule(NULL, NULL, 0, NULL, &SarFuncSize, Inst);
2987 +
2988 +   if (SarFuncSize!=sizeof(CPSAR_FUNCTIONS))
2989 +    return(EC_AAL5|EC_FUNC_HAL_INIT|EC_VAL_CPSAR_VERSION_NOT_SUPPORTED); 
2990 +
2991 +   HalPtr->SarFunc = (CPSAR_FUNCTIONS *) OsFunc->Malloc(SarFuncSize);
2992 +   */
2993 +
2994 +   rc = cpsarInitModule(&HalPtr->SarDev, OsDev, &HalPtr->SarFunc, OsFunc, sizeof(OS_FUNCTIONS), &SarFuncSize, Inst);
2995 +
2996 +   /* pass back the error value from the CPSAR layer if necessary */
2997 +   if (rc)
2998 +     return(rc);
2999 +
3000 +   /*
3001 +   if (!HalPtr->SarDev)
3002 +     return(EC_AAL5|EC_FUNC_HAL_INIT|EC_VAL_NULL_CPSAR_DEV);
3003 +   */
3004 +
3005 +   /* Initialize the hardware state */
3006 +   HalPtr->State = enConnected;
3007 +
3008 +   /* keep a reference to HalFuncPtr so I can free it later */
3009 +   HalPtr->HalFuncPtr = HalFuncPtr;
3010 +
3011 +   /* pass the HalPtr back to the caller */
3012 +   *HalDev = HalPtr;
3013 +   *HalFunc = HalFuncPtr;
3014 +
3015 +   return(EC_NO_ERRORS);
3016 +  }
3017 diff -urN linux.old/drivers/atm/sangam_atm/aal5sar.h linux.dev/drivers/atm/sangam_atm/aal5sar.h
3018 --- linux.old/drivers/atm/sangam_atm/aal5sar.h  1970-01-01 01:00:00.000000000 +0100
3019 +++ linux.dev/drivers/atm/sangam_atm/aal5sar.h  2005-08-23 04:46:50.080846280 +0200
3020 @@ -0,0 +1,198 @@
3021 +/**@file************************************************************************
3022 + *  TNETDxxxx Software Support
3023 + *  Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
3024 + *
3025 + *  FILE:   aal5sar.h
3026 + *
3027 + *  DESCRIPTION:
3028 + *      This file contains data structure definitions for the AAL5 HAL SAR.
3029 + *
3030 + *  HISTORY:
3031 + *      28Feb02 Greg       1.00  Original Version created.
3032 + *      06Mar02 Greg       1.01  Documented structures.
3033 + *      18Jul02 Greg       1.02  Major reorganization
3034 + *
3035 + *****************************************************************************/
3036 +#ifndef _INC_AAL5SAR
3037 +#define _INC_AAL5SAR
3038 +
3039 +/** \namespace AAL5_Version
3040 +This documents version 01.06.06 of the AAL5 CPHAL.
3041 +*/
3042 +const char *pszVersion_CPAAL5="CPAAL5 01.06.06 "__DATE__" "__TIME__;
3043 +
3044 +#include "cpsar_cpaal5.h"
3045 +
3046 +#define NUM_AAL5_CHAN   16
3047 +#define MAX_AAL5_CHAN   15
3048 +#define MAX_QUEUE       2
3049 +#define MAX_DIRECTION   2
3050 +
3051 +#define PKT_TYPE_AAL5   0   /* +GSG 030508 */
3052 +#define PKT_TYPE_NULL   1   /* +GSG 030508 */
3053 +#define PKT_TYPE_OAM    2   /* +GSG 030508 */
3054 +#define PKT_TYPE_TRANS  3   /* +GSG 030508 */
3055 +#define ATM_HEADER_SIZE 4   /* +GSG 030508 */
3056 +
3057 +/*
3058 + * HAL Default Parameter Values
3059 + */
3060 +#define CFG_TX_NUM_BUFS   {256,256,256,256,256,256,256,256, 256,256,256,256,256,256,256,256}
3061 +#define CFG_RX_NUM_BUFS   {256,256,256,256,256,256,256,256, 256,256,256,256,256,256,256,256}
3062 +#define CFG_RX_BUF_SIZE   {1518,1518,1518,1518,1518,1518,1518,1518, 1518,1518,1518,1518,1518,1518,1518,1518}
3063 +#define CFG_RX_BUF_OFFSET {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
3064 +#define CFG_TX_NUM_QUEUES {1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1}
3065 +#define CFG_CPCS_UU       {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
3066 +#define CFG_DA_MASK       {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
3067 +#define CFG_PRIORITY      {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
3068 +#define CFG_PKT_TYPE      {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
3069 +#define CFG_VCI           {100,101,102,103,104,105,106,107, 108,109,110,111,112,113,114,115}
3070 +#define CFG_VPI           {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
3071 +#define CFG_CELL_RATE     {0x30d4,0x30d4,0x30d4,0x30d4,0x30d4,0x30d4,0x30d4,0x30d4, 0x30d4,0x30d4,0x30d4,0x30d4,0x30d4,0x30d4,0x30d4,0x30d4}
3072 +#define CFG_QOS_TYPE      {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
3073 +#define CFG_MBS           {8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8}
3074 +#define CFG_PCR           {1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1}
3075 +#define CFG_GFC           {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
3076 +#define CFG_CLP           {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
3077 +#define CFG_PTI           {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}
3078 +#define CFG_RX_MAX_SERVICE {170,170,170,170,170,170,170,170, 170,170,170,170,170,170,170,170}
3079 +#define CFG_TX_MAX_SERVICE {170,170,170,170,170,170,170,170, 170,170,170,170,170,170,170,170}
3080 +
3081 +static int cfg_tx_num_bufs[NUM_AAL5_CHAN]   = CFG_TX_NUM_BUFS;
3082 +static int cfg_rx_num_bufs[NUM_AAL5_CHAN]   = CFG_RX_NUM_BUFS;
3083 +static int cfg_rx_buf_size[NUM_AAL5_CHAN]   = CFG_RX_BUF_SIZE;
3084 +static int cfg_rx_buf_offset[NUM_AAL5_CHAN] = CFG_RX_BUF_OFFSET;
3085 +static int cfg_tx_num_queues[NUM_AAL5_CHAN] = CFG_TX_NUM_QUEUES;
3086 +static bit32u cfg_cpcs_uu[NUM_AAL5_CHAN]    = CFG_CPCS_UU;
3087 +static int cfg_da_mask[NUM_AAL5_CHAN]       = CFG_DA_MASK;
3088 +static int cfg_priority[NUM_AAL5_CHAN]      = CFG_PRIORITY;
3089 +static int cfg_pkt_type[NUM_AAL5_CHAN]      = CFG_PKT_TYPE;
3090 +static int cfg_vci[NUM_AAL5_CHAN]           = CFG_VCI;
3091 +static int cfg_vpi[NUM_AAL5_CHAN]           = CFG_VPI;
3092 +static bit32u cfg_cell_rate[NUM_AAL5_CHAN]  = CFG_CELL_RATE;
3093 +static int cfg_qos_type[NUM_AAL5_CHAN]      = CFG_QOS_TYPE;
3094 +static int cfg_mbs[NUM_AAL5_CHAN]           = CFG_MBS;
3095 +static int cfg_pcr[NUM_AAL5_CHAN]           = CFG_PCR;
3096 +static int cfg_gfc[NUM_AAL5_CHAN]           = CFG_GFC;
3097 +static int cfg_clp[NUM_AAL5_CHAN]           = CFG_CLP;
3098 +static int cfg_pti[NUM_AAL5_CHAN]           = CFG_PTI;
3099 +static int cfg_rx_max_service[NUM_AAL5_CHAN]= CFG_RX_MAX_SERVICE;
3100 +static int cfg_tx_max_service[NUM_AAL5_CHAN]= CFG_TX_MAX_SERVICE;
3101 +static char *channel_names[]   = CHANNEL_NAMES;
3102 +
3103 +/*
3104 + *  The HAL_FUNCTIONS struct defines the function pointers for all HAL functions
3105 + *  accessible to upper layer software.  It is populated by calling
3106 + *  halInitModules().
3107 + *
3108 + *  Note that this list is still under definition.
3109 + */
3110 +
3111 +/*
3112 + *  This is the data structure for a transmit buffer descriptor.  The first
3113 + *  four 32-bit words of the BD represent the CPPI 3.0 defined buffer descriptor
3114 + *  words.  The other words are SAR/HAL implementation specific.
3115 + */
3116 +typedef struct
3117 +  {
3118 +   bit32 HNext;      /**< Hardware's pointer to next buffer descriptor */
3119 +   bit32 BufPtr;     /**< Pointer to the data buffer */
3120 +   bit32 Off_BLen;   /**< Contains buffer offset and buffer length */
3121 +   bit32 mode;       /**< SOP, EOP, Ownership, EOQ, Teardown Complete bits */
3122 +   bit32 AtmHeader;  /**< Atm Header to be used for each fragment */
3123 +   bit32 Word5;      /**< General control information for the packet */
3124 +   bit32 Res6;
3125 +   bit32 Res7;
3126 +   void *Next;
3127 +   void *OsInfo;
3128 +#ifdef __CPHAL_DEBUG
3129 +   bit32 DbgSop;
3130 +   bit32 DbgData;
3131 +   bit32 DbgFraglist;
3132 +#endif
3133 +   void *Eop;
3134 +  }HAL_TCB;
3135 +
3136 +/*
3137 + *  This is the data structure for a receive buffer descriptor.  The first
3138 + *  six 32-bit words of the BD represent the CPPI 3.0 defined buffer descriptor
3139 + *  words.  The other words are HAL implementation specific.
3140 + */
3141 +typedef volatile struct hal_private
3142 +  {
3143 +  bit32 HNext;      /**< Hardware's pointer to next buffer descriptor */
3144 +  bit32 BufPtr;     /**< Pointer to the data buffer */
3145 +  bit32 Off_BLen;   /**< Contains buffer offset and buffer length */
3146 +  bit32 mode;       /**< SOP, EOP, Ownership, EOQ, Teardown, Q Starv, Length */
3147 +  bit32 AtmHeader;
3148 +  bit32 UuCpi;
3149 +  bit32 Res6;
3150 +  bit32 Res7;
3151 +  void *DatPtr;
3152 +  void *Next;
3153 +  void *OsInfo;
3154 +  void *Eop;
3155 +  bit32 FragCount;
3156 +  bit32 Ch;
3157 +  HAL_DEVICE *HalDev;
3158 +  }HAL_RCB;
3159 +
3160 +
3161 +#define MAX_NEEDS 512                                             /*MJH+030409*/
3162 +/*
3163 + *  This is the data structure for a generic HAL device.  It contains all device
3164 + *  specific data for a single instance of that device.  This includes Rx/Tx
3165 + *  buffer queues, device base address, reset bit, and other information.
3166 + */
3167 +typedef struct hal_device
3168 +  {
3169 +  HAL_RCB *RcbPool[NUM_AAL5_CHAN];
3170 +  bit32u rxbufseq;
3171 +  bit32 RxActQueueCount[NUM_AAL5_CHAN];
3172 +  HAL_RCB *RxActQueueHead[NUM_AAL5_CHAN];
3173 +  HAL_RCB *RxActQueueTail[NUM_AAL5_CHAN];
3174 +  bit32 RxActive[NUM_AAL5_CHAN];
3175 +  bit32 dev_base;
3176 +  HAL_TCB *TcbPool[NUM_AAL5_CHAN][MAX_QUEUE];
3177 +  bit32 offset;
3178 +  bit32 TxActQueueCount[NUM_AAL5_CHAN][MAX_QUEUE];
3179 +  HAL_TCB *TxActQueueHead[NUM_AAL5_CHAN][MAX_QUEUE];
3180 +  HAL_TCB *TxActQueueTail[NUM_AAL5_CHAN][MAX_QUEUE];
3181 +  bit32 TxActive[NUM_AAL5_CHAN][MAX_QUEUE];
3182 +  bit32 TxTeardownPending[NUM_AAL5_CHAN];
3183 +  bit32 RxTeardownPending[NUM_AAL5_CHAN];
3184 +  bit32 ChIsOpen[NUM_AAL5_CHAN][MAX_DIRECTION];
3185 +  bit32 ChIsSetup[NUM_AAL5_CHAN][MAX_DIRECTION];
3186 +  bit32 interrupt;
3187 +  bit32 debug;
3188 +  OS_DEVICE *OsDev;
3189 +  OS_FUNCTIONS *OsFunc;
3190 +  CPSAR_FUNCTIONS *SarFunc;
3191 +  CPSAR_DEVICE *SarDev;
3192 +  /*void *OsOpen;*/
3193 +    /*FRAGLIST fraglist[MAX_FRAG];*/
3194 +  FRAGLIST *fraglist;
3195 +  char *TcbStart[NUM_AAL5_CHAN][MAX_QUEUE];
3196 +  char *RcbStart[NUM_AAL5_CHAN];
3197 +    /*bit32 RcbSize[NUM_AAL5_CHAN];*/
3198 +  bit32 InRxInt[NUM_AAL5_CHAN];
3199 +  STAT_INFO Stats;
3200 +  bit32  Inst;
3201 +  bit32u DeviceCPID[4];
3202 +  bit32u LBSourceLLID[4];
3203 +  CHANNEL_INFO ChData[NUM_AAL5_CHAN];
3204 +  DEVICE_STATE State;
3205 +  char *DeviceInfo;
3206 +  HAL_FUNCTIONS *HalFuncPtr;
3207 +  int NextRxCh;
3208 +  int NextTxCh[2];
3209 +  int StrictPriority; /* +GSG 030304 */
3210 +  bit32u NeedsCount;                                              /*MJH+030409*/
3211 +  HAL_RECEIVEINFO *Needs[MAX_NEEDS];                              /*MJH+030409*/
3212 +  bit32u SarFrequency;  /* +GSG 030416 */
3213 +  int MaxFrags;
3214 +  bit32u TurboDslErrors;
3215 +  bit32u OamLbTimeout;
3216 +  }HALDEVICE;
3217 +
3218 +#endif
3219 diff -urN linux.old/drivers/atm/sangam_atm/cpcommon_cpaal5.c linux.dev/drivers/atm/sangam_atm/cpcommon_cpaal5.c
3220 --- linux.old/drivers/atm/sangam_atm/cpcommon_cpaal5.c  1970-01-01 01:00:00.000000000 +0100
3221 +++ linux.dev/drivers/atm/sangam_atm/cpcommon_cpaal5.c  2005-08-23 04:46:50.081846128 +0200
3222 @@ -0,0 +1,728 @@
3223 +#ifndef _INC_CPCOMMON_C
3224 +#define _INC_CPCOMMON_C
3225 +
3226 +#ifdef _CPHAL_CPMAC
3227 +#include "cpremap_cpmac.c"
3228 +#endif
3229 +
3230 +#ifdef _CPHAL_AAL5
3231 +#include "cpremap_cpaal5.c"
3232 +#endif
3233 +
3234 +#ifdef _CPHAL_CPSAR
3235 +#include "cpremap_cpsar.c"
3236 +#endif
3237 +
3238 +#ifdef _CPHAL_AAL2
3239 +#include "cpremap_cpaal2.c"
3240 +#endif
3241 +
3242 +/**
3243 +@defgroup Common_Config_Params Common Configuration Parameters
3244 +
3245 +This section documents the configuration parameters that are valid across
3246 +all CPHAL devices.
3247 +@{
3248 +*/
3249 +/** This is the debug level.  The field is bit defined, such that the user
3250 +should set to 1 all the bits corresponding to desired debug outputs.  The following 
3251 +are the meanings for each debug bit:
3252 +- bit0 (LSB): CPHAL Function Trace
3253 +- b1 : OS Function call trace
3254 +- b2 : Critical section entry/exit
3255 +- b3 : Memory allocation/destruction
3256 +- b4 : Detailed information in Rx path
3257 +- b5 : Detailed information in Tx path
3258 +- b6 : Extended error information
3259 +- b7 : General info
3260 +*/
3261 +static const char pszDebug[]        = "debug";
3262 +/** CPU Frequency. */
3263 +/*static const char pszCpuFreq[]      = "CpuFreq";*/               /*MJH-030403*/
3264 +/** Base address for the module. */
3265 +static const char pszBase[]         = "base";
3266 +/** Reset bit for the module. */
3267 +static const char pszResetBit[]     = "reset_bit";
3268 +/** Reset base address for the module. */
3269 +static const char pszResetBase[]    = "ResetBase";
3270 +/** Interrupt line for the module. */
3271 +static const char pszIntLine[]      = "int_line";
3272 +/** VLYNQ offset for the module.  Disregard if not using VLYNQ. */
3273 +static const char pszOffset[]       = "offset";
3274 +/** The OS may "Get" this parameter, which is a pointer
3275 +    to a character string that indicates the version of CPHAL. */
3276 +static const char pszVer[]          = "Version";
3277 +/*@}*/
3278 +
3279 +/**
3280 +@defgroup Common_Control_Params Common Keys for [os]Control()
3281 +
3282 +This section documents the keys used with the OS @c Control() interface that
3283 +are required by CPHAL devices.
3284 +
3285 +@{
3286 +*/
3287 +/** Used to wait for an integer number of clock ticks, given as an integer
3288 +    pointer in the @p Value parameter.  No actions are defined. */
3289 +static const char pszSleep[]             = "Sleep";
3290 +/** Requests the OS to flush it's IO buffers.  No actions are defined. */
3291 +static const char pszSioFlush[]          = "SioFlush";
3292 +/*@}*/
3293 +
3294 +static const char pszStateChange[]       = "StateChange";
3295 +static const char pszStatus[]            = "Status";
3296 +
3297 +static const char pszGET[]               = "Get";
3298 +static const char pszSET[]               = "Set";
3299 +static const char pszCLEAR[]             = "Clear";
3300 +static const char pszNULL[]              = "";
3301 +static const char pszLocator[]           = "Locator";
3302 +static const char pszOff[]               = "Off";
3303 +static const char pszOn[]                = "On";
3304 +static const char hcMaxFrags[]           = "MaxFrags";
3305 +
3306 +#ifdef _CPHAL_CPMAC
3307 +
3308 +/*  New method for string constants */
3309 +const char hcClear[]  = "Clear";
3310 +const char hcGet[]    = "Get";
3311 +const char hcSet[]    = "Set";
3312 +
3313 +const char hcTick[]   = "Tick";
3314 +
3315 +static const CONTROL_KEY KeyCommon[] =
3316 +   {
3317 +     {""                   , enCommonStart},
3318 +     {pszStatus            , enStatus},
3319 +     {pszOff               , enOff},
3320 +     {pszOn                , enOn},
3321 +     {pszDebug             , enDebug},
3322 +     {hcCpuFrequency       , enCpuFreq},                           /*MJH~030403*/
3323 +     {""                   , enCommonEnd}
3324 +   };
3325 +#endif
3326 +
3327 +/**
3328 +@defgroup Common_Statistics Statistics
3329 +
3330 +A broad array of module statistics is available.  Statistics values are accessed
3331 +through the @c Control() interface of the CPHAL.  There are 5 different levels
3332 +of statistics, each of which correspond to a unique set of data.  Furthermore,
3333 +certain statistics data is indexed by using a channel number and Tx queue number.
3334 +The following is a brief description of each statistics level, along with the
3335 +indexes used for the level:
3336 +
3337 +- Level 0:  Hardware Statistics (index with channel)
3338 +- Level 1:  CPHAL Software Statistics (channel, queue)
3339 +- Level 2:  CPHAL Flags (channel, queue)
3340 +- Level 3:  CPHAL Channel Configuration (channel)
3341 +- Level 4:  CPHAL General Configuration (no index)
3342 +
3343 +The caller requests statistics information by providing a Key string to the
3344 +@c Control() API in the following format: "Stats;[Level #];[Ch #];[Queue #]".
3345 +The only valid Action parameter for statistics usage is "Get".
3346 +
3347 +Code Examples:
3348 +@code
3349 +unsigned int *StatsData;
3350 +
3351 +# Get Level 0 stats for Channel 1
3352 +HalFunc->Control(OsDev->HalDev, "Stats;0;1", "Get", &StatsData);
3353 +
3354 +# Get Level 2 stats for Channel 0, Queue 0
3355 +HalFunc->Control(OsDev->HalDev, "Stats;2;0;0", "Get", &StatsData);
3356 +
3357 +# Get Level 4 stats
3358 +HalFunc->Control(OsDev->HalDev, "Stats;4", "Get", &StatsData);
3359 +@endcode
3360 +
3361 +The information returned in the Value parameter of @c Control() is an
3362 +array of pointers to strings.  The pointers are arranged in pairs.
3363 +The first pointer is a pointer to a name string for a particular statistic.
3364 +The next pointer is a pointer to a string containing the representation of
3365 +the integer statistic value corresponding to the first pointer.  This is followed
3366 +by another pair of pointers, and so on, until a NULL pointer is encountered.  The
3367 +following is example code for processing the statistics data.  Note that the OS
3368 +is responsible for freeing the memory passed back through the Value parameter of
3369 +@c Control().
3370 +
3371 +@code
3372 +unsigned int *StatsData;
3373 +
3374 +# Get Level 0 stats for Channel 1
3375 +HalFunc->Control(OsDev->HalDev, "Stats;0;1", "Get", &StatsData);
3376 +
3377 +# output Statistics data
3378 +PrintStats(StatsData);
3379 +
3380 +# the upper layer is responsible for freeing stats info
3381 +free(&StatsPtr);
3382 +
3383 +...
3384 +
3385 +void PrintStats(unsigned int *StatsPtr)
3386 +  {
3387 +   while(*StatsPtr)
3388 +     {
3389 +      printf("%20s:",  (char *)*StatsPtr);
3390 +      StatsPtr++;
3391 +      printf("%11s\n", (char *)*StatsPtr);
3392 +      StatsPtr++;
3393 +     }
3394 +   MySioFlush();
3395 +  }
3396 +@endcode
3397 +
3398 +Within each statistics level, there are several statistics defined.  The statistics that
3399 +are common to every CPPI module are listed below.  In addition, each module may define
3400 +extra statistics in each level, which will be documented within the module-specific
3401 +documentation appendices.
3402 +
3403 +- Level 0 Statistics
3404 +  - All level 0 statistics are module-specific.
3405 +- Level 1 Statistics (CPHAL Software Statistics)
3406 +  - DmaLenErrors: Incremented when the port DMA's more data than expected (per channel). (AAL5 Only)
3407 +  - TxMisQCnt: Incremented when host queues a packet for transmission as the port finishes
3408 +transmitting the previous last packet in the queue (per channel and queue).
3409 +  - RxMisQCnt: Incremented when host queues adds buffers to a queue as the port finished the
3410 +reception of the previous last packet in the queue (per channel).
3411 +  - TxEOQCnt: Number of times the port has reached the end of the transmit queue (per channel and queue).
3412 +  - RxEOQCnt: Number of times the port has reached the end of the receive queue (per channel).
3413 +  - RxPacketsServiced: Number of received packets (per channel).
3414 +  - TxPacketsServiced: Number of transmitted packets (per channel and queue).
3415 +  - RxMaxServiced: Maximum number of packets that the CPHAL receive interrupt has serviced at a time (per channel).
3416 +  - TxMaxServiced: Maximum number of packets that the CPHAL transmit interrupt has serviced at a time (per channel and queue).
3417 +  - RxTotal: Total number of received packets, all channels.
3418 +  - TxTotal: Total number of transmitted packets, all channels and queues.
3419 +- Level 2 Statistics (CPHAL Flags)
3420 +  - RcbPool: Pointer to receive descriptor pool (per channel).
3421 +  - RxActQueueCount: Number of buffers currently available for receive (per channel).
3422 +  - RxActQueueHead: Pointer to first buffer in receive queue (per channel).
3423 +  - RxActQueueTail: Pointer to last buffer in receive queue (per channel).
3424 +  - RxActive: 0 if inactive (no buffers available), or 1 if active (buffers available).
3425 +  - RcbStart: Pointer to block of receive descriptors.
3426 +  - RxTeardownPending: 1 if Rx teardown is pending but incomplete, 0 otherwise.
3427 +  - TcbPool: Pointer to transmit descriptor pool (per channel and queue).
3428 +  - TxActQueueCount: Number of buffers currently queued to be transmitted (per channel and queue).
3429 +  - TxActQueueHead: Pointer to first buffer in transmit queue (per channel and queue).
3430 +  - TxActQueueTail: Pointer to last buffer in transmit queue (per channel and queue).
3431 +  - TxActive: 0 if inactive (no buffers to send), or 1 if active (buffers queued to send).
3432 +  - TcbStart: Pointer to block of transmit descriptors.
3433 +  - TxTeardownPending: 1 if Tx teardown is pending but incomplete, 0 otherwise.
3434 +- Level 3 Statistics (CPHAL Channel Configuration)
3435 +  - RxBufSize: Rx buffer size.
3436 +  - RxBufferOffset: Rx buffer offset.
3437 +  - RxNumBuffers: Number of Rx buffers.
3438 +  - RxServiceMax: Maximum number of receive packets to service at a time.
3439 +  - TxNumBuffers: Number of Tx buffer descriptors.
3440 +  - TxNumQueues: Number of Tx queues to use.
3441 +  - TxServiceMax: Maximum number of transmit packets to service at a time.
3442 +- Level 4 Statistics (CPHAL General Configuration)
3443 +  - Base Address: Base address of the module.
3444 +  - Offset (VLYNQ): VLYNQ relative module offset.
3445 +  - Interrupt Line: Interrupt number.
3446 +  - Debug: Debug flag, 1 to enable debug.
3447 +  - Inst: Instance number.
3448 +*/
3449 +
3450 +/* 
3451 +   Data Type 0 = int display
3452 +   Data Type 1 = hex display
3453 +   Data Type 2 = channel structure, int display
3454 +   Data Type 3 = queue index and int display
3455 +   Data Type 4 = queue index and hex display
3456 +*/
3457 +#if (defined(_CPHAL_AAL5) || defined(_CPHAL_CPMAC)) /* +GSG 030307 */
3458 +static STATS_TABLE StatsTable0[] =
3459 +  {
3460 +#ifdef _CPHAL_AAL5
3461 +   /* Name ,        Data Ptr,   Data Type */
3462 +   {"Crc Errors",          0,          0},
3463 +   {"Len Errors",          0,          0},
3464 +   {"Abort Errors",        0,          0},
3465 +   {"Starv Errors",        0,          0}
3466 +#endif
3467 +#ifdef _CPHAL_CPMAC
3468 +   {"Rx Good Frames",      0,          0}
3469 +#endif
3470 +  };
3471 +
3472 +static STATS_TABLE StatsTable1[] =
3473 +  {
3474 +   /* Name ,        Data Ptr,   Data Type */
3475 +   {"DmaLenErrors",        0,          0},
3476 +   {"TxMisQCnt",           0,          3},
3477 +   {"RxMisQCnt",           0,          0},
3478 +   {"TxEOQCnt",            0,          3},
3479 +   {"RxEOQCnt",            0,          0},
3480 +   {"RxPacketsServiced",   0,          0},
3481 +   {"TxPacketsServiced",   0,          3},
3482 +   {"RxMaxServiced",       0,          0},
3483 +   {"TxMaxServiced",       0,          3},
3484 +   {"RxTotal",             0,          0},
3485 +   {"TxTotal",             0,          0},
3486 +  };
3487 +
3488 +static STATS_TABLE StatsTable2[] =
3489 +  {
3490 +   /* Name ,        Data Ptr,   Data Type */
3491 +   {"RcbPool",             0,          1},
3492 +   {"RxActQueueCount",     0,          0},
3493 +   {"RxActQueueHead",      0,          1},
3494 +   {"RxActQueueTail",      0,          1},
3495 +   {"RxActive",            0,          0},
3496 +   {"RcbStart",            0,          1},
3497 +   {"RxTeardownPending",   0,          0},
3498 +   {"TcbPool",             0,          4},
3499 +   {"TxActQueueCount",     0,          3},
3500 +   {"TxActQueueHead",      0,          4},
3501 +   {"TxActQueueTail",      0,          4},
3502 +   {"TxActive",            0,          3},
3503 +   {"TcbStart",            0,          4},
3504 +   {"TxTeardownPending",   0,          0}
3505 +  };
3506 +
3507 +static STATS_TABLE StatsTable3[] =
3508 +  {
3509 +   /* Name ,        Data Ptr,   Data Type */
3510 +   {"RxBufSize",           0,          2},
3511 +   {"RxBufferOffset",      0,          2},
3512 +   {"RxNumBuffers",        0,          2},
3513 +   {"RxServiceMax",        0,          2},
3514 +   {"TxNumBuffers",        0,          2},
3515 +   {"TxNumQueues",         0,          2},
3516 +   {"TxServiceMax",        0,          2},
3517 +#ifdef _CPHAL_AAL5
3518 +   {"CpcsUU",              0,          2},
3519 +   {"Gfc",                 0,          2},
3520 +   {"Clp",                 0,          2},
3521 +   {"Pti",                 0,          2},
3522 +   {"DaMask",              0,          2},
3523 +   {"Priority",            0,          2},
3524 +   {"PktType",             0,          2},
3525 +   {"Vci",                 0,          2},
3526 +   {"Vpi",                 0,          2},
3527 +   {"CellRate",            0,          2},
3528 +   {"QosType",             0,          2},
3529 +   {"Mbs",                 0,          2},
3530 +   {"Pcr",                 0,          2}
3531 +#endif
3532 +  };
3533 +
3534 +static STATS_TABLE StatsTable4[] =
3535 +  {
3536 +   {"Base Address",        0,          1},
3537 +   {"Offset (VLYNQ)",      0,          0},
3538 +   {"Interrupt Line",      0,          0},
3539 +   {"Debug",               0,          0},
3540 +   {"Instance",            0,          0},
3541 +#ifdef _CPHAL_AAL5
3542 +   {"UniNni",              0,          0}
3543 +#endif
3544 +  };
3545 +
3546 +static STATS_DB StatsDb[] =
3547 +  {
3548 +    {(sizeof(StatsTable0)/sizeof(STATS_TABLE)), StatsTable0},
3549 +    {(sizeof(StatsTable1)/sizeof(STATS_TABLE)), StatsTable1},
3550 +    {(sizeof(StatsTable2)/sizeof(STATS_TABLE)), StatsTable2},
3551 +    {(sizeof(StatsTable3)/sizeof(STATS_TABLE)), StatsTable3},
3552 +    {(sizeof(StatsTable4)/sizeof(STATS_TABLE)), StatsTable4}
3553 +  };
3554 +#endif /* +GSG 030307 */
3555 +
3556 +#ifdef _CPHAL_CPMAC /* +RC 3.02 */
3557 +static void resetWait(HAL_DEVICE *HalDev)
3558 +  {                                                                  /*+RC3.02*/
3559 +  const int TickReset=64;
3560 +  osfuncSleep((int*)&TickReset);
3561 +  }                                                                  /*+RC3.02*/
3562 +#endif /* +RC 3.02 */
3563 +
3564 +/* I only define the reset base function for the modules
3565 +   that can perform a reset.  The AAL5 and AAL2 modules
3566 +   do not perform a reset, that is done by the shared module
3567 +   CPSAR */
3568 +#if defined(_CPHAL_CPSAR) || defined(_CPHAL_CPMAC) || defined(_CPHAL_VDMAVT)
3569 +/*
3570 + *  Determines the reset register address to be used for a particular device.
3571 + *  It will search the current device entry for Locator information.  If the
3572 + *  device is a root device, there will be no Locator information, and the
3573 + *  function will find and return the root reset register.  If a Locator value
3574 + *  is found, the function will search each VLYNQ device entry in the system
3575 + *  looking for a matching Locator.  Once it finds a VLYNQ device entry with
3576 + *  a matching Locator, it will extract the "ResetBase" parameter from that
3577 + *  VLYNQ device entry (thus every VLYNQ entry must have the ResetBase parameter).
3578 + *
3579 + *  @param  HalDev   CPHAL module instance. (set by xxxInitModule())
3580 + *  @param  ResetBase Pointer to integer address of reset register.
3581 + *
3582 + *  @return 0 OK, Non-zero not OK
3583 + */
3584 +static int ResetBaseGet(HAL_DEVICE *HalDev, bit32u *ResetBase)
3585 +  {
3586 +   char *DeviceInfo = HalDev->DeviceInfo;
3587 +   char *MyLocator, *NextLocator;
3588 +   int Inst=1;
3589 +   bit32u error_code;
3590 +
3591 +#ifdef __CPHAL_DEBUG
3592 +   if (DBG(0))
3593 +     {
3594 +      dbgPrintf("[cpcommon]ResetBaseGet(HalDev:%08x, ResetBase:%08x)\n", (bit32u)HalDev, ResetBase);
3595 +      osfuncSioFlush();
3596 +     }
3597 +#endif
3598 +
3599 +   error_code = HalDev->OsFunc->DeviceFindParmValue(DeviceInfo, "Locator", &MyLocator);
3600 +   if (error_code)
3601 +     {
3602 +      /* if no Locator value, device is on the root, so get the "reset" device */
3603 +      error_code = HalDev->OsFunc->DeviceFindInfo(0, "reset", &DeviceInfo);
3604 +      if  (error_code)
3605 +        {
3606 +         return(EC_VAL_DEVICE_NOT_FOUND);
3607 +        }
3608 +
3609 +      error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, "base", ResetBase);
3610 +      if (error_code)
3611 +        {
3612 +         return(EC_VAL_BASE_ADDR_NOT_FOUND);
3613 +        }
3614 +
3615 +      *ResetBase = ((bit32u)PhysToVirtNoCache(*ResetBase));
3616 +
3617 +      /* found base address for root device, so we're done */
3618 +      return (EC_NO_ERRORS);
3619 +     }
3620 +    else
3621 +     {
3622 +      /* we have a Locator value, so the device is remote */
3623 +
3624 +      /* Find a vlynq device with a matching locator value */
3625 +      while ((HalDev->OsFunc->DeviceFindInfo(Inst, "vlynq", &DeviceInfo)) == EC_NO_ERRORS)
3626 +        {
3627 +         error_code = HalDev->OsFunc->DeviceFindParmValue(DeviceInfo, "Locator", &NextLocator);
3628 +         if (error_code)
3629 +           {
3630 +            /* no Locator value for this VLYNQ, so move on */
3631 +            continue;
3632 +           }
3633 +         if (HalDev->OsFunc->Strcmpi(MyLocator, NextLocator)==0)
3634 +           {
3635 +            /* we have found a VLYNQ with a matching Locator, so extract the ResetBase */
3636 +            error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, "ResetBase", ResetBase);
3637 +            if (error_code)
3638 +              {
3639 +               return(EC_VAL_BASE_ADDR_NOT_FOUND);
3640 +              }
3641 +            *ResetBase = ((bit32u)PhysToVirtNoCache(*ResetBase));
3642 +
3643 +            /* found base address for root device, so we're done */
3644 +            return (EC_NO_ERRORS);
3645 +           }
3646 +         Inst++;
3647 +        } /* while */
3648 +     } /* else */
3649 +
3650 +   return (EC_NO_ERRORS);
3651 +  }
3652 +#endif
3653 +
3654 +#ifndef _CPHAL_AAL2 /* + RC 3.02 */
3655 +static bit32u ConfigGetCommon(HAL_DEVICE *HalDev)
3656 +  {
3657 +   bit32u ParmValue;
3658 +   bit32 error_code;
3659 +   char *DeviceInfo = HalDev->DeviceInfo;
3660 +
3661 +#ifdef __CPHAL_DEBUG
3662 +   if (DBG(0))
3663 +     {
3664 +      dbgPrintf("[cpcommon]ConfigGetCommon(HalDev:%08x)\n", (bit32u)HalDev);
3665 +      osfuncSioFlush();
3666 +     }
3667 +#endif
3668 +
3669 +   error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszBase, &ParmValue);
3670 +   if (error_code)
3671 +     {
3672 +      return(EC_FUNC_HAL_INIT|EC_VAL_BASE_ADDR_NOT_FOUND);
3673 +     }
3674 +   HalDev->dev_base = ((bit32u)PhysToVirtNoCache(ParmValue));
3675 +
3676 +#ifndef _CPHAL_AAL5
3677 +#ifndef _CPHAL_AAL2
3678 +   error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszResetBit, &ParmValue);
3679 +   if(error_code)
3680 +     {
3681 +      return(EC_FUNC_HAL_INIT|EC_VAL_RESET_BIT_NOT_FOUND);
3682 +     }
3683 +   HalDev->ResetBit = ParmValue;
3684 +
3685 +   /* Get reset base address */
3686 +   error_code = ResetBaseGet(HalDev, &ParmValue);
3687 +   if (error_code)
3688 +     return(EC_FUNC_HAL_INIT|EC_VAL_RESET_BASE_NOT_FOUND);
3689 +   HalDev->ResetBase = ParmValue;
3690 +#endif
3691 +#endif
3692 +
3693 +#ifndef _CPHAL_CPSAR
3694 +   error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszIntLine,&ParmValue);
3695 +   if (error_code)
3696 +     {
3697 +      return(EC_FUNC_HAL_INIT|EC_VAL_INTERRUPT_NOT_FOUND);
3698 +     }
3699 +   HalDev->interrupt = ParmValue;
3700 +#endif
3701 +
3702 +   /* only look for the offset if there is a Locator field, which indicates that
3703 +      the module is a VLYNQ module */
3704 +   error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszLocator,&ParmValue);
3705 +   if (!error_code)
3706 +     {
3707 +      error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszOffset,&ParmValue);
3708 +      if (error_code)
3709 +        {
3710 +         return(EC_FUNC_HAL_INIT|EC_VAL_OFFSET_NOT_FOUND);
3711 +        }
3712 +      HalDev->offset = ParmValue;
3713 +     }
3714 +    else
3715 +      HalDev->offset = 0;
3716 +
3717 +   error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszDebug, &ParmValue);
3718 +   if (!error_code) HalDev->debug = ParmValue;
3719 +
3720 +   return (EC_NO_ERRORS);
3721 +  }
3722 +#endif /* +RC 3.02 */
3723 +
3724 +#ifdef _CPHAL_CPMAC /* +RC 3.02 */
3725 +static void StatsInit(HAL_DEVICE *HalDev)                             /* +() RC3.02 */
3726 +  {
3727 +   /* even though these statistics may be for multiple channels and
3728 +      queues, i need only configure the pointer to the beginning
3729 +      of the array, and I can index from there if necessary */
3730 +
3731 +#ifdef _CPHAL_AAL5
3732 +   StatsTable0[0].StatPtr  = &HalDev->Stats.CrcErrors[0];
3733 +   StatsTable0[1].StatPtr  = &HalDev->Stats.LenErrors[0];
3734 +   StatsTable0[2].StatPtr  = &HalDev->Stats.AbortErrors[0];
3735 +   StatsTable0[3].StatPtr  = &HalDev->Stats.StarvErrors[0];
3736 +
3737 +   StatsTable1[0].StatPtr  = &HalDev->Stats.DmaLenErrors[0];
3738 +   StatsTable1[1].StatPtr  = &HalDev->Stats.TxMisQCnt[0][0];
3739 +   StatsTable1[2].StatPtr  = &HalDev->Stats.RxMisQCnt[0];
3740 +   StatsTable1[3].StatPtr  = &HalDev->Stats.TxEOQCnt[0][0];
3741 +   StatsTable1[4].StatPtr  = &HalDev->Stats.RxEOQCnt[0];
3742 +   StatsTable1[5].StatPtr  = &HalDev->Stats.RxPacketsServiced[0];
3743 +   StatsTable1[6].StatPtr  = &HalDev->Stats.TxPacketsServiced[0][0];
3744 +   StatsTable1[7].StatPtr  = &HalDev->Stats.RxMaxServiced;
3745 +   StatsTable1[8].StatPtr  = &HalDev->Stats.TxMaxServiced[0][0];
3746 +   StatsTable1[9].StatPtr  = &HalDev->Stats.RxTotal;
3747 +   StatsTable1[10].StatPtr = &HalDev->Stats.TxTotal;
3748 +#endif
3749 +
3750 +#if (defined(_CPHAL_AAL5) || defined(_CPHAL_CPMAC))
3751 +   StatsTable2[0].StatPtr  = (bit32u *)&HalDev->RcbPool[0];
3752 +   StatsTable2[1].StatPtr  = &HalDev->RxActQueueCount[0];
3753 +   StatsTable2[2].StatPtr  = (bit32u *)&HalDev->RxActQueueHead[0];
3754 +   StatsTable2[3].StatPtr  = (bit32u *)&HalDev->RxActQueueTail[0];
3755 +   StatsTable2[4].StatPtr  = &HalDev->RxActive[0];
3756 +   StatsTable2[5].StatPtr  = (bit32u *)&HalDev->RcbStart[0];
3757 +   StatsTable2[6].StatPtr  = &HalDev->RxTeardownPending[0];
3758 +   StatsTable2[7].StatPtr  = (bit32u *)&HalDev->TcbPool[0][0];
3759 +   StatsTable2[8].StatPtr  = &HalDev->TxActQueueCount[0][0];
3760 +   StatsTable2[9].StatPtr  = (bit32u *)&HalDev->TxActQueueHead[0][0];
3761 +   StatsTable2[10].StatPtr = (bit32u *)&HalDev->TxActQueueTail[0][0];
3762 +   StatsTable2[11].StatPtr = &HalDev->TxActive[0][0];
3763 +   StatsTable2[12].StatPtr = (bit32u *)&HalDev->TcbStart[0][0];
3764 +   StatsTable2[13].StatPtr = &HalDev->TxTeardownPending[0];
3765 +
3766 +   StatsTable3[0].StatPtr  = &HalDev->ChData[0].RxBufSize;
3767 +   StatsTable3[1].StatPtr  = &HalDev->ChData[0].RxBufferOffset;
3768 +   StatsTable3[2].StatPtr  = &HalDev->ChData[0].RxNumBuffers;
3769 +   StatsTable3[3].StatPtr  = &HalDev->ChData[0].RxServiceMax;
3770 +   StatsTable3[4].StatPtr  = &HalDev->ChData[0].TxNumBuffers;
3771 +   StatsTable3[5].StatPtr  = &HalDev->ChData[0].TxNumQueues;
3772 +   StatsTable3[6].StatPtr  = &HalDev->ChData[0].TxServiceMax;
3773 +#ifdef _CPHAL_AAL5
3774 +   StatsTable3[7].StatPtr  = &HalDev->ChData[0].CpcsUU;
3775 +   StatsTable3[8].StatPtr  = &HalDev->ChData[0].Gfc;
3776 +   StatsTable3[9].StatPtr  = &HalDev->ChData[0].Clp;
3777 +   StatsTable3[10].StatPtr = &HalDev->ChData[0].Pti;
3778 +   StatsTable3[11].StatPtr = &HalDev->ChData[0].DaMask;
3779 +   StatsTable3[12].StatPtr = &HalDev->ChData[0].Priority;
3780 +   StatsTable3[13].StatPtr = &HalDev->ChData[0].PktType;
3781 +   StatsTable3[14].StatPtr = &HalDev->ChData[0].Vci;
3782 +   StatsTable3[15].StatPtr = &HalDev->ChData[0].Vpi;
3783 +   StatsTable3[16].StatPtr = &HalDev->ChData[0].TxVc_CellRate;
3784 +   StatsTable3[17].StatPtr = &HalDev->ChData[0].TxVc_QosType;
3785 +   StatsTable3[18].StatPtr = &HalDev->ChData[0].TxVc_Mbs;
3786 +   StatsTable3[19].StatPtr = &HalDev->ChData[0].TxVc_Pcr;
3787 +#endif
3788 +#endif
3789 +
3790 +   StatsTable4[0].StatPtr  = &HalDev->dev_base;
3791 +   StatsTable4[1].StatPtr  = &HalDev->offset;
3792 +   StatsTable4[2].StatPtr  = &HalDev->interrupt;
3793 +   StatsTable4[3].StatPtr  = &HalDev->debug;
3794 +   StatsTable4[4].StatPtr  = &HalDev->Inst;
3795 +  }
3796 +#endif /* +RC 3.02 */
3797 +
3798 +#ifndef _CPHAL_CPSAR /* +RC 3.02 */
3799 +#ifndef _CPHAL_AAL2 /* +RC 3.02 */
3800 +/*
3801 + *  Returns statistics information.
3802 + *
3803 + *  @param  HalDev   CPHAL module instance. (set by xxxInitModule())
3804 + *
3805 + *  @return 0
3806 + */
3807 +static int StatsGet(HAL_DEVICE *HalDev, void **StatPtr, int Index, int Ch, int Queue)
3808 +  {
3809 +   int Size;
3810 +   bit32u *AddrPtr;
3811 +   char *DataPtr;
3812 +   STATS_TABLE *StatsTable;
3813 +   int i, NumberOfStats;
3814 +
3815 +#ifdef __CPHAL_DEBUG
3816 +   if (DBG(0))
3817 +     {
3818 +      dbgPrintf("[cpcommon]StatsGet(HalDev:%08x, StatPtr:%08x)\n",
3819 +                (bit32u)HalDev, (bit32u)StatPtr);
3820 +      osfuncSioFlush();
3821 +     }
3822 +#endif
3823 +
3824 +   StatsTable = StatsDb[Index].StatTable;
3825 +   NumberOfStats = StatsDb[Index].NumberOfStats;
3826 +
3827 +   Size = sizeof(bit32u)*((NumberOfStats*2)+1);
3828 +   Size += (NumberOfStats*11);
3829 +   *StatPtr = (bit32u *)HalDev->OsFunc->Malloc(Size);
3830 +
3831 +   AddrPtr = (bit32u *) *StatPtr;
3832 +   DataPtr = (char *)AddrPtr;
3833 +   DataPtr += sizeof(bit32u)*((NumberOfStats*2)+1);
3834 +
3835 +   for (i=0; i<NumberOfStats; i++)
3836 +     {
3837 +      *AddrPtr++ = (bit32u)StatsTable[i].StatName;
3838 +      *AddrPtr++ = (bit32u)DataPtr;
3839 +      if (&StatsTable[i].StatPtr[Ch] != 0)
3840 +        {
3841 +         switch(StatsTable[i].DataType)
3842 +           {
3843 +            case 0:
3844 +              HalDev->OsFunc->Sprintf(DataPtr, "%d", (bit32u *)StatsTable[i].StatPtr[Ch]);
3845 +              break;
3846 +            case 1:
3847 +              HalDev->OsFunc->Sprintf(DataPtr, "0x%x", (bit32u *)StatsTable[i].StatPtr[Ch]);
3848 +              break;
3849 +            case 2:
3850 +              HalDev->OsFunc->Sprintf(DataPtr, "%d", *((bit32u *)StatsTable[i].StatPtr + (Ch * (sizeof(CHANNEL_INFO)/4))));
3851 +              break;
3852 +            case 3:
3853 +              HalDev->OsFunc->Sprintf(DataPtr, "%d", *((bit32u *)StatsTable[i].StatPtr + (Ch*MAX_QUEUE)+Queue));
3854 +              break;
3855 +            case 4:
3856 +              HalDev->OsFunc->Sprintf(DataPtr, "0x%x", *((bit32u *)StatsTable[i].StatPtr + (Ch*MAX_QUEUE)+Queue));
3857 +              break;
3858 +            default:
3859 +              /* invalid data type, due to CPHAL programming error */
3860 +              break;
3861 +           }
3862 +        }
3863 +       else
3864 +        {
3865 +         /* invalid statistics pointer, probably was not initialized */
3866 +        }
3867 +      DataPtr += HalDev->OsFunc->Strlen(DataPtr) + 1;
3868 +     }
3869 +
3870 +   *AddrPtr = (bit32u) 0;
3871 +
3872 +   return (EC_NO_ERRORS);
3873 +  }
3874 +#endif /* +RC 3.02 */
3875 +#endif /* +RC 3.02 */
3876 +
3877 +#ifdef _CPHAL_CPMAC
3878 +static void gpioFunctional(int base, int bit)
3879 +  {                                                                  /*+RC3.02*/
3880 +  bit32u GpioEnr = base + 0xC;
3881 +  /*  To make functional, set to zero  */
3882 +  *(volatile bit32u *)(GpioEnr) &= ~(1 << bit);                      /*+RC3.02*/
3883 +  }                                                                  /*+RC3.02*/
3884 +
3885 +
3886 +/*+RC3.02*/
3887 +/* Common function, Checks to see if GPIO should be in functional mode */
3888 +static void gpioCheck(HAL_DEVICE *HalDev, void *moduleDeviceInfo)
3889 +  {                                                                  /*+RC3.02*/
3890 +  int rc;
3891 +  void *DeviceInfo;
3892 +  char *pszMuxBits;
3893 +  char pszMuxBit[20];
3894 +  char *pszTmp;
3895 +  char szMuxBit[20];
3896 +  char *ptr;
3897 +  int base;
3898 +  int reset_bit;
3899 +  int bit;
3900 +  OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
3901 +
3902 +  rc = OsFunc->DeviceFindParmValue(moduleDeviceInfo, "gpio_mux",&pszTmp);
3903 +  if(rc) return;
3904 +  /*  gpio entry found, get GPIO register info and make functional  */
3905 +
3906 +  /* temp copy until FinParmValue fixed */
3907 +  ptr = &szMuxBit[0];
3908 +  while ((*ptr++ = *pszTmp++));
3909 +
3910 +  pszMuxBits = &szMuxBit[0];
3911 +
3912 +  rc = OsFunc->DeviceFindInfo(0,"gpio",&DeviceInfo);
3913 +  if(rc) return;
3914 +
3915 +  rc = OsFunc->DeviceFindParmUint(DeviceInfo, "base",&base);
3916 +  if(rc) return;
3917 +
3918 +  rc = OsFunc->DeviceFindParmUint(DeviceInfo, "reset_bit",&reset_bit);
3919 +  if(rc) return;
3920 +
3921 +  /* If GPIO still in reset, then exit  */
3922 +  if((VOLATILE32(HalDev->ResetBase) & (1 << reset_bit)) == 0)
3923 +    return;
3924 +  /*  format for gpio_mux is  gpio_mux = <int>;<int>;<int>...*/
3925 +  while (*pszMuxBits)
3926 +    {
3927 +    pszTmp = &pszMuxBit[0];
3928 +    if(*pszMuxBits == ';') pszMuxBits++;
3929 +    while ((*pszMuxBits != ';') && (*pszMuxBits != '\0'))
3930 +      {
3931 +      osfuncSioFlush();
3932 +      /*If value not a number, skip */
3933 +      if((*pszMuxBits < '0') || (*pszMuxBits > '9'))
3934 +        pszMuxBits++;
3935 +      else
3936 +        *pszTmp++ = *pszMuxBits++;
3937 +      }
3938 +    *pszTmp = '\0';
3939 +    bit = OsFunc->Strtoul(pszMuxBit, &pszTmp, 10);
3940 +    gpioFunctional(base, bit);
3941 +    resetWait(HalDev);  /* not sure if this is needed */
3942 +    }
3943 +  }                                                                  /*+RC3.02*/
3944 +#endif  /* CPMAC  */
3945 +
3946 +#ifdef _CPHAL_AAL5
3947 +const char hcSarFrequency[] = "SarFreq";
3948 +#endif
3949 +
3950 +#endif  /* _INC  */
3951 diff -urN linux.old/drivers/atm/sangam_atm/cpcommon_cpaal5.h linux.dev/drivers/atm/sangam_atm/cpcommon_cpaal5.h
3952 --- linux.old/drivers/atm/sangam_atm/cpcommon_cpaal5.h  1970-01-01 01:00:00.000000000 +0100
3953 +++ linux.dev/drivers/atm/sangam_atm/cpcommon_cpaal5.h  2005-08-23 04:46:50.082845976 +0200
3954 @@ -0,0 +1,79 @@
3955 +#ifndef _INC_CPCOMMON_H
3956 +#define _INC_CPCOMMON_H
3957 +
3958 +#define VOLATILE32(addr)  (*(volatile bit32u *)(addr))
3959 +#ifndef dbgPrintf
3960 +#define dbgPrintf HalDev->OsFunc->Printf
3961 +#endif
3962 +
3963 +#define ChannelUpdate(Field) if(HalChn->Field != 0xFFFFFFFF) HalDev->ChData[Ch].Field = HalChn->Field
3964 +
3965 +#define DBG(level)  (HalDev->debug & (1<<(level)))
3966 +/*
3967 +#define DBG0()      DBG(0)
3968 +#define DBG1()      DBG(1)
3969 +#define DBG2()      DBG(2)
3970 +#define DBG3()      DBG(3)
3971 +#define DBG4()      DBG(4)
3972 +#define DBG5()      DBG(5)
3973 +#define DBG6()      DBG(6)
3974 +#define DBG7()      DBG(7)
3975 +*/
3976 +
3977 +/*
3978 + *  List of defined actions for use with Control().
3979 + */
3980 +typedef enum 
3981 +  {
3982 +   enGET=0,     /**< Get the value associated with a key */
3983 +   enSET,       /**< Set the value associates with a key */
3984 +   enCLEAR,     /**<Clear the value */ 
3985 +   enNULL       /**< No data action, used to initiate a service or send a message */
3986 +  }ACTION;
3987 +
3988 +/*
3989 + *  Enumerated hardware states.
3990 + */
3991 +typedef enum
3992 +  {
3993 +   enConnected=1, enDevFound, enInitialized, enOpened
3994 +  }DEVICE_STATE;
3995 +
3996 +typedef enum 
3997 +  {
3998 +   enCommonStart=0,
3999 +   /* General  */
4000 +   enOff, enOn, enDebug, 
4001 +   /* Module General */
4002 +   enCpuFreq, 
4003 +   enStatus,
4004 +   enCommonEnd
4005 +   }COMMON_KEY;
4006 +
4007 +typedef struct
4008 +  {
4009 +   const char  *strKey;
4010 +   int  enKey;
4011 +  }CONTROL_KEY;
4012 +
4013 +typedef struct
4014 +  {
4015 +   char *StatName;
4016 +   unsigned int *StatPtr;
4017 +   int DataType; /* 0: int, 1: hex int, 2:channel data */
4018 +  }STATS_TABLE;
4019 +
4020 +typedef struct
4021 +  {
4022 +   int NumberOfStats;
4023 +   STATS_TABLE *StatTable;
4024 +  }STATS_DB;
4025 +
4026 +#define osfuncSioFlush()    HalDev->OsFunc->Control(HalDev->OsDev,"SioFlush",pszNULL,0)
4027 +#define osfuncSleep(Ticks)  HalDev->OsFunc->Control(HalDev->OsDev,pszSleep,pszNULL,Ticks)
4028 +#define osfuncStateChange() HalDev->OsFunc->Control(HalDev->OsDev,pszStateChange,pszNULL,0)
4029 +
4030 +#define CHANNEL_NAMES {"Ch0","Ch1","Ch2","Ch3","Ch4","Ch5","Ch6","Ch7","Ch8","Ch9","Ch10","Ch11","Ch12","Ch13","Ch14","Ch15"}
4031 +
4032 +#endif
4033 +
4034 diff -urN linux.old/drivers/atm/sangam_atm/cpcommon_cpsar.c linux.dev/drivers/atm/sangam_atm/cpcommon_cpsar.c
4035 --- linux.old/drivers/atm/sangam_atm/cpcommon_cpsar.c   1970-01-01 01:00:00.000000000 +0100
4036 +++ linux.dev/drivers/atm/sangam_atm/cpcommon_cpsar.c   2005-08-23 04:46:50.082845976 +0200
4037 @@ -0,0 +1,728 @@
4038 +#ifndef _INC_CPCOMMON_C
4039 +#define _INC_CPCOMMON_C
4040 +
4041 +#ifdef _CPHAL_CPMAC
4042 +#include "cpremap_cpmac.c"
4043 +#endif
4044 +
4045 +#ifdef _CPHAL_AAL5
4046 +#include "cpremap_cpaal5.c"
4047 +#endif
4048 +
4049 +#ifdef _CPHAL_CPSAR
4050 +#include "cpremap_cpsar.c"
4051 +#endif
4052 +
4053 +#ifdef _CPHAL_AAL2
4054 +#include "cpremap_cpaal2.c"
4055 +#endif
4056 +
4057 +/**
4058 +@defgroup Common_Config_Params Common Configuration Parameters
4059 +
4060 +This section documents the configuration parameters that are valid across
4061 +all CPHAL devices.
4062 +@{
4063 +*/
4064 +/** This is the debug level.  The field is bit defined, such that the user
4065 +should set to 1 all the bits corresponding to desired debug outputs.  The following 
4066 +are the meanings for each debug bit:
4067 +- bit0 (LSB): CPHAL Function Trace
4068 +- b1 : OS Function call trace
4069 +- b2 : Critical section entry/exit
4070 +- b3 : Memory allocation/destruction
4071 +- b4 : Detailed information in Rx path
4072 +- b5 : Detailed information in Tx path
4073 +- b6 : Extended error information
4074 +- b7 : General info
4075 +*/
4076 +static const char pszDebug[]        = "debug";
4077 +/** CPU Frequency. */
4078 +/*static const char pszCpuFreq[]      = "CpuFreq";*/               /*MJH-030403*/
4079 +/** Base address for the module. */
4080 +static const char pszBase[]         = "base";
4081 +/** Reset bit for the module. */
4082 +static const char pszResetBit[]     = "reset_bit";
4083 +/** Reset base address for the module. */
4084 +static const char pszResetBase[]    = "ResetBase";
4085 +/** Interrupt line for the module. */
4086 +static const char pszIntLine[]      = "int_line";
4087 +/** VLYNQ offset for the module.  Disregard if not using VLYNQ. */
4088 +static const char pszOffset[]       = "offset";
4089 +/** The OS may "Get" this parameter, which is a pointer
4090 +    to a character string that indicates the version of CPHAL. */
4091 +static const char pszVer[]          = "Version";
4092 +/*@}*/
4093 +
4094 +/**
4095 +@defgroup Common_Control_Params Common Keys for [os]Control()
4096 +
4097 +This section documents the keys used with the OS @c Control() interface that
4098 +are required by CPHAL devices.
4099 +
4100 +@{
4101 +*/
4102 +/** Used to wait for an integer number of clock ticks, given as an integer
4103 +    pointer in the @p Value parameter.  No actions are defined. */
4104 +static const char pszSleep[]             = "Sleep";
4105 +/** Requests the OS to flush it's IO buffers.  No actions are defined. */
4106 +static const char pszSioFlush[]          = "SioFlush";
4107 +/*@}*/
4108 +
4109 +static const char pszStateChange[]       = "StateChange";
4110 +static const char pszStatus[]            = "Status";
4111 +
4112 +static const char pszGET[]               = "Get";
4113 +static const char pszSET[]               = "Set";
4114 +static const char pszCLEAR[]             = "Clear";
4115 +static const char pszNULL[]              = "";
4116 +static const char pszLocator[]           = "Locator";
4117 +static const char pszOff[]               = "Off";
4118 +static const char pszOn[]                = "On";
4119 +static const char hcMaxFrags[]           = "MaxFrags";
4120 +
4121 +#ifdef _CPHAL_CPMAC
4122 +
4123 +/*  New method for string constants */
4124 +const char hcClear[]  = "Clear";
4125 +const char hcGet[]    = "Get";
4126 +const char hcSet[]    = "Set";
4127 +
4128 +const char hcTick[]   = "Tick";
4129 +
4130 +static const CONTROL_KEY KeyCommon[] =
4131 +   {
4132 +     {""                   , enCommonStart},
4133 +     {pszStatus            , enStatus},
4134 +     {pszOff               , enOff},
4135 +     {pszOn                , enOn},
4136 +     {pszDebug             , enDebug},
4137 +     {hcCpuFrequency       , enCpuFreq},                           /*MJH~030403*/
4138 +     {""                   , enCommonEnd}
4139 +   };
4140 +#endif
4141 +
4142 +/**
4143 +@defgroup Common_Statistics Statistics
4144 +
4145 +A broad array of module statistics is available.  Statistics values are accessed
4146 +through the @c Control() interface of the CPHAL.  There are 5 different levels
4147 +of statistics, each of which correspond to a unique set of data.  Furthermore,
4148 +certain statistics data is indexed by using a channel number and Tx queue number.
4149 +The following is a brief description of each statistics level, along with the
4150 +indexes used for the level:
4151 +
4152 +- Level 0:  Hardware Statistics (index with channel)
4153 +- Level 1:  CPHAL Software Statistics (channel, queue)
4154 +- Level 2:  CPHAL Flags (channel, queue)
4155 +- Level 3:  CPHAL Channel Configuration (channel)
4156 +- Level 4:  CPHAL General Configuration (no index)
4157 +
4158 +The caller requests statistics information by providing a Key string to the
4159 +@c Control() API in the following format: "Stats;[Level #];[Ch #];[Queue #]".
4160 +The only valid Action parameter for statistics usage is "Get".
4161 +
4162 +Code Examples:
4163 +@code
4164 +unsigned int *StatsData;
4165 +
4166 +# Get Level 0 stats for Channel 1
4167 +HalFunc->Control(OsDev->HalDev, "Stats;0;1", "Get", &StatsData);
4168 +
4169 +# Get Level 2 stats for Channel 0, Queue 0
4170 +HalFunc->Control(OsDev->HalDev, "Stats;2;0;0", "Get", &StatsData);
4171 +
4172 +# Get Level 4 stats
4173 +HalFunc->Control(OsDev->HalDev, "Stats;4", "Get", &StatsData);
4174 +@endcode
4175 +
4176 +The information returned in the Value parameter of @c Control() is an
4177 +array of pointers to strings.  The pointers are arranged in pairs.
4178 +The first pointer is a pointer to a name string for a particular statistic.
4179 +The next pointer is a pointer to a string containing the representation of
4180 +the integer statistic value corresponding to the first pointer.  This is followed
4181 +by another pair of pointers, and so on, until a NULL pointer is encountered.  The
4182 +following is example code for processing the statistics data.  Note that the OS
4183 +is responsible for freeing the memory passed back through the Value parameter of
4184 +@c Control().
4185 +
4186 +@code
4187 +unsigned int *StatsData;
4188 +
4189 +# Get Level 0 stats for Channel 1
4190 +HalFunc->Control(OsDev->HalDev, "Stats;0;1", "Get", &StatsData);
4191 +
4192 +# output Statistics data
4193 +PrintStats(StatsData);
4194 +
4195 +# the upper layer is responsible for freeing stats info
4196 +free(&StatsPtr);
4197 +
4198 +...
4199 +
4200 +void PrintStats(unsigned int *StatsPtr)
4201 +  {
4202 +   while(*StatsPtr)
4203 +     {
4204 +      printf("%20s:",  (char *)*StatsPtr);
4205 +      StatsPtr++;
4206 +      printf("%11s\n", (char *)*StatsPtr);
4207 +      StatsPtr++;
4208 +     }
4209 +   MySioFlush();
4210 +  }
4211 +@endcode
4212 +
4213 +Within each statistics level, there are several statistics defined.  The statistics that
4214 +are common to every CPPI module are listed below.  In addition, each module may define
4215 +extra statistics in each level, which will be documented within the module-specific
4216 +documentation appendices.
4217 +
4218 +- Level 0 Statistics
4219 +  - All level 0 statistics are module-specific.
4220 +- Level 1 Statistics (CPHAL Software Statistics)
4221 +  - DmaLenErrors: Incremented when the port DMA's more data than expected (per channel). (AAL5 Only)
4222 +  - TxMisQCnt: Incremented when host queues a packet for transmission as the port finishes
4223 +transmitting the previous last packet in the queue (per channel and queue).
4224 +  - RxMisQCnt: Incremented when host queues adds buffers to a queue as the port finished the
4225 +reception of the previous last packet in the queue (per channel).
4226 +  - TxEOQCnt: Number of times the port has reached the end of the transmit queue (per channel and queue).
4227 +  - RxEOQCnt: Number of times the port has reached the end of the receive queue (per channel).
4228 +  - RxPacketsServiced: Number of received packets (per channel).
4229 +  - TxPacketsServiced: Number of transmitted packets (per channel and queue).
4230 +  - RxMaxServiced: Maximum number of packets that the CPHAL receive interrupt has serviced at a time (per channel).
4231 +  - TxMaxServiced: Maximum number of packets that the CPHAL transmit interrupt has serviced at a time (per channel and queue).
4232 +  - RxTotal: Total number of received packets, all channels.
4233 +  - TxTotal: Total number of transmitted packets, all channels and queues.
4234 +- Level 2 Statistics (CPHAL Flags)
4235 +  - RcbPool: Pointer to receive descriptor pool (per channel).
4236 +  - RxActQueueCount: Number of buffers currently available for receive (per channel).
4237 +  - RxActQueueHead: Pointer to first buffer in receive queue (per channel).
4238 +  - RxActQueueTail: Pointer to last buffer in receive queue (per channel).
4239 +  - RxActive: 0 if inactive (no buffers available), or 1 if active (buffers available).
4240 +  - RcbStart: Pointer to block of receive descriptors.
4241 +  - RxTeardownPending: 1 if Rx teardown is pending but incomplete, 0 otherwise.
4242 +  - TcbPool: Pointer to transmit descriptor pool (per channel and queue).
4243 +  - TxActQueueCount: Number of buffers currently queued to be transmitted (per channel and queue).
4244 +  - TxActQueueHead: Pointer to first buffer in transmit queue (per channel and queue).
4245 +  - TxActQueueTail: Pointer to last buffer in transmit queue (per channel and queue).
4246 +  - TxActive: 0 if inactive (no buffers to send), or 1 if active (buffers queued to send).
4247 +  - TcbStart: Pointer to block of transmit descriptors.
4248 +  - TxTeardownPending: 1 if Tx teardown is pending but incomplete, 0 otherwise.
4249 +- Level 3 Statistics (CPHAL Channel Configuration)
4250 +  - RxBufSize: Rx buffer size.
4251 +  - RxBufferOffset: Rx buffer offset.
4252 +  - RxNumBuffers: Number of Rx buffers.
4253 +  - RxServiceMax: Maximum number of receive packets to service at a time.
4254 +  - TxNumBuffers: Number of Tx buffer descriptors.
4255 +  - TxNumQueues: Number of Tx queues to use.
4256 +  - TxServiceMax: Maximum number of transmit packets to service at a time.
4257 +- Level 4 Statistics (CPHAL General Configuration)
4258 +  - Base Address: Base address of the module.
4259 +  - Offset (VLYNQ): VLYNQ relative module offset.
4260 +  - Interrupt Line: Interrupt number.
4261 +  - Debug: Debug flag, 1 to enable debug.
4262 +  - Inst: Instance number.
4263 +*/
4264 +
4265 +/* 
4266 +   Data Type 0 = int display
4267 +   Data Type 1 = hex display
4268 +   Data Type 2 = channel structure, int display
4269 +   Data Type 3 = queue index and int display
4270 +   Data Type 4 = queue index and hex display
4271 +*/
4272 +#if (defined(_CPHAL_AAL5) || defined(_CPHAL_CPMAC)) /* +GSG 030307 */
4273 +static STATS_TABLE StatsTable0[] =
4274 +  {
4275 +#ifdef _CPHAL_AAL5
4276 +   /* Name ,        Data Ptr,   Data Type */
4277 +   {"Crc Errors",          0,          0},
4278 +   {"Len Errors",          0,          0},
4279 +   {"Abort Errors",        0,          0},
4280 +   {"Starv Errors",        0,          0}
4281 +#endif
4282 +#ifdef _CPHAL_CPMAC
4283 +   {"Rx Good Frames",      0,          0}
4284 +#endif
4285 +  };
4286 +
4287 +static STATS_TABLE StatsTable1[] =
4288 +  {
4289 +   /* Name ,        Data Ptr,   Data Type */
4290 +   {"DmaLenErrors",        0,          0},
4291 +   {"TxMisQCnt",           0,          3},
4292 +   {"RxMisQCnt",           0,          0},
4293 +   {"TxEOQCnt",            0,          3},
4294 +   {"RxEOQCnt",            0,          0},
4295 +   {"RxPacketsServiced",   0,          0},
4296 +   {"TxPacketsServiced",   0,          3},
4297 +   {"RxMaxServiced",       0,          0},
4298 +   {"TxMaxServiced",       0,          3},
4299 +   {"RxTotal",             0,          0},
4300 +   {"TxTotal",             0,          0},
4301 +  };
4302 +
4303 +static STATS_TABLE StatsTable2[] =
4304 +  {
4305 +   /* Name ,        Data Ptr,   Data Type */
4306 +   {"RcbPool",             0,          1},
4307 +   {"RxActQueueCount",     0,          0},
4308 +   {"RxActQueueHead",      0,          1},
4309 +   {"RxActQueueTail",      0,          1},
4310 +   {"RxActive",            0,          0},
4311 +   {"RcbStart",            0,          1},
4312 +   {"RxTeardownPending",   0,          0},
4313 +   {"TcbPool",             0,          4},
4314 +   {"TxActQueueCount",     0,          3},
4315 +   {"TxActQueueHead",      0,          4},
4316 +   {"TxActQueueTail",      0,          4},
4317 +   {"TxActive",            0,          3},
4318 +   {"TcbStart",            0,          4},
4319 +   {"TxTeardownPending",   0,          0}
4320 +  };
4321 +
4322 +static STATS_TABLE StatsTable3[] =
4323 +  {
4324 +   /* Name ,        Data Ptr,   Data Type */
4325 +   {"RxBufSize",           0,          2},
4326 +   {"RxBufferOffset",      0,          2},
4327 +   {"RxNumBuffers",        0,          2},
4328 +   {"RxServiceMax",        0,          2},
4329 +   {"TxNumBuffers",        0,          2},
4330 +   {"TxNumQueues",         0,          2},
4331 +   {"TxServiceMax",        0,          2},
4332 +#ifdef _CPHAL_AAL5
4333 +   {"CpcsUU",              0,          2},
4334 +   {"Gfc",                 0,          2},
4335 +   {"Clp",                 0,          2},
4336 +   {"Pti",                 0,          2},
4337 +   {"DaMask",              0,          2},
4338 +   {"Priority",            0,          2},
4339 +   {"PktType",             0,          2},
4340 +   {"Vci",                 0,          2},
4341 +   {"Vpi",                 0,          2},
4342 +   {"CellRate",            0,          2},
4343 +   {"QosType",             0,          2},
4344 +   {"Mbs",                 0,          2},
4345 +   {"Pcr",                 0,          2}
4346 +#endif
4347 +  };
4348 +
4349 +static STATS_TABLE StatsTable4[] =
4350 +  {
4351 +   {"Base Address",        0,          1},
4352 +   {"Offset (VLYNQ)",      0,          0},
4353 +   {"Interrupt Line",      0,          0},
4354 +   {"Debug",               0,          0},
4355 +   {"Instance",            0,          0},
4356 +#ifdef _CPHAL_AAL5
4357 +   {"UniNni",              0,          0}
4358 +#endif
4359 +  };
4360 +
4361 +static STATS_DB StatsDb[] =
4362 +  {
4363 +    {(sizeof(StatsTable0)/sizeof(STATS_TABLE)), StatsTable0},
4364 +    {(sizeof(StatsTable1)/sizeof(STATS_TABLE)), StatsTable1},
4365 +    {(sizeof(StatsTable2)/sizeof(STATS_TABLE)), StatsTable2},
4366 +    {(sizeof(StatsTable3)/sizeof(STATS_TABLE)), StatsTable3},
4367 +    {(sizeof(StatsTable4)/sizeof(STATS_TABLE)), StatsTable4}
4368 +  };
4369 +#endif /* +GSG 030307 */
4370 +
4371 +#ifdef _CPHAL_CPMAC /* +RC 3.02 */
4372 +static void resetWait(HAL_DEVICE *HalDev)
4373 +  {                                                                  /*+RC3.02*/
4374 +  const int TickReset=64;
4375 +  osfuncSleep((int*)&TickReset);
4376 +  }                                                                  /*+RC3.02*/
4377 +#endif /* +RC 3.02 */
4378 +
4379 +/* I only define the reset base function for the modules
4380 +   that can perform a reset.  The AAL5 and AAL2 modules
4381 +   do not perform a reset, that is done by the shared module
4382 +   CPSAR */
4383 +#if defined(_CPHAL_CPSAR) || defined(_CPHAL_CPMAC) || defined(_CPHAL_VDMAVT)
4384 +/*
4385 + *  Determines the reset register address to be used for a particular device.
4386 + *  It will search the current device entry for Locator information.  If the
4387 + *  device is a root device, there will be no Locator information, and the
4388 + *  function will find and return the root reset register.  If a Locator value
4389 + *  is found, the function will search each VLYNQ device entry in the system
4390 + *  looking for a matching Locator.  Once it finds a VLYNQ device entry with
4391 + *  a matching Locator, it will extract the "ResetBase" parameter from that
4392 + *  VLYNQ device entry (thus every VLYNQ entry must have the ResetBase parameter).
4393 + *
4394 + *  @param  HalDev   CPHAL module instance. (set by xxxInitModule())
4395 + *  @param  ResetBase Pointer to integer address of reset register.
4396 + *
4397 + *  @return 0 OK, Non-zero not OK
4398 + */
4399 +static int ResetBaseGet(HAL_DEVICE *HalDev, bit32u *ResetBase)
4400 +  {
4401 +   char *DeviceInfo = HalDev->DeviceInfo;
4402 +   char *MyLocator, *NextLocator;
4403 +   int Inst=1;
4404 +   bit32u error_code;
4405 +
4406 +#ifdef __CPHAL_DEBUG
4407 +   if (DBG(0))
4408 +     {
4409 +      dbgPrintf("[cpcommon]ResetBaseGet(HalDev:%08x, ResetBase:%08x)\n", (bit32u)HalDev, ResetBase);
4410 +      osfuncSioFlush();
4411 +     }
4412 +#endif
4413 +
4414 +   error_code = HalDev->OsFunc->DeviceFindParmValue(DeviceInfo, "Locator", &MyLocator);
4415 +   if (error_code)
4416 +     {
4417 +      /* if no Locator value, device is on the root, so get the "reset" device */
4418 +      error_code = HalDev->OsFunc->DeviceFindInfo(0, "reset", &DeviceInfo);
4419 +      if  (error_code)
4420 +        {
4421 +         return(EC_VAL_DEVICE_NOT_FOUND);
4422 +        }
4423 +
4424 +      error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, "base", ResetBase);
4425 +      if (error_code)
4426 +        {
4427 +         return(EC_VAL_BASE_ADDR_NOT_FOUND);
4428 +        }
4429 +
4430 +      *ResetBase = ((bit32u)PhysToVirtNoCache(*ResetBase));
4431 +
4432 +      /* found base address for root device, so we're done */
4433 +      return (EC_NO_ERRORS);
4434 +     }
4435 +    else
4436 +     {
4437 +      /* we have a Locator value, so the device is remote */
4438 +
4439 +      /* Find a vlynq device with a matching locator value */
4440 +      while ((HalDev->OsFunc->DeviceFindInfo(Inst, "vlynq", &DeviceInfo)) == EC_NO_ERRORS)
4441 +        {
4442 +         error_code = HalDev->OsFunc->DeviceFindParmValue(DeviceInfo, "Locator", &NextLocator);
4443 +         if (error_code)
4444 +           {
4445 +            /* no Locator value for this VLYNQ, so move on */
4446 +            continue;
4447 +           }
4448 +         if (HalDev->OsFunc->Strcmpi(MyLocator, NextLocator)==0)
4449 +           {
4450 +            /* we have found a VLYNQ with a matching Locator, so extract the ResetBase */
4451 +            error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, "ResetBase", ResetBase);
4452 +            if (error_code)
4453 +              {
4454 +               return(EC_VAL_BASE_ADDR_NOT_FOUND);
4455 +              }
4456 +            *ResetBase = ((bit32u)PhysToVirtNoCache(*ResetBase));
4457 +
4458 +            /* found base address for root device, so we're done */
4459 +            return (EC_NO_ERRORS);
4460 +           }
4461 +         Inst++;
4462 +        } /* while */
4463 +     } /* else */
4464 +
4465 +   return (EC_NO_ERRORS);
4466 +  }
4467 +#endif
4468 +
4469 +#ifndef _CPHAL_AAL2 /* + RC 3.02 */
4470 +static bit32u ConfigGetCommon(HAL_DEVICE *HalDev)
4471 +  {
4472 +   bit32u ParmValue;
4473 +   bit32 error_code;
4474 +   char *DeviceInfo = HalDev->DeviceInfo;
4475 +
4476 +#ifdef __CPHAL_DEBUG
4477 +   if (DBG(0))
4478 +     {
4479 +      dbgPrintf("[cpcommon]ConfigGetCommon(HalDev:%08x)\n", (bit32u)HalDev);
4480 +      osfuncSioFlush();
4481 +     }
4482 +#endif
4483 +
4484 +   error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszBase, &ParmValue);
4485 +   if (error_code)
4486 +     {
4487 +      return(EC_FUNC_HAL_INIT|EC_VAL_BASE_ADDR_NOT_FOUND);
4488 +     }
4489 +   HalDev->dev_base = ((bit32u)PhysToVirtNoCache(ParmValue));
4490 +
4491 +#ifndef _CPHAL_AAL5
4492 +#ifndef _CPHAL_AAL2
4493 +   error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszResetBit, &ParmValue);
4494 +   if(error_code)
4495 +     {
4496 +      return(EC_FUNC_HAL_INIT|EC_VAL_RESET_BIT_NOT_FOUND);
4497 +     }
4498 +   HalDev->ResetBit = ParmValue;
4499 +
4500 +   /* Get reset base address */
4501 +   error_code = ResetBaseGet(HalDev, &ParmValue);
4502 +   if (error_code)
4503 +     return(EC_FUNC_HAL_INIT|EC_VAL_RESET_BASE_NOT_FOUND);
4504 +   HalDev->ResetBase = ParmValue;
4505 +#endif
4506 +#endif
4507 +
4508 +#ifndef _CPHAL_CPSAR
4509 +   error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszIntLine,&ParmValue);
4510 +   if (error_code)
4511 +     {
4512 +      return(EC_FUNC_HAL_INIT|EC_VAL_INTERRUPT_NOT_FOUND);
4513 +     }
4514 +   HalDev->interrupt = ParmValue;
4515 +#endif
4516 +
4517 +   /* only look for the offset if there is a Locator field, which indicates that
4518 +      the module is a VLYNQ module */
4519 +   error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszLocator,&ParmValue);
4520 +   if (!error_code)
4521 +     {
4522 +      error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszOffset,&ParmValue);
4523 +      if (error_code)
4524 +        {
4525 +         return(EC_FUNC_HAL_INIT|EC_VAL_OFFSET_NOT_FOUND);
4526 +        }
4527 +      HalDev->offset = ParmValue;
4528 +     }
4529 +    else
4530 +      HalDev->offset = 0;
4531 +
4532 +   error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo, pszDebug, &ParmValue);
4533 +   if (!error_code) HalDev->debug = ParmValue;
4534 +
4535 +   return (EC_NO_ERRORS);
4536 +  }
4537 +#endif /* +RC 3.02 */
4538 +
4539 +#ifdef _CPHAL_CPMAC /* +RC 3.02 */
4540 +static void StatsInit(HAL_DEVICE *HalDev)                             /* +() RC3.02 */
4541 +  {
4542 +   /* even though these statistics may be for multiple channels and
4543 +      queues, i need only configure the pointer to the beginning
4544 +      of the array, and I can index from there if necessary */
4545 +
4546 +#ifdef _CPHAL_AAL5
4547 +   StatsTable0[0].StatPtr  = &HalDev->Stats.CrcErrors[0];
4548 +   StatsTable0[1].StatPtr  = &HalDev->Stats.LenErrors[0];
4549 +   StatsTable0[2].StatPtr  = &HalDev->Stats.AbortErrors[0];
4550 +   StatsTable0[3].StatPtr  = &HalDev->Stats.StarvErrors[0];
4551 +
4552 +   StatsTable1[0].StatPtr  = &HalDev->Stats.DmaLenErrors[0];
4553 +   StatsTable1[1].StatPtr  = &HalDev->Stats.TxMisQCnt[0][0];
4554 +   StatsTable1[2].StatPtr  = &HalDev->Stats.RxMisQCnt[0];
4555 +   StatsTable1[3].StatPtr  = &HalDev->Stats.TxEOQCnt[0][0];
4556 +   StatsTable1[4].StatPtr  = &HalDev->Stats.RxEOQCnt[0];
4557 +   StatsTable1[5].StatPtr  = &HalDev->Stats.RxPacketsServiced[0];
4558 +   StatsTable1[6].StatPtr  = &HalDev->Stats.TxPacketsServiced[0][0];
4559 +   StatsTable1[7].StatPtr  = &HalDev->Stats.RxMaxServiced;
4560 +   StatsTable1[8].StatPtr  = &HalDev->Stats.TxMaxServiced[0][0];
4561 +   StatsTable1[9].StatPtr  = &HalDev->Stats.RxTotal;
4562 +   StatsTable1[10].StatPtr = &HalDev->Stats.TxTotal;
4563 +#endif
4564 +
4565 +#if (defined(_CPHAL_AAL5) || defined(_CPHAL_CPMAC))
4566 +   StatsTable2[0].StatPtr  = (bit32u *)&HalDev->RcbPool[0];
4567 +   StatsTable2[1].StatPtr  = &HalDev->RxActQueueCount[0];
4568 +   StatsTable2[2].StatPtr  = (bit32u *)&HalDev->RxActQueueHead[0];
4569 +   StatsTable2[3].StatPtr  = (bit32u *)&HalDev->RxActQueueTail[0];
4570 +   StatsTable2[4].StatPtr  = &HalDev->RxActive[0];
4571 +   StatsTable2[5].StatPtr  = (bit32u *)&HalDev->RcbStart[0];
4572 +   StatsTable2[6].StatPtr  = &HalDev->RxTeardownPending[0];
4573 +   StatsTable2[7].StatPtr  = (bit32u *)&HalDev->TcbPool[0][0];
4574 +   StatsTable2[8].StatPtr  = &HalDev->TxActQueueCount[0][0];
4575 +   StatsTable2[9].StatPtr  = (bit32u *)&HalDev->TxActQueueHead[0][0];
4576 +   StatsTable2[10].StatPtr = (bit32u *)&HalDev->TxActQueueTail[0][0];
4577 +   StatsTable2[11].StatPtr = &HalDev->TxActive[0][0];
4578 +   StatsTable2[12].StatPtr = (bit32u *)&HalDev->TcbStart[0][0];
4579 +   StatsTable2[13].StatPtr = &HalDev->TxTeardownPending[0];
4580 +
4581 +   StatsTable3[0].StatPtr  = &HalDev->ChData[0].RxBufSize;
4582 +   StatsTable3[1].StatPtr  = &HalDev->ChData[0].RxBufferOffset;
4583 +   StatsTable3[2].StatPtr  = &HalDev->ChData[0].RxNumBuffers;
4584 +   StatsTable3[3].StatPtr  = &HalDev->ChData[0].RxServiceMax;
4585 +   StatsTable3[4].StatPtr  = &HalDev->ChData[0].TxNumBuffers;
4586 +   StatsTable3[5].StatPtr  = &HalDev->ChData[0].TxNumQueues;
4587 +   StatsTable3[6].StatPtr  = &HalDev->ChData[0].TxServiceMax;
4588 +#ifdef _CPHAL_AAL5
4589 +   StatsTable3[7].StatPtr  = &HalDev->ChData[0].CpcsUU;
4590 +   StatsTable3[8].StatPtr  = &HalDev->ChData[0].Gfc;
4591 +   StatsTable3[9].StatPtr  = &HalDev->ChData[0].Clp;
4592 +   StatsTable3[10].StatPtr = &HalDev->ChData[0].Pti;
4593 +   StatsTable3[11].StatPtr = &HalDev->ChData[0].DaMask;
4594 +   StatsTable3[12].StatPtr = &HalDev->ChData[0].Priority;
4595 +   StatsTable3[13].StatPtr = &HalDev->ChData[0].PktType;
4596 +   StatsTable3[14].StatPtr = &HalDev->ChData[0].Vci;
4597 +   StatsTable3[15].StatPtr = &HalDev->ChData[0].Vpi;
4598 +   StatsTable3[16].StatPtr = &HalDev->ChData[0].TxVc_CellRate;
4599 +   StatsTable3[17].StatPtr = &HalDev->ChData[0].TxVc_QosType;
4600 +   StatsTable3[18].StatPtr = &HalDev->ChData[0].TxVc_Mbs;
4601 +   StatsTable3[19].StatPtr = &HalDev->ChData[0].TxVc_Pcr;
4602 +#endif
4603 +#endif
4604 +
4605 +   StatsTable4[0].StatPtr  = &HalDev->dev_base;
4606 +   StatsTable4[1].StatPtr  = &HalDev->offset;
4607 +   StatsTable4[2].StatPtr  = &HalDev->interrupt;
4608 +   StatsTable4[3].StatPtr  = &HalDev->debug;
4609 +   StatsTable4[4].StatPtr  = &HalDev->Inst;
4610 +  }
4611 +#endif /* +RC 3.02 */
4612 +
4613 +#ifndef _CPHAL_CPSAR /* +RC 3.02 */
4614 +#ifndef _CPHAL_AAL2 /* +RC 3.02 */
4615 +/*
4616 + *  Returns statistics information.
4617 + *
4618 + *  @param  HalDev   CPHAL module instance. (set by xxxInitModule())
4619 + *
4620 + *  @return 0
4621 + */
4622 +static int StatsGet(HAL_DEVICE *HalDev, void **StatPtr, int Index, int Ch, int Queue)
4623 +  {
4624 +   int Size;
4625 +   bit32u *AddrPtr;
4626 +   char *DataPtr;
4627 +   STATS_TABLE *StatsTable;
4628 +   int i, NumberOfStats;
4629 +
4630 +#ifdef __CPHAL_DEBUG
4631 +   if (DBG(0))
4632 +     {
4633 +      dbgPrintf("[cpcommon]StatsGet(HalDev:%08x, StatPtr:%08x)\n",
4634 +                (bit32u)HalDev, (bit32u)StatPtr);
4635 +      osfuncSioFlush();
4636 +     }
4637 +#endif
4638 +
4639 +   StatsTable = StatsDb[Index].StatTable;
4640 +   NumberOfStats = StatsDb[Index].NumberOfStats;
4641 +
4642 +   Size = sizeof(bit32u)*((NumberOfStats*2)+1);
4643 +   Size += (NumberOfStats*11);
4644 +   *StatPtr = (bit32u *)HalDev->OsFunc->Malloc(Size);
4645 +
4646 +   AddrPtr = (bit32u *) *StatPtr;
4647 +   DataPtr = (char *)AddrPtr;
4648 +   DataPtr += sizeof(bit32u)*((NumberOfStats*2)+1);
4649 +
4650 +   for (i=0; i<NumberOfStats; i++)
4651 +     {
4652 +      *AddrPtr++ = (bit32u)StatsTable[i].StatName;
4653 +      *AddrPtr++ = (bit32u)DataPtr;
4654 +      if (&StatsTable[i].StatPtr[Ch] != 0)
4655 +        {
4656 +         switch(StatsTable[i].DataType)
4657 +           {
4658 +            case 0:
4659 +              HalDev->OsFunc->Sprintf(DataPtr, "%d", (bit32u *)StatsTable[i].StatPtr[Ch]);
4660 +              break;
4661 +            case 1:
4662 +              HalDev->OsFunc->Sprintf(DataPtr, "0x%x", (bit32u *)StatsTable[i].StatPtr[Ch]);
4663 +              break;
4664 +            case 2:
4665 +              HalDev->OsFunc->Sprintf(DataPtr, "%d", *((bit32u *)StatsTable[i].StatPtr + (Ch * (sizeof(CHANNEL_INFO)/4))));
4666 +              break;
4667 +            case 3:
4668 +              HalDev->OsFunc->Sprintf(DataPtr, "%d", *((bit32u *)StatsTable[i].StatPtr + (Ch*MAX_QUEUE)+Queue));
4669 +              break;
4670 +            case 4:
4671 +              HalDev->OsFunc->Sprintf(DataPtr, "0x%x", *((bit32u *)StatsTable[i].StatPtr + (Ch*MAX_QUEUE)+Queue));
4672 +              break;
4673 +            default:
4674 +              /* invalid data type, due to CPHAL programming error */
4675 +              break;
4676 +           }
4677 +        }
4678 +       else
4679 +        {
4680 +         /* invalid statistics pointer, probably was not initialized */
4681 +        }
4682 +      DataPtr += HalDev->OsFunc->Strlen(DataPtr) + 1;
4683 +     }
4684 +
4685 +   *AddrPtr = (bit32u) 0;
4686 +
4687 +   return (EC_NO_ERRORS);
4688 +  }
4689 +#endif /* +RC 3.02 */
4690 +#endif /* +RC 3.02 */
4691 +
4692 +#ifdef _CPHAL_CPMAC
4693 +static void gpioFunctional(int base, int bit)
4694 +  {                                                                  /*+RC3.02*/
4695 +  bit32u GpioEnr = base + 0xC;
4696 +  /*  To make functional, set to zero  */
4697 +  *(volatile bit32u *)(GpioEnr) &= ~(1 << bit);                      /*+RC3.02*/
4698 +  }                                                                  /*+RC3.02*/
4699 +
4700 +
4701 +/*+RC3.02*/
4702 +/* Common function, Checks to see if GPIO should be in functional mode */
4703 +static void gpioCheck(HAL_DEVICE *HalDev, void *moduleDeviceInfo)
4704 +  {                                                                  /*+RC3.02*/
4705 +  int rc;
4706 +  void *DeviceInfo;
4707 +  char *pszMuxBits;
4708 +  char pszMuxBit[20];
4709 +  char *pszTmp;
4710 +  char szMuxBit[20];
4711 +  char *ptr;
4712 +  int base;
4713 +  int reset_bit;
4714 +  int bit;
4715 +  OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
4716 +
4717 +  rc = OsFunc->DeviceFindParmValue(moduleDeviceInfo, "gpio_mux",&pszTmp);
4718 +  if(rc) return;
4719 +  /*  gpio entry found, get GPIO register info and make functional  */
4720 +
4721 +  /* temp copy until FinParmValue fixed */
4722 +  ptr = &szMuxBit[0];
4723 +  while ((*ptr++ = *pszTmp++));
4724 +
4725 +  pszMuxBits = &szMuxBit[0];
4726 +
4727 +  rc = OsFunc->DeviceFindInfo(0,"gpio",&DeviceInfo);
4728 +  if(rc) return;
4729 +
4730 +  rc = OsFunc->DeviceFindParmUint(DeviceInfo, "base",&base);
4731 +  if(rc) return;
4732 +
4733 +  rc = OsFunc->DeviceFindParmUint(DeviceInfo, "reset_bit",&reset_bit);
4734 +  if(rc) return;
4735 +
4736 +  /* If GPIO still in reset, then exit  */
4737 +  if((VOLATILE32(HalDev->ResetBase) & (1 << reset_bit)) == 0)
4738 +    return;
4739 +  /*  format for gpio_mux is  gpio_mux = <int>;<int>;<int>...*/
4740 +  while (*pszMuxBits)
4741 +    {
4742 +    pszTmp = &pszMuxBit[0];
4743 +    if(*pszMuxBits == ';') pszMuxBits++;
4744 +    while ((*pszMuxBits != ';') && (*pszMuxBits != '\0'))
4745 +      {
4746 +      osfuncSioFlush();
4747 +      /*If value not a number, skip */
4748 +      if((*pszMuxBits < '0') || (*pszMuxBits > '9'))
4749 +        pszMuxBits++;
4750 +      else
4751 +        *pszTmp++ = *pszMuxBits++;
4752 +      }
4753 +    *pszTmp = '\0';
4754 +    bit = OsFunc->Strtoul(pszMuxBit, &pszTmp, 10);
4755 +    gpioFunctional(base, bit);
4756 +    resetWait(HalDev);  /* not sure if this is needed */
4757 +    }
4758 +  }                                                                  /*+RC3.02*/
4759 +#endif  /* CPMAC  */
4760 +
4761 +#ifdef _CPHAL_AAL5
4762 +const char hcSarFrequency[] = "SarFreq";
4763 +#endif
4764 +
4765 +#endif  /* _INC  */
4766 diff -urN linux.old/drivers/atm/sangam_atm/cpcommon_cpsar.h linux.dev/drivers/atm/sangam_atm/cpcommon_cpsar.h
4767 --- linux.old/drivers/atm/sangam_atm/cpcommon_cpsar.h   1970-01-01 01:00:00.000000000 +0100
4768 +++ linux.dev/drivers/atm/sangam_atm/cpcommon_cpsar.h   2005-08-23 04:46:50.083845824 +0200
4769 @@ -0,0 +1,79 @@
4770 +#ifndef _INC_CPCOMMON_H
4771 +#define _INC_CPCOMMON_H
4772 +
4773 +#define VOLATILE32(addr)  (*(volatile bit32u *)(addr))
4774 +#ifndef dbgPrintf
4775 +#define dbgPrintf HalDev->OsFunc->Printf
4776 +#endif
4777 +
4778 +#define ChannelUpdate(Field) if(HalChn->Field != 0xFFFFFFFF) HalDev->ChData[Ch].Field = HalChn->Field
4779 +
4780 +#define DBG(level)  (HalDev->debug & (1<<(level)))
4781 +/*
4782 +#define DBG0()      DBG(0)
4783 +#define DBG1()      DBG(1)
4784 +#define DBG2()      DBG(2)
4785 +#define DBG3()      DBG(3)
4786 +#define DBG4()      DBG(4)
4787 +#define DBG5()      DBG(5)
4788 +#define DBG6()      DBG(6)
4789 +#define DBG7()      DBG(7)
4790 +*/
4791 +
4792 +/*
4793 + *  List of defined actions for use with Control().
4794 + */
4795 +typedef enum 
4796 +  {
4797 +   enGET=0,     /**< Get the value associated with a key */
4798 +   enSET,       /**< Set the value associates with a key */
4799 +   enCLEAR,     /**<Clear the value */ 
4800 +   enNULL       /**< No data action, used to initiate a service or send a message */
4801 +  }ACTION;
4802 +
4803 +/*
4804 + *  Enumerated hardware states.
4805 + */
4806 +typedef enum
4807 +  {
4808 +   enConnected=1, enDevFound, enInitialized, enOpened
4809 +  }DEVICE_STATE;
4810 +
4811 +typedef enum 
4812 +  {
4813 +   enCommonStart=0,
4814 +   /* General  */
4815 +   enOff, enOn, enDebug, 
4816 +   /* Module General */
4817 +   enCpuFreq, 
4818 +   enStatus,
4819 +   enCommonEnd
4820 +   }COMMON_KEY;
4821 +
4822 +typedef struct
4823 +  {
4824 +   const char  *strKey;
4825 +   int  enKey;
4826 +  }CONTROL_KEY;
4827 +
4828 +typedef struct
4829 +  {
4830 +   char *StatName;
4831 +   unsigned int *StatPtr;
4832 +   int DataType; /* 0: int, 1: hex int, 2:channel data */
4833 +  }STATS_TABLE;
4834 +
4835 +typedef struct
4836 +  {
4837 +   int NumberOfStats;
4838 +   STATS_TABLE *StatTable;
4839 +  }STATS_DB;
4840 +
4841 +#define osfuncSioFlush()    HalDev->OsFunc->Control(HalDev->OsDev,"SioFlush",pszNULL,0)
4842 +#define osfuncSleep(Ticks)  HalDev->OsFunc->Control(HalDev->OsDev,pszSleep,pszNULL,Ticks)
4843 +#define osfuncStateChange() HalDev->OsFunc->Control(HalDev->OsDev,pszStateChange,pszNULL,0)
4844 +
4845 +#define CHANNEL_NAMES {"Ch0","Ch1","Ch2","Ch3","Ch4","Ch5","Ch6","Ch7","Ch8","Ch9","Ch10","Ch11","Ch12","Ch13","Ch14","Ch15"}
4846 +
4847 +#endif
4848 +
4849 diff -urN linux.old/drivers/atm/sangam_atm/cppi_cpaal5.c linux.dev/drivers/atm/sangam_atm/cppi_cpaal5.c
4850 --- linux.old/drivers/atm/sangam_atm/cppi_cpaal5.c      1970-01-01 01:00:00.000000000 +0100
4851 +++ linux.dev/drivers/atm/sangam_atm/cppi_cpaal5.c      2005-08-23 04:46:50.084845672 +0200
4852 @@ -0,0 +1,1483 @@
4853 +/*************************************************************************
4854 + *  TNETDxxxx Software Support
4855 + *  Copyright (c) 2002,2003 Texas Instruments Incorporated. All Rights Reserved.
4856 + *
4857 + *  FILE: cppi.c
4858 + *
4859 + *  DESCRIPTION:
4860 + *      This file contains shared code for all CPPI modules.
4861 + *
4862 + *  HISTORY:
4863 + *   7Aug02 Greg RC1.00  Original Version created.
4864 + *  27Sep02 Mick RC1.01  Merged for use by CPMAC/CPSAR
4865 + *  16Oct02 Mick RC1.02  Performance Tweaks (see cppihist.txt)
4866 + *  12Nov02 Mick RC1.02  Updated to use cpmac_reg.h
4867 + *  09Jan03 Mick RC3.01  Removed modification to RxBuffer ptr
4868 + *  28Mar03 Mick 1.03    RxReturn now returns error if Malloc Fails
4869 + *  10Apr03 Mick 1.03.02 Added Needs Buffer Support
4870 + *  11Jun03 Mick 1.06.02 halSend() errors corrected
4871 + *
4872 + *  @author  Greg Guyotte
4873 + *  @version 1.00
4874 + *  @date    7-Aug-2002
4875 + *****************************************************************************/
4876 +/* each CPPI module must modify this file, the rest of the
4877 +                     code in cppi.c should be totally shared *//* Each CPPI module MUST properly define all constants shown below */
4878 +
4879 +/* CPPI registers */
4880 +
4881 +/* the following defines are not CPPI specific, but still used by cppi.c */
4882 +
4883 +static void FreeRx(HAL_DEVICE *HalDev, int Ch)
4884 +  {
4885 +   HAL_RCB *rcb_ptr;                                                /*+GSG 030303*/
4886 +   int rcbSize = (sizeof(HAL_RCB)+0xf)&~0xf;                        /*+GSG 030303*/
4887 +   int Num = HalDev->ChData[Ch].RxNumBuffers, i;                    /*+GSG 030303*/
4888 +
4889 +   /* Free Rx data buffers attached to descriptors, if necessary */
4890 +   if (HalDev->RcbStart[Ch] != 0)                                   /*+GSG 030303*/
4891 +     {                                                              /*+GSG 030303*/
4892 +      for(i=0;i<Num;i++)                                            /*+GSG 030303*/
4893 +        {                                                           /*+GSG 030303*/
4894 +         rcb_ptr = (HAL_RCB *)(HalDev->RcbStart[Ch] + (i*rcbSize)); /*+GSG 030303*/
4895 +
4896 +         /* free the data buffer */
4897 +         if (rcb_ptr->DatPtr != 0)
4898 +       {
4899 +
4900 +        HalDev->OsFunc->FreeRxBuffer((void *)rcb_ptr->OsInfo, (void *)rcb_ptr->DatPtr);
4901 +        rcb_ptr->OsInfo=0;                                        /*MJH+030522*/
4902 +        rcb_ptr->DatPtr=0;                                        /*MJH+030522*/
4903 +       }
4904 +    }                                                           /*+GSG 030303*/
4905 +     }                                                              /*+GSG 030303*/
4906 +
4907 +   /* free up all desciptors at once */
4908 +   HalDev->OsFunc->FreeDmaXfer(HalDev->RcbStart[Ch]);
4909 +
4910 +   /* mark buffers as freed */
4911 +   HalDev->RcbStart[Ch] = 0;
4912 +  }
4913 +
4914 +static void FreeTx(HAL_DEVICE *HalDev, int Ch, int Queue)
4915 +  {
4916 +
4917 +/*+GSG 030303*/
4918 +
4919 +   /* free all descriptors at once */
4920 +   HalDev->OsFunc->FreeDmaXfer(HalDev->TcbStart[Ch][Queue]);
4921 +
4922 +   HalDev->TcbStart[Ch][Queue] = 0;
4923 +  }
4924 +
4925 +/* return of 0 means that this code executed, -1 means the interrupt was not
4926 +   a teardown interrupt */
4927 +static int RxTeardownInt(HAL_DEVICE *HalDev, int Ch)
4928 +  {
4929 +   bit32u base = HalDev->dev_base;
4930 +
4931 +   int i;
4932 +   volatile bit32u *pTmp;
4933 +
4934 +   /* check to see if the interrupt is a teardown interrupt */
4935 +   if (((*(pRX_CPPI_COMP_PTR( base )+( Ch *64)))  & TEARDOWN_VAL) == TEARDOWN_VAL)
4936 +     {
4937 +      /* finish channel teardown */
4938 +
4939 +      /* Free channel resources on a FULL teardown */
4940 +      if (HalDev->RxTeardownPending[Ch] & FULL_TEARDOWN)
4941 +        {
4942 +         FreeRx(HalDev, Ch);
4943 +        }
4944 +
4945 +      /* bug fix - clear Rx channel pointers on teardown */
4946 +      HalDev->RcbPool[Ch] = 0;
4947 +      HalDev->RxActQueueHead[Ch]  = 0;
4948 +      HalDev->RxActQueueCount[Ch] = 0;
4949 +      HalDev->RxActive[Ch] = FALSE;
4950 +
4951 +      /* write completion pointer */
4952 +      (*(pRX_CPPI_COMP_PTR( base )+( Ch *64)))  = TEARDOWN_VAL;
4953 +
4954 +      /* use direction bit as a teardown pending bit! May be able to
4955 +         use only one teardown pending integer in HalDev */
4956 +
4957 +      HalDev->RxTeardownPending[Ch] &= ~RX_TEARDOWN;
4958 +
4959 +      HalDev->ChIsOpen[Ch][DIRECTION_RX] = 0;
4960 +
4961 +      /* call OS Teardown Complete (if TX is also done) */
4962 +      if ((HalDev->TxTeardownPending[Ch] & TX_TEARDOWN) == 0)
4963 +    {
4964 +     /* mark channel as closed */
4965 +         HalDev->ChIsOpen[Ch][DIRECTION_TX] = 0;
4966 +
4967 +     /* disable channel interrupt */
4968 +     SAR_TX_MASK_CLR(HalDev->dev_base) = (1<<Ch);
4969 +         SAR_TX_MASK_CLR(HalDev->dev_base) = (1<<(Ch+16)); /* +GSG 030307 */
4970 +     SAR_RX_MASK_CLR(HalDev->dev_base) = (1<<Ch);
4971 +
4972 +     /* Clear PDSP Channel State RAM */
4973 +     pTmp = (pPDSP_BLOCK_0(HalDev->dev_base)+(Ch*64));
4974 +     for (i=0; i<NUM_PDSP_AAL5_STATE_WORDS; i++)
4975 +       *pTmp++ = 0;
4976 +
4977 +     if ((HalDev->RxTeardownPending[Ch] & BLOCKING_TEARDOWN) == 0)
4978 +       {
4979 +
4980 +        HalDev->OsFunc->TeardownComplete(HalDev->OsDev, Ch, DIRECTION_TX|DIRECTION_RX);
4981 +       }
4982 +     /* clear all teardown pending information for this channel */
4983 +     HalDev->RxTeardownPending[Ch] = 0;
4984 +     HalDev->TxTeardownPending[Ch] = 0;
4985 +    }
4986 +
4987 +      return (EC_NO_ERRORS);
4988 +     }
4989 +   return (-1);
4990 +  }
4991 +
4992 +/* return of 0 means that this code executed, -1 means the interrupt was not
4993 +   a teardown interrupt */
4994 +static int TxTeardownInt(HAL_DEVICE *HalDev, int Ch, int Queue)
4995 +  {
4996 +   bit32u base = HalDev->dev_base;
4997 +   HAL_TCB *Last, *Curr, *First;                                    /*+GSG 030303*/
4998 +
4999 +   int i;
5000 +   volatile bit32u *pTmp;
5001 +
5002 +   if (((*(pTXH_CPPI_COMP_PTR( base )+( Ch *64)+( Queue )))  & TEARDOWN_VAL) == TEARDOWN_VAL)
5003 +     {
5004 +      /* return outstanding buffers to OS                             +RC3.02*/
5005 +      Curr = HalDev->TxActQueueHead[Ch][Queue];                     /*+GSG 030303*/
5006 +      First = Curr;                                                 /*+GSG 030303*/
5007 +      while (Curr)                                                  /*+GSG 030303*/
5008 +    {                                                           /*+GSG 030303*/
5009 +     /* Pop TCB(s) for packet from the stack */                 /*+GSG 030303*/
5010 +         Last = Curr->Eop;                                          /*+GSG 030303*/
5011 +         HalDev->TxActQueueHead[Ch][Queue] = Last->Next;            /*+GSG 030303*/
5012 +                                                                    /*+GSG 030303*/
5013 +         /* return to OS */                                         /*+GSG 030303*/
5014 +         HalDev->OsFunc->SendComplete(Curr->OsInfo);                /*+GSG 030303*/
5015 +                                                                    /*+GSG 030303*/
5016 +         /* Push Tcb(s) back onto the stack */                      /*+GSG 030303*/
5017 +         Curr = Last->Next;                                         /*+GSG 030303*/
5018 +         Last->Next = HalDev->TcbPool[Ch][Queue];                   /*+GSG 030303*/
5019 +         HalDev->TcbPool[Ch][Queue] = First;                        /*+GSG 030303*/
5020 +                                                                    /*+GSG 030303*/
5021 +         /* set the first(SOP) pointer for the next packet */       /*+GSG 030303*/
5022 +         First = Curr;                                              /*+GSG 030303*/
5023 +    }                                                           /*+GSG 030303*/
5024 +
5025 +      /* finish channel teardown */
5026 +
5027 +      /* save the OsInfo to pass to upper layer
5028 +         THIS WAS CRASHING - because it's possible that I get the teardown
5029 +     notification and the TcbHPool is null.  In this case, the buffers
5030 +     to free can be found in the TxHActiveQueue.  If I need to get OsInfo
5031 +     in the future, I can get it from one of those buffers.
5032 +     OsInfo = HalDev->TcbHPool[Ch]->OsInfo; */
5033 +
5034 +      if (HalDev->TxTeardownPending[Ch] & FULL_TEARDOWN)
5035 +        {
5036 +     FreeTx(HalDev, Ch, Queue);
5037 +    } /* if FULL teardown */
5038 +
5039 +      /* bug fix - clear Tx channel pointers on teardown */
5040 +      HalDev->TcbPool[Ch][Queue] = 0;
5041 +      HalDev->TxActQueueHead[Ch][Queue]  = 0;
5042 +      HalDev->TxActQueueCount[Ch][Queue] = 0;
5043 +      HalDev->TxActive[Ch][Queue]        = FALSE;
5044 +
5045 +      /* write completion pointer */
5046 +      (*(pTXH_CPPI_COMP_PTR( base )+( Ch *64)+( Queue )))  = TEARDOWN_VAL;
5047 +
5048 +      /* no longer pending teardown */
5049 +      HalDev->TxTeardownPending[Ch] &= ~TX_TEARDOWN;
5050 +
5051 +      HalDev->ChIsOpen[Ch][DIRECTION_TX] = 0;
5052 +
5053 +      /* call OS Teardown Complete (if Rx is also done) */
5054 +      if ((HalDev->RxTeardownPending[Ch] & RX_TEARDOWN) == 0)
5055 +    {
5056 +     /* mark channel as closed */
5057 +     HalDev->ChIsOpen[Ch][DIRECTION_RX] = 0;
5058 +
5059 +     /* disable channel interrupt */
5060 +     SAR_TX_MASK_CLR(HalDev->dev_base) = (1<<Ch);
5061 +         SAR_TX_MASK_CLR(HalDev->dev_base) = (1<<(Ch+16)); /* +GSG 030307 */
5062 +     SAR_RX_MASK_CLR(HalDev->dev_base) = (1<<Ch);
5063 +
5064 +     /* Clear PDSP Channel State RAM */
5065 +     pTmp = (pPDSP_BLOCK_0(HalDev->dev_base)+(Ch*64));
5066 +     for (i=0; i<NUM_PDSP_AAL5_STATE_WORDS; i++)
5067 +       *pTmp++ = 0;
5068 +
5069 +     if ((HalDev->TxTeardownPending[Ch] & BLOCKING_TEARDOWN) == 0)
5070 +       {
5071 +
5072 +        HalDev->OsFunc->TeardownComplete(HalDev->OsDev, Ch, DIRECTION_TX|DIRECTION_RX);
5073 +       }
5074 +
5075 +     /* clear all teardown pending information for this channel */
5076 +     HalDev->RxTeardownPending[Ch] = 0;
5077 +     HalDev->TxTeardownPending[Ch] = 0;
5078 +    }
5079 +
5080 +      return (EC_NO_ERRORS);
5081 +     }
5082 +   return (-1);
5083 +  }
5084 +
5085 +/* +GSG 030421 */
5086 +static void AddToRxQueue(HAL_DEVICE *HalDev, HAL_RCB *FirstRcb, HAL_RCB *LastRcb, int FragCount, int Ch)
5087 +  {
5088 +   HAL_RCB *OldTailRcb;
5089 +
5090 +   if (HalDev->RxActQueueCount[Ch]==0)
5091 +     {
5092 +
5093 +      HalDev->RxActQueueHead[Ch]=FirstRcb;
5094 +      HalDev->RxActQueueTail[Ch]=LastRcb;
5095 +      HalDev->RxActQueueCount[Ch]=FragCount;
5096 +      if ((!HalDev->InRxInt[Ch])&&(!HalDev->RxActive[Ch]))
5097 +        {
5098 +         /* write Rx Queue Head Descriptor Pointer */
5099 +         (*(pRX_DMA_STATE_WORD_1( HalDev->dev_base )+( Ch *64)))  = VirtToPhys(FirstRcb) - HalDev->offset;
5100 +         HalDev->RxActive[Ch]=TRUE;
5101 +        }
5102 +     }
5103 +    else
5104 +     {
5105 +
5106 +      OldTailRcb=HalDev->RxActQueueTail[Ch];
5107 +      OldTailRcb->Next=(void *)FirstRcb;
5108 +
5109 +      /* Emerald fix 10/29 (Denis) */
5110 +      *((bit32u *) VirtToVirtNoCache(&OldTailRcb->HNext))=VirtToPhys(FirstRcb) - HalDev->offset;
5111 +
5112 +      HalDev->RxActQueueTail[Ch]=LastRcb;
5113 +      HalDev->RxActQueueCount[Ch]+=FragCount;
5114 +     }
5115 +  }
5116 +
5117 +/**
5118 + *  @ingroup CPHAL_Functions
5119 + *  This function is called to indicate to the CPHAL that the upper layer
5120 + *  software has finished processing the receive data (given to it by
5121 + *  osReceive()).  The CPHAL will then return the appropriate receive buffers
5122 + *  and buffer descriptors to the available pool.
5123 + *
5124 + *  @param   HalReceiveInfo   Start of receive buffer descriptor chain returned to
5125 + *                      CPHAL.
5126 + *  @param   StripFlag  Flag indicating whether the upper layer software has
5127 + *                      retained ownership of the receive data buffers.
5128 + *<BR>
5129 + * 'FALSE' means  that the CPHAL can reuse the receive data buffers.
5130 + *<BR>
5131 + * 'TRUE' : indicates the data buffers were retained by the OS
5132 + *<BR>
5133 + * NOTE:  If StripFlag is TRUE, it is the responsibility of the upper layer software to free the buffers when they are no longer needed.
5134 + *
5135 + *  @return EC_NO_ERRORS (ok). <BR>
5136 + *          Possible Error Codes:<BR>
5137 + *          @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
5138 + *          @ref EC_VAL_RCB_NEEDS_BUFFER "EC_VAL_RCB_NEEDS_BUFFER"<BR>
5139 + *          @ref EC_VAL_RCB_DROPPED "EC_VAL_RCB_DROPPED"<BR>
5140 + */
5141 +static int halRxReturn(HAL_RECEIVEINFO *HalReceiveInfo,
5142 +            int StripFlag)
5143 +  {
5144 +   int Ch = HalReceiveInfo->Ch, i;
5145 +   HAL_RCB *LastRcb, *TempRcb;
5146 +   char *pBuf;
5147 +   HAL_RCB *CurrHeadRcb = HalReceiveInfo, *LastGoodRcb=0;         /* +GSG 030421 */
5148 +   HAL_DEVICE *HalDev = HalReceiveInfo->HalDev;
5149 +   int RcbSize = HalDev->ChData[Ch].RxBufSize;
5150 +   int FragCount = HalReceiveInfo->FragCount;
5151 +   int rc=0;                                                      /*MJH+030417*/
5152 +   int GoodCount=0;                                               /*GSG+030421*/
5153 +
5154 +   if (HalDev->State != enOpened)
5155 +     return(EC_AAL5 |EC_FUNC_RXRETURN|EC_VAL_INVALID_STATE);
5156 +
5157 +   LastRcb=(HAL_RCB *)HalReceiveInfo->Eop;
5158 +   LastRcb->HNext=0;
5159 +   LastRcb->Next=0;
5160 +
5161 +   if (FragCount>1)
5162 +     {
5163 +      LastRcb->Off_BLen=RcbSize;
5164 +      LastRcb->mode=CB_OWNERSHIP_BIT;
5165 +     }
5166 +
5167 +   HalReceiveInfo->Off_BLen=RcbSize;
5168 +   HalReceiveInfo->mode=CB_OWNERSHIP_BIT;
5169 +
5170 +   /* If OS has kept the buffers for this packet, attempt to alloc new buffers */
5171 +   if (StripFlag)
5172 +     {
5173 +      TempRcb = HalReceiveInfo;
5174 +      for (i=0; i<FragCount; i++)
5175 +        {
5176 +         if (TempRcb == 0)
5177 +           {
5178 +            dbgPrintf("Rx Return error while allocating new buffers\n");
5179 +            dbgPrintf("Rcb = %08x, Rcb->Eop = %08x, FragCount = %d:%d\n",
5180 +              (bit32u)HalReceiveInfo, (bit32u)HalReceiveInfo->Eop, FragCount,i);
5181 +            osfuncSioFlush();
5182 +
5183 +            return(EC_CPPI|EC_FUNC_RXRETURN|EC_VAL_CORRUPT_RCB_CHAIN);
5184 +           }
5185 +
5186 +         /* size = ((RcbSize+15) & ~15) + 15;*/                      /*-3.01b*/
5187 +         /*size = RcbSize + 15;*/                                               /* -GSG 030421 */
5188 +         pBuf= (char *) HalDev->OsFunc->MallocRxBuffer(RcbSize,0,
5189 +                             0xF,HalDev->ChData[Ch].OsSetup,
5190 +                             (void *)TempRcb,
5191 +                             (void *)&TempRcb->OsInfo,
5192 +                             (void *) HalDev->OsDev);
5193 +         if (!pBuf)
5194 +           {
5195 +            /* malloc failed, add this RCB to Needs Buffer List */
5196 +            TempRcb->FragCount = 1;                                             /*MJH+030417*/
5197 +            (HAL_RCB *)TempRcb->Eop = TempRcb;                                  /* GSG +030430 */
5198 +
5199 +            if(HalDev->NeedsCount < MAX_NEEDS)                                  /* +MJH 030410 */
5200 +              {                                                                 /* +MJH 030410 */
5201 +               HalDev->Needs[HalDev->NeedsCount] = (HAL_RECEIVEINFO *) TempRcb; /* +MJH 030410 */
5202 +               HalDev->NeedsCount++;                                            /* +MJH 030410 */
5203 +               rc = (EC_CPPI|EC_FUNC_RXRETURN|EC_VAL_RCB_NEEDS_BUFFER);         /* ~MJH 030417 */
5204 +              }                                                                 /* +MJH 030410 */
5205 +             else                                                               /* +MJH 030410 */
5206 +               rc = (EC_CPPI|EC_FUNC_RXRETURN|EC_VAL_RCB_DROPPED);              /* ~MJH 030417 */
5207 +
5208 +            /* requeue any previous RCB's that were ready to go before this one */
5209 +            if (GoodCount > 0)                                                  /* +GSG 030421 */
5210 +              {                                                                 /* +GSG 030421 */
5211 +               LastGoodRcb->HNext=0;                                            /* +GSG 030430 */
5212 +               LastGoodRcb->Next=0;                                             /* +GSG 030430 */
5213 +               osfuncDataCacheHitWriteback((void *)LastGoodRcb, 16);            /* +GSG 030430 */
5214 +
5215 +               AddToRxQueue(HalDev, CurrHeadRcb, LastGoodRcb, GoodCount, Ch);   /* +GSG 030421 */
5216 +               GoodCount = 0;                                                   /* +GSG 030421 */
5217 +              }                                                                 /* +GSG 030421 */
5218 +
5219 +            CurrHeadRcb = TempRcb->Next;                                        /* +GSG 030421 */
5220 +           }
5221 +          else                                                                  /* +GSG 030421 */
5222 +           {                                                                    /* +GSG 030421 */
5223 +            /* malloc succeeded, requeue the RCB to the hardware */
5224 +            TempRcb->BufPtr=VirtToPhys(pBuf) - HalDev->offset;
5225 +            TempRcb->DatPtr=pBuf;
5226 +            /* Emerald fix 10/29 */
5227 +            osfuncDataCacheHitWriteback((void *)TempRcb, 16);
5228 +
5229 +            /* i store the last good RCB in case the malloc fails for the
5230 +               next fragment.  This ensures that I can go ahead and return
5231 +               a partial chain of RCB's to the hardware */
5232 +            LastGoodRcb = TempRcb;                                              /* +GSG 030421 */
5233 +            GoodCount++;                                                        /* +GSG 030421 */
5234 +           }                                                                    /* +GSG 030421 */
5235 +         TempRcb = TempRcb->Next;
5236 +        } /*  end of Frag loop */
5237 +      /* if there any good RCB's to requeue, do so here */
5238 +      if (GoodCount > 0)                                                        /* +GSG 030421 */
5239 +        {
5240 +         AddToRxQueue(HalDev, CurrHeadRcb, LastGoodRcb, GoodCount, Ch);          /* +GSG 030421 */
5241 +        }
5242 +      return(rc);                                                               /* ~GSG 030421 */
5243 +     }
5244 +   else
5245 +     {
5246 +      /*  Not Stripping */
5247 +      /* Emerald */
5248 +      /* Write Back SOP and last RCB */
5249 +      osfuncDataCacheHitWriteback((void *)HalReceiveInfo, 16);
5250 +
5251 +      if (FragCount > 1)
5252 +        {
5253 +         osfuncDataCacheHitWriteback((void *)LastRcb, 16);
5254 +        }
5255 +      /* if not stripping buffers, always add to queue */
5256 +      AddToRxQueue(HalDev, HalReceiveInfo, LastRcb, FragCount, Ch); /*MJH~030520*/
5257 +     }
5258 +
5259 +   return(EC_NO_ERRORS);
5260 +  }
5261 +
5262 +/* +MJH 030410
5263 +   Trys to liberate an RCB until liberation fails.
5264 +   Note: If liberation fails then RxReturn will re-add the RCB to the
5265 +         Needs list.
5266 +*/
5267 +static void NeedsCheck(HAL_DEVICE *HalDev)
5268 +{
5269 +    HAL_RECEIVEINFO* HalRcb;
5270 +    int rc;
5271 +    HalDev->OsFunc->CriticalOn();
5272 +    while(HalDev->NeedsCount)
5273 +      {
5274 +      HalDev->NeedsCount--;
5275 +      HalRcb = HalDev->Needs[HalDev->NeedsCount];
5276 +      rc =  halRxReturn(HalRcb, 1);
5277 +      /* short circuit if RxReturn starts to fail */
5278 +      if (rc != 0)
5279 +        break;
5280 +      }
5281 +    HalDev->OsFunc->CriticalOff();
5282 +}
5283 +
5284 +/*
5285 + *  This function allocates transmit buffer descriptors (internal CPHAL function).
5286 + *  It creates a high priority transmit queue by default for a single Tx
5287 + *  channel.  If QoS is enabled for the given CPHAL device, this function
5288 + *  will also allocate a low priority transmit queue.
5289 + *
5290 + *  @param   HalDev   CPHAL module instance. (set by cphalInitModule())
5291 + *  @param   Ch       Channel number.
5292 + *
5293 + *  @return  0 OK, Non-Zero Not OK
5294 + */
5295 +static int InitTcb(HAL_DEVICE *HalDev, int Ch)
5296 +  {
5297 +   int i, Num = HalDev->ChData[Ch].TxNumBuffers;
5298 +   HAL_TCB *pTcb=0;
5299 +   char *AllTcb;
5300 +   int  tcbSize, Queue;
5301 +   int SizeMalloc;
5302 +
5303 +   tcbSize = (sizeof(HAL_TCB)+0xf)&~0xf;
5304 +   SizeMalloc = (tcbSize*Num)+0xf;
5305 +
5306 +   for (Queue=0; Queue < HalDev->ChData[Ch].TxNumQueues; Queue++)
5307 +     {
5308 +      if (HalDev->TcbStart[Ch][Queue] == 0)
5309 +        {
5310 +
5311 +         /* malloc all TCBs at once */
5312 +         AllTcb = (char *)HalDev->OsFunc->MallocDmaXfer(SizeMalloc,0,0xffffffff);
5313 +         if (!AllTcb)
5314 +           {
5315 +            return(EC_CPPI|EC_FUNC_HAL_INIT|EC_VAL_TCB_MALLOC_FAILED);
5316 +           }
5317 +
5318 +         HalDev->OsFunc->Memset(AllTcb, 0, SizeMalloc);
5319 +
5320 +         /* keep this address for freeing later */
5321 +         HalDev->TcbStart[Ch][Queue] = AllTcb;
5322 +        }
5323 +       else
5324 +        {
5325 +         /* if the memory has already been allocated, simply reuse it! */
5326 +         AllTcb = HalDev->TcbStart[Ch][Queue];
5327 +        }
5328 +
5329 +      /* align to cache line */
5330 +      AllTcb = (char *)(((bit32u)AllTcb + 0xf) &~ 0xf); /*PITS #143  MJH~030522*/
5331 +
5332 +      /* default High priority transmit queue */
5333 +      HalDev->TcbPool[Ch][Queue]=0;
5334 +      for(i=0;i<Num;i++)
5335 +        {
5336 +         /*pTcb=(HAL_TCB *) OsFunc->MallocDmaXfer(sizeof(HAL_TCB),0,0xffffffff); */
5337 +         pTcb= (HAL_TCB *)(AllTcb + (i*tcbSize));
5338 +         pTcb->mode=0;
5339 +         pTcb->BufPtr=0;
5340 +         pTcb->Next=HalDev->TcbPool[Ch][Queue];
5341 +         pTcb->Off_BLen=0;
5342 +         HalDev->TcbPool[Ch][Queue]=pTcb;
5343 +        }
5344 +      /*HalDev->TcbEnd = pTcb;*/
5345 +     }
5346 +
5347 +   return(EC_NO_ERRORS);
5348 +  }
5349 +
5350 +/*
5351 + *  This function allocates receive buffer descriptors (internal CPHAL function).
5352 + *  After allocation, the function 'queues' (gives to the hardware) the newly
5353 + *  created receive buffers to enable packet reception.
5354 + *
5355 + *  @param   HalDev   CPHAL module instance. (set by cphalInitModule())
5356 + *  @param   Ch    Channel number.
5357 + *
5358 + *  @return  0 OK, Non-Zero Not OK
5359 + */
5360 +static int InitRcb(HAL_DEVICE *HalDev, int Ch)
5361 +  {
5362 +   int i, Num = HalDev->ChData[Ch].RxNumBuffers;
5363 +   int Size = HalDev->ChData[Ch].RxBufSize;
5364 +   HAL_RCB *pRcb;
5365 +   char *pBuf;
5366 +   char *AllRcb;
5367 +   int  rcbSize;
5368 +   int  DoMalloc = 0;
5369 +   int SizeMalloc;
5370 +   int MallocSize;
5371 +
5372 +   rcbSize = (sizeof(HAL_RCB)+0xf)&~0xf;
5373 +   SizeMalloc = (rcbSize*Num)+0xf;
5374 +
5375 +   if (HalDev->RcbStart[Ch] == 0)
5376 +     {
5377 +      DoMalloc = 1;
5378 +
5379 +      /* malloc all RCBs at once */
5380 +      AllRcb= (char *)HalDev->OsFunc->MallocDmaXfer(SizeMalloc,0,0xffffffff);
5381 +      if (!AllRcb)
5382 +        {
5383 +         return(EC_CPPI|EC_FUNC_HAL_INIT|EC_VAL_RCB_MALLOC_FAILED);
5384 +        }
5385 +
5386 +      HalDev->OsFunc->Memset(AllRcb, 0, SizeMalloc);
5387 +
5388 +      /* keep this address for freeing later */
5389 +      HalDev->RcbStart[Ch] = AllRcb;
5390 +     }
5391 +    else
5392 +     {
5393 +      /* if the memory has already been allocated, simply reuse it! */
5394 +      AllRcb = HalDev->RcbStart[Ch];
5395 +     }
5396 +
5397 +   /* align to cache line */
5398 +   AllRcb = (char *)(((bit32u)AllRcb + 0xf)&~0xf);  /*PITS #143  MJH~030522*/
5399 +
5400 +   HalDev->RcbPool[Ch]=0;
5401 +   for(i=0;i<Num;i++)
5402 +     {
5403 +      pRcb = (HAL_RCB *)(AllRcb + (i*rcbSize));
5404 +
5405 +      if (DoMalloc == 1)
5406 +        {
5407 +
5408 +         MallocSize = Size;                                       /*~3.01 */
5409 +         pBuf= (char *) HalDev->OsFunc->MallocRxBuffer(MallocSize,0,0xF,HalDev->ChData[Ch].OsSetup, (void *)pRcb, (void *)&pRcb->OsInfo, (void *) HalDev->OsDev);
5410 +         if(!pBuf)
5411 +             {
5412 +            return(EC_CPPI|EC_FUNC_HAL_INIT|EC_VAL_RX_BUFFER_MALLOC_FAILED);
5413 +             }
5414 +           /* -RC3.01 pBuf = (char *)(((bit32u)pBuf+0xF) & ~0xF); */
5415 +         pRcb->BufPtr=VirtToPhys(pBuf) - HalDev->offset;
5416 +         pRcb->DatPtr=pBuf;
5417 +         /*pRcb->BufSize=Size;*/
5418 +        }
5419 +      pRcb->mode=0;
5420 +      pRcb->Ch=Ch;
5421 +      pRcb->Next=(void *)HalDev->RcbPool[Ch];
5422 +      pRcb->Off_BLen=0;
5423 +      pRcb->HalDev = HalDev;
5424 +      HalDev->RcbPool[Ch]=pRcb;
5425 +     }
5426 +
5427 +   /* Give all of the Rx buffers to hardware */
5428 +
5429 +   while(HalDev->RcbPool[Ch])
5430 +     {
5431 +      pRcb=HalDev->RcbPool[Ch];
5432 +      HalDev->RcbPool[Ch]=pRcb->Next;
5433 +      pRcb->Eop=(void*)pRcb;
5434 +      pRcb->FragCount=1;
5435 +      halRxReturn((HAL_RECEIVEINFO *)pRcb, 0);
5436 +     }
5437 +
5438 +   return(EC_NO_ERRORS);
5439 +  }
5440 +
5441 +/**
5442 + *  @ingroup CPHAL_Functions
5443 + *  This function transmits the data in FragList using available transmit
5444 + *  buffer descriptors.  More information on the use of the Mode parameter
5445 + *  is available in the module-specific appendices.  Note:  The OS should
5446 + *  not call Send() for a channel that has been requested to be torndown.
5447 + *
5448 + *  @param   HalDev      CPHAL module instance. (set by cphalInitModule())
5449 + *  @param   FragList    Fragment List structure.
5450 + *  @param   FragCount   Number of fragments in FragList.
5451 + *  @param   PacketSize  Number of bytes to transmit.
5452 + *  @param   OsSendInfo  OS Send Information structure. <BR>
5453 + *  @param   Mode        32-bit value with the following bit fields: <BR>
5454 + *                       31-16: Mode  (used for module specific data). <BR>
5455 + *                       15-08: Queue (transmit queue to send on). <BR>
5456 + *                       07-00: Channel (channel number to send on).
5457 + *
5458 + *  @return  EC_NO_ERRORS (ok). <BR>
5459 + *           Possible Error Codes:<BR>
5460 + *           @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
5461 + *           @ref EC_VAL_NOT_LINKED "EC_VAL_NOT_LINKED"<BR>
5462 + *           @ref EC_VAL_INVALID_CH "EC_VAL_INVALID_CH"<BR>
5463 + *           @ref EC_VAL_OUT_OF_TCBS "EC_VAL_OUT_OF_TCBS"<BR>
5464 + *           @ref EC_VAL_NO_TCBS "EC_VAL_NO_TCBS"<BR>
5465 + */
5466 +static int halSend(HAL_DEVICE *HalDev,FRAGLIST *FragList,
5467 +                      int FragCount,int PacketSize, OS_SENDINFO *OsSendInfo,
5468 +                      bit32u Mode)
5469 +  {
5470 +  HAL_TCB *tcb_ptr, *head;
5471 +  int i;
5472 +  bit32u base = HalDev->dev_base;
5473 +  int rc = EC_NO_ERRORS;
5474 +  int Ch = Mode & 0xFF;
5475 +  int Queue = (Mode>>8)&0xFF;
5476 +
5477 +  int WaitFlag = (Mode>>30)&1; /* This is for AAL5 testing only */                     /* ~GSG 030508 */
5478 +  int Offset = (FragList[0].len >> 16);
5479 +  int PktType = (Mode>>16)&3; /* 0=AAL5, 1=Null AAL, 2=OAM, 3=Transparent */           /* +GSG 030508 */
5480 +  int AtmHeaderInData = (Mode>>31)&1;                                                 /* +GSG 030508 */
5481 +  int FragIndex = 0;
5482 +
5483 +  if (HalDev->State != enOpened)
5484 +     return(EC_CPPI|EC_FUNC_SEND|EC_VAL_INVALID_STATE);
5485 +
5486 +  if (HalDev->ChIsOpen[Ch][DIRECTION_TX] == 0)                    /*MJH~030611*/ /*PITS 148*/
5487 +    return(EC_AAL5 |EC_FUNC_SEND|EC_VAL_INVALID_CH);              /*+GSG 030303*/
5488 +
5489 +  HalDev->OsFunc->CriticalOn();
5490 +
5491 +  tcb_ptr = head = HalDev->TcbPool[Ch][Queue];
5492 +
5493 +  if (tcb_ptr)
5494 +    {
5495 +
5496 +     /* these two TCB words are only valid on SOP */
5497 +     if (AtmHeaderInData == 1)
5498 +       {
5499 +        tcb_ptr->AtmHeader = 0;  /* bug fix for transparent mode PTI problem */
5500 +        /* Expect AtmHeader in the data */
5501 +        tcb_ptr->AtmHeader |= *((bit8u *)FragList[FragIndex].data++) << 24;
5502 +        tcb_ptr->AtmHeader |= *((bit8u *)FragList[FragIndex].data++) << 16;
5503 +        tcb_ptr->AtmHeader |= *((bit8u *)FragList[FragIndex].data++) << 8;
5504 +        tcb_ptr->AtmHeader |= *((bit8u *)FragList[FragIndex].data++);
5505 +
5506 +        /* decrement data buffer length accordingly */
5507 +        FragList[FragIndex].len -= ATM_HEADER_SIZE;
5508 +
5509 +        /* if the first fragment was ATM Header only, go to next fragment for loop */
5510 +        if (FragList[FragIndex].len == 0)
5511 +          FragIndex++;
5512 +
5513 +        /* No CPCS_UU/CPI if not AAL5 */
5514 +        tcb_ptr->Word5 = ((PktType & 0x3)<<16);
5515 +       }
5516 +      else
5517 +       {
5518 +        /* calculate AtmHeader from fields */
5519 +        tcb_ptr->AtmHeader = atmheader(HalDev->ChData[Ch].Gfc, /* ~GSG 030306 */
5520 +          HalDev->ChData[Ch].Vpi, HalDev->ChData[Ch].Vci,
5521 +          HalDev->ChData[Ch].Pti, HalDev->ChData[Ch].Clp);
5522 +
5523 +        tcb_ptr->Word5 = HalDev->ChData[Ch].CpcsUU | ((HalDev->ChData[Ch].PktType &0x3)<<16);
5524 +       }
5525 +
5526 +     for (i=FragIndex; i<FragCount; i++)
5527 +
5528 +       {
5529 +        /* Setup Tx mode and size */
5530 +        tcb_ptr->HNext    = VirtToPhys((bit32 *)tcb_ptr->Next) - HalDev->offset;
5531 +        tcb_ptr->Off_BLen = FragList[i].len;
5532 +
5533 +        if (i==0)
5534 +          tcb_ptr->Off_BLen |= (Offset << 16);
5535 +
5536 +        tcb_ptr->mode     = 0;  /* MUST clear this for each frag !!! */
5537 +        tcb_ptr->BufPtr   = VirtToPhys((bit32 *)FragList[i].data) -
5538 +          HalDev->offset;
5539 +
5540 +        /* first fragment */
5541 +        if (i == 0)
5542 +          {
5543 +           tcb_ptr->mode |= CB_SOF_BIT;
5544 +
5545 +          }
5546 +
5547 +        tcb_ptr->mode |= (PacketSize | CB_OWNERSHIP_BIT);
5548 +        tcb_ptr->OsInfo = OsSendInfo;
5549 +
5550 +        if (i == (FragCount - 1))
5551 +          {
5552 +           /* last fragment */
5553 +           tcb_ptr->mode |= CB_EOF_BIT;
5554 +
5555 +           /* since this is the last fragment, set the TcbPool pointer before
5556 +              nulling out the Next pointers */
5557 +
5558 +           HalDev->TcbPool[Ch][Queue] = tcb_ptr->Next;
5559 +
5560 +           tcb_ptr->Next = 0;
5561 +           tcb_ptr->HNext = 0;
5562 +
5563 +           /* In the Tx Interrupt handler, we will need to know which TCB is EOP,
5564 +              so we can save that information in the SOP */
5565 +           head->Eop = tcb_ptr;
5566 +
5567 +           /* Emerald fix 10/29 */
5568 +       osfuncDataCacheHitWriteback((void *)tcb_ptr, 16);
5569 +
5570 +       osfuncDataCacheHitWriteback((void *)((bit32u)tcb_ptr + 16), 16);
5571 +
5572 +          }
5573 +         else
5574 +          {
5575 +       /* Emerald fix 10/29 */
5576 +       osfuncDataCacheHitWriteback((void *)tcb_ptr, 16);
5577 +
5578 +       osfuncDataCacheHitWriteback((void *)((bit32u)tcb_ptr + 16), 16);
5579 +
5580 +           tcb_ptr = tcb_ptr->Next;  /* what about the end of TCB list?? */
5581 +
5582 +           if (tcb_ptr == 0)
5583 +             {
5584 +          rc = EC_CPPI|EC_FUNC_SEND|EC_VAL_OUT_OF_TCBS;
5585 +              goto ExitSend;
5586 +             }
5587 +      }
5588 +       } /* for */
5589 +
5590 +     /* put it on the high priority queue */
5591 +     if (HalDev->TxActQueueHead[Ch][Queue] == 0)
5592 +       {
5593 +        HalDev->TxActQueueHead[Ch][Queue]=head;
5594 +        HalDev->TxActQueueTail[Ch][Queue]=tcb_ptr;
5595 +/*+GSG 030303*//*+GSG 030303*/
5596 +        if (!HalDev->TxActive[Ch][Queue])
5597 +          {
5598 +
5599 +           if (!WaitFlag)
5600 +         {
5601 +
5602 +          /* write CPPI TX HDP */
5603 +              (*(pTX_DMA_STATE_WORD_0( base )+( Ch *64)+( Queue )))  = VirtToPhys(head)  - HalDev->offset;
5604 +              HalDev->TxActive[Ch][Queue]=TRUE;
5605 +
5606 +         }
5607 +
5608 +          }
5609 +       }
5610 +      else
5611 +       {
5612 +        HalDev->TxActQueueTail[Ch][Queue]->Next=head;
5613 +        /* Emerald fix 10/29 */
5614 +        *((bit32u *) VirtToVirtNoCache(&HalDev->TxActQueueTail[Ch][Queue]->HNext))=VirtToPhys(head)  - HalDev->offset;
5615 +        HalDev->TxActQueueTail[Ch][Queue]=tcb_ptr;
5616 +/*+GSG 030303*//*+GSG 030303*/
5617 +       }
5618 +     rc = EC_NO_ERRORS;
5619 +     goto ExitSend;
5620 +    } /* if (tcb_ptr) */
5621 +   else
5622 +    {
5623 +     rc = EC_CPPI|EC_FUNC_SEND|EC_VAL_NO_TCBS;
5624 +     goto ExitSend;
5625 +    }
5626 +ExitSend:
5627 +
5628 +    HalDev->OsFunc->CriticalOff();
5629 +    return(rc);
5630 +  }
5631 +
5632 +/*
5633 + *  This function processes receive interrupts.  It traverses the receive
5634 + *  buffer queue, extracting the data and passing it to the upper layer software via
5635 + *  osReceive().  It handles all error conditions and fragments without valid data by
5636 + *  immediately returning the RCB's to the RCB pool.
5637 + *
5638 + *  @param   HalDev   CPHAL module instance. (set by cphalInitModule())
5639 + *  @param   Ch       Channel Number.
5640 + *  @param   MoreWork Flag that indicates that there is more work to do when set to 1.
5641 + *
5642 + *  @return  0 if OK, non-zero otherwise.
5643 + */
5644 +static int RxInt(HAL_DEVICE *HalDev, int Ch, int *MoreWork)
5645 +  {
5646 +  HAL_RCB *CurrentRcb, *LastRcb=0, *SopRcb, *EofRcb, *EopRcb;
5647 +  bit32u RxBufStatus,PacketsServiced, RxPktLen = 0, RxSopStatus,
5648 +    FrmFrags, TotalFrags, CurrDmaLen, DmaLen, FrmLen;
5649 +  int base = HalDev->dev_base, Ret;
5650 +  OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
5651 +  int RxServiceMax = HalDev->ChData[Ch].RxServiceMax;
5652 +  int FragIndex; /* +GSG 030508 */
5653 +  int EarlyReturn = 0; /* +GSG 030521 */
5654 +
5655 +  bit32u PktType, ExpDmaSize, Cells;
5656 +  int PassHeader=0;
5657 +
5658 +  int mode;
5659 +
5660 +  bit32u SopOffset;
5661 +
5662 +  if(HalDev->NeedsCount) /* +MJH 030410 */
5663 +    NeedsCheck(HalDev);  /* +MJH 030410 */
5664 +
5665 +  /* Handle case of teardown interrupt */
5666 +  if (HalDev->RxTeardownPending[Ch] != 0)
5667 +    {
5668 +     Ret = RxTeardownInt(HalDev, Ch);
5669 +     if (Ret == 0)
5670 +       {                                                              /*+GSG 030303*/
5671 +        *MoreWork = 0; /* bug fix 1/6 */                              /*+GSG 030303*/
5672 +        return (EC_NO_ERRORS);
5673 +       }                                                              /*+GSG 030303*/
5674 +    }
5675 +
5676 +  CurrentRcb=HalDev->RxActQueueHead[Ch];
5677 +
5678 +  osfuncDataCacheHitInvalidate((void*)CurrentRcb, 16);
5679 +
5680 +  RxBufStatus=CurrentRcb->mode;
5681 +
5682 +  /* I think I need to do this to ensure that i read UuCpi properly,
5683 +     which is on the second cache line of the Rcb */
5684 +  osfuncDataCacheHitInvalidate((void*)((bit32u)CurrentRcb+16), 16);
5685 +
5686 +  PacketsServiced=0;
5687 +  HalDev->InRxInt[Ch]=TRUE;
5688 +
5689 +  while((CurrentRcb)&&((RxBufStatus&CB_OWNERSHIP_BIT)==0)&&
5690 +    (PacketsServiced<RxServiceMax)) /* ~GSG 030307 */
5691 +    {
5692 +
5693 +    PacketsServiced++; /* ~GSG 030307 */
5694 +    SopRcb=CurrentRcb;
5695 +    RxSopStatus=RxBufStatus;
5696 +
5697 +    RxPktLen = RxSopStatus&CB_SIZE_MASK;
5698 +    /* Not sure what MAC needs to do for next block */
5699 +
5700 +    PktType=((SopRcb->UuCpi & 0x00030000) >> 16);                           /* GSG ~030508 */
5701 +    /* Calculate the expected DMA length */
5702 +    if (RxPktLen != 0)
5703 +      {
5704 +       Cells=RxPktLen/48;
5705 +       if ((RxPktLen%48) > 40)
5706 +         Cells++;
5707 +       if (PktType == PKT_TYPE_AAL5)                                        /* ~GSG 030508 */
5708 +         Cells++;
5709 +       ExpDmaSize=Cells*48;
5710 +      }
5711 +     else
5712 +      {
5713 +       ExpDmaSize=0;
5714 +      }
5715 +
5716 +    SopOffset=(SopRcb->Off_BLen&CB_OFFSET_MASK)>>16;
5717 +
5718 +    CurrDmaLen=0;
5719 +    FrmFrags=0;
5720 +    TotalFrags=0;
5721 +    FragIndex=0;
5722 +    FrmLen=0;
5723 +    EofRcb=0;
5724 +
5725 +/* +GSG 030508 */
5726 +    if ((PktType == PKT_TYPE_OAM) || (PktType == PKT_TYPE_TRANS))            /* +GSG 030508 */
5727 +      {                                                                      /* +GSG 030508 */
5728 +       /* first frag is ATM Header */                                        /* +GSG 030508 */
5729 +       PassHeader = 1;                                                       /* +GSG 030508 */
5730 +       HalDev->fraglist[FragIndex].data = (void *)&SopRcb->AtmHeader;        /* +GSG 030508 */
5731 +       HalDev->fraglist[FragIndex].len = 4;                                  /* +GSG 030508 */
5732 +       HalDev->fraglist[FragIndex].OsInfo = SopRcb->OsInfo;                  /* +GSG 030701 */
5733 +       FragIndex++;                                                          /* +GSG 030508 */
5734 +      }                                                                      /* +GSG 030508 */
5735 +/* +GSG 030508 */
5736 +
5737 +    do
5738 +      {
5739 +
5740 +      DmaLen=CurrentRcb->Off_BLen&CB_SIZE_MASK;
5741 +
5742 +      CurrDmaLen+=DmaLen;
5743 +      FrmLen+=DmaLen;
5744 +      TotalFrags++;
5745 +      if (!EofRcb)
5746 +        {
5747 +        HalDev->fraglist[FragIndex].data=((char *)CurrentRcb->DatPtr);       /* ~GSG 030508 */
5748 +
5749 +        HalDev->fraglist[FragIndex].data+=((FrmFrags==0)?SopOffset:0);       /* ~GSG 030508 */
5750 +
5751 +        HalDev->fraglist[FragIndex].len=DmaLen;                              /* ~GSG 030508 */
5752 +
5753 +        /* GSG 12/9 */
5754 +        HalDev->fraglist[FragIndex].OsInfo = CurrentRcb->OsInfo;             /* ~GSG 030508 */
5755 +
5756 +        /* Upper layer must do the data invalidate */
5757 +
5758 +        FrmFrags++;
5759 +        FragIndex++;                                                         /* ~GSG 030508 */
5760 +        if (FrmLen>=RxPktLen)
5761 +          EofRcb=CurrentRcb;
5762 +        }
5763 +      LastRcb=CurrentRcb;
5764 +      CurrentRcb=LastRcb->Next;
5765 +      if (CurrentRcb)
5766 +        {
5767 +         osfuncDataCacheHitInvalidate((void*)CurrentRcb,16);
5768 +         /*         RxBufStatus=CurrentRcb->mode; */ /*DRB~030522*/
5769 +        }
5770 +      }while(((LastRcb->mode&CB_EOF_BIT)==0)&&(CurrentRcb));
5771 +
5772 +    /* New location for interrupt acknowledge */
5773 +    /* Write the completion pointer */
5774 +    (*(pRX_CPPI_COMP_PTR( base )+( Ch *64)))  = VirtToPhys(LastRcb) - HalDev->offset;
5775 +
5776 +    EopRcb=LastRcb;
5777 +    HalDev->RxActQueueHead[Ch]=CurrentRcb;
5778 +    HalDev->RxActQueueCount[Ch]-=TotalFrags;
5779 +
5780 +    if (LastRcb->mode&CB_EOQ_BIT)
5781 +      {
5782 +       if (CurrentRcb)
5783 +         {
5784 +
5785 +          HalDev->Stats.RxMisQCnt[Ch]++;
5786 +
5787 +          (*(pRX_DMA_STATE_WORD_1( base )+( Ch *64)))  = LastRcb->HNext;
5788 +         }
5789 +        else
5790 +         {
5791 +
5792 +          /* Rx EOQ */
5793 +          HalDev->Stats.RxMisQCnt[Ch]++;
5794 +
5795 +          HalDev->RxActive[Ch]=FALSE;
5796 +         }
5797 +      }
5798 +
5799 +    EopRcb->Next=0;
5800 +
5801 +    /* setup SopRcb for the packet */
5802 +    SopRcb->Eop=(void*)EopRcb;
5803 +    SopRcb->FragCount=TotalFrags;
5804 +
5805 +    if ((ExpDmaSize!=CurrDmaLen)||(RxSopStatus&RX_ERROR_MASK))
5806 +      {
5807 +       /* check for Rx errors (only valid on SOP) */
5808 +       if (RxSopStatus & RX_ERROR_MASK)
5809 +         {
5810 +          if (RxSopStatus & CRC_ERROR_MASK)
5811 +            HalDev->Stats.CrcErrors[Ch]++;
5812 +
5813 +          if (RxSopStatus & LENGTH_ERROR_MASK)
5814 +            HalDev->Stats.LenErrors[Ch]++;
5815 +
5816 +          if (RxSopStatus & ABORT_ERROR_MASK)
5817 +            HalDev->Stats.AbortErrors[Ch]++;
5818 +
5819 +          if (RxSopStatus & STARV_ERROR_MASK)
5820 +            HalDev->Stats.StarvErrors[Ch]++;
5821 +         }
5822 +        else
5823 +         {
5824 +          HalDev->Stats.DmaLenErrors[Ch]++; /* different type of length error */
5825 +         }
5826 +
5827 +       EarlyReturn = 1;
5828 +      }
5829 +
5830 +    /* do not pass up the packet if we're out of RCB's (or have an errored packet)*/
5831 +    if ((CurrentRcb == 0) || (EarlyReturn == 1))
5832 +      {
5833 +       halRxReturn((HAL_RECEIVEINFO *)SopRcb,0);
5834 +      }
5835 +     else
5836 +      {
5837 +
5838 +      if (EopRcb!=EofRcb)
5839 +        {
5840 +         HAL_RCB *FirstEmptyRcb;
5841 +
5842 +         FirstEmptyRcb = EofRcb->Next;
5843 +         FirstEmptyRcb->Eop = (void*)EopRcb;
5844 +         FirstEmptyRcb->FragCount = TotalFrags-FrmFrags;
5845 +
5846 +         halRxReturn((HAL_RECEIVEINFO *)FirstEmptyRcb,0);
5847 +         SopRcb->Eop=(void*)EofRcb;
5848 +         SopRcb->FragCount=FrmFrags;
5849 +         EofRcb->Next=0;  /* Optional */
5850 +        }
5851 +
5852 +      mode = Ch | (PktType << 16) | (PassHeader << 31);   /* ~GSG 030508 */
5853 +
5854 +      OsFunc->Receive(HalDev->OsDev,HalDev->fraglist,FragIndex,RxPktLen,             /* ~GSG 030508 */
5855 +           (HAL_RECEIVEINFO *)SopRcb,mode);
5856 +      } /* else */
5857 +    
5858 +    if (CurrentRcb)                                                                  /*MJH+030522*/
5859 +      {
5860 +       RxBufStatus=CurrentRcb->mode;
5861 +      }
5862 +    } /* while */
5863 +
5864 +  if ((CurrentRcb)&&((RxBufStatus&CB_OWNERSHIP_BIT)==0)) /*~GSG 030307*/
5865 +    {
5866 +     *MoreWork = 1;
5867 +    }
5868 +   else
5869 +    {
5870 +     *MoreWork = 0;
5871 +    }
5872 +
5873 +  if (PacketsServiced != 0)
5874 +    {
5875 +      /* REMOVED when removing InRxInt */
5876 +     if ((!HalDev->RxActive[Ch]) && (HalDev->RxActQueueCount[Ch]))
5877 +       {
5878 +        (*(pRX_DMA_STATE_WORD_1( base )+( Ch *64)))  = VirtToPhys(HalDev->RxActQueueHead[Ch]);
5879 +    HalDev->RxActive[Ch]=TRUE;
5880 +       }
5881 +    }
5882 +
5883 +  HalDev->InRxInt[Ch]=FALSE;
5884 +
5885 +  /* update stats */
5886 +  HalDev->Stats.RxPacketsServiced[Ch] += PacketsServiced;
5887 +  HalDev->Stats.RxTotal += PacketsServiced;
5888 +  if (HalDev->Stats.RxMaxServiced < PacketsServiced)
5889 +    HalDev->Stats.RxMaxServiced = PacketsServiced;
5890 +
5891 +  return (EC_NO_ERRORS);
5892 +  }
5893 +
5894 +/*
5895 + *  This function processes transmit interrupts.  It traverses the
5896 + *  transmit buffer queue, detecting sent data buffers and notifying the upper
5897 + *  layer software via osSendComplete().  (for SAR, i originally had this split
5898 + *  into two functions, one for each queue, but joined them on 8/8/02)
5899 + *
5900 + *  @param   HalDev   CPHAL module instance. (set by cphalInitModule())
5901 + *  @param   Queue    Queue number to service (always 0 for MAC, Choose 1 for SAR to service low priority queue)
5902 + *  @param   MoreWork Flag that indicates that there is more work to do when set to 1.
5903 + *
5904 + *  @return  0 if OK, non-zero otherwise.
5905 + */
5906 +static int TxInt(HAL_DEVICE *HalDev, int Ch, int Queue, int *MoreWork)
5907 +  {
5908 +  HAL_TCB *CurrentTcb,*LastTcbProcessed,*FirstTcbProcessed;
5909 +  int PacketsServiced;
5910 +  bit32u TxFrameStatus;
5911 +  int base = HalDev->dev_base, Ret;
5912 +  int TxServiceMax = HalDev->ChData[Ch].TxServiceMax;
5913 +  OS_FUNCTIONS *OsFunc = HalDev->OsFunc;
5914 +
5915 +  int OtherQueue = Queue^1;
5916 +
5917 +/*+GSG 030303*//*+GSG 030303*/
5918 +
5919 +  /* Handle case of teardown interrupt.  This must be checked at
5920 +     the top of the function rather than the bottom, because
5921 +     the normal data processing can wipe out the completion
5922 +     pointer which is used to determine teardown complete. */
5923 +  if (HalDev->TxTeardownPending[Ch] != 0)
5924 +    {
5925 +     Ret = TxTeardownInt(HalDev, Ch, Queue);
5926 +     if (Ret == 0)
5927 +       {                                                              /*+GSG 030303*/
5928 +        *MoreWork = 0; /* bug fix 1/6 */                              /*+GSG 030303*/
5929 +        return (EC_NO_ERRORS);
5930 +       }                                                              /*+GSG 030303*/
5931 +    }
5932 +
5933 +  CurrentTcb = HalDev->TxActQueueHead[Ch][Queue];
5934 +  FirstTcbProcessed=CurrentTcb;
5935 +
5936 +  if (CurrentTcb==0)
5937 +    {
5938 +     /* I saw this error a couple of times when multi-channels were added */
5939 +     dbgPrintf("[cppi TxInt()]TxH int with no TCB in queue!\n");
5940 +     dbgPrintf("              Ch=%d, CurrentTcb = 0x%08x\n", Ch, (bit32u)CurrentTcb);
5941 +     dbgPrintf("              HalDev = 0x%08x\n", (bit32u)HalDev);
5942 +     osfuncSioFlush();
5943 +     return(EC_CPPI|EC_FUNC_TXINT|EC_VAL_NULL_TCB);
5944 +    }
5945 +
5946 +  osfuncDataCacheHitInvalidate((void *)CurrentTcb, 16);
5947 +  TxFrameStatus=CurrentTcb->mode;
5948 +  PacketsServiced=0;
5949 +
5950 +  /* should the ownership bit check be inside of the loop?? could make it a
5951 +     while-do loop and take this check away */
5952 +  if ((TxFrameStatus&CB_OWNERSHIP_BIT)==0)
5953 +    {
5954 +    OsFunc->CriticalOn(); /* +GSG 030307 */
5955 +    do
5956 +      {
5957 +      /* Pop TCB(s) for packet from the stack */
5958 +      LastTcbProcessed=CurrentTcb->Eop;
5959 +
5960 +      /* new location for acknowledge */
5961 +      /* Write the completion pointer */
5962 +      (*(pTXH_CPPI_COMP_PTR( base )+( Ch *64)+( Queue )))  = VirtToPhys(LastTcbProcessed);
5963 +
5964 +      HalDev->TxActQueueHead[Ch][Queue] = LastTcbProcessed->Next;
5965 +
5966 +/*+GSG 030303*//*+GSG 030303*/
5967 +
5968 +      osfuncDataCacheHitInvalidate((void *)LastTcbProcessed, 16);
5969 +
5970 +      if (LastTcbProcessed->mode&CB_EOQ_BIT)
5971 +        {
5972 +        if (LastTcbProcessed->Next)
5973 +          {
5974 +       /* Misqueued packet */
5975 +
5976 +           HalDev->Stats.TxMisQCnt[Ch][Queue]++;
5977 +
5978 +           (*(pTX_DMA_STATE_WORD_0( base )+( Ch *64)+( Queue )))  = LastTcbProcessed->HNext;
5979 +          }
5980 +         else
5981 +          {
5982 +       /* Tx End of Queue */
5983 +
5984 +       HalDev->Stats.TxEOQCnt[Ch][Queue]++;
5985 +
5986 +       HalDev->TxActive[Ch][Queue]=FALSE;
5987 +          }
5988 +        }
5989 +
5990 +      OsFunc->SendComplete(CurrentTcb->OsInfo);
5991 +
5992 +      /* Push Tcb(s) back onto the stack */
5993 +      CurrentTcb = LastTcbProcessed->Next;
5994 +
5995 +      LastTcbProcessed->Next=HalDev->TcbPool[Ch][Queue];
5996 +
5997 +      HalDev->TcbPool[Ch][Queue]=FirstTcbProcessed;
5998 +
5999 +      PacketsServiced++;
6000 +
6001 +      TxFrameStatus=CB_OWNERSHIP_BIT;
6002 +      /* set the first(SOP) pointer for the next packet */
6003 +      FirstTcbProcessed = CurrentTcb;
6004 +      if (CurrentTcb)
6005 +        {
6006 +     osfuncDataCacheHitInvalidate((void *)CurrentTcb, 16);
6007 +         TxFrameStatus=CurrentTcb->mode;
6008 +        }
6009 +
6010 +      }while(((TxFrameStatus&CB_OWNERSHIP_BIT)==0)
6011 +             &&(PacketsServiced<TxServiceMax));
6012 +
6013 +    /* this fixes the SAR TurboDSL hardware bug (multiple queue failure) */
6014 +    if (HalDev->TxActive[Ch][OtherQueue])
6015 +      if (HalDev->TxActQueueHead[Ch][OtherQueue])
6016 +        if ((*(pTX_DMA_STATE_WORD_0( base )+( Ch *64)+( OtherQueue )))  == 0)
6017 +          {
6018 +           osfuncDataCacheHitInvalidate(HalDev->TxActQueueHead[Ch][OtherQueue],16);
6019 +           if ((HalDev->TxActQueueHead[Ch][OtherQueue]->mode) & CB_OWNERSHIP_BIT)
6020 +             { 
6021 +              HalDev->TurboDslErrors++;
6022 +              (*(pTX_DMA_STATE_WORD_0( base )+( Ch *64)+( OtherQueue )))  = 
6023 +                VirtToPhys(HalDev->TxActQueueHead[Ch][OtherQueue]);
6024 +             }
6025 +          }
6026 +
6027 +    OsFunc->CriticalOff(); /* +GSG 030307 */
6028 +    if (((TxFrameStatus&CB_OWNERSHIP_BIT)==0)
6029 +             &&(PacketsServiced==TxServiceMax))
6030 +      {
6031 +       *MoreWork = 1;
6032 +      }
6033 +     else
6034 +      {
6035 +       *MoreWork = 0;
6036 +      }
6037 +    }
6038 +
6039 +  /* update stats */
6040 +  HalDev->Stats.TxPacketsServiced[Ch][Queue] += PacketsServiced;
6041 +  HalDev->Stats.TxTotal += PacketsServiced;
6042 +  if (HalDev->Stats.TxMaxServiced[Ch][Queue] < PacketsServiced)
6043 +    HalDev->Stats.TxMaxServiced[Ch][Queue] = PacketsServiced;
6044 +
6045 +  return(EC_NO_ERRORS);
6046 +  }
6047 +
6048 +/**
6049 + *  @ingroup CPHAL_Functions
6050 + *  This function performs a teardown for the given channel.  The value of the
6051 + *  Mode parameter controls the operation of the function, as documented below.
6052 + *
6053 + *  Note: If bit 3 of Mode is set, this call is blocking, and will not return
6054 + *  until the teardown interrupt has occurred and been processed. While waiting
6055 + *  for a blocking teardown to complete, ChannelTeardown() will signal the OS
6056 + *  (via Control(.."Sleep"..)) to allow the OS to perform other tasks if
6057 + *  necessary.  If and only if bit 3 of Mode is clear, the CPHAL will call the
6058 + *  OS TeardownComplete() function to indicate that the teardown has completed.
6059 + *
6060 + *  @param   HalDev  CPHAL module instance. (set by xxxInitModule())
6061 + *  @param   Ch      Channel number.
6062 + *  @param   Mode    Bit 0 (LSB): Perform Tx teardown (if set).<BR>
6063 + *                   Bit 1: Perform Rx teardown (if set). <BR>
6064 + *                   Bit 2: If set, perform full teardown (free buffers/descriptors).
6065 + *                          If clear, perform partial teardown (keep buffers). <BR>
6066 + *                   Bit 3 (MSB): If set, call is blocking.
6067 + *                            If clear, call is non-blocking.
6068 + *
6069 + *  @return  EC_NO_ERRORS (ok). <BR>
6070 + *           Possible Error Codes:<BR>
6071 + *           @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
6072 + *           @ref EC_VAL_INVALID_CH "EC_VAL_INVALID_CH"<BR>
6073 + *           @ref EC_VAL_TX_TEARDOWN_ALREADY_PEND "EC_VAL_TX_TEARDOWN_ALREADY_PEND"<BR>
6074 + *           @ref EC_VAL_RX_TEARDOWN_ALREADY_PEND "EC_VAL_RX_TEARDOWN_ALREADY_PEND"<BR>
6075 + *           @ref EC_VAL_TX_CH_ALREADY_TORNDOWN "EC_VAL_TX_CH_ALREADY_TORNDOWN"<BR>
6076 + *           @ref EC_VAL_RX_CH_ALREADY_TORNDOWN "EC_VAL_RX_CH_ALREADY_TORNDOWN"<BR>
6077 + *           @ref EC_VAL_TX_TEARDOWN_TIMEOUT "EC_VAL_TX_TEARDOWN_TIMEOUT"<BR>
6078 + *           @ref EC_VAL_RX_TEARDOWN_TIMEOUT "EC_VAL_RX_TEARDOWN_TIMEOUT"<BR>
6079 + *           @ref EC_VAL_LUT_NOT_READY "EC_VAL_LUT_NOT_READY"<BR>
6080 + */
6081 +static int halChannelTeardown(HAL_DEVICE *HalDev, int Ch, bit32 Mode)
6082 +  {
6083 +   int DoTx, DoRx, Sleep=2048, timeout=0;                         /*MJH~030306*/
6084 +   bit32u base = HalDev->dev_base;
6085 +
6086 +/* Set the module, used for error returns */
6087 +
6088 +   int Ret;
6089 +
6090 +   /* AAL5 only supports tearing down both sides at once (currently)*/
6091 +   Mode = (Mode | TX_TEARDOWN | RX_TEARDOWN);
6092 +
6093 +   DoTx = (Mode & TX_TEARDOWN);
6094 +   DoRx = (Mode & RX_TEARDOWN);
6095 +
6096 +   if (HalDev->State < enInitialized)
6097 +     return(EC_AAL5 |EC_FUNC_CHTEARDOWN|EC_VAL_INVALID_STATE);
6098 +
6099 +   if ((Ch < 0) || (Ch > MAX_AAL5_CHAN ))
6100 +     {
6101 +     return(EC_AAL5 |EC_FUNC_CHTEARDOWN|EC_VAL_INVALID_CH);
6102 +     }
6103 +
6104 +   /* set teardown pending bits before performing the teardown, because they
6105 +      will be used in the int handler (this is done for AAL5) */
6106 +   if (DoTx)
6107 +     {
6108 +      if (HalDev->TxTeardownPending[Ch] != 0)
6109 +        return(EC_AAL5 |EC_FUNC_CHTEARDOWN|EC_VAL_TX_TEARDOWN_ALREADY_PEND);
6110 +
6111 +      /* If a full teardown, this also means that the user must
6112 +      setup all channels again to use them */
6113 +      if (Mode & FULL_TEARDOWN)
6114 +        HalDev->ChIsSetup[Ch][DIRECTION_TX] = 0;
6115 +
6116 +      if (HalDev->State < enOpened)
6117 +        {
6118 +         /* if the hardware has never been opened, the channel has never actually
6119 +         been setup in the hardware, so I just need to reset the software flag
6120 +         and leave */
6121 +         HalDev->ChIsSetup[Ch][DIRECTION_TX] = 0;
6122 +         return (EC_NO_ERRORS);
6123 +    }
6124 +       else
6125 +    {
6126 +         if (HalDev->ChIsOpen[Ch][DIRECTION_TX] == 0)
6127 +       {
6128 +            return(EC_AAL5 |EC_FUNC_CHTEARDOWN|EC_VAL_TX_CH_ALREADY_TORNDOWN);
6129 +       }
6130 +
6131 +         /* set teardown flag */
6132 +         HalDev->TxTeardownPending[Ch] = Mode;
6133 +    }
6134 +     }
6135 +
6136 +   if (DoRx)
6137 +     {
6138 +      if (HalDev->RxTeardownPending[Ch] != 0)
6139 +        return(EC_AAL5 |EC_FUNC_CHTEARDOWN|EC_VAL_RX_TEARDOWN_ALREADY_PEND);
6140 +
6141 +      if (Mode & FULL_TEARDOWN)
6142 +        HalDev->ChIsSetup[Ch][DIRECTION_RX] = 0;
6143 +
6144 +      if (HalDev->State < enOpened)
6145 +        {
6146 +         HalDev->ChIsSetup[Ch][DIRECTION_RX] = 0;
6147 +         return (EC_NO_ERRORS);
6148 +    }
6149 +       else
6150 +    {
6151 +         if (HalDev->ChIsOpen[Ch][DIRECTION_RX] == 0)
6152 +           return(EC_AAL5 |EC_FUNC_CHTEARDOWN|EC_VAL_RX_CH_ALREADY_TORNDOWN);
6153 +
6154 +         HalDev->RxTeardownPending[Ch] = Mode;
6155 +    }
6156 +     }
6157 +
6158 +   /* Perform Tx Teardown Duties */
6159 +   if ((DoTx) && (HalDev->State == enOpened))
6160 +     {
6161 +      /* Request TX channel teardown */
6162 +      (TX_CPPI_TEARDOWN_REG( base ))  = Ch;
6163 +
6164 +      /* wait until teardown has completed */
6165 +      if (Mode & BLOCKING_TEARDOWN)
6166 +        {
6167 +     timeout = 0;
6168 +         while (HalDev->ChIsOpen[Ch][DIRECTION_TX] == TRUE)
6169 +       {
6170 +            osfuncSleep(&Sleep);
6171 +
6172 +            timeout++;
6173 +        if (timeout > 100000)
6174 +          {
6175 +               return(EC_AAL5 |EC_FUNC_CHTEARDOWN|EC_VAL_TX_TEARDOWN_TIMEOUT);
6176 +          }
6177 +       }
6178 +    }
6179 +     } /* if DoTx */
6180 +
6181 +   /* Perform Rx Teardown Duties */
6182 +   if ((DoRx) && (HalDev->State == enOpened))
6183 +     {
6184 +
6185 +      /* call main teardown routine for Rx */
6186 +      Ret = HalDev->SarFunc->ChannelTeardown(HalDev->SarDev, Ch, Mode);
6187 +      if (Ret) return (Ret);
6188 +
6189 +      if (Mode & BLOCKING_TEARDOWN)
6190 +        {
6191 +     timeout = 0;
6192 +         while (HalDev->ChIsOpen[Ch][DIRECTION_RX] == TRUE)
6193 +       {
6194 +            osfuncSleep(&Sleep);
6195 +
6196 +            timeout++;
6197 +        if (timeout > 100000)
6198 +          {
6199 +               return(EC_AAL5 |EC_FUNC_CHTEARDOWN|EC_VAL_RX_TEARDOWN_TIMEOUT);
6200 +          }
6201 +       }
6202 +        }
6203 +     } /* if DoRx */
6204 +
6205 +   return (EC_NO_ERRORS);
6206 +  }
6207 +
6208 +/**
6209 + *  @ingroup CPHAL_Functions
6210 + *  This function closes the CPHAL module.  The module will be reset.
6211 + *  The Mode parameter should be used to determine the actions taken by
6212 + *  Close().
6213 + *
6214 + *  @param   HalDev   CPHAL module instance. (set by xxxInitModule())
6215 + *  @param   Mode     Indicates actions to take on close.  The following integer
6216 + *                    values are valid: <BR>
6217 + *                    1:  Does not free buffer resources, init parameters remain
6218 + *                        intact.  User can then call Open() without calling Init()
6219 + *                        to attempt to reset the device and bring it back to the
6220 + *                        last known state.<BR>
6221 + *                    2:  Frees the buffer resources, but keeps init parameters.  This
6222 + *                        option is a more aggressive means of attempting a device reset.
6223 + *                    3:  Frees the buffer resources, and clears all init parameters. <BR>
6224 + *                        At this point, the caller would have to call to completely
6225 + *                        reinitialize the device (Init()) before being able to call
6226 + *                        Open().  Use this mode if you are shutting down the module
6227 + *                        and do not plan to restart.
6228 + *
6229 + *  @return  EC_NO_ERRORS (ok).<BR>
6230 + *           Possible Error Codes:<BR>
6231 + *           @ref EC_VAL_INVALID_STATE "EC_VAL_INVALID_STATE"<BR>
6232 + *           Any error code from halChannelTeardown().<BR>
6233 + */
6234 +static int halClose(HAL_DEVICE *HalDev, bit32 Mode)
6235 +  {
6236 +   int Ch, Inst, Ret;
6237 +   OS_DEVICE *TmpOsDev;
6238 +   OS_FUNCTIONS *TmpOsFunc;
6239 +   HAL_FUNCTIONS *TmpHalFunc;
6240 +   char *TmpDeviceInfo;
6241 +
6242 +   CPSAR_FUNCTIONS *TmpSarFunc;
6243 +   CPSAR_DEVICE *TmpSarDev;
6244 +
6245 +   /* Verify proper device state */
6246 +   if (HalDev->State != enOpened)
6247 +     return (EC_AAL5  | EC_FUNC_CLOSE|EC_VAL_INVALID_STATE);
6248 +
6249 +   /* Teardown all open channels */
6250 +   for (Ch = 0; Ch <= MAX_AAL5_CHAN ; Ch++)
6251 +     {
6252 +      if (HalDev->ChIsOpen[Ch][DIRECTION_TX] == TRUE)
6253 +        {
6254 +         if (Mode == 1)
6255 +           {
6256 +            Ret = halChannelTeardown(HalDev, Ch, TX_TEARDOWN | PARTIAL_TEARDOWN | BLOCKING_TEARDOWN);
6257 +            if (Ret) return (Ret);
6258 +           }
6259 +          else
6260 +           {
6261 +            Ret = halChannelTeardown(HalDev, Ch, TX_TEARDOWN | FULL_TEARDOWN | BLOCKING_TEARDOWN);
6262 +            if (Ret) return (Ret);
6263 +           }
6264 +        }
6265 +
6266 +      if (HalDev->ChIsOpen[Ch][DIRECTION_RX] == TRUE)
6267 +        {
6268 +         if (Mode == 1)
6269 +           {
6270 +            Ret = halChannelTeardown(HalDev, Ch, RX_TEARDOWN | PARTIAL_TEARDOWN | BLOCKING_TEARDOWN);
6271 +            if (Ret) return (Ret);
6272 +           }
6273 +          else
6274 +           {
6275 +            Ret = halChannelTeardown(HalDev, Ch, RX_TEARDOWN | FULL_TEARDOWN | BLOCKING_TEARDOWN);
6276 +            if (Ret) return (Ret);
6277 +           }
6278 +        }
6279 +     }
6280 +
6281 +   /* free fraglist in HalDev */
6282 +   HalDev->OsFunc->Free(HalDev->fraglist);
6283 +   HalDev->fraglist = 0;
6284 +
6285 +   /* unregister the interrupt */
6286 +   HalDev->OsFunc->IsrUnRegister(HalDev->OsDev, HalDev->interrupt);
6287 +
6288 +   /* Disable the Tx CPPI DMA */
6289 +   TX_CPPI_CTL_REG(HalDev->dev_base) = 0;
6290 +
6291 +   /* Disable the Rx CPPI DMA */
6292 +   RX_CPPI_CTL_REG(HalDev->dev_base) = 0;
6293 +
6294 +   /* Close the SAR hardware - puts the device in reset if this module is the
6295 +      "last one out" */
6296 +   HalDev->SarFunc->Close(HalDev->SarDev, Mode);
6297 +
6298 +   /* If mode is 3, than clear the HalDev and set next state to DevFound*/
6299 +   if (Mode == 3)
6300 +     {
6301 +      /* I need to keep the HalDev parameters that were setup in InitModule */
6302 +      TmpOsDev = HalDev->OsDev;
6303 +      TmpOsFunc = HalDev->OsFunc;
6304 +      TmpDeviceInfo = HalDev->DeviceInfo;
6305 +
6306 +      TmpSarFunc = HalDev->SarFunc;
6307 +      TmpSarDev = HalDev->SarDev;
6308 +
6309 +      TmpHalFunc = HalDev->HalFuncPtr;
6310 +      Inst = HalDev->Inst;
6311 +
6312 +      /* Clear HalDev */
6313 +
6314 +      HalDev->OsFunc->Memset(HalDev, 0, sizeof(HAL_DEVICE));
6315 +
6316 +      /* Restore key parameters */
6317 +      HalDev->OsDev = TmpOsDev;
6318 +      HalDev->OsFunc = TmpOsFunc;
6319 +      HalDev->DeviceInfo = TmpDeviceInfo;
6320 +
6321 +      HalDev->SarFunc = TmpSarFunc;
6322 +      HalDev->SarDev = TmpSarDev;
6323 +
6324 +      HalDev->HalFuncPtr = TmpHalFunc;
6325 +      HalDev->Inst = Inst;
6326 +
6327 +      HalDev->State = enDevFound;
6328 +     }
6329 +    else
6330 +     {
6331 +      HalDev->State = enInitialized;
6332 +     }
6333 +
6334 +   return(EC_NO_ERRORS);
6335 +  }
6336 diff -urN linux.old/drivers/atm/sangam_atm/cpremap_cpaal5.c linux.dev/drivers/atm/sangam_atm/cpremap_cpaal5.c
6337 --- linux.old/drivers/atm/sangam_atm/cpremap_cpaal5.c   1970-01-01 01:00:00.000000000 +0100
6338 +++ linux.dev/drivers/atm/sangam_atm/cpremap_cpaal5.c   2005-08-23 04:46:50.084845672 +0200
6339 @@ -0,0 +1,27 @@
6340 +#ifndef _INC_CPREMAP_C
6341 +#define _INC_CPREMAP_C
6342 +
6343 +#ifdef __ADAM2
6344 +static inline void osfuncDataCacheHitInvalidate(void *ptr, int Size)
6345 +  {
6346 +  asm(" cache  17, (%0)" : : "r" (ptr));
6347 +  }
6348 +
6349 +static inline void osfuncDataCacheHitWriteback(void *ptr, int Size)
6350 +  { 
6351 +  asm(" cache  25, (%0)" : : "r" (ptr));
6352 +  }
6353 +
6354 +#else
6355 +  #define osfuncDataCacheHitInvalidate(MemPtr, Size)   HalDev->OsFunc->DataCacheHitInvalidate(MemPtr, Size)
6356 +  #define osfuncDataCacheHitWriteback(MemPtr, Size)    HalDev->OsFunc->DataCacheHitWriteback(MemPtr, Size)
6357 +#endif
6358 +
6359 +/*
6360 +#define osfuncDataCacheHitInvalidate(ptr, Size) asm(" cache  17, (%0)" : : "r" (ptr))
6361 +#define osfuncDataCacheHitWriteback(ptr, Size)  asm(" cache  25, (%0)" : : "r" (ptr))
6362 +*/
6363 +
6364 +
6365 +
6366 +#endif
6367 diff -urN linux.old/drivers/atm/sangam_atm/cpremap_cpsar.c linux.dev/drivers/atm/sangam_atm/cpremap_cpsar.c
6368 --- linux.old/drivers/atm/sangam_atm/cpremap_cpsar.c    1970-01-01 01:00:00.000000000 +0100
6369 +++ linux.dev/drivers/atm/sangam_atm/cpremap_cpsar.c    2005-08-23 04:46:50.084845672 +0200
6370 @@ -0,0 +1,27 @@
6371 +#ifndef _INC_CPREMAP_C
6372 +#define _INC_CPREMAP_C
6373 +
6374 +#ifdef __ADAM2
6375 +static inline void osfuncDataCacheHitInvalidate(void *ptr, int Size)
6376 +  {
6377 +  asm(" cache  17, (%0)" : : "r" (ptr));
6378 +  }
6379 +
6380 +static inline void osfuncDataCacheHitWriteback(void *ptr, int Size)
6381 +  { 
6382 +  asm(" cache  25, (%0)" : : "r" (ptr));
6383 +  }
6384 +
6385 +#else
6386 +  #define osfuncDataCacheHitInvalidate(MemPtr, Size)   HalDev->OsFunc->DataCacheHitInvalidate(MemPtr, Size)
6387 +  #define osfuncDataCacheHitWriteback(MemPtr, Size)    HalDev->OsFunc->DataCacheHitWriteback(MemPtr, Size)
6388 +#endif
6389 +
6390 +/*
6391 +#define osfuncDataCacheHitInvalidate(ptr, Size) asm(" cache  17, (%0)" : : "r" (ptr))
6392 +#define osfuncDataCacheHitWriteback(ptr, Size)  asm(" cache  25, (%0)" : : "r" (ptr))
6393 +*/
6394 +
6395 +
6396 +
6397 +#endif
6398 diff -urN linux.old/drivers/atm/sangam_atm/cpsar.c linux.dev/drivers/atm/sangam_atm/cpsar.c
6399 --- linux.old/drivers/atm/sangam_atm/cpsar.c    1970-01-01 01:00:00.000000000 +0100
6400 +++ linux.dev/drivers/atm/sangam_atm/cpsar.c    2005-08-23 04:46:50.086845368 +0200
6401 @@ -0,0 +1,881 @@
6402 +/**
6403 + *  cpsar.c
6404 + *
6405 + *  TNETDxxxx Software Support\n
6406 + *  Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
6407 + *
6408 + *  This file contains the HAL for the CPSAR module.  In the software
6409 + *  architecture, the CPSAR module is used exclusively by the AAL5 and AAL2
6410 + *  CPHAL modules.  AAL5 and AAL2 may utilize the same CPSAR instance
6411 + *  simulataneously.
6412 + *
6413 + *  version
6414 + *      5Sep02 Greg        1.00  Original Version created.
6415 + */
6416 +
6417 +/* register files */
6418 +#include "cp_sar_reg.h"  
6419 +
6420 +#define _CPHAL_CPSAR
6421 +#define _CPHAL 
6422 +
6423 +#define WAIT_THRESH           200000
6424 +#define IRAM_SIZE             1536
6425 +#define MAX_INST              2
6426 +
6427 +/*  OS Data Structure definition  */
6428 +
6429 +typedef void OS_PRIVATE;
6430 +typedef void OS_DEVICE;
6431 +typedef void OS_SENDINFO;
6432 +typedef void OS_RECEIVEINFO;
6433 +typedef void OS_SETUP;
6434 +
6435 +/*  CPHAL Data Structure definitions  */
6436 +
6437 +typedef struct cpsar_device  CPSAR_DEVICE;
6438 +typedef struct cpsar_device  HAL_DEVICE;
6439 +typedef void HAL_RECEIVEINFO;
6440 +
6441 +#define MAX_QUEUE  2
6442 +#define MAX_CHAN 19
6443 +
6444 +#include "cpcommon_cpsar.h"
6445 +#include "cpswhal_cpsar.h"
6446 +#include "cpsar.h"
6447 +#include "cpcommon_cpsar.c"
6448 +
6449 +static CPSAR_DEVICE *CpsarDev[MAX_INST]= {0,0};
6450 +
6451 +/*
6452 + *  Returns statistics information.
6453 + *
6454 + *  @param  HalDev   CPHAL module instance. (set by xxxInitModule())  
6455 + *
6456 + *  @return 0
6457 + */
6458 +static int StatsGet3(CPSAR_DEVICE *HalDev)
6459 +  {
6460 +
6461 +#ifdef __CPHAL_DEBUG
6462 +   if (DBG(0))
6463 +     {
6464 +      dbgPrintf("[cpsar]StatsGet3(HalDev:%08x)\n", (bit32u)HalDev);
6465 +      osfuncSioFlush();
6466 +     }
6467 +#endif
6468 +   /*
6469 +   dbgPrintf("CPSAR General Stats:\n");
6470 +   DispHexStat(HalDev, "Base Address",HalDev->dev_base);
6471 +   DispStat(HalDev, "Offset (VLYNQ)",HalDev->offset);
6472 +   DispStat(HalDev, "Debug Level",HalDev->debug);
6473 +   DispStat(HalDev, "Instance",HalDev->Inst);
6474 +   DispHexStat(HalDev, "Reset Address",HalDev->ResetBase);
6475 +   DispStat(HalDev, "Reset Bit",HalDev->ResetBit);
6476 +   */
6477 +   return (EC_NO_ERRORS);
6478 +  }
6479 +
6480 +/* +GSG 030407 */
6481 +static void SetOamMode(HAL_DEVICE *HalDev)
6482 +  {
6483 +   int Ch;
6484 +   volatile bit32u *pTmp;
6485 +   int OamMode = (1<<8);
6486 +
6487 +   /* any configuration of OamMode affects all VC's, including AAL2 */
6488 +   for (Ch = 0; Ch < MAX_CHAN; Ch++)
6489 +     {
6490 +      if (Ch < 16)
6491 +        pTmp = (pPDSP_AAL5_RX_STATE_WORD_0(HalDev->dev_base) + (Ch*64));
6492 +       else
6493 +        pTmp = (pPDSP_AAL2_RX_STATE_WORD_0(HalDev->dev_base) + ((Ch-16)*64));
6494 +
6495 +      if (HalDev->OamMode == 0)
6496 +        {
6497 +         *pTmp &=~ OamMode;
6498 +        }
6499 +       else
6500 +        {
6501 +         *pTmp |= OamMode;
6502 +        }
6503 +     }
6504 +  }
6505 +
6506 +static int halControl(CPSAR_DEVICE *HalDev, const char *Key, const char *Action, void *Value)
6507 +  {
6508 +   int KeyFound=0, ActionFound=0, rc=EC_NO_ERRORS, Ch;  /* +RC3.02*/
6509 +   char *TmpKey = (char *)Key;
6510 +
6511 +#ifdef __CPHAL_DEBUG
6512 +   if (DBG(0))
6513 +     {
6514 +      dbgPrintf("[cpsar]halControl(HalDev:%08x, Key:%s, Action:%s, Value:%08x)\n", (bit32u)HalDev,
6515 +                Key, Action, (bit32u)Value);
6516 +      osfuncSioFlush();
6517 +     }
6518 +#endif  
6519 +
6520 +   if (HalDev->OsFunc->Strcmpi(Key, "Debug") == 0)
6521 +     {
6522 +      KeyFound=1; /* +RC3.02*/
6523 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
6524 +        {
6525 +         ActionFound=1; /* +RC3.02*/
6526 +         HalDev->debug = *(int *)Value;
6527 +        }
6528 +     }
6529 +
6530 +   /* +GSG 030407 */
6531 +   if (HalDev->OsFunc->Strcmpi(Key, "OamMode") == 0)
6532 +     {
6533 +      KeyFound=1;
6534 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
6535 +        {
6536 +         ActionFound=1;
6537 +         HalDev->OamMode = *(int *)Value;
6538 +
6539 +         /* only do this if we're open */
6540 +         if (HalDev->OpenCount > 0)
6541 +           SetOamMode(HalDev);
6542 +        }
6543 +
6544 +      if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
6545 +        {
6546 +         ActionFound=1;
6547 +         *(int *)Value = HalDev->OamMode;
6548 +        }
6549 +     }
6550 +
6551 +   if (HalDev->OsFunc->Strcmpi(Key, "Stats3") == 0)
6552 +     {
6553 +      if (HalDev->OsFunc->Strcmpi(Action, "Get") == 0)
6554 +        StatsGet3(HalDev);
6555 +     }
6556 +
6557 +   /* +RC3.02  (if statement) */
6558 +   /* Fixes PITS #98 */
6559 +   if (HalDev->OsFunc->Strstr(Key, "PdspEnable") != 0)
6560 +     {
6561 +      KeyFound=1;
6562 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
6563 +        {
6564 +         ActionFound=1;
6565 +         
6566 +         /* Configure PDSP enable bit based on Value*/
6567 +         if (*(int *)Value & 1)
6568 +           {
6569 +            /* enable PDSP */
6570 +            PDSP_CTRL_REG(HalDev->dev_base) |= 0x2;
6571 +           }
6572 +          else
6573 +           {
6574 +            /* disable PDSP */
6575 +            PDSP_CTRL_REG(HalDev->dev_base) &=~ 0x2;
6576 +           }
6577 +        }
6578 +     }
6579 +
6580 +   if (HalDev->OsFunc->Strstr(Key, "FwdUnkVc.") != 0)
6581 +     {
6582 +      KeyFound=1;
6583 +      if (HalDev->OsFunc->Strcmpi(Action, "Set") == 0)
6584 +        {
6585 +         ActionFound=1;
6586 +         
6587 +         /* extract channel number */
6588 +         TmpKey += HalDev->OsFunc->Strlen("FwdUnkVc.");
6589 +         Ch = HalDev->OsFunc->Strtoul(TmpKey, &TmpKey, 10);
6590 +
6591 +         /* Configure forwarding of unknown VCI/VPI cells */
6592 +         SAR_PDSP_FWD_UNK_VC_REG(HalDev->dev_base) = (((*(int*)Value)<<31) | Ch);
6593 +        }
6594 +     }
6595 +
6596 +   if (KeyFound == 0) /* +RC3.02 */
6597 +     rc = (EC_CPSAR|EC_FUNC_CONTROL|EC_VAL_KEY_NOT_FOUND); /* +RC3.02 */
6598 +
6599 +   if (ActionFound == 0) /* +RC3.02 */
6600 +     rc = (EC_CPSAR|EC_FUNC_CONTROL|EC_VAL_ACTION_NOT_FOUND); /* +RC3.02 */
6601 +
6602 +   return(rc);   /* ~RC3.02 */
6603 +  }
6604 +
6605 +/*
6606 + * This function opens the specified channel.
6607 + *  
6608 + * @param   HalDev  CPHAL module instance. (set by cphalInitModule())   
6609 + * @param   Ch      Channel number.
6610 + *
6611 + * @return  0 OK, Non-zero Not OK
6612 + */
6613 +static int halChannelSetup(CPSAR_DEVICE *HalDev, CHANNEL_INFO *HalCh)
6614 +  {
6615 +  int i;
6616 +  int Ch = HalCh->Channel;
6617 +  int PdspChBlock = Ch;
6618 +  int PdspBlockOffset = 0;
6619 +  volatile bit32u *pTmp;
6620 +
6621 +#ifdef __CPHAL_DEBUG
6622 +   if (DBG(0))
6623 +     {
6624 +      dbgPrintf("[cpsar]halChannelSetup(HalDev:%08x, HalCh:%08x)\n", (bit32u)HalDev,
6625 +                (bit32u)HalCh);
6626 +      osfuncSioFlush();
6627 +     }
6628 +#endif
6629 +
6630 +  /* Figure out the correct offset from the start of the PDSP
6631 +     Scratchpad RAM (starting at 0x8050 in the SAR) */
6632 +  if (Ch > 15)
6633 +    {
6634 +     /* this is an AAL2 channel, which are channels 16-18 */
6635 +     PdspChBlock = Ch - 16;  
6636 +     /* Get the offset to the AAL2 portion of the block (in words) */
6637 +     PdspBlockOffset = NUM_PDSP_AAL5_STATE_WORDS + (PdspChBlock*64);
6638 +     /* Clear PDSP State RAM */
6639 +     /*pTmp = (pPDSP_BLOCK_0(HalDev->dev_base)+PdspBlockOffset);
6640 +     for (i=0; i<NUM_PDSP_AAL2_STATE_WORDS; i++)
6641 +     *pTmp++ = 0;*/
6642 +    }
6643 +   else
6644 +    {
6645 +     /* Get the offset to the AAL5 portion of the block (in words) */
6646 +     PdspBlockOffset = (PdspChBlock*64);
6647 +     /* Clear PDSP State RAM */
6648 +     /*pTmp = (pPDSP_BLOCK_0(HalDev->dev_base)+PdspBlockOffset);
6649 +     for (i=0; i<NUM_PDSP_AAL5_STATE_WORDS; i++)
6650 +     *pTmp++ = 0;*/
6651 +    }
6652 +
6653 +  /* Configure PDSP State RAM */
6654 +
6655 +  /* Setup TX PDSP State RAM */
6656 +  pTmp = (pPDSP_BLOCK_0(HalDev->dev_base)+PdspBlockOffset);
6657 +  *pTmp++ = HalCh->TxVc_CellRate;        /* Set the cell rate in cells/sec */
6658 +  *pTmp++ = HalCh->TxVc_QosType;         /* Configure the QoS Type */
6659 +  *pTmp++ = HalCh->TxVc_Mbs;             /* Set minimum burst size */
6660 +  *pTmp++ = 0;                           /* (skip a register) */
6661 +  *pTmp++ = HalCh->TxVc_Pcr;             /* set the peak cell rate */
6662 +  *pTmp++ = 0;                           /* new addition 4.9.02 */
6663 +  *pTmp++ = HalCh->TxVc_AtmHeader;       /* give the ATM header */
6664 +  *pTmp++ = (HalCh->TxVc_OamTc << 8) 
6665 +            |(HalCh->TxVc_VpOffset);     /* Set the OAM TC Path and VP Offset */
6666 +   
6667 +  /* Setup RX PDSP State RAM */
6668 +  *pTmp++ = (HalCh->RxVc_OamCh)|
6669 +    (HalDev->OamMode << 8) |
6670 +    (HalCh->RxVc_OamToHost<<9);          /* Set OAM Channel, Mode, and ToHost options */
6671 +  *pTmp++ = HalCh->RxVc_AtmHeader;       /* ATM hdr put on firmware generated OAM */
6672 +  *pTmp++ = (HalCh->RxVc_VpOffset)|      /* Set Rx OAM TC Path and VP Offset */
6673 +    (HalCh->RxVc_OamTc<<8);                 
6674 +           
6675 +  /* Setup TX VP PDSP State RAM */
6676 +  pTmp = (pPDSP_BLOCK_0(HalDev->dev_base)+PdspBlockOffset+16); /*GSG~030703 12->16 */
6677 +  *pTmp++ = HalCh->TxVp_AtmHeader;
6678 +  *pTmp++ = (HalCh->TxVp_OamTc << 8);
6679 +
6680 +  /* Setup RX VP PDSP State RAM */
6681 +  pTmp = (pPDSP_BLOCK_0(HalDev->dev_base)+PdspBlockOffset+20); /*GSG~030703 16->20 */
6682 +  *pTmp++ = HalCh->RxVp_AtmHeader;
6683 +  *pTmp++ = (HalCh->RxVp_OamCh)|
6684 +    (HalCh->RxVp_OamTc<<8)|
6685 +    (HalCh->RxVp_OamToHost<<9);           /* Set OAM Channel, Mode, and ToHost options */
6686 +  *pTmp++ = 0;
6687 +  *pTmp++ = HalCh->RxVp_OamVcList;
6688 +
6689 +  /* Configure forwarding of unknown VCI/VPI cells */
6690 +  if (HalCh->PktType == 3)
6691 +    SAR_PDSP_FWD_UNK_VC_REG(HalDev->dev_base) = ((HalCh->FwdUnkVc<<31)|Ch);
6692 +
6693 +  /* Configure Tx Channel Mapping Register (turn channel "ON") */
6694 +  TX_CH_MAPPING_REG(HalDev->dev_base) = 0x80000000  | 
6695 +                                        (HalCh->DaMask << 30) 
6696 +                                        | (HalCh->Priority << 24) | Ch;
6697 +
6698 +  /* Setup Rx Channel in the LUT */
6699 +  i=0;
6700 +  while (!(RX_LUT_CH_SETUP_REQ_REG(HalDev->dev_base) & 0x80000000))
6701 +    {
6702 +    if (i > WAIT_THRESH)
6703 +      {
6704 +       return(EC_CPSAR|EC_FUNC_CHSETUP|EC_VAL_LUT_NOT_READY);
6705 +      }
6706 +    else
6707 +      i++;
6708 +    }
6709 +
6710 +  /* RX LUT is ready */
6711 +  RX_LUT_CH_SETUP_REQ_REG(HalDev->dev_base) = (HalCh->PktType << 24) | Ch;
6712 +  RX_LUT_CH_SETUP_REQ_VC_REG(HalDev->dev_base) = ((HalCh->Vpi << 20) |  
6713 +    (HalCh->Vci << 4));
6714 +
6715 +  return (EC_NO_ERRORS);
6716 +  }
6717 +
6718 +static int halChannelTeardown(CPSAR_DEVICE *HalDev, int Ch, bit32 Mode)
6719 +  {
6720 +   int waitcnt = 0;
6721 +   int PdspBlockOffset = 0, i;
6722 +   volatile bit32u *pTmp;
6723 +
6724 +#ifdef __CPHAL_DEBUG
6725 +  if (DBG(0))
6726 +    {
6727 +     dbgPrintf("[cpsar]halChannelTeardown(HalDev:%08x, Ch:%d, Mode:%d\n", 
6728 +                            (bit32u)HalDev, Ch, Mode);
6729 +     osfuncSioFlush();
6730 +    }
6731 +#endif
6732 +
6733 +   if ((Ch < 0) || (Ch > MAX_CHAN)) 
6734 +     return(EC_CPSAR|EC_FUNC_CHTEARDOWN|EC_VAL_INVALID_CH);
6735 +
6736 +   /* Request RX channel teardown through LUT */
6737 +   while ((RX_LUT_CH_TEARDOWN_REQ_REG(HalDev->dev_base) & 0x80000000) == 0)
6738 +     {
6739 +      waitcnt++;
6740 +      if (waitcnt == WAIT_THRESH)
6741 +        {
6742 +         return(EC_CPSAR|EC_FUNC_CHTEARDOWN|EC_VAL_LUT_NOT_READY);
6743 +        }
6744 +     }
6745 +
6746 +   RX_LUT_CH_TEARDOWN_REQ_REG(HalDev->dev_base) = (Ch & 0xffff);
6747 +
6748 +   /* for AAL2, clear channel PDSP RAM here.  AAL5 does it when the teardown
6749 +      has completed (which is asynchronous)*/
6750 +   if (Ch > 15)
6751 +     {
6752 +      /* Get the offset to the AAL2 portion of the block (in words) */
6753 +      PdspBlockOffset = NUM_PDSP_AAL5_STATE_WORDS + ((Ch-16)*64);
6754 +      /* Clear PDSP State RAM */
6755 +      pTmp = (pPDSP_BLOCK_0(HalDev->dev_base)+PdspBlockOffset);
6756 +      for (i=0; i<NUM_PDSP_AAL2_STATE_WORDS; i++)
6757 +        *pTmp++ = 0;
6758 +     }
6759 +
6760 +   return (EC_NO_ERRORS);
6761 +  }
6762 +
6763 +int InitPdsp(CPSAR_DEVICE *HalDev)
6764 +  {
6765 +   bit32u NumOfEntries,i,IRamAddress,iTmp;
6766 +   int *SarPdspFirmware; /* ~GSG 030403 */
6767 +   int FirmwareSize, rc; /* ~GSG 030403 */
6768 +
6769 +#ifdef __CPHAL_DEBUG
6770 +  if (DBG(0))
6771 +    {
6772 +     dbgPrintf("[cpsar]InitPdsp(HalDev:%08x)\n", (bit32u)HalDev);
6773 +     osfuncSioFlush();
6774 +    }
6775 +#endif
6776 +
6777 +   /* Get firmware */
6778 +   rc = HalDev->OsFunc->Control(HalDev->OsDev, "Firmware", "Get", &SarPdspFirmware);  /* ~GSG 030403 */
6779 +   if (rc)                                                  /* +GSG 030403 */
6780 +     return (EC_CPSAR|EC_FUNC_OPEN|EC_VAL_KEY_NOT_FOUND);   /* +GSG 030403 */
6781 +
6782 +   /* Get firmware size */
6783 +   rc = HalDev->OsFunc->Control(HalDev->OsDev, "FirmwareSize", "Get", &FirmwareSize); /* ~GSG 030403 */
6784 +   if (rc)                                                  /* +GSG 030403 */
6785 +     return (EC_CPSAR|EC_FUNC_OPEN|EC_VAL_KEY_NOT_FOUND);   /* +GSG 030403 */
6786 +
6787 +   IRamAddress = (bit32u) pPDSP_CTRL_REG(HalDev->dev_base);
6788
6789 +   NumOfEntries = (FirmwareSize)/4;                         /* ~GSG 030403 */
6790 +   if (NumOfEntries > IRAM_SIZE)
6791 +     {
6792 +       /* Note: On Avalanche, they truncated the PDSP firmware and warned */
6793 +       /* NumOfEntries = IRAM_SIZE; */
6794 +       return(EC_CPSAR|EC_FUNC_INIT|EC_VAL_FIRMWARE_TOO_LARGE);
6795 +     }
6796 +   for(i=8;i<NumOfEntries;i++)
6797 +     (*((bit32 *) (IRamAddress+(i*4))))=SarPdspFirmware[i]; /* ~GSG 030403 */
6798 +
6799 +      /* Check code */
6800 +   for(i=8;i<NumOfEntries;i++)
6801 +     {
6802 +       iTmp=(*((bit32 *) (IRamAddress+(i*4))));
6803 +       if (iTmp != SarPdspFirmware[i])                      /* ~GSG 030403 */
6804 +         {
6805 +           return(EC_CPSAR|EC_FUNC_OPEN|EC_VAL_PDSP_LOAD_FAIL);
6806 +         }
6807 +     }
6808 +      
6809 +   return(EC_NO_ERRORS);
6810 +  }
6811 +
6812 +/*
6813 + *  This function probes for the instance of the CPHAL module.  It will call
6814 + *  the OS function @c DeviceFindInfo() to get the information required.
6815 + *  
6816 + *  @param   HalDev      CPHAL module instance. (set by xxxInitModule())
6817 + *
6818 + *  @return  0 OK, Otherwise error.
6819 + */
6820 +static int halProbe(CPSAR_DEVICE *HalDev)
6821 +  {
6822 +   int Ret;
6823 +
6824 +#ifdef __CPHAL_DEBUG
6825 +   if (DBG(0))
6826 +     {
6827 +      dbgPrintf("[cpsar]halProbe(HalDev:%08x)\n", (bit32u)HalDev);
6828 +      osfuncSioFlush();
6829 +     }
6830 +#endif
6831 +
6832 +#ifdef __CPHAL_DEBUG
6833 +   if (DBG(1))
6834 +     {
6835 +      dbgPrintf("[os]DeviceFindInfo(Inst:%d, DeviceName:%s, DeviceInfo:%08x)\n",
6836 +                HalDev->Inst, "sar", (bit32u)&HalDev->DeviceInfo);
6837 +      osfuncSioFlush();
6838 +     }
6839 +#endif
6840 +
6841 +   /* Attempt to find the device information */
6842 +   Ret = HalDev->OsFunc->DeviceFindInfo(HalDev->Inst, "sar", &HalDev->DeviceInfo);
6843 +   if (Ret)
6844 +     return(EC_CPSAR|EC_FUNC_PROBE|EC_VAL_DEVICE_NOT_FOUND);
6845 +
6846 +   return(EC_NO_ERRORS);    
6847 +  }
6848 +
6849 +#ifdef __CPHAL_DEBUG
6850 +static void dbgConfigDump(HAL_DEVICE *HalDev)
6851 +  {
6852 +   dbgPrintf("  [cpsar Inst %d] Config Dump:\n", HalDev->Inst);
6853 +   dbgPrintf("    Base    :%08x, offset   :%08d\n", 
6854 +             HalDev->dev_base, HalDev->offset);
6855 +   dbgPrintf("    ResetBit:%08d, ResetBase:%08x\n", 
6856 +             HalDev->ResetBit, HalDev->ResetBase);
6857 +   dbgPrintf("    UniNni  :%08d, debug    :%08d\n", 
6858 +             HalDev->ResetBit, HalDev->debug);
6859 +   osfuncSioFlush();
6860 +  }
6861 +#endif
6862 +
6863 +/*
6864 + * Sets up HAL default configuration parameter values.
6865 + */
6866 +static void ConfigInit(CPSAR_DEVICE *HalDev)
6867 +  {
6868 +#ifdef __CPHAL_DEBUG
6869 +   if (DBG(0))
6870 +     {
6871 +      dbgPrintf("[cpsar]ConfigInit(HalDev:%08x)\n", (bit32u)HalDev);
6872 +      osfuncSioFlush();
6873 +     }
6874 +#endif
6875 +   /* configure some defaults with tnetd7300 values */
6876 +   HalDev->dev_base = 0xa3000000;
6877 +   HalDev->offset = 0;
6878 +   HalDev->UniNni = CFG_UNI_NNI;
6879 +   HalDev->ResetBit = 9;
6880 +   HalDev->debug = 0;
6881 +   HalDev->ResetBase = 0xa8611600;
6882 +  }
6883 +
6884 +/*
6885 + * Retrieve HAL configuration parameter values.
6886 + */
6887 +static bit32u ConfigGet(HAL_DEVICE *HalDev)
6888 +  {
6889 +   bit32u ParmValue, error_code;
6890 +   char *DeviceInfo = HalDev->DeviceInfo;
6891 +
6892 +#ifdef __CPHAL_DEBUG
6893 +   if (DBG(0))
6894 +     {
6895 +      dbgPrintf("[cpsar]ConfigGet(HalDev:%08x)\n", (bit32u)HalDev);
6896 +      osfuncSioFlush();
6897 +     }
6898 +#endif
6899 +
6900 +   /* get the configuration parameters common to all modules */
6901 +   error_code = ConfigGetCommon(HalDev);
6902 +   if (error_code) return (EC_CPSAR|error_code);
6903 +
6904 +   /* get SAR specific configuration parameters */
6905 +   error_code = HalDev->OsFunc->DeviceFindParmUint(DeviceInfo,"UniNni",&ParmValue);
6906 +   if (!error_code) HalDev->UniNni = ParmValue;
6907 +
6908 +   return (EC_NO_ERRORS);
6909 +  }
6910 +
6911 +static int halInit(CPSAR_DEVICE *HalDev)
6912 +  {
6913 +   bit32u Ret;
6914 +
6915 +#ifdef __CPHAL_DEBUG
6916 +   if (DBG(0))
6917 +     {
6918 +      dbgPrintf("[cpsar]halInit(HalDev:%08x)\n", (bit32u)HalDev);
6919 +      osfuncSioFlush();
6920 +     }
6921 +#endif
6922 +
6923 +#ifdef __CPHAL_DEBUG
6924 +   if (DBG(7))
6925 +     {
6926 +      dbgPrintf("[cpsar halInit()]InitCount = %d\n", HalDev->InitCount);
6927 +      osfuncSioFlush();
6928 +     }
6929 +#endif
6930 +
6931 +   /* Only run the init code for the first calling module per instance */
6932 +   if (HalDev->InitCount > 1)
6933 +     {
6934 +      return (EC_NO_ERRORS);
6935 +     }
6936 +
6937 +   /* Configure HAL defaults */
6938 +   ConfigInit(HalDev);
6939 +
6940 +   /* Retrieve HAL configuration parameters from data store */
6941 +   Ret = ConfigGet(HalDev);
6942 +   if (Ret) return (Ret);
6943 +
6944 +#ifdef __CPHAL_DEBUG
6945 +   if (DBG(9))
6946 +     dbgConfigDump(HalDev);
6947 +#endif
6948 +
6949 +   return(EC_NO_ERRORS);
6950 +  }
6951 +
6952 +static int halOpen(CPSAR_DEVICE *HalDev)
6953 +  {
6954 +   int Ret, Ticks=64;
6955 +   int i;              /*+GSG 030407*/
6956 +   volatile int *pTmp; /*+GSG 030407*/
6957 +
6958 +#ifdef __CPHAL_DEBUG
6959 +   if (DBG(0))
6960 +     {
6961 +      dbgPrintf("[cpsar]halOpen(HalDev:%08x)\n", (bit32u)HalDev);
6962 +      osfuncSioFlush();
6963 +     }
6964 +#endif
6965 +
6966 +#ifdef __CPHAL_DEBUG
6967 +   if (DBG(7))
6968 +     {
6969 +      dbgPrintf("[cpsar halOpen()]OpenCount = %d\n", HalDev->OpenCount);      
6970 +      osfuncSioFlush();
6971 +     }
6972 +#endif
6973 +
6974 +   /* Only run the open code for the first calling module per instance */
6975 +   if (HalDev->OpenCount++ > 0)
6976 +     {
6977 +      return (EC_NO_ERRORS);
6978 +     }
6979 +
6980 +   /* Take SAR out of reset */
6981 +   if (((*(volatile bit32u *)(HalDev->ResetBase)) & (1<<HalDev->ResetBit)) != 0)
6982 +     {
6983 +       /** @todo Should I somehow call AAL5/AAL2 Close() here? All I've done
6984 +           here is copy the Close code from each and paste it here. */   
6985 +
6986 +#ifdef __CPHAL_DEBUG
6987 +      if (DBG(7))
6988 +        {
6989 +         dbgPrintf("[cpsar halOpen()]Module was already out of reset.\n");
6990 +         dbgPrintf("                 Closing module and resetting.\n");
6991 +         osfuncSioFlush();
6992 +        }
6993 +#endif
6994 +
6995 +      /* Disable the Tx CPPI DMA */
6996 +      TX_CPPI_CTL_REG(HalDev->dev_base) = 0;
6997 +
6998 +      /* Disable the Rx CPPI DMA */
6999 +      RX_CPPI_CTL_REG(HalDev->dev_base) = 0;
7000 +
7001 +      /* Disable the PDSP */
7002 +      PDSP_CTRL_REG(HalDev->dev_base) &=~ 0x00000002;
7003 +
7004 +      /* disable interrupt masks */
7005 +      SAR_TX_MASK_CLR(HalDev->dev_base) = 0xffffffff;
7006 +      SAR_RX_MASK_CLR(HalDev->dev_base) = 0xffffffff;
7007 +
7008 +#ifndef NO_RESET /* GSG+ 030428 */
7009 +      /* clear reset bit */
7010 +      (*(volatile bit32u *)(HalDev->ResetBase)) &=~ (1<<HalDev->ResetBit); /* ~GSG 030307 */
7011 +      HalDev->OsFunc->Control(HalDev->OsDev, "Sleep", "", &Ticks);
7012 +
7013 +      /* set reset bit */
7014 +      (*(volatile bit32u *)(HalDev->ResetBase)) |= (1<<HalDev->ResetBit); /* ~GSG 030307 */
7015 +      HalDev->OsFunc->Control(HalDev->OsDev, "Sleep", "", &Ticks);
7016 +#endif /* GSG+ 030428 */
7017 +     }
7018 +    else
7019 +     {
7020 +      (*(volatile bit32u *)(HalDev->ResetBase)) |= (1<<HalDev->ResetBit); /* ~GSG 030307 */
7021 +      HalDev->OsFunc->Control(HalDev->OsDev, "Sleep", "", &Ticks);
7022 +     }
7023 +
7024 +   /* Configure UNI/NNI */
7025 +   RX_LUT_GLOBAL_CFG_REG(HalDev->dev_base) |= (HalDev->UniNni & 0x1);
7026 +
7027 +   /* Clear entire PDSP state RAM */                /*+GSG 030407*/
7028 +   pTmp = (pTX_DMA_STATE_WORD_0(HalDev->dev_base)); /*+GSG 030407*/
7029 +   for (i=0; i<PDSP_STATE_RAM_SIZE; i++)            /*+GSG 030407*/
7030 +     *pTmp++ = 0;                                   /*+GSG 030407*/
7031 +
7032 +   /* Configure Oam Mode */                         /*+GSG 030407*/
7033 +   SetOamMode(HalDev);                              /*+GSG 030407*/
7034 +
7035 +   /* Initialize PDSP */
7036 +   Ret=InitPdsp(HalDev);
7037 +   if(Ret)
7038 +     return(Ret);
7039 +
7040 +   /* Reset and Enable the PDSP */
7041 +   PDSP_CTRL_REG(HalDev->dev_base) = 0x00080003;
7042 +
7043 +   return(EC_NO_ERRORS);
7044 +  }
7045 +
7046 +static int halClose(CPSAR_DEVICE *HalDev, int Mode)
7047 +  {
7048 +   int Ticks = 64;
7049 +
7050 +#ifdef __CPHAL_DEBUG
7051 +  if (DBG(0))
7052 +    {
7053 +     dbgPrintf("[cpsar]halClose(HalDev:%08x, Mode:%d)\n", (bit32u)HalDev, Mode);
7054 +     osfuncSioFlush();
7055 +    }
7056 +#endif
7057 +
7058 +   /* handle the error case if there is nothing open */
7059 +   if (HalDev->OpenCount == 0)
7060 +     {
7061 +      return(EC_CPSAR|EC_FUNC_CLOSE|EC_VAL_MODULE_ALREADY_CLOSED);
7062 +     }
7063 +
7064 +#ifdef __CPHAL_DEBUG
7065 +   if (DBG(7))
7066 +     {
7067 +      dbgPrintf("[cpsar halClose()]OpenCount = %d\n", HalDev->OpenCount);
7068 +      osfuncSioFlush();
7069 +     }
7070 +#endif
7071 +
7072 +   /* Only run the close code for the last calling module per instance */
7073 +   if (HalDev->OpenCount-- > 1)
7074 +     {
7075 +      return (EC_NO_ERRORS);
7076 +     }
7077 +
7078 +   /* Disable the PDSP */
7079 +   PDSP_CTRL_REG(HalDev->dev_base) &=~ 0x00000002;
7080 +
7081 +#ifndef NO_RESET /* GSG +030428 */
7082 +   /* put device back into reset */
7083 +   (*(volatile bit32u *)(HalDev->ResetBase)) &=~ (1<<HalDev->ResetBit); /* ~GSG 030307 */
7084 +   HalDev->OsFunc->Control(HalDev->OsDev, "Sleep", "", &Ticks);
7085 +#endif /* GSG +030428 */
7086 +
7087 +   return(EC_NO_ERRORS);
7088 +  }
7089 +
7090 +static int halShutdown(CPSAR_DEVICE *HalDev)
7091 +  {
7092 +#ifdef __CPHAL_DEBUG
7093 +   if (DBG(0))
7094 +     {
7095 +      dbgPrintf("[cpsar]halShutdown(HalDev:%08x)\n", (bit32u)HalDev);
7096 +      osfuncSioFlush();
7097 +     }
7098 +#endif
7099 +
7100 +   /* handle the error case */
7101 +   if (HalDev->InitCount == 0)
7102 +     {
7103 +      return(EC_CPSAR|EC_FUNC_CLOSE|EC_VAL_MODULE_ALREADY_SHUTDOWN);
7104 +     }
7105 +
7106 +#ifdef __CPHAL_DEBUG
7107 +   if (DBG(7))
7108 +     {
7109 +      dbgPrintf("[cpsar halShutdown()]InitCount = %d\n", HalDev->InitCount);
7110 +      osfuncSioFlush();
7111 +     }
7112 +#endif
7113 +
7114 +   /* Only run the shutdown code for the last calling module per instance */
7115 +   if (HalDev->InitCount-- > 1)
7116 +     {
7117 +      return (EC_NO_ERRORS);
7118 +     }
7119 +
7120 +   /* free the SAR functions */
7121 +#ifdef __CPHAL_DEBUG
7122 +   if (DBG(6))
7123 +     {
7124 +      dbgPrintf("  [cpsar halShutdown()]: Free CPSAR function pointers\n");
7125 +      osfuncSioFlush();
7126 +     }
7127 +   if (DBG(1)||DBG(3))
7128 +     {
7129 +      dbgPrintf("[os]Free(MemPtr:%08x)\n", (bit32u)HalDev->HalFuncPtr);
7130 +      osfuncSioFlush();
7131 +     }
7132 +#endif
7133 +   /* free the HalFunc */
7134 +   HalDev->OsFunc->Free(HalDev->HalFuncPtr);
7135 +
7136 +   /* we have a static global, so I should clear it's value as well */
7137 +   CpsarDev[HalDev->Inst] = 0;
7138 +
7139 +#ifdef __CPHAL_DEBUG
7140 +   if (DBG(6))
7141 +     {
7142 +      dbgPrintf("  [cpsar halShutdown()]Free HalDev\n");
7143 +      osfuncSioFlush();
7144 +     }
7145 +   if (DBG(1)||DBG(3))
7146 +     {
7147 +      dbgPrintf("[os]Free(MemPtr:%08x)\n", (bit32u)HalDev);
7148 +      osfuncSioFlush();
7149 +     }
7150 +#endif
7151 +   /* free the CPSAR device */
7152 +   HalDev->OsFunc->Free(HalDev);
7153 +
7154 +   return(EC_NO_ERRORS);
7155 +  }
7156 +
7157 +static int halTick(CPSAR_DEVICE *HalDev)
7158 +  {   
7159 +#ifdef __CPHAL_DEBUG
7160 +   if (DBG(0))
7161 +     {
7162 +      dbgPrintf("[cpsar]halTick(HalDev:%08x)\n", (bit32u)HalDev);
7163 +      osfuncSioFlush();
7164 +     }
7165 +#endif
7166 +
7167 +   return(EC_NO_ERRORS); 
7168 +  }
7169 +
7170 +/*
7171 + *  The CPSAR version of InitModule() should be passed the OS_FUNCTIONS pointer,
7172 + *  and will return the HalDev pointer.
7173 + *
7174 + *  @param   HalDev  Pointer to CPSAR module information.  This will 
7175 + *                   be used by the OS when communicating to this module via 
7176 + *                   CPSAR. 
7177 + *  @param   OsDev   Pointer to OS device information.  This will be saved by
7178 + *                   the CPSAR and returned to the OS when required.
7179 + *  @param   HalFunc HAL_FUNCTIONS pointer.
7180 + *  @param   Size    Pointer to the size of the HAL_FUNCTIONS structure.  (If
7181 + *                   HalFunc is 0, the value will be set by CPSAR, otherwise 
7182 + *                   ignored)
7183 + *  @param   Inst    The instance number of the module to initialize. (start at
7184 + *                   0).
7185 + * 
7186 + *  @return  0 OK, Nonzero - error.
7187 + */
7188 +/*
7189 +int cpsarInitModule(CPSAR_DEVICE **HalDev, 
7190 +                 OS_DEVICE *OsDev, 
7191 +                 CPSAR_FUNCTIONS *HalFunc,
7192 +                 OS_FUNCTIONS *OsFunc,
7193 +                 int *Size,
7194 +                 int Inst)
7195 +*/
7196 +int cpsarInitModule(CPSAR_DEVICE **HalDev, 
7197 +                 OS_DEVICE *OsDev, 
7198 +                 CPSAR_FUNCTIONS **HalFunc, 
7199 +                 OS_FUNCTIONS *OsFunc, 
7200 +                 int OsFuncSize,
7201 +                 int *HalFuncSize,
7202 +                 int Inst)
7203 +  {
7204 +   CPSAR_DEVICE *HalPtr;
7205 +   CPSAR_FUNCTIONS *HalFuncPtr;
7206 +
7207 +   /*
7208 +   if ( HalFunc == 0 )
7209 +     {
7210 +      *Size = sizeof(CPSAR_FUNCTIONS);
7211 +      return(EC_NO_ERRORS);   
7212 +     }
7213 +   */
7214 +
7215 +   if (CpsarDev[Inst] != 0)
7216 +     {
7217 +      /* this SAR module has been connected to before, so do not
7218 +         allocate another CPSAR_DEVICE */
7219 +      HalPtr = CpsarDev[Inst];
7220 +  
7221 +      /* increase count of attached modules */
7222 +      HalPtr->InitCount++;
7223 +     }
7224 +    else
7225 +     {
7226 +      /* allocate the CPSAR_DEVICE structure */
7227 +      HalPtr = (CPSAR_DEVICE *) OsFunc->MallocDev(sizeof(CPSAR_DEVICE));
7228 +      if(!HalPtr)
7229 +        return(EC_CPSAR|EC_FUNC_HAL_INIT|EC_VAL_MALLOC_DEV_FAILED);
7230 +
7231 +      HalFuncPtr = (CPSAR_FUNCTIONS *) OsFunc->Malloc(sizeof(CPSAR_FUNCTIONS));
7232 +      if (!HalFuncPtr)
7233 +        return (EC_CPSAR|EC_FUNC_HAL_INIT|EC_VAL_MALLOC_FAILED);
7234 +
7235 +      /* Initialize the size of hal functions */
7236 +      *HalFuncSize = sizeof (CPSAR_FUNCTIONS);
7237 +
7238 +      /* ensure the device structure is cleared */
7239 +      OsFunc->Memset(HalPtr, 0, sizeof(CPSAR_DEVICE));
7240 +      
7241 +      /* clear the function pointers */
7242 +      OsFunc->Memset(HalFuncPtr, 0, sizeof(CPSAR_FUNCTIONS));
7243 +
7244 +      /* Supply pointers for the CPSAR API functions */
7245 +      HalFuncPtr->ChannelSetup    = halChannelSetup;
7246 +      HalFuncPtr->ChannelTeardown = halChannelTeardown;
7247 +      HalFuncPtr->Close           = halClose;
7248 +      HalFuncPtr->Control         = halControl;
7249 +      HalFuncPtr->Init            = halInit;
7250 +      HalFuncPtr->Open            = halOpen;
7251 +      HalFuncPtr->Probe           = halProbe;
7252 +      HalFuncPtr->Shutdown        = halShutdown;
7253 +      HalFuncPtr->Tick            = halTick;
7254 +
7255 +      /* keep a reference to HalFuncPtr so I can free it later */
7256 +      HalPtr->HalFuncPtr = HalFuncPtr;
7257 +
7258 +      /* store the CPSAR_DEVICE, so the CPSAR module will know whether
7259 +         it is in use for the given instance */
7260 +      CpsarDev[Inst] = HalPtr;
7261 +     
7262 +      /* increase count of attached modules */
7263 +      HalPtr->InitCount++;
7264 +     }
7265 +
7266 +   /* @todo Does this need modification to deal with multiple callers/
7267 +      drivers?  If different callers will use different OsDev/OsFunc,
7268 +      then the current code will not work.
7269 +   */
7270 +
7271 +   /* initialize the CPSAR_DEVICE structure */
7272 +   HalPtr->OsDev  = OsDev;
7273 +   /*HalPtr->OsOpen = OsDev;*/
7274 +   HalPtr->Inst   = Inst;
7275 +   HalPtr->OsFunc = OsFunc;
7276 +
7277 +   /* pass the HalPtr back to the caller */
7278 +   *HalDev = HalPtr;
7279 +   *HalFunc = HalPtr->HalFuncPtr;
7280 +
7281 +   return (EC_NO_ERRORS);
7282 +  }
7283 diff -urN linux.old/drivers/atm/sangam_atm/cpsar_cpaal5.h linux.dev/drivers/atm/sangam_atm/cpsar_cpaal5.h
7284 --- linux.old/drivers/atm/sangam_atm/cpsar_cpaal5.h     1970-01-01 01:00:00.000000000 +0100
7285 +++ linux.dev/drivers/atm/sangam_atm/cpsar_cpaal5.h     2005-08-23 04:46:50.087845216 +0200
7286 @@ -0,0 +1,103 @@
7287 +/*******************************************************************************
7288 + *  TNETDxxxx Software Support
7289 + *  Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
7290 + *
7291 + *  FILE:   cpsar.h
7292 + *
7293 + *  DESCRIPTION:
7294 + *      This file contains data structure definitions for the CPSAR HAL.
7295 + *
7296 + *  HISTORY:
7297 + *      6Sep02 Greg        1.00  Original Version created. 
7298 + *
7299 + *****************************************************************************/
7300 +#ifndef _INC_CPSAR
7301 +#define _INC_CPSAR
7302 +
7303 +#define NUM_RX_STATE_WORDS    7
7304 +#define NUM_TX_STATE_WORDS    9
7305 +#define MAX_CHAN        19
7306 +
7307 +
7308 +#ifndef _CPHAL_CPSAR
7309 +typedef void CPSAR_DEVICE;
7310 +#endif
7311 +
7312 +/* 
7313 + * HAL Default Parameter Values
7314 + */
7315 +#define  CFG_UNI_NNI  0
7316 +
7317 +/**
7318 + *  @ingroup shared_data
7319 + * 
7320 + *  List of defined keys for use with Control().
7321 + */
7322 +typedef enum 
7323 +  {
7324 +   /* SAR */
7325 +   enGET_FIRMWARE,        /**< Used by the SAR to request a pointer to firmware */
7326 +   enGET_FIRMWARE_SIZE,   /**< Used by the SAR to request the size of the firmware */
7327 +   enEND=9999 /* Last entry */
7328 +  }INFO_KEY;
7329 +
7330 +/*
7331 + *  The CPHAL_FUNCTIONS struct defines the CPHAL function pointers used by upper layer 
7332 + *  software.  The upper layer software receives these pointers through the
7333 + *  call to cphalInitModule().
7334 + */
7335 +typedef struct
7336 +  {
7337 +  int  (*ChannelSetup)(CPSAR_DEVICE *HalDev, CHANNEL_INFO *HalCh);
7338 +  int  (*ChannelTeardown)(CPSAR_DEVICE *HalDev, int Ch, int Mode);
7339 +  int  (*Close)(CPSAR_DEVICE *HalDev, int Mode);
7340 +  int  (*Control)(CPSAR_DEVICE *HalDev, const char *Key, const char *Action, void *Value); 
7341 +  int  (*Init)(CPSAR_DEVICE *HalDev);
7342 +  int  (*ModeChange)(CPSAR_DEVICE *HalDev, char *DeviceParms);
7343 +  int  (*Open)(CPSAR_DEVICE *HalDev);
7344 +  int  (*Probe)(CPSAR_DEVICE *HalDev);
7345 +  int  (*Shutdown)(CPSAR_DEVICE *HalDev);
7346 +  int  (*Tick)(CPSAR_DEVICE *HalDev);
7347 +  } CPSAR_FUNCTIONS;
7348 +
7349 +/*
7350 + *  This is the data structure for a generic HAL device.  It contains all device
7351 + *  specific data for a single instance of that device.  This includes Rx/Tx 
7352 + *  buffer queues, device base address, reset bit, and other information.
7353 + */
7354 +typedef struct cpsar_device
7355 +  {    
7356 +   bit32  dev_base;
7357 +   bit32  offset;
7358 +   bit32  TxTeardownPending[MAX_CHAN];
7359 +   bit32  RxTeardownPending[MAX_CHAN];
7360 +   bit32  ChIsOpen[MAX_CHAN];
7361 +   bit32  ResetBit;
7362 +   bit32  debug;
7363 +   OS_DEVICE *OsDev;
7364 +   OS_FUNCTIONS *OsFunc;
7365 +    /*void   *OsOpen;*/
7366 +   bit32  UniNni;
7367 +   bit32  Inst;
7368 +   bit32u DeviceCPID[4];
7369 +   bit32u LBSourceLLID[4];
7370 +   bit32u OamRate[11];
7371 +   CHANNEL_INFO ChData[MAX_CHAN];
7372 +   int    InitCount;
7373 +   int    OpenCount;
7374 +   char   *DeviceInfo;
7375 +   bit32u ResetBase;
7376 +   DEVICE_STATE State;
7377 +   CPSAR_FUNCTIONS *HalFuncPtr;
7378 +   int    OamMode; /* +GSG 030407 */
7379 +  }CPSARDEVICE;
7380 +
7381 +extern int cpsarInitModule(CPSAR_DEVICE **HalDev, 
7382 +                 OS_DEVICE *OsDev, 
7383 +                 CPSAR_FUNCTIONS **HalFunc, 
7384 +                 OS_FUNCTIONS *OsFunc, 
7385 +                 int OsFuncSize,
7386 +                 int *HalFuncSize,
7387 +                 int Inst);
7388 +
7389 +#endif
7390 diff -urN linux.old/drivers/atm/sangam_atm/cpsar.h linux.dev/drivers/atm/sangam_atm/cpsar.h
7391 --- linux.old/drivers/atm/sangam_atm/cpsar.h    1970-01-01 01:00:00.000000000 +0100
7392 +++ linux.dev/drivers/atm/sangam_atm/cpsar.h    2005-08-23 04:46:50.087845216 +0200
7393 @@ -0,0 +1,103 @@
7394 +/*******************************************************************************
7395 + *  TNETDxxxx Software Support
7396 + *  Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
7397 + *
7398 + *  FILE:   cpsar.h
7399 + *
7400 + *  DESCRIPTION:
7401 + *      This file contains data structure definitions for the CPSAR HAL.
7402 + *
7403 + *  HISTORY:
7404 + *      6Sep02 Greg        1.00  Original Version created. 
7405 + *
7406 + *****************************************************************************/
7407 +#ifndef _INC_CPSAR
7408 +#define _INC_CPSAR
7409 +
7410 +#define NUM_RX_STATE_WORDS    7
7411 +#define NUM_TX_STATE_WORDS    9
7412 +#define MAX_CHAN        19
7413 +
7414 +
7415 +#ifndef _CPHAL_CPSAR
7416 +typedef void CPSAR_DEVICE;
7417 +#endif
7418 +
7419 +/* 
7420 + * HAL Default Parameter Values
7421 + */
7422 +#define  CFG_UNI_NNI  0
7423 +
7424 +/**
7425 + *  @ingroup shared_data
7426 + * 
7427 + *  List of defined keys for use with Control().
7428 + */
7429 +typedef enum 
7430 +  {
7431 +   /* SAR */
7432 +   enGET_FIRMWARE,        /**< Used by the SAR to request a pointer to firmware */
7433 +   enGET_FIRMWARE_SIZE,   /**< Used by the SAR to request the size of the firmware */
7434 +   enEND=9999 /* Last entry */
7435 +  }INFO_KEY;
7436 +
7437 +/*
7438 + *  The CPHAL_FUNCTIONS struct defines the CPHAL function pointers used by upper layer 
7439 + *  software.  The upper layer software receives these pointers through the
7440 + *  call to cphalInitModule().
7441 + */
7442 +typedef struct
7443 +  {
7444 +  int  (*ChannelSetup)(CPSAR_DEVICE *HalDev, CHANNEL_INFO *HalCh);
7445 +  int  (*ChannelTeardown)(CPSAR_DEVICE *HalDev, int Ch, int Mode);
7446 +  int  (*Close)(CPSAR_DEVICE *HalDev, int Mode);
7447 +  int  (*Control)(CPSAR_DEVICE *HalDev, const char *Key, const char *Action, void *Value); 
7448 +  int  (*Init)(CPSAR_DEVICE *HalDev);
7449 +  int  (*ModeChange)(CPSAR_DEVICE *HalDev, char *DeviceParms);
7450 +  int  (*Open)(CPSAR_DEVICE *HalDev);
7451 +  int  (*Probe)(CPSAR_DEVICE *HalDev);
7452 +  int  (*Shutdown)(CPSAR_DEVICE *HalDev);
7453 +  int  (*Tick)(CPSAR_DEVICE *HalDev);
7454 +  } CPSAR_FUNCTIONS;
7455 +
7456 +/*
7457 + *  This is the data structure for a generic HAL device.  It contains all device
7458 + *  specific data for a single instance of that device.  This includes Rx/Tx 
7459 + *  buffer queues, device base address, reset bit, and other information.
7460 + */
7461 +typedef struct cpsar_device
7462 +  {    
7463 +   bit32  dev_base;
7464 +   bit32  offset;
7465 +   bit32  TxTeardownPending[MAX_CHAN];
7466 +   bit32  RxTeardownPending[MAX_CHAN];
7467 +   bit32  ChIsOpen[MAX_CHAN];
7468 +   bit32  ResetBit;
7469 +   bit32  debug;
7470 +   OS_DEVICE *OsDev;
7471 +   OS_FUNCTIONS *OsFunc;
7472 +    /*void   *OsOpen;*/
7473 +   bit32  UniNni;
7474 +   bit32  Inst;
7475 +   bit32u DeviceCPID[4];
7476 +   bit32u LBSourceLLID[4];
7477 +   bit32u OamRate[11];
7478 +   CHANNEL_INFO ChData[MAX_CHAN];
7479 +   int    InitCount;
7480 +   int    OpenCount;
7481 +   char   *DeviceInfo;
7482 +   bit32u ResetBase;
7483 +   DEVICE_STATE State;
7484 +   CPSAR_FUNCTIONS *HalFuncPtr;
7485 +   int    OamMode; /* +GSG 030407 */
7486 +  }CPSARDEVICE;
7487 +
7488 +extern int cpsarInitModule(CPSAR_DEVICE **HalDev, 
7489 +                 OS_DEVICE *OsDev, 
7490 +                 CPSAR_FUNCTIONS **HalFunc, 
7491 +                 OS_FUNCTIONS *OsFunc, 
7492 +                 int OsFuncSize,
7493 +                 int *HalFuncSize,
7494 +                 int Inst);
7495 +
7496 +#endif
7497 diff -urN linux.old/drivers/atm/sangam_atm/cp_sar_reg.h linux.dev/drivers/atm/sangam_atm/cp_sar_reg.h
7498 --- linux.old/drivers/atm/sangam_atm/cp_sar_reg.h       1970-01-01 01:00:00.000000000 +0100
7499 +++ linux.dev/drivers/atm/sangam_atm/cp_sar_reg.h       2005-08-23 04:46:50.087845216 +0200
7500 @@ -0,0 +1,217 @@
7501 +/***************************************************************************
7502 +        TNETD73xx Software Support
7503 +        Copyright(c) 2000, Texas Instruments Incorporated. All Rights Reserved.
7504 +
7505 +        FILE: cp_sar_reg.h   Register definitions for the SAR module
7506 +
7507 +        DESCRIPTION:
7508 +                This include file contains register definitions for the
7509 +                SAR module.
7510 +
7511 +        HISTORY:
7512 +                15 Jan 02    G. Guyotte   Original version written
7513 +                03 Oct 02    G. Guyotte   C++ style comments removed
7514 +****************************************************************************/
7515 +#ifndef _INC_SAR_REG
7516 +#define _INC_SAR_REG
7517 +
7518 +/* Global Registers */
7519 +#define pSAR_ID_REG(base)                   ((volatile bit32u *)(base+0x0000))
7520 +#define SAR_ID_REG(base)                    (*pSAR_ID_REG(base))
7521 +#define pSAR_STATUS_SET_REG(base)           ((volatile bit32u *)(base+0x0008))
7522 +#define SAR_STATUS_SET_REG(base)            (*pSAR_STATUS_SET_REG(base))
7523 +#define pSAR_STATUS_CLR_REG(base)           ((volatile bit32u *)(base+0x000C))
7524 +#define SAR_STATUS_CLR_REG(base)            (*pSAR_STATUS_CLR_REG(base))
7525 +#define pSAR_HOST_INT_EN_SET_REG(base)      ((volatile bit32u *)(base+0x0010))
7526 +#define SAR_HOST_INT_EN_SET_REG(base)       (*pSAR_HOST_INT_EN_SET_REG(base))
7527 +#define pSAR_HOST_INT_EN_CLR_REG(base)      ((volatile bit32u *)(base+0x0014))
7528 +#define SAR_HOST_INT_EN_CLR_REG(base)       (*pSAR_HOST_INT_EN_CLR_REG(base))
7529 +#define pSAR_PDSP_INT_EN_SET_REG(base)      ((volatile bit32u *)(base+0x0018))
7530 +#define SAR_PDSP_INT_EN_SET_REG(base)       (*pSAR_PDSP_INT_EN_SET_REG(base))
7531 +#define pSAR_PDSP_INT_EN_CLR_REG(base)      ((volatile bit32u *)(base+0x001C))
7532 +#define SAR_PDSP_INT_EN_CLR_REG(base)       (*pSAR_PDSP_INT_EN_CLR_REG(base))
7533 +
7534 +/* PDSP OAM General Purpose Registers */
7535 +#define pSAR_PDSP_HOST_OAM_CONFIG_REG(base) ((volatile bit32u *)(base+0x0020))
7536 +#define SAR_PDSP_HOST_OAM_CONFIG_REG(base)  (*pSAR_PDSP_HOST_OAM_CONFIG_REG(base))
7537 +#define pSAR_PDSP_OAM_CORR_REG(base)        ((volatile bit32u *)(base+0x0024))
7538 +#define SAR_PDSP_OAM_CORR_REG(base)         (*pSAR_PDSP_OAM_CORR_REG(base))
7539 +#define pSAR_PDSP_OAM_LB_RESULT_REG(base)   ((volatile bit32u *)(base+0x0028))
7540 +#define SAR_PDSP_OAM_LB_RESULT_REG(base)    (*pSAR_PDSP_OAM_LB_RESULT_REG(base))
7541 +#define pSAR_PDSP_OAM_F5_LB_COUNT_REG(base) ((volatile bit32u *)(base+0x002c))     /* +GSG 030416 */
7542 +#define SAR_PDSP_OAM_F5_LB_COUNT_REG(base)  (*pSAR_PDSP_OAM_F5_LB_COUNT_REG(base)) /* +GSG 030416 */
7543 +#define pSAR_PDSP_OAM_F4_LB_COUNT_REG(base) ((volatile bit32u *)(base+0x0030))     /* +GSG 030416 */
7544 +#define SAR_PDSP_OAM_F4_LB_COUNT_REG(base)  (*pSAR_PDSP_OAM_F4_LB_COUNT_REG(base)) /* +GSG 030416 */
7545 +#define pSAR_PDSP_FWD_UNK_VC_REG(base)      ((volatile bit32u *)(base+0x0034))     /* +GSG 030701 */
7546 +#define SAR_PDSP_FWD_UNK_VC_REG(base)       (*pSAR_PDSP_FWD_UNK_VC_REG(base))      /* +GSG 030701 */
7547 +
7548 +
7549 +/* Rx Lookup Table Registers */
7550 +#define pRX_LUT_GLOBAL_CFG_REG(base)        ((volatile bit32u *)(base+0x0080))
7551 +#define RX_LUT_GLOBAL_CFG_REG(base)         (*pRX_LUT_GLOBAL_CFG_REG(base))
7552 +#define pRX_LUT_CH_SETUP_REQ_REG(base)      ((volatile bit32u *)(base+0x0090))
7553 +#define RX_LUT_CH_SETUP_REQ_REG(base)       (*pRX_LUT_CH_SETUP_REQ_REG(base))
7554 +#define pRX_LUT_CH_SETUP_REQ_VC_REG(base)   ((volatile bit32u *)(base+0x0094))
7555 +#define RX_LUT_CH_SETUP_REQ_VC_REG(base)    (*pRX_LUT_CH_SETUP_REQ_VC_REG(base))
7556 +#define pRX_LUT_CH_TEARDOWN_REQ_REG(base)   ((volatile bit32u *)(base+0x009C))
7557 +#define RX_LUT_CH_TEARDOWN_REQ_REG(base)    (*pRX_LUT_CH_TEARDOWN_REQ_REG(base))
7558 +
7559 +/* Tx Scheduler Registers */
7560 +#define pTX_CH_MAPPING_REG(base)            ((volatile bit32u *)(base+0x0170))
7561 +#define TX_CH_MAPPING_REG(base)             (*pTX_CH_MAPPING_REG(base))
7562 +
7563 +/* Tx CPPI DMA Controller Registers */
7564 +#define pTX_CPPI_CTL_REG(base)              ((volatile bit32u *)(base+0x0700))
7565 +#define TX_CPPI_CTL_REG(base)               (*pTX_CPPI_CTL_REG(base))
7566 +#define pTX_CPPI_TEARDOWN_REG(base)         ((volatile bit32u *)(base+0x0704))
7567 +#define TX_CPPI_TEARDOWN_REG(base)          (*pTX_CPPI_TEARDOWN_REG(base))
7568 +
7569 +/* EOI Interrupt Additions */
7570 +#define pSAR_EOI(base)                      ((volatile bit32u *)(base+0x0708))
7571 +#define SAR_EOI(base)                       (*pSAR_EOI(base))
7572 +#define pSAR_INTR_VECTOR(base)              ((volatile bit32u *)(base+0x070c))
7573 +#define SAR_INTR_VECTOR(base)               (*pSAR_INTR_VECTOR(base))
7574 +#define pSAR_TX_MASKED_STATUS(base)         ((volatile bit32u *)(base+0x0710))
7575 +#define SAR_TX_MASKED_STATUS(base)          (*pSAR_TX_MASKED_STATUS(base))
7576 +#define pSAR_TX_RAW_STATUS(base)            ((volatile bit32u *)(base+0x0714))
7577 +#define SAR_TX_RAW_STATUS(base)             (*pSAR_TX_RAW_STATUS(base))
7578 +#define pSAR_TX_MASK_SET(base)              ((volatile bit32u *)(base+0x0718))
7579 +#define SAR_TX_MASK_SET(base)               (*pSAR_TX_MASK_SET(base))
7580 +#define pSAR_TX_MASK_CLR(base)              ((volatile bit32u *)(base+0x071c))
7581 +#define SAR_TX_MASK_CLR(base)               (*pSAR_TX_MASK_CLR(base))
7582 +
7583 +/* Rx CPPI DMA Controller Registers */
7584 +#define pRX_CPPI_CTL_REG(base)              ((volatile bit32u *)(base+0x0780))
7585 +#define RX_CPPI_CTL_REG(base)               (*pRX_CPPI_CTL_REG(base))
7586 +#define pSAR_RX_MASKED_STATUS(base)         ((volatile bit32u *)(base+0x0790))
7587 +#define SAR_RX_MASKED_STATUS(base)          (*pSAR_RX_MASKED_STATUS(base))
7588 +#define pSAR_RX_RAW_STATUS(base)            ((volatile bit32u *)(base+0x0794))
7589 +#define SAR_RX_RAW_STATUS(base)             (*pSAR_RX_RAW_STATUS(base))
7590 +#define pSAR_RX_MASK_SET(base)              ((volatile bit32u *)(base+0x0798))
7591 +#define SAR_RX_MASK_SET(base)               (*pSAR_RX_MASK_SET(base))
7592 +#define pSAR_RX_MASK_CLR(base)              ((volatile bit32u *)(base+0x079c))
7593 +#define SAR_RX_MASK_CLR(base)               (*pSAR_RX_MASK_CLR(base))
7594 +
7595 +/* PDSP Control/Status Registers */
7596 +#define pPDSP_CTRL_REG(base)                ((volatile bit32u *)(base+0x4000))
7597 +#define PDSP_CTRL_REG(base)                 (*pPDSP_CTRL_REG(base))
7598 +
7599 +/* PDSP Instruction RAM */
7600 +#define pPDSP_IRAM(base)                    ((volatile bit32u *)(base+0x4020))
7601 +#define PDSP_IRAM(base)                     (*pPDSP_IRAM(base))
7602 +
7603 +/*
7604 + * Channel 0 State/Scratchpad RAM Block
7605 + * 
7606 + * The following registers (Tx DMA State, Rx DMA State, CPPI Completion PTR, 
7607 + * and PDSP Data) have been given the correct address for channel 0.  To
7608 + * reach the registers for channel X, add (X * 0x100) to the pointer address.
7609 + *
7610 + */
7611 +
7612 +#define PDSP_STATE_RAM_SIZE   1024
7613 +
7614 +/* Tx DMA State RAM */
7615 +#define pTX_DMA_STATE_WORD_0(base)          ((volatile bit32u *)(base+0x8000))
7616 +#define TX_DMA_STATE_WORD_0(base)           (*pTX_DMA_STATE_WORD_0(base))
7617 +#define pTX_DMA_STATE_WORD_1(base)          ((volatile bit32u *)(base+0x8004))
7618 +#define TX_DMA_STATE_WORD_1(base)           (*pTX_DMA_STATE_WORD_1(base))
7619 +#define pTX_DMA_STATE_WORD_2(base)          ((volatile bit32u *)(base+0x8008))
7620 +#define TX_DMA_STATE_WORD_2(base)           (*pTX_DMA_STATE_WORD_2(base))
7621 +#define pTX_DMA_STATE_WORD_3(base)          ((volatile bit32u *)(base+0x800C))
7622 +#define TX_DMA_STATE_WORD_3(base)           (*pTX_DMA_STATE_WORD_3(base))
7623 +#define pTX_DMA_STATE_WORD_4(base)          ((volatile bit32u *)(base+0x8010))
7624 +#define TX_DMA_STATE_WORD_4(base)           (*pTX_DMA_STATE_WORD_4(base))
7625 +#define pTX_DMA_STATE_WORD_5(base)          ((volatile bit32u *)(base+0x8014))
7626 +#define TX_DMA_STATE_WORD_5(base)           (*pTX_DMA_STATE_WORD_5(base))
7627 +#define pTX_DMA_STATE_WORD_6(base)          ((volatile bit32u *)(base+0x8018))
7628 +#define TX_DMA_STATE_WORD_6(base)           (*pTX_DMA_STATE_WORD_6(base))
7629 +#define pTX_DMA_STATE_WORD_7(base)          ((volatile bit32u *)(base+0x801C))
7630 +#define TX_DMA_STATE_WORD_7(base)           (*pTX_DMA_STATE_WORD_7(base))
7631 +#define pTX_DMA_STATE_WORD_8(base)          ((volatile bit32u *)(base+0x8020))
7632 +#define TX_DMA_STATE_WORD_8(base)           (*pTX_DMA_STATE_WORD_8(base))
7633 +
7634 +/* Rx DMA State RAM */
7635 +#define pRX_DMA_STATE_WORD_0(base)          ((volatile bit32u *)(base+0x8024))
7636 +#define RX_DMA_STATE_WORD_0(base)           (*pRX_DMA_STATE_WORD_0(base))
7637 +#define pRX_DMA_STATE_WORD_1(base)          ((volatile bit32u *)(base+0x8028))
7638 +#define RX_DMA_STATE_WORD_1(base)           (*pRX_DMA_STATE_WORD_1(base))
7639 +#define pRX_DMA_STATE_WORD_2(base)          ((volatile bit32u *)(base+0x802C))
7640 +#define RX_DMA_STATE_WORD_2(base)           (*pRX_DMA_STATE_WORD_2(base))
7641 +#define pRX_DMA_STATE_WORD_3(base)          ((volatile bit32u *)(base+0x8030))
7642 +#define RX_DMA_STATE_WORD_3(base)           (*pRX_DMA_STATE_WORD_3(base))
7643 +#define pRX_DMA_STATE_WORD_4(base)          ((volatile bit32u *)(base+0x8034))
7644 +#define RX_DMA_STATE_WORD_4(base)           (*pRX_DMA_STATE_WORD_4(base))
7645 +#define pRX_DMA_STATE_WORD_5(base)          ((volatile bit32u *)(base+0x8038))
7646 +#define RX_DMA_STATE_WORD_5(base)           (*pRX_DMA_STATE_WORD_5(base))
7647 +#define pRX_DMA_STATE_WORD_6(base)          ((volatile bit32u *)(base+0x803C))
7648 +#define RX_DMA_STATE_WORD_6(base)           (*pRX_DMA_STATE_WORD_6(base))
7649 +
7650 +/* Tx CPPI Completion Pointers */
7651 +#define pTXH_CPPI_COMP_PTR(base)            ((volatile bit32u *)(base+0x8040))
7652 +#define TXH_CPPI_COMP_PTR(base)             (*pTXH_CPPI_COMP_PTR(base))
7653 +#define pTXL_CPPI_COMP_PTR(base)            ((volatile bit32u *)(base+0x8044))
7654 +#define TXL_CPPI_COMP_PTR(base)             (*pTXL_CPPI_COMP_PTR(base))
7655 +
7656 +/* Rx CPPI Completion Pointer */
7657 +#define pRX_CPPI_COMP_PTR(base)             ((volatile bit32u *)(base+0x8048))
7658 +#define RX_CPPI_COMP_PTR(base)              (*pRX_CPPI_COMP_PTR(base))
7659 +
7660 +/* Tx PDSP Defines */
7661 +#define NUM_PDSP_AAL5_STATE_WORDS           24
7662 +#define NUM_PDSP_AAL2_STATE_WORDS           20
7663 +
7664 +/* PDSP State RAM Block 0 */
7665 +#define pPDSP_BLOCK_0(base)                 ((volatile bit32u *)(base+0x8050))
7666 +#define PDSP_BLOCK_0(base)                  (*pPDSP_BLOCK_0(base))
7667 +
7668 +/* AAL5 Tx PDSP State RAM */
7669 +#define pPDSP_AAL5_TX_STATE_WORD_0(base)    ((volatile bit32u *)(base+0x8050))
7670 +#define PDSP_AAL5_TX_STATE_WORD_0(base)     (*pPDSP_AAL5_TX_STATE_WORD_0(base))
7671 +
7672 +/* AAL5 Rx PDSP State RAM */
7673 +#define pPDSP_AAL5_RX_STATE_WORD_0(base)    ((volatile bit32u *)(base+0x8070))
7674 +#define PDSP_AAL5_RX_STATE_WORD_0(base)     (*pPDSP_AAL5_RX_STATE_WORD_0(base))
7675 +
7676 +/* AAL5 Tx VP PDSP State RAM */
7677 +#define pPDSP_AAL5_TX_VP_STATE_WORD_0(base) ((volatile bit32u *)(base+0x8090))
7678 +#define PDSP_AAL5_TX_VP_STATE_WORD_0(base)  (*pPDSP_AAL5_TX_VP_STATE_WORD_0(base))
7679 +
7680 +/* AAL5 Rx VP PDSP State RAM */
7681 +#define pPDSP_AAL5_RX_VP_STATE_WORD_0(base) ((volatile bit32u *)(base+0x80A0))
7682 +#define PDSP_AAL5_RX_VP_STATE_WORD_0(base)  (*pPDSP_AAL5_RX_VP_STATE_WORD_0(base))
7683 +
7684 +/* AAL2 Tx PDSP State RAM */
7685 +#define pPDSP_AAL2_TX_STATE_WORD_0(base)    ((volatile bit32u *)(base+0x80B0))
7686 +#define PDSP_AAL2_TX_STATE_WORD_0(base)     (*pPDSP_AAL2_TX_STATE_WORD_0(base))
7687 +
7688 +/* AAL2 Rx PDSP State RAM */
7689 +#define pPDSP_AAL2_RX_STATE_WORD_0(base)    ((volatile bit32u *)(base+0x80D0))
7690 +#define PDSP_AAL2_RX_STATE_WORD_0(base)     (*pPDSP_AAL2_RX_STATE_WORD_0(base))
7691 +
7692 +/* AAL2 Tx VP PDSP State RAM */
7693 +#define pPDSP_AAL2_TX_VP_STATE_WORD_0(base) ((volatile bit32u *)(base+0x80E0))
7694 +#define PDSP_AAL2_TX_VP_STATE_WORD_0(base)  (*pPDSP_AAL2_TX_VP_STATE_WORD_0(base))
7695 +
7696 +/* AAL2 Rx VP PDSP State RAM */
7697 +#define pPDSP_AAL2_RX_VP_STATE_WORD_0(base) ((volatile bit32u *)(base+0x80F0))
7698 +#define PDSP_AAL2_RX_VP_STATE_WORD_0(base)  (*pPDSP_AAL2_RX_VP_STATE_WORD_0(base))
7699 +
7700 +/* PDSP OAM Configuration Block */
7701 +#define pOAM_CONFIG_BLOCK_WORD_0(base)      ((volatile bit32u *)(base+0x83C0))
7702 +#define OAM_CONFIG_BLOCK_WORD_0(base)       (*pOAM_CONFIG_BLOCK_WORD_0(base))
7703 +
7704 +/* PDSP OAM Padding Block */
7705 +#define pOAM_PADDING_BLOCK_WORD_0(base)     ((volatile bit32u *)(base+0x84C0))
7706 +#define OAM_PADDING_BLOCK_WORD_0(base)      (*pOAM_PADDING_BLOCK_WORD_0(base))
7707 +
7708 +#define NUM_OAM_RATES 11
7709 +
7710 +/* PDSP OAM Timer State RAM */
7711 +#define pOAM_TIMER_STATE_WORD_0(base)       ((volatile bit32u *)(base+0x85B0))
7712 +#define OAM_TIMER_STATE_WORD_0(base)        (*pOAM_TIMER_STATE_WORD_0(base))
7713 +
7714 +
7715 +/* END OF FILE */
7716 +
7717 +#endif _INC_SAR_REG
7718 diff -urN linux.old/drivers/atm/sangam_atm/cpswhal_cpaal5.h linux.dev/drivers/atm/sangam_atm/cpswhal_cpaal5.h
7719 --- linux.old/drivers/atm/sangam_atm/cpswhal_cpaal5.h   1970-01-01 01:00:00.000000000 +0100
7720 +++ linux.dev/drivers/atm/sangam_atm/cpswhal_cpaal5.h   2005-08-23 04:46:50.088845064 +0200
7721 @@ -0,0 +1,629 @@
7722 +/************************************************************************
7723 + *  TNETDxxxx Software Support
7724 + *  Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
7725 + *
7726 + *  FILE: cphal.h
7727 + *
7728 + *  DESCRIPTION:
7729 + *      User include file, contains data definitions shared between the CPHAL
7730 + *      and the upper-layer software.
7731 + *
7732 + *  HISTORY:
7733 + *      Date      Modifier  Ver    Notes
7734 + *      28Feb02   Greg      1.00   Original
7735 + *      06Mar02   Greg      1.01   Documentation enhanced
7736 + *      18Jul02   Greg      1.02   Many updates (OAM additions, general reorg)
7737 + *      22Nov02   Mick      RC2    Additions from Denis' input on Control
7738 + *
7739 + *  author  Greg Guyotte
7740 + *  version 1.02
7741 + *  date    18-Jul-2002
7742 + *****************************************************************************/
7743 +#ifndef _INC_CPHAL_H
7744 +#define _INC_CPHAL_H
7745 +
7746 +#ifdef _CPHAL_CPMAC
7747 +#include "ec_errors_cpmac.h"
7748 +#endif
7749 +
7750 +#ifdef _CPHAL_AAL5
7751 +#include "ec_errors_cpaal5.h"
7752 +#endif
7753 +
7754 +#ifdef _CPHAL_CPSAR
7755 +#include "ec_errors_cpsar.h"
7756 +#endif
7757 +
7758 +#ifdef _CPHAL_AAL2
7759 +#include "ec_errors_cpaal2.h"
7760 +#endif
7761 +
7762 +#ifndef __ADAM2
7763 +typedef char           bit8;
7764 +typedef short          bit16;
7765 +typedef int            bit32;
7766 +
7767 +typedef unsigned char  bit8u;
7768 +typedef unsigned short bit16u;
7769 +typedef unsigned int   bit32u;
7770 +
7771 +/*
7772 +typedef char           INT8;
7773 +typedef short          INT16;
7774 +typedef int            INT32;
7775 +typedef unsigned char  UINT8;
7776 +typedef unsigned short UINT16;
7777 +typedef unsigned int   UINT32;
7778 +*/
7779 +/*typedef unsigned int   size_t;*/
7780 +#endif
7781 +
7782 +#ifdef _CPHAL
7783 +
7784 +#ifndef TRUE
7785 +#define TRUE (1==1)
7786 +#endif
7787 +
7788 +#ifndef FALSE
7789 +#define FALSE (1==2)
7790 +#endif
7791 +
7792 +#ifndef NULL
7793 +#define NULL 0
7794 +#endif
7795 +
7796 +#endif
7797 +
7798 +#define        VirtToPhys(a)                 (((int)a)&~0xe0000000)
7799 +#define        VirtToVirtNoCache(a)          ((void*)((VirtToPhys(a))|0xa0000000))
7800 +#define        VirtToVirtCache(a)            ((void*)((VirtToPhys(a))|0x80000000))
7801 +#define        PhysToVirtNoCache(a)          ((void*)(((int)a)|0xa0000000))
7802 +#define        PhysToVirtCache(a)            ((void*)(((int)a)|0x80000000))
7803 +/*
7804 +#define        DataCacheHitInvalidate(a)     {__asm__(" cache  17, (%0)" :   : "r" (a));}
7805 +#define        DataCacheHitWriteback(a)      {__asm__(" cache  25, (%0)" :   : "r" (a));}
7806 +*/
7807 +
7808 +#define PARTIAL 1     /**< Used in @c Close() and @c ChannelTeardown() */
7809 +#define FULL 2        /**< Used in @c Close() and @c ChannelTeardown() */
7810 +
7811 +/* Channel Teardown Defines */
7812 +#define RX_TEARDOWN 2
7813 +#define TX_TEARDOWN 1
7814 +#define BLOCKING_TEARDOWN 8
7815 +#define FULL_TEARDOWN 4
7816 +#define PARTIAL_TEARDOWN 0
7817 +
7818 +#define MAX_DIR 2
7819 +#define DIRECTION_TX 0
7820 +#define DIRECTION_RX 1
7821 +#define TX_CH 0
7822 +#define RX_CH 1
7823 +#define HAL_ERROR_DEVICE_NOT_FOUND    1
7824 +#define HAL_ERROR_FAILED_MALLOC       2
7825 +#define HAL_ERROR_OSFUNC_SIZE         3
7826 +#define HAL_DEFAULT  0xFFFFFFFF
7827 +#define VALID(val)    (val!=HAL_DEFAULT)
7828 +
7829 +/*
7830 +ERROR REPORTING
7831 +
7832 +HAL Module Codes.  Each HAL module reporting an error code
7833 +should OR the error code with the respective Module error code
7834 +from the list below.
7835 +*/
7836 +#define EC_AAL5                                EC_HAL|EC_DEV_AAL5
7837 +#define EC_AAL2                                EC_HAL|EC_DEV_AAL2
7838 +#define EC_CPSAR                               EC_HAL|EC_DEV_CPSAR
7839 +#define EC_CPMAC                               EC_HAL|EC_DEV_CPMAC
7840 +#define EC_VDMA                                EC_HAL|EC_DEV_VDMA
7841 +#define EC_VLYNQ                               EC_HAL|EC_DEV_VLYNQ
7842 +#define EC_CPPI                                EC_HAL|EC_DEV_CPPI
7843 +
7844 +/*
7845 +HAL Function Codes.  Each HAL module reporting an error code
7846 +should OR the error code with one of the function codes from
7847 +the list below.
7848 +*/
7849 +#define EC_FUNC_HAL_INIT                       EC_FUNC(1)
7850 +#define EC_FUNC_CHSETUP                        EC_FUNC(2)
7851 +#define EC_FUNC_CHTEARDOWN                     EC_FUNC(3)
7852 +#define EC_FUNC_RXRETURN                       EC_FUNC(4)
7853 +#define EC_FUNC_SEND                           EC_FUNC(5)
7854 +#define EC_FUNC_RXINT                          EC_FUNC(6)
7855 +#define EC_FUNC_TXINT                          EC_FUNC(7)
7856 +#define EC_FUNC_AAL2_VDMA                      EC_FUNC(8)
7857 +#define EC_FUNC_OPTIONS                        EC_FUNC(9)
7858 +#define EC_FUNC_PROBE                          EC_FUNC(10)
7859 +#define EC_FUNC_OPEN                           EC_FUNC(11)
7860 +#define EC_FUNC_CONTROL                        EC_FUNC(12)
7861 +#define EC_FUNC_DEVICE_INT                     EC_FUNC(13)
7862 +#define EC_FUNC_STATUS                         EC_FUNC(14)
7863 +#define EC_FUNC_TICK                           EC_FUNC(15)
7864 +#define EC_FUNC_CLOSE                          EC_FUNC(16)
7865 +#define EC_FUNC_SHUTDOWN                       EC_FUNC(17)
7866 +#define EC_FUNC_DEVICE_INT_ALT                 EC_FUNC(18) /* +GSG 030306 */
7867 +
7868 +/*
7869 +HAL Error Codes.  The list below defines every type of error
7870 +used in all HAL modules. DO NOT CHANGE THESE VALUES!  Add new
7871 +values in integer order to the bottom of the list.
7872 +*/
7873 +#define EC_VAL_PDSP_LOAD_FAIL                 EC_ERR(0x01)|EC_CRITICAL
7874 +#define EC_VAL_FIRMWARE_TOO_LARGE             EC_ERR(0x02)|EC_CRITICAL
7875 +#define EC_VAL_DEVICE_NOT_FOUND               EC_ERR(0x03)|EC_CRITICAL
7876 +#define EC_VAL_BASE_ADDR_NOT_FOUND            EC_ERR(0x04)|EC_CRITICAL
7877 +#define EC_VAL_RESET_BIT_NOT_FOUND            EC_ERR(0x05)|EC_CRITICAL
7878 +#define EC_VAL_CH_INFO_NOT_FOUND              EC_ERR(0x06)
7879 +#define EC_VAL_RX_STATE_RAM_NOT_CLEARED       EC_ERR(0x07)|EC_CRITICAL
7880 +#define EC_VAL_TX_STATE_RAM_NOT_CLEARED       EC_ERR(0x08)|EC_CRITICAL
7881 +#define EC_VAL_MALLOC_DEV_FAILED              EC_ERR(0x09)
7882 +#define EC_VAL_OS_VERSION_NOT_SUPPORTED       EC_ERR(0x0A)|EC_CRITICAL
7883 +#define EC_VAL_CPSAR_VERSION_NOT_SUPPORTED    EC_ERR(0x0B)|EC_CRITICAL
7884 +#define EC_VAL_NULL_CPSAR_DEV                 EC_ERR(0x0C)|EC_CRITICAL
7885 +
7886 +#define EC_VAL_LUT_NOT_READY                  EC_ERR(0x0D)
7887 +#define EC_VAL_INVALID_CH                     EC_ERR(0x0E)
7888 +#define EC_VAL_NULL_CH_STRUCT                 EC_ERR(0x0F)
7889 +#define EC_VAL_RX_TEARDOWN_ALREADY_PEND       EC_ERR(0x10)
7890 +#define EC_VAL_TX_TEARDOWN_ALREADY_PEND       EC_ERR(0x11)
7891 +#define EC_VAL_RX_CH_ALREADY_TORNDOWN         EC_ERR(0x12)
7892 +#define EC_VAL_TX_CH_ALREADY_TORNDOWN         EC_ERR(0x13)
7893 +#define EC_VAL_TX_TEARDOWN_TIMEOUT            EC_ERR(0x14)
7894 +#define EC_VAL_RX_TEARDOWN_TIMEOUT            EC_ERR(0x15)
7895 +#define EC_VAL_CH_ALREADY_TORNDOWN            EC_ERR(0x16)
7896 +#define EC_VAL_VC_SETUP_NOT_READY             EC_ERR(0x17)
7897 +#define EC_VAL_VC_TEARDOWN_NOT_READY          EC_ERR(0x18)
7898 +#define EC_VAL_INVALID_VC                     EC_ERR(0x19)
7899 +#define EC_VAL_INVALID_LC                     EC_ERR(0x20)
7900 +#define EC_VAL_INVALID_VDMA_CH                EC_ERR(0x21)
7901 +#define EC_VAL_INVALID_CID                    EC_ERR(0x22)
7902 +#define EC_VAL_INVALID_UUI                    EC_ERR(0x23)
7903 +#define EC_VAL_INVALID_UUI_DISCARD            EC_ERR(0x24)
7904 +#define EC_VAL_CH_ALREADY_OPEN                EC_ERR(0x25)
7905 +
7906 +#define EC_VAL_RCB_MALLOC_FAILED              EC_ERR(0x26)
7907 +#define EC_VAL_RX_BUFFER_MALLOC_FAILED        EC_ERR(0x27)
7908 +#define EC_VAL_OUT_OF_TCBS                    EC_ERR(0x28)
7909 +#define EC_VAL_NO_TCBS                        EC_ERR(0x29)
7910 +#define EC_VAL_NULL_RCB                       EC_ERR(0x30)|EC_CRITICAL
7911 +#define EC_VAL_SOP_ERROR                      EC_ERR(0x31)|EC_CRITICAL
7912 +#define EC_VAL_EOP_ERROR                      EC_ERR(0x32)|EC_CRITICAL
7913 +#define EC_VAL_NULL_TCB                       EC_ERR(0x33)|EC_CRITICAL
7914 +#define EC_VAL_CORRUPT_RCB_CHAIN              EC_ERR(0x34)|EC_CRITICAL
7915 +#define EC_VAL_TCB_MALLOC_FAILED              EC_ERR(0x35)
7916 +
7917 +#define EC_VAL_DISABLE_POLLING_FAILED         EC_ERR(0x36)
7918 +#define EC_VAL_KEY_NOT_FOUND                  EC_ERR(0x37)
7919 +#define EC_VAL_MALLOC_FAILED                  EC_ERR(0x38)
7920 +#define EC_VAL_RESET_BASE_NOT_FOUND           EC_ERR(0x39)|EC_CRITICAL
7921 +#define EC_VAL_INVALID_STATE                  EC_ERR(0x40)
7922 +#define EC_VAL_NO_TXH_WORK_TO_DO              EC_ERR(0x41)
7923 +#define EC_VAL_NO_TXL_WORK_TO_DO              EC_ERR(0x42)
7924 +#define EC_VAL_NO_RX_WORK_TO_DO               EC_ERR(0x43)
7925 +#define EC_VAL_NOT_LINKED                     EC_ERR(0x44)
7926 +#define EC_VAL_INTERRUPT_NOT_FOUND            EC_ERR(0x45)
7927 +#define EC_VAL_OFFSET_NOT_FOUND               EC_ERR(0x46)
7928 +#define EC_VAL_MODULE_ALREADY_CLOSED          EC_ERR(0x47)
7929 +#define EC_VAL_MODULE_ALREADY_SHUTDOWN        EC_ERR(0x48)
7930 +#define EC_VAL_ACTION_NOT_FOUND               EC_ERR(0x49)
7931 +#define EC_VAL_RX_CH_ALREADY_SETUP            EC_ERR(0x50)
7932 +#define EC_VAL_TX_CH_ALREADY_SETUP            EC_ERR(0x51)
7933 +#define EC_VAL_RX_CH_ALREADY_OPEN             EC_ERR(0x52)
7934 +#define EC_VAL_TX_CH_ALREADY_OPEN             EC_ERR(0x53)
7935 +#define EC_VAL_CH_ALREADY_SETUP               EC_ERR(0x54)
7936 +#define EC_VAL_RCB_NEEDS_BUFFER               EC_ERR(0x55) /* +GSG 030410 */
7937 +#define EC_VAL_RCB_DROPPED                    EC_ERR(0x56) /* +GSG 030410 */
7938 +#define EC_VAL_INVALID_VALUE                  EC_ERR(0x57)
7939 +
7940 +/**
7941 +@defgroup shared_data Shared Data Structures
7942 +
7943 +The data structures documented here are shared by all modules.
7944 +*/
7945 +
7946 +/**
7947 + *  @ingroup shared_data
7948 + *  This is the fragment list structure.  Each fragment list entry contains a
7949 + *  length and a data buffer.
7950 + */
7951 +typedef struct
7952 +  {
7953 +   bit32u   len;    /**< Length of the fragment in bytes (lower 16 bits are valid).  For SOP, upper 16 bits is the buffer offset. */
7954 +   void     *data;  /**< Pointer to fragment data. */
7955 +   void     *OsInfo; /**< Pointer to OS defined data. */
7956 +  }FRAGLIST;
7957 +
7958 +#if defined (_CPHAL_CPMAC)
7959 +#define CB_PASSCRC_BIT     (1<<26)
7960 +
7961 +/* CPMAC CPHAL STATUS */
7962 +#define CPMAC_STATUS_LINK               (1 << 0)
7963 +#define CPMAC_STATUS_LINK_DUPLEX        (1 << 1)  /* 0 - HD, 1 - FD */
7964 +#define CPMAC_STATUS_LINK_SPEED         (1 << 2)  /* 0 - 10, 1 - 100 */
7965 +
7966 +/*   ADAPTER CHECK Codes */
7967 +
7968 +#define CPMAC_STATUS_ADAPTER_CHECK             (1 << 7)
7969 +#define CPMAC_STATUS_HOST_ERR_DIRECTION        (1 << 8)
7970 +#define CPMAC_STATUS_HOST_ERR_CODE             (0xF << 9)
7971 +#define CPMAC_STATUS_HOST_ERR_CH               (0x7 << 13)
7972 +
7973 +#define _CPMDIO_DISABLE                 (1 << 0)
7974 +#define _CPMDIO_HD                      (1 << 1)
7975 +#define _CPMDIO_FD                      (1 << 2)
7976 +#define _CPMDIO_10                      (1 << 3)
7977 +#define _CPMDIO_100                     (1 << 4)
7978 +#define _CPMDIO_NEG_OFF                 (1 << 5)
7979 +#define _CPMDIO_LOOPBK                  (1 << 16)
7980 +#define _CPMDIO_NOPHY                   (1 << 20)
7981 +#endif
7982 +
7983 +/**
7984 + *  @ingroup shared_data
7985 + *  Channel specific configuration information.  This structure should be
7986 + *  populated by upper-layer software prior to calling @c ChannelSetup().  Any
7987 + *  configuration item that can be changed on a per channel basis should
7988 + *  be represented here.  Each module may define this structure with additional
7989 + *  module-specific members.
7990 + */
7991 +typedef struct
7992 +  {
7993 +   int Channel;        /**< Channel number. */
7994 +   int Direction;      /**< DIRECTION_RX(1) or DIRECTION_TX(0). */
7995 +   OS_SETUP *OsSetup;  /**< OS defined information associated with this channel. */
7996 +
7997 +#if defined(_CPHAL_AAL5) || defined (_CPHAL_CPSAR) || defined (_CPHAL_CPMAC)
7998 +   int RxBufSize;      /**< Size (in bytes) for each Rx buffer.*/
7999 +   int RxBufferOffset; /**< Number of bytes to offset rx data from start of buffer (must be less than buffer size). */
8000 +   int RxNumBuffers;   /**< The number of Rx buffer descriptors to allocate for Ch. */
8001 +   int RxServiceMax;   /**< Maximum number of packets to service at one time. */
8002 +
8003 +   int TxNumBuffers;   /**< The number of Tx buffer descriptors to allocate for Ch. */
8004 +   int TxNumQueues;    /**< Number of Tx queues for this channel (1-2). Choosing 2 enables a low priority SAR queue. */
8005 +   int TxServiceMax;   /**< Maximum number of packets to service at one time. */
8006 +#endif
8007 +
8008 +#if defined(_CPHAL_AAL5) || defined(_CPHAL_CPSAR)
8009 +   int CpcsUU;      /**< The 2-byte CPCS UU and CPI information. */
8010 +   int Gfc;         /**< Generic Flow Control. */
8011 +   int Clp;         /**< Cell Loss Priority. */
8012 +   int Pti;         /**< Payload Type Indication. */
8013 +#endif
8014 +
8015 +#if defined(_CPHAL_AAL2) || defined(_CPHAL_AAL5) || defined(_CPHAL_CPSAR)
8016 +   int DaMask;      /**< Specifies whether credit issuance is paused when Tx data not available. */
8017 +   int Priority;    /**< Priority bin this channel will be scheduled within. */
8018 +   int PktType;     /**< 0=AAL5,1=Null AAL,2=OAM,3=Transparent,4=AAL2. */
8019 +   int Vci;         /**< Virtual Channel Identifier. */
8020 +   int Vpi;         /**< Virtual Path Identifier. */
8021 +   int FwdUnkVc;    /**< Enables forwarding of unknown VCI/VPI cells to host. 1=enable, 0=disable. */
8022 +
8023 +   /* Tx VC State */
8024 +   int TxVc_CellRate;  /**< Tx rate, set as clock ticks between transmissions (SCR for VBR, CBR for CBR). */
8025 +   int TxVc_QosType;   /**< 0=CBR,1=VBR,2=UBR,3=UBRmcr. */
8026 +   int TxVc_Mbs;       /**< Min Burst Size in cells.*/
8027 +   int TxVc_Pcr;       /**< Peak Cell Rate for VBR in clock ticks between transmissions. */
8028 +
8029 +   bit32 TxVc_AtmHeader; /**< ATM Header placed on firmware gen'd OAM cells for this Tx Ch (must be big endian with 0 PTI). */
8030 +   int TxVc_OamTc;     /**< TC Path to transmit OAM cells for TX connection (0,1). */
8031 +   int TxVc_VpOffset;  /**< Offset to the OAM VP state table. */
8032 +   /* Rx VC State */
8033 +   int RxVc_OamCh;     /**< Ch to terminate rx'd OAM cells to be forwarded to the host. */
8034 +   int RxVc_OamToHost; /**< 0=do not pass, 1=pass. */
8035 +   bit32 RxVc_AtmHeader; /**< ATM Header placed on firmware gen'd OAM cells for this Rx conn (must be big endian with 0 PTI). */
8036 +   int RxVc_OamTc;     /**< TC Path to transmit OAM cells for RX connection (0,1). */
8037 +   int RxVc_VpOffset;  /**< Offset to the OAM VP state table. */
8038 +   /* Tx VP State */
8039 +   int TxVp_OamTc;     /**< TC Path to transmit OAM cells for TX VP connection (0,1). */
8040 +   bit32 TxVp_AtmHeader; /**< ATM Header placed on firmware gen'd VP OAM cells for this Tx VP conn (must be big endian with 0 VCI). */
8041 +   /* Rx VP State  */
8042 +   int RxVp_OamCh;     /**< Ch to terminate rx'd OAM cells to be forwarded to the host. */
8043 +   int RxVp_OamToHost; /**< 0=do not pass, 1=pass. */
8044 +   bit32 RxVp_AtmHeader; /**< ATM Header placed on firmware gen'd OAM cells for this Rx VP conn (must be big endian with 0 VCI). */
8045 +   int RxVp_OamTc;     /**< TC Path to transmit OAM cells for RX VP connection (0,1). */
8046 +   int RxVp_OamVcList; /**< Indicates all VC channels associated with this VP channel (one-hot encoded). */
8047 +#endif
8048 +
8049 +
8050 +#ifdef _CPHAL_VDMAVT
8051 +   bit32u RemFifoAddr; /* Mirror mode only. */
8052 +   bit32u FifoAddr;
8053 +   bit32  PollInt;
8054 +   bit32  FifoSize;
8055 +   int    Ready;
8056 +#endif
8057 +
8058 +  }CHANNEL_INFO;
8059 +
8060 +/*
8061 + *  This structure contains each statistic value gathered by the CPHAL.
8062 + *  Applications may access statistics data by using the @c StatsGet() routine.
8063 + */
8064 +/* STATS */
8065 +#if defined(_CPHAL_AAL2) || defined(_CPHAL_AAL5) || defined(_CPHAL_CPSAR)
8066 +typedef struct
8067 +  {
8068 +   bit32u CrcErrors[16];
8069 +   bit32u LenErrors[16];
8070 +   bit32u DmaLenErrors[16];
8071 +   bit32u AbortErrors[16];
8072 +   bit32u StarvErrors[16];
8073 +   bit32u TxMisQCnt[16][2];
8074 +   bit32u RxMisQCnt[16];
8075 +   bit32u RxEOQCnt[16];
8076 +   bit32u TxEOQCnt[16][2];
8077 +   bit32u RxPacketsServiced[16];
8078 +   bit32u TxPacketsServiced[16][2];
8079 +   bit32u RxMaxServiced;
8080 +   bit32u TxMaxServiced[16][2];
8081 +   bit32u RxTotal;
8082 +   bit32u TxTotal;
8083 +  } STAT_INFO;
8084 +#endif
8085 +
8086 +/*
8087 + *  VDMA Channel specific configuration information
8088 + */
8089 +#ifdef _CPHAL_AAL2
8090 +typedef struct
8091 +  {
8092 +   int Ch;           /**< Channel Number */
8093 +   int RemoteEndian; /**< Endianness of remote VDMA-VT device */
8094 +   int CpsSwap;      /**< When 0, octet 0 in CPS pkt located in LS byte of 16-bit word sent to rem VDMA device.  When 1, in MS byte. */
8095 +  }VdmaChInfo;
8096 +#endif
8097 +
8098 +#ifndef _CPHAL
8099 +  typedef void HAL_DEVICE;
8100 +  typedef void HAL_PRIVATE;
8101 +  typedef void HAL_RCB;
8102 +  typedef void HAL_RECEIVEINFO;
8103 +#endif
8104 +
8105 +/**
8106 + *  @ingroup shared_data
8107 + *  The HAL_FUNCTIONS struct defines the function pointers used by upper layer
8108 + *  software.  The upper layer software receives these pointers through the
8109 + *  call to xxxInitModule().
8110 + */
8111 +typedef struct
8112 +  {
8113 +  int  (*ChannelSetup)    (HAL_DEVICE *HalDev, CHANNEL_INFO *Channel, OS_SETUP *OsSetup);
8114 +  int  (*ChannelTeardown) (HAL_DEVICE *HalDev, int Channel, int Mode);
8115 +  int  (*Close)           (HAL_DEVICE *HalDev, int Mode);
8116 +  int  (*Control)         (HAL_DEVICE *HalDev, const char *Key, const char *Action, void *Value);
8117 +  int  (*Init)            (HAL_DEVICE *HalDev);
8118 +  int  (*Open)            (HAL_DEVICE *HalDev);
8119 +  int  (*PacketProcessEnd) (HAL_DEVICE *HalDev);
8120 +  int  (*Probe)           (HAL_DEVICE *HalDev);
8121 +  int  (*RxReturn)        (HAL_RECEIVEINFO *HalReceiveInfo, int StripFlag);
8122 +  int  (*Send)            (HAL_DEVICE *HalDev, FRAGLIST *FragList, int FragCount, int PacketSize, OS_SENDINFO *OsSendInfo, bit32u Mode);
8123 +  int  (*Shutdown)        (HAL_DEVICE *HalDev);
8124 +  int  (*Tick)            (HAL_DEVICE *HalDev);
8125 +
8126 +#ifdef _CPHAL_AAL5
8127 +  int  (*Kick) (HAL_DEVICE *HalDev, int Queue);
8128 +  void (*OamFuncConfig)   (HAL_DEVICE *HalDev, unsigned int OamConfig);
8129 +  void (*OamLoopbackConfig)   (HAL_DEVICE *HalDev, unsigned int OamConfig, unsigned int *LLID, unsigned int CorrelationTag);
8130 +  volatile bit32u* (*RegAccess)(HAL_DEVICE *HalDev, bit32u RegOffset);
8131 +  STAT_INFO*  (*StatsGetOld)(HAL_DEVICE *HalDev);
8132 +#endif
8133 +  } HAL_FUNCTIONS;
8134 +
8135 +/**
8136 + *  @ingroup shared_data
8137 + *  The OS_FUNCTIONS struct defines the function pointers for all upper layer
8138 + *  functions accessible to the CPHAL.  The upper layer software is responsible
8139 + *  for providing the correct OS-specific implementations for the following
8140 + *  functions. It is populated by calling InitModule() (done by the CPHAL in
8141 + *  xxxInitModule().
8142 + */
8143 +typedef struct
8144 +  {
8145 +  int   (*Control)(OS_DEVICE *OsDev, const char *Key, const char *Action, void *Value);
8146 +  void  (*CriticalOn)(void);
8147 +  void  (*CriticalOff)(void);
8148 +  void  (*DataCacheHitInvalidate)(void *MemPtr, int Size);
8149 +  void  (*DataCacheHitWriteback)(void *MemPtr, int Size);
8150 +  int   (*DeviceFindInfo)(int Inst, const char *DeviceName, void *DeviceInfo);
8151 +  int   (*DeviceFindParmUint)(void *DeviceInfo, const char *Parm, bit32u *Value);
8152 +  int   (*DeviceFindParmValue)(void *DeviceInfo, const char *Parm, void *Value);
8153 +  void  (*Free)(void *MemPtr);
8154 +  void  (*FreeRxBuffer)(OS_RECEIVEINFO *OsReceiveInfo, void *MemPtr);
8155 +  void  (*FreeDev)(void *MemPtr);
8156 +  void  (*FreeDmaXfer)(void *MemPtr);
8157 +  void  (*IsrRegister)(OS_DEVICE *OsDev, int (*halISR)(HAL_DEVICE*, int*), int InterruptBit);
8158 +  void  (*IsrUnRegister)(OS_DEVICE *OsDev, int InterruptBit);
8159 +  void* (*Malloc)(bit32u size);
8160 +  void* (*MallocDev)(bit32u Size);
8161 +  void* (*MallocDmaXfer)(bit32u size, void *MemBase, bit32u MemRange);
8162 +  void* (*MallocRxBuffer)(bit32u size, void *MemBase, bit32u MemRange,
8163 +                       OS_SETUP *OsSetup, HAL_RECEIVEINFO *HalReceiveInfo,
8164 +                       OS_RECEIVEINFO **OsReceiveInfo, OS_DEVICE *OsDev);
8165 +  void* (*Memset)(void *Dest, int C, bit32u N);
8166 +  int   (*Printf)(const char *Format, ...);
8167 +  int   (*Receive)(OS_DEVICE *OsDev,FRAGLIST *FragList,bit32u FragCount,
8168 +                 bit32u PacketSize,HAL_RECEIVEINFO *HalReceiveInfo, bit32u Mode);
8169 +  int   (*SendComplete)(OS_SENDINFO *OsSendInfo);
8170 +  int   (*Sprintf)(char *S, const char *Format, ...);
8171 +  int   (*Strcmpi)(const char *Str1, const char *Str2);
8172 +  unsigned int (*Strlen)(const char *S);
8173 +  char* (*Strstr)(const char *S1, const char *S2);
8174 +  unsigned long  (*Strtoul)(const char *Str, char **Endptr, int Base);
8175 +  void  (*TeardownComplete)(OS_DEVICE *OsDev, int Ch, int Direction);
8176 +  } OS_FUNCTIONS;
8177 +
8178 +/************** MODULE SPECIFIC STUFF BELOW **************/
8179 +
8180 +#ifdef _CPHAL_CPMAC
8181 +
8182 +/*
8183 +int halCpmacInitModule(HAL_DEVICE **HalDev, OS_DEVICE *OsDev, HAL_FUNCTIONS *HalFunc, int (*osBridgeInitModule)(OS_FUNCTIONS *), void* (*osMallocDev) (bit32u), int *Size, int inst);
8184 +*/
8185 +
8186 +int halCpmacInitModule(HAL_DEVICE **HalDev,
8187 +                 OS_DEVICE *OsDev,
8188 +                 HAL_FUNCTIONS **HalFunc,
8189 +                 OS_FUNCTIONS *OsFunc,
8190 +                 int OsFuncSize,
8191 +                 int *HalFuncSize,
8192 +                 int Inst);
8193 +#endif
8194 +
8195 +#ifdef _CPHAL_AAL5
8196 +/*
8197 + *  @ingroup shared_data
8198 + *  The AAL5_FUNCTIONS struct defines the AAL5 function pointers used by upper layer
8199 + *  software.  The upper layer software receives these pointers through the
8200 + *  call to cphalInitModule().
8201 + */
8202 +/*
8203 +typedef struct
8204 +  {
8205 +  int  (*ChannelSetup)(HAL_DEVICE *HalDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup);
8206 +  int  (*ChannelTeardown)(HAL_DEVICE *HalDev, int Ch, int Mode);
8207 +  int  (*Close)(HAL_DEVICE *HalDev, int Mode);
8208 +  int  (*Init)(HAL_DEVICE *HalDev);
8209 +  int  (*ModeChange)(HAL_DEVICE *HalDev, char *DeviceParms);
8210 +  int  (*Open)(HAL_DEVICE *HalDev);
8211 +  int  (*InfoGet)(HAL_DEVICE *HalDev, int Key, void *Value);
8212 +  int  (*Probe)(HAL_DEVICE *HalDev);
8213 +  int  (*RxReturn)(HAL_RECEIVEINFO *HalReceiveInfo, int StripFlag);
8214 +  int  (*Send)(HAL_DEVICE *HalDev,FRAGLIST *FragList,int FragCount,
8215 +                 int PacketSize,OS_SENDINFO *OsSendInfo,int Ch, int Queue,
8216 +                 bit32u Mode);
8217 +  int  (*StatsClear)(HAL_DEVICE *HalDev);
8218 +  STAT_INFO*  (*StatsGet)(HAL_DEVICE *HalDev);
8219 +  int  (*Status)(HAL_DEVICE *HalDev);
8220 +  void (*Tick)(HAL_DEVICE *HalDev);
8221 +  int  (*Kick)(HAL_DEVICE *HalDev, int Queue);
8222 +  volatile bit32u* (*RegAccess)(HAL_DEVICE *HalDev, bit32u RegOffset);
8223 +  } AAL5_FUNCTIONS;
8224 +*/
8225 +
8226 +int cpaal5InitModule(HAL_DEVICE **HalDev,
8227 +                 OS_DEVICE *OsDev,
8228 +                 HAL_FUNCTIONS **HalFunc,
8229 +                 OS_FUNCTIONS *OsFunc,
8230 +                 int OsFuncSize,
8231 +                 int *HalFuncSize,
8232 +                 int Inst);
8233 +#endif
8234 +
8235 +#ifdef _CPHAL_AAL2
8236 +/**
8237 + *  @ingroup shared_data
8238 + *  The AAL2_FUNCTIONS struct defines the AAL2 function pointers used by upper layer
8239 + *  software.  The upper layer software receives these pointers through the
8240 + *  call to cphalInitModule().
8241 + */
8242 +typedef struct
8243 +  {
8244 +  int  (*ChannelSetup)(HAL_DEVICE *HalDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup);
8245 +  int  (*ChannelTeardown)(HAL_DEVICE *HalDev, int Ch, int Mode);
8246 +  int  (*Close)(HAL_DEVICE *HalDev, int Mode);
8247 +  int  (*Init)(HAL_DEVICE *HalDev);
8248 +  int  (*ModeChange)(HAL_DEVICE *HalDev, char *DeviceParms);
8249 +  int  (*Open)(HAL_DEVICE *HalDev);
8250 +  int  (*OptionsGet)(HAL_DEVICE *HalDev, char *Key, bit32u *Value);
8251 +  int  (*Probe)(HAL_DEVICE *HalDev);
8252 +
8253 +  int  (*StatsClear)(HAL_DEVICE *HalDev);
8254 +  STAT_INFO*  (*StatsGet)(HAL_DEVICE *HalDev);
8255 +  int  (*Status)(HAL_DEVICE *HalDev);
8256 +  void (*Tick)(HAL_DEVICE *HalDev);
8257 +  int  (*Aal2UuiMappingSetup)(HAL_DEVICE *HalDev, int VC, int UUI,
8258 +                                    int VdmaCh, int UUIDiscard);
8259 +  int  (*Aal2RxMappingSetup)(HAL_DEVICE *HalDev, int VC, int CID,
8260 +                                   int LC);
8261 +  int  (*Aal2TxMappingSetup)(HAL_DEVICE *HalDev, int VC, int LC, int VdmaCh);
8262 +  int  (*Aal2VdmaChSetup)(HAL_DEVICE *HalDev, bit32u RemVdmaVtAddr,
8263 +                               VdmaChInfo *VdmaCh);
8264 +  volatile bit32u* (*RegAccess)(HAL_DEVICE *HalDev, bit32u RegOffset);
8265 +  int  (*Aal2ModeChange)(HAL_DEVICE *HalDev, int Vc, int RxCrossMode,
8266 +                           int RxMultiMode, int TxMultiMode, int SchedMode,
8267 +                           int TcCh);
8268 +  void (*Aal2VdmaEnable)(HAL_DEVICE *HalDev, int Ch);
8269 +  int  (*Aal2VdmaDisable)(HAL_DEVICE *HalDev, int Ch);
8270 +  } AAL2_FUNCTIONS;
8271 +
8272 +int cpaal2InitModule(HAL_DEVICE **HalDev,
8273 +                 OS_DEVICE *OsDev,
8274 +                 AAL2_FUNCTIONS **HalFunc,
8275 +                 OS_FUNCTIONS *OsFunc,
8276 +                 int OsFuncSize,
8277 +                 int *HalFuncSize,
8278 +                 int Inst);
8279 +#endif
8280 +
8281 +#ifdef _CPHAL_VDMAVT
8282 +/**
8283 + *  @ingroup shared_data
8284 + *  The VDMA_FUNCTIONS struct defines the HAL function pointers used by upper layer
8285 + *  software.  The upper layer software receives these pointers through the
8286 + *  call to InitModule().
8287 + *
8288 + *  Note that this list is still under definition.
8289 + */
8290 +typedef struct
8291 +  {
8292 +  bit32  (*Init)( HAL_DEVICE *VdmaVtDev);
8293 +    /*  bit32  (*SetupTxFifo)(HAL_DEVICE *VdmaVtDev, bit32u LclRem,
8294 +                  bit32u Addr, bit32u Size, bit32u PollInt);
8295 +    bit32  (*SetupRxFifo)(HAL_DEVICE *VdmaVtDev, bit32u LclRem,
8296 +                  bit32u Addr, bit32u Size, bit32u PollInt); */
8297 +  bit32  (*Tx)(HAL_DEVICE *VdmaVtDev);
8298 +  bit32  (*Rx)(HAL_DEVICE *VdmaVtDev);
8299 +  bit32  (*SetRemoteChannel)(HAL_DEVICE *VdmaVtDev, bit32u RemAddr,
8300 +                         bit32u RemDevID);
8301 +  bit32  (*ClearRxInt)(HAL_DEVICE *VdmaVtDev);
8302 +  bit32  (*ClearTxInt)(HAL_DEVICE *VdmaVtDev);
8303 +  bit32  (*Open)(HAL_DEVICE *VdmaVtDev);
8304 +  bit32  (*Close)(HAL_DEVICE *VdmaVtDev);
8305 +  int    (*Control)         (HAL_DEVICE *HalDev, const char *Key, const char *Action, void *Value);
8306 +  int    (*ChannelSetup)(HAL_DEVICE *VdmaVtDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup);
8307 +  int    (*ChannelTeardown)(HAL_DEVICE *VdmaVtDev, int Ch, int Mode);
8308 +  int    (*Send)(HAL_DEVICE *VdmaVtDev,FRAGLIST *FragList,int FragCount,
8309 +                 int PacketSize,OS_SENDINFO *OsSendInfo,bit32u Mode);
8310 +  } VDMA_FUNCTIONS;
8311 +
8312 +int VdmaInitModule(HAL_DEVICE **VdmaVt,
8313 +                 OS_DEVICE *OsDev,
8314 +                 VDMA_FUNCTIONS **VdmaVtFunc,
8315 +                 OS_FUNCTIONS *OsFunc,
8316 +                 int OsFuncSize,
8317 +                 int *HalFuncSize,
8318 +                 int Inst);
8319 +#endif
8320 +
8321 +/*
8322 +extern int cphalInitModule(MODULE_TYPE ModuleType, HAL_DEVICE **HalDev, OS_DEVICE *OsDev, HAL_FUNCTIONS *HalFunc,
8323 +                      int (*osInitModule)(OS_FUNCTIONS *), void* (*osMallocDev)(bit32u),
8324 +                      int *Size, int Inst);
8325 +*/
8326 +
8327 +
8328 +#ifdef _CPHAL_AAL5
8329 +extern const char hcSarFrequency[];
8330 +#endif
8331 +
8332 +#ifdef _CPHAL_CPMAC
8333 +/* following will be common, once 'utl' added */
8334 +extern const char hcClear[];
8335 +extern const char hcGet[];
8336 +extern const char hcSet[];
8337 +extern const char hcTick[];
8338 +
8339 +extern const char hcCpuFrequency[];
8340 +extern const char hcCpmacFrequency[];
8341 +extern const char hcMdioBusFrequency[];
8342 +extern const char hcMdioClockFrequency[];
8343 +extern const char hcCpmacBase[];
8344 +extern const char hcPhyNum[];
8345 +extern const char hcSize[];
8346 +extern const char hcCpmacSize[];
8347 +extern const char hcPhyAccess[];
8348 +#endif
8349 +
8350 +#endif  /*  end of _INC_    */
8351 diff -urN linux.old/drivers/atm/sangam_atm/cpswhal_cpsar.h linux.dev/drivers/atm/sangam_atm/cpswhal_cpsar.h
8352 --- linux.old/drivers/atm/sangam_atm/cpswhal_cpsar.h    1970-01-01 01:00:00.000000000 +0100
8353 +++ linux.dev/drivers/atm/sangam_atm/cpswhal_cpsar.h    2005-08-23 04:46:50.089844912 +0200
8354 @@ -0,0 +1,629 @@
8355 +/************************************************************************
8356 + *  TNETDxxxx Software Support
8357 + *  Copyright (c) 2002 Texas Instruments Incorporated. All Rights Reserved.
8358 + *
8359 + *  FILE: cphal.h
8360 + *
8361 + *  DESCRIPTION:
8362 + *      User include file, contains data definitions shared between the CPHAL
8363 + *      and the upper-layer software.
8364 + *
8365 + *  HISTORY:
8366 + *      Date      Modifier  Ver    Notes
8367 + *      28Feb02   Greg      1.00   Original
8368 + *      06Mar02   Greg      1.01   Documentation enhanced
8369 + *      18Jul02   Greg      1.02   Many updates (OAM additions, general reorg)
8370 + *      22Nov02   Mick      RC2    Additions from Denis' input on Control
8371 + *
8372 + *  author  Greg Guyotte
8373 + *  version 1.02
8374 + *  date    18-Jul-2002
8375 + *****************************************************************************/
8376 +#ifndef _INC_CPHAL_H
8377 +#define _INC_CPHAL_H
8378 +
8379 +#ifdef _CPHAL_CPMAC
8380 +#include "ec_errors_cpmac.h"
8381 +#endif
8382 +
8383 +#ifdef _CPHAL_AAL5
8384 +#include "ec_errors_cpaal5.h"
8385 +#endif
8386 +
8387 +#ifdef _CPHAL_CPSAR
8388 +#include "ec_errors_cpsar.h"
8389 +#endif
8390 +
8391 +#ifdef _CPHAL_AAL2
8392 +#include "ec_errors_cpaal2.h"
8393 +#endif
8394 +
8395 +#ifndef __ADAM2
8396 +typedef char           bit8;
8397 +typedef short          bit16;
8398 +typedef int            bit32;
8399 +
8400 +typedef unsigned char  bit8u;
8401 +typedef unsigned short bit16u;
8402 +typedef unsigned int   bit32u;
8403 +
8404 +/*
8405 +typedef char           INT8;
8406 +typedef short          INT16;
8407 +typedef int            INT32;
8408 +typedef unsigned char  UINT8;
8409 +typedef unsigned short UINT16;
8410 +typedef unsigned int   UINT32;
8411 +*/
8412 +/*typedef unsigned int   size_t;*/
8413 +#endif
8414 +
8415 +#ifdef _CPHAL
8416 +
8417 +#ifndef TRUE
8418 +#define TRUE (1==1)
8419 +#endif
8420 +
8421 +#ifndef FALSE
8422 +#define FALSE (1==2)
8423 +#endif
8424 +
8425 +#ifndef NULL
8426 +#define NULL 0
8427 +#endif
8428 +
8429 +#endif
8430 +
8431 +#define        VirtToPhys(a)                 (((int)a)&~0xe0000000)
8432 +#define        VirtToVirtNoCache(a)          ((void*)((VirtToPhys(a))|0xa0000000))
8433 +#define        VirtToVirtCache(a)            ((void*)((VirtToPhys(a))|0x80000000))
8434 +#define        PhysToVirtNoCache(a)          ((void*)(((int)a)|0xa0000000))
8435 +#define        PhysToVirtCache(a)            ((void*)(((int)a)|0x80000000))
8436 +/*
8437 +#define        DataCacheHitInvalidate(a)     {__asm__(" cache  17, (%0)" :   : "r" (a));}
8438 +#define        DataCacheHitWriteback(a)      {__asm__(" cache  25, (%0)" :   : "r" (a));}
8439 +*/
8440 +
8441 +#define PARTIAL 1     /**< Used in @c Close() and @c ChannelTeardown() */
8442 +#define FULL 2        /**< Used in @c Close() and @c ChannelTeardown() */
8443 +
8444 +/* Channel Teardown Defines */
8445 +#define RX_TEARDOWN 2
8446 +#define TX_TEARDOWN 1
8447 +#define BLOCKING_TEARDOWN 8
8448 +#define FULL_TEARDOWN 4
8449 +#define PARTIAL_TEARDOWN 0
8450 +
8451 +#define MAX_DIR 2
8452 +#define DIRECTION_TX 0
8453 +#define DIRECTION_RX 1
8454 +#define TX_CH 0
8455 +#define RX_CH 1
8456 +#define HAL_ERROR_DEVICE_NOT_FOUND    1
8457 +#define HAL_ERROR_FAILED_MALLOC       2
8458 +#define HAL_ERROR_OSFUNC_SIZE         3
8459 +#define HAL_DEFAULT  0xFFFFFFFF
8460 +#define VALID(val)    (val!=HAL_DEFAULT)
8461 +
8462 +/*
8463 +ERROR REPORTING
8464 +
8465 +HAL Module Codes.  Each HAL module reporting an error code
8466 +should OR the error code with the respective Module error code
8467 +from the list below.
8468 +*/
8469 +#define EC_AAL5                                EC_HAL|EC_DEV_AAL5
8470 +#define EC_AAL2                                EC_HAL|EC_DEV_AAL2
8471 +#define EC_CPSAR                               EC_HAL|EC_DEV_CPSAR
8472 +#define EC_CPMAC                               EC_HAL|EC_DEV_CPMAC
8473 +#define EC_VDMA                                EC_HAL|EC_DEV_VDMA
8474 +#define EC_VLYNQ                               EC_HAL|EC_DEV_VLYNQ
8475 +#define EC_CPPI                                EC_HAL|EC_DEV_CPPI
8476 +
8477 +/*
8478 +HAL Function Codes.  Each HAL module reporting an error code
8479 +should OR the error code with one of the function codes from
8480 +the list below.
8481 +*/
8482 +#define EC_FUNC_HAL_INIT                       EC_FUNC(1)
8483 +#define EC_FUNC_CHSETUP                        EC_FUNC(2)
8484 +#define EC_FUNC_CHTEARDOWN                     EC_FUNC(3)
8485 +#define EC_FUNC_RXRETURN                       EC_FUNC(4)
8486 +#define EC_FUNC_SEND                           EC_FUNC(5)
8487 +#define EC_FUNC_RXINT                          EC_FUNC(6)
8488 +#define EC_FUNC_TXINT                          EC_FUNC(7)
8489 +#define EC_FUNC_AAL2_VDMA                      EC_FUNC(8)
8490 +#define EC_FUNC_OPTIONS                        EC_FUNC(9)
8491 +#define EC_FUNC_PROBE                          EC_FUNC(10)
8492 +#define EC_FUNC_OPEN                           EC_FUNC(11)
8493 +#define EC_FUNC_CONTROL                        EC_FUNC(12)
8494 +#define EC_FUNC_DEVICE_INT                     EC_FUNC(13)
8495 +#define EC_FUNC_STATUS                         EC_FUNC(14)
8496 +#define EC_FUNC_TICK                           EC_FUNC(15)
8497 +#define EC_FUNC_CLOSE                          EC_FUNC(16)
8498 +#define EC_FUNC_SHUTDOWN                       EC_FUNC(17)
8499 +#define EC_FUNC_DEVICE_INT_ALT                 EC_FUNC(18) /* +GSG 030306 */
8500 +
8501 +/*
8502 +HAL Error Codes.  The list below defines every type of error
8503 +used in all HAL modules. DO NOT CHANGE THESE VALUES!  Add new
8504 +values in integer order to the bottom of the list.
8505 +*/
8506 +#define EC_VAL_PDSP_LOAD_FAIL                 EC_ERR(0x01)|EC_CRITICAL
8507 +#define EC_VAL_FIRMWARE_TOO_LARGE             EC_ERR(0x02)|EC_CRITICAL
8508 +#define EC_VAL_DEVICE_NOT_FOUND               EC_ERR(0x03)|EC_CRITICAL
8509 +#define EC_VAL_BASE_ADDR_NOT_FOUND            EC_ERR(0x04)|EC_CRITICAL
8510 +#define EC_VAL_RESET_BIT_NOT_FOUND            EC_ERR(0x05)|EC_CRITICAL
8511 +#define EC_VAL_CH_INFO_NOT_FOUND              EC_ERR(0x06)
8512 +#define EC_VAL_RX_STATE_RAM_NOT_CLEARED       EC_ERR(0x07)|EC_CRITICAL
8513 +#define EC_VAL_TX_STATE_RAM_NOT_CLEARED       EC_ERR(0x08)|EC_CRITICAL
8514 +#define EC_VAL_MALLOC_DEV_FAILED              EC_ERR(0x09)
8515 +#define EC_VAL_OS_VERSION_NOT_SUPPORTED       EC_ERR(0x0A)|EC_CRITICAL
8516 +#define EC_VAL_CPSAR_VERSION_NOT_SUPPORTED    EC_ERR(0x0B)|EC_CRITICAL
8517 +#define EC_VAL_NULL_CPSAR_DEV                 EC_ERR(0x0C)|EC_CRITICAL
8518 +
8519 +#define EC_VAL_LUT_NOT_READY                  EC_ERR(0x0D)
8520 +#define EC_VAL_INVALID_CH                     EC_ERR(0x0E)
8521 +#define EC_VAL_NULL_CH_STRUCT                 EC_ERR(0x0F)
8522 +#define EC_VAL_RX_TEARDOWN_ALREADY_PEND       EC_ERR(0x10)
8523 +#define EC_VAL_TX_TEARDOWN_ALREADY_PEND       EC_ERR(0x11)
8524 +#define EC_VAL_RX_CH_ALREADY_TORNDOWN         EC_ERR(0x12)
8525 +#define EC_VAL_TX_CH_ALREADY_TORNDOWN         EC_ERR(0x13)
8526 +#define EC_VAL_TX_TEARDOWN_TIMEOUT            EC_ERR(0x14)
8527 +#define EC_VAL_RX_TEARDOWN_TIMEOUT            EC_ERR(0x15)
8528 +#define EC_VAL_CH_ALREADY_TORNDOWN            EC_ERR(0x16)
8529 +#define EC_VAL_VC_SETUP_NOT_READY             EC_ERR(0x17)
8530 +#define EC_VAL_VC_TEARDOWN_NOT_READY          EC_ERR(0x18)
8531 +#define EC_VAL_INVALID_VC                     EC_ERR(0x19)
8532 +#define EC_VAL_INVALID_LC                     EC_ERR(0x20)
8533 +#define EC_VAL_INVALID_VDMA_CH                EC_ERR(0x21)
8534 +#define EC_VAL_INVALID_CID                    EC_ERR(0x22)
8535 +#define EC_VAL_INVALID_UUI                    EC_ERR(0x23)
8536 +#define EC_VAL_INVALID_UUI_DISCARD            EC_ERR(0x24)
8537 +#define EC_VAL_CH_ALREADY_OPEN                EC_ERR(0x25)
8538 +
8539 +#define EC_VAL_RCB_MALLOC_FAILED              EC_ERR(0x26)
8540 +#define EC_VAL_RX_BUFFER_MALLOC_FAILED        EC_ERR(0x27)
8541 +#define EC_VAL_OUT_OF_TCBS                    EC_ERR(0x28)
8542 +#define EC_VAL_NO_TCBS                        EC_ERR(0x29)
8543 +#define EC_VAL_NULL_RCB                       EC_ERR(0x30)|EC_CRITICAL
8544 +#define EC_VAL_SOP_ERROR                      EC_ERR(0x31)|EC_CRITICAL
8545 +#define EC_VAL_EOP_ERROR                      EC_ERR(0x32)|EC_CRITICAL
8546 +#define EC_VAL_NULL_TCB                       EC_ERR(0x33)|EC_CRITICAL
8547 +#define EC_VAL_CORRUPT_RCB_CHAIN              EC_ERR(0x34)|EC_CRITICAL
8548 +#define EC_VAL_TCB_MALLOC_FAILED              EC_ERR(0x35)
8549 +
8550 +#define EC_VAL_DISABLE_POLLING_FAILED         EC_ERR(0x36)
8551 +#define EC_VAL_KEY_NOT_FOUND                  EC_ERR(0x37)
8552 +#define EC_VAL_MALLOC_FAILED                  EC_ERR(0x38)
8553 +#define EC_VAL_RESET_BASE_NOT_FOUND           EC_ERR(0x39)|EC_CRITICAL
8554 +#define EC_VAL_INVALID_STATE                  EC_ERR(0x40)
8555 +#define EC_VAL_NO_TXH_WORK_TO_DO              EC_ERR(0x41)
8556 +#define EC_VAL_NO_TXL_WORK_TO_DO              EC_ERR(0x42)
8557 +#define EC_VAL_NO_RX_WORK_TO_DO               EC_ERR(0x43)
8558 +#define EC_VAL_NOT_LINKED                     EC_ERR(0x44)
8559 +#define EC_VAL_INTERRUPT_NOT_FOUND            EC_ERR(0x45)
8560 +#define EC_VAL_OFFSET_NOT_FOUND               EC_ERR(0x46)
8561 +#define EC_VAL_MODULE_ALREADY_CLOSED          EC_ERR(0x47)
8562 +#define EC_VAL_MODULE_ALREADY_SHUTDOWN        EC_ERR(0x48)
8563 +#define EC_VAL_ACTION_NOT_FOUND               EC_ERR(0x49)
8564 +#define EC_VAL_RX_CH_ALREADY_SETUP            EC_ERR(0x50)
8565 +#define EC_VAL_TX_CH_ALREADY_SETUP            EC_ERR(0x51)
8566 +#define EC_VAL_RX_CH_ALREADY_OPEN             EC_ERR(0x52)
8567 +#define EC_VAL_TX_CH_ALREADY_OPEN             EC_ERR(0x53)
8568 +#define EC_VAL_CH_ALREADY_SETUP               EC_ERR(0x54)
8569 +#define EC_VAL_RCB_NEEDS_BUFFER               EC_ERR(0x55) /* +GSG 030410 */
8570 +#define EC_VAL_RCB_DROPPED                    EC_ERR(0x56) /* +GSG 030410 */
8571 +#define EC_VAL_INVALID_VALUE                  EC_ERR(0x57)
8572 +
8573 +/**
8574 +@defgroup shared_data Shared Data Structures
8575 +
8576 +The data structures documented here are shared by all modules.
8577 +*/
8578 +
8579 +/**
8580 + *  @ingroup shared_data
8581 + *  This is the fragment list structure.  Each fragment list entry contains a
8582 + *  length and a data buffer.
8583 + */
8584 +typedef struct
8585 +  {
8586 +   bit32u   len;    /**< Length of the fragment in bytes (lower 16 bits are valid).  For SOP, upper 16 bits is the buffer offset. */
8587 +   void     *data;  /**< Pointer to fragment data. */
8588 +   void     *OsInfo; /**< Pointer to OS defined data. */
8589 +  }FRAGLIST;
8590 +
8591 +#if defined (_CPHAL_CPMAC)
8592 +#define CB_PASSCRC_BIT     (1<<26)
8593 +
8594 +/* CPMAC CPHAL STATUS */
8595 +#define CPMAC_STATUS_LINK               (1 << 0)
8596 +#define CPMAC_STATUS_LINK_DUPLEX        (1 << 1)  /* 0 - HD, 1 - FD */
8597 +#define CPMAC_STATUS_LINK_SPEED         (1 << 2)  /* 0 - 10, 1 - 100 */
8598 +
8599 +/*   ADAPTER CHECK Codes */
8600 +
8601 +#define CPMAC_STATUS_ADAPTER_CHECK             (1 << 7)
8602 +#define CPMAC_STATUS_HOST_ERR_DIRECTION        (1 << 8)
8603 +#define CPMAC_STATUS_HOST_ERR_CODE             (0xF << 9)
8604 +#define CPMAC_STATUS_HOST_ERR_CH               (0x7 << 13)
8605 +
8606 +#define _CPMDIO_DISABLE                 (1 << 0)
8607 +#define _CPMDIO_HD                      (1 << 1)
8608 +#define _CPMDIO_FD                      (1 << 2)
8609 +#define _CPMDIO_10                      (1 << 3)
8610 +#define _CPMDIO_100                     (1 << 4)
8611 +#define _CPMDIO_NEG_OFF                 (1 << 5)
8612 +#define _CPMDIO_LOOPBK                  (1 << 16)
8613 +#define _CPMDIO_NOPHY                   (1 << 20)
8614 +#endif
8615 +
8616 +/**
8617 + *  @ingroup shared_data
8618 + *  Channel specific configuration information.  This structure should be
8619 + *  populated by upper-layer software prior to calling @c ChannelSetup().  Any
8620 + *  configuration item that can be changed on a per channel basis should
8621 + *  be represented here.  Each module may define this structure with additional
8622 + *  module-specific members.
8623 + */
8624 +typedef struct
8625 +  {
8626 +   int Channel;        /**< Channel number. */
8627 +   int Direction;      /**< DIRECTION_RX(1) or DIRECTION_TX(0). */
8628 +   OS_SETUP *OsSetup;  /**< OS defined information associated with this channel. */
8629 +
8630 +#if defined(_CPHAL_AAL5) || defined (_CPHAL_CPSAR) || defined (_CPHAL_CPMAC)
8631 +   int RxBufSize;      /**< Size (in bytes) for each Rx buffer.*/
8632 +   int RxBufferOffset; /**< Number of bytes to offset rx data from start of buffer (must be less than buffer size). */
8633 +   int RxNumBuffers;   /**< The number of Rx buffer descriptors to allocate for Ch. */
8634 +   int RxServiceMax;   /**< Maximum number of packets to service at one time. */
8635 +
8636 +   int TxNumBuffers;   /**< The number of Tx buffer descriptors to allocate for Ch. */
8637 +   int TxNumQueues;    /**< Number of Tx queues for this channel (1-2). Choosing 2 enables a low priority SAR queue. */
8638 +   int TxServiceMax;   /**< Maximum number of packets to service at one time. */
8639 +#endif
8640 +
8641 +#if defined(_CPHAL_AAL5) || defined(_CPHAL_CPSAR)
8642 +   int CpcsUU;      /**< The 2-byte CPCS UU and CPI information. */
8643 +   int Gfc;         /**< Generic Flow Control. */
8644 +   int Clp;         /**< Cell Loss Priority. */
8645 +   int Pti;         /**< Payload Type Indication. */
8646 +#endif
8647 +
8648 +#if defined(_CPHAL_AAL2) || defined(_CPHAL_AAL5) || defined(_CPHAL_CPSAR)
8649 +   int DaMask;      /**< Specifies whether credit issuance is paused when Tx data not available. */
8650 +   int Priority;    /**< Priority bin this channel will be scheduled within. */
8651 +   int PktType;     /**< 0=AAL5,1=Null AAL,2=OAM,3=Transparent,4=AAL2. */
8652 +   int Vci;         /**< Virtual Channel Identifier. */
8653 +   int Vpi;         /**< Virtual Path Identifier. */
8654 +   int FwdUnkVc;    /**< Enables forwarding of unknown VCI/VPI cells to host. 1=enable, 0=disable. */
8655 +
8656 +   /* Tx VC State */
8657 +   int TxVc_CellRate;  /**< Tx rate, set as clock ticks between transmissions (SCR for VBR, CBR for CBR). */
8658 +   int TxVc_QosType;   /**< 0=CBR,1=VBR,2=UBR,3=UBRmcr. */
8659 +   int TxVc_Mbs;       /**< Min Burst Size in cells.*/
8660 +   int TxVc_Pcr;       /**< Peak Cell Rate for VBR in clock ticks between transmissions. */
8661 +
8662 +   bit32 TxVc_AtmHeader; /**< ATM Header placed on firmware gen'd OAM cells for this Tx Ch (must be big endian with 0 PTI). */
8663 +   int TxVc_OamTc;     /**< TC Path to transmit OAM cells for TX connection (0,1). */
8664 +   int TxVc_VpOffset;  /**< Offset to the OAM VP state table. */
8665 +   /* Rx VC State */
8666 +   int RxVc_OamCh;     /**< Ch to terminate rx'd OAM cells to be forwarded to the host. */
8667 +   int RxVc_OamToHost; /**< 0=do not pass, 1=pass. */
8668 +   bit32 RxVc_AtmHeader; /**< ATM Header placed on firmware gen'd OAM cells for this Rx conn (must be big endian with 0 PTI). */
8669 +   int RxVc_OamTc;     /**< TC Path to transmit OAM cells for RX connection (0,1). */
8670 +   int RxVc_VpOffset;  /**< Offset to the OAM VP state table. */
8671 +   /* Tx VP State */
8672 +   int TxVp_OamTc;     /**< TC Path to transmit OAM cells for TX VP connection (0,1). */
8673 +   bit32 TxVp_AtmHeader; /**< ATM Header placed on firmware gen'd VP OAM cells for this Tx VP conn (must be big endian with 0 VCI). */
8674 +   /* Rx VP State  */
8675 +   int RxVp_OamCh;     /**< Ch to terminate rx'd OAM cells to be forwarded to the host. */
8676 +   int RxVp_OamToHost; /**< 0=do not pass, 1=pass. */
8677 +   bit32 RxVp_AtmHeader; /**< ATM Header placed on firmware gen'd OAM cells for this Rx VP conn (must be big endian with 0 VCI). */
8678 +   int RxVp_OamTc;     /**< TC Path to transmit OAM cells for RX VP connection (0,1). */
8679 +   int RxVp_OamVcList; /**< Indicates all VC channels associated with this VP channel (one-hot encoded). */
8680 +#endif
8681 +
8682 +
8683 +#ifdef _CPHAL_VDMAVT
8684 +   bit32u RemFifoAddr; /* Mirror mode only. */
8685 +   bit32u FifoAddr;
8686 +   bit32  PollInt;
8687 +   bit32  FifoSize;
8688 +   int    Ready;
8689 +#endif
8690 +
8691 +  }CHANNEL_INFO;
8692 +
8693 +/*
8694 + *  This structure contains each statistic value gathered by the CPHAL.
8695 + *  Applications may access statistics data by using the @c StatsGet() routine.
8696 + */
8697 +/* STATS */
8698 +#if defined(_CPHAL_AAL2) || defined(_CPHAL_AAL5) || defined(_CPHAL_CPSAR)
8699 +typedef struct
8700 +  {
8701 +   bit32u CrcErrors[16];
8702 +   bit32u LenErrors[16];
8703 +   bit32u DmaLenErrors[16];
8704 +   bit32u AbortErrors[16];
8705 +   bit32u StarvErrors[16];
8706 +   bit32u TxMisQCnt[16][2];
8707 +   bit32u RxMisQCnt[16];
8708 +   bit32u RxEOQCnt[16];
8709 +   bit32u TxEOQCnt[16][2];
8710 +   bit32u RxPacketsServiced[16];
8711 +   bit32u TxPacketsServiced[16][2];
8712 +   bit32u RxMaxServiced;
8713 +   bit32u TxMaxServiced[16][2];
8714 +   bit32u RxTotal;
8715 +   bit32u TxTotal;
8716 +  } STAT_INFO;
8717 +#endif
8718 +
8719 +/*
8720 + *  VDMA Channel specific configuration information
8721 + */
8722 +#ifdef _CPHAL_AAL2
8723 +typedef struct
8724 +  {
8725 +   int Ch;           /**< Channel Number */
8726 +   int RemoteEndian; /**< Endianness of remote VDMA-VT device */
8727 +   int CpsSwap;      /**< When 0, octet 0 in CPS pkt located in LS byte of 16-bit word sent to rem VDMA device.  When 1, in MS byte. */
8728 +  }VdmaChInfo;
8729 +#endif
8730 +
8731 +#ifndef _CPHAL
8732 +  typedef void HAL_DEVICE;
8733 +  typedef void HAL_PRIVATE;
8734 +  typedef void HAL_RCB;
8735 +  typedef void HAL_RECEIVEINFO;
8736 +#endif
8737 +
8738 +/**
8739 + *  @ingroup shared_data
8740 + *  The HAL_FUNCTIONS struct defines the function pointers used by upper layer
8741 + *  software.  The upper layer software receives these pointers through the
8742 + *  call to xxxInitModule().
8743 + */
8744 +typedef struct
8745 +  {
8746 +  int  (*ChannelSetup)    (HAL_DEVICE *HalDev, CHANNEL_INFO *Channel, OS_SETUP *OsSetup);
8747 +  int  (*ChannelTeardown) (HAL_DEVICE *HalDev, int Channel, int Mode);
8748 +  int  (*Close)           (HAL_DEVICE *HalDev, int Mode);
8749 +  int  (*Control)         (HAL_DEVICE *HalDev, const char *Key, const char *Action, void *Value);
8750 +  int  (*Init)            (HAL_DEVICE *HalDev);
8751 +  int  (*Open)            (HAL_DEVICE *HalDev);
8752 +  int  (*PacketProcessEnd) (HAL_DEVICE *HalDev);
8753 +  int  (*Probe)           (HAL_DEVICE *HalDev);
8754 +  int  (*RxReturn)        (HAL_RECEIVEINFO *HalReceiveInfo, int StripFlag);
8755 +  int  (*Send)            (HAL_DEVICE *HalDev, FRAGLIST *FragList, int FragCount, int PacketSize, OS_SENDINFO *OsSendInfo, bit32u Mode);
8756 +  int  (*Shutdown)        (HAL_DEVICE *HalDev);
8757 +  int  (*Tick)            (HAL_DEVICE *HalDev);
8758 +
8759 +#ifdef _CPHAL_AAL5
8760 +  int  (*Kick) (HAL_DEVICE *HalDev, int Queue);
8761 +  void (*OamFuncConfig)   (HAL_DEVICE *HalDev, unsigned int OamConfig);
8762 +  void (*OamLoopbackConfig)   (HAL_DEVICE *HalDev, unsigned int OamConfig, unsigned int *LLID, unsigned int CorrelationTag);
8763 +  volatile bit32u* (*RegAccess)(HAL_DEVICE *HalDev, bit32u RegOffset);
8764 +  STAT_INFO*  (*StatsGetOld)(HAL_DEVICE *HalDev);
8765 +#endif
8766 +  } HAL_FUNCTIONS;
8767 +
8768 +/**
8769 + *  @ingroup shared_data
8770 + *  The OS_FUNCTIONS struct defines the function pointers for all upper layer
8771 + *  functions accessible to the CPHAL.  The upper layer software is responsible
8772 + *  for providing the correct OS-specific implementations for the following
8773 + *  functions. It is populated by calling InitModule() (done by the CPHAL in
8774 + *  xxxInitModule().
8775 + */
8776 +typedef struct
8777 +  {
8778 +  int   (*Control)(OS_DEVICE *OsDev, const char *Key, const char *Action, void *Value);
8779 +  void  (*CriticalOn)(void);
8780 +  void  (*CriticalOff)(void);
8781 +  void  (*DataCacheHitInvalidate)(void *MemPtr, int Size);
8782 +  void  (*DataCacheHitWriteback)(void *MemPtr, int Size);
8783 +  int   (*DeviceFindInfo)(int Inst, const char *DeviceName, void *DeviceInfo);
8784 +  int   (*DeviceFindParmUint)(void *DeviceInfo, const char *Parm, bit32u *Value);
8785 +  int   (*DeviceFindParmValue)(void *DeviceInfo, const char *Parm, void *Value);
8786 +  void  (*Free)(void *MemPtr);
8787 +  void  (*FreeRxBuffer)(OS_RECEIVEINFO *OsReceiveInfo, void *MemPtr);
8788 +  void  (*FreeDev)(void *MemPtr);
8789 +  void  (*FreeDmaXfer)(void *MemPtr);
8790 +  void  (*IsrRegister)(OS_DEVICE *OsDev, int (*halISR)(HAL_DEVICE*, int*), int InterruptBit);
8791 +  void  (*IsrUnRegister)(OS_DEVICE *OsDev, int InterruptBit);
8792 +  void* (*Malloc)(bit32u size);
8793 +  void* (*MallocDev)(bit32u Size);
8794 +  void* (*MallocDmaXfer)(bit32u size, void *MemBase, bit32u MemRange);
8795 +  void* (*MallocRxBuffer)(bit32u size, void *MemBase, bit32u MemRange,
8796 +                       OS_SETUP *OsSetup, HAL_RECEIVEINFO *HalReceiveInfo,
8797 +                       OS_RECEIVEINFO **OsReceiveInfo, OS_DEVICE *OsDev);
8798 +  void* (*Memset)(void *Dest, int C, bit32u N);
8799 +  int   (*Printf)(const char *Format, ...);
8800 +  int   (*Receive)(OS_DEVICE *OsDev,FRAGLIST *FragList,bit32u FragCount,
8801 +                 bit32u PacketSize,HAL_RECEIVEINFO *HalReceiveInfo, bit32u Mode);
8802 +  int   (*SendComplete)(OS_SENDINFO *OsSendInfo);
8803 +  int   (*Sprintf)(char *S, const char *Format, ...);
8804 +  int   (*Strcmpi)(const char *Str1, const char *Str2);
8805 +  unsigned int (*Strlen)(const char *S);
8806 +  char* (*Strstr)(const char *S1, const char *S2);
8807 +  unsigned long  (*Strtoul)(const char *Str, char **Endptr, int Base);
8808 +  void  (*TeardownComplete)(OS_DEVICE *OsDev, int Ch, int Direction);
8809 +  } OS_FUNCTIONS;
8810 +
8811 +/************** MODULE SPECIFIC STUFF BELOW **************/
8812 +
8813 +#ifdef _CPHAL_CPMAC
8814 +
8815 +/*
8816 +int halCpmacInitModule(HAL_DEVICE **HalDev, OS_DEVICE *OsDev, HAL_FUNCTIONS *HalFunc, int (*osBridgeInitModule)(OS_FUNCTIONS *), void* (*osMallocDev) (bit32u), int *Size, int inst);
8817 +*/
8818 +
8819 +int halCpmacInitModule(HAL_DEVICE **HalDev,
8820 +                 OS_DEVICE *OsDev,
8821 +                 HAL_FUNCTIONS **HalFunc,
8822 +                 OS_FUNCTIONS *OsFunc,
8823 +                 int OsFuncSize,
8824 +                 int *HalFuncSize,
8825 +                 int Inst);
8826 +#endif
8827 +
8828 +#ifdef _CPHAL_AAL5
8829 +/*
8830 + *  @ingroup shared_data
8831 + *  The AAL5_FUNCTIONS struct defines the AAL5 function pointers used by upper layer
8832 + *  software.  The upper layer software receives these pointers through the
8833 + *  call to cphalInitModule().
8834 + */
8835 +/*
8836 +typedef struct
8837 +  {
8838 +  int  (*ChannelSetup)(HAL_DEVICE *HalDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup);
8839 +  int  (*ChannelTeardown)(HAL_DEVICE *HalDev, int Ch, int Mode);
8840 +  int  (*Close)(HAL_DEVICE *HalDev, int Mode);
8841 +  int  (*Init)(HAL_DEVICE *HalDev);
8842 +  int  (*ModeChange)(HAL_DEVICE *HalDev, char *DeviceParms);
8843 +  int  (*Open)(HAL_DEVICE *HalDev);
8844 +  int  (*InfoGet)(HAL_DEVICE *HalDev, int Key, void *Value);
8845 +  int  (*Probe)(HAL_DEVICE *HalDev);
8846 +  int  (*RxReturn)(HAL_RECEIVEINFO *HalReceiveInfo, int StripFlag);
8847 +  int  (*Send)(HAL_DEVICE *HalDev,FRAGLIST *FragList,int FragCount,
8848 +                 int PacketSize,OS_SENDINFO *OsSendInfo,int Ch, int Queue,
8849 +                 bit32u Mode);
8850 +  int  (*StatsClear)(HAL_DEVICE *HalDev);
8851 +  STAT_INFO*  (*StatsGet)(HAL_DEVICE *HalDev);
8852 +  int  (*Status)(HAL_DEVICE *HalDev);
8853 +  void (*Tick)(HAL_DEVICE *HalDev);
8854 +  int  (*Kick)(HAL_DEVICE *HalDev, int Queue);
8855 +  volatile bit32u* (*RegAccess)(HAL_DEVICE *HalDev, bit32u RegOffset);
8856 +  } AAL5_FUNCTIONS;
8857 +*/
8858 +
8859 +int cpaal5InitModule(HAL_DEVICE **HalDev,
8860 +                 OS_DEVICE *OsDev,
8861 +                 HAL_FUNCTIONS **HalFunc,
8862 +                 OS_FUNCTIONS *OsFunc,
8863 +                 int OsFuncSize,
8864 +                 int *HalFuncSize,
8865 +                 int Inst);
8866 +#endif
8867 +
8868 +#ifdef _CPHAL_AAL2
8869 +/**
8870 + *  @ingroup shared_data
8871 + *  The AAL2_FUNCTIONS struct defines the AAL2 function pointers used by upper layer
8872 + *  software.  The upper layer software receives these pointers through the
8873 + *  call to cphalInitModule().
8874 + */
8875 +typedef struct
8876 +  {
8877 +  int  (*ChannelSetup)(HAL_DEVICE *HalDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup);
8878 +  int  (*ChannelTeardown)(HAL_DEVICE *HalDev, int Ch, int Mode);
8879 +  int  (*Close)(HAL_DEVICE *HalDev, int Mode);
8880 +  int  (*Init)(HAL_DEVICE *HalDev);
8881 +  int  (*ModeChange)(HAL_DEVICE *HalDev, char *DeviceParms);
8882 +  int  (*Open)(HAL_DEVICE *HalDev);
8883 +  int  (*OptionsGet)(HAL_DEVICE *HalDev, char *Key, bit32u *Value);
8884 +  int  (*Probe)(HAL_DEVICE *HalDev);
8885 +
8886 +  int  (*StatsClear)(HAL_DEVICE *HalDev);
8887 +  STAT_INFO*  (*StatsGet)(HAL_DEVICE *HalDev);
8888 +  int  (*Status)(HAL_DEVICE *HalDev);
8889 +  void (*Tick)(HAL_DEVICE *HalDev);
8890 +  int  (*Aal2UuiMappingSetup)(HAL_DEVICE *HalDev, int VC, int UUI,
8891 +                                    int VdmaCh, int UUIDiscard);
8892 +  int  (*Aal2RxMappingSetup)(HAL_DEVICE *HalDev, int VC, int CID,
8893 +                                   int LC);
8894 +  int  (*Aal2TxMappingSetup)(HAL_DEVICE *HalDev, int VC, int LC, int VdmaCh);
8895 +  int  (*Aal2VdmaChSetup)(HAL_DEVICE *HalDev, bit32u RemVdmaVtAddr,
8896 +                               VdmaChInfo *VdmaCh);
8897 +  volatile bit32u* (*RegAccess)(HAL_DEVICE *HalDev, bit32u RegOffset);
8898 +  int  (*Aal2ModeChange)(HAL_DEVICE *HalDev, int Vc, int RxCrossMode,
8899 +                           int RxMultiMode, int TxMultiMode, int SchedMode,
8900 +                           int TcCh);
8901 +  void (*Aal2VdmaEnable)(HAL_DEVICE *HalDev, int Ch);
8902 +  int  (*Aal2VdmaDisable)(HAL_DEVICE *HalDev, int Ch);
8903 +  } AAL2_FUNCTIONS;
8904 +
8905 +int cpaal2InitModule(HAL_DEVICE **HalDev,
8906 +                 OS_DEVICE *OsDev,
8907 +                 AAL2_FUNCTIONS **HalFunc,
8908 +                 OS_FUNCTIONS *OsFunc,
8909 +                 int OsFuncSize,
8910 +                 int *HalFuncSize,
8911 +                 int Inst);
8912 +#endif
8913 +
8914 +#ifdef _CPHAL_VDMAVT
8915 +/**
8916 + *  @ingroup shared_data
8917 + *  The VDMA_FUNCTIONS struct defines the HAL function pointers used by upper layer
8918 + *  software.  The upper layer software receives these pointers through the
8919 + *  call to InitModule().
8920 + *
8921 + *  Note that this list is still under definition.
8922 + */
8923 +typedef struct
8924 +  {
8925 +  bit32  (*Init)( HAL_DEVICE *VdmaVtDev);
8926 +    /*  bit32  (*SetupTxFifo)(HAL_DEVICE *VdmaVtDev, bit32u LclRem,
8927 +                  bit32u Addr, bit32u Size, bit32u PollInt);
8928 +    bit32  (*SetupRxFifo)(HAL_DEVICE *VdmaVtDev, bit32u LclRem,
8929 +                  bit32u Addr, bit32u Size, bit32u PollInt); */
8930 +  bit32  (*Tx)(HAL_DEVICE *VdmaVtDev);
8931 +  bit32  (*Rx)(HAL_DEVICE *VdmaVtDev);
8932 +  bit32  (*SetRemoteChannel)(HAL_DEVICE *VdmaVtDev, bit32u RemAddr,
8933 +                         bit32u RemDevID);
8934 +  bit32  (*ClearRxInt)(HAL_DEVICE *VdmaVtDev);
8935 +  bit32  (*ClearTxInt)(HAL_DEVICE *VdmaVtDev);
8936 +  bit32  (*Open)(HAL_DEVICE *VdmaVtDev);
8937 +  bit32  (*Close)(HAL_DEVICE *VdmaVtDev);
8938 +  int    (*Control)         (HAL_DEVICE *HalDev, const char *Key, const char *Action, void *Value);
8939 +  int    (*ChannelSetup)(HAL_DEVICE *VdmaVtDev, CHANNEL_INFO *HalCh, OS_SETUP *OsSetup);
8940 +  int    (*ChannelTeardown)(HAL_DEVICE *VdmaVtDev, int Ch, int Mode);
8941 +  int    (*Send)(HAL_DEVICE *VdmaVtDev,FRAGLIST *FragList,int FragCount,
8942 +                 int PacketSize,OS_SENDINFO *OsSendInfo,bit32u Mode);
8943 +  } VDMA_FUNCTIONS;
8944 +
8945 +int VdmaInitModule(HAL_DEVICE **VdmaVt,
8946 +                 OS_DEVICE *OsDev,
8947 +                 VDMA_FUNCTIONS **VdmaVtFunc,
8948 +                 OS_FUNCTIONS *OsFunc,
8949 +                 int OsFuncSize,
8950 +                 int *HalFuncSize,
8951 +                 int Inst);
8952 +#endif
8953 +
8954 +/*
8955 +extern int cphalInitModule(MODULE_TYPE ModuleType, HAL_DEVICE **HalDev, OS_DEVICE *OsDev, HAL_FUNCTIONS *HalFunc,
8956 +                      int (*osInitModule)(OS_FUNCTIONS *), void* (*osMallocDev)(bit32u),
8957 +                      int *Size, int Inst);
8958 +*/
8959 +
8960 +
8961 +#ifdef _CPHAL_AAL5
8962 +extern const char hcSarFrequency[];
8963 +#endif
8964 +
8965 +#ifdef _CPHAL_CPMAC
8966 +/* following will be common, once 'utl' added */
8967 +extern const char hcClear[];
8968 +extern const char hcGet[];
8969 +extern const char hcSet[];
8970 +extern const char hcTick[];
8971 +
8972 +extern const char hcCpuFrequency[];
8973 +extern const char hcCpmacFrequency[];
8974 +extern const char hcMdioBusFrequency[];
8975 +extern const char hcMdioClockFrequency[];
8976 +extern const char hcCpmacBase[];
8977 +extern const char hcPhyNum[];
8978 +extern const char hcSize[];
8979 +extern const char hcCpmacSize[];
8980 +extern const char hcPhyAccess[];
8981 +#endif
8982 +
8983 +#endif  /*  end of _INC_    */
8984 diff -urN linux.old/drivers/atm/sangam_atm/dev_host_interface.h linux.dev/drivers/atm/sangam_atm/dev_host_interface.h
8985 --- linux.old/drivers/atm/sangam_atm/dev_host_interface.h       1970-01-01 01:00:00.000000000 +0100
8986 +++ linux.dev/drivers/atm/sangam_atm/dev_host_interface.h       2005-08-23 04:46:50.091844608 +0200
8987 @@ -0,0 +1,1162 @@
8988 +#ifndef __DEV_HOST_INTERFACE_H__
8989 +#define __DEV_HOST_INTERFACE_H__ 1
8990 +
8991 +/*******************************************************************************
8992 +*  FILE PURPOSE: Public header file for the Host-to-DSP interface
8993 +********************************************************************************
8994 +*
8995 +*  TEXAS INSTRUMENTS PROPRIETARTY INFORMATION
8996 +*
8997 +*  (C) Copyright Texas Instruments Inc. 2002.  All rights reserved.
8998 +*
8999 +*  Property of Texas Instruments Incorporated
9000 +*
9001 +*  Restricted Rights - Use, duplication, or disclosure is subject to
9002 +*  restrictions set forth in TI's program license agreement and
9003 +*  associated documentation
9004 +*
9005 +*
9006 +*  FILE NAME: dev_host_interface.h
9007 +*
9008 +*  DESCRIPTION:
9009 +*       This header file defines the variables and parameters used between the
9010 +*       host processor and the DSP.  This file is included in both the DSP
9011 +*       software and the host software.
9012 +*
9013 +*  RULES FOR MODIFICATION AND USE OF THIS FILE:
9014 +*
9015 +*  --The main pointer to the struct of pointers will always be at the same fixed
9016 +*      location (0x80000000).
9017 +*
9018 +*  --Each pointer element in the struct of pointers (indicated by the main pointer)
9019 +*      will always point to a struct only.
9020 +*
9021 +*  --Any new structures added to the host interface in subsequent versions must
9022 +*      each have a corresponding new pointer element added to the END of the struct
9023 +*      of pointers.  Other than this, there will never be any moving or rearranging
9024 +*      of the pointer elements in the struct of pointers.
9025 +*
9026 +*  --Any new elements added to existing structures will be added at the END of the
9027 +*      structure.  Other than this, there will never be any moving or rearranging
9028 +*      of structure elements.
9029 +*
9030 +*  --A new structure will never be added as a new element in an old structure.
9031 +*      New structures must be added separately with a new entry in the struct of
9032 +*      pointers, as noted above.
9033 +*
9034 +*  --Also, the sizes of existing arrays within old structures will never be changed.
9035 +*
9036 +*  --The modem code in the DSP will never reference the struct of pointers in order
9037 +*      to avoid aliasing issues in the DSP code.  The modem code will only use the
9038 +*      specific structures directly.
9039 +*
9040 +*  --The host processor never accesses the DSP side of the ATM-TC hardware directly.
9041 +*      The DSP interfaces directly to the ATM-TC hardware and relays information to
9042 +*      the host processor through the host interface.
9043 +*
9044 +*  --The host processor can track the modem's transition through important states
9045 +*      by accessing the Modem State Bit Field in the host interface.  Each bit in
9046 +*      the bit field represents an important state to track in the modem.  As the
9047 +*      modem transitions through each important state, the corresponding bit will
9048 +*      change from a zero to a one.  Each bit in the bit field will only be reset to
9049 +*      zero if the modem retrains.  If new states need to be tracked and are added
9050 +*      in subsequent versions of the host interface, a corresponding bit will be
9051 +*      added at the END of the bit field to ensure backwards compatibility.  The
9052 +*      Modem State Bit Field is reset if the modem retrains or falls out of Showtime.
9053 +*
9054 +*  --An interrupt will be sent to the host processor when a change occurs in the
9055 +*      Modem State Bit Field.  There is an interrupt masking register which can mask
9056 +*      specific interrupts corresponding to the bits of the Modem State Bit Field.
9057 +*      This allows the host to keep an interrupt from being generated for those
9058 +*      states that are masked.
9059 +*
9060 +*  HISTORY:
9061 +*
9062 +*  11/20/02  J. Bergsagel    Written from the previous host interface file
9063 +*  11/27/02  J. Bergsagel    Added comments for mailbox control struct and
9064 +*                              fixed a couple items for overlay page stuff.
9065 +*                            Also, added temporary elements for SWTC code.
9066 +*  12/04/02  J. Bergsagel    Added extra dummy byte to DEV_HOST_eocVarDef_t
9067 +*                              for proper word alignment.
9068 +*  12/12/02  J. Bergsagel    Changed initial states in the modem state bit field
9069 +*                              and added more instructions for adding more states.
9070 +*  12/16/02  J. Bergsagel    Changed name "hostVersion_p" to "hostIntfcVersion_p".
9071 +*                            Removed dspAturState from DEV_HOST_modemStateBitField_t.
9072 +*                            Reorganized several struct elements to clean up the
9073 +*                              host interface.
9074 +*  12/27/02  Sameer V        Added missing channel 0 statistics for TC. Added
9075 +*                            ocd error information.
9076 +*  12/27/02  Sameer V        Added overlayState to OlayDP_Parms to indicate whether
9077 +*                              overlays are being executed in current state.
9078 +*  01/06/03  J. Bergsagel    Added maxAllowedMargin and minRequiredMargin to
9079 +*                              DEV_HOST_msg_t.
9080 +*                            Renamed TC chan 1 items to be chan 0 items to start out.
9081 +*  01/17/03  Sameer V        Moved delineationState to atmStats structure.
9082 +*  01/21/03  Barnett         Implemented Ax7 UNIT-MODULE modular software framework.
9083 +*  01/22/03  J. Bergsagel    Added warning comments for certain struct typedefs.
9084 +*  01/23/03  C. Perez-N.     Removed old AX5-only diags. command/response entries in the
9085 +*                            HOST and DSP ennumerations, and added the AX7 new ones
9086 +*                            Added pointer entries in the DEV_HOST_dspOamSharedInterface_t
9087 +*                            structure pointing to the analog diags. input/output/options
9088 +*                            structures.
9089 +*  01/29/03  Sameer V        Removed TC_IDLE in enum for delineation state. Hardware
9090 +*                            only reports TC_HUNT, TC_PRESYNC and TC_SYNC.
9091 +*  03/07/03  Sameer/Jonathan Put SWTC token around structs and elements only used by SWTC
9092 +*  03/12/03  Mannering       Add CO profile data structures
9093 +*  03/18/03  J. Bergsagel    Removed the obsolete DSP_CHECK_TC response message.
9094 +*  03/24/03  J. Bergsagel    Added DEV_HOST_hostInterruptMask_t for masking DSP interrupt sources
9095 +*  03/28/03  C. Perez-N      Changed the C-style comments and made them C++ sytle instead.
9096 +*                            Replaced the occurrences of "SINT32 *" pointer declarations with
9097 +*                            "PSINT32"
9098 +*  03/28/03  Mannering       Update CO profile data structures
9099 +*  04/04/03  S. Yim          Add host I/F hooks for switchable hybrid and RJ11
9100 +*                              inner/outer pair selection
9101 +*  04/11/03  J. Bergsagel    Changed modem state bit field struct types to enums instead and used
9102 +*                            a single integer variable for each "bitfield".
9103 +*                            Changed bit field for host interrupt masks to an integer value also.
9104 +*  04/14/03  J. Bergsagel    Changed name of table pointer "meanSquareTblDstrm_p" to "marginTblDstrm_p".
9105 +*  04/03/03  Umesh Iyer      CMsg1 and RMsg1 use the same storage as CMSGPCB and RMSGPCB.
9106 +*                            The string lengths for these have been adjusted to hold the longest
9107 +*                            message in each case. The PCB messages from ADSL2 are longer.
9108 +*  04/21/03  Sameeer V       Added new host mailbox message for shutting down the DSLSS peripherals.
9109 +*  04/23/03  J. Bergsagel    Fixed comments for overlay mailbox messages and for losErrors.
9110 +*  04/28/03  Mannering       Added skip phase op flag to  CO profile data structure
9111 +*  05/05/03  Mannering       Review Comments - Removed "#if CO_PROFILE" from around structure
9112 +*                            definitions and define the number of profiles (DEV_HOST_LIST_ENTRIES)
9113 +*  05/13/03  J. Bergsagel    Added new elements to DEV_HOST_phyPerf_t for host control of hybrid.
9114 +*  05/15/03  J. Bergsagel    Added "farEndLosErrors" and "farEndRdiErrors" to DEV_HOST_modemStatsDef_t.
9115 +*  05/16/03  Mannering       Updated CO profile structure to support updated bit allocation and
9116 +*                            interopability.
9117 +*  05/20/03  Sameer V        Added DSP message to inicate DYING GASP.
9118 +*  05/22/03  J. Bergsagel    Added a new struct typedef "DEV_HOST_hostInterruptSource_t".
9119 +*                            Added "atucGhsRevisionNum" to "DEV_HOST_dspWrNegoParaDef_t".
9120 +*                            Moved the following struct typedef's here to the public host interface:
9121 +*                              DEV_HOST_dspBitSwapDef_t
9122 +*                              DEV_HOST_atmDsBert_t
9123 +*  05/28/03  A. Redfern      Changed pointer type and location for margin reporting.
9124 +*  05/28/03  Mannering       Moved CO profile defines to dev_host_interface_pvt.h
9125 +*  05/28/03  J. Bergsagel    Moved subStateIndex and STM BERT controls into new struct "DEV_HOST_modemEnvPublic_t"
9126 +*  05/29/03  J. Bergsagel    Added elements to "DEV_HOST_modemEnvPublic_t" for host control of DSLSS LED's.
9127 +*  06/10/03  Umesh Iyer      Modified trainMode check to be compliant with the new host i/f mods.
9128 +*  06/05/03  J. Bergsagel    Added enum that will eventually replace the bitfield: DEV_HOST_diagAnlgOptionsVar_t.
9129 +*                            Added new element "currentHybridNumUsed" in the DEV_HOST_phyPerf_t typedef
9130 +*                            Added new host control flags for LPR signal detection on GPIO[0].
9131 +*  06/06/03  A. Redfern      Removed fine gain scale from the CO profile and added max downstream power cutback.
9132 +*                            Changed "test1" in CO profile struct to "phyEcDelayAdjustment".
9133 +*  06/26/03  J. Bergsagel    Added genericStructure typedef and two pointer elements of this type in the big table.
9134 +*  07/03/03  Jack Huang      Renamed test2 to bSwapThresholdUpdate
9135 +*  07/07/03  Mallesh         Changed phySigTxPowerCutback_f flag to a variable phySigTxGainReductionAt0kft which indicates the
9136 +*                            amount of gain reduction in linear scale.
9137 +*  07/15/03  Sameer V        Changed DEV_HOST_diagAnlgOptionsVar_t to be an enum instead of a bit field. Host code
9138 +*                            does not support setting bit fields.
9139 +*  07/22/03  Jack Huang      Added bitswap control flag in host i/f for API calls
9140 +*  08/06/03  Sameer V        Added missingToneDs_p to the DEV_HOST_oamWrNegoParaDef_t to enable host to switch off
9141 +*                            DS tones on specified bins
9142 +*  08/21/03  Jack Huang      Added pcbEnabled flag in the DEV_HOST_modemEnvPublic_t structure
9143 +*                            Added g.hs buffer definitions to DEV_HOST_dspOamSharedInterface_t
9144 +*                            Added DEV_HOST_consBufDef_t to the DEV_HOST_dspOamSharedInterface_t structure
9145 +*  08/26/03  J. Bergsagel    Fixed name of "missingToneDs_p" to be "missingToneDsAddr" instead (since it is
9146 +*                            not really used as a pointer).
9147 +*  09/11/03  Mallesh         Added a flag "usPilotInT1413ModeInMedley" to determine the need to send Upstream Pilot
9148 +*                            in medley in T1.413 mode.
9149 +*  09/12/03  J. Bergsagel    Changed "test3" to "phyBitaFastPathExcessFineGainBump" in CO profile struct.
9150 +*                            Changed "test4" to "phyBitaSkipGapAdjustment" in CO profile struct.
9151 +*  09/23/03  J. Bergsagel    Changed "T1413vendorRevisionNumber" to "vendorRevisionNumber" in DEV_HOST_msg_t.
9152 +*                            Added ADSL2 and ADSL2 diag. states to the modem state bit field.
9153 +*  10/01/03  J. Bergsagel    Changed define of "MULTI_MODE" to be 255 to indicate that all possible bits
9154 +*                            in the 8-bit bit field are turned on for any current and future training modes.
9155 +*  10/09/03  M. Turkboylari  Added DSP_TRAINING_MSGS and adsl2DeltMsgs_p, which is a pointer to a pointer,
9156 +*                            in order to pass the ADSL2 training and DELT messages to the host side. This is for ACT.
9157 +*  10/20/03  Mallesh         Added a GHS state enumerator for cleardown
9158 +*  10/20/03  Xiaohui Li      Add definition for READSL2_MODE and READSL2_DELT
9159 +*  11/07/03  J. Bergsagel    Removed all code for when SWTC==1, which therefore allows removal of include of
9160 +*                            "env_def_defines.h".  We shouldn't have any compile tokens used in this file.
9161 +*                            (the SWTC token is always off in any Ax7 code).
9162 +*  11/14/03  J. Bergsagel    Also removed READSL2_ENABLE token (no more compile tokens to be used in this .h file).
9163 +*  12/12/03  Sameer/Ram      Added DEV_HOST_EOCAOC_INTERRUPT_MASK to enable host to disable response code for AOC/EOC 
9164 +*                            mailbox messages
9165 +*  12/09/03  Jack Huang      Changed G.hs txbuf size from 60 to 64 to fit the max segment size 
9166 +*  12/15/03  Mallesh         Changed vendor ID type defenition from SINT16 to UINT16
9167 +*  12/23/03  Sameer V        Added ability to turn off constellation display reporting to host using oamFeature bit field.
9168 +*  12/24/03  Sameer V        Changed comment for Constellation Display Current Address to Host Write instead of DSP Write.
9169 +*  12/26/03  Sameer/Ram      Added DEV_HOST_GHSMSG_INTERRUPT_MASK to enable host to disable response code for GHS Messages 
9170 +*  (C) Copyright Texas Instruments Inc. 2002.  All rights reserved.
9171 +*******************************************************************************/
9172 +
9173 +#include "dev_host_verdef.h"
9174 +
9175 +// ---------------------------------------------------------------------------------
9176 +// Address of the pointer to the DEV_HOST_dspOamSharedInterface_s struct of pointers
9177 +// This is where it all starts.
9178 +// ---------------------------------------------------------------------------------
9179 +#define DEV_HOST_DSP_OAM_POINTER_LOCATION 0x80000000
9180 +
9181 +// The define "MAX_NUM_UPBINS" is used in "DEV_HOST_diagAnlgInputVar_t" below.
9182 +// This value can never be changed (for host intf. backwards compatibility)
9183 +#define MAX_NUM_UPBINS 64
9184 +
9185 +// -----------------------------------------------
9186 +// Begin common enumerations between DSP and host.
9187 +// -----------------------------------------------
9188 +
9189 +// These Host-to-DSP commands are organized into two groups:
9190 +// immediate state change commands and status affecting commands.
9191 +// Do not add or remove commands except at the bottom since the DSP assumes this sequence.
9192 +
9193 +enum
9194 +{
9195 +  HOST_ACTREQ,         // Send R-ACKREQ and monitor for C-ACKx
9196 +  HOST_QUIET,          // Sit quietly doing nothing for about 60 seconds, DEFAULT STATE; R_IDLE
9197 +  HOST_XMITBITSWAP,    // Perform upstream bitswap - FOR INTERNAL USE ONLY
9198 +  HOST_RCVBITSWAP,     // Perform downstream bitswap - FOR INTERNAL USE ONLY
9199 +  HOST_RTDLPKT,        // Send a remote download packet - FOR INTERNAL USE ONLY
9200 +  HOST_CHANGELED,      // Read the LED settings and change accordingly
9201 +  HOST_IDLE,           // Sit quiet
9202 +  HOST_REVERBTEST,     // Generate REVERB for manufacturing test
9203 +  HOST_CAGCTEST,       // Set coarse receive gain for manufacturing test
9204 +  HOST_DGASP,          // send Dying Gasp messages through EOC channel
9205 +  HOST_GHSREQ,         // G.hs - FOR INTERNAL USE ONLY
9206 +  HOST_GHSMSG,         // G.hs - FOR INTERNAL USE ONLY
9207 +  HOST_GHS_SENDGALF,   // G.hs - FOR INTERNAL USE ONLY
9208 +  HOST_GHSEXIT,        // G.hs - FOR INTERNAL USE ONLY
9209 +  HOST_GHSMSG1,        // G.hs - FOR INTERNAL USE ONLY
9210 +  HOST_HYBRID,         // Enable/Disable automatic hybrid switch
9211 +  HOST_RJ11SELECT,     // RJ11 inner/outer pair select
9212 +  HOST_DIGITAL_MEM,    // Digital Diags: run external memory tests
9213 +  HOST_TXREVERB,       // AFE Diags: TX path Reverb
9214 +  HOST_TXMEDLEY,       // AFE Diags: TX path Medley
9215 +  HOST_RXNOISEPOWER,   // AFE Diags: RX noise power
9216 +  HOST_ECPOWER,        // AFE Diags: RX eco power
9217 +  HOST_ALL_ADIAG,      // AFE Diags: all major analog diagnostic modes. Host is responsible to initiate each diagnostic sessions
9218 +  HOST_USER_ADIAG,     // AFE Diags: Host fills in analog diagnostic input data structure as specified and requests DSP to perform measurements as specified
9219 +  HOST_QUIT_ADIAG,     // AFE Diags: Host requests DSP to quit current diagnostic session. This is used for stopping the transmit REVERB/MEDLEY
9220 +  HOST_NO_CMD,         // All others - G.hs - FOR INTERNAL USE ONLY
9221 +  HOST_DSLSS_SHUTDOWN, // Host initiated DSLSS shutdown message
9222 +  HOST_SET_GENERIC,    // Set generic CO profile
9223 +  HOST_UNDO_GENERIC,   // Set profile previous to Generic
9224 +  HOST_GHS_CLEARDOWN   // G.hs - FOR INTERNAL USE ONLY to start cleardown
9225 +};
9226 +
9227 +// These DSP-to-Host responses are organized into two groups:
9228 +// responses to commands and requests for OAM services.
9229 +
9230 +enum
9231 +{
9232 +  DSP_IDLE,               // R_IDLE state entered
9233 +  DSP_ACTMON,             // R_ACTMON state entered
9234 +  DSP_TRAIN,              // R_TRAIN state entered
9235 +  DSP_ACTIVE,             // R_ACTIVE state entered
9236 +  DSP_XMITBITSWAP,        // Upstream bitswap complete - FOR INTERNAL USE ONLY
9237 +  DSP_RCVBITSWAP,         // Downstream bitswap complete - FOR INTERNAL USE ONLY
9238 +  DSP_RTDL,               // R_RTDL state entered - FOR INTERNAL USE ONLY
9239 +  DSP_RRTDLPKT,           // RTDL packet received - FOR INTERNAL USE ONLY
9240 +  DSP_XRTDLPKT,           // RTDL packet transmitted - FOR INTERNAL USE ONLY
9241 +  DSP_ERROR,              // Command rejected, wrong state for this command
9242 +  DSP_REVERBTEST,         // Manufacturing REVERB test mode entered
9243 +  DSP_CAGCTEST,           // Manufacturing receive gain test done
9244 +  DSP_OVERLAY_START,      // Notify host that page overlay has started - overlay number indicated by "tag"
9245 +  DSP_OVERLAY_END,        // Notify host that page overlay has ended   - overlay number indicated by "tag"
9246 +  DSP_CRATES1,            // CRATES1 message is valid and should be copied to host memory now
9247 +  DSP_SNR,                // SNR calculations are ready and should be copied to host memory now
9248 +  DSP_GHSMSG,             // G.hs - FOR INTERNAL USE ONLY
9249 +  DSP_RCVBITSWAP_TIMEOUT, // Acknowledge Message was not received within ~500 msec (26 Superframes).
9250 +  DSP_ATM_TC_SYNC,        // Indicates true TC sync on both the upstream and downstream. Phy layer ready for data xfer.
9251 +  DSP_ATM_NO_TC_SYNC,     // Indicates loss of sync on phy layer on either US or DS.
9252 +  DSP_HYBRID,             // DSP completed hybrid switch
9253 +  DSP_RJ11SELECT,         // DSP completed RJ11 inner/outer pair select
9254 +  DSP_INVALID_CMD,        // Manufacturing (Digital and AFE) diags: CMD received not recognized
9255 +  DSP_TEST_PASSED,        // Manufacturing diags: test passed
9256 +  DSP_TEST_FAILED,        // Manufacturing diags: test failed
9257 +  DSP_TXREVERB,           // Manufacturing AFE diags: Response to HOST_TXREVERB
9258 +  DSP_TXMEDLEY,           // Manufacturing AFE diags: Response to HOST_TXMEDLEY
9259 +  DSP_RXNOISEPOWER,       // Manufacturing AFE diags: Response to HOST_RXNOISEPOWER
9260 +  DSP_ECPOWER,            // Manufacturing AFE diags: Response to HOST_ECPOWER
9261 +  DSP_ALL_ADIAG,          // Manufacturing AFE diags: Response to HOST_ALL_ADIAG
9262 +  DSP_USER_ADIAG,         // Manufacturing AFE diags: Response to HOST_USER_ADIAG
9263 +  DSP_QUIT_ADIAG,         // Manufacturing AFE diags: Response to HOST_QUIT_ADIAG
9264 +  DSP_DGASP,              // DSP Message to indicate dying gasp
9265 +  DSP_EOC,                // DSP Message to indicate that DSP sent an EOC message to CO
9266 +  DSP_TRAINING_MSGS       // DSP Message to indicate that host has to copy the training message specified in the tag field.
9267 +};
9268 +
9269 +// Define different ADSL training modes.
9270 +//Defintions as per new host interface.
9271 +#define NO_MODE             0
9272 +#define GDMT_MODE           2
9273 +#define GLITE_MODE          4
9274 +#define ADSL2_MODE          8
9275 +#define ADSL2_DELT          (ADSL2_MODE+1)
9276 +#define ADSL2PLUS_MODE      16
9277 +#define ADSL2PLUS_DELT      (ADSL2PLUS_MODE+1)
9278 +#define READSL2_MODE        32
9279 +#define READSL2_DELT        (READSL2_MODE+1)
9280 +#define T1413_MODE          128
9281 +#define MULTI_MODE          255 // all possible bits are set in the bit field
9282 +
9283 +// Define the reason for dropping the connection
9284 +
9285 +enum
9286 +{
9287 +  REASON_LOS         = 0x01,
9288 +  REASON_DYING_GASP  = 0x02,
9289 +  REASON_USCRCERR    = 0x04,
9290 +  REASON_MARGIN_DROP = 0x08
9291 +};
9292 +
9293 +
9294 +// ----------------------------------------------------
9295 +// Begin modem state bit field definitions - DSP write.
9296 +// ----------------------------------------------------
9297 +
9298 +// BitField1 for initial states and G.hs states.
9299 +// If more values need to be added, they will be added at the end (up to 32 total entries).  However, if this causes
9300 +// the state transitions to tick off out of normal bit order, then the C code will have to be re-written
9301 +// that causes the proper values to be entered into the modem state bit fields.
9302 +typedef enum
9303 +{
9304 +  ZERO_STATE1 = 0,
9305 +  RTEST       = 0x1,
9306 +  RIDLE       = 0x2,
9307 +  RINIT       = 0x4,
9308 +  RRESET      = 0x8,
9309 +  GNSFLR      = 0x10,
9310 +  GTONE       = 0x20,
9311 +  GSILENT     = 0x40,
9312 +  GNEGO       = 0x80,
9313 +  GFAIL       = 0x100,
9314 +  GACKX       = 0x200,
9315 +  GQUIET2     = 0x400
9316 +} DEV_HOST_stateBitField1_t; // this enum should only have 32 bit entries in it.  Add another enum if you need more.
9317 +
9318 +// BitField2 for T1.413 states and for the rest of the modem states (so far)
9319 +// If more values need to be added, they will be added at the end (up to 32 total entries).  However, if this causes
9320 +// the state transitions to tick off out of normal bit order, then the C code will have to be re-written
9321 +// that causes the proper values to be entered into the modem state bit fields.
9322 +typedef enum
9323 +{
9324 +  ZERO_STATE2 = 0,
9325 +  TNSFLR      = 0x1,
9326 +  TACTREQ     = 0x2,
9327 +  TACTMON     = 0x4,
9328 +  TFAIL       = 0x8,
9329 +  TACKX       = 0x10,
9330 +  TQUIET2     = 0x20,
9331 +  RQUIET2     = 0x40,
9332 +  RREVERB1    = 0x80,
9333 +  RQUIET3     = 0x100,
9334 +  RECT        = 0x200,
9335 +  RREVERB2    = 0x400,
9336 +  RSEGUE1     = 0x800,
9337 +  RREVERB3    = 0x1000,
9338 +  RSEGUE2     = 0x2000,
9339 +  RRATES1     = 0x4000,
9340 +  RMSGS1      = 0x8000,
9341 +  RMEDLEY     = 0x10000,
9342 +  RREVERB4    = 0x20000,
9343 +  RSEGUE3     = 0x40000,
9344 +  RMSGSRA     = 0x80000,
9345 +  RRATESRA    = 0x100000,
9346 +  RREVERBRA   = 0x200000,
9347 +  RSEGUERA    = 0x400000,
9348 +  RMSGS2      = 0x800000,
9349 +  RRATES2     = 0x1000000,
9350 +  RREVERB5    = 0x2000000,
9351 +  RSEGUE4     = 0x4000000,
9352 +  RBNG        = 0x8000000,
9353 +  RREVERB6    = 0x10000000,
9354 +  RSHOWTIME   = 0x20000000
9355 +} DEV_HOST_stateBitField2_t;  // this enum should only have 32 bit entries in it.  Add another enum if you need more.
9356 +
9357 +// BitField3 for ADSL2 states
9358 +// If more values need to be added, they will be added at the end (up to 32 total entries).  However, if this causes
9359 +// the state transitions to tick off out of normal bit order, then the C code will have to be re-written
9360 +// that causes the proper values to be entered into the modem state bit fields.
9361 +typedef enum
9362 +{
9363 +  ZERO_STATE3 = 0,
9364 +  G2QUIET1    = 0x1,
9365 +  G2COMB1     = 0x2,
9366 +  G2QUIET2    = 0x4,
9367 +  G2COMB2     = 0x8,
9368 +  G2ICOMB1    = 0x10,
9369 +  G2LINEPROBE = 0x20,
9370 +  G2QUIET3    = 0x40,
9371 +  G2COMB3     = 0x80,
9372 +  G2ICOMB2    = 0x100,
9373 +  G2RMSGFMT   = 0x200,
9374 +  G2RMSGPCB   = 0x400,
9375 +  G2REVERB1   = 0x800,
9376 +  G2QUIET4    = 0x1000,
9377 +  G2REVERB2   = 0x2000,
9378 +  G2QUIET5    = 0x4000,
9379 +  G2REVERB3   = 0x8000,
9380 +  G2ECT       = 0x10000,
9381 +  G2REVERB4   = 0x20000,
9382 +  G2SEGUE1    = 0x40000,
9383 +  G2REVERB5   = 0x80000,
9384 +  G2SEGUE2    = 0x100000,
9385 +  G2RMSG1     = 0x200000,
9386 +  G2MEDLEY    = 0x400000,
9387 +  G2EXCHANGE  = 0x800000,
9388 +  G2RMSG2     = 0x1000000,
9389 +  G2REVERB6   = 0x2000000,
9390 +  G2SEGUE3    = 0x4000000,
9391 +  G2RPARAMS   = 0x8000000,
9392 +  G2REVERB7   = 0x10000000,
9393 +  G2SEGUE4    = 0x20000000
9394 +} DEV_HOST_stateBitField3_t;  // this enum should only have 32 bit entries in it.  Add another enum if you need more.
9395 +
9396 +// BitField4 for ADSL2 diag. states
9397 +// If more values need to be added, they will be added at the end (up to 32 total entries).  However, if this causes
9398 +// the state transitions to tick off out of normal bit order, then the C code will have to be re-written
9399 +// that causes the proper values to be entered into the modem state bit fields.
9400 +typedef enum
9401 +{
9402 +  ZERO_STATE4 = 0,
9403 +  GDSEGUE1    = 0x1,
9404 +  GDREVERB5   = 0x2,
9405 +  GDSEGUE2    = 0x4,
9406 +  GDEXCHANGE  = 0x8,
9407 +  GDSEGUELD   = 0x10,
9408 +  GDRMSGLD    = 0x20,
9409 +  GDQUIET1LD  = 0x40,
9410 +  GDQUIET2LD  = 0x80,
9411 +  GDRACK1     = 0x100,
9412 +  GDRNACK1    = 0x200,
9413 +  GDQUIETLAST = 0x400
9414 +} DEV_HOST_stateBitField4_t;  // this enum should only have 32 bit entries in it.  Add another enum if you need more.
9415 +
9416 +// This struct collects all of the bitfield types listed above for the modem state bit field(s)
9417 +typedef struct
9418 +{
9419 +  DEV_HOST_stateBitField1_t bitField1; // this is the first modem state bit field (mostly init. and G.hs)
9420 +  DEV_HOST_stateBitField2_t bitField2; // this is the second modem state bit field (T1.413 and G.dmt)
9421 +  DEV_HOST_stateBitField3_t bitField3; // this is the third modem state bit field (ADSL2)
9422 +  DEV_HOST_stateBitField4_t bitField4; // this is the fourth modem state bit field (ADSL2 diag.)
9423 +} DEV_HOST_modemStateBitField_t;
9424 +
9425 +
9426 +// -----------------------------------------------
9427 +// Begin NegoPara message definitions - DSP write.
9428 +// -----------------------------------------------
9429 +
9430 +typedef struct
9431 +{
9432 +  UINT8  trainMode;          // Train mode selected.  See training modes defined above.
9433 +  UINT8  bDummy1;            // dummy byte for explicit 32-bit alignment
9434 +  UINT16 lineLength;         // Contains loop length estimate.  Accuracy w/i 500 ft.  LSbit = 1 for straight loop, = 0 for bridge tap
9435 +  UINT32 atucVendorId;       // Pass the vendor id of the CO to the host
9436 +  UINT8  cMsgs1[8];          // CMsgs1 and CMSGPCB
9437 +  UINT16 adsl2DSRate;        //
9438 +  UINT8  cRates2;            //
9439 +  UINT8  rRates2;            //
9440 +  UINT8  rRates1[4][11];     //
9441 +  UINT8  cMsgs2[4];          //
9442 +  UINT8  cRates1[4][30];     //
9443 +  UINT8  rMsgs2[4];          //
9444 +  UINT16 adsl2USRate;        //
9445 +  UINT8  atucGhsRevisionNum; // Pass the G.hs Revision number of the CO to the host
9446 +  UINT8  reserved1;          //
9447 +  PUINT8 *adsl2DeltMsgs_p;   // This pointer to a pointer passes the address of the globalvar.pString, which is also
9448 +                             // a pointer list of pointers. It will be used to pass all the new ADSL2 DELT messages to
9449 +                             // host side. This is for ACT.
9450 +} DEV_HOST_dspWrNegoParaDef_t;
9451 +
9452 +
9453 +// ----------------------------------------------------
9454 +// Begin OAM NegoPara message definitions - Host write.
9455 +// ----------------------------------------------------
9456 +
9457 +// OAM Feature bit fields.
9458 +//
9459 +// Bit    0 - Enable auto retrain of modem
9460 +// Bit    1 - Detect and report TC sync to host
9461 +// Bit 2-31 - Reserved
9462 +
9463 +#define DEV_HOST_AUTORETRAIN_ON       0x00000001
9464 +#define DEV_HOST_TC_SYNC_DETECT_ON    0x00000002
9465 +
9466 +#define DEV_HOST_AUTORETRAIN_MASK       0x00000001
9467 +#define DEV_HOST_TC_SYNC_DETECT_MASK    0x00000002
9468 +#define DEV_HOST_EOCAOC_INTERRUPT_MASK  0x00000004
9469 +#define DEV_HOST_CONS_DISP_DISABLE_MASK 0x00000008
9470 +#define DEV_HOST_GHSMSG_INTERRUPT_MASK  0x00000010
9471 +
9472 +typedef struct
9473 +{
9474 +  UINT8   stdMode;              // Desired train mode.  See training modes defined above.
9475 +  UINT8   ghsSequence;          // Selected G.hs session as shown in Appendix 1
9476 +  UINT8   usPilotFlag;          // Value of 1 indicates transmit an upstream pilot on bin 16
9477 +  UINT8   bDummy1;              // dummy byte for 32-bit alignment
9478 +  UINT8   rMsgs1[38];           // RMSG-1(6) and RMSG_PCB (38)
9479 +  UINT8   bDummy2[2];           // dummy bytes for 32-bit alignment
9480 +  UINT32  oamFeature;           // 32 bit wide bit field to set OAM-specific features.
9481 +  SINT8   marginThreshold;      // Threshold for margin reporting
9482 +  UINT8   hostFixAgc;           // flag to force datapump to bypass AGC training and use the following values
9483 +  UINT8   hostFixEqualizer;     // forced analog equalizer value used during AGC training when hostfix_agc is on
9484 +  UINT8   hostFixPga1;          // forced pga1 value used during AGC training when hostFixAgc is on
9485 +  UINT8   hostFixPga2;          // forced pga2 value used during AGC training when hostFixAgc is on
9486 +  UINT8   hostFixPga3;          // forced pga3 value used during AGC training when hostFixAgc is on
9487 +  UINT8   marginMonitorShwtme;  // margin monitoring flag (during showtime)
9488 +  UINT8   marginMonitorTrning;  // margin monitoring flag (during training)
9489 +  UINT8   disableLosAlarm;      // flag to disable training based on los
9490 +  UINT8   usCrcRetrain;         // flag to disable retrain due to excessive USCRC
9491 +  UINT8   t1413VendorId[2];     // Vendor ID used for T1.413 trainings
9492 +  UINT8   gdmtVendorId[8];      // Vendor ID used for G.dmt trainings (ITU VendorID)
9493 +  UINT8   missingTones[64];     // 64 element array to define missing tones for TX_MEDLEY and TX REVERB tests
9494 +  UINT32  missingToneDsAddr;    // Address given to DSP for tones to be switched off in DS direction
9495 +  UINT8   dsToneTurnoff_f;      // This flag controls the DS tone turn off logic
9496 +  UINT8   reserved1;            // Dummy bytes
9497 +  UINT8   reserved2;            // Dummy bytes
9498 +  UINT8   reserved3;            // Dummy bytes
9499 +} DEV_HOST_oamWrNegoParaDef_t;
9500 +
9501 +
9502 +// ----------------------------------------
9503 +// Begin Rate-adaptive message definitions.
9504 +// ----------------------------------------
9505 +
9506 +// The four values below can never be changed (for host intf. backwards compatibility)
9507 +#define DEV_HOST_RMSGSRA_LENGTH  10
9508 +#define DEV_HOST_RRATESRA_LENGTH 1
9509 +#define DEV_HOST_CRATESRA_LENGTH 120
9510 +#define DEV_HOST_CMSGSRA_LENGTH  6
9511 +
9512 +typedef struct
9513 +{
9514 +  UINT8 rRatesRaString[DEV_HOST_RRATESRA_LENGTH+3];
9515 +  UINT8 rMsgsRaString[DEV_HOST_RMSGSRA_LENGTH+2];
9516 +  UINT8 cMsgsRaString[DEV_HOST_CMSGSRA_LENGTH+2];
9517 +} DEV_HOST_raMsgsDef_t;
9518 +
9519 +
9520 +// ----------------------------------------------
9521 +// Begin superframe cnts definitions - DSP write.
9522 +// ----------------------------------------------
9523 +
9524 +#define DEV_HOST_FRAMES_PER_SUPER   68
9525 +#define DEV_HOST_SUPERFRAMECNTDSTRM 0
9526 +#define DEV_HOST_SUPERFRAMECNTUSTRM 4
9527 +
9528 +// Although only the least significant 8 bits should be used as an
9529 +// unsigned char for computing the bitswap superframe number, a
9530 +// full 32 bit counter is provided here in order to have an
9531 +// accurate indicator of the length of time that the modem has
9532 +// been connected.  This counter will overflow after 2.35 years
9533 +// of connect time.
9534 +
9535 +typedef struct
9536 +{
9537 +  UINT32 wSuperFrameCntDstrm;
9538 +  UINT32 wSuperFrameCntUstrm;
9539 +} DEV_HOST_dspWrSuperFrameCntDef_t;
9540 +
9541 +
9542 +// --------------------------------
9543 +// Begin ATUR/ATUC msg definitions.
9544 +// --------------------------------
9545 +
9546 +// Grouping used by the DSP to simplify parameter passing.
9547 +// All of these are written by the DSP.
9548 +
9549 +typedef struct
9550 +{
9551 +  UINT16 vendorId;          // TI's vendor ID = 0x0004; Amati's vendor ID = 0x0006
9552 +  UINT8  versionNum;        // T1.413 issue number
9553 +  UINT8  rateAdapt;         // 0 = fix rate (Default); 1= adaptive rate
9554 +  UINT8  trellis;           // 0 = disable trellis(default); 1 = enable trellis
9555 +  UINT8  echoCancelling;    // 0 = disable echo cancelling; 1 = enable echo cancelling(default)
9556 +  UINT8  maxBits;           // value range: 0-15; default = 15
9557 +  UINT8  maxPsd;            //
9558 +  UINT8  actualPsd;         //
9559 +  UINT8  maxIntlvDepth;     // 0, 1, 2, or 3 for 64, 128, 256, or 512 max depth
9560 +  UINT8  framingMode;       // 0 for asynchronous, 1 for synchronous full overhead
9561 +                            // 2 for reduced overhead, 3 for merged reduced overhead DSP write.
9562 +  UINT8  maxFrameMode;      // maximum framing mode desired.  Nor 0 or 3.
9563 +  SINT16 targetMargin;      //
9564 +  SINT16 maxAllowedMargin;  //
9565 +  SINT16 minRequiredMargin; //
9566 +  SINT16 maxTotBits;        //
9567 +  UINT8  grossGain;         //
9568 +  UINT8  ntr;               // Enable/disable NTR support
9569 +  SINT16 loopAttn;          // Loop Attenuation
9570 +  UINT8  vendorRevisionNumber;  // Reported Vendor Revision Number
9571 +  UINT8  reserved1;         // for 32-bit alignment
9572 +  UINT8  reserved2;         // for 32-bit alignment
9573 +  UINT8  reserved3;         // for 32-bit alignment
9574 +} DEV_HOST_msg_t;
9575 +
9576 +
9577 +// --------------------------------------
9578 +// Begin bits and gains table definitions
9579 +// --------------------------------------
9580 +
9581 +typedef struct
9582 +{
9583 +  PUINT8  aturBng_p;            // pointer to ATU-R bits and gains table
9584 +  PUINT8  atucBng_p;            // pointer to ATU-C bits and gains table
9585 +  PUINT8  bitAllocTblDstrm_p;   // pointer to Downstream Bit Allocation table
9586 +  PUINT8  bitAllocTblUstrm_p;   // pointer to Upstream Bit Allocation table
9587 +  PSINT8  marginTblDstrm_p;     // pointer to Downstream Margin table
9588 +} DEV_HOST_dspWrSharedTables_t;
9589 +
9590 +
9591 +// ----------------------------------------
9592 +// Begin datapump code overlay definitions.
9593 +// ----------------------------------------
9594 +
9595 +#define DEV_HOST_PAGE_NUM 4   // number of overlay pages
9596 +
9597 +// Never access a struct of this typedef directly.  Always go through the DEV_HOST_olayDpDef_t struct
9598 +typedef struct
9599 +{
9600 +  UINT32 overlayHostAddr;     // source address in host memory
9601 +  UINT32 overlayXferCount;    // number of 32bit words to be transfered
9602 +  UINT32 overlayDspAddr;      // destination address in DSP's PMEM
9603 +} DEV_HOST_olayDpPageDef_t;
9604 +
9605 +
9606 +typedef struct
9607 +{
9608 +  UINT32 overlayStatus;                      // Status of current overlay to DSP PMEM
9609 +  UINT32 overlayNumber;                      // DSP PMEM overlay page number
9610 +  UINT32 overlayState;                       // Indicates whether current state is an overlay state
9611 +  DEV_HOST_olayDpPageDef_t *olayDpPage_p[DEV_HOST_PAGE_NUM]; // Def's for the Pages
9612 +} DEV_HOST_olayDpDef_t;
9613 +
9614 +
9615 +// -------------------------
9616 +// Begin ATM-TC definitions.
9617 +// -------------------------
9618 +
9619 +// TC cell states.
9620 +typedef enum
9621 +{
9622 +  TC_HUNT,
9623 +  TC_PRESYNC,
9624 +  TC_SYNC
9625 +} DEV_HOST_cellDelinState_t;
9626 +
9627 +
9628 +// --------------------------------------------
9629 +// Begin datapump error/statistics definitions.
9630 +// --------------------------------------------
9631 +
9632 +// Never access a struct of this typedef directly.  Always go through the DEV_HOST_modemStatsDef_t struct.
9633 +typedef struct
9634 +{
9635 +  UINT32 crcErrors;   // Num of CRC errored ADSL frames
9636 +  UINT32 fecErrors;   // Num of FEC errored (corrected) ADSL frames
9637 +  UINT32 ocdErrors;   // Out of Cell Delineation
9638 +  UINT32 ncdError;    // No Cell Delineation
9639 +  UINT32 lcdErrors;   // Loss of Cell Delineation (within the same connection)
9640 +  UINT32 hecErrors;   // Num of HEC errored ADSL frames
9641 +} DEV_HOST_errorStats_t;
9642 +
9643 +
9644 +typedef struct
9645 +{
9646 +  DEV_HOST_errorStats_t *usErrorStatsIntlv_p; // us error stats - interleave path
9647 +  DEV_HOST_errorStats_t *dsErrorStatsIntlv_p; // ds error stats - interleave path
9648 +  DEV_HOST_errorStats_t *usErrorStatsFast_p;  // us error stats - fast path
9649 +  DEV_HOST_errorStats_t *dsErrorStatsFast_p;  // ds error stats - fast path
9650 +  UINT32                losErrors;   // Num of ADSL frames where loss-of-signal
9651 +  UINT32                sefErrors;   // Num of severly errored ADSL frames - LOS > MAXBADSYNC ADSL frames
9652 +  UINT32                farEndLosErrors; // Number of reported LOS defects by the CO.
9653 +  UINT32                farEndRdiErrors; // Number of reported RDI defects by the CO.
9654 +} DEV_HOST_modemStatsDef_t;
9655 +
9656 +// Never access a struct of this typedef directly.  Always go through the DEV_HOST_atmStats_t struct.
9657 +typedef struct
9658 +{
9659 +  UINT32 goodCount;   // Upstream Good Cell Count
9660 +  UINT32 idleCount;   // Upstream Idle Cell Count
9661 +} DEV_HOST_usAtmStats_t;
9662 +
9663 +// Never access a struct of this typedef directly.  Always go through the DEV_HOST_atmStats_t struct.
9664 +typedef struct
9665 +{
9666 +  UINT32 goodCount;      // Downstream Good Cell Count
9667 +  UINT32 idleCount;      // Downstream Idle Cell Count
9668 +  UINT32 badHecCount;    // Downstream Bad Hec Cell Count
9669 +  UINT32 ovflwDropCount; // Downstream Overflow Dropped Cell Count
9670 +  DEV_HOST_cellDelinState_t delineationState; // Indicates current delineation state
9671 +} DEV_HOST_dsAtmStats_t;
9672 +
9673 +
9674 +typedef struct
9675 +{
9676 +  DEV_HOST_usAtmStats_t *us0_p; // US ATM stats for TC channel 0
9677 +  DEV_HOST_dsAtmStats_t *ds0_p; // DS ATM stats for TC channel 0
9678 +  DEV_HOST_usAtmStats_t *us1_p; // US ATM stats for TC channel 1
9679 +  DEV_HOST_dsAtmStats_t *ds1_p; // DS ATM stats for TC channel 1
9680 +} DEV_HOST_atmStats_t;
9681 +
9682 +
9683 +// ----------------------
9684 +// Begin EOC definitions.
9685 +// ----------------------
9686 +
9687 +// The two values below can never change (for backwards compatibility of host intf.)
9688 +#define DEV_HOST_EOCREG4LENGTH   32
9689 +#define DEV_HOST_EOCREG5LENGTH   32
9690 +
9691 +typedef struct
9692 +{
9693 +  UINT8        eocReg4[DEV_HOST_EOCREG4LENGTH];    // Host/Dsp Write, vendor specific EOC Register 4
9694 +  UINT8        eocReg5[DEV_HOST_EOCREG5LENGTH];    // Host/Dsp Write, vendor specific EOC Register 5
9695 +  UINT8        vendorId[8];               // Host write
9696 +  UINT8        revNumber[4];              // Host, ATU-R Revision Number
9697 +  UINT8        serialNumber[32];          // Host write
9698 +  UINT8        eocReg4Length;             // Host Write, valid length for EOC register 4
9699 +  UINT8        eocReg5Length;             // Host Write, valid length for EOC register 5
9700 +  UINT8        dummy[2];                  // dummy bytes for 32-bit alignment
9701 +  UINT32       eocModemStatusReg;         // Dsp Write, status bits to host
9702 +  UINT8        lineAtten;                 // Dsp Write, line attenuation in 0.5 db step
9703 +  SINT8        dsMargin;                  // DSP Write, measured DS margin
9704 +  UINT8        aturConfig[30];            // Dsp Write, also used by EOC for ATUR Configuration
9705 +} DEV_HOST_eocVarDef_t;
9706 +
9707 +typedef struct
9708 +{
9709 +  UINT16       endEocThresh;              // Host Write, end of Clear EOC stream threshold
9710 +  UINT16       dummy;                     // dummy value to fill gap
9711 +  UINT32       dropEocCount;              // Dsp Write, counter of dropped Clear EOC bytes
9712 +  UINT16       eocRxLength;               // Host/DSP write, number of valid Rx Clear EOC bytes
9713 +  UINT16       eocTxLength;               // Host/DSP write, number of valid Tx Clear EOC bytes
9714 +  UINT8        eocRxBuf[64];              // Dsp Write, Buffer for receiving Rx Clear EOC bytes
9715 +  UINT8        eocTxBuf[64];              // Host Write, Buffer for writing Tx Clear EOC bytes
9716 +} DEV_HOST_clearEocVarDef_t;
9717 +
9718 +
9719 +// -----------------------------------
9720 +// Begin CO profile Definitions.
9721 +// -----------------------------------
9722 +
9723 +/* struct size must be a word size            */
9724 +typedef struct
9725 +{
9726 +
9727 +  SINT16 devCodecRxdf4Coeff[12] ;             // (BOTH) IIR Coefficients
9728 +  SINT16 devCodecTxdf2aCoeff[64] ;            // (BOTH) FIR filter coefficients
9729 +  SINT16 devCodecTxdf2bCoeff[64] ;            // (BOTH) FIR filter coefficients
9730 +  SINT16 devCodecTxdf1Coeff[12] ;             // (BOTH) IIR filter coefficients
9731 +  UINT16 devCodecTxDf2aDen;                   // (BOTH) denominator for IIR filter
9732 +  UINT16 devCodecTxDf2bDen;                   // (BOTH) denominator for IIR filter
9733 +  SINT16 ctrlMsmSpecGain[32];                 // (BOTH)
9734 +
9735 +  SINT16 phyBitaRateNegIntNoTrellis ;         // (BOTH) value to set
9736 +  SINT16 phyBitaRateNegIntTrellis ;           // (BOTH) value to set
9737 +  SINT16 phyBitaRateNegFastNoTrellis ;        // (BOTH) value to set
9738 +  SINT16 phyBitaRateNegFastTrellis ;          // (BOTH) value to set
9739 +  SINT16 phyBitaRsFlag ;                      // (BOTH)
9740 +  SINT16 phyBitaFirstSubChannel ;             // (BOTH)
9741 +  SINT16 phyBitaMaxFineGainBump;              // max fine gain bump
9742 +  SINT16 phyBitaFineGainReduction;            // fine gain reduction
9743 +  SINT16 phyBitaMaxDownstreamPowerCutback;    // max downstream power cutback
9744 +
9745 +  SINT16 phySigTxGainReductionAt0kft;         // upstream power reduction at 0 kft.
9746 +
9747 +  SINT16 phyAgcPgaTarget ;                    // (BOTH) compare value
9748 +
9749 +  UINT16 imsg413TxRate ;                      // (BOTH) Tx rate
9750 +  SINT16 imsg413RsBytesAdjust ;               // (BOTH) subtract value
9751 +  UINT16 imsg413PstringMask ;                 // (POTS) Or'ed into pString[RMSGS1_INDEX][1]
9752 +  SINT16 imsg413UsPilot ;                     // (BOTH)??
9753 +  UINT16 imsg413SkipPhaseOp ;                 // (POTS)
9754 +
9755 +  UINT16 ctrlMsmSensitivity1 ;                // (BOTH) value to set
9756 +  UINT16 ctrlMsmTxPsdShape_f;                 // (BOTH) upstream spectral shaping flag
9757 +
9758 +  UINT16 ovhdAocUsBswapReq_f ;                // (BOTH)value to set
9759 +  UINT16 ovhdAocScanMse_f  ;                  // (BOTH)value to set
9760 +
9761 +  SINT16 phyRevFullFirstBin ;                 //
9762 +  SINT16 phyRevFullLastBin ;                  //
9763 +  SINT16 phyRevFirstBin ;                     //
9764 +  SINT16 phyRevLastBin ;                      //
9765 +  SINT16 phyMedFirstBin ;                     //
9766 +  SINT16 phyMedLastBin ;                      //
9767 +  SINT16 phyMedOptionalLastBin;               // Medley last bin - optional
9768 +
9769 +  SINT16 phyEcDelayAdjustment;                // Echo delay adjustment
9770 +  SINT16 bSwapThresholdUpdate;                // bSwapThresholdUpdate
9771 +  SINT16 phyBitaFastPathExcessFineGainBump;   // Used in phy_bita.c
9772 +  SINT16 phyBitaSkipGapAdjustment;            // Used in phy_bita.c
9773 +  SINT16 usPilotInT1413ModeInMedley;          // To send Upstream Pilot in medley in T1.413 mode.
9774 +
9775 +  UINT32 profileVendorId ;                    // vendor id
9776 +
9777 +} DEV_HOST_coData_t ;
9778 +
9779 +typedef struct
9780 +{
9781 +  DEV_HOST_coData_t *  hostProfileBase_p;     // base address of profile list
9782 +} DEV_HOST_profileBase_t ;
9783 +
9784 +
9785 +
9786 +// -----------------------------------
9787 +// Begin DSP/Host Mailbox Definitions.
9788 +// -----------------------------------
9789 +
9790 +// The 3 values below can never be decreased, only increased.
9791 +// If you increase one of the values, you must add more to the
9792 +//   initializers in "dev_host_interface.c".
9793 +#define DEV_HOST_HOSTQUEUE_LENGTH  8
9794 +#define DEV_HOST_DSPQUEUE_LENGTH   8
9795 +#define DEV_HOST_TEXTQUEUE_LENGTH  8
9796 +
9797 +// Never access a struct of this typedef directly.  Always go through the DEV_HOST_mailboxControl_t struct.
9798 +typedef struct
9799 +{
9800 +  UINT8 cmd;
9801 +  UINT8 tag;
9802 +  UINT8 param1;
9803 +  UINT8 param2;
9804 +} DEV_HOST_dspHostMsg_t;
9805 +
9806 +// Never access a struct of this typedef directly.  Always go through the DEV_HOST_mailboxControl_t struct.
9807 +typedef struct
9808 +{
9809 +  UINT32 msgPart1;
9810 +  UINT32 msgPart2;
9811 +} DEV_HOST_textMsg_t;
9812 +
9813 +// The structure below has been ordered so that the Host need only write to
9814 +// even byte locations to update the indices.
9815 +
9816 +// The Buffer pointers in the struct below each point to a different
9817 +//   struct array that has an array size of one of the matching Queue Length
9818 +//   values defined above (DEV_HOST_HOSTQUEUE_LENGTH, DEV_HOST_DSPQUEUE_LENGTH,
9819 +//   and DEV_HOST_TEXTQUEUE_LENGTH).
9820 +
9821 +typedef struct
9822 +{
9823 +  UINT8 hostInInx;  // Host write, DSP must never write except for init
9824 +  UINT8 bDummy0[3]; //   dummy bytes for explicit 32-bit alignment
9825 +  UINT8 hostOutInx; // DSP write, Host must never write
9826 +  UINT8 bDummy1[3]; //   dummy bytes for explicit 32-bit alignment
9827 +  UINT8 dspOutInx;  // Host write, DSP must never write except for init
9828 +  UINT8 bDummy2[3]; //   dummy bytes for explicit 32-bit alignment
9829 +  UINT8 dspInInx;   // DSP write, Host must never write
9830 +  UINT8 bDummy3[3]; //   dummy bytes for explicit 32-bit alignment
9831 +  UINT8 textInInx;  // DSP write, Host must never write
9832 +  UINT8 bDummy4[3]; //   dummy bytes for explicit 32-bit alignment
9833 +  UINT8 textOutInx; // Host write, DSP must never write except for init
9834 +  UINT8 bDummy5[3]; //   dummy bytes for explicit 32-bit alignment
9835 +  DEV_HOST_dspHostMsg_t *hostMsgBuf_p;  // pointer to Host Mailbox Buffer (Host writes the buffer)
9836 +  DEV_HOST_dspHostMsg_t *dspMsgBuf_p;   // pointer to DSP Mailbox Buffer (DSP writes the buffer)
9837 +  DEV_HOST_textMsg_t *textMsgBuf_p;     // pointer to Text Mailbox Buffer (DSP writes the buffer)
9838 +} DEV_HOST_mailboxControl_t;
9839 +
9840 +
9841 +//-----------------------------------------
9842 +// Physical layer performance parameter
9843 +//-----------------------------------------
9844 +typedef struct
9845 +{
9846 +  SINT32 hybridCost[5];             // Cost functions for hybrids (0: none, 1-4 hybrid options)
9847 +  SINT32 usAvgGain;                 // upstream average gain in 20log10 (Q8)
9848 +  SINT32 dsAvgGain;                 // downstream average gain in 20log10 (Q8)
9849 +  UINT8  disableDspHybridSelect_f;  // Allows host to disable the automatic hybrid selection by the DSP
9850 +  UINT8  hostSelectHybridNum;       // DSP will use this hybrid number only if DSP Select is disabled (values: 1-4)
9851 +  UINT8  currentHybridNumUsed;      // DSP indicates to the host the current hybrid number in use
9852 +  UINT8  reserved1;                 // reserved for future use
9853 +} DEV_HOST_phyPerf_t;
9854 +
9855 +
9856 +/***********************************************************
9857 + * The 3 structures below are used only for analog
9858 + * diagnostic functions originally defined in diag.h
9859 + * Moved here by Carlos A. Perez under J. Bergsagel request
9860 + ***********************************************************/
9861 +
9862 +/****************************************************************************/
9863 +/* Options for the Analog Diagnostic user input data structure              */
9864 +/* (MUST be word aligned)                                                   */
9865 +/****************************************************************************/
9866 +typedef enum
9867 +{
9868 +  ZERO_DIAG_OPT   = 0,       // dummy value for zero place-holder
9869 +  NOISE_ONLY      = 0x1,     // diagnostic in noise only mode (on=1, off=0), disregard diagMode 0-4
9870 +  EXTERNAL_CO     = 0x2,     // operates against external CO (external=1, internal=0)
9871 +  DIAG_AGC        = 0x4,     // agc selects gains control (agc=1, manual=0)
9872 +  CROSSTALK_TEQ   = 0x8,     // crosstalk selects teq (crosstalk=1, manual=0)
9873 +  LEAKY_TEQ       = 0x10,    // use leaky teq (on=1, off=0)
9874 +  AUX_AMPS        = 0x20,    // auxamps (on=1, off=0)
9875 +  BW_SELECT       = 0x40,    // change rxhpf/txlpf fc (modify=1, default=0)
9876 +  DIAG_HYB_SELECT = 0x80,    // change hybrid (modify=1, default=0)
9877 +  POWER_DOWN_CDC  = 0x100,   // power down codec (power down=1, no power down=0)
9878 +  ISDN_OP_MODE    = 0x200,   // operation mode (pots=0, isdn=1)
9879 +  BYPASS_RXAF2    = 0x400,   // Bypass except RXAF2 (on=1, off = 0)
9880 +  TX_TEST_CONT    = 0x800,   // Continuous tx test (on=1, off=0)
9881 +  TX_SCALE_MTT    = 0x1000   // Scale tx signal for Mtt test (on=1, off=0)
9882 +} DEV_HOST_diagAnlgOptionsVar_t;
9883 +
9884 +/****************************************************************************/
9885 +/* Analog Diagnostic user input data structure (MUST be word align)         */
9886 +/****************************************************************************/
9887 +
9888 +typedef struct
9889 +{
9890 +  DEV_HOST_diagAnlgOptionsVar_t   diagOption; // Other diagnostic optional settings
9891 +
9892 +  UINT8                     diagMode;     // Performance diagnostic mode
9893 +  UINT8                     txMode;       // transmit mode
9894 +  UINT8                     rxMode;       // receive mode
9895 +  UINT8                     teqSp;        // Select teq starting pt
9896 +  UINT8                     txDf1;        // see dev_codec_filters.c and
9897 +  UINT8                     txDf2a;       // dev_codec.h for filter coefficients
9898 +  UINT8                     txDf2b;
9899 +  UINT8                     rxDf4;
9900 +
9901 +  UINT16                    codingGain256Log2;  // 256*Log2(coding gain)
9902 +  UINT16                    noiseMargin256Log2; // 256*Log2(noise margin)
9903 +
9904 +  UINT16                    rxPga1;       // PGA1
9905 +  UINT16                    rxPga2;       // PGA2
9906 +  UINT16                    rxPga3;       // PGA3
9907 +  UINT16                    anlgEq;       // AEQ settings (dB/MHz)
9908 +
9909 +  SINT8                     pilotBin;     // Select  pilot subchannel
9910 +  SINT8                     txSwGain;     // manual set for bridge tap loop
9911 +  SINT8                     tdw1Len;      // TDW1 length - 0,2,4,8,16
9912 +  SINT8                     tdw2Len;      // TDW2 length - 0,2,4,8,16
9913 +
9914 +  UINT8                     teqEcMode;    // TEQ/EC mode
9915 +  UINT8                     hybrid;
9916 +  UINT8                     txAttn;       // Codec Tx attenuation
9917 +  UINT8                     txGain;       // Codec Tx gain (Sangam only)
9918 +
9919 +  SINT16                    txPda;        //Codec Tx Digital gain/attn
9920 +  UINT8                     txTone[MAX_NUM_UPBINS];  // Turning tones on/off
9921 +                                                     // Still govern by lastbin
9922 +  UINT16                   rsvd;          //for 32 bits alignment
9923 +}DEV_HOST_diagAnlgInputVar_t;
9924 +
9925 +/****************************************************************************/
9926 +/* Analog diagnostic output data structure                                  */
9927 +/****************************************************************************/
9928 +typedef struct
9929 +{
9930 +  PSINT32  rxSnr_p[2];                  // Pointer to estimated snr
9931 +  PSINT32  rxSubChannelCapacity_p[2];   // Pointer to estimated subchan capacity
9932 +  PSINT32  rxSignalPower_p[2];          // Pointer to estimated signal power
9933 +  PSINT32  rxNoisePower_p[2];           // Pointer to estimated noise power
9934 +  PSINT32  rxAvg_p;                     // Pointer to average of rcvd signal
9935 +  SINT32   chanCapacity[2] ;            // Channel total capacity
9936 +  SINT32   dataRate[2];                 // Modem data rate (SNR)
9937 +  SINT32   avgNoiseFloor;               // Average noise floor
9938 +  SINT16   snrGap256Log2;               // 256*Log2(snr gap)
9939 +  SINT16   rxPga1;                      // PGA1
9940 +  SINT16   rxPga2;                      // PGA2
9941 +  SINT16   rxPga3;                      // PGA3
9942 +  SINT16   anlgEq;                      // AEQ settings (dB/MHz)
9943 +  SINT16   rsvd;
9944 +}DEV_HOST_diagAnlgOutputVar_t;
9945 +
9946 +
9947 +// Bit field structure that allows the host to mask off interrupt sources for possible DSP-to-Host interrupts.
9948 +// Each bit represents a possible source of interrupts in the DSP code that might cause a DSP-to-Host
9949 +//   interrupt to occur.
9950 +// This mask structure is not intended to show how interrupt sources in the DSP code correspond to the actual
9951 +//   DSP-to-Host interrupts.  There could be multiple ways to cause an interrupt in the DSP code, but they all
9952 +//   eventually tie into one of the three possible DSP-to-Host interrupts.
9953 +// The host should write a "1" to an individual bit when it wants to mask possible interrupts from that source.
9954 +
9955 +// enum that represents individual bits in maskBitField1
9956 +typedef enum
9957 +{
9958 +  ZERO_MASK1      = 0,   // dummy value for zero place-holder
9959 +  DSP_MSG_BUF     = 0x1, // mask interrupts due to DSP-to-Host message mailbox updates
9960 +  STATE_BIT_FIELD = 0x2, // mask interrupts due to changes in the modem state bit fields
9961 +  DSP_HEARTBEAT   = 0x4  // mask interrupts for the DSP hearbeat
9962 +} DEV_HOST_intMask1_t; // this enum should only have 32 values in it (maximum).
9963 +
9964 +// Add more "mask bit fields" at the end of this struct if you need more mask values
9965 +typedef struct
9966 +{
9967 +  DEV_HOST_intMask1_t maskBitField1;
9968 +} DEV_HOST_hostInterruptMask_t;  // this struct should only have 32 bits in it.
9969 +
9970 +// Bit field structure that allows the host to determine the source(s) of DSP-to-Host interrupts in case
9971 +//   several of the interrupt sources get combined onto a single DSP-to-Host interrupt.
9972 +// DSP will set each bit to a "1"as an interrupt occurs.
9973 +// Host has the reponsibility to clear each bit to a "0" after it has determined the source(s) of interrupts.
9974 +// Each source bit field in this struct will use the same enum typedef that matches the corresponding mask
9975 +//   bit field in "DEV_HOST_hostInterruptMask_t"
9976 +typedef struct
9977 +{
9978 +  DEV_HOST_intMask1_t sourceBitField1;
9979 +} DEV_HOST_hostInterruptSource_t;
9980 +
9981 +
9982 +// --------------------------
9983 +// Begin bitswap definitions.
9984 +// --------------------------
9985 +
9986 +// bitSwapSCnt contains the superframe to perform bit swap
9987 +// The entries must be ordered so that the first group only contains bit change commands
9988 +// The other entries may contain power adjustment instructions and must be
9989 +// written with something.  NOP (0) is an available instruction.
9990 +typedef struct
9991 +{
9992 +  PUINT8 fineGains_p;          // pointer to bng string, needed to check fine gains for powerswap
9993 +  UINT8  bitSwapNewIndices[6]; // Bin before bitSwapBin to process
9994 +  UINT8  bitSwapCmd[6];        // Bitswap command for bitSwapBin
9995 +  UINT8  bitSwapBin[6];        // bin to modify
9996 +  UINT8  bitSwapSCnt;          // Superframe count on which to perform bitswap
9997 +  UINT8  bitSwapEnabled;       // bitSwapEnabled
9998 +} DEV_HOST_dspBitSwapDef_t;
9999 +
10000 +
10001 +// ---------------------------
10002 +// Begin ATM BERT definitions.
10003 +// ---------------------------
10004 +
10005 +// Structure used for ATM Idle Cells based bit error rate computation.
10006 +typedef struct
10007 +{
10008 +  UINT8  atmBertFlag;      // Feature enable/disable flag (Host write)
10009 +  UINT8  dummy1;
10010 +  UINT8  dummy[2];         // Dummy bytes for 32-bit alignment
10011 +  UINT32 bitCountLow;      // Low part of 64-bit BERT bit count (DSP write)
10012 +  UINT32 bitCountHigh;     // High part of 64-bit BERT bit count (DSP write)
10013 +  UINT32 bitErrorCountLow; // Low part of 64-bit BERT bit count (DSP write)
10014 +  UINT32 bitErrorCountHigh;// High part of 64-bit BERT bit count (DSP write)
10015 +} DEV_HOST_atmDsBert_t;
10016 +
10017 +
10018 +// ------------------------------------
10019 +// Misc. modem environment definitions.
10020 +// ------------------------------------
10021 +
10022 +
10023 +typedef struct
10024 +{
10025 +  SINT16 subStateIndex;        // Index that signifies datapump substate. (DSP write)
10026 +  UINT8  externalBert;         // Turn on/off external BERT interface. 0 = OFF; 1 = ON. (Host write)
10027 +  UINT8  usBertPattern;        // BERT pattern for US TX data. 0 = 2^15-1; 1 = 2^23-1. (Host write)
10028 +  UINT8  overrideDslLinkLed_f; // Overrides DSP operation of the DSL_LINK LED. (Host write)
10029 +                               //   0 = DSP is in control; 1 = Host is in control.
10030 +  UINT8  dslLinkLedState_f;    // DSL_LINK LED state when override flag has been set. (Host write)
10031 +                               //   DSL_LINK LED will be updated with this value once per frame.
10032 +                               //   LED is active-low: 0 = ON, 1 = OFF.
10033 +  UINT8  overrideDslActLed_f;  // Overrides DSP operation of the DSL_ACT LED. (Host write)
10034 +                               //   0 = DSP is in control; 1 = Host is in control.
10035 +  UINT8  dslActLedState_f;     // DSL_ACT LED state when override flag has been set. (Host write)
10036 +                               //   DSL_ACT LED will be updated with this value once per frame.
10037 +                               //   LED is active-low: 0 = ON, 1 = OFF.
10038 +  UINT8  dGaspLprIndicator_f;  // How LPR signal (GPIO[0]) is to be interpreted. (Host write)
10039 +                               //   0 = LPR is active-low; 1 = LPR is active-high.
10040 +  UINT8  overrideDspLprGasp_f; // Overrides DSP detection of LPR signal to send out DGASP. (Host write)
10041 +                               //   0 = DSP detects LPR; 1 = Host detects LPR and sends "HOST_DGASP" to DSP.
10042 +  UINT8  pcbEnabled;           // DS power cut back
10043 +  UINT8  maxAvgFineGainCtrl_f; // If maxAvgFineGainCtrl_f == 0, then the datapump controls the maximum average fine gain value.
10044 +                               // If maxAvgFineGainCtrl_f == 1, then the host controls the maximum average fine gain value.
10045 +  UINT32 reasonForDrop;        // This field will tell the host what might be the reason for a dropped connection.
10046 +  SINT16 maxAverageFineGain;   // When maxAvgFineGainCtrl_f == 1, the value in maxAverageFineGain is the maximum average fine gain level in 256log2 units.
10047 +  UINT8  reserved1;            // These are for 32-bit alignment.
10048 +  UINT8  reserved2;            // These are for 32-bit alignment.
10049 +} DEV_HOST_modemEnvPublic_t;
10050 +
10051 +
10052 +// -----------------------------
10053 +// Generic structure definition.
10054 +// -----------------------------
10055 +
10056 +typedef struct
10057 +{
10058 +  PSINT8  parameter1_p;
10059 +  PSINT16 parameter2_p;
10060 +  PSINT32 parameter3_p;
10061 +  PUINT8  parameter4_p;
10062 +  PUINT16 parameter5_p;
10063 +  PUINT32 parameter6_p;
10064 +} DEV_HOST_genericStructure_t;
10065 +
10066 +
10067 +// ------------------------------
10068 +// Begin G.hs buffer definitions.
10069 +// ------------------------------
10070 +
10071 +typedef struct
10072 +{
10073 +  UINT8 txBuf[64]; // G.hs xmt buffer
10074 +} DEV_HOST_ghsDspTxBufDef_t;
10075 +
10076 +
10077 +typedef struct
10078 +{
10079 +  UINT8 rxBuf[80]; // G.hs rcv buffer
10080 +} DEV_HOST_ghsDspRxBufDef_t;
10081 +
10082 +// -----------------------------------------
10083 +// Begin Constellation Display definitions.
10084 +// -----------------------------------------
10085 +
10086 +typedef struct
10087 +{
10088 +  UINT32  consDispStartAddr;     // Host write
10089 +  UINT32  consDispCurrentAddr;   // Host write
10090 +  UINT32  consDispBufLen;        // Constellation Buffer Length
10091 +  UINT32  consDispBin;           // Host write, DS band only
10092 +} DEV_HOST_consBufDef_t;
10093 +
10094 +typedef struct
10095 +{
10096 +  PSINT16 buffer1_p;          //DSP write
10097 +  PSINT16 buffer2_p;          //DSP write
10098 +} DEV_HOST_snrBuffer_t;
10099 +
10100 +// --------------------------------------------------------------------------------------
10101 +// Typedef to be used for the DEV_HOST_dspOamSharedInterface_s struct of pointers
10102 +//  (this is used in dev_host_interface.c).
10103 +// NOTE: This struct of pointers is NEVER to be referenced anywhere else in the DSP code.
10104 +// IMPORTANT: Only pointers to other structs go into this struct !!
10105 +// --------------------------------------------------------------------------------------
10106 +typedef struct
10107 +{
10108 +  DEV_HOST_hostIntfcVersionDef_t   *hostIntfcVersion_p;
10109 +  DEV_HOST_dspVersionDef_t         *datapumpVersion_p;
10110 +  DEV_HOST_modemStateBitField_t    *modemStateBitField_p;
10111 +  DEV_HOST_dspWrNegoParaDef_t      *dspWriteNegoParams_p;
10112 +  DEV_HOST_oamWrNegoParaDef_t      *oamWriteNegoParams_p;
10113 +  DEV_HOST_raMsgsDef_t             *raMsgs_p;
10114 +  DEV_HOST_dspWrSuperFrameCntDef_t *dspWriteSuperFrameCnt_p;
10115 +  DEV_HOST_msg_t                   *atucMsg_p;
10116 +  DEV_HOST_msg_t                   *aturMsg_p;
10117 +  DEV_HOST_dspWrSharedTables_t     *dspWrSharedTables_p;
10118 +  DEV_HOST_olayDpDef_t             *olayDpParms_p;
10119 +  DEV_HOST_eocVarDef_t             *eocVar_p;
10120 +  DEV_HOST_clearEocVarDef_t        *clearEocVar_p;
10121 +  DEV_HOST_modemStatsDef_t         *modemStats_p;
10122 +  DEV_HOST_atmStats_t              *atmStats_p;
10123 +  DEV_HOST_mailboxControl_t        *dspHostMailboxControl_p;
10124 +  DEV_HOST_phyPerf_t               *phyPerf_p;
10125 +  DEV_HOST_diagAnlgInputVar_t      *analogInputVar_p;
10126 +  DEV_HOST_diagAnlgOutputVar_t     *analogOutputVar_p;
10127 +  DEV_HOST_hostInterruptMask_t     *hostInterruptMask_p;
10128 +  DEV_HOST_profileBase_t           *profileList_p;
10129 +  DEV_HOST_hostInterruptSource_t   *hostInterruptSource_p;
10130 +  DEV_HOST_dspBitSwapDef_t         *dspBitSwapDstrm_p;
10131 +  DEV_HOST_dspBitSwapDef_t         *dspBitSwapUstrm_p;
10132 +  DEV_HOST_atmDsBert_t             *atmDsBert_p;
10133 +  DEV_HOST_modemEnvPublic_t        *modemEnvPublic_p;
10134 +  DEV_HOST_genericStructure_t      *genericStructure1_p;
10135 +  DEV_HOST_genericStructure_t      *genericStructure2_p;
10136 +  DEV_HOST_ghsDspTxBufDef_t        *ghsDspTxBuf_p;
10137 +  DEV_HOST_ghsDspRxBufDef_t        *ghsDspRxBuf_p;
10138 +  DEV_HOST_consBufDef_t            *consDispVar_p;
10139 +  DEV_HOST_snrBuffer_t             *snrBuffer_p;
10140 +} DEV_HOST_dspOamSharedInterface_t;
10141 +
10142 +
10143 +// ---------------------------------------------------------------------------------
10144 +// Typedef to be used for the pointer to the DEV_HOST_dspOamSharedInterface_s struct
10145 +//  of pointers (this is used in dev_host_interface.c).
10146 +// ---------------------------------------------------------------------------------
10147 +typedef DEV_HOST_dspOamSharedInterface_t *DEV_HOST_dspOamSharedInterfacePtr_t;
10148 +
10149 +#endif
10150 diff -urN linux.old/drivers/atm/sangam_atm/dev_host_verdef.h linux.dev/drivers/atm/sangam_atm/dev_host_verdef.h
10151 --- linux.old/drivers/atm/sangam_atm/dev_host_verdef.h  1970-01-01 01:00:00.000000000 +0100
10152 +++ linux.dev/drivers/atm/sangam_atm/dev_host_verdef.h  2005-08-23 04:46:50.091844608 +0200
10153 @@ -0,0 +1,102 @@
10154 +#ifndef __DEV_HOST_VERDEF_H__
10155 +#define __DEV_HOST_VERDEF_H__ 1
10156 +
10157 +//********************************************************************
10158 +//*
10159 +//*    DMT-BASE ADSL MODEM PROGRAM
10160 +//*    TEXAS INSTRUMENTS PROPRIETARTY INFORMATION
10161 +//*    AMATI CONFIDENTIAL PROPRIETARY
10162 +//*
10163 +//* (c) Copyright April 1999, Texas Instruments Incorporated.
10164 +//*     All Rights Reserved.
10165 +//*
10166 +//*   Property of Texas Instruments Incorporated and Amati Communications Corp.
10167 +//*
10168 +//* Restricted Rights - Use, duplication, or disclosure is subject to
10169 +//* restrictions set forth in TI's and Amati program license agreement and
10170 +//* associated documentation
10171 +//*
10172 +//*********************************************************************
10173 +//*
10174 +//* FILENAME: dev_host_verdef.h
10175 +//*
10176 +//* ABSTRACT: This file defines the version structure
10177 +//*
10178 +//* TARGET:  Non specific.
10179 +//*
10180 +//* TOOLSET:  Non specific.
10181 +//*
10182 +//* ACTIVATION:
10183 +//*
10184 +//* HISTORY:  DATE        AUTHOR   DESCRIPTION
10185 +//*           04/29/99    FLW      Created
10186 +//*           01/17/00    Barnett  Mod's in support of merging NIC
10187 +//*                                hardware rev 6/7 T1.413 codebases.
10188 +//*           01/21/00    Wagner   derfmake mods
10189 +//*           05/11/00    Barnett  hardware_rev is a 2 char string.
10190 +//*           07/24/00    Barnett  Rework as part of host interface redesign.
10191 +//*           11/29/00    Hunt     added chipset_id2
10192 +//*           03/30/01    Barnett  Prefixed all public elements with DSPDP_.
10193 +//*                                This insures uniqueness of names that might
10194 +//*                                match host names by coincidence.
10195 +//*           03/30/01    Barnett  Added DSPDP_Host_VersionDef to facilitate
10196 +//*                                representing a version id for the host i/f
10197 +//*                                separate from the firmware version id as
10198 +//*                                a courtesy to the host.
10199 +//*           07/23/01    JEB      Changed name from verdef_u.h to dpsys_verdef.h
10200 +//*           04/12/02    Barnett  Make timestamp unsigned 32-bit field.
10201 +//*                                Generalizes for all kinds of hosts.
10202 +//*           11/15/02    JEB      Changed name from dpsys_verdef.h to dev_host_verdef.h
10203 +//*                                Updated structs according to coding guidelines
10204 +//*           12/16/02    JEB      Renamed some struct elements for new usage in Ax7
10205 +//*           01/21/03    MCB      Implemented Ax7 UNIT-MODULE modular software framework.
10206 +//*           03/19/03    JEB      Added back in "bugFix" elements into each struct type.
10207 +//*                                Rearranged elements.
10208 +//*
10209 +//********************************************************************
10210 +
10211 +#include "env_def_typedefs.h"
10212 +
10213 +#define DSPDP_FLAVOR_NEWCODES 0xFF // Other values are valid old-style flavors
10214 +
10215 +// ------------------------------
10216 +// ------------------------------
10217 +// Begin DSP version definitions.
10218 +// ------------------------------
10219 +// ------------------------------
10220 +
10221 +typedef struct
10222 +{
10223 +  UINT32 timestamp;    // Number of seconds since 01/01/1970
10224 +  UINT8  major;        // Major "00".00.00.00 revision nomenclature
10225 +  UINT8  minor;        // Minor 00."00".00.00 revision nomenclature
10226 +  UINT8  bugFix;       // Bug Fix 00.00."00".00 revision nomenclature
10227 +  UINT8  buildNum;     // Build Number 00.00.00."00" revision nomenclature
10228 +  UINT8  netService;   // Network service identifier
10229 +  UINT8  chipsetGen;   // chipset generation
10230 +  UINT8  chipsetId;    // chipset identifier
10231 +  UINT8  chipsetId2;   // second byte for "RV" chipset et al.
10232 +  UINT8  hardwareRev1; // hardware revision, 1st char
10233 +  UINT8  hardwareRev2; // hardware revision, 2nd char
10234 +  UINT8  featureCode;  // feature code
10235 +  UINT8  dummy1;       // dummy byte for explicit 32-bit alignment
10236 +} DEV_HOST_dspVersionDef_t;
10237 +
10238 +// -------------------------------
10239 +// -------------------------------
10240 +// Begin host version definitions.
10241 +// -------------------------------
10242 +// -------------------------------
10243 +
10244 +typedef struct
10245 +{
10246 +  UINT8 major;        // Major "00".00.00.00 revision nomenclature
10247 +  UINT8 minor;        // Minor 00."00".00.00 revision nomenclature
10248 +  UINT8 bugFix;       // Bug Fix 00.00."00".00 revision nomenclature
10249 +  UINT8 buildNum;     // Build Number 00.00.00."00" revision nomenclature
10250 +  UINT8 netService;   // Network service identifier
10251 +  UINT8 dummy[3];     // dummy bytes for explicit 32-bit alignment
10252 +} DEV_HOST_hostIntfcVersionDef_t;
10253 +
10254 +
10255 +#endif // __DEV_HOST_VERDEF_H__
10256 diff -urN linux.old/drivers/atm/sangam_atm/dsl_hal_api.c linux.dev/drivers/atm/sangam_atm/dsl_hal_api.c
10257 --- linux.old/drivers/atm/sangam_atm/dsl_hal_api.c      1970-01-01 01:00:00.000000000 +0100
10258 +++ linux.dev/drivers/atm/sangam_atm/dsl_hal_api.c      2005-08-23 04:46:50.095844000 +0200
10259 @@ -0,0 +1,3339 @@
10260 +/*******************************************************************************
10261 +* FILE PURPOSE:     DSL Driver API functions for Sangam
10262 +*
10263 +********************************************************************************
10264 +* FILE NAME:        dsl_hal_basicapi.c
10265 +*
10266 +* DESCRIPTION:  
10267 +*       Contains basic DSL HAL APIs for Sangam
10268 +*  
10269 +*                    
10270 +* (C) Copyright 2001-02, Texas Instruments, Inc.
10271 +*    History
10272 +*    Date        Version            Notes
10273 +*    06Feb03     0.00.00            RamP   Original Version Created
10274 +*    10Mar03     0.00.01            RamP   Initial Revision for Modular Code Branch
10275 +*    19Mar03     0.00.02            RamP   Fixed DSL and DSP Version API Structures
10276 +*    20Mar03     0.00.03            RamP   Changed byteswap function names
10277 +*    21Mar03     0.00.03         RamP/ZT   Malloc for DSP f/w done in dslStartup
10278 +*    25Mar03     0.00.04            RamP   Removed statistics used only by SWTC
10279 +*                                          Created Checkpoint 3
10280 +*    26Mar03     0.00.05            RamP   Added Memory allocation for fwimage in
10281 +*                                          dslStartup function.
10282 +*    07Apr03     0.00.06            RamP   Implemented new error reporting scheme
10283 +*                                          Changed Commenting to C style only
10284 +*    09Apr03     0.00.07            RamP   Reorganized code to delete POST_SILICON
10285 +*    10Apr03     0.00.08            RamP   Removed ptidsl from loadFWImage function
10286 +*                                          moved size and fwimage initialization to
10287 +*                                          dslStartup function
10288 +*    14Apr03     0.00.09            RamP   Moved modemStateBitField processing to a
10289 +*                                          support function; deleted stateHistory
10290 +*                                          renamed the REG32 macro
10291 +*    15Apr03     0.00.10            RamP   Changed firmware allocate to shim_ 
10292 +*                                          osAllocateVMemory function
10293 +*    15Apr03     0.00.11            RamP   Changed host version number to 07.00.00.01
10294 +*    16Apr03     0.00.12            RamP   Modified return condition on dslShutdown
10295 +*    16Apr03     0.00.13            RamP   Changed host version number to 07.00.00.02
10296 +*    21Apr03     0.01.00            RamP   Cleaned up dslShutdown function
10297 +*                                          Added new function calls to allocate
10298 +*                (Alpha)                   /free overlay pages for different OS
10299 +*                                          Fixed typecasting for allocate/free fxns
10300 +*                                          Added Interrupt Acknowledge logic
10301 +*    22Apr03     0.01.01            RamP   Moved acknowledgeInterrupt into api
10302 +*                                          Added static global for intr source
10303 +*    24Apr03     0.01.02            RamP   Added processing for OVERLAY_END in
10304 +*                                          DSP message handlers, verified crc32
10305 +*                                          recovery for overlays
10306 +*    28Apr03     0.01.03            RamP   Removed global variable intrSource
10307 +*                                          Added parameter to handleInterrupt fxn
10308 +*                (Alpha Plus)              to indicate interrupt source
10309 +*                                          Changed version number to 01.00.01.00    
10310 +*                                          Fixed setTrainingMode function problem 
10311 +*    07May03     0.01.04            RamP   Removed delineation state check in 
10312 +*                                          message handling functions, added more
10313 +*                                          safety for setting lConnected in TC_SYNC
10314 +*                                          Changed version number to 01.00.01.01                                      
10315 +*    14May03     0.01.05            RamP   Added 3 Switchable Hybrid APIs
10316 +*                                          Added additional statistics us/ds TxPower,
10317 +*                                          us margin,attenuation, us/ds bitallocation
10318 +*                                          moved versioning to dsl_hal_version.h
10319 +*    14May03     0.01.06            RamP   Fixed problem with CMsgs2 parsing
10320 +*    20May03     0.01.07            RamP   Added Inner/Outer pair API support. Added
10321 +*                                          dying gasp message.
10322 +*    29May03     0.01.08         ZT/RamP   Added memory optimizations for overlay pages
10323 +*                                          and coProfiles; added functions to free,
10324 +*                                          reload overlays and profiles
10325 +*    04Jun03     0.01.09            RamP   Added tick counters, fail states reporting
10326 +*                                          Made statistics fixes for higher data rates
10327 +*                                          Added Margin per tone to statistics
10328 +*                                          Added configuration checks for trellis/FEC
10329 +*    06Jun03     0.01.10            RamP   Added LED, STM Bert, dGasp LPR Config APIs
10330 +*                                          Modified interrupt acknowledge logic 
10331 +*                                          Added current hybrid flag as statistic
10332 +*    09Jun03     0.01.11            RamP   Added function to send dying Gasp to Modem
10333 +*                                          fixed problem with reading OamNegoPara var
10334 +*                (Beta)                    fixed problem with reading current config
10335 +*                                          Added function to configure ATM Bert
10336 +*                                          fixed memory leak due to coProfiles
10337 +*                                          Added us/ds R/S FEC statistics
10338 +*                                          Added additional config capability for LED
10339 +*                                          fixed problem in free memory for CO profiles
10340 +*    18Jul03     0.01.12            RamP   Fixed problem with reading modemEnv structure
10341 +*                                          affects LED, DGaspLpr APIs   
10342 +*                                          Sending Dying Gasp from shutdown function
10343 +*    01Aug03     0.01.13            RamP   Added preferred training mode to statistics
10344 +*    13Aug03     0.01.14            MCB    Set rev id for D3/R1.1 (ADSL2).
10345 +*    21Aug03     0.01.15            RamP   Added g.hs and aoc bitswap message gathering
10346 +*                                          Added new references to bits n gains table
10347 +*                                          Decoupled modem idle/retrain from pair select 
10348 +*                                          Added line length and gross gain to statistics 
10349 +*    29Sep03     0.01.16            RamP   Replaced advcfg function calls with support
10350 +*                                          module function switches
10351 +*    01Oct03     0.01.17            RamP   Added enum translation to set training mode
10352 +*                                          & to read statistics
10353 +*    08Oct03     0.01.18            RamP   Fixed problems with usTxPower statistic in 
10354 +*                                          Annex B target, fixed problem with Trellis
10355 +*    12Oct03     0.01.19            RamP   Added API calls to gather ADSL2 Messages
10356 +*    29Oct03     0.01.20            RamP   Restored TC_SYNC detect logic
10357 +*    30Oct03     0.01.21            RamP   Removed Scaling factor for adsl2DSConRate
10358 +*                                          Setting Showtime state upon DSP_ACTIVE
10359 +*    14Nov03     0.01.22            RamP   Fixed scaling for usTxPower & dsTxPower
10360 +*    14Nov03     0.01.23            RamP   Added logic to gather CRates1/RRates1
10361 +*                                          by parsing DSP_CRATES1
10362 +*    20Nov03     0.01.24            RamP   Added generic & interface Read
10363 +*                                          and Write functions to read from 
10364 +*                                          DSP - Host Interface
10365 +*    24Nov03     0.01.25            RamP   Modified interface Read/Write functions
10366 +*                                          to seperate element offsets from pointers
10367 +*    19Dec03     0.01.26            RamP   Modified pointer accessing problems with
10368 +*                                          block read functions
10369 +*    26Dec03     0.01.27            RamP   Made ghsIndex a local variable & added 
10370 +*                                          check to avoid buffer overflow     
10371 +*    30Dec03     0.01.28            RamP   Added generic mailbox command function
10372 +*******************************************************************************/
10373 +#include "dsl_hal_register.h"
10374 +#include "dsl_hal_support.h"
10375 +#include "dsl_hal_logtable.h"
10376 +#include "dsl_hal_version.h"
10377 +
10378 +static unsigned int hybrid_selected;
10379 +static unsigned int showtimeFlag = FALSE;
10380 +
10381 +#ifdef PRE_SILICON
10382 +/*********************************************/
10383 +/*   Base Addresses                          */
10384 +/*********************************************/
10385 +#define DEV_MDMA_BASE                 0x02000500
10386 +
10387 +/*********************************************/
10388 +/*   MC DMA Control Registers in DSL         */
10389 +/*********************************************/
10390 +
10391 +#define DEV_MDMA0_SRC_ADDR         (DEV_MDMA_BASE + 0x00000000)
10392 +#define DEV_MDMA0_DST_ADDR         (DEV_MDMA_BASE + 0x00000004)
10393 +#define DEV_MDMA0_CTL_ADDR         (DEV_MDMA_BASE + 0x00000008)
10394 +#define DEV_MDMA1_SRC_ADDR         (DEV_MDMA_BASE + 0x00000040)
10395 +#define DEV_MDMA1_DST_ADDR         (DEV_MDMA_BASE + 0x00000044)
10396 +#define DEV_MDMA1_CTL_ADDR         (DEV_MDMA_BASE + 0x00000048)
10397 +#define DEV_MDMA2_SRC_ADDR         (DEV_MDMA_BASE + 0x00000080)
10398 +#define DEV_MDMA2_DST_ADDR         (DEV_MDMA_BASE + 0x00000084)
10399 +#define DEV_MDMA2_CTL_ADDR         (DEV_MDMA_BASE + 0x00000088)
10400 +#define DEV_MDMA3_SRC_ADDR         (DEV_MDMA_BASE + 0x000000C0)
10401 +#define DEV_MDMA3_DST_ADDR         (DEV_MDMA_BASE + 0x000000C4)
10402 +#define DEV_MDMA3_CTL_ADDR         (DEV_MDMA_BASE + 0x000000C8)
10403 +
10404 +#define DEV_MDMA0_SRC           (*((volatile UINT32 *) DEV_MDMA0_SRC_ADDR))
10405 +#define DEV_MDMA0_DST           (*((volatile UINT32 *) DEV_MDMA0_DST_ADDR))
10406 +#define DEV_MDMA0_CTL           (*((volatile UINT32 *) DEV_MDMA0_CTL_ADDR))
10407 +#define DEV_MDMA1_SRC           (*((volatile UINT32 *) DEV_MDMA1_SRC_ADDR))
10408 +#define DEV_MDMA1_DST           (*((volatile UINT32 *) DEV_MDMA1_DST_ADDR))
10409 +#define DEV_MDMA1_CTL           (*((volatile UINT32 *) DEV_MDMA1_CTL_ADDR))
10410 +#define DEV_MDMA2_SRC           (*((volatile UINT32 *) DEV_MDMA2_SRC_ADDR))
10411 +#define DEV_MDMA2_DST           (*((volatile UINT32 *) DEV_MDMA2_DST_ADDR))
10412 +#define DEV_MDMA2_CTL           (*((volatile UINT32 *) DEV_MDMA2_CTL_ADDR))
10413 +#define DEV_MDMA3_SRC           (*((volatile UINT32 *) DEV_MDMA3_SRC_ADDR))
10414 +#define DEV_MDMA3_DST           (*((volatile UINT32 *) DEV_MDMA3_DST_ADDR))
10415 +#define DEV_MDMA3_CTL           (*((volatile UINT32 *) DEV_MDMA3_CTL_ADDR))
10416 +
10417 +/* MDMA control bits                     */
10418 +
10419 +#define DEV_MDMA_START             0x80000000
10420 +#define DEV_MDMA_STOP              0x00000000
10421 +#define DEV_MDMA_STATUS            0x40000000
10422 +#define DEV_MDMA_DST_INC           0x00000000
10423 +#define DEV_MDMA_DST_FIX           0x02000000   
10424 +#define DEV_MDMA_SRC_INC           0x00000000
10425 +#define DEV_MDMA_SRC_FIX           0x00800000 
10426 +#define DEV_MDMA_BURST1            0x00000000
10427 +#define DEV_MDMA_BURST2            0x00100000
10428 +#define DEV_MDMA_BURST4            0x00200000 
10429 +
10430 +#define DEV_MDMA_LEN_SHF           2
10431 +#define DEV_MDMA_LEN_MASK          0x0000FFFF
10432 +
10433 +#define DMA0   0
10434 +#define DMA1   1
10435 +#define DMA2   2
10436 +#define DMA3   3
10437 +#endif
10438 +#ifdef DMA
10439 +SINT32 getDmaStatus(UINT32 mask)
10440 +{
10441 +  if(!(IFR & mask))
10442 +  {
10443 +   return DSLHAL_ERROR_NO_ERRORS;
10444 +  }
10445 +  else
10446 +  {
10447 +   ICR = mask ;
10448 +   return 1 ;
10449 +  }
10450 +}
10451 +
10452 +void programMdma(UINT32 dma, UINT32 source, UINT32 destination, UINT32 length, UINT32 wait)
10453 +{
10454 +  volatile UINT32 statusMask ;
10455 +
10456 +  switch(dma)
10457 +  {
10458 +  case DMA0:
10459 +    {
10460 +      DEV_MDMA0_SRC = source ;
10461 +      DEV_MDMA0_DST = destination ;
10462 +      DEV_MDMA0_CTL = (DEV_MDMA_START | DEV_MDMA_DST_INC | DEV_MDMA_SRC_INC |
10463 +                       DEV_MDMA_BURST1 | (length << DEV_MDMA_LEN_SHF)) ;
10464 +      statusMask = 0x00000010 ;
10465 +    }
10466 +    break ;
10467 +  case DMA1:
10468 +    {
10469 +          DEV_MDMA1_SRC = source ;
10470 +          DEV_MDMA1_DST = destination ;
10471 +          DEV_MDMA1_CTL = (DEV_MDMA_START | DEV_MDMA_DST_INC | DEV_MDMA_SRC_INC |
10472 +                           DEV_MDMA_BURST1 | (length << DEV_MDMA_LEN_SHF)) ;
10473 +          statusMask = 0x00000020 ;
10474 +        }
10475 +    break ;
10476 +  case DMA2:
10477 +    {
10478 +          DEV_MDMA2_SRC = source ;
10479 +          DEV_MDMA2_DST = destination ;
10480 +          DEV_MDMA2_CTL = (DEV_MDMA_START | DEV_MDMA_DST_INC | DEV_MDMA_SRC_INC |
10481 +                           DEV_MDMA_BURST1 | (length << DEV_MDMA_LEN_SHF)) ;
10482 +          statusMask = 0x00000040 ;
10483 +        }
10484 +    break ;
10485 +  case DMA3:
10486 +    {
10487 +          DEV_MDMA3_SRC = source ;
10488 +          DEV_MDMA3_DST = destination ;
10489 +          DEV_MDMA3_CTL = (DEV_MDMA_START | DEV_MDMA_DST_INC | DEV_MDMA_SRC_INC |
10490 +                           DEV_MDMA_BURST1 | (length << DEV_MDMA_LEN_SHF)) ;
10491 +          statusMask = 0x00000080 ;
10492 +        }
10493 +    break ;
10494 +
10495 +  }
10496 +
10497 +  if(wait)
10498 +  {
10499 +    while(!(getDmaStatus(statusMask))) ;
10500 +  }
10501 +
10502 +}
10503 +#endif
10504 +
10505 +
10506 +
10507 +/******************************************************************************************
10508 +* FUNCTION NAME:    dslhal_api_dslStartup
10509 +*
10510 +*******************************************************************************************
10511 +* DESCRIPTION: Entry point to initialize and load ax5 daughter board
10512 +*
10513 +* INPUT:   PITIDSLHW_T *ppIHw  
10514 +*
10515 +* RETURN:  0 --succeeded
10516 +*          1 --Failed
10517 +*
10518 +*****************************************************************************************/
10519 +
10520 +int dslhal_api_dslStartup(PITIDSLHW_T *ppIHw)
10521 +{
10522 +  
10523 +  ITIDSLHW_T *ptidsl;
10524 +  int  i;
10525 +  int rc;
10526 +  dprintf(4,"dslhal_api_dslStartup() NEW 1\n");
10527 +  
10528 +  ptidsl=(ITIDSLHW_T *)shim_osAllocateMemory(sizeof(ITIDSLHW_T));
10529 +  if(ptidsl==NULL)
10530 +    {
10531 +    dprintf(1, "unable to allocate memory for ptidsl\n");
10532 +    return 1;
10533 +    }
10534 +  *ppIHw=ptidsl;
10535 +  shim_osZeroMemory((char *) ptidsl, sizeof(ITIDSLHW_T));
10536 +
10537 +  /* Unreset the ADSL Subsystem  */
10538 +  rc=dslhal_support_unresetDslSubsystem();
10539 +  if(rc)
10540 +    {
10541 +    dprintf(1, "unable to reset ADSL Subsystem \n");
10542 +    shim_osFreeMemory((void *) ptidsl, sizeof(ITIDSLHW_T));
10543 +    return DSLHAL_ERROR_UNRESET_ADSLSS;
10544 +    }
10545 +  ptidsl->fwimage = shim_osAllocateVMemory(DSP_FIRMWARE_MALLOC_SIZE);
10546 +  if(!ptidsl->fwimage)
10547 +    {
10548 +      dprintf(1,"Failed to Allocate Memory for DSP firmware binary \n");
10549 +      return DSLHAL_ERROR_FIRMWARE_MALLOC;
10550 +    }
10551 +  /* read firmware file from flash   */
10552 +  rc=shim_osLoadFWImage(ptidsl->fwimage);
10553 +  if(rc<0)
10554 +    {
10555 +    dprintf(1, "unable to get fw image\n");
10556 +    shim_osFreeVMemory((void *)ptidsl->fwimage,DSP_FIRMWARE_MALLOC_SIZE);
10557 +    shim_osFreeMemory((void *) ptidsl, sizeof(ITIDSLHW_T));
10558 +    return DSLHAL_ERROR_NO_FIRMWARE_IMAGE;
10559 +    }
10560 +  else
10561 +    {
10562 +      ptidsl->imagesize = rc;
10563 +     }
10564 +  /* Compute the CRC checksum on the image and validate the image */
10565 +
10566 +  /* Validate the image in the RAM */
10567 +
10568 +  /* load fw to DSP  */
10569
10570 +  if(dslhal_support_hostDspCodeDownload(ptidsl))
10571 +    {
10572 +    dprintf(0,"dsp load error\n");
10573 +    for(i=0; i<NUM_PAGES; i++)
10574 +      {
10575 +      if(ptidsl->olayDpPage[i].PmemStartWtAddr !=NULL)
10576 +        {
10577 +        shim_osFreeDmaMemory((void *) ptidsl->olayDpPage[i].PmemStartWtAddr, 
10578 +                     ptidsl->olayDpPage[i].OverlayXferCount);
10579 +        }
10580 +      }
10581 +     if(ptidsl->coProfiles.PmemStartWtAddr != NULL)
10582 +      shim_osFreeDmaMemory((void *)ptidsl->coProfiles.PmemStartWtAddr, ptidsl->coProfiles.OverlayXferCount);
10583 +     if(ptidsl->constDisplay.PmemStartWtAddr != NULL)
10584 +      shim_osFreeDmaMemory((void *)ptidsl->constDisplay.PmemStartWtAddr, ptidsl->constDisplay.OverlayXferCount);
10585 +    shim_osFreeVMemory((void *)ptidsl->fwimage,DSP_FIRMWARE_MALLOC_SIZE);
10586 +    shim_osFreeMemory((void *) ptidsl, sizeof(ITIDSLHW_T));
10587 +    return DSLHAL_ERROR_CODE_DOWNLOAD;
10588 +    }
10589 +  
10590 +  /* set flag to indicated overlay pages are loaded */
10591 +  ptidsl->bOverlayPageLoaded = 1;
10592 +  /* set auto retrain to 1 to disble the overlay page reload */
10593 +  ptidsl->bAutoRetrain = 1;
10594 +
10595 +  /* unreset Raptor */
10596 +  /* change this to new function */ 
10597 +  /* This function should basically bring DSP out of reset bit 23  of PRCR */
10598 +  /* Function is ready but bypassed for Pre-Silicon */
10599 +   
10600 +  rc=dslhal_support_unresetDsp();
10601 +  if (rc)
10602 +    {
10603 +    dprintf(0,"unable to bring DSP out of Reset\n");
10604 +    for(i=0; i<NUM_PAGES; i++)
10605 +      {
10606 +      if(ptidsl->olayDpPage[i].PmemStartWtAddr !=NULL)
10607 +        {
10608 +        shim_osFreeDmaMemory((void *) ptidsl->olayDpPage[i].PmemStartWtAddr, 
10609 +                     ptidsl->olayDpPage[i].OverlayXferCount);
10610 +        }
10611 +      }
10612 +    if(ptidsl->coProfiles.PmemStartWtAddr != NULL)
10613 +      shim_osFreeDmaMemory((void *)ptidsl->coProfiles.PmemStartWtAddr, ptidsl->coProfiles.OverlayXferCount);
10614 +     if(ptidsl->constDisplay.PmemStartWtAddr != NULL)
10615 +      shim_osFreeDmaMemory((void *)ptidsl->constDisplay.PmemStartWtAddr, ptidsl->constDisplay.OverlayXferCount);
10616 +    shim_osFreeVMemory((void *)ptidsl->fwimage,DSP_FIRMWARE_MALLOC_SIZE);
10617 +    shim_osFreeMemory((void *) ptidsl, sizeof(ITIDSLHW_T));
10618 +    return DSLHAL_ERROR_UNRESET_DSP;
10619 +    }
10620 +  shim_osFreeVMemory((void *)ptidsl->fwimage,DSP_FIRMWARE_MALLOC_SIZE);
10621 +  dprintf(4,"dslhal_api_dslStartup() done\n");
10622 +
10623 +  /* Add the code to initialize the host interface variables */
10624 +  /* Add code to tickle the host interface */
10625 +  return DSLHAL_ERROR_NO_ERRORS;
10626 +}
10627 +
10628 +
10629 +/******************************************************************************************
10630 + * FUNCTION NAME:    dslhal_api_dslShutdown
10631 + *
10632 + *******************************************************************************************
10633 + * DESCRIPTION: routine to shutdown ax5 modem and free the resource
10634 + *
10635 + * INPUT:   tidsl_t *ptidsl  
10636 + *
10637 + * RETURN:  NULL
10638 + *          
10639 + *
10640 + *****************************************************************************************/
10641 +
10642 +int dslhal_api_dslShutdown(tidsl_t *ptidsl)
10643 +{
10644 +  int rc= DSLHAL_ERROR_NO_ERRORS;
10645 +  int i;
10646 +  
10647 +  dprintf(5, "dslhal_api_dslShutdown\n");
10648 +  rc = dslhal_support_writeHostMailbox(ptidsl, HOST_DSLSS_SHUTDOWN, 0, 0, 0);  
10649 +  if(rc)
10650 +    {
10651 +     dprintf(1, " unable to reset DSP \n");
10652 +     rc = DSLHAL_ERROR_RESET_DSP;
10653 +    }
10654 +  /* DSP need 50 ms to send out the message*/
10655 +
10656 +  shim_osClockWait(60 * 1000);
10657 +
10658 +  rc = dslhal_support_writeHostMailbox(ptidsl, HOST_DGASP, 0, 0, 0);
10659 +  
10660 +  /* free memory allocated*/
10661 +
10662 +  for(i=0; i<NUM_PAGES; i++)
10663 +    {
10664 +    if(ptidsl->olayDpPage[i].PmemStartWtAddr !=NULL)
10665 +      {
10666 +      shim_osFreeDmaMemory((void *) ptidsl->olayDpPage[i].PmemStartWtAddr, 
10667 +                   ptidsl->olayDpPage[i].OverlayXferCount);
10668 +      }
10669 +    }
10670 +  if(ptidsl->coProfiles.PmemStartWtAddr != NULL)
10671 +     shim_osFreeDmaMemory((void *)ptidsl->coProfiles.PmemStartWtAddr, ptidsl->coProfiles.OverlayXferCount);
10672 +  if(ptidsl->constDisplay.PmemStartWtAddr != NULL)
10673 +     shim_osFreeDmaMemory((void *)ptidsl->constDisplay.PmemStartWtAddr, ptidsl->constDisplay.OverlayXferCount);
10674 +  shim_osFreeMemory((void *)ptidsl, sizeof(tidsl_t));  
10675 +  rc = dslhal_support_resetDsp();
10676 +  if(rc)
10677 +    {
10678 +     dprintf(1, " unable to reset ADSL subsystem \n");
10679 +     rc = DSLHAL_ERROR_RESET_DSP;
10680 +    }
10681 +  rc = dslhal_support_resetDslSubsystem();
10682 +  if(rc)
10683 +    {
10684 +     dprintf(1, " unable to reset ADSL subsystem \n");
10685 +     rc = DSLHAL_ERROR_RESET_ADSLSS;
10686 +    }
10687 +return rc; 
10688 +}
10689 +  
10690
10691 +/******************************************************************************************
10692 +* FUNCTION NAME:    dslhal_api_getDslHalVersion
10693 +*
10694 +*******************************************************************************************
10695 +* DESCRIPTION: This routine supply DSL Driver version.
10696 +*
10697 +* INPUT:  tidsl_t * ptidsl
10698 +*         void *pVer, DSP Driver Version Pointer
10699 +*         
10700 +* RETURN:  0 --succeeded
10701 +*          1 --Failed
10702 +* Note: See verdef_u.h for version structure definition.
10703 +*****************************************************************************************/
10704 +
10705 +void dslhal_api_getDslHalVersion(void  *pVer)
10706 +{
10707 +  dslVer *pVersion;
10708 +  pVersion = (dslVer *)pVer;
10709 +  pVersion->major = (unsigned char) DSLHAL_VERSION_MAJOR;
10710 +  pVersion->minor = (unsigned char) DSLHAL_VERSION_MINOR;
10711 +  pVersion->bugfix = (unsigned char) DSLHAL_VERSION_BUGFIX;
10712 +  pVersion->buildNum = (unsigned char) DSLHAL_VERSION_BUILDNUM;
10713 +  pVersion->timeStamp = (unsigned char) DSLHAL_VERSION_TIMESTAMP;  
10714 +}
10715 +  
10716 +/********************************************************************************************
10717 + * FUNCTION NAME: dslhal_api_pollTrainingStatus()
10718 + *
10719 + *********************************************************************************************
10720 + * DESCRIPTION: code to decode modem status and to start modem training 
10721 + * Input: tidsl_t *ptidsl
10722 + * 
10723 + * Return: modem status   
10724 + *         -1    failed
10725 + *
10726 + ********************************************************************************************/
10727 +
10728 +int dslhal_api_pollTrainingStatus(tidsl_t *ptidsl)
10729 +{
10730 +  int cmd;
10731 +  int tag;
10732 +  int parm1,parm2;
10733 +  int rc;
10734 +  unsigned int failState;
10735 +  static unsigned int pollGhsIndex=0;
10736 +
10737 +  /*char *tmp;*/
10738 +  DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
10739 +#if SWTC
10740 +  DEV_HOST_tcHostCommDef_t          TCHostCommDef;
10741 +#endif
10742 +  
10743 +  dprintf(5,"dslhal_api_pollTrainingStatus\n");
10744 +  pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterface_t *) ptidsl->pmainAddr;
10745 +  rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface, 
10746 +                                     sizeof(DEV_HOST_dspOamSharedInterface_t));
10747 +  if (rc)
10748 +    {
10749 +    dprintf(1,"dslhal_support_blockRead failed\n");
10750 +    return DSLHAL_ERROR_BLOCK_READ;
10751 +    }
10752 +#if SWTC
10753 +  dspOamSharedInterface.tcHostComm_p =(DEV_HOST_tcHostCommDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.tcHostComm_p);
10754 +
10755 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.tcHostComm_p, 
10756 +                                    &TCHostCommDef, sizeof(DEV_HOST_tcHostCommDef_t));
10757 +  if (rc)
10758 +    {
10759 +    dprintf(1,"dslhal_support_blockRead failed\n");
10760 +    return DSLHAL_ERROR_BLOCK_READ;
10761 +    }
10762 +#endif
10763 +  
10764 +  rc = dslhal_support_processTrainingState(ptidsl);
10765 +  if(rc)
10766 +    {
10767 +      dprintf(0,"Error Reading Modem Training State \n");
10768 +      return DSLHAL_ERROR_MODEMSTATE;
10769 +    }
10770 +  rc = dslhal_support_processModemStateBitField(ptidsl);
10771 +  if(rc)
10772 +    {
10773 +      dprintf(0,"Error Reading Modem Training State \n");
10774 +      return DSLHAL_ERROR_MODEMSTATE;
10775 +    }
10776 +  /*
10777 +  rc = dslhal_support_readDelineationState(ptidsl);
10778 +  if(rc)
10779 +    {
10780 +      dprintf(0,"Error Reading Delineation State \n");
10781 +      return DSLHAL_ERROR_MODEMSTATE;
10782 +    }
10783 +  */
10784 +  while (dslhal_support_readDspMailbox(ptidsl,&cmd, &tag, &parm1, &parm2) == DSLHAL_ERROR_NO_ERRORS )
10785 +    {
10786 +    dprintf(4,"mailbox message: 0x%x\n", cmd);
10787 +    /*    
10788 +    for(rc=0;rc<8;rc++)
10789 +      {
10790 +        dslhal_support_readTextMailbox(ptidsl,&msg1, &msg2);
10791 +      }
10792 +    */ 
10793 +
10794 +    if (cmd == DSP_IDLE) 
10795 +      {
10796 +      dprintf(4,"DSP_IDLE\n");
10797 +      ptidsl->lConnected=0; 
10798 +      hybrid_selected=888;
10799 +      /* add code for reload overlay pages */
10800 +      if(ptidsl->bAutoRetrain == 0)
10801 +       {
10802 +         while(ptidsl->bOverlayPageLoaded == 0)
10803 +         {
10804 +           shim_osClockWait(6400);
10805 +         }
10806 +         //dslhal_support_restoreTrainingInfo(ptidsl);
10807 +         //ptidsl->bOverlayPageLoaded = 1;
10808 +       }
10809 +      /* command DSP to ACTREQ */
10810 +      if(showtimeFlag == TRUE)
10811 +        {
10812 +           dslhal_api_resetTrainFailureLog(ptidsl);
10813 +           dslhal_support_advancedIdleProcessing(ptidsl);
10814 +           showtimeFlag = FALSE;
10815 +        }
10816 +      failState = (unsigned int)parm1;
10817 +      if(failState!=0)
10818 +        {
10819 +          ptidsl->AppData.trainFailStates[ptidsl->AppData.trainFails]=failState;
10820 +          ptidsl->AppData.trainFails++;
10821 +          if(ptidsl->AppData.trainFails > 30)
10822 +             ptidsl->AppData.trainFails=0;
10823 +        }
10824 +      for(pollGhsIndex=0;pollGhsIndex<10;pollGhsIndex++)
10825 +        {
10826 +          for(rc=0;rc<62;rc++)
10827 +            ptidsl->AppData.dsl_ghsRxBuf[pollGhsIndex][rc]=0;
10828 +        }  
10829 +      pollGhsIndex=0;
10830 +      rc = dslhal_support_writeHostMailbox(ptidsl,HOST_ACTREQ, 0, 0, 0);
10831 +      if (rc)
10832 +        return DSLHAL_ERROR_MAILBOX_WRITE;
10833 +      }
10834 +
10835 +    if(cmd == DSP_ATM_TC_SYNC)
10836 +      {
10837 +      dprintf(4,"\nTC_SYNC\n");
10838 +      showtimeFlag = TRUE;
10839 +      ptidsl->lConnected=1; 
10840 +      if(ptidsl->bAutoRetrain == 0 && ptidsl->bOverlayPageLoaded == 1)
10841 +       {
10842 +         dslhal_support_clearTrainingInfo(ptidsl);
10843 +         ptidsl->bOverlayPageLoaded = 0;
10844 +        }
10845 +      }
10846 +    if(cmd == DSP_ACTIVE)
10847 +      {
10848 +      dprintf(4,"DSP_ACTIVE");
10849 +      ptidsl->lConnected=0;
10850 +      ptidsl->AppData.bState = RSTATE_SHOWTIME;
10851 +      dprintf(4,"US Connect Rate: %u \n",ptidsl->AppData.USConRate);
10852 +      dprintf(4,"DS Connect Rate: %u \n",ptidsl->AppData.DSConRate);
10853 +      }
10854 +    if(cmd == DSP_ATM_NO_TC_SYNC)
10855 +      {
10856 +      dprintf(4,"\nTC_NOSYNC\n");
10857 +      ptidsl->lConnected=0; 
10858 +      }
10859 +    if(cmd == DSP_DGASP)
10860 +      {
10861 +      dprintf(0,"\n GASP!!! \n");
10862 +      }          
10863 +    if(cmd == DSP_OVERLAY_END)
10864 +       {
10865 +         dprintf(4,"Overlay Page Done %d \n",tag);
10866 +         rc = dslhal_support_checkOverlayPage(ptidsl,tag);
10867 +         if(rc == DSLHAL_ERROR_OVERLAY_CORRUPTED)
10868 +          {
10869 +            dprintf(0,"Overlay Page: %d CORRUPTED \n",tag);
10870 +            return (0-DSLHAL_ERROR_OVERLAY_CORRUPTED);
10871 +          }
10872 +        }   
10873 +    if(cmd == DSP_HYBRID)
10874 +       {
10875 +         dprintf(2,"Hybrid Metrics Available: %d\n",tag);
10876 +         hybrid_selected = tag;
10877 +       }
10878 +    if(cmd == DSP_DGASP)
10879 +      {
10880 +      dprintf(0,"\n GASP!!! \n");
10881 +      }   
10882 +    if(cmd == DSP_XMITBITSWAP)
10883 +      {
10884 +       dslhal_support_aocBitSwapProcessing(ptidsl,0);
10885 +      }
10886 +    if(cmd == DSP_RCVBITSWAP)
10887 +      {
10888 +       dslhal_support_aocBitSwapProcessing(ptidsl,1);
10889 +      }
10890 +    if(cmd == DSP_GHSMSG)
10891 +      {
10892 +       dprintf(3,"Ghs Message Received, bytes: %d \n",tag);
10893 +       dprintf(3,"Addr: 0x%x\n",dspOamSharedInterface.ghsDspRxBuf_p);
10894 +       if(pollGhsIndex > 9)
10895 +           pollGhsIndex=0;
10896 +       rc = dslhal_support_blockRead((void *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.ghsDspRxBuf_p), &ptidsl->AppData.dsl_ghsRxBuf[pollGhsIndex++][0], tag);
10897 +      }
10898 +    if(cmd == DSP_CRATES1)
10899 +      {
10900 +       dprintf(3,"DSP C-Rates1 Data Ready \n");
10901 +       rc = dslhal_support_gatherRateMessages(ptidsl);
10902 +      }
10903 +    if(cmd == DSP_SNR)
10904 +      {
10905 +       dprintf(3,"DSP SNR Data Ready \n");
10906 +       rc = dslhal_support_gatherSnrPerBin(ptidsl,tag);
10907 +      }
10908 +    if(cmd == DSP_EOC)
10909 +      {
10910 +       dprintf(3,"DSP_EOC message \n"); 
10911 +       rc = dslhal_support_gatherEocMessages(ptidsl,tag,parm1,parm2);
10912 +      }
10913 +    
10914 +    if(cmd == DSP_TRAINING_MSGS)
10915 +      {
10916 +       dprintf(3,"DSP_TRAINING_MSGS \n"); 
10917 +       rc = dslhal_support_gatherAdsl2Messages(ptidsl,tag,parm1,parm2);
10918 +      }
10919 +    }
10920 +  dprintf(6,"dslhal_api_pollTrainingStatus done\n");
10921 +  return(ptidsl->AppData.bState);
10922 +  
10923 +}  /* end of dslhal_api_pollTrainingStatus() */
10924 +
10925 +/********************************************************************************************
10926 +* FUNCTION NAME: dslhal_api_handleTrainingInterrupt()
10927 +*
10928 +*********************************************************************************************
10929 +* DESCRIPTION: Code to handle ax5 hardware interrupts
10930 +*
10931 +* Input: tidsl_t *ptidsl
10932 +*        int *pMsg, pointer to returned hardware messages. Each byte represent a messge
10933 +*        int *pTag, pointer to returned hardware message tags. Each byte represent a tag.
10934 +* Return: 0    success  
10935 +*         1    failed
10936 +*
10937 +********************************************************************************************/
10938 +int dslhal_api_handleTrainingInterrupt(tidsl_t *ptidsl, int intrSource)
10939 +{
10940 +  int cmd;
10941 +  int tag;
10942 +  int parm1,parm2;
10943 +  unsigned int msg1;
10944 +  unsigned int msg2;
10945 +  int rc;
10946 +  unsigned int failState;
10947 +  static unsigned int interruptGhsIndex=0;
10948 +    /*char *tmp;*/
10949 +  DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
10950 +#if SWTC
10951 +  DEV_HOST_tcHostCommDef_t          TCHostCommDef;
10952 +#endif
10953 +  dprintf(6,"dslhal_api_handleTrainingInterrupt\n");
10954 +  pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterface_t *) ptidsl->pmainAddr;
10955 +  rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface, 
10956 +                                     sizeof(DEV_HOST_dspOamSharedInterface_t));
10957 +  if (rc)
10958 +    {
10959 +    dprintf(1,"dslhal_support_blockRead failed\n");
10960 +    return DSLHAL_ERROR_BLOCK_READ;
10961 +    }
10962 +#if SWTC
10963 +  dspOamSharedInterface.tcHostComm_p =(DEV_HOST_tcHostCommDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.tcHostComm_p);
10964 +
10965 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.tcHostComm_p, 
10966 +                                    &TCHostCommDef, sizeof(DEV_HOST_tcHostCommDef_t));
10967 +  if (rc)
10968 +    {
10969 +    dprintf(1,"dslhal_support_blockRead failed\n");
10970 +    return DSLHAL_ERROR_BLOCK_READ;
10971 +    }
10972 +#endif
10973 +  
10974 +  if(intrSource & MASK_BITFIELD_INTERRUPTS)
10975 +    {
10976 +      dspOamSharedInterface.modemStateBitField_p =(DEV_HOST_modemStateBitField_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.modemStateBitField_p);
10977 +      rc = dslhal_support_processTrainingState(ptidsl);
10978 +      if(rc)
10979 +       {
10980 +        dprintf(0,"Error Reading Modem Training State \n");
10981 +        return DSLHAL_ERROR_MODEMSTATE;
10982 +        }
10983 +       rc = dslhal_support_processModemStateBitField(ptidsl);
10984 +       if(rc)
10985 +       {
10986 +        dprintf(0,"Error Reading Modem Training State \n");
10987 +        return DSLHAL_ERROR_MODEMSTATE;
10988 +        }
10989 +    }
10990 +  if(intrSource & MASK_MAILBOX_INTERRUPTS)
10991 +    {
10992 +      /*
10993 +       rc = dslhal_support_readDelineationState(ptidsl); 
10994 +       if(rc)
10995 +       {
10996 +         dprintf(0,"Error Reading Delineation State \n");
10997 +         return DSLHAL_ERROR_MODEMSTATE;
10998 +        }
10999 +      */
11000 +       while (dslhal_support_readDspMailbox(ptidsl,&cmd, &tag, &parm1, &parm2) == DSLHAL_ERROR_NO_ERRORS )
11001 +       {
11002 +         dprintf(4,"mailbox message: 0x%x\n", cmd);
11003 +         /*    
11004 +         for(rc=0;rc<8;rc++)
11005 +         {
11006 +           dslhal_support_readTextMailbox(ptidsl,&msg1, &msg2);
11007 +         }
11008 +          */ 
11009 +         if (cmd == DSP_IDLE) 
11010 +         {
11011 +           dprintf(4,"DSP_IDLE\n");
11012 +           ptidsl->lConnected=0;
11013 +           hybrid_selected=888;
11014 +           if(showtimeFlag == TRUE)
11015 +           {
11016 +             dslhal_api_resetTrainFailureLog(ptidsl);
11017 +             dslhal_support_advancedIdleProcessing(ptidsl);
11018 +             showtimeFlag = FALSE;
11019 +            }
11020 +           failState = (unsigned int)parm1;
11021 +           if(failState!=0)
11022 +           {
11023 +             ptidsl->AppData.trainFailStates[ptidsl->AppData.trainFails]=failState;
11024 +             ptidsl->AppData.trainFails++;
11025 +             if(ptidsl->AppData.trainFails > 30)
11026 +               ptidsl->AppData.trainFails=0;
11027 +            }
11028 +           for(interruptGhsIndex=0;interruptGhsIndex<10;interruptGhsIndex++)
11029 +             {
11030 +               for(rc=0;rc<62;rc++)
11031 +                 ptidsl->AppData.dsl_ghsRxBuf[interruptGhsIndex][rc]=0;
11032 +             }  
11033 +           interruptGhsIndex=0;
11034 +
11035 +           /* add code for reload overlay pages */
11036 +           if(ptidsl->bAutoRetrain == 0 && ptidsl->bOverlayPageLoaded == 0)
11037 +             {
11038 +             dslhal_support_restoreTrainingInfo(ptidsl);
11039 +             ptidsl->bOverlayPageLoaded = 1;
11040 +             }
11041 +           /* command DSP to ACTREQ */
11042 +           rc = dslhal_support_writeHostMailbox(ptidsl, HOST_ACTREQ, 0, 0, 0);
11043 +           if (rc)
11044 +             return DSLHAL_ERROR_MAILBOX_WRITE;
11045 +         }
11046 +         if(cmd == DSP_ATM_TC_SYNC)
11047 +           {
11048 +           dprintf(4,"\nTC_SYNC\n");
11049 +           showtimeFlag = TRUE;
11050 +           ptidsl->lConnected=1;
11051 +           if(ptidsl->bAutoRetrain == 0 && ptidsl->bOverlayPageLoaded == 1)
11052 +             {
11053 +             dslhal_support_clearTrainingInfo(ptidsl);
11054 +             ptidsl->bOverlayPageLoaded = 0;
11055 +             }
11056 +           }
11057 +         if(cmd == DSP_ACTIVE)
11058 +           {
11059 +             ptidsl->lConnected=0;
11060 +             ptidsl->AppData.bState = RSTATE_SHOWTIME;
11061 +             dprintf(4,"DSP_ACTIVE");
11062 +             dprintf(4,"US Connect Rate: %u \n",ptidsl->AppData.USConRate);
11063 +             dprintf(4,"DS Connect Rate: %u \n",ptidsl->AppData.DSConRate);
11064 +           }
11065 +         if(cmd == DSP_ATM_NO_TC_SYNC)
11066 +           {
11067 +             dprintf(4,"\nTC_NOSYNC\n");
11068 +             ptidsl->lConnected=0;
11069 +             /* add code for reload overlay pages */
11070 +           }
11071 +         if(cmd == DSP_OVERLAY_END)
11072 +           {
11073 +             dprintf(4,"Overlay Page Done %d \n",tag);
11074 +             rc = dslhal_support_checkOverlayPage(ptidsl,tag);
11075 +             if(rc == DSLHAL_ERROR_OVERLAY_CORRUPTED)
11076 +               {
11077 +                 dprintf(4,"Overlay Page: %d CORRUPTED \n",tag);
11078 +                 return(0-DSLHAL_ERROR_OVERLAY_CORRUPTED);
11079 +               }
11080 +           }
11081 +         if(cmd == DSP_HYBRID)
11082 +           {
11083 +             dprintf(2,"Hybrid Metrics Available\n");
11084 +             hybrid_selected = tag;
11085 +           }
11086 +         if(cmd == DSP_XMITBITSWAP)
11087 +           {
11088 +            rc = dslhal_support_aocBitSwapProcessing(ptidsl,0);
11089 +           }
11090 +         if(cmd == DSP_RCVBITSWAP)
11091 +           {
11092 +            rc = dslhal_support_aocBitSwapProcessing(ptidsl,1);
11093 +           }
11094 +         if(cmd == DSP_GHSMSG)
11095 +           {
11096 +            dprintf(3,"Ghs Message Received, bytes: %d \n",tag);
11097 +            dprintf(3,"Addr: 0x%x\n",dspOamSharedInterface.ghsDspRxBuf_p);
11098 +            if(interruptGhsIndex > 9)
11099 +              interruptGhsIndex=0;
11100 +            rc = dslhal_support_blockRead((void *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.ghsDspRxBuf_p), &ptidsl->AppData.dsl_ghsRxBuf[interruptGhsIndex++][0], tag);
11101 +            }
11102 +         if(cmd == DSP_CRATES1)
11103 +          {
11104 +           dprintf(3,"DSP C-Rates1 Data Ready \n");
11105 +           rc = dslhal_support_gatherRateMessages(ptidsl);
11106 +          }
11107 +         if(cmd == DSP_SNR)
11108 +          {
11109 +           dprintf(3,"DSP SNR Data Ready \n");
11110 +           rc = dslhal_support_gatherSnrPerBin(ptidsl,tag);
11111 +          }
11112 +         if(cmd == DSP_EOC)
11113 +          {
11114 +           dprintf(3,"DSP_EOC message \n");
11115 +           rc = dslhal_support_gatherEocMessages(ptidsl,tag,parm1,parm2);
11116 +          }
11117 +         if(cmd == DSP_TRAINING_MSGS)
11118 +          {
11119 +           dprintf(3,"DSP_TRAINING_MSGS \n"); 
11120 +           rc = dslhal_support_gatherAdsl2Messages(ptidsl,tag,parm1,parm2);
11121 +          }
11122 +        }       
11123 +     
11124 +       dslhal_support_readTextMailbox(ptidsl,&msg1, &msg2);
11125 +       dprintf(5,"Text Message Part1: 0x%x \t Text Message Part2: 0x%x \n",msg1,msg2);
11126 +    }     
11127 +  dprintf(6,"dslhal_api_handleTrainingInterrupt done\n");
11128 +  return(ptidsl->AppData.bState);
11129 +} /* end of dslhal_api_handleTrainingInterrupt() */
11130 +
11131 +  
11132 +
11133 +
11134 +/******************************************************************************************    
11135 + * FUNCTION NAME:    dslhal_api_dslRetrain(tidsl_t *ptidsl)    
11136 + *    
11137 + *******************************************************************************************    
11138 + * DESCRIPTION: This fuction sends CMD_ACTREQ to the DSP to issue a retrain    
11139 + *    
11140 + * INPUT:  PITIDSLHW_T *ptidsl    
11141 + *           
11142 + * RETURN: 0 SUCCESS    
11143 + *         1 FAILED    
11144 + *      
11145 + *****************************************************************************************/    
11146 +unsigned int dslhal_api_dslRetrain(tidsl_t *ptidsl)
11147 +{
11148 +   int rc; 
11149 +   
11150 +   dprintf(5, "dslhal_cfg_dslRetrain \n"); 
11151 +   rc = dslhal_support_writeHostMailbox(ptidsl, HOST_QUIET, 0, 0, 0); 
11152 +   if(rc)
11153 +    {  
11154 +      dprintf(1,"dslhal_cfg_dslRetrain failed\n");  
11155 +      return DSLHAL_ERROR_CTRL_API_FAILURE;  
11156 +    }  
11157 +    return DSLHAL_ERROR_NO_ERRORS;
11158 +}
11159 +
11160 +/******************************************************************************************    
11161 + * FUNCTION NAME:    dslhal_api_sendQuiet(tidsl_t *ptidsl)    
11162 + *    
11163 + *******************************************************************************************    
11164 + * DESCRIPTION: This fuction sends the CMD_QUIET message to the DSP    
11165 + *    
11166 + * INPUT:  PITIDSLHW_T *ptidsl    
11167 + *           
11168 + * RETURN: 0 SUCCESS    
11169 + *         1 FAILED    
11170 + *      
11171 + *****************************************************************************************/    
11172 +unsigned int dslhal_api_sendQuiet(tidsl_t *ptidsl)
11173 +{
11174 +   int rc; 
11175 +   
11176 +   dprintf(5, "dslhal_api_sendQuiet\n"); 
11177 +   rc = dslhal_support_writeHostMailbox(ptidsl, HOST_QUIET, 0, 0, 0); 
11178 +   if(rc)
11179 +    {  
11180 +      dprintf(1,"dslhal_api_sendQuiet failed\n");  
11181 +      return DSLHAL_ERROR_CTRL_API_FAILURE;    
11182 +    }  
11183 +    return DSLHAL_ERROR_NO_ERRORS;
11184 +}
11185 +
11186 +/******************************************************************************************     
11187 + * FUNCTION NAME:    dslhal_api_sendIdle(tidsl_t *ptidsl)     
11188 + *     
11189 + *******************************************************************************************     
11190 + * DESCRIPTION: This fuction sends the CMD_IDLE message to the DSP     
11191 + *     
11192 + * INPUT:  PITIDSLHW_T *ptidsl     
11193 + *            
11194 + * RETURN: 0 SUCCESS     
11195 + *         1 FAILED     
11196 + *       
11197 + *****************************************************************************************/     
11198 +unsigned int dslhal_api_sendIdle(tidsl_t *ptidsl) 
11199 +{ 
11200 +   int rc;  
11201 +    
11202 +   dprintf(5, "dslhal_api_sendIdle\n");  
11203 +   rc = dslhal_support_writeHostMailbox(ptidsl, HOST_IDLE, 0, 0, 0);  
11204 +   if(rc) 
11205 +     {   
11206 +      dprintf(1,"dslhal_api_sendIdle failed\n");   
11207 +      return DSLHAL_ERROR_CTRL_API_FAILURE;    
11208 +     }   
11209 +    return DSLHAL_ERROR_NO_ERRORS; 
11210 +} 
11211 +
11212 +/******************************************************************************************    
11213 + * FUNCTION NAME:    dslhal_api_sendDgasp(tidsl_t *ptidsl)    
11214 + *    
11215 + *******************************************************************************************    
11216 + * DESCRIPTION: This fuction sends the HOST_DGASP message to the DSP    
11217 + *    
11218 + * INPUT:  PITIDSLHW_T *ptidsl    
11219 + *           
11220 + * RETURN: 0 SUCCESS    
11221 + *         1 FAILED    
11222 + *      
11223 + *****************************************************************************************/    
11224 +unsigned int dslhal_api_sendDgasp(tidsl_t *ptidsl)
11225 +{
11226 +   int rc; 
11227 +   
11228 +   dprintf(5, "dslhal_api_sendDgasp\n"); 
11229 +   rc = dslhal_support_writeHostMailbox(ptidsl, HOST_DGASP, 0, 0, 0); 
11230 +   if(rc)
11231 +    {  
11232 +      dprintf(1,"dslhal_api_sendDgasp failed\n");  
11233 +      return DSLHAL_ERROR_CTRL_API_FAILURE;    
11234 +    }  
11235 +    return DSLHAL_ERROR_NO_ERRORS;
11236 +}
11237 +
11238 +/******************************************************************************************
11239 +* FUNCTION NAME:    dslhal_api_setTrainingMode(tidsl_t *ptidsl,unsigned int trainmode)
11240 +*
11241 +*******************************************************************************************
11242 +* DESCRIPTION: This fuction Sets the Desired Training Mode {None/Multimode/G.dmt/lite
11243 +*
11244 +* INPUT:  PITIDSLHW_T *ptidsl
11245 +*         unsigned int trainmode :Should be between 0 and 4; 0:No Mode 1:Multimode
11246 +*                                 2: T1.413, 3:G.dmt, 4: G.lite
11247 +* RETURN: 0 SUCCESS
11248 +*         1 FAILED
11249 +*
11250 +*****************************************************************************************/
11251 +unsigned int dslhal_api_setTrainingMode(tidsl_t *ptidsl,unsigned int trainmode)
11252 +{
11253 +   DEV_HOST_oamWrNegoParaDef_t NegoPara;
11254 +   DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
11255 +   int rc;
11256 +   dprintf(5," dslhal_api_setTrainingMode()\n");
11257 +   if(trainmode>255)
11258 +     {
11259 +       dprintf(3,"Invalid Value for Desired Training Mode (must be <255)\n");
11260 +       return DSLHAL_ERROR_INVALID_PARAM;
11261 +     }
11262 +
11263 +   if(!ptidsl)
11264 +    {
11265 +      dprintf(3, "Error: PTIDSL pointer invalid\n");
11266 +      return DSLHAL_ERROR_INVALID_PARAM;
11267 +    }
11268 +
11269 +  pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
11270 +  rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface, 
11271 +                                     sizeof(DEV_HOST_dspOamSharedInterface_t));
11272 +  if (rc)
11273 +    {
11274 +    dprintf(1,"dslhal_support_blockRead failed\n");
11275 +    return DSLHAL_ERROR_BLOCK_READ;
11276 +    }
11277 +
11278 +  dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p);
11279 +
11280 +   rc = dslhal_support_blockRead((PVOID) dspOamSharedInterface.oamWriteNegoParams_p,&NegoPara, sizeof(DEV_HOST_oamWrNegoParaDef_t));
11281 +  if (rc)
11282 +    {
11283 +    dprintf(1,"dslhal_support_blockRead failed\n");
11284 +    return DSLHAL_ERROR_BLOCK_READ;
11285 +    }
11286 +  /* Enum Translation to maintain backwards compatibility for train modes */
11287 +  if(trainmode == DSLTRAIN_MULTI_MODE)
11288 +    trainmode = MULTI_MODE;
11289 +  if(trainmode == DSLTRAIN_T1413_MODE)
11290 +    trainmode = T1413_MODE;
11291 +  if(trainmode == DSLTRAIN_GDMT_MODE)
11292 +    trainmode = GDMT_MODE;
11293 +   
11294 +  NegoPara.stdMode = trainmode;
11295 +  dprintf(5,"Train Mode: 0x%x\n",trainmode); 
11296 +  rc = dslhal_support_blockWrite(&NegoPara,(PVOID)dspOamSharedInterface.oamWriteNegoParams_p, sizeof(DEV_HOST_oamWrNegoParaDef_t));
11297 +  if(rc)
11298 +    return DSLHAL_ERROR_CONFIG_API_FAILURE;
11299
11300 +  dprintf(5," dslhal_api_setTrainingMode() Done\n");
11301 +  return DSLHAL_ERROR_NO_ERRORS;
11302 +}
11303 +
11304 +/******************************************************************************************
11305 +* FUNCTION NAME:    dslhal_api_getDspVersion
11306 +*
11307 +*******************************************************************************************
11308 +* DESCRIPTION: This routine supply AX5 daugther card DSP version.
11309 +*
11310 +* INPUT:  tidsl_t * ptidsl
11311 +*         void *pVer, DSP version struct is returned starting at this pointer
11312 +*         
11313 +* RETURN:  0 --succeeded
11314 +*          1 --Failed
11315 +* Note: See verdef_u.h for version structure definition.
11316 +*****************************************************************************************/
11317 +int dslhal_api_getDspVersion(tidsl_t *ptidsl, void  *pVer)
11318 +{
11319 +  /*  DEV_HOST_dspVersionDef_t  dspVersion; */
11320 +   DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
11321 +   int rc;
11322 +   dprintf(5, "dslhal_api_getDspVersion\n");
11323 +   if(!ptidsl)
11324 +     {
11325 +       dprintf(3, "Error: PTIDSL pointer invalid\n");
11326 +       return DSLHAL_ERROR_INVALID_PARAM;
11327 +     }
11328 +   if(!pVer)
11329 +     return DSLHAL_ERROR_INVALID_PARAM;
11330 +   
11331 +   *(unsigned int *) pVer = 0;
11332
11333 +   pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
11334 +   
11335 +   rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
11336 +   if (rc)
11337 +     {
11338 +       dprintf(1,"dslhal_support_blockRead failed\n");
11339 +       return DSLHAL_ERROR_BLOCK_READ;
11340 +     }
11341 +   
11342 +   dspOamSharedInterface.datapumpVersion_p = (DEV_HOST_dspVersionDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.datapumpVersion_p);
11343 +   rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.datapumpVersion_p,
11344 +                                      pVer, sizeof(dspVer));
11345 +   if (rc)
11346 +     {
11347 +       dprintf(1,"dslhal_support_blockRead failed\n");
11348 +       return DSLHAL_ERROR_BLOCK_READ;
11349 +     }
11350 +  pVer = (DEV_HOST_dspVersionDef_t *)(dslhal_support_byteSwap32((unsigned int)pVer)); 
11351 +  return DSLHAL_ERROR_NO_ERRORS;
11352 +}
11353 +
11354 +/********************************************************************************************
11355 +* FUNCTION NAME: dslhal_api_gatherStatistics()
11356 +*
11357 +*********************************************************************************************
11358 +* DESCRIPTION: Read statistical infromation from ax5 modem daugter card. 
11359 +* Input: tidsl_t *ptidsl
11360 +* 
11361 +* Return: 0    success
11362 +*         1    failed
11363 +*
11364 +********************************************************************************************/
11365 +void dslhal_api_gatherStatistics(tidsl_t * ptidsl)
11366 +{
11367 +  int rc,optIdxU,optIdxD,i; 
11368 +  DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
11369 +  DEV_HOST_dspWrNegoParaDef_t   rateparms;
11370 +  DEV_HOST_oamWrNegoParaDef_t   configParms;
11371 +  DEV_HOST_modemStatsDef_t      StatisticsDef;
11372 +  DEV_HOST_errorStats_t usIntlvError, usFastError, dsIntlvError, dsFastError;
11373 +  DEV_HOST_atmStats_t           atmStats;
11374 +  DEV_HOST_usAtmStats_t         usAtmStats0, usAtmStats1;
11375 +  DEV_HOST_dsAtmStats_t         dsAtmStats0,dsAtmStats1;
11376 +  DEV_HOST_dspWrSuperFrameCntDef_t   SuperFrameCnt;
11377 +  DEV_HOST_msg_t                atuc_msg, aturMsg;
11378 +  DEV_HOST_eocVarDef_t          eocVar;
11379 +  DEV_HOST_dspWrSharedTables_t  sharedTables;
11380 +  DEV_HOST_phyPerf_t            phyPerf;
11381 +  unsigned char                 usBits[64],dsBits[256];
11382 +  unsigned char                 dsPowerCutBack;
11383 +  int                           usNumLoadedTones=0, dsNumLoadedTones=0;
11384 +
11385 +  dprintf(5, "dslhal_api_gatherStatistics\n");
11386 +  
11387 +  pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
11388 +  
11389 +  rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface, 
11390 +                                     sizeof(DEV_HOST_dspOamSharedInterface_t));
11391 +  if (rc)
11392 +    {
11393 +    dprintf(1,"dslhal_support_blockRead failed\n");
11394 +    return;
11395 +    }
11396 +  if(!ptidsl->bStatisticsInitialized && ptidsl->lConnected == LINE_CONNECTED)
11397 +  {
11398 +    dslhal_api_initStatistics(ptidsl);
11399 +    ptidsl->bStatisticsInitialized = TRUE;
11400 +  }
11401 +
11402 +  dspOamSharedInterface.dspWriteNegoParams_p = (DEV_HOST_dspWrNegoParaDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspWriteNegoParams_p);
11403 +
11404 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspWriteNegoParams_p, 
11405 +                               &rateparms, sizeof(DEV_HOST_dspWrNegoParaDef_t));
11406 +  
11407 +  if (rc)
11408 +    {
11409 +    dprintf(1,"dslhal_support_blockRead failed\n");
11410 +    return;
11411 +    }
11412 +  if(!rc) 
11413 +    {    
11414 +      /* trained mode */
11415 +    ptidsl->AppData.dsl_modulation = (unsigned int)rateparms.trainMode;
11416 +    if(rateparms.trainMode == T1413_MODE)
11417 +      ptidsl->AppData.dsl_modulation = DSLTRAIN_T1413_MODE;
11418 +    if(rateparms.trainMode == GDMT_MODE)
11419 +      ptidsl->AppData.dsl_modulation = DSLTRAIN_GDMT_MODE;
11420 +      /* rate */
11421 +    /*    shim_osMoveMemory((void *)ptidsl->AppData.bCRates1, (void *)rateparms.cRates1, 120); */
11422 +    ptidsl->AppData.bCRates2 = rateparms.cRates2;
11423 +    /*    shim_osMoveMemory((void *)ptidsl->AppData.bRRates1, (void *)rateparms.rRates1, 44); */
11424 +    ptidsl->AppData.bRRates2 = rateparms.rRates2;
11425 +    shim_osMoveMemory((void *)ptidsl->AppData.bCMsgs1, (void *)rateparms.cMsgs1, 6);
11426 +    shim_osMoveMemory((void *)ptidsl->AppData.bCMsgs2, (void *)rateparms.cMsgs2, 4);
11427 +    shim_osMoveMemory((void *)ptidsl->AppData.bRMsgs2, (void *)rateparms.rMsgs2, 4);
11428 +    ptidsl->AppData.atucVendorId = (unsigned int)rateparms.atucVendorId;
11429 +    ptidsl->AppData.lineLength = (unsigned int)dslhal_support_byteSwap16((unsigned short)rateparms.lineLength);
11430 +    ptidsl->AppData.atucRevisionNum = (unsigned int)rateparms.atucGhsRevisionNum;         
11431 +    ptidsl->AppData.usLineAttn = (ptidsl->AppData.bCMsgs2[3] >>2)&0x003f;
11432 +    ptidsl->AppData.usMargin = (ptidsl->AppData.bCMsgs2[2])&0x001f;
11433 +    
11434 +    if((rateparms.cRates2 & 0x0f) == 0x01) 
11435 +      optIdxU = 0;
11436 +    else if((rateparms.cRates2 & 0x0f) == 0x02)  
11437 +      optIdxU = 1;
11438 +    else if((rateparms.cRates2 & 0x0f) == 0x04) 
11439 +      optIdxU = 2;
11440 +    else if((rateparms.cRates2 & 0x0f) == 0x08)  
11441 +      optIdxU = 3;
11442 +    else 
11443 +      optIdxU = -1;
11444 +    
11445 +    dprintf(5, "optIdxU=%d\n", optIdxU);
11446 +   
11447 +    /* Obtain the US Rates using Opt# and CRates1 Table */
11448 +    /* Rate(US) = [Bf(LS0) + Bi(LS0)]*32                */
11449 +    if(ptidsl->AppData.dsl_modulation <= DSLTRAIN_GLITE_MODE)
11450 +      ptidsl->AppData.USConRate = ((rateparms.cRates1[optIdxU][CRATES1_BF_LS0] + rateparms.cRates1[optIdxU][CRATES1_BI_LS0]) * 32);
11451 +    else
11452 +      ptidsl->AppData.USConRate =  32 * dslhal_support_byteSwap16((unsigned short)rateparms.adsl2USRate);
11453 +
11454 +    ptidsl->AppData.USPeakCellRate = ptidsl->AppData.USConRate; 
11455 +    
11456 +    if(((rateparms.cRates2 >> 4) & 0x0f) == 0x01) 
11457 +      optIdxD = 0;
11458 +    else if(((rateparms.cRates2 >> 4) & 0x0f) == 0x02)  
11459 +      optIdxD = 1;
11460 +    else if(((rateparms.cRates2 >> 4) & 0x0f) == 0x04) 
11461 +      optIdxD = 2;
11462 +    else if(((rateparms.cRates2 >> 4) & 0x0f) == 0x08)  
11463 +      optIdxD = 3;
11464 +    else 
11465 +      optIdxD = -1;
11466 +    /* Obtain the DS Rates using Opt# and CRates1 Table */
11467 +    /* Rate(DS) = [Bf(AS0) + Bi(AS0)]*32                */
11468 +    if(ptidsl->AppData.dsl_modulation <= DSLTRAIN_GLITE_MODE)
11469 +      ptidsl->AppData.DSConRate =  (((rateparms.cRates1[optIdxD][CRATES1_BF_AS0]|((rateparms.cRates1[optIdxD][CRATES1_BF_DSRS]&0x80)<<1))+ (rateparms.cRates1[optIdxD][CRATES1_BI_AS0]|((rateparms.cRates1[optIdxD][CRATES1_BI_DSRS]&0x80)<<1)))* 32);
11470 +    else
11471 +      ptidsl->AppData.DSConRate = dslhal_support_byteSwap16((unsigned short)rateparms.adsl2DSRate);
11472 +
11473 +    dprintf(5, "ptidsl->AppData.wDSConRate=%d\n", ptidsl->AppData.DSConRate);
11474 +    /* Determine which Path has Modem Trained with */
11475 +    if((rateparms.cRates1[optIdxU][CRATES1_BF_LS0]) && (rateparms.cRates1[optIdxD][CRATES1_BF_AS0]))
11476 +      ptidsl->AppData.TrainedPath = FAST_PATH;
11477 +    else
11478 +      ptidsl->AppData.TrainedPath = INTERLEAVED_PATH;
11479 +
11480 +    /* Set the mode in which the modem is trained */
11481 +    ptidsl->AppData.TrainedMode = (unsigned int)rateparms.trainMode;
11482 +    if(rateparms.trainMode == T1413_MODE)
11483 +      ptidsl->AppData.TrainedMode = DSLTRAIN_T1413_MODE;
11484 +    if(rateparms.trainMode == GDMT_MODE)
11485 +      ptidsl->AppData.TrainedMode = DSLTRAIN_GDMT_MODE;
11486 +
11487 +    if(ptidsl->AppData.TrainedPath == FAST_PATH)
11488 +       ptidsl->AppData.dsFastParityBytesPerSymbol = (rateparms.cRates1[optIdxU][CRATES1_BF_DSRS]&0x1f);
11489 +    else
11490 +       ptidsl->AppData.dsIntlvParityBytesPerSymbol = (rateparms.cRates1[optIdxU][CRATES1_BI_DSRS]&0x1f);
11491 +    ptidsl->AppData.dsSymbolsPerCodeWord = (rateparms.cRates1[optIdxU][CRATES1_BFI_DSS]&0x1f);
11492 +    ptidsl->AppData.dsInterleaverDepth = ((rateparms.cRates1[optIdxU][CRATES1_BFI_DSI])|((rateparms.cRates1[optIdxU][CRATES1_BFI_DSS]&0xc0)<<2));
11493 +
11494 +    if(ptidsl->AppData.TrainedPath == FAST_PATH)
11495 +       ptidsl->AppData.usFastParityBytesPerSymbol = (rateparms.cRates1[optIdxU][CRATES1_BF_USRS]&0x1f);
11496 +    else
11497 +       ptidsl->AppData.usIntlvParityBytesPerSymbol = (rateparms.cRates1[optIdxU][CRATES1_BI_USRS]&0x1f);
11498 +    ptidsl->AppData.usSymbolsPerCodeWord = (rateparms.cRates1[optIdxU][CRATES1_BFI_USS]&0x1f);
11499 +    ptidsl->AppData.usInterleaverDepth = ((rateparms.cRates1[optIdxU][CRATES1_BFI_USI])|((rateparms.cRates1[optIdxU][CRATES1_BFI_USS]&0xc0)<<2));
11500 +    }
11501 +
11502 +  dspOamSharedInterface.modemStats_p = (DEV_HOST_modemStatsDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.modemStats_p);
11503 +
11504 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.modemStats_p,&StatisticsDef, sizeof(DEV_HOST_modemStatsDef_t));
11505 +  
11506 +  if (rc)
11507 +    {
11508 +    dprintf(1,"dslhal_support_blockRead failed\n");
11509 +    return;
11510 +    }
11511 +  /* Populate the Error Structure Variables */
11512 +
11513 +  /* US Interleave Path Error Statistics */
11514 +
11515 +  /* Change the endianness of the Pointer */
11516 +  StatisticsDef.usErrorStatsIntlv_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned int)StatisticsDef.usErrorStatsIntlv_p);
11517 +
11518 +  rc = dslhal_support_blockRead((PVOID)StatisticsDef.usErrorStatsIntlv_p,&usIntlvError, (sizeof(DEV_HOST_errorStats_t)));
11519 +  
11520 +  if (rc) 
11521 +    return;
11522 +
11523 +  /* DS Interleave Path Error Statistics */
11524 +
11525 +  /* Change the endianness of the Pointer */
11526 +  StatisticsDef.dsErrorStatsIntlv_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned int)StatisticsDef.dsErrorStatsIntlv_p);
11527 +
11528 +  rc = dslhal_support_blockRead((PVOID)StatisticsDef.dsErrorStatsIntlv_p,&dsIntlvError, (sizeof(DEV_HOST_errorStats_t)));
11529 +  
11530 +  if (rc) 
11531 +    return;
11532 +
11533 +  /* US Fast Path Error Statistics */
11534 +
11535 +  /* Change the endianness of the Pointer */
11536 +  StatisticsDef.usErrorStatsFast_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned int)StatisticsDef.usErrorStatsFast_p);
11537 +
11538 +  rc = dslhal_support_blockRead((PVOID)StatisticsDef.usErrorStatsFast_p,&usFastError, (sizeof(DEV_HOST_errorStats_t)));
11539 +  
11540 +  if (rc) 
11541 +    return;
11542 +
11543 +  /* DS Fast Path Error Statistics */
11544 +
11545 +  /* Change the endianness of the Pointer */
11546 +  StatisticsDef.dsErrorStatsFast_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned int)StatisticsDef.dsErrorStatsFast_p);
11547 +
11548 +  rc = dslhal_support_blockRead((PVOID)StatisticsDef.dsErrorStatsFast_p,&dsFastError, (sizeof(DEV_HOST_errorStats_t)));
11549 +  
11550 +  if (rc) 
11551 +    return;
11552 +  if(!rc) 
11553 +  {
11554 +    if(ptidsl->AppData.bState > 2)
11555 +    {
11556 +      /* Get CRC Errors Stats for both US and DS */
11557 +      ptidsl->AppData.dsICRC_errors   = dslhal_support_byteSwap32((unsigned int)dsIntlvError.crcErrors);
11558 +      ptidsl->AppData.dsFCRC_errors   = dslhal_support_byteSwap32((unsigned int)dsFastError.crcErrors);
11559 +      ptidsl->AppData.usICRC_errors   = dslhal_support_byteSwap32((unsigned int)usIntlvError.crcErrors);
11560 +      ptidsl->AppData.usFCRC_errors   = dslhal_support_byteSwap32((unsigned int)usFastError.crcErrors);
11561 +      /* Get FEC Errors Stats for both US and DS */
11562 +      ptidsl->AppData.dsIFEC_errors   = dslhal_support_byteSwap32((unsigned int)dsIntlvError.fecErrors);
11563 +      ptidsl->AppData.dsFFEC_errors   = dslhal_support_byteSwap32((unsigned int)dsFastError.fecErrors);
11564 +      ptidsl->AppData.usIFEC_errors   = dslhal_support_byteSwap32((unsigned int)usIntlvError.fecErrors);
11565 +      ptidsl->AppData.usFFEC_errors   = dslhal_support_byteSwap32((unsigned int)usFastError.fecErrors);
11566 +      /* Get NCD Errors Stats for both US and DS */
11567 +      ptidsl->AppData.dsINCD_error   = dslhal_support_byteSwap32((unsigned int)dsIntlvError.ncdError);
11568 +      ptidsl->AppData.dsFNCD_error   = dslhal_support_byteSwap32((unsigned int)dsFastError.ncdError);
11569 +      ptidsl->AppData.usINCD_error   = dslhal_support_byteSwap32((unsigned int)usIntlvError.ncdError);
11570 +      ptidsl->AppData.usFNCD_error   = dslhal_support_byteSwap32((unsigned int)usFastError.ncdError);
11571 +      /* Get LCD Errors Stats for both US and DS */
11572 +      ptidsl->AppData.dsILCD_errors   = dslhal_support_byteSwap32((unsigned int)dsIntlvError.lcdErrors);
11573 +      ptidsl->AppData.dsFLCD_errors   = dslhal_support_byteSwap32((unsigned int)dsFastError.lcdErrors);
11574 +      ptidsl->AppData.usILCD_errors   = dslhal_support_byteSwap32((unsigned int)usIntlvError.lcdErrors);
11575 +      ptidsl->AppData.usFLCD_errors   = dslhal_support_byteSwap32((unsigned int)usFastError.lcdErrors);
11576 +      /*Get HEC Errors Stats for both US and DS */
11577 +      ptidsl->AppData.dsIHEC_errors   = dslhal_support_byteSwap32((unsigned int)dsIntlvError.hecErrors);
11578 +      ptidsl->AppData.dsFHEC_errors   = dslhal_support_byteSwap32((unsigned int)dsFastError.hecErrors);
11579 +      ptidsl->AppData.usIHEC_errors   = dslhal_support_byteSwap32((unsigned int)usIntlvError.hecErrors);
11580 +      ptidsl->AppData.usFHEC_errors   = dslhal_support_byteSwap32((unsigned int)usFastError.hecErrors);
11581 +
11582 +      /* Get LOS and SEF error Stats */
11583 +      ptidsl->AppData.LOS_errors      = dslhal_support_byteSwap32(StatisticsDef.losErrors);            
11584 +      ptidsl->AppData.SEF_errors      = dslhal_support_byteSwap32(StatisticsDef.sefErrors);
11585 +      ptidsl->AppData.coLosErrors = dslhal_support_byteSwap32(StatisticsDef.farEndLosErrors);
11586 +      ptidsl->AppData.coRdiErrors = dslhal_support_byteSwap32(StatisticsDef.farEndRdiErrors);
11587 +  
11588 +  dspOamSharedInterface.atmStats_p = (DEV_HOST_atmStats_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.atmStats_p);
11589 +
11590 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.atmStats_p,&atmStats, sizeof(DEV_HOST_atmStats_t));
11591 +  
11592 +  if (rc)
11593 +    {
11594 +    dprintf(1,"dslhal_support_blockRead failed\n");
11595 +    return;
11596 +    }
11597 +
11598 +  /* Populate the US/DS ATM Stats Variables */
11599 +
11600 +  /* US ATM Statistics */
11601 +
11602 +  /* Change the endianness of the Pointer */
11603 +  atmStats.us0_p = (DEV_HOST_usAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.us0_p);
11604 +
11605 +  rc = dslhal_support_blockRead((PVOID)atmStats.us0_p,&usAtmStats0, (sizeof(DEV_HOST_usAtmStats_t)));
11606 +  
11607 +  if (rc) 
11608 +    return;
11609 +
11610 +  atmStats.us1_p = (DEV_HOST_usAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.us1_p);
11611 +
11612 +  rc = dslhal_support_blockRead((PVOID)atmStats.us1_p,&usAtmStats1, (sizeof(DEV_HOST_usAtmStats_t)));
11613 +  
11614 +  if (rc) 
11615 +    return;
11616 +
11617 + /* DS ATM Statistics */
11618 +
11619 +  /* Change the endianness of the Pointer */
11620 +  atmStats.ds0_p = (DEV_HOST_dsAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.ds0_p);
11621 +
11622 +  rc = dslhal_support_blockRead((PVOID)atmStats.ds0_p,&dsAtmStats0, (sizeof(DEV_HOST_dsAtmStats_t)));
11623 +  
11624 +  if (rc) 
11625 +    return;
11626 +  atmStats.ds1_p = (DEV_HOST_dsAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.ds1_p);
11627 +
11628 +  rc = dslhal_support_blockRead((PVOID)atmStats.ds1_p,&dsAtmStats1, (sizeof(DEV_HOST_dsAtmStats_t)));
11629 +  
11630 +  if (rc) 
11631 +    return;
11632 +
11633 +      /* Get ATM Stats for both US and DS for Channel 0*/
11634 +      ptidsl->AppData.usAtm_count[0]     = dslhal_support_byteSwap32(usAtmStats0.goodCount);
11635 +      ptidsl->AppData.usIdle_count[0]    = dslhal_support_byteSwap32(usAtmStats0.idleCount);
11636 +#if SWTC
11637 +      ptidsl->AppData.usPdu_count[0]     = dslhal_support_byteSwap32(usAtmStats0.pduCount);
11638 +#endif
11639 +      ptidsl->AppData.dsGood_count[0]    = dslhal_support_byteSwap32(dsAtmStats0.goodCount);
11640 +      ptidsl->AppData.dsIdle_count[0]    = dslhal_support_byteSwap32(dsAtmStats0.idleCount);
11641 +#if SWTC
11642 +      ptidsl->AppData.dsPdu_count[0]     = dslhal_support_byteSwap32(dsAtmStats0.pduCount);
11643 +#endif
11644 +      ptidsl->AppData.dsBadHec_count[0]  = dslhal_support_byteSwap32((dsAtmStats0.badHecCount));
11645 +      ptidsl->AppData.dsOVFDrop_count[0] = dslhal_support_byteSwap32((dsAtmStats0.ovflwDropCount));
11646 +      /* Get ATM Stats for both US and DS for Channel 1*/
11647 +      ptidsl->AppData.usAtm_count[1]     = dslhal_support_byteSwap32(usAtmStats1.goodCount);
11648 +      ptidsl->AppData.usIdle_count[1]    = dslhal_support_byteSwap32(usAtmStats1.idleCount);
11649 +#if SWTC
11650 +      ptidsl->AppData.usPdu_count[1]     = dslhal_support_byteSwap32(usAtmStats1.pduCount);
11651 +#endif
11652 +      ptidsl->AppData.dsGood_count[1]    = dslhal_support_byteSwap32(dsAtmStats1.goodCount);
11653 +      ptidsl->AppData.dsIdle_count[1]    = dslhal_support_byteSwap32(dsAtmStats1.idleCount);
11654 +#if SWTC
11655 +      ptidsl->AppData.dsPdu_count[1]     = dslhal_support_byteSwap32(dsAtmStats1.pduCount);
11656 +#endif
11657 +      ptidsl->AppData.dsBadHec_count[1]  = dslhal_support_byteSwap32((dsAtmStats1.badHecCount));
11658 +      ptidsl->AppData.dsOVFDrop_count[1] = dslhal_support_byteSwap32((dsAtmStats1.ovflwDropCount));
11659 +
11660 +    /* Determine the US and DS Superframe Count */
11661 +
11662 +  dspOamSharedInterface.dspWriteSuperFrameCnt_p = (DEV_HOST_dspWrSuperFrameCntDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspWriteSuperFrameCnt_p);
11663 +
11664 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspWriteSuperFrameCnt_p,&SuperFrameCnt, sizeof(DEV_HOST_dspWrSuperFrameCntDef_t));
11665 +  
11666 +  if (rc)
11667 +    {
11668 +    dprintf(1,"dslhal_support_blockRead failed\n");
11669 +    return;
11670 +    }
11671 +      ptidsl->AppData.usSuperFrmCnt   = dslhal_support_byteSwap32(SuperFrameCnt.wSuperFrameCntUstrm);
11672 +      ptidsl->AppData.dsSuperFrmCnt   = dslhal_support_byteSwap32(SuperFrameCnt.wSuperFrameCntDstrm);
11673 +      
11674 +      /* Determine Frame Mode and Max Frame Mode */
11675 +
11676 +  dspOamSharedInterface.atucMsg_p = (DEV_HOST_msg_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.atucMsg_p);
11677 +
11678 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.atucMsg_p,&atuc_msg, sizeof(DEV_HOST_msg_t));
11679 +  
11680 +  if (rc)
11681 +    {
11682 +    dprintf(1,"dslhal_support_blockRead failed\n");
11683 +    return;
11684 +    }
11685 +
11686 +  ptidsl->AppData.FrmMode         = (unsigned int)atuc_msg.framingMode;
11687 +  ptidsl->AppData.MaxFrmMode      = (unsigned int)atuc_msg.maxFrameMode;
11688 +
11689 +  /* Determine Gross Gain */
11690 +
11691 +  dspOamSharedInterface.aturMsg_p = (DEV_HOST_msg_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.aturMsg_p);
11692 +
11693 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.aturMsg_p,&aturMsg, sizeof(DEV_HOST_msg_t));
11694 +  
11695 +  if (rc)
11696 +    {
11697 +    dprintf(1,"dslhal_support_blockRead failed\n");
11698 +    return;
11699 +    }
11700 +  ptidsl->AppData.grossGain = (unsigned int)aturMsg.grossGain;
11701 +
11702 +      /* Determine DS Line Attenuation & Margin */
11703 +  dspOamSharedInterface.eocVar_p = (DEV_HOST_eocVarDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.eocVar_p);
11704 +
11705 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.eocVar_p,&eocVar, sizeof(DEV_HOST_eocVarDef_t));
11706 +  
11707 +  if (rc)
11708 +    {
11709 +    dprintf(1,"dslhal_support_blockRead failed\n");
11710 +    return;
11711 +    }
11712 +      ptidsl->AppData.dsLineAttn      = (unsigned int)eocVar.lineAtten;
11713 +      ptidsl->AppData.dsMargin        = (unsigned int)eocVar.dsMargin;
11714 +    }
11715 +  } 
11716 +
11717 +  /* Read in the Shared Tables structure */      
11718 +  dspOamSharedInterface.dspWrSharedTables_p = (DEV_HOST_dspWrSharedTables_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspWrSharedTables_p);
11719 +
11720 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspWrSharedTables_p,&sharedTables, sizeof(DEV_HOST_dspWrSharedTables_t));
11721 +  
11722 +  if (rc)
11723 +    {
11724 +    dprintf(1,"dslhal_support_blockRead failed\n");
11725 +    return;
11726 +    }
11727 +
11728 +  /* Read the ATU-R Bits and Gains Table */
11729 +  sharedTables.aturBng_p = (unsigned char *)dslhal_support_byteSwap32((unsigned int)sharedTables.aturBng_p);
11730 +  rc = dslhal_support_blockRead((PVOID)sharedTables.aturBng_p,ptidsl->AppData.rBng,255*2*sizeof(unsigned char));
11731 +  if (rc)
11732 +    {
11733 +    dprintf(1,"dslhal_support_blockRead failed\n");
11734 +    return;
11735 +    }
11736 +  /* Read the ATU-C Bits and Gains Table */
11737 +  sharedTables.atucBng_p = (unsigned char *)dslhal_support_byteSwap32((unsigned int)sharedTables.atucBng_p);
11738 +  if(ptidsl->netService == 2) /* for Annex_B */
11739 +    {
11740 +      rc = dslhal_support_blockRead((PVOID)sharedTables.atucBng_p,ptidsl->AppData.cBng,126*sizeof(unsigned char));
11741 +      if (rc)
11742 +       {
11743 +        dprintf(1,"dslhal_support_blockRead failed\n");
11744 +        return;
11745 +        }
11746 +      for(i=0;i<US_BNG_LENGTH*2;i++)
11747 +         usBits[i]=0;
11748 +      for(i=1;i<US_BNG_LENGTH*2;i++)
11749 +       {
11750 +        usBits[i]=((ptidsl->AppData.cBng[(i-1)*2])&0xf);
11751 +        dprintf(5,"Bit #%d : 0x%x\n",i,usBits[i]);
11752 +        }
11753 +      for(i=1;i<US_BNG_LENGTH*2;i++)
11754 +       {
11755 +        if(usBits[i])
11756 +        usNumLoadedTones++;
11757 +        }
11758 +    }
11759 +  else
11760 +    {
11761 +      rc = dslhal_support_blockRead((PVOID)sharedTables.atucBng_p,ptidsl->AppData.cBng,62*sizeof(unsigned char));
11762 +      if (rc)
11763 +       {
11764 +        dprintf(1,"dslhal_support_blockRead failed\n");
11765 +        return;
11766 +        }
11767 +      for(i=0;i<US_BNG_LENGTH;i++)
11768 +         usBits[i]=0;
11769 +      for(i=1;i<US_BNG_LENGTH;i++)
11770 +       {
11771 +        usBits[i]=((ptidsl->AppData.cBng[(i-1)*2])&0xf);
11772 +        dprintf(5,"Bit #%d : 0x%x\n",i,usBits[i]);
11773 +        }
11774 +      for(i=1;i<US_BNG_LENGTH;i++)
11775 +       {
11776 +        if(usBits[i])
11777 +        usNumLoadedTones++;
11778 +        }
11779 +    }
11780 +
11781 +  /* Determine Number U/S of Loaded Tones */
11782 +
11783 +  /* U/S Power Computation */
11784 +  dspOamSharedInterface.phyPerf_p = (DEV_HOST_phyPerf_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.phyPerf_p);
11785 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.phyPerf_p,
11786 +                                &phyPerf, sizeof(DEV_HOST_phyPerf_t));
11787 +  if (rc)
11788 +    {
11789 +      dprintf(1,"dslhal_support_blockRead failed\n");
11790 +      return;
11791 +    }  
11792 +  ptidsl->AppData.currentHybridNum = phyPerf.currentHybridNumUsed;
11793 +  phyPerf.usAvgGain = dslhal_support_byteSwap32(phyPerf.usAvgGain);
11794 +  ptidsl->AppData.usTxPower = LOG43125 + phyPerf.usAvgGain + (256*US_NOMINAL_POWER)+log10[usNumLoadedTones-1];
11795 +  dprintf(7,"Avg Gain: 0x%x  usNumLoadedTones: 0x%x    log: 0x%x\n",phyPerf.usAvgGain, usNumLoadedTones, log10[usNumLoadedTones-1]);
11796 +  
11797 +  /* Determine Number D/S of Loaded Tones */
11798 +  dsBits[0]=0;
11799 +  for(i=0;i<DS_BNG_LENGTH;i++)
11800 +    {
11801 +     dsBits[i]=0;
11802 +     /* ptidsl->AppData.rBng[i-1]=dslhal_support_byteSwap32((unsigned int)ptidsl->AppData.rBng[i-1]);*/
11803 +    }
11804 +  for(i=1;i<DS_BNG_LENGTH;i++)
11805 +    {
11806 +     dsBits[i]=((ptidsl->AppData.rBng[(i-1)*2])&0xf);
11807 +     dprintf(5,"Bit #%d : 0x%x\n",i,dsBits[i]);
11808 +    }
11809 +  for(i=1;i<DS_BNG_LENGTH;i++)
11810 +    {
11811 +     if(dsBits[i])
11812 +       dsNumLoadedTones++;
11813 +    }
11814 +  /* D/S Power Computation */
11815 +  dspOamSharedInterface.phyPerf_p = (DEV_HOST_phyPerf_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.phyPerf_p);
11816 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.phyPerf_p,
11817 +                                &phyPerf, sizeof(DEV_HOST_phyPerf_t));
11818 +  if (rc)
11819 +    {
11820 +      dprintf(1,"dslhal_support_blockRead failed\n");
11821 +      return;
11822 +    }  
11823 +  /* D/S Power Cutback */
11824 +  dsPowerCutBack = (unsigned char)((((ptidsl->AppData.bCMsgs1[0]) >>6) &0x3)+(((ptidsl->AppData.bCMsgs1[1]) &0x1) <<2));
11825 +  phyPerf.dsAvgGain = dslhal_support_byteSwap32(phyPerf.dsAvgGain);
11826 +  ptidsl->AppData.dsTxPower = LOG43125 + phyPerf.dsAvgGain + (256*((2*(dsPowerCutBack-1))-52)) + log10[dsNumLoadedTones-1];
11827 +  dprintf(7,"Avg Gain: %d  dsNumLoadedTones: %d  log: %d  pcb: %d \n",phyPerf.dsAvgGain, dsNumLoadedTones, log10[dsNumLoadedTones-1], dsPowerCutBack);
11828 +  /* ds bit allocation */
11829 +  sharedTables.bitAllocTblDstrm_p = (unsigned char *)dslhal_support_byteSwap32((unsigned int)sharedTables.bitAllocTblDstrm_p);
11830 +  rc = dslhal_support_blockRead((PVOID)sharedTables.bitAllocTblDstrm_p,ptidsl->AppData.BitAllocTblDstrm, 256*sizeof(unsigned char));
11831 +  if(rc)
11832 +    {
11833 +      dprintf(1,"dslhal_support_blockRead failed \n");
11834 +      return;
11835 +    }
11836 +
11837 +    /* us bit allocation */
11838 +  sharedTables.bitAllocTblUstrm_p = (unsigned char *)dslhal_support_byteSwap32((unsigned int)sharedTables.bitAllocTblUstrm_p);
11839 +  rc = dslhal_support_blockRead((PVOID)sharedTables.bitAllocTblUstrm_p,ptidsl->AppData.BitAllocTblUstrm, 32*sizeof(unsigned char));
11840 +  if(rc)
11841 +    {
11842 +      dprintf(1,"dslhal_support_blockRead failed \n");
11843 +      return;
11844 +    }
11845 +    /* margin per tone */
11846 +  sharedTables.marginTblDstrm_p = (signed char *)dslhal_support_byteSwap32((unsigned int)sharedTables.marginTblDstrm_p);
11847 +  rc = dslhal_support_blockRead((PVOID)sharedTables.marginTblDstrm_p,ptidsl->AppData.marginTblDstrm, 256*sizeof(signed char));
11848 +  if(rc)
11849 +    {
11850 +      dprintf(1,"dslhal_support_blockRead failed \n");
11851 +      return;
11852 +    }
11853 +  /* Read Configured Options */
11854 +  dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p);
11855 +
11856 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.oamWriteNegoParams_p, 
11857 +                               &configParms, sizeof(DEV_HOST_oamWrNegoParaDef_t));
11858 +  
11859 +  if (rc)
11860 +    {
11861 +    dprintf(1,"dslhal_support_blockRead failed\n");
11862 +    return;
11863 +    }
11864 +  else 
11865 +    {
11866 +      /* r-Msg1 */
11867 +    ptidsl->AppData.StdMode = (unsigned int)configParms.stdMode;
11868 +    if(configParms.stdMode == T1413_MODE)
11869 +      ptidsl->AppData.StdMode = DSLTRAIN_T1413_MODE;
11870 +    if(configParms.stdMode == GDMT_MODE)
11871 +      ptidsl->AppData.StdMode = DSLTRAIN_GDMT_MODE; 
11872 +    if(configParms.stdMode == MULTI_MODE)
11873 +      ptidsl->AppData.StdMode = DSLTRAIN_MULTI_MODE; 
11874 +
11875 +    shim_osMoveMemory((void *)ptidsl->AppData.bRMsgs1, (void *)configParms.rMsgs1, 6*sizeof(char));
11876 +    if((ptidsl->AppData.bRMsgs1[2] & 0x02) == 0x02) 
11877 +      { 
11878 +      dprintf(7,"Trellis!\n");
11879 +      ptidsl->configFlag |= CONFIG_FLAG_TRELLIS;
11880 +      }
11881 +    else
11882 +      ptidsl->configFlag &= ~CONFIG_FLAG_TRELLIS;  
11883 +    if(ptidsl->AppData.bRMsgs1[2]&0x01)
11884 +      ptidsl->configFlag |= CONFIG_FLAG_EC;
11885 +    else
11886 +      ptidsl->configFlag &= ~CONFIG_FLAG_EC;      
11887 +    }
11888 +    return;
11889 +}
11890 +
11891 +
11892 +/********************************************************************************************
11893 +* FUNCTION NAME: dslhal_api_initStatistics()
11894 +*
11895 +*********************************************************************************************
11896 +* DESCRIPTION: init statistical information of ax5 modem daugter card. 
11897 +*
11898 +* Input: tidsl_t *ptidsl
11899 +* 
11900 +* Return: NULL
11901 +*         
11902 +********************************************************************************************/
11903 +void dslhal_api_initStatistics(tidsl_t * ptidsl)
11904 +{
11905 +  int rc;
11906 +  /*TCHostCommDef TCHostCommParms; */
11907 +  int optIdxU, optIdxD;
11908 +  DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
11909 +  DEV_HOST_dspWrNegoParaDef_t   rateparms;
11910 +  DEV_HOST_modemStatsDef_t      StatisticsDef;
11911 +  DEV_HOST_errorStats_t usIntlvError, usFastError, dsIntlvError, dsFastError;
11912 +  DEV_HOST_atmStats_t           atmStats;
11913 +  DEV_HOST_usAtmStats_t         usAtmStats0, usAtmStats1;
11914 +  DEV_HOST_dsAtmStats_t         dsAtmStats0,dsAtmStats1;
11915 +  DEV_HOST_dspWrSuperFrameCntDef_t   SuperFrameCnt;
11916 +  DEV_HOST_msg_t                atuc_msg, aturMsg;
11917 +  DEV_HOST_eocVarDef_t          eocVar;
11918 +  
11919 +  dprintf(5, "dslhal_api_initStatistics\n");
11920 +  
11921 +  pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterface_t *) ptidsl->pmainAddr;
11922 +  rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
11923 +  if (rc)
11924 +    {
11925 +    dprintf(1,"dslhal_support_blockRead failed\n");
11926 +    return;
11927 +    }
11928 +  dspOamSharedInterface.dspWriteNegoParams_p = (DEV_HOST_dspWrNegoParaDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspWriteNegoParams_p);
11929 +
11930 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspWriteNegoParams_p,&rateparms, sizeof(DEV_HOST_dspWrNegoParaDef_t));
11931 +  
11932 +  if (rc)
11933 +    {
11934 +    dprintf(1,"dslhal_support_blockRead failed\n");
11935 +    return;
11936 +    }
11937 +  if(!rc) 
11938 +    {
11939 +      /*    shim_osMoveMemory((void *)ptidsl->AppData.bCRates1, (void *)rateparms.cRates1, SIZE_OF_CRATES1_TABLE); */
11940 +    ptidsl->AppData.bCRates2 = rateparms.cRates2;
11941 +    /*    shim_osMoveMemory((void *)ptidsl->AppData.bRRates1, (void *)rateparms.rRates1, 44); */
11942 +    ptidsl->AppData.bRRates2 = rateparms.rRates2;
11943 +    shim_osMoveMemory((void *)ptidsl->AppData.bCMsgs1, (void *)rateparms.cMsgs1, 6);
11944 +    shim_osMoveMemory((void *)ptidsl->AppData.bCMsgs2, (void *)rateparms.cMsgs2, 4);
11945 +    shim_osMoveMemory((void *)ptidsl->AppData.bRMsgs2, (void *)rateparms.rMsgs2, 4); 
11946 +    
11947 +    ptidsl->AppData.atucVendorId = dslhal_support_byteSwap32((unsigned int)rateparms.atucVendorId);
11948 +    ptidsl->AppData.lineLength = (unsigned int)dslhal_support_byteSwap16((unsigned short)rateparms.lineLength);
11949 +    ptidsl->AppData.atucRevisionNum = rateparms.atucGhsRevisionNum;
11950 +    ptidsl->AppData.usLineAttn = (ptidsl->AppData.bCMsgs2[3] >>2)&0x003f;
11951 +    ptidsl->AppData.usMargin = (ptidsl->AppData.bCMsgs2[2])&0x001f;
11952 +    
11953 +    /* Get the UpStream Connection Rate */
11954 +    /* Based on the Bit Pattern Get the Opt# */
11955 +    if((rateparms.cRates2 & 0x0f) == 0x01) 
11956 +      optIdxU = 0;
11957 +    else if((rateparms.cRates2 & 0x0f) == 0x02)  
11958 +      optIdxU = 1;
11959 +    else if((rateparms.cRates2 & 0x0f) == 0x04) 
11960 +      optIdxU = 2;
11961 +    else if((rateparms.cRates2 & 0x0f) == 0x08)  
11962 +      optIdxU = 3;
11963 +    else 
11964 +      optIdxU = -1;
11965 +    dprintf(5, "optIdxU=%d\n", optIdxU);
11966 +    /* Obtain the US Rates using Opt# and CRates1 Table */
11967 +    /* Rate(US) = [Bf(LS0) + Bi(LS0)]*32                */
11968 +    if(ptidsl->AppData.dsl_modulation <= DSLTRAIN_GLITE_MODE)
11969 +      ptidsl->AppData.USConRate = ((rateparms.cRates1[optIdxU][CRATES1_BF_LS0] + rateparms.cRates1[optIdxU][CRATES1_BI_LS0]) * 32);
11970 +    else
11971 +      ptidsl->AppData.USConRate =  dslhal_support_byteSwap16((unsigned short)rateparms.adsl2USRate);
11972 +    ptidsl->AppData.USPeakCellRate = ptidsl->AppData.USConRate; 
11973 +    
11974 +    /* Get the DownStream Connection Rate */
11975 +    /* Based on the Bit Pattern Get the Opt# */
11976 +    if(((rateparms.cRates2 >> 4) & 0x0f) == 0x01) 
11977 +      optIdxD = 0;
11978 +    else if(((rateparms.cRates2 >> 4) & 0x0f) == 0x02)  
11979 +      optIdxD = 1;
11980 +    else if(((rateparms.cRates2 >> 4) & 0x0f) == 0x04) 
11981 +      optIdxD = 2;
11982 +    else if(((rateparms.cRates2 >> 4) & 0x0f) == 0x08)  
11983 +      optIdxD = 3;
11984 +    else 
11985 +      optIdxD = -1;
11986 +    /* Obtain the DS Rates using Opt# and CRates1 Table */
11987 +    /* Rate(DS) = [Bf(AS0) + Bi(AS0)]*32                */
11988 +    if(ptidsl->AppData.dsl_modulation <= DSLTRAIN_GLITE_MODE)
11989 +      ptidsl->AppData.DSConRate =  (((rateparms.cRates1[optIdxD][CRATES1_BF_AS0]|((rateparms.cRates1[optIdxD][CRATES1_BF_DSRS]&0x80)<<1))+ (rateparms.cRates1[optIdxD][CRATES1_BI_AS0]|((rateparms.cRates1[optIdxD][CRATES1_BI_DSRS]&0x80)<<1)))* 32);
11990 +    else
11991 +      ptidsl->AppData.DSConRate =  dslhal_support_byteSwap16((unsigned short)rateparms.adsl2DSRate);
11992 +    dprintf(5, "ptidsl->AppData.wDSConRate=%d\n", ptidsl->AppData.DSConRate);
11993 +    /* Determine which Path has Modem Trained with */
11994 +    if((rateparms.cRates1[optIdxU][CRATES1_BF_LS0]) && (rateparms.cRates1[optIdxD][CRATES1_BF_AS0]))
11995 +      ptidsl->AppData.TrainedPath = FAST_PATH;
11996 +    else
11997 +      ptidsl->AppData.TrainedPath = INTERLEAVED_PATH;
11998 +
11999 +    /* Set the mode in which the modem is trained */
12000 +    ptidsl->AppData.TrainedMode = (unsigned int)rateparms.trainMode;
12001 +    if(rateparms.trainMode == T1413_MODE)
12002 +      ptidsl->AppData.TrainedMode = DSLTRAIN_T1413_MODE;
12003 +    if(rateparms.trainMode == GDMT_MODE)
12004 +      ptidsl->AppData.TrainedMode = DSLTRAIN_GDMT_MODE;
12005 +
12006 +    if(ptidsl->AppData.TrainedPath == FAST_PATH)
12007 +       ptidsl->AppData.dsFastParityBytesPerSymbol = (rateparms.cRates1[optIdxU][CRATES1_BF_DSRS]&0x1f);
12008 +    else
12009 +       ptidsl->AppData.dsIntlvParityBytesPerSymbol = (rateparms.cRates1[optIdxU][CRATES1_BI_DSRS]&0x1f);
12010 +    ptidsl->AppData.dsSymbolsPerCodeWord = (rateparms.cRates1[optIdxU][CRATES1_BFI_DSS]&0x1f);
12011 +    ptidsl->AppData.dsInterleaverDepth = ((rateparms.cRates1[optIdxU][CRATES1_BFI_DSI])|((rateparms.cRates1[optIdxU][CRATES1_BFI_DSS]&0xc0)<<2));
12012 +
12013 +    if(ptidsl->AppData.TrainedPath == FAST_PATH)
12014 +       ptidsl->AppData.usFastParityBytesPerSymbol = (rateparms.cRates1[optIdxU][CRATES1_BF_USRS]&0x1f);
12015 +    else
12016 +       ptidsl->AppData.usIntlvParityBytesPerSymbol = (rateparms.cRates1[optIdxU][CRATES1_BI_USRS]&0x1f);
12017 +    ptidsl->AppData.usSymbolsPerCodeWord = (rateparms.cRates1[optIdxU][CRATES1_BFI_USS]&0x1f);
12018 +    ptidsl->AppData.usInterleaverDepth = ((rateparms.cRates1[optIdxU][CRATES1_BFI_USI])|((rateparms.cRates1[optIdxU][CRATES1_BFI_USS]&0xc0)<<2));
12019 +    }
12020 +  
12021 +  /* get the Statistics itself */
12022 +
12023 +  dspOamSharedInterface.modemStats_p = (DEV_HOST_modemStatsDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.modemStats_p);
12024 +
12025 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.modemStats_p,&StatisticsDef, sizeof(DEV_HOST_modemStatsDef_t));
12026 +  
12027 +  if (rc)
12028 +    {
12029 +    dprintf(1,"dslhal_support_blockRead failed\n");
12030 +    return;
12031 +    }
12032 +
12033 +  /* Populate the Error Structure Variables */
12034 +
12035 +  /* US Interleave Path Error Statistics */
12036 +
12037 +  /* Change the endianness of the Pointer */
12038 +  StatisticsDef.usErrorStatsIntlv_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned int)StatisticsDef.usErrorStatsIntlv_p);
12039 +
12040 +  rc = dslhal_support_blockRead((PVOID)StatisticsDef.usErrorStatsIntlv_p,&usIntlvError, (sizeof(DEV_HOST_errorStats_t)));
12041 +  
12042 +  if (rc) 
12043 +    return;
12044 +
12045 +  /* DS Interleave Path Error Statistics */
12046 +
12047 +  /* Change the endianness of the Pointer */
12048 +  StatisticsDef.dsErrorStatsIntlv_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned int)StatisticsDef.dsErrorStatsIntlv_p);
12049 +
12050 +  rc = dslhal_support_blockRead((PVOID)StatisticsDef.dsErrorStatsIntlv_p,&dsIntlvError, (sizeof(DEV_HOST_errorStats_t)));
12051 +  
12052 +  if (rc) 
12053 +    return;
12054 +
12055 +  /* US Fast Path Error Statistics */
12056 +
12057 +  /* Change the endianness of the Pointer */
12058 +  StatisticsDef.usErrorStatsFast_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned int)StatisticsDef.usErrorStatsFast_p);
12059 +
12060 +  rc = dslhal_support_blockRead((PVOID)StatisticsDef.usErrorStatsFast_p,&usFastError, (sizeof(DEV_HOST_errorStats_t)));
12061 +  
12062 +  if (rc) 
12063 +    return;
12064 +
12065 +
12066 +  /* DS Fast Path Error Statistics */
12067 +
12068 +  /* Change the endianness of the Pointer */
12069 +  StatisticsDef.dsErrorStatsFast_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned int)StatisticsDef.dsErrorStatsFast_p);
12070 +
12071 +  rc = dslhal_support_blockRead((PVOID)StatisticsDef.dsErrorStatsFast_p,&dsFastError, (sizeof(DEV_HOST_errorStats_t)));
12072 +  
12073 +  if (rc) 
12074 +    return;
12075 +
12076 +  if(ptidsl->AppData.bState > 2)
12077 +  {
12078 +    /* Get CRC Errors Stats for both US and DS */
12079 +    ptidsl->AppData.dsICRC_errors   = dslhal_support_byteSwap32((unsigned int)dsIntlvError.crcErrors);
12080 +    ptidsl->AppData.dsFCRC_errors   = dslhal_support_byteSwap32((unsigned int)dsFastError.crcErrors);
12081 +    ptidsl->AppData.usICRC_errors   = dslhal_support_byteSwap32((unsigned int)usIntlvError.crcErrors);
12082 +    ptidsl->AppData.usFCRC_errors   = dslhal_support_byteSwap32((unsigned int)usFastError.crcErrors);
12083 +    /* Get FEC Errors Stats for both US and DS */
12084 +    ptidsl->AppData.dsIFEC_errors   = dslhal_support_byteSwap32((unsigned int)dsIntlvError.fecErrors);
12085 +    ptidsl->AppData.dsFFEC_errors   = dslhal_support_byteSwap32((unsigned int)dsFastError.fecErrors);
12086 +    ptidsl->AppData.usIFEC_errors   = dslhal_support_byteSwap32((unsigned int)usIntlvError.fecErrors);
12087 +    ptidsl->AppData.usFFEC_errors   = dslhal_support_byteSwap32((unsigned int)usFastError.fecErrors);
12088 +    /* Get NCD Errors Stats for both US and DS */
12089 +    ptidsl->AppData.dsINCD_error   = dslhal_support_byteSwap32((unsigned int)dsIntlvError.ncdError);
12090 +    ptidsl->AppData.dsFNCD_error   = dslhal_support_byteSwap32((unsigned int)dsFastError.ncdError);
12091 +    ptidsl->AppData.usINCD_error   = dslhal_support_byteSwap32((unsigned int)usIntlvError.ncdError);
12092 +    ptidsl->AppData.usFNCD_error   = dslhal_support_byteSwap32((unsigned int)usFastError.ncdError);
12093 +    /* Get LCD Errors Stats for both US and DS */
12094 +    ptidsl->AppData.dsILCD_errors   = dslhal_support_byteSwap32((unsigned int)dsIntlvError.lcdErrors);
12095 +    ptidsl->AppData.dsFLCD_errors   = dslhal_support_byteSwap32((unsigned int)dsFastError.lcdErrors);
12096 +    ptidsl->AppData.usILCD_errors   = dslhal_support_byteSwap32((unsigned int)usIntlvError.lcdErrors);
12097 +    ptidsl->AppData.usFLCD_errors   = dslhal_support_byteSwap32((unsigned int)usFastError.lcdErrors);
12098 +    /*Get HEC Errors Stats for both US and DS */
12099 +    ptidsl->AppData.dsIHEC_errors   = dslhal_support_byteSwap32((unsigned int)dsIntlvError.hecErrors);
12100 +    ptidsl->AppData.dsFHEC_errors   = dslhal_support_byteSwap32((unsigned int)dsFastError.hecErrors);
12101 +    ptidsl->AppData.usIHEC_errors   = dslhal_support_byteSwap32((unsigned int)usIntlvError.hecErrors);
12102 +    ptidsl->AppData.usFHEC_errors   = dslhal_support_byteSwap32((unsigned int)usFastError.hecErrors);
12103 +    
12104 +    /* Get LOS and SEF error Stats */
12105 +    ptidsl->AppData.LOS_errors      = dslhal_support_byteSwap32(StatisticsDef.losErrors);              
12106 +    ptidsl->AppData.SEF_errors      = dslhal_support_byteSwap32(StatisticsDef.sefErrors);
12107 +    ptidsl->AppData.coLosErrors = dslhal_support_byteSwap32(StatisticsDef.farEndLosErrors);
12108 +    ptidsl->AppData.coRdiErrors = dslhal_support_byteSwap32(StatisticsDef.farEndRdiErrors);    
12109 +    
12110 +    dspOamSharedInterface.atmStats_p = (DEV_HOST_atmStats_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.atmStats_p);
12111 +    
12112 +    rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.atmStats_p,&atmStats, sizeof(DEV_HOST_atmStats_t));
12113 +    
12114 +    if (rc)
12115 +      {
12116 +        dprintf(1,"dslhal_support_blockRead failed\n");
12117 +        return;
12118 +      }
12119 +
12120 +    /* Populate the US/DS ATM Stats Variables */
12121 +    
12122 +    /* US ATM Statistics */
12123 +
12124 +    /* Change the endianness of the Pointer */
12125 +    atmStats.us0_p = (DEV_HOST_usAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.us0_p);
12126 +    
12127 +    rc = dslhal_support_blockRead((PVOID)atmStats.us0_p,&usAtmStats0, (sizeof(DEV_HOST_usAtmStats_t)));
12128 +                                       
12129 +    if (rc) 
12130 +     return;
12131 +
12132 +    /* Change the endianness of the Pointer */
12133 +    atmStats.us1_p = (DEV_HOST_usAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.us1_p);
12134 +    
12135 +    rc = dslhal_support_blockRead((PVOID)atmStats.us1_p,&usAtmStats1, (sizeof(DEV_HOST_usAtmStats_t)));
12136 +                                       
12137 +    if (rc) 
12138 +     return;
12139 +
12140 +
12141 +  /* DS ATM Statistics */
12142 +                                       
12143 +  /* Change the endianness of the Pointer */
12144 +    atmStats.ds0_p = (DEV_HOST_dsAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.ds0_p);
12145 +    
12146 +    rc = dslhal_support_blockRead((PVOID)atmStats.ds0_p,&dsAtmStats0, (sizeof(DEV_HOST_dsAtmStats_t)));
12147 +                                       
12148 +    if (rc) 
12149 +    return;
12150 +
12151 +  /* Change the endianness of the Pointer */
12152 +    atmStats.ds1_p = (DEV_HOST_dsAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.ds1_p);
12153 +    
12154 +    rc = dslhal_support_blockRead((PVOID)atmStats.ds1_p,&dsAtmStats1, (sizeof(DEV_HOST_dsAtmStats_t)));
12155 +                                       
12156 +    if (rc) 
12157 +    return;
12158 +    /* Get ATM Stats for both US and DS Channel 0*/
12159 +    ptidsl->AppData.usAtm_count[0]     = dslhal_support_byteSwap32(usAtmStats0.goodCount);
12160 +    ptidsl->AppData.usIdle_count[0]    = dslhal_support_byteSwap32(usAtmStats0.idleCount);
12161 +#if SWTC
12162 +    ptidsl->AppData.usPdu_count[0]     = dslhal_support_byteSwap32(usAtmStats0.pduCount);
12163 +#endif
12164 +    ptidsl->AppData.dsGood_count[0]    = dslhal_support_byteSwap32(dsAtmStats0.goodCount);
12165 +    ptidsl->AppData.dsIdle_count[0]    = dslhal_support_byteSwap32(dsAtmStats0.idleCount);
12166 +#if SWTC
12167 +    ptidsl->AppData.dsPdu_count[0]     = dslhal_support_byteSwap32(dsAtmStats0.pduCount);
12168 +#endif
12169 +    ptidsl->AppData.dsBadHec_count[0]  = dslhal_support_byteSwap32((dsAtmStats0.badHecCount));
12170 +    ptidsl->AppData.dsOVFDrop_count[0] = dslhal_support_byteSwap32((dsAtmStats0.ovflwDropCount));
12171 +
12172 +    /* Get ATM Stats for both US and DS Channel 1*/
12173 +    ptidsl->AppData.usAtm_count[1]     = dslhal_support_byteSwap32(usAtmStats1.goodCount);
12174 +    ptidsl->AppData.usIdle_count[1]    = dslhal_support_byteSwap32(usAtmStats1.idleCount);
12175 +#if SWTC
12176 +    ptidsl->AppData.usPdu_count[1]     = dslhal_support_byteSwap32(usAtmStats1.pduCount);
12177 +#endif
12178 +    ptidsl->AppData.dsGood_count[1]    = dslhal_support_byteSwap32(dsAtmStats1.goodCount);
12179 +    ptidsl->AppData.dsIdle_count[1]    = dslhal_support_byteSwap32(dsAtmStats1.idleCount);
12180 +#if SWTC
12181 +    ptidsl->AppData.dsPdu_count[1]     = dslhal_support_byteSwap32(dsAtmStats1.pduCount);
12182 +#endif
12183 +    ptidsl->AppData.dsBadHec_count[1]  = dslhal_support_byteSwap32((dsAtmStats1.badHecCount));
12184 +    ptidsl->AppData.dsOVFDrop_count[1] = dslhal_support_byteSwap32((dsAtmStats1.ovflwDropCount));
12185 +
12186 +    
12187 +    /* Determine the US and DS Superframe Count */
12188 +
12189 +    dspOamSharedInterface.dspWriteSuperFrameCnt_p = (DEV_HOST_dspWrSuperFrameCntDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspWriteSuperFrameCnt_p);
12190 +    
12191 +    rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspWriteSuperFrameCnt_p,&SuperFrameCnt, sizeof(DEV_HOST_dspWrSuperFrameCntDef_t));
12192 +    
12193 +    if (rc)
12194 +    {
12195 +      dprintf(1,"dslhal_support_blockRead failed\n");
12196 +      return;
12197 +    }
12198 +
12199 +    ptidsl->AppData.usSuperFrmCnt   = dslhal_support_byteSwap32(SuperFrameCnt.wSuperFrameCntUstrm);
12200 +    ptidsl->AppData.dsSuperFrmCnt   = dslhal_support_byteSwap32(SuperFrameCnt.wSuperFrameCntDstrm);
12201 +    
12202 +    /* Determine Frame Mode and Max Frame Mode */
12203 +    
12204 +    dspOamSharedInterface.atucMsg_p = (DEV_HOST_msg_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.atucMsg_p);
12205 +    
12206 +    rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.atucMsg_p,&atuc_msg, sizeof(DEV_HOST_msg_t));
12207 +  
12208 +    if (rc)
12209 +    {
12210 +      dprintf(1,"dslhal_support_blockRead failed\n");
12211 +      return;
12212 +    }
12213 +
12214 +    ptidsl->AppData.FrmMode         = (unsigned int)atuc_msg.framingMode;
12215 +    ptidsl->AppData.MaxFrmMode      = (unsigned int)atuc_msg.maxFrameMode;
12216 +    
12217 +    /* Determine Gross Gain */
12218 +
12219 +    dspOamSharedInterface.aturMsg_p = (DEV_HOST_msg_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.aturMsg_p);
12220 +
12221 +    rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.aturMsg_p,&aturMsg, sizeof(DEV_HOST_msg_t));
12222 +  
12223 +    if (rc)
12224 +      {
12225 +      dprintf(1,"dslhal_support_blockRead failed\n");
12226 +      return;
12227 +      }
12228 +    ptidsl->AppData.grossGain = (unsigned int)aturMsg.grossGain;
12229 +    /* Determine DS Line Attenuation & Margin */
12230 +    dspOamSharedInterface.eocVar_p = (DEV_HOST_eocVarDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.eocVar_p);
12231 +    
12232 +    rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.eocVar_p,&eocVar, sizeof(DEV_HOST_eocVarDef_t));
12233 +    
12234 +    if (rc)
12235 +    {
12236 +      dprintf(1,"dslhal_support_blockRead failed\n");
12237 +      return;
12238 +    }
12239 +
12240 +    ptidsl->AppData.dsLineAttn      = (unsigned int)eocVar.lineAtten;
12241 +    ptidsl->AppData.dsMargin        = (unsigned int)eocVar.dsMargin;
12242 +    }
12243 +    
12244 +#if __HOST_FORINTERNALUSEONLY_R_H__
12245 +  ptidsl->AppData.BER =  dslhal_INTERNAL_computeAtmBitErrorRate(ptidsl);
12246 +#endif
12247 +    dprintf(5, "initstatistics done\n");
12248 +    return;
12249 +  }
12250 +
12251 +/****************************************************************************************** 
12252 + * FUNCTION NAME:    dslhal_api_disableLosAlarm(tidsl_t *ptidsl,unsigned int set) 
12253 + * 
12254 + ******************************************************************************************* 
12255 + * DESCRIPTION: This fuction enables/disables all the LOS alarms 
12256 + * 
12257 + * INPUT:  PITIDSLHW_T *ptidsl 
12258 + *         unsigned int set; //if set is TRUE: LOS Alarms are disabled else enabled
12259 + * RETURN: 0 SUCCESS 
12260 + *         1 FAILED 
12261 + * NOTES:  Currently not supported in any version other than MR4 Patch release..  
12262 + *****************************************************************************************/ 
12263 +unsigned int dslhal_api_disableLosAlarm(tidsl_t *ptidsl,unsigned int set) 
12264 +{ 
12265 +   DEV_HOST_oamWrNegoParaDef_t NegoPara;
12266 +   DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
12267 +   int rc;
12268 +   dprintf(5," dslhal_api_setTrainingMode()\n");
12269 +   if(!ptidsl)
12270 +    {
12271 +      dprintf(3, "Error: PTIDSL pointer invalid\n");
12272 +      return DSLHAL_ERROR_INVALID_PARAM;
12273 +    }
12274 +
12275 +  pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
12276 +  rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface, 
12277 +                                     sizeof(DEV_HOST_dspOamSharedInterface_t));
12278 +  if (rc)
12279 +    {
12280 +    dprintf(1,"dslhal_support_blockRead failed\n");
12281 +    return DSLHAL_ERROR_BLOCK_READ;
12282 +    }
12283 +
12284 +  dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p);
12285 +
12286 +   rc = dslhal_support_blockRead((PVOID) dspOamSharedInterface.oamWriteNegoParams_p,&NegoPara, sizeof(DEV_HOST_oamWrNegoParaDef_t));
12287 +  if (rc)
12288 +    {
12289 +    dprintf(1,"dslhal_support_blockRead failed\n");
12290 +    return DSLHAL_ERROR_BLOCK_READ;
12291 +    }
12292 +  if(set) 
12293 +    {
12294 +   NegoPara.disableLosAlarm = TRUE;
12295 +   /*  NegoPara.marginMonitorTrning = TRUE;
12296 +       NegoPara.marginMonitorShwtme = TRUE;*/
12297 +    } 
12298 +  else
12299 +    {
12300 +    NegoPara.disableLosAlarm = FALSE;
12301 +    /*  NegoPara.marginMonitorTrning = FALSE;
12302 +        NegoPara.marginMonitorShwtme = FALSE;*/
12303 +    }
12304 +
12305 +  rc = dslhal_support_blockWrite(&NegoPara,(PVOID)dspOamSharedInterface.oamWriteNegoParams_p, sizeof(DEV_HOST_oamWrNegoParaDef_t));
12306 +  if(rc)
12307 +    return DSLHAL_ERROR_CONFIG_API_FAILURE;
12308 +  dprintf(5," dslhal_api_disableLosAlarm() Done\n"); 
12309 +  return DSLHAL_ERROR_NO_ERRORS; 
12310 +} 
12311 +
12312 +/******************************************************************************************  
12313 + * FUNCTION NAME:    dslhal_api_setMarginThreshold(tidsl_t *ptidsl,int threshold)  
12314 + *  
12315 + *******************************************************************************************  
12316 + * DESCRIPTION: This fuction does sets the Margin threshold 
12317 + *  
12318 + * INPUT:  PITIDSLHW_T *ptidsl  
12319 + *         int threshold 
12320 + *        
12321 + *                                  
12322 + * RETURN: 0 SUCCESS  
12323 + *         1 FAILED  
12324 + *  
12325 + *****************************************************************************************/  
12326 +unsigned int dslhal_api_setMarginThreshold(tidsl_t *ptidsl, int threshold)  
12327 +{  
12328 +   DEV_HOST_oamWrNegoParaDef_t NegoPara;  
12329 +   DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
12330 +   int rc;  
12331 +   
12332 +   dprintf(5," dslhal_ctrl_setThreshold()\n");  
12333 +    
12334 +   if(!ptidsl)  
12335 +     {  
12336 +      dprintf(3, "Error: PTIDSL pointer invalid\n");  
12337 +      return DSLHAL_ERROR_INVALID_PARAM;  
12338 +     }  
12339 +  
12340 +   pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
12341 +
12342 +   rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
12343 +   if (rc)
12344 +     {
12345 +       dprintf(1,"dslhal_support_blockRead failed\n");
12346 +       return DSLHAL_ERROR_BLOCK_READ;
12347 +     }
12348 +
12349 +  dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p);
12350 +
12351 +
12352 +   rc = dslhal_support_blockRead((PVOID) dspOamSharedInterface.oamWriteNegoParams_p,&NegoPara, sizeof(DEV_HOST_oamWrNegoParaDef_t));
12353 +  if (rc)
12354 +    {
12355 +    dprintf(1,"dslhal_support_blockRead failed\n");
12356 +    return DSLHAL_ERROR_BLOCK_READ;
12357 +    }
12358 +
12359 +  NegoPara.marginThreshold = threshold;
12360 +  
12361 +  rc = dslhal_support_blockWrite(&NegoPara,dspOamSharedInterface.oamWriteNegoParams_p, sizeof(DEV_HOST_oamWrNegoParaDef_t));
12362 +
12363 +  if(rc)
12364 +    return DSLHAL_ERROR_MARGIN_API_FAILURE;
12365 +
12366 +  dprintf(5," dslhal_api_setThreshold() Done\n");  
12367 +  return DSLHAL_ERROR_NO_ERRORS;  
12368 +}  
12369 +
12370 +
12371 +/****************************************************************************************** 
12372 + * FUNCTION NAME:    dslhal_api_setMonitorFlags(tidsl_t *ptidsl, unsigned int trainflag,unsigned int shwtflag) 
12373 + * 
12374 + ******************************************************************************************* 
12375 + * DESCRIPTION: This fuction does sets the Margin monitoring flag
12376 + * 
12377 + * INPUT:  PITIDSLHW_T *ptidsl 
12378 + *         unsigned int trainflag
12379 + *         unsigned int shwtflag 
12380 + *                                 
12381 + * RETURN: 0 SUCCESS 
12382 + *         1 FAILED 
12383 + * 
12384 + *****************************************************************************************/ 
12385 +unsigned int dslhal_api_setMarginMonitorFlags(tidsl_t *ptidsl,unsigned int trainflag,unsigned int shwtflag) 
12386 +{ 
12387 +   DEV_HOST_oamWrNegoParaDef_t NegoPara; 
12388 +   DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
12389 +   int rc; 
12390 +  
12391 +   dprintf(5," dslhal_ctrl_setMonitorFlags()\n"); 
12392 +   
12393 +   if(!ptidsl) 
12394 +     { 
12395 +      dprintf(3, "Error: PTIDSL pointer invalid\n"); 
12396 +      return DSLHAL_ERROR_INVALID_PARAM; 
12397 +     } 
12398 +
12399 +   pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
12400 +
12401 +   rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
12402 +   if (rc)
12403 +     {
12404 +       dprintf(1,"dslhal_support_blockRead failed\n");
12405 +       return DSLHAL_ERROR_BLOCK_READ;
12406 +     }
12407 +
12408 +  dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p);
12409 +
12410 +
12411 +   rc = dslhal_support_blockRead((PVOID) dspOamSharedInterface.oamWriteNegoParams_p,&NegoPara, sizeof(DEV_HOST_oamWrNegoParaDef_t));
12412 +  if (rc)
12413 +    {
12414 +    dprintf(1,"dslhal_support_blockRead failed\n");
12415 +    return DSLHAL_ERROR_BLOCK_READ;
12416 +    }
12417 +
12418 +  if (trainflag) 
12419 +    { 
12420 +        NegoPara.marginMonitorTrning = TRUE; 
12421 +    } 
12422 +  else 
12423 +    { 
12424 +        NegoPara.marginMonitorTrning = FALSE; 
12425 +    } 
12426 +  if (shwtflag) 
12427 +    { 
12428 +        NegoPara.marginMonitorShwtme = TRUE; 
12429 +    } 
12430 +  else 
12431 +    { 
12432 +        NegoPara.marginMonitorShwtme = FALSE; 
12433 +    } 
12434
12435 +  rc = dslhal_support_blockWrite(&NegoPara,dspOamSharedInterface.oamWriteNegoParams_p, sizeof(DEV_HOST_oamWrNegoParaDef_t));
12436 +    if(rc)
12437 +      return DSLHAL_ERROR_MARGIN_API_FAILURE;
12438 +  dprintf(5," dslhal_api_setMonitorFlags() Done\n"); 
12439 +  return DSLHAL_ERROR_NO_ERRORS; 
12440 +} 
12441 +
12442 +/******************************************************************************************  
12443 + * FUNCTION NAME:    dslhal_api_setEocSerialNumber(tidsl_t *ptidsl,char *SerialNum)  
12444 + *  
12445 + *******************************************************************************************  
12446 + * DESCRIPTION: This fuction Sets the eoc Serial Number  
12447 + *  
12448 + * INPUT:  PITIDSLHW_T *ptidsl  
12449 + *         char *SerialNum : Input eoc Serial Number
12450 + *  
12451 + * RETURN: 0 SUCCESS  
12452 + *         1 FAILED  
12453 + *  
12454 + *****************************************************************************************/  
12455 +unsigned int dslhal_api_setEocSerialNumber(tidsl_t *ptidsl,char *SerialNumber)  
12456 +{  
12457 +   DEV_HOST_eocVarDef_t eocVar;
12458 +   DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
12459 +   int rc;  
12460 +   dprintf(5," dslhal_api_setEocSerialNumber()\n");  
12461
12462 +   if(!ptidsl) 
12463 +     { 
12464 +      dprintf(3, "Error: PTIDSL pointer invalid\n"); 
12465 +      return DSLHAL_ERROR_INVALID_PARAM; 
12466 +     } 
12467 +
12468 +   pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
12469 +
12470 +   rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
12471 +   if (rc)
12472 +     {
12473 +       dprintf(1,"dslhal_support_blockRead failed\n");
12474 +       return DSLHAL_ERROR_BLOCK_READ;
12475 +     }
12476 +
12477 +  dspOamSharedInterface.eocVar_p = (DEV_HOST_eocVarDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.eocVar_p);
12478 +
12479 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.eocVar_p, 
12480 +                               &eocVar, sizeof(DEV_HOST_eocVarDef_t));
12481 +  
12482 +  if (rc)
12483 +    {
12484 +    dprintf(1,"dslhal_support_blockRead failed\n");
12485 +    return DSLHAL_ERROR_BLOCK_READ;
12486 +    }
12487 +   
12488 +  shim_osMoveMemory(eocVar.serialNumber,SerialNumber,32); 
12489 +
12490 +  rc= dslhal_support_blockWrite(&eocVar,dspOamSharedInterface.eocVar_p,sizeof(DEV_HOST_eocVarDef_t)); 
12491 +    if(rc)
12492 +      return DSLHAL_ERROR_EOCREG_API_FAILURE;
12493 +  dprintf(5," dslhal_api_setEocSerialNumber() Done\n");  
12494 +   
12495 +  return DSLHAL_ERROR_NO_ERRORS;
12496 +  
12497 +}  
12498 +
12499 +
12500 +/****************************************************************************************** 
12501 + * FUNCTION NAME:    dslhal_api_setEocVendorId(tidsl_t *ptidsl,char *VendorID) 
12502 + * 
12503 + ******************************************************************************************* 
12504 + * DESCRIPTION: This fuction Sets the eoc Vendor ID 
12505 + * 
12506 + * INPUT:  PITIDSLHW_T *ptidsl 
12507 + *         char *VendorID : Input eoc Vendor ID
12508 + * 
12509 + * RETURN: 0 SUCCESS 
12510 + *         1 FAILED 
12511 + * 
12512 + *****************************************************************************************/ 
12513 +unsigned int dslhal_api_setEocVendorId(tidsl_t *ptidsl,char *VendorID) 
12514 +{ 
12515 +  DEV_HOST_oamWrNegoParaDef_t NegoPara;  
12516 +  DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
12517 +  int rc; 
12518 +  dprintf(5," dslhal_api_setEocVendorId()\n"); 
12519 +
12520 +  if(!ptidsl) 
12521 +    { 
12522 +      dprintf(3, "Error: PTIDSL pointer invalid\n"); 
12523 +      return DSLHAL_ERROR_INVALID_PARAM; 
12524 +    }   
12525 +  
12526 +  pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
12527 +  
12528 +  rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
12529 +  if (rc)
12530 +    {
12531 +      dprintf(1,"dslhal_support_blockRead failed\n");
12532 +      return DSLHAL_ERROR_BLOCK_READ;
12533 +    }
12534 +
12535 +  dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p);
12536 +
12537 +
12538 +   rc = dslhal_support_blockRead((PVOID) dspOamSharedInterface.oamWriteNegoParams_p,&NegoPara, sizeof(DEV_HOST_oamWrNegoParaDef_t));
12539 +  if (rc)
12540 +    {
12541 +    dprintf(1,"dslhal_support_blockRead failed\n");
12542 +    return DSLHAL_ERROR_BLOCK_READ;
12543 +    }
12544 +  
12545 +  shim_osMoveMemory(NegoPara.gdmtVendorId,VendorID,8);
12546 +  rc= dslhal_support_blockWrite(&NegoPara,dspOamSharedInterface.oamWriteNegoParams_p, sizeof(DEV_HOST_oamWrNegoParaDef_t));
12547 +    if(rc)
12548 +      return DSLHAL_ERROR_EOCREG_API_FAILURE;
12549 +  
12550 +  dprintf(5," dslhal_api_setEocVendorId() Done\n"); 
12551 +  return DSLHAL_ERROR_NO_ERRORS; 
12552 +} 
12553 +
12554 +/******************************************************************************************   
12555 + * FUNCTION NAME:    dslhal_api_setEocRevisionNumber(tidsl_t *ptidsl,char *RevNum)   
12556 + *   
12557 + *******************************************************************************************   
12558 + * DESCRIPTION: This fuction Sets the eoc Revision Number   
12559 + *   
12560 + * INPUT:  PITIDSLHW_T *ptidsl   
12561 + *         char *RevNum : Input eoc Revision Number 
12562 + *   
12563 + * RETURN: 0 SUCCESS   
12564 + *         1 FAILED   
12565 + *   
12566 + *****************************************************************************************/   
12567 +unsigned int dslhal_api_setEocRevisionNumber(tidsl_t *ptidsl,char *RevNumber)   
12568 +{   
12569 +
12570 +   DEV_HOST_eocVarDef_t eocVar;
12571 +   DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
12572 +   int rc;  
12573 +   /*add for UR2 test */
12574 +   UINT8        selfTestResults[2];
12575 +   memset(selfTestResults,0x00,sizeof(selfTestResults));
12576 +   /* add for UR2 test */
12577 +   dprintf(5," dslhal_api_setEocRevisionNumber()\n");   
12578 +   
12579 +  if(!ptidsl)  
12580 +     {  
12581 +      dprintf(3, "Error: PTIDSL pointer invalid\n");  
12582 +      return DSLHAL_ERROR_INVALID_PARAM;  
12583 +     }  
12584 +
12585 +   pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
12586 +
12587 +   rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
12588 +   if (rc)
12589 +     {
12590 +     dprintf(1,"dslhal_support_blockRead failed\n");
12591 +     return DSLHAL_ERROR_BLOCK_READ;
12592 +     }
12593 +
12594 +  dspOamSharedInterface.eocVar_p = (DEV_HOST_eocVarDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.eocVar_p);
12595 +
12596 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.eocVar_p, 
12597 +                               &eocVar, sizeof(DEV_HOST_eocVarDef_t));
12598 +  
12599 +  if (rc)
12600 +    {
12601 +    dprintf(1,"dslhal_support_blockRead failed\n");
12602 +    return DSLHAL_ERROR_BLOCK_READ;
12603 +    }
12604 +  shim_osMoveMemory(eocVar.revNumber,RevNumber,4);
12605 +  /* add for UR2 test */
12606 +  shim_osMoveMemory(eocVar.dummy,selfTestResults,2);
12607 +  /* add for UR2 test */
12608 +  rc=dslhal_support_blockWrite(&eocVar,dspOamSharedInterface.eocVar_p,sizeof(DEV_HOST_eocVarDef_t)); 
12609 +    if(rc)
12610 +      return DSLHAL_ERROR_EOCREG_API_FAILURE;
12611 +  dprintf(5," dslhal_api_setEocRevisionNumber Done\n");   
12612 +  return DSLHAL_ERROR_NO_ERRORS;   
12613 +}   
12614 +
12615 +/******************************************************************************************      
12616 + * FUNCTION NAME:    dslhal_api_setAturConfig(tidsl_t *ptidsl,char *ATURConfig)      
12617 + *      
12618 + *******************************************************************************************      
12619 + * DESCRIPTION: This fuction Sets the eoc ATUR Config Register  
12620 + *      
12621 + * INPUT:  PITIDSLHW_T *ptidsl      
12622 + *         char *ATURConfig : Input eoc ATUR Config Register    
12623 + *      
12624 + * RETURN: 0 SUCCESS      
12625 + *         1 FAILED      
12626 + *      
12627 + *****************************************************************************************/      
12628 +unsigned int dslhal_api_setAturConfig(tidsl_t *ptidsl,char *ATURConfig)
12629 +{    
12630 +
12631 +  DEV_HOST_eocVarDef_t eocVar;
12632 +  DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
12633 +  int rc;  
12634 +  dprintf(5," dslhal_api_setAturConfig()\n");    
12635 +
12636 +  if(!ptidsl)  
12637 +     {  
12638 +      dprintf(3, "Error: PTIDSL pointer invalid\n");  
12639 +      return DSLHAL_ERROR_INVALID_PARAM;  
12640 +     }  
12641 +
12642 +  pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
12643 +  
12644 +  rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
12645 +  if (rc)
12646 +    {
12647 +    dprintf(1,"dslhal_support_blockRead failed\n");
12648 +    return DSLHAL_ERROR_BLOCK_READ;
12649 +    }
12650 +  
12651 +  dspOamSharedInterface.eocVar_p = (DEV_HOST_eocVarDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.eocVar_p);
12652 +  
12653 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.eocVar_p,
12654 +                                     &eocVar, sizeof(DEV_HOST_eocVarDef_t));
12655 +  
12656 +  if (rc)
12657 +    {
12658 +    dprintf(1,"dslhal_support_blockRead failed\n");
12659 +    return DSLHAL_ERROR_BLOCK_READ;
12660 +    }  
12661 +     shim_osMoveMemory(eocVar.aturConfig,ATURConfig,30);
12662 +   rc= dslhal_support_blockWrite(&eocVar,dspOamSharedInterface.eocVar_p,sizeof(DEV_HOST_eocVarDef_t)); 
12663 +    if(rc)
12664 +      return DSLHAL_ERROR_EOCREG_API_FAILURE;
12665 +  dprintf(5," dslhal_api_setAturConfig() Done\n");    
12666 +  return DSLHAL_ERROR_NO_ERRORS;   
12667 +}
12668 +
12669 +
12670 +/******************************************************************************************
12671 +* FUNCTION NAME:    dslhal_api_setRateAdaptFlag(tidsl_t *ptidsl,unsigned int flag)
12672 +*
12673 +*******************************************************************************************
12674 +* DESCRIPTION: This fuction Sets the Rate Adapt Enable Flag
12675 +*
12676 +* INPUT:  PITIDSLHW_T *ptidsl
12677 +*         unsigned int flag; //if flag = TRUE set rateadapt flag else reset it
12678 +* RETURN: 0 SUCCESS
12679 +*         1 FAILED
12680 +*
12681 +*****************************************************************************************/
12682 +unsigned int dslhal_api_setRateAdaptFlag(tidsl_t *ptidsl,unsigned int flag)
12683 +{
12684 +   DEV_HOST_msg_t aturMsg;
12685 +   DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
12686 +   int rc;
12687 +   dprintf(5," dslhal_api_setRateAdaptFlag()\n");
12688 +   
12689 +  if(!ptidsl)  
12690 +     {  
12691 +      dprintf(3, "Error: PTIDSL pointer invalid\n");  
12692 +      return DSLHAL_ERROR_INVALID_PARAM;  
12693 +     }  
12694 +
12695 +   pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
12696 +   
12697 +   rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
12698 +   if (rc)
12699 +     {
12700 +      dprintf(1,"dslhal_support_blockRead failed\n");
12701 +      return DSLHAL_ERROR_BLOCK_READ;
12702 +     }
12703 +   
12704 +   dspOamSharedInterface.aturMsg_p = (DEV_HOST_msg_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.aturMsg_p);
12705 +   rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.aturMsg_p,
12706 +                                      &aturMsg, sizeof(DEV_HOST_msg_t));
12707 +   if (rc)
12708 +     {
12709 +      dprintf(1,"dslhal_support_blockRead failed\n");
12710 +      return DSLHAL_ERROR_BLOCK_READ;
12711 +     }
12712 +   
12713 +   if(flag)
12714 +     aturMsg.rateAdapt = TRUE;
12715 +   else
12716 +     aturMsg.rateAdapt = FALSE;
12717 +   
12718 +   rc= dslhal_support_blockWrite(&aturMsg,dspOamSharedInterface.aturMsg_p,sizeof(DEV_HOST_msg_t)); 
12719 +   if(rc)
12720 +     return DSLHAL_ERROR_CONFIG_API_FAILURE;
12721 +   dprintf(5," dslhal_api_setRateAdaptFlag() Done\n");
12722 +   return DSLHAL_ERROR_NO_ERRORS;
12723 +}
12724 +
12725 +/******************************************************************************************
12726 +* FUNCTION NAME:    dslhal_api_setTrellisFlag(tidsl_t *ptidsl,unsigned int flag)
12727 +*
12728 +*******************************************************************************************
12729 +* DESCRIPTION: This fuction Sets the Trellis Coding Enable Flag
12730 +*
12731 +* INPUT:  PITIDSLHW_T *ptidsl
12732 +*         unsigned int flag;  // if flag = TRUE, set trellis flag else reset
12733 +* RETURN: 0 SUCCESS
12734 +*         1 FAILED
12735 +*
12736 +*****************************************************************************************/
12737 +unsigned int dslhal_api_setTrellisFlag(tidsl_t *ptidsl,unsigned int flag)
12738 +{
12739 +
12740 +   DEV_HOST_msg_t aturMsg;
12741 +   DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
12742 +   DEV_HOST_oamWrNegoParaDef_t negoPara;
12743 +   int rc;
12744 +   dprintf(5," dslhal_api_setTrellisFlag()\n");   
12745 +   if(!ptidsl)
12746 +     {
12747 +       dprintf(3, "Error: PTIDSL pointer invalid\n");
12748 +       return DSLHAL_ERROR_INVALID_PARAM;
12749 +     }
12750 +   pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
12751 +   
12752 +   rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
12753 +   if (rc)
12754 +     {
12755 +       dprintf(1,"dslhal_support_blockRead failed\n");
12756 +       return DSLHAL_ERROR_BLOCK_READ;
12757 +     }
12758 +   
12759 +   dspOamSharedInterface.aturMsg_p = (DEV_HOST_msg_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.aturMsg_p);
12760 +   rc += dslhal_support_blockRead((PVOID)dspOamSharedInterface.aturMsg_p,&aturMsg, sizeof(DEV_HOST_msg_t));
12761 +   dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p);
12762 +   rc += dslhal_support_blockRead((PVOID) dspOamSharedInterface.oamWriteNegoParams_p,&negoPara, sizeof(DEV_HOST_oamWrNegoParaDef_t));
12763 +   if (rc)
12764 +     {
12765 +       dprintf(1,"dslhal_support_blockRead failed\n");
12766 +       return DSLHAL_ERROR_BLOCK_READ;
12767 +     }
12768 +
12769 +  if(flag)
12770 +    {
12771 +      aturMsg.trellis = TRUE;
12772 +      negoPara.rMsgs1[2] |= 0x02;
12773 +    }
12774 +  else
12775 +    {
12776 +      aturMsg.trellis = FALSE;
12777 +      negoPara.rMsgs1[2] &= 0xFD;
12778 +    }   
12779 +  rc=0;
12780 +  rc+=dslhal_support_blockWrite(&aturMsg,dspOamSharedInterface.aturMsg_p,sizeof(DEV_HOST_msg_t)); 
12781 +  rc+= dslhal_support_blockWrite(&negoPara,dspOamSharedInterface.oamWriteNegoParams_p, sizeof(DEV_HOST_oamWrNegoParaDef_t));
12782 +  if(rc)
12783 +     return DSLHAL_ERROR_CONFIG_API_FAILURE;
12784 +
12785 +  dprintf(5," dslhal_api_setTrellisFlag() Done\n");
12786 +  return DSLHAL_ERROR_NO_ERRORS;
12787 +}
12788 +
12789 +/******************************************************************************************
12790 +* FUNCTION NAME:    dslhal_api_setMaxBitsPerCarrier(tidsl_t *ptidsl,unsigned int maxbits)
12791 +*
12792 +*******************************************************************************************
12793 +* DESCRIPTION: This fuction Sets the Maximum bits per carrier value
12794 +*
12795 +* INPUT:  PITIDSLHW_T *ptidsl
12796 +*         unsigned int maxbits : should be a value between 0-15
12797 +*
12798 +* RETURN: 0 SUCCESS
12799 +*         1 FAILED
12800 +*
12801 +*****************************************************************************************/
12802 +unsigned int dslhal_api_setMaxBitsPerCarrier(tidsl_t *ptidsl,unsigned int maxbits)
12803 +{
12804 +
12805 +   DEV_HOST_msg_t aturMsg;
12806 +   DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
12807 +   int rc;
12808 +
12809 +   dprintf(5," dslhal_api_setMaxBitsPerCarrier()\n");
12810 +   if(maxbits>15)
12811 +     {
12812 +       dprintf(3,"Maximum Number of Bits per carrier cannot exceed 15!\n");
12813 +       return DSLHAL_ERROR_INVALID_PARAM;
12814 +     }
12815 +
12816 +   if(!ptidsl)
12817 +    {
12818 +      dprintf(3, "Error: PTIDSL pointer invalid\n");
12819 +       return DSLHAL_ERROR_INVALID_PARAM;
12820 +    }
12821 +   pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
12822 +   
12823 +   rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
12824 +   if (rc)
12825 +     {
12826 +       dprintf(1,"dslhal_support_blockRead failed\n");
12827 +       return DSLHAL_ERROR_BLOCK_READ;
12828 +     }
12829 +   
12830 +   dspOamSharedInterface.aturMsg_p = (DEV_HOST_msg_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.aturMsg_p);
12831 +   rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.aturMsg_p,
12832 +                                      &aturMsg, sizeof(DEV_HOST_msg_t));
12833 +   if (rc)
12834 +     {
12835 +       dprintf(1,"dslhal_support_blockRead failed\n");
12836 +       return DSLHAL_ERROR_BLOCK_READ;
12837 +     }
12838 +
12839 +  aturMsg.maxBits = maxbits;
12840 +   
12841 +   rc=dslhal_support_blockWrite(&aturMsg,dspOamSharedInterface.aturMsg_p,sizeof(DEV_HOST_msg_t)); 
12842 +   if(rc)
12843 +     return DSLHAL_ERROR_CONFIG_API_FAILURE;
12844 +   dprintf(5," dslhal_api_setMaxBitsPerCarrier() Done\n");
12845 +  return DSLHAL_ERROR_NO_ERRORS;
12846 +}
12847 +
12848 +
12849 +/******************************************************************************************
12850 +* FUNCTION NAME:    dslhal_api_setMaxInterleaverDepth(tidsl_t *ptidsl,unsigned int maxdepth)
12851 +*
12852 +*******************************************************************************************
12853 +* DESCRIPTION: This fuction Sets the Maximum Interleave Depth Supported
12854 +*
12855 +* INPUT:  PITIDSLHW_T *ptidsl
12856 +*         unsigned int maxdepth : Should be between 0 and 3 depending on intlv buffer
12857 +*                                 size 64-512
12858 +* RETURN: 0 SUCCESS
12859 +*         1 FAILED
12860 +*
12861 +*****************************************************************************************/
12862 +unsigned int dslhal_api_setMaxInterleaverDepth(tidsl_t *ptidsl,unsigned int maxdepth)
12863 +{
12864 +   DEV_HOST_msg_t aturMsg;
12865 +   DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
12866 +   int rc;
12867 +   dprintf(5," dslhal_api_setMaxInterleaverDepth()\n");
12868 +   if(maxdepth>3)
12869 +     {
12870 +       dprintf(3,"Invalid Value for maximum interleave depth (must be <3)\n");
12871 +       return DSLHAL_ERROR_INVALID_PARAM;
12872 +     }
12873 +
12874 +   if(!ptidsl)
12875 +    {
12876 +      dprintf(3, "Error: PTIDSL pointer invalid\n");
12877 +       return DSLHAL_ERROR_INVALID_PARAM;
12878 +    }
12879 +   pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
12880 +   
12881 +   rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
12882 +   if (rc)
12883 +     {
12884 +       dprintf(1,"dslhal_support_blockRead failed\n");
12885 +       return DSLHAL_ERROR_BLOCK_READ;
12886 +     }
12887 +   
12888 +   dspOamSharedInterface.aturMsg_p = (DEV_HOST_msg_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.aturMsg_p);
12889 +   rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.aturMsg_p,
12890 +                                      &aturMsg, sizeof(DEV_HOST_msg_t));
12891 +   if (rc)
12892 +     {
12893 +       dprintf(1,"dslhal_support_blockRead failed\n");
12894 +       return DSLHAL_ERROR_BLOCK_READ;
12895 +     }
12896 +
12897 +  aturMsg.maxIntlvDepth = maxdepth;
12898 +   
12899 +   rc=dslhal_support_blockWrite(&aturMsg,dspOamSharedInterface.aturMsg_p,sizeof(DEV_HOST_msg_t)); 
12900 +   if(rc)
12901 +     return DSLHAL_ERROR_CONFIG_API_FAILURE;
12902 +   dprintf(5," dslhal_api_setMaxInterleaverDepth() Done\n");
12903 +   return DSLHAL_ERROR_NO_ERRORS;
12904 +}
12905 +
12906 +/********************************************************************************************
12907 +* FUNCTION NAME: dslhal_api_acknowledgeInterrupt()
12908 +*
12909 +*********************************************************************************************
12910 +* DESCRIPTION:
12911 +*   Sets the host interrupt bit masks
12912 +*
12913 +* Return: 0  success
12914 +*         1  failed
12915 +* 
12916 +* NOTE: 
12917 +*   DSP image is based on LITTLE endian
12918 +*
12919 +********************************************************************************************/
12920 +unsigned int dslhal_api_acknowledgeInterrupt(tidsl_t * ptidsl)
12921 +{
12922 +  unsigned int interruptSources=0;
12923 +  /* Clear out the DSLSS Interrupt Registers to acknowledge Interrupt */
12924 +  if(DSLHAL_REG32(dslhal_support_hostDspAddressTranslate(DSP_INTERRUPT_SOURCE_REGISTER))&MASK_MAILBOX_INTERRUPTS)
12925 +    {
12926 +      DSLHAL_REG32(dslhal_support_hostDspAddressTranslate(DSP_INTERRUPT_CLEAR_REGISTER))|=MASK_MAILBOX_INTERRUPTS;
12927 +      dprintf(5,"Mailbox Interrupt \n");
12928 +    }
12929 +  if(DSLHAL_REG32(dslhal_support_hostDspAddressTranslate(DSP_INTERRUPT_SOURCE_REGISTER))&MASK_BITFIELD_INTERRUPTS)
12930 +    {
12931 +      DSLHAL_REG32(dslhal_support_hostDspAddressTranslate(DSP_INTERRUPT_CLEAR_REGISTER))|=MASK_BITFIELD_INTERRUPTS;
12932 +      dprintf(5,"Bitfield Interrupt \n");
12933 +    }
12934 +  if(DSLHAL_REG32(dslhal_support_hostDspAddressTranslate(DSP_INTERRUPT_SOURCE_REGISTER))&MASK_HEARTBEAT_INTERRUPTS)
12935 +    {
12936 +      DSLHAL_REG32(dslhal_support_hostDspAddressTranslate(DSP_INTERRUPT_CLEAR_REGISTER))|=MASK_HEARTBEAT_INTERRUPTS;
12937 +      dprintf(5,"HeartBeat Interrupt \n");
12938 +    }
12939 +  interruptSources = dslhal_support_parseInterruptSource(ptidsl);
12940 +  if(interruptSources < 0)
12941 +    return DSLHAL_ERROR_INTERRUPT_FAILURE;
12942 +  else  
12943 +    return interruptSources;
12944 +}
12945 +
12946 +/********************************************************************************************
12947 +* FUNCTION NAME: dslhal_api_disableDspHybridSelect()
12948 +*
12949 +*********************************************************************************************
12950 +* DESCRIPTION:
12951 +*   Sets the host interrupt bit masks
12952 +*
12953 +* Return: 0  success
12954 +*         1  failed
12955 +* 
12956 +* NOTE: 
12957 +*   DSP image is based on LITTLE endian
12958 +*
12959 +********************************************************************************************/
12960 +unsigned int dslhal_api_disableDspHybridSelect(tidsl_t * ptidsl,unsigned int disable)
12961 +{
12962 +  int rc;
12963 +  DEV_HOST_phyPerf_t phyPerf;
12964 +  DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
12965 +  pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
12966 +   
12967 +   rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
12968 +   if (rc)
12969 +     {
12970 +       dprintf(1,"dslhal_support_blockRead failed\n");
12971 +       return DSLHAL_ERROR_BLOCK_READ;
12972 +     }
12973 +   
12974 +   dspOamSharedInterface.phyPerf_p = (DEV_HOST_phyPerf_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.phyPerf_p);
12975 +   rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.phyPerf_p,
12976 +                                      &phyPerf, sizeof(DEV_HOST_phyPerf_t));
12977 +   if (rc)
12978 +     {
12979 +       dprintf(1,"dslhal_support_blockRead failed\n");
12980 +       return DSLHAL_ERROR_BLOCK_READ;
12981 +     }
12982 +   if(disable==1)
12983 +     {
12984 +       phyPerf.disableDspHybridSelect_f = TRUE;
12985 +       //       hybrid_selected = 888;
12986 +     }
12987 +   else
12988 +     {
12989 +       phyPerf.disableDspHybridSelect_f = FALSE;
12990 +       //       hybrid_selected = 888;
12991 +     }
12992 +  rc=dslhal_support_blockWrite(&phyPerf,dspOamSharedInterface.phyPerf_p,sizeof(DEV_HOST_phyPerf_t)); 
12993 +   if(rc)
12994 +     return DSLHAL_ERROR_HYBRID_API_FAILURE;
12995 +   else
12996 +     return DSLHAL_ERROR_NO_ERRORS;
12997 +}
12998 +
12999 +/********************************************************************************************
13000 +* FUNCTION NAME: dslhal_api_selectHybrid()
13001 +*
13002 +*********************************************************************************************
13003 +* DESCRIPTION:
13004 +*   Sets the host interrupt bit masks
13005 +*
13006 +* Return: 0  success
13007 +*         1  failed
13008 +* 
13009 +* NOTE: 
13010 +*   DSP image is based on LITTLE endian
13011 +*
13012 +********************************************************************************************/
13013 +unsigned int dslhal_api_selectHybrid(tidsl_t * ptidsl,unsigned int hybridNum)
13014 +{
13015 +  int rc;
13016 +  DEV_HOST_phyPerf_t phyPerf;
13017 +  DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
13018 +  if(hybridNum<1||hybridNum>4)
13019 +   {
13020 +     dprintf(3,"Invalid Value for Hybrid Number \n");
13021 +     return DSLHAL_ERROR_INVALID_PARAM;
13022 +   }
13023 +
13024 +  if(!ptidsl)
13025 +   {
13026 +     dprintf(3, "Error: PTIDSL pointer invalid\n");
13027 +     return DSLHAL_ERROR_INVALID_PARAM;
13028 +   }
13029 +  pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
13030 +   
13031 +   rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
13032 +   if (rc)
13033 +     {
13034 +       dprintf(1,"dslhal_support_blockRead failed\n");
13035 +       return DSLHAL_ERROR_BLOCK_READ;
13036 +     }
13037 +   
13038 +   dspOamSharedInterface.phyPerf_p = (DEV_HOST_phyPerf_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.phyPerf_p);
13039 +   rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.phyPerf_p,
13040 +                                      &phyPerf, sizeof(DEV_HOST_phyPerf_t));
13041 +   if (rc)
13042 +     {
13043 +       dprintf(1,"dslhal_support_blockRead failed\n");
13044 +       return DSLHAL_ERROR_BLOCK_READ;
13045 +     }
13046 +   phyPerf.hostSelectHybridNum = hybridNum;
13047 +   rc=dslhal_support_blockWrite(&phyPerf,dspOamSharedInterface.phyPerf_p,sizeof(DEV_HOST_phyPerf_t)); 
13048 +   if(rc)
13049 +     return DSLHAL_ERROR_HYBRID_API_FAILURE;
13050 +   else
13051 +     return DSLHAL_ERROR_NO_ERRORS;
13052 +}
13053 +
13054 +/********************************************************************************************
13055 +* FUNCTION NAME: dslhal_api_reportHybridMetrics()
13056 +*
13057 +*********************************************************************************************
13058 +* DESCRIPTION:
13059 +*   Sets the host interrupt bit masks
13060 +*
13061 +* Return: 0  success
13062 +*         1  failed
13063 +* 
13064 +* NOTE: 
13065 +*   DSP image is based on LITTLE endian
13066 +*
13067 +********************************************************************************************/
13068 +unsigned int dslhal_api_reportHybridMetrics(tidsl_t * ptidsl,int *metric)
13069 +{
13070 +  int rc,i;
13071 +  DEV_HOST_phyPerf_t phyPerf;
13072 +  DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
13073 +  if(hybrid_selected>5)
13074 +    {
13075 +      dprintf(4,"Hybrid Metrics Not Yet Available \n");
13076 +    }
13077 +  if(!ptidsl)
13078 +   {
13079 +     dprintf(3, "Error: PTIDSL pointer invalid\n");
13080 +     return (0-DSLHAL_ERROR_INVALID_PARAM);
13081 +   }  
13082 +  pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
13083 +   
13084 +   rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
13085 +   if (rc)
13086 +     {
13087 +       dprintf(1,"dslhal_support_blockRead failed\n");
13088 +       return (0-DSLHAL_ERROR_BLOCK_READ);
13089 +     }
13090 +   
13091 +   dspOamSharedInterface.phyPerf_p = (DEV_HOST_phyPerf_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.phyPerf_p);
13092 +   rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.phyPerf_p,
13093 +                                      &phyPerf, sizeof(DEV_HOST_phyPerf_t));
13094 +   if (rc)
13095 +     {
13096 +       dprintf(1,"dslhal_support_blockRead failed\n");
13097 +       return (0-DSLHAL_ERROR_BLOCK_READ);
13098 +     }
13099 +   rc = sizeof(phyPerf.hybridCost);
13100 +   for(i=0;i<(rc/4);i++)
13101 +     {
13102 +       metric[i] = dslhal_support_byteSwap32(phyPerf.hybridCost[i]);
13103 +     }
13104 +   return hybrid_selected;
13105 +}
13106 +
13107 +/******************************************************************************************    
13108 + * FUNCTION NAME:    dslhal_api_selectInnerOuterPair(tidsl_t *ptidsl,unsigned int pairSelect)
13109 + *    
13110 + *******************************************************************************************    
13111 + * DESCRIPTION: This fuction selects inner/outer pair on RJ11.  
13112 + *    
13113 + * INPUT:  PITIDSLHW_T *ptidsl , unsigned int pairSelect
13114 + *           
13115 + * RETURN: 0 SUCCESS    
13116 + *         1 FAILED    
13117 + *      
13118 + *****************************************************************************************/    
13119 +unsigned int dslhal_api_selectInnerOuterPair(tidsl_t *ptidsl,unsigned int pairSelect)
13120 +{
13121 +   int rc; 
13122 +   
13123 +   dprintf(5, "dslhal_api_sendQuiet\n"); 
13124 +   rc = dslhal_support_writeHostMailbox(ptidsl, HOST_RJ11SELECT, (unsigned int)pairSelect, 0, 0); 
13125 +   if(rc)
13126 +    {  
13127 +      dprintf(1,"dslhal_api_sendQuiet failed\n");  
13128 +      return DSLHAL_ERROR_CTRL_API_FAILURE;    
13129 +    }  
13130 +    return DSLHAL_ERROR_NO_ERRORS;
13131 +}
13132 +
13133 +/******************************************************************************************    
13134 + * FUNCTION NAME:    dslhal_api_resetTrainFailureLog(tidsl_t *ptidsl)
13135 + *    
13136 + *******************************************************************************************    
13137 + * DESCRIPTION: This fuction resets the failed state log stored
13138 + *    
13139 + * INPUT:  PITIDSLHW_T *ptidsl
13140 + *           
13141 + * RETURN: 0 SUCCESS    
13142 + *         1 FAILED    
13143 + *      
13144 + *****************************************************************************************/    
13145 +unsigned int dslhal_api_resetTrainFailureLog(tidsl_t *ptidsl)
13146 +{
13147 +    
13148 +   int rc;
13149 +   dprintf(5, "dslhal_api_resetTrainFailureLog \n"); 
13150 +   for(rc=0;rc<ptidsl->AppData.trainFails;rc++)
13151 +     {
13152 +       ptidsl->AppData.trainFailStates[rc]=0;
13153 +     }
13154 +   ptidsl->AppData.trainFails = 0;
13155 +   return DSLHAL_ERROR_NO_ERRORS; 
13156 +}
13157 +
13158 +/********************************************************************************************
13159 +* FUNCTION NAME: dslhal_api_configureLed()
13160 +*
13161 +*********************************************************************************************
13162 +* DESCRIPTION:
13163 +*   Sets the host interrupt bit masks
13164 +*
13165 +* Return: 0  success
13166 +*         1  failed
13167 +* 
13168 +* NOTE: 
13169 +*   DSP image is based on LITTLE endian
13170 +*
13171 +********************************************************************************************/
13172 +unsigned int dslhal_api_configureLed(tidsl_t * ptidsl,unsigned int idLed, unsigned int onOff)
13173 +{
13174 +  int rc;
13175 +  DEV_HOST_modemEnvPublic_t modemEnv;
13176 +  DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
13177 +  if(idLed>2 || onOff>2)
13178 +   {
13179 +     dprintf(3,"Invalid input parameter \n");
13180 +     return DSLHAL_ERROR_INVALID_PARAM;
13181 +   }
13182 +
13183 +  if(!ptidsl)
13184 +   {
13185 +     dprintf(3, "Error: PTIDSL pointer invalid\n");
13186 +     return DSLHAL_ERROR_INVALID_PARAM;
13187 +   }
13188 +  pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
13189 +   
13190 +   rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
13191 +   if (rc)
13192 +     {
13193 +       dprintf(1,"dslhal_support_blockRead failed\n");
13194 +       return DSLHAL_ERROR_BLOCK_READ;
13195 +     }
13196 +   
13197 +   dspOamSharedInterface.modemEnvPublic_p = (DEV_HOST_modemEnvPublic_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.modemEnvPublic_p);
13198 +   rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.modemEnvPublic_p,
13199 +                                      &modemEnv, sizeof(DEV_HOST_modemEnvPublic_t));
13200 +   if (rc)
13201 +     {
13202 +       dprintf(1,"dslhal_support_blockRead failed\n");
13203 +       return DSLHAL_ERROR_BLOCK_READ;
13204 +     }
13205 +   if(idLed==ID_DSL_LINK_LED)
13206 +     {
13207 +       modemEnv.overrideDslLinkLed_f = TRUE;
13208 +       if(onOff!=2)
13209 +          modemEnv.dslLinkLedState_f = onOff;
13210 +     }
13211 +   if(idLed==ID_DSL_ACT_LED)
13212 +     {
13213 +       modemEnv.overrideDslLinkLed_f = TRUE;
13214 +       if(onOff!=2)
13215 +          modemEnv.dslLinkLedState_f = onOff;
13216 +     }
13217 +   if(idLed==ID_RESTORE_DEFAULT_LED)
13218 +     {
13219 +       modemEnv.overrideDslLinkLed_f = FALSE;
13220 +       modemEnv.overrideDslActLed_f = FALSE;
13221 +     }
13222 +   rc=dslhal_support_blockWrite(&modemEnv,dspOamSharedInterface.modemEnvPublic_p,sizeof(DEV_HOST_modemEnvPublic_t)); 
13223 +   if(rc)
13224 +     return DSLHAL_ERROR_MODEMENV_API_FAILURE;
13225 +   else
13226 +     return DSLHAL_ERROR_NO_ERRORS;
13227 +}
13228 +
13229 +/********************************************************************************************
13230 +* FUNCTION NAME: dslhal_api_configureExternBert()
13231 +*
13232 +*********************************************************************************************
13233 +* DESCRIPTION:
13234 +*   Sets the host interrupt bit masks
13235 +*
13236 +* Return: 0  success
13237 +*         1  failed
13238 +* 
13239 +* NOTE: 
13240 +*   DSP image is based on LITTLE endian
13241 +*
13242 +********************************************************************************************/
13243 +unsigned int dslhal_api_configureExternBert(tidsl_t * ptidsl,unsigned int configParm, unsigned int parmVal)
13244 +{
13245 +  int rc;
13246 +  DEV_HOST_modemEnvPublic_t modemEnv;
13247 +  DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
13248 +  if(configParm>1 || parmVal>1)
13249 +   {
13250 +     dprintf(3,"Invalid input parameter \n");
13251 +     return DSLHAL_ERROR_INVALID_PARAM;
13252 +   }
13253 +
13254 +  if(!ptidsl)
13255 +   {
13256 +     dprintf(3, "Error: PTIDSL pointer invalid\n");
13257 +     return DSLHAL_ERROR_INVALID_PARAM;
13258 +   }
13259 +  pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
13260 +   
13261 +   rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
13262 +   if (rc)
13263 +     {
13264 +       dprintf(1,"dslhal_support_blockRead failed\n");
13265 +       return DSLHAL_ERROR_BLOCK_READ;
13266 +     }
13267 +   
13268 +   dspOamSharedInterface.modemEnvPublic_p = (DEV_HOST_modemEnvPublic_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.modemEnvPublic_p);
13269 +   rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.modemEnvPublic_p,
13270 +                                      &modemEnv, sizeof(DEV_HOST_modemEnvPublic_t));
13271 +   if (rc)
13272 +     {
13273 +       dprintf(1,"dslhal_support_blockRead failed\n");
13274 +       return DSLHAL_ERROR_BLOCK_READ;
13275 +     }
13276 +   if(configParm==0)
13277 +     {
13278 +       modemEnv.externalBert = parmVal;
13279 +     }
13280 +   if(configParm==1)
13281 +     {
13282 +       modemEnv.usBertPattern = parmVal;
13283 +     }
13284 +   rc=dslhal_support_blockWrite(&modemEnv,dspOamSharedInterface.modemEnvPublic_p,sizeof(DEV_HOST_modemEnvPublic_t)); 
13285 +   if(rc)
13286 +     return DSLHAL_ERROR_MODEMENV_API_FAILURE;
13287 +   else
13288 +     return DSLHAL_ERROR_NO_ERRORS;
13289 +}
13290 +
13291 +/********************************************************************************************
13292 +* FUNCTION NAME: dslhal_api_configureAtmBert()
13293 +*
13294 +*********************************************************************************************
13295 +* DESCRIPTION:
13296 +*   Sets the host interrupt bit masks
13297 +*
13298 +* Return: 0  success
13299 +*         1  failed
13300 +* 
13301 +* NOTE: 
13302 +*   DSP image is based on LITTLE endian
13303 +*
13304 +********************************************************************************************/
13305 +unsigned int dslhal_api_configureAtmBert(tidsl_t * ptidsl,unsigned int configParm, unsigned int parmVal)
13306 +{
13307 +  int rc;
13308 +  DEV_HOST_atmDsBert_t atmDsBert;
13309 +  DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
13310 +  if(configParm>1 || parmVal>1)
13311 +   {
13312 +     dprintf(3,"Invalid input parameter \n");
13313 +     return DSLHAL_ERROR_INVALID_PARAM;
13314 +   }
13315 +
13316 +  if(!ptidsl)
13317 +   {
13318 +     dprintf(3, "Error: PTIDSL pointer invalid\n");
13319 +     return DSLHAL_ERROR_INVALID_PARAM;
13320 +   }
13321 +  pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
13322 +   
13323 +   rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
13324 +   if (rc)
13325 +     {
13326 +       dprintf(1,"dslhal_support_blockRead failed\n");
13327 +       return DSLHAL_ERROR_BLOCK_READ;
13328 +     }
13329 +   
13330 +   dspOamSharedInterface.atmDsBert_p = (DEV_HOST_atmDsBert_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.atmDsBert_p);
13331 +   rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.atmDsBert_p,
13332 +                                      &atmDsBert, sizeof(DEV_HOST_atmDsBert_t));
13333 +   if (rc)
13334 +     {
13335 +       dprintf(1,"dslhal_support_blockRead failed\n");
13336 +       return DSLHAL_ERROR_BLOCK_READ;
13337 +     }
13338 +   if(configParm==0)
13339 +     {
13340 +       atmDsBert.atmBertFlag = parmVal;
13341 +       rc=dslhal_support_blockWrite(&atmDsBert,dspOamSharedInterface.atmDsBert_p,sizeof(DEV_HOST_atmDsBert_t)); 
13342 +       if(rc)
13343 +         return DSLHAL_ERROR_CONFIG_API_FAILURE;
13344 +     }
13345 +   if(configParm==1)
13346 +     {
13347 +       ptidsl->AppData.atmBertBitCountLow = atmDsBert.bitCountLow;
13348 +       ptidsl->AppData.atmBertBitCountHigh = atmDsBert.bitCountHigh;
13349 +       ptidsl->AppData.atmBertBitErrorCountLow = atmDsBert.bitErrorCountLow;
13350 +       ptidsl->AppData.atmBertBitErrorCountHigh = atmDsBert.bitErrorCountHigh;
13351 +     }
13352 +   return DSLHAL_ERROR_NO_ERRORS;
13353 +}
13354 +
13355 +/********************************************************************************************
13356 +* FUNCTION NAME: dslhal_api_configureDgaspLpr()
13357 +*
13358 +*********************************************************************************************
13359 +* DESCRIPTION:
13360 +*   Configures dying gasp LPR signal
13361 +*
13362 +* Return: 0  success
13363 +*         1  failed
13364 +* 
13365 +* NOTE: 
13366 +*   DSP image is based on LITTLE endian
13367 +*
13368 +********************************************************************************************/
13369 +unsigned int dslhal_api_configureDgaspLpr(tidsl_t * ptidsl,unsigned int configParm, unsigned int parmVal)
13370 +{
13371 +  int rc;
13372 +  DEV_HOST_modemEnvPublic_t modemEnv;
13373 +  DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
13374 +  if(configParm>1 || parmVal>1)
13375 +   {
13376 +     dprintf(3,"Invalid input parameter \n");
13377 +     return DSLHAL_ERROR_INVALID_PARAM;
13378 +   }
13379 +
13380 +  if(!ptidsl)
13381 +   {
13382 +     dprintf(3, "Error: PTIDSL pointer invalid\n");
13383 +     return DSLHAL_ERROR_INVALID_PARAM;
13384 +   }
13385 +  pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
13386 +   
13387 +   rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
13388 +   if (rc)
13389 +     {
13390 +       dprintf(1,"dslhal_support_blockRead failed\n");
13391 +       return DSLHAL_ERROR_BLOCK_READ;
13392 +     }
13393 +   
13394 +   dspOamSharedInterface.modemEnvPublic_p = (DEV_HOST_modemEnvPublic_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.modemEnvPublic_p);
13395 +   rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.modemEnvPublic_p,
13396 +                                      &modemEnv, sizeof(DEV_HOST_modemEnvPublic_t));
13397 +   if (rc)
13398 +     {
13399 +       dprintf(1,"dslhal_support_blockRead failed\n");
13400 +       return DSLHAL_ERROR_BLOCK_READ;
13401 +     }
13402 +   if(configParm==0)
13403 +     {
13404 +       modemEnv.dGaspLprIndicator_f = parmVal;
13405 +     }
13406 +   if(configParm==1)
13407 +     {
13408 +       modemEnv.overrideDspLprGasp_f = parmVal;
13409 +     }
13410 +   rc=dslhal_support_blockWrite(&modemEnv,dspOamSharedInterface.modemEnvPublic_p,sizeof(DEV_HOST_modemEnvPublic_t)); 
13411 +   if(rc)
13412 +     return DSLHAL_ERROR_MODEMENV_API_FAILURE;
13413 +   else
13414 +     return DSLHAL_ERROR_NO_ERRORS;
13415 +}
13416 +
13417 +/********************************************************************************************
13418 +* FUNCTION NAME: dslhal_api_genericDspRead()
13419 +*
13420 +*********************************************************************************************
13421 +* DESCRIPTION:
13422 +*   Reads from a Generic Location in the DSP Host Interface
13423 +*
13424 +* Return: 0  success
13425 +*         1  failed
13426 +* 
13427 +* NOTE: 
13428 +*   DSP image is based on LITTLE endian
13429 +*
13430 +********************************************************************************************/
13431 +unsigned int dslhal_api_genericDspRead(tidsl_t * ptidsl,unsigned int offset1, unsigned int offset2, 
13432 +                                       unsigned int offset3, unsigned char *localBuffer, unsigned int numBytes)
13433 +{
13434 +  int rc=0;
13435 +  unsigned int  hostIfLoc,structLoc,elementLoc;
13436 +  hostIfLoc = (unsigned int)ptidsl->pmainAddr;
13437 +  if(numBytes<=0 || !localBuffer || !ptidsl)
13438 +   {
13439 +     dprintf(3,"Invalid input parameter \n");
13440 +     return DSLHAL_ERROR_INVALID_PARAM;
13441 +   }
13442 +  rc += dslhal_support_blockRead((PVOID)(hostIfLoc+sizeof(int)*offset1), &structLoc,sizeof(int));
13443 +  structLoc = dslhal_support_byteSwap32(structLoc);  
13444 +  rc += dslhal_support_blockRead((PVOID)(structLoc+sizeof(int)*offset2), &elementLoc,sizeof(int));
13445 +  elementLoc = dslhal_support_byteSwap32(elementLoc);    
13446 +  dprintf(3,"Host IF Location: 0x%x  Struct1 Location: 0x%x Element Location: 0x%x \n",hostIfLoc, structLoc, elementLoc);
13447 +  rc += dslhal_support_blockRead((PVOID)(elementLoc+(offset3*4)), localBuffer,numBytes);
13448 +  if (rc)
13449 +       return DSLHAL_ERROR_BLOCK_READ;
13450 +  return DSLHAL_ERROR_NO_ERRORS;
13451 +}
13452 +
13453 +/********************************************************************************************
13454 +* FUNCTION NAME: dslhal_api_genericDspWrite()
13455 +*
13456 +*********************************************************************************************
13457 +* DESCRIPTION:
13458 +*   Writes to a Generic Location in the DSP Host Interface
13459 +*
13460 +* Return: 0  success
13461 +*         1  failed
13462 +* 
13463 +* NOTE: 
13464 +*   DSP image is based on LITTLE endian
13465 +*
13466 +********************************************************************************************/
13467 +unsigned int dslhal_api_genericDspWrite(tidsl_t * ptidsl,unsigned int offset1, unsigned int offset2, 
13468 +                                        unsigned int offset3, unsigned char *localBuffer, unsigned int numBytes)
13469 +{
13470 +
13471 +  int rc=0;
13472 +  unsigned int  hostIfLoc,structLoc,elementLoc;
13473 +  hostIfLoc = (unsigned int)ptidsl->pmainAddr;
13474 +  if(numBytes<=0 || !localBuffer || !ptidsl)
13475 +   {
13476 +     dprintf(3,"Invalid input parameter \n");
13477 +     return DSLHAL_ERROR_INVALID_PARAM;
13478 +   }
13479 +  rc += dslhal_support_blockRead((PVOID)(hostIfLoc+(offset1*4)), &structLoc,4);  
13480 +  structLoc = dslhal_support_byteSwap32(structLoc);  
13481 +  rc += dslhal_support_blockRead((PVOID)(structLoc+(offset2*4)), &elementLoc,4);
13482 +  elementLoc = dslhal_support_byteSwap32(elementLoc);  
13483 +  dprintf(3,"Host IF Location: 0x%x  Struct1 Location: 0x%x Element Location: 0x%x \n",hostIfLoc, structLoc, elementLoc);
13484 +  rc += dslhal_support_blockWrite(localBuffer,(PVOID)(elementLoc+(offset3*4)),numBytes);
13485 +  if (rc)
13486 +       return DSLHAL_ERROR_BLOCK_READ;
13487 +  return DSLHAL_ERROR_NO_ERRORS;
13488 +}
13489 +
13490 +/********************************************************************************************
13491 +* FUNCTION NAME: dslhal_api_dspInterfaceRead()
13492 +*
13493 +*********************************************************************************************
13494 +* DESCRIPTION:
13495 +*   Reads from a Generic Location in the DSP Host Interface
13496 +*
13497 +* Return: 0  success
13498 +*         1  failed
13499 +* 
13500 +* NOTE: 
13501 +*   DSP image is based on LITTLE endian
13502 +*
13503 +********************************************************************************************/
13504 +unsigned int dslhal_api_dspInterfaceRead(tidsl_t * ptidsl,unsigned int baseAddr, unsigned int numOffsets, 
13505 +                                         unsigned int *offsets, unsigned char *localBuffer, unsigned int numBytes)
13506 +{
13507 +  int rc=0, off=0;
13508 +  unsigned int  prevAddr,currAddr;
13509 +  prevAddr = baseAddr;
13510 +  if(numBytes<=0 || !localBuffer || !ptidsl || !offsets)
13511 +   {
13512 +     dprintf(3,"Invalid input parameter \n");
13513 +     return DSLHAL_ERROR_INVALID_PARAM;
13514 +   }
13515 +  for(off=0;off<numOffsets-1;off++)
13516 +    {
13517 +      rc += dslhal_support_blockRead((PVOID)(prevAddr+(4*offsets[off])), &currAddr,4);
13518 +      currAddr = dslhal_support_byteSwap32(currAddr);  
13519 +      prevAddr = currAddr;
13520 +      dprintf(5,"Curr Addr = 0x%x  Current Level: %d \n",currAddr,off);
13521 +    }
13522 +  currAddr = currAddr + offsets[numOffsets-1]*4;
13523 +  rc += dslhal_support_blockRead((PVOID)(currAddr),localBuffer,numBytes);
13524 +  if (rc)
13525 +       return DSLHAL_ERROR_BLOCK_READ;
13526 +  return DSLHAL_ERROR_NO_ERRORS;
13527 +}
13528 +
13529 +/********************************************************************************************
13530 +* FUNCTION NAME: dslhal_api_dspInterfaceWrite()
13531 +*
13532 +*********************************************************************************************
13533 +* DESCRIPTION:
13534 +*   Writes to a Generic Location in the DSP Host Interface
13535 +*
13536 +* Return: 0  success
13537 +*         1  failed
13538 +* 
13539 +* NOTE: 
13540 +*   DSP image is based on LITTLE endian
13541 +*
13542 +********************************************************************************************/
13543 +unsigned int dslhal_api_dspInterfaceWrite(tidsl_t * ptidsl,unsigned int baseAddr, unsigned int numOffsets, 
13544 +                                          unsigned int *offsets,unsigned char *localBuffer, unsigned int numBytes)
13545 +{
13546 +
13547 +  int rc=0, off=0;
13548 +  unsigned int  prevAddr,currAddr;
13549 +  prevAddr = baseAddr;
13550 +  if(numBytes<=0 || !localBuffer || !ptidsl || !offsets)
13551 +   {
13552 +     dprintf(3,"Invalid input parameter \n");
13553 +     return DSLHAL_ERROR_INVALID_PARAM;
13554 +   }  
13555 +  for(off=0;off<numOffsets-1;off++)
13556 +    {
13557 +      rc += dslhal_support_blockRead((PVOID)(prevAddr+(4*offsets[off])), &currAddr,4);
13558 +      currAddr = dslhal_support_byteSwap32(currAddr);  
13559 +      prevAddr = currAddr;
13560 +      dprintf(5,"Curr Addr = 0x%x  Current Level: %d \n",currAddr,off);
13561 +    }
13562 +  currAddr = currAddr + offsets[numOffsets-1]*4;
13563 +  rc += dslhal_support_blockWrite(localBuffer,(PVOID)(currAddr),numBytes);
13564 +  if (rc)
13565 +       return DSLHAL_ERROR_BLOCK_READ;
13566 +  return DSLHAL_ERROR_NO_ERRORS;
13567 +}
13568 +
13569 +
13570 +/******************************************************************************************     
13571 + * FUNCTION NAME:    dslhal_api_sendMailboxCommand(tidsl_t *ptidsl, unsigned int cmd)     
13572 + *     
13573 + *******************************************************************************************     
13574 + * DESCRIPTION: This fuction sends the passed mailbox command to the DSP     
13575 + *     
13576 + * INPUT:  PITIDSLHW_T *ptidsl     
13577 + *         unsigned int cmd
13578 + *            
13579 + * RETURN: 0 SUCCESS     
13580 + *         1 FAILED     
13581 + *       
13582 + *****************************************************************************************/     
13583 +/* Function is commented out for now since, its not tested */
13584 + /*unsigned int dslhal_api_sendMailboxCommand(tidsl_t *ptidsl, unsigned int cmd) 
13585 +{ 
13586 +   int rc;  
13587 +    
13588 +   dprintf(5, "dslhal_api_sendMailboxCommand\n");  
13589 +   rc = dslhal_support_writeHostMailbox(ptidsl, cmd, 0, 0, 0);  
13590 +   if(rc) 
13591 +     {   
13592 +      dprintf(1,"dslhal_api_sendMailboxCommand failed\n");   
13593 +      return DSLHAL_ERROR_CTRL_API_FAILURE;    
13594 +     }   
13595 +    return DSLHAL_ERROR_NO_ERRORS; 
13596 +} */
13597 +
13598 +
13599 diff -urN linux.old/drivers/atm/sangam_atm/dsl_hal_api.h linux.dev/drivers/atm/sangam_atm/dsl_hal_api.h
13600 --- linux.old/drivers/atm/sangam_atm/dsl_hal_api.h      1970-01-01 01:00:00.000000000 +0100
13601 +++ linux.dev/drivers/atm/sangam_atm/dsl_hal_api.h      2005-08-23 04:46:50.097843696 +0200
13602 @@ -0,0 +1,1721 @@
13603 +#ifndef __DSL_HAL_API_H__
13604 +#define __DSL_HAL_API_H__ 1
13605 +/*******************************************************************************
13606 +* FILE PURPOSE:     DSL HAL to Application Interface for Sangam
13607 +*
13608 +********************************************************************************
13609 +* FILE NAME:        dsl_application_interface.h
13610 +*
13611 +* DESCRIPTION:  
13612 +*       DSL-Application Interface Structures
13613 +*                
13614 +*
13615 +* By: Ramakrishnan Parasuraman
13616 +*                    
13617 +* (C) Copyright 2003, Texas Instruments, Inc.
13618 +*    History
13619 +*    Data        Version    By               Notes
13620 +*    06Feb03     0.00       RamP            Initial Version Written 
13621 +*    07Apr03     0.01       RamP            Commented out typedefs
13622 +*    09Apr03     0.02       RamP            Added deviceContext and extended
13623 +*                                           dspVer to include bugfixes
13624 +*    14Apr03     0.03       RamP            Added stateTransition to structure
13625 +*    16Apr03     0.04       RamP            Removed typedefs; changed dspVer
13626 +*    22Apr03     0.05       RamP            Moved acknowledgeInterrupt from
13627 +*               (alpha)                     support module into this
13628 +*    24Apr03     0.06       RamP            Moved the RSTATE enum from register
13629 +*
13630 +*    28Apr03     0.07       RamP            Added additional parameter to the
13631 +*               (alpha +)                   handleInterrupt function for intrSrc
13632 +*    14May03     0.08       RamP            Added hybrid switching APIs
13633 +*               (alpha ++)                  Added statistics fields in AppData
13634 +*                                           Added netService identifier
13635 +*    20May03     0.09       RamP            Added Inner/Outer pair API support. 
13636 +*                                           Added dying gasp message.
13637 +*    29May03     0.10       RamP            Added coProfile structure                                       
13638 +*    04Jun03     0.11       RamP            Added margin per tone statistics,
13639 +*                                           Added timing counters, added train
13640 +*                                           failure functions,added config flags
13641 +*    06Jun03     0.12       RamP            Added LED, STM Bert, dGasp LPR 
13642 +*                                           config API functions 
13643 +*    09Jun03     0.13       RamP            Added ATM Bert function, CO stats
13644 +*                                           Moved stateTransition to ITIDSLHW
13645 +*               (Beta)                      Moved configFlag to ITIDSLHW, 
13646 +*                                           Cleaned up fifoInfo structure
13647 +*                                           Added US/DS R/S FEC parameters
13648 +*    21Aug03     0.14       RamP            Added g.hs message buffer, us/ds
13649 +*                                           bits n gains table, negoMsgs struct
13650 +*               (act)                       bitswap stucts/indices, trainstate,
13651 +*                                           Added functions for advanced config
13652 +*                                           Added gross gain and line length
13653 +*    29Sep03     0.15       RamP            Added tokens for advanced config 
13654 +*                                           module api functions
13655 +*    12Oct03     0.16       RamP            Added adsl2Msgs structure with worst
13656 +*                                           case size for variable length msgs 
13657 +*                                           Added API function prototypes
13658 +*    21Oct03     0.17       RamP            Added typedef for current modem 
13659 +*                                           user settings
13660 +*    28Oct03     0.18       RamP            Added function to config blackout
13661 +*                                           bitmap in the RMSGPCB message
13662 +*    20Nov03     0.19       RamP            Added functions for generic and
13663 +*                                           host interface read - write
13664 +*    24Nov03     0.20       RamP            Added enum for detailed state track
13665 +*                                           Added element for state bit fields
13666 +*                                           Addded rState for encoded main state
13667 +*                                           Added blackout valid flag
13668 +*    26Dec03     0.21       RamP            Added defines for oamFeature masks
13669 +*    30Dec03     0.22       RamP            Increased sizes for cMsgPcb,RMsgPcb
13670 +*                                           to incorporate DELT mode messages
13671 +*    30Dec03     0.23       RamP            Added generic mailbox command fxn
13672 +*******************************************************************************/
13673 +
13674 +#ifdef INTERNAL_BUILD
13675 +#include <dsl_hal_api_pvt.h>
13676 +#endif
13677 +
13678 +#define NUM_PAGES 4
13679 +#define OAMFEATURE_AUTORETRAIN_MASK       0x00000001
13680 +#define OAMFEATURE_TC_SYNC_DETECT_MASK    0x00000002
13681 +#define OAMFEATURE_EOCAOC_INTERRUPT_MASK  0x00000004
13682 +#define OAMFEATURE_CONS_DISP_DISABLE_MASK 0x00000008
13683 +#define OAMFEATURE_GHSMSG_INTERRUPT_MASK  0x00000010
13684 +
13685 +typedef struct tagTIOIDINFO
13686 +{
13687 +  unsigned int   bState;           /* addr->bDSPATURState    */ 
13688 +  unsigned int   USConRate;        /* US Conection Rates */
13689 +  unsigned int   DSConRate;        /* DS Connection Rates */
13690 +  unsigned int   USPayload;        /* ennic_tx_pullup*/
13691 +  unsigned int   DSPayload;        /* ennic_indicate_receive_packet*/
13692 +  unsigned int   FrmMode;          /* addr->atur_msg.framing_mode*/
13693 +  unsigned int   MaxFrmMode;          
13694 +  unsigned int   TrainedPath;      /* Status of the Modem in which trained (Fast or Interleaved Path) */
13695 +  unsigned int   TrainedMode;      /* Status of the mode in which the modem is trained (G.dmt, T1.413, etc) */
13696 +  
13697 +  /* Superframe Count */
13698 +  unsigned int   usSuperFrmCnt;    /* Num of US Superframes */
13699 +  unsigned int   dsSuperFrmCnt;    /* Num of DS Superframes */
13700 +
13701 +  /* LOS & SEF Stats */
13702 +  unsigned int   LOS_errors;       /* Num of ADSL frames where loss-of-sync */
13703 +  unsigned int   SEF_errors;       /* Num of severly errored ADSL frames - LOS > MAXBADSYNC ADSL frames */
13704 +  unsigned int   coLosErrors; /* CO LOS Defects */
13705 +  unsigned int   coRdiErrors; /* CO RDI defects */
13706 +  /* CRC Stats */
13707 +  unsigned int   usICRC_errors;    /* Num of Upstream CRC errored ADSL frames on Interleaved Path */
13708 +  unsigned int   usFCRC_errors;    /* Num of Upstream CRC errored ADSL frames on Fast Path */
13709 +  unsigned int   dsICRC_errors;    /* Num of Downstream CRC errored ADSL frames on Interleaved Path */
13710 +  unsigned int   dsFCRC_errors;    /* Num of Downstream CRC errored ADSL frames on Fast Path */
13711 +
13712 +  /* FEC Stats */
13713 +  unsigned int   usIFEC_errors;    /* Num of Upstream FEC errored (corrected) ADSL frames on Interleaved Path */
13714 +  unsigned int   usFFEC_errors;    /* Num of Upstream FEC errored (corrected) ADSL frames on Fast Path */
13715 +  unsigned int   dsIFEC_errors;    /* Num of Downstream FEC errored (corrected) ADSL frames on Interleaved Path */
13716 +  unsigned int   dsFFEC_errors;    /* Num of Downstream FEC errored (corrected) ADSL frames on Fast Path */
13717 +
13718 +  /* NCD Stats */
13719 +  unsigned int   usINCD_error;     /* UpStream No Cell Delineation on Interleaved Path */
13720 +  unsigned int   usFNCD_error;     /* UpStream No Cell Delineation on Fast Path */
13721 +  unsigned int   dsINCD_error;     /* Downstream No Cell Delineation on Interleaved Path */
13722 +  unsigned int   dsFNCD_error;     /* Downstream No Cell Delineation on Fast Path */
13723 +
13724 +  /* LCD Stats */
13725 +  unsigned int   usILCD_errors;    /* UpStream Loss of Cell Delineation (within the same connection) on Interleaved Path */
13726 +  unsigned int   usFLCD_errors;    /* UpStream Loss of Cell Delineation (within the same connection) on Fast Path */
13727 +  unsigned int   dsILCD_errors;    /* Downstream Loss of Cell Delineation (within the same connection) on Interleaved Path */
13728 +  unsigned int   dsFLCD_errors;    /* Downstream Loss of Cell Delineation (within the same connection) on Fast Path */
13729 +
13730 +  /* HEC Stats */
13731 +  unsigned int   usIHEC_errors;    /* Num of Upstream HEC errored ADSL frames on Interleaved Path */
13732 +  unsigned int   usFHEC_errors;    /* Num of Upstream HEC errored ADSL frames on Fast Path */
13733 +  unsigned int   dsIHEC_errors;    /* Num of Downstream HEC errored ADSL frames on Interleaved Path */
13734 +  unsigned int   dsFHEC_errors;    /* Num of Downstream HEC errored ADSL frames on Fast Path */
13735 +
13736 +  /* Upstream ATM Stats */
13737 +  unsigned int   usAtm_count[2];      /* Upstream Good Cell Count */
13738 +  unsigned int   usIdle_count[2];     /* Upstream Idle Cell Count */
13739 +  unsigned int   usPdu_count[2];      /* UpStream PDU Count */
13740 +
13741 +  /* Downstream ATM Stats */
13742 +  unsigned int   dsGood_count[2];     /* Downstream Good Cell Count */
13743 +  unsigned int   dsIdle_count[2];     /* Downstream Idle Cell Count */
13744 +  unsigned int   dsBadHec_count[2];   /* Downstream Bad Hec Cell Count */
13745 +  unsigned int   dsOVFDrop_count[2];  /* Downstream Overflow Dropped Cell Count */
13746 +  unsigned int   dsPdu_count[2];      /* Downstream PDU Count */
13747 +                             /* (only looks for end of pdu on good atm cells received, */
13748 +                             /* not on Bad_Hec or Overflow cell) */
13749 +
13750 +  unsigned int   dsLineAttn;       /* DS Line Attenuation */
13751 +  unsigned int   dsMargin;         /* Measured DS MArgin */
13752 +
13753 +  unsigned int   usLineAttn;
13754 +  unsigned int   usMargin;
13755 +
13756 +  unsigned char    bCMsgs1[6];
13757 +  unsigned char    bRMsgs1[6];
13758 +  unsigned char    bCRates2;
13759 +  unsigned char    bRRates2;
13760 +  unsigned char    bRRates1[4][11];
13761 +  unsigned char    bCMsgs2[4];
13762 +  unsigned char    bCRates1[4][30];
13763 +  unsigned char    bRMsgs2[4];
13764 +   
13765 +  unsigned int   USPeakCellRate; 
13766 +  
13767 +  unsigned int   dsl_status;
13768 +  unsigned int   dsl_modulation;
13769 +  unsigned char  dsl_ghsRxBuf[10][64];
13770 +  unsigned char  dsl_GHS_msg_type[2];
13771 +   
13772 +  int     TxVCs[12];
13773 +  int     RxVCs[12];
13774 +
13775 +  unsigned int   vci_vpi_val;
13776 +
13777 +  unsigned char  BitAllocTblDstrm[256]; 
13778 +  unsigned char  BitAllocTblUstrm[32];  
13779 +    signed char  marginTblDstrm[256];
13780 +  unsigned char  rBng[512];
13781 +  unsigned char  cBng[126];
13782 +           int   usTxPower;
13783 +           int   dsTxPower;
13784 +         short   rxSnrPerBin0[256];
13785 +         short   rxSnrPerBin1[256];
13786 +         short   rxSnrPerBin2[256];
13787 +
13788 +  unsigned int   StdMode;
13789 +  unsigned int   atucVendorId;
13790 +  unsigned char  currentHybridNum;
13791 +  unsigned char  atucRevisionNum; 
13792 +  unsigned int   trainFails;
13793 +  unsigned int   trainFailStates[30];
13794 +  unsigned int   idleTick;
13795 +  unsigned int   initTick;
13796 +  unsigned int   showtimeTick; 
13797 +  unsigned char  dsFastParityBytesPerSymbol;
13798 +  unsigned char  dsIntlvParityBytesPerSymbol;
13799 +  unsigned char  dsSymbolsPerCodeWord;
13800 +  unsigned int   dsInterleaverDepth;
13801 +  unsigned char  usFastParityBytesPerSymbol;
13802 +  unsigned char  usIntlvParityBytesPerSymbol;
13803 +  unsigned char  usSymbolsPerCodeWord;
13804 +  unsigned int   usInterleaverDepth;
13805 +  unsigned int   atmBertBitCountLow;
13806 +  unsigned int   atmBertBitCountHigh;
13807 +  unsigned int   atmBertBitErrorCountLow;
13808 +  unsigned int   atmBertBitErrorCountHigh;
13809 +  unsigned int   lineLength;
13810 +  unsigned int   grossGain;
13811 +           int   rxNoisePower0[256];
13812 +           int   rxNoisePower1[256];
13813 +}TIOIDINFO,*PTIOIDINFO;
13814 +
13815 +typedef struct{
13816 +  unsigned char    bCMsgs1[6];
13817 +  unsigned char    bCRates2;
13818 +  unsigned char    bRRates2;
13819 +  unsigned char    bRRates1[4][11];
13820 +  unsigned char    bCMsgs2[4];
13821 +  unsigned char    bCRates1[4][30];
13822 +  unsigned char    bCRatesRA[4][30];
13823 +  unsigned char    bRMsgs2[4];
13824 +  unsigned char    bRRatesRA[4];
13825 +  unsigned char    bRMsgsRA[12];
13826 +  unsigned char    bCMsgsRA[6];
13827 +}negoMsgs;
13828 +
13829 +typedef struct{
13830 +  unsigned char    cMsgFmt[2];
13831 +  unsigned char    rMsgFmt[2];
13832 +  unsigned char    cMsgPcb[12];
13833 +  unsigned char    rMsgPcb[70];
13834 +  unsigned char    dummy1[2];
13835 +  unsigned char    cMsg1[40];
13836 +  unsigned char    rMsg1[4]; 
13837 +  unsigned char    cMsg2[8];
13838 +  unsigned char    rMsg2[64];
13839 +  unsigned char    cParams[264];
13840 +  unsigned char    rParams[2088];
13841 +  unsigned short   cMsgPcbLen; 
13842 +  unsigned short   rMsgPcbLen;
13843 +  unsigned short   cMsg1Len; 
13844 +  unsigned short   rMsg1Len;
13845 +  unsigned short   cMsg2Len;
13846 +  unsigned short   rMsg2Len;
13847 +  unsigned short   cParamsLen;
13848 +  unsigned short   rParamsLen;    
13849 +}adsl2Msgs;
13850 +
13851 +typedef struct{
13852 +  unsigned char    rMsg1Ld[16];
13853 +  unsigned char    rMsg2Ld[260];
13854 +  unsigned char    rMsg3Ld[260];
13855 +  unsigned char    rMsg4Ld[260];
13856 +  unsigned char    rMsg5Ld[260];
13857 +  unsigned char    rMsg6Ld[260];
13858 +  unsigned char    rMsg7Ld[260];
13859 +  unsigned char    rMsg8Ld[260];
13860 +  unsigned char    rMsg9Ld[260];
13861 +  unsigned char    cMsg1Ld[16];
13862 +  unsigned char    cMsg2Ld[260];
13863 +  unsigned char    cMsg3Ld[132];
13864 +  unsigned char    cMsg4Ld[68];
13865 +  unsigned char    cMsg5Ld[68];
13866 +  unsigned short   rMsg1LdLen;
13867 +  unsigned short   rMsgxLdLen;
13868 +  unsigned short   cMsg1LdLen;
13869 +  unsigned short   cMsg2LdLen;
13870 +  unsigned short   cMsg3LdLen;
13871 +  unsigned short   cMsg4LdLen;
13872 +  unsigned short   cMsg5LdLen;
13873 +  unsigned short   dummy8;
13874 +}adsl2DeltMsgs;
13875 +
13876 +typedef struct{
13877 +  unsigned char    trellisFlag;
13878 +  unsigned char    rateAdaptFlag;
13879 +  unsigned char    marginMonitorTraining;
13880 +  unsigned char    marginMonitorShowtime;  
13881 +    signed char    marginThreshold;    
13882 +  unsigned char    disableLosFlag;
13883 +  unsigned char    aturConfig[30]; 
13884 +  unsigned char    eocVendorId[8];
13885 +  unsigned char    eocSerialNumber[32];
13886 +  unsigned char    eocRevisionNumber[4];
13887 +}currentPhySettings;
13888 +
13889 +
13890 +typedef struct
13891 +{
13892 +  unsigned int  PmemStartWtAddr;              /* source address in host memory */
13893 +  unsigned int  OverlayXferCount;             /* number of 32bit words to be transfered */
13894 +  unsigned int  BinAddr;                      /* destination address in dsp's pmem */
13895 +  unsigned int  overlayHostAddr;
13896 +  unsigned int  olayPageCrc32;
13897 +  unsigned int  SecOffset;
13898 +} OlayDP_Def;
13899 +
13900 +typedef struct
13901 +{
13902 +  unsigned int    timeStamp; /* TimeStp revision  */
13903 +  unsigned char   major;     /* Major revision    */
13904 +  unsigned char   minor;     /* Minor revision    */
13905 +  unsigned char   bugFix;    /* BugFix revision   */
13906 +  unsigned char   buildNum;  /* BuildNum revision */
13907 +  unsigned char   reserved;  /* for future use    */
13908 +}dspVer;
13909 +
13910 +typedef struct{
13911 +  unsigned char major;
13912 +  unsigned char minor;
13913 +  unsigned char bugfix;
13914 +  unsigned char buildNum;
13915 +  unsigned int  timeStamp;
13916 +}dslVer;
13917 +
13918 +typedef struct{
13919 +  unsigned char bitSwapCommand[6];
13920 +  unsigned char bitSwapBinNum[6];
13921 +  unsigned char bitSwapSFrmCnt;
13922 +}dslBitSwapDef;
13923 +
13924 +typedef struct{
13925 +  unsigned int aturState;
13926 +  unsigned int subStateIndex;
13927 +  unsigned int timeStamp;
13928 +}trainStateInfo;
13929 +
13930 +typedef struct{
13931 +  unsigned char ctrlBits;
13932 +  unsigned char infoBits;
13933 +}eocMessageDef;
13934 +      
13935 +enum
13936 +{
13937 +  RSTATE_TEST,
13938 +  RSTATE_IDLE,
13939 +  RSTATE_INIT,
13940 +  RSTATE_HS,
13941 +  RSTATE_RTDL,
13942 +  RSTATE_SHOWTIME,
13943 +};
13944 +
13945 +typedef enum
13946 +{
13947 +  ATU_RZERO1      = 100,
13948 +  ATU_RTEST       = 101,
13949 +  ATU_RIDLE       = 102,
13950 +  ATU_RINIT       = 103,
13951 +  ATU_RRESET      = 104,
13952 +  GDMT_NSFLR      = 105,
13953 +  GDMT_TONE       = 106,
13954 +  GDMT_SILENT     = 107,
13955 +  GDMT_NEGO       = 108,
13956 +  GDMT_FAIL       = 109,
13957 +  GDMT_ACKX       = 110,
13958 +  GDMT_QUIET2     = 111,
13959 +  ATU_RZERO2      = 200,
13960 +  T1413_NSFLR     = 201,
13961 +  T1413_ACTREQ    = 202,
13962 +  T1413_ACTMON    = 203,
13963 +  T1413_FAIL      = 204,
13964 +  T1413_ACKX      = 205,
13965 +  T1413_QUIET2    = 206,
13966 +  ATU_RQUIET2     = 207,
13967 +  ATU_RREVERB1    = 208,
13968 +  ATU_RQUIET3     = 209,
13969 +  ATU_RECT        = 210,
13970 +  ATU_RREVERB2    = 211,
13971 +  ATU_RSEGUE1     = 212,
13972 +  ATU_RREVERB3    = 213,
13973 +  ATU_RSEGUE2     = 214,
13974 +  ATU_RRATES1     = 215,
13975 +  ATU_RMSGS1      = 216,
13976 +  ATU_RMEDLEY     = 217,
13977 +  ATU_RREVERB4    = 218,
13978 +  ATU_RSEGUE3     = 219,
13979 +  ATU_RMSGSRA     = 220,
13980 +  ATU_RRATESRA    = 221,
13981 +  ATU_RREVERBRA   = 222,
13982 +  ATU_RSEGUERA    = 223,
13983 +  ATU_RMSGS2      = 224,
13984 +  ATU_RRATES2     = 225,
13985 +  ATU_RREVERB5    = 226,
13986 +  ATU_RSEGUE4     = 227,
13987 +  ATU_RBNG        = 228,
13988 +  ATU_RREVERB6    = 229,
13989 +  ATU_RSHOWTIME   = 230,
13990 +  ATU_RZERO3      = 300,
13991 +  ADSL2_QUIET1    = 301,
13992 +  ADSL2_COMB1     = 302,
13993 +  ADSL2_QUIET2    = 303,
13994 +  ADSL2_COMB2     = 304,
13995 +  ADSL2_ICOMB1    = 305,
13996 +  ADSL2_LINEPROBE = 306,
13997 +  ADSL2_QUIET3    = 307,
13998 +  ADSL2_COMB3     = 308,
13999 +  ADSL2_ICOMB2    = 309,
14000 +  ADSL2_RMSGFMT   = 310,
14001 +  ADSL2_RMSGPCB   = 311,
14002 +  ADSL2_REVERB1   = 312,
14003 +  ADSL2_QUIET4    = 313,
14004 +  ADSL2_REVERB2   = 314,
14005 +  ADSL2_QUIET5    = 315,
14006 +  ADSL2_REVERB3   = 316,
14007 +  ADSL2_ECT       = 317,
14008 +  ADSL2_REVERB4   = 318,
14009 +  ADSL2_SEGUE1    = 319,
14010 +  ADSL2_REVERB5   = 320,
14011 +  ADSL2_SEGUE2    = 321,
14012 +  ADSL2_RMSG1     = 322,
14013 +  ADSL2_MEDLEY    = 323,
14014 +  ADSL2_EXCHANGE  = 324,
14015 +  ADSL2_RMSG2     = 325,
14016 +  ADSL2_REVERB6   = 326,
14017 +  ADSL2_SEGUE3    = 327,
14018 +  ADSL2_RPARAMS   = 328,
14019 +  ADSL2_REVERB7   = 329,
14020 +  ADSL2_SEGUE4    = 330,
14021 +  ATU_RZERO4      = 400,
14022 +  DELT_SEGUE1     = 401,
14023 +  DELT_REVERB5    = 402,
14024 +  DELT_SEGUE2     = 403,
14025 +  DELT_EXCHANGE   = 404,
14026 +  DELT_SEGUELD    = 405,
14027 +  DELT_RMSGLD     = 406,
14028 +  DELT_QUIET1LD   = 407,
14029 +  DELT_QUIET2LD   = 408,
14030 +  DELT_RACK1      = 409,
14031 +  DELT_RNACK1     = 410,
14032 +  DELT_QUIETLAST  = 411
14033 +} modemStates_t;  
14034 +
14035 +enum
14036 +{
14037 +  DSLTRAIN_NO_MODE,
14038 +  DSLTRAIN_MULTI_MODE,
14039 +  DSLTRAIN_T1413_MODE,
14040 +  DSLTRAIN_GDMT_MODE,
14041 +  DSLTRAIN_GLITE_MODE
14042 +};
14043 +
14044 +enum
14045 +{
14046 +  ID_RESTORE_DEFAULT_LED,
14047 +  ID_DSL_LINK_LED,
14048 +  ID_DSL_ACT_LED
14049 +};
14050 +
14051 +typedef struct _ITIDSLHW
14052 +{
14053 +  /* struct _TIDSL_IHwVtbl * pVtbl; */
14054 +  unsigned char*     fwimage;
14055 +  void*     pmainAddr;
14056 +  void*     pOsContext;
14057 +  unsigned int     ReferenceCount;
14058 +  unsigned int     netService;  
14059 +
14060 +  int     InitFlag;
14061 +
14062 +  int     imagesize;
14063 +  
14064 +  unsigned int     lConnected;
14065 +  unsigned int     bStatisticsInitialized;
14066 +  unsigned int     rState;
14067 +  unsigned int     bShutdown; 
14068 +  unsigned int     blackOutValid_f;
14069 +  unsigned char    blackOutBits[64];
14070 +  unsigned int     bAutoRetrain;
14071 +  volatile unsigned int     bOverlayPageLoaded;
14072 +  unsigned int     stateTransition;
14073 +  unsigned int     configFlag;
14074 +  unsigned int     dsBitSwapInx;
14075 +  unsigned int     usBitSwapInx;
14076 +  unsigned int     trainStateInx;
14077 +  unsigned int     usEocMsgInx;
14078 +  unsigned int     dsEocMsgInx;
14079 +  unsigned int     reasonForDrop;
14080 +  TIOIDINFO  AppData;
14081 +  dspVer     dspVer;
14082 +
14083 +  OlayDP_Def olayDpPage[NUM_PAGES];
14084 +  OlayDP_Def coProfiles;
14085 +  OlayDP_Def constDisplay;
14086 +  dslBitSwapDef dsBitSwap[30];
14087 +  dslBitSwapDef usBitSwap[30];  
14088 +  trainStateInfo trainHistory[120];
14089 +  eocMessageDef usEocMsgBuf[30];
14090 +  eocMessageDef dsEocMsgBuf[30];
14091 +  adsl2Msgs     adsl2TrainingMessages;
14092 +  adsl2DeltMsgs adsl2DiagnosticMessages;
14093 +  unsigned int modemStateBitField[4];
14094 +#ifdef INTERNAL_BUILD
14095 +  internalParameters internalVars;
14096 +#endif
14097 +} ITIDSLHW_T, *PITIDSLHW_T, tidsl_t;
14098 +
14099 +
14100 +/**********************************************************************************
14101 +* API proto type defines
14102 +**********************************************************************************/
14103 +
14104 +/******************************************************************************************
14105 +* FUNCTION NAME:    dslhal_api_dslStartup
14106 +*
14107 +*******************************************************************************************
14108 +* DESCRIPTION: Entry point to initialize and load ax5 daughter board
14109 +*
14110 +* INPUT:   PITIDSLHW_T *ppIHw  
14111 +*
14112 +* RETURN:  0 --succeeded
14113 +*          1 --Failed
14114 +*
14115 +* Notes: external function osAllocateMemory(), osZeroMemory(), osLoadFWImage() are required
14116 +*****************************************************************************************/
14117 +int dslhal_api_dslStartup
14118 +(
14119 + PITIDSLHW_T *ppIHw
14120 +);
14121 +
14122 +
14123 +/********************************************************************************************
14124 +* FUNCTION NAME: dslhal_api_gatherStatistics
14125 +*
14126 +*********************************************************************************************
14127 +* DESCRIPTION: Read statistical infromation from ax5 modem daugter card. 
14128 +* Input: tidsl_t *ptidsl
14129 +* 
14130 +* Return: 0    success
14131 +*         1    failed
14132 +*
14133 +********************************************************************************************/
14134 +
14135 +void dslhal_api_gatherStatistics
14136 +(
14137 + tidsl_t * ptidsl
14138 +);
14139 +
14140 +
14141 +/********************************************************************************************
14142 +* FUNCTION NAME: dslhal_api_initStatistics
14143 +*
14144 +*********************************************************************************************
14145 +* DESCRIPTION: init statistical infromation of ax5 modem daugter card. 
14146 +*
14147 +* Input: tidsl_t *ptidsl
14148 +* 
14149 +* Return: NULL
14150 +*         
14151 +********************************************************************************************/
14152 +
14153 +void dslhal_api_initStatistics
14154 +(
14155 + tidsl_t * ptidsl
14156 +);
14157 +
14158 +
14159 +
14160 +/******************************************************************************************
14161 +* FUNCTION NAME:    dslhal_api_getDslDriverVersion
14162 +*
14163 +*******************************************************************************************
14164 +* DESCRIPTION: This routine supply DSL Driver version.
14165 +*
14166 +* INPUT:  tidsl_t * ptidsl
14167 +*         void *pVer, DSP Driver Version Pointer
14168 +*         
14169 +* RETURN:  0 --succeeded
14170 +*          1 --Failed
14171 +* Note: See verdef_u.h for version structure definition.
14172 +*****************************************************************************************/
14173 +
14174 +void dslhal_api_getDslHalVersion
14175 +(
14176 + void  *pVer
14177 +);
14178 +
14179 +/******************************************************************************************
14180 +* FUNCTION NAME:    dslhal_api_dslShutdown
14181 +*
14182 +*******************************************************************************************
14183 +* DESCRIPTION: routine to shutdown ax5 modem and free the resource
14184 +*
14185 +* INPUT:   tidsl_t *ptidsl  
14186 +*
14187 +* RETURN:  NULL
14188 +*          
14189 +* Notes: external function osFreeMemory() is required.
14190 +*****************************************************************************************/
14191 +
14192 +int dslhal_api_dslShutdown
14193 +(
14194 + tidsl_t *ptidsl
14195 +);
14196 +
14197 +
14198 +/******************************************************************************************
14199 +* FUNCTION NAME:    dslhal_api_getDspVersion
14200 +*
14201 +*******************************************************************************************
14202 +* DESCRIPTION: This routine supply AX5 daugther card DSP version.
14203 +*
14204 +* INPUT:  tidsl_t * ptidsl
14205 +*         void *pVer, DSP version struct is returned starting at this pointer
14206 +*         
14207 +* RETURN:  0 --succeeded
14208 +*          1 --Failed
14209 +* 
14210 +*****************************************************************************************/
14211 +
14212 +int dslhal_api_getDspVersion
14213 +(
14214 + tidsl_t *ptidsl,
14215 + void  *pVer
14216 +);
14217 +
14218 +
14219 +/********************************************************************************************
14220 +* FUNCTION NAME: dslhal_diags_digi_memTestA()
14221 +*
14222 +*********************************************************************************************
14223 +* DESCRIPTION: This function does the digital tests on the DSP. It does the DSP ID test,
14224 +*              memory tests on the external and internal memories of DSP, Codec Interconnect 
14225 +*              test and Interrupt Test.
14226 +*
14227 +* Input:       Test selects the test to be performed based on the elements set of 9 element
14228 +*              array passed the the parameter. 
14229 +*             
14230 +* Return:      Status of the Tests Failed
14231 +*         
14232 +********************************************************************************************/
14233 +
14234 +unsigned int dslhal_diags_digi_memTestA
14235 +(
14236 +unsigned int*   Test
14237 +);
14238 +
14239 +
14240 +/********************************************************************************************
14241 +* FUNCTION NAME: dslhal_diags_digi_memTestB()
14242 +*
14243 +*********************************************************************************************
14244 +* DESCRIPTION: This function does the digital tests on the DSP. It does the DSP ID test,
14245 +*              memory tests on the external and internal memories of DSP, Codec Interconnect 
14246 +*              test and Interrupt Test.
14247 +*
14248 +* Input:       Test selects the digital test to be performed.
14249 +* 
14250 +* Return:      Status of the Tests Failed
14251 +*         
14252 +********************************************************************************************/
14253 +
14254 +unsigned int dslhal_diags_digi_memTestB
14255 +(
14256 +unsigned int   Test,
14257 +unsigned int   *Status
14258 +);
14259 +
14260 +
14261 +/********************************************************************************************
14262 +* FUNCTION NAME: dslhal_diags_anlg_tonesTestA()
14263 +*
14264 +*********************************************************************************************
14265 +* DESCRIPTION: This function instructs the Transciever to transmit the Reverb with missing
14266 +*              tones and Medley's with missing tones. These signals are defined in ITU 
14267 +*              G.992.1 ADSL Standards.
14268 +*
14269 +* Input: Test selects between the Reverb or Medley tests. 0 - Reverb, 1 - Medley
14270 +*        Array is a 64 element unsigned integer type array. The element of this array
14271 +*              describe which tones are to be generated by selecting the element of
14272 +*              the array to be non zero.
14273 +* Return: NULL
14274 +*         
14275 +********************************************************************************************/
14276 +
14277 +void dslhal_diags_anlg_tonesTestA
14278 +(
14279 +unsigned int   Test, 
14280 +unsigned int* Array
14281 +);
14282 +
14283 +
14284 +/********************************************************************************************
14285 +* FUNCTION NAME: dslhal_diags_anlg_tonesTestB()
14286 +*
14287 +*********************************************************************************************
14288 +* DESCRIPTION: This function instructs the Transciever to transmit the Reverb with missing
14289 +*              tones and Medley's with missing tones. These signals are defined in ITU 
14290 +*              G.992.1 ADSL Standards.
14291 +*
14292 +* Input: Test selects between the Reverb or Medley tests. 0 - Reverb, 1 - Medley
14293 +*        Array is a 64 element unsigned integer type array. The element of this array
14294 +*              describe which tones are to be generated by selecting the element of
14295 +*              the array to be non zero.
14296 +* Return: NULL
14297 +*         
14298 +********************************************************************************************/
14299 +
14300 +void dslhal_diags_anlg_tonesTestB
14301 +(
14302 +unsigned int   Test, 
14303 +unsigned int  Tones
14304 +);
14305 +
14306 +/********************************************************************************************
14307 +* FUNCTION NAME: dslhal_diags_anlg_rxNoiseTest()
14308 +*
14309 +*********************************************************************************************
14310 +* DESCRIPTION: This function instructs the Transciever to transmit the Reverb with missing
14311 +*              tones and Medley's with missing tones. These signals are defined in ITU 
14312 +*              G.992.1 ADSL Standards.
14313 +*
14314 +* Input: Test selects between the Reverb or Medley tests. 0 - Reverb, 1 - Medley
14315 +*        Tones selects the .
14316 +* Return: NULL
14317 +*         
14318 +********************************************************************************************/
14319 +
14320 +void dslhal_diags_anlg_rxNoiseTest
14321 +(int agcFlag,
14322 +short pga1, 
14323 +short pga2, 
14324 +short pga3, 
14325 +short aeq
14326 +);
14327 +
14328 +/********************************************************************************************
14329 +* FUNCTION NAME: dslhal_diags_anlg_ecNoiseTest()
14330 +*
14331 +*********************************************************************************************
14332 +* DESCRIPTION: This function instructs the Transciever to transmit the Reverb with missing
14333 +*              tones and Medley's with missing tones. These signals are defined in ITU 
14334 +*              G.992.1 ADSL Standards.
14335 +*
14336 +* Input: Test selects between the Reverb or Medley tests. 0 - Reverb, 1 - Medley
14337 +*        Tones selects the .
14338 +* Return: NULL
14339 +*         
14340 +********************************************************************************************/
14341 +
14342 +void dslhal_diags_anlg_ecNoiseTest
14343 +(int agcFlag,
14344 +short pga1, 
14345 +short pga2, 
14346 +short pga3, 
14347 +short aeq
14348 +);
14349 +
14350 +
14351 +/********************************************************************************************
14352 +* FUNCTION NAME: dslhal_api_pollTrainingStatus()
14353 +*
14354 +*********************************************************************************************
14355 +* DESCRIPTION: code to decode modem status and to start modem training 
14356 +*
14357 +* Input: tidsl_t *ptidsl
14358 +* 
14359 +* Return: 0-? status mode training
14360 +*         -1    failed
14361 +*
14362 +********************************************************************************************/
14363 +int dslhal_api_pollTrainingStatus
14364 +(
14365 + tidsl_t *ptidsl
14366 +);
14367 +
14368 +
14369 +
14370 +/********************************************************************************************
14371 +* FUNCTION NAME: dslhal_api_handleTrainingInterrupt()
14372 +*
14373 +*********************************************************************************************
14374 +* DESCRIPTION: Code to handle ax5 hardware interrupts
14375 +*
14376 +* Input: tidsl_t *ptidsl
14377 +*        int *pMsg, pointer to returned hardware messages. Each byte represent a messge
14378 +*        int *pTag, pointer to returned hardware message tags. Each byte represent a tag.
14379 +* Return: 0    success  
14380 +*         1    failed
14381 +*
14382 +********************************************************************************************/
14383 +int dslhal_api_handleTrainingInterrupt
14384 +(
14385 + tidsl_t *ptidsl,
14386 + int intrSource
14387 +);
14388 +
14389 +/******************************************************************************************    
14390 + * FUNCTION NAME:    dslhal_api_setEocSerialNumber(tidsl_t *ptidsl,char *SerialNumber)    
14391 + *    
14392 + *******************************************************************************************    
14393 + * DESCRIPTION: This fuction Sets the EOC Serial Number    
14394 + *    
14395 + * INPUT:  PITIDSLHW_T *ptidsl    
14396 + *         char *SerialNumber : Input EOC Serial Number  
14397 + *    
14398 + * RETURN: 0 SUCCESS    
14399 + *         1 FAILED    
14400 + *    
14401 + *****************************************************************************************/    
14402 +unsigned int dslhal_api_setEocSerialNumber 
14403 +( 
14404 +tidsl_t *ptidsl, 
14405 +char *SerialNumber 
14406 +);    
14407
14408 +/******************************************************************************************     
14409 + * FUNCTION NAME:    dslhal_api_setEocVendorId(tidsl_t *ptidsl,char *VendorID)     
14410 + *     
14411 + *******************************************************************************************     
14412 + * DESCRIPTION: This fuction Sets the EOC Serial Number     
14413 + *     
14414 + * INPUT:  PITIDSLHW_T *ptidsl     
14415 + *         char *VendorID : EOC Vendor ID   
14416 + *     
14417 + * RETURN: 0 SUCCESS     
14418 + *         1 FAILED     
14419 + *     
14420 + *****************************************************************************************/     
14421 +unsigned int dslhal_api_setEocVendorId  
14422 +(  
14423 +tidsl_t *ptidsl,  
14424 +char *VendorID  
14425 +);     
14426
14427 +/******************************************************************************************     
14428 + * FUNCTION NAME:    dslhal_api_setEocRevisionNumber(tidsl_t *ptidsl,char *RevNum)     
14429 + *     
14430 + *******************************************************************************************     
14431 + * DESCRIPTION: This fuction Sets the EOC Revision Number     
14432 + *     
14433 + * INPUT:  PITIDSLHW_T *ptidsl     
14434 + *         char *RevNum : Input EOC Revision Number   
14435 + *     
14436 + * RETURN: 0 SUCCESS     
14437 + *         1 FAILED     
14438 + *     
14439 + *****************************************************************************************/     
14440 +unsigned int dslhal_api_setEocRevisionNumber 
14441 +( 
14442 +tidsl_t *ptidsl, 
14443 +char *RevNumber 
14444 +);     
14445
14446 +/******************************************************************************************      
14447 + * FUNCTION NAME:    dslhal_api_setAturConfig(tidsl_t *ptidsl,char *ATURConfig)      
14448 + *      
14449 + *******************************************************************************************      
14450 + * DESCRIPTION: This fuction Sets the EOC ATUR Config Register  
14451 + *      
14452 + * INPUT:  PITIDSLHW_T *ptidsl      
14453 + *         char *RevNum : Input EOC ATUR Config Register    
14454 + *      
14455 + * RETURN: 0 SUCCESS      
14456 + *         1 FAILED      
14457 + *      
14458 + *****************************************************************************************/      
14459 +unsigned int dslhal_api_setAturConfig 
14460 +(  
14461 +tidsl_t *ptidsl,  
14462 +char *ATURConfig 
14463 +);      
14464
14465 +/******************************************************************************************   
14466 + * FUNCTION NAME:    dslhal_api_disableLosAlarm(tidsl_t *ptidsl, unsigned int set)   
14467 + *   
14468 + *******************************************************************************************   
14469 + * DESCRIPTION: This fuction disables all the LOS alarms   
14470 + *   
14471 + * INPUT:  PITIDSLHW_T *ptidsl   
14472 + *         unsigned int set // if set == TRUE : Disable LOS alarms, else enable
14473 + *          
14474 + * RETURN: 0 SUCCESS   
14475 + *         1 FAILED   
14476 + * NOTES:  Currently not supported in any version other than MR4 Patch release..    
14477 + *****************************************************************************************/   
14478 +unsigned int dslhal_api_disableLosAlarm 
14479 +( 
14480 +tidsl_t *ptidsl,
14481 +unsigned int 
14482 +);   
14483 +  
14484 +/******************************************************************************************   
14485 + * FUNCTION NAME:    dslhal_api_sendIdle(tidsl_t *ptidsl)   
14486 + *   
14487 + *******************************************************************************************   
14488 + * DESCRIPTION: This fuction sends the CMD_IDLE message to the DSP   
14489 + *   
14490 + * INPUT:  PITIDSLHW_T *ptidsl   
14491 + *          
14492 + * RETURN: 0 SUCCESS   
14493 + *         1 FAILED   
14494 + *     
14495 + *****************************************************************************************/   
14496 +unsigned int dslhal_api_sendIdle 
14497 +( 
14498 +tidsl_t *ptidsl 
14499 +);   
14500
14501 +/******************************************************************************************    
14502 + * FUNCTION NAME:    dslhal_api_sendQuiet(tidsl_t *ptidsl)    
14503 + *    
14504 + *******************************************************************************************    
14505 + * DESCRIPTION: This fuction sends the CMD_QUIET message to the DSP    
14506 + *    
14507 + * INPUT:  PITIDSLHW_T *ptidsl    
14508 + *           
14509 + * RETURN: 0 SUCCESS    
14510 + *         1 FAILED    
14511 + *      
14512 + *****************************************************************************************/    
14513 +unsigned int dslhal_api_sendQuiet  
14514 +(  
14515 +tidsl_t *ptidsl  
14516 +);    
14517 +
14518 +/******************************************************************************************    
14519 + * FUNCTION NAME:    dslhal_api_sendDgasp(tidsl_t *ptidsl)    
14520 + *    
14521 + *******************************************************************************************    
14522 + * DESCRIPTION: This fuction sends the HOST_DGASP message to the DSP    
14523 + *    
14524 + * INPUT:  PITIDSLHW_T *ptidsl    
14525 + *           
14526 + * RETURN: 0 SUCCESS    
14527 + *         1 FAILED    
14528 + *      
14529 + *****************************************************************************************/    
14530 +unsigned int dslhal_api_sendDgasp  
14531 +(  
14532 +tidsl_t *ptidsl  
14533 +);    
14534 +
14535 +/******************************************************************************************    
14536 + * FUNCTION NAME:    dslhal_api_setMarginThreshold(tidsl_t *ptidsl, int threshold)    
14537 + *    
14538 + *******************************************************************************************    
14539 + * DESCRIPTION: This fuction does sets the Margin threshold   
14540 + *    
14541 + * INPUT:  PITIDSLHW_T *ptidsl    
14542 + *         int threshold   
14543 + *          
14544 + *                                    
14545 + * RETURN: 0 SUCCESS    
14546 + *         1 FAILED    
14547 + *    
14548 + *****************************************************************************************/    
14549 +unsigned int dslhal_api_setMarginThreshold 
14550 +( 
14551 +tidsl_t *ptidsl, 
14552 +int threshold 
14553 +); 
14554 +
14555 +
14556 +/******************************************************************************************  
14557 + * FUNCTION NAME:    dslhal_api_setMarginMonitorFlags(tidsl_t *ptidsl, unsigned int trainflag,unsigned int shwtflag)  
14558 + *  
14559 + *******************************************************************************************  
14560 + * DESCRIPTION: This fuction does sets the Margin monitoring flag 
14561 + *  
14562 + * INPUT:  PITIDSLHW_T *ptidsl  
14563 + *         unsigned int trainflag 
14564 + *         unsigned int shwtflag  
14565 + *                                  
14566 + * RETURN: 0 SUCCESS  
14567 + *         1 FAILED  
14568 + *  
14569 + *****************************************************************************************/  
14570 +unsigned int dslhal_api_setMarginMonitorFlags
14571 +(
14572 +tidsl_t *ptidsl,
14573 +unsigned int trainflag,
14574 +unsigned int shwtflag
14575 +);  
14576 +
14577 +/******************************************************************************************
14578 +* FUNCTION NAME:    dslhal_api_setRateAdaptFlag(tidsl_t *ptidsl)
14579 +*
14580 +*******************************************************************************************
14581 +* DESCRIPTION: This fuction Sets the Rate Adapt Enable Flag
14582 +*
14583 +* INPUT:  PITIDSLHW_T *ptidsl
14584 +*         unsigned int flag //if flag = TRUE set flag else reset
14585 +* RETURN: 0 SUCCESS
14586 +*         1 FAILED
14587 +*
14588 +*****************************************************************************************/
14589 +unsigned int dslhal_api_setRateAdaptFlag
14590 +(
14591 +tidsl_t *ptidsl,
14592 +unsigned int flag
14593 +);
14594 +
14595 +/******************************************************************************************
14596 +* FUNCTION NAME:    dslhal_api_setTrellisFlag(tidsl_t *ptidsl, unsigned int flag)
14597 +*
14598 +*******************************************************************************************
14599 +* DESCRIPTION: This fuction Sets the Trellis Coding Enable Flag
14600 +*
14601 +* INPUT:  PITIDSLHW_T *ptidsl
14602 +*         unsigned int flag //if flag = TRUE set flag else reset
14603 +* RETURN: 0 SUCCESS
14604 +*         1 FAILED
14605 +*
14606 +*****************************************************************************************/
14607 +unsigned int dslhal_api_setTrellisFlag
14608 +(
14609 +tidsl_t *ptidsl,
14610 +unsigned int flag
14611 +);
14612 +
14613 +/******************************************************************************************
14614 +* FUNCTION NAME:    dslhal_api_setMaxBitsPerCarrier(tidsl_t *ptidsl,unsigned int maxbits)
14615 +*
14616 +*******************************************************************************************
14617 +* DESCRIPTION: This fuction Sets the Maximum bits per carrier value
14618 +*
14619 +* INPUT:  PITIDSLHW_T *ptidsl
14620 +*         unsigned int maxbits : should be a value between 0-15
14621 +*
14622 +* RETURN: 0 SUCCESS
14623 +*         1 FAILED
14624 +*
14625 +*****************************************************************************************/
14626 +unsigned int dslhal_api_setMaxBitsPerCarrier
14627 +(
14628 +tidsl_t *ptidsl,
14629 +unsigned int maxbits
14630 +);
14631 +
14632 +/******************************************************************************************
14633 +* FUNCTION NAME:    dslhal_api_setMaxInterleaverDepth(tidsl_t *ptidsl,unsigned int maxdepth)
14634 +*
14635 +*******************************************************************************************
14636 +* DESCRIPTION: This fuction Sets the Maximum Interleave Depth Supported
14637 +*
14638 +* INPUT:  PITIDSLHW_T *ptidsl
14639 +*         unsigned int maxdepth : Should be between 0 and 3 depending on intlv buffer
14640 +*                                 size 64-512
14641 +* RETURN: 0 SUCCESS
14642 +*         1 FAILED
14643 +*
14644 +*****************************************************************************************/
14645 +unsigned int dslhal_api_setMaxInterleaverDepth
14646 +(
14647 +tidsl_t *ptidsl,
14648 +unsigned int maxdepth
14649 +);
14650 +
14651 +/******************************************************************************************
14652 +* FUNCTION NAME:    dslhal_api_setTrainingMode(tidsl_t *ptidsl,unsigned int trainmode)
14653 +*
14654 +*******************************************************************************************
14655 +* DESCRIPTION: This fuction Sets the desired training mode(none/T1.413/G.dmt/G.lite)
14656 +*
14657 +* INPUT:  PITIDSLHW_T *ptidsl
14658 +*         unsigned int trainmode :Should be between 0 and 4; 0:No Mode 1:Multimode
14659 +*                                 2: T1.413, 3:G.dmt, 4: G.lite
14660 +* RETURN: 0 SUCCESS
14661 +*         1 FAILED
14662 +*
14663 +*****************************************************************************************/
14664 +
14665 +unsigned int dslhal_api_setTrainingMode
14666 +(
14667 +tidsl_t *ptidsl,
14668 +unsigned int trainmode
14669 +);
14670 +
14671 +/******************************************************************************************   
14672 + * FUNCTION NAME:    dslhal_api_dslRetrain(tidsl_t *ptidsl)   
14673 + *   
14674 + *******************************************************************************************   
14675 + * DESCRIPTION: This fuction sends the CMD_QUIET message to the DSP   
14676 + *   
14677 + * INPUT:  PITIDSLHW_T *ptidsl   
14678 + *          
14679 + * RETURN: 0 SUCCESS   
14680 + *         1 FAILED   
14681 + *     
14682 + *****************************************************************************************/   
14683 +unsigned int dslhal_api_dslRetrain 
14684 +( 
14685 +tidsl_t *ptidsl 
14686 +);   
14687 +
14688 +/********************************************************************************************
14689 +* FUNCTION NAME: dslhal_api_acknowledgeInterrupt()
14690 +*
14691 +*********************************************************************************************
14692 +* DESCRIPTION:
14693 +*   Sets the host interrupt bit masks
14694 +*
14695 +* Return: 0  success
14696 +*         1  failed
14697 +* 
14698 +* NOTE: 
14699 +*   DSP image is based on LITTLE endian
14700 +*
14701 +********************************************************************************************/
14702 +unsigned int dslhal_api_acknowledgeInterrupt
14703 +(tidsl_t * ptidsl
14704 +);
14705 +
14706 +/********************************************************************************************
14707 +* FUNCTION NAME: dslhal_api_disableDspHybridSelect()
14708 +*
14709 +*********************************************************************************************
14710 +* DESCRIPTION:
14711 +*   Sets the host interrupt bit masks
14712 +*
14713 +* Return: 0  success
14714 +*         1  failed
14715 +* 
14716 +* NOTE: 
14717 +*   DSP image is based on LITTLE endian
14718 +*
14719 +********************************************************************************************/
14720 +unsigned int dslhal_api_disableDspHybridSelect
14721 +(tidsl_t * ptidsl,
14722 + unsigned int disable
14723 +);
14724 +
14725 +/********************************************************************************************
14726 +* FUNCTION NAME: dslhal_api_disableDspHybridSelect()
14727 +*
14728 +*********************************************************************************************
14729 +* DESCRIPTION:
14730 +*   Sets the host interrupt bit masks
14731 +*
14732 +* Return: 0  success
14733 +*         1  failed
14734 +* 
14735 +* NOTE: 
14736 +*   DSP image is based on LITTLE endian
14737 +*
14738 +********************************************************************************************/
14739 +unsigned int dslhal_api_selectHybrid
14740 +(tidsl_t * ptidsl,
14741 + unsigned int hybridNum
14742 +);
14743 +
14744 +/********************************************************************************************
14745 +* FUNCTION NAME: dslhal_api_reportHybridMetrics()
14746 +*
14747 +*********************************************************************************************
14748 +* DESCRIPTION:
14749 +*   Sets the host interrupt bit masks
14750 +*
14751 +* Return: 0  success
14752 +*         1  failed
14753 +* 
14754 +* NOTE: 
14755 +*   DSP image is based on LITTLE endian
14756 +*
14757 +********************************************************************************************/
14758 +unsigned int dslhal_api_reportHybridMetrics
14759 +(tidsl_t * ptidsl,
14760 + int     *metric
14761 +);
14762 +
14763 +/******************************************************************************************   
14764 + * FUNCTION NAME:    dslhal_api_selectInnerOuterPair(tidsl_t *ptidsl, unsigned int pairSelect)   
14765 + *   
14766 + *******************************************************************************************   
14767 + * DESCRIPTION: This fuction sends the CMD_QUIET message to the DSP   
14768 + *   
14769 + * INPUT:  PITIDSLHW_T *ptidsl   
14770 + *          
14771 + * RETURN: 0 SUCCESS   
14772 + *         1 FAILED   
14773 + *     
14774 + *****************************************************************************************/   
14775 +
14776 +unsigned int dslhal_api_selectInnerOuterPair
14777 +(tidsl_t *ptidsl,
14778 +unsigned int pairSelect
14779 +);
14780 +
14781 +/******************************************************************************************   
14782 + * FUNCTION NAME:    dslhal_api_resetTrainFailureLog(tidsl_t *ptidsl, unsigned int pairSelect)   
14783 + *   
14784 + *******************************************************************************************   
14785 + * DESCRIPTION: This fuction sends the CMD_QUIET message to the DSP   
14786 + *   
14787 + * INPUT:  PITIDSLHW_T *ptidsl   
14788 + *          
14789 + * RETURN: 0 SUCCESS   
14790 + *         1 FAILED   
14791 + *     
14792 + *****************************************************************************************/   
14793 +
14794 +unsigned int dslhal_api_resetTrainFailureLog
14795 +(tidsl_t *ptidsl
14796 +);
14797 +
14798 +/********************************************************************************************
14799 +* FUNCTION NAME: dslhal_api_controlLed()
14800 +*
14801 +*********************************************************************************************
14802 +* DESCRIPTION:
14803 +*   Sets the host interrupt bit masks
14804 +*
14805 +* Return: 0  success
14806 +*         1  failed
14807 +* 
14808 +* NOTE: 
14809 +*   DSP image is based on LITTLE endian
14810 +*
14811 +********************************************************************************************/
14812 +unsigned int dslhal_api_configureLed
14813 +(tidsl_t * ptidsl,
14814 +unsigned int idLed, 
14815 +unsigned int onOff
14816 +);
14817 +
14818 +/********************************************************************************************
14819 +* FUNCTION NAME: dslhal_api_configureExternBert()
14820 +*
14821 +*********************************************************************************************
14822 +* DESCRIPTION:
14823 +*   Sets the host interrupt bit masks
14824 +*
14825 +* Return: 0  success
14826 +*         1  failed
14827 +* 
14828 +* NOTE: 
14829 +*   DSP image is based on LITTLE endian
14830 +*
14831 +********************************************************************************************/
14832 +unsigned int dslhal_api_configureExternBert
14833 +(tidsl_t * ptidsl,
14834 +unsigned int configParm, 
14835 +unsigned int parmVal
14836 +);
14837 +
14838 +/********************************************************************************************
14839 +* FUNCTION NAME: dslhal_api_configureAtmBert()
14840 +*
14841 +*********************************************************************************************
14842 +* DESCRIPTION:
14843 +*   Sets the host interrupt bit masks
14844 +*
14845 +* Return: 0  success
14846 +*         1  failed
14847 +* 
14848 +* NOTE: 
14849 +*   DSP image is based on LITTLE endian
14850 +*
14851 +********************************************************************************************/
14852 +unsigned int dslhal_api_configureAtmBert
14853 +(tidsl_t * ptidsl,
14854 +unsigned int configParm, 
14855 +unsigned int parmVal
14856 +);
14857 +
14858 +/********************************************************************************************
14859 +* FUNCTION NAME: dslhal_api_configureDgaspLpr()
14860 +*
14861 +*********************************************************************************************
14862 +* DESCRIPTION:
14863 +*   Sets the host interrupt bit masks
14864 +*
14865 +* Return: 0  success
14866 +*         1  failed
14867 +* 
14868 +* NOTE: 
14869 +*   DSP image is based on LITTLE endian
14870 +*
14871 +********************************************************************************************/
14872 +unsigned int dslhal_api_configureDgaspLpr
14873 +(tidsl_t * ptidsl,
14874 +unsigned int configParm, 
14875 +unsigned int parmVal
14876 +);
14877 +
14878 +/********************************************************************************************
14879 +* FUNCTION NAME: dslhal_advcfg_onOffPcb()
14880 +*
14881 +*********************************************************************************************
14882 +* DESCRIPTION:
14883 +*   Sets the host interrupt bit masks
14884 +*
14885 +* Return: 0  success
14886 +*         1  failed
14887 +* 
14888 +* NOTE: 
14889 +*   DSP image is based on LITTLE endian
14890 +*
14891 +********************************************************************************************/
14892 +unsigned int dslhal_advcfg_onOffPcb
14893 +(tidsl_t * ptidsl,
14894 +unsigned int onOff
14895 +);
14896 +
14897 +/********************************************************************************************
14898 +* FUNCTION NAME: dslhal_advcfg_onOffBitSwap()
14899 +*
14900 +*********************************************************************************************
14901 +* DESCRIPTION:
14902 +*   Turns on / off the power cutback feature; 
14903 +* Input
14904 +*         usDs;  0 = us  and 1 = ds;
14905 +*         onOff; 0 = OFF and 1 = ON
14906 +*
14907 +* Return: 0  success
14908 +*         1  failed
14909 +* 
14910 +* NOTE: 
14911 +*   DSP image is based on LITTLE endian
14912 +*
14913 +********************************************************************************************/
14914 +unsigned int dslhal_advcfg_onOffBitSwap
14915 +(tidsl_t * ptidsl,
14916 + unsigned int usDs, 
14917 + unsigned int onOff
14918 +);
14919 +
14920 +/********************************************************************************************
14921 +* FUNCTION NAME: dslhal_advcfg_configDsTones()
14922 +*
14923 +*********************************************************************************************
14924 +* DESCRIPTION:
14925 +*   Turns on / off specific tones in the downstream direction; 
14926 +* Input
14927 +*        pointer to the array specifying the tones to be turned on/off 
14928 +*        
14929 +*
14930 +* Return: 0  success
14931 +*         1  failed
14932 +* 
14933 +* NOTE: 
14934 +*   DSP image is based on LITTLE endian
14935 +*
14936 +********************************************************************************************/
14937 +unsigned int dslhal_advcfg_configDsTones
14938 +(tidsl_t * ptidsl,
14939 + unsigned int *dsTones
14940 +);
14941 +
14942 +/********************************************************************************************
14943 +* FUNCTION NAME: dslhal_advcfg_getAocBitSwapBuffer()
14944 +*
14945 +*********************************************************************************************
14946 +* DESCRIPTION:
14947 +*   Fetches the Tx/Rx AOC bitswap Buffer; 
14948 +* Input
14949 +*        Transmit / Receive buffer to be fetched 
14950 +*        
14951 +*
14952 +* Return: 0  success
14953 +*         1  failed
14954 +* 
14955 +* NOTE: 
14956 +*   DSP image is based on LITTLE endian
14957 +*
14958 +********************************************************************************************/
14959 +unsigned int dslhal_advcfg_getAocBitswapBuffer
14960 +(tidsl_t * ptidsl,
14961 +unsigned int usDs
14962 +);
14963 +
14964 +/********************************************************************************************
14965 +* FUNCTION NAME: dslhal_advcfg_readTrainingMessages()
14966 +*
14967 +*********************************************************************************************
14968 +* DESCRIPTION:
14969 +*   Reads all the training messages on demand; 
14970 +* Input
14971 +*        tidsl_t *ptidsl : Pointer to application structure
14972 +*        void *msgStruct : Pointer to Message Structure 
14973 +*        
14974 +*
14975 +* Return: 0  success
14976 +*         1  failed
14977 +* 
14978 +* NOTE: 
14979 +*   DSP image is based on LITTLE endian
14980 +*
14981 +********************************************************************************************/
14982 +unsigned int dslhal_advcfg_readTrainingMessages
14983 +(tidsl_t * ptidsl,
14984 +void *msgPtr
14985 +);
14986 +
14987 +/********************************************************************************************
14988 +* FUNCTION NAME: dslhal_advcfg_getTrainingState()
14989 +*
14990 +*********************************************************************************************
14991 +* DESCRIPTION:
14992 +*   Reads all the training messages on demand; 
14993 +* Input
14994 +*        tidsl_t *ptidsl : Pointer to application structure
14995 +*        void *msgStruct : Pointer to training state structure 
14996 +*        
14997 +*
14998 +* Return: 0  success
14999 +*         1  failed
15000 +* 
15001 +* NOTE: 
15002 +*   DSP image is based on LITTLE endian
15003 +*
15004 +********************************************************************************************/
15005 +unsigned int dslhal_advcfg_getTrainingState
15006 +(tidsl_t * ptidsl,
15007 +void *statePtr
15008 +);
15009 +
15010 +/********************************************************************************************
15011 +* FUNCTION NAME: dslhal_advcfg_resetBitSwapMessageLog()
15012 +*
15013 +*********************************************************************************************
15014 +* DESCRIPTION:
15015 +*   Clears the Aoc Bitswap Message Log 
15016 +* Input
15017 +*        tidsl_t *ptidsl : Pointer to application structure
15018 +*        unsigned int usDs ; Upstream=0, Downstream=1
15019 +*
15020 +* Return: 0  success
15021 +*         1  failed
15022 +* 
15023 +********************************************************************************************/
15024 +unsigned int dslhal_advcfg_resetBitSwapMessageLog
15025 +(tidsl_t * ptidsl, 
15026 + unsigned int usDs
15027 +);
15028 +
15029 +/********************************************************************************************
15030 +* FUNCTION NAME: dslhal_advcfg_setConstellationBinNumber()
15031 +*
15032 +*********************************************************************************************
15033 +* DESCRIPTION:
15034 +*   Specifies the bin number for which constellation data should be fetched
15035 +* Input
15036 +*        tidsl_t *ptidsl : Pointer to application structure
15037 +*        unsigned int binNum : constellation bin number whose data is required
15038 +*
15039 +* Return: 0  success
15040 +*         1  failed
15041 +* 
15042 +********************************************************************************************/
15043 +unsigned int dslhal_advcfg_setConstellationBinNumber
15044 +(tidsl_t * ptidsl, 
15045 + unsigned int binNum
15046 +);
15047 +
15048 +/********************************************************************************************
15049 +* FUNCTION NAME: dslhal_advcfg_resetTrainStateHistory()
15050 +*
15051 +*********************************************************************************************
15052 +* DESCRIPTION:
15053 +*   Clears the Training State History Log 
15054 +* Input
15055 +*        tidsl_t *ptidsl : Pointer to application structure
15056 +*        
15057 +*
15058 +* Return: 0  success
15059 +*         1  failed
15060 +* 
15061 +********************************************************************************************/
15062 +unsigned int dslhal_advcfg_resetTrainStateHistory
15063 +(tidsl_t * ptidsl
15064 +);
15065 +
15066 +/********************************************************************************************
15067 +* FUNCTION NAME: dslhal_advcfg_getSnrPerBin()
15068 +*
15069 +*********************************************************************************************
15070 +* DESCRIPTION:
15071 +*   Get SNR data per bin 
15072 +* Input
15073 +*        tidsl_t *ptidsl : Pointer to application structure
15074 +*        
15075 +*
15076 +* Return: 0  success
15077 +*         1  failed
15078 +* 
15079 +********************************************************************************************/
15080 +unsigned int dslhal_advcfg_getSnrPerBin
15081 +(tidsl_t * ptidsl,
15082 + unsigned int snrBufferOpt
15083 +);
15084 +
15085 +/********************************************************************************************
15086 +* FUNCTION NAME: dslhal_advcfg_logEocMessages()
15087 +*
15088 +*********************************************************************************************
15089 +* DESCRIPTION:
15090 +*   Logs EOC messages sent by the Modem to the CO
15091 +* Input
15092 +*        tidsl_t *ptidsl : Pointer to application structure
15093 +*        unsigned int eocLowerBytes : Lower [1-5] bits of EOC Message
15094 +*        unsigned int eocUpperBytes : Upper [6-13] bits of EOC Message
15095 +*
15096 +* Return: 0  success
15097 +*         1  failed
15098 +* 
15099 +********************************************************************************************/
15100 +unsigned int dslhal_advcfg_logEocMessages
15101 +(tidsl_t * ptidsl, 
15102 + unsigned int usDs,
15103 + unsigned int eocLowerBytes, 
15104 + unsigned int eocUpperBytes
15105 +);
15106 +
15107 +/********************************************************************************************
15108 +* FUNCTION NAME: dslhal_advcfg_getReasonForDrop()
15109 +*
15110 +*********************************************************************************************
15111 +* DESCRIPTION:
15112 +*   Reads the reason for dropping DSL connection; 
15113 +* Input
15114 +*        tidsl_t *ptidsl : Pointer to application structure
15115 +
15116 +*        
15117 +*
15118 +* Return: 0  success
15119 +*         1  failed
15120 +* 
15121 +* NOTE: 
15122 +*   DSP image is based on LITTLE endian
15123 +*
15124 +********************************************************************************************/
15125 +unsigned int dslhal_advcfg_getReasonForDrop
15126 +(tidsl_t * ptidsl
15127 +);
15128 +
15129 +/********************************************************************************************
15130 +* FUNCTION NAME: dslhal_advcfg_ctrlMaxAvgFineGains()
15131 +*
15132 +*********************************************************************************************
15133 +* DESCRIPTION:
15134 +*   Turns on / off the host control for Max Avg Fine Gains; 0 = OFF and 1 = ON
15135 +*
15136 +* Return: 0  success
15137 +*         1  failed
15138 +* 
15139 +* NOTE: 
15140 +*   DSP image is based on LITTLE endian
15141 +*
15142 +********************************************************************************************/
15143 +unsigned int dslhal_advcfg_ctrlMaxAvgFineGains
15144 +(tidsl_t * ptidsl,
15145 +unsigned int onOff
15146 +);
15147 +
15148 +
15149 +/********************************************************************************************
15150 +* FUNCTION NAME: dslhal_advcfg_setMaxAvgFineGain()
15151 +*
15152 +*********************************************************************************************
15153 +* DESCRIPTION:
15154 +*   Set the Maximum Average Fine Gain Value
15155 +*
15156 +* Return: 0  success
15157 +*         1  failed
15158 +* 
15159 +* NOTE: 
15160 +*   DSP image is based on LITTLE endian
15161 +*
15162 +********************************************************************************************/
15163 +unsigned int dslhal_advcfg_setMaxAvgFineGain
15164 +(tidsl_t * ptidsl,
15165 + short fineGain
15166 +);
15167 +/********************************************************************************************
15168 +* FUNCTION NAME: dslhal_advcfg_readPhySettings()
15169 +*
15170 +*********************************************************************************************
15171 +* DESCRIPTION:
15172 +*   Reads the advanced Phy layer settings on demand; 
15173 +* Input
15174 +*        tidsl_t *ptidsl : Pointer to application structure
15175 +*        void *cfgStruct : Pointer to Phy Config Structure 
15176 +*        
15177 +*
15178 +* Return: 0  success
15179 +*         1  failed
15180 +* 
15181 +* NOTE: 
15182 +*   DSP image is based on LITTLE endian
15183 +*
15184 +********************************************************************************************/
15185 +unsigned int dslhal_advcfg_readPhySettings
15186 +(tidsl_t * ptidsl,
15187 +void *cfgPtr
15188 +);
15189 +
15190 +/********************************************************************************************
15191 +* FUNCTION NAME: dslhal_advcfg_setBlackOutBits()
15192 +*
15193 +*********************************************************************************************
15194 +* DESCRIPTION:
15195 +*   Sets the Blackout Bits in the RMSGPCB message
15196 +*
15197 +* Return: 0  success
15198 +*         1  failed
15199 +* 
15200 +* NOTE: 
15201 +*   DSP image is based on LITTLE endian
15202 +*
15203 +********************************************************************************************/
15204 +unsigned int dslhal_advcfg_setBlackOutBits
15205 +(tidsl_t * ptidsl
15206 +);
15207 +
15208 +/********************************************************************************************
15209 +* FUNCTION NAME: dslhal_api_genericDspRead()
15210 +*
15211 +*********************************************************************************************
15212 +* DESCRIPTION:
15213 +*  Reads from a generic location in the host interface
15214 +*
15215 +* Return: 0  success
15216 +*         1  failed
15217 +* 
15218 +* NOTE: 
15219 +*   DSP image is based on LITTLE endian
15220 +*
15221 +********************************************************************************************/
15222 +unsigned int dslhal_api_genericDspRead
15223 +(tidsl_t * ptidsl,
15224 + unsigned int offset1,
15225 + unsigned int offset2,
15226 + unsigned int offset3,
15227 + unsigned char* localBuffer,
15228 + unsigned int numBytes
15229 +);
15230 +
15231 +/********************************************************************************************
15232 +* FUNCTION NAME: dslhal_api_genericDspWrite()
15233 +*
15234 +*********************************************************************************************
15235 +* DESCRIPTION:
15236 +*  Writes to a generic location in the host interface
15237 +*
15238 +* Return: 0  success
15239 +*         1  failed
15240 +* 
15241 +* NOTE: 
15242 +*   DSP image is based on LITTLE endian
15243 +*
15244 +********************************************************************************************/
15245 +unsigned int dslhal_api_genericDspWrite
15246 +(tidsl_t * ptidsl,
15247 + unsigned int offset1,
15248 + unsigned int offset2,
15249 + unsigned int offset3,
15250 + unsigned char* localBuffer,
15251 + unsigned int numBytes
15252 +);
15253 +
15254 +/********************************************************************************************
15255 +* FUNCTION NAME: dslhal_api_dspInterfaceRead()
15256 +*
15257 +*********************************************************************************************
15258 +* DESCRIPTION:
15259 +*  Reads from a generic location in the host interface
15260 +*
15261 +* Return: 0  success
15262 +*         1  failed
15263 +* 
15264 +* NOTE: 
15265 +*   DSP image is based on LITTLE endian
15266 +*
15267 +********************************************************************************************/
15268 +unsigned int dslhal_api_dspInterfaceRead
15269 +(tidsl_t * ptidsl,
15270 + unsigned int baseAddr,
15271 + unsigned int numOffsets,
15272 + unsigned int *offsets,
15273 + unsigned char* localBuffer,
15274 + unsigned int numBytes
15275 +);
15276 +
15277 +/********************************************************************************************
15278 +* FUNCTION NAME: dslhal_api_dspInterfaceWrite()
15279 +*
15280 +*********************************************************************************************
15281 +* DESCRIPTION:
15282 +*  Writes to a generic location in the host interface
15283 +*
15284 +* Return: 0  success
15285 +*         1  failed
15286 +* 
15287 +* NOTE: 
15288 +*   DSP image is based on LITTLE endian
15289 +*
15290 +********************************************************************************************/
15291 +unsigned int dslhal_api_dspInterfaceWrite
15292 +(tidsl_t * ptidsl,
15293 + unsigned int baseAddr,
15294 + unsigned int numOffsets,
15295 + unsigned int *offsets,
15296 + unsigned char* localBuffer,
15297 + unsigned int numBytes
15298 +);
15299 +
15300 +/******************************************************************************************     
15301 + * FUNCTION NAME:    dslhal_api_sendMailboxCommand(tidsl_t *ptidsl, unsigned int cmd)     
15302 + *     
15303 + *******************************************************************************************     
15304 + * DESCRIPTION: This fuction sends the passed mailbox command to the DSP     
15305 + *     
15306 + * INPUT:  PITIDSLHW_T *ptidsl     
15307 + *         unsigned int cmd
15308 + *            
15309 + * RETURN: 0 SUCCESS     
15310 + *         1 FAILED     
15311 + *       
15312 + *****************************************************************************************/     
15313 +unsigned int dslhal_api_sendMailboxCommand
15314 +(tidsl_t *ptidsl, 
15315 +unsigned int cmd
15316 +); 
15317 +
15318 +#ifdef INTERNAL_BUILD
15319 +#include <dsl_hal_internal_api.h>
15320 +#endif
15321 +
15322 +
15323 +#endif /* pairs #ifndef __DSL_APPLICATION_INTERFACE_H__ */
15324 diff -urN linux.old/drivers/atm/sangam_atm/dsl_hal_logtable.h linux.dev/drivers/atm/sangam_atm/dsl_hal_logtable.h
15325 --- linux.old/drivers/atm/sangam_atm/dsl_hal_logtable.h 1970-01-01 01:00:00.000000000 +0100
15326 +++ linux.dev/drivers/atm/sangam_atm/dsl_hal_logtable.h 2005-08-23 04:46:50.097843696 +0200
15327 @@ -0,0 +1,259 @@
15328 +unsigned int log10[]=
15329 +{
15330 +           0,
15331 +         771,
15332 +        1221,
15333 +        1541,
15334 +        1789,
15335 +        1992,
15336 +        2163,
15337 +        2312,
15338 +        2443,
15339 +        2560,
15340 +        2666,
15341 +        2763,
15342 +        2852,
15343 +        2934,
15344 +        3011,
15345 +        3083,
15346 +        3150,
15347 +        3213,
15348 +        3274,
15349 +        3331,
15350 +        3385,
15351 +        3437,
15352 +        3486,
15353 +        3533,
15354 +        3579,
15355 +        3622,
15356 +        3664,
15357 +        3705,
15358 +        3744,
15359 +        3781,
15360 +        3818,
15361 +        3853,
15362 +        3887,
15363 +        3921,
15364 +        3953,
15365 +        3984,
15366 +        4015,
15367 +        4044,
15368 +        4073,
15369 +        4101,
15370 +        4129,
15371 +        4156,
15372 +        4182,
15373 +        4207,
15374 +        4232,
15375 +        4257,
15376 +        4281,
15377 +        4304,
15378 +        4327,
15379 +        4349,
15380 +        4371,
15381 +        4393,
15382 +        4414,
15383 +        4435,
15384 +        4455,
15385 +        4475,
15386 +        4495,
15387 +        4514,
15388 +        4533,
15389 +        4552,
15390 +        4570,
15391 +        4589,
15392 +        4606,
15393 +        4624,
15394 +        4641,
15395 +        4658,
15396 +        4675,
15397 +        4691,
15398 +        4707,
15399 +        4723,
15400 +        4739,
15401 +        4755,
15402 +        4770,
15403 +        4785,
15404 +        4800,
15405 +        4815,
15406 +        4829,
15407 +        4844,
15408 +        4858,
15409 +        4872,
15410 +        4886,
15411 +        4899,
15412 +        4913,
15413 +        4926,
15414 +        4939,
15415 +        4952,
15416 +        4965,
15417 +        4978,
15418 +        4990,
15419 +        5003,
15420 +        5015,
15421 +        5027,
15422 +        5039,
15423 +        5051,
15424 +        5063,
15425 +        5075,
15426 +        5086,
15427 +        5098,
15428 +        5109,
15429 +        5120,
15430 +        5131,
15431 +        5142,
15432 +        5153,
15433 +        5164,
15434 +        5174,
15435 +        5185,
15436 +        5195,
15437 +        5206,
15438 +        5216,
15439 +        5226,
15440 +        5236,
15441 +        5246,
15442 +        5256,
15443 +        5266,
15444 +        5275,
15445 +        5285,
15446 +        5295,
15447 +        5304,
15448 +        5313,
15449 +        5323,
15450 +        5332,
15451 +        5341,
15452 +        5350,
15453 +        5359,
15454 +        5368,
15455 +        5377,
15456 +        5386,
15457 +        5394,
15458 +        5403,
15459 +        5412,
15460 +        5420,
15461 +        5429,
15462 +        5437,
15463 +        5445,
15464 +        5454,
15465 +        5462,
15466 +        5470,
15467 +        5478,
15468 +        5486,
15469 +        5494,
15470 +        5502,
15471 +        5510,
15472 +        5518,
15473 +        5525,
15474 +        5533,
15475 +        5541,
15476 +        5548,
15477 +        5556,
15478 +        5563,
15479 +        5571,
15480 +        5578,
15481 +        5586,
15482 +        5593,
15483 +        5600,
15484 +        5607,
15485 +        5614,
15486 +        5622,
15487 +        5629,
15488 +        5636,
15489 +        5643,
15490 +        5649,
15491 +        5656,
15492 +        5663,
15493 +        5670,
15494 +        5677,
15495 +        5683,
15496 +        5690,
15497 +        5697,
15498 +        5703,
15499 +        5710,
15500 +        5716,
15501 +        5723,
15502 +        5729,
15503 +        5736,
15504 +        5742,
15505 +        5749,
15506 +        5755,
15507 +        5761,
15508 +        5767,
15509 +        5773,
15510 +        5780,
15511 +        5786,
15512 +        5792,
15513 +        5798,
15514 +        5804,
15515 +        5810,
15516 +        5816,
15517 +        5822,
15518 +        5828,
15519 +        5834,
15520 +        5839,
15521 +        5845,
15522 +        5851,
15523 +        5857,
15524 +        5862,
15525 +        5868,
15526 +        5874,
15527 +        5879,
15528 +        5885,
15529 +        5891,
15530 +        5896,
15531 +        5902,
15532 +        5907,
15533 +        5913,
15534 +        5918,
15535 +        5924,
15536 +        5929,
15537 +        5934,
15538 +        5940,
15539 +        5945,
15540 +        5950,
15541 +        5955,
15542 +        5961,
15543 +        5966,
15544 +        5971,
15545 +        5976,
15546 +        5981,
15547 +        5986,
15548 +        5992,
15549 +        5997,
15550 +        6002,
15551 +        6007,
15552 +        6012,
15553 +        6017,
15554 +        6022,
15555 +        6027,
15556 +        6031,
15557 +        6036,
15558 +        6041,
15559 +        6046,
15560 +        6051,
15561 +        6056,
15562 +        6060,
15563 +        6065,
15564 +        6070,
15565 +        6075,
15566 +        6079,
15567 +        6084,
15568 +        6089,
15569 +        6093,
15570 +        6098,
15571 +        6103,
15572 +        6107,
15573 +        6112,
15574 +        6116,
15575 +        6121,
15576 +        6125,
15577 +        6130,
15578 +        6134,
15579 +        6139,
15580 +        6143,
15581 +        6148,
15582 +        6152,
15583 +        6156,
15584 +        6161,
15585 +        6165
15586 +    };
15587 diff -urN linux.old/drivers/atm/sangam_atm/dsl_hal_register.h linux.dev/drivers/atm/sangam_atm/dsl_hal_register.h
15588 --- linux.old/drivers/atm/sangam_atm/dsl_hal_register.h 1970-01-01 01:00:00.000000000 +0100
15589 +++ linux.dev/drivers/atm/sangam_atm/dsl_hal_register.h 2005-08-23 04:46:50.097843696 +0200
15590 @@ -0,0 +1,337 @@
15591 +#ifndef ___DSL_REGISTER_DEFINES_H___
15592 +#define ___DSL_REGISTER_DEFINES_H___ 1
15593 +
15594 +/*******************************************************************************
15595 +* FILE PURPOSE:     DSL HAL H/W Registers and Constant Declarations for Sangam
15596 +*
15597 +********************************************************************************
15598 +* FILE NAME:        dsl_hal_register.h
15599 +*
15600 +* DESCRIPTION:  
15601 +*       Contains DSL HAL APIs for Adam2 OS functions
15602 +*  
15603 +*                    
15604 +* (C) Copyright 2001-02, Texas Instruments, Inc.
15605 +*    History
15606 +*    Date        Version            Notes
15607 +*    06Feb03     0.00.00            RamP   Created
15608 +*    21Mar03     0.00.01            RamP   Changed header files for Modular 
15609 +*                                          build framework
15610 +*    21Mar03     0.00.02            RamP   Introduced malloc size for DSP f/w
15611 +*    07Apr03     0.00.03            RamP   Implemented new error reporting scheme
15612 +*                                          Changed Commenting to C style only
15613 +*    12Apr03     0.00.04            RamP   Added Interrupt Mask defines
15614 +*    14Apr03     0.00.05            RamP   Renamed macros for REG8, REG16 & REG32
15615 +*    21Apr03     0.01.00            RamP   Added Interrupt source/clear registers
15616 +*                                          Changed enum RSTATE_SHOWTIME to 5
15617 +*    24Apr03     0.01.01            RamP   Moved the RSTATE enum to api.h
15618 +*                                          Added olay recovery error condition
15619 +*    14May03     0.01.02            RamP   Added defines for power computation
15620 +*                                          Added error condition for hybrids
15621 +*    04Jun03     0.01.03            RamP   Added enum for config flags, 
15622 +*                                          Cleaned up AR5 register defines
15623 +*                                          Added defines for higher data rate
15624 +*    06Jun03     0.01.04            RamP   Added error & interrupt defines
15625 +*    09Jun03     0.01.05            RamP   Modified enum for current config
15626 +*                                          Added additional C-Rates defines
15627 +*    18Jul03     0.01.06            RamP   Modified internal build flow
15628 +*    21Aug03     0.01.07            RamP   Added constellation buffer size
15629 +*    08Oct03     0.01.08            RamP   Added us/ds Bits n gains size
15630 +*    12Oct03     0.01.08            RamP   Added ADSL2 Message sizes, lengths 
15631 +*                                          and offsets for various formats
15632 +*    29Oct03     0.01.09            RamP   Added ADSL2 Delt offsets & sizes
15633 +*    24Nov03     0.01.10            RamP   Added bit field number, scan vector
15634 +*    26Dec03     0.01.11            RamP   Removed the oamFeature masks to api.h
15635 +*******************************************************************************/
15636 +
15637 +#include "env_def_typedefs.h"
15638 +#ifdef INTERNAL_BUILD
15639 +#include "dev_host_internalinterface.h"
15640 +#endif
15641 +#include "dev_host_interface.h"
15642 +#include "dsl_hal_api.h"
15643 +
15644 +#define ADSLSS_BASE                                                     0x01000000
15645 +#define BBIF_BASE                                                       0x02000000
15646 +
15647 +#define ADSLSSADR                                                       (BBIF_BASE+0x0000)
15648 +#define ADSLSSADRMASK                                                   0xff000000
15649 +#define WAKEUP_DSP                                            0x00000001
15650 +
15651 +/* Ax7 Reset Control */
15652 +
15653 +#define RST_CNTRL_BASE                                                  0x8611600
15654 +#define RST_CNTRL_PRCR                                                  (RST_CNTRL_BASE + 0x00 )
15655 +
15656 +#define    RST_CNTRL_PRCR_GPIO                                  0x00000040
15657 +#define    RST_CNTRL_PRCR_ADSLSS                                0x00000080
15658 +#define    RST_CNTRL_PRCR_USB                                   0x00000100
15659 +#define    RST_CNTRL_PRCR_SAR                                   0x00000200
15660 +#define    RST_CNTRL_PRCR_DSP                                   0x00800000
15661 +#define    RST_CNTRL_PRCR_EMAC1                                 0x00200000      /* EMAC1 reset */
15662 +
15663 +#define    RST_CNTRL_SWRCR                                      (RST_CNTRL_BASE + 0x04 )
15664 +#define    RST_SWRCR_SWR0                                       0x00000001
15665 +#define    RST_SWRCR_SWR1                                       0x00000002
15666 +
15667 +#define    RST_CNTRL_RSR                                        (TNETD53XX_RST_CNTRL_BASE + 0x08 )
15668 +#define    RST_RSR_RSCAUSE                                      0x00000003   /* Software Reset Caused by writing to SWR1 bit */
15669 +
15670 +
15671 +/* ******************************************************
15672 +Interrupt sources on Ax7 interrupt controller.
15673 +The reserved sources are noted.
15674 +********************************************************* */
15675 +
15676 +#define INTR_CNTRL_SRC_SECOND                                   0
15677 +#define INTR_CNTRL_SRC_EXTERNAL0                                1
15678 +#define INTR_CNTRL_SRC_EXTERNAL1                                2
15679 +/* reserved sources ... */
15680 +#define INTR_CNTRL_SRC_TIMER0                                   5
15681 +#define INTR_CNTRL_SRC_TIMER1                                   6
15682 +#define INTR_CNTRL_SRC_UART0                                    7
15683 +#define INTR_CNTRL_SRC_UART1                                    8
15684 +#define INTR_CNTRL_SRC_DMA0                                     9
15685 +#define INTR_CNTRL_SRC_DMA1                                     10
15686 +/* reserved sources ... */
15687 +#define INTR_CNTRL_SRC_SAR                                      15
15688 +/* reserved sources ... */
15689 +#define INTR_CNTRL_SRC_EMAC0                                    19
15690 +/* reserved sources ... */
15691 +#define INTR_CNTRL_SRC_VLYNQ0                                   21
15692 +#define INTR_CNTRL_SRC_CODEC_WAKE                               22
15693 +/* reserved sources ... */
15694 +#define INTR_CNTRL_SRC_USB                                      24
15695 +#define INTR_CNTRL_SRC_VLYNQ1                                   25
15696 +/* reserved sources ... */
15697 +#define INTR_CNTRL_SRC_EMAC1                                    28
15698 +#define INTR_CNTRL_SRC_I2C                                      29
15699 +#define INTR_CNTRL_SRC_DMA2                                     30
15700 +#define INTR_CNTRL_SRC_DMA3                                     31
15701 +/* reserved sources ... */
15702 +#define INTR_CNTRL_SRC_VDMA_RX                                  37
15703 +#define INTR_CNTRL_SRC_VDMA_TX                                  38
15704 +#define INTR_CNTRL_SRC_ADSLSS                                   39
15705 +
15706 +#ifndef K0BASE 
15707 +#define K0BASE                                                          0x80000000
15708 +#endif
15709 +
15710 +#ifndef K1BASE 
15711 +#define K1BASE                                                          0xA0000000
15712 +#endif
15713 +
15714 +#ifndef PHYS_ADDR
15715 +#define PHYS_ADDR(X)                                                    ((X) & 0X1FFFFFFF)
15716 +#endif
15717 +
15718 +#ifndef PHYS_TO_K0
15719 +#define PHYS_TO_K0(X)                                                   (PHYS_ADDR(X)|K0BASE)
15720 +#endif
15721 +
15722 +#ifndef PHYS_TO_K1
15723 +#define PHYS_TO_K1(X)                                                   (PHYS_ADDR(X)|K1BASE)
15724 +#endif
15725 +
15726 +#ifndef DSLHAL_REG8
15727 +#define DSLHAL_REG8( addr )                                          (*(volatile unsigned short *) PHYS_TO_K1(addr))
15728 +#endif
15729 +
15730 +#ifndef DSLHAL_REG16
15731 +#define DSLHAL_REG16( addr )                                         (*(volatile unsigned short *)PHYS_TO_K1(addr))
15732 +#endif
15733 +
15734 +#ifndef DSLHAL_REG32
15735 +#define DSLHAL_REG32( addr )                                         (*(volatile unsigned int *)PHYS_TO_K1(addr))
15736 +#endif
15737 +
15738 +#ifndef NULL
15739 +#define NULL    0
15740 +#endif
15741 +
15742 +#ifndef TRUE
15743 +#define TRUE    (1==1)
15744 +#endif
15745 +
15746 +#ifndef FALSE
15747 +#define FALSE   (1==2)
15748 +#endif
15749 +
15750 +/*******************************************************************************
15751 +* Type Defines for Library
15752 +********************************************************************************/
15753 +typedef unsigned int size_t;
15754 +
15755 +#define TIDSL_HW_CREATED                                                0x00000001
15756 +#define TIDSL_HW_OPENED                                                 0x00000002
15757 +#define TIDSL_HW_STARTED                                                0x00000004
15758 +#define TIDSL_OS_INITIALIZED                                            0x00000008
15759 +
15760 +/* Data Pump CRATES Table Defines */
15761 +#define SIZE_OF_CRATES1_TABLE                                           120
15762 +#define CRATES1_BF_LS0                                                  7
15763 +#define CRATES1_BI_LS0                                                  17
15764 +#define CRATES1_BF_AS0                                                  0
15765 +#define CRATES1_BI_AS0                                                  10
15766 +#define CRATES1_BF_DSRS                                                 20
15767 +#define CRATES1_BI_DSRS                                                 21
15768 +#define CRATES1_BFI_DSS                                                 22
15769 +#define CRATES1_BFI_DSI                                                 23
15770 +#define CRATES1_BF_USRS                                                 25
15771 +#define CRATES1_BI_USRS                                                 26
15772 +#define CRATES1_BFI_USS                                                 27
15773 +#define CRATES1_BFI_USI                                                 28
15774 +
15775 +#define FAST_PATH                                                       0
15776 +#define INTERLEAVED_PATH                                                1
15777 +
15778 +#define LINE_NOT_CONNECTED                                              0
15779 +#define LINE_CONNECTED                                                  1
15780 +#define LINE_DISCONNECTED                                               2 
15781 +#define LINE_NOT_TO_CONNECT                                             3 
15782 +
15783 +#define MAXSECTIONS                                                     125
15784 +
15785 +/*****************************************************************************************
15786 + * Localstructure declarations
15787 + *
15788 + ****************************************************************************************/
15789 +enum
15790 +{
15791 +  DSLHAL_ERROR_NO_ERRORS,                /* 00 */
15792 +  DSLHAL_ERROR_UNRESET_ADSLSS,           /* 01 */
15793 +  DSLHAL_ERROR_RESET_ADSLSS,             /* 02 */
15794 +  DSLHAL_ERROR_UNRESET_DSP,              /* 03 */ 
15795 +  DSLHAL_ERROR_RESET_DSP,                /* 04 */    
15796 +  DSLHAL_ERROR_NO_FIRMWARE_IMAGE,        /* 05 */
15797 +  DSLHAL_ERROR_MALLOC,                   /* 06 */
15798 +  DSLHAL_ERROR_FIRMWARE_MALLOC,          /* 07 */
15799 +  DSLHAL_ERROR_DIAG_MALLOC,              /* 08 */
15800 +  DSLHAL_ERROR_OVERLAY_MALLOC,           /* 09 */
15801 +  DSLHAL_ERROR_CODE_DOWNLOAD,            /* 10 */
15802 +  DSLHAL_ERROR_DIAGCODE_DOWNLOAD,        /* 11 */
15803 +  DSLHAL_ERROR_BLOCK_READ,               /* 12 */  
15804 +  DSLHAL_ERROR_BLOCK_WRITE,              /* 13 */  
15805 +  DSLHAL_ERROR_MAILBOX_READ,             /* 14 */  
15806 +  DSLHAL_ERROR_MAILBOX_WRITE,            /* 15 */
15807 +  DSLHAL_ERROR_MAILBOX_NOMAIL,           /* 16 */
15808 +  DSLHAL_ERROR_MAILBOX_OVERFLOW,         /* 17 */
15809 +  DSLHAL_ERROR_INVALID_PARAM,            /* 18 */
15810 +  DSLHAL_ERROR_ADDRESS_TRANSLATE,        /* 19 */
15811 +  DSLHAL_ERROR_FIRMWARE_CRC,             /* 20 */
15812 +  DSLHAL_ERROR_FIRMWARE_OFFSET,          /* 21 */
15813 +  DSLHAL_ERROR_CONFIG_API_FAILURE,       /* 22 */ 
15814 +  DSLHAL_ERROR_EOCREG_API_FAILURE,       /* 23 */
15815 +  DSLHAL_ERROR_VERSION_API_FAILURE,      /* 24 */
15816 +  DSLHAL_ERROR_STATS_API_FAILURE,        /* 25 */
15817 +  DSLHAL_ERROR_MARGIN_API_FAILURE,       /* 26 */
15818 +  DSLHAL_ERROR_CTRL_API_FAILURE,         /* 27 */
15819 +  DSLHAL_ERROR_HYBRID_API_FAILURE,       /* 28 */
15820 +  DSLHAL_ERROR_MODEMENV_API_FAILURE,     /* 29 */
15821 +  DSLHAL_ERROR_INTERRUPT_FAILURE,        /* 30 */
15822 +  DSLHAL_ERROR_INTERNAL_API_FAILURE,     /* 31 */
15823 +  DSLHAL_ERROR_DIGIDIAG_FAILURE,         /* 32 */
15824 +  DSLHAL_ERROR_TONETEST_FAILURE,         /* 33 */
15825 +  DSLHAL_ERROR_NOISETEST_FAILURE,        /* 34 */
15826 +  DSLHAL_ERROR_MODEMSTATE,               /* 35 */
15827 +  DSLHAL_ERROR_OVERLAY_CORRUPTED         /* 36 */
15828 +};
15829
15830 +enum 
15831 +{
15832 +  CONFIG_FLAG_NOFLAG,                    /* 00 */
15833 +  CONFIG_FLAG_TRELLIS,                   /* 01 */
15834 +  CONFIG_FLAG_EC,                        /* 02 */
15835 +  CONFIG_FLAG_RS                         /* 03 */
15836 +};
15837 +
15838 +#define USE_EMIF_REV    0
15839 +#define USE_CVR_REV     1
15840 +#define TNETD53XX_MAXLOOP       10000
15841 +#define REVERB          0
15842 +#define MEDLEY          1
15843 +#define NONINTENSE      0
15844 +#define slavespace0 0xa1000000
15845 +
15846 +#define MASK_MAILBOX_INTERRUPTS 0x00000001
15847 +#define MASK_BITFIELD_INTERRUPTS 0x00000002
15848 +#define MASK_HEARTBEAT_INTERRUPTS 0x00000004
15849 +#define DSP_INTERRUPT_SOURCE_REGISTER  0x020007A0
15850 +#define DSP_INTERRUPT_CLEAR_REGISTER   0x020007A4
15851 +
15852 +#define DIGITAL_DIAG_MEMSIZE 1048576
15853 +#define CRC32_QUOTIENT 0x04c11db7
15854 +#define DSP_FIRMWARE_MALLOC_SIZE 0x7ffff
15855 +#define DSP_CONSTELLATION_BUFFER_SIZE 1024*4
15856 +#define LOG43125 9303
15857 +#define US_NOMINAL_POWER (-38)
15858 +#define US_BNG_LENGTH 32
15859 +#define DS_BNG_LENGTH 256
15860 +#define NUMBER_OF_BITFIELDS 4
15861 +#define BITFIELD_SCAN 0x80000000
15862 +
15863 +/* ADSL Message offsets from Host Interface Pointer */
15864 +
15865 +/* ADSL2 Messages Index and Length defines */
15866 +
15867 +#define CMSGFMT_INDEX      0
15868 +#define CMSGPCB_INDEX      1
15869 +#define RMSGFMT_INDEX      2
15870 +#define RMSGPCB_INDEX      3
15871 +#define RMSG1LD_INDEX     13
15872 +#define RMSG2LD_INDEX     14
15873 +#define RMSG3LD_INDEX     15
15874 +#define RMSG4LD_INDEX     16
15875 +#define RMSG5LD_INDEX     17
15876 +#define RMSG6LD_INDEX     18
15877 +#define RMSG7LD_INDEX     19
15878 +#define RMSG8LD_INDEX     20
15879 +#define RMSG9LD_INDEX     21
15880 +#define CMSG1LD_INDEX     22
15881 +#define CMSG2LD_INDEX     23
15882 +#define CMSG3LD_INDEX     24
15883 +#define CMSG4LD_INDEX     25
15884 +#define CMSG5LD_INDEX     26
15885 +#define CMSGPCB2_INDEX    28
15886 +#define CMSGPCB2L_INDEX   29
15887 +#define RMSGFMT2_INDEX    30
15888 +#define RMSGPCB2L_INDEX   31
15889 +#define CMSG1ADSL2_INDEX  32
15890 +#define RMSG1ADSL2_INDEX  33
15891 +#define CMSG2ADSL2_INDEX  34
15892 +#define RMSG2ADSL2_INDEX  35
15893 +#define CPARAMS_INDEX     36
15894 +#define RPARAMS_INDEX     37
15895 +
15896 +/* ADSL2 Message Sizes */
15897 +
15898 +#define CMSGFMT_SIZE       2
15899 +#define RMSGFMT_SIZE       2
15900 +#define CMSGPCB_SIZE       2
15901 +#define CMSGPCB2_SIZE      6    /* Annex A with Blackout */
15902 +#define CMSGPCB2L_SIZE    10    /* Annex B with Blackout */
15903 +#define RMSGPCB_SIZE      36
15904 +#define RMSG1LD_SIZE      16
15905 +#define RMSGxLD_SIZE     258
15906 +#define CMSG1LD_SIZE      16
15907 +#define CMSG2LD_SIZE     130
15908 +#define CMSG3LD_SIZE      66
15909 +#define CMSG4LD_SIZE      34
15910 +#define CMSG5LD_SIZE      34
15911 +#define CMSG1ADSL2_SIZE   24   
15912 +#define RMSG1ADSL2_SIZE    4
15913 +#define CMSG2ADSL2_SIZE    4
15914 +#define RMSG2ADSL2_SIZE   32
15915 +#define CPARAMS_SIZE     136 
15916 +#define RPARAMS_SIZE     808
15917 +
15918 +/* ADSL2 Plus Message Sizes (if Different from ADSL2) */
15919 +
15920 +#define RMSGPCB_P_SIZE     68
15921 +#define CMSG1ADSL2P_SIZE   40 /* With Blackout */
15922 +#define CPARAMS_PA_SIZE   168 
15923 +#define RPARAMS_PA_SIZE  2088
15924 +#define CPARAMS_PB_SIZE   296
15925 +#define RPARAMS_PB_SIZE  2088
15926 +
15927 +#endif /* pairs #ifndef ___DSL_REGISTER_DEFINES_H___ */
15928 diff -urN linux.old/drivers/atm/sangam_atm/dsl_hal_support.c linux.dev/drivers/atm/sangam_atm/dsl_hal_support.c
15929 --- linux.old/drivers/atm/sangam_atm/dsl_hal_support.c  1970-01-01 01:00:00.000000000 +0100
15930 +++ linux.dev/drivers/atm/sangam_atm/dsl_hal_support.c  2005-08-23 04:46:50.100843240 +0200
15931 @@ -0,0 +1,2788 @@
15932 +/*******************************************************************************
15933 +* FILE PURPOSE:     DSL Driver API functions for Sangam
15934 +*********************************************************************************
15935 +* FILE NAME:        dsl_hal_support.c
15936 +*
15937 +* DESCRIPTION:  
15938 +*       Contains DSL HAL APIs for Modem Control
15939 +*  
15940 +*                    
15941 +* (C) Copyright 2001-02, Texas Instruments, Inc.
15942 +*    History
15943 +*    Date        Version            Notes
15944 +*    06Feb03     0.00.00            RamP   Created
15945 +*    21Mar03     0.00.01            RamP   Inserted byteswap functions
15946 +*    07Apr03     0.00.02            RamP   Implemented new error reporting scheme
15947 +*                                          Changed Commenting to C style only
15948 +*    12Apr03     0.00.03            RamP   Added function to set Interrupt Bit
15949 +*                                          Masks for bitfield & Mailboxes
15950 +*    14Apr03     0.00.04            RamP   Added function to process modem state
15951 +*                                          bit fields; renamed REG32 macros
15952 +*                                          Changed interrupt bit field settings
15953 +*    15Apr03     0.00.05            RamP   Fixed exit condition on dslShutdown
15954 +*    21Apr03     0.01.00            RamP   Fixed dslShutdown function & changed
15955 +*                                          loop counter for overlay byteswaps
15956 +*                (Alpha)                   Added cache writeback for overlays
15957 +*                                          Added function acknowledgeInterrupt
15958 +*    22Apr03     0.01.01            RamP   Moved acknowledgeInterrupt into api
15959 +*    24Apr03     0.01.02            RamP   Added function to compare crc32 with
15960 +*                                          pre-computed value as a recovery 
15961 +*                                          scheme for corrupt overlay pages
15962 +*    28Apr03     0.01.03            RamP   Fixed a parameter in crc32 fxn call
15963 +*    05May03     0.01.04            RamP   Fixed Message structure access in
15964 +*                                          writeHostMailbox function
15965 +*    14May03     0.01.05            RamP   Lookup to netService of dsp version
15966 +*                (alpha ++)                to determine pots/isdn service
15967 +*    21May03     0.01.06            RamP   Added support for CO profiles
15968 +*    29May03     0.01.07            RamP   Added critical section tabs for block
15969 +*                                          read/write operations
15970 +*                                          Added functions to reload overlay pages
15971 +*                                          and CO Profiles
15972 +*    04Jun03     0.01.08            RamP   Added state transition timing counters
15973 +*    06Jun03     0.01.09            RamP   Added Interrupt source parsing function
15974 +*                                          Interrupt masking for heartbeat added
15975 +*    09Jun03     0.01.10            RamP   Modified modem state bit field processing
15976 +*                                          for structure changes in ITIDSLHW
15977 +*                                          fixed problem in free memory for CO prof
15978 +*    18Jul03     0.01.11            RamP   Optimized free memory for CO profiles &
15979 +*                                          overlay pages in the supporting APIs  
15980 +*    28Jul03     0.02.00            RamP   Modified the process bitfield functn
15981 +*                                          for LED & Application State report
15982 +*    21Aug03     0.03.00            RamP   Added logic to allocate & communicate
15983 +*                                          memory for constellation buffer display
15984 +*    29Sep03     0.03.01            RamP   Added API switch calls to advcfg module
15985 +*                                          to abstract them from the API module
15986 +*    12Oct03     0.03.02            RamP   Added API to gather ADSL2 Messages
15987 +*    14Oct03     0.03.03            RamP   Added function to read CMsgsRA
15988 +*    23Oct03     0.03.04            RamP   Changed train history index to circular 
15989 +*                                          buffer upon rollover
15990 +*    29Oct03     0.03.05            RamP   Added Adsl2 Delt Message Parsing 
15991 +*    12Nov03     0.03.06            RamP   Fixed endianness issues with 
15992 +*                                          Constellation Display
15993 +*    14Nov03     0.03.07            RamP   Added function to gather CRates1/RRates1
15994 +*                                          before they get overwritten by CRatesRA
15995 +*    19Nov03     0.03.08            JohnP  Revised dslhal_support_aocBitSwapProcessing to
15996 +*                                          prevent duplicate ATU-R bitswaps going to ACT
15997 +*    24Nov03     0.03.09            RamP   Implemented detailed State Tracking through
15998 +*                                          Modem State bit fields for ADSL/2
15999 +*    12Dec03     0.03.10            RamP   Tokenized advanced configuration code
16000 +*    12Dec03     0.03.11            RamP   Added state reset upon IDLE
16001 +*    19Dec03     0.03.12            RamP   Added static adsl2 byteswap function for
16002 +*                                          handling pointer to pointer cases 
16003 +*                                          Changed adsl2 messages to correct pointer to 
16004 +*                                          pointer dereferencing problems in some OS
16005 +*    26Dec03     0.03.13            RamP   Setting Current Address for Constellation
16006 +*                                          buffer in addition to start address
16007 +*                                          Added additional check to overlay page malloc
16008 +*******************************************************************************/
16009 +#include "dsl_hal_register.h"
16010 +#include "dsl_hal_support.h"
16011 +
16012 +static unsigned int dslhal_support_adsl2ByteSwap32(unsigned int in32Bits);
16013 +
16014 +/******************************************************************************************
16015 +* FUNCTION NAME:     dslhal_support_unresetDslSubsystem
16016 +*
16017 +*******************************************************************************************
16018 +* DESCRIPTION: This function unreset Dsl Subsystem
16019 +*
16020 +* INPUT:  None
16021 +*
16022 +* RETURN: 0 if Pass; 1 if Fail
16023 +*
16024 +*****************************************************************************************/
16025 +int  dslhal_support_unresetDslSubsystem(void)
16026 +{
16027 +  dprintf(4," dslhal_support_unresetDslSubsystem()\n");
16028 +  /* Put ADSLSS in to reset */
16029 +  DSLHAL_REG32(0xa8611a10) = 0x1;
16030 +  shim_osClockWait(64);
16031 +  dprintf(5,"Selected APLL Reg \n");
16032 +
16033 +  DSLHAL_REG32(0xa8610a90) = 0x4;
16034 +  shim_osClockWait(64);
16035 +  dprintf(5,"Enable Analog PLL \n"); 
16036 +
16037 +  DSLHAL_REG32(0xa8610a90) = 0x77fe;
16038 +  shim_osClockWait(64);
16039 +  dprintf(5,"Set PLL for DSP\n");
16040 +
16041 +  /*  DSLHAL_REG32(0xa8611600) = 0x007f1bdf;*/
16042 +  DSLHAL_REG32(0xa8611600) |= RST_CNTRL_PRCR_ADSLSS;
16043 +  shim_osClockWait(64);
16044 +  dprintf(5,"Brought ADSLSS out of Reset \n");
16045 +
16046 +  DSLHAL_REG32(0xa861090c) &= ~((1<<20)|(1<<21)|(1<<22)|(1<<23)|(1<<24)|(1<<25));
16047 +  shim_osClockWait(64);
16048 +  dprintf(5,"Configured GPIO 20-25 for McBSP \n"); 
16049 +
16050 +  /*DSLHAL_REG32(0xa8611600)           |= RST_CNTRL_PRCR_ADSLSS;*/
16051 +
16052 +  
16053 +  /*  DSLHAL_REG32(0xa8611a04) = 0x00000001; 
16054 +      shim_osClockWait(64); */
16055 +
16056 +  dprintf(4," dslhal_support_unresetDslSubsystem done\n");
16057 +  return DSLHAL_ERROR_NO_ERRORS;
16058 +}
16059 +
16060 +
16061 +/******************************************************************************************
16062 +* FUNCTION NAME:     dslhal_support_resetDslSubsystem
16063 +*
16064 +*******************************************************************************************
16065 +* DESCRIPTION: This function unreset Dsl Subsystem
16066 +*
16067 +* INPUT:  None
16068 +*
16069 +* RETURN: 0 if Pass; 1 if Fail
16070 +*
16071 +*****************************************************************************************/
16072 +int  dslhal_support_resetDslSubsystem(void)
16073 +{
16074 +  dprintf(4, "dslhal_support_resetDslSubsystem \n");
16075 +  /* Put ADSLSS into reset */
16076 +  DSLHAL_REG32(0xa8611600) &= ~RST_CNTRL_PRCR_ADSLSS;
16077 +  shim_osClockWait(64);
16078 +  /*  DSLHAL_REG32(0xa8611a04) = 0x00000000;
16079 +      shim_osClockWait(64); */
16080 +  dprintf(4, "dslhal_support_resetDslSubsystem Done \n");
16081 +  return DSLHAL_ERROR_NO_ERRORS;
16082 +}
16083 +
16084 +/******************************************************************************************
16085 +* FUNCTION NAME:    dslhal_support_unresetDsp()
16086 +*
16087 +*******************************************************************************************
16088 +* DESCRIPTION: This fuction takes ax5 daugter board out of reset.
16089 +*
16090 +* INPUT:  None
16091 +*
16092 +* RETURN: 0  --successful.
16093 +*         1  --failed
16094 +*
16095 +*****************************************************************************************/
16096 +int dslhal_support_unresetDsp(void)
16097 +{
16098 +#ifdef PRE_SILICON
16099 +  /* unsigned char value; */
16100 +  int rc;
16101 +
16102 +  rc=dslhal_support_hostDspAddressTranslate((unsigned int)DEV_MDMA0_SRC_ADDR);
16103 +  if(rc==DSLHAL_ERROR_ADDRESS_TRANSLATE)
16104 +    {
16105 +    dprintf(1, "dslhal_support_hostDspAddressTranslate failed\n");
16106 +    return DSLHAL_ERROR_ADDRESS_TRANSLATE;
16107 +    }
16108 +  dprintf(5,"MDMA SRC: %08x\n", rc);
16109 +  DSLHAL_REG32(rc) = 0x80000001;
16110 +  rc=dslhal_support_hostDspAddressTranslate((unsigned int)DEV_MDMA0_DST_ADDR);
16111 +  if(rc==DSLHAL_ERROR_ADDRESS_TRANSLATE)
16112 +    {
16113 +    dprintf(1, "dslhal_support_hostDspAddressTranslate failed\n");
16114 +    return DSLHAL_ERROR_ADDRESS_TRANSLATE;
16115 +    }
16116 +  dprintf(5,"MDMA DST: %08x\n", rc);
16117 +  DSLHAL_REG32(rc) = 0x02090001;
16118 +  rc=dslhal_support_hostDspAddressTranslate((unsigned int)DEV_MDMA0_CTL_ADDR);
16119 +  if(rc== DSLHAL_ERROR_ADDRESS_TRANSLATE)
16120 +    {
16121 +    dprintf(1, "dslhal_support_hostDspAddressTranslate failed\n");
16122 +    return DSLHAL_ERROR_ADDRESS_TRANSLATE;
16123 +    }
16124 +  dprintf(5,"MDMA CTL: %08x\n", rc);
16125 +  DSLHAL_REG32(rc) = (DEV_MDMA_START | DEV_MDMA_DST_INC | DEV_MDMA_SRC_INC |
16126 +                         DEV_MDMA_BURST1 | (1 << DEV_MDMA_LEN_SHF));
16127 +  /* statusMask = 0x00000010;*/
16128 +#else
16129 +  dprintf(4, "dslhal_support_unresetDsp()\n");
16130 +  
16131 +  /* Bring the DSP core out of reset */
16132 +  /* DSLHAL_REG32(0xa8611600) = 0x00ff1bdf; */
16133 +  DSLHAL_REG32(0xa8611600) |= RST_CNTRL_PRCR_DSP;
16134 +  shim_osClockWait(64);
16135 +  dprintf(5,"Brought DSP out of Reset \n");
16136 +  dprintf(6,"Current Contents of PRCR: 0x%x\n",(unsigned int)DSLHAL_REG32(0xa8611600));
16137 +  /* DSLHAL_REG32(0xa8611a0c) = 0x00000007;
16138 +     shim_osClockWait(64); */
16139 +#endif  
16140 +
16141 +  dprintf(4, "dslhal_support_unresetDsp() done\n");
16142 +  return DSLHAL_ERROR_NO_ERRORS;
16143 +}
16144 +
16145 +/******************************************************************************************
16146 +* FUNCTION NAME:    dslhal_support_resetDsp()
16147 +*
16148 +*******************************************************************************************
16149 +* DESCRIPTION: This fuction takes ax5 daugter board into reset.
16150 +*
16151 +* INPUT:  None
16152 +*
16153 +* RETURN: 0  --successful.
16154 +*         1  --failed
16155 +*
16156 +*****************************************************************************************/
16157 +int dslhal_support_resetDsp(void)
16158 +{
16159 +  dprintf(4, "dslhal_support_resetDsp \n");
16160 +  /* Put ADSLSS into reset */
16161 +  DSLHAL_REG32(0xa8611600) &= ~RST_CNTRL_PRCR_DSP;
16162 +  shim_osClockWait(64);
16163 +  dprintf(4, "dslhal_support_resetDsp Done \n");
16164 +  return DSLHAL_ERROR_NO_ERRORS;
16165 +}  
16166 +
16167 +/********************************************************************************************
16168 +* FUNCTION NAME: dslhal_support_hostDspAddressTranslate()
16169 +*
16170 +*********************************************************************************************
16171 +* DESCRIPTION:
16172 +*   Maps ax5 daugter card dsp memory address to avalanche memory space
16173 +*
16174 +* Input: unsigned int addr,  dsp memory address.
16175 +*
16176 +* Return: >=0, unsigned int, mapped Avalanche address(VBUS address). 
16177 +*         -1,  mapping failed
16178 +*         
16179 +*
16180 +********************************************************************************************/
16181 +/* static unsigned int bbifmap0,bbifmap1; */
16182 +
16183 +unsigned int dslhal_support_hostDspAddressTranslate( unsigned int addr )
16184 +{
16185 +  unsigned int addrMap;
16186 +  /* This function should just be used to move the memory window of the ADSLSS */
16187 +  dprintf(5, "dslhal_support_hostDspAddressTranslate()\n");
16188 +  
16189 +  /*  select vbus to xbus memory  */
16190 +  /*  addrMap = addr & 0xff000000; */
16191 +  addrMap = addr & ADSLSSADRMASK;
16192 +  
16193 +  DSLHAL_REG32(ADSLSSADR) = addrMap;
16194 +  
16195 +  dprintf(6, "dslhal_support_hostDspAddressTranslate() done\n");
16196 +#ifdef PRE_SILICON
16197 +  return ((ADSLSS_BASE | (~ADSLSSADRMASK & addr))+ 0x00000100);
16198 +  /* Added 0x100 for Pre-Silicon VLNQ offset.. to be removed for Silicon */
16199 +#else
16200 +  return ((ADSLSS_BASE | (~ADSLSSADRMASK & addr)));
16201 +  /* Added 0x100 for Pre-Silicon VLNQ offset.. to be removed for Silicon */
16202 +#endif
16203 +
16204 +}
16205 +
16206 +
16207 +/******************************************************************************************
16208 +* FUNCTION NAME:    dslhal_support_blockWrite
16209 +*
16210 +*******************************************************************************************
16211 +* DESCRIPTION: This rouin simulates DSP memory write as done in ax5 pci nic card 
16212 +*
16213 +* INPUT:  void *buffer, data need to written
16214 +*         void *adde,   memory address to be written
16215 +*         size_t count, number of bytes to be written
16216 +*
16217 +* RETURN:  0 --succeeded
16218 +*          1 --Failed
16219 +*
16220 +*****************************************************************************************/
16221 +
16222 +int dslhal_support_blockWrite(void *buffer, void *addr, size_t count) 
16223 +{
16224 +  int rc, byteCnt=0;
16225 +  unsigned char* ptr;
16226 +  union 
16227 +    {
16228 +    unsigned char *cptr;
16229 +    short *sptr;
16230 +    int *iptr;
16231 +    } src;
16232 +  union 
16233 +    {
16234 +    int anint;                   /* DSP location */
16235 +    unsigned char *cptr;         /* to avoid casts */
16236 +    } dst;
16237 +  union
16238 +    {
16239 +    unsigned int anint;
16240 +    unsigned char byte[4];
16241 +    }data,dword,sword;
16242 +        
16243 +  /* Enter Critical Section */
16244 +  shim_osCriticalEnter();
16245 +
16246 +  dprintf(6, "dslhal_support_blockWrite\n");
16247 +  
16248 +  dprintf(6,"addr=0x%X, length=0x%X, buffer=0x%X\n", (unsigned int) addr, (unsigned int) count, (unsigned int)buffer); 
16249 +  
16250 +  src.cptr = (unsigned char*) buffer;      /* local buffer */
16251 +  dst.cptr = addr;        /* DSP memory location */
16252 +  
16253 +  /*Maps address first*/
16254 +  rc=dslhal_support_hostDspAddressTranslate((unsigned int)addr);
16255 +  dprintf(5, "NewAddr: %08x\n", rc);
16256 +  if(rc== DSLHAL_ERROR_ADDRESS_TRANSLATE)
16257 +    {
16258 +    dprintf(1, "dslhal_support_hostDspAddressTranslate failed\n");
16259 +    return  DSLHAL_ERROR_ADDRESS_TRANSLATE;
16260 +    }
16261 +
16262 +  dst.cptr=(unsigned char *)rc;
16263 +  
16264 +  /* check wether address is at 32bits boundary */
16265 +  
16266 +  if ((dst.anint & 0x3) && count)
16267 +    {
16268 +    sword.anint = *(unsigned int*)((unsigned int)src.cptr & 0xfffffffc);
16269 +    dword.anint = DSLHAL_REG32((unsigned int)dst.cptr & 0xfffffffc);
16270 +    sword.anint = (unsigned int) dslhal_support_byteSwap32(sword.anint);
16271 +    dword.anint = (unsigned int) dslhal_support_byteSwap32(dword.anint);
16272 +    ptr = (unsigned char *)((unsigned int)dst.cptr & 0xfffffffc);
16273 +
16274 +    if((dst.anint & 3) ==3)     /* last byte of a dword */
16275 +      {
16276 +      dword.byte[3] = sword.byte[3];
16277 +      dst.anint++;            /* bump the address by one */
16278 +      byteCnt++;
16279 +      count--;  
16280 +      }
16281 +    
16282 +    if((dst.anint & 3) ==1)     /* second byte */
16283 +      {
16284 +        if(count>3)
16285 +          {
16286 +            dword.byte[3] = sword.byte[3];
16287 +            dst.anint++;
16288 +            count--;
16289 +            byteCnt++;
16290 +          }
16291 +        if(count>2)
16292 +          {
16293 +            dword.byte[2] = sword.byte[2];
16294 +            dst.anint++;
16295 +            count--;
16296 +            byteCnt++;
16297 +          }
16298 +        if(count)
16299 +          {
16300 +            dword.byte[1] = sword.byte[1];
16301 +            dst.anint++;
16302 +            count--;
16303 +            byteCnt++;
16304 +          }
16305 +      }
16306 +    
16307 +    if((dst.anint & 3) && (count >1))
16308 +      {
16309 +      dword.byte[2] = sword.byte[2];
16310 +      dword.byte[3] = sword.byte[3];
16311 +      byteCnt+=2;
16312 +      dst.anint += 2;         /* bump the address by two */
16313 +      count -= 2;             /* decrement the byte count by two */
16314 +      }
16315 +    
16316 +    if((dst.anint & 3) && (count==1))
16317 +      {
16318 +      dword.byte[2] = sword.byte[2];
16319 +      dst.anint++;
16320 +      byteCnt++;
16321 +      count--;
16322 +      }
16323 +    src.cptr = (char *)((unsigned int)src.cptr & 0xfffffffc); /* fix 032802 */
16324 +    dword.anint = dslhal_support_byteSwap32(dword.anint); 
16325 +    DSLHAL_REG32((unsigned int)ptr) = dword.anint;
16326 +    ptr = src.cptr;
16327 +    for(rc=0;rc<count;rc++)
16328 +      {
16329 +        *ptr = *(ptr+byteCnt);
16330 +        ptr++;
16331 +      }
16332 +    }
16333 +  
16334 +  /* the dst pointer should now be on a 32-bit boundary   */
16335 +
16336 +  while (count > 3) 
16337 +    {
16338 +     DSLHAL_REG32((unsigned int)dst.cptr) = dslhal_support_byteSwap32(*src.iptr);
16339 +     src.iptr++;                  /* bump the data pointer by four */
16340 +     dst.anint += 4;              /* bump the address by four */
16341 +     count -= 4;                  /* decrement the byte count by four */
16342 +     }
16343 +  
16344 +  /* write remaining bytes */
16345 +  if(count)
16346 +    {
16347 +    int i;
16348 +    
16349 +    data.anint= DSLHAL_REG32((unsigned int)dst.cptr);
16350 +    data.anint=dslhal_support_byteSwap32(data.anint);
16351 +    for (i=0; i< count; i++)
16352 +      {
16353 +        data.byte[i]=*(src.cptr+i);             
16354 +      }
16355 +    data.anint=dslhal_support_byteSwap32(data.anint);
16356 +    DSLHAL_REG32((unsigned int)dst.cptr) = data.anint;
16357 +    src.cptr +=count;
16358 +    dst.anint +=count;
16359 +    count=0;
16360 +    }
16361 +  dprintf(6, "dslhal_support_blockWrite done\n");
16362 +  /* Exit Critical Section */
16363 +  shim_osCriticalExit();
16364 +  return DSLHAL_ERROR_NO_ERRORS;
16365 +}   /* end of dslhal_support_blockWrite() */
16366 +
16367 +
16368 +/******************************************************************************************
16369 +* FUNCTION NAME:    dslhal_support_blockRead
16370 +*
16371 +*********************************************************************************************
16372 +* DESCRIPTION: This rouin simulates DSP memory read as done in ax5 pci nic card
16373 +*
16374 +* INPUT:  void *addr,   memory address to be read
16375 +*         void *buffer, dat buffer to be filled with from memmory
16376 +*         size_t count, number of bytes to be written
16377 +*
16378 +* RETURN:  0 --succeeded
16379 +*          1 --Failed
16380 +*
16381 +*****************************************************************************************/
16382 +
16383 +int dslhal_support_blockRead(void *addr, void *buffer, size_t count) 
16384 +{
16385 +    int rc;
16386 +    union 
16387 +        {
16388 +        int anint;          /* DSP location */
16389 +        char *cptr;         /* to avoid casts */
16390 +        } src;
16391 +    union 
16392 +        {
16393 +        char byte[4];
16394 +        int anint;          /* DSP data */
16395 +        } data;
16396 +    union 
16397 +        {
16398 +        char *cptr;
16399 +        int *iptr;
16400 +        } dst;
16401 +
16402 +    /* Enter Critical Section */
16403 +    shim_osCriticalEnter();
16404 +
16405 +    dprintf(6,"dslhal_support_blockRead\n");
16406 +
16407 +  
16408 +    src.cptr = addr;        /* DSP memory location */
16409 +    dst.cptr = buffer;      /* local buffer */
16410 +
16411 +    dprintf(6, "Read addr=0x%X, size=0x%X\n", (unsigned int)addr, count);
16412 +
16413 +
16414 +    /*Maps address first*/
16415 +    rc=dslhal_support_hostDspAddressTranslate((unsigned int)addr);
16416 +    if(rc== DSLHAL_ERROR_ADDRESS_TRANSLATE)
16417 +      {
16418 +      dprintf(1, "dslhal_support_hostDspAddressTranslate failed\n");
16419 +      return DSLHAL_ERROR_ADDRESS_TRANSLATE;
16420 +      }
16421 +
16422 +    src.cptr=(unsigned char *)rc;
16423 +
16424 +    /**********************************************
16425 +    *  if the source is NOT on a 32-bit boundary  *
16426 +    *  then we read the full word                 *
16427 +    *  and ignore the first part of it            *
16428 +    **********************************************/
16429 +
16430 +    if ((src.anint & 3) && count) 
16431 +        {
16432 +                unsigned int anword;
16433 +
16434 +                anword = DSLHAL_REG32((unsigned int)src.cptr & 0xfffffffc);
16435 +                data.anint = dslhal_support_byteSwap32(anword);
16436 +
16437 +        /************************************
16438 +        *  there is no need for case 0      *
16439 +        *  notice that there are no breaks  *
16440 +        *  each falls through to the next   *
16441 +        ************************************/
16442 +
16443 +        switch (src.anint & 3) 
16444 +                {
16445 +            case 1:
16446 +                /* use only byte[1-3] */
16447 +                *(dst.cptr++) = data.byte[1];
16448 +                src.anint++;
16449 +                count--;
16450 +            case 2:
16451 +                /* use byte[2-3] */
16452 +                if (count) 
16453 +                                {
16454 +                    *(dst.cptr++) = data.byte[2];
16455 +                    src.anint++;
16456 +                    count--;
16457 +                                }
16458 +            case 3:
16459 +                /* use byte[3] */
16460 +                if (count) 
16461 +                                {
16462 +                    *(dst.cptr++) = data.byte[3];
16463 +                    src.anint++;
16464 +                    count--;
16465 +                                }
16466 +                }
16467 +        }
16468 +
16469 +    /* the src pointer should now be on a 32-bit boundary */
16470 +    while (count > 3) 
16471 +        {
16472 +                unsigned int anword;
16473 +        
16474 +                anword=DSLHAL_REG32((unsigned int)src.cptr);
16475 +                
16476 +                *dst.iptr = dslhal_support_byteSwap32(anword);
16477 +        src.anint += 4;         /* bump the address by four */
16478 +        dst.iptr++;             /* bump the data pointer by four */
16479 +        count -= 4;             /* decrement the byte count by four */
16480 +        }
16481 +
16482 +    /*******************************
16483 +    *  if there's any count left   *
16484 +    *  then we read the next word  *
16485 +    *  and ignore the end of it    *
16486 +    *******************************/
16487 +    if (count) 
16488 +        {
16489 +                unsigned int anword;
16490 +
16491 +                anword= DSLHAL_REG32((unsigned int)src.cptr);
16492 +                data.anint = dslhal_support_byteSwap32(anword);
16493 +
16494 +        /************************************
16495 +        *  there is no need for case 0      *
16496 +        *  notice that there are no breaks  *
16497 +        *  each falls through to the next   *
16498 +        ************************************/
16499 +        switch (count) 
16500 +                {
16501 +            case 1:
16502 +                /* use byte[0] */
16503 +                *(dst.cptr++) = data.byte[0];
16504 +                src.anint++;
16505 +                count--;
16506 +                break;
16507 +            case 2:
16508 +                /* use byte[0-1] */
16509 +                *(dst.cptr++) = data.byte[0];
16510 +                *(dst.cptr++) = data.byte[1];
16511 +                src.anint +=2;
16512 +                count -= 2;
16513 +                break;
16514 +            case 3:
16515 +                /* use only byte[0-2] */
16516 +                *(dst.cptr++) = data.byte[0];
16517 +                *(dst.cptr++) = data.byte[1];
16518 +                *(dst.cptr++) = data.byte[2];
16519 +                src.anint +=3;
16520 +                count -= 3;
16521 +                break;
16522 +                }
16523 +        }
16524 +  /* Exit Critical Section */
16525 +  shim_osCriticalExit();
16526 +
16527 +  return DSLHAL_ERROR_NO_ERRORS;
16528 +  
16529 +}   /* end of dslhal_support_blockRead() */
16530 +
16531 +
16532 +/********************************************************************************************
16533 +* FUNCTION NAME:    dslhal_support_readDspMailbox
16534 +*
16535 +*********************************************************************************************
16536 +* DESCRIPTION: Reads a message from the mailbox
16537 +*
16538 +* ARGUMENTS:   int *pcmd           Pointer to command read
16539 +*
16540 +* RETURNS:     0 if successful
16541 +*              1 if no mail
16542 +*              NZ otherwise
16543 +*
16544 +*****************************************************************************************/
16545 +
16546 +int dslhal_support_readDspMailbox(tidsl_t *ptidsl, int *pcmd, int *ptag, int *pprm1, int *pprm2) 
16547 +{
16548 +  int rc;
16549 +  int cmd;
16550 +  int tag;
16551 +  int prm1;
16552 +  int prm2;
16553 +  unsigned char dspOutInx;
16554 +  DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
16555 +  DEV_HOST_mailboxControl_t mailboxControl;
16556 +  DEV_HOST_dspHostMsg_t dspMailboxMsg[DEV_HOST_DSPQUEUE_LENGTH];
16557 +  
16558 +  dprintf(6,"dslhal_support_readDspMailbox\n");
16559 +  
16560 +  /* get the DSP main pointer */
16561 +
16562 +  pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
16563 +
16564 +  rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface, 
16565 +                                     sizeof(DEV_HOST_dspOamSharedInterface_t));
16566 +  if (rc)
16567 +    {
16568 +    dprintf(1,"dslhal_support_blockRead failed\n");
16569 +    return DSLHAL_ERROR_BLOCK_READ;
16570 +    }
16571 +
16572 +  /* Read in the command/response buffer */
16573 +  dspOamSharedInterface.dspHostMailboxControl_p = (DEV_HOST_mailboxControl_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspHostMailboxControl_p);
16574 +  
16575
16576 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspHostMailboxControl_p, 
16577 +                               &mailboxControl, sizeof(DEV_HOST_mailboxControl_t));
16578 +  
16579 +  if (rc)
16580 +    {
16581 +    dprintf(1,"dslhal_support_blockRead failed\n");
16582 +    return DSLHAL_ERROR_BLOCK_READ;
16583 +    }
16584 +  
16585 +  /* Change the endianness of the Mailbox Pointer */
16586 +  mailboxControl.dspMsgBuf_p = (DEV_HOST_dspHostMsg_t *) dslhal_support_byteSwap32((unsigned int)mailboxControl.dspMsgBuf_p);
16587 +
16588 +  rc = dslhal_support_blockRead((PVOID)mailboxControl.dspMsgBuf_p, 
16589 +                                     &dspMailboxMsg, (sizeof(DEV_HOST_dspHostMsg_t)*DEV_HOST_DSPQUEUE_LENGTH));
16590 +  
16591 +  if (rc) 
16592 +    return DSLHAL_ERROR_BLOCK_READ;
16593 +  /* Extract the command/response message index */
16594 +  mailboxControl.hostInInx &= 7;   
16595 +  mailboxControl.hostOutInx &= 7;
16596 +  mailboxControl.dspOutInx &= 7;
16597 +  mailboxControl.dspInInx &= 7;
16598 +  
16599 +  
16600 +  /* check for messages in the mailbox */
16601 +  
16602 +  if (mailboxControl.dspOutInx == mailboxControl.dspInInx) 
16603 +    {
16604 +    return DSLHAL_ERROR_MAILBOX_NOMAIL;
16605 +    /* no messages to read */ 
16606 +    }
16607 +  
16608 +  /* use bDRESPOutInx as index to DRESPMsgBuf */
16609 +  
16610 +  cmd = dspMailboxMsg[mailboxControl.dspOutInx].cmd;
16611 +  tag = dspMailboxMsg[mailboxControl.dspOutInx].tag;
16612 +  prm1= dspMailboxMsg[mailboxControl.dspOutInx].param1;
16613 +  prm2= dspMailboxMsg[mailboxControl.dspOutInx].param2;
16614 +  
16615 +  mailboxControl.dspOutInx++;      /* increment count */ 
16616 +  mailboxControl.dspOutInx &= 7;   /* only two bits */
16617 +  
16618 +  dspOutInx = mailboxControl.dspOutInx;
16619 +  
16620 +  /* Read in the command response buffer again to take care of changes */
16621 +  mailboxControl.dspOutInx = dspOutInx;
16622 +  rc = dslhal_support_blockWrite(&mailboxControl.dspOutInx, 
16623 +                                      &dspOamSharedInterface.dspHostMailboxControl_p->dspOutInx, sizeof(BYTE));
16624 +  
16625 +  if (rc) 
16626 +    return DSLHAL_ERROR_BLOCK_WRITE;
16627 +  
16628 +  /* Is the input parameter address non-zero*/
16629 +  
16630 +  if (pcmd)
16631 +    {
16632 +    *pcmd = cmd;
16633 +    }
16634 +  if (ptag) 
16635 +    {
16636 +    *ptag = tag;
16637 +    }
16638 +  if (pprm1)
16639 +    {
16640 +    *pprm1 = prm1;
16641 +    }
16642 +  if (pprm2)
16643 +    {
16644 +    *pprm2 = prm2;
16645 +    }
16646
16647 +  dprintf(6,"dslhal_support_readDspMailbox done\n");
16648 +  dprintf(6,"cmd=%d, tag=%d\n", cmd, tag);
16649 +  dprintf(6,"dslhal_support_readDspMailbox:cmd: 0x%x, tag=%d\n", cmd, tag);
16650 +  return DSLHAL_ERROR_NO_ERRORS;
16651 +  
16652 +} /* end of dslhal_support_readDspMailbox() */
16653 +
16654 +/*******************************************************************************************
16655 +* FUNCTION NAME:    dslhal_support_writeHostMailbox
16656 +*
16657 +********************************************************************************************
16658 +* DESCRIPTION: Send a message to a mailbox
16659 +*
16660 +* ARGUMENTS:   int cmd             command to write
16661 +*              int tag             tag (currently unused)
16662 +*              int p1              parameter 1 (currently unused)
16663 +*              int p2              parameter 2 (currently unused)
16664 +*
16665 +* RETURNS:     0 if successful
16666 +*              NZ otherwise
16667 +*
16668 +*******************************************************************************************/
16669 +
16670 +int dslhal_support_writeHostMailbox(tidsl_t *ptidsl, int cmd, int tag, int p1, int p2) 
16671 +{
16672 +  int rc;
16673 +  int index;
16674 +  DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
16675 +  DEV_HOST_mailboxControl_t mailboxControl;
16676 +  DEV_HOST_dspHostMsg_t hostMailboxMsg[DEV_HOST_HOSTQUEUE_LENGTH];
16677 +  unsigned char hostInInx;
16678 +  
16679 +  dprintf(6,"dslhal_support_writeHostMailbox:cmd: 0x%x, tag=%d\n", cmd, tag);
16680 +  
16681 +  dprintf(6,"cmd=%d, tag=%d\n", cmd, tag);  
16682 +  
16683 +  pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
16684 +  
16685 +  rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface, 
16686 +                                sizeof(DEV_HOST_dspOamSharedInterface_t));
16687 +  if (rc)
16688 +    {
16689 +      dprintf(1,"dslhal_support_blockRead failed\n");
16690 +    return DSLHAL_ERROR_BLOCK_READ;
16691 +    }
16692 +  /* Read in the command/response buffer */
16693 +  dspOamSharedInterface.dspHostMailboxControl_p = (DEV_HOST_mailboxControl_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspHostMailboxControl_p);
16694 +  
16695 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspHostMailboxControl_p, 
16696 +                                &mailboxControl, sizeof(DEV_HOST_mailboxControl_t));
16697 +  
16698 +  if (rc)
16699 +    {
16700 +    dprintf(1,"dslhal_support_blockRead failed\n");
16701 +    return DSLHAL_ERROR_BLOCK_READ;
16702 +    }
16703 +  /* Change the endianness of the Mailbox Control Pointer */
16704 +  mailboxControl.hostMsgBuf_p = (DEV_HOST_dspHostMsg_t *) dslhal_support_byteSwap32((unsigned int)mailboxControl.hostMsgBuf_p);
16705 +  rc = dslhal_support_blockRead((PVOID)mailboxControl.hostMsgBuf_p, 
16706 +                                &hostMailboxMsg, (sizeof(DEV_HOST_dspHostMsg_t)*DEV_HOST_HOSTQUEUE_LENGTH));
16707 +  
16708 +  if (rc) 
16709 +    return DSLHAL_ERROR_BLOCK_READ;
16710 +  /* Extract the command/response message index */ 
16711 +  mailboxControl.hostInInx &= 7;       
16712 +  mailboxControl.hostOutInx &= 7;
16713 +  mailboxControl.dspOutInx &= 7;
16714 +  mailboxControl.dspInInx &= 7;
16715 +  
16716 +  /* make sure there's room in the mailbox */
16717 +  
16718 +  index = mailboxControl.hostInInx;
16719 +  mailboxControl.hostInInx++;
16720 +  mailboxControl.hostInInx &= 7;  
16721 +  hostInInx = mailboxControl.hostInInx;
16722 +  if (mailboxControl.hostInInx == mailboxControl.hostOutInx) 
16723 +    {
16724 +      /* mailbox is full */ 
16725 +      return DSLHAL_ERROR_MAILBOX_OVERFLOW;
16726 +    }
16727 +  
16728 +  /* use bOCMDInInx as index to OCMDMsgBuf */
16729 +  hostMailboxMsg[index].cmd = (BYTE) cmd;
16730 +  hostMailboxMsg[index].tag = (BYTE) tag;
16731 +  hostMailboxMsg[index].param1 = (BYTE) p1;
16732 +  hostMailboxMsg[index].param2 = (BYTE) p2;
16733 +  rc = dslhal_support_blockWrite(&hostMailboxMsg,
16734 +                                 (PVOID)mailboxControl.hostMsgBuf_p,
16735 +                                 sizeof(DEV_HOST_dspHostMsg_t)*DEV_HOST_HOSTQUEUE_LENGTH);
16736 +  if (rc)
16737 +    {
16738 +      dprintf(1,"dslhal_support_blockWrite failed\n");
16739 +      return DSLHAL_ERROR_BLOCK_READ;
16740 +    }
16741 +  rc = dslhal_support_blockWrite(&mailboxControl,
16742 +                                 &dspOamSharedInterface.dspHostMailboxControl_p,
16743 +                                 sizeof(DEV_HOST_mailboxControl_t));
16744 +  if (rc) 
16745 +    return DSLHAL_ERROR_BLOCK_WRITE;
16746 +  /* update the index */
16747 +  mailboxControl.hostInInx = hostInInx; 
16748 +  rc = dslhal_support_blockWrite(&mailboxControl.hostInInx,
16749 +                                 &dspOamSharedInterface.dspHostMailboxControl_p->hostInInx,
16750 +                                 sizeof(BYTE));
16751 +  if (rc) 
16752 +    return DSLHAL_ERROR_BLOCK_WRITE;
16753 +  
16754 +  dprintf(6,"dslhal_support_writeHostMailbox done\n");
16755 + return DSLHAL_ERROR_NO_ERRORS;
16756
16757 +}  
16758 +/* end of dslhal_support_writeHostMailbox() */
16759 +
16760 +
16761 +/********************************************************************************************
16762 +* FUNCTION NAME:    dslhal_support_readTextMailbox
16763 +*
16764 +*********************************************************************************************
16765 +* DESCRIPTION: Reads a message from the mailbox
16766 +*
16767 +* ARGUMENTS:   int *pcmd           Pointer to command read
16768 +*
16769 +* RETURNS:     0 if successful
16770 +*              1 if no mail
16771 +*              NZ otherwise
16772 +*
16773 +*****************************************************************************************/
16774 +
16775 +int dslhal_support_readTextMailbox(tidsl_t *ptidsl, int *pmsg1, int *pmsg2) 
16776 +{
16777 +  int rc;
16778 +  unsigned int msg1;
16779 +  unsigned int msg2;
16780 +  unsigned char textOutInx;
16781 +  DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
16782 +  DEV_HOST_mailboxControl_t mailboxControl;
16783 +  DEV_HOST_textMsg_t textMailboxMsg[DEV_HOST_TEXTQUEUE_LENGTH];
16784 +  
16785 +  dprintf(6,"dslhal_support_readTextMailbox\n");
16786 +  
16787 +  /* get the DSP main pointer */
16788 +
16789 +  pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr;
16790 +
16791 +  rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface, 
16792 +                                     sizeof(DEV_HOST_dspOamSharedInterface_t));
16793 +  if (rc)
16794 +    {
16795 +    dprintf(1,"dslhal_support_blockRead failed\n");
16796 +    return DSLHAL_ERROR_BLOCK_READ;
16797 +    }
16798 +
16799 +  /* Read in the command/response buffer */
16800 +  dspOamSharedInterface.dspHostMailboxControl_p = (DEV_HOST_mailboxControl_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspHostMailboxControl_p);
16801 +  
16802
16803 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspHostMailboxControl_p, 
16804 +                               &mailboxControl, sizeof(DEV_HOST_mailboxControl_t));
16805 +  
16806 +  if (rc)
16807 +    {
16808 +    dprintf(1,"dslhal_support_blockRead failed\n");
16809 +    return DSLHAL_ERROR_BLOCK_READ;
16810 +    }
16811 +  
16812 +  /* Change the endianness of the Mailbox Pointer */
16813 +  mailboxControl.textMsgBuf_p = (DEV_HOST_textMsg_t *) dslhal_support_byteSwap32((unsigned int)mailboxControl.textMsgBuf_p);
16814 +
16815 +  rc = dslhal_support_blockRead((PVOID)mailboxControl.textMsgBuf_p, 
16816 +                                     &textMailboxMsg, (sizeof(DEV_HOST_textMsg_t)*DEV_HOST_DSPQUEUE_LENGTH));
16817 +  
16818 +  if (rc) 
16819 +    return DSLHAL_ERROR_BLOCK_READ;
16820 +  /* Extract the command/response message index */
16821 +  
16822 +  mailboxControl.textInInx &= 7;   
16823 +  mailboxControl.textOutInx &= 7;
16824 +   
16825 +  /* check for messages in the mailbox */
16826 +  
16827 +  if (mailboxControl.textOutInx == mailboxControl.textInInx) 
16828 +    {
16829 +    return DSLHAL_ERROR_MAILBOX_NOMAIL;
16830 +    /* no messages to read */ 
16831 +    }
16832 +  
16833 +  /* use bDRESPOutInx as index to DRESPMsgBuf */
16834 +  
16835 +  msg1 = textMailboxMsg[mailboxControl.textOutInx].msgPart1;
16836 +  msg2 = textMailboxMsg[mailboxControl.textOutInx].msgPart2;
16837 +  msg1 = (unsigned int) dslhal_support_byteSwap32((unsigned int)msg1);
16838 +  msg2 = (unsigned int) dslhal_support_byteSwap32((unsigned int)msg2);
16839 +
16840 +  mailboxControl.textOutInx++;      /* increment count */ 
16841 +  mailboxControl.textOutInx &= 7;   /* only two bits */
16842 +  
16843 +  textOutInx = mailboxControl.textOutInx;
16844 +  
16845 +  /* Read in the command response buffer again to take care of changes */
16846 +
16847 +  mailboxControl.textOutInx = textOutInx;
16848 +  
16849 +  rc = dslhal_support_blockWrite(&mailboxControl.textOutInx, 
16850 +                                      &dspOamSharedInterface.dspHostMailboxControl_p->textOutInx, sizeof(BYTE));
16851 +  
16852 +  if (rc) 
16853 +    return DSLHAL_ERROR_BLOCK_WRITE;
16854 +  
16855 +  /* Is the input parameter address non-zero*/
16856 +  
16857 +  if (pmsg1)
16858 +    {
16859 +    *pmsg1 = msg1;
16860 +    }
16861 +  if (pmsg2) 
16862 +    {
16863 +    *pmsg2 = msg2;
16864 +    }
16865 +
16866 +  dprintf(6,"dslhal_support_readTextMailbox done\n");
16867 +  dprintf(6,"msgPart1=%d, msgPart2=%d\n", msg1, msg2);
16868 +  dprintf(6,"dslhal_support_readTextMailbox:Message Part1: 0x%x, tag=0x%x\n", msg1, msg2);
16869 +  return DSLHAL_ERROR_NO_ERRORS;
16870 +  
16871 +} /* end of dslhal_support_readTextMailbox() */
16872 +
16873 +
16874 +
16875 +/********************************************************************************************
16876 +* FUNCTION NAME: dslhal_support_hostDspCodeDownload()
16877 +*
16878 +*********************************************************************************************
16879 +* DESCRIPTION:
16880 +*   download DSP image from host memory to dsp memory
16881 +*
16882 +* Return: 0  success
16883 +*         1  failed
16884 +* 
16885 +* NOTE: 
16886 +*   DSP image is based on LITTLE endian
16887 +*
16888 +********************************************************************************************/
16889 +
16890 +int dslhal_support_hostDspCodeDownload(tidsl_t * ptidsl)
16891 +{
16892 +
16893 +  unsigned int index;
16894 +  int rc = 0, i;
16895 +  unsigned char *iptr;             /* image pointer */
16896 +  unsigned int numbytes,olayXfer,olayStore;
16897 +  /*  unsigned int holdSecPhyAddr=0,holdSecVirtAddr; */
16898 +  unsigned int *olayStart;
16899 +  size_t len;             /* size of the file */
16900 +  size_t expoffset;       /* expected offset for next section header */
16901 +  unsigned short checksum;
16902 +  unsigned int crc32;
16903 +  unsigned char * image;
16904 +  char *tmp = (char *)DEV_HOST_DSP_OAM_POINTER_LOCATION;
16905 +  DEV_HOST_dspVersionDef_t        dspVersion;
16906 +#if SWTC 
16907 +  DEV_HOST_tcHostCommDef_t        TCHostCommDef;
16908 +#endif
16909 +  DEV_HOST_oamWrNegoParaDef_t     OamWrNegoParaDef;
16910 +  DEV_HOST_dspOamSharedInterface_t dspOamSharedInterface, *pdspOamSharedInterface;
16911 +  DEV_HOST_olayDpDef_t            olayDpParms;
16912 +  DEV_HOST_profileBase_t          profileList;
16913 +#ifndef NO_ACT
16914 +  DEV_HOST_consBufDef_t           constDisp;
16915 +#endif
16916 +#if CO_PROFILES
16917 +  DEV_HOST_coData_t               coData;
16918 +#endif
16919 +  DEV_HOST_olayDpPageDef_t        olayDpPageDef[NUM_PAGES];
16920 +  union 
16921 +  {
16922 +  char byte[4];
16923 +  unsigned short hword[2];
16924 +  unsigned int aword;
16925 +  } data;
16926 +  
16927 +  struct _header
16928 +  {
16929 +  char signature[6];
16930 +  unsigned short sectcount;
16931 +  unsigned int length;
16932 +  } header;
16933 +  
16934 +  struct _section 
16935 +  {
16936 +  unsigned int addr;
16937 +  unsigned int length;
16938 +  unsigned int offset;
16939 +  unsigned int page;
16940 +  };/* section[MAXSECTIONS]; */
16941 +  
16942 +  struct _section *sptr;
16943 +  unsigned int secAddr, secLength, secOffset, secPage;
16944 +  
16945 +  
16946 +  dprintf(5,"dslhal_support_hostDspCodeDownload\n"); 
16947 +  image = ptidsl->fwimage;
16948 +  
16949 +  if (!image) 
16950 +    {
16951 +      dprintf(1,"no image file\n"); 
16952 +    return DSLHAL_ERROR_NO_FIRMWARE_IMAGE;
16953 +    }
16954 +  
16955 +  iptr=image;
16956 +  
16957 +  numbytes = sizeof(header); 
16958 +  
16959 +  shim_osMoveMemory((char *) &header, (char *)iptr, numbytes);
16960 +  header.length = dslhal_support_byteSwap32(header.length);
16961 +  header.sectcount = dslhal_support_byteSwap16(header.sectcount);
16962 +#if 0 
16963 +  crc32 = dslhal_support_computeCrc32((unsigned char*)&crcTest[0],20);
16964 +  dprintf(6,"CRC-32 for the crcTest: 0x%x",crc32);
16965 +  dprintf(4,"header.length=%d, header.sectcount=0x%X\n", header.length, header.sectcount);
16966 +#endif
16967 +  /* point to the checksum */
16968 +  /* compute the checksum on CRC32 here */
16969 +  iptr = image + header.length-4;
16970 +  numbytes = sizeof(data.aword);
16971 +  
16972 +  dprintf(5,"tiload: check checksum\n"); 
16973 +  shim_osMoveMemory((char *)&(data.byte), (char *)iptr, numbytes);
16974 +  
16975 +  crc32 = dslhal_support_computeCrc32(image,ptidsl->imagesize);
16976 +  dprintf(5,"CRC-32 for the Binary: 0x%x",crc32);
16977 +  /* CRC currently not added to the DSP binary, so this code is commented out */
16978 +  /* 
16979 +  data.aword = dslhal_support_byteSwap32(data.aword);
16980 +  if (data.aword != crc32) 
16981 +    {
16982 +      dprintf(1,"Checksum error\n");
16983 +    }
16984 +  */
16985 +  /* Verify signature - Changed from "320C6x" to "TIDSL" for load 80 */
16986 +  
16987 +  header.signature[5]='\0';
16988 +  dprintf(5, "signature=%s\n", header.signature);
16989 +  
16990 +  if (shim_osStringCmp(header.signature, "TIDSL")) 
16991 +    {
16992 +      dprintf(1,"Signature not match\n");
16993 +      return DSLHAL_ERROR_FIRMWARE_OFFSET;
16994 +    }
16995 +  
16996 +  dprintf(5,"tiload: check sect count\n");
16997 +  /* check section count */
16998
16999 +  if (header.sectcount > MAXSECTIONS) 
17000 +    {
17001 +      dprintf(1,"Section # %d exceeds max %d\n", header.sectcount, MAXSECTIONS);
17002 +      return DSLHAL_ERROR_FIRMWARE_OFFSET;
17003 +    } 
17004 +  else
17005 +    {
17006 +    dprintf(5,"found %d sections\n", header.sectcount);
17007 +    }
17008 +
17009 +  /* Validation of Section offsets */
17010 +  
17011 +  /* point to the first section */
17012 +  len = header.length;              /* file size in bytes */
17013 +  expoffset = sizeof(struct _header) + header.sectcount * sizeof(struct _section);
17014 +  
17015 +  dprintf(5,"tiload: check offset\n");
17016 +  for (index=0; index<header.sectcount; index++) /* parse the sections one by one */
17017 +    {
17018 +      numbytes = sizeof(struct _header) + index * sizeof(struct _section); /* Compute Section Offset */
17019 +      sptr = (struct _section *)(image + numbytes); /* Section Pointer to beginning of the section */
17020 +      
17021 +    secAddr   = dslhal_support_byteSwap32(sptr->addr);
17022 +    secOffset = dslhal_support_byteSwap32(sptr->offset);
17023 +    secLength = dslhal_support_byteSwap32(sptr->length);
17024 +    secPage   = dslhal_support_byteSwap32(sptr->page);
17025 +    
17026 +    /* validate offset */
17027 +    if ( secOffset== 0xffffffff) 
17028 +      {
17029 +      /* special case: zero fill */
17030 +      /* offset is valid, don't change expoffset */
17031 +      } 
17032 +    else 
17033 +      {
17034 +      if (secOffset > len-4) 
17035 +        {
17036 +          dprintf(5,"Offset error\n"); 
17037 +          return DSLHAL_ERROR_FIRMWARE_OFFSET;
17038 +        }
17039 +      
17040 +      /* determine expected offset of NEXT section  */
17041 +      expoffset = secLength + secOffset;
17042 +      
17043 +      /* all addresses must be on word boundaries */
17044 +      if (secAddr & 3) 
17045 +        {
17046 +          
17047 +        }
17048 +      }
17049 +    }
17050 +  
17051 +  /* check final offset - should just be a checksum left */
17052 +/* IMPORTANT 11/24/02 --> Got this error... but bypassed for Pf of Concept*/
17053 +  /*
17054 +  if (expoffset != len-4) 
17055 +    {
17056 +      dprintf(5,"Final offset error\n");
17057 +      return DSLHAL_ERROR_FIRMWARE_OFFSET;
17058 +    }
17059 +  */
17060 +
17061 +  /* Actual Code loading to DSP Memory */  
17062 +
17063 +  /* Initialize DSP Data Memory before code load*/
17064 +  dprintf(5,"Zero Prefill DSP DMEM\n");
17065 +  DSLHAL_REG32(ADSLSSADR)=0x80000000;
17066 +  shim_osZeroMemory((char *)0xa1000000, 0x10000);
17067 +  /* Load sections from the image */
17068 +  for (index=0; index<header.sectcount; index++) /* Parse each section */
17069 +    {
17070 +    numbytes = sizeof(header) + index * sizeof(struct _section); /* Compute offset to next section */
17071 +    sptr = (struct _section *)(image + numbytes);   /* Point to next section */
17072 +   
17073 +    secAddr   = dslhal_support_byteSwap32(sptr->addr);
17074 +    secOffset = dslhal_support_byteSwap32(sptr->offset);
17075 +    secLength = dslhal_support_byteSwap32(sptr->length);
17076 +    secPage   = dslhal_support_byteSwap32(sptr->page);
17077 +    
17078 +    data.aword = secAddr;
17079 +    checksum += data.byte[0] + data.byte[1] + data.byte[2] + data.byte[3];
17080 +    
17081 +    data.aword = secLength;
17082 +    checksum += data.byte[0] + data.byte[1] + data.byte[2] + data.byte[3];
17083 +    
17084 +    data.aword = secOffset;
17085 +    checksum += data.byte[0] + data.byte[1] + data.byte[2] + data.byte[3];
17086 +    
17087 +    data.aword = secPage;
17088 +    checksum += data.byte[0] + data.byte[1] + data.byte[2] + data.byte[3];
17089 +    
17090 +    
17091 +    /* validate offset */
17092 +    if (secOffset == 0xffffffff) 
17093 +      {
17094 +      /* special case: zero fill */
17095 +      /* offset is valid, don't change expoffset */
17096 +      } 
17097 +    else 
17098 +      {
17099 +      /* real offset */
17100 +      if(secOffset > len-4) 
17101 +        {
17102 +        dprintf(5,"section[%u] offset too big (%X/%X)\n", index,
17103 +                secOffset, len-4);
17104 +        
17105 +        return DSLHAL_ERROR_FIRMWARE_OFFSET;
17106 +        }
17107 +      
17108 +      /* determine expected offset of NEXT section */
17109 +      expoffset = secLength + secOffset;
17110 +      
17111 +      }
17112 +    
17113 +    }  
17114 +  
17115 +  /* check final offset - should just be a checksum left */
17116 +  /*
17117 +  if(expoffset != len-4) 
17118 +    {
17119 +      dprintf(1,"sections don't span full file (%X/%X)\n",expoffset,len-2);   
17120 +      return DSLHAL_ERROR_FIRMWARE_OFFSET;
17121 +    }
17122 +  */
17123 +  dprintf(5,"tiload: load binary\n");
17124 +  
17125 +  for (index=0; index<header.sectcount; index++)
17126 +    {
17127 +    numbytes = sizeof(header) + index * sizeof(struct _section);
17128 +    sptr = (struct _section *)(image + numbytes);  
17129 +    
17130 +    secAddr   = dslhal_support_byteSwap32(sptr->addr);
17131 +    secOffset = dslhal_support_byteSwap32(sptr->offset);
17132 +    secLength = dslhal_support_byteSwap32(sptr->length);
17133 +    secPage   = dslhal_support_byteSwap32(sptr->page);
17134 +    dprintf(5,"loading section %u\n", index);
17135 +    dprintf(5,"section %u: addr: %X\n", index, secAddr);
17136 +    dprintf(5,"section %u: length: %X\n", index, secLength);
17137 +    dprintf(5,"section %u: offset: %X\n", index, secOffset);
17138 +    dprintf(5,"section %u: page: %X\n", index, secPage);
17139 +
17140 +    /* point to the section's data */
17141 +    if(secOffset != 0xffffffff) 
17142 +      {
17143 +      /* Load this section of data */
17144 +      iptr = image + secOffset;
17145 +      dprintf(6, "iptr %8x\n", (unsigned int)iptr);
17146 +      }
17147 +    
17148 +    if(secPage)
17149 +      { 
17150 +      dprintf(6,"OVERLAY PAGE #%d\n",secPage);
17151 +      /* overlay page, don't write to dsp yet, save into host memory*/
17152 +
17153 +      dprintf(6,"Section Length: %d \n",secLength);
17154 +      ptidsl->olayDpPage[secPage].PmemStartWtAddr  = (unsigned int) shim_osAllocateDmaMemory(secLength);
17155 +      if(ptidsl->olayDpPage[secPage].PmemStartWtAddr == NULL)
17156 +       {
17157 +          dprintf(1, "overlay page allocate error\n");
17158 +          return DSLHAL_ERROR_OVERLAY_MALLOC;
17159 +        }
17160 +#ifdef PRE_SILICON
17161 +      ptidsl->olayDpPage[secPage].overlayHostAddr = ((((ptidsl->olayDpPage[secPage].PmemStartWtAddr)-0x84000000)-0x10000000)+0x030b0000);
17162 +#else
17163 +      /*      ptidsl->olayDpPage[secPage].overlayHostAddr = ((unsigned int)(ptidsl->olayDpPage[secPage].PmemStartWtAddr)&~0xe0000000); */
17164 +      ptidsl->olayDpPage[secPage].overlayHostAddr = virtual2Physical((unsigned int)ptidsl->olayDpPage[secPage].PmemStartWtAddr);
17165 +#endif
17166 +      dprintf(6,"Allocated Addr: 0x%x \t Xlated Addr: 0x%x \n",ptidsl->olayDpPage[secPage].PmemStartWtAddr,ptidsl->olayDpPage[secPage].overlayHostAddr);
17167 +
17168 +      ptidsl->olayDpPage[secPage].overlayHostAddr = (unsigned int)dslhal_support_byteSwap32(ptidsl->olayDpPage[secPage].overlayHostAddr);
17169 +      ptidsl->olayDpPage[secPage].OverlayXferCount = secLength;
17170 +      ptidsl->olayDpPage[secPage].BinAddr          = secAddr;
17171 +      ptidsl->olayDpPage[secPage].SecOffset        = secOffset;
17172 +      shim_osMoveMemory((char *)ptidsl->olayDpPage[secPage].PmemStartWtAddr, (char *)iptr, secLength);
17173 +      /*   RamP Image ByteSwap test */
17174 +      olayStart = (unsigned int *)ptidsl->olayDpPage[secPage].PmemStartWtAddr;
17175 +            
17176 +      for(olayXfer=0;olayXfer< secLength/4;olayXfer++)
17177 +        {
17178 +          olayStore = *(unsigned int *)olayStart;
17179 +          olayStore = (unsigned int)dslhal_support_byteSwap32(olayStore);
17180 +          *(unsigned int*)olayStart = olayStore;
17181 +          dprintf(5, "Addr:0x%x \t Content: 0x%x \n",olayStart,olayStore);
17182 +          olayStart++;
17183 +          olayStore=0;
17184 +        }
17185 +      /* RamP Image ByteSwap test */
17186 +      /* compute the CRC of each overlay page and Store the Checksum in a local global variable */
17187 +      /* This Value of CRC is to be compared with the header where all the CRC bytes are lumped together */
17188 +      ptidsl->olayDpPage[secPage].olayPageCrc32 = dslhal_support_computeCrc32((char *)ptidsl->olayDpPage[secPage].PmemStartWtAddr, ptidsl->olayDpPage[secPage].OverlayXferCount);
17189 +
17190 +      shim_osWriteBackCache((void *)ptidsl->olayDpPage[secPage].PmemStartWtAddr, secLength);
17191 +      }
17192 +    else
17193 +      {      
17194 +       rc = secAddr&0xff000000;
17195 +       if(rc && rc!=0x80000000)
17196 +        {
17197 +          dprintf(4,"Not DSP PMEM/DMEM\n");
17198 +          /* don't write to dsp, save into host memory*/
17199 +          dprintf(4,"Section Addr: %x Section Length: %d \n",secAddr,secLength);
17200 +          ptidsl->coProfiles.PmemStartWtAddr = (unsigned int) shim_osAllocateDmaMemory(secLength);
17201 +          if(ptidsl->coProfiles.PmemStartWtAddr == NULL)
17202 +          {
17203 +           dprintf(1, "memory allocate error\n");
17204 +           return DSLHAL_ERROR_OVERLAY_MALLOC;
17205 +          }
17206 +      ptidsl->coProfiles.overlayHostAddr =  virtual2Physical((unsigned int)ptidsl->coProfiles.PmemStartWtAddr);
17207 +      dprintf(4,"Allocated Addr: 0x%x \t Xlated Addr: 0x%x \n",ptidsl->coProfiles.PmemStartWtAddr, ptidsl->coProfiles.overlayHostAddr);
17208 +      ptidsl->coProfiles.overlayHostAddr = (unsigned int)dslhal_support_byteSwap32(ptidsl->coProfiles.overlayHostAddr);
17209 +      ptidsl->coProfiles.OverlayXferCount = secLength;
17210 +      ptidsl->coProfiles.BinAddr = secAddr;
17211 +      ptidsl->coProfiles.SecOffset = secOffset;
17212 +
17213 +      shim_osMoveMemory((char *)ptidsl->coProfiles.PmemStartWtAddr, (char *)iptr, secLength);
17214 +      /*   RamP Image ByteSwap test */
17215 +      olayStart = (unsigned int *)ptidsl->coProfiles.PmemStartWtAddr;
17216 +            
17217 +      for(olayXfer=0;olayXfer< secLength/4;olayXfer++)
17218 +        {
17219 +          olayStore = *(unsigned int *)olayStart;
17220 +          olayStore = (unsigned int)dslhal_support_byteSwap32(olayStore);
17221 +          *(unsigned int*)olayStart = olayStore;
17222 +          dprintf(5, "Addr:0x%x \t Content: 0x%x \n",olayStart,olayStore);
17223 +          olayStart++;
17224 +          olayStore=0;
17225 +        }
17226 +      shim_osWriteBackCache((void *)ptidsl->coProfiles.PmemStartWtAddr, secLength);
17227 +        }
17228 +      else
17229 +        {
17230 +      /* IMPORTANT: write image to DSP memory */
17231 +      rc=dslhal_support_blockWrite((void *)iptr, (void *)secAddr, secLength);
17232 +      if(rc)
17233 +        {
17234 +        dprintf(1,"dslhal_support_blockRead failed\n");
17235 +        return DSLHAL_ERROR_BLOCK_READ;
17236 +        }
17237 +       shim_osClockWait(0x50000);
17238 +      /*
17239 +      rc=dslhal_support_blockRead((void*)secAddr, (void*)tmpBuffer, secLength);
17240 +      if(rc)
17241 +        {
17242 +        dprintf(1,"dslhal_support_blockRead failed\n");
17243 +        return DSLHAL_ERROR_BLOCK_READ;
17244 +        }
17245 +      for(i=0;i<secLength;i++)
17246 +        {
17247 +        if(*iptr
17248 +        }*/
17249 +        }
17250 +      }
17251 +    } /* end of write dsp image */
17252 +
17253 +  /***********************************************************************************
17254 +   * Start to fillup various values to our hardware structure for late use
17255 +   ************************************************************************************/
17256 +  
17257 +  /* get main pointer for data */
17258 +
17259 +  rc = dslhal_support_blockRead(tmp, &pdspOamSharedInterface, sizeof(unsigned int));
17260 +  dprintf(5, "tmp=0x%X, addr=0x%X\n", (unsigned int)tmp, (unsigned int)pdspOamSharedInterface);
17261 +  pdspOamSharedInterface= (DEV_HOST_dspOamSharedInterface_t *)dslhal_support_byteSwap32((unsigned int)pdspOamSharedInterface);
17262 +  dprintf(5, "tmp=0x%X, addr=0x%X\n", (unsigned int)tmp, (unsigned int)pdspOamSharedInterface);
17263 +  if (rc)
17264 +    {
17265 +    dprintf(1,"dslhal_support_blockRead failed\n");
17266 +    return DSLHAL_ERROR_BLOCK_READ;
17267 +    }
17268 +  
17269 +  if(!pdspOamSharedInterface)
17270 +    {
17271 +    dprintf(1,"Couldn't read main pointer\n");
17272 +    return DSLHAL_ERROR_INVALID_PARAM;
17273 +    }
17274 +  
17275 +  ptidsl->pmainAddr=pdspOamSharedInterface;
17276 +
17277 +  /* read the OamSharedInterfaceStructure */
17278 +  
17279 +  dprintf(5,"ptidsl->hostIf.mainAddr=0x%X\n", (unsigned int)ptidsl->pmainAddr);
17280 +  
17281 +  /* get the pointer to DSP-OAM Shared Interface */
17282 +  rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface, 
17283 +                                     sizeof(DEV_HOST_dspOamSharedInterface_t));
17284 +  if (rc)
17285 +    {
17286 +    dprintf(1,"dslhal_support_blockRead failed\n");
17287 +    return DSLHAL_ERROR_BLOCK_READ;
17288 +    }
17289 +  /* Communicate the Allocated Memory Address to DSP to choose CO Profiles */
17290 +
17291 +  /* Change the Endianness of the profileList pointer */
17292 +  dspOamSharedInterface.profileList_p = (DEV_HOST_profileBase_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.profileList_p);
17293 +  /* Access the profileList Structure */
17294 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.profileList_p,&profileList, sizeof(DEV_HOST_profileBase_t));
17295 +  
17296 +  if (rc)
17297 +    {
17298 +    dprintf(1,"dslhal_support_blockRead failed\n");
17299 +    return DSLHAL_ERROR_BLOCK_READ;
17300 +    }
17301 +  dprintf(2,"Old Addr:%x  New: %x \n",profileList.hostProfileBase_p,ptidsl->coProfiles.overlayHostAddr); 
17302 +  profileList.hostProfileBase_p = (DEV_HOST_coData_t *)ptidsl->coProfiles.overlayHostAddr;
17303 +  rc = dslhal_support_blockWrite(&profileList,(PVOID)dspOamSharedInterface.profileList_p,sizeof(DEV_HOST_profileBase_t));
17304 +     if (rc) 
17305 +       return DSLHAL_ERROR_BLOCK_WRITE;
17306 +
17307 +  /* Communicate the Allocated Memory Address to DSP to do overlays */
17308 +
17309 +  /* Change the Endianness of the olayDpDef pointer */
17310 +  dspOamSharedInterface.olayDpParms_p = (DEV_HOST_olayDpDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.olayDpParms_p);
17311 +  /* Access the olayDpDef Structure */
17312 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.olayDpParms_p,&olayDpParms, sizeof(DEV_HOST_olayDpDef_t));
17313 +  
17314 +  if (rc)
17315 +    {
17316 +    dprintf(1,"dslhal_support_blockRead failed\n");
17317 +    return DSLHAL_ERROR_BLOCK_READ;
17318 +    }
17319 +
17320 +
17321 +  for(i=1;i<NUM_PAGES;i++)
17322 +   {
17323 +  /* Change the endianness of the olayDpPageDef Pointer */
17324 +     olayDpParms.olayDpPage_p[i] = (DEV_HOST_olayDpPageDef_t *) dslhal_support_byteSwap32((unsigned int)olayDpParms.olayDpPage_p[i]);
17325 +     /* Access the olayDpPageDef Structure */
17326 +     rc = dslhal_support_blockRead((PVOID)olayDpParms.olayDpPage_p[i],&olayDpPageDef[i],sizeof(DEV_HOST_olayDpPageDef_t));
17327 +     if (rc) 
17328 +       return DSLHAL_ERROR_BLOCK_READ;
17329 +     olayDpPageDef[i].overlayHostAddr = ptidsl->olayDpPage[i].overlayHostAddr;
17330 +     rc = dslhal_support_blockWrite(&olayDpPageDef[i],(PVOID)olayDpParms.olayDpPage_p[i],sizeof(DEV_HOST_olayDpPageDef_t));
17331 +     if (rc) 
17332 +       return DSLHAL_ERROR_BLOCK_WRITE;
17333 +   }
17334 +  
17335 +  /* Change the endianness of the Datapump Version Pointer */    
17336 +  dspOamSharedInterface.datapumpVersion_p = (DEV_HOST_dspVersionDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.datapumpVersion_p);
17337 +
17338 +  /* get DSPVersion itself */
17339 +   
17340 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.datapumpVersion_p,&dspVersion, sizeof(DEV_HOST_dspVersionDef_t));
17341
17342 +  if (rc)
17343 +    {
17344 +    dprintf(1,"dslhal_support_blockRead failed\n");
17345 +    return DSLHAL_ERROR_BLOCK_READ;
17346 +    }
17347 +  
17348 +  /* table_dsp info */
17349 +#if SWTC
17350 +  dspOamSharedInterface.tcHostComm_p = (DEV_HOST_tcHostCommDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.tcHostComm_p);
17351 +  rc = dslhal_support_blockRead(&pdspOamSharedInterface->tcHostComm_p,
17352 +                                    &pTCHostCommDef, 4);
17353 +  if (rc)
17354 +    {
17355 +    dprintf(1,"dslhal_support_blockRead failed\n");
17356 +    return DSLHAL_ERROR_BLOCK_READ;
17357 +    }
17358 +  
17359 +    pTCHostCommDef=(DEV_HOST_tcHostCommDef_t *) dslhal_support_byteSwap32((unsigned int)pTCHostCommDef);
17360 +  
17361 +   rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.tcHostComm_p, 
17362 +                               &TCHostCommDef, sizeof(DEV_HOST_tcHostCommDef_t));
17363 +  if (rc)
17364 +    {
17365 +    dprintf(1,"dslhal_support_blockRead failed\n");
17366 +    return DSLHAL_ERROR_BLOCK_READ;
17367 +    }
17368 +#endif
17369 +  /* Select the Multimode Training */
17370 +  dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p);
17371 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.oamWriteNegoParams_p, &OamWrNegoParaDef, sizeof(DEV_HOST_oamWrNegoParaDef_t));
17372 +  if (rc)
17373 +    {
17374 +    dprintf(1,"dslhal_support_blockRead failed\n");
17375 +    return DSLHAL_ERROR_BLOCK_READ;
17376 +    }
17377 +switch(dspVersion.netService)
17378 +  {
17379 +  case 1:  OamWrNegoParaDef.stdMode = MULTI_MODE;
17380 +           dprintf(5,"POTS Service \n");
17381 +           ptidsl->netService = 1;
17382 +           break;
17383 +  case 2:  OamWrNegoParaDef.stdMode = GDMT_MODE;
17384 +           dprintf(5,"ISDN Service \n");
17385 +           ptidsl->netService = 2;
17386 +           break;
17387 +  default: OamWrNegoParaDef.stdMode = T1413_MODE;
17388 +           dprintf(5,"Default Service \n");
17389 +           break;
17390 +  }
17391 +
17392 +   ptidsl->AppData.StdMode = (unsigned int)OamWrNegoParaDef.stdMode;
17393 +
17394 +   OamWrNegoParaDef.oamFeature = dslhal_support_byteSwap32((OAMFEATURE_TC_SYNC_DETECT_MASK));
17395 +  /* Set the flag to start retraining if the margin of the modem drops below 
17396 +     default margin during showtime */
17397 +  
17398 +  OamWrNegoParaDef.marginMonitorShwtme = FALSE; 
17399 +    /*  Set the flag to start retraining if the margin of the modem drops below default margin during training */
17400 +   
17401 +  OamWrNegoParaDef.marginMonitorTrning = FALSE;
17402 +  OamWrNegoParaDef.dsToneTurnoff_f = 0;
17403 +  dslhal_support_blockWrite(&OamWrNegoParaDef, 
17404 +                                 (PVOID)dspOamSharedInterface.oamWriteNegoParams_p, sizeof(DEV_HOST_oamWrNegoParaDef_t));
17405 +  rc=dslhal_support_setInterruptMask(ptidsl,0);
17406 +  if(rc!=DSLHAL_ERROR_NO_ERRORS)
17407 +    return rc;
17408 +  /* Co Profile Test */
17409 +#if CO_PROFILES
17410 +  dspOamSharedInterface.profileList_p = (DEV_HOST_profileBase_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.profileList_p);
17411 +  /* Access the profileList Structure */
17412 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.profileList_p,&profileList, sizeof(DEV_HOST_profileBase_t));
17413 +  if (rc)
17414 +    {
17415 +    dprintf(1,"dslhal_support_blockRead failed\n");
17416 +    return DSLHAL_ERROR_BLOCK_READ;
17417 +    }
17418 +  profileList.hostProfileBase_p = (DEV_HOST_coData_t *)dslhal_support_byteSwap32((unsigned int)profileList.hostProfileBase_p);
17419 +  rc = dslhal_support_blockRead((PVOID)profileList.hostProfileBase_p,&coData, sizeof(DEV_HOST_coData_t));
17420 +  if (rc)
17421 +   {
17422 +    dprintf(1,"dslhal_support_blockRead failed\n");
17423 +    return DSLHAL_ERROR_BLOCK_READ;
17424 +    }
17425 +  dprintf(2,"Current Profile Vendor Id: %x \n",coData.phyAgcPgaTarget);
17426 +  coData.phyAgcPgaTarget = 0xcaba;
17427 +  rc = dslhal_support_blockWrite(&coData,(PVOID)profileList.hostProfileBase_p,sizeof(DEV_HOST_coData_t));
17428 +  if(rc)
17429 +    return DSLHAL_ERROR_BLOCK_WRITE;
17430 +#endif
17431 +  /* End of CO Profile Test */
17432 +
17433 +#ifndef NO_ACT
17434 +  /* Constellation Display Buffer Allocate */
17435 +  ptidsl->constDisplay.PmemStartWtAddr = (unsigned int) shim_osAllocateDmaMemory(DSP_CONSTELLATION_BUFFER_SIZE);
17436 +  if(ptidsl->constDisplay.PmemStartWtAddr == NULL)
17437 +    {
17438 +      dprintf(1, "memory allocate error\n");
17439 +      return DSLHAL_ERROR_OVERLAY_MALLOC;
17440 +     }
17441 +  shim_osZeroMemory((void*)ptidsl->constDisplay.PmemStartWtAddr,DSP_CONSTELLATION_BUFFER_SIZE);
17442 +  ptidsl->constDisplay.overlayHostAddr =  virtual2Physical((unsigned int)ptidsl->constDisplay.PmemStartWtAddr);
17443 +      dprintf(4,"Allocated Addr: 0x%x \t Xlated Addr: 0x%x \n",ptidsl->constDisplay.PmemStartWtAddr, ptidsl->constDisplay.overlayHostAddr);
17444 +      ptidsl->constDisplay.OverlayXferCount = DSP_CONSTELLATION_BUFFER_SIZE;
17445 +
17446 +  /* Communicate the Allocated Buffer for DSP load Constellation Data */
17447 +
17448 +  /* Change the Endianness of the profileList pointer */
17449 +  dspOamSharedInterface.consDispVar_p = (DEV_HOST_consBufDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.consDispVar_p);
17450 +  /* Access the profileList Structure */
17451 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.consDispVar_p,&constDisp, sizeof(DEV_HOST_consBufDef_t));
17452 +  
17453 +  if (rc)
17454 +    {
17455 +    dprintf(1,"dslhal_support_blockRead failed\n");
17456 +    return DSLHAL_ERROR_BLOCK_READ;
17457 +    }
17458 +  dprintf(2,"Constellation Old Addr:%x  New: %x \n",constDisp.consDispStartAddr,ptidsl->constDisplay.overlayHostAddr); 
17459 +  constDisp.consDispStartAddr = (unsigned int)dslhal_support_byteSwap32(ptidsl->constDisplay.overlayHostAddr);
17460 +  constDisp.consDispCurrentAddr = constDisp.consDispStartAddr;
17461 +  constDisp.consDispBufLen = (unsigned int)dslhal_support_byteSwap32(DSP_CONSTELLATION_BUFFER_SIZE);
17462 +  rc = dslhal_support_blockWrite(&constDisp,(PVOID)dspOamSharedInterface.consDispVar_p,sizeof(DEV_HOST_consBufDef_t));
17463 +     if (rc) 
17464 +       return DSLHAL_ERROR_BLOCK_WRITE;
17465 +#endif
17466 +  dprintf(5,"dslhal_support_hostDspCodeDownload() completed.\n");
17467 +  return DSLHAL_ERROR_NO_ERRORS;
17468 +  
17469 +}  /* end of dslhal_support_hostDspCodeDownload() */
17470 +
17471 +/********************************************************************************************
17472 +* FUNCTION NAME: dslhal_support_readDelineationState()
17473 +*
17474 +*********************************************************************************************
17475 +* DESCRIPTION:
17476 +*   download DSP image from host memory to dsp memory
17477 +*
17478 +* Return: 0  success
17479 +*         1  failed
17480 +* 
17481 +* NOTE: 
17482 +*   DSP image is based on LITTLE endian
17483 +*
17484 +********************************************************************************************/
17485 +
17486 +unsigned int dslhal_support_readDelineationState(tidsl_t * ptidsl)
17487 +{
17488 +  DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
17489 +  DEV_HOST_atmStats_t           atmStats;
17490 +  DEV_HOST_dsAtmStats_t         dsAtmStats0;
17491 +  unsigned int rc=0, delinState=0;
17492 +  pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterface_t *) ptidsl->pmainAddr;
17493 +  rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
17494 +  if (rc)
17495 +    {
17496 +      dprintf(1,"dslhal_support_blockRead failed\n");
17497 +      return DSLHAL_ERROR_BLOCK_READ;
17498 +    }
17499 +  
17500 +  dspOamSharedInterface.atmStats_p = (DEV_HOST_atmStats_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.atmStats_p);
17501 +  
17502 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.atmStats_p,&atmStats, sizeof(DEV_HOST_atmStats_t));
17503 +  
17504 +  if (rc)
17505 +    {
17506 +      dprintf(1,"dslhal_support_blockRead failed\n");
17507 +      return DSLHAL_ERROR_BLOCK_READ;
17508 +    }
17509 +  
17510 +  atmStats.ds0_p = (DEV_HOST_dsAtmStats_t *) dslhal_support_byteSwap32((unsigned int)atmStats.ds0_p);
17511 +  
17512 +  rc = dslhal_support_blockRead((PVOID)atmStats.ds0_p,&dsAtmStats0, (sizeof(DEV_HOST_dsAtmStats_t)));
17513 +
17514 +  if (rc) 
17515 +    return rc;
17516 +  delinState = dslhal_support_byteSwap32(dsAtmStats0.delineationState);
17517 +  if(delinState == TC_SYNC)
17518 +     ptidsl->lConnected = 1;
17519 +  else
17520 +     ptidsl->lConnected = 0;
17521 +  return DSLHAL_ERROR_NO_ERRORS;
17522 +}
17523 +
17524 +/********************************************************************************************
17525 +* FUNCTION NAME: dslhal_support_processModemStateBitField()
17526 +*
17527 +*********************************************************************************************
17528 +* DESCRIPTION:
17529 +*   download DSP image from host memory to dsp memory
17530 +*
17531 +* Return: 0  success
17532 +*         1  failed
17533 +* 
17534 +* NOTE: 
17535 +*   DSP image is based on LITTLE endian
17536 +*
17537 +********************************************************************************************/
17538 +
17539 +unsigned int dslhal_support_processModemStateBitField(tidsl_t * ptidsl)
17540 +{
17541 +  int rc, offset[2]={2,0};
17542 +  int modemStateBitFields[NUMBER_OF_BITFIELDS],changedField=0;
17543 +  rc = dslhal_api_dspInterfaceRead(ptidsl,(unsigned int)ptidsl->pmainAddr,2,(unsigned int *)&offset,
17544 +                                  (unsigned char *)&modemStateBitFields,NUMBER_OF_BITFIELDS*sizeof(int));
17545 +  if (rc)
17546 +    return DSLHAL_ERROR_BLOCK_READ;
17547 +  for(rc=0;rc<NUMBER_OF_BITFIELDS;rc++)
17548 +    dprintf(4,"Bit Field %d: 0x%x \n",rc+1,dslhal_support_byteSwap32((unsigned int)modemStateBitFields[rc]));
17549 +
17550 +  for(rc=NUMBER_OF_BITFIELDS;rc>0;rc--)
17551 +    {
17552 +     if(ptidsl->modemStateBitField[rc-1]!=modemStateBitFields[rc-1])
17553 +       {
17554 +         changedField = rc;
17555 +         break;
17556 +       }
17557 +    }
17558 +  if(changedField)
17559 +    {
17560 +      for(rc=0;rc<32;rc++)
17561 +        {
17562 +           if(modemStateBitFields[changedField-1] & dslhal_support_byteSwap32((BITFIELD_SCAN >> rc)))
17563 +             break;
17564 +         }
17565 +      dprintf(5,"Changed Field : %d  Changed Bit : %d \n",changedField,(31-rc));
17566 +      ptidsl->rState = ((changedField*100) + (31-rc));
17567 +      dprintf(5,"Modem State : %d \n",ptidsl->rState);
17568 +      shim_osMoveMemory((void *)ptidsl->modemStateBitField,(void *)modemStateBitFields, 4*NUMBER_OF_BITFIELDS);
17569 +    }
17570 +
17571 +  switch(changedField)
17572 +    {
17573 +    case 1:  if((ptidsl->rState >= ATU_RIDLE) && (ptidsl->AppData.bState < RSTATE_IDLE))
17574 +                   ptidsl->AppData.bState = RSTATE_IDLE;
17575 +             if((ptidsl->rState >= GDMT_NSFLR) && (ptidsl->AppData.bState < RSTATE_INIT))
17576 +                 ptidsl->AppData.bState = RSTATE_INIT;
17577 +             if((ptidsl->rState >= GDMT_ACKX) && (ptidsl->AppData.bState < RSTATE_HS))
17578 +                 ptidsl->AppData.bState = RSTATE_HS;
17579 +             break;
17580 +
17581 +    case 2:  if((ptidsl->rState >= T1413_NSFLR) && (ptidsl->AppData.bState < RSTATE_INIT))
17582 +                 ptidsl->AppData.bState = RSTATE_INIT;
17583 +             if((ptidsl->rState >= T1413_ACKX) && (ptidsl->AppData.bState < RSTATE_HS))
17584 +                 ptidsl->AppData.bState = RSTATE_HS;
17585 +             if((ptidsl->rState == ATU_RSHOWTIME) && (ptidsl->AppData.bState < RSTATE_SHOWTIME))
17586 +                 ptidsl->AppData.bState = RSTATE_SHOWTIME;
17587 +             break;
17588
17589 +    case 3:  if((ptidsl->rState >= ADSL2_COMB3) && (ptidsl->AppData.bState < RSTATE_INIT))
17590 +                 ptidsl->AppData.bState = RSTATE_INIT;
17591 +             if((ptidsl->rState >= ADSL2_RPARAMS) && (ptidsl->AppData.bState < RSTATE_HS))
17592 +                 ptidsl->AppData.bState = RSTATE_HS;
17593 +             break;
17594
17595 +    case 4:  break;
17596 +    default: break;
17597 +    }
17598 +
17599 +  ptidsl->stateTransition = modemStateBitFields[1];
17600 +  switch(ptidsl->AppData.bState)
17601 +    {
17602 +    case RSTATE_IDLE:       ptidsl->AppData.idleTick=shim_osClockTick();
17603 +                            ptidsl->AppData.initTick=0;
17604 +                            ptidsl->AppData.showtimeTick=0;
17605 +                            break;
17606 +    case RSTATE_HS:         if(!ptidsl->AppData.initTick)
17607 +                              {
17608 +                                ptidsl->AppData.initTick=shim_osClockTick();
17609 +                                }
17610 +                            ptidsl->AppData.showtimeTick=0;  
17611 +                            break;
17612 +    case RSTATE_SHOWTIME:   if(!ptidsl->AppData.showtimeTick)
17613 +                              ptidsl->AppData.showtimeTick=shim_osClockTick();
17614 +                            break;
17615 +    default:                break;
17616 +                              }
17617 +  return DSLHAL_ERROR_NO_ERRORS;
17618 +}
17619 +
17620 +/********************************************************************************************
17621 +* FUNCTION NAME: dslhal_support_setInterruptMask()
17622 +*
17623 +*********************************************************************************************
17624 +* DESCRIPTION:
17625 +*   Sets the host interrupt bit masks
17626 +*
17627 +* Return: 0  success
17628 +*         1  failed
17629 +* 
17630 +* NOTE: 
17631 +*   DSP image is based on LITTLE endian
17632 +*
17633 +********************************************************************************************/
17634 +
17635 +unsigned int dslhal_support_setInterruptMask(tidsl_t * ptidsl,unsigned int inputMask)
17636 +{
17637 +  DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
17638 +  DEV_HOST_hostInterruptMask_t interruptMask;
17639 +  unsigned int rc=0;
17640 +  pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterface_t *) ptidsl->pmainAddr;
17641 +  rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
17642 +  if (rc)
17643 +    {
17644 +      dprintf(1,"dslhal_support_blockRead failed\n");
17645 +      return DSLHAL_ERROR_BLOCK_READ;
17646 +    }
17647 +  dspOamSharedInterface.hostInterruptMask_p =(DEV_HOST_hostInterruptMask_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.hostInterruptMask_p);
17648 +
17649 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.hostInterruptMask_p,
17650 +                                     &interruptMask, sizeof(DEV_HOST_hostInterruptMask_t));
17651 +  if (rc)
17652 +    {
17653 +    dprintf(1,"dslhal_support_blockRead failed\n");
17654 +    return DSLHAL_ERROR_BLOCK_READ;
17655 +    }
17656 +  if(inputMask & MASK_MAILBOX_INTERRUPTS)
17657 +    {
17658 +      dprintf(7,"Mailbox Interrupts Masked \n");
17659 +      dprintf(7,"interruptMask.maskBitField1 = %d \n",dslhal_support_byteSwap32(interruptMask.maskBitField1));
17660 +      interruptMask.maskBitField1 |= dslhal_support_byteSwap32(MASK_MAILBOX_INTERRUPTS);
17661 +      dprintf(7,"interruptMask.maskBitField1 = %d \n",dslhal_support_byteSwap32(interruptMask.maskBitField1));
17662 +    }
17663 +  if(inputMask & MASK_BITFIELD_INTERRUPTS)
17664 +    {
17665 +      dprintf(7,"Bit field Interrupts Masked \n");
17666 +      dprintf(7,"interruptMask.maskBitField1 = %d \n",dslhal_support_byteSwap32(interruptMask.maskBitField1));
17667 +      interruptMask.maskBitField1 |= dslhal_support_byteSwap32(MASK_BITFIELD_INTERRUPTS);
17668 +      dprintf(7,"interruptMask.maskBitField1 = %d \n",dslhal_support_byteSwap32(interruptMask.maskBitField1));
17669 +    }
17670 +  if(inputMask & MASK_HEARTBEAT_INTERRUPTS)
17671 +    {
17672 +      dprintf(7,"Bit field Interrupts Masked \n");
17673 +      dprintf(7,"interruptMask.maskBitField1 = %d \n",dslhal_support_byteSwap32(interruptMask.maskBitField1));
17674 +      interruptMask.maskBitField1 |= dslhal_support_byteSwap32(MASK_HEARTBEAT_INTERRUPTS);
17675 +      dprintf(7,"interruptMask.maskBitField1 = %d \n",dslhal_support_byteSwap32(interruptMask.maskBitField1));
17676 +    }
17677 +  dslhal_support_blockWrite(&interruptMask, 
17678 +                                 dspOamSharedInterface.hostInterruptMask_p, sizeof(DEV_HOST_hostInterruptMask_t));
17679 +  dprintf(5,"dslhal_support_setInterruptMask() completed.\n");
17680 +  return DSLHAL_ERROR_NO_ERRORS;
17681 +}
17682 +
17683 +/********************************************************************************************
17684 +* FUNCTION NAME: dslhal_support_parseInterruptSource()
17685 +*
17686 +*********************************************************************************************
17687 +* DESCRIPTION:
17688 +*   Parses the Interrupt Source Bit Field
17689 +*
17690 +* Return: interrupt Code if successful
17691 +*         negative error code if failed
17692 +* 
17693 +* NOTE: 
17694 +*   DSP image is based on LITTLE endian
17695 +*
17696 +********************************************************************************************/
17697 +
17698 +unsigned int dslhal_support_parseInterruptSource(tidsl_t * ptidsl)
17699 +{
17700 +  DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface;
17701 +  DEV_HOST_hostInterruptSource_t interruptSource;
17702 +  unsigned int rc=0,intrCode=0;
17703 +  pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterface_t *) ptidsl->pmainAddr;
17704 +  rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
17705 +  if (rc)
17706 +    {
17707 +      dprintf(1,"dslhal_support_blockRead failed\n");
17708 +      return (0-DSLHAL_ERROR_BLOCK_READ);
17709 +    }
17710 +  dspOamSharedInterface.hostInterruptSource_p =(DEV_HOST_hostInterruptSource_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.hostInterruptSource_p);
17711 +
17712 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.hostInterruptSource_p,
17713 +                                     &interruptSource, sizeof(DEV_HOST_hostInterruptSource_t));
17714 +  if (rc)
17715 +    {
17716 +    dprintf(1,"dslhal_support_blockRead failed\n");
17717 +    return (0-DSLHAL_ERROR_BLOCK_READ);
17718 +    }
17719 +  if(interruptSource.sourceBitField1 & dslhal_support_byteSwap32(MASK_MAILBOX_INTERRUPTS))
17720 +    {
17721 +      dprintf(7,"Mailbox Interrupts Acknowledge \n");
17722 +      intrCode |= 0x00000011;
17723 +    }
17724 +  if(interruptSource.sourceBitField1 & dslhal_support_byteSwap32(MASK_BITFIELD_INTERRUPTS))
17725 +    {
17726 +      dprintf(7,"Bit field Interrupt Acknowledge \n");
17727 +      intrCode |= 0x00001002;
17728 +    }
17729 +  if(interruptSource.sourceBitField1 & dslhal_support_byteSwap32(MASK_HEARTBEAT_INTERRUPTS))
17730 +    {
17731 +      dprintf(7,"HeartBeat Interrupt Acknowledge \n");
17732 +      intrCode |= 0x00100004;
17733 +    }
17734 +  
17735 +  interruptSource.sourceBitField1 &=0x0;
17736 +  rc=dslhal_support_blockWrite(&interruptSource, 
17737 +                                 dspOamSharedInterface.hostInterruptSource_p, sizeof(DEV_HOST_hostInterruptSource_t));
17738 +  if(rc)
17739 +    return (0-DSLHAL_ERROR_BLOCK_WRITE);
17740 +  dprintf(5,"dslhal_support_parseInterruptSource() completed.\n");
17741 +  return intrCode;
17742 +}
17743 +
17744 +/********************************************************************************************
17745 +* FUNCTION NAME: dslhal_support_byteSwap16()
17746 +*
17747 +*********************************************************************************************
17748 +* DESCRIPTION:
17749 +*   input 16 bit short, byte swap from little endian to big endian or vise versa
17750 +*
17751 +********************************************************************************************/
17752 +
17753 +unsigned short dslhal_support_byteSwap16(unsigned short in16Bits)
17754 +{
17755 +    unsigned short out16Bits;
17756 +    
17757 +#ifdef EB
17758 +    unsigned char *pchar;
17759 +    unsigned char tmp;
17760 +#endif
17761 +    
17762 +    out16Bits = in16Bits;
17763 +
17764 +#ifdef EB    
17765 +    pchar = (unsigned char *)(&out16Bits);
17766 +    
17767 +    tmp = *pchar;
17768 +    *pchar = *(pchar + 1);
17769 +    *(pchar + 1) = tmp;
17770 +#endif
17771 +    
17772 +    return out16Bits;
17773 +    
17774 +} /* end of dslhal_support_byteSwap16() */
17775 +
17776 +/********************************************************************************************
17777 +* FUNCTION NAME: dslhal_support_byteSwap32()
17778 +*
17779 +*********************************************************************************************
17780 +* DESCRIPTION:
17781 +*   input 32 bit int, byte swap from little endian to big endian or vise versa
17782 +*
17783 +********************************************************************************************/
17784 +
17785 +unsigned int dslhal_support_byteSwap32(unsigned int in32Bits)
17786 +{
17787 +    int out32Bits;
17788 +
17789 +#ifdef EB
17790 +    unsigned char tmp;
17791 +    unsigned char *pchar;
17792 +#endif    
17793 +
17794 +    out32Bits = in32Bits;
17795 +    
17796 +#ifdef EB
17797 +    pchar = (unsigned char *)(&out32Bits);
17798 +    
17799 +    tmp = *pchar;
17800 +    *pchar = *(pchar + 3);
17801 +    *(pchar + 3) = tmp;
17802 +    
17803 +    tmp = *(pchar + 1);
17804 +    *(pchar + 1) = *(pchar + 2);
17805 +    *(pchar + 2) = tmp;
17806 +#endif
17807 +    
17808 +    return out32Bits;
17809 +    
17810 +} /* end of dslhal_support_byteSwap32() */
17811 +
17812 +
17813 +/********************************************************************************************
17814 +* FUNCTION NAME: dslhal_support_computeCrc32()
17815 +*
17816 +*********************************************************************************************
17817 +* DESCRIPTION:
17818 +*   Computes the CRC-32 for the input data
17819 +*
17820 +* Return: 32 bit CRC of the input data
17821 +*      
17822 +* 
17823 +* NOTE: 
17824 +*   DSP image is based on LITTLE endian
17825 +*
17826 +********************************************************************************************/
17827 +unsigned int dslhal_support_computeCrc32(unsigned char *data, int len)
17828 +{
17829 +    unsigned int        result;
17830 +    int                 i,j;
17831 +    unsigned char       octet;
17832 +   
17833 +    if ((len < 4) || (data==NULL))
17834 +        return(0xdeaddead);
17835 +    result = *data++ << 24;
17836 +    result |= *data++ << 16;
17837 +    result |= *data++ << 8;
17838 +    result |= *data++;
17839 +    result = ~ result;
17840 +
17841 +    len -=4;
17842 +
17843 +    for (i=0; i<len; i++)
17844 +    {
17845 +        octet = *(data++);
17846 +        for (j=0; j<8; j++)
17847 +        {
17848 +            if (result & 0x80000000)
17849 +            {
17850 +               result = (result << 1) ^ CRC32_QUOTIENT ^ (octet >> 7);
17851 +            }
17852 +            else
17853 +            {
17854 +               result = (result << 1) ^ (octet >> 7);
17855 +            }
17856 +            octet <<= 1;
17857 +        }
17858 +    }
17859 +    return ~result;            /* The complement of the remainder */
17860 +}
17861 +
17862 +/********************************************************************************************
17863 +* FUNCTION NAME: dslhal_support_checkOverlayPage()
17864 +*
17865 +*********************************************************************************************
17866 +* DESCRIPTION:
17867 +*   Computes the CRC-32 for the input data and compares it with reference
17868 +*
17869 +* Return: Error Condition (if any)
17870 +*      
17871 +* 
17872 +* NOTE: 
17873 +*   DSP image is based on LITTLE endian
17874 +*
17875 +********************************************************************************************/
17876 +unsigned int dslhal_support_checkOverlayPage(tidsl_t *ptidsl, unsigned int tag)
17877 +{
17878 +  unsigned int computedCrc;
17879 +  if((unsigned char *)ptidsl->olayDpPage[tag].PmemStartWtAddr == NULL)
17880 +  {
17881 +     dprintf(5,"Null Address for Page: %d\n",tag);
17882 +         return DSLHAL_ERROR_OVERLAY_MALLOC;
17883 +  }
17884 +  computedCrc = dslhal_support_computeCrc32((unsigned char *)ptidsl->olayDpPage[tag].PmemStartWtAddr, ptidsl->olayDpPage[tag].OverlayXferCount);
17885 +  dprintf(6,"\n Pre-Computed CRC32 = 0x%x \t Current CRC32 = 0x%x \n",ptidsl->olayDpPage[tag].olayPageCrc32,computedCrc); 
17886 +  if(computedCrc != ptidsl->olayDpPage[tag].olayPageCrc32)
17887 +      return DSLHAL_ERROR_OVERLAY_CORRUPTED;
17888 +  else
17889 +      return DSLHAL_ERROR_NO_ERRORS;
17890 +}
17891 +
17892 +/********************************************************************************************
17893 +* FUNCTION NAME: dslhal_support_clearTrainingInfo()
17894 +*
17895 +*********************************************************************************************
17896 +* DESCRIPTION:
17897 +*   Computes the CRC-32 for the input data and compares it with reference
17898 +*
17899 +* Return: Error Condition (if any)
17900 +*      
17901 +* 
17902 +* NOTE: 
17903 +*   DSP image is based on LITTLE endian
17904 +*
17905 +********************************************************************************************/
17906 +
17907 +int dslhal_support_clearTrainingInfo(tidsl_t *ptidsl)
17908 +{
17909 +  int i;
17910 +  
17911 +  for(i=0; i<NUM_PAGES; i++)
17912 +    {
17913 +    if(ptidsl->olayDpPage[i].PmemStartWtAddr !=NULL)
17914 +      {
17915 +      shim_osFreeDmaMemory((void *) ptidsl->olayDpPage[i].PmemStartWtAddr, 
17916 +                   ptidsl->olayDpPage[i].OverlayXferCount);
17917 +      ptidsl->olayDpPage[i].PmemStartWtAddr =NULL;
17918 +      }
17919 +    }
17920 +  if(ptidsl->coProfiles.PmemStartWtAddr != NULL)
17921 +    {
17922 +     shim_osFreeDmaMemory((void *)ptidsl->coProfiles.PmemStartWtAddr, ptidsl->coProfiles.OverlayXferCount);
17923 +     ptidsl->coProfiles.PmemStartWtAddr = NULL;
17924 +    }
17925 +  return 0;
17926 +}
17927 +
17928 +
17929 +/********************************************************************************************
17930 +* FUNCTION NAME: dslhal_support_reloadTrainingInfo()
17931 +*
17932 +*********************************************************************************************
17933 +* DESCRIPTION:
17934 +*   Reload overlay pages from flash or memory
17935 +*
17936 +* Return: 0  success
17937 +*         1  failed
17938 +* 
17939 +* NOTE: 
17940 +*   DSP image is based on LITTLE endian
17941 +*
17942 +********************************************************************************************/
17943 +
17944 +int dslhal_support_reloadTrainingInfo(tidsl_t * ptidsl)
17945 +{
17946 +
17947 +  int rc = 0, i;
17948 +  unsigned int olayXfer,olayStore;
17949 +  unsigned int *olayStart;
17950 +  
17951 +  unsigned int crc32;
17952 +  DEV_HOST_dspOamSharedInterface_t dspOamSharedInterface;
17953 +  DEV_HOST_olayDpDef_t            olayDpParms;
17954 +  DEV_HOST_olayDpPageDef_t        olayDpPageDef[NUM_PAGES];
17955 +  DEV_HOST_profileBase_t          profileList;
17956 +  
17957 +  unsigned int secLength, secOffset, secPage;
17958 +
17959 +  /* co profile */
17960 +  secLength = ptidsl->coProfiles.OverlayXferCount;
17961 +  secOffset = ptidsl->coProfiles.SecOffset;
17962 +  ptidsl->coProfiles.PmemStartWtAddr = (unsigned int) shim_osAllocateDmaMemory(secLength);
17963 +  if(ptidsl->coProfiles.PmemStartWtAddr == NULL)
17964 +  {
17965 +    dprintf(1, "memory allocate error\n");
17966 +    return DSLHAL_ERROR_OVERLAY_MALLOC;
17967 +  }
17968 +          /* holdSecPhyAddr = virtual2Physical((unsigned int)holdSecVirtAddr); */
17969 +  ptidsl->coProfiles.overlayHostAddr =  virtual2Physical((unsigned int)ptidsl->coProfiles.PmemStartWtAddr);
17970 +  dprintf(4,"Allocated Addr: 0x%x \t Xlated Addr: 0x%x \n",ptidsl->coProfiles.PmemStartWtAddr, ptidsl->coProfiles.overlayHostAddr);
17971 +  ptidsl->coProfiles.overlayHostAddr = (unsigned int)dslhal_support_byteSwap32(ptidsl->coProfiles.overlayHostAddr);
17972 +  
17973 +  rc = shim_read_overlay_page((void *)ptidsl->coProfiles.PmemStartWtAddr, secOffset, secLength);
17974 +  if(rc != secLength)
17975 +  {
17976 +    dprintf(1, "shim_read_overlay_page failed\n");
17977 +    return DSLHAL_ERROR_OVERLAY_MALLOC;
17978 +  }
17979 +
17980 +  /*shim_osMoveMemory((char *)ptidsl->coProfiles.PmemStartWtAddr, (char *)iptr, secLength);*/
17981 +  /*   RamP Image ByteSwap test */
17982 +  olayStart = (unsigned int *)ptidsl->coProfiles.PmemStartWtAddr;
17983 +            
17984 +  for(olayXfer=0;olayXfer< secLength/4;olayXfer++)
17985 +  {
17986 +    olayStore = *(unsigned int *)olayStart;
17987 +    olayStore = (unsigned int)dslhal_support_byteSwap32(olayStore);
17988 +    *(unsigned int*)olayStart = olayStore;
17989 +    dprintf(5, "Addr:0x%x \t Content: 0x%x \n",olayStart,olayStore);
17990 +    olayStart++;
17991 +    olayStore=0;
17992 +  }
17993 +  shim_osWriteBackCache((void *)ptidsl->coProfiles.PmemStartWtAddr, secLength);
17994
17995 +
17996 +  for (secPage=1;secPage<NUM_PAGES; secPage++)
17997 +  {
17998 +
17999 +    dprintf(6,"OVERLAY PAGE #%d\n",secPage);
18000 +   
18001 +    secLength = ptidsl->olayDpPage[secPage].OverlayXferCount;
18002 +
18003 +    dprintf(4,"Section[%d] Length: %d \n",secPage, secLength);
18004 +
18005 +    secOffset = ptidsl->olayDpPage[secPage].SecOffset;
18006 +    ptidsl->olayDpPage[secPage].PmemStartWtAddr  = (unsigned int) shim_osAllocateDmaMemory(secLength);
18007 +    if(ptidsl->olayDpPage[secPage].PmemStartWtAddr == NULL)
18008 +    {
18009 +      dprintf(1, "overlay page allocate error\n");
18010 +      return DSLHAL_ERROR_OVERLAY_MALLOC;
18011 +    }
18012 +
18013 +    rc = shim_read_overlay_page((void *)ptidsl->olayDpPage[secPage].PmemStartWtAddr,secOffset, secLength);
18014 +    if(rc != secLength)
18015 +    {
18016 +      dprintf(1, "overlay page read error\n");
18017 +      return DSLHAL_ERROR_OVERLAY_MALLOC;
18018 +    }
18019 +
18020 +    /* ptidsl->olayDpPage[secPage].overlayHostAddr = ((unsigned int)(ptidsl->olayDpPage[secPage].PmemStartWtAddr)&~0xe0000000); */
18021 +    ptidsl->olayDpPage[secPage].overlayHostAddr = virtual2Physical((unsigned int)ptidsl->olayDpPage[secPage].PmemStartWtAddr);
18022 +    dprintf(6,"Allocated Addr: 0x%x \t Xlated Addr: 0x%x \n",ptidsl->olayDpPage[secPage].PmemStartWtAddr,ptidsl->olayDpPage[secPage].overlayHostAddr);
18023 +
18024 +    ptidsl->olayDpPage[secPage].overlayHostAddr = (unsigned int)dslhal_support_byteSwap32(ptidsl->olayDpPage[secPage].overlayHostAddr);
18025 +    /*ptidsl->olayDpPage[secPage].OverlayXferCount = secLength;
18026 +      ptidsl->olayDpPage[secPage].BinAddr          = secAddr;
18027 +      shim_osMoveMemory((char *)ptidsl->olayDpPage[secPage].PmemStartWtAddr, (char *)iptr, secLength);
18028 +    */
18029 +    olayStart = (unsigned int *)ptidsl->olayDpPage[secPage].PmemStartWtAddr;
18030 +            
18031 +    for(olayXfer=0;olayXfer< secLength/4;olayXfer++)
18032 +    {
18033 +      olayStore = *(unsigned int *)olayStart;
18034 +      olayStore = (unsigned int)dslhal_support_byteSwap32(olayStore);
18035 +      *(unsigned int*)olayStart = olayStore;
18036 +      dprintf(5, "Addr:0x%x \t Content: 0x%x \n",olayStart,olayStore);
18037 +      olayStart++;
18038 +      olayStore=0;
18039 +    }
18040 +      /* RamP Image ByteSwap test */
18041 +      /* compute the CRC of each overlay page and Store the Checksum in a local global variable */
18042 +      /* This Value of CRC is to be compared with the header where all the CRC bytes are lumped together */
18043 +    crc32 = dslhal_support_computeCrc32((char *)ptidsl->olayDpPage[secPage].PmemStartWtAddr, ptidsl->olayDpPage[secPage].OverlayXferCount);
18044 +    if(crc32 != ptidsl->olayDpPage[secPage].olayPageCrc32)
18045 +      return DSLHAL_ERROR_OVERLAY_MALLOC;
18046 +
18047 +    shim_osWriteBackCache((void *)ptidsl->olayDpPage[secPage].PmemStartWtAddr, secLength);
18048 +  }
18049 +
18050 +  
18051 +  dprintf(5,"ptidsl->hostIf.mainAddr=0x%X\n", (unsigned int)ptidsl->pmainAddr);
18052 +  
18053 +  /* get the pointer to DSP-OAM Shared Interface */
18054 +  rc = dslhal_support_blockRead(ptidsl->pmainAddr, &dspOamSharedInterface, 
18055 +                                     sizeof(DEV_HOST_dspOamSharedInterface_t));
18056 +  if (rc)
18057 +    {
18058 +    dprintf(1,"dslhal_support_blockRead failed\n");
18059 +    return DSLHAL_ERROR_BLOCK_READ;
18060 +    }
18061 +
18062 +  /* Communicate the Allocated Memory Address to DSP to choose CO Profiles */
18063 +
18064 +  /* Change the Endianness of the profileList pointer */
18065 +  dspOamSharedInterface.profileList_p = (DEV_HOST_profileBase_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.profileList_p);
18066 +  /* Access the profileList Structure */
18067 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.profileList_p,&profileList, sizeof(DEV_HOST_profileBase_t));
18068 +  
18069 +  if (rc)
18070 +    {
18071 +    dprintf(1,"dslhal_support_blockRead failed\n");
18072 +    return DSLHAL_ERROR_BLOCK_READ;
18073 +    }
18074 +  dprintf(2,"Old Addr:%x  New: %x \n",profileList.hostProfileBase_p,ptidsl->coProfiles.overlayHostAddr); 
18075 +  profileList.hostProfileBase_p = (DEV_HOST_coData_t *)ptidsl->coProfiles.overlayHostAddr;
18076 +  rc = dslhal_support_blockWrite(&profileList,(PVOID)dspOamSharedInterface.profileList_p,sizeof(DEV_HOST_profileBase_t));
18077 +     if (rc) 
18078 +       return DSLHAL_ERROR_BLOCK_WRITE;
18079 +
18080 +  /* Communicate the Allocated Memory Address to DSP to do overlays */
18081 +
18082 +  /* Change the Endianness of the olayDpDef pointer */
18083 +  dspOamSharedInterface.olayDpParms_p = (DEV_HOST_olayDpDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.olayDpParms_p);
18084 +  /* Access the olayDpDef Structure */
18085 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.olayDpParms_p,&olayDpParms, sizeof(DEV_HOST_olayDpDef_t));
18086 +  
18087 +  if (rc)
18088 +    {
18089 +    dprintf(1,"dslhal_support_blockRead failed\n");
18090 +    return DSLHAL_ERROR_BLOCK_READ;
18091 +    }
18092 +
18093 +
18094 +  for(i=1;i<NUM_PAGES;i++)
18095 +   {
18096 +  /* Change the endianness of the olayDpPageDef Pointer */
18097 +     olayDpParms.olayDpPage_p[i] = (DEV_HOST_olayDpPageDef_t *) dslhal_support_byteSwap32((unsigned int)olayDpParms.olayDpPage_p[i]);
18098 +     /* Access the olayDpPageDef Structure */
18099 +     rc = dslhal_support_blockRead((PVOID)olayDpParms.olayDpPage_p[i],&olayDpPageDef[i],sizeof(DEV_HOST_olayDpPageDef_t));
18100 +     if (rc) 
18101 +       return DSLHAL_ERROR_BLOCK_READ;
18102 +     olayDpPageDef[i].overlayHostAddr = ptidsl->olayDpPage[i].overlayHostAddr;
18103 +     rc = dslhal_support_blockWrite(&olayDpPageDef[i],(PVOID)olayDpParms.olayDpPage_p[i],sizeof(DEV_HOST_olayDpPageDef_t));
18104 +     if (rc) 
18105 +       return DSLHAL_ERROR_BLOCK_WRITE;
18106 +   }
18107 +  
18108 +  ptidsl->bOverlayPageLoaded = 1;
18109 +  return DSLHAL_ERROR_NO_ERRORS;
18110 +}  
18111 +  /* end of dslhal_support_reloadTrainingInfo() */
18112 +
18113 +
18114 +/********************************************************************************************
18115 +* FUNCTION NAME: dslhal_support_restoreTrainingInfo()
18116 +*
18117 +*********************************************************************************************
18118 +* DESCRIPTION:
18119 +*   Computes the CRC-32 for the input data and compares it with reference
18120 +*
18121 +* Return: Error Condition (if any)
18122 +*      
18123 +* 
18124 +* NOTE: 
18125 +*   DSP image is based on LITTLE endian
18126 +*
18127 +********************************************************************************************/
18128 +
18129 +
18130 +int dslhal_support_restoreTrainingInfo(tidsl_t *ptidsl)
18131 +{
18132 +  int rc;
18133 +  
18134 +  rc=1;
18135 +  while(rc != 0)
18136 +    {
18137 +    dslhal_support_clearTrainingInfo(ptidsl);
18138 +    //shim_osCriticalEnter();
18139 +    rc = dslhal_support_reloadTrainingInfo(ptidsl);
18140 +    //shim_osCriticalExit();
18141 +    shim_osClockWait(6400);
18142 +    }
18143 +  return 0;
18144 +}
18145 +
18146 +/********************************************************************************************
18147 +* FUNCTION NAME: dslhal_support_advancedIdleProcessing()
18148 +*
18149 +*********************************************************************************************
18150 +* DESCRIPTION:
18151 +*   Calls Advanced Idle State Processing Functions
18152 +*
18153 +* Return: Error Condition (if any)
18154 +*      
18155 +* 
18156 +* NOTE: 
18157 +*   DSP image is based on LITTLE endian
18158 +*
18159 +********************************************************************************************/
18160 +unsigned int dslhal_support_advancedIdleProcessing(tidsl_t *ptidsl)
18161 +{
18162 +  int rc=0;
18163 +  ptidsl->AppData.bState = RSTATE_IDLE;
18164 +#ifndef NO_ACT
18165 +  rc +=  dslhal_advcfg_resetBitSwapMessageLog(ptidsl,0);
18166 +  rc += dslhal_advcfg_resetBitSwapMessageLog(ptidsl,1);
18167 +  rc += dslhal_advcfg_resetTrainStateHistory(ptidsl);
18168 +  rc += dslhal_advcfg_getReasonForDrop(ptidsl);
18169 +#endif
18170 +  if(rc)
18171 +    return DSLHAL_ERROR_CONFIG_API_FAILURE;
18172 +  else
18173 +    return DSLHAL_ERROR_NO_ERRORS;
18174 +}
18175 +
18176 +/********************************************************************************************
18177 +* FUNCTION NAME: dslhal_support_aocBitSwapProcessing()
18178 +*
18179 +*********************************************************************************************
18180 +* DESCRIPTION:
18181 +*   Calls Advanced Idle State Processing Functions
18182 +*
18183 +* Return: Error Condition (if any)
18184 +*      
18185 +* 
18186 +* NOTE: 
18187 +*   DSP image is based on LITTLE endian
18188 +*
18189 +********************************************************************************************/
18190 +unsigned int dslhal_support_aocBitSwapProcessing(tidsl_t *ptidsl,unsigned int usDs)
18191 +{
18192 +  int rc=0;
18193 +#ifndef NO_ACT
18194 +  int i;
18195 +  int differentCmd_f;
18196 +  unsigned int dsSwapInx;
18197 +
18198 +  static UINT8 lastAturBitSwapCommands[6] = {0, 0, 0, 0, 0, 0};
18199 +  static UINT8 lastAturBitSwapBinNum[6] = {0, 0, 0, 0, 0, 0};
18200 +
18201 +  if (usDs == 0)
18202 +  {
18203 +    dprintf(4," DSP_XMITBITSWAP\n");
18204 +    rc += dslhal_advcfg_getAocBitswapBuffer(ptidsl,0);
18205 +    ptidsl->usBitSwapInx++;
18206 +    if (ptidsl->usBitSwapInx > 29)
18207 +      ptidsl->usBitSwapInx=0;
18208 +  }
18209 +
18210 +  if (usDs == 1)
18211 +  {
18212 +    dprintf(4," DSP_RCVBITSWAP\n");
18213 +    rc += dslhal_advcfg_getAocBitswapBuffer(ptidsl,1);
18214 +    differentCmd_f = FALSE;
18215 +    dsSwapInx = ptidsl->dsBitSwapInx;
18216 +    if (! rc)
18217 +    {
18218 +      for (i = 0; i < 6; i++)
18219 +      {
18220 +        if (lastAturBitSwapCommands[i] != ptidsl->dsBitSwap[dsSwapInx].bitSwapCommand[i])
18221 +        {
18222 +          differentCmd_f = TRUE;
18223 +          break;
18224 +        }
18225 +      }
18226 +      if (! differentCmd_f)
18227 +      {
18228 +        for (i = 0; i < 6; i++)
18229 +        {
18230 +          if (lastAturBitSwapBinNum[i] != ptidsl->dsBitSwap[dsSwapInx].bitSwapBinNum[i])
18231 +          {
18232 +            differentCmd_f = TRUE;
18233 +            break;
18234 +          }
18235 +        }
18236 +      }
18237 +      //CPE data pump seems to occasionally send us the same bit swap twice in a row with different sframe counter.
18238 +      //Since these are never counted twice by the debug output of AC5, we should not count them twice either.
18239 +      //So, we ignore the sframe_counter in determining whether the most recent bitswap is a duplicate.
18240 +      if (differentCmd_f)
18241 +      {
18242 +          shim_osMoveMemory((void *)lastAturBitSwapCommands, (void *)ptidsl->dsBitSwap[dsSwapInx].bitSwapCommand, 6);
18243 +          shim_osMoveMemory((void *)lastAturBitSwapBinNum, (void *)ptidsl->dsBitSwap[dsSwapInx].bitSwapBinNum, 6);
18244 +          ptidsl->dsBitSwapInx++;
18245 +          if (ptidsl->dsBitSwapInx > 29)
18246 +            ptidsl->dsBitSwapInx = 0;
18247 +      }
18248 +    }
18249 +  }
18250 +#endif
18251 +  if(rc)
18252 +    return DSLHAL_ERROR_CONFIG_API_FAILURE;
18253 +  else
18254 +    return DSLHAL_ERROR_NO_ERRORS;
18255 +}
18256 +
18257 +/********************************************************************************************
18258 +* FUNCTION NAME: dslhal_support_gatherEocMessages()
18259 +*
18260 +*********************************************************************************************
18261 +* DESCRIPTION:
18262 +*   Calls Advanced EOC Buffering functions
18263 +*
18264 +* Return: Error Condition (if any)
18265 +*      
18266 +* 
18267 +* NOTE: 
18268 +*   DSP image is based on LITTLE endian
18269 +*
18270 +********************************************************************************************/
18271 +unsigned int dslhal_support_gatherEocMessages(tidsl_t *ptidsl,int usDs, int msgPart1, int msgPart2)
18272 +{
18273 +  int rc=0;
18274 +#ifndef NO_ACT
18275 +  rc = dslhal_advcfg_logEocMessages(ptidsl,usDs, msgPart1, msgPart2);
18276 +#endif
18277 +  if(rc)
18278 +    return DSLHAL_ERROR_CONFIG_API_FAILURE;
18279 +  else
18280 +    return DSLHAL_ERROR_NO_ERRORS;
18281 +}
18282 +/********************************************************************************************
18283 +* FUNCTION NAME: dslhal_support_gatherSnrPerBin()
18284 +*
18285 +*********************************************************************************************
18286 +* DESCRIPTION:
18287 +*   Calls Advanced Snr per bin buffering Functions
18288 +*
18289 +* Return: Error Condition (if any)
18290 +*      
18291 +* 
18292 +* NOTE: 
18293 +*   DSP image is based on LITTLE endian
18294 +*
18295 +********************************************************************************************/
18296 +unsigned int dslhal_support_gatherSnrPerBin(tidsl_t *ptidsl,unsigned int snrParam)
18297 +{
18298 +  int rc=0;
18299 +#ifndef NO_ACT
18300 +  rc = dslhal_advcfg_getSnrPerBin(ptidsl,snrParam);
18301 +#endif
18302 +  if(rc)
18303 +    return DSLHAL_ERROR_CONFIG_API_FAILURE;
18304 +  else
18305 +    return DSLHAL_ERROR_NO_ERRORS;
18306 +}
18307 +
18308 +/********************************************************************************************
18309 +* FUNCTION NAME: dslhal_support_processTrainingState()
18310 +*
18311 +*********************************************************************************************
18312 +* DESCRIPTION:
18313 +*   Calls Advanced Training State Processing Functions
18314 +*
18315 +* Return: Error Condition (if any)
18316 +*      
18317 +* 
18318 +* NOTE: 
18319 +*   DSP image is based on LITTLE endian
18320 +*
18321 +********************************************************************************************/
18322 +unsigned int dslhal_support_processTrainingState(tidsl_t *ptidsl)
18323 +{
18324 +  int rc=0;
18325 +#ifndef NO_ACT
18326 +
18327 +  if(ptidsl->trainStateInx<120)
18328 +    {
18329 +     rc = dslhal_advcfg_getTrainingState(ptidsl,(void *)&ptidsl->trainHistory[ptidsl->trainStateInx++]);
18330 +     if(ptidsl->trainHistory[(ptidsl->trainStateInx-1)].subStateIndex ==
18331 +        ptidsl->trainHistory[(ptidsl->trainStateInx-2)].subStateIndex)
18332 +        ptidsl->trainStateInx--;
18333 +    }
18334 +  else
18335 +      ptidsl->trainStateInx = 0;
18336 +#endif
18337 +  if(rc)
18338 +    return DSLHAL_ERROR_CONFIG_API_FAILURE;
18339 +  else
18340 +    return DSLHAL_ERROR_NO_ERRORS;
18341 +}
18342 +
18343 +/********************************************************************************************
18344 +* FUNCTION NAME: dslhal_support_gatherAdsl2Messages()
18345 +*
18346 +*********************************************************************************************
18347 +* DESCRIPTION:
18348 +*   Gathers ADSL2 Training Messages
18349 +*
18350 +* Return: Error Condition (if any)
18351 +*      
18352 +* 
18353 +* NOTE: 
18354 +*   DSP image is based on LITTLE endian
18355 +*
18356 +********************************************************************************************/
18357 +unsigned int dslhal_support_gatherAdsl2Messages(tidsl_t *ptidsl,int tag, int param1, int param2)
18358 +{
18359 +  int rc=0;
18360 +  unsigned int adsl2MsgLoc;
18361 +  switch(tag)
18362 +    {
18363 +    case CMSGFMT_INDEX:
18364 +       dprintf(5,"C-Msg-FMT rec'd\n");
18365 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18366 +                     (ptidsl, CMSGFMT_INDEX);
18367 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18368 +             ptidsl->adsl2TrainingMessages.cMsgFmt,CMSGFMT_SIZE);
18369 +       break;
18370 +    case RMSGFMT_INDEX:  
18371 +    case RMSGFMT2_INDEX:
18372 +       dprintf(5,"R-Msg-FMT rec'd\n");
18373 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18374 +                     (ptidsl, RMSGFMT_INDEX);
18375 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18376 +             ptidsl->adsl2TrainingMessages.rMsgFmt,RMSGFMT_SIZE);
18377 +       break;
18378 +    case CMSGPCB_INDEX:
18379 +       dprintf(5,"C-Msg-PCB rec'd\n");
18380 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18381 +                     (ptidsl, CMSGPCB_INDEX);
18382 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18383 +             ptidsl->adsl2TrainingMessages.cMsgPcb,CMSGPCB_SIZE);
18384 +       ptidsl->adsl2TrainingMessages.cMsgPcbLen = CMSGPCB_SIZE;
18385 +       break;
18386 +    case CMSGPCB2_INDEX:  
18387 +       dprintf(5,"C-Msg-PCB2 rec'd\n");
18388 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18389 +                     (ptidsl, CMSGPCB2_INDEX);
18390 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18391 +             ptidsl->adsl2TrainingMessages.cMsgPcb,CMSGPCB2_SIZE);
18392 +       ptidsl->adsl2TrainingMessages.cMsgPcbLen = CMSGPCB2_SIZE;
18393 +#ifndef NO_ACT
18394 +       rc += dslhal_advcfg_setBlackOutBits(ptidsl);
18395 +#endif
18396 +       break;
18397 +    case CMSGPCB2L_INDEX:
18398 +       dprintf(5,"C-Msg-PCB2L rec'd\n");
18399 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18400 +                     (ptidsl, CMSGPCB2L_INDEX);
18401 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18402 +             ptidsl->adsl2TrainingMessages.cMsgPcb,CMSGPCB2L_SIZE);
18403 +       ptidsl->adsl2TrainingMessages.cMsgPcbLen = CMSGPCB2L_SIZE;
18404 +       break;
18405 +    case RMSGPCB_INDEX:
18406 +    case RMSGPCB2L_INDEX:
18407 +       dprintf(5,"R-Msg-PCB rec'd\n");
18408 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18409 +                     (ptidsl, RMSGPCB_INDEX);
18410 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18411 +             ptidsl->adsl2TrainingMessages.rMsgPcb,RMSGPCB_SIZE);
18412 +       ptidsl->adsl2TrainingMessages.rMsgPcbLen = RMSGPCB_SIZE;
18413 +       break;
18414 +
18415 +    case CMSG1ADSL2_INDEX:
18416 +       dprintf(5,"C-Msg1 rec'd\n");
18417 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18418 +                     (ptidsl, CMSG1ADSL2_INDEX);
18419 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18420 +             ptidsl->adsl2TrainingMessages.cMsg1,CMSG1ADSL2_SIZE);
18421 +       ptidsl->adsl2TrainingMessages.cMsg1Len = CMSG1ADSL2_SIZE;
18422 +       break;
18423 +    case CMSG2ADSL2_INDEX:
18424 +       dprintf(5,"C-Msg2 rec'd\n");
18425 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18426 +                     (ptidsl, CMSG2ADSL2_INDEX);
18427 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18428 +             ptidsl->adsl2TrainingMessages.cMsg2,CMSG2ADSL2_SIZE);
18429 +       ptidsl->adsl2TrainingMessages.cMsg2Len = CMSG2ADSL2_SIZE;
18430 +       break;
18431 +    case RMSG1ADSL2_INDEX:
18432 +       dprintf(5,"R-Msg1 rec'd\n");
18433 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18434 +                     (ptidsl, RMSG1ADSL2_INDEX);
18435 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18436 +             ptidsl->adsl2TrainingMessages.rMsg1,RMSG1ADSL2_SIZE);
18437 +       ptidsl->adsl2TrainingMessages.rMsg1Len = RMSG1ADSL2_SIZE;
18438 +       break;
18439 +    case RMSG2ADSL2_INDEX:
18440 +       dprintf(5,"R-Msg2 rec'd\n");
18441 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18442 +                     (ptidsl, RMSG2ADSL2_INDEX);
18443 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18444 +             ptidsl->adsl2TrainingMessages.rMsg2,RMSG2ADSL2_SIZE);
18445 +       ptidsl->adsl2TrainingMessages.rMsg2Len = RMSG2ADSL2_SIZE;
18446 +       break;
18447 +    case CPARAMS_INDEX:
18448 +       dprintf(5,"C-Params rec'd\n");
18449 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18450 +                     (ptidsl, CPARAMS_INDEX);
18451 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18452 +             ptidsl->adsl2TrainingMessages.cParams,CPARAMS_SIZE);
18453 +       ptidsl->adsl2TrainingMessages.cParamsLen = CPARAMS_SIZE;
18454 +       break;
18455 +    case RPARAMS_INDEX:
18456 +       dprintf(5,"R-Params rec'd\n");
18457 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18458 +                     (ptidsl, RPARAMS_INDEX);
18459 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18460 +             ptidsl->adsl2TrainingMessages.rParams,RPARAMS_SIZE);
18461 +       ptidsl->adsl2TrainingMessages.rParamsLen = RPARAMS_SIZE;
18462 +       break;
18463 +    case RMSG1LD_INDEX:
18464 +       dprintf(5,"R-Msg1 LD rec'd\n");
18465 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18466 +                     (ptidsl, RMSG1LD_INDEX);
18467 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18468 +             ptidsl->adsl2DiagnosticMessages.rMsg1Ld,RMSG1LD_SIZE);
18469 +       ptidsl->adsl2DiagnosticMessages.rMsg1LdLen = RMSG1LD_SIZE;
18470 +       break;
18471 +    case RMSG2LD_INDEX:
18472 +       dprintf(5,"R-Msg2 LD rec'd\n");
18473 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18474 +                     (ptidsl, RMSG2LD_INDEX);
18475 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18476 +             ptidsl->adsl2DiagnosticMessages.rMsg2Ld,RMSGxLD_SIZE);
18477 +       ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE;
18478 +       break;
18479 +    case RMSG3LD_INDEX:
18480 +       dprintf(5,"R-Msg3 LD rec'd\n");
18481 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18482 +                     (ptidsl, RMSG3LD_INDEX);
18483 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18484 +             ptidsl->adsl2DiagnosticMessages.rMsg3Ld,RMSGxLD_SIZE);
18485 +       ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE;
18486 +       break;
18487 +    case RMSG4LD_INDEX:
18488 +       dprintf(5,"R-Msg4 LD rec'd\n");
18489 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18490 +                     (ptidsl, RMSG4LD_INDEX);
18491 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18492 +             ptidsl->adsl2DiagnosticMessages.rMsg4Ld,RMSGxLD_SIZE);
18493 +       ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE;
18494 +       break;
18495 +    case RMSG5LD_INDEX:
18496 +       dprintf(5,"R-Msg5 LD rec'd\n");
18497 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18498 +                     (ptidsl, RMSG5LD_INDEX);
18499 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18500 +             ptidsl->adsl2DiagnosticMessages.rMsg5Ld,RMSGxLD_SIZE);
18501 +       ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE;
18502 +       break;
18503 +    case RMSG6LD_INDEX:
18504 +       dprintf(5,"R-Msg6 LD rec'd\n");
18505 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18506 +                     (ptidsl, RMSG6LD_INDEX);
18507 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18508 +             ptidsl->adsl2DiagnosticMessages.rMsg6Ld,RMSGxLD_SIZE);
18509 +       ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE;
18510 +       break;
18511 +    case RMSG7LD_INDEX:
18512 +       dprintf(5,"R-Msg7 LD rec'd\n");
18513 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18514 +                     (ptidsl, RMSG7LD_INDEX);
18515 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18516 +             ptidsl->adsl2DiagnosticMessages.rMsg7Ld,RMSGxLD_SIZE);
18517 +       ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE;
18518 +       break;
18519 +    case RMSG8LD_INDEX:
18520 +       dprintf(5,"R-Msg8 LD rec'd\n");
18521 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18522 +                     (ptidsl, RMSG8LD_INDEX);
18523 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18524 +             ptidsl->adsl2DiagnosticMessages.rMsg8Ld,RMSGxLD_SIZE);
18525 +       ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE;
18526 +       break;
18527 +    case RMSG9LD_INDEX:
18528 +       dprintf(5,"R-Msg9 LD rec'd\n");
18529 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18530 +                     (ptidsl, RMSG9LD_INDEX);
18531 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18532 +             ptidsl->adsl2DiagnosticMessages.rMsg9Ld,RMSGxLD_SIZE);
18533 +       ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE;
18534 +       break;
18535 +    case CMSG1LD_INDEX:
18536 +       dprintf(5,"C-Msg1 LD rec'd\n");
18537 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18538 +                     (ptidsl, CMSG1LD_INDEX);
18539 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18540 +             ptidsl->adsl2DiagnosticMessages.cMsg1Ld,CMSG1LD_SIZE);
18541 +       ptidsl->adsl2DiagnosticMessages.cMsg1LdLen = CMSG1LD_SIZE;
18542 +       break;
18543 +    case CMSG2LD_INDEX:
18544 +       dprintf(5,"C-Msg2 LD rec'd\n");
18545 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18546 +                     (ptidsl, CMSG2LD_INDEX);
18547 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18548 +             ptidsl->adsl2DiagnosticMessages.cMsg2Ld,CMSG2LD_SIZE);
18549 +       ptidsl->adsl2DiagnosticMessages.cMsg2LdLen = CMSG2LD_SIZE;
18550 +       break;
18551 +    case CMSG3LD_INDEX:
18552 +       dprintf(5,"C-Msg3 LD rec'd\n");
18553 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18554 +                     (ptidsl, CMSG3LD_INDEX);
18555 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18556 +             ptidsl->adsl2DiagnosticMessages.cMsg3Ld,CMSG3LD_SIZE);
18557 +       ptidsl->adsl2DiagnosticMessages.cMsg3LdLen = CMSG3LD_SIZE;
18558 +       break;
18559 +    case CMSG4LD_INDEX:
18560 +       dprintf(5,"C-Msg4 LD rec'd\n");
18561 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18562 +                     (ptidsl, CMSG4LD_INDEX);
18563 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18564 +             ptidsl->adsl2DiagnosticMessages.cMsg4Ld,CMSG4LD_SIZE);
18565 +       ptidsl->adsl2DiagnosticMessages.cMsg4LdLen = CMSG4LD_SIZE;
18566 +       break;
18567 +    case CMSG5LD_INDEX:
18568 +       dprintf(5,"C-Msg5 LD rec'd\n");
18569 +       adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation
18570 +                     (ptidsl, CMSG5LD_INDEX);
18571 +       rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc,
18572 +             ptidsl->adsl2DiagnosticMessages.cMsg5Ld,CMSG5LD_SIZE);
18573 +       ptidsl->adsl2DiagnosticMessages.cMsg5LdLen = CMSG5LD_SIZE;
18574 +       break;
18575 +    default:
18576 +       dprintf(5,"Unknown ADSL2 Message rec'd\n");
18577 +       break;
18578 +    }
18579 +  if(rc)
18580 +    return DSLHAL_ERROR_CONFIG_API_FAILURE;
18581 +  else
18582 +    return DSLHAL_ERROR_NO_ERRORS;
18583 +}
18584 +
18585 +/********************************************************************************************
18586 +* FUNCTION NAME: dslhal_support_getAdsl2MessageLocation()
18587 +*
18588 +*********************************************************************************************
18589 +* DESCRIPTION:
18590 +*   Gets the address to the ADSL2 Message being looked up
18591 +*
18592 +* Return: Error Condition (if any)
18593 +*      
18594 +* 
18595 +* NOTE: 
18596 +*   DSP image is based on LITTLE endian
18597 +*
18598 +********************************************************************************************/
18599 +unsigned int dslhal_support_getAdsl2MessageLocation(tidsl_t *ptidsl,int msgOffset)
18600 +{
18601 +  int rc=0;
18602 +
18603 +  DEV_HOST_dspOamSharedInterface_t *pSharedInterface, sharedInterface;  
18604 +  DEV_HOST_dspWrNegoParaDef_t   dspNegoPara;
18605 +  int  adsl2MsgString, adsl2MsgAddr;
18606 +
18607 +  pSharedInterface = (DEV_HOST_dspOamSharedInterface_t *) ptidsl->pmainAddr;
18608 +  rc += dslhal_support_blockRead(pSharedInterface, &sharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
18609 +  sharedInterface.dspWriteNegoParams_p = (DEV_HOST_dspWrNegoParaDef_t *) dslhal_support_adsl2ByteSwap32((unsigned int)sharedInterface.dspWriteNegoParams_p);
18610 +  rc += dslhal_support_blockRead((PVOID)sharedInterface.dspWriteNegoParams_p,&dspNegoPara, sizeof(DEV_HOST_dspWrNegoParaDef_t));
18611 +  
18612 +  if (rc)
18613 +    {
18614 +    dprintf(1,"dslhal_support_blockRead failed\n");
18615 +    return DSLHAL_ERROR_BLOCK_READ;
18616 +    }
18617 +
18618 +  adsl2MsgString = dslhal_support_adsl2ByteSwap32((unsigned int)dspNegoPara.adsl2DeltMsgs_p);
18619 +  dprintf(5,"ADSL2 Message String Address: 0x%x\n",adsl2MsgString);
18620 +  rc += dslhal_support_blockRead((PVOID)(adsl2MsgString +
18621 +                                  ((sizeof(unsigned char *)*msgOffset))),
18622 +                                  &adsl2MsgAddr, sizeof(int));
18623 +  adsl2MsgAddr = dslhal_support_adsl2ByteSwap32((unsigned int)adsl2MsgAddr);
18624 +  dprintf(5," Message Address: 0x%x\n",adsl2MsgAddr);
18625 +
18626 +       if(rc)
18627 +          return DSLHAL_ERROR_BLOCK_READ;
18628 +       else
18629 +          return adsl2MsgAddr;
18630 +}
18631 +
18632 +/********************************************************************************************
18633 +* FUNCTION NAME: dslhal_support_getCMsgsRa()
18634 +*
18635 +*********************************************************************************************
18636 +* DESCRIPTION:
18637 +*   Calls Advanced Training Message functions
18638 +*
18639 +* Return: Error Condition (if any)
18640 +*      
18641 +* 
18642 +* NOTE: 
18643 +*   DSP image is based on LITTLE endian
18644 +*
18645 +********************************************************************************************/
18646 +unsigned int dslhal_support_getCMsgsRa(tidsl_t *ptidsl,void *cMsg)
18647 +{
18648 +  int rc=0;
18649 +  DEV_HOST_raMsgsDef_t         raMsgParms;
18650 +  DEV_HOST_dspOamSharedInterface_t  dspOamSharedInterface;
18651 +  rc += dslhal_support_blockRead(ptidsl->pmainAddr, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
18652 +
18653 +  dspOamSharedInterface.raMsgs_p = (DEV_HOST_raMsgsDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.raMsgs_p);
18654 +
18655 +  rc += dslhal_support_blockRead((PVOID)dspOamSharedInterface.raMsgs_p, 
18656 +                               &raMsgParms, sizeof(DEV_HOST_raMsgsDef_t));
18657 +  shim_osMoveMemory((void *)cMsg,(void *)raMsgParms.cMsgsRaString,6);
18658 +  
18659 +  if(rc)
18660 +    return DSLHAL_ERROR_CONFIG_API_FAILURE;
18661 +  else
18662 +    return DSLHAL_ERROR_NO_ERRORS;
18663 +}
18664 +
18665 +/********************************************************************************************
18666 +* FUNCTION NAME: dslhal_support_gatherRateMessages()
18667 +*
18668 +*********************************************************************************************
18669 +* DESCRIPTION:
18670 +*        Gathers Rate Training Messages
18671 +* Input
18672 +*        tidsl_t *ptidsl : Pointer to application structure
18673 +*        
18674 +*
18675 +* Return: 0  success
18676 +*         1  failed
18677 +* 
18678 +* NOTE: 
18679 +*   DSP image is based on LITTLE endian
18680 +*
18681 +********************************************************************************************/
18682 +unsigned int dslhal_support_gatherRateMessages(tidsl_t * ptidsl)
18683 +{
18684 +  int rc;
18685 +  DEV_HOST_dspWrNegoParaDef_t  negoParms;
18686 +  DEV_HOST_dspOamSharedInterface_t  dspOamSharedInterface;
18687 +  
18688 +  dprintf(1, "dslhal_support_gatherRateMessages\n");
18689 +
18690 +  rc += dslhal_support_blockRead(ptidsl->pmainAddr, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t));
18691 +  dspOamSharedInterface.dspWriteNegoParams_p = (DEV_HOST_dspWrNegoParaDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspWriteNegoParams_p);
18692 +
18693 +  rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspWriteNegoParams_p, &negoParms, sizeof(DEV_HOST_dspWrNegoParaDef_t));
18694 +  if (rc)
18695 +    return DSLHAL_ERROR_BLOCK_READ;  
18696 +  else 
18697 +    {
18698 +      shim_osMoveMemory((void *)ptidsl->AppData.bCRates1, (void *)negoParms.cRates1, 120);
18699 +      shim_osMoveMemory((void *)ptidsl->AppData.bRRates1, (void *)negoParms.rRates1, 44);
18700 +    }
18701 +return DSLHAL_ERROR_NO_ERRORS;
18702 +}
18703 +
18704 +static unsigned int dslhal_support_adsl2ByteSwap32(unsigned int in32Bits)
18705 +{
18706 +    int out32Bits=0; 
18707 +
18708 +#ifdef EB
18709 +  out32Bits = (in32Bits << 24);
18710 +  out32Bits |=((in32Bits & 0x0000ff00) << 8);
18711 +  out32Bits |=((in32Bits & 0xff000000) >> 24);
18712 +  out32Bits |=((in32Bits & 0x00ff0000) >> 8);    
18713 +#else
18714 +    out32Bits = in32Bits;
18715 +#endif
18716 +    
18717 +    return out32Bits;
18718 +
18719 +} /* end of dslhal_support_byteSwap32() */
18720 diff -urN linux.old/drivers/atm/sangam_atm/dsl_hal_support.h linux.dev/drivers/atm/sangam_atm/dsl_hal_support.h
18721 --- linux.old/drivers/atm/sangam_atm/dsl_hal_support.h  1970-01-01 01:00:00.000000000 +0100
18722 +++ linux.dev/drivers/atm/sangam_atm/dsl_hal_support.h  2005-08-23 04:46:50.101843088 +0200
18723 @@ -0,0 +1,718 @@
18724 +#ifndef DSL_HAL_SUPPORT_H__
18725 +#define DSL_HAL_SUPPORT_H__ 1
18726 +
18727 +/*******************************************************************************
18728 +* FILE PURPOSE:     DSL Driver API functions for Sangam
18729 +*
18730 +********************************************************************************
18731 +* FILE NAME:        dsl_hal_functiondefines.c
18732 +*
18733 +* DESCRIPTION:  
18734 +*       Contains basic DSL HAL API declarations for Sangam
18735 +*  
18736 +*                    
18737 +* (C) Copyright 2001-02, Texas Instruments, Inc.
18738 +*    History
18739 +*    Date        Version            Notes
18740 +*    06Feb03     0.00.00            RamP   Created
18741 +*    21Mar03     0.00.01            RamP   Removed byteswap functions
18742 +*    21Mar03     0.00.02            RamP   Added extern osFreeVMemory declaration
18743 +*    10Apr03     0.00.03            RamP   Changed declaration for loadFWImage &
18744 +*                                          loadDebugFWImage to remove ptidsl param
18745 +*    12Apr03     0.00.04            RamP   Added function to set Interrupt Bit
18746 +*                                          Masks for bitfield & Mailboxes
18747 +*    14Apr03     0.00.05            RamP   Added modem state bit field processing
18748 +*    15Apr03     0.00.06            RamP   Added function osAllocateVMemory
18749 +*    21Apr03     0.01.00            RamP   Added function osAllocateDmaMemory
18750 +*                                          Added function osFreeDmaMemory
18751 +*                (Alpha)                   Added macro virtual2Physical, 
18752 +*    22Apr03     0.01.01            RamP   Moved acknowledgeInterrupt to api.h
18753 +*    24Apr03     0.01.02            RamP   Added checkOvelayPage function
18754 +*    29May03     0.01.03            RamP   Added critical enter/exit function decl
18755 +*    06Jun03     0.01.04            RamP   Added Interrupt source parsing function
18756 +*    06Oct03     0.01.05            RamP   Added function abstraction switches
18757 +*    12Oct03     0.01.06            RamP   Added ADSL2 Message function prototypes
18758 +*    14Nov03     0.03.07            RamP   Added function to gather Rate Messages
18759 +*******************************************************************************/
18760 +
18761 +#include "dsl_hal_api.h"
18762 +
18763 +#define virtual2Physical(a)    (((int)a)&~0xe0000000)
18764 +/* External Function Prototype Declarations */
18765 +
18766 +extern unsigned int shim_osGetCpuFrequency(void);
18767 +extern void shim_osClockWait(int val);
18768 +extern unsigned int shim_osClockTick(void);
18769 +
18770 +extern int shim_osStringCmp(const char *s1, const char *s2);
18771 +
18772 +extern void dprintf( int uDbgLevel, char * szFmt, ...);
18773 +
18774 +extern int shim_osLoadFWImage(unsigned char *firmwareImage);
18775 +extern int shim_osLoadDebugFWImage(unsigned char *debugFirmwareImage);
18776 +extern unsigned int shim_read_overlay_page(void *ptr, unsigned int secOffset, unsigned int secLength);
18777 +extern void shim_osMoveMemory(char *dst, char *src, unsigned int numBytes);
18778 +extern void shim_osZeroMemory(char *dst, unsigned int numBytes);
18779 +
18780 +extern void *shim_osAllocateMemory(unsigned int size);
18781 +extern void *shim_osAllocateVMemory(unsigned int size);
18782 +extern void *shim_osAllocateDmaMemory(unsigned int size);
18783 +
18784 +extern void shim_osFreeMemory(void *ptr, unsigned int size);
18785 +extern void shim_osFreeVMemory(void *ptr, unsigned int size);
18786 +extern void shim_osFreeDmaMemory(void *ptr, unsigned int size);
18787 +
18788 +extern void shim_osWriteBackCache(void *pMem, unsigned int size);
18789 +extern void shim_osCriticalEnter(void);
18790 +extern void shim_osCriticalExit(void);
18791 +
18792 +
18793 +/*******************************************************************************************
18794 +* FUNCTION NAME:    dslhal_support_writeHostMailbox
18795 +*
18796 +********************************************************************************************
18797 +* DESCRIPTION: Send a message to a mailbox
18798 +*
18799 +* ARGUMENTS:   int cmd             command to write
18800 +*              int tag             tag (currently unused)
18801 +*              int p1              parameter 1 (currently unused)
18802 +*              int p2              parameter 2 (currently unused)
18803 +*
18804 +* RETURNS:     0 if successful
18805 +*              NZ otherwise
18806 +*
18807 +*******************************************************************************************/
18808 +
18809 +int dslhal_support_writeHostMailbox
18810 +(tidsl_t *ptidsl, 
18811 + int cmd, 
18812 + int tag, 
18813 + int p1, 
18814 + int p2);
18815 +
18816 +/********************************************************************************************
18817 +* FUNCTION NAME:    dslhal_support_readDspMailbox
18818 +*
18819 +*********************************************************************************************
18820 +* DESCRIPTION: Reads a message from the mailbox
18821 +*
18822 +* ARGUMENTS:   int *pcmd           Pointer to command read
18823 +*
18824 +* RETURNS:     0 if successful
18825 +*              1 if no mail
18826 +*              NZ otherwise
18827 +*
18828 +*****************************************************************************************/
18829 +
18830 +int dslhal_support_readDspMailbox
18831 +(tidsl_t *ptidsl, 
18832 + int *pcmd, 
18833 + int *ptag, 
18834 + int *pprm1, 
18835 + int *pprm2);
18836 +
18837 +/********************************************************************************************
18838 +* FUNCTION NAME:    dslhal_support_readTextMailbox
18839 +*
18840 +*********************************************************************************************
18841 +* DESCRIPTION: Reads a message from the mailbox
18842 +*
18843 +* ARGUMENTS:   int *pcmd           Pointer to command read
18844 +*
18845 +* RETURNS:     0 if successful
18846 +*              1 if no mail
18847 +*              NZ otherwise
18848 +*
18849 +*****************************************************************************************/
18850 +
18851 +int dslhal_support_readTextMailbox
18852 +(tidsl_t *ptidsl, 
18853 + int *pmsg1, 
18854 + int *pmsg2);
18855
18856 +/******************************************************************************************
18857 +* FUNCTION NAME:    dslhal_support_blockRead
18858 +*
18859 +*********************************************************************************************
18860 +* DESCRIPTION: This rouin simulates DSP memory read as done in ax5 pci nic card
18861 +*
18862 +* INPUT:  void *addr,   memory address to be read
18863 +*         void *buffer, dat buffer to be filled with from memmory
18864 +*         size_t count, number of bytes to be written
18865 +*
18866 +* RETURN:  0 --succeeded
18867 +*          1 --Failed
18868 +*
18869 +*****************************************************************************************/
18870 +
18871 +int dslhal_support_blockRead
18872 +(void *addr, 
18873 + void *buffer, 
18874 + size_t count);
18875 +
18876 +/******************************************************************************************
18877 +* FUNCTION NAME:    dslhal_support_blockWrite
18878 +*
18879 +*******************************************************************************************
18880 +* DESCRIPTION: This rouin simulates DSP memory write as done in ax5 pci nic card 
18881 +*
18882 +* INPUT:  void *buffer, data need to written
18883 +*         void *adde,   memory address to be written
18884 +*         size_t count, number of bytes to be written
18885 +*
18886 +* RETURN:  0 --succeeded
18887 +*          1 --Failed
18888 +*
18889 +*****************************************************************************************/
18890 +
18891 +int dslhal_support_blockWrite
18892 +(void *buffer, 
18893 + void *addr, 
18894 + size_t count);
18895 +
18896 +/******************************************************************************************
18897 +* FUNCTION NAME:    dslhal_support_hostDspAddressTranslate
18898 +*
18899 +*******************************************************************************************
18900 +* DESCRIPTION: This function moves the address window to translate physical address 
18901 +*
18902 +* INPUT:  unsigned int addr : address that requires translation
18903 +*
18904 +* RETURN:  Translated address or error condition
18905 +*          
18906 +*
18907 +*****************************************************************************************/
18908 +
18909 +unsigned int dslhal_support_hostDspAddressTranslate
18910 +( unsigned int addr 
18911 +);
18912 +
18913 +/******************************************************************************************
18914 +* FUNCTION NAME:    dslhal_support_unresetDslSubsystem
18915 +*
18916 +*******************************************************************************************
18917 +* DESCRIPTION: This function unreset Dsl Subsystem
18918 +*
18919 +* INPUT:  None
18920 +*
18921 +* RETURN: 0 if Pass; 1 if Fail
18922 +*
18923 +*****************************************************************************************/
18924 +int dslhal_support_unresetDslSubsystem
18925 +(void
18926 +);
18927 +
18928 +/******************************************************************************************
18929 +* FUNCTION NAME:    dslhal_support_unresetDsp()
18930 +*
18931 +*******************************************************************************************
18932 +* DESCRIPTION: This fuction takes ax5 daugter board out of reset.
18933 +*
18934 +* INPUT:  None
18935 +*
18936 +* RETURN: 0  --successful.
18937 +*         1  --failed
18938 +*
18939 +*****************************************************************************************/
18940 +int dslhal_support_unresetDsp
18941 +(void
18942 +);
18943 +
18944 +
18945 +/******************************************************************************************
18946 +* FUNCTION NAME:    dslhal_support_resetDslSubsystem
18947 +*
18948 +*******************************************************************************************
18949 +* DESCRIPTION: This function unreset Dsl Subsystem
18950 +*
18951 +* INPUT:  None
18952 +*
18953 +* RETURN: 0 if Pass; 1 if Fail
18954 +*
18955 +*****************************************************************************************/
18956 +int dslhal_support_resetDslSubsystem
18957 +(void
18958 +);
18959 +
18960 +/******************************************************************************************
18961 +* FUNCTION NAME:    dslhal_support_resetDsp()
18962 +*
18963 +*******************************************************************************************
18964 +* DESCRIPTION: This fuction takes ax5 daugter board out of reset.
18965 +*
18966 +* INPUT:  None
18967 +*
18968 +* RETURN: 0  --successful.
18969 +*         1  --failed
18970 +*
18971 +*****************************************************************************************/
18972 +int dslhal_support_resetDsp
18973 +(void
18974 +);
18975 +
18976 +
18977 +/********************************************************************************************
18978 +* FUNCTION NAME: dslhal_support_hostDspCodeDownload()
18979 +*
18980 +*********************************************************************************************
18981 +* DESCRIPTION:
18982 +*   download DSP image from host memory to dsp memory
18983 +*
18984 +* Return: 0  success
18985 +*         1  failed
18986 +* 
18987 +* NOTE: 
18988 +*   DSP image is based on LITTLE endian
18989 +*
18990 +********************************************************************************************/
18991 +
18992 +int dslhal_support_hostDspCodeDownload
18993 +(tidsl_t * ptidsl 
18994 +);
18995 +
18996 +/********************************************************************************************
18997 +* FUNCTION NAME: dslhal_diags_digi_assignMemTestSpace()
18998 +*
18999 +*********************************************************************************************
19000 +* DESCRIPTION: Assigns Memory Space in SDRAM for External Memory Test 
19001 +* Input: tidsl_t *ptidsl
19002 +* 
19003 +* Return: 0    success
19004 +*         1    failed
19005 +*
19006 +********************************************************************************************/
19007 +
19008 +unsigned int dslhal_diags_digi_assignMemTestSpace
19009 +(tidsl_t *ptidsl
19010 +);
19011 +
19012 +/********************************************************************************************
19013 +* FUNCTION NAME: dslhal_diags_digi_readMemTestResult()
19014 +*
19015 +*********************************************************************************************
19016 +* DESCRIPTION: Reads Results of External Memory Test 
19017 +* Input: tidsl_t *ptidsl
19018 +* 
19019 +* Return: 0    success
19020 +*         1    failed
19021 +*
19022 +********************************************************************************************/
19023 +
19024 +unsigned int dslhal_diags_digi_readMemTestResult
19025 +(tidsl_t *ptidsl,
19026 +unsigned int testResult
19027 +);
19028 +
19029 +
19030 +/********************************************************************************************
19031 +* FUNCTION NAME: dslhal_diags_codeDownload()
19032 +*
19033 +*********************************************************************************************
19034 +* DESCRIPTION: Brings DSLSS out of Reset, Downloads Diag Firmware, 
19035 +*              brings DSP out of Reset 
19036 +* Input: tidsl_t *ptidsl
19037 +* 
19038 +* Return: 0    success
19039 +*         1    failed
19040 +*
19041 +********************************************************************************************/
19042 +
19043 +unsigned int dslhal_diags_codeDownload
19044 +(tidsl_t *ptidsl,
19045 +unsigned char* missingTones
19046 +);
19047 +
19048 +/********************************************************************************************
19049 +* FUNCTION NAME: dslhal_diags_anlg_setPgaParams()
19050 +*
19051 +*********************************************************************************************
19052 +* DESCRIPTION: This function instructs the Transciever to transmit the Reverb with missing
19053 +*              tones and Medley's with missing tones. These signals are defined in ITU 
19054 +*              G.992.1 ADSL Standards.
19055 +*
19056 +* Input: Test selects between the Reverb or Medley tests. 0 - Reverb, 1 - Medley
19057 +*        Tones selects the .
19058 +* Return: NULL
19059 +*         
19060 +********************************************************************************************/
19061 +
19062 +unsigned int  dslhal_diags_anlg_setPgaParams
19063 +(tidsl_t *ptidsl,
19064 +int agcFlag,
19065 +short pga1, 
19066 +short pga2, 
19067 +short pga3, 
19068 +short aeq
19069 +);
19070 +
19071 +/********************************************************************************************
19072 +* FUNCTION NAME: dslhal_diags_anlg_getRxNoisePower()
19073 +*
19074 +*********************************************************************************************
19075 +* DESCRIPTION: This function instructs the Transciever to transmit the Reverb with missing
19076 +*              tones and Medley's with missing tones. These signals are defined in ITU 
19077 +*              G.992.1 ADSL Standards.
19078 +*
19079 +* Input: Test selects between the Reverb or Medley tests. 0 - Reverb, 1 - Medley
19080 +*        Tones selects the .
19081 +* Return: NULL
19082 +*         
19083 +********************************************************************************************/
19084 +
19085 +unsigned int dslhal_diags_anlg_getRxNoisePower
19086 +(tidsl_t *ptidsl
19087 +);
19088 +
19089 +/********************************************************************************************
19090 +* FUNCTION NAME: dslhal_diags_anlg_setMissingTones()
19091 +*
19092 +*********************************************************************************************
19093 +* DESCRIPTION: This function instructs the Transciever to transmit the Reverb with missing
19094 +*              tones and Medley's with missing tones. These signals are defined in ITU 
19095 +*              G.992.1 ADSL Standards.
19096 +*
19097 +* Input: Test selects between the Reverb or Medley tests. 0 - Reverb, 1 - Medley
19098 +*        Tones selects the .
19099 +* Return: NULL
19100 +*         
19101 +********************************************************************************************/
19102 +
19103 +unsigned int dslhal_diags_anlg_setMissingTones
19104 +(tidsl_t *ptidsl,
19105 +unsigned char* missingTones
19106 +);
19107 +
19108 +/********************************************************************************************
19109 +* FUNCTION NAME: dslhal_support_readDelineationState()
19110 +*
19111 +*********************************************************************************************
19112 +* DESCRIPTION:
19113 +*   download DSP image from host memory to dsp memory
19114 +*
19115 +* Return: 0  success
19116 +*         1  failed
19117 +* 
19118 +* NOTE: 
19119 +*   DSP image is based on LITTLE endian
19120 +*
19121 +********************************************************************************************/
19122 +unsigned int dslhal_support_readDelineationState
19123 +(tidsl_t *ptidsl
19124 +);
19125 +
19126 +/********************************************************************************************
19127 +* FUNCTION NAME: dslhal_support_processModemStateBitField()
19128 +*
19129 +*********************************************************************************************
19130 +* DESCRIPTION:
19131 +*   download DSP image from host memory to dsp memory
19132 +*
19133 +* Return: 0  success
19134 +*         1  failed
19135 +* 
19136 +* NOTE: 
19137 +*   DSP image is based on LITTLE endian
19138 +*
19139 +********************************************************************************************/
19140 +unsigned int dslhal_support_processModemStateBitField
19141 +(tidsl_t *ptidsl
19142 +);
19143 +
19144 +/********************************************************************************************
19145 +* FUNCTION NAME: dslhal_support_setInterruptMask()
19146 +*
19147 +*********************************************************************************************
19148 +* DESCRIPTION:
19149 +*   Sets the host interrupt bit masks
19150 +*
19151 +* Return: 0  success
19152 +*         1  failed
19153 +* 
19154 +* NOTE: 
19155 +*   DSP image is based on LITTLE endian
19156 +*
19157 +********************************************************************************************/
19158 +
19159 +unsigned int dslhal_support_setInterruptMask
19160 +(tidsl_t * ptidsl,
19161 +unsigned int inputMask
19162 +);
19163 +
19164 +/********************************************************************************************
19165 +* FUNCTION NAME: dslhal_support_computeCrc32()
19166 +*
19167 +*********************************************************************************************
19168 +* DESCRIPTION:
19169 +*   Computes the CRC-32 for the input data
19170 +*
19171 +* Return: 32 bit CRC of the input data
19172 +*      
19173 +* 
19174 +* NOTE: 
19175 +*   DSP image is based on LITTLE endian
19176 +*
19177 +********************************************************************************************/
19178 +unsigned int dslhal_support_computeCrc32
19179 +(unsigned char *data, 
19180 +int len
19181 +);
19182 +
19183 +/********************************************************************************************
19184 +* FUNCTION NAME: dslhal_support_checkOverlayPage()
19185 +*
19186 +*********************************************************************************************
19187 +* DESCRIPTION:
19188 +*   Computes the CRC-32 for the input data and compares it with reference
19189 +*
19190 +* Return: Error Condition (if any)
19191 +*      
19192 +* 
19193 +* NOTE: 
19194 +*   DSP image is based on LITTLE endian
19195 +*
19196 +********************************************************************************************/
19197 +unsigned int dslhal_support_checkOverlayPage
19198 +(tidsl_t *ptidsl, 
19199 +unsigned int tag
19200 +);
19201 +
19202 +/********************************************************************************************
19203 +* FUNCTION NAME: dslhal_support_restoreTrainingInfo()
19204 +*
19205 +*********************************************************************************************
19206 +* DESCRIPTION:
19207 +*   Computes the CRC-32 for the input data and compares it with reference
19208 +*
19209 +* Return: Error Condition (if any)
19210 +*      
19211 +* 
19212 +* NOTE: 
19213 +*   DSP image is based on LITTLE endian
19214 +*
19215 +********************************************************************************************/
19216 +
19217 +int dslhal_support_restoreTrainingInfo(tidsl_t * ptidsl);
19218 +
19219 +/********************************************************************************************
19220 +* FUNCTION NAME: dslhal_support_reloadTrainingInfo()
19221 +*
19222 +*********************************************************************************************
19223 +* DESCRIPTION:
19224 +*   Computes the CRC-32 for the input data and compares it with reference
19225 +*
19226 +* Return: Error Condition (if any)
19227 +*      
19228 +* 
19229 +* NOTE: 
19230 +*   DSP image is based on LITTLE endian
19231 +*
19232 +********************************************************************************************/
19233 +
19234 +int dslhal_support_reloadTrainingInfo(tidsl_t * ptidsl);
19235 +
19236 +/********************************************************************************************
19237 +* FUNCTION NAME: dslhal_support_clearTrainingInfo()
19238 +*
19239 +*********************************************************************************************
19240 +* DESCRIPTION:
19241 +*   Computes the CRC-32 for the input data and compares it with reference
19242 +*
19243 +* Return: Error Condition (if any)
19244 +*      
19245 +* 
19246 +* NOTE: 
19247 +*   DSP image is based on LITTLE endian
19248 +*
19249 +********************************************************************************************/
19250 +
19251 +int dslhal_support_clearTrainingInfo(tidsl_t * ptidsl);
19252 +
19253 +/********************************************************************************************
19254 +* FUNCTION NAME: dslhal_support_parseInterruptSource()
19255 +*
19256 +*********************************************************************************************
19257 +* DESCRIPTION:
19258 +*   Sets the host interrupt bit masks
19259 +*
19260 +* Return: 0  success
19261 +*         1  failed
19262 +* 
19263 +* NOTE: 
19264 +*   DSP image is based on LITTLE endian
19265 +*
19266 +********************************************************************************************/
19267 +
19268 +unsigned int dslhal_support_parseInterruptSource(tidsl_t * ptidsl);
19269 +/********************************************************************************************
19270 +* FUNCTION NAME: dslhal_support_advancedIdleProcessing()
19271 +*
19272 +*********************************************************************************************
19273 +* DESCRIPTION:
19274 +*   Calls Advanced Idle State Processing Functions
19275 +*
19276 +* Return: Error Condition (if any)
19277 +*      
19278 +* 
19279 +* NOTE: 
19280 +*   DSP image is based on LITTLE endian
19281 +*
19282 +********************************************************************************************/
19283 +unsigned int dslhal_support_advancedIdleProcessing(tidsl_t *ptidsl);
19284 +
19285 +/********************************************************************************************
19286 +* FUNCTION NAME: dslhal_support_aocBitSwapProcessing()
19287 +*
19288 +*********************************************************************************************
19289 +* DESCRIPTION:
19290 +*   Calls Advanced Bitswap buffer Processing Functions
19291 +*
19292 +* Return: Error Condition (if any)
19293 +*      
19294 +* 
19295 +* NOTE: 
19296 +*   DSP image is based on LITTLE endian
19297 +*
19298 +********************************************************************************************/
19299 +unsigned int dslhal_support_aocBitSwapProcessing(tidsl_t *ptidsl,unsigned int usDs);
19300 +
19301 +/********************************************************************************************
19302 +* FUNCTION NAME: dslhal_support_gatherEocMessages()
19303 +*
19304 +*********************************************************************************************
19305 +* DESCRIPTION:
19306 +*   Calls Advanced EOC Buffering functions
19307 +*
19308 +* Return: Error Condition (if any)
19309 +*      
19310 +* 
19311 +* NOTE: 
19312 +*   DSP image is based on LITTLE endian
19313 +*
19314 +********************************************************************************************/
19315 +unsigned int dslhal_support_gatherEocMessages(tidsl_t *ptidsl,int usDs, int msgPart1, int msgPart2);
19316 +
19317 +/********************************************************************************************
19318 +* FUNCTION NAME: dslhal_support_gatherSnrPerBin()
19319 +*
19320 +*********************************************************************************************
19321 +* DESCRIPTION:
19322 +*   Calls Advanced Snr per bin buffering Functions
19323 +*
19324 +* Return: Error Condition (if any)
19325 +*      
19326 +* 
19327 +* NOTE: 
19328 +*   DSP image is based on LITTLE endian
19329 +*
19330 +********************************************************************************************/
19331 +unsigned int dslhal_support_gatherSnrPerBin(tidsl_t *ptidsl,unsigned int snrParm);
19332 +
19333 +/********************************************************************************************
19334 +* FUNCTION NAME: dslhal_support_processTrainingState()
19335 +*
19336 +*********************************************************************************************
19337 +* DESCRIPTION:
19338 +*   Calls Advanced Training State Processing Functions
19339 +*
19340 +* Return: Error Condition (if any)
19341 +*      
19342 +* 
19343 +* NOTE: 
19344 +*   DSP image is based on LITTLE endian
19345 +*
19346 +********************************************************************************************/
19347 +unsigned int dslhal_support_processTrainingState(tidsl_t *ptidsl);
19348 +
19349 +/********************************************************************************************
19350 +* FUNCTION NAME: dslhal_support_gatherAdsl2Messages()
19351 +*
19352 +*********************************************************************************************
19353 +* DESCRIPTION:
19354 +*   Calls Advanced EOC Buffering functions
19355 +*
19356 +* Return: Error Condition (if any)
19357 +*      
19358 +* 
19359 +* NOTE: 
19360 +*   DSP image is based on LITTLE endian
19361 +*
19362 +********************************************************************************************/
19363 +unsigned int dslhal_support_gatherAdsl2Messages(tidsl_t *ptidsl,int msgTag, int param1, int param2);
19364 +
19365 +/********************************************************************************************
19366 +* FUNCTION NAME: dslhal_support_getAdsl2MsgLocation()
19367 +*
19368 +*********************************************************************************************
19369 +* DESCRIPTION:
19370 +*   Gets the address to the ADSL2 Message being looked up
19371 +*
19372 +* Return: Error Condition (if any)
19373 +*      
19374 +* 
19375 +* NOTE: 
19376 +*   DSP image is based on LITTLE endian
19377 +*
19378 +********************************************************************************************/
19379 +unsigned int dslhal_support_getAdsl2MessageLocation(tidsl_t *ptidsl,int msgOffset);
19380 +
19381 +/********************************************************************************************
19382 +* FUNCTION NAME: dslhal_support_getCMsgsRa()
19383 +*
19384 +*********************************************************************************************
19385 +* DESCRIPTION:
19386 +*   Calls Advanced Training Message functions
19387 +*
19388 +* Return: Error Condition (if any)
19389 +*      
19390 +* 
19391 +* NOTE: 
19392 +*   DSP image is based on LITTLE endian
19393 +*
19394 +********************************************************************************************/
19395 +unsigned int dslhal_support_getCMsgsRa(tidsl_t *ptidsl,void *cMsg);
19396 +
19397 +/********************************************************************************************
19398 +* FUNCTION NAME: dslhal_support_gatherRateMessages()
19399 +*
19400 +*********************************************************************************************
19401 +* DESCRIPTION:
19402 +*   Gathers Advanced Training Messages
19403 +*
19404 +* Return: Error Condition (if any)
19405 +*      
19406 +* 
19407 +* NOTE: 
19408 +*   DSP image is based on LITTLE endian
19409 +*
19410 +********************************************************************************************/
19411 +unsigned int dslhal_support_gatherRateMessages(tidsl_t *ptidsl);
19412 +
19413 +/********************************************************************************************
19414 +* FUNCTION NAME: dslhal_support_byteSwap16()
19415 +*
19416 +*********************************************************************************************
19417 +* DESCRIPTION:
19418 +* byteswap a short  
19419 +* 
19420 +* INPUT: 
19421 +* Return: NULL
19422 +*
19423 +********************************************************************************************/
19424 +
19425 +unsigned short dslhal_support_byteSwap16(unsigned short in16Bits);
19426 +
19427 +/********************************************************************************************
19428 +* FUNCTION NAME: dslhal_support_byteSwap32()
19429 +*
19430 +*********************************************************************************************
19431 +* DESCRIPTION:
19432 +*   byteswap a word
19433 +* 
19434 +* INPUT: 
19435 +* Return: NULL
19436 +*
19437 +********************************************************************************************/
19438 +
19439 +unsigned int dslhal_support_byteSwap32(unsigned int in32Bits);
19440 +
19441 +#endif /* Pairs #ifndef DSL_HAL_FUNCTIONDEFINES_H__ */
19442 diff -urN linux.old/drivers/atm/sangam_atm/dsl_hal_version.h linux.dev/drivers/atm/sangam_atm/dsl_hal_version.h
19443 --- linux.old/drivers/atm/sangam_atm/dsl_hal_version.h  1970-01-01 01:00:00.000000000 +0100
19444 +++ linux.dev/drivers/atm/sangam_atm/dsl_hal_version.h  2005-08-23 04:46:50.102842936 +0200
19445 @@ -0,0 +1,94 @@
19446 +#ifndef __SYSSW_VERSION_H__
19447 +#define __SYSSW_VERSION_H__ 1
19448 +
19449 +/*******************************************************************************
19450 +* FILE PURPOSE:     DSL Driver API functions for Sangam
19451 +*
19452 +********************************************************************************
19453 +* FILE NAME:        dsl_hal_basicapi.c
19454 +*
19455 +* DESCRIPTION:  
19456 +*       Contains basic DSL HAL APIs for Sangam
19457 +*  
19458 +* (C) Copyright 2003-04, Texas Instruments, Inc.
19459 +*    History
19460 +*    Date        Version            Notes
19461 +*    14May03     0.00.00            RamP   Original Version Created
19462 +*    14May03     0.00.01            RamP   Initial Rev numbers inserted 
19463 +*    14May03     0.00.02            RamP   Bumped version numbers for Dsl Hal
19464 +*                                          & dhalapp for alpha plus
19465 +*    19May03     0.00.03            MCB    Bumped dslhal version number
19466 +*                                          because of dependant changes
19467 +*                                          wrt. linux-nsp atm drivers.
19468 +*    22May03     0.00.04            RamP   Bumped dslhal & dhalapp buildnum
19469 +*                                          for inner/outer pair & DGASP code
19470 +*    06Jun03     0.00.05            RamP   Bumped up buildnum for LED, STM, 
19471 +*                                          interrupt processing, statistics
19472 +*                                          and other pre-beta features
19473 +*    09Jun03     0.00.06            JEB    Fixed error in DHALAPP bugfix/buildnum
19474 +*    09Jun03     0.00.07            RamP   Bumped up buildnum for incremental
19475 +*                                          changes to apis, statistics, memory
19476 +*                                          fixes, parameter configurations
19477 +*    11Jun03     0.00.08            RamP   Bumped up buildnum for Co profile
19478 +*                                          free memory fix
19479 +*    12Jun03     0.00.09            JEB    Bumped version numbers for AR7 1.00 Beta
19480 +*    02Jul03     0.00.10            ZT     Bumped HAL version for overlay page
19481 +*    18Jul03     0.00.11            RamP   Bumped HAL version for analog diags
19482 +*    22Jul03     0.00.12            JEB    Bumped DHALAPP buildnum for analog diags
19483 +*    31Jul03     0.00.13            RamP   Bumped HAL version for engr. drop
19484 +*    04Aug03     0.00.14            JEB    Bumped HAL version buildnum for CHECKPOINT65 changes
19485 +*                                          Bumped LINUX version buildnum for CHECKPOINT65 changes
19486 +*    06Aug03     0.00.15            MCB    Bumped all version numbers in prep for AR7 1.0 R2 release for POTS.
19487 +*    13Aug03     0.00.16            MCB    Set rev id's for D3/R1.1 (ADSL2).
19488 +*    21Aug03     0.00.17            JEB    Bumped up build numbers for merge of code additions from D1
19489 +*    26Sep03     0.00.18            JEB    Set rev id's for another D3/R1 (ADSL2).
19490 +*    14Oct03     0.00.19            JEB    Bumped Linux minor number and reset bugfix number for release.
19491 +*                                          Bumped build numbers on DSLHAL and DHALAPP for this checkpoint.
19492 +*    14Oct03     0.00.20            JEB    Bumped build numbers on DSLHAL and DHALAPP for CHECKPOINT15.
19493 +*    21Oct03     0.00.21            JEB    Bumped build number on DSLHAL for CHECKPOINT16.
19494 +*    22Oct03     0.00.22            MCB    Bumped all version numbers in support of D3R1 release.
19495 +*    27Oct03     0.00.23            JEB    Bumped build numbers on DSLHAL and DHALAPP for CHECKPOINT19.
19496 +*                                          Updated version for DSLAGENT to be 02.01.00.01 for ACT 2.1 R0.
19497 +*    30Oct03     0.00.24            JEB    Bumped bugfix number on LINUXATM Version for next release.
19498 +*                                          Bumped build numbers on DSLHAL and DHALAPP
19499 +*    31Oct03     0.00.25            MCB    Bumped all version numbers in support of D3R2 release.
19500 +*    14Nov03     0.00.26            JEB    Bumped build numbers on DSLHAL and DHALAPP
19501 +*                                          Changed version for DSLAGENT to be 02.00.01.01 for an ACT 2.0 R0
19502 +*    20Nov03     0.00.27            JEB    Bumped build number on DSLHAL.
19503 +*                                          Changed version for DSLAGENT to be 02.00.02.00 for the next ACT 2.0 R2
19504 +*    21Nov03     0.00.28            MCB    Bumped all version numbers in support of D3R2 release.
19505 +*    21Nov03     0.00.29            JEB    Bumped build numbers on DSLHAL and DHALAPP for D3-R0 drop on 11/21.
19506 +*    16Dec03     0.00.30            JEB    Bumped build numbers on DSLHAL and DHALAPP for CHECKPOINT31.
19507 +*    21Dec03     0.00.31            MCB    Bumped all version numbers in support of D3R2 release.
19508 +*    05Jan04     0.00.32            JEB    Bumped build numbers on DSLHAL and Linux ATM for CHECKPOINT 34.
19509 +*    15Jan04     0.00.33            JEB    Bumped build numbers on DSLHAL and Linux ATM for CHECKPOINT 36.
19510 +*    26Jan04     0.00.34            JEB    Changed Linux ATM version number to be 04.02.03.00.
19511 +*    27Jan04     0.00.35            MCB    Bumped all version numbers in support of D3R2 release.
19512 +*******************************************************************************/
19513 +
19514 +/* Dsl Hal API Version Numbers */
19515 +#define DSLHAL_VERSION_MAJOR       03
19516 +#define DSLHAL_VERSION_MINOR       00
19517 +#define DSLHAL_VERSION_BUGFIX      06
19518 +#define DSLHAL_VERSION_BUILDNUM    00
19519 +#define DSLHAL_VERSION_TIMESTAMP   00
19520 +
19521 +/* dhalapp Adam2 Application Version Numbers */
19522 +#define DHALAPP_VERSION_MAJOR      03
19523 +#define DHALAPP_VERSION_MINOR      00
19524 +#define DHALAPP_VERSION_BUGFIX     05
19525 +#define DHALAPP_VERSION_BUILDNUM   00
19526 +
19527 +/* Linux ATM Driver Version Numbers */
19528 +#define LINUXATM_VERSION_MAJOR     04
19529 +#define LINUXATM_VERSION_MINOR     02
19530 +#define LINUXATM_VERSION_BUGFIX    04
19531 +#define LINUXATM_VERSION_BUILDNUM  00
19532 +
19533 +/* DSL Agent Version Numbers */
19534 +#define DSLAGENT_VERSION_MAJOR     02
19535 +#define DSLAGENT_VERSION_MINOR     00
19536 +#define DSLAGENT_VERSION_BUGFIX    02
19537 +#define DSLAGENT_VERSION_BUILDNUM  00
19538 +
19539 +#endif /* pairs with #ifndef __SYSSW_VERSION_H__ */
19540 diff -urN linux.old/drivers/atm/sangam_atm/ec_errors_cpaal5.h linux.dev/drivers/atm/sangam_atm/ec_errors_cpaal5.h
19541 --- linux.old/drivers/atm/sangam_atm/ec_errors_cpaal5.h 1970-01-01 01:00:00.000000000 +0100
19542 +++ linux.dev/drivers/atm/sangam_atm/ec_errors_cpaal5.h 2005-08-23 04:46:50.102842936 +0200
19543 @@ -0,0 +1,118 @@
19544 +/***************************************************************************
19545 + Copyright(c) 2001, Texas Instruments Incorporated. All Rights Reserved.
19546 +
19547 + FILE:  ec_errors.h
19548 +
19549 + DESCRIPTION:
19550 +   This file contains definitions and function declarations for
19551 +   error code support.
19552 +
19553 + HISTORY:
19554 +   14Dec00 MJH             Added masking to EC_CLASS etc macros
19555 +   17Sep02 GSG             Added HAL support (new class&devices)
19556 +   03Oct02 GSG             Removed C++ style comments
19557 +***************************************************************************/
19558 +#ifndef _INC_EC_ERRORS
19559 +#define _INC_EC_ERRORS
19560 +
19561 +/*
19562 +  31    - CRITICAL
19563 +  30-28 - CLASS         (ie. DIAG, KERNEL, FLASH, etc)
19564 +  27-24 - INSTANCE      (ie. 1, 2, 3, etc )
19565 +  23-16 - DEVICE        (ie. EMAC, IIC, etc)
19566 +  15-08 - FUNCTION      (ie. RX, TX, INIT, etc)
19567 +  07-00 - ERROR CODE    (ie. NO_BASE, FILE_NOT_FOUND, etc )
19568 +*/
19569 +
19570 +/*---------------------------------------------------------------------------
19571 +  Useful defines for accessing fields within error code
19572 +---------------------------------------------------------------------------*/
19573 +#define CRITICAL_SHIFT    31
19574 +#define CLASS_SHIFT       28
19575 +#define INST_SHIFT        24
19576 +#define DEVICE_SHIFT      16
19577 +#define FUNCTION_SHIFT     8
19578 +#define ERROR_CODE_SHIFT   0
19579 +
19580 +#define CRITICAL_MASK     1
19581 +#define CLASS_MASK        0x07
19582 +#define DEVICE_MASK       0xFF
19583 +#define INST_MASK         0x0F
19584 +#define FUNCTION_MASK     0xFF
19585 +#define ERROR_CODE_MASK   0xFF
19586 +
19587 +#define EC_CLASS(val)     ((val&CLASS_MASK)      << CLASS_SHIFT)
19588 +#define EC_DEVICE(val)    ((val&DEVICE_MASK)     << DEVICE_SHIFT)
19589 +#define EC_INST(val)      ((val&INST_MASK)       << INST_SHIFT)
19590 +#define EC_FUNC(val)      ((val&FUNCTION_MASK)   << FUNCTION_SHIFT)
19591 +#define EC_ERR(val)       ((val&ERROR_CODE_MASK) << ERROR_CODE_SHIFT)
19592 +
19593 +/*---------------------------------------------------------------------------
19594 +   Operation classes
19595 +---------------------------------------------------------------------------*/
19596 +#define EC_HAL              EC_CLASS(0)
19597 +#define EC_DIAG             EC_CLASS(8)
19598 +
19599 +/*---------------------------------------------------------------------------
19600 +   Device types
19601 +---------------------------------------------------------------------------*/
19602 +#define EC_DEV_EMAC         EC_DEVICE(1)
19603 +#define EC_DEV_IIC          EC_DEVICE(2)
19604 +#define EC_DEV_RESET        EC_DEVICE(3)
19605 +#define EC_DEV_ATMSAR       EC_DEVICE(4)
19606 +#define EC_DEV_MEM          EC_DEVICE(5)
19607 +#define EC_DEV_DES          EC_DEVICE(6)
19608 +#define EC_DEV_DMA          EC_DEVICE(7)
19609 +#define EC_DEV_DSP          EC_DEVICE(8)
19610 +#define EC_DEV_TMR          EC_DEVICE(9)
19611 +#define EC_DEV_WDT          EC_DEVICE(10)
19612 +#define EC_DEV_DCL          EC_DEVICE(11)
19613 +#define EC_DEV_BBIF         EC_DEVICE(12)
19614 +#define EC_DEV_PCI              EC_DEVICE(13)
19615 +#define EC_DEV_XBUS         EC_DEVICE(14)
19616 +#define EC_DEV_DSLIF            EC_DEVICE(15)
19617 +#define EC_DEV_USB                      EC_DEVICE(16)
19618 +#define EC_DEV_CLKC                     EC_DEVICE(17)
19619 +#define EC_DEV_RAPTOR       EC_DEVICE(18)
19620 +#define EC_DEV_DSPC                     EC_DEVICE(19)
19621 +#define EC_DEV_INTC                     EC_DEVICE(20)
19622 +#define EC_DEV_GPIO                     EC_DEVICE(21)
19623 +#define EC_DEV_BIST                     EC_DEVICE(22)
19624 +#define EC_DEV_HDLC                     EC_DEVICE(23)
19625 +#define EC_DEV_UART                     EC_DEVICE(24)
19626 +#define EC_DEV_VOIC                     EC_DEVICE(25)
19627 +/* 9.17.02 (new HAL modules) */
19628 +#define EC_DEV_CPSAR        EC_DEVICE(0x1A)
19629 +#define EC_DEV_AAL5         EC_DEVICE(0x1B)
19630 +#define EC_DEV_AAL2         EC_DEVICE(0x1C)
19631 +#define EC_DEV_CPMAC        EC_DEVICE(0x1D)
19632 +#define EC_DEV_VDMA         EC_DEVICE(0x1E)
19633 +#define EC_DEV_VLYNQ        EC_DEVICE(0x1F)
19634 +#define EC_DEV_CPPI         EC_DEVICE(0x20)
19635 +#define EC_DEV_CPMDIO       EC_DEVICE(0x21)
19636 +
19637 +/*---------------------------------------------------------------------------
19638 +   Function types
19639 +---------------------------------------------------------------------------*/
19640 +#define EC_FUNC_READ_CONF   EC_FUNC(1)
19641 +#define EC_FUNC_INIT        EC_FUNC(2)
19642 +
19643 +/*---------------------------------------------------------------------------
19644 +   Error codes
19645 +---------------------------------------------------------------------------*/
19646 +#define EC_CRITICAL         (1<<CRITICAL_SHIFT)
19647 +#define EC_NO_ERRORS        0
19648 +#define EC_VAL_NO_BASE      EC_ERR(1)
19649 +#define EC_VAL_NO_RESET_BIT EC_ERR(2)
19650 +#define EC_VAL_NO_RESET     EC_ERR(3)
19651 +#define EC_VAL_BAD_BASE     EC_ERR(4)
19652 +#define EC_VAL_MALLOCFAILED EC_ERR(5)
19653 +#define EC_VAL_NO_RESETBASE EC_ERR(6)
19654 +#define EC_DEVICE_NOT_FOUND EC_ERR(7)
19655 +
19656 +/*---------------------------------------------------------------------------
19657 +   Function declarations
19658 +---------------------------------------------------------------------------*/
19659 +extern void ec_log_error( unsigned int );
19660 +
19661 +#endif /* _INC_EC_ERRORS */
19662 diff -urN linux.old/drivers/atm/sangam_atm/ec_errors_cpsar.h linux.dev/drivers/atm/sangam_atm/ec_errors_cpsar.h
19663 --- linux.old/drivers/atm/sangam_atm/ec_errors_cpsar.h  1970-01-01 01:00:00.000000000 +0100
19664 +++ linux.dev/drivers/atm/sangam_atm/ec_errors_cpsar.h  2005-08-23 04:46:50.102842936 +0200
19665 @@ -0,0 +1,118 @@
19666 +/***************************************************************************
19667 + Copyright(c) 2001, Texas Instruments Incorporated. All Rights Reserved.
19668 +
19669 + FILE:  ec_errors.h
19670 +
19671 + DESCRIPTION:
19672 +   This file contains definitions and function declarations for
19673 +   error code support.
19674 +
19675 + HISTORY:
19676 +   14Dec00 MJH             Added masking to EC_CLASS etc macros
19677 +   17Sep02 GSG             Added HAL support (new class&devices)
19678 +   03Oct02 GSG             Removed C++ style comments
19679 +***************************************************************************/
19680 +#ifndef _INC_EC_ERRORS
19681 +#define _INC_EC_ERRORS
19682 +
19683 +/*
19684 +  31    - CRITICAL
19685 +  30-28 - CLASS         (ie. DIAG, KERNEL, FLASH, etc)
19686 +  27-24 - INSTANCE      (ie. 1, 2, 3, etc )
19687 +  23-16 - DEVICE        (ie. EMAC, IIC, etc)
19688 +  15-08 - FUNCTION      (ie. RX, TX, INIT, etc)
19689 +  07-00 - ERROR CODE    (ie. NO_BASE, FILE_NOT_FOUND, etc )
19690 +*/
19691 +
19692 +/*---------------------------------------------------------------------------
19693 +  Useful defines for accessing fields within error code
19694 +---------------------------------------------------------------------------*/
19695 +#define CRITICAL_SHIFT    31
19696 +#define CLASS_SHIFT       28
19697 +#define INST_SHIFT        24
19698 +#define DEVICE_SHIFT      16
19699 +#define FUNCTION_SHIFT     8
19700 +#define ERROR_CODE_SHIFT   0
19701 +
19702 +#define CRITICAL_MASK     1
19703 +#define CLASS_MASK        0x07
19704 +#define DEVICE_MASK       0xFF
19705 +#define INST_MASK         0x0F
19706 +#define FUNCTION_MASK     0xFF
19707 +#define ERROR_CODE_MASK   0xFF
19708 +
19709 +#define EC_CLASS(val)     ((val&CLASS_MASK)      << CLASS_SHIFT)
19710 +#define EC_DEVICE(val)    ((val&DEVICE_MASK)     << DEVICE_SHIFT)
19711 +#define EC_INST(val)      ((val&INST_MASK)       << INST_SHIFT)
19712 +#define EC_FUNC(val)      ((val&FUNCTION_MASK)   << FUNCTION_SHIFT)
19713 +#define EC_ERR(val)       ((val&ERROR_CODE_MASK) << ERROR_CODE_SHIFT)
19714 +
19715 +/*---------------------------------------------------------------------------
19716 +   Operation classes
19717 +---------------------------------------------------------------------------*/
19718 +#define EC_HAL              EC_CLASS(0)
19719 +#define EC_DIAG             EC_CLASS(8)
19720 +
19721 +/*---------------------------------------------------------------------------
19722 +   Device types
19723 +---------------------------------------------------------------------------*/
19724 +#define EC_DEV_EMAC         EC_DEVICE(1)
19725 +#define EC_DEV_IIC          EC_DEVICE(2)
19726 +#define EC_DEV_RESET        EC_DEVICE(3)
19727 +#define EC_DEV_ATMSAR       EC_DEVICE(4)
19728 +#define EC_DEV_MEM          EC_DEVICE(5)
19729 +#define EC_DEV_DES          EC_DEVICE(6)
19730 +#define EC_DEV_DMA          EC_DEVICE(7)
19731 +#define EC_DEV_DSP          EC_DEVICE(8)
19732 +#define EC_DEV_TMR          EC_DEVICE(9)
19733 +#define EC_DEV_WDT          EC_DEVICE(10)
19734 +#define EC_DEV_DCL          EC_DEVICE(11)
19735 +#define EC_DEV_BBIF         EC_DEVICE(12)
19736 +#define EC_DEV_PCI              EC_DEVICE(13)
19737 +#define EC_DEV_XBUS         EC_DEVICE(14)
19738 +#define EC_DEV_DSLIF            EC_DEVICE(15)
19739 +#define EC_DEV_USB                      EC_DEVICE(16)
19740 +#define EC_DEV_CLKC                     EC_DEVICE(17)
19741 +#define EC_DEV_RAPTOR       EC_DEVICE(18)
19742 +#define EC_DEV_DSPC                     EC_DEVICE(19)
19743 +#define EC_DEV_INTC                     EC_DEVICE(20)
19744 +#define EC_DEV_GPIO                     EC_DEVICE(21)
19745 +#define EC_DEV_BIST                     EC_DEVICE(22)
19746 +#define EC_DEV_HDLC                     EC_DEVICE(23)
19747 +#define EC_DEV_UART                     EC_DEVICE(24)
19748 +#define EC_DEV_VOIC                     EC_DEVICE(25)
19749 +/* 9.17.02 (new HAL modules) */
19750 +#define EC_DEV_CPSAR        EC_DEVICE(0x1A)
19751 +#define EC_DEV_AAL5         EC_DEVICE(0x1B)
19752 +#define EC_DEV_AAL2         EC_DEVICE(0x1C)
19753 +#define EC_DEV_CPMAC        EC_DEVICE(0x1D)
19754 +#define EC_DEV_VDMA         EC_DEVICE(0x1E)
19755 +#define EC_DEV_VLYNQ        EC_DEVICE(0x1F)
19756 +#define EC_DEV_CPPI         EC_DEVICE(0x20)
19757 +#define EC_DEV_CPMDIO       EC_DEVICE(0x21)
19758 +
19759 +/*---------------------------------------------------------------------------
19760 +   Function types
19761 +---------------------------------------------------------------------------*/
19762 +#define EC_FUNC_READ_CONF   EC_FUNC(1)
19763 +#define EC_FUNC_INIT        EC_FUNC(2)
19764 +
19765 +/*---------------------------------------------------------------------------
19766 +   Error codes
19767 +---------------------------------------------------------------------------*/
19768 +#define EC_CRITICAL         (1<<CRITICAL_SHIFT)
19769 +#define EC_NO_ERRORS        0
19770 +#define EC_VAL_NO_BASE      EC_ERR(1)
19771 +#define EC_VAL_NO_RESET_BIT EC_ERR(2)
19772 +#define EC_VAL_NO_RESET     EC_ERR(3)
19773 +#define EC_VAL_BAD_BASE     EC_ERR(4)
19774 +#define EC_VAL_MALLOCFAILED EC_ERR(5)
19775 +#define EC_VAL_NO_RESETBASE EC_ERR(6)
19776 +#define EC_DEVICE_NOT_FOUND EC_ERR(7)
19777 +
19778 +/*---------------------------------------------------------------------------
19779 +   Function declarations
19780 +---------------------------------------------------------------------------*/
19781 +extern void ec_log_error( unsigned int );
19782 +
19783 +#endif /* _INC_EC_ERRORS */
19784 diff -urN linux.old/drivers/atm/sangam_atm/env_def_defines.h linux.dev/drivers/atm/sangam_atm/env_def_defines.h
19785 --- linux.old/drivers/atm/sangam_atm/env_def_defines.h  1970-01-01 01:00:00.000000000 +0100
19786 +++ linux.dev/drivers/atm/sangam_atm/env_def_defines.h  2005-08-23 04:46:50.103842784 +0200
19787 @@ -0,0 +1,926 @@
19788 +#ifndef __ENV_DEF_DEFINES_H__
19789 +#define __ENV_DEF_DEFINES_H__ 1
19790 +
19791 +//********************************************************************
19792 +//*    DMT-BASE ADSL MODEM PROGRAM
19793 +//*    TEXAS INSTRUMENTS PROPRIETARTY INFORMATION
19794 +//*    AMATI CONFIDENTIAL PROPRIETARY
19795 +//*
19796 +//* (c) Copyright May 1999, Texas Instruments Incorporated.
19797 +//*     All Rights Reserved.
19798 +//*
19799 +//*   Property of Texas Instruments Incorporated and Amati Communications Corp.
19800 +//*
19801 +//* Restricted Rights - Use, duplication, or disclosure is subject to
19802 +//* restrictions set forth in TI's and Amati program license agreement and
19803 +//* associated documentation
19804 +//*
19805 +//*********************************************************************
19806 +//*
19807 +//* FILENAME: dpsys_defines.h
19808 +//*
19809 +//* ABSTRACT: This file provides a mechanism for defining standard
19810 +//*           preprocessor flag sets for datapump.
19811 +//*
19812 +//* TARGET:  Non specific.
19813 +//*
19814 +//* TOOLSET:  Non specific.
19815 +//*
19816 +//* ACTIVATION:
19817 +//*
19818 +//* HISTORY:  DATE        AUTHOR         DESCRIPTION
19819 +//*           05/11/99    FLW            Created
19820 +//*           01/21/00    FLW            derfmake changes
19821 +//*           02/07/00    FLW/M.Seidl    added _debug targets
19822 +//*           02/23/00    FLW/M.Barnett  merged in from G.lite branch
19823 +//*           03/03/00    FLW/M.Barnett  added TRELLIS token
19824 +//*           05/11/00    Barnett        Added ap036btp & ap037btp support.
19825 +//*           02/07/00    M.Seidl        added HW_TEQ, HW_DEC and DC_BIAS tokens
19826 +//*           02/28/00    Derf/Seidl     Mod's in support of suppressing compiler warnings for empty source files
19827 +//*           02/28/00    M. Seidl       added SWTC token
19828 +//*           02/28/00    M. Seidl       added ap0501tp and its _debug target
19829 +//*           03/03/00    M. Seidl       added MODPILOT token, ap0307tp_debug has SWDI and FDD enabled
19830 +//*           03/08/00    Jack Huang     Added HWRSDEC token
19831 +//*           03/29/00    Derf/Seidl     Mod's in support Soft-TC and derfmake
19832 +//*           04/10/00    Jack Huang     Added PCIMASTER token
19833 +//*           04/11/00    Jack Huang     Added STBFIX token
19834 +//*           04/24/00    M. Seidl       ap0500tp has OLAYDP turned on, ap0500tp_debug has OLAYDP turned off now
19835 +//*           04/28/00    M.Seidl        added KAPIL token for ap0501tp targets
19836 +//*           06/02/00    P.Sexton       Added OAM_EOC token
19837 +//*           06/06/00    M. Seidl       added au0501tp target
19838 +//*           06/12/00    Michael Seidl  activated h/w TEQ for KAPIL targets, disabled STBFIX for all targets
19839 +//*           06/14/00    Derf           added ap0308tp, alphabetized token lists
19840 +//*           06/16/00    Jack Huang     added au0501tp_debug target
19841 +//*           06/22/00    M. Seidl       Enabled code overlays through EMIF from external memory. Now there are 3
19842 +//*                                      different code overlay schemes that are differentiated by the following tokens:
19843 +//*                                      OLAYDP_PCI:  uses PCI DMA in PCI Master Mode
19844 +//*                                      OLAYDP_HOST: Host downloads overlay code into DMEM upon request from DSP
19845 +//*                                      OLAYDP_EMIF: Host downloads overlay code into ext. mem at boot-time. DSP uses
19846 +//*                                                 DMA channel 0 to load code into on-chip PMEM
19847 +//*                                      OLAYDP:    turns overlays generally on or off
19848 +//*           07/15/00    B.Srinivasan   Cleaned up default tokens and tokens for au0501tp, au0501tp_debug,
19849 +//*                                      ap0501tp and ap0501tp_debug targets as well
19850 +//*           07/19/00    B.Srinivasan   Made changes w.r.t cleaning/fixing Rufus Interrupt related code
19851 +//*                                      (changed token TC_INTRPT_RUFUS to INTRPT_RUFUS
19852 +//*           06/14/00    Derf           added au0501cp
19853 +//*           08/12/00    Yinong Ding    Added DPLL_MODE token.
19854 +//*           08/16/00    F. Mujica      Moved DOUBLE_XMT_RATE, RX_HPF, and LEAKY_LMS tokens here.
19855 +//*           09/05/00    M. Seidl       Changed ap0501tp back to do overlay through PCI (OLAY_PCI = 1)
19856 +//*           09/11/00    M. Seidl       moved USB and OLAYDP_HOST definitions to be CHIPSET specific, not target specific
19857 +//*           09/21/00    U.Dasgupta/    Added a token for separate transmit and receive buffers.
19858 +//*                       F.Mujica       (SEPARATE_TX_RX_BUFFERS).
19859 +//*           10/02/00    U.Dasgupta/    Added DPLL and SEPARATE_TX_RX_BUFFER tokens for au0502 target.
19860 +//*                       F.Mujica
19861 +//*           10/02/00    M. Castellano  Added new tokens for new Host/EMIF DSP code overlay.
19862 +//*                                      OLAYDP_2STEP: Host downloads overlay code into ext. mem upon DSP request.  DSP
19863 +//*                                      DMA channel 0 to load code into on-chip PMEM.  It is a somewhat hybrid version
19864 +//*                                      of OLAYDP_HOST and OLAYDP_EMIF.  The test target is ap0502tp.
19865 +//*           10/25/00    Balaji         Added tokens for arv500tp target
19866 +//*           10/31/00    U. Iyer        Added TEQ_AVG token and set it one for Ax5
19867 +//*           11/02/00    Barnett        Added OAM_EOC=0 in defaults at bottom of file.
19868 +//*           11/21/00    M. Seidl       turned OLAYDP and AOC off for ap0307tp to make binary compatible w. whql'ed driver
19869 +//*           11/28/00    Paul Hunt      added FASTRETRAIN token for fast retrain specific code
19870 +//*           11/28/00    Paul Hunt      added PILOTDATA token to control channel estimation and transmission
19871 +//*                                      of data on the upstream pilot tone for ITU standard code loads
19872 +//*           12/20/00    Jack Huang     added EIGHTBITSRAM toekn for the targets that use 8-bit SRAM for
19873 +//*                                      interleaver/deinterleaver
19874 +//*           01/11/01    U.Dasgupta     Added mp targets and cleaned up GHS/PILOTDATA variables
19875 +//*           01/23/01    U.Dasgupta     Cleaned up code within GLITE tokens
19876 +//*           01/23/00    Barnett        Added in full EOC support for AP3/Ax5.  Got rid of UTC.  No longer needed.
19877 +//*           02/08/01    Barnett        Added DDC token.
19878 +//*           03/09/01    Nirmal Warke   Added in TOKEN definition for line diagnostics (LINE_DIAG): IMP DEPENDENCIES -
19879 +//*                                      TEQ_AVG must be off when LINE_DIAG is on (since they share a union buffer at the same time)
19880 +//*           03/13/01    M. Seidl       Recovered ap0500tp target. Added GHS token as PMEM saving option
19881 +//*           03/14/01    Barnett        Added ap0500mb target support.  Look-and-feel is similar to ap0500tp.
19882 +//*                                      Added seperate-but-equal def's wrt. ISDN Annex B, Annex C, and PROP.
19883 +//*           03/14/01    J. Bergsagel   Added EXTERNBERT token.
19884 +//*           03/15/01    Barnett/Balaji Merged AR5(H) -> 03.00.00 datapump.
19885 +//*           03/16/01    Nirmal Warke   Added in TOKEN definition for crosstalk performance mods (CROSSTALK): IMP DEPENDENCIES -
19886 +//*                                      TEQ_AVG must be off and LEAKY_LMS must be on when CROSSTALK is on
19887 +//*           03/21/01    Barnett        Added support for ar0500lp, ar0500mp, ar0500dp, arv500lp, arv500mp, and arv500dp.
19888 +//*           03/26/01    M. Seidl       enabled 64pt IFFT for ap0500mb (Raptor+AD11, FDM)
19889 +//*           03/28/01    J. Bergsagel   Removed EXTERNBERT token (now use host intf. var. instead)
19890 +//*           04/03/01    J. Bergsagel   Removed condition of DSPDP_CHIPSET_GEN==5 for default defines
19891 +//*                                      Removed LEAKY_LMS token (assumed always 1)
19892 +//*                                      Removed OLAYDP_HOST token (assumed always 0)
19893 +//*                                      Removed RX_HPF token (assumed always 1)
19894 +//*                                      Removed TRIBRID token (not used any more)
19895 +//*                                      Removed FDD token (assumed always 1)
19896 +//*                                      Removed HW_DEC token (assumed always 1)
19897 +//*                                      Removed HW_TEQ token (assumed always 1)
19898 +//*                                      Removed HWRSDEC token (assumed always 1)
19899 +//*                                      Removed ILEC_AD11_ALCATEL337 token (assumed always 0)
19900 +//*                                      Removed ILEC_AD11_HDSLNOISEFIX token (assumed always 0)
19901 +//*                                      Removed ILEC_AD11_MODULATEPILOT token (assumed always 0)
19902 +//*                                      Removed ILEC_AD11_NEWINTERPOLATE token (assumed always 0)
19903 +//*                                      Removed ILEC_AD11_USTXHPF token (assumed always 0)
19904 +//*                                      Removed SWDI token (assumed always 1)
19905 +//*                                      Removed TD_AGC token (assumed always 1)
19906 +//*                                      Removed DSPDP_LEGACY_TARGET token (assumed always 0)
19907 +//*                                      Removed AD11_20, AD11_20NL and AD11_20_NEWPREC token (always 1)
19908 +//*                                      Removed AI token (assumed always 1)
19909 +//*                                      Removed ATUC token (assumed always 0)
19910 +//*                                      Removed EU token (assumed always 0)
19911 +//*                                      Removed EVM2 token (assumed always 0)
19912 +//*                                      Removed INTRPT_RUFUS token (assumed always 0)
19913 +//*                                      Removed MODPILOT token (assumed always 0)
19914 +//*                                      Removed SL and SL_EVM tokens (assumed always 0)
19915 +//*                                      Removed STBIFX token (assumed always 0)
19916 +//*                                      Removed STD token (assumed always 1)
19917 +//*                                      Removed SWDI_LOOPBACK token (assumed always 0)
19918 +//*                                      Removed TID token (assumed always 0)
19919 +//*                                      Removed TII token (assumed always 1)
19920 +//*                                      Removed TIPCI token (assumed always 1)
19921 +//*                                      Removed UDI token (assumed always 1)
19922 +//*                                      Removed DC_BIAS token (assumed always 1)
19923 +//*           04/05/01    Barnett        Added DSPDP_ prefix to tokens that originate
19924 +//*                                      in the public interface.
19925 +//*           05/07/01    Jack Huang     Removed DOUBLE_XMT_RATE token.
19926 +//*           05/16/01    Barnett        Added back in EXTERNBERT token in support
19927 +//*                                      of saving PMEM.
19928 +//*           06/05/01    Jack Huang     Fixed the rules for ar0500mp_debug target
19929 +//*           04/23/01    M. Halleck     Merge Astro Wu's DDC enhancements
19930 +//*           06/05/01    M. Capps       Changed DSP_DEBUG to ENHANCED_SERIAL_DEBUG
19931 +//*           07/03/01    M. Capps       Replaced ESD token with !DDC, added DEV_DEBUG
19932 +//*           06/26/01    J. Bergsagel   Removed all the old ap03... stuff
19933 +//*                                      Removed OLAYDP_HOST token (again)
19934 +//*                                      Removed CROSSTALK token (assumed always 1)
19935 +//*                                      Removed TEQ_AVG token (assumed always 0)
19936 +//*                                      Removed DE token (assumed always 1)
19937 +//*                                      Removed PVAT token and au0501cp target
19938 +//*                                      Removed FASTRETRAIN token (assumed always 0)
19939 +//*           07/05/01    J. Bergsagel   Changed PCIMASTER token to TC_ATM_PCIMASTER
19940 +//*           07/20/01    Umesh Iyer     Added ATMBERT token. ATMBERT is conditional on SWTC definition. if SWTC is 0
19941 +//*                                      ATMBERT should be 0. Else it can be 0/1. Default 0.
19942 +//*           07/23/01    J. Bergsagel   Changed name from defines_u.h to dpsys_defines.h
19943 +//*           07/24/01    Barnett        Added support for build of $(TARGET)_diag mfgr'ing targets.
19944 +//*           08/02/01    Michael Seidl  renamed KAPIL token to !AD1X
19945 +//*           08/02/01    Michael Seidl  renamed GHS token to PMEMSAVE_GHS
19946 +//*           08/03/01    S.Yim          Added MFGR_DIAG token for afe diagnostic
19947 +//*                                      Added AFEDEV token for afe device driver
19948 +//*                                      Added DSPBIOSII token for dsp bios
19949 +//*           09/21/01    Sameer         Enable EXTERNBERT.  Disable ATMBERT.
19950 +//*           10/01/01    U.Dasgupta     Turned off SMART_MARGIN for ap0500mb because of FECs/CRCs;
19951 +//*           10/09/01    Barnett        Added support for ar0500db.
19952 +//*           10/12/01    Barnett        Disable EXTERNBERT.
19953 +//*           10/15/01    Barnett        Turn off SMART_MARGIN.
19954 +//*           11/07/01    Barnett        Def'ed ISDN_DEBUG for all targets to avoid compiler warnings.
19955 +//*                                      Assumed defaul value is zero.
19956 +//*           11/13/01    Barnett        Reworked ar0500db_debug to build JTAG-bootable load.
19957 +//*                                      The equivalent production target should only be flash-bootable.
19958 +//*           01/11/02    Yim            Added TOKEN JTAG to build JTAG load ar0500db_diag.
19959 +//*           01/23/02    U Iyer         Added DEBUG_LOG token. Default value 0
19960 +//*           01/31/02    Barnett        Added support for ar0700mp target.
19961 +//*           02/04/02    S.Yim          Added TOKEN JTAG to build JTAG load ar0500mp_diag
19962 +//*           02/11/02    U Iyer         Added MARGIN_DELTA_RETRAIN token. Default value 1
19963 +//*           05/15/02    Sameer V       Enabled EXTERNBERT token for AR5 and AU5 platforms. EXTERNBERT is
19964 +//*                                      not supported on AR5H.
19965 +//*           02/14/02    Barnett        Don't ref the SWTC feature token if mfgr'ing diag target.
19966 +//*           02/19/02    Yim            Added support to build au0502db_diag target.
19967 +//*           03/08/02    Nirmal Warke   Added feature token HYBRID_SWITCH
19968 +//*           03/15/02    U G Jani       Turned ON Bitswap support for AU5I (au0502db) targets.
19969 +//*           04/08/02    U G Jani       Enabled NLNOISEADJSNR token for AU5I targets.
19970 +//*           06/24/02    Seungmok Oh    Added PERTONE_EQ token support for those targets:
19971 +//*                                      (ar0500mp_debug, au0502mp_debug, ar0500mp, au0502mp)
19972 +//*           06/26/02    Mallesh        Added DS_PWR_CUTBACK token. Default value 1.
19973 +//*           06/27/02    Mallesh        Changed default value of DS_PWR_CUTBACK token to 0.
19974 +//*           06/29/02    U.Dasgupta     Token cleanup: Removed ISDN_DEBUG token
19975 +//*           04/29/02    Mannering      Remove EIGHTBITSRAM, Combined DOUBLEBUFFER with
19976 +//*                                      BITSWAP, added FPGA token
19977 +//*           05/03/02    Mannering      cleanup token changed by the new routine names
19978 +//*           05/06/02    Mannering      Add tokens OUTBAND and INBAND for codec commands
19979 +//*                                      If both OUTBAND and INBAND are 0 codec register are
19980 +//*                                      memory mapped.
19981 +//*           05/29/2002  S.Yim          Removed AD1X, AFEDEV
19982 +//*           08/31/2002  Paul Hunt      Added PERTONE_EQ and HYBRID_SWITCH for ar0700mp
19983 +//*           09/12/2002  Paul Hunt      Added support for ar0700db target.
19984 +//*           08/07/2002  U.Dasgupta     Turned off MARGIN_DELTA_RETRAIN feature for ISDN platforms
19985 +//*           11/14/2002  Paul Hunt      Merged AX5 MR6 PC modifications into AR7 codebase, specifically
19986 +//*                                      turned off MARGIN_DELTA_RETRAIN feature for ar0700db target
19987 +//*           08/26/2002  N. Warke       Added DUAL_TEQ token. Active only for Ax7 target
19988 +//*           09/26/2002  Mannering      Add token CODEC_EMU for codec emulator board
19989 +//*           10/15/2002  Iyer/Molla     Added DMT_BIS token for DELT support
19990 +//*           10/21/2002  A. Redfern     Added PHY_EC_ENABLE and PHY_PATH_ENABLE tokens
19991 +//*           10/23/2002  A. Redfern     Removed LINE_DIAG token
19992 +//*           10/28/2002  J. Bergsagel   Cleaned up old targets and cleaned up the token list
19993 +//*           10/30/2002  A. Redfern     Added PHY_TDW_ENABLE
19994 +//*           11/01/2002  A. Redfern     Removed SMART_MARGIN token
19995 +//*           11/01/2002  Mustafa        Turned on SPECTRAL_SHAPING features for Lucent AnyMedia O.69 Interop.
19996 +//*           11/15/2002  Yim/Mannering  Added CODEC_EMU token for analog emulation board specifics
19997 +//*           11/15/2002  Iyer/Molla     Added DEBUG_DELT and MEM_STR token to support DELT debug
19998 +//*           12/27/2002  Sameer V       Added ATM_TC_HW token for Sangam.
19999 +//*           01/06/2003  J. Bergsagel   Added default values for NLNOISEADJSNR, ARTT and DS_PWR_CUTBACK
20000 +//*           01/07/2003  S.Yim          Modified ar0700db_diag target to turn on ISDN token
20001 +//*           01/22/2003  J. Bergsagel   Added back in defines for the debug targets.
20002 +//*           01/21/2003  MCB            Implemented Ax7 UNIT-MODULE modular software framework.
20003 +//*           01/31/2003  J. Bergsagel   Made debug targets to be for the FPGA platform; non-debug for Sangam.
20004 +//*                                      Turned off DUAL_TEQ, PHY_EC_ENABLE and PHY_PATH_ENABLE by default
20005 +//*                                      for the Sangam (non-debug) targets.
20006 +//*                                      Turned off OLAYDP token by default.
20007 +//*                                      Turned off SWTC and turned on ATM_TC_HW by default for Sangam targets.
20008 +//*           01/29/2003  Sameer V       Added ATMBERT_HW token for Sangam.
20009 +//*           02/04/2003  D. Mannering   Added CO_PROFILE token
20010 +//*           02/19/2003  Sameer V       Added back EXTERNBERT token for ar0700mp_dp and ar0700db_dp targets.
20011 +//*                                      Disabled EXTERNBERT for debug target since it is not supported on the
20012 +//*                                      FPGA platform.
20013 +//*           02/21/2003  A. Redfern     Turned off OAM_EOC, AOC and BITSWAP (until memory issues are resolved).
20014 +//*                                      Turned on DUAL_TEQ, PHY_PATH_ENABLE and PHY_EC_ENABLE.
20015 +//*           02/21/2003  D. Mannering   Added DEBUG_DUMP.
20016 +//*           03/06/2003  J. Bergsagel   Cleaned up tokens for each target and switched diag targets
20017 +//*                                      over to the Sangam platform (instead of the FPGA platform).
20018 +//*           03/07/2003  J. Bergsagel   Cleaned up TC and BERT tokens
20019 +//*           03/11/2003  J. Bergsagel   Turned on AOC and BITSWAP for Sangam POTS and ISDN targets.
20020 +//*           03/20/2003  Mallesh        Added SHALF token.
20021 +//*           03/24/2003  F. Mujica      Enable hybrid selection
20022 +//*           03/26/2003  A. Redfern     Removed PMEMSAVE_GHS (always = 1).
20023 +//*           04/08/2003  F. Mujica      Renamed HYBRID_SWITCH token to PHY_HYB_ENABLE
20024 +//*           04/08/2003  J. Bergsagel   Turned off PHY_HYB_ENABLE for _debug targets (FPGA board builds)
20025 +//*           04/09/2003  J. Bergsagel   Turned on OLAYDP only for ar0700mp and ar0700db.
20026 +//*                                      Turned on AOC, BITSWAP, and OAM_EOC for ar0700mp and ar0700db.
20027 +//*           04/09/2003  J. Bergsagel   Corrected name "PHY_HYB_SELECT" to "PHY_HYB_ENABLE"
20028 +//*           04/15/2003  A. Redfern     Turned on ECI_PULSECOM_INTEROP because phase optimization was enabled.
20029 +//*           05/05/2003  D. Mannering   Review Comments - turn on AOC, EXTERNBERT, SHALF, for ar0700mp; amd
20030 +//*                                      turn on AOC for ar0700db
20031 +//*           05/11/2003  Prashant S     Added DMT_BIS token for AR7 Soft DI work
20032 +//*           05/13/2003  J. Bergsagel   Turned on IMPROVED_STAT_SUPPORT_06_03_00 by default for necessary statistics
20033 +//*           05/15/2003  J. Bergsagel   Turned off CO_PROFILE for diag targets.
20034 +//*           05/27/2003  U.Dasgupta     Added NLNOISEADJSNR_EC token for ISDN - to take care of non-linear noise
20035 +//*                                      (from ISDN splitter) compensation.
20036 +//*           06/02/2003  Z. Yang        Added PHY_NDIAG_ENABLE token.
20037 +//*           06/02/2003  Z. Yang        Added COMB_LINEDIAG_ENABLE token.
20038 +//*           06/05/2003  P. Hunt        Turned on ATUC_CLEARDOWN_CHANGE token for all targets.
20039 +//*           06/05/2003  Mallesh        Turned on CENTILLIUM_VENDORID_AND_TXRATE_CHNG to enable logging the vendor ID
20040 +//*                                      for centillium and litespan
20041 +//*           06/05/2003  U.Dasgupta     Turned on SHALF token for ISDN.
20042 +//*           06/06/2003  U.Dasgupta     Turned on G.hs nonstandard field token for ar0700db target.
20043 +//*           06/12/2003  J. Bergsagel   Changed *_debug targets to be for JTAG=1 instead of FPGA targets
20044 +//*                                      IMPORTANT: For non-JTAG cases, "JTAG" should be undefined.
20045 +//*                                      Therefore, "JTAG" should not have a default case at the bottom (JTAG 0)
20046 +//*           06/18/2003  A. Redfern     Turned on spectral shaping token for all targets.
20047 +//*           06/23/2003  J. Bergsagel   Turned off GHS_NON_STD_FIELD token for ar0700db until bugs are fixed.
20048 +//*           06/23/2003  U G Jani       Undid the above change since the bug is fixed.
20049 +//*           06/27/2003  Mallesh        Removed all the interop tokens which are no longer required.
20050 +//*           08/20/2003  J. Bergsagel   Added default value for OVHD_PMDTEST_PARA and put default section
20051 +//*                                      tokens in alphabetical order.
20052 +//*           10/09/2003  Hanyu Liu      Defined token ADSL2_1BIT_TONE to support Rx one bit constellation.
20053 +//*           10/12/2003  Hanyu Liu      Defined token ADSL2_BSWP for bitswap.
20054 +//*           10/20/2003  Xiaohui Li     Added READSL2_ENABLE token.
20055 +//*           12/01/2003  Seungmok Oh    Added TXDF2B_PROFILING token, which is active only for POTS target.
20056 +//*           12/09/2003  Jack Huang     Turned on GHS_NON_STD_FIELD support for AR7 POTS targets
20057 +//*           12/16/2003  Mustafa T.     Added the necessary definitions for diag target.  
20058 +//*****************************************************************************************************
20059 +//*
20060 +//* The default flag settings are:
20061 +//*
20062 +//*   -dATUC=1 -dSTD=0 -dISDN=0 -dTIPCI=0 -dTID=0 -dTII=0 -dAI=0
20063 +//*   -dEVM2=0 -dEU=0 -dSL=0 -dSL_EVM=1 -dGLITE=0
20064 +//*
20065 +//* and are set after all the per-suffix options have had a chance to
20066 +//* set them.  Each flag is only set if it has not previously been set, so
20067 +//* per-suffix settings  can override defaults, and command-line defines can
20068 +//* override per-suffix settings.
20069 +//*
20070 +//*****************************************************************************
20071 +
20072 +
20073 +//* ===========================================================================
20074 +//*   Suffix codes
20075 +//*     The command-line can include -dOBJSFX_xxx to get a flag set
20076 +//*     instead of explicitly setting each flag on each CC/ASM command-line.
20077 +//*     and the object suffix will control the settings of "feature" constants.
20078 +//* ===========================================================================
20079 +//
20080 +//* ===========================================================================
20081 +//   Flag settings for new suffixes (in alphabetical order of suffix)
20082 +//     Each suffix has to specify only those flags which differ from the
20083 +//     default settings.
20084 +//* ===========================================================================
20085 +//  NOTE: Try to keep feature flags in alphabetical order to ease maintenance.
20086 +//* ===========================================================================
20087 +//*
20088 +
20089 +#define CHIPSET_ID_UNKN '?'
20090 +#define CHIPSET_ID_AH   'H'
20091 +#define CHIPSET_ID_AP   'P'
20092 +#define CHIPSET_ID_AR   'R'
20093 +#define CHIPSET_ID_ARV  'R'
20094 +#define CHIPSET_ID_AT   'T'
20095 +#define CHIPSET_ID_AU   'U'
20096 +
20097 +#define CHIPSET_ID2_GENERIC '0'
20098 +#define CHIPSET_ID2_ARV  'R'
20099 +
20100 +  #define DSPDP_IMAGE_ID_STANDARD(code) ( \
20101 +      STANDARD_is_MULTIMODE(code) ? "M" : \
20102 +      STANDARD_is_GDMT(code)      ? "D" : \
20103 +      STANDARD_is_GLITE(code)     ? "L" : \
20104 +      STANDARD_is_T1413(code)     ? "T" : "_")
20105 +
20106 +  #define DSPDP_IMAGE_ID_SERVICE(code)  ( \
20107 +      SERVICE_is_POTS(code)        ? "P" : \
20108 +      SERVICE_is_ISDN_ANNEXB(code) ? "B" : \
20109 +      SERVICE_is_ISDN_ANNEXC(code) ? "C" : \
20110 +      SERVICE_is_ISDN_PROP(code)   ? "I" : "")
20111 +
20112 +// Bit-codes for feature byte in new version.
20113 +//
20114 +// 0000 0000
20115 +// |||| ||||
20116 +// |||| |||+ -- POTS
20117 +// |||| ||+---- ISDN_ANNEXB
20118 +// |||| |+----- ISDN_ANNEXC
20119 +// |||| +------ ISDN_PROP
20120 +// |||+--------
20121 +// ||+--------- GHS
20122 +// |+---------- GLITE
20123 +// +----------- T1413
20124 +//
20125 +//
20126 +#define FEATURE_BIT_T1413       0x80
20127 +#define FEATURE_BIT_GLITE       0x40
20128 +#define FEATURE_BIT_GHS         0x20
20129 +#define FEATURE_BIT_ISDN_PROP   0x08
20130 +#define FEATURE_BIT_ISDN_ANNEXC 0x04
20131 +#define FEATURE_BIT_ISDN_ANNEXB 0x02
20132 +#define FEATURE_BIT_POTS        0x01
20133 +
20134 +#define STANDARD_BITS_MASK      (FEATURE_BIT_T1413 | FEATURE_BIT_GLITE | FEATURE_BIT_GHS)
20135 +#define STANDARD_BITS_T1413      FEATURE_BIT_T1413
20136 +#define STANDARD_BITS_GHS        FEATURE_BIT_GHS
20137 +#define STANDARD_BITS_GLITE     (FEATURE_BIT_GLITE | FEATURE_BIT_GHS)
20138 +#define STANDARD_BITS_GDMT      (STANDARD_BITS_T1413 | STANDARD_BITS_GHS)
20139 +#define STANDARD_BITS_MULTIMODE (STANDARD_BITS_T1413 | STANDARD_BITS_GLITE | STANDARD_BITS_GDMT)
20140 +
20141 +#define SERVICE_BIT_ISDN_ANNEXB  FEATURE_BIT_ISDN_ANNEXB
20142 +#define SERVICE_BIT_ISDN_ANNEXC  FEATURE_BIT_ISDN_ANNEXC
20143 +#define SERVICE_BIT_ISDN_PROP    FEATURE_BIT_ISDN_PROP
20144 +#define SERVICE_BIT_POTS         FEATURE_BIT_POTS
20145 +
20146 +//
20147 +//  Debug new-style suffixes
20148 +//
20149 +//
20150 +
20151 +#if defined(OBJSFX_ar0700db_debugobj)
20152 +#ifndef OBJSFX_ar0700dbobj
20153 +#define OBJSFX_ar0700dbobj 1
20154 +#endif
20155 +// Here, in alphabetic order, are the feature tokens that
20156 +// distinguish this suffix from its non-_debug partner:
20157 +// (All other tokens from the non-_debug partner that are non-conflicting will also be picked up)
20158 +
20159 +#ifndef JTAG
20160 +#define JTAG 1
20161 +#endif
20162 +
20163 +#elif defined(OBJSFX_ar0700mp_debugobj)
20164 +#ifndef OBJSFX_ar0700mpobj
20165 +#define OBJSFX_ar0700mpobj 1
20166 +#endif
20167 +// Here, in alphabetic order, are the feature tokens that
20168 +// distinguish this suffix from its non-_debug partner:
20169 +// (All other tokens from the non-_debug partner that are non-conflicting will also be picked up)
20170 +
20171 +#ifndef ADSL2_BSWP
20172 +#define ADSL2_BSWP 1 
20173 +#endif
20174 +#ifndef AOC 
20175 +#define AOC 1 
20176 +#endif
20177 +#ifndef BITSWAP
20178 +#define BITSWAP 1 
20179 +#endif
20180 +#ifndef DEBUG_ADSL2
20181 +#define DEBUG_ADSL2  0
20182 +#endif
20183 +#ifndef DEBUG_LOG 
20184 +#define DEBUG_LOG 0 
20185 +#endif
20186 +#ifndef GHS_NON_STD_FIELD
20187 +#define GHS_NON_STD_FIELD 1
20188 +#endif
20189 +#ifndef JTAG
20190 +#define JTAG 1
20191 +#endif
20192 +#endif  // end of the series of "#elif defined" for debug targets
20193 +
20194 +
20195 +//
20196 +//  Standard new-style suffixes for operational and mfgr'ing diag.
20197 +//
20198 +
20199 +#if defined(OBJSFX_ar0700dbobj)
20200 +#define CHIPSET_AR07    1
20201 +#define PLATFORM_AR0700 1
20202 +#define DSPDP_CHIPSET_ID      CHIPSET_ID_AR
20203 +#define DSPDP_CHIPSET_ID2     CHIPSET_ID2_GENERIC
20204 +#define DSPDP_CHIPSET_GEN     7
20205 +#define DSPDP_HARDWARE_REV1   '0'
20206 +#define DSPDP_HARDWARE_REV2   '0'
20207 +#define DSPDP_FEATURE_CODE   (STANDARD_BITS_GDMT|SERVICE_BIT_ISDN_ANNEXB)
20208 +#ifndef AOC
20209 +#define AOC 1
20210 +#endif
20211 +// ATM_TC_HW and SWTC are mutually exclusive
20212 +#ifndef ATM_TC_HW
20213 +#define ATM_TC_HW 1
20214 +#endif
20215 +#ifndef SWTC
20216 +#define SWTC 0
20217 +#endif
20218 +#ifndef BITSWAP
20219 +#define BITSWAP 1
20220 +#endif
20221 +#ifndef EXTERNBERT
20222 +#define EXTERNBERT 0
20223 +#endif
20224 +#ifndef GHS_NON_STD_FIELD
20225 +#define GHS_NON_STD_FIELD 1
20226 +#endif
20227 +#ifndef MARGIN_DELTA_RETRAIN
20228 +#define MARGIN_DELTA_RETRAIN 0
20229 +#endif
20230 +#ifndef NLNOISEADJSNR_EC
20231 +#define NLNOISEADJSNR_EC 1
20232 +#endif
20233 +#ifndef OLAYDP
20234 +#define OLAYDP 1
20235 +#endif
20236 +#ifndef SHALF
20237 +#define SHALF 1
20238 +#endif
20239 +
20240 +
20241 +#elif defined(OBJSFX_ar0700db_diagobj)
20242 +#define CHIPSET_AR07    1
20243 +#define PLATFORM_AR0700 1
20244 +#define DSPDP_CHIPSET_ID      CHIPSET_ID_AR
20245 +#define DSPDP_CHIPSET_ID2     CHIPSET_ID2_GENERIC
20246 +#define DSPDP_CHIPSET_GEN     7
20247 +#define DSPDP_HARDWARE_REV1   '0'
20248 +#define DSPDP_HARDWARE_REV2   '0'
20249 +#define DSPDP_FEATURE_CODE   (STANDARD_BITS_GDMT|SERVICE_BIT_ISDN_ANNEXB)
20250 +#ifndef AOC
20251 +#define AOC 0
20252 +#endif
20253 +// ATM_TC_HW and SWTC are mutually exclusive (or both must be off)
20254 +#ifndef ATM_TC_HW
20255 +#define ATM_TC_HW 0
20256 +#endif
20257 +#ifndef SWTC
20258 +#define SWTC 0
20259 +#endif
20260 +#ifndef BITSWAP
20261 +#define BITSWAP 0
20262 +#endif
20263 +#ifndef CO_PROFILE
20264 +#define CO_PROFILE 0
20265 +#endif
20266 +#ifndef MARGIN_DELTA_RETRAIN
20267 +#define MARGIN_DELTA_RETRAIN 0
20268 +#endif
20269 +#ifndef MFGR_DIAG
20270 +#define MFGR_DIAG 1
20271 +#endif
20272 +#ifndef OAM_EOC
20273 +#define OAM_EOC 0
20274 +#endif
20275 +#ifndef OLAYDP
20276 +#define OLAYDP 0
20277 +#endif
20278 +#ifndef SNR_UPDATE
20279 +#define SNR_UPDATE 0
20280 +#endif
20281 +
20282 +#elif defined(OBJSFX_ar0700mpobj)
20283 +#define CHIPSET_AR07    1
20284 +#define PLATFORM_AR0700 1
20285 +#define DSPDP_CHIPSET_ID      CHIPSET_ID_AR
20286 +#define DSPDP_CHIPSET_ID2     CHIPSET_ID2_GENERIC
20287 +#define DSPDP_CHIPSET_GEN     7
20288 +#define DSPDP_HARDWARE_REV1   '0'
20289 +#define DSPDP_HARDWARE_REV2   '0'
20290 +#define DSPDP_FEATURE_CODE   (STANDARD_BITS_MULTIMODE|SERVICE_BIT_POTS)
20291 +#ifndef AOC
20292 +#define AOC 1
20293 +#endif
20294 +// ATM_TC_HW and SWTC are mutually exclusive
20295 +#ifndef ADSL2_1BIT_TONE
20296 +#define ADSL2_1BIT_TONE 0
20297 +#endif
20298 +#ifndef ADSL2_BSWP
20299 +#define ADSL2_BSWP 1 
20300 +#endif
20301 +#ifndef ATM_TC_HW
20302 +#define ATM_TC_HW 1
20303 +#endif
20304 +#ifndef SWTC
20305 +#define SWTC 0
20306 +#endif
20307 +#ifndef BITSWAP
20308 +#define BITSWAP 1
20309 +#endif
20310 +#ifndef EXTERNBERT
20311 +#define EXTERNBERT 0
20312 +#endif
20313 +#ifndef OLAYDP
20314 +#define OLAYDP 1
20315 +#endif
20316 +#ifndef DMT_BIS
20317 +#define DMT_BIS 1 
20318 +#endif
20319 +#ifndef SHALF
20320 +#define SHALF 1 
20321 +#endif
20322 +#ifndef MEM_STR
20323 +#define MEM_STR 0
20324 +#endif
20325 +#ifndef DS_LOOP_BACK
20326 +#define DS_LOOP_BACK 0
20327 +#endif
20328 +#ifndef LOOP_BACK_DEBUG
20329 +#define LOOP_BACK_DEBUG 0
20330 +#endif
20331 +#ifndef US_LOOP_BACK
20332 +#define US_LOOP_BACK 0
20333 +#endif
20334 +#ifndef OVHD_PMDTEST_PARA
20335 +#define OVHD_PMDTEST_PARA 0
20336 +#endif
20337 +#ifndef DS_RX_CODEWORD
20338 +#define DS_RX_CODEWORD 1 
20339 +#endif
20340 +#ifndef READSL2_ENABLE
20341 +#define READSL2_ENABLE 1
20342 +#endif
20343 +#ifndef GHS_NON_STD_FIELD
20344 +#define GHS_NON_STD_FIELD 1
20345 +#endif
20346 +
20347 +#elif defined(OBJSFX_ar0700mp_diagobj)
20348 +#define CHIPSET_AR07    1
20349 +#define PLATFORM_AR0700 1
20350 +#define DSPDP_CHIPSET_ID      CHIPSET_ID_AR
20351 +#define DSPDP_CHIPSET_ID2     CHIPSET_ID2_GENERIC
20352 +#define DSPDP_CHIPSET_GEN     7
20353 +#define DSPDP_HARDWARE_REV1   '0'
20354 +#define DSPDP_HARDWARE_REV2   '0'
20355 +#define DSPDP_FEATURE_CODE   (STANDARD_BITS_MULTIMODE|SERVICE_BIT_POTS)
20356 +#ifndef ADSL2_BSWP
20357 +#define ADSL2_BSWP 0
20358 +#endif
20359 +#ifndef AOC
20360 +#define AOC 0
20361 +#endif
20362 +// ATM_TC_HW and SWTC are mutually exclusive (or both must be off)
20363 +#ifndef ATM_TC_HW
20364 +#define ATM_TC_HW 0
20365 +#endif
20366 +#ifndef SWTC
20367 +#define SWTC 0
20368 +#endif
20369 +#ifndef BITSWAP
20370 +#define BITSWAP 0
20371 +#endif
20372 +#ifndef CO_PROFILE
20373 +#define CO_PROFILE 0
20374 +#endif
20375 +#ifndef DMT_BIS
20376 +#define DMT_BIS 0
20377 +#endif
20378 +#ifndef MARGIN_DELTA_RETRAIN
20379 +#define MARGIN_DELTA_RETRAIN 0
20380 +#endif
20381 +#ifndef MFGR_DIAG
20382 +#define MFGR_DIAG 1
20383 +#endif
20384 +#ifndef OAM_EOC
20385 +#define OAM_EOC 0
20386 +#endif
20387 +#ifndef OLAYDP
20388 +#define OLAYDP 0
20389 +#endif
20390 +#ifndef SNR_UPDATE
20391 +#define SNR_UPDATE 0
20392 +#endif
20393 +#ifndef US_CRC_RETRAIN
20394 +#define US_CRC_RETRAIN 0
20395 +#endif
20396 +#ifndef ADSL2_BSWP
20397 +#define ADSL2_BSWP 0
20398 +#endif
20399 +#ifndef DMT_BIS
20400 +#define DMT_BIS  0
20401 +#endif
20402 +#ifndef DS_RX_CODEWORD
20403 +#define DS_RX_CODEWORD 0
20404 +#endif
20405 +
20406 +#else
20407 +#define DSPDP_CHIPSET_ID      CHIPSET_ID_UNKN
20408 +#define DSPDP_CHIPSET_ID2     CHIPSET_ID2_GENERIC
20409 +#define DSPDP_CHIPSET_GEN     0
20410 +#define DSPDP_HARDWARE_REV1   '0'
20411 +#define DSPDP_HARDWARE_REV2   '0'
20412 +#define DSPDP_FEATURE_CODE    0
20413 +#endif
20414 +
20415 +// For use in checking the code in drivers -- indented to avoid .h->.ah
20416 + #define STANDARD_is_T1413(code)      (!(((code) & STANDARD_BITS_MASK) ^  STANDARD_BITS_T1413))
20417 + #define STANDARD_is_GLITE(code)      (!(((code) & STANDARD_BITS_MASK) ^  STANDARD_BITS_GLITE))
20418 + #define STANDARD_is_GHS(code)          (((code) & STANDARD_BITS_MASK) &  STANDARD_BITS_GHS)
20419 + #define STANDARD_is_GDMT(code)       (!(((code) & STANDARD_BITS_MASK) ^ (STANDARD_BITS_T1413 | STANDARD_BITS_GHS)))
20420 + #define STANDARD_is_MULTIMODE(code)  (!(((code) & STANDARD_BITS_MASK) ^ (STANDARD_BITS_T1413 | STANDARD_BITS_GLITE | STANDARD_BITS_GDMT)))
20421 + #define SERVICE_is_POTS(code)           ((code) & SERVICE_BIT_POTS)
20422 + #define SERVICE_is_ISDN_ANNEXB(code)    ((code) & SERVICE_BIT_ISDN_ANNEXB)
20423 + #define SERVICE_is_ISDN_ANNEXC(code)    ((code) & SERVICE_BIT_ISDN_ANNEXC)
20424 + #define SERVICE_is_ISDN_PROP(code)      ((code) & SERVICE_BIT_ISDN_PROP)
20425 +
20426 +#define STANDARD_T1413     (!((DSPDP_FEATURE_CODE & STANDARD_BITS_MASK) ^  STANDARD_BITS_T1413))
20427 +#define STANDARD_GLITE     (!((DSPDP_FEATURE_CODE & STANDARD_BITS_MASK) ^  STANDARD_BITS_GLITE))
20428 +#define STANDARD_GHS         ((DSPDP_FEATURE_CODE & STANDARD_BITS_MASK) &  STANDARD_BITS_GHS)
20429 +#define STANDARD_GDMT      (!((DSPDP_FEATURE_CODE & STANDARD_BITS_MASK) ^ (STANDARD_BITS_T1413 | STANDARD_BITS_GHS)))
20430 +#define STANDARD_MULTIMODE (!((DSPDP_FEATURE_CODE & STANDARD_BITS_MASK) ^ (STANDARD_BITS_T1413 | STANDARD_BITS_GLITE | STANDARD_BITS_GDMT)))
20431 +
20432 +#define SERVICE_POTS        (DSPDP_FEATURE_CODE & SERVICE_BIT_POTS)
20433 +#define SERVICE_ISDN_ANNEXB (DSPDP_FEATURE_CODE & SERVICE_BIT_ISDN_ANNEXB)
20434 +#define SERVICE_ISDN_ANNEXC (DSPDP_FEATURE_CODE & SERVICE_BIT_ISDN_ANNEXC)
20435 +#define SERVICE_ISDN_PROP   (DSPDP_FEATURE_CODE & SERVICE_BIT_ISDN_PROP)
20436 +#define SERVICE_ISDN        (SERVICE_ISDN_ANNEXB | SERVICE_ISDN_ANNEXC | SERVICE_ISDN_PROP)
20437 +
20438 +
20439 +//
20440 +//  Backwards compatibility with old tokens
20441 +//
20442 +
20443 +#if (SERVICE_POTS)
20444 +#ifndef ISDN
20445 +#define ISDN 0
20446 +#endif
20447 +#endif
20448 +
20449 +#if (SERVICE_ISDN_ANNEXB | SERVICE_ISDN_PROP)
20450 +#ifndef ISDN
20451 +#define ISDN 1
20452 +#endif
20453 +#endif
20454 +
20455 +
20456 +//
20457 +//* ===========================================================================
20458 +//  More Default settings
20459 +//* ===========================================================================
20460 +//
20461 +
20462 +//
20463 +//  BEGIN Could automatically generate showdefs code
20464 +//
20465 +#ifndef AOC
20466 +#define AOC 1
20467 +#endif
20468 +#ifndef ARTT
20469 +#define ARTT 0
20470 +#endif
20471 +#ifndef ATMBERT
20472 +#define ATMBERT 0
20473 +#endif
20474 +// ATM_TC_HW and SWTC are mutually exclusive
20475 +#ifndef ATM_TC_HW
20476 +#define ATM_TC_HW 1
20477 +#endif
20478 +#if ATM_TC_HW
20479 +#ifndef ATMBERT_HW
20480 +#define ATMBERT_HW 1
20481 +#endif
20482 +#ifndef SWTC
20483 +#define SWTC 0
20484 +#endif
20485 +#else // else case for #if ATM_TC_HW
20486 +#ifndef ATMBERT_HW
20487 +#define ATMBERT_HW 0
20488 +#endif
20489 +#ifndef SWTC
20490 +#define SWTC 1
20491 +#endif
20492 +#endif // end of #if ATM_TC_HW
20493 +#ifndef ATM_TC_PATH1_ON
20494 +#define ATM_TC_PATH1_ON 0
20495 +#endif
20496 +#ifndef BITSWAP
20497 +#define BITSWAP 1
20498 +#endif
20499 +#ifndef COMB_LINEDIAG_ENABLE
20500 +#define COMB_LINEDIAG_ENABLE  0
20501 +#endif
20502 +#ifndef CODEC_EMU
20503 +#define CODEC_EMU 0
20504 +#endif
20505 +#ifndef CO_PROFILE
20506 +#define CO_PROFILE 1
20507 +#endif
20508 +#ifndef DDC
20509 +#define DDC 0
20510 +#endif
20511 +#ifndef DEBUG_ADSL2
20512 +#define DEBUG_ADSL2 0 
20513 +#endif
20514 +#ifndef DEBUG_DUMP
20515 +#define DEBUG_DUMP 0
20516 +#endif
20517 +#ifndef DEBUG_LOG
20518 +#define DEBUG_LOG 0
20519 +#endif
20520 +#ifndef DEV_DEBUG
20521 +#define DEV_DEBUG 0
20522 +#endif
20523 +#ifndef DS_LOOP_BACK
20524 +#define DS_LOOP_BACK 0
20525 +#endif
20526 +#ifndef DS_RX_CODEWORD
20527 +#define DS_RX_CODEWORD 1
20528 +#endif
20529 +#ifndef LOOP_BACK_DEBUG
20530 +#define LOOP_BACK_DEBUG 0
20531 +#endif
20532 +#ifndef US_LOOP_BACK
20533 +#define US_LOOP_BACK 0
20534 +#endif
20535 +#ifndef DPLL_MODE
20536 +#define DPLL_MODE 0
20537 +#endif
20538 +#ifndef DSPBIOSII
20539 +#define DSPBIOSII 0
20540 +#endif
20541 +#ifndef DMT_BIS
20542 +#define DMT_BIS 1
20543 +#endif
20544 +#ifndef ADSL2_1BIT_TONE
20545 +#define ADSL2_1BIT_TONE 0
20546 +#endif
20547 +#ifndef ADSL2_BSWP
20548 +#define ADSL2_BSWP 1
20549 +#endif
20550 +#ifndef MEM_STR
20551 +#define MEM_STR 0
20552 +#endif
20553 +#ifndef DS_PWR_CUTBACK
20554 +#define DS_PWR_CUTBACK 0
20555 +#endif
20556 +#ifndef DUAL_TEQ
20557 +#define DUAL_TEQ 1
20558 +#endif
20559 +#ifndef EXTERNBERT
20560 +#define EXTERNBERT 0
20561 +#endif
20562 +#ifndef FPGA
20563 +#define FPGA 0
20564 +#endif
20565 +#ifndef INBAND
20566 +#define INBAND 0
20567 +#endif
20568 +#ifndef ISDN
20569 +#define ISDN 0
20570 +#endif
20571 +#ifndef ISDN_DEBUG
20572 +#define ISDN_DEBUG 0
20573 +#endif
20574 +#ifndef LINE_DIAG
20575 +#define LINE_DIAG 1
20576 +#endif
20577 +#ifndef LOOP_BACK_DEBUG
20578 +#define LOOP_BACK_DEBUG 0
20579 +#endif
20580 +#ifndef MANUFACTURING_TESTS
20581 +#define MANUFACTURING_TESTS 0
20582 +#endif
20583 +#ifndef MARGIN_DELTA_RETRAIN
20584 +#define MARGIN_DELTA_RETRAIN 1
20585 +#endif
20586 +#ifndef MEM_STR
20587 +#define MEM_STR 0
20588 +#endif
20589 +#ifndef MFGR_DIAG
20590 +#define MFGR_DIAG 0
20591 +#endif
20592 +#ifndef NLNOISEADJSNR
20593 +#define NLNOISEADJSNR 0
20594 +#endif
20595 +#ifndef NLNOISEADJSNR_EC
20596 +#define NLNOISEADJSNR_EC 0
20597 +#endif
20598 +#ifndef NTR_MODE
20599 +#define NTR_MODE 0
20600 +#endif
20601 +#ifndef OAM_EOC
20602 +#define OAM_EOC 1
20603 +#endif
20604 +#ifndef OLAYDP
20605 +#define OLAYDP 0
20606 +#endif
20607 +#ifndef OLAYDP_EMIF
20608 +#define OLAYDP_EMIF 0
20609 +#endif
20610 +#ifndef OLAYDP_2STEP
20611 +#define OLAYDP_2STEP 0
20612 +#endif
20613 +#ifndef OLAYDP_PCI
20614 +#define OLAYDP_PCI 0
20615 +#endif
20616 +#ifndef OUTBAND
20617 +#define OUTBAND 0
20618 +#endif
20619 +#ifndef OVHD_PMDTEST_PARA
20620 +#define OVHD_PMDTEST_PARA 0
20621 +#endif
20622 +#ifndef PERTONE_EQ
20623 +#define PERTONE_EQ 0
20624 +#endif
20625 +#ifndef PHY_EC_ENABLE
20626 +#define PHY_EC_ENABLE 1
20627 +#endif
20628 +#ifndef PHY_HYB_ENABLE
20629 +#define PHY_HYB_ENABLE 1
20630 +#endif
20631 +#ifndef PHY_NDIAG_ENABLE
20632 +#define PHY_NDIAG_ENABLE 0
20633 +#endif
20634 +#ifndef PHY_PATH_ENABLE
20635 +#define PHY_PATH_ENABLE 1
20636 +#endif
20637 +#ifndef PHY_TDW_ENABLE
20638 +#define PHY_TDW_ENABLE 0
20639 +#endif
20640 +#ifndef TC_ATM_PCIMASTER
20641 +#define TC_ATM_PCIMASTER 0
20642 +#endif
20643 +#ifndef SEPARATE_TX_RX_BUFFERS
20644 +#define SEPARATE_TX_RX_BUFFERS 0
20645 +#endif
20646 +#ifndef SHALF
20647 +#define SHALF 0
20648 +#endif
20649 +#ifndef SPECTRAL_SHAPING
20650 +#define SPECTRAL_SHAPING 1
20651 +#endif
20652 +#ifndef SNR_UPDATE
20653 +#define SNR_UPDATE 1
20654 +#endif
20655 +#ifndef TC_DEBUG
20656 +#define TC_DEBUG 0
20657 +#endif
20658 +#ifndef TC_LOOPBACK
20659 +#define TC_LOOPBACK 0
20660 +#endif
20661 +#ifndef TESTMODE
20662 +#define TESTMODE 0
20663 +#endif
20664 +#ifndef TRELLIS
20665 +#define TRELLIS 1
20666 +#endif
20667 +#ifndef TXDF2B_PROFILING
20668 +#if (SERVICE_POTS & (!MFGR_DIAG) & (CO_PROFILE))
20669 +#define TXDF2B_PROFILING 1
20670 +#else
20671 +#define TXDF2B_PROFILING 0
20672 +#endif
20673 +#endif
20674 +#ifndef US_CRC_RETRAIN
20675 +#define US_CRC_RETRAIN 1
20676 +#endif
20677 +#ifndef US_LOOP_BACK
20678 +#define US_LOOP_BACK 0
20679 +#endif
20680 +#ifndef USB
20681 +#define USB 0
20682 +#endif
20683 +#ifndef READSL2_ENABLE
20684 +#define READSL2_ENABLE 1
20685 +#endif
20686 +
20687 +// Interop tokens
20688 +#ifndef GHS_NON_STD_FIELD
20689 +#define GHS_NON_STD_FIELD 0
20690 +#endif
20691 +#ifndef LUCENT_ANYMEDIA_ENIATT_INTEROP
20692 +#define LUCENT_ANYMEDIA_ENIATT_INTEROP 0
20693 +#endif
20694 +
20695 +
20696 +//
20697 +//  END Could automatically generate showdefs code
20698 +//
20699 +#if DSPDP_FEATURE_CODE
20700 +#else
20701 +// Unrecognized_suffix____check_spelling
20702 +#endif
20703 +//
20704 +//  LNK_CMD is set when running CPP to generate lnk_cpe.cmd file
20705 +//  -- the linker is not happy when it sees C code show up in the
20706 +//  result!
20707 +//
20708 +#ifndef LNK_CMD
20709 +extern int compile_happy;  // Keep the compiler from complaining about an empty file
20710 +#endif
20711 +
20712 +#endif
20713 +
20714 diff -urN linux.old/drivers/atm/sangam_atm/env_def_typedefs.h linux.dev/drivers/atm/sangam_atm/env_def_typedefs.h
20715 --- linux.old/drivers/atm/sangam_atm/env_def_typedefs.h 1970-01-01 01:00:00.000000000 +0100
20716 +++ linux.dev/drivers/atm/sangam_atm/env_def_typedefs.h 2005-08-23 04:46:50.104842632 +0200
20717 @@ -0,0 +1,228 @@
20718 +#ifndef __ENV_DEF_TYPEDEFS_H__
20719 +#define __ENV_DEF_TYPEDEFS_H__ 1
20720 +
20721 +/*******************************************************************************
20722 +*  FILE PURPOSE: Define data types for C and TMS320C6x C compilers
20723 +********************************************************************************
20724 +*
20725 +*  FILE NAME: dpsys_typedefs.h
20726 +*
20727 +*  DESCRIPTION:
20728 +*        This file contains the main typedefs that we need.
20729 +*
20730 +*  HISTORY:
20731 +*
20732 +*  03/11/97  Bob Lee      Created
20733 +*  03/13/97  Chishtie
20734 +*  03/14/97  Bob Lee      Format change to meet "Engineering Model
20735 +*                         - System Architucture Specification"
20736 +*                         Rev AP3.  Jan. 29, 1997
20737 +*  07/21/00  Barnett      Moved many common typedefs from
20738 +*                         host i/f header file to here.
20739 +*  03/30/01  Barnett      Mod's per driver team feedback.
20740 +*                         Some tokens cannot be def'ed
20741 +*                         if _WINDEF_ is def'ed.
20742 +*  04/05/01  Barnett      Added DSPDP_ prefix to tokens that originate
20743 +*                         in the public interface.
20744 +*  06/01/01  J. Bergsagel Modified to add standard typedefs
20745 +*  07/25/01  J. Bergsagel Changed name from typedefs.h to dpsys_typedefs.h
20746 +*  07/30/01  J. Bergsagel Moved typedefs that were conflicting with Windows
20747 +*                         driver software to the "#ifndef _WINDEF_" section.
20748 +*  08/09/01  S. Yim       Moved FALSE/TRUE definitions from ctl_interface_u.h
20749 +*                         (conflict with BIOS/std.h)
20750 +*  09/03/01  S. Yim       Do not include typedef char and float if _STD defined
20751 +*                         (conflict with BIOS/std.h)
20752 +*  01/21/03  MCB          Implemented Ax7 UNIT-MODULE modular software framework.
20753 +*  03/20/03  Mallesh      Defined size of basic variables
20754 +*  03/27/03  F. Mujica    Added SINT40 and UINT40 definitions.
20755 +*
20756 +*  (C) Copyright Texas Instruments Inc. 1997-2001.  All rights reserved.
20757 +*******************************************************************************/
20758 +
20759 +// Common type definitions
20760 +
20761 +// Basic constants needed everywhere
20762 +#ifndef STD_
20763 +#define FALSE 0
20764 +#define TRUE 1
20765 +#endif
20766 +
20767 +// Read-Write Data Types
20768 +typedef signed char           SINT8;      // Signed 8-bit integer (7-bit magnitude)
20769 +typedef unsigned char         UINT8;      // Unsigned 8-bit integer
20770 +typedef signed short          SINT16;     // Signed 16-bit integer (15-bit magnitude)
20771 +typedef unsigned short        UINT16;     // Unsigned 16-bit integer
20772 +typedef signed int            SINT32;     // Signed 32-bit integer (31-bit magnitude)
20773 +typedef unsigned int          UINT32;     // Unsigned 32-bit integer
20774 +typedef long signed int       SINT40;     // Long signed 40-bit integer
20775 +typedef long unsigned int     UINT40;     // Long unsigned 40-bit integer
20776 +
20777 +// All pointers are 32 bits long
20778 +typedef SINT8                 *PSINT8;    // Pointer to SINT8
20779 +typedef UINT8                 *PUINT8;    // Pointer to UINT8
20780 +typedef SINT16                *PSINT16;   // Pointer to SINT16
20781 +typedef UINT16                *PUINT16;   // Pointer to UINT16
20782 +typedef SINT32                *PSINT32;   // Pointer to SINT32
20783 +typedef UINT32                *PUINT32;   // Pointer to UINT32
20784 +
20785 +#define SIZEOF_SINT8          1
20786 +#define SIZEOF_UINT8          1
20787 +#define SIZEOF_SINT16         2
20788 +#define SIZEOF_UINT16         2
20789 +#define SIZEOF_SINT32         4
20790 +#define SIZEOF_UINT32         4
20791 +#define SIZEOF_SINT40         8
20792 +#define SIZEOF_UINT40         8
20793 +
20794 +// Size of Read-Write Data Types - in bytes
20795 +#define SIZEOF_char   1
20796 +#define SIZEOF_Int8   1
20797 +#define SIZEOF_UChar  1
20798 +#define SIZEOF_UInt8  1
20799 +#define SIZEOF_Float  4
20800 +#define SIZEOF_Double 8
20801 +#define SIZEOF_byte   1
20802 +
20803 +// Read-Only Data Types - should be only used for ROM code
20804 +typedef const char            CharRom;    // 8 bit signed character
20805 +typedef const signed char     Int8Rom;    // 8 bit signed integer
20806 +typedef const unsigned char   UCharRom;    // 8 bit unsigned character
20807 +typedef const unsigned char   UInt8Rom;   // 8 bit unsigned integer
20808 +typedef const float           FloatRom;   // IEEE 32-bit
20809 +typedef const double          DoubleRom;  // IEEE 64-bit
20810 +
20811 +#ifndef _WINDEF_ 
20812 +
20813 +// Read-Write Data Types
20814 +typedef signed char           Int8;       // 8 bit signed integer
20815 +typedef unsigned char         UChar;      // 8 bit unsigned character
20816 +typedef unsigned char         UInt8;      // 8 bit unsigned integer
20817 +#ifndef STD_
20818 +typedef char                  Char;       // 8 bit signed character
20819 +typedef float                 Float;      // IEEE 32-bit
20820 +#endif
20821 +typedef double                Double;     // IEEE 64-bit
20822 +typedef signed char           byte;       // 8 bit signed integer
20823 +
20824 +
20825 +// These typedefs collide with those in Win2k DDK inc\WINDEF.H
20826 +
20827 +// common type definition
20828 +typedef unsigned char   BYTE;    // 8-bit
20829 +typedef signed short    SHORT;   // 16-bit signed
20830 +typedef unsigned short  WORD;    // 16-bit
20831 +typedef unsigned int    DWORD;   // 32-bit, TI DSP has 40 bit longs
20832 +
20833 +// All pointers are 32 bits long
20834 +typedef BYTE           *PBYTE;  // pointer to 8 bit data
20835 +typedef unsigned char  *PCHAR;  // pointer to 8 bit data
20836 +typedef SHORT          *PSHORT; // pointer to 16 bit data
20837 +typedef WORD           *PWORD;  // pointer to 16 bit data
20838 +typedef DWORD          *PDWORD; // pointer to 32 bit data
20839 +
20840 +#endif // #ifndef _WINDEF_
20841 +
20842 +
20843 +#define SIZEOF_BYTE   1
20844 +#define SIZEOF_SHORT  2
20845 +#define SIZEOF_WORD   2
20846 +#define SIZEOF_DWORD  4
20847 +#define SIZEOF_PCHAR  4
20848 +#define SIZEOF_PWORD  4
20849 +#define SIZEOF_PDWORD 4
20850 +
20851 +// Size of Read-Only Data Types - in bytes
20852 +#define SIZEOF_CharRom   1
20853 +#define SIZEOF_Int8Rom   1
20854 +#define SIZEOF_UCharRom  1
20855 +#define SIZEOF_UInt8Rom  1
20856 +#define SIZEOF_FloatRom  4
20857 +#define SIZEOF_DoubleRom 8
20858 +
20859 +#define SIZEOF_complex_byte     (2*SIZEOF_byte)
20860 +#define SIZEOF_PTR_complex_byte 4
20861 +typedef struct {
20862 +  byte    re;
20863 +  byte    im;
20864 +} complex_byte, *PTR_complex_byte;
20865 +
20866 +#define SIZEOF_complex_short   4
20867 +#define SIZEOF_PTR_complex_short 4
20868 +typedef struct {
20869 +  short   re;
20870 +  short   im;
20871 +} complex_short, *PTR_complex_short;
20872 +
20873 +#define SIZEOF_complex_int     8
20874 +#define SIZEOF_PTR_complex_int 4
20875 +typedef struct {
20876 +  int     re;
20877 +  int     im;
20878 +} complex_int, *PTR_complex_int;
20879 +
20880 +typedef struct {
20881 +  int high;
20882 +  unsigned int low;
20883 +} int64;
20884 +
20885 +typedef struct {
20886 +  int64 real;
20887 +  int64 imag;
20888 +} complex_int64;
20889 +
20890 +#define SIZEOF_PVOID 4
20891 +typedef void *PVOID;            // pointer to void
20892 +
20893 +//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
20894 +
20895 +#if defined(_TMS320C6X)           // TMS320C6xx type definitions 
20896 +
20897 +// Read-Write Data Types 
20898 +typedef short                   Int16;      // 16 bit signed integer 
20899 +typedef unsigned short          UInt16;     // 16 bit unsigned integer 
20900 +typedef int                     Int32;      // 32 bit signed integer 
20901 +typedef unsigned int            UInt32;     // 32 bit unsigned signed integer 
20902 +typedef long                    Long40;     // 40 bit signed integer 
20903 +typedef unsigned long           ULong40;    // 40 bit unsigned signed integer 
20904 +
20905 +// Size of Read-Write Data Types - in bytes
20906 +#define SIZEOF_Int16   2
20907 +#define SIZEOF_UInt16  2
20908 +#define SIZEOF_Int32   4
20909 +#define SIZEOF_UInt32  4
20910 +#define SIZEOF_Long40  5
20911 +#define SIZEOF_ULong40 5
20912 +
20913 +// Read-Only Data Types - should be only used for ROM code
20914 +typedef const short             Int16Rom;   // 16 bit signed integer 
20915 +typedef const unsigned short    UInt16Rom;  // 16 bit unsigned integer 
20916 +typedef const int               Int32Rom;   // 32 bit signed integer 
20917 +typedef const unsigned int      UInt32Rom;  // 32 bit unsigned signed integer 
20918 +typedef const long              Long40Rom;  // 40 bit signed integer 
20919 +typedef const unsigned long     ULong40Rom; // 40 bit unsigned signed integer 
20920 +
20921 +// Size of Read-Only Data Types - in bytes
20922 +#define SIZEOF_Int16Rom   2
20923 +#define SIZEOF_UInt16Rom  2
20924 +#define SIZEOF_Int32Rom   4
20925 +#define SIZEOF_UInt32Rom  4
20926 +#define SIZEOF_Long40Rom  5
20927 +#define SIZEOF_ULong40Rom 5
20928 +
20929 +#else                             // 32 bits PC Host type definitions 
20930 +
20931 +// Read-Write Data Types 
20932 +typedef short                   Int16;      // 16 bit signed integer 
20933 +typedef unsigned short          UInt16;     // 16 bit unsigned integer 
20934 +typedef int                     Int32;      // 32 bit signed integer 
20935 +typedef unsigned int            UInt32;     // 32 bit unsigned integer 
20936 +
20937 +// Read-Only Data Types - should be only used for ROM code 
20938 +typedef const short             Int16Rom;   // 16 bit signed integer 
20939 +typedef const unsigned short    UInt16Rom;  // 16 bit unsigned integer 
20940 +typedef const int               Int32Rom;   // 32 bit signed integer 
20941 +typedef const unsigned int      UInt32Rom;  // 32 bit unsigned integer 
20942 +
20943 +#endif
20944 +
20945 +#endif
20946 diff -urN linux.old/drivers/atm/sangam_atm/Makefile linux.dev/drivers/atm/sangam_atm/Makefile
20947 --- linux.old/drivers/atm/sangam_atm/Makefile   1970-01-01 01:00:00.000000000 +0100
20948 +++ linux.dev/drivers/atm/sangam_atm/Makefile   2005-08-23 04:46:50.104842632 +0200
20949 @@ -0,0 +1,35 @@
20950 +# File: drivers/net/avalanche_cpmac/Makefile
20951 +#
20952 +# Makefile for the Linux network (CPMAC) device drivers.
20953 +#
20954 +
20955 +
20956 +O_TARGET := tiatm.o
20957 +obj-$(CONFIG_MIPS_SANGAM_ATM) += tiatm.o
20958 +list-multi      := tiatm.o
20959 +
20960 +tiatm-objs     := tn7atm.o tn7dsl.o tn7sar.o dsl_hal_api.o dsl_hal_support.o cpsar.o aal5sar.o
20961 +
20962 +EXTRA_CFLAGS += -DEL -I$(TOPDIR)/drivers/atm/sangam_atm -DPOST_SILICON -DCOMMON_NSP -DCONFIG_LED_MODULE -DDEREGISTER_LED -DNO_ACT
20963 +
20964 +ifeq ($(ANNEX),B)
20965 +EXTRA_CFLAGS += -DANNEX_B -DB
20966 +else
20967 +ifeq ($(ANNEX),C)
20968 +EXTRA_CFLAGS += -DANNEX_C -DC
20969 +else
20970 +EXTRA_CFLAGS += -DANNEX_A -DP
20971 +endif
20972 +endif
20973 +
20974 +
20975 +include $(TOPDIR)/Rules.make
20976 +
20977 +tiatm.o:      $(tiatm-objs)
20978 +       $(LD) -r -o $@ $(tiatm-objs)
20979 +
20980 +#avalanche_cpmac.o:      $(avalanche_cpmac-objs)
20981 +#      $(LD) -r -o $@ $(avalanche_cpmac-objs)
20982 +
20983 +clean:
20984 +       rm -f core *.o *.a *.s
20985 diff -urN linux.old/drivers/atm/sangam_atm/queue.h linux.dev/drivers/atm/sangam_atm/queue.h
20986 --- linux.old/drivers/atm/sangam_atm/queue.h    1970-01-01 01:00:00.000000000 +0100
20987 +++ linux.dev/drivers/atm/sangam_atm/queue.h    2005-08-23 04:46:50.104842632 +0200
20988 @@ -0,0 +1,167 @@
20989 +
20990 +#if !defined( __QUEUE_H__ )
20991 +#define __QUEUE_H__
20992 +
20993 +typedef spinlock_t OS_SPIN_LOCK;
20994 +#define osFreeSpinLock(pLock) while(0)
20995 +void osAcquireSpinLock(OS_SPIN_LOCK *pLock);
20996 +void osReleaseSpinLock(OS_SPIN_LOCK *pLock);
20997 +void osAllocateSpinLock(OS_SPIN_LOCK *pLock);
20998 +
20999 +//#define osAcquireSpinLock(pLock) spin_lock(pLock)
21000 +//#define osReleaseSpinLock(pLock) spin_unlock(pLock)
21001 +//#define osAllocateSpinLock(pLock) spin_lock_init(pLock)
21002 +
21003 +
21004 +typedef struct _TI_LIST_ENTRY {
21005 +  struct _TI_LIST_ENTRY *Flink;
21006 +  struct _TI_LIST_ENTRY *Blink;
21007 +} TI_LIST_ENTRY, *PTI_LIST_ENTRY, TQE, *PTQE;
21008 +
21009 +typedef struct _TIATM_LIST_ENTRY 
21010 +{
21011 +  TI_LIST_ENTRY  Link;
21012 +} TIATM_LIST_ENTRY, *PTIATM_LIST_ENTRY;
21013 +
21014 +//-------------------------------------------------------------------------
21015 +// QueueInitList -- Macro which will initialize a queue to NULL.
21016 +//-------------------------------------------------------------------------
21017 +#define QueueInitList(_L) (_L)->Link.Flink = (_L)->Link.Blink = (PTI_LIST_ENTRY)0;
21018 +
21019 +//-------------------------------------------------------------------------
21020 +// QueueEmpty -- Macro which checks to see if a queue is empty.
21021 +//-------------------------------------------------------------------------
21022 +#define QueueEmpty(_L) (QueueGetHead((_L)) == (PTIATM_LIST_ENTRY)0)
21023 +
21024 +//-------------------------------------------------------------------------
21025 +// QueueGetHead -- Macro which returns the head of the queue, but does not
21026 +// remove the head from the queue.
21027 +//-------------------------------------------------------------------------
21028 +#define QueueGetHead(_L) ((PTIATM_LIST_ENTRY)((_L)->Link.Flink))
21029 +
21030 +#define QueueGetNext(Elem) ((PTIATM_LIST_ENTRY)((Elem)->Link.Flink))
21031 +
21032 +//-------------------------------------------------------------------------
21033 +// QueuePushHead -- Macro which puts an element at the head of the queue.
21034 +//-------------------------------------------------------------------------
21035 +#define QueuePushHead(_L,_E) \
21036 +  if (!((_E)->Link.Flink = (_L)->Link.Flink)) \
21037 +  { \
21038 +    (_L)->Link.Blink = (PTI_LIST_ENTRY)(_E); \
21039 +  } \
21040 +(_L)->Link.Flink = (PTI_LIST_ENTRY)(_E);
21041 +
21042 +//-------------------------------------------------------------------------
21043 +// QueueRemoveHead -- Macro which removes the head of the head of queue.
21044 +//-------------------------------------------------------------------------
21045 +#define QueueRemoveHead(_L) \
21046 +{                                                     \
21047 +  PTIATM_LIST_ENTRY ListElem;                        \
21048 +  if (ListElem = (PTIATM_LIST_ENTRY)(_L)->Link.Flink) \
21049 +  {   \
21050 +    if(!((_L)->Link.Flink = ListElem->Link.Flink)) \
21051 +      (_L)->Link.Blink = (PTI_LIST_ENTRY) 0; \
21052 +  } \
21053 +}
21054 +
21055 +//-------------------------------------------------------------------------
21056 +// QueuePutTail -- Macro which puts an element at the tail (end) of the queue.
21057 +//-------------------------------------------------------------------------
21058 +#define QueuePutTail(_L,_E) \
21059 +{ \
21060 +  if ((_L)->Link.Blink) \
21061 +  { \
21062 +    ((PTIATM_LIST_ENTRY)(_L)->Link.Blink)->Link.Flink = (PTI_LIST_ENTRY)(_E); \
21063 +    (_L)->Link.Blink = (PTI_LIST_ENTRY)(_E); \
21064 +  } \
21065 +  else \
21066 +  { \
21067 +    (_L)->Link.Flink = \
21068 +    (_L)->Link.Blink = (PTI_LIST_ENTRY)(_E); \
21069 +  } \
21070 +  (_E)->Link.Flink = (PTI_LIST_ENTRY)0; \
21071 +}
21072 +
21073 +//-------------------------------------------------------------------------
21074 +// QueuePutTailWithLock -- Macro which puts an element at the tail (end) of 
21075 +// the queue, using spin lock.
21076 +//-------------------------------------------------------------------------
21077 +#define QueuePutTailWithLock(_L,_E, pLock) \
21078 +{ \
21079 +  osAcquireSpinLock(pLock); \
21080 +  if ((_L)->Link.Blink) \
21081 +  { \
21082 +    ((PTIATM_LIST_ENTRY)(_L)->Link.Blink)->Link.Flink = (PTI_LIST_ENTRY)(_E); \
21083 +    (_L)->Link.Blink = (PTI_LIST_ENTRY)(_E); \
21084 +  } \
21085 +  else \
21086 +  { \
21087 +    (_L)->Link.Flink = \
21088 +    (_L)->Link.Blink = (PTI_LIST_ENTRY)(_E); \
21089 +  } \
21090 +  (_E)->Link.Flink = (PTI_LIST_ENTRY)0; \
21091 +  osReleaseSpinLock(pLock); \
21092 +}
21093 +
21094 +//-------------------------------------------------------------------------
21095 +// QueueGetTail -- Macro which returns the tail of the queue, but does not
21096 +// remove the tail from the queue.
21097 +//-------------------------------------------------------------------------
21098 +#define QueueGetTail(_L) ((PTIATM_LIST_ENTRY)((_L)->Link.Blink))
21099 +
21100 +//-------------------------------------------------------------------------
21101 +// QueuePopHead -- Macro which  will pop the head off of a queue (list), and
21102 +//                 return it (this differs only from queueremovehead only in 
21103 +//                 the 1st line)
21104 +//-------------------------------------------------------------------------
21105 +#define QueuePopHead(_L) \
21106 +(PTIATM_LIST_ENTRY) (_L)->Link.Flink; QueueRemoveHead(_L);
21107 +
21108 +#define QueueRemoveTail(_L)  \
21109 +{                                                     \
21110 +  PTIATM_LIST_ENTRY ListElem;                        \
21111 +  ListElem = (PTIATM_LIST_ENTRY)(_L)->Link.Flink; \
21112 +  if(ListElem == (PTIATM_LIST_ENTRY)(_L)->Link.Blink) \
21113 +  {   \
21114 +    (_L)->Link.Flink = (_L)->Link.Blink = (PTI_LIST_ENTRY) 0; \
21115 +  } \
21116 +  else \
21117 +  {    \
21118 +    while(ListElem->Link.Flink != (PTI_LIST_ENTRY)(_L)->Link.Blink) \
21119 +    { \
21120 +      ListElem = (PTIATM_LIST_ENTRY)ListElem->Link.Flink; \
21121 +    } \
21122 +    (_L)->Link.Blink = (PTI_LIST_ENTRY) ListElem; \
21123 +    ListElem->Link.Flink = (PTI_LIST_ENTRY)0; \
21124 +  } \
21125 +}
21126 +
21127 +#define QueueRemoveItem(_L, Elem)  \
21128 +{                                                     \
21129 +  PTIATM_LIST_ENTRY ListElem;                        \
21130 +  ListElem = (PTIATM_LIST_ENTRY)(_L)->Link.Flink; \
21131 +  if(ListElem == Elem) \
21132 +  { \
21133 +    QueueRemoveHead(_L); \
21134 +  } \
21135 +  else \
21136 +  { \
21137 +    while(ListElem) \
21138 +    { \
21139 +      if(Elem == (PTIATM_LIST_ENTRY)ListElem->Link.Flink) \
21140 +      { \
21141 +        ListElem->Link.Flink = ((PTIATM_LIST_ENTRY)Elem)->Link.Flink; \
21142 +        if(Elem == (PTIATM_LIST_ENTRY)(_L)->Link.Blink) \
21143 +          (_L)->Link.Blink = (PTI_LIST_ENTRY) 0; \
21144 +        break; \
21145 +      } \
21146 +      ListElem = (PTIATM_LIST_ENTRY)ListElem->Link.Flink; \
21147 +    }\
21148 +  } \
21149 +  ((PTIATM_LIST_ENTRY)Elem)->Link.Flink = (PTI_LIST_ENTRY) 0; \
21150 +}
21151 +
21152 +#define QueuePopTail(_L)  \
21153 +((PTIATM_LIST_ENTRY)((_L)->Link.Blink)); QueueRemoveTail(_L); 
21154 +
21155 +#endif
21156 diff -urN linux.old/drivers/atm/sangam_atm/release.txt linux.dev/drivers/atm/sangam_atm/release.txt
21157 --- linux.old/drivers/atm/sangam_atm/release.txt        1970-01-01 01:00:00.000000000 +0100
21158 +++ linux.dev/drivers/atm/sangam_atm/release.txt        2005-08-23 04:46:50.104842632 +0200
21159 @@ -0,0 +1,118 @@
21160 +This is release notes for AR7 Linux ATM driver.
21161 +
21162 +version 04.02.04.00
21163 +-------------------
21164 +
21165 +1. Corrected the conditional logic from logical AND to logical OR in the case
21166 +   of check for DSL line down condition.  This is to fix PPPoA crashing
21167 +   problem when DSL line is unplugged.
21168 +
21169 +version 04.02.03.00
21170 +-------------------
21171 +1. Changed overlay page to static allocation.
21172 +2. Added flag to stop TX during channel closing.
21173 +3. Changed DMA memory allocation back to "GFP_ATOMIC" flag.
21174 +
21175 +version 04.02.02.00
21176 +-------------------
21177 +1. Changed DMA memory allocation from "GFP_ATOMIC" to  "GFP_KERNEL" flag.
21178 +2. Added "DoMask" setting for VBR channel setup.
21179 +
21180 +version 04.02.01.01
21181 +-------------------
21182 +1. Modified priority check scheme per SPTC request.
21183 +
21184 +Version 04.02.01.00
21185 +-------------------
21186 +1. Add check to skb->priority to place packets to either normal or priority queue.
21187 +2. Add spin lock to increment and decrement of queued buffer number.
21188 +
21189 +Version 04.02.00.00
21190 +-------------------
21191 +Features:
21192 +1. Add MBS and CDVT QoS support for ATM driver.
21193 +2. Add "stop/start queue" for ToS application.
21194 +3. Add Showtime margin retrain based on EOC message.
21195 +4. Add EOC vendor ID customalization logic for Annex B.
21196 +5. Supports D3 datapump.
21197 +
21198 +Version 04.01.00.00
21199 +-------------------
21200 +Re-release of 04.00.07.00 for D1.1 datapump.
21201 +
21202 +Version 04.00.07.00
21203 +-------------------
21204 +Features:
21205 +1. Add marging retrain capability by setting following Adam2 Env.
21206 +   setenv enable_margin_retrain 1
21207 +   setenv margin_threshold xx, xx is in half db, i.e., 10 means 5db.
21208 +
21209 +Bugfixs:
21210 +1. New PDSP firmware that fix the F5 OAM cell loopback probelm in Cisco DSLAM.
21211 +
21212 +Version 04.00.06.00
21213 +-------------------
21214 +1. ATM interrupt pacing is defauted to 2 interrupts/s.
21215 +2. Rx Service MAX changed ftom 16 to 8.
21216 +
21217 +Version 04.00.05.00
21218 +-------------------
21219 +Features:
21220 +1. Add Adam2 env to disable the TurboDSL by entering "setenv TurboDSL 0".
21221 +2. Add ability to set interrupt pacing for ATM driver.
21222 +
21223 +Bugfixs:
21224 +1. Fixed the RFC2684 and CLIP problems for Cisco router.
21225 +2. Fixed LED blinking problem when DSL cable is unplugged.
21226 +3. Fixed problem that "selected mode" is not updated.
21227 +
21228 +Version 04.00.04.00
21229 +-------------------
21230 +Features:
21231 +1. Added feature so OAM F5 ping will not require a corresponding PVC channel to
21232 +   be setup.
21233 +2. Added timeout value for F5 OAM ping. The new command are "exxxpyyycdzzzt" for
21234 +   end-to-end and "sxxxpyyycdzzzt" for segment. "zzz" is timeout value in milli-second.
21235 +3. Added proc entry "avsar_pvc_table" to record received VPIs and VCIs. The format is 
21236 +       vpi,vci
21237 +   seperated by new line. To search for PVCs, an application can do the following.
21238 +       i) Send a (or several) F5 OAM cell on a VPI/VPI pairs with command 
21239 +          echo exxxpyyycd2t > /proc/sys/dev/dslmod
21240 +       ii) Wait >2ms or poll proc entry /proc/avalanche/avsar_oam_ping until the result
21241 +          indicates a failure. (It will be failed all the time with 2ms timeout.)
21242 +       iii) Repeat above two steps for new VPI/VCI pairs.
21243 +      iv) Check proc entry /proc/avalanche/avsar_pvc_table any time for PVCs that responded.
21244 +  
21245 +Version 04.00.03.00
21246 +-------------------
21247 +Bug Fixs:
21248 +1. Fixed bug that caused crash when phone cable is unplugged.
21249 +2. Fixed LED operation for "flexible LEDs".
21250 +
21251 +Features:
21252 +1. Added the proc entry "avsar_oam_ping" to signal oam ping result.
21253 +   0 - failed; 1 - success; 2 - in progress.
21254 +2. Added oam ping timeout env variable. The timeout can be specified by
21255 +   adding Adam2 env "oam_lb_timeout". The value is in millisecond.
21256 +
21257 +Version 04.00.02.00
21258 +-------------------
21259 +1. The driver uses hardware queue for Turbo DSL.
21260 +2. Added new modem statistics listed below:
21261 +       US and DS TX powers, atuc Vendor ID and revision, training mode selected, 
21262 +       Hybrid Selected, and etc.
21263 +
21264 +Version 04.00.01.00
21265 +-------------------
21266 +
21267 +1. This driver release contains all the features that exists in AR5 Linux ATM 
21268 +   3.1 driver.
21269 +
21270 +2. F4 OAM generation is added.
21271 +
21272 +3. Software queuing is used for TURBO DSL.
21273 +
21274 +4. Porting guide "is created. Please look into that document for detailed 
21275 +   information.
21276 +
21277 +   
21278 diff -urN linux.old/drivers/atm/sangam_atm/syssw_version.h linux.dev/drivers/atm/sangam_atm/syssw_version.h
21279 --- linux.old/drivers/atm/sangam_atm/syssw_version.h    1970-01-01 01:00:00.000000000 +0100
21280 +++ linux.dev/drivers/atm/sangam_atm/syssw_version.h    2005-08-23 04:46:50.105842480 +0200
21281 @@ -0,0 +1,94 @@
21282 +#ifndef __SYSSW_VERSION_H__
21283 +#define __SYSSW_VERSION_H__ 1
21284 +
21285 +/*******************************************************************************
21286 +* FILE PURPOSE:     DSL Driver API functions for Sangam
21287 +*
21288 +********************************************************************************
21289 +* FILE NAME:        dsl_hal_basicapi.c
21290 +*
21291 +* DESCRIPTION:  
21292 +*       Contains basic DSL HAL APIs for Sangam
21293 +*  
21294 +* (C) Copyright 2003-04, Texas Instruments, Inc.
21295 +*    History
21296 +*    Date        Version            Notes
21297 +*    14May03     0.00.00            RamP   Original Version Created
21298 +*    14May03     0.00.01            RamP   Initial Rev numbers inserted 
21299 +*    14May03     0.00.02            RamP   Bumped version numbers for Dsl Hal
21300 +*                                          & dhalapp for alpha plus
21301 +*    19May03     0.00.03            MCB    Bumped dslhal version number
21302 +*                                          because of dependant changes
21303 +*                                          wrt. linux-nsp atm drivers.
21304 +*    22May03     0.00.04            RamP   Bumped dslhal & dhalapp buildnum
21305 +*                                          for inner/outer pair & DGASP code
21306 +*    06Jun03     0.00.05            RamP   Bumped up buildnum for LED, STM, 
21307 +*                                          interrupt processing, statistics
21308 +*                                          and other pre-beta features
21309 +*    09Jun03     0.00.06            JEB    Fixed error in DHALAPP bugfix/buildnum
21310 +*    09Jun03     0.00.07            RamP   Bumped up buildnum for incremental
21311 +*                                          changes to apis, statistics, memory
21312 +*                                          fixes, parameter configurations
21313 +*    11Jun03     0.00.08            RamP   Bumped up buildnum for Co profile
21314 +*                                          free memory fix
21315 +*    12Jun03     0.00.09            JEB    Bumped version numbers for AR7 1.00 Beta
21316 +*    02Jul03     0.00.10            ZT     Bumped HAL version for overlay page
21317 +*    18Jul03     0.00.11            RamP   Bumped HAL version for analog diags
21318 +*    22Jul03     0.00.12            JEB    Bumped DHALAPP buildnum for analog diags
21319 +*    31Jul03     0.00.13            RamP   Bumped HAL version for engr. drop
21320 +*    04Aug03     0.00.14            JEB    Bumped HAL version buildnum for CHECKPOINT65 changes
21321 +*                                          Bumped LINUX version buildnum for CHECKPOINT65 changes
21322 +*    06Aug03     0.00.15            MCB    Bumped all version numbers in prep for AR7 1.0 R2 release for POTS.
21323 +*    13Aug03     0.00.16            MCB    Set rev id's for D3/R1.1 (ADSL2).
21324 +*    21Aug03     0.00.17            JEB    Bumped up build numbers for merge of code additions from D1
21325 +*    26Sep03     0.00.18            JEB    Set rev id's for another D3/R1 (ADSL2).
21326 +*    14Oct03     0.00.19            JEB    Bumped Linux minor number and reset bugfix number for release.
21327 +*                                          Bumped build numbers on DSLHAL and DHALAPP for this checkpoint.
21328 +*    14Oct03     0.00.20            JEB    Bumped build numbers on DSLHAL and DHALAPP for CHECKPOINT15.
21329 +*    21Oct03     0.00.21            JEB    Bumped build number on DSLHAL for CHECKPOINT16.
21330 +*    22Oct03     0.00.22            MCB    Bumped all version numbers in support of D3R1 release.
21331 +*    27Oct03     0.00.23            JEB    Bumped build numbers on DSLHAL and DHALAPP for CHECKPOINT19.
21332 +*                                          Updated version for DSLAGENT to be 02.01.00.01 for ACT 2.1 R0.
21333 +*    30Oct03     0.00.24            JEB    Bumped bugfix number on LINUXATM Version for next release.
21334 +*                                          Bumped build numbers on DSLHAL and DHALAPP
21335 +*    31Oct03     0.00.25            MCB    Bumped all version numbers in support of D3R2 release.
21336 +*    14Nov03     0.00.26            JEB    Bumped build numbers on DSLHAL and DHALAPP
21337 +*                                          Changed version for DSLAGENT to be 02.00.01.01 for an ACT 2.0 R0
21338 +*    20Nov03     0.00.27            JEB    Bumped build number on DSLHAL.
21339 +*                                          Changed version for DSLAGENT to be 02.00.02.00 for the next ACT 2.0 R2
21340 +*    21Nov03     0.00.28            MCB    Bumped all version numbers in support of D3R2 release.
21341 +*    21Nov03     0.00.29            JEB    Bumped build numbers on DSLHAL and DHALAPP for D3-R0 drop on 11/21.
21342 +*    16Dec03     0.00.30            JEB    Bumped build numbers on DSLHAL and DHALAPP for CHECKPOINT31.
21343 +*    21Dec03     0.00.31            MCB    Bumped all version numbers in support of D3R2 release.
21344 +*    05Jan04     0.00.32            JEB    Bumped build numbers on DSLHAL and Linux ATM for CHECKPOINT 34.
21345 +*    15Jan04     0.00.33            JEB    Bumped build numbers on DSLHAL and Linux ATM for CHECKPOINT 36.
21346 +*    26Jan04     0.00.34            JEB    Changed Linux ATM version number to be 04.02.03.00.
21347 +*    27Jan04     0.00.35            MCB    Bumped all version numbers in support of D3R2 release.
21348 +*******************************************************************************/
21349 +
21350 +/* Dsl Hal API Version Numbers */
21351 +#define DSLHAL_VERSION_MAJOR       03
21352 +#define DSLHAL_VERSION_MINOR       00
21353 +#define DSLHAL_VERSION_BUGFIX      06
21354 +#define DSLHAL_VERSION_BUILDNUM    00
21355 +#define DSLHAL_VERSION_TIMESTAMP   00
21356 +
21357 +/* dhalapp Adam2 Application Version Numbers */
21358 +#define DHALAPP_VERSION_MAJOR      03
21359 +#define DHALAPP_VERSION_MINOR      00
21360 +#define DHALAPP_VERSION_BUGFIX     05
21361 +#define DHALAPP_VERSION_BUILDNUM   00
21362 +
21363 +/* Linux ATM Driver Version Numbers */
21364 +#define LINUXATM_VERSION_MAJOR     04
21365 +#define LINUXATM_VERSION_MINOR     02
21366 +#define LINUXATM_VERSION_BUGFIX    04
21367 +#define LINUXATM_VERSION_BUILDNUM  00
21368 +
21369 +/* DSL Agent Version Numbers */
21370 +#define DSLAGENT_VERSION_MAJOR     02
21371 +#define DSLAGENT_VERSION_MINOR     00
21372 +#define DSLAGENT_VERSION_BUGFIX    02
21373 +#define DSLAGENT_VERSION_BUILDNUM  00
21374 +
21375 +#endif /* pairs with #ifndef __SYSSW_VERSION_H__ */
21376 diff -urN linux.old/drivers/atm/sangam_atm/tn7api.h linux.dev/drivers/atm/sangam_atm/tn7api.h
21377 --- linux.old/drivers/atm/sangam_atm/tn7api.h   1970-01-01 01:00:00.000000000 +0100
21378 +++ linux.dev/drivers/atm/sangam_atm/tn7api.h   2005-08-23 04:46:50.105842480 +0200
21379 @@ -0,0 +1,54 @@
21380 +/* 
21381 + *    Tnetd73xx ATM driver.
21382 + *    by Zhicheng Tang, ztang@ti.com
21383 + *    2000 (c) Texas Instruments Inc.
21384 + *
21385 + *
21386 +*/
21387 +
21388 +#ifndef __SAPI_H
21389 +#define __SAPI_H
21390 +
21391 +/* tn7atm.c */
21392 +void xdump(unsigned char *buff, int len, int debugLev);
21393 +int tn7atm_receive(void *os_dev, int ch, unsigned int packet_size, void *os_receive_info, void *data);
21394 +void *tn7atm_allocate_rx_skb(void *os_dev, void **os_receive_info, unsigned int size);
21395 +void tn7atm_free_rx_skb(void *skb);
21396 +void tn7atm_sarhal_isr_register(void *os_dev, void *hal_isr, int interrupt_num);
21397 +int tn7atm_send_complete(void *osSendInfo);
21398 +int tn7atm_device_connect_status(void *priv, int state);
21399 +int tn7atm_lut_find(short vpi, int vci);
21400 +
21401 +/* tn7dsl.h */
21402 +void tn7dsl_exit(void);
21403 +int tn7dsl_init(void *priv);
21404 +int tn7dsl_proc_stats(char* buf, char **start, off_t offset, int count,int *eof, void *data);
21405 +int tn7dsl_proc_modem(char* buf, char **start, off_t offset, int count,int *eof, void *data);
21406 +int tn7dsl_handle_interrupt(void);
21407 +void dprintf( int uDbgLevel, char * szFmt, ...);
21408 +void tn7dsl_dslmod_sysctl_register(void);
21409 +void tn7dsl_dslmod_sysctl_unregister(void);
21410 +int tn7dsl_get_dslhal_version(char *pVer);
21411 +int tn7dsl_get_dsp_version(char *pVer);
21412 +
21413 +int os_atoi(const char *pStr);
21414 +int os_atoh(const char *pStr);
21415 +unsigned long os_atoul(const char *pStr);
21416 +
21417 +/* tn7sar.c */
21418 +int tn7sar_activate_vc(Tn7AtmPrivate *priv, short vpi, int vci, int pcr, int scr, int mbs, int cdvt, int chan, int qos);
21419 +int tn7sar_init(struct atm_dev *dev, Tn7AtmPrivate *priv);
21420 +int tn7sar_register_interrupt_handle(void *os_dev, void *hal_isr, int *interrupt_num);
21421 +void tn7sar_exit(struct atm_dev *dev, Tn7AtmPrivate *priv);
21422 +int tn7sar_deactivate_vc(Tn7AtmPrivate *priv, int chan);
21423 +int tn7sar_handle_interrupt(struct atm_dev *dev, Tn7AtmPrivate *priv);
21424 +int tn7sar_send_packet(Tn7AtmPrivate *priv, int chan, void *new_skb, void *data,unsigned int len, int priority);
21425 +void tn7sar_get_sar_version(Tn7AtmPrivate *priv, char **pVer);
21426 +int tn7sar_get_near_end_loopback_count(unsigned int *pF4count, unsigned int *pF5count);
21427 +int tn7sar_oam_generation(void *privContext, int chan, int type, int vpi, int vci, int timeout);
21428 +int tn7sar_get_stats(void *priv1);
21429 +int tn7sar_proc_sar_stat(char* buf, char **start, off_t offset, int count,int *eof, void *data);
21430 +void tn7sar_get_sar_firmware_version(unsigned int *pdsp_version_ms, unsigned int *pdsp_version_ls);
21431 +int tn7sar_proc_oam_ping(char* buf, char **start, off_t offset, int count,int *eof, void *data);
21432 +int tn7sar_proc_pvc_table(char* buf, char **start, off_t offset, int count,int *eof, void *data);
21433 +#endif
21434 diff -urN linux.old/drivers/atm/sangam_atm/tn7atm.c linux.dev/drivers/atm/sangam_atm/tn7atm.c
21435 --- linux.old/drivers/atm/sangam_atm/tn7atm.c   2005-08-28 01:52:26.000000000 -0600
21436 +++ linux.dev/drivers/atm/sangam_atm/tn7atm.c   2005-08-28 02:08:07.000000000 -0600
21437 @@ -0,0 +1,1233 @@
21438 +/* 
21439 + *   tn7.c
21440 + *   Linux atm module implementation.
21441 + *   Zhicheng Tang 01/08/2003
21442 + *   2003 (c) Texas Instruments Inc.
21443 + *
21444 + *
21445 +*/
21446 +
21447 +#include <linux/config.h>
21448 +#include <linux/kernel.h>
21449 +#include <linux/module.h>
21450 +#include <linux/init.h>
21451 +#include <linux/atmdev.h>
21452 +#include <linux/delay.h>
21453 +#include <linux/spinlock.h>
21454 +#include <linux/smp_lock.h>
21455 +#include <asm/io.h>
21456 +#include <asm/mips-boards/prom.h>
21457 +#include <linux/proc_fs.h>
21458 +#include <linux/string.h>
21459 +#include <linux/ctype.h>
21460 +#include "tn7atm.h"
21461 +#include "tn7api.h"
21462 +#include "syssw_version.h"
21463 +
21464 +#ifdef CONFIG_LED_MODULE
21465 +#include <asm/ar7/ledapp.h>
21466 +#endif
21467 +#include <asm/ar7/avalanche_intc.h>
21468 +
21469 +#ifdef MODULE
21470 +MODULE_DESCRIPTION ("Tnetd73xx ATM Device Driver");
21471 +MODULE_AUTHOR ("Zhicheng Tang");
21472 +#endif
21473 +
21474 +/* Version Information */
21475 +//static char atm_version[] ="1.0.0.1";
21476 +
21477 +#define TRUE   1
21478 +#define FALSE  0
21479 +
21480 +#define STOP_EMPTY_BUFF 2
21481 +#define START_EMPTY_BUFF 3
21482 +/* externs */
21483 +
21484 +/*end of externs */
21485 +
21486 +#define tn7atm_kfree_skb(x)     dev_kfree_skb(x)
21487 +
21488 +/* prototypes */
21489 +int tn7atm_open (struct atm_vcc *vcc, short vpi, int vci);
21490 +
21491 +void tn7atm_close (struct atm_vcc *vcc);
21492 +
21493 +static int tn7atm_ioctl (struct atm_dev *dev, unsigned int cmd, void *arg);
21494 +
21495 +int tn7atm_send (struct atm_vcc *vcc, struct sk_buff *skb);
21496 +
21497 +static int tn7atm_change_qos (struct atm_vcc *vcc, struct atm_qos *qos,int flags);
21498 +
21499 +static int tn7atm_detect(void);
21500 +static int tn7atm_init(struct atm_dev* dev);
21501 +//static int tn7atm_reset(void);
21502 +static int tn7atm_irq_request(struct atm_dev* dev);
21503 +static int tn7atm_proc_version(char* buf, char **start, off_t offset, int count,int *eof, void *data);
21504 +static void tn7atm_exit(void);
21505 +static int tn7atm_proc_channels(char* buf, char **start, off_t offset, int count,int *eof, void *data);
21506 +static int tn7atm_proc_private(char* buf, char **start, off_t offset, int count,int *eof,void *data);
21507 +//static void tn7atm_free_packet(void *vcc1, void *priv, void *skb1);
21508 +static int tn7atm_queue_packet_to_sar(void *vcc1, void *skb1);
21509 +
21510 +#include "turbodsl.c"
21511 +
21512 +/* ATM device operations */
21513 +
21514 +struct atm_dev *mydev;
21515 +
21516 +static const struct atmdev_ops tn7atm_ops = {
21517 +        open:           tn7atm_open,
21518 +        close:          tn7atm_close,
21519 +        ioctl:          tn7atm_ioctl,
21520 +        getsockopt:     NULL,
21521 +        setsockopt:     NULL,
21522 +        send:           tn7atm_send,
21523 +        sg_send:          NULL,
21524 +        phy_put:          NULL,
21525 +        phy_get:          NULL,
21526 +        change_qos:     tn7atm_change_qos,
21527 +};
21528 +
21529 +
21530 +int __guDbgLevel = 1;
21531 +
21532 +
21533 +void xdump(unsigned char *buff, int len, int debugLev)
21534 +{
21535 +#ifdef DEBUG_BUILD
21536 +  int i, j;
21537 +  if( __guDbgLevel < debugLev)
21538 +    return;
21539 +
21540 +  j=0;
21541 +  for(i=0;i<len;i++)
21542 +  {
21543 +    printk("%02x ", buff[i]);
21544 +    j++;
21545 +    if(j==8)
21546 +    {
21547 +      j=0;
21548 +      printk("\n");
21549 +    }
21550 +  }
21551 +  printk("\n");
21552 +#endif
21553 +}
21554 +
21555 +
21556 +#if 0 /* by nbd */
21557 +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
21558 + *
21559 + *  Function: int tn7atm_walk_vccs(struct atm_dev *dev, short *vcc, int *vci)
21560 + *
21561 + *  Description: retrieve VPI/VCI for connection
21562 + *
21563 + *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
21564 +static int
21565 +tn7atm_walk_vccs(struct atm_vcc *vcc, short *vpi, int *vci)
21566 +{
21567 +  struct atm_vcc* walk;
21568 +
21569 +  //    printk(tn7 "tn7atm_walk_vccs\n");
21570 +  /* find a free VPI */
21571 +  if (*vpi == ATM_VPI_ANY) {
21572 +
21573 +    for (*vpi = 0, walk = vcc->dev->vccs; walk; walk = walk->next) {
21574 +
21575 +      if ((walk->vci == *vci) && (walk->vpi == *vpi)) {
21576 +        (*vpi)++;
21577 +        walk = vcc->dev->vccs;
21578 +      }
21579 +    }
21580 +  }
21581 +
21582 +  /* find a free VCI */
21583 +  if (*vci == ATM_VCI_ANY) {
21584 +        
21585 +    for (*vci = ATM_NOT_RSV_VCI, walk = vcc->dev->vccs; walk; walk = walk->next) {
21586 +
21587 +      if ((walk->vpi = *vpi) && (walk->vci == *vci)) {
21588 +        *vci = walk->vci + 1;
21589 +        walk = vcc->dev->vccs;
21590 +      }
21591 +    }
21592 +  }
21593 +
21594 +  return 0;
21595 +}
21596 +#endif
21597 +
21598 +
21599 +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
21600 + *
21601 + *  Function: int tn7atm_sar_irq(void)
21602 + *
21603 + *  Description: tnetd73xx SAR interrupt.
21604 + *
21605 + *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
21606 +static void
21607 +tn7atm_sar_irq(int irq , void *voiddev , struct pt_regs *regs)
21608 +{
21609 +  struct atm_dev *atmdev;
21610 +  Tn7AtmPrivate *priv;
21611 +
21612 +  dprintf(6, "tn7atm_sar_irq\n");
21613 +  atmdev = (struct atm_dev *) voiddev;
21614 +  priv = (Tn7AtmPrivate *)atmdev->dev_data;
21615 +
21616 +  tn7sar_handle_interrupt(atmdev, priv);
21617
21618 +  dprintf(6, "Leaving tn7atm_sar_irq\n");
21619 +}
21620 +
21621 +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
21622 + *
21623 + *  Function: int tn7atm_dsl_irq(void)
21624 + *
21625 + *  Description: tnetd73xx DSL interrupt.
21626 + *
21627 + *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
21628 +static void
21629 +tn7atm_dsl_irq(int irq , void *voiddev , struct pt_regs *regs)
21630 +{
21631 +  struct atm_dev *atmdev;
21632 +  Tn7AtmPrivate *priv;
21633 +
21634 +  dprintf(4, "tn7atm_dsl_irq\n");
21635 +  atmdev = (struct atm_dev *) voiddev;
21636 +  priv = (Tn7AtmPrivate *)atmdev->dev_data;
21637 +
21638 +  tn7dsl_handle_interrupt();
21639
21640 +  dprintf(4, "Leaving tn7atm_dsl_irq\n");
21641 +}
21642 +
21643 +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
21644 + *
21645 + *  Function: int tn7atm_Inittxcomp(struct tn7* tn7)
21646 + *
21647 + *  Description: Initialize Interrupt handler
21648 + *
21649 + *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
21650 +static int __init
21651 +tn7atm_irq_request (struct atm_dev *dev)
21652 +{
21653 +  Tn7AtmPrivate *priv;
21654 +  char *ptr;
21655 +  int ipace=2;
21656 +
21657 +  dprintf(4, "tn7atm_irq_request()\n");
21658 +  priv = (Tn7AtmPrivate *) dev->dev_data;
21659 +
21660 +  /* Register SAR interrupt */
21661 +  priv->sar_irq = LNXINTNUM(ATM_SAR_INT);       /* Interrupt line # */
21662 +  if (request_irq(priv->sar_irq, tn7atm_sar_irq, SA_INTERRUPT, "SAR ", dev))
21663 +    printk ("Could not register tn7atm_sar_irq\n");
21664 +
21665 +  /* interrupt pacing */
21666 +  ptr= prom_getenv("sar_ipacemax");
21667 +  if(ptr)
21668 +  {
21669 +    ipace=os_atoi(ptr);
21670 +  }
21671 +  avalanche_request_pacing(priv->sar_irq, ATM_SAR_INT_PACING_BLOCK_NUM, ipace);
21672 +
21673 +  /* Reigster Receive interrupt A */
21674 +  priv->dsl_irq = LNXINTNUM(ATM_DSL_INT);       /* Interrupt line # */
21675 +  if (request_irq(priv->dsl_irq, tn7atm_dsl_irq, SA_INTERRUPT, "DSL ", dev))
21676 +    printk ("Could not register tn7atm_dsl_irq\n");
21677 +
21678 +  return 0;
21679 +}
21680 +
21681 +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
21682 + *
21683 + *  Function: int tn7atm_lut_find(struct atm_vcc *vcc)
21684 + *
21685 + *  Description: find an TX DMA channel
21686 + *               that matches a vpi/vci pair
21687 + *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
21688 +int
21689 +tn7atm_lut_find(short vpi, int vci)
21690 +{
21691 +  int      i;
21692 +  Tn7AtmPrivate *priv;
21693 +  
21694 +  priv = (Tn7AtmPrivate *)mydev->dev_data;
21695 +
21696 +  if(vci==0) // find first vpi channel
21697 +  {
21698 +    for(i=0; i< MAX_DMA_CHAN; i++)
21699 +    {  
21700 +      if((priv->lut[i].vpi == vpi))
21701 +      return i;
21702 +    }
21703 +  }
21704 +
21705 +  dprintf(4, "vpi=%d, vci=%d\n", vpi, vci);
21706 +  for(i=0; i< MAX_DMA_CHAN; i++)
21707 +  {  
21708 +    if((priv->lut[i].vpi == vpi) && (priv->lut[i].vci == vci))
21709 +      return i;
21710 +  }
21711 +
21712 +  
21713 +
21714 +  return ATM_NO_DMA_CHAN;
21715 +}
21716 +
21717 +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
21718 + *
21719 + *  Function: int tn7atm_lut_clear(struct atm_vcc *vcc,int chan)
21720 + *
21721 + *  Description: find an TX DMA channel
21722 + *               that matches a vpi/vci pair
21723 + *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
21724 +static int
21725 +tn7atm_lut_clear(struct atm_vcc *vcc, int chan)
21726 +{
21727 +  Tn7AtmPrivate *priv;
21728 +  
21729 +  priv = (Tn7AtmPrivate *)vcc->dev->dev_data;
21730 +
21731 +  memset(&priv->lut[chan], 0, sizeof(priv->lut[chan]));
21732 +
21733 +  return 0;
21734 +}
21735 +
21736 +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
21737 + *
21738 + *  Function: int tn7atm_walk_lut(void)
21739 + *
21740 + *  Description: find an available TX DMA channel
21741 + *               and initialize LUT
21742 + *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
21743 +static int 
21744 +tn7atm_walk_lut(Tn7AtmPrivate *priv)
21745 +{
21746 +  int i;
21747 +
21748 +  for(i=0; i< MAX_DMA_CHAN; i++){ 
21749 +    if(!priv->lut[i].inuse)
21750 +    {    
21751 +      return i;                            /* return available dma channel number */
21752 +    }
21753 +  }
21754 +  return ATM_NO_DMA_CHAN;       /* no tx dma channels available */
21755 +}
21756 +
21757 +static int 
21758 +tn7atm_set_lut(Tn7AtmPrivate *priv, struct atm_vcc *vcc, int chan)
21759 +{
21760 +  
21761 +  if(!priv->lut[chan].inuse)
21762 +  {
21763 +    priv->lut[chan].vpi = (int)vcc->vpi;
21764 +    priv->lut[chan].vci = vcc->vci;
21765 +    priv->lut[chan].chanid = chan;
21766 +    priv->lut[chan].inuse = 1;         /* claim the channel */
21767 +    priv->lut[chan].vcc = (void *)vcc;
21768 +    priv->lut[chan].bClosing = 0;
21769 +    priv->lut[chan].ready = 0;
21770 +    priv->lut[chan].tx_total_bufs = TX_BUFFER_NUM;
21771 +    priv->lut[chan].tx_used_bufs[0] = 0;
21772 +    priv->lut[chan].tx_used_bufs[1] = 0;
21773 +    return 0;
21774 +  }
21775 +  return -1;       /* no tx dma channels available */
21776 +}
21777 +
21778 +#if 0
21779 +static void tn7atm_free_packet(void *pVc, void *pDev, void *pPacket)
21780 +  {
21781 +  Tn7AtmPrivate *priv;
21782 +  struct atm_vcc *vcc;
21783 +  struct sk_buff *skb;
21784 +
21785 +  vcc = (struct atm_vcc *)pVc;
21786 +  priv = (Tn7AtmPrivate *)pDev;
21787 +  skb = (struct sk_buff *) pPacket;
21788 +
21789 +  if(vcc->pop)
21790 +    vcc->pop(vcc, skb);   
21791 +  else
21792 +    tn7atm_kfree_skb(skb);
21793 +  }
21794 +#endif
21795 +
21796 +static void str2eaddr(char *pMac, char *pStr)
21797 +{
21798 +  char tmp[3];
21799 +  int i;
21800 +
21801 +  for(i=0;i<6;i++)
21802 +  {
21803 +    tmp[0]=pStr[i*3];
21804 +    tmp[1]=pStr[i*3+1];
21805 +    tmp[2]=0;
21806 +    pMac[i]=os_atoh(tmp);
21807 +  }
21808 +}
21809 +
21810 +static int __init
21811 +tn7atm_get_ESI(struct atm_dev *dev)
21812 +{
21813 +  int  i;
21814 +  char  esi_addr[ESI_LEN]={0x00,0x00,0x11,0x22,0x33,0x44};
21815 +  char  *esiaddr_str = NULL;
21816 +
21817 +  esiaddr_str = prom_getenv("macc");
21818 +
21819 +  if (!esiaddr_str) {
21820 +    //printk("macc address not set in adam2 environment space\n");
21821 +    //printk("Using default macc address = 00:01:02:03:04:05\n");
21822 +    esiaddr_str = "00:00:02:03:04:05";
21823 +  }
21824 +  str2eaddr(esi_addr, esiaddr_str);
21825 +
21826 +  for(i=0; i < ESI_LEN; i++)
21827 +    dev->esi[i] = esi_addr[i];
21828 +
21829 +  return 0;
21830 +}
21831 +
21832 +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
21833 + *
21834 + *  Function: int tn7atm_open(struct atm_vcc *vcc, short vpi, int vci)
21835 + *
21836 + *  Description: Device operation: open
21837 + *
21838 + *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
21839 +//static int
21840 +int tn7atm_open (struct atm_vcc *vcc, short vpi, int vci)
21841 +{
21842 +  Tn7AtmPrivate *priv;
21843 +  int dmachan;
21844 +  int rc;
21845 +  int traffic_type;
21846 +  int pcr = 0x20000;
21847 +  int scr = 0x20000;
21848 +  int mbs = 0x20000;
21849 +  int cdvt = 10000;
21850 +  int err;
21851 +
21852 +  dprintf(1, "tn7atm_open()\n");
21853 +
21854 +  priv = (Tn7AtmPrivate *)vcc->dev->dev_data; 
21855 +  if(priv==NULL)
21856 +  {
21857 +    printk("null priv\n");
21858 +    return -1;
21859 +  }
21860 +
21861 +  MOD_INC_USE_COUNT;
21862 +
21863 +#if 0 /* by nbd */
21864 +  /* find a free VPI/VCI */
21865 +  tn7atm_walk_vccs(vcc, &vpi, &vci);
21866 +#else
21867 +  if ((err = atm_find_ci(vcc, &vpi, &vci))) {
21868 +    printk("atm_find_ci err = %d\n", err);
21869 +    return err;
21870 +  }
21871 +  
21872 +#endif
21873 +        
21874 +  vcc->vpi = vpi;
21875 +  vcc->vci = vci;
21876 +
21877 +  if (vci == ATM_VCI_UNSPEC || vpi == ATM_VCI_UNSPEC)
21878 +  {
21879 +    MOD_DEC_USE_COUNT;
21880 +    return -EBUSY;
21881 +  }
21882 +  
21883 +  /* check to see whether PVC is opened or not */
21884 +  if((dmachan = tn7atm_lut_find(vcc->vpi, vcc->vci)) != ATM_NO_DMA_CHAN) 
21885 +  {
21886 +    MOD_DEC_USE_COUNT;  
21887 +    printk("PVC already opened. dmachan = %d\n", dmachan);
21888 +    return -EBUSY;
21889 +  }
21890 +  /*check for available channel */
21891 +  if((dmachan = tn7atm_walk_lut(priv)) == ATM_NO_DMA_CHAN)
21892 +  {
21893 +    printk("No TX DMA channels available\n");
21894 +    return -EBUSY;
21895 +  }
21896 +
21897 +  set_bit(ATM_VF_ADDR, &vcc->flags);  /* claim address    */
21898 +        
21899 +  vcc->itf = vcc->dev->number;        /* interface number */
21900 +
21901 +  switch(vcc->qos.txtp.traffic_class)
21902 +  {
21903 +    case ATM_CBR: /* Constant Bit Rate */
21904 +      traffic_type = 0;
21905 +      pcr = vcc->qos.txtp.pcr;
21906 +      scr = vcc->qos.txtp.pcr;
21907 +      cdvt = vcc->qos.txtp.max_cdv;
21908 +      printk("cdvt=%d\n", cdvt);
21909 +      break;
21910 +    case ATM_UBR: /* Unspecified Bit Rate */
21911 +      traffic_type = 2;
21912 +      break;
21913 +
21914 +       /* Disable ATM_VBR until pppd ppoatm plugin supports it.
21915 +         * NOTE: Support ATM_VBR requires the addition of a scr
21916 +         * field to the atm_trafprm structure which will cause
21917 +        * a change in the SO_ATMQOS ioctl. Make sure that the
21918 +        * revised header file becomes visible to the pppd
21919 +        * pppoatm plugin source, or the SO_ATMQOS ioctl will fail.
21920 +        */
21921 +#if 0
21922 +    case ATM_VBR: /* Variable Bit Rate */
21923 +      traffic_type = 1;
21924 +      pcr = vcc->qos.txtp.pcr;
21925 +      scr = vcc->qos.txtp.scr;
21926 +      if(vcc->qos.txtp.max_pcr >= 0)
21927 +        mbs = vcc->qos.txtp.max_pcr;
21928 +      cdvt = vcc->qos.txtp.max_cdv;
21929 +      printk("cdvt=%d\n", cdvt);
21930 +      printk("mbs=%d\n", mbs);
21931 +      break;
21932 +#endif
21933 +    default:
21934 +        traffic_type = 2;
21935 +  }
21936 +
21937 +  dprintf(4, "vpi=%d, vci=%d, pcr=%d, dmachan=%d, qos=%d\n", vpi,vci,pcr,dmachan,traffic_type);
21938 +  /* Activate SAR channel */
21939 +  rc = tn7sar_activate_vc(priv, vpi, vci, pcr, scr, mbs, cdvt, dmachan, traffic_type);
21940 +  if(rc < 0)
21941 +  {
21942 +    
21943 +    MOD_DEC_USE_COUNT;
21944 +    return -EBUSY;
21945 +  }
21946 +  
21947 +  /* insure that the the vcc struct points to the correct entry
21948 +       in the lookup table */
21949 +
21950 +  tn7atm_set_lut(priv,vcc, dmachan);
21951 +  vcc->dev_data = (void *)&priv->lut[dmachan];
21952 +  set_bit(ATM_VF_READY, &vcc->flags);
21953 +
21954 +  mdelay(100);
21955 +  priv->lut[dmachan].ready = 1;
21956 +  dprintf (1, "Leave tn7atm_open\n"); 
21957 +  return 0;     
21958 +}
21959 +
21960 +
21961 +//static void
21962 +void tn7atm_close (struct atm_vcc *vcc)
21963 +{
21964 +  Tn7AtmPrivate *priv;
21965 +  int dmachan;
21966 +
21967 +  priv = (Tn7AtmPrivate *)vcc->dev->dev_data;
21968 +  dprintf(4, "closing %d.%d.%d.%d\n", vcc->itf, vcc->vpi, vcc->vci, vcc->qos.aal);
21969
21970 +  clear_bit(ATM_VF_READY, &vcc->flags);  /* ATM_VF_READY: channel is ready to transfer data */
21971 +
21972 +  dmachan = tn7atm_lut_find(vcc->vpi, vcc->vci);
21973 +  printk("closing channel: %d\n", dmachan);
21974 +  if(dmachan == ATM_NO_DMA_CHAN)
21975 +  {
21976 +    printk("Closing channel not found.\n");
21977 +    return;
21978 +  }
21979 +  priv->lut[dmachan].bClosing = 1;
21980 +  priv->lut[dmachan].ready = 0;
21981 +  if(tn7sar_deactivate_vc(priv,dmachan))  /* tear down channel */
21982 +  {
21983 +    printk("failed to close channel %d.\n", dmachan);
21984 +  }
21985 +
21986 +  clear_bit(ATM_VF_READY, &vcc->flags);  /* ATM_VF_READY: channel is ready to transfer data */
21987 +  tn7atm_lut_clear(vcc, dmachan);
21988 +
21989 +  MOD_DEC_USE_COUNT;
21990 +
21991 +  dprintf (1, "Leave tn7atm_close\n");
21992 +}
21993 +
21994 +#define ATM_TXSTOP 0x800c61f4 
21995 +static int
21996 +tn7atm_ioctl (struct atm_dev *dev, unsigned int cmd, void *arg)
21997 +{
21998 +  Tn7AtmPrivate *priv;
21999 +  priv = (Tn7AtmPrivate *) dev->dev_data;
22000 +  
22001 +    //printk("tn7atm_ioctl\n");
22002 +    //printk("arg = %x\n", *(int *)arg);
22003 +    //printk("cmd =%x\n", cmd);
22004 +    switch(cmd)
22005 +    {
22006 +
22007 +      case ATM_TXSTOP: /*temp fix for SAR tear down problem */
22008 +//        printk("ioctl cmd = 0x%x (%u), arg = 0x%p (%lu)\n", cmd, cmd, arg, (unsigned long)arg);
22009 +//        printk("arg = %d\n", *(int*)arg);
22010 +        priv->xmitStop = *(int *)arg;
22011 +        //printk("Executing ATM_SETLOOP for tn7 \n");
22012 +        //printk("Stop variable = :%d: \n",priv->xmitStop);
22013 +        return 0;
22014 +
22015 +      //case SAR_DSL_RESET_SOFTBOOT:
22016 +      //  return tn7atm_dsl_clean_reboot();
22017 +    case 0:
22018 +        return 0;
22019 +    }
22020 +    
22021 +    return -ENOSYS;
22022 +  
22023 +}
22024 +
22025 +static int
22026 +tn7atm_change_qos (struct atm_vcc *vcc, struct atm_qos *qos,int flags)
22027 +{
22028 +  dprintf (1, "Enter tn7atm_change_qos\n");
22029 +  dprintf (1, "Leave tn7atm_change_qos\n");
22030 +  return 0;
22031 +}
22032 +
22033 +
22034 +int tn7atm_send (struct atm_vcc *vcc, struct sk_buff *skb)
22035 +{
22036 +  
22037 +  Tn7AtmPrivate *priv;
22038 +  int bret;
22039 +  int chan;
22040 +  
22041 +  dprintf(4, "tn7atm_send()\n");
22042 +  
22043 +  priv = (Tn7AtmPrivate*)vcc->dev->dev_data;
22044 +
22045 +  //if(skb->len < 64)
22046 +    //xdump((unsigned char *)skb->data, skb->len, 1);
22047 +  //else
22048 +    //xdump((unsigned char *)skb->data, 64, 1);
22049 +  /* check for dsl line connection */
22050 +
22051 +  /* add vcc field in skb for clip inATMARP fix */
22052 +  ATM_SKB(skb)->vcc = vcc;
22053 +       /* Ron change 2.3 -> 2.4 ??*/
22054 +  //if(priv->lConnected != 1 || priv->xmitStop == 1)
22055 +  if(priv->lConnected != 1 && priv->xmitStop == 1)
22056 +  {
22057 +    dprintf(4,"dsl line down\n");
22058 +    if(vcc->pop)
22059 +      vcc->pop(vcc, skb);   
22060 +    else
22061 +     tn7atm_kfree_skb(skb);
22062 +    return 1;
22063 +  }
22064 +  
22065 +  /* check whether PVC is closing */
22066 +  chan = tn7atm_lut_find(vcc->vpi, vcc->vci);
22067 +  /* set br2684 dev pointer */
22068 +  priv->lut[chan].net_device = skb->dev;
22069 +  if(chan == ATM_NO_DMA_CHAN || priv->lut[chan].bClosing == 1)
22070 +  {
22071 +    dprintf(4, "can find sar channel\n");
22072 +    if(vcc->pop)
22073 +      vcc->pop(vcc, skb);   
22074 +    else
22075 +     tn7atm_kfree_skb(skb);
22076 +    return 1;
22077 +  }
22078 +
22079 +  bret=tn7atm_queue_packet_to_sar(vcc, skb);
22080 +
22081 +  return bret;
22082 +}
22083 +
22084 +
22085 +static int tn7atm_queue_packet_to_sar(void *vcc1, void *skb1)
22086 +{
22087 +  struct atm_vcc *vcc;
22088 +  struct sk_buff *skb;
22089 +  int priority = 1;
22090 +  Tn7AtmPrivate *priv;
22091 +  int dmachan;
22092 +
22093 +  vcc = (struct atm_vcc *)vcc1;
22094 +  skb = (struct sk_buff *)skb1;
22095 +
22096 +  priv = (Tn7AtmPrivate*)vcc->dev->dev_data;
22097 +
22098 +  dprintf(4, "vcc->vci=%d\n", vcc->vci);
22099 +  dmachan = tn7atm_lut_find(vcc->vpi, vcc->vci);
22100 +  if(dmachan == ATM_NO_DMA_CHAN)
22101 +  {
22102 +    dprintf(4, "can find sar channel\n");
22103 +    if(vcc->pop)
22104 +      vcc->pop(vcc, skb);   
22105 +    else
22106 +     tn7atm_kfree_skb(skb);
22107 +    return 1;
22108 +  }
22109 +
22110 +  // turbo dsl TCP ack check
22111 +  if(priv->bTurboDsl)
22112 +    priority = turbodsl_check_priority_type(skb->data);
22113 +
22114 +  //skb priority check
22115 +  if(priority != 0)
22116 +  {
22117 +    if((skb->cb[47])>>1)
22118 +      priority=1;
22119 +    else
22120 +      priority = 0;
22121 +  }
22122 +  
22123 +  /* add queue info here */
22124 +  skb->cb[47] = (char)priority;
22125 +  spin_lock_irqsave(&priv->netifqueueLock, priv->netifqueueLockFlag);
22126 +  priv->lut[dmachan].tx_used_bufs[priority]++;
22127 +  spin_unlock_irqrestore(&priv->netifqueueLock, priv->netifqueueLockFlag);
22128 +
22129 +  if(tn7sar_send_packet(priv,dmachan, skb, skb->data, skb->len, priority) != 0)
22130 +  {
22131 +    dprintf(1, "failed to send packet\n");
22132 +    if(vcc->pop)
22133 +      vcc->pop(vcc, skb);   
22134 +    else
22135 +     tn7atm_kfree_skb(skb);
22136 +
22137 +    spin_lock_irqsave(&priv->netifqueueLock, priv->netifqueueLockFlag);
22138 +    priv->lut[dmachan].tx_used_bufs[priority]--;
22139 +    spin_unlock_irqrestore(&priv->netifqueueLock, priv->netifqueueLockFlag);
22140 +    return 1;
22141 +  }
22142 +  
22143 +  /* check for whether tx queue is full or not */
22144 +  //printk("bufs used = %d\n", priv->lut[dmachan].tx_used_bufs[1]);
22145 +  spin_lock_irqsave(&priv->netifqueueLock, priv->netifqueueLockFlag);
22146 +  if(priv->lut[dmachan].tx_used_bufs[1] >= (priv->lut[dmachan].tx_total_bufs - STOP_EMPTY_BUFF) ||
22147 +      priv->lut[dmachan].tx_used_bufs[0] >= (priv->lut[dmachan].tx_total_bufs - STOP_EMPTY_BUFF))
22148 +  {
22149 +    //printk("net queue stoped\n");
22150 +    netif_stop_queue(priv->lut[dmachan].net_device);
22151 +    priv->lut[dmachan].netqueue_stop = 1;
22152 +  }
22153 +  spin_unlock_irqrestore(&priv->netifqueueLock, priv->netifqueueLockFlag);
22154 +
22155 +  return 0;
22156 +}
22157 +
22158 +/* functions needed by SAR HAL */
22159 +
22160 +int tn7atm_send_complete(void *osSendInfo)
22161 +{
22162 +  Tn7AtmPrivate *priv;
22163 +  //struct atm_dev *dev;
22164 +  struct sk_buff *skb;
22165 +  struct atm_vcc *vcc;
22166 +  int chan;
22167 +
22168 +  dprintf(4, "tn7atm_send_complete()\n");
22169 +
22170 +
22171 +  skb = (struct sk_buff *)osSendInfo;
22172 +  //dev = (struct atm_dev *) (skb->dev);
22173 +  priv = (Tn7AtmPrivate *)mydev->dev_data;
22174 +  vcc =ATM_SKB(skb)->vcc;
22175 +  if(vcc)
22176 +  {
22177 +    dprintf(4, "vcc->vci=%d\n",vcc->vci );
22178 +    chan = tn7atm_lut_find(vcc->vpi, vcc->vci);
22179 +    if(chan==ATM_NO_DMA_CHAN)
22180 +      return 1;
22181 +
22182 +    /*decreament packet queued number */
22183 +    spin_lock_irqsave(&priv->netifqueueLock, priv->netifqueueLockFlag);
22184 +    priv->lut[chan].tx_used_bufs[(int)skb->cb[47]] --;
22185 +    if(priv->lut[chan].tx_used_bufs[1] < priv->lut[chan].tx_total_bufs - START_EMPTY_BUFF &&
22186 +       priv->lut[chan].tx_used_bufs[0] < priv->lut[chan].tx_total_bufs - START_EMPTY_BUFF)
22187 +    {
22188 +      if(priv->lut[chan].netqueue_stop)
22189 +      {
22190 +        //printk("net queue restarted\n");
22191 +        netif_wake_queue(priv->lut[chan].net_device);
22192 +        priv->lut[chan].netqueue_stop = 0;
22193 +      }
22194 +    }
22195 +    spin_unlock_irqrestore(&priv->netifqueueLock, priv->netifqueueLockFlag);
22196 +
22197 +    if(vcc->pop)
22198 +    {
22199 +      dprintf(5, "free packet\n");
22200 +      vcc->pop(vcc, skb);
22201 +    }
22202 +
22203 +    
22204 +  }
22205 +    
22206 +  
22207 +
22208 +  /* Update Stats: There may be a better place to do this, but this is a start */
22209 +  priv->stats.tx_packets++;
22210 +#ifdef CONFIG_LED_MODULE
22211 +//    led_operation(MOD_ADSL, DEF_ADSL_ACTIVITY);           
22212 +#endif
22213 +
22214 +  /* track number of buffer used */
22215 +  
22216 +  dprintf(4, "tn7atm_send_complete() done\n");
22217 +
22218 +  return 0;
22219 +}
22220 +
22221 +void *tn7atm_allocate_rx_skb(void *os_dev, void **os_receive_info, unsigned int size)
22222 +{
22223 +  struct sk_buff *skb;
22224 +  dprintf(4, "tn7atm_allocate_rx_skb size=%d\n", size);
22225 +  size = ((size+3)&0xfffffffc);
22226 +  skb = dev_alloc_skb(size);
22227 +  if(skb==NULL)
22228 +  {
22229 +    //printk("rx allocate skb failed\n");
22230 +    return NULL;
22231 +  }
22232 +  *os_receive_info = (void *)skb;
22233 +  return (skb->data);
22234 +}
22235 +
22236 +void tn7atm_free_rx_skb(void *skb)
22237 +{
22238 +  dprintf(4, "tn7atm_free_rx_skb\n");
22239 +  tn7atm_kfree_skb((struct sk_buff *)skb);
22240 +}
22241 +
22242 +
22243 +int tn7atm_receive(void *os_dev, int ch, unsigned int packet_size, void *os_receive_info, void *data)
22244 +{
22245 +  Tn7AtmPrivate *priv;
22246 +  struct atm_dev *dev;
22247 +  struct sk_buff *skb;
22248 +  struct atm_vcc *vcc;
22249 +  
22250 +
22251 +  dprintf(4, "tn7atm_receive()\n");
22252 +  dev = (struct atm_dev *)os_dev;
22253 +
22254 +  priv = (Tn7AtmPrivate *)dev->dev_data;
22255 +
22256 +  if(priv->lConnected != 1 || priv->lut[ch].ready == 0)
22257 +  {
22258 +    //printk("channel not ready\n");
22259 +    return 1;
22260 +  }
22261 +
22262 +  vcc = (struct atm_vcc *)priv->lut[ch].vcc;
22263 +  if(vcc == NULL)
22264 +  {
22265 +    printk("vcc=Null");
22266 +    return 1;
22267 +  }
22268 +
22269 +
22270 +  /* assume no fragment packet for now */
22271 +  skb = (struct sk_buff *)os_receive_info;
22272 +  
22273 +  if(skb==NULL)
22274 +  {
22275 +    dprintf(1, "received empty skb.\n");
22276 +    return 1;
22277 +  }
22278 +  /* see skbuff->cb definition in include/linux/skbuff.h */
22279 +  ATM_SKB(skb)->vcc = vcc;
22280 +
22281 +  skb->len = packet_size;
22282 +  dprintf(3, "skb:[0x%p]:0x%x pdu_len: 0x%04x\n",skb,skb->len,packet_size);
22283 +  dprintf(3, "data location: 0x%x, 0x%x\n", (unsigned int)skb->data, (unsigned int)data);
22284 +  
22285 +  /*skb_trim(skb,skb->len); */   /* skb size is incorrect for large packets > 1428 bytes ?? */
22286 +  __skb_trim(skb,skb->len); /* change to correct > 1500 ping when firewall is on */
22287 +
22288 +  dprintf(3, "pushing the skb...\n");
22289 +  skb->stamp = xtime;
22290 +
22291 +  xdump((unsigned char *)skb->data, skb->len, 5);
22292 +  
22293 +  if(atm_charge(vcc, skb->truesize) == 0)
22294 +  {
22295 +    dprintf(1,"Receive buffers saturated for %d.%d.%d - PDU dropped\n", vcc->itf, vcc->vci, vcc->vpi);
22296 +    return 1;
22297 +  }
22298 +
22299 +  /*pass it up to kernel networking layer and update stats*/
22300 +  vcc->push(vcc,skb);
22301 +
22302 +  /* Update receive packet stats */
22303 +  priv->stats.rx_packets++;
22304 +  atomic_inc(&vcc->stats->rx);
22305 +
22306 +#ifdef CONFIG_LED_MODULE
22307 +//    led_operation(MOD_ADSL, DEF_ADSL_ACTIVITY);           
22308 +#endif
22309 +  dprintf(3, "(a) Receiving:vpi/vci[%d/%d] chan_id: %d  skb len:0x%x  skb truesize:0x%x\n",
22310 +                vcc->vpi,vcc->vci,ch,skb->len, skb->truesize);
22311 +  
22312 +  return 0;
22313 +}
22314 +
22315 +static int
22316 +tn7atm_proc_channels(char* buf, char **start, off_t offset, int count,int *eof, void *data)
22317 +{
22318 +  int len = 0;
22319 +  int limit = count - 80;
22320 +  int i;
22321 +
22322 +  struct atm_dev *dev;
22323 +  Tn7AtmPrivate *priv;
22324 +
22325 +  dev = (struct atm_dev *)data;
22326 +  priv = (Tn7AtmPrivate *)dev->dev_data;
22327 +
22328 +  if(len<=limit)
22329 +      len += sprintf(buf+len,"Chan  Inuse   ChanID   VPI     VCI \n");
22330 +  if(len<=limit)
22331 +      len += sprintf(buf+len,"------------------------------------------------------------------\n");
22332 +
22333 +  for(i=0; i < MAX_DMA_CHAN; i++)
22334 +    {
22335 +      if(len<=limit)
22336 +        {
22337 +          len += sprintf(buf+len, 
22338 +                        " %02d    %05d   %05d   %05d   %05d \n",
22339 +                        i,priv->lut[i].inuse,priv->lut[i].chanid,
22340 +                        priv->lut[i].vpi,priv->lut[i].vci);
22341 +        }
22342 +    }
22343 +
22344 +  return len;
22345 +}
22346 +
22347 +static int
22348 +tn7atm_proc_private(char* buf, char **start, off_t offset, int count,int *eof, void *data)
22349 +{
22350 +  int len = 0;
22351 +  int limit = count - 80;
22352 +  struct atm_dev *dev;
22353 +  Tn7AtmPrivate *priv;
22354 +
22355 +  dev = (struct atm_dev *)data;
22356 +  priv = (Tn7AtmPrivate *)dev->dev_data;
22357 +  
22358 +  if(len<=limit)
22359 +      len += sprintf(buf+len, "\nPrivate Data Structure(%s):\n",priv->name);
22360 +  if(len<=limit)
22361 +      len += sprintf(buf+len, "----------------------------------------\n");
22362 +  if(len<=limit)
22363 +      len += sprintf(buf+len, "priv:  0x%p\n",priv);
22364 +  if(len<=limit)
22365 +      len += sprintf(buf+len, "next:  0x%p",priv->next);
22366 +  if(len<=limit)
22367 +        len += sprintf(buf+len, "\tdev:   0x%p\n",priv->dev);
22368
22369 +  if(len<=limit)
22370 +      len += sprintf(buf+len, "tx_irq: %02d",priv->sar_irq);
22371 +  if(len<=limit)
22372 +      len += sprintf(buf+len, "rx_irq: %02d",priv->dsl_irq);
22373 +  
22374 +
22375 +  return len;
22376 +}
22377 +
22378 +void tn7atm_sarhal_isr_register(void *os_dev, void *hal_isr, int interrupt_num)
22379 +{
22380 +  struct atm_dev *dev;
22381 +  Tn7AtmPrivate *priv;
22382 +
22383 +  dprintf(4, "tn7atm_sarhal_isr_register()\n");
22384 +
22385 +  dev = (struct atm_dev *)os_dev;
22386 +  priv = (Tn7AtmPrivate *)dev->dev_data;
22387 +  priv->halIsr = (void *)hal_isr;
22388 +  priv->int_num = interrupt_num;
22389 +}
22390 +
22391 +
22392 +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
22393 + *
22394 + *  Function: int tn7atm_exit(void)
22395 + *
22396 + *  Description: Avalanche SAR exit function
22397 + *
22398 + *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
22399 +
22400 +static void
22401 +tn7atm_exit (void)
22402 +{
22403 +
22404 +  struct atm_dev        *dev;
22405 +
22406 +  Tn7AtmPrivate *priv;
22407 +
22408 +  dprintf(4, "tn7atm_exit()\n");
22409 +
22410 +  dev=mydev;
22411 +  priv = (Tn7AtmPrivate *)dev->dev_data;
22412 +  priv->lConnected = 0;
22413 +  tn7dsl_exit();
22414 +
22415 +  tn7sar_exit(dev, priv);
22416 +
22417 +  /* freeup irq's */
22418 +  free_irq(priv->dsl_irq,priv->dev);
22419 +  free_irq(priv->sar_irq,priv->dev);
22420 +  
22421 +  kfree (dev->dev_data);
22422 +
22423 +  //    atm_dev_deregister (dev);
22424 +  shutdown_atm_dev(dev);
22425 +
22426 +  /* remove proc entries */
22427 +  remove_proc_entry("tiatm/avsar_ver",NULL);
22428 +  remove_proc_entry("tiatm/avsar_modem_stats",NULL);
22429 +  remove_proc_entry("tiatm/avsar_modem_training",NULL);
22430 +  remove_proc_entry("tiatm/avsar_channels",NULL);
22431 +  remove_proc_entry("tiatm/avsar_private",NULL);
22432 +  remove_proc_entry("tiatm/avsar_sarhal_stats",NULL);
22433 +  remove_proc_entry("tiatm/avsar_oam_ping",NULL);
22434 +  remove_proc_entry("tiatm/avsar_pvc_table",NULL);
22435 +  remove_proc_entry("tiatm",NULL);
22436 +  tn7dsl_dslmod_sysctl_unregister();
22437 +  
22438 +  printk ("Module Removed\n");
22439 +
22440 +}
22441 +
22442 +
22443 +
22444 +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
22445 + *
22446 + *  Function: int tn7atm_registration(struct tn7* tn7)
22447 + *
22448 + *  Description: ATM driver registration
22449 + *
22450 + *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
22451 +
22452 +static int __init
22453 +tn7atm_register (Tn7AtmPrivate * priv)
22454 +{
22455 +  /* allocate memory for the device */
22456 +
22457 +  dprintf(4,"device %s being registered\n", priv->name);
22458 +
22459 +  mydev = atm_dev_register (priv->proc_name, &tn7atm_ops, -1, NULL);
22460 +
22461 +  if (mydev == NULL)
22462 +    {
22463 +      printk ("atm_dev_register returning NULL\n");     
22464 +      return ATM_REG_FAILED;
22465 +    }
22466 +
22467 +  printk ("registered device %s\n", priv->name);
22468 +
22469 +  mydev->dev_data = priv;       /* setup device data in atm_dev struct */
22470 +  priv->dev = mydev;    /* setup atm_device in avalanche sar struct */
22471 +
22472 +  mydev->ci_range.vpi_bits = ATM_CI_MAX;        /* atm supports 11 bits */
22473 +  mydev->ci_range.vci_bits = 16;        /* atm VCI max = 16 bits */
22474 +
22475 +  
22476 +  return ATM_REG_OK;
22477 +}
22478 +
22479 +static int 
22480 +tn7atm_proc_version(char* buf, char **start, off_t offset, int count,int *eof, void *data)
22481 +{
22482 +  int len = 0;
22483 +  char dslVer[8];
22484 +  char dspVer[10];
22485 +  char *pSarVer;
22486 +  Tn7AtmPrivate *priv;
22487 +  int i;
22488 +  unsigned int pdspV1, pdspV2;
22489 +
22490 +  priv = mydev->dev_data;
22491 +
22492 +  len += sprintf(buf+len, "ATM Driver version:[%d.%02d.%02d.%02d]\n",LINUXATM_VERSION_MAJOR, LINUXATM_VERSION_MINOR,
22493 +                                                                   LINUXATM_VERSION_BUGFIX, LINUXATM_VERSION_BUILDNUM);
22494 +
22495 +  tn7dsl_get_dslhal_version(dslVer);
22496 +
22497 +  len += sprintf(buf+len, "DSL HAL version: [%d.%02d.%02d.%02d]\n", dslVer[0], dslVer[1], dslVer[2],
22498 +                                            dslVer[3]);
22499 +  tn7dsl_get_dsp_version(dspVer);
22500 +
22501 +  len += sprintf(buf+len, "DSP Datapump version: [%d.%02d.%02d.%02d] ", dspVer[4], dspVer[5], dspVer[6],
22502 +                                            dspVer[7]);
22503 +  if(dspVer[8]==2) // annex B
22504 +    len += sprintf(buf+len, "Annex B\n");
22505 +  else if(dspVer[8]==3) //annex c
22506 +    len += sprintf(buf+len, "Annex c\n");
22507 +  else
22508 +    len += sprintf(buf+len, "Annex A\n");
22509 +
22510 +  tn7sar_get_sar_version(priv, &pSarVer);
22511 +
22512 +  len += sprintf(buf+len, "SAR HAL version: [");
22513 +  for(i=0;i<8;i++)
22514 +  {
22515 +    len += sprintf(buf+len, "%c", pSarVer[i+7]);
22516 +  }
22517 +  len += sprintf(buf+len, "]\n");
22518 +
22519 +  tn7sar_get_sar_firmware_version(&pdspV1, &pdspV2);
22520 +  len += sprintf(buf+len, "PDSP Firmware version:[%01x.%02x]\n",
22521 +                 pdspV1,pdspV2);
22522 +
22523 +  return len;
22524 +}
22525 +
22526 +/*
22527 +static struct net_device_stats
22528 +*tn7atm_get_stats(struct atm_dev *dev)
22529 +{
22530 +  Tn7AtmPrivate *priv;
22531 +  //unsigned long flags;
22532 +
22533 +  //spin_lock_irqsave(&priv->stats_lock,flags);
22534 +  priv= (Tn7AtmPrivate *)dev->dev_data;
22535 +  //spin_unlock_irqrestore(&priv->stats_lock,flags);
22536 +  
22537 +  return &priv->stats;
22538 +  
22539 +}
22540 +*/
22541 +/* Device detection */
22542 +
22543 +static int __init
22544 +tn7atm_detect (void)
22545 +{
22546 +  Tn7AtmPrivate *priv;
22547 +  //static struct proc_dir_entry *proc_dir;
22548 +
22549 +  dprintf(4, "tn7atm_detect().\n");
22550 +  /* Device allocated as a global static structure at top of code "mydev" */
22551 +
22552 +  /* Alloc priv struct */
22553 +  priv=kmalloc(sizeof(Tn7AtmPrivate),GFP_KERNEL);
22554 +  if(!priv)
22555 +    {
22556 +      printk("unable to kmalloc priv structure. Killing autoprobe.\n");
22557 +      return -ENODEV;
22558 +    }
22559 +  memset(priv, 0, sizeof(Tn7AtmPrivate));
22560 +#ifdef COMMON_NSP
22561 +  priv->name = "TI Avalanche SAR";
22562 +  priv->proc_name = "avsar";
22563 +#else
22564 +  priv->name = "TI tnetd73xx ATM Driver";
22565 +  priv->proc_name = "tn7";
22566 +#endif
22567 +
22568 +  if ((tn7atm_register (priv)) == ATM_REG_FAILED)
22569 +    return -ENODEV;
22570 +
22571 +  tn7atm_init(mydev);
22572 +
22573 +  /* Set up proc entry for atm stats */
22574 +  proc_mkdir("tiatm", NULL);
22575 +  create_proc_read_entry("tiatm/avsar_modem_stats",0,NULL,tn7dsl_proc_stats,NULL);
22576 +  create_proc_read_entry("tiatm/avsar_modem_training",0,NULL,tn7dsl_proc_modem,NULL);
22577 +  create_proc_read_entry("tiatm/avsar_ver",0,NULL,tn7atm_proc_version,NULL);
22578 +  create_proc_read_entry("tiatm/avsar_channels",0,NULL,tn7atm_proc_channels,mydev);
22579 +  create_proc_read_entry("tiatm/avsar_private",0,NULL,tn7atm_proc_private,mydev);
22580 +  create_proc_read_entry("tiatm/avsar_sarhal_stats",0,NULL,tn7sar_proc_sar_stat,mydev);
22581 +  create_proc_read_entry("tiatm/avsar_oam_ping",0,NULL,tn7sar_proc_oam_ping,mydev);
22582 +  create_proc_read_entry("tiatm/avsar_pvc_table",0,NULL,tn7sar_proc_pvc_table,mydev);
22583 +
22584 +  tn7dsl_dslmod_sysctl_register();
22585 +
22586 +  printk("Texas Instruments ATM driver: version:[%d.%02d.%02d.%02d]\n",LINUXATM_VERSION_MAJOR, LINUXATM_VERSION_MINOR,
22587 +                                                                   LINUXATM_VERSION_BUGFIX, LINUXATM_VERSION_BUILDNUM);
22588 +  return 0;
22589 +}
22590 +
22591 +
22592 +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
22593 + *
22594 + *  Function: int tn7atm_probe(void)
22595 + *
22596 + *  Description: Avalanche SAR driver probe (see net/atm/pvc.c)
22597 + *               this is utilized when the SAR driver is built
22598 + *               into the kernel and needs to be configured.
22599 + *
22600 + *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
22601 +int __init tn7atm_probe(void)
22602 +{
22603 +  tn7atm_detect();
22604 +  return -ENODEV;
22605 +}
22606 +
22607 +
22608 +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
22609 + *
22610 + *  Function: int tn7atm_init(struct atm_dev *dev)
22611 + *
22612 + *  Description: Device Initialization
22613 + *
22614 + *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
22615 +static int __init
22616 +tn7atm_init(struct atm_dev *dev)
22617 +{
22618 +  Tn7AtmPrivate *priv;
22619 +  char *ptr;
22620 +
22621 +  dprintf(4, "tn7atm_init()\n");
22622 +
22623 +  priv = (Tn7AtmPrivate *)dev->dev_data;
22624 +
22625 +  if(tn7sar_init(dev, priv) != 0)
22626 +  {
22627 +    printk("Failed to init SAR.\n");
22628 +    return -ENODEV;
22629 +  }
22630 +
22631 +  if(tn7dsl_init(priv) < 0)
22632 +  {
22633 +    printk("Failed to init DSL.\n");
22634 +    return -ENODEV;
22635 +  }
22636 +  
22637 +  if(tn7atm_get_ESI(dev) < 0)                 /* set ESI */  
22638 +    return -ENODEV;
22639 +
22640 +  if(tn7atm_irq_request(dev) < 0)     
22641 +    return -EBUSY;
22642 +
22643 +  priv->bTurboDsl = 1;
22644 +  // read config for turbo dsl
22645 +  ptr = prom_getenv("TurboDSL");
22646 +  if(ptr)
22647 +  {
22648 +    priv->bTurboDsl = os_atoi(ptr);
22649 +  }
22650 +
22651 +  return 0;
22652 +}
22653 +
22654 +int tn7atm_device_connect_status(void *priv, int state)
22655 +{
22656 +  Tn7AtmPrivate *priv1;
22657 +
22658 +  dprintf(5, "tn7atm_device_connect_status()\n");
22659 +  priv1 = (Tn7AtmPrivate *)priv;
22660 +
22661 +  priv1->lConnected = state;
22662 +  dprintf(5, "priv1->lConnected=%d\n", priv1->lConnected);
22663 +  return 0;
22664 +}
22665 +
22666 +
22667 +#ifdef MODULE
22668 +module_init (tn7atm_detect);
22669 +module_exit (tn7atm_exit);
22670 +#endif /* MODULE */
22671 diff -urN linux.old/drivers/atm/sangam_atm/tn7atm.h linux.dev/drivers/atm/sangam_atm/tn7atm.h
22672 --- linux.old/drivers/atm/sangam_atm/tn7atm.h   1970-01-01 01:00:00.000000000 +0100
22673 +++ linux.dev/drivers/atm/sangam_atm/tn7atm.h   2005-08-23 04:46:50.107842176 +0200
22674 @@ -0,0 +1,115 @@
22675 +/* 
22676 + *    Tnetd73xx ATM driver.
22677 + *    by Zhicheng Tang, ztang@ti.com
22678 + *    2000 (c) Texas Instruments Inc.
22679 + *
22680 + *
22681 +*/
22682 +
22683 +#ifndef __TN7ATM_H
22684 +#define __TN7ATM_H
22685 +
22686 +//#include  "mips_support.h"
22687 +#include  <linux/list.h>
22688 +
22689 +#define ATM_REG_OK 1
22690 +#define ATM_REG_FAILED 0
22691 +
22692 +#define TX_SERVICE_MAX    32
22693 +#define RX_SERVICE_MAX    20
22694 +#define TX_BUFFER_NUM     64
22695 +#define RX_BUFFER_NUM     28
22696 +#define TX_QUEUE_NUM      2
22697 +#define RX_BUFFER_SIZE    1582
22698 +
22699 +#define TX_DMA_CHAN       16    /* number of tx dma channels available */
22700 +#define MAX_DMA_CHAN      16
22701 +#define ATM_NO_DMA_CHAN   MAX_DMA_CHAN + 1  /* no tx dma channels available */
22702 +#define ATM_SAR_INT       15
22703 +#define ATM_SAR_INT_PACING_BLOCK_NUM 2
22704 +#define ATM_DSL_INT       39
22705 +
22706 +#define CONFIG_ATM_TN7ATM_DEBUG 0 /* Debug level (0=no mtn7s 5=verbose) */
22707 +
22708 +#define TN7ATM_DEV(d)          ((struct tn7atm*)((d)->dev_data))
22709 +
22710 +
22711 +/* Avalanche SAR state information */
22712 +
22713 +typedef enum tn7atm_state 
22714 +{
22715 +  TN7ATM_STATE_REGISTER             /* device registered */
22716 +}tn7atm_state;
22717 +
22718 +typedef struct _sar_stat
22719 +{
22720 +  unsigned int txErrors;
22721 +  unsigned int rxErrors;
22722 +  unsigned int rxPktCnt;
22723 +  unsigned int txPktCnt;
22724 +  unsigned int rxBytes;
22725 +  unsigned int txBytes;
22726 +}sar_stat_t;
22727 +
22728 +/* Host based look up table to xref Channel Id's, VPI/VCI, LC, CID, packet type */
22729 +typedef struct _tn7atm_tx_lut
22730 +{
22731 +  int         inuse;       /* is DMA channel available (1=y)  */
22732 +  int         chanid;      /*  DMA channel ID   (0-0x1f) This corresponds to the Channel ID
22733 +                              that is used in the connection config reg (TN7ATM_CONN_CONFIG) */
22734 +  int         vpi;         /* Virtual path identifier         */
22735 +  int         vci;         /* Virtual channel identifier      */
22736 +  void        *vcc;
22737 +  int         bClosing;
22738 +  int         ready;
22739 +  void        *net_device;
22740 +  int         tx_total_bufs;
22741 +  int         tx_used_bufs[2];
22742 +  int         netqueue_stop;
22743 +}tn7atm_lut_t;              
22744 +
22745 +/* per device data */
22746 +
22747 +typedef struct _tn7atm_private
22748 +{
22749 +  struct _tn7atm_private       *next;               /* next device */
22750 +  struct atm_dev              *dev;                /* ATM device */
22751 +  struct net_device_stats     stats;         /* Used to report Tx/Rx frames from ifconfig */
22752 +  tn7atm_lut_t                 lut[MAX_DMA_CHAN];  /* Tx DMA look up table (LUT) */
22753 +  int                         dsl_irq;            /* ATM SAR TransmitA interrupt number */
22754 +  int                         sar_irq;            /* ATM SAR ReceiveA interrupt number */
22755 +  char*                       name;                /* device name */
22756 +  char*                       proc_name;           /* board name under /proc/atm */
22757 +  unsigned int                available_cell_rate; /* cell rate */
22758 +  unsigned int                connection_cell_rate; /* cell rate */
22759 +  int                         lConnected;
22760 +
22761 +  /* Tnetd73xx CPHAL */
22762 +  void                        *pSarHalDev;
22763 +  void                        *pSarHalFunc;
22764 +  void                        *pSarOsFunc;
22765 +  void                        *halIsr;
22766 +  int                         int_num;
22767 +
22768 +  /* turbo dsl */
22769 +  int                          bTurboDsl;
22770 +
22771 +  /* spin lock for netifqueue */
22772 +  spinlock_t                   netifqueueLock;
22773 +  int                          netifqueueLockFlag;
22774 +  int                          xmitStop; /* temp fix for SAR problem */
22775 +}tn7atm_private_t, Tn7AtmPrivate;
22776 +
22777 +
22778 +
22779 +/* ATM adaptation layer id */
22780 +typedef enum tn7atm_aal {
22781 +    TN7ATM_AAL0  = 0,
22782 +    TN7ATM_AAL2  = 2,
22783 +    TN7ATM_AAL5  = 5,
22784 +} tn7atm_aal_t;
22785 +
22786 +
22787 +
22788 +
22789 +#endif
22790 diff -urN linux.old/drivers/atm/sangam_atm/tn7dsl.c linux.dev/drivers/atm/sangam_atm/tn7dsl.c
22791 --- linux.old/drivers/atm/sangam_atm/tn7dsl.c   1970-01-01 01:00:00.000000000 +0100
22792 +++ linux.dev/drivers/atm/sangam_atm/tn7dsl.c   2005-08-23 04:46:50.109841872 +0200
22793 @@ -0,0 +1,1780 @@
22794 +/* 
22795 + *  $Id$
22796 + *
22797 + *   Avalanche SAR driver
22798 + *
22799 + *   Zhicheng Tang, ztang@ti.com
22800 + *   2000 (c) Texas Instruments Inc.
22801 + *
22802 + *
22803 +*/
22804 +#include <linux/config.h>
22805 +#include <linux/kernel.h>
22806 +#include <linux/module.h>
22807 +#include <linux/init.h>
22808 +#include <linux/atmdev.h>
22809 +#include <linux/delay.h>
22810 +#include <linux/spinlock.h>
22811 +#include <linux/smp_lock.h>
22812 +#include <asm/io.h>
22813 +#include <asm/mips-boards/prom.h>
22814 +#include <linux/proc_fs.h>
22815 +#include <linux/string.h>
22816 +#include <linux/ctype.h>
22817 +#include <linux/sysctl.h>
22818 +#include <linux/timer.h>
22819 +#include <linux/vmalloc.h>
22820 +#include <linux/file.h>
22821 +#include <asm/uaccess.h>
22822 +
22823 +#include "tn7atm.h"
22824 +#include "tn7api.h"
22825 +#include "dsl_hal_api.h"
22826 +
22827 +#ifdef CONFIG_LED_MODULE
22828 +#include <asm/ar7/ledapp.h>
22829 +#define MOD_ADSL 1
22830 +#define DEF_ADSL_IDLE     1
22831 +#define DEF_ADSL_TRAINING 2
22832 +#define DEF_ADSL_SYNC     3
22833 +#define DEF_ADSL_ACTIVITY 4
22834 +
22835 +#define LED_NUM_1 3
22836 +#define LED_NUM_2 4
22837 +
22838 +led_reg_t ledreg[2];
22839 +
22840 +static int led_on;
22841 +#endif
22842 +
22843 +extern int  __guDbgLevel;
22844 +extern sar_stat_t sarStat;
22845 +static int dslInSync = 0;
22846 +static int bMarginThConfig;
22847 +static int bMarginRetrainEnable;
22848 +static char EOCVendorID[8]= {0xb5, 0x00, 0x54, 0x53, 0x54, 0x43, 0x00, 0x00};
22849 +
22850 +#define TC_SYNC          1
22851 +#define SYNC_TIME_DELAY  500000
22852 +
22853 +
22854 +#define DEV_DSLMOD       1
22855 +#define MAX_STR_SIZE     256
22856 +#define DSL_MOD_SIZE     256
22857 +
22858 +#define TRUE   1
22859 +#define FALSE  0
22860 +
22861 +
22862 +enum
22863 +{
22864 +  NO_MODE,
22865 +  MULTI_MODE,
22866 +  T1413_MODE,
22867 +  GDMT_MODE,
22868 +  GLITE_MODE
22869 +};
22870 +
22871 +
22872 +
22873 +/* a structure to store all information we need
22874 +   for our thread */
22875 +typedef struct kthread_struct
22876 +{
22877 +  /* private data */
22878 +
22879 +  /* Linux task structure of thread */
22880 +  struct task_struct *thread;
22881 +  /* Task queue need to launch thread */
22882 +  struct tq_struct tq;
22883 +  /* function to be started as thread */
22884 +  void (*function) (struct kthread_struct *kthread);
22885 +  /* semaphore needed on start and creation of thread. */
22886 +  struct semaphore startstop_sem;
22887 +
22888 +  /* public data */
22889 +
22890 +  /* queue thread is waiting on. Gets initialized by
22891 +  init_kthread, can be used by thread itself.
22892 +  */
22893 +  wait_queue_head_t queue;
22894 +  /* flag to tell thread whether to die or not.
22895 +    When the thread receives a signal, it must check
22896 +    the value of terminate and call exit_kthread and terminate
22897 +    if set.
22898 +  */
22899 +  int terminate;
22900 +  /* additional data to pass to kernel thread */
22901 +  void *arg;
22902 +} kthread_t;
22903 +
22904 +#ifndef ADIAG
22905 +#define DSP_FIRMWARE_PATH "/lib/modules/ar0700xx.bin"
22906 +#else
22907 +#define DSP_FIRMWARE_PATH "/var/tmp/ar0700xx_diag.bin"
22908 +#endif
22909 +
22910 +/* externs */
22911 +extern struct atm_dev *mydev;
22912 +extern unsigned int oamFarLBCount[4];
22913 +extern int dslhal_support_restoreTrainingInfo(PITIDSLHW_T pIhw);
22914 +/* gloabal functions */
22915 +
22916 +/* end of global functions */
22917 +
22918 +/* module wide declars */
22919 +static PITIDSLHW_T    pIhw;
22920 +static char    mod_req[16]={'\t'};
22921 +static volatile int bshutdown; 
22922 +static char info[MAX_STR_SIZE];
22923 +static DECLARE_MUTEX_LOCKED(adsl_sem_overlay); /* Used for DSL Polling enable     */
22924 +kthread_t overlay_thread;
22925 +/* end of module wide declars */
22926 +
22927 +/* Internal Functions */
22928 +static void tn7dsl_chng_modulation(void* data);
22929 +static void tn7dsl_set_modulation(void* data);
22930 +static int tn7dsl_reload_overlay(void);
22931 +static int dslmod_sysctl(ctl_table *ctl, int write, struct file * filp, void *buffer, size_t *lenp);
22932 +static void tn7dsl_register_dslss_led(void);
22933 +void tn7dsl_dslmod_sysctl_register(void);
22934 +void tn7dsl_dslmod_sysctl_unregister(void);
22935 +/* end of internal functions */
22936 +
22937 +
22938 +
22939 +
22940 +
22941 +/* prototypes */
22942 +
22943 +/* start new kthread (called by creator) */
22944 +void start_kthread(void (*func)(kthread_t *), kthread_t *kthread);
22945 +
22946 +/* stop a running thread (called by "killer") */
22947 +void stop_kthread(kthread_t *kthread);
22948 +
22949 +/* setup thread environment (called by new thread) */
22950 +void init_kthread(kthread_t *kthread, char *name);
22951 +
22952 +/* cleanup thread environment (called by thread upon receiving termination signal) */
22953 +void exit_kthread(kthread_t *kthread);
22954 +
22955 +
22956 +
22957 +/* private functions */
22958 +static void kthread_launcher(void *data)
22959 +{
22960 +        kthread_t *kthread = data;
22961 +        kernel_thread((int (*)(void *))kthread->function, (void *)kthread, 0);
22962 +        
22963 +}
22964 +
22965 +/* public functions */
22966 +
22967 +/* create a new kernel thread. Called by the creator. */
22968 +void start_kthread(void (*func)(kthread_t *), kthread_t *kthread)
22969 +{
22970 +        /* initialize the semaphore:
22971 +           we start with the semaphore locked. The new kernel
22972 +           thread will setup its stuff and unlock it. This
22973 +           control flow (the one that creates the thread) blocks
22974 +           in the down operation below until the thread has reached
22975 +           the up() operation.
22976 +         */
22977 +        //init_MUTEX_LOCKED(&kthread->startstop_sem);
22978 +
22979 +        /* store the function to be executed in the data passed to
22980 +           the launcher */
22981 +        kthread->function=func;
22982 +        
22983 +        /* create the new thread my running a task through keventd */
22984 +
22985 +        /* initialize the task queue structure */
22986 +        kthread->tq.sync = 0;
22987 +        INIT_LIST_HEAD(&kthread->tq.list);
22988 +        kthread->tq.routine =  kthread_launcher;
22989 +        kthread->tq.data = kthread;
22990 +
22991 +        /* and schedule it for execution */
22992 +        schedule_task(&kthread->tq);
22993 +
22994 +        /* wait till it has reached the setup_thread routine */
22995 +        //down(&kthread->startstop_sem);
22996 +               
22997 +}
22998 +
22999 +/* stop a kernel thread. Called by the removing instance */
23000 +void stop_kthread(kthread_t *kthread)
23001 +{
23002 +        if (kthread->thread == NULL)
23003 +        {
23004 +                printk("stop_kthread: killing non existing thread!\n");
23005 +                return;
23006 +        }
23007 +
23008 +        /* this function needs to be protected with the big
23009 +       kernel lock (lock_kernel()). The lock must be
23010 +           grabbed before changing the terminate
23011 +       flag and released after the down() call. */
23012 +        lock_kernel();
23013 +        
23014 +        /* initialize the semaphore. We lock it here, the
23015 +           leave_thread call of the thread to be terminated
23016 +           will unlock it. As soon as we see the semaphore
23017 +           unlocked, we know that the thread has exited.
23018 +    */
23019 +        //init_MUTEX_LOCKED(&kthread->startstop_sem);
23020 +
23021 +        /* We need to do a memory barrier here to be sure that
23022 +           the flags are visible on all CPUs. 
23023 +        */
23024 +        mb();
23025 +
23026 +        /* set flag to request thread termination */
23027 +        kthread->terminate = 1;
23028 +
23029 +        /* We need to do a memory barrier here to be sure that
23030 +           the flags are visible on all CPUs. 
23031 +        */
23032 +        mb();
23033 +        kill_proc(kthread->thread->pid, SIGKILL, 1);
23034 +       
23035 +        /* block till thread terminated */
23036 +        //down(&kthread->startstop_sem);
23037 +
23038 +        /* release the big kernel lock */
23039 +        unlock_kernel();
23040 +
23041 +        /* now we are sure the thread is in zombie state. We
23042 +           notify keventd to clean the process up.
23043 +        */
23044 +        kill_proc(2, SIGCHLD, 1);
23045 +
23046 +}
23047 +
23048 +/* initialize new created thread. Called by the new thread. */
23049 +void init_kthread(kthread_t *kthread, char *name)
23050 +{
23051 +        /* lock the kernel. A new kernel thread starts without
23052 +           the big kernel lock, regardless of the lock state
23053 +           of the creator (the lock level is *not* inheritated)
23054 +        */
23055 +        lock_kernel();
23056 +
23057 +        /* fill in thread structure */
23058 +        kthread->thread = current;
23059 +
23060 +        /* set signal mask to what we want to respond */
23061 +        siginitsetinv(&current->blocked, sigmask(SIGKILL)|sigmask(SIGINT)|sigmask(SIGTERM));
23062 +
23063 +        /* initialise wait queue */
23064 +        init_waitqueue_head(&kthread->queue);
23065 +
23066 +        /* initialise termination flag */
23067 +        kthread->terminate = 0;
23068 +
23069 +        /* set name of this process (max 15 chars + 0 !) */
23070 +        sprintf(current->comm, name);
23071 +        
23072 +        /* let others run */
23073 +        unlock_kernel();
23074 +
23075 +        /* tell the creator that we are ready and let him continue */
23076 +        //up(&kthread->startstop_sem);
23077 +
23078 +}
23079 +
23080 +/* cleanup of thread. Called by the exiting thread. */
23081 +void exit_kthread(kthread_t *kthread)
23082 +{
23083 +        /* we are terminating */
23084 +
23085 +    /* lock the kernel, the exit will unlock it */
23086 +        lock_kernel();
23087 +        kthread->thread = NULL;
23088 +        mb();
23089 +
23090 +        /* notify the stop_kthread() routine that we are terminating. */
23091 +    //up(&kthread->startstop_sem);
23092 +    /* the kernel_thread that called clone() does a do_exit here. */
23093 +
23094 +    /* there is no race here between execution of the "killer" and real termination
23095 +       of the thread (race window between up and do_exit), since both the
23096 +       thread and the "killer" function are running with the kernel lock held.
23097 +       The kernel lock will be freed after the thread exited, so the code
23098 +       is really not executed anymore as soon as the unload functions gets
23099 +       the kernel lock back.
23100 +       The init process may not have made the cleanup of the process here,
23101 +       but the cleanup can be done safely with the module unloaded.
23102 +    */
23103 +
23104 +}
23105 +
23106 +
23107 +
23108 +int os_atoi(const char *pStr)
23109 +{
23110 +  int retVal = -1;
23111 +
23112 +  if(*pStr=='-')
23113 +    retVal =  -simple_strtoul(pStr+1, (char **)NULL, 10);
23114 +  else
23115 +    retVal =  simple_strtoul(pStr, (char **)NULL, 10);  
23116 +  return retVal ;
23117 +}
23118 +
23119 +
23120 +int os_atoh(const char *pStr)
23121 +{
23122 +  int retVal = -1;
23123 +
23124 +  if(*pStr=='-')
23125 +    retVal =  -simple_strtoul(pStr+1, (char **)NULL, 16);
23126 +  else
23127 +    retVal =  simple_strtoul(pStr, (char **)NULL, 16);  
23128 +  return retVal ;
23129 +}
23130 +
23131 +unsigned long os_atoul(const char *pStr)
23132 +{
23133 +  unsigned long retVal = -1;
23134 +
23135 +  retVal =  simple_strtoul(pStr, (char **)NULL, 10);  
23136 +  return retVal ;
23137 +}
23138 +
23139 +void dprintf( int uDbgLevel, char * szFmt, ...)
23140 +{
23141 +#ifdef DEBUG_BUILD
23142 +    static char     buff[256];
23143 +    va_list  ap; 
23144 +
23145 +    if( __guDbgLevel < uDbgLevel) 
23146 +        return;
23147 +
23148 +    va_start( ap, szFmt); 
23149 +    vsprintf((char *)buff, szFmt, ap); 
23150 +    va_end(ap); 
23151 +    printk("%s", buff);
23152 +#endif
23153 +}
23154 +
23155 +/*int strcmp(const char *s1, const char *s2)
23156 +{
23157 +
23158 +  int i=0;
23159 +  
23160 +  while(s1[i] !=0)
23161 +  {
23162 +    if(s2[i]==0)
23163 +      return -1;
23164 +    if(s1[i] != s2[i])
23165 +      return 1;
23166 +    i++;
23167 +  }
23168 +  if(s2[i] != 0)
23169 +    return 1;
23170 +  return 0;
23171 +}
23172 +*/
23173 +
23174 +int shim_osLoadFWImage(unsigned char *ptr)
23175 +{
23176 +  unsigned int bytesRead;
23177 +  mm_segment_t  oldfs;  
23178 +  static struct file *filp;
23179 +  unsigned int imageLength=0x4ffff;  
23180 +   
23181 +    
23182 +  dprintf(4, "tn7dsl_read_dsp()\n");
23183 +
23184 +  dprintf(4,"open file %s\n", DSP_FIRMWARE_PATH);
23185 +  
23186 +  filp=filp_open(DSP_FIRMWARE_PATH
23187 +                                  ,00,O_RDONLY);
23188 +      
23189 +  if(filp ==NULL)
23190 +  {
23191 +    printk("Failed: Could not open DSP binary file\n");
23192 +          return -1;
23193 +  }
23194 +      
23195 +  if (filp->f_op->read==NULL)
23196 +          return -1;  /* File(system) doesn't allow reads */
23197 +
23198 +        /* Now read bytes from postion "StartPos" */
23199 +        filp->f_pos = 0;
23200 +  oldfs = get_fs();
23201 +        set_fs(KERNEL_DS);
23202 +        bytesRead = filp->f_op->read(filp,ptr,imageLength,&filp->f_pos);
23203 +
23204 +  dprintf(4,"file length = %d\n", bytesRead);
23205 +
23206 +  set_fs(oldfs);
23207 +
23208 +        /* Close the file */
23209 +        fput(filp); 
23210 +    
23211 +  return bytesRead;
23212 +}
23213 +
23214 +unsigned int shim_read_overlay_page(void *ptr, unsigned int secOffset, unsigned int secLength)
23215 +{
23216 +  unsigned int bytesRead;
23217 +  mm_segment_t  oldfs;  
23218 +  struct file *filp;
23219 +  
23220 +  dprintf(4,"shim_read_overlay_page\n");
23221 +  //dprintf(4,"sec offset=%d, sec length =%d\n", secOffset, secLength);
23222 +  
23223 +  filp=filp_open(DSP_FIRMWARE_PATH,00,O_RDONLY);  
23224 +  if(filp ==NULL)
23225 +  {
23226 +    printk("Failed: Could not open DSP binary file\n");
23227 +          return -1;
23228 +  }
23229 +      
23230 +  if (filp->f_op->read==NULL)
23231 +          return -1;  /* File(system) doesn't allow reads */
23232 +
23233 +  /* Now read bytes from postion "StartPos" */
23234 +
23235 +  if(filp->f_op->llseek)
23236 +    filp->f_op->llseek(filp,secOffset, 0);
23237 +  oldfs = get_fs();
23238 +  set_fs(KERNEL_DS);
23239 +  filp->f_pos = secOffset;
23240 +  bytesRead = filp->f_op->read(filp,ptr,secLength,&filp->f_pos);
23241 +
23242 +  set_fs(oldfs);
23243 +   /* Close the file */
23244 +  fput(filp);  
23245 +  return bytesRead;
23246 +}
23247 +
23248 +int shim_osLoadDebugFWImage(unsigned char *ptr)
23249 +{
23250 +  return 0;
23251 +}
23252 +int shim_osStringCmp(const char *s1, const char *s2)
23253 +{
23254 +  return strcmp(s1, s2);
23255 +}
23256 +
23257 +void *shim_osAllocateMemory(unsigned int size)
23258 +{
23259 +  return ((void *)kmalloc(size, GFP_KERNEL));
23260 +}
23261 +
23262 +void *shim_osAllocateDmaMemory(unsigned int size)
23263 +{
23264 +  /*
23265 +  int order;
23266 +
23267 +  order=1;
23268 +  size=size/4096;
23269 +  while(size >= 1)
23270 +  {
23271 +    order++;
23272 +    size=size/2;
23273 +  }
23274 +
23275 +  return ( (void *)__get_free_pages(GFP_ATOMIC, order));
23276 +  */
23277 +  //return ((void *)kmalloc(size, GFP_ATOMIC));
23278 +  //return ((void *)kmalloc(size, GFP_KERNEL));
23279 +  void *ptr;
23280 +
23281 +  ptr = kmalloc(size, GFP_ATOMIC);
23282 +  if(ptr==NULL)
23283 +  {
23284 +    printk("failed atomic\n");
23285 +    ptr = kmalloc(size, GFP_KERNEL);
23286 +    if(ptr==NULL)
23287 +    {
23288 +      printk("failed kernel\n");
23289 +      ptr = kmalloc(size, GFP_KERNEL|GFP_DMA);
23290 +    }
23291 +  }
23292 +  printk("size=%d\n", size);
23293 +  return ptr;
23294 +
23295 +}
23296 +
23297 +
23298 +void shim_osFreeMemory(void *ptr, unsigned int size)
23299 +{
23300 +  
23301 +  kfree(ptr);
23302 +}
23303 +
23304 +void shim_osFreeDmaMemory(void *ptr, unsigned int size)
23305 +{
23306 +/*
23307 +  int order;
23308 +
23309 +  order=1;
23310 +  size=size/4096;
23311 +  while(size >=1)
23312 +  {
23313 +    order++;
23314 +    size=size/2;
23315 +  }
23316 +  free_pages(ptr, order);
23317 +*/
23318 +  kfree(ptr);
23319 +}
23320 +
23321 +void *shim_osAllocateVMemory(unsigned int size)
23322 +{
23323 +
23324 +  return ((void *)vmalloc(size));
23325 +}
23326 +
23327 +void shim_osFreeVMemory(void *ptr, unsigned int size)
23328 +{
23329 +  vfree(ptr);
23330 +}
23331 +
23332 +void shim_osMoveMemory(char *dst, char *src, unsigned int numBytes)
23333 +{
23334 +  memcpy(dst, src, numBytes);
23335 +}
23336 +
23337 +void shim_osZeroMemory(char *dst, unsigned int numBytes)
23338 +{
23339 +  memset(dst, 0, numBytes);
23340 +}
23341 +
23342 +void shim_osWriteBackCache(void *addr, unsigned int size)
23343 +{
23344 +  unsigned int i,Size=(((unsigned int)addr)&0xf)+size;
23345 +
23346 +  for (i=0;i<Size;i+=16,addr+=16)
23347 +  {
23348 +    __asm__(" .set mips3 ");
23349 +    __asm__(" cache  25, (%0)" : : "r" (addr));
23350 +    __asm__(" .set mips0 ");
23351 +  }
23352 +}
23353 +
23354 +void shim_osInvalidateCache(void *addr, unsigned int size)
23355 +{
23356 +  unsigned int i,Size=(((unsigned int)addr)&0xf)+size;
23357 +
23358 +  for (i=0;i<Size;i+=16,addr+=16)
23359 +  {
23360 +    __asm__(" .set mips3 ");
23361 +    __asm__("cache  17, (%0)" : : "r" (addr));
23362 +    __asm__(" .set mips0 ");
23363 +  }
23364 +}
23365 +
23366 +void shim_osClockWait(int val)
23367 +{
23368 +  unsigned int chkvalue;
23369 +  chkvalue=val/64;
23370 +  
23371 +  if(chkvalue > 1000)
23372 +    {
23373 +      mdelay(chkvalue/1000);
23374 +      return;
23375 +    }
23376 +  else
23377 +    udelay(val/64);
23378 +} /* end of cwait() */
23379 +
23380 +unsigned int shim_osClockTick(int val)
23381 +{
23382 +  return jiffies;
23383 +}
23384 +
23385 +int flags;
23386 +spinlock_t shimLock;
23387 +
23388 +void shim_osCriticalEnter(void)
23389 +{
23390 +  spin_lock_irqsave(&shimLock, flags);
23391 +
23392 +}
23393 +
23394 +
23395 +void shim_osCriticalExit(void)
23396 +{
23397 +  spin_unlock_irqrestore(&shimLock, flags);
23398 +}
23399 +
23400 +
23401 +int tn7dsl_proc_stats(char* buf, char **start, off_t offset, int count,
23402 +                 int *eof, void *data)
23403 +{
23404 +  
23405 +  int len = 0;
23406 +  int limit = count - 80;
23407 +  int F4count, F5count;
23408 +  
23409 +  
23410 +  /* Read Ax5 Stats */
23411 +  dslhal_api_gatherStatistics(pIhw);
23412 +  
23413 +  if(len<=limit)
23414 +    len += sprintf(buf+len, "\nAR7 DSL Modem Statistics:\n");
23415 +  if(len<=limit)
23416 +    len += sprintf(buf+len, "--------------------------------\n");
23417 +  /* us and ds Connection Rates */
23418 +  if(len<=limit)
23419 +    len += sprintf(buf+len, "[DSL Modem Stats]\n");
23420 +
23421 +
23422 +  if(len<=limit)
23423 +  {
23424 +    if(pIhw->lConnected != 1)
23425 +    {
23426 +      pIhw->AppData.USConRate = 0;
23427 +      pIhw->AppData.DSConRate = 0;
23428 +    }
23429 +    len += sprintf(buf+len, "\tUS Connection Rate:\t%u\tDS Connection Rate:\t%u\n",
23430 +                   (unsigned int)pIhw->AppData.USConRate,
23431 +                   (unsigned int)pIhw->AppData.DSConRate );
23432 +  }
23433 +  if(len<=limit)
23434 +    len += sprintf(buf+len, "\tDS Line Attenuation:\t%u\tDS Margin:\t\t%u\n",
23435 +                   (unsigned int)pIhw->AppData.dsLineAttn/2,
23436 +                   (unsigned int)pIhw->AppData.dsMargin/2 );
23437 +  if(len<=limit)
23438 +    len += sprintf(buf+len, "\tUS Line Attenuation:\t%u\tUS Margin:\t\t%u\n",
23439 +                   (unsigned int)pIhw->AppData.usLineAttn,
23440 +                   (unsigned int)pIhw->AppData.usMargin );
23441 +  if(len<=limit)
23442 +    len += sprintf(buf+len, "\tUS Payload :\t\t%u\tDS Payload:\t\t%u\n",
23443 +                   ((unsigned int)pIhw->AppData.usAtm_count[0] + (unsigned int)pIhw->AppData.usAtm_count[1])*48,
23444 +                   ((unsigned int)pIhw->AppData.dsGood_count[0] + (unsigned int)pIhw->AppData.dsGood_count[1])*48);
23445 +  /* Superframe Count */
23446 +  if(len<=limit)
23447 +    len += sprintf(buf+len, "\tUS Superframe Cnt :\t%u\tDS Superframe Cnt:\t%u\n",
23448 +                   (unsigned int)pIhw->AppData.usSuperFrmCnt,
23449 +                   (unsigned int)pIhw->AppData.dsSuperFrmCnt );
23450 +
23451 +  /* US and DS power */
23452 +  if(len<=limit)
23453 +    len += sprintf(buf+len, "\tUS Transmit Power :\t%u\tDS Transmit Power:\t%u\n",
23454 +                   (unsigned int)pIhw->AppData.usTxPower/256,
23455 +                   (unsigned int)pIhw->AppData.dsTxPower/256 );
23456 +  /* DSL Stats Errors*/  
23457 +  if(len<=limit)
23458 +    len += sprintf(buf+len, "\tLOS errors:\t\t%u\tSEF errors:\t\t%u\n",
23459 +                   (unsigned int)pIhw->AppData.LOS_errors,
23460 +                   (unsigned int)pIhw->AppData.SEF_errors );
23461 +  if(len<=limit)
23462 +    len += sprintf(buf+len, "\tFrame mode:\t\t%u\tMax Frame mode:\t\t%u\n",
23463 +                   (unsigned int)pIhw->AppData.FrmMode,
23464 +                   (unsigned int)pIhw->AppData.MaxFrmMode );
23465 +  if(len<=limit)
23466 +    len += sprintf(buf+len, "\tTrained Path:\t\t%u\tUS Peak Cell Rate:\t%u\n",
23467 +                   (unsigned int)pIhw->AppData.TrainedPath,
23468 +                   (unsigned int)pIhw->AppData.USConRate*1000/8/53 );
23469 +  if(len<=limit)
23470 +    len += sprintf(buf+len, "\tTrained Mode:\t\t%u\tSelected Mode:\t\t%u\n",
23471 +                   (unsigned int)pIhw->AppData.TrainedMode, (unsigned int)pIhw->AppData.StdMode );
23472 +
23473 +  if(len<=limit)
23474 +    len += sprintf(buf+len, "\tATUC Vendor ID:\t%u\tATUC Revision:\t\t%u\n",
23475 +                   (unsigned int)pIhw->AppData.atucVendorId, pIhw->AppData.atucRevisionNum);
23476 +  if(len<=limit)
23477 +    len += sprintf(buf+len, "\tHybrid Selected:\t%u\n",
23478 +                   (unsigned int)pIhw->AppData.currentHybridNum);
23479
23480 +  /* Upstream Interleaved Errors */
23481 +  if(len<=limit)
23482 +    len += sprintf(buf+len, "\n\t[Upstream (TX) Interleave path]\n");
23483 +  if(len<=limit)
23484 +    len += sprintf(buf+len, "\tCRC: \t%u\tFEC: \t%u\tNCD: \t%u\n",
23485 +                   (unsigned int)pIhw->AppData.usICRC_errors,
23486 +                   (unsigned int)pIhw->AppData.usIFEC_errors,
23487 +                   (unsigned int)pIhw->AppData.usINCD_error);
23488 +  if(len<=limit)
23489 +    len += sprintf(buf+len, "\tLCD: \t%u\tHEC: \t%u\n",
23490 +                   (unsigned int)pIhw->AppData.usILCD_errors,
23491 +                   (unsigned int)pIhw->AppData.usIHEC_errors);
23492 +  /* Downstream Interleaved Errors */
23493 +  if(len<=limit)
23494 +    len += sprintf(buf+len, "\n\t[Downstream (RX) Interleave path]\n");
23495 +  if(len<=limit)
23496 +    len += sprintf(buf+len, "\tCRC: \t%u\tFEC: \t%u\tNCD: \t%u\n",
23497 +                   (unsigned int)pIhw->AppData.dsICRC_errors,
23498 +                   (unsigned int)pIhw->AppData.dsIFEC_errors,
23499 +                   (unsigned int)pIhw->AppData.dsINCD_error);
23500 +  if(len<=limit)
23501 +    len += sprintf(buf+len, "\tLCD: \t%u\tHEC: \t%u\n",
23502 +                   (unsigned int)pIhw->AppData.dsILCD_errors,
23503 +                   (unsigned int)pIhw->AppData.dsIHEC_errors);
23504 +  /* Upstream Fast Errors */
23505 +  if(len<=limit)
23506 +    len += sprintf(buf+len, "\n\t[Upstream (TX) Fast path]\n");
23507 +  if(len<=limit)
23508 +    len += sprintf(buf+len, "\tCRC: \t%u\tFEC: \t%u\tNCD: \t%u\n",
23509 +                   (unsigned int)pIhw->AppData.usFCRC_errors,
23510 +                   (unsigned int)pIhw->AppData.usFFEC_errors,
23511 +                   (unsigned int)pIhw->AppData.usFNCD_error);
23512 +  if(len<=limit)
23513 +    len += sprintf(buf+len, "\tLCD: \t%u\tHEC: \t%u\n",
23514 +                   (unsigned int)pIhw->AppData.usFLCD_errors,
23515 +                   (unsigned int)pIhw->AppData.usFHEC_errors);
23516 +  /* Downstream Fast Errors */
23517 +  if(len<=limit)
23518 +    len += sprintf(buf+len, "\n\t[Downstream (RX) Fast path]\n");
23519 +  if(len<=limit)
23520 +    len += sprintf(buf+len, "\tCRC: \t%u\tFEC: \t%u\tNCD: \t%u\n",
23521 +                   (unsigned int)pIhw->AppData.dsFCRC_errors,
23522 +                   (unsigned int)pIhw->AppData.dsFFEC_errors,
23523 +                   (unsigned int)pIhw->AppData.dsFNCD_error);
23524 +  if(len<=limit)
23525 +    len += sprintf(buf+len, "\tLCD: \t%u\tHEC: \t%u\n",
23526 +                   (unsigned int)pIhw->AppData.dsFLCD_errors,
23527 +                   (unsigned int)pIhw->AppData.dsFHEC_errors);
23528 +  /* ATM stats upstream */
23529 +  if(len<=limit)
23530 +    len += sprintf(buf+len, "\n[ATM Stats]");
23531 +  if(len<=limit)
23532 +    len += sprintf(buf+len, "\n\t[Upstream/TX]\n");
23533 +  if(len<=limit)
23534 +    len += sprintf(buf+len, "\tGood Cell Cnt:\t%u\n\tIdle Cell Cnt:\t%u\n\n",
23535 +                   (unsigned int)pIhw->AppData.usAtm_count[0] + (unsigned int)pIhw->AppData.usAtm_count[1],
23536 +                   (unsigned int)pIhw->AppData.usIdle_count[0] + (unsigned int)pIhw->AppData.usIdle_count[1]);
23537 +  /* ATM stats downstream */
23538 +  if(len<=limit)
23539 +    len += sprintf(buf+len, "\n\t[Downstream/RX)]\n");
23540 +  if(len<=limit)
23541 +    len += sprintf(buf+len, "\tGood Cell Cnt:\t%u\n\tIdle Cell Cnt:\t%u\n\tBad Hec Cell Cnt:\t%u\n",
23542 +                   (unsigned int)pIhw->AppData.dsGood_count[0] + (unsigned int)pIhw->AppData.dsGood_count[1],
23543 +                   (unsigned int)pIhw->AppData.dsIdle_count[0] + (unsigned int)pIhw->AppData.dsIdle_count[1],
23544 +                   (unsigned int)pIhw->AppData.dsBadHec_count[0] + (unsigned int)pIhw->AppData.dsBadHec_count[1]);
23545 +  if(len<=limit)
23546 +    len += sprintf(buf+len, "\tOverflow Dropped Cell Cnt:\t%u\n",
23547 +                   (unsigned int)pIhw->AppData.dsOVFDrop_count[0] + (unsigned int)pIhw->AppData.dsOVFDrop_count[1]);
23548 +  tn7sar_get_stats(pIhw->pOsContext);
23549 +  if(len<=limit)
23550 +    len += sprintf(buf+len, "\n[SAR AAL5 Stats]\n");
23551 +  if(len<=limit)
23552 +    len += sprintf(buf+len, "\tTx PDU's:\t%u\n\tRx PDU's:\t%u\n",
23553 +                   sarStat.txPktCnt,
23554 +                   sarStat.rxPktCnt);
23555 +  if(len<=limit)
23556 +    len += sprintf(buf+len, "\tTx Total Bytes:\t%u\n\tRx Total Bytes:\t%u\n",
23557 +                   sarStat.txBytes,
23558 +                   sarStat.rxBytes);
23559 +  if(len<=limit)
23560 +    len += sprintf(buf+len, "\tTx Total Error Counts:\t%u\n\tRx Total Error Counts:\t%u\n\n",
23561 +                   sarStat.txErrors,
23562 +                   sarStat.rxErrors);
23563 +
23564 +  /* oam loopback info */
23565 +  if(len<=limit)
23566 +    len += sprintf(buf+len, "\n[OAM Stats]\n");
23567 +
23568 +  tn7sar_get_near_end_loopback_count(&F4count, &F5count);
23569 +
23570 +  if(len<=limit)
23571 +    {
23572 +    len += sprintf(buf+len, "\tNear End F5 Loop Back Count:\t%u\n\tNear End F4 Loop Back Count:\t%u\n\tFar End F5 Loop Back Count:\t%u\n\tFar End F4 Loop Back Count:\t%u\n",
23573 +                  F5count,
23574 +                  F4count,
23575 +                  oamFarLBCount[0] + oamFarLBCount[2],
23576 +                  oamFarLBCount[1] + oamFarLBCount[3]);
23577 +    }
23578 +  return len;
23579 +}
23580 +
23581 +int
23582 +tn7dsl_proc_modem(char* buf, char **start, off_t offset, int count,
23583 +                 int *eof, void *data)
23584 +{
23585 +  
23586 +  int len = 0;
23587 +  int limit = count - 80;
23588 +
23589 +  char *state;
23590 +  int tag;
23591 +   
23592 +  tag= dslhal_api_pollTrainingStatus(pIhw);
23593 +  tag = pIhw->AppData.bState;
23594 +  
23595 +  switch(tag){
23596 +    case 0:       state = "ACTREQ";     break;
23597 +    case 1:       state = "QUIET1";     break;
23598 +    case 2:       state = "IDLE";       break;
23599 +    case 3:       state = "INIT";       break;
23600 +    case 4:       state = "RTDL";       break;
23601 +    case 5:       state = "SHOWTIME";   break;
23602 +    default:      state = "unknown";    break;
23603 +  }
23604 +  
23605 +  if(pIhw->lConnected == 1)
23606 +    state = "SHOWTIME";
23607 +  if(len<=limit)
23608 +    len += sprintf(buf+len,"%s\n",state);
23609 +  
23610 +  return len;
23611 +}
23612 +
23613 +
23614 +
23615 +int tn7dsl_handle_interrupt(void)
23616 +{
23617 +  int intsrc;
23618 +  unsigned char cMsgRa[6];
23619 +  short margin;
23620 +
23621 +  dprintf(4, "tn7dsl_handle_dsl_interrupt()\n");
23622 +  if(pIhw)
23623 +  {
23624 +    intsrc=dslhal_api_acknowledgeInterrupt(pIhw);
23625 +    dslhal_api_handleTrainingInterrupt(pIhw, intsrc);
23626 +
23627 +    if(pIhw->lConnected == TC_SYNC)
23628 +    {
23629 +      
23630 +      if(dslInSync == 0)
23631 +      {
23632 +        printk("DSL in Sync\n");
23633 +        tn7atm_device_connect_status(pIhw->pOsContext, 1);
23634 +        dslhal_api_initStatistics(pIhw);
23635 +        dslhal_api_gatherStatistics(pIhw);
23636 +#ifdef CONFIG_LED_MODULE
23637 +//        led_operation(MOD_ADSL, DEF_ADSL_SYNC);           
23638 +        led_on = DEF_ADSL_SYNC;
23639 +#endif
23640 +        /* add auto margin retrain */
23641 +        if(pIhw->AppData.TrainedMode < 5)
23642 +        {
23643 +          if(bMarginRetrainEnable && bMarginThConfig == 0)
23644 +          {
23645 +            dslhal_support_getCMsgsRa(pIhw, cMsgRa);
23646 +            margin = *(unsigned short *)&cMsgRa[4];
23647 +            margin = (margin >> 6) & 0x3f;
23648 +            if(margin & 0x20) // highest bit is 1
23649 +            {
23650 +              margin = -(margin & 0x1f);
23651 +            }
23652 +          
23653 +            //printk("margin = %d, cmsg-ra = %02x %02x %02x %02x %02x %02x\n", margin, cMsgRa[0],cMsgRa[1],cMsgRa[2],cMsgRa[3],cMsgRa[4],cMsgRa[5]);
23654 +            dslhal_api_setMarginThreshold(pIhw, margin*2); /* DSL margin is in 0.5db */
23655 +          }
23656 +        }
23657 +
23658 +      }
23659 +      dslInSync = 1;
23660 +    }
23661 +    else
23662 +    {
23663 +      if(dslInSync == 1)
23664 +      {
23665 +        dslInSync = 0;
23666 +        tn7atm_device_connect_status(pIhw->pOsContext, 0);
23667 +        up(&adsl_sem_overlay);
23668 +        printk("DSL out of syn\n");
23669 +      }
23670 +#ifdef CONFIG_LED_MODULE
23671 +      if(pIhw->AppData.bState < RSTATE_INIT)
23672 +      {
23673 +        if(led_on != DEF_ADSL_IDLE)
23674 +        {
23675 +//          led_operation(MOD_ADSL, DEF_ADSL_IDLE);           
23676 +          led_on = DEF_ADSL_IDLE;
23677 +        }
23678 +      }
23679 +      else
23680 +      {
23681 +        if(led_on != DEF_ADSL_TRAINING)
23682 +        {
23683 +//          led_operation(MOD_ADSL, DEF_ADSL_TRAINING);           
23684 +          led_on = DEF_ADSL_TRAINING;
23685 +        }
23686 +
23687 +      }
23688 +      
23689 +#endif
23690 +
23691 +    }
23692 +  }
23693 +  return 0;
23694 +}
23695 +
23696 +
23697 +int tn7dsl_get_dslhal_version(char *pVer)
23698 +{
23699 +  dslVer ver;
23700 +
23701 +  dslhal_api_getDslHalVersion(&ver);
23702 +
23703 +  memcpy(pVer,&ver,8);
23704 +  return 0;
23705 +}
23706 +
23707 +int tn7dsl_get_dsp_version(char *pVer)
23708 +{
23709 +  dspVer ver;
23710 +  dslhal_api_getDspVersion(pIhw, &ver);
23711 +  memcpy(pVer, &ver, 9);
23712 +  return 0;
23713 +}
23714 +
23715 +
23716 +static int
23717 +tn7dsl_get_modulation(void)
23718 +{
23719 +  char  *ptr = NULL;
23720 +  
23721 +  dprintf(4, "tn7dsl_get_modulation\n");
23722 +  //printk("tn7dsl_get_modulation\n");
23723 +  ptr = prom_getenv("modulation");
23724 +
23725 +  if (!ptr) {
23726 +    //printk("modulation is not set in adam2 env\n");
23727 +    //printk("Using multimode\n");
23728 +    return 0;
23729 +  }
23730 +  printk("dsl modulation = %s\n", ptr);
23731 +
23732 +  tn7dsl_set_modulation(ptr);
23733 +
23734 +  return 0;
23735 +}
23736 +
23737 +
23738 +static int tn7dsl_set_dsl(void)
23739 +{
23740 +
23741 +  char  *ptr = NULL;
23742 +  int value;
23743 +  int i, offset[2]={4,11},oamFeature=0;
23744 +  char tmp[4];
23745 +  char dspVer[10];
23746
23747 +  // OAM Feature Configuration
23748 +  dslhal_api_dspInterfaceRead(pIhw,(unsigned int)pIhw->pmainAddr, 2, (unsigned int *)&offset, (unsigned char *)&oamFeature, 4);
23749 +  oamFeature |= dslhal_support_byteSwap32(0x0000000C);
23750 +  dslhal_api_dspInterfaceWrite(pIhw,(unsigned int)pIhw->pmainAddr, 2, (unsigned int *)&offset, (unsigned char *)&oamFeature, 4);
23751 +
23752 +  // modulation 
23753 +  ptr = prom_getenv("modulation");
23754 +  if (ptr) 
23755 +  {
23756 +    printk("dsl modulation = %s\n", ptr);
23757 +    tn7dsl_set_modulation(ptr);  
23758 +  }
23759 +
23760 +  // margin retrain
23761 +  ptr = NULL;
23762 +  ptr = prom_getenv("enable_margin_retrain");
23763 +  if(ptr)
23764 +  {
23765 +    value = os_atoi(ptr);
23766 +    if(value == 1)
23767 +    {
23768 +      dslhal_api_setMarginMonitorFlags(pIhw, 0, 1);
23769 +      bMarginRetrainEnable = 1;
23770 +      printk("enable showtime margin monitor.\n");
23771 +      ptr = NULL;
23772 +      ptr = prom_getenv("margin_threshold");
23773 +      if(ptr)
23774 +      {
23775 +        value = os_atoi(ptr);
23776 +        printk("Set margin threshold to %d x 0.5 db\n",value);
23777 +        if(value >= 0)
23778 +        {
23779 +          dslhal_api_setMarginThreshold(pIhw, value);
23780 +          bMarginThConfig=1;
23781 +        }
23782 +      }
23783 +    }
23784 +  }
23785 +
23786 +  // rate adapt
23787 +  ptr = NULL;
23788 +  ptr = prom_getenv("enable_rate_adapt");
23789 +  if(ptr)
23790 +  {
23791 +    dslhal_api_setRateAdaptFlag(pIhw, os_atoi(ptr));
23792 +  }
23793 +
23794 +  // trellis
23795 +  ptr = NULL;
23796 +  ptr = prom_getenv("enable_trellis");
23797 +  if(ptr)
23798 +  {
23799 +    dslhal_api_setTrellisFlag(pIhw, os_atoi(ptr));
23800 +  }
23801 +
23802 +  // maximum bits per carrier
23803 +  ptr = NULL;
23804 +  ptr = prom_getenv("maximum_bits_per_carrier");
23805 +  if(ptr)
23806 +  {
23807 +    dslhal_api_setMaxBitsPerCarrier(pIhw, os_atoi(ptr));
23808 +  }
23809 +
23810 +  // maximum interleave depth
23811 +  ptr = NULL;
23812 +  ptr = prom_getenv("maximum_interleave_depth");
23813 +  if(ptr)
23814 +  {
23815 +    dslhal_api_setMaxInterleaverDepth(pIhw, os_atoi(ptr));
23816 +  }
23817 +
23818 +  // inner and outer pairs
23819 +  ptr = NULL;
23820 +  ptr = prom_getenv("pair_selection");
23821 +  if(ptr)
23822 +  {
23823 +    dslhal_api_selectInnerOuterPair(pIhw, os_atoi(ptr));
23824 +  }
23825 +  
23826 +  ptr = NULL;
23827 +  ptr = prom_getenv("dgas_polarity");
23828 +  if(ptr)
23829 +  {
23830 +    dslhal_api_configureDgaspLpr(pIhw, 1, 1);
23831 +    dslhal_api_configureDgaspLpr(pIhw, 0, os_atoi(ptr));
23832 +  }
23833 +
23834 +  ptr = NULL;
23835 +  ptr = prom_getenv("los_alarm");
23836 +  if(ptr)
23837 +  {
23838 +    dslhal_api_disableLosAlarm(pIhw, os_atoi(ptr));
23839 +  }
23840 +
23841 +  ptr = NULL;
23842 +  ptr = prom_getenv("eoc_vendor_id");
23843 +  if(ptr)
23844 +  {
23845 +    for(i=0;i<8;i++)
23846 +    {
23847 +      tmp[0]=ptr[i*2];
23848 +      tmp[1]=ptr[i*2+1];
23849 +      tmp[2]=0;
23850 +      EOCVendorID[i] = os_atoh(tmp);
23851 +      //printk("tmp=%s--", tmp);
23852 +      //printk("ID[%d]=0x%02x ", i, (unsigned char)EOCVendorID[i]);
23853 +    }
23854 +    tn7dsl_get_dsp_version(dspVer);
23855 +    //printk("Annex =%d\n", dspVer[8]);
23856 +    if(dspVer[8]==2) // annex b
23857 +    {
23858 +      //printk("EOCVendorID=%02x %02x %02x %02x %02x %02x %02x %02x\n", EOCVendorID[0], EOCVendorID[1], EOCVendorID[2], EOCVendorID[3],
23859 +      //                                                                EOCVendorID[4], EOCVendorID[5], EOCVendorID[6], EOCVendorID[7]);
23860 +      dslhal_api_setEocVendorId(pIhw, EOCVendorID);
23861 +    }
23862 +    
23863 +  }
23864 +  
23865 +  return 0;
23866 +}
23867 +  
23868 +
23869 +
23870 +  
23871 +
23872 +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
23873 + * 
23874 + *  Function: static void tn7dsl_init(void)
23875 + *
23876 + *  Description: This function initializes
23877 + *               Ar7 DSL interface
23878 + *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
23879 +
23880 +int tn7dsl_init(void *priv)
23881 +{
23882 +  
23883 +  printk("Initializing DSL interface\n");
23884 +  
23885 +  
23886 +  /* start dsl */
23887 +  if(dslhal_api_dslStartup(&pIhw) !=0 )
23888 +  {
23889 +    printk("DSL start failed.\n");
23890 +    return -1;
23891 +  }
23892
23893 +  // set dsl into overlay page reload mode
23894 +  pIhw->bAutoRetrain = 1;
23895 +
23896 +  // set default training properties
23897 +  tn7dsl_set_dsl();
23898 +
23899 +  pIhw->pOsContext = priv;
23900 +
23901 +  //start_kthread(tn7dsl_reload_overlay, &overlay_thread);
23902 +
23903 +  /*register dslss LED with led module */
23904 +#ifdef CONFIG_LED_MODULE
23905 +  tn7dsl_register_dslss_led();
23906 +#endif
23907 +
23908 +  
23909 +  return 0;  /* What do we return here? */
23910 +}
23911 +
23912 +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
23913 + *
23914 + *  Function: int avsar_exit(void)
23915 + *
23916 + *  Description: Avalanche SAR exit function
23917 + *
23918 + *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
23919 +
23920 +void tn7dsl_exit (void)
23921 +{
23922
23923 +  bshutdown = 1;
23924 +#ifdef CONFIG_LED_MODULE
23925 +#ifdef DEREGISTER_LED
23926 +  //down(&adsl_sem_overlay);
23927 +  deregister_led_drv(LED_NUM_1);
23928 +  deregister_led_drv(LED_NUM_2);
23929 +#else
23930 +//  led_operation(MOD_ADSL,DEF_ADSL_IDLE);
23931 +#endif
23932 +#endif
23933 +  stop_kthread(&overlay_thread);
23934 +  dslhal_api_dslShutdown(pIhw);
23935 +
23936 +}
23937 +
23938 +
23939 +static int tn7dsl_process_oam_string(int *type, int *pvpi, int *pvci, int *pdelay)
23940 +{
23941 +  int i=1;
23942 +  int j=0;
23943 +  int vci, vpi;
23944 +  char tmp[16];
23945 +  int chan;
23946 +  int tt;
23947 +
23948 +  while(j<8)
23949 +  {
23950 +    tmp[j] = mod_req[i];
23951 +    //printk("tmp[%d]=%c, %d\n", j, tmp[j], tmp[j]); 
23952 +    if(tmp[j] == 0x50 || tmp[j] == 0x70)
23953 +      break;
23954 +    j++;
23955 +    i++;
23956 +  }
23957 +
23958 +  tmp[j] = 0;
23959 +  vpi = os_atoi(tmp);
23960 +
23961 +  i++;
23962 +  j=0;
23963 +  while(j<8)
23964 +  {
23965 +    tmp[j] = mod_req[i];
23966 +    //printk("tmp[%d]=%c, %d\n", j, tmp[j], tmp[j]); 
23967 +    if(tmp[j] == 0x43 || tmp[j] == 0x63)
23968 +      break;
23969 +
23970 +    j++;
23971 +    i++;
23972 +  }
23973 +
23974 +  vci = os_atoi(tmp);
23975 +
23976 +  if(vci==0) // f4 oam
23977 +    *type = 1;
23978 +  else
23979 +    *type = 0;
23980 +
23981 +
23982 +  tt=5000;
23983 +  i++;
23984 +  j=0;
23985 +  tmp[j] = mod_req[i];
23986 +  if(tmp[j]==0x44 || tmp[j]==0x64)
23987 +  {
23988 +    i++;
23989 +    while(j<8)
23990 +    {
23991 +      tmp[j] = mod_req[i];
23992 +
23993 +      //printk("tmp[%d]=%c, %d\n", j, tmp[j], tmp[j]); 
23994 +      if(tmp[j] == 0x54 || tmp[j] == 0x74)
23995 +        break;
23996 +
23997 +      j++;
23998 +      i++;
23999 +    }
24000 +    tt = os_atoi(tmp);
24001 +  }
24002 +
24003 +  chan = tn7atm_lut_find(vpi, vci);
24004 +  
24005 +  *pvci=vci;
24006 +  *pvpi=vpi;
24007 +  *pdelay =tt;
24008 +  dprintf(2, "oam chan=%d, type =%d\n", chan, *type);
24009
24010 +  return chan;
24011 +}
24012 +
24013 +static void tn7dsl_dump_memory(void)
24014 +{
24015 +  unsigned int *pUi;
24016 +  int i=1;
24017 +  int j=0;
24018 +  int addr, len;
24019 +  char tmp[16];
24020 +
24021 +
24022 +  while(j<8)
24023 +  {
24024 +    tmp[j] = mod_req[i];
24025 +    j++;
24026 +    i++;
24027 +  }
24028 +
24029 +  tmp[j] = 0;
24030 +          
24031 +  addr = os_atoh(tmp);
24032 +
24033 +  printk("start dump address =0x%x\n", addr);
24034 +  pUi = (unsigned int *)addr;
24035 +  i++;
24036 +  j=0;
24037 +  while(j<8)
24038 +  {
24039 +    tmp[j] = mod_req[i];
24040 +    //printk("tmp[%d]=%c, %d\n", j, tmp[j], tmp[j]); 
24041 +    if(tmp[j] == 0x43 || tmp[j] == 0x63)
24042 +      break;
24043 +
24044 +    j++;
24045 +    i++;
24046 +  }
24047 +
24048 +  len = os_atoi(tmp);
24049 +  j=0;
24050 +  for(i=0; i<len; i++)
24051 +  {
24052 +    if(j==0)
24053 +      printk("0x%08x: ", (unsigned int)pUi);
24054 +    printk("%08x ", *pUi);
24055 +    pUi++;
24056 +    j++;
24057 +    if(j==4)
24058 +    {
24059 +      printk("\n");
24060 +      j=0;
24061 +    }
24062 +  }
24063 +     
24064 +}
24065 +
24066 +
24067 +
24068 +static int dslmod_sysctl(ctl_table *ctl, int write, struct file * filp,
24069 +      void *buffer, size_t *lenp)
24070 +{
24071 +  char *ptr;
24072 +  int ret, len = 0;
24073 +  int chan;
24074 +  int type;
24075 +  int vpi,vci,timeout;
24076 +  
24077 +  if (!*lenp || (filp->f_pos && !write)) {
24078 +    *lenp = 0;
24079 +    return 0;
24080 +    }
24081 +  /* DSL MODULATION is changed */
24082 +  if(write)
24083 +    {
24084 +    ret = proc_dostring(ctl, write, filp, buffer, lenp);
24085 +    
24086 +    switch (ctl->ctl_name)
24087 +      {
24088 +      case DEV_DSLMOD:
24089 +      ptr = strpbrk(info, " \t");
24090 +      strcpy(mod_req, info);
24091 +
24092 +      /* parse the string to determine the action */
24093 +      if(mod_req[0] == 0x45 || mod_req[0] == 0x65 ) // 'e', or 'E' f5 end to end 
24094 +      {
24095 +        chan = tn7dsl_process_oam_string(&type, &vpi, &vci, &timeout);
24096 +        tn7sar_oam_generation(pIhw->pOsContext, chan, type, vpi, vci, timeout);
24097 +      }
24098 +      else if(mod_req[0] == 0x53 || mod_req[0] == 0x73 ) // 's', or 'S' f5 seg to seg
24099 +      {
24100 +        chan=tn7dsl_process_oam_string(&type, &vpi, &vci,&timeout);
24101 +        type = type | (1<<1);
24102 +        tn7sar_oam_generation(pIhw->pOsContext, chan, type, vpi, vci,timeout);
24103 +      }
24104 +    //debug only. Dump memory
24105 +      else if(mod_req[0] == 0x44 || mod_req[0] == 0x64 ) // 'd' or 'D'
24106 +        tn7dsl_dump_memory();
24107 +      else
24108 +        tn7dsl_chng_modulation(info);
24109 +      break;
24110 +      }
24111 +    }
24112 +  else
24113 +    {
24114 +    len += sprintf(info+len, mod_req);
24115 +    ret = proc_dostring(ctl, write, filp, buffer, lenp);
24116 +    }
24117 +  return ret;
24118 +}
24119 +
24120 +
24121 +ctl_table dslmod_table[] = {
24122 +  {DEV_DSLMOD, "dslmod", info, DSL_MOD_SIZE, 0644, NULL, &dslmod_sysctl},
24123 +  {0}
24124 +  };
24125 +
24126 +/* Make sure that /proc/sys/dev is there */
24127 +ctl_table dslmod_root_table[] = {
24128 +#ifdef CONFIG_PROC_FS
24129 +  {CTL_DEV, "dev", NULL, 0, 0555, dslmod_table},
24130 +#endif /* CONFIG_PROC_FS */
24131 +  {0}
24132 +  };
24133 +
24134 +static struct ctl_table_header *dslmod_sysctl_header;
24135 +
24136 +void tn7dsl_dslmod_sysctl_register(void)
24137 +{
24138 +  static int initialized;
24139 +  
24140 +  if (initialized == 1)
24141 +    return;
24142 +  
24143 +  dslmod_sysctl_header = register_sysctl_table(dslmod_root_table, 1);
24144 +  dslmod_root_table->child->de->owner = THIS_MODULE;
24145 +  
24146 +  /* set the defaults */
24147 +  info[0] = 0;
24148 +  
24149 +  initialized = 1;
24150 +}
24151 +
24152 +void tn7dsl_dslmod_sysctl_unregister(void)
24153 +{
24154 +  unregister_sysctl_table(dslmod_sysctl_header);
24155 +}
24156 +
24157 +static void 
24158 +tn7dsl_set_modulation(void* data)
24159 +{
24160 +  dprintf(4,"tn7dsl_set_modulation\n");
24161 +  
24162 +  if(!strcmp(data, "T1413"))
24163 +  {
24164 +    printk("retraining in T1413 mode\n");
24165 +    dslhal_api_setTrainingMode(pIhw, T1413_MODE);
24166 +    return;
24167 +  }
24168 +  if(!strcmp(data, "GDMT"))
24169 +  {
24170 +    dslhal_api_setTrainingMode(pIhw, GDMT_MODE);
24171 +    return;
24172 +  }
24173 +  if(!strcmp(data, "GLITE"))
24174 +  {
24175 +    dslhal_api_setTrainingMode(pIhw, GLITE_MODE);
24176 +    return;
24177 +  }
24178 +  if(!strcmp(data, "MMODE"))
24179 +  {
24180 +    dslhal_api_setTrainingMode(pIhw, MULTI_MODE);
24181 +    return;
24182 +  }
24183 +  if(!strcmp(data, "NMODE"))
24184 +  {
24185 +    dslhal_api_setTrainingMode(pIhw, NO_MODE);
24186 +    return;
24187 +  }
24188 +
24189 +  return;
24190 +}
24191 +
24192 +
24193 +/* Codes added for compiling tiadiag.o for Analog Diagnostic tests */
24194 +#ifdef ADIAG
24195 +
24196 +enum
24197 +{
24198 +  HOST_ACTREQ,         // Send R-ACKREQ and monitor for C-ACKx
24199 +  HOST_QUIET,          // Sit quietly doing nothing for about 60 seconds, DEFAULT STATE; R_IDLE
24200 +  HOST_XMITBITSWAP,    // Perform upstream bitswap - FOR INTERNAL USE ONLY
24201 +  HOST_RCVBITSWAP,     // Perform downstream bitswap - FOR INTERNAL USE ONLY
24202 +  HOST_RTDLPKT,        // Send a remote download packet - FOR INTERNAL USE ONLY
24203 +  HOST_CHANGELED,      // Read the LED settings and change accordingly
24204 +  HOST_IDLE,           // Sit quiet
24205 +  HOST_REVERBTEST,     // Generate REVERB for manufacturing test
24206 +  HOST_CAGCTEST,       // Set coarse receive gain for manufacturing test
24207 +  HOST_DGASP,          // send Dying Gasp messages through EOC channel
24208 +  HOST_GHSREQ,         // G.hs - FOR INTERNAL USE ONLY
24209 +  HOST_GHSMSG,         // G.hs - FOR INTERNAL USE ONLY
24210 +  HOST_GHS_SENDGALF,   // G.hs - FOR INTERNAL USE ONLY
24211 +  HOST_GHSEXIT,        // G.hs - FOR INTERNAL USE ONLY
24212 +  HOST_GHSMSG1,        // G.hs - FOR INTERNAL USE ONLY
24213 +  HOST_HYBRID,         // Enable/Disable automatic hybrid switch
24214 +  HOST_RJ11SELECT,     // RJ11 inner/outer pair select
24215 +  HOST_DIGITAL_MEM,    // Digital Diags: run external memory tests
24216 +  HOST_TXREVERB,       // AFE Diags: TX path Reverb
24217 +  HOST_TXMEDLEY,       // AFE Diags: TX path Medley
24218 +  HOST_RXNOISEPOWER,   // AFE Diags: RX noise power
24219 +  HOST_ECPOWER,        // AFE Diags: RX eco power
24220 +  HOST_ALL_ADIAG,      // AFE Diags: all major analog diagnostic modes. Host is responsible to initiate each diagnostic sessions
24221 +  HOST_USER_ADIAG,     // AFE Diags: Host fills in analog diagnostic input data structure as specified and requests DSP to perform measurements as specified
24222 +  HOST_QUIT_ADIAG,     // AFE Diags: Host requests DSP to quit current diagnostic session. This is used for stopping the transmit REVERB/MEDLEY
24223 +  HOST_NO_CMD,         // All others - G.hs - FOR INTERNAL USE ONLY
24224 +  HOST_DSLSS_SHUTDOWN, // Host initiated DSLSS shutdown message
24225 +  HOST_SET_GENERIC,    // Set generic CO profile
24226 +  HOST_UNDO_GENERIC    // Set profile previous to Generic
24227 +};
24228 +
24229 +enum
24230 +{
24231 +  DSP_IDLE,               // R_IDLE state entered
24232 +  DSP_ACTMON,             // R_ACTMON state entered
24233 +  DSP_TRAIN,              // R_TRAIN state entered
24234 +  DSP_ACTIVE,             // R_ACTIVE state entered
24235 +  DSP_XMITBITSWAP,        // Upstream bitswap complete - FOR INTERNAL USE ONLY
24236 +  DSP_RCVBITSWAP,         // Downstream bitswap complete - FOR INTERNAL USE ONLY
24237 +  DSP_RTDL,               // R_RTDL state entered - FOR INTERNAL USE ONLY
24238 +  DSP_RRTDLPKT,           // RTDL packet received - FOR INTERNAL USE ONLY
24239 +  DSP_XRTDLPKT,           // RTDL packet transmitted - FOR INTERNAL USE ONLY
24240 +  DSP_ERROR,              // Command rejected, wrong state for this command
24241 +  DSP_REVERBTEST,         // Manufacturing REVERB test mode entered
24242 +  DSP_CAGCTEST,           // Manufacturing receive gain test done
24243 +  DSP_OVERLAY_START,      // Notify host that page overlay has started - overlay number indicated by "tag"
24244 +  DSP_OVERLAY_END,        // Notify host that page overlay has ended   - overlay number indicated by "tag"
24245 +  DSP_CRATES1,            // CRATES1 message is valid and should be copied to host memory now
24246 +  DSP_SNR,                // SNR calculations are ready and should be copied to host memory now
24247 +  DSP_GHSMSG,             // G.hs - FOR INTERNAL USE ONLY
24248 +  DSP_RCVBITSWAP_TIMEOUT, // Acknowledge Message was not received within ~500 msec (26 Superframes).
24249 +  DSP_ATM_TC_SYNC,        // Indicates true TC sync on both the upstream and downstream. Phy layer ready for data xfer.
24250 +  DSP_ATM_NO_TC_SYNC,     // Indicates loss of sync on phy layer on either US or DS.
24251 +  DSP_HYBRID,             // DSP completed hybrid switch
24252 +  DSP_RJ11SELECT,         // DSP completed RJ11 inner/outer pair select
24253 +  DSP_INVALID_CMD,        // Manufacturing (Digital and AFE) diags: CMD received not recognized
24254 +  DSP_TEST_PASSED,        // Manufacturing diags: test passed
24255 +  DSP_TEST_FAILED,        // Manufacturing diags: test failed
24256 +  DSP_TXREVERB,           // Manufacturing AFE diags: Response to HOST_TXREVERB
24257 +  DSP_TXMEDLEY,           // Manufacturing AFE diags: Response to HOST_TXMEDLEY
24258 +  DSP_RXNOISEPOWER,       // Manufacturing AFE diags: Response to HOST_RXNOISEPOWER
24259 +  DSP_ECPOWER,            // Manufacturing AFE diags: Response to HOST_ECPOWER
24260 +  DSP_ALL_ADIAG,          // Manufacturing AFE diags: Response to HOST_ALL_ADIAG
24261 +  DSP_USER_ADIAG,         // Manufacturing AFE diags: Response to HOST_USER_ADIAG
24262 +  DSP_QUIT_ADIAG,         // Manufacturing AFE diags: Response to HOST_QUIT_ADIAG
24263 +  DSP_DGASP               // DSP Message to indicate dying gasp
24264 +};
24265 +
24266 +static unsigned char analogNoTonesTestArray[64]=
24267 +  {
24268 +    0,0,0,0,0,0,0,0,  // Tones 01-08
24269 +    0,0,0,0,0,0,0,0,  // Tones 09-16
24270 +    0,0,0,0,0,0,0,0,  // Tones 17-24
24271 +    0,0,0,0,0,0,0,0,  // Tones 25-32
24272 +    0,0,0,0,0,0,0,0,  // Tones 33-40
24273 +    0,0,0,0,0,0,0,0,  // Tones 41-48
24274 +    0,0,0,0,0,0,0,0,  // Tones 49-56
24275 +    0,0,0,0,0,0,0,0   // Tones 57-64
24276 +  };
24277 +
24278 +static unsigned char analogAllTonesTestArray[64]=
24279 +  {
24280 +    1,1,1,1,1,1,1,1,  // Tones 01-08
24281 +    1,1,1,1,1,1,1,1,  // Tones 09-16
24282 +    1,1,1,1,1,1,1,1,  // Tones 17-24
24283 +    1,1,1,1,1,1,1,1,  // Tones 25-32
24284 +    1,1,1,1,1,1,1,1,  // Tones 33-40
24285 +    1,1,1,1,1,1,1,1,  // Tones 41-48
24286 +    1,1,1,1,1,1,1,1,  // Tones 49-56
24287 +    1,1,1,1,1,1,1,1   // Tones 57-64
24288 +  };
24289 +
24290 +static unsigned char analogEvenTonesTestArray[64]=
24291 +  {
24292 +    0,1,0,1,0,1,0,1,  // Tones 01-08
24293 +    0,1,0,1,0,1,0,1,  // Tones 09-16
24294 +    0,1,0,1,0,1,0,1,  // Tones 17-24
24295 +    0,1,0,1,0,1,0,1,  // Tones 25-32
24296 +    0,1,0,1,0,1,0,1,  // Tones 33-40
24297 +    0,1,0,1,0,1,0,1,  // Tones 41-48
24298 +    0,1,0,1,0,1,0,1,  // Tones 49-56
24299 +    0,1,0,1,0,1,0,1   // Tones 57-64
24300 +  };
24301 +
24302 +static unsigned char analogOddTonesTestArray[64]=
24303 +  {
24304 +    1,0,1,0,1,0,1,0,  // Tones 01-08
24305 +    1,0,1,0,1,0,1,0,  // Tones 09-16
24306 +    1,0,1,0,1,0,1,0,  // Tones 17-24
24307 +    1,0,1,0,1,0,1,0,  // Tones 25-32
24308 +    1,0,1,0,1,0,1,0,  // Tones 33-40
24309 +    1,0,1,0,1,0,1,0,  // Tones 41-48
24310 +    1,0,1,0,1,0,1,0,  // Tones 49-56
24311 +    1,0,1,0,1,0,1,0   // Tones 57-64
24312 +  };
24313 +
24314 +unsigned int shim_osGetCpuFrequency(void)
24315 +{
24316 +  return 150;
24317 +}
24318 +
24319 +static void tn7dsl_adiag(int Test, unsigned char *missingTones)
24320 +{
24321 +  int rc,cmd, tag;
24322 +
24323 +  rc = dslhal_diags_anlg_setMissingTones(pIhw,missingTones);
24324 +  if(rc)
24325 +  {
24326 +    printk(" failed to set Missing town\n");
24327 +    return;
24328 +  }
24329 +
24330 +/*********** Start the actual test **********************/
24331 +
24332 + if(Test==0)
24333 +   {
24334 +   printk("TX REVERB Test\n");
24335 +   rc = dslhal_support_writeHostMailbox(pIhw, HOST_TXREVERB, 0, 0, 0);
24336 +   if (rc)
24337 +     {
24338 +     printk("HOST_TXREVERB failed\n");
24339 +     return;
24340 +     }
24341 +
24342 +   }
24343 + if(Test==1)
24344 +   {
24345 +     dprintf(0,"TX MEDLEY Test\n");
24346 +     rc = dslhal_support_writeHostMailbox(pIhw, HOST_TXMEDLEY, 0, 0, 0);
24347 +     if (rc)
24348 +       return;
24349 +   }
24350 + dprintf(4,"dslhal_diags_anlg_testA() done\n");
24351 + return;
24352 +}
24353 +  
24354 +
24355 +static void tn7dsl_diagnostic_test(char *data)
24356 +{
24357 +  if(!strcmp(data, "ADIAGRALL"))
24358 +  {
24359 +    printk("TX Reverb All tone\n");
24360 +    tn7dsl_adiag(0,analogAllTonesTestArray);
24361 +    return;
24362 +  }
24363 +  if(!strcmp(data, "ADIAGRNONE"))
24364 +  {
24365 +    printk("TX Reverb No tone\n");
24366 +    tn7dsl_adiag(0,analogNoTonesTestArray);
24367 +    return;
24368 +  }
24369 +  if(!strcmp(data, "ADIAGREVEN"))
24370 +  {
24371 +    printk("TX Reverb Even tone\n");
24372 +    tn7dsl_adiag(0,analogEvenTonesTestArray);
24373 +    return;
24374 +  }
24375 +  if(!strcmp(data, "ADIAGRODD"))
24376 +  {
24377 +    printk("TX Reverb Odd tone\n");
24378 +    tn7dsl_adiag(0,analogOddTonesTestArray);
24379 +    return;
24380 +  }
24381 +  if(!strcmp(data, "ADIAGMALL"))
24382 +  {
24383 +    printk("TX Mdelay All tone\n");
24384 +    tn7dsl_adiag(1,analogAllTonesTestArray);
24385 +    return;
24386 +  }
24387 +  if(!strcmp(data, "ADIAGMNONE"))
24388 +  {
24389 +    printk("TX Mdelay No tone\n");
24390 +    tn7dsl_adiag(1,analogNoTonesTestArray);
24391 +    return;
24392 +  }
24393 +  if(!strcmp(data, "ADIAGMEVEN"))
24394 +  {
24395 +    printk("TX Mdelay Even tone\n");
24396 +    tn7dsl_adiag(1,analogEvenTonesTestArray);
24397 +    return;
24398 +  }
24399 +  if(!strcmp(data, "ADIAGMODD"))
24400 +  {
24401 +    printk("TX Mdelay Odd tone\n");
24402 +    tn7dsl_adiag(1,analogOddTonesTestArray);
24403 +    return;
24404 +  }
24405 +  if(!strcmp(data, "ADIAGQUIET"))
24406 +  {
24407 +    dslhal_api_sendIdle(pIhw);
24408 +    return;
24409 +  }
24410 +  if(!strncmp(data, "ADIAGRN", 7))
24411 +  {
24412 +    char tones[64], tmp[4];
24413 +    int  nth, i;
24414 +    
24415 +    tmp[0]=data[7];
24416 +    tmp[1]=data[8];
24417 +    tmp[2]=data[9];
24418 +    
24419 +    nth = os_atoi(tmp);
24420 +
24421 +    for(i=0;i<64;i++)
24422 +    {
24423 +      if(((i+1)% nth)==0)
24424 +      {
24425 +        tones[i]=0;
24426 +      }
24427 +      else
24428 +      {
24429 +        tones[i]=1;
24430 +      }
24431 +    }
24432 +    printk("TX Reverb with %dth tones missing.\n", nth);
24433 +    tn7dsl_adiag(0,tones);
24434 +    return;
24435 +  }
24436 +  if(!strncmp(data, "ADIAGMN", 7))
24437 +  {
24438 +    char tones[64], tmp[4];
24439 +    int  nth, i;
24440 +
24441 +    tmp[0]=data[7];
24442 +    tmp[1]=data[8];
24443 +    tmp[2]=data[9];
24444 +    nth = os_atoi(tmp);
24445 +
24446 +    for(i=0;i<64;i++)
24447 +    {
24448 +      if(((i+1)% nth)==0)
24449 +      {
24450 +        tones[i]=0;
24451 +      }
24452 +      else
24453 +      {
24454 +        tones[i]=1;
24455 +      }
24456 +    }
24457 +    printk("TX Mdelay with %dth tones missing.\n", nth);
24458 +    tn7dsl_adiag(1,tones);
24459 +    return;
24460 +  }
24461 +
24462 +
24463 +}
24464 +
24465 +#endif
24466 +
24467 +static void 
24468 +tn7dsl_chng_modulation(void* data)
24469 +{
24470 +  //printk("DSL Modem Retraining\n");
24471 +  
24472 +  if(!strcmp(data, "T1413"))
24473 +  {
24474 +    printk("retraining in T1413 mode\n");
24475 +    dslhal_api_setTrainingMode(pIhw, T1413_MODE);
24476 +    dslhal_api_sendQuiet(pIhw);
24477 +    return;
24478 +  }
24479 +  if(!strcmp(data, "GDMT"))
24480 +  {
24481 +    dslhal_api_setTrainingMode(pIhw, GDMT_MODE);
24482 +    dslhal_api_sendQuiet(pIhw);
24483 +    return;
24484 +  }
24485 +  if(!strcmp(data, "GLITE"))
24486 +  {
24487 +    dslhal_api_setTrainingMode(pIhw, GLITE_MODE);
24488 +    dslhal_api_sendQuiet(pIhw);
24489 +    return;
24490 +  }
24491 +  if(!strcmp(data, "MMODE"))
24492 +  {
24493 +    dslhal_api_setTrainingMode(pIhw, MULTI_MODE);
24494 +    dslhal_api_sendQuiet(pIhw);
24495 +    return;
24496 +  }
24497 +  if(!strcmp(data, "NMODE"))
24498 +  {
24499 +    dslhal_api_setTrainingMode(pIhw, NO_MODE);
24500 +    dslhal_api_sendQuiet(pIhw);
24501 +    return;
24502 +  }
24503 +
24504 +#ifdef ADIAG
24505 +  tn7dsl_diagnostic_test(data);
24506 +#endif
24507 +
24508 +
24509 +  return;
24510 +}
24511 +
24512 +#ifdef CONFIG_LED_MODULE
24513 +static void tn7dsl_led_on(unsigned long parm)
24514 +{
24515 +  dslhal_api_configureLed(pIhw,parm, 0);
24516 +}
24517 +
24518 +
24519 +static void tn7dsl_led_off(unsigned long parm)
24520 +{
24521 +  dslhal_api_configureLed(pIhw,parm, 1);
24522 +}
24523 +
24524 +static void tn7dsl_led_init(unsigned long parm)
24525 +{
24526 +  dslhal_api_configureLed(pIhw,parm, 2);
24527 +}
24528 +#endif
24529 +
24530 +static void tn7dsl_register_dslss_led(void)
24531 +{
24532 +#ifdef CONFIG_LED_MODULE
24533 +    
24534 +    // register led0 with led module
24535 +    ledreg[0].param = 0;
24536 +    ledreg[0].init = (void *)tn7dsl_led_init;
24537 +    ledreg[0].onfunc = (void *)tn7dsl_led_on;
24538 +    ledreg[0].offfunc = (void *)tn7dsl_led_off;
24539 +    register_led_drv(LED_NUM_1, &ledreg[0]);
24540 +
24541 +    // register led1 output with led module
24542 +    ledreg[1].param = 1;
24543 +    ledreg[1].init = (void *)tn7dsl_led_init;
24544 +    ledreg[1].onfunc = (void *)tn7dsl_led_on;
24545 +    ledreg[1].offfunc = (void *)tn7dsl_led_off;
24546 +    register_led_drv(LED_NUM_2, &ledreg[1]);
24547 +#endif  
24548 +}
24549 +
24550 +static int tn7dsl_reload_overlay(void)
24551 +{
24552 +  int overlayFlag;
24553 +  spinlock_t overlayLock;
24554 +
24555 +  init_kthread(&overlay_thread, "adsl");
24556 +  down(&adsl_sem_overlay);
24557 +  while(1)
24558 +  {
24559 +    mdelay(500);
24560 +    if(pIhw->lConnected == 0)
24561 +    {
24562 +      spin_lock_irqsave(&overlayLock, overlayFlag);
24563 +      dslhal_support_restoreTrainingInfo(pIhw);
24564 +      spin_unlock_irqrestore(&overlayLock, overlayFlag);
24565 +    }
24566 +    down(&adsl_sem_overlay);
24567 +  }
24568 +  return 0;
24569 +}
24570 +
24571 +
24572 +
24573 +
24574 diff -urN linux.old/drivers/atm/sangam_atm/tn7sar.c linux.dev/drivers/atm/sangam_atm/tn7sar.c
24575 --- linux.old/drivers/atm/sangam_atm/tn7sar.c   1970-01-01 01:00:00.000000000 +0100
24576 +++ linux.dev/drivers/atm/sangam_atm/tn7sar.c   2005-08-23 04:46:50.110841720 +0200
24577 @@ -0,0 +1,1376 @@
24578 +/******************************************************************************
24579 + * FILE PURPOSE:    OS files for CPSAR
24580 + ******************************************************************************
24581 + * FILE NAME:       tn7sar.c
24582 + *
24583 + * DESCRIPTION:     This file contains source for required os files for CPSAR
24584 + * 
24585 + * (C) Copyright 2002, Texas Instruments Inc
24586 + *
24587 + *
24588 + * Revision History:
24589 + * 0/11/02         Zhicheng Tang, created.
24590 + *
24591 + *******************************************************************************/
24592 +
24593 +#include <linux/config.h>
24594 +#include <linux/kernel.h>
24595 +#include <linux/module.h>
24596 +#include <linux/init.h>
24597 +#include <linux/atmdev.h>
24598 +#include <linux/delay.h>
24599 +#include <linux/spinlock.h>
24600 +#include <linux/smp_lock.h>
24601 +#include <asm/io.h>
24602 +#include <asm/mips-boards/prom.h>
24603 +#include <linux/proc_fs.h>
24604 +#include <linux/string.h>
24605 +#include <linux/ctype.h>
24606 +
24607 +
24608 +#define _CPHAL_AAL5
24609 +#define _CPHAL_SAR
24610 +#define _CPHAL_HAL
24611 +typedef void OS_PRIVATE;
24612 +typedef void OS_DEVICE;
24613 +typedef void OS_SENDINFO;
24614 +typedef void OS_RECEIVEINFO;
24615 +typedef void OS_SETUP;
24616 +
24617 +#include "cpswhal_cpsar.h"
24618 +#include "tn7atm.h"
24619 +#include "tn7api.h"
24620 +
24621 +
24622 +/* PDSP Firmware files */
24623 +#include "tnetd7300_sar_firm.h"
24624 +
24625 +
24626 +enum
24627 +{
24628 +  PACKET_TYPE_AAL5,
24629 +  PACKET_TYPE_NULL,
24630 +  PACKET_TYPE_OAM,
24631 +  PACKET_TYPE_TRANS,
24632 +  PACKET_TYPE_AAL2
24633 +}PACKET_TYPE;
24634 +
24635 +enum
24636 +{
24637 +  OAM_PING_FAILED,
24638 +  OAM_PING_SUCCESS,
24639 +  OAM_PING_PENDING,
24640 +  OAM_PING_NOT_STARTED
24641 +}OAM_PING;
24642 +
24643 +/* PDSP OAM General Purpose Registers (@todo: These need to be used in the HAL!) */
24644 +
24645 +#define SAR_PDSP_HOST_OAM_CONFIG_REG_ADDR 0xa3000020
24646 +#define SAR_PDSP_OAM_CORR_REG_ADDR        0xa3000024
24647 +#define SAR_PDSP_OAM_LB_RESULT_REG_ADDR   0xa3000028
24648 +#define SAR_PDSP_OAM_F5LB_COUNT_REG_ADDR  0xa300002c
24649 +#define SAR_PDSP_OAM_F4LB_COUNT_REG_ADDR  0xa3000030
24650 +
24651 +#define SAR_FREQUNCY 50000000
24652 +
24653 +#define AAL5_PARM "id=aal5, base = 0x03000000, offset = 0, int_line=15, ch0=[RxBufSize=1522; RxNumBuffers = 32; RxServiceMax = 50; TxServiceMax=50; TxNumBuffers=32; CpcsUU=0x5aa5; TxVc_CellRate=0x3000; TxVc_AtmHeader=0x00000640]"
24654 +#define SAR_PARM "id=sar,base = 0x03000000, reset_bit = 9, offset = 0; UniNni = 0, PdspEnable = 1"
24655 +#define RESET_PARM "id=ResetControl, base=0xA8611600"
24656 +#define CH0_PARM "RxBufSize=1522, RxNumBuffers = 32, RxServiceMax = 50, TxServiceMax=50, TxNumBuffers=32, CpcsUU=0x5aa5, TxVc_CellRate=0x3000, TxVc_AtmHeader=0x00000640"
24657 +
24658 +#define MAX_PVC_TABLE_ENTRY 16
24659 +
24660 +sar_stat_t sarStat;
24661
24662 +typedef struct _channel_parm
24663 +{
24664 +  unsigned int     RxBufSize;
24665 +  unsigned int     RxNumBuffers;
24666 +  unsigned int     RxServiceMax;
24667 +  unsigned int     TxServiceMax;
24668 +  unsigned int     TxNumBuffers;
24669 +  unsigned int     CpcsUU;
24670 +  unsigned int     TxVc_CellRate;
24671 +  unsigned int     TxVc_AtmHeader;
24672 +}channel_parm_t;
24673 +
24674 +typedef struct _aal5_parm
24675 +{
24676 +  unsigned int        base;
24677 +  unsigned int        offset;
24678 +  unsigned int        int_line;
24679 +  channel_parm_t      chan[8];
24680 +}aal5_parm_t;
24681 +
24682 +
24683 +typedef struct _sar_parm
24684 +{
24685 +  unsigned int        base;
24686 +  unsigned int        reset_bit;
24687 +  unsigned int        offset;
24688 +  unsigned int        UniNni;
24689 +}sar_parm_t;
24690 +
24691 +typedef struct _pvc_table
24692 +{
24693 +  int bInUse;
24694 +  int vpi;
24695 +  int vci;
24696 +}pvc_table;
24697 +
24698 +static aal5_parm_t aal5Parm;
24699 +static sar_parm_t  sarParm;
24700 +static char *pAal5, *pSar, *pReset;
24701 +static int oam_type;
24702 +static unsigned int oamPingStatus;
24703 +static int oamAtmHdr;
24704 +static int oamLbTimeout;
24705 +static char parm_data[1024];
24706 +static char aal5Data[1024];
24707 +static char sarData[1024];
24708 +static char resetData[256];
24709 +static pvc_table pvc_result[MAX_PVC_TABLE_ENTRY];
24710 +
24711 +/* external function */
24712 +extern int __guDbgLevel;
24713 +
24714 +/* gloabal function */
24715 +unsigned int oamFarLBCount[4];
24716 +/* end of gloabal function */
24717 +
24718 +/* internal APIs */
24719 +static int tn7sar_atm_header(int vpi, int vci);
24720 +static void tn7sar_record_pvc(int atmheader);
24721 +
24722 +/*end of internal APIs */
24723 +spinlock_t sar_lock;
24724 +
24725 +/* HAL OS support functions */
24726 +
24727 +
24728 +unsigned long tn7sar_strtoul(const char *str, char **endptr, int base)
24729 +{
24730 +  unsigned long ret;
24731 +
24732 +  ret= simple_strtoul(str, endptr, base); 
24733 +  return ret;
24734 +}
24735 +
24736 +static void *tn7sar_malloc(unsigned int size)
24737 +{
24738 +  return(kmalloc(size, GFP_KERNEL));
24739 +}
24740 +
24741 +static unsigned long lockflags;
24742 +static void tn7sar_critical_on(void)
24743 +{
24744 +  spin_lock_irqsave(&sar_lock,lockflags);
24745 +}
24746 +
24747 +static void tn7sar_critical_off(void)
24748 +{
24749 +  spin_unlock_irqrestore(&sar_lock,lockflags);
24750 +}
24751 +
24752 +static void tn7sar_data_invalidate(void *pmem, int size)
24753 +{
24754 +  unsigned int i,Size=(((unsigned int)pmem)&0xf)+size;
24755 +
24756 +  for (i=0;i<Size;i+=16,pmem+=16)
24757 +  {
24758 +    __asm__(" .set mips3 ");
24759 +    __asm__("cache  17, (%0)" : : "r" (pmem));
24760 +    __asm__(" .set mips0 ");
24761 +  }
24762 +
24763 +}
24764 +
24765 +static void tn7sar_data_writeback(void *pmem, int size)
24766 +{
24767 +  unsigned int i,Size=(((unsigned int)pmem)&0xf)+size;
24768 +
24769 +  for (i=0;i<Size;i+=16,pmem+=16)
24770 +  {
24771 +    __asm__(" .set mips3 ");
24772 +    __asm__(" cache  25, (%0)" : : "r" (pmem));
24773 +    __asm__(" .set mips0 ");
24774 +  }
24775 +}
24776 +
24777 +
24778 +static int 
24779 +tn7sar_find_device(int unit, const char *find_name, void *device_info)
24780 +{
24781 +  int ret_val = 0;
24782 +  char **ptr;
24783 +
24784 +  ptr = (char **)device_info;
24785 +  dprintf(3,"tn7sar_find_device\n");
24786 +  if(strcmp(find_name, "aal5")==0)
24787 +  {
24788 +    //dprintf(4,"pAal5=%s\n", pAal5);
24789 +    *ptr = pAal5;
24790 +  }
24791 +  else if(strcmp(find_name, "sar")==0)
24792 +  {
24793 +    dprintf(3, "pSar=%s\n", pSar);
24794 +    *ptr = pSar;
24795 +  }  
24796 +  else if(strcmp(find_name, "reset")==0)
24797 +  {
24798 +    dprintf(3, "pReset=%s\n", pReset);
24799 +    *ptr = pReset;
24800 +  }
24801 +
24802 +  device_info = NULL;
24803 +
24804 +  return(ret_val);
24805 +}
24806 +
24807 +static int 
24808 +tn7sar_get_device_parm_uint(void *dev_info, const char *param, unsigned int *value)
24809 +{
24810 +  char *dev_str;
24811 +  char *pMatch;
24812 +  int i=0, j=0;
24813 +  char val_str[64];
24814 +  unsigned int val;
24815 +  int base = 10;
24816 +
24817 +  dprintf(6, "tn7sar_get_device_parm_uint()\n");
24818 +
24819 +  dev_str = (char *)dev_info;
24820 +  dprintf(3, "parm=%s\n", param);
24821 +  pMatch = strstr(dev_str, param);
24822 +  //dprintf(4, "pMatch=%s\n", pMatch);
24823 +  if(pMatch)
24824 +  {
24825 +    //get "=" position
24826 +    while(pMatch[i] != 0x3d)
24827 +    {
24828 +      i++;
24829 +    }
24830 +    i++;
24831 +    // get rid of spaces
24832 +    while(pMatch[i]==0x20)
24833 +    {
24834 +      i++;
24835 +    }
24836 +    //get rid of 0x
24837 +    if(pMatch[i]==0x30)
24838 +    {
24839 +      if(pMatch[i+1] == 0x58 || pMatch[i+1] == 0x78)
24840 +      {
24841 +        i+=2;
24842 +        base = 16;
24843 +      }
24844 +    }
24845 +
24846 +    // get next delineator
24847 +    while(pMatch[i] != 0x2c && pMatch[i] != 0x0)
24848 +    {
24849 +      val_str[j]=pMatch[i];
24850 +      j++;
24851 +      i++;
24852 +    }
24853 +    val_str[j]=0;
24854 +    //dprintf(4, "val_str=\n%s\n", val_str);
24855 +    //xdump(val_str, strlen(val_str) + 1, 4);
24856 +    val = simple_strtoul(val_str, (char **)NULL, base);
24857 +    dprintf(4, "val =%d\n", val);
24858 +    *value = val;
24859 +    return 0;
24860 +  }
24861 +
24862 +
24863 +  dprintf(3, "match not found.\n");
24864 +  if(strcmp(dev_str, "debug")==0)
24865 +  {
24866 +    dprintf(6,"debug..\n");
24867 +    *value = 6;
24868 +    return 0;
24869 +  }
24870 +  return (1);
24871 +}
24872 +
24873 +static int tn7sar_get_device_parm_value(void *dev_info, const char *param, void *value)
24874 +{
24875 +  char *dev_str;
24876 +  char *pMatch;
24877 +  int i=0, j=0;
24878 +  char *pVal;
24879 +
24880 +  
24881 +  dprintf(3, "tn7sar_get_device_parm_value().\n");
24882 +  
24883 +  pVal = (char *) parm_data;
24884 +  dev_str = (char *)dev_info;
24885 +  dprintf(3, "dev_info: \n%s\n", dev_str);
24886 +  dprintf(3, "param=%s\n", param);
24887 +  if(strcmp(param, "Ch0")==0)
24888 +  {
24889 +    *(char **)value = CH0_PARM;
24890 +    dprintf(3, "value =%s\n", *(char **)value);
24891 +    return 0;
24892 +  }
24893 +
24894 +  pMatch = strstr(dev_str, param);
24895 +  if(pMatch)
24896 +  {
24897 +    //get "=" position
24898 +    while(pMatch[i] != 0x3d)
24899 +    {
24900 +      i++;
24901 +    }
24902 +    i++;
24903 +    // get rid of spaces
24904 +    while(pMatch[i]==0x20)
24905 +    {
24906 +      i++;
24907 +    }
24908 +
24909 +    if(pMatch[i] != 0x5b) //"["
24910 +    {
24911 +      // get next delineator
24912 +      while(pMatch[i] != 0x2c && pMatch[i] != 0x0)
24913 +      {
24914 +        pVal[j] = pMatch[i];
24915 +        j++;
24916 +        i++;
24917 +      }
24918 +      pVal[j]=0;
24919 +
24920 +      *(char **)value = pVal;
24921 +      return 0;
24922 +    }
24923 +    else
24924 +    {
24925 +      i++; //skip "["
24926 +      while(pMatch[i] != 0x5d)
24927 +      {
24928 +        if(pMatch[i] == 0x3b) //";"
24929 +          pVal[j] = 0x2c;
24930 +        else
24931 +          pVal[j] = pMatch[i];
24932 +        j++;
24933 +        i++;
24934 +      }
24935 +      pVal[j] = 0;
24936 +      *(char **)value = pVal;
24937 +      return 0;
24938 +    }
24939
24940 +  }
24941 +  
24942 +  return (1);
24943 +}
24944 +
24945 +static void tn7sar_free(void *pmem)
24946 +{
24947 +    kfree(pmem);
24948 +}
24949 +
24950 +static void 
24951 +tn7sar_free_buffer(OS_RECEIVEINFO *os_receive_info, void *pmem)
24952 +{
24953 +  tn7atm_free_rx_skb(os_receive_info);
24954 +}
24955 +
24956 +static void tn7sar_free_dev(void *pmem)
24957 +{
24958 +  kfree(pmem);
24959 +}
24960 +
24961 +static void tn7sar_free_dma_xfer(void *pmem)
24962 +{
24963 +  kfree(pmem);
24964 +}
24965 +
24966 +
24967 +static int
24968 +tn7sar_control(void *dev_info, const char *key, const char *action, void *value)
24969 +{
24970 +        int ret_val = -1;
24971 +
24972 +  if (strcmp(key, "Firmware") == 0)
24973 +  {
24974 +    if (strcmp(action, "Get") == 0)
24975 +    {
24976 +      *(int **)value = &SarPdspFirmware[0];
24977 +    }
24978 +    ret_val=0;
24979 +  }
24980 +        
24981 +  if (strcmp(key, "FirmwareSize") == 0)
24982 +  {
24983 +    if (strcmp(action, "Get") == 0)
24984 +    {       
24985 +      *(int *)value = sizeof(SarPdspFirmware);
24986 +    }
24987 +    ret_val=0;
24988 +  }
24989 +  
24990 +  if (strcmp(key, "OamLbResult") == 0)
24991 +  {
24992 +    dprintf(2, "get looback source call back\n");
24993 +    if (strcmp(action, "Set") == 0)
24994 +    {       
24995 +      dprintf(2, "oam result = %d\n", *(unsigned int *)value);
24996 +      oamFarLBCount[oam_type] = oamFarLBCount[oam_type] + *(unsigned int *)value;
24997 +      if(oamPingStatus == OAM_PING_PENDING)
24998 +      {
24999 +        oamPingStatus = *(unsigned int *)value;
25000 +        if(oamPingStatus == OAM_PING_SUCCESS)
25001 +        {
25002 +          /* record pvc */
25003 +          tn7sar_record_pvc(oamAtmHdr);
25004 +        }
25005 +      }
25006 +      
25007 +    }
25008 +    ret_val=0;
25009 +  }
25010 +  
25011 +  if (strcmp(key, "SarFreq") == 0)
25012 +  {
25013 +    if (strcmp(action, "Get") == 0)
25014 +    {       
25015 +      *(int *)value = SAR_FREQUNCY;
25016 +    }
25017 +    ret_val=0;
25018 +  }
25019 +  return(ret_val);
25020 +}
25021 +
25022 +
25023 +static void
25024 +tn7sar_sarhal_isr_register(OS_DEVICE *os_dev, int(*hal_isr)(HAL_DEVICE *, int *), int interrupt_num)
25025 +{
25026 +  tn7atm_sarhal_isr_register(os_dev, hal_isr, interrupt_num);
25027 +}
25028 +
25029 +static void 
25030 +tn7sar_isr_unregister(OS_DEVICE *os_dev, int interrupt_num)
25031 +{
25032 +    /* TODO */
25033 +}
25034 +
25035 +
25036 +static void *
25037 +tn7sar_malloc_rxbuffer(unsigned int size, void *mem_base, unsigned int mem_range, HAL_DEVICE *hal_dev, 
25038 +                       HAL_RECEIVEINFO *hal_info, OS_RECEIVEINFO **os_receive_info, OS_DEVICE *os_dev)
25039 +{
25040 +   return tn7atm_allocate_rx_skb(os_dev, os_receive_info, size);
25041 +}
25042 +
25043 +static void *
25044 +tn7sar_malloc_dev(unsigned int size)
25045 +{
25046 +  return(kmalloc(size, GFP_KERNEL));
25047 +}
25048 +
25049 +static void *
25050 +tn7sar_malloc_dma_xfer(unsigned int size, void *mem_base, unsigned int mem_range)
25051 +{
25052 +  dprintf(4, "tn7sar_malloc_dma_xfer, size =%d\n", size);
25053 +
25054 +  return (kmalloc(size, GFP_DMA |GFP_KERNEL));
25055 +  
25056 +}
25057 +
25058 +static void * 
25059 +tn7sar_memset(void *dst, int set_char, size_t count)
25060 +{
25061 +    return (memset(dst, set_char, count));
25062 +}
25063 +
25064 +static int tn7sar_printf(const char *format, ...)
25065 +{
25066 +  /* TODO: add debug levels */
25067 +  static char buff[256];
25068 +  va_list  ap; 
25069 +
25070 +  va_start( ap, format); 
25071 +  vsprintf((char *)buff, format, ap); 
25072 +  va_end(ap); 
25073 +
25074 +  printk("SAR HAL: %s\n", buff);
25075 +  return(0);
25076 +}
25077 +
25078 +static void tn7sar_record_pvc(int atmheader)
25079 +{
25080 +  int vci,vpi;
25081 +  int i;
25082 +
25083 +  vci = 0xffff & (atmheader >> 4);
25084 +  vpi = 0xff & (atmheader >> 20);
25085 +  for(i=0;i<MAX_PVC_TABLE_ENTRY;i++)
25086 +  {
25087 +    if(pvc_result[i].bInUse)
25088 +    {
25089 +      if(pvc_result[i].vpi == vpi && pvc_result[i].vci == vci)
25090 +      {
25091 +        return;
25092 +      }
25093 +    }
25094 +  }
25095 +  for(i=0;i<MAX_PVC_TABLE_ENTRY;i++)
25096 +  {
25097 +    if(pvc_result[i].bInUse == 0)
25098 +    {
25099 +      pvc_result[i].bInUse = 1;
25100 +      pvc_result[i].vpi = vpi;
25101 +      pvc_result[i].vci = vci;
25102 +      return;
25103 +    }
25104 +  }
25105 +  return;
25106 +}
25107 +
25108 +static void tn7sar_clear_pvc_table(void)
25109 +{
25110 +  int i;
25111
25112 +  for(i=0;i<MAX_PVC_TABLE_ENTRY; i++)
25113 +  {
25114 +    pvc_result[i].bInUse = 0;
25115 +    pvc_result[i].vpi = 0;
25116 +    pvc_result[i].vci = 0;
25117 +  }
25118 +}
25119 +
25120 +int tn7sar_process_unmatched_oam(FRAGLIST *frag_list, unsigned int frag_count, unsigned int packet_size, unsigned int mode)
25121 +{
25122 +
25123 +  FRAGLIST *local_list;
25124 +  int i;
25125 +  unsigned int atmHdr;
25126 +
25127 +  local_list = frag_list;
25128 +
25129 +  for(i=0;i<(int)frag_count;i++)
25130 +  {
25131 +    tn7sar_data_invalidate(local_list->data, (int)local_list->len);
25132 +    local_list ++;
25133 +  }
25134 +  local_list = frag_list;
25135 +  if((mode>>31)) /*vci, vpi is attached */
25136 +  {
25137 +    atmHdr = *(unsigned int *)frag_list->data;
25138 +    tn7sar_record_pvc(atmHdr);
25139 +    if(atmHdr & 0x8) //oam cell
25140 +    {
25141 +      atmHdr &= 0xfffffff0;
25142 +      if(atmHdr == oamAtmHdr)
25143 +      {
25144 +        if(oamPingStatus == OAM_PING_PENDING)
25145 +        {
25146 +          oamPingStatus = OAM_PING_SUCCESS;
25147 +          oamFarLBCount[oam_type] = oamFarLBCount[oam_type] + 1;
25148 +        }
25149 +        return 0;
25150 +      }
25151 +    }
25152 +  }
25153
25154 +  return 0;
25155 +}
25156 +
25157 +
25158 +static int 
25159 +tn7sar_receive(OS_DEVICE *os_dev,FRAGLIST *frag_list, unsigned int frag_count, unsigned int packet_size, 
25160 +                 HAL_RECEIVEINFO *hal_receive_info, unsigned int mode)
25161 +{   
25162 +  int ch;
25163 +  struct atm_dev *dev;
25164 +  Tn7AtmPrivate *priv;
25165 +  HAL_FUNCTIONS *pHalFunc;
25166 +  HAL_DEVICE    *pHalDev;
25167 +  int bRet;
25168 +
25169 +
25170 +  dprintf(4, "tn7sar_receive\n");
25171 +
25172 +  dev = (struct atm_dev *)os_dev;
25173 +  priv= (Tn7AtmPrivate *)dev->dev_data;
25174 +  pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
25175 +  pHalDev  = (HAL_DEVICE *)priv->pSarHalDev;
25176 +
25177 +  
25178 +  /* Mode contains channel info */
25179 +  ch = (mode & 0xFF);
25180
25181 +  if(ch == 15)
25182 +  {
25183 +    tn7sar_process_unmatched_oam(frag_list, frag_count, packet_size, mode);
25184 +    pHalFunc->RxReturn(hal_receive_info, 0);
25185 +    return 0;
25186 +  }
25187 +
25188 +  if(frag_count > 1 || frag_list->len == 0)
25189 +  {
25190 +    printk("Packet fragment count > 1, not handdle.\n");
25191 +    return 1;
25192 +  }
25193
25194 +  tn7sar_data_invalidate(frag_list->data, (int)frag_list->len);
25195 +  bRet=tn7atm_receive(os_dev, ch, packet_size, frag_list->OsInfo, frag_list->data);
25196 +
25197 +  if(bRet==0)
25198 +  {
25199 +    sarStat.rxPktCnt++;
25200 +    sarStat.rxBytes += packet_size;
25201 +    pHalFunc->RxReturn(hal_receive_info, 1);
25202 +  }
25203 +  else
25204 +  {
25205 +    pHalFunc->RxReturn(hal_receive_info, 0);
25206 +  }
25207 +
25208 +  return bRet;
25209 +}
25210 +
25211 +static int 
25212 +tn7sar_send_complete(OS_SENDINFO *osSendInfo)
25213 +{  
25214 +  return (tn7atm_send_complete(osSendInfo));
25215 +}
25216 +
25217 +void
25218 +tn7sar_teardown_complete(OS_DEVICE *OsDev, int ch, int Dir)
25219 +{
25220 +  return;
25221 +}
25222 +  
25223 +
25224 +/*
25225 +unsigned int tn7sar_virt(unsigned int address)
25226 +{
25227 +  return phys_to_virt(address);
25228 +}
25229 +*/
25230 +
25231 +int tn7sar_init_module(OS_FUNCTIONS *os_funcs)
25232 +{
25233 +  dprintf(4, "tn7sar_init_module\n");
25234 +  if( os_funcs == 0 )
25235 +  {
25236 +    return(-1);   
25237 +  }
25238 +  os_funcs->Control                  = tn7sar_control;
25239 +  os_funcs->CriticalOn               = tn7sar_critical_on;
25240 +  os_funcs->CriticalOff              = tn7sar_critical_off;
25241 +  os_funcs->DataCacheHitInvalidate   = tn7sar_data_invalidate;
25242 +  os_funcs->DataCacheHitWriteback    = tn7sar_data_writeback;
25243 +  os_funcs->DeviceFindInfo           = tn7sar_find_device;
25244 +  os_funcs->DeviceFindParmUint       = tn7sar_get_device_parm_uint;
25245 +  os_funcs->DeviceFindParmValue      = tn7sar_get_device_parm_value;
25246 +  os_funcs->Free                     = tn7sar_free;
25247 +  os_funcs->FreeRxBuffer             = tn7sar_free_buffer;
25248 +  os_funcs->FreeDev                  = tn7sar_free_dev;
25249 +  os_funcs->FreeDmaXfer              = tn7sar_free_dma_xfer;
25250 +  os_funcs->IsrRegister              = tn7sar_sarhal_isr_register;
25251 +  os_funcs->IsrUnRegister            = tn7sar_isr_unregister;
25252 +  os_funcs->Malloc                   = tn7sar_malloc;
25253 +  os_funcs->MallocRxBuffer           = tn7sar_malloc_rxbuffer;
25254 +  os_funcs->MallocDev                = tn7sar_malloc_dev;
25255 +  os_funcs->MallocDmaXfer            = tn7sar_malloc_dma_xfer;
25256 +  os_funcs->Memset                   = tn7sar_memset;
25257 +  os_funcs->Printf                   = tn7sar_printf;
25258 +  os_funcs->Receive                  = tn7sar_receive;
25259 +  os_funcs->SendComplete             = tn7sar_send_complete;
25260 +  os_funcs->Strcmpi                  = strcmp;
25261 +  os_funcs->Sprintf                  = sprintf;
25262 +  os_funcs->Strlen                   = strlen;
25263 +  os_funcs->Strstr                   = strstr;
25264 +  os_funcs->Strtoul                  = tn7sar_strtoul;
25265 +  os_funcs->TeardownComplete         = tn7sar_teardown_complete;
25266 +    
25267 +  return(0);
25268 +}
25269 +
25270 +
25271 +static void tn7sar_init_dev_parm(void)
25272 +{
25273 +  int i;
25274 +  
25275 +  
25276 +  /* aal5 */
25277 +  //strcpy(aal5Parm.id, "aal5");
25278 +  aal5Parm.base = 0x03000000;
25279 +  aal5Parm.offset = 0;
25280 +  aal5Parm.int_line=15;
25281 +  aal5Parm.chan[0].RxBufSize=1600;
25282 +  aal5Parm.chan[0].RxNumBuffers = 32;
25283 +  aal5Parm.chan[0].RxServiceMax = 50;
25284 +  aal5Parm.chan[0].TxServiceMax=50;
25285 +  aal5Parm.chan[0].TxNumBuffers=32;
25286 +  aal5Parm.chan[0].CpcsUU=0x5aa5;
25287 +  aal5Parm.chan[0].TxVc_CellRate=0x3000;
25288 +  aal5Parm.chan[0].TxVc_AtmHeader=0x00000640;
25289 +  for(i=1;i<8;i++)
25290 +  {
25291 +    memcpy(&aal5Parm.chan[i], &aal5Parm.chan[0], sizeof(aal5Parm.chan[0]));
25292 +  }
25293 +  
25294 +
25295 +  /* sar */
25296 +  //strcpy(sarParm.id, "sar");
25297 +  sarParm.base = 0x03000000;
25298 +  sarParm.reset_bit = 9;
25299 +  sarParm.offset = 0;
25300 +  sarParm.UniNni = 0;
25301 +
25302 +  pAal5 = aal5Data;
25303 +  pSar  = sarData;
25304 +  pReset = resetData;
25305 +  strcpy(pAal5, AAL5_PARM);
25306 +  strcpy(pSar, SAR_PARM);
25307 +  strcpy(pReset, RESET_PARM);
25308 +
25309 +}
25310 +
25311
25312 +int tn7sar_get_stats(void *priv1)
25313 +{
25314 +  HAL_FUNCTIONS *pHalFunc;
25315 +  HAL_DEVICE    *pHalDev;
25316 +  Tn7AtmPrivate *priv;
25317 +  int i, j;
25318 +  unsigned int *pSarStat, *pStateBase;
25319 +  char statString[64];
25320 +  int len;
25321 +  
25322 +  dprintf(2, "tn7sar_get_stats\n");
25323 +
25324 +  priv = (Tn7AtmPrivate *)priv1;
25325 +  pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
25326 +  pHalDev  = (HAL_DEVICE *)priv->pSarHalDev;
25327 +
25328 +  //memset(&sarStat, 0, sizeof(sarStat));
25329 +  sarStat.txErrors = 0;
25330 +  sarStat.rxErrors = 0;
25331 +  for(i=0;i<MAX_DMA_CHAN;i++)
25332 +  {
25333 +    if(priv->lut[i].inuse)
25334 +    {
25335 +      for(j=0;j<1;j++)
25336 +      {
25337 +        len=sprintf(statString, "Stats;0;%d", priv->lut[i].chanid);
25338 +        statString[len]=0;
25339 +        dprintf(2, "statString=%s\n",statString);
25340 +        pHalFunc->Control(pHalDev, statString, "Get", &pSarStat);
25341 +        pStateBase = pSarStat;
25342 +        while(pSarStat)
25343 +        {
25344 +          if((char *)*pSarStat == NULL)
25345 +            break;
25346 +          dprintf(2, "%s\n", (char *) *pSarStat);
25347 +          pSarStat++;
25348 +          dprintf(2, "%s\n", (char *) *pSarStat);
25349 +          sarStat.rxErrors += os_atoul((char *) *pSarStat);
25350 +          pSarStat++;
25351 +        }
25352 +          
25353 +        kfree(pStateBase);
25354 +      }
25355 +    }
25356 +  }
25357 +  return 0;
25358 +}
25359 +          
25360 +int tn7sar_setup_oam_channel(Tn7AtmPrivate *priv)
25361 +{
25362 +
25363 +  CHANNEL_INFO chInfo;
25364 +  HAL_FUNCTIONS *pHalFunc;
25365 +  HAL_DEVICE    *pHalDev;
25366 +  int chan=15;  
25367 +  dprintf(4, "tn7sar_setup_oam_channel\n");
25368 +
25369 +  pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
25370 +  pHalDev  = (HAL_DEVICE *)priv->pSarHalDev;
25371 +
25372 +  memset(&chInfo, 0xff, sizeof(chInfo));
25373 +
25374 +  /* channel specific */
25375 +  chInfo.Channel = 15; /* hardcoded for last channel */
25376 +  chInfo.Direction = 0;
25377 +  chInfo.Vci = 30; /* just need below 32 */
25378 +  chInfo.Vpi = 0;
25379 +  chInfo.TxVc_QosType = 2;
25380 +
25381 +  /*default */
25382 +  chInfo.PktType      = PACKET_TYPE_TRANS;
25383 +  chInfo.TxServiceMax = 2;
25384 +  chInfo.RxServiceMax = 2;
25385 +  chInfo.TxNumQueues  = 1;
25386 +  chInfo.TxNumBuffers = 4;
25387 +  chInfo.RxNumBuffers = 4;
25388 +  chInfo.RxBufSize    = 256;
25389 +  chInfo.RxVc_OamToHost = 0;
25390 +  chInfo.RxVp_OamToHost = 0;
25391 +  chInfo.FwdUnkVc       = 1; //enable forwarding of unknown vc
25392 +  chInfo.TxVc_AtmHeader = tn7sar_atm_header((int)chInfo.Vpi, chInfo.Vci);
25393 +  chInfo.RxVc_AtmHeader = tn7sar_atm_header((int)chInfo.Vpi, chInfo.Vci);
25394 +  chInfo.TxVp_AtmHeader = tn7sar_atm_header((int)chInfo.Vpi, 0);
25395 +  chInfo.RxVp_AtmHeader = tn7sar_atm_header((int)chInfo.Vpi, 0);
25396 +
25397 +  dprintf(4, "TxVc_AtmHeader=0x%x\n", chInfo.TxVc_AtmHeader);
25398 +
25399 +  if(pHalFunc->ChannelSetup(pHalDev, &chInfo, NULL))
25400 +  {
25401 +    printk("failed to setup channel =%d.\n", chan);
25402 +    return -1;
25403 +  }
25404
25405 +  // claiming the channel
25406 +  priv->lut[chan].vpi = 0;
25407 +  priv->lut[chan].vci = 30;
25408 +  priv->lut[chan].chanid = chan;
25409 +  priv->lut[chan].inuse = 1;   
25410 +  return 0;
25411 +}
25412 +
25413 +int tn7sar_init(struct atm_dev *dev, Tn7AtmPrivate *priv)
25414 +{
25415 +  int retCode;
25416 +  int hal_funcs_size;
25417
25418 +  HAL_FUNCTIONS *pHalFunc;
25419 +  HAL_DEVICE    *pHalDev;
25420 +  OS_FUNCTIONS  *pOsFunc;
25421 +  int oamMod;
25422 +  char *pLbTimeout;
25423 +  int lbTimeout;
25424 +
25425 +
25426 +  dprintf(4, "tn7sar_init\n");
25427 +
25428 +  pOsFunc = (OS_FUNCTIONS  *)kmalloc(sizeof(OS_FUNCTIONS), GFP_KERNEL);
25429 +
25430 +  
25431 +  priv->pSarOsFunc = ( void *)pOsFunc;
25432 +
25433 +  /* init boot parms */
25434 +  tn7sar_init_dev_parm();
25435 +
25436 +  /* init sar os call back functions */
25437 +  retCode = tn7sar_init_module(pOsFunc);
25438 +  if (retCode != 0) /* error */
25439 +  {
25440 +    printk("Failed to init SAR OS Functions\n");
25441 +    return (1);
25442 +  }
25443 +                
25444 +        /* Init sar hal */
25445 +  retCode = cpaal5InitModule(&pHalDev, (OS_DEVICE*) dev, &pHalFunc, 
25446 +                               pOsFunc, sizeof(OS_FUNCTIONS), &hal_funcs_size, 0);
25447 +  if (retCode != 0) /* error */
25448 +  {
25449 +    printk("Failed to init SAR HAL\n");
25450 +    return (1);
25451 +  }
25452 +
25453 +  /* sanity check */
25454 +  if (pHalDev == NULL || pHalFunc == NULL || hal_funcs_size != sizeof(HAL_FUNCTIONS) )
25455 +  {
25456 +    printk("Invalid SAR hal and/or functions.\n");
25457 +    return (1);
25458 +  }
25459 +   
25460 +  /* remeber HAL pointers */
25461 +  priv->pSarHalDev = (void *)pHalDev;
25462 +  priv->pSarHalFunc = (void *)pHalFunc;
25463 +
25464 +        /* Probe for the Device to get hardware info from driver */
25465 +  retCode = pHalFunc->Probe(pHalDev);
25466 +  if (retCode !=0)
25467 +  {
25468 +    printk("SAR hal probing error.\n");
25469 +    return (1);
25470 +  }
25471 +
25472 +  /* init sar hal */
25473 +  retCode = pHalFunc->Init(pHalDev);
25474 +  if (retCode != 0) /* error */
25475 +  {
25476 +    
25477 +    printk("pHalFunc->Init failed. err code =%d\n", retCode);
25478 +    return (1);
25479 +  }
25480 +
25481 +  /* open hal module */
25482 +  retCode = pHalFunc->Open(pHalDev);
25483 +  if (retCode != 0) /* error */
25484 +  {
25485 +     printk("pHalFunc->open failed, err code: %d\n",retCode ); 
25486 +     return (1);
25487 +  }
25488 +
25489 +  /* init sar for firmware oam */
25490 +  oamMod= 1;
25491 +  pHalFunc->Control(pHalDev,"OamMode", "Set", &oamMod);
25492 +
25493 +  /* read in oam lb timeout value */
25494 +  pLbTimeout = prom_getenv("oam_lb_timeout");
25495 +  if(pLbTimeout)
25496 +  {
25497 +    lbTimeout =tn7sar_strtoul(pLbTimeout, NULL, 10);
25498 +    oamLbTimeout = lbTimeout;
25499 +    pHalFunc->Control(pHalDev,"OamLbTimeout", "Set", &lbTimeout);
25500 +  }
25501 +  else
25502 +  {
25503 +    oamLbTimeout = 5000;
25504 +  }
25505 +
25506 +  oamFarLBCount[0]=0;
25507 +  oamFarLBCount[1]=0;
25508 +  oamFarLBCount[2]=0;
25509 +  oamFarLBCount[3]=0;
25510 +
25511 +  memset(&sarStat, 0 , sizeof(sarStat));
25512 +
25513 +  /* setup channel 15 for oam operation */
25514 +  tn7sar_setup_oam_channel(priv);
25515 +  dprintf(4, "tn7sar_init done");
25516 +  return 0;
25517 +}
25518 +
25519 +static int
25520 +tn7sar_atm_header(int vpi, int vci)
25521 +{
25522 +  union
25523 +  {
25524 +    unsigned char byte[4];
25525 +    unsigned int  dword;
25526 +  }atm_h;
25527 +  int itmp = 0;
25528 +
25529 +  //vci 
25530 +  itmp = vci &0xf;
25531 +  atm_h.byte[0] = 0;
25532 +  atm_h.byte[0] |= (itmp << 4);
25533 +  atm_h.byte[1] = ((vci & 0xff0) >> 4);
25534 +  atm_h.byte[2] = 0;
25535 +  atm_h.byte[2] |= ((vci & 0xf000) >>12);;
25536 +  atm_h.byte[2] |= ((vpi & 0xf) << 4);
25537 +  atm_h.byte[3] = 0;
25538 +  atm_h.byte[3] = ((vpi & 0xff0) >> 4);
25539 +  return atm_h.dword;
25540 +}
25541 +
25542 +int tn7sar_activate_vc(Tn7AtmPrivate *priv, short vpi, int vci, int pcr, int scr, int mbs, int cdvt, int chan, int qos)
25543 +{
25544 +  CHANNEL_INFO chInfo;
25545 +  HAL_FUNCTIONS *pHalFunc;
25546 +  HAL_DEVICE    *pHalDev;
25547 +  
25548 +  dprintf(4, "tn7sar_activate_vc\n");
25549 +
25550 +  pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
25551 +  pHalDev  = (HAL_DEVICE *)priv->pSarHalDev;
25552 +
25553 +  memset(&chInfo, 0xff, sizeof(chInfo));
25554 +
25555 +  /* channel specific */
25556 +  chInfo.Channel = chan;
25557 +  chInfo.Direction = 0;
25558 +  chInfo.Vci = vci;
25559 +  chInfo.Vpi = vpi;
25560 +  chInfo.TxVc_QosType = qos;
25561 +  chInfo.Priority = qos;
25562 +  
25563 +  if(chInfo.TxVc_QosType == 1) /* if the connection is VBR than set the DaMask value to tell the schedular to accumalte the credit */
25564 +  {
25565 +    chInfo.DaMask = 1;
25566 +  }  
25567 +  chInfo.TxVc_Mbs = mbs; /* use pcr as MBS */
25568 +  pcr = SAR_FREQUNCY/pcr;
25569 +  scr = SAR_FREQUNCY/scr;
25570 +  chInfo.TxVc_CellRate = scr;
25571 +  chInfo.TxVc_Pcr = pcr;
25572 +
25573 +  /*default */
25574 +  chInfo.PktType      = PACKET_TYPE_AAL5;
25575 +  chInfo.TxServiceMax = TX_SERVICE_MAX;
25576 +  chInfo.RxServiceMax = RX_SERVICE_MAX;
25577 +  chInfo.TxNumQueues  = TX_QUEUE_NUM;
25578 +  chInfo.TxNumBuffers = TX_BUFFER_NUM;
25579 +  chInfo.RxNumBuffers = RX_BUFFER_NUM;
25580 +  chInfo.RxBufSize    = RX_BUFFER_SIZE;
25581 +  chInfo.RxVc_OamToHost = 0;
25582 +  chInfo.RxVp_OamToHost = 0;
25583 +  chInfo.TxVc_AtmHeader = tn7sar_atm_header((int)vpi, vci);
25584 +  chInfo.RxVc_AtmHeader = tn7sar_atm_header((int)vpi, vci);
25585 +  chInfo.TxVp_AtmHeader = tn7sar_atm_header((int)vpi, 0);
25586 +  chInfo.RxVp_AtmHeader = tn7sar_atm_header((int)vpi, 0);
25587 +  chInfo.CpcsUU = 0;
25588 +
25589 +  dprintf(4, "TxVc_AtmHeader=0x%x\n", chInfo.TxVc_AtmHeader);
25590 +
25591 +  if(pHalFunc->ChannelSetup(pHalDev, &chInfo, NULL))
25592 +  {
25593 +    printk("failed to setup channel =%d.\n", chan);
25594 +    return -1;
25595 +  }
25596
25597 +
25598 +  return 0;
25599 +}
25600 +
25601 +int tn7sar_send_packet(Tn7AtmPrivate *priv, int chan, void *new_skb, void *data,unsigned int len, int priority)
25602 +{
25603 +  FRAGLIST fragList;
25604 +  unsigned int mode;
25605 +  HAL_FUNCTIONS *pHalFunc;
25606 +  HAL_DEVICE    *pHalDev;
25607 +
25608 +  dprintf(4, "tn7sar_send_packet\n");
25609 +  pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
25610 +  pHalDev  = (HAL_DEVICE *)priv->pSarHalDev;
25611 +
25612 +  fragList.len = len;
25613 +  fragList.data = (void *)data;
25614 +
25615 +  xdump((char *)fragList.data , fragList.len, 6);
25616 +
25617 +  /*mode bit 
25618 +  31-19 unused
25619 +  18    oam cell, 1 = true, 0=false
25620 +  17-16 oam type, 0=F4 seg, 1=F4 End, 2=F5 seg, 3=F5 end
25621 +  15-08 transimit queue, current, 0=priority queue, 1=normal queue
25622 +  07-00 channel number
25623 +  */
25624 +  mode = 0;
25625 +  mode |= (0xff & chan);
25626 +  mode |= ((0xff & priority) << 8);
25627 +  
25628 +  dprintf(4, "mode = %d\n", mode);
25629 +
25630 +  tn7sar_data_writeback(fragList.data, len);
25631 +  if(pHalFunc->Send(pHalDev, &fragList, 1, len, new_skb, mode) != 0)
25632 +  {
25633 +    dprintf(1, "SAR hal failed to send packet.\n");
25634 +    return 1;
25635 +  }
25636 +  //tn7sar_get_stats(priv);
25637 +  sarStat.txPktCnt++;
25638 +  sarStat.txBytes +=len;
25639 +  return 0;
25640 +}
25641 +
25642 +
25643 +
25644 +int tn7sar_handle_interrupt(struct atm_dev *dev, Tn7AtmPrivate *priv)
25645 +{
25646 +  int more;
25647 +  int rc;
25648 +  HAL_FUNCTIONS *pHalFunc;
25649 +  HAL_DEVICE    *pHalDev;
25650 +  int (*halIsr)(HAL_DEVICE *halDev, int *work);
25651 +
25652 +  pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
25653 +  pHalDev  = (HAL_DEVICE *)priv->pSarHalDev;
25654 +  halIsr = priv->halIsr;
25655 +
25656 +  rc = halIsr(pHalDev, &more);
25657 +  
25658 +  pHalFunc->PacketProcessEnd(pHalDev);
25659 +
25660 +  return rc;
25661 +}
25662 +
25663 +
25664 +int tn7sar_deactivate_vc(Tn7AtmPrivate *priv, int chan)
25665 +{
25666 +  unsigned int mode;
25667 +  HAL_FUNCTIONS *pHalFunc;
25668 +  HAL_DEVICE    *pHalDev;
25669 +
25670 +  dprintf(4, "tn7sar_deactivate_vc\n");
25671 +  pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
25672 +  pHalDev  = (HAL_DEVICE *)priv->pSarHalDev;
25673 +
25674 +  mode = 0xf; //tear down everything, wait for return;
25675 +
25676 +  pHalFunc->ChannelTeardown(pHalDev, chan, mode);
25677 +  return 0;
25678 +}
25679 +
25680 +void tn7sar_exit(struct atm_dev *dev, Tn7AtmPrivate *priv)
25681 +{
25682 +  HAL_FUNCTIONS *pHalFunc;
25683 +  HAL_DEVICE    *pHalDev;
25684 +
25685 +  dprintf(4, "tn7sar_exit()\n");
25686 +
25687 +  pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
25688 +  pHalDev  = (HAL_DEVICE *)priv->pSarHalDev;
25689 +  
25690 +  tn7sar_deactivate_vc(priv, 15); // de-activate oam channel
25691 +
25692 +  pHalFunc->Close(pHalDev, 2);
25693 +  pHalFunc->Shutdown(pHalDev);
25694 +
25695 +  kfree(priv->pSarOsFunc);
25696 +  
25697 +}
25698 +
25699 +void tn7sar_get_sar_version(Tn7AtmPrivate *priv, char **pVer)
25700 +{
25701 +  HAL_FUNCTIONS *pHalFunc;
25702 +  HAL_DEVICE    *pHalDev;
25703 +
25704 +  dprintf(4, "tn7sar_get_sar_version()\n");
25705 +
25706 +  pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
25707 +  pHalDev  = (HAL_DEVICE *)priv->pSarHalDev;
25708 +  pHalFunc->Control(pHalDev, "Version", "Get", pVer);
25709 +}
25710 +
25711 +
25712 +int tn7sar_get_near_end_loopback_count(unsigned int *pF4count, unsigned int *pF5count)
25713 +{
25714 +  unsigned int f4c, f5c;
25715 +
25716 +  f4c = *(volatile unsigned int *)SAR_PDSP_OAM_F4LB_COUNT_REG_ADDR;
25717 +  f5c = *(volatile unsigned int *)SAR_PDSP_OAM_F5LB_COUNT_REG_ADDR;
25718 +  *pF4count = f4c;
25719 +  *pF5count = f5c;
25720 +
25721 +  return 0;
25722 +}
25723 +
25724 +
25725 +int tn7sar_unmatched_oam_generation(void *privContext, int vpi, int vci, int type)
25726 +{
25727 +
25728 +  unsigned int regv = 0;
25729 +  int chan=15;
25730 +  static unsigned int tag;
25731 +  HAL_FUNCTIONS *pHalFunc;
25732 +  HAL_DEVICE    *pHalDev;
25733 +  Tn7AtmPrivate *priv;
25734 +  unsigned int llid[4]={0xffffffff,0xffffffff,0xffffffff,0xffffffff};
25735 +
25736 +  dprintf(4, "tn7sar_unknow_oam_generation()\n");
25737
25738 +  priv = (Tn7AtmPrivate *)privContext;
25739 +  pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
25740 +  pHalDev  = (HAL_DEVICE *)priv->pSarHalDev;
25741 +
25742 +  if(vci==0)
25743 +  {
25744 +    oamPingStatus = OAM_PING_FAILED;
25745 +    return 0;
25746 +  }
25747 +  /* calculate atm header */
25748 +  oamAtmHdr = tn7sar_atm_header(vpi,vci);
25749 +
25750 +  /* config the atm header */
25751 +  pHalFunc->Control(pHalDev,"TxVc_AtmHeader.15", "Set", &oamAtmHdr);
25752 +
25753 +  /*record oam type */
25754 +  oam_type = type;
25755 +
25756 +  regv = (0xff & chan);
25757 +  
25758 +  switch(type)
25759 +  {
25760 +    case 0:
25761 +      regv |= (1<<12); //f5 end 
25762 +      dprintf(2, "f5 loop back\n");
25763 +      break;
25764 +    case 1:
25765 +      regv |= (1<<13); // f4 end
25766 +      break;
25767 +    case 2:
25768 +      regv |= (1<<14); //f5 seg
25769 +      break;
25770 +    case 3:
25771 +      regv |= (1<<15); //f4 seg
25772 +      break;
25773 +    default:
25774 +      break;
25775 +  }
25776 +  oamPingStatus = OAM_PING_PENDING;
25777 +  pHalFunc->OamLoopbackConfig(pHalDev, regv, llid, tag);
25778 +  tag++;
25779 +  return 0;
25780 +
25781 +}
25782 +
25783 +int tn7sar_oam_generation(void *privContext, int chan, int type, int vpi, int vci, int timeout)
25784 +{
25785 +  unsigned int regv = 0;
25786 +  static unsigned int tag;
25787 +  HAL_FUNCTIONS *pHalFunc;
25788 +  HAL_DEVICE    *pHalDev;
25789 +  Tn7AtmPrivate *priv;
25790 +  unsigned int llid[4]={0xffffffff,0xffffffff,0xffffffff,0xffffffff};
25791 +
25792 +  dprintf(2, "tn7sar_oam_generation()\n");
25793 +
25794 +  priv = (Tn7AtmPrivate *)privContext;
25795 +  pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
25796 +  pHalDev  = (HAL_DEVICE *)priv->pSarHalDev;
25797 +
25798 +  if(timeout >= 5000)
25799 +  {
25800 +    if(timeout == 6000)
25801 +    {
25802 +      tn7sar_clear_pvc_table();
25803 +      return 0;
25804 +    }
25805 +    timeout = oamLbTimeout;
25806 +  }
25807 +
25808 +
25809 +  pHalFunc->Control(pHalDev,"OamLbTimeout", "Set", &timeout);
25810 +
25811 +  if(chan == ATM_NO_DMA_CHAN)
25812 +  {
25813 +    tn7sar_unmatched_oam_generation(priv, vpi, vci, type);
25814 +    return 0;
25815 +  }
25816 +
25817 +  /* calculate atm header */
25818 +  oamAtmHdr = tn7sar_atm_header(vpi,vci);
25819 +  
25820 +  oam_type = type;
25821 +
25822 +  regv = (0xff & chan);
25823 +  switch(type)
25824 +  {
25825 +    case 0:
25826 +      regv |= (1<<12); //f5 end 
25827 +      dprintf(2, "f5 loop back\n");
25828 +      break;
25829 +    case 1:
25830 +      regv |= (1<<13); // f4 end
25831 +      break;
25832 +    case 2:
25833 +      regv |= (1<<14); //f5 seg
25834 +      break;
25835 +    case 3:
25836 +      regv |= (1<<15); //f4 seg
25837 +      break;
25838 +    default:
25839 +      break;
25840 +  }
25841 +  oamPingStatus = OAM_PING_PENDING;
25842 +  pHalFunc->OamLoopbackConfig(pHalDev, regv, llid, tag);
25843 +  tag++;
25844 +
25845 +  return 0;
25846 +}
25847 +
25848 +int tn7sar_proc_oam_ping(char* buf, char **start, off_t offset, int count,int *eof, void *data)
25849 +{
25850 +  int len = 0;
25851 +
25852 +  len += sprintf(buf+len, "%d\n", oamPingStatus);
25853 +
25854 +  return len;
25855 +}
25856 +
25857 +int tn7sar_proc_pvc_table(char* buf, char **start, off_t offset, int count,int *eof, void *data)
25858 +{
25859 +  int len = 0;
25860 +  int i;
25861
25862 +  for(i=0;i<16;i++)
25863 +  {
25864 +    if(pvc_result[i].bInUse)
25865 +    {
25866 +      len += sprintf(buf+len, "%d,%d\n", pvc_result[i].vpi,pvc_result[i].vci);
25867 +    }
25868 +    else
25869 +    {
25870 +      len += sprintf(buf+len, "0,0\n");
25871 +    }
25872 +  }
25873 +  return len;
25874 +}
25875 +
25876
25877 +
25878 +int tn7sar_proc_sar_stat(char* buf, char **start, off_t offset, int count,int *eof, void *data)
25879 +{
25880 +  int len = 0;
25881 +  int limit = count - 80;
25882 +  struct atm_dev *dev;
25883 +  Tn7AtmPrivate *priv;
25884 +  int i, j, k;
25885 +  int stat_len;
25886 +  char statString[32];
25887 +  unsigned int *pStateBase, *pSarStat;
25888 +  HAL_FUNCTIONS *pHalFunc;
25889 +  HAL_DEVICE    *pHalDev;
25890 +  int dBytes;
25891 +
25892 +  dev = (struct atm_dev *)data;
25893 +  priv = (Tn7AtmPrivate *)dev->dev_data;
25894 +
25895 +  pHalFunc = (HAL_FUNCTIONS *)priv->pSarHalFunc;
25896 +  pHalDev  = (HAL_DEVICE *)priv->pSarHalDev;
25897 +
25898 +  len += sprintf(buf+len, "SAR HAL Statistics\n");
25899 +  for(i=0;i<MAX_DMA_CHAN;i++)
25900 +  {
25901 +    if(priv->lut[i].inuse)
25902 +    {
25903 +      if(len<=limit)
25904 +      len += sprintf(buf+len, "\nChannel %d:\n",priv->lut[i].chanid);
25905 +      k=0;
25906 +      for(j=0;j<4;j++)
25907 +      {
25908 +        stat_len =sprintf(statString, "Stats;%d;%d", j,priv->lut[i].chanid);
25909 +        statString[stat_len]=0;
25910 +        pHalFunc->Control(pHalDev, statString, "Get", &pSarStat);
25911 +        pStateBase = pSarStat;
25912 +        while(pSarStat)
25913 +        {          
25914 +          if((char *)*pSarStat == NULL)
25915 +            break;
25916 +          if(len<=limit)
25917 +          {
25918 +            dBytes = sprintf(buf+len, "%s: ",(char *) *pSarStat);
25919 +            len += dBytes;
25920 +            k += dBytes;
25921 +          }
25922 +          pSarStat++;
25923 +          if(len<=limit)
25924 +          {
25925 +            dBytes = sprintf(buf+len, "%s;  ",(char *) *pSarStat);
25926 +            len += dBytes;
25927 +            k += dBytes;
25928 +          }
25929 +          pSarStat++;
25930 +          
25931 +          if(k > 60)
25932 +          {
25933 +            k=0;
25934 +            if(len<=limit)
25935 +            len += sprintf(buf+len, "\n");
25936 +          }
25937 +        }
25938 +          
25939 +        kfree(pStateBase);
25940 +      }
25941 +    }
25942 +  }
25943
25944 +  return len;
25945 +}
25946 +
25947 +void tn7sar_get_sar_firmware_version(unsigned int *pdsp_version_ms, unsigned int *pdsp_version_ls)
25948 +{
25949 +
25950 +  *pdsp_version_ms = (SarPdspFirmware[9]>>20) & 0xF;
25951 +  *pdsp_version_ls = (SarPdspFirmware[9]>>12) & 0xFF;
25952 +  return;
25953 +}
25954 diff -urN linux.old/drivers/atm/sangam_atm/tnetd7300_sar_firm.h linux.dev/drivers/atm/sangam_atm/tnetd7300_sar_firm.h
25955 --- linux.old/drivers/atm/sangam_atm/tnetd7300_sar_firm.h       1970-01-01 01:00:00.000000000 +0100
25956 +++ linux.dev/drivers/atm/sangam_atm/tnetd7300_sar_firm.h       2005-08-23 04:46:50.111841568 +0200
25957 @@ -0,0 +1,988 @@
25958 +//SarPdspFirmware Revision:  49
25959 +
25960 +static int SarPdspFirmware[] = {
25961 +                             0xb0a8d1f1,
25962 +                             0x000003d8,
25963 +                             0x00000000,
25964 +                             0x00000004,
25965 +                             0x00000000,
25966 +                             0x00000000,
25967 +                             0x00000000,
25968 +                             0x00000000,
25969 +                             0x21000900,
25970 +                             0x24049080,
25971 +                             0x24000080,
25972 +                             0x240000c0,
25973 +                             0x10e0e0e1,
25974 +                             0x10e0e0e2,
25975 +                             0x10e0e0e3,
25976 +                             0x10e0e0e4,
25977 +                             0x10e0e0e5,
25978 +                             0x10e0e0e6,
25979 +                             0x10e0e0e7,
25980 +                             0x10e0e0e8,
25981 +                             0x10e0e0e9,
25982 +                             0x10e0e0ea,
25983 +                             0x10e0e0eb,
25984 +                             0x10e0e0ec,
25985 +                             0x10e0e0ed,
25986 +                             0x10e0e0ee,
25987 +                             0x10e0e0ef,
25988 +                             0x10e0e0f0,
25989 +                             0x10e0e0f1,
25990 +                             0x10e0e0f2,
25991 +                             0x10e0e0f3,
25992 +                             0x10e0e0f4,
25993 +                             0x10e0e0f5,
25994 +                             0x10e0e0f6,
25995 +                             0x10e0e0f7,
25996 +                             0x10e0e0f8,
25997 +                             0x10e0e0f9,
25998 +                             0x10e0e0fa,
25999 +                             0x10e0e0fb,
26000 +                             0x10e0e0fc,
26001 +                             0x10e0e0fd,
26002 +                             0x10e0e0fe,
26003 +                             0x10e0e0ff,
26004 +                             0x81042680,
26005 +                             0x810c2680,
26006 +                             0x81042680,
26007 +                             0x2483c080,
26008 +                             0x81180b80,
26009 +                             0x2484c080,
26010 +                             0x811a0b80,
26011 +                             0x2485c080,
26012 +                             0x811c0b80,
26013 +                             0x240100dd,
26014 +                             0xa07d06fd,
26015 +                             0x240400dd,
26016 +                             0xa07d04fd,
26017 +                             0x24c000dd,
26018 +                             0x2400169d,
26019 +                             0xa07d5cfd,
26020 +                             0x511f9d03,
26021 +                             0x01019d9d,
26022 +                             0x7f0000fd,
26023 +                             0xd11eff05,
26024 +                             0x97c06890,
26025 +                             0x1d00e5e5,
26026 +                             0x2301229e,
26027 +                             0x81bc2890,
26028 +                             0x24000000,
26029 +                             0xc917ff02,
26030 +                             0x81000100,
26031 +                             0x01010000,
26032 +                             0xc918ff02,
26033 +                             0x81000100,
26034 +                             0x01010000,
26035 +                             0xc919ff02,
26036 +                             0x81000100,
26037 +                             0xd110e70a,
26038 +                             0xd11cff09,
26039 +                             0x1d00e5e5,
26040 +                             0xd100e704,
26041 +                             0xd114ff06,
26042 +                             0x2301179e,
26043 +                             0x79000004,
26044 +                             0xd70ffffd,
26045 +                             0x91382486,
26046 +                             0x2301059e,
26047 +                             0xc903ff07,
26048 +                             0xa06047e0,
26049 +                             0xb10043e6,
26050 +                             0xc910e602,
26051 +                             0x81000106,
26052 +                             0x24006025,
26053 +                             0x2300d39e,
26054 +                             0xd11dff09,
26055 +                             0x1f00e5e5,
26056 +                             0xc901e705,
26057 +                             0xd111ff06,
26058 +                             0x91382586,
26059 +                             0x2301059e,
26060 +                             0x79000003,
26061 +                             0xd715fffc,
26062 +                             0x2301179e,
26063 +                             0xc910e706,
26064 +                             0x110f2760,
26065 +                             0x240000c6,
26066 +                             0x24000086,
26067 +                             0x13106006,
26068 +                             0x7b00005a,
26069 +                             0x11079f80,
26070 +                             0x51008010,
26071 +                             0xc912ff0f,
26072 +                             0xd100ff04,
26073 +                             0xd101ff05,
26074 +                             0xa06046e0,
26075 +                             0x79000004,
26076 +                             0xa06044e0,
26077 +                             0x79000002,
26078 +                             0xa06045e0,
26079 +                             0xb10043e6,
26080 +                             0x61150602,
26081 +                             0x2101c500,
26082 +                             0xc910e602,
26083 +                             0xa1001006,
26084 +                             0x24000025,
26085 +                             0x2300d39e,
26086 +                             0xd11fff05,
26087 +                             0x97c06a90,
26088 +                             0x1f00e5e5,
26089 +                             0x2301229e,
26090 +                             0x81bc2a90,
26091 +                             0xd11cff09,
26092 +                             0x1d00e5e5,
26093 +                             0xc900e705,
26094 +                             0xd10fff06,
26095 +                             0x91382486,
26096 +                             0x2301059e,
26097 +                             0x79000003,
26098 +                             0xd714fffc,
26099 +                             0x2301179e,
26100 +                             0xc907ff07,
26101 +                             0xa0604be0,
26102 +                             0xb10043e6,
26103 +                             0xc910e602,
26104 +                             0x81000106,
26105 +                             0x24006025,
26106 +                             0x2300d39e,
26107 +                             0xd111e70a,
26108 +                             0xd11dff09,
26109 +                             0x1f00e5e5,
26110 +                             0xd101e704,
26111 +                             0xd115ff06,
26112 +                             0x2301179e,
26113 +                             0x79000004,
26114 +                             0xd711fffd,
26115 +                             0x91382586,
26116 +                             0x2301059e,
26117 +                             0xc911e706,
26118 +                             0x0b042760,
26119 +                             0x240000c6,
26120 +                             0x24000086,
26121 +                             0x13106006,
26122 +                             0x7b000024,
26123 +                             0x11709f80,
26124 +                             0x5100800e,
26125 +                             0xc913ff0d,
26126 +                             0xd104ff04,
26127 +                             0xd105ff05,
26128 +                             0xa0604ae0,
26129 +                             0x79000004,
26130 +                             0xa06048e0,
26131 +                             0x79000002,
26132 +                             0xa06049e0,
26133 +                             0xb10043e6,
26134 +                             0xc910e602,
26135 +                             0xa1001106,
26136 +                             0x24000025,
26137 +                             0x2300d39e,
26138 +                             0xc90bff02,
26139 +                             0x7900000b,
26140 +                             0xc90aff02,
26141 +                             0x79000012,
26142 +                             0xcf08ff89,
26143 +                             0xb10002e0,
26144 +                             0xcf18e087,
26145 +                             0x790000b6,
26146 +                             0x24000080,
26147 +                             0x24fb00c0,
26148 +                             0xa06003e0,
26149 +                             0x7f000082,
26150 +                             0xb10024e6,
26151 +                             0xb10025e0,
26152 +                             0xa06628e6,
26153 +                             0xa06029e0,
26154 +                             0x248000c6,
26155 +                             0xa06624e6,
26156 +                             0x671006f0,
26157 +                             0x81082186,
26158 +                             0x7f0000ee,
26159 +                             0xb10027e6,
26160 +                             0x61100604,
26161 +                             0xa0662be6,
26162 +                             0x810c2186,
26163 +                             0x79000006,
26164 +                             0xd70cffea,
26165 +                             0xa0662be6,
26166 +                             0x1f1be6e6,
26167 +                             0x81382686,
26168 +                             0x813c2680,
26169 +                             0x248000c6,
26170 +                             0xa06627e6,
26171 +                             0x7f0000e3,
26172 +                             0x110f0600,
26173 +                             0x81100b00,
26174 +                             0x01502545,
26175 +                             0x90457888,
26176 +                             0x5103091c,
26177 +                             0x6901092a,
26178 +                             0xc910e603,
26179 +                             0xd108e90d,
26180 +                             0x79000027,
26181 +                             0x01582545,
26182 +                             0x9045788a,
26183 +                             0xd108e904,
26184 +                             0x1f08e9e9,
26185 +                             0x01552545,
26186 +                             0x80451829,
26187 +                             0x50eaeb20,
26188 +                             0x0101ebeb,
26189 +                             0x015c2545,
26190 +                             0x8045388b,
26191 +                             0x7900001c,
26192 +                             0x015c2545,
26193 +                             0x9045788b,
26194 +                             0x6900eb05,
26195 +                             0x1d08e9e9,
26196 +                             0x01552545,
26197 +                             0x80451829,
26198 +                             0x79000004,
26199 +                             0x0501ebeb,
26200 +                             0x015c2545,
26201 +                             0x8045388b,
26202 +                             0x10ecece8,
26203 +                             0x79000010,
26204 +                             0x24000000,
26205 +                             0x5110000e,
26206 +                             0x690f6903,
26207 +                             0x24000069,
26208 +                             0x79000002,
26209 +                             0x01016969,
26210 +                             0x01010000,
26211 +                             0x81100b69,
26212 +                             0x01542545,
26213 +                             0x90451809,
26214 +                             0x6f0209f7,
26215 +                             0xa1001069,
26216 +                             0x81100b06,
26217 +                             0x01572545,
26218 +                             0x80451869,
26219 +                             0xa06841e8,
26220 +                             0xa1414006,
26221 +                             0x209e0000,
26222 +                             0x81100b06,
26223 +                             0xd11fe603,
26224 +                             0x9164388d,
26225 +                             0x8108248d,
26226 +                             0xd100e507,
26227 +                             0x97406490,
26228 +                             0x9108248d,
26229 +                             0x813c2480,
26230 +                             0x2302b4de,
26231 +                             0x1d00e7e7,
26232 +                             0x79000006,
26233 +                             0x97406590,
26234 +                             0x9108258d,
26235 +                             0x813c2580,
26236 +                             0x1d01e7e7,
26237 +                             0x2302b9de,
26238 +                             0x8164388d,
26239 +                             0x209e0000,
26240 +                             0x81040105,
26241 +                             0x91002286,
26242 +                             0x97086290,
26243 +                             0x81042280,
26244 +                             0xd100e504,
26245 +                             0x2302b4de,
26246 +                             0x1f00e7e7,
26247 +                             0x209e0000,
26248 +                             0x2302b9de,
26249 +                             0x1f01e7e7,
26250 +                             0x209e0000,
26251 +                             0xd109ff00,
26252 +                             0xa0702cf0,
26253 +                             0x79000001,
26254 +                             0xd109ff00,
26255 +                             0xb1002de6,
26256 +                             0xd11ee609,
26257 +                             0xb1000de0,
26258 +                             0xc91fe044,
26259 +                             0x24c338c6,
26260 +                             0x10000006,
26261 +                             0x81382686,
26262 +                             0x87406690,
26263 +                             0x813c2680,
26264 +                             0x7900003e,
26265 +                             0x110f0600,
26266 +                             0x81100b00,
26267 +                             0x24000045,
26268 +                             0x24000025,
26269 +                             0x61100603,
26270 +                             0x24006045,
26271 +                             0x24006025,
26272 +                             0x01704545,
26273 +                             0x90451888,
26274 +                             0x0b034600,
26275 +                             0x11070000,
26276 +                             0x69040004,
26277 +                             0xc916ff2c,
26278 +                             0x01019e9e,
26279 +                             0x7900002f,
26280 +                             0xc90cff04,
26281 +                             0x6f0200fd,
26282 +                             0xd308e8a1,
26283 +                             0x7f0000fb,
26284 +                             0x69020008,
26285 +                             0xd308e89e,
26286 +                             0xb1002fe6,
26287 +                             0x91b82880,
26288 +                             0xc91ce002,
26289 +                             0x1f1ce6e6,
26290 +                             0x10080806,
26291 +                             0x79000015,
26292 +                             0xb1002fe6,
26293 +                             0x69030003,
26294 +                             0x13c06666,
26295 +                             0x79000011,
26296 +                             0x91807809,
26297 +                             0xc910ea09,
26298 +                             0x81082689,
26299 +                             0x01018a8a,
26300 +                             0xc91ee60a,
26301 +                             0x1d10eaea,
26302 +                             0x240557c0,
26303 +                             0x60c08a07,
26304 +                             0x1f1de6e6,
26305 +                             0x79000005,
26306 +                             0x2400018a,
26307 +                             0x1f10eaea,
26308 +                             0x1f1fe6e6,
26309 +                             0xd71ee6f8,
26310 +                             0x51000002,
26311 +                             0x11c76666,
26312 +                             0x81382686,
26313 +                             0x87406690,
26314 +                             0x91082689,
26315 +                             0x813c2680,
26316 +                             0xb1002ee6,
26317 +                             0xd103e609,
26318 +                             0x81807809,
26319 +                             0xc908e807,
26320 +                             0x21039400,
26321 +                             0x81002386,
26322 +                             0x87086390,
26323 +                             0x81042380,
26324 +                             0xc908e802,
26325 +                             0x21039400,
26326 +                             0x209e0000,
26327 +                             0xb10008ef,
26328 +                             0x110f0f00,
26329 +                             0x81100b00,
26330 +                             0x24000025,
26331 +                             0x61100f02,
26332 +                             0x24005025,
26333 +                             0x01952545,
26334 +                             0x9045382e,
26335 +                             0xc91def03,
26336 +                             0x24000900,
26337 +                             0x2301c09e,
26338 +                             0xc91cef03,
26339 +                             0x24001900,
26340 +                             0x2301c09e,
26341 +                             0xc91bef03,
26342 +                             0x24000a00,
26343 +                             0x2301c09e,
26344 +                             0xc91aef03,
26345 +                             0x24001a00,
26346 +                             0x2301c09e,
26347 +                             0x8045382e,
26348 +                             0x01a82545,
26349 +                             0x9045388e,
26350 +                             0xc915ef03,
26351 +                             0x24000000,
26352 +                             0x2301c09e,
26353 +                             0xc914ef03,
26354 +                             0x24001000,
26355 +                             0x2301c09e,
26356 +                             0x8045388e,
26357 +                             0x61100f02,
26358 +                             0x24006025,
26359 +                             0x016d2545,
26360 +                             0x9045382e,
26361 +                             0xc919ef03,
26362 +                             0x24000900,
26363 +                             0x2301c09e,
26364 +                             0xc918ef03,
26365 +                             0x24001900,
26366 +                             0x2301c09e,
26367 +                             0xc917ef03,
26368 +                             0x24000a00,
26369 +                             0x2301c09e,
26370 +                             0xc916ef03,
26371 +                             0x24001a00,
26372 +                             0x2301c09e,
26373 +                             0x8045382e,
26374 +                             0x017c2545,
26375 +                             0x9045388e,
26376 +                             0xc913ef03,
26377 +                             0x24000000,
26378 +                             0x2301c09e,
26379 +                             0xc912ef03,
26380 +                             0x24001000,
26381 +                             0x2301c09e,
26382 +                             0x8045388e,
26383 +                             0xd11eef19,
26384 +                             0x11f02f00,
26385 +                             0x51000017,
26386 +                             0x24001520,
26387 +                             0x81140b20,
26388 +                             0x81b01a0f,
26389 +                             0x1f02e7e7,
26390 +                             0x24c000c0,
26391 +                             0x24001580,
26392 +                             0xa0605ce0,
26393 +                             0xc90fef04,
26394 +                             0x1d04e7e7,
26395 +                             0x1d05e7e7,
26396 +                             0x7900000c,
26397 +                             0xc90eef04,
26398 +                             0x1d04e7e7,
26399 +                             0x1f05e7e7,
26400 +                             0x79000008,
26401 +                             0xc90def04,
26402 +                             0x1f04e7e7,
26403 +                             0x1d05e7e7,
26404 +                             0x79000004,
26405 +                             0xc90cef03,
26406 +                             0x1f04e7e7,
26407 +                             0x1f05e7e7,
26408 +                             0x2100b900,
26409 +                             0xd11eef03,
26410 +                             0x1e00eeee,
26411 +                             0x209e0000,
26412 +                             0x1c00eeee,
26413 +                             0x209e0000,
26414 +                             0x110f0606,
26415 +                             0x81140b06,
26416 +                             0x13100606,
26417 +                             0x91b01a83,
26418 +                             0x24000025,
26419 +                             0x61100304,
26420 +                             0x24005025,
26421 +                             0xc905e702,
26422 +                             0x24006025,
26423 +                             0x110f0300,
26424 +                             0x81100b00,
26425 +                             0x81120b00,
26426 +                             0x51150611,
26427 +                             0x61100302,
26428 +                             0x24005025,
26429 +                             0x1d01e5e5,
26430 +                             0x51160639,
26431 +                             0x511a0650,
26432 +                             0x511c0657,
26433 +                             0x5118065e,
26434 +                             0x511e0685,
26435 +                             0x61100302,
26436 +                             0x24006025,
26437 +                             0x1f01e5e5,
26438 +                             0x51170634,
26439 +                             0x511b064b,
26440 +                             0x511d0652,
26441 +                             0x51190658,
26442 +                             0x511f067f,
26443 +                             0xc903e708,
26444 +                             0x1d03e7e7,
26445 +                             0x24000060,
26446 +                             0xa1000a60,
26447 +                             0x244000c0,
26448 +                             0x24001580,
26449 +                             0xa0605ce0,
26450 +                             0x21007d00,
26451 +                             0xcf02e7fc,
26452 +                             0x1d02e7e7,
26453 +                             0x1f03e7e7,
26454 +                             0xc904e703,
26455 +                             0x1f08e3e3,
26456 +                             0x79000002,
26457 +                             0x1d08e3e3,
26458 +                             0xc905e705,
26459 +                             0x01682545,
26460 +                             0x9045588d,
26461 +                             0x2302879e,
26462 +                             0x79000004,
26463 +                             0x01902545,
26464 +                             0x9045588d,
26465 +                             0x2302819e,
26466 +                             0x24001872,
26467 +                             0x24000152,
26468 +                             0xb10009e0,
26469 +                             0x108080d3,
26470 +                             0x10c0c092,
26471 +                             0x2400102c,
26472 +                             0x2302c8de,
26473 +                             0x91021c97,
26474 +                             0x91001cd8,
26475 +                             0x91061c98,
26476 +                             0x91041cd9,
26477 +                             0x910a1c99,
26478 +                             0x91081cda,
26479 +                             0x910e1c9a,
26480 +                             0x910c1cdb,
26481 +                             0x91261d9b,
26482 +                             0x91287d9c,
26483 +                             0x23028dde,
26484 +                             0x1f02e7e7,
26485 +                             0x1d03e7e7,
26486 +                             0x7d000070,
26487 +                             0x01902545,
26488 +                             0x9045798d,
26489 +                             0x79000003,
26490 +                             0x01682545,
26491 +                             0x9045788d,
26492 +                             0x0b09eee0,
26493 +                             0x24001472,
26494 +                             0xd108e303,
26495 +                             0xc900e00b,
26496 +                             0x79000002,
26497 +                             0xc910e009,
26498 +                             0xd101e503,
26499 +                             0x2302819e,
26500 +                             0x79000002,
26501 +                             0x2302879e,
26502 +                             0x91013d12,
26503 +                             0x9504bd93,
26504 +                             0x23028dde,
26505 +                             0x7d00005d,
26506 +                             0xd108ee03,
26507 +                             0x1d10e7e7,
26508 +                             0x7900009a,
26509 +                             0x1d11e7e7,
26510 +                             0x79000098,
26511 +                             0x01902545,
26512 +                             0x9045798d,
26513 +                             0x79000003,
26514 +                             0x01682545,
26515 +                             0x9045788d,
26516 +                             0x0b0aeee0,
26517 +                             0x24001072,
26518 +                             0x7f0000e8,
26519 +                             0x01a02545,
26520 +                             0x9045b98d,
26521 +                             0x79000003,
26522 +                             0x01742545,
26523 +                             0x9045b88d,
26524 +                             0x0b01efe0,
26525 +                             0x24001172,
26526 +                             0x7f0000e0,
26527 +                             0x2302d1de,
26528 +                             0x79000002,
26529 +                             0x2302d6de,
26530 +                             0x000c2545,
26531 +                             0x9045198f,
26532 +                             0xd100ef07,
26533 +                             0x1d02efef,
26534 +                             0xc901ef0c,
26535 +                             0xc905ef0b,
26536 +                             0x1d01efef,
26537 +                             0x1d05efef,
26538 +                             0x79000008,
26539 +                             0xd102ef04,
26540 +                             0x1f02efef,
26541 +                             0x8045198f,
26542 +                             0x79000078,
26543 +                             0xd101ef04,
26544 +                             0x1f01efef,
26545 +                             0x1f05efef,
26546 +                             0x8045198f,
26547 +                             0x69180673,
26548 +                             0x01ac2545,
26549 +                             0x2302dbde,
26550 +                             0xd100ef03,
26551 +                             0x23036c9e,
26552 +                             0x7900006e,
26553 +                             0xc800e40b,
26554 +                             0x110f0020,
26555 +                             0x81100b20,
26556 +                             0x100c0c45,
26557 +                             0x61100002,
26558 +                             0x01604545,
26559 +                             0x9045188f,
26560 +                             0xd101ef04,
26561 +                             0x1f01efef,
26562 +                             0x1f07efef,
26563 +                             0x8045188f,
26564 +                             0x01010000,
26565 +                             0x6f1300f4,
26566 +                             0x79000060,
26567 +                             0x2302d1de,
26568 +                             0x79000002,
26569 +                             0x2302d6de,
26570 +                             0x000c2545,
26571 +                             0x9045198f,
26572 +                             0xc903ef05,
26573 +                             0x1d03efef,
26574 +                             0x1f04efef,
26575 +                             0x8045198f,
26576 +                             0x79000056,
26577 +                             0xc904ef55,
26578 +                             0x1d04efef,
26579 +                             0xc901ef04,
26580 +                             0xc906ef03,
26581 +                             0x1d01efef,
26582 +                             0x1d06efef,
26583 +                             0x8045198f,
26584 +                             0x691e064e,
26585 +                             0x01ac2545,
26586 +                             0x2302dbde,
26587 +                             0xc800e40c,
26588 +                             0x110f0020,
26589 +                             0x81100b20,
26590 +                             0x100c0c45,
26591 +                             0x61100002,
26592 +                             0x01604545,
26593 +                             0x9045188f,
26594 +                             0xc901ef05,
26595 +                             0xc908ef04,
26596 +                             0x1d01efef,
26597 +                             0x1d07efef,
26598 +                             0x8045188f,
26599 +                             0x01010000,
26600 +                             0x6f1300f3,
26601 +                             0x7900003d,
26602 +                             0x10ededf0,
26603 +                             0xc908e303,
26604 +                             0x13401010,
26605 +                             0x209e0000,
26606 +                             0x13301010,
26607 +                             0x209e0000,
26608 +                             0x10ededf0,
26609 +                             0xc908e303,
26610 +                             0x130a1010,
26611 +                             0x209e0000,
26612 +                             0x13081010,
26613 +                             0x209e0000,
26614 +                             0x24000266,
26615 +                             0x2400c800,
26616 +                             0x24000020,
26617 +                             0xd108ee17,
26618 +                             0x01012020,
26619 +                             0xc91cff09,
26620 +                             0x6e0020fe,
26621 +                             0xc910e702,
26622 +                             0x20de0000,
26623 +                             0x1f10e7e7,
26624 +                             0x110f0600,
26625 +                             0x11f02727,
26626 +                             0x12002727,
26627 +                             0x20de0000,
26628 +                             0x1d10e7e7,
26629 +                             0x2302b4de,
26630 +                             0x511d0605,
26631 +                             0x511c0602,
26632 +                             0x7900001e,
26633 +                             0x01a62545,
26634 +                             0x79000002,
26635 +                             0x01722545,
26636 +                             0x90451880,
26637 +                             0x01018080,
26638 +                             0x80451880,
26639 +                             0x79000017,
26640 +                             0x01012020,
26641 +                             0xc91dff09,
26642 +                             0x6e0020fe,
26643 +                             0xc911e702,
26644 +                             0x20de0000,
26645 +                             0x1f11e7e7,
26646 +                             0x09040600,
26647 +                             0x110f2727,
26648 +                             0x12002727,
26649 +                             0x20de0000,
26650 +                             0x1d11e7e7,
26651 +                             0x2302b9de,
26652 +                             0x7f0000ea,
26653 +                             0x81b82786,
26654 +                             0x240000d1,
26655 +                             0x87c06790,
26656 +                             0x81bc2780,
26657 +                             0x20de0000,
26658 +                             0x81b82986,
26659 +                             0x87c06990,
26660 +                             0x81bc2980,
26661 +                             0x20de0000,
26662 +                             0x91b43a88,
26663 +                             0x2301029e,
26664 +                             0x51150608,
26665 +                             0xc908e305,
26666 +                             0x51120303,
26667 +                             0x01010303,
26668 +                             0x79000002,
26669 +                             0x24000003,
26670 +                             0x01012323,
26671 +                             0x81b01a83,
26672 +                             0x21007d00,
26673 +                             0x902cfc88,
26674 +                             0x10c8c893,
26675 +                             0x108888d4,
26676 +                             0x10c9c994,
26677 +                             0x108989d5,
26678 +                             0x10caca95,
26679 +                             0x108a8ad6,
26680 +                             0x10cbcb96,
26681 +                             0x108b8bd7,
26682 +                             0xd108e303,
26683 +                             0x2400a80c,
26684 +                             0x20de0000,
26685 +                             0x2400aa0c,
26686 +                             0x20de0000,
26687 +                             0xd108e303,
26688 +                             0x24007c0c,
26689 +                             0x20de0000,
26690 +                             0x24007e0c,
26691 +                             0x20de0000,
26692 +                             0x24000000,
26693 +                             0x90453904,
26694 +                             0xd108e303,
26695 +                             0x24007c0c,
26696 +                             0x20de0000,
26697 +                             0x24007e0c,
26698 +                             0x20de0000,
26699 +                             0xb1002fe6,
26700 +                             0x91b82880,
26701 +                             0xc91ce002,
26702 +                             0x209e0000,
26703 +                             0xb1002ee6,
26704 +                             0x69187279,
26705 +                             0xd110f230,
26706 +                             0xc903e769,
26707 +                             0xc90be604,
26708 +                             0xc904e767,
26709 +                             0xd105e766,
26710 +                             0x7900000c,
26711 +                             0xc90ae604,
26712 +                             0xd104e763,
26713 +                             0xd105e762,
26714 +                             0x79000008,
26715 +                             0xc907e604,
26716 +                             0xc904e75f,
26717 +                             0xc905e75e,
26718 +                             0x79000004,
26719 +                             0xc906e65c,
26720 +                             0xd104e75b,
26721 +                             0xc905e75a,
26722 +                             0x91003c80,
26723 +                             0x6897c058,
26724 +                             0x68d88057,
26725 +                             0x91043c80,
26726 +                             0x6898c055,
26727 +                             0x68d98054,
26728 +                             0x91083c80,
26729 +                             0x6899c052,
26730 +                             0x68da8051,
26731 +                             0x910c3c80,
26732 +                             0x689ac04f,
26733 +                             0x68db804e,
26734 +                             0xb10009e0,
26735 +                             0x6892c04c,
26736 +                             0x68d3804b,
26737 +                             0x24000160,
26738 +                             0xa1000a60,
26739 +                             0x244000c0,
26740 +                             0x24001580,
26741 +                             0xa0605ce0,
26742 +                             0x1d03e7e7,
26743 +                             0x109393c8,
26744 +                             0x10d4d488,
26745 +                             0x109494c9,
26746 +                             0x10d5d589,
26747 +                             0x109595ca,
26748 +                             0x10d6d68a,
26749 +                             0x109696cb,
26750 +                             0x10d7d78b,
26751 +                             0x8110fc88,
26752 +                             0x209e0000,
26753 +                             0x91003c80,
26754 +                             0x6893c00c,
26755 +                             0x68d4800b,
26756 +                             0x91043c80,
26757 +                             0x6894c009,
26758 +                             0x68d58008,
26759 +                             0x91083c80,
26760 +                             0x6895c006,
26761 +                             0x68d68005,
26762 +                             0x910c3c80,
26763 +                             0x6896c003,
26764 +                             0x68d78002,
26765 +                             0x79000010,
26766 +                             0x24ffff80,
26767 +                             0x24ffffc0,
26768 +                             0x68809306,
26769 +                             0x68e0f405,
26770 +                             0x68e0f504,
26771 +                             0x68e0f603,
26772 +                             0x6880d702,
26773 +                             0x79000008,
26774 +                             0x24000080,
26775 +                             0x240000c0,
26776 +                             0x68809323,
26777 +                             0x68e0f422,
26778 +                             0x68e0f521,
26779 +                             0x68e0f620,
26780 +                             0x6880d71f,
26781 +                             0x1d10f2f2,
26782 +                             0x2400002c,
26783 +                             0x2302c8de,
26784 +                             0x24000f80,
26785 +                             0x240000c0,
26786 +                             0x0101c0c0,
26787 +                             0xd100e504,
26788 +                             0xc91cff06,
26789 +                             0x6e80c0fd,
26790 +                             0x21016d00,
26791 +                             0xc91dff03,
26792 +                             0x6e80c0fa,
26793 +                             0x21016d00,
26794 +                             0xd104e606,
26795 +                             0xc909e608,
26796 +                             0xb1000ce0,
26797 +                             0x0101e0e0,
26798 +                             0xa0600ce0,
26799 +                             0x79000004,
26800 +                             0xb1000be0,
26801 +                             0x0101e0e0,
26802 +                             0xa0600be0,
26803 +                             0xb1002fe6,
26804 +                             0xd100e504,
26805 +                             0x2302b4de,
26806 +                             0x24000022,
26807 +                             0x209e0000,
26808 +                             0x2302b9de,
26809 +                             0x24000042,
26810 +                             0x209e0000,
26811 +                             0xd104e609,
26812 +                             0x01782545,
26813 +                             0x9045180e,
26814 +                             0x110f0e00,
26815 +                             0x81100b00,
26816 +                             0x2400a445,
26817 +                             0x51002502,
26818 +                             0x01504545,
26819 +                             0x90451888,
26820 +                             0xc909e87d,
26821 +                             0xb1002fe6,
26822 +                             0x1f1fe6e6,
26823 +                             0x10080806,
26824 +                             0x21015f00,
26825 +                             0x6914721b,
26826 +                             0x01782545,
26827 +                             0x2303bade,
26828 +                             0x900c188f,
26829 +                             0x1d02efef,
26830 +                             0xc901ef05,
26831 +                             0xc905ef04,
26832 +                             0x1d01efef,
26833 +                             0x1d05efef,
26834 +                             0x800c188f,
26835 +                             0xc909e66e,
26836 +                             0x2303d0de,
26837 +                             0xc800e40c,
26838 +                             0x110f0020,
26839 +                             0x81100b20,
26840 +                             0x100c0c45,
26841 +                             0x61100002,
26842 +                             0x01604545,
26843 +                             0x9045188f,
26844 +                             0xc901ef05,
26845 +                             0xc907ef04,
26846 +                             0x1d01efef,
26847 +                             0x1d07efef,
26848 +                             0x8045188f,
26849 +                             0x01010000,
26850 +                             0x6f1300f3,
26851 +                             0x7900005e,
26852 +                             0x6910725d,
26853 +                             0x01782545,
26854 +                             0x2303bade,
26855 +                             0x900c188f,
26856 +                             0x1f03efef,
26857 +                             0xd101ef03,
26858 +                             0x1f01efef,
26859 +                             0x1f06efef,
26860 +                             0x800c188f,
26861 +                             0xc909e654,
26862 +                             0x2303d0de,
26863 +                             0xc800e40b,
26864 +                             0x110f0020,
26865 +                             0x81100b20,
26866 +                             0x100c0c45,
26867 +                             0x61100002,
26868 +                             0x01604545,
26869 +                             0x9045188f,
26870 +                             0xd101ef04,
26871 +                             0x1f01efef,
26872 +                             0x1f08efef,
26873 +                             0x8045188f,
26874 +                             0x01010000,
26875 +                             0x6f1300f4,
26876 +                             0x79000045,
26877 +                             0x01782545,
26878 +                             0x9045788e,
26879 +                             0x1d02efef,
26880 +                             0x1d12efef,
26881 +                             0xc905ef04,
26882 +                             0x1d05efef,
26883 +                             0x1d01efef,
26884 +                             0x7900000c,
26885 +                             0xc915ef04,
26886 +                             0x1d15efef,
26887 +                             0x1d11efef,
26888 +                             0x79000008,
26889 +                             0xc907ef04,
26890 +                             0x1d07efef,
26891 +                             0x1d01efef,
26892 +                             0x79000004,
26893 +                             0xc917ef03,
26894 +                             0x1d17efef,
26895 +                             0x1d11efef,
26896 +                             0x017c2545,
26897 +                             0x8045388f,
26898 +                             0x110f0e00,
26899 +                             0x81100b00,
26900 +                             0x2400a845,
26901 +                             0x51002502,
26902 +                             0x01504545,
26903 +                             0x9045388f,
26904 +                             0x1d02efef,
26905 +                             0x1d12efef,
26906 +                             0xc905ef04,
26907 +                             0x1d05efef,
26908 +                             0x1d01efef,
26909 +                             0x79000004,
26910 +                             0xc915ef03,
26911 +                             0x1d15efef,
26912 +                             0x1d11efef,
26913 +                             0x8045388f,
26914 +                             0x7900001f,
26915 +                             0xc909e60d,
26916 +                             0x9045180e,
26917 +                             0x110f0e00,
26918 +                             0x81100b00,
26919 +                             0xc90ae603,
26920 +                             0x2400a80c,
26921 +                             0x79000003,
26922 +                             0xc90be617,
26923 +                             0x2400aa0c,
26924 +                             0x51002503,
26925 +                             0x01500c0c,
26926 +                             0x24005025,
26927 +                             0x20de0000,
26928 +                             0xc904e611,
26929 +                             0xc906e603,
26930 +                             0x24007c0c,
26931 +                             0x79000003,
26932 +                             0xc907e60d,
26933 +                             0x24007e0c,
26934 +                             0x51002502,
26935 +                             0x01600c0c,
26936 +                             0x20de0000,
26937 +                             0x01ac2545,
26938 +                             0x24000000,
26939 +                             0x90453804,
26940 +                             0xd10be603,
26941 +                             0x24007c0c,
26942 +                             0x20de0000,
26943 +                             0x24007e0c,
26944 +                             0x20de0000,
26945 +                             0x209e0000};
26946 diff -urN linux.old/drivers/atm/sangam_atm/turbodsl.c linux.dev/drivers/atm/sangam_atm/turbodsl.c
26947 --- linux.old/drivers/atm/sangam_atm/turbodsl.c 1970-01-01 01:00:00.000000000 +0100
26948 +++ linux.dev/drivers/atm/sangam_atm/turbodsl.c 2005-08-23 04:46:50.111841568 +0200
26949 @@ -0,0 +1,223 @@
26950 +
26951 +
26952 +/*
26953 + *
26954 + *  Turbo DSL Implementaion
26955 + *
26956 + *  Zhicheng Tang   ztang@ti.com
26957 + *
26958 + *  2002 (c) Texas Instruments Inc.
26959 + *
26960 +*/
26961 +
26962 +/* defines and variables */
26963 +#define RFC2684_BRIDGED_HDR_SIZE 10
26964 +unsigned char LLC_BRIDGED_HEADER_2684[RFC2684_BRIDGED_HDR_SIZE] =
26965 +  {0xAA, 0xAA, 0x03, 0x00, 0x80, 0xC2, 0x00, 0x07, 0x00, 0x00};
26966 +
26967 +#define RFC2684_ROUTED_HDR_SIZE 6
26968 +unsigned char LLC_ROUTED_HEADER_2684[6] ={0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
26969 +
26970 +unsigned long PPP_LLC_HEADER  = 0xCF03FEFE;
26971 +
26972 +/* struct definition */
26973 +enum
26974 +{  
26975 +  AAL5_ENCAP_PPP_LLC,
26976 +  AAL5_ENCAP_PPP_VCMUX,
26977 +  AAL5_ENCAP_RFC2684_LLC_BRIDGED,
26978 +  AAL5_ENCAP_RFC2684_LLC_ROUTED
26979 +};
26980 +
26981 +/* Etherent header */
26982 +typedef struct _turbodsl_ether_header 
26983 +{
26984 +        unsigned char dst_mac_addr[6];
26985 +        unsigned char src_mac_addr[6];
26986 +        unsigned short ether_type;
26987 +} turbodsl_ether_header_t;
26988 +
26989 +
26990 +/* Ip header define */
26991 +typedef struct _turbodsl_ip_header
26992 +{
26993 +
26994 +        unsigned short vit;
26995 +        unsigned short total_length;
26996 +        unsigned short ip_id;
26997 +        unsigned char  flag;            /* bit 0 = 0, bit1 = don't fragment, bit2=more frag */
26998 +  unsigned char  fragment_offset; /* offset include remaining 5 bits above, which make it 13 bits */
26999 +        unsigned char  time_to_live;
27000 +        unsigned char  protocol;
27001 +        unsigned short checksum;
27002 +        unsigned int  src_ip;
27003 +        unsigned int  dst_ip;
27004 +} turbodsl_ip_header_t;
27005 +
27006 +/* Arp packet define */
27007 +typedef struct _turbodsl_arp_header
27008 +{
27009 +        unsigned short hardware_type;
27010 +        unsigned short protocol_type;
27011 +        unsigned char  h_len;
27012 +        unsigned char  p_len;
27013 +        unsigned short operation  ;
27014 +        unsigned char  snd_hw_address[6];
27015 +        unsigned char  snd_pt_address[4];
27016 +        unsigned char  dst_hw_address[6];
27017 +        unsigned char  dst_pt_address[4];
27018 +} turbodsl_arp_header_t;
27019 +
27020 +#define FIN_FLAG 1
27021 +#define SYN_FLAG 1<<1
27022 +#define RST_FLAG 1<<2
27023 +#define PSH_FLAG 1<<3
27024 +#define ACK_FLAG 1<<4
27025 +#define URG_FLAG 1<<5
27026 +
27027 +typedef struct _turbodsl_tcp_header
27028 +{
27029 +        unsigned short src_port;
27030 +        unsigned short dst_port;
27031 +        unsigned int seq_num;
27032 +        unsigned int ack_num;
27033 +  unsigned char  offset; /* only bits 4-7 are for offset */
27034 +  unsigned char  flags;  /* bits: 0-FIN, 1-SYN, 2-RST, 3-PSH, 4-ACK, 5-URG */
27035 +  unsigned short windows; 
27036 +        unsigned short checksum;
27037 +        unsigned short urgent_ptr;
27038 +} turbodsl_tcp_header_t;
27039
27040 +
27041 +
27042 +/***************************************************************************
27043 + * Function: turbodsl_memory_compare
27044 + * Descripation: Memory compare
27045 + ****************************************************************************/
27046 +int turbodsl_memory_compare(unsigned char *pIn, unsigned char *pOut, unsigned int len)
27047 +  {
27048 +  int i;
27049 +  
27050 +  for(i=0;i<(int)len; i++)
27051 +    {
27052 +    if(pIn[i] != pOut[i])
27053 +      return 0;
27054 +    }
27055 +  return 1;
27056 +  }
27057 +
27058 +/***************************************************************************
27059 + * Function: turbodsl_check_aal5_encap_type
27060 + * Descripation: Determine AAL5 Encapsulation type
27061 + * Input:
27062 + *        unsigned char *pData, AAL5 Packet buffer pointer
27063 + ****************************************************************************/
27064 +int turbodsl_check_aal5_encap_type(unsigned char *pData)
27065 +  {
27066 +  
27067 +  if(turbodsl_memory_compare(pData, LLC_BRIDGED_HEADER_2684, 6))
27068 +    return AAL5_ENCAP_RFC2684_LLC_BRIDGED;
27069 +  if(turbodsl_memory_compare(pData, LLC_ROUTED_HEADER_2684, 6))
27070 +    return AAL5_ENCAP_RFC2684_LLC_ROUTED;
27071 +  if(turbodsl_memory_compare(pData, (unsigned char *)&PPP_LLC_HEADER, sizeof(PPP_LLC_HEADER)))
27072 +    return AAL5_ENCAP_PPP_LLC;
27073
27074 +  return AAL5_ENCAP_PPP_VCMUX;
27075 +  }
27076 +  
27077 +/***************************************************************************
27078 + * Function: turbodsl_check_priority_type
27079 + * Descripation: Determine AAL5 Encapsulation type
27080 + * Input:
27081 + *        unsigned char *pData, AAL5 Packet buffer pointer.
27082 + *        short vpi, VPI.
27083 + *        int vci,  VCI
27084 + ****************************************************************************/
27085 +int turbodsl_check_priority_type(unsigned char *pData)
27086 +  {
27087 +  int encap;
27088 +  unsigned char *pP;
27089 +  unsigned short etherType;
27090 +  turbodsl_ip_header_t *pIp;
27091 +  turbodsl_tcp_header_t *pTcp;
27092 +  unsigned short ip_length;
27093 +  
27094 +  dprintf(2, "turbodsl_check_priority_type ==>\n");
27095 +
27096 +  encap = turbodsl_check_aal5_encap_type(pData);
27097 +  pP = pData;
27098 +
27099 +  switch(encap)
27100 +    {
27101 +    case AAL5_ENCAP_RFC2684_LLC_BRIDGED:
27102 +      pP += RFC2684_BRIDGED_HDR_SIZE; //skip off aal5 encap
27103 +      pP += 12;               //skip of mac address
27104 +      etherType = *(unsigned short *)pP;
27105 +      if(etherType != 0x6488 && etherType != 0x0008)
27106 +        {
27107 +        //Not an IP packet
27108 +        return 1;
27109 +        }
27110 +
27111 +      pP +=2;                 //skip ether type
27112 +      if(etherType == 0x6488)
27113 +        {
27114 +        pP += 6;
27115 +        }
27116 +      break;
27117 +    case AAL5_ENCAP_RFC2684_LLC_ROUTED:
27118 +      pP += RFC2684_ROUTED_HDR_SIZE; //skip of encap
27119 +      pP += 2; //skip ether type
27120 +      break;
27121 +    case AAL5_ENCAP_PPP_LLC:
27122 +      pP += sizeof(PPP_LLC_HEADER);
27123 +      if(*pP == 0xff && *(pP+1) == 0x03) //ppp hdlc header
27124 +        pP += 2;
27125 +      break;
27126 +    case AAL5_ENCAP_PPP_VCMUX:
27127 +      if(*pP == 0xff && *(pP+1) == 0x03) //ppp hdlc header
27128 +        pP += 2;
27129 +      break;
27130 +    default:
27131 +      return 1;
27132 +    }
27133 +
27134 +  pIp = (turbodsl_ip_header_t *)pP;
27135 +  if(pIp->vit != 0x0045)
27136 +    {
27137 +    //Not a IP packet
27138 +    return 1;
27139 +    }
27140 +
27141 +  if(pIp->protocol != 0x06) 
27142 +    {
27143 +    //not tcp packet
27144 +    return 1;
27145 +    }
27146 +  
27147 +  pTcp = (turbodsl_tcp_header_t *)(pP + sizeof(turbodsl_ip_header_t));
27148 +
27149 +  ip_length = (pIp->total_length>>8) + (pIp->total_length<<8);
27150 +  
27151 +  if((pTcp->flags & ACK_FLAG) && ip_length <=40)
27152 +    return 0;
27153 +
27154 +  return 1;
27155 +  }
27156 +
27157 +
27158 +
27159 +
27160 +
27161 +
27162 +
27163 +
27164 +
27165 +
27166 +
27167 +
27168 +
27169 +
27170 +
27171 +
27172 +  
27173 diff -urN linux.old/include/linux/atmdev.h linux.dev/include/linux/atmdev.h
27174 --- linux.old/include/linux/atmdev.h    2005-08-22 23:18:37.812526104 +0200
27175 +++ linux.dev/include/linux/atmdev.h    2005-08-23 06:33:33.425389944 +0200
27176 @@ -30,6 +30,9 @@
27177  #define ATM_DS3_PCR    (8000*12)
27178                         /* DS3: 12 cells in a 125 usec time slot */
27179  
27180 +#define ATM_PDU_OVHD   0       /* number of bytes to charge against buffer
27181 +                                  quota per PDU */
27182 +
27183  #define ATM_SD(s)      ((s)->sk->protinfo.af_atm)
27184  
27185  
27186 @@ -94,7 +97,8 @@
27187                                         /* set backend handler */
27188  #define ATM_NEWBACKENDIF _IOW('a',ATMIOC_SPECIAL+3,atm_backend_t)
27189                                         /* use backend to make new if */
27190 -
27191 +#define ATM_STOPTX      _IOW('a',ATMIOC_SPECIAL+4,struct atmif_sioc)
27192 +                                       /* Stop Tx on Sangam DSL */
27193  /*
27194   * These are backend handkers that can be set via the ATM_SETBACKEND call
27195   * above.  In the future we may support dynamic loading of these - for now,
27196 @@ -199,7 +203,9 @@
27197      "SESSION", "HASSAP",       "BOUND",        "CLOSE"
27198  
27199  
27200 -#ifdef __KERNEL__
27201 +#ifndef __KERNEL__
27202 +#undef __AAL_STAT_ITEMS
27203 +#else
27204  
27205  #include <linux/sched.h> /* wait_queue_head_t */
27206  #include <linux/time.h> /* struct timeval */
27207 @@ -291,6 +297,7 @@
27208         int (*send)(struct atm_vcc *vcc,struct sk_buff *skb);
27209         void            *dev_data;      /* per-device data */
27210         void            *proto_data;    /* per-protocol data */
27211 +       struct timeval  timestamp;      /* AAL timestamps */
27212         struct k_atm_aal_stats *stats;  /* pointer to AAL stats group */
27213         wait_queue_head_t sleep;        /* if socket is busy */
27214         struct sock     *sk;            /* socket backpointer */
27215 @@ -333,13 +340,14 @@
27216         struct k_atm_dev_stats stats;   /* statistics */
27217         char            signal;         /* signal status (ATM_PHY_SIG_*) */
27218         int             link_rate;      /* link rate (default: OC3) */
27219 -       atomic_t        refcnt;         /* reference count */
27220 -       spinlock_t      lock;           /* protect internal members */
27221 +        atomic_t        refcnt;         /* reference count */
27222 +        spinlock_t      lock;           /* protect internal members */
27223  #ifdef CONFIG_PROC_FS
27224         struct proc_dir_entry *proc_entry; /* proc entry */
27225         char *proc_name;                /* proc entry name */
27226  #endif
27227 -       struct list_head dev_list;      /* linkage */
27228 +       struct list_head dev_list;      /* linkage */
27229 +
27230  };
27231  
27232