net/usb/usbnet: 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. Since the callback is called from both a timer and a tasklet, adjust the tasklet to pass the timer address too. When tasklets have their .data field removed, this can be refactored to call a central function after resolving the correct container_of() for a separate callback function for timer and tasklet. Cc: Oliver Neukum <oneukum@suse.com> Cc: netdev@vger.kernel.org Cc: linux-usb@vger.kernel.org Signed-off-by: Kees Cook <keescook@chromium.org> Acked-by: Oliver Neukum <oneukum@suse.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
0010e3f8b3
commit
2183c1a61c
@ -1509,9 +1509,9 @@ err:
|
|||||||
|
|
||||||
// tasklet (work deferred from completions, in_irq) or timer
|
// tasklet (work deferred from completions, in_irq) or timer
|
||||||
|
|
||||||
static void usbnet_bh (unsigned long param)
|
static void usbnet_bh (struct timer_list *t)
|
||||||
{
|
{
|
||||||
struct usbnet *dev = (struct usbnet *) param;
|
struct usbnet *dev = from_timer(dev, t, delay);
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
struct skb_data *entry;
|
struct skb_data *entry;
|
||||||
|
|
||||||
@ -1694,13 +1694,11 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
|
|||||||
skb_queue_head_init (&dev->txq);
|
skb_queue_head_init (&dev->txq);
|
||||||
skb_queue_head_init (&dev->done);
|
skb_queue_head_init (&dev->done);
|
||||||
skb_queue_head_init(&dev->rxq_pause);
|
skb_queue_head_init(&dev->rxq_pause);
|
||||||
dev->bh.func = usbnet_bh;
|
dev->bh.func = (void (*)(unsigned long))usbnet_bh;
|
||||||
dev->bh.data = (unsigned long) dev;
|
dev->bh.data = (unsigned long)&dev->delay;
|
||||||
INIT_WORK (&dev->kevent, usbnet_deferred_kevent);
|
INIT_WORK (&dev->kevent, usbnet_deferred_kevent);
|
||||||
init_usb_anchor(&dev->deferred);
|
init_usb_anchor(&dev->deferred);
|
||||||
dev->delay.function = usbnet_bh;
|
timer_setup(&dev->delay, usbnet_bh, 0);
|
||||||
dev->delay.data = (unsigned long) dev;
|
|
||||||
init_timer (&dev->delay);
|
|
||||||
mutex_init (&dev->phy_mutex);
|
mutex_init (&dev->phy_mutex);
|
||||||
mutex_init(&dev->interrupt_mutex);
|
mutex_init(&dev->interrupt_mutex);
|
||||||
dev->interrupt_count = 0;
|
dev->interrupt_count = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user