Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
net
fddi
skfp
hwt.c
Go to the documentation of this file.
1
/******************************************************************************
2
*
3
* (C)Copyright 1998,1999 SysKonnect,
4
* a business unit of Schneider & Koch & Co. Datensysteme GmbH.
5
*
6
* See the file "skfddi.c" for further information.
7
*
8
* This program is free software; you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License as published by
10
* the Free Software Foundation; either version 2 of the License, or
11
* (at your option) any later version.
12
*
13
* The information in this file is provided "AS IS" without warranty.
14
*
15
******************************************************************************/
16
17
/*
18
* Timer Driver for FBI board (timer chip 82C54)
19
*/
20
21
/*
22
* Modifications:
23
*
24
* 28-Jun-1994 sw Edit v1.6.
25
* MCA: Added support for the SK-NET FDDI-FM2 adapter. The
26
* following functions have been added(+) or modified(*):
27
* hwt_start(*), hwt_stop(*), hwt_restart(*), hwt_read(*)
28
*/
29
30
#include "h/types.h"
31
#include "
h/fddi.h
"
32
#include "h/smc.h"
33
34
#ifndef lint
35
static
const
char
ID_sccs[] =
"@(#)hwt.c 1.13 97/04/23 (C) SK "
;
36
#endif
37
38
/*
39
* Prototypes of local functions.
40
*/
41
/* 28-Jun-1994 sw - Note: hwt_restart() is also used in module 'drvfbi.c'. */
42
/*static void hwt_restart() ; */
43
44
/************************
45
*
46
* hwt_start
47
*
48
* Start hardware timer (clock ticks are 16us).
49
*
50
* void hwt_start(
51
* struct s_smc *smc,
52
* u_long time) ;
53
* In
54
* smc - A pointer to the SMT Context structure.
55
*
56
* time - The time in units of 16us to load the timer with.
57
* Out
58
* Nothing.
59
*
60
************************/
61
#define HWT_MAX (65000)
62
63
void
hwt_start
(
struct
s_smc
*
smc
,
u_long
time
)
64
{
65
u_short
cnt
;
66
67
if
(time >
HWT_MAX
)
68
time =
HWT_MAX
;
69
70
smc->
hw
.t_start =
time
;
71
smc->
hw
.t_stop = 0
L
;
72
73
cnt = (
u_short
)time ;
74
/*
75
* if time < 16 us
76
* time = 16 us
77
*/
78
if
(!cnt)
79
cnt++ ;
80
81
outpd
(
ADDR
(
B2_TI_INI
), (
u_long
) cnt * 200) ;
/* Load timer value. */
82
outpw
(
ADDR
(B2_TI_CRTL),
TIM_START
) ;
/* Start timer. */
83
84
smc->
hw
.timer_activ =
TRUE
;
85
}
86
87
/************************
88
*
89
* hwt_stop
90
*
91
* Stop hardware timer.
92
*
93
* void hwt_stop(
94
* struct s_smc *smc) ;
95
* In
96
* smc - A pointer to the SMT Context structure.
97
* Out
98
* Nothing.
99
*
100
************************/
101
void
hwt_stop
(
struct
s_smc
*
smc
)
102
{
103
outpw
(
ADDR
(B2_TI_CRTL),
TIM_STOP
) ;
104
outpw
(
ADDR
(B2_TI_CRTL), TIM_CL_IRQ) ;
105
106
smc->
hw
.timer_activ =
FALSE
;
107
}
108
109
/************************
110
*
111
* hwt_init
112
*
113
* Initialize hardware timer.
114
*
115
* void hwt_init(
116
* struct s_smc *smc) ;
117
* In
118
* smc - A pointer to the SMT Context structure.
119
* Out
120
* Nothing.
121
*
122
************************/
123
void
hwt_init
(
struct
s_smc
*
smc
)
124
{
125
smc->
hw
.t_start = 0 ;
126
smc->
hw
.t_stop = 0 ;
127
smc->
hw
.timer_activ =
FALSE
;
128
129
hwt_restart
(smc) ;
130
}
131
132
/************************
133
*
134
* hwt_restart
135
*
136
* Clear timer interrupt.
137
*
138
* void hwt_restart(
139
* struct s_smc *smc) ;
140
* In
141
* smc - A pointer to the SMT Context structure.
142
* Out
143
* Nothing.
144
*
145
************************/
146
void
hwt_restart
(
struct
s_smc
*
smc
)
147
{
148
hwt_stop
(smc) ;
149
}
150
151
/************************
152
*
153
* hwt_read
154
*
155
* Stop hardware timer and read time elapsed since last start.
156
*
157
* u_long hwt_read(smc) ;
158
* In
159
* smc - A pointer to the SMT Context structure.
160
* Out
161
* The elapsed time since last start in units of 16us.
162
*
163
************************/
164
u_long
hwt_read
(
struct
s_smc
*
smc
)
165
{
166
u_short
tr
;
167
u_long
is
;
168
169
if
(smc->
hw
.timer_activ) {
170
hwt_stop
(smc) ;
171
tr = (
u_short
)((
inpd
(
ADDR
(
B2_TI_VAL
))/200) & 0xffff) ;
172
173
is = GET_ISR() ;
174
/* Check if timer expired (or wraparound). */
175
if
((tr > smc->
hw
.t_start) || (is &
IS_TIMINT
)) {
176
hwt_restart
(smc) ;
177
smc->
hw
.t_stop = smc->
hw
.t_start ;
178
}
179
else
180
smc->
hw
.t_stop = smc->
hw
.t_start - tr ;
181
}
182
return
smc->
hw
.t_stop;
183
}
184
185
#ifdef PCI
186
/************************
187
*
188
* hwt_quick_read
189
*
190
* Stop hardware timer and read timer value and start the timer again.
191
*
192
* u_long hwt_read(smc) ;
193
* In
194
* smc - A pointer to the SMT Context structure.
195
* Out
196
* current timer value in units of 80ns.
197
*
198
************************/
199
u_long
hwt_quick_read(
struct
s_smc
*
smc
)
200
{
201
u_long
interval
;
202
u_long
time
;
203
204
interval =
inpd
(
ADDR
(
B2_TI_INI
)) ;
205
outpw
(
ADDR
(B2_TI_CRTL),
TIM_STOP
) ;
206
time =
inpd
(
ADDR
(
B2_TI_VAL
)) ;
207
outpd
(
ADDR
(
B2_TI_INI
),time) ;
208
outpw
(
ADDR
(B2_TI_CRTL),
TIM_START
) ;
209
outpd
(
ADDR
(
B2_TI_INI
),interval) ;
210
211
return
time
;
212
}
213
214
/************************
215
*
216
* hwt_wait_time(smc,start,duration)
217
*
218
* This function returnes after the amount of time is elapsed
219
* since the start time.
220
*
221
* para start start time
222
* duration time to wait
223
*
224
* NOTE: The function will return immediately, if the timer is not
225
* started
226
************************/
227
void
hwt_wait_time(
struct
s_smc
*smc,
u_long
start
,
long
int
duration
)
228
{
229
long
diff ;
230
long
interval
;
231
int
wrapped ;
232
233
/*
234
* check if timer is running
235
*/
236
if
(smc->
hw
.timer_activ ==
FALSE
||
237
hwt_quick_read(smc) == hwt_quick_read(smc)) {
238
return
;
239
}
240
241
interval =
inpd
(
ADDR
(
B2_TI_INI
)) ;
242
if
(interval > duration) {
243
do
{
244
diff = (
long
)(start - hwt_quick_read(smc)) ;
245
if
(diff < 0) {
246
diff +=
interval
;
247
}
248
}
while
(diff <= duration) ;
249
}
250
else
{
251
diff =
interval
;
252
wrapped = 0 ;
253
do
{
254
if
(!wrapped) {
255
if
(hwt_quick_read(smc) >=
start
) {
256
diff +=
interval
;
257
wrapped = 1 ;
258
}
259
}
260
else
{
261
if
(hwt_quick_read(smc) <
start
) {
262
wrapped = 0 ;
263
}
264
}
265
}
while
(diff <= duration) ;
266
}
267
}
268
#endif
269
Generated on Thu Jan 10 2013 14:06:21 for Linux Kernel by
1.8.2