Commit c5c65761 authored by Helmut Schaa's avatar Helmut Schaa Committed by John W. Linville

rt2x00: Introduce tasklets for interrupt handling

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: default avatarHelmut Schaa <helmut.schaa@googlemail.com>
Acked-by: default avatarGertjan van Wingerde <gwingerde@gmail.com>
Signed-off-by: default avatarIvo van Doorn <IvDoorn@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 8d59c4e9
...@@ -520,6 +520,10 @@ struct rt2x00lib_ops { ...@@ -520,6 +520,10 @@ struct rt2x00lib_ops {
* TX status tasklet handler. * TX status tasklet handler.
*/ */
void (*txstatus_tasklet) (unsigned long data); 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. * Device init handlers.
...@@ -905,6 +909,15 @@ struct rt2x00_dev { ...@@ -905,6 +909,15 @@ struct rt2x00_dev {
* Tasklet for processing tx status reports (rt2800pci). * Tasklet for processing tx status reports (rt2800pci).
*/ */
struct tasklet_struct txstatus_tasklet; 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;
}; };
/* /*
......
...@@ -830,6 +830,26 @@ static int rt2x00lib_probe_hw(struct rt2x00_dev *rt2x00dev) ...@@ -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. * Register HW.
*/ */
...@@ -958,6 +978,7 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev) ...@@ -958,6 +978,7 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
{ {
int retval = -ENOMEM; int retval = -ENOMEM;
spin_lock_init(&rt2x00dev->irqmask_lock);
mutex_init(&rt2x00dev->csr_mutex); mutex_init(&rt2x00dev->csr_mutex);
set_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags); set_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment