Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+29 -20
+16 -7
drivers/usb/atm/cxacru.c
··· 547 547 complete(urb->context); 548 548 } 549 549 550 - static void cxacru_timeout_kill(unsigned long data) 550 + struct cxacru_timer { 551 + struct timer_list timer; 552 + struct urb *urb; 553 + }; 554 + 555 + static void cxacru_timeout_kill(struct timer_list *t) 551 556 { 552 - usb_unlink_urb((struct urb *) data); 557 + struct cxacru_timer *timer = from_timer(timer, t, timer); 558 + 559 + usb_unlink_urb(timer->urb); 553 560 } 554 561 555 562 static int cxacru_start_wait_urb(struct urb *urb, struct completion *done, 556 563 int *actual_length) 557 564 { 558 - struct timer_list timer; 565 + struct cxacru_timer timer = { 566 + .urb = urb, 567 + }; 559 568 560 - setup_timer(&timer, cxacru_timeout_kill, (unsigned long)urb); 561 - timer.expires = jiffies + msecs_to_jiffies(CMD_TIMEOUT); 562 - add_timer(&timer); 569 + timer_setup_on_stack(&timer.timer, cxacru_timeout_kill, 0); 570 + mod_timer(&timer.timer, jiffies + msecs_to_jiffies(CMD_TIMEOUT)); 563 571 wait_for_completion(done); 564 - del_timer_sync(&timer); 572 + del_timer_sync(&timer.timer); 573 + destroy_timer_on_stack(&timer.timer); 565 574 566 575 if (actual_length) 567 576 *actual_length = urb->actual_length;
+8 -8
drivers/usb/atm/speedtch.c
··· 557 557 } 558 558 } 559 559 560 - static void speedtch_status_poll(unsigned long data) 560 + static void speedtch_status_poll(struct timer_list *t) 561 561 { 562 - struct speedtch_instance_data *instance = (void *)data; 562 + struct speedtch_instance_data *instance = from_timer(instance, t, 563 + status_check_timer); 563 564 564 565 schedule_work(&instance->status_check_work); 565 566 ··· 571 570 atm_warn(instance->usbatm, "Too many failures - disabling line status polling\n"); 572 571 } 573 572 574 - static void speedtch_resubmit_int(unsigned long data) 573 + static void speedtch_resubmit_int(struct timer_list *t) 575 574 { 576 - struct speedtch_instance_data *instance = (void *)data; 575 + struct speedtch_instance_data *instance = from_timer(instance, t, 576 + resubmit_timer); 577 577 struct urb *int_urb = instance->int_urb; 578 578 int ret; 579 579 ··· 862 860 usbatm->flags |= (use_isoc ? UDSL_USE_ISOC : 0); 863 861 864 862 INIT_WORK(&instance->status_check_work, speedtch_check_status); 865 - setup_timer(&instance->status_check_timer, speedtch_status_poll, 866 - (unsigned long)instance); 863 + timer_setup(&instance->status_check_timer, speedtch_status_poll, 0); 867 864 instance->last_status = 0xff; 868 865 instance->poll_delay = MIN_POLL_DELAY; 869 866 870 - setup_timer(&instance->resubmit_timer, speedtch_resubmit_int, 871 - (unsigned long)instance); 867 + timer_setup(&instance->resubmit_timer, speedtch_resubmit_int, 0); 872 868 873 869 instance->int_urb = usb_alloc_urb(0, GFP_KERNEL); 874 870
+5 -5
drivers/usb/atm/usbatm.c
··· 989 989 return 0; 990 990 } 991 991 992 - static void usbatm_tasklet_schedule(unsigned long data) 992 + static void usbatm_tasklet_schedule(struct timer_list *t) 993 993 { 994 - tasklet_schedule((struct tasklet_struct *) data); 994 + struct usbatm_channel *channel = from_timer(channel, t, delay); 995 + 996 + tasklet_schedule(&channel->tasklet); 995 997 } 996 998 997 999 static void usbatm_init_channel(struct usbatm_channel *channel) 998 1000 { 999 1001 spin_lock_init(&channel->lock); 1000 1002 INIT_LIST_HEAD(&channel->list); 1001 - channel->delay.function = usbatm_tasklet_schedule; 1002 - channel->delay.data = (unsigned long) &channel->tasklet; 1003 - init_timer(&channel->delay); 1003 + timer_setup(&channel->delay, usbatm_tasklet_schedule, 0); 1004 1004 } 1005 1005 1006 1006 int usbatm_usb_probe(struct usb_interface *intf, const struct usb_device_id *id,