From 3de1abef24a221880614e387e150c1fc7004bc23 Mon Sep 17 00:00:00 2001 From: Kees Cook Date: Wed, 18 Oct 2017 13:23:07 -0700 Subject: [PATCH] staging/irda-usb: 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. This requires adding a pointer to hold the timer's target URB, as there won't be a way to pass this in the future. Cc: Samuel Ortiz Signed-off-by: Kees Cook Signed-off-by: Greg Kroah-Hartman --- drivers/staging/irda/drivers/irda-usb.c | 20 ++++++-------------- drivers/staging/irda/drivers/irda-usb.h | 1 + 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/drivers/staging/irda/drivers/irda-usb.c b/drivers/staging/irda/drivers/irda-usb.c index 82bfc051e1de..bda6bdc6c70b 100644 --- a/drivers/staging/irda/drivers/irda-usb.c +++ b/drivers/staging/irda/drivers/irda-usb.c @@ -117,7 +117,7 @@ static void irda_usb_close(struct irda_usb_cb *self); static void speed_bulk_callback(struct urb *urb); static void write_bulk_callback(struct urb *urb); static void irda_usb_receive(struct urb *urb); -static void irda_usb_rx_defer_expired(unsigned long data); +static void irda_usb_rx_defer_expired(struct timer_list *t); static int irda_usb_net_open(struct net_device *dev); static int irda_usb_net_close(struct net_device *dev); static int irda_usb_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); @@ -846,8 +846,7 @@ static void irda_usb_receive(struct urb *urb) * hot unplug of the dongle... * Lowest effective timer is 10ms... * Jean II */ - self->rx_defer_timer.function = irda_usb_rx_defer_expired; - self->rx_defer_timer.data = (unsigned long) urb; + self->rx_defer_timer_urb = urb; mod_timer(&self->rx_defer_timer, jiffies + msecs_to_jiffies(10)); @@ -953,20 +952,13 @@ done: * In case of errors, we want the USB layer to have time to recover. * Now, it is time to resubmit ouur Rx URB... */ -static void irda_usb_rx_defer_expired(unsigned long data) +static void irda_usb_rx_defer_expired(struct timer_list *t) { - struct urb *urb = (struct urb *) data; + struct irda_usb_cb *self = from_timer(self, t, rx_defer_timer); + struct urb *urb = self->rx_defer_timer_urb; struct sk_buff *skb = (struct sk_buff *) urb->context; - struct irda_usb_cb *self; - struct irda_skb_cb *cb; struct urb *next_urb; - /* Find ourselves */ - cb = (struct irda_skb_cb *) skb->cb; - IRDA_ASSERT(cb != NULL, return;); - self = (struct irda_usb_cb *) cb->context; - IRDA_ASSERT(self != NULL, return;); - /* Same stuff as when Rx is done, see above... */ next_urb = self->idle_rx_urb; urb->context = NULL; @@ -1622,7 +1614,7 @@ static int irda_usb_probe(struct usb_interface *intf, self = netdev_priv(net); self->netdev = net; spin_lock_init(&self->lock); - init_timer(&self->rx_defer_timer); + timer_setup(&self->rx_defer_timer, irda_usb_rx_defer_expired, 0); self->capability = id->driver_info; self->needspatch = ((self->capability & IUC_STIR421X) != 0); diff --git a/drivers/staging/irda/drivers/irda-usb.h b/drivers/staging/irda/drivers/irda-usb.h index 8ac389fa9348..56ee8c16c5e2 100644 --- a/drivers/staging/irda/drivers/irda-usb.h +++ b/drivers/staging/irda/drivers/irda-usb.h @@ -170,5 +170,6 @@ struct irda_usb_cb { int needspatch; /* device needs firmware patch */ struct timer_list rx_defer_timer; /* Wait for Rx error to clear */ + struct urb *rx_defer_timer_urb; /* URB attached to rx_defer_timer */ };