0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 #include "h/types.h"
0027 #include "h/fddi.h"
0028 #include "h/smc.h"
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053 #define HWT_MAX (65000)
0054
0055 void hwt_start(struct s_smc *smc, u_long time)
0056 {
0057 u_short cnt ;
0058
0059 if (time > HWT_MAX)
0060 time = HWT_MAX ;
0061
0062 smc->hw.t_start = time ;
0063 smc->hw.t_stop = 0L ;
0064
0065 cnt = (u_short)time ;
0066
0067
0068
0069
0070 if (!cnt)
0071 cnt++ ;
0072
0073 outpd(ADDR(B2_TI_INI), (u_long) cnt * 200) ;
0074 outpw(ADDR(B2_TI_CRTL), TIM_START) ;
0075
0076 smc->hw.timer_activ = TRUE ;
0077 }
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093 void hwt_stop(struct s_smc *smc)
0094 {
0095 outpw(ADDR(B2_TI_CRTL), TIM_STOP) ;
0096 outpw(ADDR(B2_TI_CRTL), TIM_CL_IRQ) ;
0097
0098 smc->hw.timer_activ = FALSE ;
0099 }
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115 void hwt_init(struct s_smc *smc)
0116 {
0117 smc->hw.t_start = 0 ;
0118 smc->hw.t_stop = 0 ;
0119 smc->hw.timer_activ = FALSE ;
0120
0121 hwt_restart(smc) ;
0122 }
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138 void hwt_restart(struct s_smc *smc)
0139 {
0140 hwt_stop(smc) ;
0141 }
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156 u_long hwt_read(struct s_smc *smc)
0157 {
0158 u_short tr ;
0159 u_long is ;
0160
0161 if (smc->hw.timer_activ) {
0162 hwt_stop(smc) ;
0163 tr = (u_short)((inpd(ADDR(B2_TI_VAL))/200) & 0xffff) ;
0164
0165 is = GET_ISR() ;
0166
0167 if ((tr > smc->hw.t_start) || (is & IS_TIMINT)) {
0168 hwt_restart(smc) ;
0169 smc->hw.t_stop = smc->hw.t_start ;
0170 }
0171 else
0172 smc->hw.t_stop = smc->hw.t_start - tr ;
0173 }
0174 return smc->hw.t_stop;
0175 }
0176
0177 #ifdef PCI
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191 u_long hwt_quick_read(struct s_smc *smc)
0192 {
0193 u_long interval ;
0194 u_long time ;
0195
0196 interval = inpd(ADDR(B2_TI_INI)) ;
0197 outpw(ADDR(B2_TI_CRTL), TIM_STOP) ;
0198 time = inpd(ADDR(B2_TI_VAL)) ;
0199 outpd(ADDR(B2_TI_INI),time) ;
0200 outpw(ADDR(B2_TI_CRTL), TIM_START) ;
0201 outpd(ADDR(B2_TI_INI),interval) ;
0202
0203 return time;
0204 }
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219 void hwt_wait_time(struct s_smc *smc, u_long start, long int duration)
0220 {
0221 long diff ;
0222 long interval ;
0223 int wrapped ;
0224
0225
0226
0227
0228 if (smc->hw.timer_activ == FALSE ||
0229 hwt_quick_read(smc) == hwt_quick_read(smc)) {
0230 return ;
0231 }
0232
0233 interval = inpd(ADDR(B2_TI_INI)) ;
0234 if (interval > duration) {
0235 do {
0236 diff = (long)(start - hwt_quick_read(smc)) ;
0237 if (diff < 0) {
0238 diff += interval ;
0239 }
0240 } while (diff <= duration) ;
0241 }
0242 else {
0243 diff = interval ;
0244 wrapped = 0 ;
0245 do {
0246 if (!wrapped) {
0247 if (hwt_quick_read(smc) >= start) {
0248 diff += interval ;
0249 wrapped = 1 ;
0250 }
0251 }
0252 else {
0253 if (hwt_quick_read(smc) < start) {
0254 wrapped = 0 ;
0255 }
0256 }
0257 } while (diff <= duration) ;
0258 }
0259 }
0260 #endif
0261