wl1251: fix a memory leak in probe
[pandora-wifi.git] / patches / 09-threaded-irq.patch
1 The 2.6.31 kernel has threaded IRQ support and b43 is the first
2 wireless driver that makes use of it. To support threaded IRSs
3 on older kernels we built our own struct compat_threaded_irq
4 to queue_work() onto it as the kernel thread be running the
5 thread in process context as well.
6
7 --- a/drivers/net/wireless/b43/main.c
8 +++ b/drivers/net/wireless/b43/main.c
9 @@ -3915,8 +3915,13 @@ redo:
10         if (dev->dev->bus->bustype == SSB_BUSTYPE_SDIO) {
11                 b43_sdio_free_irq(dev);
12         } else {
13 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)
14 +               compat_synchronize_threaded_irq(&dev->irq_compat);
15 +               compat_free_threaded_irq(&dev->irq_compat);
16 +#else
17                 synchronize_irq(dev->dev->irq);
18                 free_irq(dev->dev->irq, dev);
19 +#endif
20         }
21         mutex_lock(&wl->mutex);
22         dev = wl->current_dev;
23 @@ -3956,9 +3961,17 @@ static int b43_wireless_core_start(struc
24                         goto out;
25                 }
26         } else {
27 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)
28 +               err = compat_request_threaded_irq(&dev->irq_compat,
29 +                                                 dev->dev->irq,
30 +                                                 b43_interrupt_handler,
31 +                                                 b43_interrupt_thread_handler,
32 +                                                 IRQF_SHARED, KBUILD_MODNAME, dev);
33 +#else
34                 err = request_threaded_irq(dev->dev->irq, b43_interrupt_handler,
35                                            b43_interrupt_thread_handler,
36                                            IRQF_SHARED, KBUILD_MODNAME, dev);
37 +#endif
38                 if (err) {
39                         b43err(dev->wl, "Cannot request IRQ-%d\n", dev->dev->irq);
40                         goto out;
41 @@ -4663,6 +4676,10 @@ static int b43_setup_bands(struct b43_wl
42  
43  static void b43_wireless_core_detach(struct b43_wldev *dev)
44  {
45 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)
46 +       if (dev->dev->bus->bustype != SSB_BUSTYPE_SDIO)
47 +               compat_destroy_threaded_irq(&dev->irq_compat);
48 +#endif
49         /* We release firmware that late to not be required to re-request
50          * is all the time when we reinit the core. */
51         b43_release_firmware(dev);
52 --- a/drivers/net/wireless/b43/b43.h
53 +++ b/drivers/net/wireless/b43/b43.h
54 @@ -754,6 +754,9 @@ struct b43_wldev {
55         unsigned int tx_count;
56         unsigned int rx_count;
57  #endif
58 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)
59 +       struct compat_threaded_irq irq_compat;
60 +#endif
61  };
62  
63  /* Data structure for the WLAN parts (802.11 cores) of the b43 chip. */