[rt2x00-users] [PATCH 2/2] rt2x00: Limit rt2800pci txdone processing to 16 entries at once

Gertjan van Wingerde gwingerde at gmail.com
Sun Mar 6 04:21:35 EST 2011


On 03/04/11 15:11, Helmut Schaa wrote:
> Instead of reporting an unlimited number of tx status reports to
> mac80211 stop after 16 frames and reschedule the tx status tasklet.
> This allows other tasklets to be run inbetween.
> 
> Signed-off-by: Helmut Schaa <helmut.schaa at googlemail.com>

Acked-by: Gertjan van Wingerde <gwingerde at gmail.com>

> ---
>  drivers/net/wireless/rt2x00/rt2800pci.c |   12 ++++++++++--
>  1 files changed, 10 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c
> index 33243bf..9b48158 100644
> --- a/drivers/net/wireless/rt2x00/rt2800pci.c
> +++ b/drivers/net/wireless/rt2x00/rt2800pci.c
> @@ -717,12 +717,13 @@ static void rt2800pci_wakeup(struct rt2x00_dev *rt2x00dev)
>  	rt2800_config(rt2x00dev, &libconf, IEEE80211_CONF_CHANGE_PS);
>  }
>  
> -static void rt2800pci_txdone(struct rt2x00_dev *rt2x00dev)
> +static bool rt2800pci_txdone(struct rt2x00_dev *rt2x00dev)
>  {
>  	struct data_queue *queue;
>  	struct queue_entry *entry;
>  	u32 status;
>  	u8 qid;
> +	int max_tx_done = 16;
>  
>  	while (kfifo_get(&rt2x00dev->txstatus_fifo, &status)) {
>  		qid = rt2x00_get_field32(status, TX_STA_FIFO_PID_QUEUE);
> @@ -759,7 +760,12 @@ static void rt2800pci_txdone(struct rt2x00_dev *rt2x00dev)
>  
>  		entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
>  		rt2800_txdone_entry(entry, status);
> +
> +		if (--max_tx_done == 0)
> +			break;
>  	}
> +
> +	return !max_tx_done;
>  }
>  
>  static void rt2800pci_enable_interrupt(struct rt2x00_dev *rt2x00dev,
> @@ -780,7 +786,9 @@ static void rt2800pci_enable_interrupt(struct rt2x00_dev *rt2x00dev,
>  
>  static void rt2800pci_txstatus_tasklet(unsigned long data)
>  {
> -	rt2800pci_txdone((struct rt2x00_dev *)data);
> +	struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data;
> +	if (rt2800pci_txdone(rt2x00dev))
> +		tasklet_schedule(&rt2x00dev->txstatus_tasklet);
>  
>  	/*
>  	 * No need to enable the tx status interrupt here as we always




More information about the users mailing list