usb: usbatm: Convert timers to use timer_setup()
In preparation for unconditionally passing the struct timer_list pointer to all timer callbacks, switch to using the new timer_setup() and from_timer() to pass the timer pointer explicitly. Additionally corrects and on-stack timer usage. Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Duncan Sands <duncan.sands@free.fr> Cc: "Gustavo A. R. Silva" <garsilva@embeddedor.com> Cc: accessrunner-general@lists.sourceforge.net Cc: linux-usb@vger.kernel.org Signed-off-by: Kees Cook <keescook@chromium.org> Reviewed-by: Allen Pais <allen.lkml@gmail.com>
This commit is contained in:
parent
ff07a23fec
commit
72a9f9a445
|
@ -547,21 +547,30 @@ static void cxacru_blocking_completion(struct urb *urb)
|
|||
complete(urb->context);
|
||||
}
|
||||
|
||||
static void cxacru_timeout_kill(unsigned long data)
|
||||
struct cxacru_timer {
|
||||
struct timer_list timer;
|
||||
struct urb *urb;
|
||||
};
|
||||
|
||||
static void cxacru_timeout_kill(struct timer_list *t)
|
||||
{
|
||||
usb_unlink_urb((struct urb *) data);
|
||||
struct cxacru_timer *timer = from_timer(timer, t, timer);
|
||||
|
||||
usb_unlink_urb(timer->urb);
|
||||
}
|
||||
|
||||
static int cxacru_start_wait_urb(struct urb *urb, struct completion *done,
|
||||
int *actual_length)
|
||||
{
|
||||
struct timer_list timer;
|
||||
struct cxacru_timer timer = {
|
||||
.urb = urb,
|
||||
};
|
||||
|
||||
setup_timer(&timer, cxacru_timeout_kill, (unsigned long)urb);
|
||||
timer.expires = jiffies + msecs_to_jiffies(CMD_TIMEOUT);
|
||||
add_timer(&timer);
|
||||
timer_setup_on_stack(&timer.timer, cxacru_timeout_kill, 0);
|
||||
mod_timer(&timer.timer, jiffies + msecs_to_jiffies(CMD_TIMEOUT));
|
||||
wait_for_completion(done);
|
||||
del_timer_sync(&timer);
|
||||
del_timer_sync(&timer.timer);
|
||||
destroy_timer_on_stack(&timer.timer);
|
||||
|
||||
if (actual_length)
|
||||
*actual_length = urb->actual_length;
|
||||
|
|
|
@ -557,9 +557,10 @@ static void speedtch_check_status(struct work_struct *work)
|
|||
}
|
||||
}
|
||||
|
||||
static void speedtch_status_poll(unsigned long data)
|
||||
static void speedtch_status_poll(struct timer_list *t)
|
||||
{
|
||||
struct speedtch_instance_data *instance = (void *)data;
|
||||
struct speedtch_instance_data *instance = from_timer(instance, t,
|
||||
status_check_timer);
|
||||
|
||||
schedule_work(&instance->status_check_work);
|
||||
|
||||
|
@ -570,9 +571,10 @@ static void speedtch_status_poll(unsigned long data)
|
|||
atm_warn(instance->usbatm, "Too many failures - disabling line status polling\n");
|
||||
}
|
||||
|
||||
static void speedtch_resubmit_int(unsigned long data)
|
||||
static void speedtch_resubmit_int(struct timer_list *t)
|
||||
{
|
||||
struct speedtch_instance_data *instance = (void *)data;
|
||||
struct speedtch_instance_data *instance = from_timer(instance, t,
|
||||
resubmit_timer);
|
||||
struct urb *int_urb = instance->int_urb;
|
||||
int ret;
|
||||
|
||||
|
@ -860,13 +862,11 @@ static int speedtch_bind(struct usbatm_data *usbatm,
|
|||
usbatm->flags |= (use_isoc ? UDSL_USE_ISOC : 0);
|
||||
|
||||
INIT_WORK(&instance->status_check_work, speedtch_check_status);
|
||||
setup_timer(&instance->status_check_timer, speedtch_status_poll,
|
||||
(unsigned long)instance);
|
||||
timer_setup(&instance->status_check_timer, speedtch_status_poll, 0);
|
||||
instance->last_status = 0xff;
|
||||
instance->poll_delay = MIN_POLL_DELAY;
|
||||
|
||||
setup_timer(&instance->resubmit_timer, speedtch_resubmit_int,
|
||||
(unsigned long)instance);
|
||||
timer_setup(&instance->resubmit_timer, speedtch_resubmit_int, 0);
|
||||
|
||||
instance->int_urb = usb_alloc_urb(0, GFP_KERNEL);
|
||||
|
||||
|
|
|
@ -989,18 +989,18 @@ static int usbatm_heavy_init(struct usbatm_data *instance)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void usbatm_tasklet_schedule(unsigned long data)
|
||||
static void usbatm_tasklet_schedule(struct timer_list *t)
|
||||
{
|
||||
tasklet_schedule((struct tasklet_struct *) data);
|
||||
struct usbatm_channel *channel = from_timer(channel, t, delay);
|
||||
|
||||
tasklet_schedule(&channel->tasklet);
|
||||
}
|
||||
|
||||
static void usbatm_init_channel(struct usbatm_channel *channel)
|
||||
{
|
||||
spin_lock_init(&channel->lock);
|
||||
INIT_LIST_HEAD(&channel->list);
|
||||
channel->delay.function = usbatm_tasklet_schedule;
|
||||
channel->delay.data = (unsigned long) &channel->tasklet;
|
||||
init_timer(&channel->delay);
|
||||
timer_setup(&channel->delay, usbatm_tasklet_schedule, 0);
|
||||
}
|
||||
|
||||
int usbatm_usb_probe(struct usb_interface *intf, const struct usb_device_id *id,
|
||||
|
|
Loading…
Reference in New Issue