]> git.openfabrics.org - ~emulex/infiniband.git/commitdiff
rt2x00: Introduce tasklets for interrupt handling
authorHelmut Schaa <helmut.schaa@googlemail.com>
Sun, 30 Jan 2011 12:17:52 +0000 (13:17 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 31 Jan 2011 20:06:22 +0000 (15:06 -0500)
No functional changes, just preparation for moving interrupt handling to
tasklets. The tasklets are disabled by default. Drivers making use of
them need to enable the tasklets when the device state is set to IRQ_ON.

Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com>
Acked-by: Gertjan van Wingerde <gwingerde@gmail.com>
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/rt2x00/rt2x00.h
drivers/net/wireless/rt2x00/rt2x00dev.c

index 985982bb65e298f78fca87aca909b0b8f9f944b7..696513113d9f483f5200d4399d6568651b0973d1 100644 (file)
@@ -520,6 +520,10 @@ struct rt2x00lib_ops {
         * TX status tasklet handler.
         */
        void (*txstatus_tasklet) (unsigned long data);
+       void (*pretbtt_tasklet) (unsigned long data);
+       void (*tbtt_tasklet) (unsigned long data);
+       void (*rxdone_tasklet) (unsigned long data);
+       void (*autowake_tasklet) (unsigned long data);
 
        /*
         * Device init handlers.
@@ -905,6 +909,15 @@ struct rt2x00_dev {
         * Tasklet for processing tx status reports (rt2800pci).
         */
        struct tasklet_struct txstatus_tasklet;
+       struct tasklet_struct pretbtt_tasklet;
+       struct tasklet_struct tbtt_tasklet;
+       struct tasklet_struct rxdone_tasklet;
+       struct tasklet_struct autowake_tasklet;
+
+       /*
+        * Protect the interrupt mask register.
+        */
+       spinlock_t irqmask_lock;
 };
 
 /*
index 50b379a6c9ee001bb857cbeb39bd982f4b6430b5..7d4dece64c1ad6ad72f9b62a9b08dc2f859f9de4 100644 (file)
@@ -830,6 +830,26 @@ static int rt2x00lib_probe_hw(struct rt2x00_dev *rt2x00dev)
 
        }
 
+       /*
+        * Initialize tasklets if used by the driver. Tasklets are
+        * disabled until the interrupts are turned on. The driver
+        * has to handle that.
+        */
+#define RT2X00_TASKLET_INIT(taskletname) \
+       if (rt2x00dev->ops->lib->taskletname) { \
+               tasklet_init(&rt2x00dev->taskletname, \
+                            rt2x00dev->ops->lib->taskletname, \
+                            (unsigned long)rt2x00dev); \
+               tasklet_disable(&rt2x00dev->taskletname); \
+       }
+
+       RT2X00_TASKLET_INIT(pretbtt_tasklet);
+       RT2X00_TASKLET_INIT(tbtt_tasklet);
+       RT2X00_TASKLET_INIT(rxdone_tasklet);
+       RT2X00_TASKLET_INIT(autowake_tasklet);
+
+#undef RT2X00_TASKLET_INIT
+
        /*
         * Register HW.
         */
@@ -958,6 +978,7 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
 {
        int retval = -ENOMEM;
 
+       spin_lock_init(&rt2x00dev->irqmask_lock);
        mutex_init(&rt2x00dev->csr_mutex);
 
        set_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);