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.
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);
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);
17 synchronize_irq(dev->dev->irq);
18 free_irq(dev->dev->irq, dev);
21 mutex_lock(&wl->mutex);
22 dev = wl->current_dev;
23 @@ -3956,9 +3961,17 @@ static int b43_wireless_core_start(struc
27 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)
28 + err = compat_request_threaded_irq(&dev->irq_compat,
30 + b43_interrupt_handler,
31 + b43_interrupt_thread_handler,
32 + IRQF_SHARED, KBUILD_MODNAME, dev);
34 err = request_threaded_irq(dev->dev->irq, b43_interrupt_handler,
35 b43_interrupt_thread_handler,
36 IRQF_SHARED, KBUILD_MODNAME, dev);
39 b43err(dev->wl, "Cannot request IRQ-%d\n", dev->dev->irq);
41 @@ -4663,6 +4676,10 @@ static int b43_setup_bands(struct b43_wl
43 static void b43_wireless_core_detach(struct b43_wldev *dev)
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);
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;
58 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)
59 + struct compat_threaded_irq irq_compat;
63 /* Data structure for the WLAN parts (802.11 cores) of the b43 chip. */