mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-30 21:44:27 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			62 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From f6a9618198e190a2ba09ce3f0aa8e9ee1763bd38 Mon Sep 17 00:00:00 2001
 | |
| From: Stanislaw Gruszka <sgruszka@redhat.com>
 | |
| Date: Sat, 9 Feb 2019 12:08:34 +0100
 | |
| X-Patchwork-Submitter: Stanislaw Gruszka <sgruszka@redhat.com>
 | |
| X-Patchwork-Id: 10804443
 | |
| X-Patchwork-Delegate: kvalo@adurom.com
 | |
| Subject: [PATCH 24/28] rt2800mmio: fetch tx status changes
 | |
| 
 | |
| Prepare to use rt2800mmio_fetch_txstatus() in concurrent manner and drop
 | |
| return value since is not longer needed.
 | |
| 
 | |
| Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
 | |
| ---
 | |
|  drivers/net/wireless/ralink/rt2x00/rt2800mmio.c | 17 +++++++++--------
 | |
|  1 file changed, 9 insertions(+), 8 deletions(-)
 | |
| 
 | |
| --- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
 | |
| +++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
 | |
| @@ -255,12 +255,12 @@ void rt2800mmio_autowake_tasklet(unsigne
 | |
|  }
 | |
|  EXPORT_SYMBOL_GPL(rt2800mmio_autowake_tasklet);
 | |
|  
 | |
| -static bool rt2800mmio_fetch_txstatus(struct rt2x00_dev *rt2x00dev)
 | |
| +static void rt2800mmio_fetch_txstatus(struct rt2x00_dev *rt2x00dev)
 | |
|  {
 | |
|  	u32 status;
 | |
| -	bool more = false;
 | |
| +	unsigned long flags;
 | |
|  
 | |
| -	/* FIXEME: rewrite this comment
 | |
| +	/*
 | |
|  	 * The TX_FIFO_STATUS interrupt needs special care. We should
 | |
|  	 * read TX_STA_FIFO but we should do it immediately as otherwise
 | |
|  	 * the register can overflow and we would lose status reports.
 | |
| @@ -271,20 +271,21 @@ static bool rt2800mmio_fetch_txstatus(st
 | |
|  	 * because we can schedule the tasklet multiple times (when the
 | |
|  	 * interrupt fires again during tx status processing).
 | |
|  	 *
 | |
| -	 * txstatus tasklet is called with INT_SOURCE_CSR_TX_FIFO_STATUS
 | |
| -	 * disabled so have only one producer and one consumer - we don't
 | |
| -	 * need to lock the kfifo.
 | |
| +	 * We also read statuses from tx status timeout timer, use
 | |
| +	 * lock to prevent concurent writes to fifo.
 | |
|  	 */
 | |
| +
 | |
| +	spin_lock_irqsave(&rt2x00dev->irqmask_lock, flags);
 | |
| +
 | |
|  	while (!kfifo_is_full(&rt2x00dev->txstatus_fifo)) {
 | |
|  		status = rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO);
 | |
|  		if (!rt2x00_get_field32(status, TX_STA_FIFO_VALID))
 | |
|  			break;
 | |
|  
 | |
|  		kfifo_put(&rt2x00dev->txstatus_fifo, status);
 | |
| -		more = true;
 | |
|  	}
 | |
|  
 | |
| -	return more;
 | |
| +	spin_unlock_irqrestore(&rt2x00dev->irqmask_lock, flags);
 | |
|  }
 | |
|  
 | |
|  void rt2800mmio_txstatus_tasklet(unsigned long data)
 |