|
@@ -2073,21 +2073,19 @@ idt77252_rate_logindex(struct idt77252_dev *card, int pcr)
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-idt77252_est_timer(unsigned long data)
|
|
|
+idt77252_est_timer(struct timer_list *t)
|
|
|
{
|
|
|
- struct vc_map *vc = (struct vc_map *)data;
|
|
|
+ struct rate_estimator *est = from_timer(est, t, timer);
|
|
|
+ struct vc_map *vc = est->vc;
|
|
|
struct idt77252_dev *card = vc->card;
|
|
|
- struct rate_estimator *est;
|
|
|
unsigned long flags;
|
|
|
u32 rate, cps;
|
|
|
u64 ncells;
|
|
|
u8 lacr;
|
|
|
|
|
|
spin_lock_irqsave(&vc->lock, flags);
|
|
|
- est = vc->estimator;
|
|
|
- if (!est)
|
|
|
+ if (!vc->estimator)
|
|
|
goto out;
|
|
|
-
|
|
|
ncells = est->cells;
|
|
|
|
|
|
rate = ((u32)(ncells - est->last_cells)) << (7 - est->interval);
|
|
@@ -2126,10 +2124,11 @@ idt77252_init_est(struct vc_map *vc, int pcr)
|
|
|
est->maxcps = pcr < 0 ? -pcr : pcr;
|
|
|
est->cps = est->maxcps;
|
|
|
est->avcps = est->cps << 5;
|
|
|
+ est->vc = vc;
|
|
|
|
|
|
est->interval = 2; /* XXX: make this configurable */
|
|
|
est->ewma_log = 2; /* XXX: make this configurable */
|
|
|
- setup_timer(&est->timer, idt77252_est_timer, (unsigned long)vc);
|
|
|
+ timer_setup(&est->timer, idt77252_est_timer, 0);
|
|
|
mod_timer(&est->timer, jiffies + ((HZ / 4) << est->interval));
|
|
|
|
|
|
return est;
|
|
@@ -2209,16 +2208,20 @@ static int
|
|
|
idt77252_init_ubr(struct idt77252_dev *card, struct vc_map *vc,
|
|
|
struct atm_vcc *vcc, struct atm_qos *qos)
|
|
|
{
|
|
|
+ struct rate_estimator *est = NULL;
|
|
|
unsigned long flags;
|
|
|
int tcr;
|
|
|
|
|
|
spin_lock_irqsave(&vc->lock, flags);
|
|
|
if (vc->estimator) {
|
|
|
- del_timer(&vc->estimator->timer);
|
|
|
- kfree(vc->estimator);
|
|
|
+ est = vc->estimator;
|
|
|
vc->estimator = NULL;
|
|
|
}
|
|
|
spin_unlock_irqrestore(&vc->lock, flags);
|
|
|
+ if (est) {
|
|
|
+ del_timer_sync(&est->timer);
|
|
|
+ kfree(est);
|
|
|
+ }
|
|
|
|
|
|
tcr = atm_pcr_goal(&qos->txtp);
|
|
|
if (tcr == 0)
|