mirror of
https://github.com/torvalds/linux.git
synced 2024-12-22 19:01:37 +00:00
rt2x00: Limit rt2x00pci rxdone processing to 16 entries at once
Instead of receiving an unlimited number of frames, stop after 16 entries and reschedule the rxdone tasklet. This allows other tasklets to be run inbetween. 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>
This commit is contained in:
parent
324732848c
commit
166389375d
@ -1368,8 +1368,10 @@ static void rt2400pci_tbtt_tasklet(unsigned long data)
|
|||||||
static void rt2400pci_rxdone_tasklet(unsigned long data)
|
static void rt2400pci_rxdone_tasklet(unsigned long data)
|
||||||
{
|
{
|
||||||
struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data;
|
struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data;
|
||||||
rt2x00pci_rxdone(rt2x00dev);
|
if (rt2x00pci_rxdone(rt2x00dev))
|
||||||
rt2400pci_enable_interrupt(rt2x00dev, CSR8_RXDONE);
|
tasklet_schedule(&rt2x00dev->rxdone_tasklet);
|
||||||
|
else
|
||||||
|
rt2400pci_enable_interrupt(rt2x00dev, CSR8_RXDONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static irqreturn_t rt2400pci_interrupt(int irq, void *dev_instance)
|
static irqreturn_t rt2400pci_interrupt(int irq, void *dev_instance)
|
||||||
|
@ -1500,8 +1500,10 @@ static void rt2500pci_tbtt_tasklet(unsigned long data)
|
|||||||
static void rt2500pci_rxdone_tasklet(unsigned long data)
|
static void rt2500pci_rxdone_tasklet(unsigned long data)
|
||||||
{
|
{
|
||||||
struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data;
|
struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data;
|
||||||
rt2x00pci_rxdone(rt2x00dev);
|
if (rt2x00pci_rxdone(rt2x00dev))
|
||||||
rt2500pci_enable_interrupt(rt2x00dev, CSR8_RXDONE);
|
tasklet_schedule(&rt2x00dev->rxdone_tasklet);
|
||||||
|
else
|
||||||
|
rt2500pci_enable_interrupt(rt2x00dev, CSR8_RXDONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static irqreturn_t rt2500pci_interrupt(int irq, void *dev_instance)
|
static irqreturn_t rt2500pci_interrupt(int irq, void *dev_instance)
|
||||||
|
@ -806,8 +806,10 @@ static void rt2800pci_tbtt_tasklet(unsigned long data)
|
|||||||
static void rt2800pci_rxdone_tasklet(unsigned long data)
|
static void rt2800pci_rxdone_tasklet(unsigned long data)
|
||||||
{
|
{
|
||||||
struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data;
|
struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data;
|
||||||
rt2x00pci_rxdone(rt2x00dev);
|
if (rt2x00pci_rxdone(rt2x00dev))
|
||||||
rt2800pci_enable_interrupt(rt2x00dev, INT_MASK_CSR_RX_DONE);
|
tasklet_schedule(&rt2x00dev->rxdone_tasklet);
|
||||||
|
else
|
||||||
|
rt2800pci_enable_interrupt(rt2x00dev, INT_MASK_CSR_RX_DONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rt2800pci_autowake_tasklet(unsigned long data)
|
static void rt2800pci_autowake_tasklet(unsigned long data)
|
||||||
|
@ -60,14 +60,15 @@ int rt2x00pci_regbusy_read(struct rt2x00_dev *rt2x00dev,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(rt2x00pci_regbusy_read);
|
EXPORT_SYMBOL_GPL(rt2x00pci_regbusy_read);
|
||||||
|
|
||||||
void rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev)
|
bool rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev)
|
||||||
{
|
{
|
||||||
struct data_queue *queue = rt2x00dev->rx;
|
struct data_queue *queue = rt2x00dev->rx;
|
||||||
struct queue_entry *entry;
|
struct queue_entry *entry;
|
||||||
struct queue_entry_priv_pci *entry_priv;
|
struct queue_entry_priv_pci *entry_priv;
|
||||||
struct skb_frame_desc *skbdesc;
|
struct skb_frame_desc *skbdesc;
|
||||||
|
int max_rx = 16;
|
||||||
|
|
||||||
while (1) {
|
while (--max_rx) {
|
||||||
entry = rt2x00queue_get_entry(queue, Q_INDEX);
|
entry = rt2x00queue_get_entry(queue, Q_INDEX);
|
||||||
entry_priv = entry->priv_data;
|
entry_priv = entry->priv_data;
|
||||||
|
|
||||||
@ -93,6 +94,8 @@ void rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev)
|
|||||||
*/
|
*/
|
||||||
rt2x00lib_rxdone(entry);
|
rt2x00lib_rxdone(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return !max_rx;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(rt2x00pci_rxdone);
|
EXPORT_SYMBOL_GPL(rt2x00pci_rxdone);
|
||||||
|
|
||||||
|
@ -101,8 +101,11 @@ struct queue_entry_priv_pci {
|
|||||||
/**
|
/**
|
||||||
* rt2x00pci_rxdone - Handle RX done events
|
* rt2x00pci_rxdone - Handle RX done events
|
||||||
* @rt2x00dev: Device pointer, see &struct rt2x00_dev.
|
* @rt2x00dev: Device pointer, see &struct rt2x00_dev.
|
||||||
|
*
|
||||||
|
* Returns true if there are still rx frames pending and false if all
|
||||||
|
* pending rx frames were processed.
|
||||||
*/
|
*/
|
||||||
void rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev);
|
bool rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Device initialization handlers.
|
* Device initialization handlers.
|
||||||
|
@ -2313,8 +2313,10 @@ static void rt61pci_tbtt_tasklet(unsigned long data)
|
|||||||
static void rt61pci_rxdone_tasklet(unsigned long data)
|
static void rt61pci_rxdone_tasklet(unsigned long data)
|
||||||
{
|
{
|
||||||
struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data;
|
struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data;
|
||||||
rt2x00pci_rxdone(rt2x00dev);
|
if (rt2x00pci_rxdone(rt2x00dev))
|
||||||
rt61pci_enable_interrupt(rt2x00dev, INT_MASK_CSR_RXDONE);
|
rt2x00pci_rxdone(rt2x00dev);
|
||||||
|
else
|
||||||
|
rt61pci_enable_interrupt(rt2x00dev, INT_MASK_CSR_RXDONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rt61pci_autowake_tasklet(unsigned long data)
|
static void rt61pci_autowake_tasklet(unsigned long data)
|
||||||
|
Loading…
Reference in New Issue
Block a user